@streamr/dht 0.0.1-tatum.5 → 0.0.1-tatum.7

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 (205) hide show
  1. package/dist/src/connection/ConnectionLockHandler.d.ts +1 -1
  2. package/dist/src/connection/ConnectionLockHandler.js.map +1 -1
  3. package/dist/src/connection/ConnectionManager.d.ts +17 -39
  4. package/dist/src/connection/ConnectionManager.js +138 -192
  5. package/dist/src/connection/ConnectionManager.js.map +1 -1
  6. package/dist/src/connection/ConnectivityChecker.js +14 -11
  7. package/dist/src/connection/ConnectivityChecker.js.map +1 -1
  8. package/dist/src/connection/ConnectorFacade.d.ts +49 -0
  9. package/dist/src/connection/ConnectorFacade.js +86 -0
  10. package/dist/src/connection/ConnectorFacade.js.map +1 -0
  11. package/dist/src/connection/ManagedConnection.d.ts +1 -4
  12. package/dist/src/connection/ManagedConnection.js +23 -31
  13. package/dist/src/connection/ManagedConnection.js.map +1 -1
  14. package/dist/src/connection/RemoteConnectionLocker.js +4 -3
  15. package/dist/src/connection/RemoteConnectionLocker.js.map +1 -1
  16. package/dist/src/connection/Simulator/Simulator.d.ts +0 -2
  17. package/dist/src/connection/Simulator/Simulator.js +0 -5
  18. package/dist/src/connection/Simulator/Simulator.js.map +1 -1
  19. package/dist/src/connection/Simulator/SimulatorConnection.js +16 -13
  20. package/dist/src/connection/Simulator/SimulatorConnection.js.map +1 -1
  21. package/dist/src/connection/Simulator/SimulatorConnector.d.ts +2 -2
  22. package/dist/src/connection/Simulator/SimulatorConnector.js +10 -11
  23. package/dist/src/connection/Simulator/SimulatorConnector.js.map +1 -1
  24. package/dist/src/connection/Simulator/SimulatorTransport.js +6 -1
  25. package/dist/src/connection/Simulator/SimulatorTransport.js.map +1 -1
  26. package/dist/src/connection/WebRTC/NodeWebRtcConnection.d.ts +2 -0
  27. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js +12 -12
  28. package/dist/src/connection/WebRTC/NodeWebRtcConnection.js.map +1 -1
  29. package/dist/src/connection/WebRTC/WebRtcConnector.d.ts +9 -9
  30. package/dist/src/connection/WebRTC/WebRtcConnector.js +22 -22
  31. package/dist/src/connection/WebRTC/WebRtcConnector.js.map +1 -1
  32. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js +2 -1
  33. package/dist/src/connection/WebSocket/RemoteWebSocketConnector.js.map +1 -1
  34. package/dist/src/connection/WebSocket/WebSocketConnector.d.ts +19 -8
  35. package/dist/src/connection/WebSocket/WebSocketConnector.js +67 -46
  36. package/dist/src/connection/WebSocket/WebSocketConnector.js.map +1 -1
  37. package/dist/src/connection/WebSocket/WebSocketServer.d.ts +11 -1
  38. package/dist/src/connection/WebSocket/WebSocketServer.js +15 -10
  39. package/dist/src/connection/WebSocket/WebSocketServer.js.map +1 -1
  40. package/dist/src/dht/DhtNode.d.ts +16 -54
  41. package/dist/src/dht/DhtNode.js +116 -137
  42. package/dist/src/dht/DhtNode.js.map +1 -1
  43. package/dist/src/dht/{DhtPeer.d.ts → RemoteDhtNode.d.ts} +3 -2
  44. package/dist/src/dht/{DhtPeer.js → RemoteDhtNode.js} +22 -16
  45. package/dist/src/dht/RemoteDhtNode.js.map +1 -0
  46. package/dist/src/dht/contact/Contact.d.ts +1 -15
  47. package/dist/src/dht/contact/Contact.js +1 -9
  48. package/dist/src/dht/contact/Contact.js.map +1 -1
  49. package/dist/src/dht/contact/ContactList.d.ts +13 -3
  50. package/dist/src/dht/contact/ContactList.js +9 -4
  51. package/dist/src/dht/contact/ContactList.js.map +1 -1
  52. package/dist/src/dht/contact/RandomContactList.d.ts +3 -3
  53. package/dist/src/dht/contact/RandomContactList.js +4 -8
  54. package/dist/src/dht/contact/RandomContactList.js.map +1 -1
  55. package/dist/src/dht/contact/Remote.d.ts +1 -5
  56. package/dist/src/dht/contact/Remote.js +0 -5
  57. package/dist/src/dht/contact/Remote.js.map +1 -1
  58. package/dist/src/dht/contact/SortedContactList.d.ts +3 -5
  59. package/dist/src/dht/contact/SortedContactList.js +9 -19
  60. package/dist/src/dht/contact/SortedContactList.js.map +1 -1
  61. package/dist/src/dht/discovery/DiscoverySession.d.ts +5 -7
  62. package/dist/src/dht/discovery/DiscoverySession.js +9 -10
  63. package/dist/src/dht/discovery/DiscoverySession.js.map +1 -1
  64. package/dist/src/dht/discovery/PeerDiscovery.d.ts +11 -10
  65. package/dist/src/dht/discovery/PeerDiscovery.js +32 -37
  66. package/dist/src/dht/discovery/PeerDiscovery.js.map +1 -1
  67. package/dist/src/dht/find/RecursiveFindSession.d.ts +5 -6
  68. package/dist/src/dht/find/RecursiveFindSession.js +8 -8
  69. package/dist/src/dht/find/RecursiveFindSession.js.map +1 -1
  70. package/dist/src/dht/find/RecursiveFinder.d.ts +2 -4
  71. package/dist/src/dht/find/RecursiveFinder.js +11 -12
  72. package/dist/src/dht/find/RecursiveFinder.js.map +1 -1
  73. package/dist/src/dht/registerExternalApiRpcMethods.d.ts +1 -1
  74. package/dist/src/dht/routing/DuplicateDetector.d.ts +1 -2
  75. package/dist/src/dht/routing/DuplicateDetector.js +2 -7
  76. package/dist/src/dht/routing/DuplicateDetector.js.map +1 -1
  77. package/dist/src/dht/routing/RemoteRouter.js +4 -4
  78. package/dist/src/dht/routing/RemoteRouter.js.map +1 -1
  79. package/dist/src/dht/routing/Router.d.ts +10 -13
  80. package/dist/src/dht/routing/Router.js +28 -29
  81. package/dist/src/dht/routing/Router.js.map +1 -1
  82. package/dist/src/dht/routing/RoutingSession.d.ts +3 -5
  83. package/dist/src/dht/routing/RoutingSession.js +19 -13
  84. package/dist/src/dht/routing/RoutingSession.js.map +1 -1
  85. package/dist/src/dht/store/DataStore.d.ts +2 -2
  86. package/dist/src/dht/store/DataStore.js +7 -7
  87. package/dist/src/dht/store/DataStore.js.map +1 -1
  88. package/dist/src/exports.d.ts +1 -8
  89. package/dist/src/exports.js +2 -16
  90. package/dist/src/exports.js.map +1 -1
  91. package/dist/src/helpers/PeerID.d.ts +0 -1
  92. package/dist/src/helpers/PeerID.js +0 -6
  93. package/dist/src/helpers/PeerID.js.map +1 -1
  94. package/dist/src/helpers/browser/isBrowserEnvironment.d.ts +1 -0
  95. package/dist/src/helpers/browser/isBrowserEnvironment.js +6 -0
  96. package/dist/src/helpers/browser/isBrowserEnvironment.js.map +1 -0
  97. package/dist/src/helpers/browser/isBrowserEnvironment_override.d.ts +1 -0
  98. package/dist/src/helpers/browser/isBrowserEnvironment_override.js +7 -0
  99. package/dist/src/helpers/browser/isBrowserEnvironment_override.js.map +1 -0
  100. package/dist/src/helpers/kademliaId.d.ts +1 -0
  101. package/dist/src/helpers/kademliaId.js +14 -0
  102. package/dist/src/helpers/kademliaId.js.map +1 -0
  103. package/dist/src/helpers/peerIdFromPeerDescriptor.d.ts +1 -1
  104. package/dist/src/helpers/peerIdFromPeerDescriptor.js +3 -3
  105. package/dist/src/helpers/peerIdFromPeerDescriptor.js.map +1 -1
  106. package/dist/src/proto/packages/dht/protos/DhtRpc.d.ts +0 -4
  107. package/dist/src/proto/packages/dht/protos/DhtRpc.js +1 -2
  108. package/dist/src/proto/packages/dht/protos/DhtRpc.js.map +1 -1
  109. package/package.json +10 -9
  110. package/protos/DhtRpc.proto +0 -1
  111. package/src/connection/ConnectionLockHandler.ts +1 -1
  112. package/src/connection/ConnectionManager.ts +156 -240
  113. package/src/connection/ConnectivityChecker.ts +14 -11
  114. package/src/connection/ConnectorFacade.ts +143 -0
  115. package/src/connection/ManagedConnection.ts +23 -34
  116. package/src/connection/RemoteConnectionLocker.ts +4 -3
  117. package/src/connection/Simulator/Simulator.ts +0 -7
  118. package/src/connection/Simulator/SimulatorConnection.ts +16 -13
  119. package/src/connection/Simulator/SimulatorConnector.ts +11 -12
  120. package/src/connection/Simulator/SimulatorTransport.ts +6 -1
  121. package/src/connection/WebRTC/NodeWebRtcConnection.ts +14 -13
  122. package/src/connection/WebRTC/WebRtcConnector.ts +31 -31
  123. package/src/connection/WebSocket/RemoteWebSocketConnector.ts +2 -1
  124. package/src/connection/WebSocket/WebSocketConnector.ts +85 -62
  125. package/src/connection/WebSocket/WebSocketServer.ts +26 -8
  126. package/src/dht/DhtNode.ts +164 -189
  127. package/src/dht/{DhtPeer.ts → RemoteDhtNode.ts} +14 -7
  128. package/src/dht/contact/Contact.ts +1 -18
  129. package/src/dht/contact/ContactList.ts +16 -6
  130. package/src/dht/contact/RandomContactList.ts +6 -11
  131. package/src/dht/contact/Remote.ts +1 -10
  132. package/src/dht/contact/SortedContactList.ts +12 -25
  133. package/src/dht/discovery/DiscoverySession.ts +20 -23
  134. package/src/dht/discovery/PeerDiscovery.ts +45 -44
  135. package/src/dht/find/RecursiveFindSession.ts +12 -13
  136. package/src/dht/find/RecursiveFinder.ts +16 -19
  137. package/src/dht/registerExternalApiRpcMethods.ts +1 -1
  138. package/src/dht/routing/DuplicateDetector.ts +3 -10
  139. package/src/dht/routing/RemoteRouter.ts +5 -5
  140. package/src/dht/routing/Router.ts +35 -39
  141. package/src/dht/routing/RoutingSession.ts +37 -28
  142. package/src/dht/store/DataStore.ts +11 -11
  143. package/src/exports.ts +1 -8
  144. package/src/helpers/PeerID.ts +0 -7
  145. package/src/helpers/browser/isBrowserEnvironment.ts +1 -0
  146. package/src/helpers/browser/isBrowserEnvironment_override.ts +3 -0
  147. package/src/helpers/kademliaId.ts +8 -0
  148. package/src/helpers/peerIdFromPeerDescriptor.ts +1 -1
  149. package/src/proto/packages/dht/protos/DhtRpc.ts +1 -6
  150. package/test/benchmark/KademliaCorrectness.test.ts +5 -2
  151. package/test/benchmark/RecursiveFind.test.ts +6 -6
  152. package/test/end-to-end/Layer0-Layer1.test.ts +14 -14
  153. package/test/end-to-end/Layer0WebRTC-Layer1.test.ts +5 -5
  154. package/test/end-to-end/Layer0WebRTC.test.ts +5 -6
  155. package/test/end-to-end/Layer1-Scale-WebRTC.test.ts +13 -8
  156. package/test/end-to-end/Layer1-Scale-WebSocket.test.ts +15 -10
  157. package/test/end-to-end/WebSocketConnectionRequest.test.ts +5 -5
  158. package/test/integration/ConnectionLocking.test.ts +32 -26
  159. package/test/integration/ConnectionManager.test.ts +90 -93
  160. package/test/integration/DhtJoinPeerDiscovery.test.ts +53 -0
  161. package/test/integration/DhtRpc.test.ts +4 -6
  162. package/test/integration/Layer1-scale.test.ts +8 -8
  163. package/test/integration/MigrateData.test.ts +9 -9
  164. package/test/integration/Mock-Layer1-Layer0.test.ts +1 -2
  165. package/test/integration/RecursiveFind.test.ts +5 -5
  166. package/test/integration/{DhtPeer.test.ts → RemoteDhtNode.test.ts} +11 -12
  167. package/test/integration/RemoteRouter.test.ts +5 -6
  168. package/test/integration/RemoteStore.test.ts +4 -5
  169. package/test/integration/RouteMessage.test.ts +7 -9
  170. package/test/integration/RpcErrors.test.ts +25 -10
  171. package/test/integration/ScaleDownDht.test.ts +8 -8
  172. package/test/integration/SimultaneousConnections.test.ts +35 -36
  173. package/test/integration/Store.test.ts +8 -9
  174. package/test/integration/StoreAndDelete.test.ts +11 -11
  175. package/test/integration/StoreOnDhtWithTwoNodes.test.ts +7 -7
  176. package/test/integration/WebRtcConnectionManagement.test.ts +26 -19
  177. package/test/integration/WebRtcConnectorRpc.test.ts +6 -8
  178. package/test/integration/WebSocket.test.ts +4 -2
  179. package/test/integration/WebSocketConnectionManagement.test.ts +30 -17
  180. package/test/integration/WebSocketConnectorRpc.test.ts +2 -3
  181. package/test/unit/DuplicateDetector.test.ts +3 -4
  182. package/test/unit/LocalDataStore.test.ts +6 -8
  183. package/test/unit/RandomContactList.test.ts +25 -74
  184. package/test/unit/RecursiveFinder.test.ts +8 -12
  185. package/test/unit/Router.test.ts +18 -21
  186. package/test/unit/SortedContactList.test.ts +62 -112
  187. package/test/unit/WebSocketConnector.test.ts +64 -0
  188. package/test/unit/WebSocketServer.test.ts +24 -12
  189. package/test/utils/mock/RecursiveFinder.ts +2 -2
  190. package/test/utils/mock/Router.ts +9 -11
  191. package/test/utils/mock/Transport.ts +2 -2
  192. package/test/utils/utils.ts +40 -49
  193. package/dist/src/dht/DhtPeer.js.map +0 -1
  194. package/dist/src/helpers/browser/isBrowser.d.ts +0 -1
  195. package/dist/src/helpers/browser/isBrowser.js +0 -6
  196. package/dist/src/helpers/browser/isBrowser.js.map +0 -1
  197. package/dist/src/helpers/browser/isNodeJS.d.ts +0 -1
  198. package/dist/src/helpers/browser/isNodeJS.js +0 -6
  199. package/dist/src/helpers/browser/isNodeJS.js.map +0 -1
  200. package/src/helpers/browser/isBrowser.ts +0 -1
  201. package/src/helpers/browser/isNodeJS.ts +0 -1
  202. package/test/integration/DhtWithMockConnectionLatencies.test.ts +0 -46
  203. package/test/integration/DhtWithMockConnections.test.ts +0 -46
  204. package/test/integration/DhtWithRealConnectionLatencies.test.ts +0 -47
  205. /package/test/unit/{webrtcReplaceInternalIpWithExternalIp.ts → webrtcReplaceInternalIpWithExternalIp.test.ts} +0 -0
