Created
November 1, 2018 02:00
-
-
Save jimpick/57b0f1898d223b5e41620f0f0cf94a51 to your computer and use it in GitHub Desktop.
join problems - using ormap to store maddrs in peer-star-app membership CRDT
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const CRDT = require('delta-crdts') | |
const ORMap = CRDT('ormap') | |
const membersPinner = ORMap('peer-zbe') | |
membersPinner.applySub('zbe', 'mvreg', 'write', [ 'maddr/zbe' ]) | |
console.log('pinner 1', membersPinner.value()) | |
console.log('pinner 1 state()', membersPinner.state()) | |
console.log('pinner 1 state().state.get("zbe")', membersPinner.state().state.get('zbe')) | |
console.log() | |
const membersFirefox = ORMap('peer-in5') | |
membersFirefox.applySub('zbe', 'mvreg', 'write', [ 'maddr/zbe' ]) | |
membersFirefox.applySub('kst', 'mvreg', 'write', [ 'maddr/kst' ]) | |
membersFirefox.applySub('in5', 'mvreg', 'write', [ 'maddr/in5' ]) | |
console.log('firefox 1', membersFirefox.value()) | |
console.log('firefox 1 state()', membersFirefox.state()) | |
console.log('firefox 1 state().state.get("zbe")', membersFirefox.state().state.get('zbe')) | |
console.log('firefox 1 state().state.get("kst")', membersFirefox.state().state.get('kst')) | |
console.log('firefox 1 state().state.get("in5")', membersFirefox.state().state.get('in5')) | |
console.log('\nJoin Firefox -> Pinner\n') | |
membersPinner.apply(membersFirefox.state()) | |
console.log('pinner 2', membersPinner.value()) | |
console.log('pinner 2 state()', membersPinner.state()) | |
console.log('pinner 2 state().state.get("zbe")', membersPinner.state().state.get('zbe')) | |
console.log('pinner 2 state().state.get("kst")', membersPinner.state().state.get('kst')) | |
console.log('pinner 2 state().state.get("in5")', membersPinner.state().state.get('in5')) | |
console.log('') | |
console.log('pinner 2 value().zbe', membersPinner.value().zbe) | |
console.log('pinner 2 [...value().zbe]', [...membersPinner.value().zbe]) | |
console.log('pinner 2 [...value().zbe][0] === [...value().zbe][1]', | |
[...membersPinner.value().zbe][0] === | |
[...membersPinner.value().zbe][1] | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pinner 1 { zbe: Set { [ 'maddr/zbe' ] } } | |
pinner 1 state() DotMap { | |
cc: | |
CausalContext { cc: Map { 'peer-zbe' => 1 }, dc: CustomSet { _refs: Map {} } }, | |
state: | |
Map { 'zbe' => DotSet { ds: [Map], cc: null, type: 'mvreg' } }, | |
type: undefined } | |
pinner 1 state().state.get("zbe") DotSet { | |
ds: Map { '["peer-zbe",1]' => [ 'maddr/zbe' ] }, | |
cc: null, | |
type: 'mvreg' } | |
firefox 1 { zbe: Set { [ 'maddr/zbe' ] }, | |
kst: Set { [ 'maddr/kst' ] }, | |
in5: Set { [ 'maddr/in5' ] } } | |
firefox 1 state() DotMap { | |
cc: | |
CausalContext { cc: Map { 'peer-in5' => 3 }, dc: CustomSet { _refs: Map {} } }, | |
state: | |
Map { | |
'zbe' => DotSet { ds: [Map], cc: null, type: 'mvreg' }, | |
'kst' => DotSet { ds: [Map], cc: null, type: 'mvreg' }, | |
'in5' => DotSet { ds: [Map], cc: null, type: 'mvreg' } }, | |
type: undefined } | |
firefox 1 state().state.get("zbe") DotSet { | |
ds: Map { '["peer-in5",1]' => [ 'maddr/zbe' ] }, | |
cc: null, | |
type: 'mvreg' } | |
firefox 1 state().state.get("kst") DotSet { | |
ds: Map { '["peer-in5",2]' => [ 'maddr/kst' ] }, | |
cc: null, | |
type: 'mvreg' } | |
firefox 1 state().state.get("in5") DotSet { | |
ds: Map { '["peer-in5",3]' => [ 'maddr/in5' ] }, | |
cc: null, | |
type: 'mvreg' } | |
Join Firefox -> Pinner | |
pinner 2 { zbe: Set { [ 'maddr/zbe' ], [ 'maddr/zbe' ] }, | |
kst: Set { [ 'maddr/kst' ] }, | |
in5: Set { [ 'maddr/in5' ] } } | |
pinner 2 state() DotMap { | |
cc: | |
CausalContext { | |
cc: Map { 'peer-zbe' => 1, 'peer-in5' => 3 }, | |
dc: CustomSet { _refs: Map {} } }, | |
state: | |
Map { | |
'zbe' => DotSet { ds: [Map], cc: null, type: 'mvreg' }, | |
'kst' => DotSet { ds: [Map], cc: null, type: 'mvreg' }, | |
'in5' => DotSet { ds: [Map], cc: null, type: 'mvreg' } }, | |
type: undefined } | |
pinner 2 state().state.get("zbe") DotSet { | |
ds: | |
Map { | |
'["peer-zbe",1]' => [ 'maddr/zbe' ], | |
'["peer-in5",1]' => [ 'maddr/zbe' ] }, | |
cc: null, | |
type: 'mvreg' } | |
pinner 2 state().state.get("kst") DotSet { | |
ds: Map { '["peer-in5",2]' => [ 'maddr/kst' ] }, | |
cc: null, | |
type: 'mvreg' } | |
pinner 2 state().state.get("in5") DotSet { | |
ds: Map { '["peer-in5",3]' => [ 'maddr/in5' ] }, | |
cc: null, | |
type: 'mvreg' } | |
pinner 2 value().zbe Set { [ 'maddr/zbe' ], [ 'maddr/zbe' ] } | |
pinner 2 [...value().zbe] [ [ 'maddr/zbe' ], [ 'maddr/zbe' ] ] | |
pinner 2 [...value().zbe][0] === [...value().zbe][1] false |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I observed a problem with the membership CRDT in peer-star-app...
In this example, when joining the membership CRDT (received over gossip) from Firefox to the Pinner, the Set for the 'zbe' peer has duplicate values. Because arrays are objects, they aren't equal, so Set keeps two versions.