git ssb

6+

Dominic / epidemic-broadcast-trees



Tree: b46fcf7ac381e66d45744423daddc9a3c5c7879c

Files: b46fcf7ac381e66d45744423daddc9a3c5c7879c / notes.txt

2656 bytesRaw
1 OUR_SEQ, THEIR_SEQ, THEM_RECV, US_RECV
2
3 onRecieveValidMessage: //after we have processed the message.
4 if(OUR_SEQ > THEIR_SEQ && THEM_RECV)
5 send(msg)
6 else if(OUR_SEQ < THEIR_SEQ && US_RECV)
7 send({id: msg.author, seq: msg.sequence}) //OPTIONAL, don't have to do this every time
8 onReceiveMessage:
9 if(OUR_SEQ > msg.sequence)
10 send({id: msg.author, seq: - OUR_SEQ}) //tell them to stop sending.
11 //else, validate the message and continue.
12 onRecieveNote:
13 if(note.seq < 0 && THEM_RECV) {
14 THEM_RECV = false //they have asked us to stop sending this feed to them.
15 }
16 if(Math.abs(note.seq) > OUR_SEQ) {
17 US_RECV = true
18 send({id: note.id, seq: OUR_SEQ})
19 }
20
21 onBeginReplication:
22 for(var id in feeds)
23 send({id: id, seq: feed[id].seq})
24
25 //okay I feel satisfied that is the correct logic
26 //but how do I make this FSM pull?
27
28 //I know, functional style state
29
30 //For each peer, for each feed keep the state of:
31
32 remote = {requested: Seq, sent: Seq, ready: msg|null, sending: bool, receiving: bool} //sending to, receiving from
33
34 //also keep a map of local = {id: seq}
35 //then I think all events can be handled sync
36
37 READ:
38 if ready!= null, the puller takes `ready` then sets it to `null`
39 if ready was a msg, this also triggers retriving the next msg, if this feed.sent < local[id]
40 if ready was a note, it's just sent without triggering anything.
41
42 RECEIVE_MSG: //receive a message from this peer, before it's validated.
43 remote.requested = msg.sequence //always remember they are up to this sequence.
44
45 if(msg.seq <= local[msg.author]) //if we already know about this message
46 if(remote.receiving) {
47 remote.ready = {id, seq: - local[id]} //tell them we do not need this feed.
48 remote.receiving = false
49 }
50 if(!remote.receiving) {
51 we have asked them to stop sending, but they havn't got the note yet.
52 anyway, remember they know this sequence.
53 remote.requested = msg.sequence
54 }
55 else if(remote.sending) {
56 this is an error, they should never send to us if we are sending.
57 if this ever happens it's a programmer error. maybe should tell them to top sending?
58 you might receive a
59 }
60 RECEIVE_NOTE:
61 if(remote.sending) {
62 if(note.seq < 0) //stop sending
63 remote.sending = false, remote.ready = null, remote.requested = abs(note.seq)
64 }
65 else if(!remote.receiving) {
66 if(abs(note.seq) > local[id]) //if this is the fastest peer for this feed, ask them to send.
67
68
69 }
70
71
72
73

Built with git-ssb-web