Gun 0.8.8, Node.js-to-Node.js, Node.js-to-browser
Вот симуляция интерфейса в jsfiddle https://jsfiddle.net/sergibondarenko/tktodk62/20/
Для чистого старта я удалил локальные данные data.json
и gun
из локального хранилища Chrome.
Создание узла в Node.js
const gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
Слушайте в Node.js
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
Получите 1 результат, как ожидалось, хороший
v: { _: { '#': 'j948ewfltvmmHthoESzM', '>': { num: 1508766155692 } },
num: 0 }
k: stats
Кроме того, у меня есть слушатель на стороне браузера
<!DOCTYPE html>
<html>
<script src="http://rawgit.com/amark/gun/master/gun.js"></script>
<body>
<script>
var gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});
var node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
</script>
</body>
</html>
И получить 1 результат на создание узла, как ожидалось, хорошо
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508767186838}},"num":0}
index.html:10 k: stats
Затем я обновляю узел
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.put({
stats: {
num: 2
},
name: 'trex'
});
И получить дублированный результат для обоих слушателей
Node.js
v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } },
num: 2 }
k: stats
v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } },
num: 2 }
k: stats
браузер
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2}
index.html:10 k: stats
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2}
index.html:10 k: stats
Почему я получаю дубликаты?
ОБНОВИТЬ
Есть дубликаты, даже если есть только один пистолет.
Если я правильно понимаю, (И у меня был этот вопрос сам не так давно), то это потому, что Gun предполагает, что он находится в децентрализованной сетке решетки. Каждый узел, который получает обновление, ретранслирует это обновление ко всем узлам, о которых он знает. Несмотря на то, что Gun в настоящее время централизован через сервер ретрансляции, он построен для децентрализации. Поэтому, когда вы создаете изменение, вы будете транслировать его, но прямо сейчас он проходит через сервер ретрансляции, который транслирует вас на каждый узел, включая ваш собственный. Поэтому, если у вас есть сеть из трех одноранговых узлов, сервер ретрансляции отправляет обновление всем трем (включая вас). Ваш партнер может дедуплицировать, а не ретранслировать обновление, но другие узлы будут ретранслировать его, предполагая децентрализацию. Таким образом, вы получите одно обновление с сервера, а затем другое из другого узла.
Я до сих пор не совсем понимаю, почему я получаю несколько обновлений, когда я являюсь единственным партнером. Я считаю, что это как-то связано с тем, что сервер щедро трансформирует изменение более одного раза, чтобы добавить некоторую избыточность в систему.