@streamr/dht 100.0.0-testnet-one.0 → 100.0.0-testnet-one.2

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 (113) hide show
  1. package/dist/src/connection/ConnectionLockRpcRemote.js +1 -25
  2. package/dist/src/connection/ConnectionLockRpcRemote.js.map +1 -1
  3. package/dist/src/connection/ConnectionManager.d.ts +0 -1
  4. package/dist/src/connection/ConnectionManager.js +7 -6
  5. package/dist/src/connection/ConnectionManager.js.map +1 -1
  6. package/dist/src/connection/ConnectorFacade.d.ts +2 -2
  7. package/dist/src/connection/ConnectorFacade.js +2 -3
  8. package/dist/src/connection/ConnectorFacade.js.map +1 -1
  9. package/dist/src/connection/ManagedConnection.d.ts +1 -0
  10. package/dist/src/connection/ManagedConnection.js +11 -1
  11. package/dist/src/connection/ManagedConnection.js.map +1 -1
  12. package/dist/src/connection/connectivityChecker.js +3 -2
  13. package/dist/src/connection/connectivityChecker.js.map +1 -1
  14. package/dist/src/connection/websocket/ClientWebsocket.d.ts +1 -0
  15. package/dist/src/connection/websocket/ClientWebsocket.js +6 -3
  16. package/dist/src/connection/websocket/ClientWebsocket.js.map +1 -1
  17. package/dist/src/connection/websocket/ServerWebsocket.d.ts +4 -0
  18. package/dist/src/connection/websocket/ServerWebsocket.js +32 -21
  19. package/dist/src/connection/websocket/ServerWebsocket.js.map +1 -1
  20. package/dist/src/connection/websocket/WebsocketConnector.d.ts +0 -1
  21. package/dist/src/connection/websocket/WebsocketConnector.js +21 -10
  22. package/dist/src/connection/websocket/WebsocketConnector.js.map +1 -1
  23. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.d.ts +1 -1
  24. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js +8 -11
  25. package/dist/src/connection/websocket/WebsocketConnectorRpcLocal.js.map +1 -1
  26. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.d.ts +2 -2
  27. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js +3 -37
  28. package/dist/src/connection/websocket/WebsocketConnectorRpcRemote.js.map +1 -1
  29. package/dist/src/connection/websocket/WebsocketServer.js +21 -4
  30. package/dist/src/connection/websocket/WebsocketServer.js.map +1 -1
  31. package/dist/src/dht/DhtNode.d.ts +4 -4
  32. package/dist/src/dht/DhtNode.js +31 -20
  33. package/dist/src/dht/DhtNode.js.map +1 -1
  34. package/dist/src/dht/DhtNodeRpcLocal.d.ts +1 -4
  35. package/dist/src/dht/DhtNodeRpcLocal.js +1 -5
  36. package/dist/src/dht/DhtNodeRpcLocal.js.map +1 -1
  37. package/dist/src/dht/PeerManager.d.ts +10 -6
  38. package/dist/src/dht/PeerManager.js +95 -30
  39. package/dist/src/dht/PeerManager.js.map +1 -1
  40. package/dist/src/dht/contact/SortedContactList.d.ts +20 -6
  41. package/dist/src/dht/contact/SortedContactList.js +55 -24
  42. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  43. package/dist/src/dht/discovery/DiscoverySession.d.ts +3 -5
  44. package/dist/src/dht/discovery/DiscoverySession.js +11 -9
  45. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  46. package/dist/src/dht/discovery/PeerDiscovery.d.ts +4 -2
  47. package/dist/src/dht/discovery/PeerDiscovery.js +17 -16
  48. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  49. package/dist/src/dht/find/FindSession.js +6 -1
  50. package/dist/src/dht/find/FindSession.js.map +1 -1
  51. package/dist/src/dht/find/Finder.js +6 -1
  52. package/dist/src/dht/find/Finder.js.map +1 -1
  53. package/dist/src/dht/routing/Router.d.ts +1 -1
  54. package/dist/src/dht/routing/Router.js +8 -4
  55. package/dist/src/dht/routing/Router.js.map +1 -1
  56. package/dist/src/dht/routing/RoutingSession.js +8 -1
  57. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  58. package/dist/src/dht/store/StoreRpcLocal.js +19 -5
  59. package/dist/src/dht/store/StoreRpcLocal.js.map +1 -1
  60. package/dist/src/helpers/PeerID.d.ts +1 -0
  61. package/dist/src/helpers/PeerID.js +7 -2
  62. package/dist/src/helpers/PeerID.js.map +1 -1
  63. package/dist/src/helpers/peerIdFromPeerDescriptor.js +2 -2
  64. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
  65. package/package.json +5 -5
  66. package/src/connection/ConnectionLockRpcRemote.ts +1 -2
  67. package/src/connection/ConnectionManager.ts +16 -17
  68. package/src/connection/ConnectorFacade.ts +1 -4
  69. package/src/connection/ManagedConnection.ts +12 -1
  70. package/src/connection/connectivityChecker.ts +3 -2
  71. package/src/connection/websocket/ClientWebsocket.ts +5 -2
  72. package/src/connection/websocket/ServerWebsocket.ts +40 -25
  73. package/src/connection/websocket/WebsocketConnector.ts +23 -12
  74. package/src/connection/websocket/WebsocketConnectorRpcLocal.ts +9 -11
  75. package/src/connection/websocket/WebsocketConnectorRpcRemote.ts +5 -14
  76. package/src/connection/websocket/WebsocketServer.ts +20 -5
  77. package/src/dht/DhtNode.ts +32 -24
  78. package/src/dht/DhtNodeRpcLocal.ts +2 -9
  79. package/src/dht/PeerManager.ts +110 -36
  80. package/src/dht/contact/SortedContactList.ts +87 -44
  81. package/src/dht/discovery/DiscoverySession.ts +15 -14
  82. package/src/dht/discovery/PeerDiscovery.ts +37 -22
  83. package/src/dht/find/FindSession.ts +6 -1
  84. package/src/dht/find/Finder.ts +6 -7
  85. package/src/dht/routing/Router.ts +8 -4
  86. package/src/dht/routing/RoutingSession.ts +8 -8
  87. package/src/dht/store/StoreRpcLocal.ts +19 -7
  88. package/src/helpers/PeerID.ts +6 -2
  89. package/src/helpers/peerIdFromPeerDescriptor.ts +4 -4
  90. package/test/benchmark/Find.test.ts +1 -1
  91. package/test/benchmark/KademliaCorrectness.test.ts +1 -1
  92. package/test/benchmark/SortedContactListBenchmark.test.ts +150 -0
  93. package/test/benchmark/WebsocketServerMemoryLeak.test.ts +41 -0
  94. package/test/benchmark/kademlia-simulation/SimulationNode.ts +6 -1
  95. package/test/end-to-end/Layer0.test.ts +4 -4
  96. package/test/end-to-end/Layer0MixedConnectionTypes.test.ts +10 -10
  97. package/test/end-to-end/Layer0Webrtc-Layer1.test.ts +4 -4
  98. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +2 -2
  99. package/test/end-to-end/Layer1-Scale-Webrtc.test.ts +2 -2
  100. package/test/end-to-end/RecoveryFromFailedAutoCertification.test.ts +1 -1
  101. package/test/end-to-end/memory-leak.test.ts +1 -0
  102. package/test/integration/DhtJoinPeerDiscovery.test.ts +2 -2
  103. package/test/integration/Layer1-scale.test.ts +1 -1
  104. package/test/integration/Mock-Layer1-Layer0.test.ts +15 -15
  105. package/test/integration/MultipleEntryPointJoining.test.ts +7 -7
  106. package/test/integration/ReplicateData.test.ts +6 -1
  107. package/test/integration/SimultaneousConnections.test.ts +81 -49
  108. package/test/integration/Store.test.ts +1 -1
  109. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +1 -1
  110. package/test/integration/WebrtcConnectionManagement.test.ts +29 -0
  111. package/test/integration/WebsocketConnectionManagement.test.ts +65 -4
  112. package/test/integration/WebsocketConnectorRpc.test.ts +3 -5
  113. package/test/unit/SortedContactList.test.ts +15 -10
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable promise/no-nesting */
2
2
 
