holepunch-hop 0.4.5 → 0.5.0

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.
Files changed (28) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/package.json +11 -5
  3. package/src/adapters/timeConvertor.js +3 -0
  4. package/src/index.js +45 -10
  5. package/src/{peers.js → network/peers.js} +507 -136
  6. package/src/{bees.js → storage/bees.js} +142 -60
  7. package/src/{drive.js → storage/drive.js} +2 -3
  8. package/src/{fileParser.js → storage/fileParser.js} +7 -1
  9. package/test/datacommands/files/data/jan3-bitcoin.csv +17 -0
  10. package/test/datacommands/files/large-csv.test.js +7 -0
  11. package/test/datacommands/files/small-csv.test.js +76 -0
  12. package/test/datacommands/ledger/save-get-ledger.test.js +117 -0
  13. package/test/datacommands/results/save-get-results.test.js +122 -0
  14. package/test/holepunch-initiate.test.js +47 -0
  15. package/test/multipers/ten-peers-network.test.js +437 -0
  16. package/test/setup-bee-holepunch.test.js +45 -0
  17. package/test/setup-holepunch.test.js +14 -13
  18. package/test/threepers/peer3-geninvite-after.test.js +439 -0
  19. package/test/threepers/three-peers.test.js +159 -0
  20. package/test/threepers/two-then-three.test.js +434 -0
  21. package/test/twopeers/peerClient-Server.test.js +243 -0
  22. package/test/twopeers/reconnect-peers.test.js +257 -0
  23. package/test/twopeers/reconnect-serverthen-conerr.test.js +304 -0
  24. package/test/twopeers/reconnect-then-conerr.test.js +309 -0
  25. package/test/twopeers/two-peer-one-disconnect.test.js +162 -0
  26. package/test/twopeers/two-peer-server-disconnect.test.js +167 -0
  27. package/vitest.config.js +8 -0
  28. /package/src/{kbledger.js → ledger/kbledger.js} +0 -0
