holepunch-hop 0.4.4 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +3 -0
- package/package.json +11 -5
- package/src/index.js +45 -10
- package/src/{peers.js → network/peers.js} +507 -138
- package/src/{bees.js → storage/bees.js} +47 -37
- package/src/{drive.js → storage/drive.js} +2 -3
- package/src/{fileParser.js → storage/fileParser.js} +1 -1
- package/test/datacommands/files/data/jan3-bitcoin.csv +17 -0
- package/test/datacommands/files/large-csv.test.js +7 -0
- package/test/datacommands/files/small-csv.test.js +76 -0
- package/test/datacommands/ledger/save-get-ledger.test.js +117 -0
- package/test/datacommands/results/save-get-results.test.js +122 -0
- package/test/holepunch-initiate.test.js +47 -0
- package/test/multipers/ten-peers-network.test.js +437 -0
- package/test/setup-bee-holepunch.test.js +45 -0
- package/test/setup-holepunch.test.js +14 -13
- package/test/threepers/peer3-geninvite-after.test.js +439 -0
- package/test/threepers/three-peers.test.js +159 -0
- package/test/threepers/two-then-three.test.js +434 -0
- package/test/twopeers/peerClient-Server.test.js +243 -0
- package/test/twopeers/reconnect-peers.test.js +257 -0
- package/test/twopeers/reconnect-serverthen-conerr.test.js +304 -0
- package/test/twopeers/reconnect-then-conerr.test.js +309 -0
- package/test/twopeers/two-peer-one-disconnect.test.js +162 -0
- package/test/twopeers/two-peer-server-disconnect.test.js +167 -0
- package/vitest.config.js +8 -0
- /package/src/{kbledger.js → ledger/kbledger.js} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
|
+
|
|
2
3
|
/**
|
|
3
4
|
* Manage Peers connections
|
|
4
5
|
*
|
|
@@ -12,7 +13,6 @@ import EventEmitter from 'events'
|
|
|
12
13
|
import crypto from 'crypto'
|
|
13
14
|
|
|
14
15
|
class NetworkPeers extends EventEmitter {
|
|
15
|
-
|
|
16
16
|
constructor(store, swarm) {
|
|
17
17
|
super()
|
|
18
18
|
this.hello = 'hyperpeers'
|
|
@@ -28,6 +28,7 @@ class NetworkPeers extends EventEmitter {
|
|
|
28
28
|
this.sendTopicHolder = []
|
|
29
29
|
this.peersRole = []
|
|
30
30
|
this.discoveryList = []
|
|
31
|
+
this.peerSwitchLiveID = []
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
/**
|
|
@@ -92,6 +93,17 @@ class NetworkPeers extends EventEmitter {
|
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
|
|
96
|
+
/**
|
|
97
|
+
* when new update or refresh peer network to get latest peers
|
|
98
|
+
* @method latestPeerNetwork
|
|
99
|
+
*
|
|
100
|
+
*/
|
|
101
|
+
latestPeerNetwork = function (peerNetwork) {
|
|
102
|
+
// Use concat to merge arrays while preserving existing elements
|
|
103
|
+
this.peerNetwork = [...this.peerNetwork, ...peerNetwork]
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
95
107
|
/**
|
|
96
108
|
* incoming establsihed information
|
|
97
109
|
* @method setRestablished
|
|
@@ -101,155 +113,180 @@ class NetworkPeers extends EventEmitter {
|
|
|
101
113
|
this.peerEstContext[pubKey] = established
|
|
102
114
|
}
|
|
103
115
|
|
|
104
|
-
|
|
105
|
-
*
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
listenNetwork = function () {
|
|
116
|
+
/*
|
|
117
|
+
* Listen for network connections
|
|
118
|
+
*
|
|
119
|
+
**/
|
|
120
|
+
listenNetwork = function () {
|
|
110
121
|
this.swarm.on('connection', (conn, info) => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
let discoveryTopicInfo = {}
|
|
120
|
-
if (topicKeylive.length === 0) {
|
|
121
|
-
// check if joined now?
|
|
122
|
-
discoveryTopicInfo = this.checkDisoveryStatus('server')
|
|
122
|
+
const publicKey = info.publicKey.toString('hex')
|
|
123
|
+
this.peerConnect[publicKey] = conn
|
|
124
|
+
const connectionInfo = this.prepareConnectionInfo(info, publicKey)
|
|
125
|
+
// Determine which path to take
|
|
126
|
+
if (connectionInfo.discoveryTopicInfo.firstTime === false) {
|
|
127
|
+
this.handleReconnection(conn, info, connectionInfo)
|
|
128
|
+
} else if (connectionInfo.discoveryTopicInfo.firstTime === true) {
|
|
129
|
+
this.handleFirstTimeConnection(conn, info, connectionInfo)
|
|
123
130
|
} else {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
let topicServer = this.topicHolder[discoveryTopicInfo.topic]
|
|
127
|
-
let serverStatus = false
|
|
128
|
-
if (topicServer !== undefined) {
|
|
129
|
-
if (Object.keys(topicServer).length > 0) {
|
|
130
|
-
serverStatus = true
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// check if toppic via matching or being client receiving
|
|
134
|
-
if (topicKeylive.length > 0 || serverStatus === true) {
|
|
135
|
-
// keep track of connection
|
|
136
|
-
this.peerConnect[publicKeylive] = conn
|
|
137
|
-
if (topicKeylive.length > 0) {
|
|
138
|
-
let topicIn = topicKeylive[0].toString('hex')
|
|
139
|
-
let topicMatch = this.topicHolder[topicIn]
|
|
140
|
-
if (Object.keys(topicMatch).length > 0) {
|
|
141
|
-
// looks at what needs data needs cshared
|
|
142
|
-
// match new public key to saved publickey
|
|
143
|
-
topicMatch.currentPubkey = publicKeylive
|
|
144
|
-
this.topicHolder[topicIn] = topicMatch
|
|
145
|
-
this.dataFlowCheck(topicIn, 'client')
|
|
146
|
-
} else {
|
|
147
|
-
this.peerConnect[publicKeylive] = conn
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
// update to live client
|
|
151
|
-
let originalKey = ''
|
|
152
|
-
for (let savePeer of this.peerNetwork) {
|
|
153
|
-
if (savePeer.value.topic === topicIn) {
|
|
154
|
-
originalKey = savePeer.value.publickey
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
let updatePeerStatus = []
|
|
158
|
-
for (let savePeer of this.peerNetwork) {
|
|
159
|
-
if (savePeer.key === originalKey) {
|
|
160
|
-
let updatetoLive = savePeer
|
|
161
|
-
updatetoLive.value.live = true
|
|
162
|
-
updatetoLive.value.livePeerkey = publicKeylive
|
|
163
|
-
updatePeerStatus.push(updatetoLive)
|
|
164
|
-
this.emit('peer-live-network', originalKey)
|
|
165
|
-
} else {
|
|
166
|
-
updatePeerStatus.push(savePeer)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
this.peerNetwork = updatePeerStatus
|
|
170
|
-
} else {
|
|
171
|
-
// keep track of connection
|
|
172
|
-
this.peerConnect[publicKeylive] = conn
|
|
173
|
-
this.dataFlowCheck(publicKeylive, 'server')
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (serverStatus === true) {
|
|
177
|
-
// set to live
|
|
178
|
-
// update livePeerkey to true??
|
|
179
|
-
let originalKey = ''
|
|
180
|
-
for (let savePeer of this.peerNetwork) {
|
|
181
|
-
if (savePeer.value.topic === topicServer.topic) {
|
|
182
|
-
originalKey = savePeer.value.publickey
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
// need original connection public key
|
|
186
|
-
let updatePeerStatus = []
|
|
187
|
-
for (let savePeer of this.peerNetwork) {
|
|
188
|
-
if (savePeer.key === originalKey) {
|
|
189
|
-
let updatetoLive = savePeer
|
|
190
|
-
updatetoLive.value.live = true
|
|
191
|
-
updatetoLive.value.livePeerkey = publicKeylive
|
|
192
|
-
updatePeerStatus.push(updatetoLive)
|
|
193
|
-
// update beebee
|
|
194
|
-
this.emit('peer-live-network', originalKey)
|
|
195
|
-
} else {
|
|
196
|
-
updatePeerStatus.push(savePeer)
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
this.peerNetwork = updatePeerStatus
|
|
200
|
-
}
|
|
201
|
-
} else {
|
|
202
|
-
// first time or from topic reset?
|
|
203
|
-
// need to check from client and server side
|
|
204
|
-
if (this.topicHolder[publicKeylive] === undefined) {
|
|
205
|
-
// is client or server role
|
|
206
|
-
let roleType = ''
|
|
207
|
-
if (roleTaken === false) {
|
|
208
|
-
roleType = 'server'
|
|
209
|
-
} else {
|
|
210
|
-
roleType = 'client'
|
|
211
|
-
}
|
|
212
|
-
let roleContext = {}
|
|
213
|
-
roleContext.publickey = publicKeylive
|
|
214
|
-
roleContext.roletaken = roleType
|
|
215
|
-
// first time cheeck for data long with it?
|
|
216
|
-
this.peerConnect[publicKeylive] = conn
|
|
217
|
-
this.dataFlowCheck(publicKeylive, 'first')
|
|
218
|
-
this.emit('connect-warm-first', roleContext)
|
|
219
|
-
} else {
|
|
220
|
-
this.peerConnect[publicKeylive] = conn
|
|
221
|
-
this.dataFlowCheck(publicKeylive, 'server')
|
|
222
|
-
}
|
|
131
|
+
// need to differenciate between first time and reconnect
|
|
132
|
+
this.peerSwitchLiveID.push({ publicKey: publicKey, discoveryTopicInfo: connectionInfo })
|
|
223
133
|
}
|
|
134
|
+
|
|
135
|
+
// Common setup
|
|
136
|
+
this.store.replicate(conn);
|
|
224
137
|
|
|
225
138
|
// process network message
|
|
226
139
|
conn.on('data', data =>
|
|
227
140
|
// assess data
|
|
228
|
-
this.assessData(
|
|
141
|
+
this.assessData(publicKey, data)
|
|
229
142
|
)
|
|
230
143
|
|
|
231
144
|
conn.on('error', data => {
|
|
232
145
|
let connectLivekeys = Object.keys(this.peerConnect)
|
|
233
|
-
|
|
234
|
-
for (let
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
146
|
+
if (connectLivekeys.length > 0) {
|
|
147
|
+
for (let peer of this.peerNetwork) {
|
|
148
|
+
for (let pconn of connectLivekeys) {
|
|
149
|
+
if (peer.value.livePeerkey.length > 0) {
|
|
150
|
+
if (peer.value.livePeerkey === pconn) {
|
|
151
|
+
// check if connect is close?
|
|
152
|
+
// let keysNoise = Object.keys(this.peerConnect[pconn]['noiseStream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['rawStream']['_closed'])
|
|
153
|
+
// console.log(this.peerConnect[pconn]['noiseStream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['rawStream']['_closed'])
|
|
154
|
+
let closeStatus = this.peerConnect[pconn]['noiseStream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['rawStream']['_closed']
|
|
155
|
+
if (closeStatus === true) {
|
|
156
|
+
// remove peer & inform beebee
|
|
157
|
+
this.emit('peer-disconnect', { publickey: peer.key })
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
} else {
|
|
161
|
+
// assume first time and use key
|
|
162
|
+
if (peer.key === pconn) {
|
|
163
|
+
// check if connect is close?
|
|
164
|
+
let closeStatus = this.peerConnect[pconn]['noiseStream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['_writableState']['stream']['rawStream']['_closed']
|
|
165
|
+
if (closeStatus === true) {
|
|
166
|
+
// remove peer & inform beebee
|
|
167
|
+
this.emit('peer-disconnect', { publickey: peer.key })
|
|
168
|
+
}
|
|
169
|
+
}
|
|
243
170
|
}
|
|
244
171
|
}
|
|
245
172
|
}
|
|
246
173
|
}
|
|
247
174
|
})
|
|
248
|
-
|
|
249
|
-
// conn.end()
|
|
250
175
|
})
|
|
251
176
|
}
|
|
252
177
|
|
|
178
|
+
// Connection preparation methods
|
|
179
|
+
prepareConnectionInfo = function(info, publicKey) {
|
|
180
|
+
const topicKeylive = info.topics
|
|
181
|
+
const roleTaken = info.client
|
|
182
|
+
let discoveryTopicInfo = {}
|
|
183
|
+
if (topicKeylive.length === 0) {
|
|
184
|
+
if (roleTaken === false) {
|
|
185
|
+
discoveryTopicInfo = this.checkDisoveryStatus('server', publicKey, topicKeylive)
|
|
186
|
+
} else if (roleTaken === true) {
|
|
187
|
+
discoveryTopicInfo = this.checkDisoveryStatus('client', publicKey, topicKeylive)
|
|
188
|
+
}
|
|
189
|
+
if (discoveryTopicInfo === undefined) {
|
|
190
|
+
discoveryTopicInfo = { firstTime: false, topic: ''}
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
discoveryTopicInfo = { firstTime: false, topic: ''}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
topicKeylive,
|
|
198
|
+
roleTaken,
|
|
199
|
+
discoveryTopicInfo
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
handleFirstTimeConnection = function(conn, info, connectionInfo) {
|
|
204
|
+
const { publicKey } = info
|
|
205
|
+
const { topicKeylive } = connectionInfo
|
|
206
|
+
let publicKeylive = publicKey.toString('hex')
|
|
207
|
+
// First establish the connection
|
|
208
|
+
let roleTaken = info.client
|
|
209
|
+
// check status of topic first time no topic
|
|
210
|
+
if (this.topicHolder[publicKeylive] === undefined) {
|
|
211
|
+
// is client or server role
|
|
212
|
+
let roleType = ''
|
|
213
|
+
if (roleTaken === false) {
|
|
214
|
+
roleType = 'server'
|
|
215
|
+
} else {
|
|
216
|
+
roleType = 'client'
|
|
217
|
+
}
|
|
218
|
+
let roleContext = {}
|
|
219
|
+
roleContext.publickey = publicKeylive
|
|
220
|
+
roleContext.roletaken = roleType
|
|
221
|
+
// first time cheeck for data long with it?
|
|
222
|
+
this.dataFlowCheck(publicKeylive, 'first')
|
|
223
|
+
this.emit('connect-warm-first', roleContext)
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Reconnection handler
|
|
229
|
+
*
|
|
230
|
+
*/
|
|
231
|
+
handleReconnection = function(conn, info, connectionInfo) {
|
|
232
|
+
const { publicKey } = info;
|
|
233
|
+
const { topicKeylive, discoveryTopicInfo, serverStatus } = connectionInfo
|
|
234
|
+
// Reconnection logic
|
|
235
|
+
let topic = topicKeylive[0].toString('hex')
|
|
236
|
+
// match topic to topic holder list to get original pub key ID
|
|
237
|
+
let originalKey = ''
|
|
238
|
+
for (let savePeer of this.peerNetwork) {
|
|
239
|
+
if (savePeer.value.topic === topic) {
|
|
240
|
+
originalKey = savePeer.value.publickey
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (topic.length > 0) {
|
|
245
|
+
// Handle topic-based reconnection
|
|
246
|
+
const topicMatch = this.topicHolder[topic]
|
|
247
|
+
if (topicMatch && Object.keys(topicMatch).length > 0) {
|
|
248
|
+
topicMatch.currentPubkey = publicKey.toString('hex')
|
|
249
|
+
this.topicHolder[topic] = topicMatch
|
|
250
|
+
this.dataFlowCheck(topic, 'client')
|
|
251
|
+
this.updatePeerStatus(topic, publicKey.toString('hex'))
|
|
252
|
+
// inform other peer of peerkey id
|
|
253
|
+
this.writeTopicReconnect(originalKey, topicMatch)
|
|
254
|
+
}
|
|
255
|
+
// Handle non-topic reconnection
|
|
256
|
+
this.dataFlowCheck(publicKey.toString('hex'), 'server')
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* Update peer status
|
|
262
|
+
*
|
|
263
|
+
**/
|
|
264
|
+
updatePeerStatus = function(topic, publicKey) {
|
|
265
|
+
let originalKey = '';
|
|
266
|
+
for (let savePeer of this.peerNetwork) {
|
|
267
|
+
if (savePeer.value.topic === topic) {
|
|
268
|
+
originalKey = savePeer.value.publickey;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const updatePeerStatus = this.peerNetwork.map(savePeer => {
|
|
274
|
+
if (savePeer.key === originalKey) {
|
|
275
|
+
return {
|
|
276
|
+
...savePeer,
|
|
277
|
+
value: {
|
|
278
|
+
...savePeer.value,
|
|
279
|
+
live: true,
|
|
280
|
+
livePeerkey: publicKey
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return savePeer;
|
|
285
|
+
});
|
|
286
|
+
this.peerNetwork = updatePeerStatus;
|
|
287
|
+
this.emit('peer-live-network', originalKey)
|
|
288
|
+
}
|
|
289
|
+
|
|
253
290
|
/**
|
|
254
291
|
*
|
|
255
292
|
* @method updateListen
|
|
@@ -281,8 +318,6 @@ class NetworkPeers extends EventEmitter {
|
|
|
281
318
|
} else if (dataShareIn.type === 'private-cue-space') {
|
|
282
319
|
this.emit('cuespace-notification', { publickey: peerMatch, data: dataShareIn })
|
|
283
320
|
} else if (dataShareIn.type === 'public-library') {
|
|
284
|
-
console.log('public rep reque arrivee')
|
|
285
|
-
console.log(dataShareIn)
|
|
286
321
|
this.emit('publiclibrarynotification', { publickey: peerMatch, data: dataShareIn })
|
|
287
322
|
} else if (dataShareIn.type === 'peer') {
|
|
288
323
|
} else if (dataShareIn.type === 'peer-codename-inform') {
|
|
@@ -303,6 +338,9 @@ class NetworkPeers extends EventEmitter {
|
|
|
303
338
|
dataShareIn.settopic = false
|
|
304
339
|
this.emit('peer-reconnect-topic', dataShareIn)
|
|
305
340
|
}
|
|
341
|
+
} else if (dataShareIn.type === 'topic-reconnect-id') {
|
|
342
|
+
// update status of livepeer public key
|
|
343
|
+
this.emit('peer-reconnect-topic-id', peer, dataShareIn.data)
|
|
306
344
|
}
|
|
307
345
|
} catch (e) {
|
|
308
346
|
return console.error('ignore err')
|
|
@@ -371,6 +409,27 @@ class NetworkPeers extends EventEmitter {
|
|
|
371
409
|
return ptopStatus
|
|
372
410
|
}
|
|
373
411
|
|
|
412
|
+
/**
|
|
413
|
+
* match to first time invite code
|
|
414
|
+
* @method matchInviteFirst
|
|
415
|
+
*
|
|
416
|
+
*/
|
|
417
|
+
matchInviteFirst = function (data) {
|
|
418
|
+
let roleMatch = false
|
|
419
|
+
for(let peerRole of this.peersRole ) {
|
|
420
|
+
if (peerRole.invite.codename === data.data.inviteCode) {
|
|
421
|
+
roleMatch = true
|
|
422
|
+
break
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (roleMatch === true) {
|
|
426
|
+
let roleContext = {}
|
|
427
|
+
roleContext.publickey = data.data.peerkey
|
|
428
|
+
roleContext.roletaken = 'server'
|
|
429
|
+
this.emit('connect-warm-first', roleContext)
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
374
433
|
/**
|
|
375
434
|
* match codename to peer name
|
|
376
435
|
* @method matchCodename
|
|
@@ -436,11 +495,25 @@ class NetworkPeers extends EventEmitter {
|
|
|
436
495
|
discoverySettings = savePeer.discovery
|
|
437
496
|
}
|
|
438
497
|
}
|
|
439
|
-
// now refresh
|
|
440
|
-
discoverySettings.refresh()
|
|
441
498
|
return true
|
|
442
499
|
}
|
|
443
500
|
|
|
501
|
+
/**
|
|
502
|
+
* match topic live public key
|
|
503
|
+
* @method topicPublicKeyMatch
|
|
504
|
+
*
|
|
505
|
+
*/
|
|
506
|
+
topicPublicKeyMatch = function (topic) {
|
|
507
|
+
// first match live pubkey to topic and then use topic to get original
|
|
508
|
+
let topicSettings = {}
|
|
509
|
+
for (let livePeer of this.peerSwitchLiveID) {
|
|
510
|
+
if (livePeer.connectionInfo.topic === topic) {
|
|
511
|
+
topicSettings = livePeer.publicKey
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return topicSettings
|
|
515
|
+
}
|
|
516
|
+
|
|
444
517
|
/**
|
|
445
518
|
* match current publickey to peer id i.e. estbalshed on first connect and maps to 'peername' in UX
|
|
446
519
|
* @method peerMatchbase
|
|
@@ -462,6 +535,22 @@ class NetworkPeers extends EventEmitter {
|
|
|
462
535
|
}
|
|
463
536
|
}
|
|
464
537
|
|
|
538
|
+
/**
|
|
539
|
+
* match peer to topic live
|
|
540
|
+
* @method matchPeerTopic
|
|
541
|
+
*
|
|
542
|
+
*/
|
|
543
|
+
matchPeerTopic = function (topic) {
|
|
544
|
+
// first match live pubkey to topic and then use topic to get original
|
|
545
|
+
let peerSettings = {}
|
|
546
|
+
for (let savePeer of this.peerNetwork) {
|
|
547
|
+
if (savePeer.value.topic === topic) {
|
|
548
|
+
peerSettings = savePeer
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return peerSettings
|
|
552
|
+
}
|
|
553
|
+
|
|
465
554
|
/**
|
|
466
555
|
* split invte code string
|
|
467
556
|
* @method inviteDecoded
|
|
@@ -562,35 +651,271 @@ class NetworkPeers extends EventEmitter {
|
|
|
562
651
|
}
|
|
563
652
|
}
|
|
564
653
|
|
|
654
|
+
/* dataFlowCheck = function (topicIn, role) {
|
|
655
|
+
// check if any data connection flow?
|
|
656
|
+
let peerTopeerState = {}
|
|
657
|
+
let matchPeer = {}
|
|
658
|
+
if (role === 'client') {
|
|
659
|
+
matchPeer = this.topicHolder[topicIn]
|
|
660
|
+
let peerActionData = this.peerHolder[matchPeer.peerKey]
|
|
661
|
+
if (peerActionData !== undefined) {
|
|
662
|
+
peerTopeerState = peerActionData.data
|
|
663
|
+
}
|
|
664
|
+
} else if (role === 'server') {
|
|
665
|
+
matchPeer.currentPubkey = topicIn
|
|
666
|
+
// loop over topics and see what info available??
|
|
667
|
+
let checkDiscoveryTopic = {}
|
|
668
|
+
for (let topicH of this.sendTopicHolder) {
|
|
669
|
+
const noisePublicKey = Buffer.from(topicH.topic, 'hex')
|
|
670
|
+
let discovery = this.swarm.status(noisePublicKey)
|
|
671
|
+
let discoverTopic = discovery.topic.toString('hex')
|
|
672
|
+
if (discoverTopic === topicH.topic) {
|
|
673
|
+
discovery.swarm.connections.forEach((value, key) => {
|
|
674
|
+
checkDiscoveryTopic.server = value.publicKey.toString('hex')
|
|
675
|
+
checkDiscoveryTopic.client = value.remotePublicKey.toString('hex')
|
|
676
|
+
checkDiscoveryTopic.topic = discoverTopic
|
|
677
|
+
})
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
// find out peer publickey first
|
|
681
|
+
let peerMTopic = {}
|
|
682
|
+
for (let peerh of this.peerNetwork) {
|
|
683
|
+
if (peerh.value.topic === checkDiscoveryTopic.topic) {
|
|
684
|
+
peerMTopic = peerh
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
// server from topic or first time direct?
|
|
688
|
+
if (Object.keys(peerMTopic).length === 0) {
|
|
689
|
+
// first time direct connection
|
|
690
|
+
peerMTopic.key = topicIn // note this is public key poor naming
|
|
691
|
+
} else {
|
|
692
|
+
}
|
|
693
|
+
// check for data
|
|
694
|
+
let peerActionData = this.peerHolder[peerMTopic.key]
|
|
695
|
+
if (peerActionData !== undefined) {
|
|
696
|
+
peerTopeerState = peerActionData.data
|
|
697
|
+
} else {
|
|
698
|
+
peerTopeerState = {}
|
|
699
|
+
}
|
|
700
|
+
} else if (role === 'first') {
|
|
701
|
+
let peerActionData = this.peerHolder[topicIn]
|
|
702
|
+
if (peerActionData === undefined) {
|
|
703
|
+
peerTopeerState = {}
|
|
704
|
+
} else {
|
|
705
|
+
if(peerActionData.data !== undefined) {
|
|
706
|
+
peerTopeerState = peerActionData.data
|
|
707
|
+
} else {
|
|
708
|
+
peerTopeerState = {}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
// any data to write to network? NOT USED?
|
|
713
|
+
let checkDataShare = Object.keys(peerTopeerState).length
|
|
714
|
+
if (checkDataShare > 0) {
|
|
715
|
+
if (peerTopeerState.type === 'peer-share-invite') {
|
|
716
|
+
} else if (peerTopeerState.type === 'private-chart') {
|
|
717
|
+
this.writeTonetworkData(matchPeer.currentPubkey, peerTopeerState)
|
|
718
|
+
} else if (peerTopeerState.type === 'peer-share-topic') {
|
|
719
|
+
} else if (peerTopeerState.type === 'public-n1-experiment') {
|
|
720
|
+
} else if (peerTopeerState.type === 'cue-space') {
|
|
721
|
+
} else if (peerTopeerState.type === 'peer-write') {
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
}*/
|
|
725
|
+
|
|
565
726
|
/**
|
|
566
727
|
* check discovery status on network
|
|
567
728
|
* @method checkDisoveryStatus
|
|
568
729
|
*
|
|
569
730
|
*/
|
|
570
|
-
checkDisoveryStatus = function (nodeRole) {
|
|
731
|
+
checkDisoveryStatus = function (nodeRole, publicKey, topic) {
|
|
571
732
|
let topicList = []
|
|
572
733
|
if (nodeRole === 'server') {
|
|
573
734
|
topicList = this.sendTopicHolder
|
|
574
735
|
} else if (nodeRole === 'client') {
|
|
575
736
|
topicList = this.topicHolder
|
|
576
737
|
}
|
|
738
|
+
// previous info at hand
|
|
739
|
+
let firstTime = false
|
|
740
|
+
let emptyHolder = false
|
|
741
|
+
|
|
742
|
+
// we get public key -- discovery process to match to topic, has that topic been set before, then match live key to peerKey ie. the pubkey used an id from first time connection??
|
|
743
|
+
// scenerios
|
|
744
|
+
// 1. first time connection both client and server -- no save peers
|
|
745
|
+
// 2. first time connection client -- with saved peers
|
|
746
|
+
// 3. first time connection server -- with saved peers
|
|
747
|
+
// 4. reconnect with only one options
|
|
748
|
+
// 5. reconnect client with saved peers
|
|
749
|
+
// 6. reconnect server with saved peers
|
|
750
|
+
// 7 mix of peers acting as clients and server
|
|
751
|
+
let checkDiscoveryInfo = {}
|
|
752
|
+
// any existing peers
|
|
753
|
+
if (this.peerNetwork.length === 0) {
|
|
754
|
+
firstTime = true
|
|
755
|
+
} else {
|
|
756
|
+
// check if current publickey matches
|
|
757
|
+
let keyMatchTopic = false
|
|
758
|
+
if (topicList.length > 0) {
|
|
759
|
+
for (let topicE of topicList) {
|
|
760
|
+
if (topicE.livePubkey === publicKey) {
|
|
761
|
+
keyMatchTopic = true
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
} else {
|
|
765
|
+
keyMatchTopic = false
|
|
766
|
+
}
|
|
767
|
+
// need to also check if histic topic set?
|
|
768
|
+
if (keyMatchTopic === false) {
|
|
769
|
+
// check in client or Server roles
|
|
770
|
+
// client will have topic if returning peer
|
|
771
|
+
if (nodeRole === 'client') {
|
|
772
|
+
// check if topic in peerInfo on connect
|
|
773
|
+
if (topic.length === 0) {
|
|
774
|
+
firstTime = true
|
|
775
|
+
}
|
|
776
|
+
} else if (nodeRole === 'server') {
|
|
777
|
+
if (topicList.length === 0) {
|
|
778
|
+
firstTime = true
|
|
779
|
+
} else {
|
|
780
|
+
// could be first time connect
|
|
781
|
+
// check if public key in network
|
|
782
|
+
let existingPeerCheck = false
|
|
783
|
+
for (let peer of this.peerNetwork) {
|
|
784
|
+
if (peer.key === publicKey) {
|
|
785
|
+
existingPeerCheck = true
|
|
786
|
+
} else {
|
|
787
|
+
existingPeerCheck = false
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
// can rule out reconnection? not enough info at this time, peer if reconnect topic will send id to match direct
|
|
791
|
+
if (existingPeerCheck === false && keyMatchTopic === false) {
|
|
792
|
+
firstTime = 'wait-topic-confirm'
|
|
793
|
+
} else if (existingPeerCheck === false && keyMatchTopic === true) {
|
|
794
|
+
firstTime = 'wait-topic-confirm'
|
|
795
|
+
} else {
|
|
796
|
+
firstTime = false
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
checkDiscoveryInfo.firstTime = firstTime
|
|
805
|
+
checkDiscoveryInfo.emptyHolder = emptyHolder
|
|
806
|
+
checkDiscoveryInfo.role = nodeRole
|
|
807
|
+
checkDiscoveryInfo.server = ''
|
|
808
|
+
checkDiscoveryInfo.client = ''
|
|
809
|
+
checkDiscoveryInfo.topic = ''
|
|
810
|
+
return checkDiscoveryInfo
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
/*
|
|
814
|
+
if (this.peerNetwork.length > 0) {
|
|
815
|
+
emptyHolder = true
|
|
816
|
+
// match pubkey to peer to get set topic
|
|
817
|
+
let matchTopic = ''
|
|
818
|
+
for (let peer of this.peerNetwork) {
|
|
819
|
+
if (peer.key === publicKey) {
|
|
820
|
+
matchTopic = peer.value.topic
|
|
821
|
+
} else {
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
// now use match topic to see if topic set as server or client roles?
|
|
825
|
+
let sendLogic = []
|
|
826
|
+
let holderLogic = []
|
|
827
|
+
for (let sendPeerT of this.sendTopicHolder) {
|
|
828
|
+
if (sendPeerT.topic === matchTopic) {
|
|
829
|
+
sendLogic.push(sendPeerT)
|
|
830
|
+
} else {
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
let matchHolderKeys = Object.keys(this.topicHolder)
|
|
834
|
+
for (let topicH of matchHolderKeys) {
|
|
835
|
+
if (this.topicHolder[topicH].topic === matchTopic) {
|
|
836
|
+
holderLogic.push(this.topicHolder[topicH])
|
|
837
|
+
} else {
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
console.log('match topic')
|
|
841
|
+
console.log(matchTopic)
|
|
842
|
+
console.log('send logic')
|
|
843
|
+
console.log(sendLogic)
|
|
844
|
+
console.log('holder logic')
|
|
845
|
+
console.log(holderLogic)
|
|
846
|
+
if (nodeRole === 'client') {
|
|
847
|
+
console.log('extra workk for client')
|
|
848
|
+
if (matchTopic.length > 0 && sendLogic.length === 0 && holderLogic.length === 0) {
|
|
849
|
+
firstTime = true
|
|
850
|
+
} else {
|
|
851
|
+
firstTime = true
|
|
852
|
+
}
|
|
853
|
+
} else if (nodeRole === 'server') {
|
|
854
|
+
console.log('extra workk for server')
|
|
855
|
+
// check if public key match any exsting keyids?
|
|
856
|
+
/* for (let peer of this.peerNetwork) {
|
|
857
|
+
if (peer.key === publicKey) {
|
|
858
|
+
firstTime = false
|
|
859
|
+
} else {
|
|
860
|
+
firstTime = true
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
} else {
|
|
866
|
+
firstTime = true
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// has a topic already been sent to this peer, if not must be first time
|
|
870
|
+
let beforeSendTopic = false
|
|
871
|
+
for (let topicS of this.sendTopicHolder) {
|
|
872
|
+
if (topicS.livePubkey === publicKey) {
|
|
873
|
+
beforeSendTopic = true
|
|
874
|
+
}
|
|
875
|
+
}
|
|
577
876
|
let checkDiscoveryTopic = {}
|
|
877
|
+
checkDiscoveryTopic.firstTime = firstTime // should this be set???
|
|
578
878
|
if (topicList.length > 0) {
|
|
579
879
|
for (let topicH of topicList) {
|
|
580
880
|
const noisePublicKey = Buffer.from(topicH.topic, 'hex')
|
|
581
881
|
let discovery = this.swarm.status(noisePublicKey)
|
|
882
|
+
console.log('discovery000000000000000000000000')
|
|
883
|
+
console.log(discovery.topic.toString('hex'))
|
|
582
884
|
let discoverTopic = discovery.topic.toString('hex')
|
|
583
885
|
if (discoverTopic === topicH.topic) {
|
|
584
886
|
// do the peerid match?
|
|
585
887
|
discovery.swarm.connections.forEach((value, key) => {
|
|
888
|
+
console.log('value looooop')
|
|
586
889
|
checkDiscoveryTopic.server = value.publicKey.toString('hex')
|
|
587
890
|
checkDiscoveryTopic.client = value.remotePublicKey.toString('hex')
|
|
588
891
|
checkDiscoveryTopic.topic = discoverTopic
|
|
589
892
|
})
|
|
590
893
|
if (checkDiscoveryTopic.client === topicH.peerKey) {
|
|
894
|
+
console.log('retrun rrrr1111')
|
|
895
|
+
checkDiscoveryTopic.firstTime = false
|
|
896
|
+
console.log(checkDiscoveryTopic)
|
|
591
897
|
return checkDiscoveryTopic
|
|
592
898
|
} else {
|
|
593
899
|
if (checkDiscoveryTopic.topic === topicH.topic) {
|
|
900
|
+
// now check if returning
|
|
901
|
+
if (firstTime === false && emptyHolder === true) {
|
|
902
|
+
// match current public key to original key uses a permanent key
|
|
903
|
+
let permKeyID = ''
|
|
904
|
+
let topicSet = ''
|
|
905
|
+
if (checkDiscoveryTopic.client === publicKey) {
|
|
906
|
+
permKeyID = checkDiscoveryTopic.client
|
|
907
|
+
topicSet = checkDiscoveryTopic.topic
|
|
908
|
+
}
|
|
909
|
+
// now use this id to check if peer has been invited
|
|
910
|
+
let beforeTopicCheck = this.checkTopicModes(topicSet)
|
|
911
|
+
console.log('beftopicchchc-------------------')
|
|
912
|
+
console.log(beforeTopicCheck)
|
|
913
|
+
checkDiscoveryTopic.firstTime = beforeTopicCheck.firstTime
|
|
914
|
+
} else {
|
|
915
|
+
checkDiscoveryTopic.firstTime = true
|
|
916
|
+
}
|
|
917
|
+
console.log('return rrrr2222')
|
|
918
|
+
console.log(checkDiscoveryTopic)
|
|
594
919
|
return checkDiscoveryTopic
|
|
595
920
|
} else {
|
|
596
921
|
checkDiscoveryTopic.topic = ''
|
|
@@ -604,10 +929,41 @@ class NetworkPeers extends EventEmitter {
|
|
|
604
929
|
checkDiscoveryTopic.server = ''
|
|
605
930
|
checkDiscoveryTopic.client = ''
|
|
606
931
|
checkDiscoveryTopic.topic = ''
|
|
932
|
+
console.log('return rrrr3333')
|
|
933
|
+
return checkDiscoveryTopic
|
|
607
934
|
}
|
|
608
|
-
|
|
935
|
+
*/
|
|
609
936
|
}
|
|
610
937
|
|
|
938
|
+
/**
|
|
939
|
+
* match topics already set send and holder modes
|
|
940
|
+
* @method checkTopicModes
|
|
941
|
+
*
|
|
942
|
+
*/
|
|
943
|
+
checkTopicModes = function (matchTopic) {
|
|
944
|
+
// now use match topic to see if topic set as server or client roles?
|
|
945
|
+
let sendLogic = []
|
|
946
|
+
let holderLogic = []
|
|
947
|
+
for (let sendPeerT of this.sendTopicHolder) {
|
|
948
|
+
if (sendPeerT.topic === matchTopic) {
|
|
949
|
+
sendLogic.push(sendPeerT)
|
|
950
|
+
} else {
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
let matchHolderKeys = Object.keys(this.topicHolder)
|
|
954
|
+
for (let topicH of matchHolderKeys) {
|
|
955
|
+
if (this.topicHolder[topicH].topic === matchTopic) {
|
|
956
|
+
holderLogic.push(this.topicHolder[topicH])
|
|
957
|
+
} else {
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
let firstTime = false
|
|
961
|
+
if (sendLogic.length === 0 && holderLogic.length === 0) {
|
|
962
|
+
firstTime = true
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
return { firstTime: firstTime }
|
|
966
|
+
}
|
|
611
967
|
|
|
612
968
|
/**
|
|
613
969
|
* where to route data share
|
|
@@ -668,6 +1024,19 @@ class NetworkPeers extends EventEmitter {
|
|
|
668
1024
|
this.peerConnect[publickey].write(JSON.stringify(topicShare))
|
|
669
1025
|
}
|
|
670
1026
|
|
|
1027
|
+
/**
|
|
1028
|
+
* write message to topic reconnect peer to inform of id
|
|
1029
|
+
* @method writeTopicReconnect
|
|
1030
|
+
*
|
|
1031
|
+
*/
|
|
1032
|
+
writeTopicReconnect = function (publickey, topicInfo) {
|
|
1033
|
+
let topicReconnectMessage = {}
|
|
1034
|
+
topicReconnectMessage.type = 'topic-reconnect-id'
|
|
1035
|
+
topicReconnectMessage.data = { topic: topicInfo.topic, peerKey: topicInfo.peerKey }
|
|
1036
|
+
this.peerConnect[topicInfo.currentPubkey].write(JSON.stringify(topicReconnectMessage))
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
|
|
671
1040
|
/**
|
|
672
1041
|
* write message to network
|
|
673
1042
|
* @method writeTonetworkData
|
|
@@ -788,7 +1157,7 @@ class NetworkPeers extends EventEmitter {
|
|
|
788
1157
|
*
|
|
789
1158
|
*/
|
|
790
1159
|
topicListen = async function (topic, peerKey) {
|
|
791
|
-
|
|
1160
|
+
// const noisePublicKey = Buffer.alloc(32).fill(topic) // A topic must be 32 bytes
|
|
792
1161
|
// let topicKeylive = noisePublicKey.toString('hex')
|
|
793
1162
|
const noisePublicKey = Buffer.from(topic, 'hex') // must be 32 bytes
|
|
794
1163
|
if (noisePublicKey.length === 32) {
|