3
- import { MetricsContext, waitForCondition } from '@streamr/utils'
3
+ import { MetricsContext, waitForCondition, waitForEvent3 } from '@streamr/utils'
4
4
  import { ConnectionManager } from '../../src/connection/ConnectionManager'
5
5
  import { DefaultConnectorFacade, DefaultConnectorFacadeConfig } from '../../src/connection/ConnectorFacade'
6
6
  import { ConnectionType } from '../../src/connection/IConnection'
@@ -10,6 +10,7 @@ import { PeerID } from '../../src/helpers/PeerID'
10
10
  import * as Err from '../../src/helpers/errors'
11
11
  import { Message, MessageType, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
12
12
  import { RpcMessage } from '../../src/proto/packages/proto-rpc/protos/ProtoRpc'
13
+ import { TransportEvents } from '../../src/transport/ITransport'
13
14
 
14
15
  const createConfig = (localPeerDescriptor: PeerDescriptor, opts: Omit<DefaultConnectorFacadeConfig, 'createLocalPeerDescriptor'>) => {
15
16
  return {
@@ -26,11 +27,12 @@ describe('Websocket Connection Management', () => {
26
27
  const serviceId = 'test'
27
28
  let wsServerManager: ConnectionManager
28
29
  let noWsServerManager: ConnectionManager
30
+ let biggerNoWsServerManager: ConnectionManager
29
31
 
30
32
  const simulator = new Simulator()
31
33
 
32
34
  const wsServerConnectorPeerDescriptor: PeerDescriptor = {
33
- nodeId: PeerID.fromString('peerWithServer').value,
35
+ nodeId: PeerID.fromString('2').value,
34
36
  type: NodeType.NODEJS,
35
37
  websocket: {
36
38
  host: '127.0.0.1',
@@ -40,12 +42,18 @@ describe('Websocket Connection Management', () => {
40
42
  }
41
43
 
42
44
  const noWsServerConnectorPeerDescriptor: PeerDescriptor = {
43
- nodeId: PeerID.fromString('peerWithoutServer').value,
45
+ nodeId: PeerID.fromString('1').value,
46
+ type: NodeType.NODEJS,
47
+ }
48
+
49
+ const biggerNoWsServerConnectorPeerDescriptor: PeerDescriptor = {
50
+ nodeId: PeerID.fromString('3').value,
44
51
  type: NodeType.NODEJS,
45
52
  }
46
53
 
47
54
  let connectorTransport1: SimulatorTransport
48
55
  let connectorTransport2: SimulatorTransport
56
+ let connectorTransport3: SimulatorTransport
49
57
 
50
58
  beforeEach(async () => {
51
59
 
@@ -53,6 +61,8 @@ describe('Websocket Connection Management', () => {
53
61
  await connectorTransport1.start()
54
62
  connectorTransport2 = new SimulatorTransport(noWsServerConnectorPeerDescriptor, simulator)
55
63
  await connectorTransport2.start()
64
+ connectorTransport3 = new SimulatorTransport(biggerNoWsServerConnectorPeerDescriptor, simulator)
65
+ await connectorTransport3.start()
56
66
 
57
67
  const config1 = createConfig(wsServerConnectorPeerDescriptor, {
58
68
  transport: connectorTransport1,
@@ -62,22 +72,29 @@ describe('Websocket Connection Management', () => {
62
72
  const config2 = createConfig(noWsServerConnectorPeerDescriptor, {
63
73
  transport: connectorTransport2
64
74
  })
75
+ const config3 = createConfig(biggerNoWsServerConnectorPeerDescriptor, {
76
+ transport: connectorTransport3
77
+ })
65
78
 
66
79
  wsServerManager = new ConnectionManager(config1)
67
80
  noWsServerManager = new ConnectionManager(config2)
81
+ biggerNoWsServerManager = new ConnectionManager(config3)
68
82
 
69
83
  await wsServerManager.start()
70
84
  await noWsServerManager.start()
85
+ await biggerNoWsServerManager.start()
71
86
  })
72
87
 
73
88
  afterEach(async () => {
74
89
  await wsServerManager.stop()
75
90
  await noWsServerManager.stop()
91
+ await biggerNoWsServerManager.stop()
76
92
  await connectorTransport1.stop()
77
93
  await connectorTransport2.stop()
94
+ await connectorTransport3.stop()
78
95
  })
79
96
 
80
- it('Can open connections to serverless peer', (done) => {
97
+ it('Can open connections to serverless peer with smaller peerId', (done) => {
81
98
  const dummyMessage: Message = {
82
99
  serviceId,
83
100
  body: {
@@ -99,6 +116,50 @@ describe('Websocket Connection Management', () => {
99
116
  wsServerManager.send(dummyMessage)
100
117
  })
101
118
 
119
+ it('Can open connections to serverless peer with bigger peerId', (done) => {
120
+ const dummyMessage: Message = {
121
+ serviceId,
122
+ body: {
123
+ oneofKind: 'rpcMessage',
124
+ rpcMessage: RpcMessage.create()
125
+ },
126
+ messageType: MessageType.RPC,
127
+ messageId: 'mockerer',
128
+ targetDescriptor: biggerNoWsServerConnectorPeerDescriptor
129
+ }
130
+ biggerNoWsServerManager.on('message', (message: Message) => {
131
+ expect(message.messageId).toEqual('mockerer')
132
+ expect(wsServerManager.getConnection(biggerNoWsServerConnectorPeerDescriptor)!.connectionType).toEqual(ConnectionType.WEBSOCKET_SERVER)
133
+ expect(biggerNoWsServerManager.getConnection(wsServerConnectorPeerDescriptor)!.connectionType).toEqual(ConnectionType.WEBSOCKET_CLIENT)
134
+
135
+ done()
136
+ })
137
+
138
+ wsServerManager.send(dummyMessage)
139
+ })
140
+
141
+ it('Failed connection requests are cleaned up', async () => {
142
+ const dummyMessage: Message = {
143
+ serviceId,
144
+ body: {
145
+ oneofKind: 'rpcMessage',
146
+ rpcMessage: RpcMessage.create()
147
+ },
148
+ messageType: MessageType.RPC,
149
+ messageId: 'mockerer',
150
+ targetDescriptor: {
151
+ nodeId: new Uint8Array([1, 2, 4]),
152
+ type: NodeType.NODEJS
153
+ }
154
+ }
155
+
156
+ await Promise.allSettled([
157
+ waitForEvent3<TransportEvents>(wsServerManager, 'disconnected', 15000),
158
+ wsServerManager.send(dummyMessage)
159
+ ])
160
+ expect(wsServerManager.getConnection(dummyMessage.targetDescriptor!)).toBeUndefined()
161
+ }, 20000)
162
+
102
163
  it('Can open connections to peer with server', async () => {
103
164
  const dummyMessage: Message = {
104
165
  serviceId,
@@ -67,16 +67,14 @@ describe('WebsocketConnectorRpc', () => {
67
67
  },
68
68
  { targetDescriptor: peerDescriptor2 },
69
69
  )
70
- const res1 = await response1
71
- expect(res1.accepted).toEqual(true)
72
-
70
+ await response1
71
+
73
72
  const response2 = client2.requestConnection({
74
73
  ip: '127.0.0.1',
75
74
  port: 9111
76
75
  },
77
76
  { targetDescriptor: peerDescriptor1 },
78
77
  )
79
- const res2 = await response2
80
- expect(res2.accepted).toEqual(true)
78
+ await response2
81
79
  })
82
80
  })
@@ -13,7 +13,7 @@ describe('SortedContactList', () => {
13
13
  const item4 = createItem(new Uint8Array([0, 0, 0, 4]))
14
14
 
15
15
  it('compares Ids correctly', async () => {
16
- const list = new SortedContactList(item0.getPeerId(), 10)
16
+ const list = new SortedContactList({ referenceId: item0.getPeerId(), maxSize: 10, allowToContainReferenceId: true, emitEvents: false })
17
17
  expect(list.compareIds(item0.getPeerId(), item0.getPeerId())).toBe(0)
18
18
  expect(list.compareIds(item1.getPeerId(), item1.getPeerId())).toBe(0)
19
19
  expect(list.compareIds(item0.getPeerId(), item1.getPeerId())).toBe(-1)
@@ -23,9 +23,9 @@ describe('SortedContactList', () => {
23
23
  expect(list.compareIds(item2.getPeerId(), item3.getPeerId())).toBe(-1)
24
24
  expect(list.compareIds(item1.getPeerId(), item4.getPeerId())).toBe(-3)
25
25
  })
26
-
26
+
27
27
  it('orders itself correctly', async () => {
28
- const list = new SortedContactList(item0.getPeerId(), 10)
28
+ const list = new SortedContactList({ referenceId: item0.getPeerId(), maxSize: 10, allowToContainReferenceId: true, emitEvents: false })
29
29
  list.addContact(item3)
30
30
  list.addContact(item2)
31
31
  list.addContact(item1)
@@ -35,9 +35,9 @@ describe('SortedContactList', () => {
35
35
  expect(contacts[1]).toEqual(item2)
36
36
  expect(contacts[2]).toEqual(item3)
37
37
  })
38
-
38
+
39
39
  it('handles contacted nodes correctly', async () => {
40
- const list = new SortedContactList(item0.getPeerId(), 10)
40
+ const list = new SortedContactList({ referenceId: item0.getPeerId(), maxSize: 10, allowToContainReferenceId: false, emitEvents: false })
41
41
  list.addContact(item3)
42
42
  list.addContact(item2)
43
43
  list.addContact(item1)
@@ -49,7 +49,7 @@ describe('SortedContactList', () => {
49
49
  })
50
50
 
51
51
  it('cannot exceed maxSize', async () => {
52
- const list = new SortedContactList(item0.getPeerId(), 3)
52
+ const list = new SortedContactList({ referenceId: item0.getPeerId(), maxSize: 3, allowToContainReferenceId: false, emitEvents: true })
53
53
  const onContactRemoved = jest.fn()
54
54
  list.on('contactRemoved', onContactRemoved)
55
55
  list.addContact(item1)
@@ -62,7 +62,7 @@ describe('SortedContactList', () => {
62
62
  })
63
63
 
64
64
  it('removing contacts', async () => {
65
- const list = new SortedContactList(item0.getPeerId(), 8)
65
+ const list = new SortedContactList({ referenceId: item0.getPeerId(), maxSize: 8, allowToContainReferenceId: false, emitEvents: true })
66
66
  const onContactRemoved = jest.fn()
67
67
  list.on('contactRemoved', onContactRemoved)
68
68
  list.addContact(item4)
@@ -79,8 +79,13 @@ describe('SortedContactList', () => {
79
79
  expect(ret).toEqual(false)
80
80
  })
81
81
 
82
- it('get closes contacts', () => {
83
- const list = new SortedContactList(item0.getPeerId(), 8)
82
+ it('get closest contacts', () => {
83
+ const list = new SortedContactList({
84
+ referenceId: item0.getPeerId(),
85
+ maxSize: 8,
86
+ allowToContainReferenceId: false,
87
+ emitEvents: false
88
+ })
84
89
  list.addContact(item1)
85
90
  list.addContact(item3)
86
91
  list.addContact(item4)
@@ -90,7 +95,7 @@ describe('SortedContactList', () => {
90
95
  })
91
96
 
92
97
  it('get active contacts', () => {
93
- const list = new SortedContactList(item0.getPeerId(), 8)
98
+ const list = new SortedContactList({ referenceId: item0.getPeerId(), maxSize: 8, allowToContainReferenceId: false, emitEvents: false })
94
99
  list.addContact(item1)
95
100
  list.addContact(item3)
96
101
  list.addContact(item4)