@@ -0,0 +1,439 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest'
2
+ import Hyperswarm from 'hyperswarm'
3
+ import NetworkPeers from '../../src/network/peers.js'
4
+ import crypto from 'crypto'
5
+
6
+ describe('Three Peer Connection Tests', () => {
7
+ let peer1
8
+ let peer2
9
+ let peer3
10
+ let swarm1
11
+ let swarm2
12
+ let swarm3
13
+ let testConfig
14
+ let savedPeerNetworkClient = []
15
+ let savedPeerNetworkServer = []
16
+ let topicReconnect = ''
17
+ let topicReconnect13 = ''
18
+
19
+
20
+ const randomString = crypto.randomBytes(32).toString('hex')
21
+ topicReconnect = randomString
22
+ console.log(topicReconnect)
23
+
24
+
25
+
26
+ const randomString13 = crypto.randomBytes(32).toString('hex')
27
+ topicReconnect13 = randomString13
28
+ console.log(topicReconnect13)
29
+
30
+ beforeEach(async () => {
31
+ // Create swarms for each peer
32
+ swarm1 = new Hyperswarm()
33
+ swarm2 = new Hyperswarm()
34
+ swarm3 = new Hyperswarm()
35
+
36
+ // Create peer instances
37
+ peer1 = new NetworkPeers({}, swarm1)
38
+ peer2 = new NetworkPeers({}, swarm2)
39
+ peer3 = new NetworkPeers({}, swarm3)
40
+
41
+ console.log('TTpppppppppppppppppppp---PUBKEY owner---pppppppp')
42
+ console.log(peer1.swarm.keyPair.publicKey.toString('hex'))
43
+ console.log(peer2.swarm.keyPair.publicKey.toString('hex'))
44
+ console.log(peer3.swarm.keyPair.publicKey.toString('hex'))
45
+
46
+ testConfig = {
47
+ peer1to2: {
48
+ peer1: {
49
+ publicKey: peer1.swarm.keyPair.publicKey.toString('hex'),
50
+ client: false
51
+ },
52
+ peer2: {
53
+ publicKey: peer2.swarm.keyPair.publicKey.toString('hex'),
54
+ client: true
55
+ },
56
+ },
57
+ peer1to3: {
58
+ peer1: {
59
+ publicKey: peer1.swarm.keyPair.publicKey.toString('hex'),
60
+ client: true
61
+ },
62
+ peer3: {
63
+ publicKey: peer3.swarm.keyPair.publicKey.toString('hex'),
64
+ client: false
65
+ }
66
+ },
67
+ peer2to3: {
68
+ peer2: {
69
+ publicKey: peer2.swarm.keyPair.publicKey.toString('hex'),
70
+ client: false
71
+ },
72
+ peer3: {
73
+ publicKey: peer3.swarm.keyPair.publicKey.toString('hex'),
74
+ client: true
75
+ }
76
+ }
77
+ }
78
+
79
+
80
+ }, 20000)
81
+
82
+ afterEach(async () => {
83
+ console.log('TTCleaning up test environment')
84
+ await Promise.all([
85
+ swarm1.destroy(),
86
+ swarm2.destroy(),
87
+ swarm3.destroy()
88
+ ])
89
+ peer1 = null
90
+ peer2 = null
91
+ peer3 = null
92
+ }, 10000)
93
+
94
+ describe('Basic Connection', () => {
95
+ it('should establish start connections peer one to peer two', async () => {
96
+ let countConnect = 0
97
+ // Set up peer1 as the initial listener
98
+ peer1.peerJoinClient()
99
+ peer2.peerJoinClient()
100
+
101
+ let logicPrepserverStatus = async function (holePunch, info, publicKey) {
102
+ return await holePunch.prepareConnectionInfo(info, publicKey)
103
+ }
104
+
105
+ // Set up peer2 and peer3 with mock peer data
106
+ const mockPeer1 = {
107
+ publickey: peer1.swarm.keyPair.publicKey.toString('hex'),
108
+ live: false,
109
+ value: {
110
+ live: false,
111
+ key: peer1.swarm.keyPair.publicKey.toString('hex')
112
+ }
113
+ }
114
+ peer2.peerJoin(mockPeer1)
115
+
116
+ // Create connection promises for each peer
117
+ const connectionPromises = [
118
+ /* PEER 1 FIRST */
119
+ new Promise((resolve) => {
120
+ peer1.swarm.on('connection', (conn, info) => {
121
+ console.log('TTPeer1 FIRST connection:')
122
+ // console.log(conn)
123
+ // console.log(info.topics)
124
+ // console.log(info.publicKey.toString('hex'))
125
+ // console.log(peer1.swarm.peers)
126
+ countConnect++
127
+ //expect(info.publicKey).toBeDefined()
128
+ //expect(info.client).toBe(testConfig.peer1to2.peer1.client)
129
+
130
+ const publicKeyPeer1 = info.publicKey.toString('hex')
131
+ let logicInfo = logicPrepserverStatus(peer1, info, publicKeyPeer1)
132
+
133
+ if (info.client === testConfig.peer1to2.peer1.client) { // peer1 is server
134
+ console.log('TT peer1 logic assertions')
135
+ // expect(logicInfo.serverStatus).toBe(true)
136
+ // expect(logicInfo.topicKeylive.length).toBe(0)
137
+ // expect(logicInfo.discoveryTopicInfo.firstTime).toBe(true)
138
+ } else {
139
+ // Either serverStatus is true or there's a topic set
140
+ expect(logicInfo.serverStatus || logicInfo.topicKeylive.length > 0).toBe(true)
141
+ }
142
+
143
+
144
+ // Save the peer network data for reconnection
145
+ // Store connection for verification
146
+ const publicKeyHex = info.publicKey.toString('hex')
147
+ savedPeerNetworkClient.push({
148
+ key: publicKeyHex,
149
+ value: {
150
+ name: 'peer2',
151
+ publickey: publicKeyHex,
152
+ roletaken: true,
153
+ longterm: true,
154
+ settopic: true,
155
+ topic: topicReconnect,
156
+ live: false,
157
+ livePeerkey: ''
158
+ }
159
+ })
160
+ // process network message
161
+ conn.on('data', data =>
162
+ // assess data
163
+ peer1.assessData(publicKeyHex, data)
164
+ )
165
+ if (countConnect === 2) {
166
+ console.log('TTnow resolve')
167
+ resolve()
168
+ }
169
+ })
170
+ }),
171
+ /* PEER 2 FIRST */
172
+ new Promise((resolve) => {
173
+ peer2.swarm.on('connection', (conn, info) => {
174
+ console.log('TT Peer2 FIRST connection:')
175
+ // console.log(conn)
176
+ // console.log(info.topics)
177
+ // console.log(peer2.swarm.peers)
178
+ countConnect++
179
+ // expect(info.publicKey).toBeDefined()
180
+ // Peer2's role depends on which peer it's connecting to
181
+ if (info.publicKey === testConfig.peer1to2.peer1.publicKey) {
182
+ // expect(info.client).toBe(testConfig.peer1to2.peer2.client) // Peer2 is client to Peer1
183
+ }
184
+ // Store connection for verification on reconnect
185
+ const publicKeyHex2 = info.publicKey.toString('hex')
186
+ let logicInfo = logicPrepserverStatus(peer1, info, publicKeyHex2)
187
+ if (info.client === testConfig.peer1to2.peer2.client) { // peer2 is client
188
+ console.log('TTpeer2 assertion logic')
189
+ // expect(logicInfo.serverStatus).toBe(false)
190
+ // xpect(logicInfo.topicKeylive.length).toBe(0)
191
+ // expect(logicInfo.discoveryTopicInfo.firstTime).toBe(true)
192
+ } else {
193
+ // Either serverStatus is true or there's a topic set
194
+ expect(logicInfo.serverStatus || logicInfo.topicKeylive.length > 0).toBe(true)
195
+ }
196
+
197
+ savedPeerNetworkServer.push({
198
+ key: publicKeyHex2,
199
+ value: {
200
+ name: 'peer1',
201
+ publickey: publicKeyHex2,
202
+ roletaken: false,
203
+ longterm: true,
204
+ settopic: false,
205
+ topic: topicReconnect,
206
+ live: false,
207
+ livePeerkey: ''
208
+ }
209
+ })
210
+ // process network message
211
+ conn.on('data', data =>
212
+ // assess data
213
+ peer2.assessData(publicKeyHex2, data)
214
+ )
215
+ if (countConnect === 1) {
216
+ console.log('TTresolve two')
217
+ resolve()
218
+ }
219
+ })
220
+ })
221
+ ]
222
+
223
+ // Wait for all connections to be established
224
+ await Promise.all(connectionPromises)
225
+
226
+ // Add timeout to prevent hanging
227
+ const timeout = setTimeout(() => {
228
+ throw new Error('Connection did not establish within timeout period')
229
+ }, 2000)
230
+
231
+ // Clear timeout if connection was successful
232
+ clearTimeout(timeout)
233
+ }, 20000) // 50 second timeout
234
+ })
235
+
236
+
237
+
238
+
239
+ /* reconnection TEST from here */
240
+ describe('reconnection using saved data', () => {
241
+ it('should use saved relationship data for reconnection but peer1 to peer2 first time should go through first time path logic', async () => {
242
+ console.log('TTreconnection using saved data')
243
+ // keep track count connection to closetest
244
+ let connectionCount = 0
245
+ let peer1Count = 0
246
+ // Set up peer1 as the initial listener
247
+ peer1.peerJoinClient()
248
+ peer2.peerJoinClient()
249
+
250
+ let logicPrepserverStatus = async function (holePunch, info, publicKey) {
251
+ return await holePunch.prepareConnectionInfo(info, publicKey)
252
+ }
253
+
254
+ // Create connection promise to verify reconnection details
255
+ let reconnectionPromise = new Promise(async (resolve) => {
256
+
257
+ // Reconnect using saved peer network data
258
+ peer1.setupConnectionBegin(savedPeerNetworkClient)
259
+ // Add 3 second delay before starting serverPeer
260
+ await new Promise(resolve => setTimeout(resolve, 3000));
261
+ peer2.setupConnectionBegin(savedPeerNetworkServer)
262
+
263
+ peer1.swarm.on('connection', async (conn, info) => {
264
+ console.log('TT Peer1 RECON connection details:')
265
+ // console.log(peer1.swarm.status(topicReconnect))
266
+ connectionCount++
267
+ peer1Count++
268
+ let test2complete = false
269
+ // Store connection for verification
270
+ const publicKeyHex = info.publicKey.toString('hex')
271
+ // to differenciate between peer 2 and peer3
272
+ if (peer1Count === 1) {
273
+ console.log('TT peer one RECON batch assert 111111')
274
+ // check logic
275
+ let logicInfo = await logicPrepserverStatus(peer1, info, publicKeyHex)
276
+ if (info.client === testConfig.peer1to2.peer1.client) { // peer1 is server
277
+ expect(logicInfo.discoveryTopicInfo.firstTime).toBe('wait-topic-confirm')
278
+ } else {
279
+ // Either serverStatus is true or there's a topic set
280
+
281
+ }
282
+ } else if (peer1Count === 2) {
283
+ console.log('TT peer one RECON batch assert 222222')
284
+ // check logic
285
+ let logicInfo = await logicPrepserverStatus(peer1, info, publicKeyHex)
286
+ console.log('logic info-----')
287
+ console.log(logicInfo)
288
+ // For peer1 (server) - first-time connection
289
+ if (info.client === true) { // peer1 is client
290
+ console.log('TT server asserts peer1 to peer3 first time but with peer2 already connected')
291
+ expect(logicInfo.discoveryTopicInfo.firstTime).toBe(true)
292
+ test2complete = true
293
+ console.log('test2222 over')
294
+ // resolve()
295
+ }
296
+ else {
297
+ // Either serverStatus is true or there's a topic set
298
+
299
+ }
300
+ } else {
301
+ console.log('no match to peer 2 or 3 XXXXXXXX')
302
+ }
303
+
304
+ // process network message
305
+ conn.on('data', data =>
306
+ // assess data
307
+ peer1.assessData(publicKeyHex, data)
308
+ )
309
+ // Resolve when reconnection is established
310
+ if (connectionCount === 4 && test2complete === true) {
311
+ console.log('TT resolve peerone')
312
+ resolve()
313
+ }
314
+ })
315
+
316
+ peer2.swarm.on('connection', async (conn, info) => {
317
+ console.log('TT Peer2 RECON connection details:')
318
+ // console.log(peer2.swarm.status(topicReconnect))
319
+ connectionCount++
320
+ // Store connection for verification
321
+ const publicKeyHex = info.publicKey.toString('hex')
322
+ // Determine the correct client value from testConfig
323
+ const clientValue = testConfig.peer1to2.peer2.client
324
+ // check logic
325
+ let logicInfo = await logicPrepserverStatus(peer2, info, publicKeyHex)
326
+ // Verify reconnection logic
327
+ if (info.client === clientValue) { // peer1 is server
328
+ // expect(logicInfo.serverStatus).toBe(false)
329
+ // expect(logicInfo.topicKeylive.length).toBe(1)
330
+ expect(logicInfo.discoveryTopicInfo.firstTime).toBe(false)
331
+ } else {
332
+ // Either serverStatus is true or there's a topic set
333
+ expect(logicInfo.serverStatus || logicInfo.topicKeylive.length > 0).toBe(true)
334
+ }
335
+ // Ensure peer1 and peer2 are connected before peer3 connects
336
+ console.log('TT Peer1 and Peer2 Reconnt now -- code location')
337
+ // Wait until both peer1 and peer2 connections are established
338
+ // keep tabs on invites generated
339
+ peer1.setRole({ pubkey: peer1.swarm.keyPair.publicKey.toString('hex'), codename: '12345677654321', name: 'primepeer' })
340
+ // Create function to handle peer3 connection
341
+ const connectPeer3 = async () => {
342
+ console.log('TT Connecting peer3 now that peer1 and peer2 are connected')
343
+ peer3.peerJoinClient()
344
+ const mockPeer3 = {
345
+ publickey: peer3.swarm.keyPair.publicKey.toString('hex'),
346
+ live: false,
347
+ value: {
348
+ live: false,
349
+ key: peer3.swarm.keyPair.publicKey.toString('hex')
350
+ }
351
+ }
352
+ peer1.peerJoin(mockPeer3)
353
+ }
354
+
355
+ // Call connectPeer3 when connectionCount reaches 2
356
+ if (connectionCount === 2) {
357
+ console.log('TT wait 1111')
358
+ await connectPeer3()
359
+ } else {
360
+ // Set up a listener for when connectionCount reaches 2
361
+ const checkConnectionCount = setInterval(async () => {
362
+ console.log('TT wait 2222')
363
+ // put a time delay in here too
364
+ if (connectionCount === 2) {
365
+ clearInterval(checkConnectionCount)
366
+ console.log('TT Waiting 3 seconds before connecting peer3...')
367
+ await new Promise(resolve => setTimeout(resolve, 10000))
368
+ connectPeer3()
369
+ }
370
+ }, 100)
371
+ }
372
+
373
+ // process network message
374
+ conn.on('data', data =>
375
+ // assess data
376
+ peer2.assessData(publicKeyHex, data)
377
+ )
378
+ if (connectionCount === 4) {
379
+ console.log('resolve peer two')
380
+ resolve()
381
+ }
382
+ })
383
+
384
+ peer3.swarm.on('connection', async (conn, info) => {
385
+ console.log('TT Peer3 FIRST connection details:')
386
+ connectionCount++
387
+ // Verify server reconnection details
388
+ // expect(info.publicKey).toBeDefined()
389
+ // expect(info.publicKey.toString('hex')).toBeDefined()
390
+ // expect(info.topics.length).toBe(0)
391
+ // expect(peer3.topicHolder['']).toBeUndefined()
392
+ // Store connection for verification
393
+ const publicKeyHex = info.publicKey.toString('hex')
394
+ // expect(serverPeer.peerConnect[publicKeyHex]).toBeDefined()
395
+ // check logic
396
+ if (info.publicKey === testConfig.peer1to3.peer1.publicKey) {
397
+ expect(info.client).toBe(testConfig.peer1to3.peer3.client) // Peer3 is client to Peer1
398
+ } else if (info.publicKey === testConfig.peer2to3.peer2.publicKey) {
399
+ expect(info.client).toBe(testConfig.peer2to3.peer3.client) // Peer3 is client to Peer2
400
+ }
401
+ // check logic
402
+ let logicInfo = await logicPrepserverStatus(peer3, info, publicKeyHex)
403
+ console.log('logic info-----')
404
+ console.log(logicInfo)
405
+ if (info.client === testConfig.peer1to3.peer3.client) { // peer1 is server
406
+ // expect(logicInfo.serverStatus).toBe(false)
407
+ // expect(logicInfo.topicKeylive.length).toBe(0)
408
+ console.log('peer 3 logic assertions')
409
+ expect(logicInfo.discoveryTopicInfo.firstTime).toBe(true)
410
+ }
411
+ else {
412
+ // Either serverStatus is true or there's a topic set
413
+ console.log('mis match')
414
+ }
415
+ // process network message
416
+ conn.on('data', data =>
417
+ // assess data
418
+ peer3.assessData(publicKeyHex, data)
419
+ )
420
+ if (connectionCount === 4) {
421
+ console.log('resolve peer three')
422
+ resolve()
423
+ }
424
+ })
425
+ })
426
+
427
+ // Wait for connection to be established
428
+ await reconnectionPromise
429
+
430
+ // Add timeout to prevent hanging
431
+ const timeout = setTimeout(() => {
432
+ throw new Error('Connection did not establish within timeout period')
433
+ }, 30000)
434
+
435
+ // Clear timeout if connection was successful
436
+ clearTimeout(timeout)
437
+ }, 40000) // 30 second timeout
438
+ })
439
+ })
@@ -0,0 +1,159 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest'
2
+ import Hyperswarm from 'hyperswarm'
3
+ import NetworkPeers from '../../src/network/peers.js'
4
+ import crypto from 'crypto'
5
+
6
+ describe('Three Peer Connection Tests', () => {
7
+ let peer1
8
+ let peer2
9
+ let peer3
10
+ let swarm1
11
+ let swarm2
12
+ let swarm3
13
+ let testConfig
14
+ const topic = crypto.randomBytes(32).toString('hex')
15
+
16
+ beforeEach(async () => {
17
+ // Create swarms for each peer
18
+ swarm1 = new Hyperswarm()
19
+ swarm2 = new Hyperswarm()
20
+ swarm3 = new Hyperswarm()
21
+
22
+ // Create peer instances
23
+ peer1 = new NetworkPeers({}, swarm1)
24
+ peer2 = new NetworkPeers({}, swarm2)
25
+ peer3 = new NetworkPeers({}, swarm3)
26
+
27
+ testConfig = {
28
+ peer1to2: {
29
+ peer1: {
30
+ publicKey: peer1.swarm.keyPair.publicKey.toString('hex'),
31
+ client: false
32
+ },
33
+ peer2: {
34
+ publicKey: peer2.swarm.keyPair.publicKey.toString('hex'),
35
+ client: true
36
+ },
37
+ },
38
+ peer1to3: {
39
+ peer1: {
40
+ publicKey: peer1.swarm.keyPair.publicKey.toString('hex'),
41
+ client: false
42
+ },
43
+ peer3: {
44
+ publicKey: peer3.swarm.keyPair.publicKey.toString('hex'),
45
+ client: true
46
+ }
47
+ },
48
+ peer2to3: {
49
+ peer2: {
50
+ publicKey: peer2.swarm.keyPair.publicKey.toString('hex'),
51
+ client: false
52
+ },
53
+ peer3: {
54
+ publicKey: peer3.swarm.keyPair.publicKey.toString('hex'),
55
+ client: true
56
+ }
57
+ }
58
+ }
59
+
60
+ // Set up peer1 as the initial listener
61
+ peer1.peerJoinClient()
62
+ peer2.peerJoinClient()
63
+ peer3.peerJoinClient()
64
+
65
+ // Set up peer2 and peer3 with mock peer data
66
+ const mockPeer1 = {
67
+ publickey: peer1.swarm.keyPair.publicKey.toString('hex'),
68
+ live: false,
69
+ value: {
70
+ live: false,
71
+ key: peer1.swarm.keyPair.publicKey.toString('hex')
72
+ }
73
+ }
74
+ const mockPeer2 = {
75
+ publickey: peer2.swarm.keyPair.publicKey.toString('hex'),
76
+ live: false,
77
+ value: {
78
+ live: false,
79
+ key: peer2.swarm.keyPair.publicKey.toString('hex')
80
+ }
81
+ }
82
+ peer2.peerJoin(mockPeer1)
83
+ peer3.peerJoin(mockPeer1)
84
+ peer3.peerJoin(mockPeer2)
85
+ }, 20000)
86
+
87
+ afterEach(async () => {
88
+ console.log('Cleaning up test environment')
89
+ await Promise.all([
90
+ swarm1.destroy(),
91
+ swarm2.destroy(),
92
+ swarm3.destroy()
93
+ ])
94
+ peer1 = null
95
+ peer2 = null
96
+ peer3 = null
97
+ }, 10000)
98
+
99
+ describe('Basic Connection', () => {
100
+ it('should establish star topology connections', async () => {
101
+ // Create connection promises for each peer
102
+ const connectionPromises = [
103
+ new Promise((resolve) => {
104
+ peer1.swarm.on('connection', (conn, info) => {
105
+ // console.log('Peer1 connection:', info)
106
+ expect(info.publicKey).toBeDefined()
107
+ expect(info.client).toBe(testConfig.peer1to2.peer1.client) // Peer1 is server
108
+ resolve()
109
+ })
110
+ }),
111
+ new Promise((resolve) => {
112
+ peer2.swarm.on('connection', (conn, info) => {
113
+ // console.log('Peer2 connection:', info)
114
+ expect(info.publicKey).toBeDefined()
115
+ // expect(info.client).toBe(testConfig.peer1to2.peer1.client) // Peer2 is client when connecting to Peer1
116
+ // Peer2's role depends on which peer it's connecting to
117
+ if (info.publicKey === testConfig.peer1to2.peer1.publicKey) {
118
+ expect(info.client).toBe(true) // Peer2 is client to Peer1
119
+ } else if (info.publicKey === testConfig.peer2to3.peer3.publicKey) {
120
+ expect(info.client).toBe(false) // Peer2 is server to Peer3
121
+ }
122
+ resolve()
123
+ })
124
+ }),
125
+ new Promise((resolve) => {
126
+ peer3.swarm.on('connection', (conn, info) => {
127
+ // console.log('Peer3 connection:', info)
128
+ expect(info.publicKey).toBeDefined()
129
+ // expect(info.client).toBe(testConfig.peer1to3.peer1.client) // Peer3 is client when connecting to Peer1
130
+ // Peer3's role depends on which peer it's connecting to
131
+ if (info.publicKey === testConfig.peer1to3.peer1.publicKey) {
132
+ expect(info.client).toBe(true) // Peer3 is client to Peer1
133
+ } else if (info.publicKey === testConfig.peer2to3.peer2.publicKey) {
134
+ expect(info.client).toBe(true) // Peer3 is client to Peer2
135
+ }
136
+ resolve()
137
+ })
138
+ })
139
+ ]
140
+
141
+ // Wait for all connections to be established
142
+ await Promise.all(connectionPromises)
143
+
144
+ // Add timeout to prevent hanging
145
+ const timeout = setTimeout(() => {
146
+ throw new Error('Connection did not establish within timeout period')
147
+ }, 30000)
148
+
149
+ // Clear timeout if connection was successful
150
+ clearTimeout(timeout)
151
+ }, 50000) // 50 second timeout
152
+ })
153
+
154
+ // TODO: Add more test cases
155
+ // 1. Verify peer relationships
156
+ // 2. Test message passing
157
+ // 3. Test peer disconnection
158
+ // 4. Test reconnection
159
+ })