@@ -1,10 +1,9 @@
1
1
  import { Router } from '../../src/dht/routing/Router'
2
2
  import { Message, MessageType, NodeType, PeerDescriptor, RouteMessageWrapper } from '../../src/proto/packages/dht/protos/DhtRpc'
3
3
  import { PeerID, PeerIDKey } from '../../src/helpers/PeerID'
4
- import { DhtPeer } from '../../src/dht/DhtPeer'
4
+ import { RemoteDhtNode } from '../../src/dht/RemoteDhtNode'
5
5
  import { createWrappedClosestPeersRequest, createMockRoutingRpcCommunicator } from '../utils/utils'
6
6
  import { v4 } from 'uuid'
7
- import { keyFromPeerDescriptor } from '../../src/helpers/peerIdFromPeerDescriptor'
8
7
 
9
8
  describe('Router', () => {
10
9
  let router: Router
@@ -12,14 +11,13 @@ describe('Router', () => {
12
11
  const peerId = PeerID.fromString('router')
13
12
  const peerDescriptor1: PeerDescriptor = {
14
13
  kademliaId: peerId.value,
15
- type: NodeType.NODEJS,
16
- nodeName: 'router'
14
+ type: NodeType.NODEJS
17
15
  }
18
16
  const peerDescriptor2: PeerDescriptor = {
19
17
  kademliaId: PeerID.fromString('destination').value,
20
- type: NodeType.NODEJS,
18
+ type: NodeType.NODEJS
21
19
  }
22
- const rpcWrapper = createWrappedClosestPeersRequest(peerDescriptor1, peerDescriptor2)
20
+ const rpcWrapper = createWrappedClosestPeersRequest(peerDescriptor1)
23
21
  const message: Message = {
24
22
  serviceId: 'unknown',
25
23
  messageId: v4(),
@@ -39,18 +37,17 @@ describe('Router', () => {
39
37
  destinationPeer: peerDescriptor1,
40
38
  sourcePeer: peerDescriptor2
41
39
  }
42
- let connections: Map<PeerIDKey, DhtPeer>
40
+ let connections: Map<PeerIDKey, RemoteDhtNode>
43
41
  const mockRpcCommunicator = createMockRoutingRpcCommunicator()
44
42
 
45
- const createMockDhtPeer = (destination: PeerDescriptor): DhtPeer => {
46
- return new DhtPeer(peerDescriptor1, destination, {} as any, 'router')
43
+ const createMockRemoteDhtNode = (destination: PeerDescriptor): RemoteDhtNode => {
44
+ return new RemoteDhtNode(peerDescriptor1, destination, {} as any, 'router')
47
45
  }
48
46
 
49
47
  beforeEach(() => {
50
48
  connections = new Map()
51
49
  router = new Router({
52
50
  ownPeerDescriptor: peerDescriptor1,
53
- ownPeerId: peerId,
54
51
  rpcCommunicator: mockRpcCommunicator,
55
52
  addContact: (_contact) => {},
56
53
  serviceId: 'router',
@@ -75,7 +72,7 @@ describe('Router', () => {
75
72
  })
76
73
 
77
74
  it('doRouteMessage with connections', () => {
78
- connections.set(PeerID.fromString('test').toKey(), createMockDhtPeer(peerDescriptor2))
75
+ connections.set(PeerID.fromString('test').toKey(), createMockRemoteDhtNode(peerDescriptor2))
79
76
  const ack = router.doRouteMessage({
80
77
  message,
81
78
  destinationPeer: peerDescriptor2,
@@ -88,36 +85,36 @@ describe('Router', () => {
88
85
  })
89
86
 
90
87
  it('route server is destination without connections', async () => {
91
- const ack = await router.routeMessage(routedMessage, {} as any)
88
+ const ack = await router.routeMessage(routedMessage)
92
89
  expect(ack.error).toEqual('')
93
90
  })
94
91
 
95
92
  it('route server with connections', async () => {
96
- connections.set(PeerID.fromString('test').toKey(), createMockDhtPeer(peerDescriptor2))
97
- const ack = await router.routeMessage(routedMessage, {} as any)
93
+ connections.set(PeerID.fromString('test').toKey(), createMockRemoteDhtNode(peerDescriptor2))
94
+ const ack = await router.routeMessage(routedMessage)
98
95
  expect(ack.error).toEqual('')
99
96
  })
100
97
 
101
98
  it('route server on duplicate message', async () => {
102
- router.addToDuplicateDetector(routedMessage.requestId, keyFromPeerDescriptor(peerDescriptor2))
103
- const ack = await router.routeMessage(routedMessage, {} as any)
99
+ router.addToDuplicateDetector(routedMessage.requestId)
100
+ const ack = await router.routeMessage(routedMessage)
104
101
  expect(ack.error).toEqual('message given to routeMessage() service is likely a duplicate')
105
102
  })
106
103
 
107
104
  it('forward server no connections', async () => {
108
- const ack = await router.forwardMessage(routedMessage, {} as any)
105
+ const ack = await router.forwardMessage(routedMessage)
109
106
  expect(ack.error).toEqual('No routing candidates found')
110
107
  })
111
108
 
112
109
  it('forward server with connections', async () => {
113
- connections.set(PeerID.fromString('test').toKey(), createMockDhtPeer(peerDescriptor2))
114
- const ack = await router.forwardMessage(routedMessage, {} as any)
110
+ connections.set(PeerID.fromString('test').toKey(), createMockRemoteDhtNode(peerDescriptor2))
111
+ const ack = await router.forwardMessage(routedMessage)
115
112
  expect(ack.error).toEqual('')
116
113
  })
117
114
 
118
115
  it('forward server on duplicate message', async () => {
119
- router.addToDuplicateDetector(routedMessage.requestId, keyFromPeerDescriptor(peerDescriptor2))
120
- const ack = await router.forwardMessage(routedMessage, {} as any)
116
+ router.addToDuplicateDetector(routedMessage.requestId)
117
+ const ack = await router.forwardMessage(routedMessage)
121
118
  expect(ack.error).toEqual('message given to forwardMessage() service is likely a duplicate')
122
119
  })
123
120
 
@@ -1,153 +1,103 @@
1
1
  import { SortedContactList } from '../../src/dht/contact/SortedContactList'
2
- import type { ServiceInfo, MethodInfo } from '@protobuf-ts/runtime-rpc'
3
2
  import { PeerID } from '../../src/helpers/PeerID'
4
- import { toProtoRpcClient } from '@streamr/proto-rpc'
5
- import { IDhtRpcServiceClient } from '../../src/proto/packages/dht/protos/DhtRpc.client'
6
- import { LeaveNotice, NodeType, PeerDescriptor, RouteMessageAck } from '../../src/proto/packages/dht/protos/DhtRpc'
7
- import type { FindDataRequest, FindDataResponse, PingResponse } from '../../src/proto/packages/dht/protos/DhtRpc'
8
- import type { PingRequest } from '../../src/proto/packages/dht/protos/DhtRpc'
9
- import type { ClosestPeersResponse } from '../../src/proto/packages/dht/protos/DhtRpc'
10
- import type { ClosestPeersRequest } from '../../src/proto/packages/dht/protos/DhtRpc'
11
- import { UnaryCall } from '@protobuf-ts/runtime-rpc'
12
- import type { RpcOptions } from '@protobuf-ts/runtime-rpc'
13
- import { DhtPeer } from '../../src/dht/DhtPeer'
14
- import { IMessageType } from '@protobuf-ts/runtime'
15
- import { Empty } from '../../src/proto/google/protobuf/empty'
16
3
 
17
- /* eslint-disable class-methods-use-this */
18
- class MockRpcClient implements IDhtRpcServiceClient, ServiceInfo {
19
- typeName = 'MockRpcClient'
20
- methods: MethodInfo<any, any> [] = [
21
- { name: 'getClosestPeers', O: {} as IMessageType<ClosestPeersResponse> } as MethodInfo<any, any>,
22
- { name: 'ping', O: {} as IMessageType<PingResponse> } as MethodInfo<any, any>,
23
- { name: 'findData', O: {} as IMessageType<RouteMessageAck> } as MethodInfo<any, any>,
24
- { name: 'leaveNotice', O: {} as IMessageType<Empty> } as MethodInfo<any, any>
25
- ]
26
- options = {}
27
- getClosestPeers(_input: ClosestPeersRequest, _options?: RpcOptions): UnaryCall<ClosestPeersRequest, ClosestPeersResponse> {
28
- return {} as UnaryCall<ClosestPeersRequest, ClosestPeersResponse>
29
- }
30
- ping(_input: PingRequest, _options?: RpcOptions): UnaryCall <PingRequest, PingResponse> {
31
- return {} as UnaryCall<PingRequest, PingResponse>
32
- }
33
-
34
- // eslint-disable-next-line class-methods-use-this
35
- findData(_input: FindDataRequest, _options?: RpcOptions): UnaryCall<FindDataRequest, FindDataResponse> {
36
- return {} as UnaryCall<FindDataRequest, FindDataResponse>
37
- }
38
-
39
- leaveNotice(_input: LeaveNotice, _options?: RpcOptions): UnaryCall<LeaveNotice, Empty> {
40
- return {} as UnaryCall<LeaveNotice, Empty>
41
- }
42
- }
43
-
44
- const getId = (descriptor: PeerDescriptor): PeerID => {
45
- return PeerID.fromValue(descriptor.kademliaId)
4
+ const createItem = (kademliaId: Uint8Array): { getPeerId: () => PeerID } => {
5
+ return { getPeerId: () => PeerID.fromValue(kademliaId) }
46
6
  }
47
7
 
48
8
  describe('SortedContactList', () => {
49
- const serviceId = 'sorted'
50
- const descriptor0: PeerDescriptor = { kademliaId: new Uint8Array([0, 0, 0, 0]), type: NodeType.NODEJS }
51
- const descriptor1: PeerDescriptor = { kademliaId: new Uint8Array([0, 0, 0, 1]), type: NodeType.NODEJS }
52
- const descriptor2: PeerDescriptor = { kademliaId: new Uint8Array([0, 0, 0, 2]), type: NodeType.NODEJS }
53
- const descriptor3: PeerDescriptor = { kademliaId: new Uint8Array([0, 0, 0, 3]), type: NodeType.NODEJS }
54
- const descriptor4: PeerDescriptor = { kademliaId: new Uint8Array([0, 0, 0, 4]), type: NodeType.NODEJS }
55
- const peer1 = new DhtPeer(descriptor0, descriptor1, toProtoRpcClient(new MockRpcClient()), serviceId)
56
- const peer2 = new DhtPeer(descriptor0, descriptor2, toProtoRpcClient(new MockRpcClient()), serviceId)
57
- const peer3 = new DhtPeer(descriptor0, descriptor3, toProtoRpcClient(new MockRpcClient()), serviceId)
58
- const peer4 = new DhtPeer(descriptor0, descriptor4, toProtoRpcClient(new MockRpcClient()), serviceId)
9
+ const item0 = createItem(new Uint8Array([0, 0, 0, 0]))
10
+ const item1 = createItem(new Uint8Array([0, 0, 0, 1]))
11
+ const item2 = createItem(new Uint8Array([0, 0, 0, 2]))
12
+ const item3 = createItem(new Uint8Array([0, 0, 0, 3]))
13
+ const item4 = createItem(new Uint8Array([0, 0, 0, 4]))
59
14
 
60
15
  it('compares Ids correctly', async () => {
61
- const list = new SortedContactList(getId(descriptor0), 10)
62
- expect(list.compareIds(getId(descriptor0), getId(descriptor0))).toBe(0)
63
- expect(list.compareIds(getId(descriptor1), getId(descriptor1))).toBe(0)
64
- expect(list.compareIds(getId(descriptor0), getId(descriptor1))).toBe(-1)
65
- expect(list.compareIds(getId(descriptor0), getId(descriptor2))).toBe(-2)
66
- expect(list.compareIds(getId(descriptor1), getId(descriptor0))).toBe(1)
67
- expect(list.compareIds(getId(descriptor2), getId(descriptor0))).toBe(2)
68
- expect(list.compareIds(getId(descriptor2), getId(descriptor3))).toBe(-1)
69
- expect(list.compareIds(getId(descriptor1), getId(descriptor4))).toBe(-3)
16
+ const list = new SortedContactList(item0.getPeerId(), 10)
17
+ expect(list.compareIds(item0.getPeerId(), item0.getPeerId())).toBe(0)
18
+ expect(list.compareIds(item1.getPeerId(), item1.getPeerId())).toBe(0)
19
+ expect(list.compareIds(item0.getPeerId(), item1.getPeerId())).toBe(-1)
20
+ expect(list.compareIds(item0.getPeerId(), item2.getPeerId())).toBe(-2)
21
+ expect(list.compareIds(item1.getPeerId(), item0.getPeerId())).toBe(1)
22
+ expect(list.compareIds(item2.getPeerId(), item0.getPeerId())).toBe(2)
23
+ expect(list.compareIds(item2.getPeerId(), item3.getPeerId())).toBe(-1)
24
+ expect(list.compareIds(item1.getPeerId(), item4.getPeerId())).toBe(-3)
70
25
  })
71
26
 
72
27
  it('orders itself correctly', async () => {
73
-
74
- const list = new SortedContactList(getId(descriptor0), 10)
75
-
76
- list.addContact(peer3)
77
- list.addContact(peer2)
78
- list.addContact(peer1)
79
-
28
+ const list = new SortedContactList(item0.getPeerId(), 10)
29
+ list.addContact(item3)
30
+ list.addContact(item2)
31
+ list.addContact(item1)
80
32
  const contacts = list.getUncontactedContacts(3)
81
33
  expect(contacts.length).toEqual(3)
82
- expect(contacts[0]).toEqual(peer1)
83
- expect(contacts[1]).toEqual(peer2)
84
- expect(contacts[2]).toEqual(peer3)
34
+ expect(contacts[0]).toEqual(item1)
35
+ expect(contacts[1]).toEqual(item2)
36
+ expect(contacts[2]).toEqual(item3)
85
37
  })
86
38
 
87
39
  it('handles contacted nodes correctly', async () => {
88
- const list = new SortedContactList(getId(descriptor0), 10)
89
-
90
- list.addContact(peer3)
91
- list.addContact(peer2)
92
- list.addContact(peer1)
93
-
94
- list.setContacted(getId(descriptor2))
40
+ const list = new SortedContactList(item0.getPeerId(), 10)
41
+ list.addContact(item3)
42
+ list.addContact(item2)
43
+ list.addContact(item1)
44
+ list.setContacted(item2.getPeerId())
95
45
  const contacts = list.getUncontactedContacts(3)
96
46
  expect(contacts.length).toEqual(2)
97
- expect(contacts[0]).toEqual(peer1)
98
- expect(contacts[1]).toEqual(peer3)
47
+ expect(contacts[0]).toEqual(item1)
48
+ expect(contacts[1]).toEqual(item3)
99
49
  })
100
50
 
101
51
  it('cannot exceed maxSize', async () => {
102
- const list = new SortedContactList(getId(descriptor0), 3)
52
+ const list = new SortedContactList(item0.getPeerId(), 3)
103
53
  const onContactRemoved = jest.fn()
104
54
  list.on('contactRemoved', onContactRemoved)
105
- list.addContact(peer1)
106
- list.addContact(peer4)
107
- list.addContact(peer3)
108
- list.addContact(peer2)
55
+ list.addContact(item1)
56
+ list.addContact(item4)
57
+ list.addContact(item3)
58
+ list.addContact(item2)
109
59
  expect(list.getSize()).toEqual(3)
110
- expect(onContactRemoved).toBeCalledWith(descriptor4, [descriptor1, descriptor2, descriptor3])
111
- expect(list.getContact(getId(descriptor4))).toBeFalsy()
60
+ expect(onContactRemoved).toBeCalledWith(item4, [item1, item2, item3])
61
+ expect(list.getContact(item4.getPeerId())).toBeFalsy()
112
62
  })
113
63
 
114
64
  it('removing contacts', async () => {
115
- const list = new SortedContactList(getId(descriptor0), 8)
65
+ const list = new SortedContactList(item0.getPeerId(), 8)
116
66
  const onContactRemoved = jest.fn()
117
67
  list.on('contactRemoved', onContactRemoved)
118
- list.addContact(peer4)
119
- list.addContact(peer3)
120
- list.addContact(peer2)
121
- list.addContact(peer1)
122
- list.removeContact(getId(descriptor2))
68
+ list.addContact(item4)
69
+ list.addContact(item3)
70
+ list.addContact(item2)
71
+ list.addContact(item1)
72
+ list.removeContact(item2.getPeerId())
123
73
  expect(list.getSize()).toEqual(3)
124
- expect(list.getContact(getId(descriptor2))).toBeFalsy()
74
+ expect(list.getContact(item2.getPeerId())).toBeFalsy()
125
75
  expect(list.getContactIds()).toEqual(list.getContactIds().sort(list.compareIds))
126
- expect(list.getAllContacts()).toEqual([peer1, peer3, peer4])
127
- expect(onContactRemoved).toBeCalledWith(descriptor2, [descriptor1, descriptor3, descriptor4])
76
+ expect(list.getAllContacts()).toEqual([item1, item3, item4])
77
+ expect(onContactRemoved).toBeCalledWith(item2, [item1, item3, item4])
128
78
  const ret = list.removeContact(PeerID.fromValue(Buffer.from([0, 0, 0, 6])))
129
79
  expect(ret).toEqual(false)
130
80
  })
131
81
 
132
82
  it('get closes contacts', () => {
133
- const list = new SortedContactList(getId(descriptor0), 8)
134
- list.addContact(peer1)
135
- list.addContact(peer3)
136
- list.addContact(peer4)
137
- list.addContact(peer2)
138
- expect(list.getClosestContacts(2)).toEqual([peer1, peer2])
139
- expect(list.getClosestContacts()).toEqual([peer1, peer2, peer3, peer4])
83
+ const list = new SortedContactList(item0.getPeerId(), 8)
84
+ list.addContact(item1)
85
+ list.addContact(item3)
86
+ list.addContact(item4)
87
+ list.addContact(item2)
88
+ expect(list.getClosestContacts(2)).toEqual([item1, item2])
89
+ expect(list.getClosestContacts()).toEqual([item1, item2, item3, item4])
140
90
  })
141
91
 
142
92
  it('get active contacts', () => {
143
- const list = new SortedContactList(getId(descriptor0), 8)
144
- list.addContact(peer1)
145
- list.addContact(peer3)
146
- list.addContact(peer4)
147
- list.addContact(peer2)
148
- list.setActive(getId(descriptor2))
149
- list.setActive(getId(descriptor3))
150
- list.setActive(getId(descriptor4))
151
- expect(list.getActiveContacts()).toEqual([peer2, peer3, peer4])
93
+ const list = new SortedContactList(item0.getPeerId(), 8)
94
+ list.addContact(item1)
95
+ list.addContact(item3)
96
+ list.addContact(item4)
97
+ list.addContact(item2)
98
+ list.setActive(item2.getPeerId())
99
+ list.setActive(item3.getPeerId())
100
+ list.setActive(item4.getPeerId())
101
+ expect(list.getActiveContacts()).toEqual([item2, item3, item4])
152
102
  })
153
103
  })
@@ -0,0 +1,64 @@
1
+ /* eslint-disable max-len */
2
+ import { WebSocketConnector } from '../../src/connection/WebSocket/WebSocketConnector'
3
+ import { ConnectivityMethod, NodeType, PeerDescriptor } from '../../src/proto/packages/dht/protos/DhtRpc'
4
+ import crypto from 'crypto'
5
+ import { MockTransport } from '../utils/mock/Transport'
6
+
7
+ const createMockPeerDescriptor = (nodeType: NodeType, websocket?: ConnectivityMethod): PeerDescriptor => {
8
+ return {
9
+ kademliaId: crypto.randomBytes(10),
10
+ type: nodeType,
11
+ websocket
12
+ }
13
+ }
14
+
15
+ describe('WebSocketConnector', () => {
16
+
17
+ describe('isPossibleToFormConnection', () => {
18
+
19
+ const connector = new WebSocketConnector({
20
+ transport: new MockTransport(),
21
+ canConnect: () => {}
22
+ } as any)
23
+
24
+ it('node without server', () => {
25
+ connector.setOwnPeerDescriptor(createMockPeerDescriptor(NodeType.NODEJS))
26
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: false }))).toBe(true)
27
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: true }))).toBe(true)
28
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS))).toBe(false)
29
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.BROWSER))).toBe(false)
30
+ })
31
+
32
+ it('node with TLS server', () => {
33
+ connector.setOwnPeerDescriptor(createMockPeerDescriptor(NodeType.NODEJS, { host: '1.1.1.1', port: 11, tls: true }))
34
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: false }))).toBe(true)
35
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: true }))).toBe(true)
36
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS))).toBe(true)
37
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.BROWSER))).toBe(true)
38
+ })
39
+
40
+ it('node with non-TLS server', () => {
41
+ connector.setOwnPeerDescriptor(createMockPeerDescriptor(NodeType.NODEJS, { host: '1.1.1.1', port: 11, tls: false }))
42
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: false }))).toBe(true)
43
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: true }))).toBe(true)
44
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS))).toBe(true)
45
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.BROWSER))).toBe(false)
46
+ })
47
+
48
+ it('node with non-TLS server in local network', () => {
49
+ connector.setOwnPeerDescriptor(createMockPeerDescriptor(NodeType.NODEJS, { host: '192.168.11.11', port: 11, tls: false }))
50
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: false }))).toBe(true)
51
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: true }))).toBe(true)
52
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS))).toBe(true)
53
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.BROWSER))).toBe(true)
54
+ })
55
+
56
+ it('browser', () => {
57
+ connector.setOwnPeerDescriptor(createMockPeerDescriptor(NodeType.BROWSER))
58
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: false }))).toBe(false)
59
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS, { host: '2.2.2.2', port: 22, tls: true }))).toBe(true)
60
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.NODEJS))).toBe(false)
61
+ expect(connector.isPossibleToFormConnection(createMockPeerDescriptor(NodeType.BROWSER))).toBe(false)
62
+ })
63
+ })
64
+ })
@@ -3,19 +3,25 @@ import { WebSocketServer } from '../../src/connection/WebSocket/WebSocketServer'
3
3
  describe('WebSocketServer', () => {
4
4
 
5
5
  it('starts and stops', async () => {
6
- const server = new WebSocketServer()
7
- const port = await server.start({ min: 19792, max: 19792 })
6
+ const server = new WebSocketServer({
7
+ portRange: { min: 19792, max: 19792 }
8
+ })
9
+ const port = await server.start()
8
10
  expect(port).toEqual(19792)
9
11
  await server.stop()
10
12
  })
11
13
 
12
14
  it('throws if server is already in use', async () => {
13
- const server1 = new WebSocketServer()
14
- const port = await server1.start({ min: 19792, max: 19792 })
15
+ const server1 = new WebSocketServer({
16
+ portRange: { min: 19792, max: 19792 }
17
+ })
18
+ const port = await server1.start()
15
19
  expect(port).toEqual(19792)
16
20
 
17
- const server2 = new WebSocketServer()
18
- await expect(server2.start({ min: 19792, max: 19792 }))
21
+ const server2 = new WebSocketServer({
22
+ portRange: { min: 19792, max: 19792 }
23
+ })
24
+ await expect(server2.start())
19
25
  .rejects
20
26
  .toThrow()
21
27
 
@@ -24,12 +30,16 @@ describe('WebSocketServer', () => {
24
30
  })
25
31
 
26
32
  it('Starts server in next port if first one is already in use', async () => {
27
- const server1 = new WebSocketServer()
28
- const port1 = await server1.start({ min: 19792, max: 19793 })
33
+ const server1 = new WebSocketServer({
34
+ portRange: { min: 19792, max: 19793 }
35
+ })
36
+ const port1 = await server1.start()
29
37
  expect(port1).toEqual(19792)
30
38
 
31
- const server2 = new WebSocketServer()
32
- const port2 = await server2.start({ min: 19792, max: 19793 })
39
+ const server2 = new WebSocketServer({
40
+ portRange: { min: 19792, max: 19793 }
41
+ })
42
+ const port2 = await server2.start()
33
43
  expect(port2).toEqual(19793)
34
44
 
35
45
  await server1.stop()
@@ -37,9 +47,11 @@ describe('WebSocketServer', () => {
37
47
  })
38
48
 
39
49
  it('throws if too big a port number is given', async () => {
40
- const server = new WebSocketServer()
50
+ const server = new WebSocketServer({
51
+ portRange: { min: 197923233, max: 197923233 }
52
+ })
41
53
 
42
- await expect(server.start({ min: 197923233, max: 197923233 }))
54
+ await expect(server.start())
43
55
  .rejects
44
56
  .toThrow()
45
57
 
@@ -1,5 +1,5 @@
1
1
  import { RecursiveFindResult, IRecursiveFinder } from '../../../src/dht/find/RecursiveFinder'
2
- import { RouteMessageAck, RouteMessageWrapper } from '../../../src/proto/packages/dht/protos/DhtRpc'
2
+ import { RouteMessageAck } from '../../../src/proto/packages/dht/protos/DhtRpc'
3
3
 
4
4
  export class MockRecursiveFinder implements IRecursiveFinder {
5
5
 
@@ -12,7 +12,7 @@ export class MockRecursiveFinder implements IRecursiveFinder {
12
12
  }
13
13
 
14
14
  // eslint-disable-next-line class-methods-use-this
15
- async findRecursively(_routedMessage: RouteMessageWrapper): Promise<RouteMessageAck> {
15
+ async findRecursively(): Promise<RouteMessageAck> {
16
16
  return RouteMessageAck.create()
17
17
  }
18
18
 
@@ -1,37 +1,35 @@
1
1
  import { IRouter } from '../../../src/dht/routing/Router'
2
- import { RoutingSession, RoutingMode } from '../../../src/dht/routing/RoutingSession'
3
- import { PeerDescriptor, Message, RouteMessageAck, RouteMessageWrapper } from '../../../src/proto/packages/dht/protos/DhtRpc'
4
- import { ServerCallContext } from '@protobuf-ts/runtime-rpc'
2
+ import { RouteMessageAck } from '../../../src/proto/packages/dht/protos/DhtRpc'
5
3
 
6
4
  export class MockRouter implements IRouter {
7
5
 
8
6
  // eslint-disable-next-line class-methods-use-this
9
- addRoutingSession(_session: RoutingSession): void {
7
+ addRoutingSession(): void {
10
8
  return
11
9
  }
12
10
 
13
11
  // eslint-disable-next-line class-methods-use-this
14
- removeRoutingSession(_sessionId: string): void {
12
+ removeRoutingSession(): void {
15
13
  return
16
14
  }
17
15
 
18
16
  // eslint-disable-next-line class-methods-use-this
19
- addToDuplicateDetector(_messageId: string, _senderId: string, _message?: Message): void {
17
+ addToDuplicateDetector(): void {
20
18
  return
21
19
  }
22
20
 
23
21
  // eslint-disable-next-line class-methods-use-this
24
- checkDuplicate(_messageId: string): boolean {
22
+ isMostLikelyDuplicate(): boolean {
25
23
  return false
26
24
  }
27
25
 
28
26
  // eslint-disable-next-line class-methods-use-this
29
- doRouteMessage(_routedMessage: RouteMessageWrapper, _mode: RoutingMode): RouteMessageAck {
27
+ doRouteMessage(): RouteMessageAck {
30
28
  return RouteMessageAck.create()
31
29
  }
32
30
 
33
31
  // eslint-disable-next-line class-methods-use-this
34
- send(_msg: Message, _reachableThrough: PeerDescriptor[]): Promise<void> {
32
+ send(): Promise<void> {
35
33
  throw Error('Not implemented')
36
34
  }
37
35
 
@@ -41,12 +39,12 @@ export class MockRouter implements IRouter {
41
39
  }
42
40
 
43
41
  // eslint-disable-next-line class-methods-use-this
44
- async routeMessage(_routedMessage: RouteMessageWrapper, _context: ServerCallContext): Promise<RouteMessageAck> {
42
+ async routeMessage(): Promise<RouteMessageAck> {
45
43
  return RouteMessageAck.create()
46
44
  }
47
45
 
48
46
  // eslint-disable-next-line class-methods-use-this
49
- async forwardMessage(_forwardMessage: RouteMessageWrapper, _context: ServerCallContext): Promise<RouteMessageAck> {
47
+ async forwardMessage(): Promise<RouteMessageAck> {
50
48
  return RouteMessageAck.create()
51
49
  }
52
50
 
@@ -1,11 +1,11 @@
1
1
  import { ITransport, TransportEvents } from '../../../src/transport/ITransport'
2
2
  import { EventEmitter } from 'eventemitter3'
3
- import { Message, PeerDescriptor } from '../../../src/proto/packages/dht/protos/DhtRpc'
3
+ import { PeerDescriptor } from '../../../src/proto/packages/dht/protos/DhtRpc'
4
4
 
5
5
  export class MockTransport extends EventEmitter<TransportEvents> implements ITransport {
6
6
 
7
7
  // eslint-disable-next-line class-methods-use-this
8
- async send(_msg: Message, _doNotConnect?: boolean): Promise<void> {
8
+ async send(): Promise<void> {
9
9
 
10
10
  }
11
11