@libp2p/interface-compliance-tests 0.0.0 → 0.2.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 (177) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +25 -0
  3. package/dist/src/connection/connection.d.ts +5 -0
  4. package/dist/src/connection/connection.d.ts.map +1 -0
  5. package/dist/src/connection/connection.js +148 -0
  6. package/dist/src/connection/connection.js.map +1 -0
  7. package/dist/src/connection/index.d.ts +5 -0
  8. package/dist/src/connection/index.d.ts.map +1 -0
  9. package/dist/src/connection/index.js +5 -0
  10. package/dist/src/connection/index.js.map +1 -0
  11. package/dist/src/crypto/index.d.ts +5 -0
  12. package/dist/src/crypto/index.d.ts.map +1 -0
  13. package/dist/src/crypto/index.js +78 -0
  14. package/dist/src/crypto/index.js.map +1 -0
  15. package/dist/src/index.d.ts +5 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/index.js +2 -0
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/peer-discovery/index.d.ts +6 -0
  20. package/dist/src/peer-discovery/index.d.ts.map +1 -0
  21. package/dist/src/peer-discovery/index.js +63 -0
  22. package/dist/src/peer-discovery/index.js.map +1 -0
  23. package/dist/src/pubsub/api.d.ts +6 -0
  24. package/dist/src/pubsub/api.d.ts.map +1 -0
  25. package/dist/src/pubsub/api.js +65 -0
  26. package/dist/src/pubsub/api.js.map +1 -0
  27. package/dist/src/pubsub/connection-handlers.d.ts +6 -0
  28. package/dist/src/pubsub/connection-handlers.d.ts.map +1 -0
  29. package/dist/src/pubsub/connection-handlers.js +279 -0
  30. package/dist/src/pubsub/connection-handlers.js.map +1 -0
  31. package/dist/src/pubsub/emit-self.d.ts +6 -0
  32. package/dist/src/pubsub/emit-self.d.ts.map +1 -0
  33. package/dist/src/pubsub/emit-self.js +51 -0
  34. package/dist/src/pubsub/emit-self.js.map +1 -0
  35. package/dist/src/pubsub/index.d.ts +6 -0
  36. package/dist/src/pubsub/index.d.ts.map +1 -0
  37. package/dist/src/pubsub/index.js +17 -0
  38. package/dist/src/pubsub/index.js.map +1 -0
  39. package/dist/src/pubsub/messages.d.ts +6 -0
  40. package/dist/src/pubsub/messages.d.ts.map +1 -0
  41. package/dist/src/pubsub/messages.js +93 -0
  42. package/dist/src/pubsub/messages.js.map +1 -0
  43. package/dist/src/pubsub/multiple-nodes.d.ts +6 -0
  44. package/dist/src/pubsub/multiple-nodes.d.ts.map +1 -0
  45. package/dist/src/pubsub/multiple-nodes.js +283 -0
  46. package/dist/src/pubsub/multiple-nodes.js.map +1 -0
  47. package/dist/src/pubsub/two-nodes.d.ts +6 -0
  48. package/dist/src/pubsub/two-nodes.d.ts.map +1 -0
  49. package/dist/src/pubsub/two-nodes.js +127 -0
  50. package/dist/src/pubsub/two-nodes.js.map +1 -0
  51. package/dist/src/pubsub/utils.d.ts +3 -0
  52. package/dist/src/pubsub/utils.d.ts.map +1 -0
  53. package/dist/src/pubsub/utils.js +11 -0
  54. package/dist/src/pubsub/utils.js.map +1 -0
  55. package/dist/src/record/index.d.ts +5 -0
  56. package/dist/src/record/index.d.ts.map +1 -0
  57. package/dist/src/record/index.js +25 -0
  58. package/dist/src/record/index.js.map +1 -0
  59. package/dist/src/stream-muxer/base-test.d.ts +5 -0
  60. package/dist/src/stream-muxer/base-test.d.ts.map +1 -0
  61. package/dist/src/stream-muxer/base-test.js +123 -0
  62. package/dist/src/stream-muxer/base-test.js.map +1 -0
  63. package/dist/src/stream-muxer/close-test.d.ts +5 -0
  64. package/dist/src/stream-muxer/close-test.d.ts.map +1 -0
  65. package/dist/src/stream-muxer/close-test.js +103 -0
  66. package/dist/src/stream-muxer/close-test.js.map +1 -0
  67. package/dist/src/stream-muxer/index.d.ts +5 -0
  68. package/dist/src/stream-muxer/index.d.ts.map +1 -0
  69. package/dist/src/stream-muxer/index.js +13 -0
  70. package/dist/src/stream-muxer/index.js.map +1 -0
  71. package/dist/src/stream-muxer/mega-stress-test.d.ts +5 -0
  72. package/dist/src/stream-muxer/mega-stress-test.d.ts.map +1 -0
  73. package/dist/src/stream-muxer/mega-stress-test.js +8 -0
  74. package/dist/src/stream-muxer/mega-stress-test.js.map +1 -0
  75. package/dist/src/stream-muxer/spawner.d.ts +4 -0
  76. package/dist/src/stream-muxer/spawner.d.ts.map +1 -0
  77. package/dist/src/stream-muxer/spawner.js +32 -0
  78. package/dist/src/stream-muxer/spawner.js.map +1 -0
  79. package/dist/src/stream-muxer/stress-test.d.ts +5 -0
  80. package/dist/src/stream-muxer/stress-test.d.ts.map +1 -0
  81. package/dist/src/stream-muxer/stress-test.js +21 -0
  82. package/dist/src/stream-muxer/stress-test.js.map +1 -0
  83. package/dist/src/topology/multicodec-topology.d.ts +5 -0
  84. package/dist/src/topology/multicodec-topology.d.ts.map +1 -0
  85. package/dist/src/topology/multicodec-topology.js +109 -0
  86. package/dist/src/topology/multicodec-topology.js.map +1 -0
  87. package/dist/src/topology/topology.d.ts +5 -0
  88. package/dist/src/topology/topology.d.ts.map +1 -0
  89. package/dist/src/topology/topology.js +29 -0
  90. package/dist/src/topology/topology.js.map +1 -0
  91. package/dist/src/transport/dial-test.d.ts +5 -0
  92. package/dist/src/transport/dial-test.d.ts.map +1 -0
  93. package/dist/src/transport/dial-test.js +78 -0
  94. package/dist/src/transport/dial-test.js.map +1 -0
  95. package/dist/src/transport/filter-test.d.ts +5 -0
  96. package/dist/src/transport/filter-test.d.ts.map +1 -0
  97. package/dist/src/transport/filter-test.js +19 -0
  98. package/dist/src/transport/filter-test.js.map +1 -0
  99. package/dist/src/transport/index.d.ts +18 -0
  100. package/dist/src/transport/index.d.ts.map +1 -0
  101. package/dist/src/transport/index.js +11 -0
  102. package/dist/src/transport/index.js.map +1 -0
  103. package/dist/src/transport/listen-test.d.ts +5 -0
  104. package/dist/src/transport/listen-test.d.ts.map +1 -0
  105. package/dist/src/transport/listen-test.js +116 -0
  106. package/dist/src/transport/listen-test.js.map +1 -0
  107. package/dist/src/transport/utils/index.d.ts +8 -0
  108. package/dist/src/transport/utils/index.d.ts.map +1 -0
  109. package/dist/src/transport/utils/index.js +104 -0
  110. package/dist/src/transport/utils/index.js.map +1 -0
  111. package/dist/src/utils/peers.d.ts +7 -0
  112. package/dist/src/utils/peers.d.ts.map +1 -0
  113. package/dist/src/utils/peers.js +26 -0
  114. package/dist/src/utils/peers.js.map +1 -0
  115. package/dist/test/connection/index.spec.d.ts +2 -0
  116. package/dist/test/connection/index.spec.d.ts.map +1 -0
  117. package/dist/test/connection/index.spec.js +71 -0
  118. package/dist/test/connection/index.spec.js.map +1 -0
  119. package/dist/test/crypto/index.spec.d.ts +2 -0
  120. package/dist/test/crypto/index.spec.d.ts.map +1 -0
  121. package/dist/test/crypto/index.spec.js +11 -0
  122. package/dist/test/crypto/index.spec.js.map +1 -0
  123. package/dist/test/crypto/mock-crypto.d.ts +4 -0
  124. package/dist/test/crypto/mock-crypto.d.ts.map +1 -0
  125. package/dist/test/crypto/mock-crypto.js +93 -0
  126. package/dist/test/crypto/mock-crypto.js.map +1 -0
  127. package/dist/test/peer-discovery/index.spec.d.ts +2 -0
  128. package/dist/test/peer-discovery/index.spec.d.ts.map +1 -0
  129. package/dist/test/peer-discovery/index.spec.js +18 -0
  130. package/dist/test/peer-discovery/index.spec.js.map +1 -0
  131. package/dist/test/peer-discovery/mock-discovery.d.ts +20 -0
  132. package/dist/test/peer-discovery/mock-discovery.d.ts.map +1 -0
  133. package/dist/test/peer-discovery/mock-discovery.js +39 -0
  134. package/dist/test/peer-discovery/mock-discovery.js.map +1 -0
  135. package/dist/test/topology/mock-peer-store.d.ts +12 -0
  136. package/dist/test/topology/mock-peer-store.d.ts.map +1 -0
  137. package/dist/test/topology/mock-peer-store.js +18 -0
  138. package/dist/test/topology/mock-peer-store.js.map +1 -0
  139. package/dist/test/topology/multicodec-topology.spec.d.ts +2 -0
  140. package/dist/test/topology/multicodec-topology.spec.d.ts.map +1 -0
  141. package/dist/test/topology/multicodec-topology.spec.js +45 -0
  142. package/dist/test/topology/multicodec-topology.spec.js.map +1 -0
  143. package/dist/test/topology/topology.spec.d.ts +2 -0
  144. package/dist/test/topology/topology.spec.d.ts.map +1 -0
  145. package/dist/test/topology/topology.spec.js +21 -0
  146. package/dist/test/topology/topology.spec.js.map +1 -0
  147. package/dist/tsconfig.tsbuildinfo +1 -0
  148. package/package.json +120 -4
  149. package/src/connection/README.md +256 -0
  150. package/src/connection/connection.ts +178 -0
  151. package/src/connection/index.ts +7 -0
  152. package/src/crypto/index.ts +104 -0
  153. package/src/index.ts +5 -0
  154. package/src/peer-discovery/index.ts +87 -0
  155. package/src/pubsub/api.ts +89 -0
  156. package/src/pubsub/connection-handlers.ts +356 -0
  157. package/src/pubsub/emit-self.ts +67 -0
  158. package/src/pubsub/index.ts +20 -0
  159. package/src/pubsub/messages.ts +111 -0
  160. package/src/pubsub/multiple-nodes.ts +353 -0
  161. package/src/pubsub/two-nodes.ts +175 -0
  162. package/src/pubsub/utils.ts +13 -0
  163. package/src/record/index.ts +32 -0
  164. package/src/stream-muxer/base-test.ts +154 -0
  165. package/src/stream-muxer/close-test.ts +124 -0
  166. package/src/stream-muxer/index.ts +15 -0
  167. package/src/stream-muxer/mega-stress-test.ts +11 -0
  168. package/src/stream-muxer/spawner.ts +52 -0
  169. package/src/stream-muxer/stress-test.ts +24 -0
  170. package/src/topology/multicodec-topology.ts +136 -0
  171. package/src/topology/topology.ts +38 -0
  172. package/src/transport/dial-test.ts +98 -0
  173. package/src/transport/filter-test.ts +26 -0
  174. package/src/transport/index.ts +29 -0
  175. package/src/transport/listen-test.ts +152 -0
  176. package/src/transport/utils/index.ts +123 -0
  177. package/src/utils/peers.ts +25 -0
@@ -0,0 +1,279 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import sinon from 'sinon';
3
+ import pDefer from 'p-defer';
4
+ import pWaitFor from 'p-wait-for';
5
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
6
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
7
+ import { expectSet } from './utils.js';
8
+ export default (common) => {
9
+ describe('pubsub connection handlers', () => {
10
+ let psA;
11
+ let psB;
12
+ describe('nodes send state on connection', () => {
13
+ // Create pubsub nodes and connect them
14
+ before(async () => {
15
+ psA = await common.setup();
16
+ psB = await common.setup();
17
+ expect(psA.peers.size).to.be.eql(0);
18
+ expect(psB.peers.size).to.be.eql(0);
19
+ // Start pubsub
20
+ await psA.start();
21
+ await psB.start();
22
+ });
23
+ // Make subscriptions prior to nodes connected
24
+ before(() => {
25
+ psA.subscribe('Za');
26
+ psB.subscribe('Zb');
27
+ expect(psA.peers.size).to.equal(0);
28
+ expectSet(psA.subscriptions, ['Za']);
29
+ expect(psB.peers.size).to.equal(0);
30
+ expectSet(psB.subscriptions, ['Zb']);
31
+ });
32
+ after(async () => {
33
+ sinon.restore();
34
+ await common.teardown();
35
+ });
36
+ it('existing subscriptions are sent upon peer connection', async function () {
37
+ await Promise.all([
38
+ // @ts-expect-error protected fields
39
+ psA._libp2p.dial(psB.peerId),
40
+ new Promise((resolve) => psA.once('pubsub:subscription-change', resolve)),
41
+ new Promise((resolve) => psB.once('pubsub:subscription-change', resolve))
42
+ ]);
43
+ expect(psA.peers.size).to.equal(1);
44
+ expect(psB.peers.size).to.equal(1);
45
+ expectSet(psA.subscriptions, ['Za']);
46
+ expectSet(psB.topics.get('Za'), [psA.peerId.toString()]);
47
+ expectSet(psB.subscriptions, ['Zb']);
48
+ expectSet(psA.topics.get('Zb'), [psB.peerId.toString()]);
49
+ });
50
+ });
51
+ describe('pubsub started before connect', () => {
52
+ // Create pubsub nodes and start them
53
+ beforeEach(async () => {
54
+ psA = await common.setup();
55
+ psB = await common.setup();
56
+ await psA.start();
57
+ await psB.start();
58
+ });
59
+ afterEach(async () => {
60
+ sinon.restore();
61
+ await common.teardown();
62
+ });
63
+ it('should get notified of connected peers on dial', async () => {
64
+ // @ts-expect-error protected fields
65
+ const connection = await psA._libp2p.dial(psB.peerId);
66
+ expect(connection).to.exist();
67
+ return await Promise.all([
68
+ pWaitFor(() => psA.peers.size === 1),
69
+ pWaitFor(() => psB.peers.size === 1)
70
+ ]);
71
+ });
72
+ it('should receive pubsub messages', async () => {
73
+ const defer = pDefer();
74
+ const topic = 'test-topic';
75
+ const data = uint8ArrayFromString('hey!');
76
+ // @ts-expect-error protected fields
77
+ await psA._libp2p.dial(psB.peerId);
78
+ let subscribedTopics = psA.getTopics();
79
+ expect(subscribedTopics).to.not.include(topic);
80
+ psA.on(topic, (msg) => {
81
+ expect(msg.data).to.equalBytes(data);
82
+ defer.resolve();
83
+ });
84
+ psA.subscribe(topic);
85
+ subscribedTopics = psA.getTopics();
86
+ expect(subscribedTopics).to.include(topic);
87
+ // wait for psB to know about psA subscription
88
+ await pWaitFor(() => {
89
+ const subscribedPeers = psB.getSubscribers(topic);
90
+ return subscribedPeers.includes(psA.peerId.toString());
91
+ });
92
+ void psB.publish(topic, data);
93
+ await defer.promise;
94
+ });
95
+ });
96
+ describe('pubsub started after connect', () => {
97
+ // Create pubsub nodes
98
+ beforeEach(async () => {
99
+ psA = await common.setup();
100
+ psB = await common.setup();
101
+ });
102
+ afterEach(async () => {
103
+ sinon.restore();
104
+ await psA.stop();
105
+ await psB.stop();
106
+ await common.teardown();
107
+ });
108
+ it('should get notified of connected peers after starting', async () => {
109
+ // @ts-expect-error protected fields
110
+ const connection = await psA._libp2p.dial(psB.peerId);
111
+ expect(connection).to.exist();
112
+ expect(psA.peers.size).to.be.eql(0);
113
+ expect(psB.peers.size).to.be.eql(0);
114
+ await psA.start();
115
+ await psB.start();
116
+ return await Promise.all([
117
+ pWaitFor(() => psA.peers.size === 1),
118
+ pWaitFor(() => psB.peers.size === 1)
119
+ ]);
120
+ });
121
+ it('should receive pubsub messages', async () => {
122
+ const defer = pDefer();
123
+ const topic = 'test-topic';
124
+ const data = uint8ArrayFromString('hey!');
125
+ // @ts-expect-error protected fields
126
+ await psA._libp2p.dial(psB.peerId);
127
+ await psA.start();
128
+ await psB.start();
129
+ await Promise.all([
130
+ pWaitFor(() => psA.peers.size === 1),
131
+ pWaitFor(() => psB.peers.size === 1)
132
+ ]);
133
+ let subscribedTopics = psA.getTopics();
134
+ expect(subscribedTopics).to.not.include(topic);
135
+ psA.on(topic, (msg) => {
136
+ expect(msg.data).to.equalBytes(data);
137
+ defer.resolve();
138
+ });
139
+ psA.subscribe(topic);
140
+ subscribedTopics = psA.getTopics();
141
+ expect(subscribedTopics).to.include(topic);
142
+ // wait for psB to know about psA subscription
143
+ await pWaitFor(() => {
144
+ const subscribedPeers = psB.getSubscribers(topic);
145
+ return subscribedPeers.includes(psA.peerId.toString());
146
+ });
147
+ void psB.publish(topic, data);
148
+ await defer.promise;
149
+ });
150
+ });
151
+ describe('pubsub with intermittent connections', () => {
152
+ // Create pubsub nodes and start them
153
+ beforeEach(async () => {
154
+ psA = await common.setup();
155
+ psB = await common.setup();
156
+ await psA.start();
157
+ await psB.start();
158
+ });
159
+ afterEach(async () => {
160
+ sinon.restore();
161
+ await psA.stop();
162
+ await psB.stop();
163
+ await common.teardown();
164
+ });
165
+ it('should receive pubsub messages after a node restart', async function () {
166
+ const topic = 'test-topic';
167
+ const data = uint8ArrayFromString('hey!');
168
+ const psAid = psA.peerId.toString();
169
+ let counter = 0;
170
+ const defer1 = pDefer();
171
+ const defer2 = pDefer();
172
+ // @ts-expect-error protected fields
173
+ await psA._libp2p.dial(psB.peerId);
174
+ let subscribedTopics = psA.getTopics();
175
+ expect(subscribedTopics).to.not.include(topic);
176
+ psA.on(topic, (msg) => {
177
+ expect(msg.data).to.equalBytes(data);
178
+ counter++;
179
+ counter === 1 ? defer1.resolve() : defer2.resolve();
180
+ });
181
+ psA.subscribe(topic);
182
+ subscribedTopics = psA.getTopics();
183
+ expect(subscribedTopics).to.include(topic);
184
+ // wait for psB to know about psA subscription
185
+ await pWaitFor(() => {
186
+ const subscribedPeers = psB.getSubscribers(topic);
187
+ return subscribedPeers.includes(psAid);
188
+ });
189
+ void psB.publish(topic, data);
190
+ await defer1.promise;
191
+ await psB.stop();
192
+ // @ts-expect-error protected fields
193
+ await psB._libp2p.stop();
194
+ await pWaitFor(() => {
195
+ // @ts-expect-error protected fields
196
+ const aHasConnectionToB = psA._libp2p.connectionManager.get(psB.peerId);
197
+ // @ts-expect-error protected fields
198
+ const bHasConnectionToA = psB._libp2p.connectionManager.get(psA.peerId);
199
+ return aHasConnectionToB != null && bHasConnectionToA != null;
200
+ });
201
+ // @ts-expect-error protected fields
202
+ await psB._libp2p.start();
203
+ await psB.start();
204
+ // @ts-expect-error protected fields
205
+ psA._libp2p.peerStore.addressBook.set(psB.peerId, psB._libp2p.multiaddrs);
206
+ // @ts-expect-error protected fields
207
+ await psA._libp2p.dial(psB.peerId);
208
+ // wait for remoteLibp2p to know about libp2p subscription
209
+ await pWaitFor(() => {
210
+ const subscribedPeers = psB.getSubscribers(topic);
211
+ return subscribedPeers.includes(psAid);
212
+ });
213
+ void psB.publish(topic, data);
214
+ await defer2.promise;
215
+ });
216
+ it('should handle quick reconnects with a delayed disconnect', async () => {
217
+ // Subscribe on both
218
+ let aReceivedFirstMessageFromB = false;
219
+ let aReceivedSecondMessageFromB = false;
220
+ let bReceivedFirstMessageFromA = false;
221
+ let bReceivedSecondMessageFromA = false;
222
+ const handlerSpyA = (message) => {
223
+ const data = uint8ArrayToString(message.data);
224
+ if (data === 'message-from-b-1') {
225
+ aReceivedFirstMessageFromB = true;
226
+ }
227
+ if (data === 'message-from-b-2') {
228
+ aReceivedSecondMessageFromB = true;
229
+ }
230
+ };
231
+ const handlerSpyB = (message) => {
232
+ const data = uint8ArrayToString(message.data);
233
+ if (data === 'message-from-a-1') {
234
+ bReceivedFirstMessageFromA = true;
235
+ }
236
+ if (data === 'message-from-a-2') {
237
+ bReceivedSecondMessageFromA = true;
238
+ }
239
+ };
240
+ const topic = 'reconnect-channel';
241
+ psA.on(topic, handlerSpyA);
242
+ psB.on(topic, handlerSpyB);
243
+ psA.subscribe(topic);
244
+ psB.subscribe(topic);
245
+ // Create two connections to the remote peer
246
+ // @ts-expect-error protected fields
247
+ const originalConnection = await psA._libp2p.dialer.connectToPeer(psB.peerId);
248
+ // second connection
249
+ // @ts-expect-error protected fields
250
+ await psA._libp2p.dialer.connectToPeer(psB.peerId);
251
+ // @ts-expect-error protected fields
252
+ expect(psA._libp2p.connections.get(psB.peerId.toString())).to.have.length(2);
253
+ // Wait for subscriptions to occur
254
+ await pWaitFor(() => {
255
+ return psA.getSubscribers(topic).includes(psB.peerId.toString()) &&
256
+ psB.getSubscribers(topic).includes(psA.peerId.toString());
257
+ });
258
+ // Verify messages go both ways
259
+ void psA.publish(topic, uint8ArrayFromString('message-from-a-1'));
260
+ void psB.publish(topic, uint8ArrayFromString('message-from-b-1'));
261
+ await pWaitFor(() => {
262
+ return aReceivedFirstMessageFromB && bReceivedFirstMessageFromA;
263
+ });
264
+ // Disconnect the first connection (this acts as a delayed reconnect)
265
+ // @ts-expect-error protected fields
266
+ const psAConnUpdateSpy = sinon.spy(psA._libp2p.connectionManager.connections, 'set');
267
+ await originalConnection.close();
268
+ await pWaitFor(() => psAConnUpdateSpy.callCount === 1);
269
+ // Verify messages go both ways after the disconnect
270
+ void psA.publish(topic, uint8ArrayFromString('message-from-a-2'));
271
+ void psB.publish(topic, uint8ArrayFromString('message-from-b-2'));
272
+ await pWaitFor(() => {
273
+ return aReceivedSecondMessageFromB && bReceivedSecondMessageFromA;
274
+ });
275
+ });
276
+ });
277
+ });
278
+ };
279
+ //# sourceMappingURL=connection-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-handlers.js","sourceRoot":"","sources":["../../../src/pubsub/connection-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { PubSub, PubsubOptions } from '@libp2p/interfaces/pubsub';
3
+ import type { Startable } from '@libp2p/interfaces';
4
+ declare const _default: (common: TestSetup<PubSub & Startable, Partial<PubsubOptions>>) => void;
5
+ export default _default;
6
+ //# sourceMappingURL=emit-self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-self.d.ts","sourceRoot":"","sources":["../../../src/pubsub/emit-self.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;iCAM3B,UAAU,MAAM,GAAG,SAAS,EAAE,QAAQ,aAAa,CAAC,CAAC;AAA7E,wBAuDC"}
@@ -0,0 +1,51 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import sinon from 'sinon';
3
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ const topic = 'foo';
5
+ const data = uint8ArrayFromString('bar');
6
+ const shouldNotHappen = () => expect.fail();
7
+ export default (common) => {
8
+ describe('emit self', () => {
9
+ let pubsub;
10
+ describe('enabled', () => {
11
+ before(async () => {
12
+ pubsub = await common.setup({ emitSelf: true });
13
+ });
14
+ before(async () => {
15
+ await pubsub.start();
16
+ pubsub.subscribe(topic);
17
+ });
18
+ after(async () => {
19
+ sinon.restore();
20
+ await pubsub.stop();
21
+ await common.teardown();
22
+ });
23
+ it('should emit to self on publish', async () => {
24
+ const promise = new Promise((resolve) => pubsub.once(topic, resolve));
25
+ void pubsub.publish(topic, data);
26
+ return await promise;
27
+ });
28
+ });
29
+ describe('disabled', () => {
30
+ before(async () => {
31
+ pubsub = await common.setup({ emitSelf: false });
32
+ });
33
+ before(async () => {
34
+ await pubsub.start();
35
+ pubsub.subscribe(topic);
36
+ });
37
+ after(async () => {
38
+ sinon.restore();
39
+ await pubsub.stop();
40
+ await common.teardown();
41
+ });
42
+ it('should not emit to self on publish', async () => {
43
+ pubsub.once(topic, () => shouldNotHappen);
44
+ void pubsub.publish(topic, data);
45
+ // Wait 1 second to guarantee that self is not noticed
46
+ return await new Promise((resolve) => setTimeout(resolve, 1000));
47
+ });
48
+ });
49
+ });
50
+ };
51
+ //# sourceMappingURL=emit-self.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-self.js","sourceRoot":"","sources":["../../../src/pubsub/emit-self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAK5E,MAAM,KAAK,GAAG,KAAK,CAAA;AACnB,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;AACxC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AAE3C,eAAe,CAAC,MAA6D,EAAE,EAAE;IAC/E,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,IAAI,MAA0B,CAAA;QAE9B,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YACjD,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;gBACpB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACzB,CAAC,CAAC,CAAA;YAEF,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,KAAK,CAAC,OAAO,EAAE,CAAA;gBACf,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBACnB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;YACzB,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;gBAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;gBAErE,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;gBAEhC,OAAO,MAAM,OAAO,CAAA;YACtB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YAClD,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;gBACpB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACzB,CAAC,CAAC,CAAA;YAEF,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,KAAK,CAAC,OAAO,EAAE,CAAA;gBACf,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBACnB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;YACzB,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAA;gBAEzC,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;gBAEhC,sDAAsD;gBACtD,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;YAClE,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { PubSub } from '@libp2p/interfaces/pubsub';
3
+ import type { Startable } from '@libp2p/interfaces';
4
+ declare const _default: (common: TestSetup<PubSub & Startable>) => void;
5
+ export default _default;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pubsub/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;iCAE3B,UAAU,MAAM,GAAG,SAAS,CAAC;AAArD,wBASC"}
@@ -0,0 +1,17 @@
1
+ import apiTest from './api.js';
2
+ import emitSelfTest from './emit-self.js';
3
+ import messagesTest from './messages.js';
4
+ import connectionHandlersTest from './connection-handlers.js';
5
+ import twoNodesTest from './two-nodes.js';
6
+ import multipleNodesTest from './multiple-nodes.js';
7
+ export default (common) => {
8
+ describe('interface-pubsub compliance tests', () => {
9
+ apiTest(common);
10
+ emitSelfTest(common);
11
+ messagesTest(common);
12
+ connectionHandlersTest(common);
13
+ twoNodesTest(common);
14
+ multipleNodesTest(common);
15
+ });
16
+ };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pubsub/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,sBAAsB,MAAM,0BAA0B,CAAA;AAC7D,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,iBAAiB,MAAM,qBAAqB,CAAA;AAKnD,eAAe,CAAC,MAAqC,EAAE,EAAE;IACvD,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,OAAO,CAAC,MAAM,CAAC,CAAA;QACf,YAAY,CAAC,MAAM,CAAC,CAAA;QACpB,YAAY,CAAC,MAAM,CAAC,CAAA;QACpB,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAC9B,YAAY,CAAC,MAAM,CAAC,CAAA;QACpB,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { PubSub } from '@libp2p/interfaces/pubsub';
3
+ import type { Startable } from '@libp2p/interfaces';
4
+ declare const _default: (common: TestSetup<PubSub & Startable>) => void;
5
+ export default _default;
6
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/pubsub/messages.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;iCAK3B,UAAU,MAAM,GAAG,SAAS,CAAC;AAArD,wBAiGC"}
@@ -0,0 +1,93 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import sinon from 'sinon';
3
+ import * as PeerIdFactory from '@libp2p/peer-id-factory';
4
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
5
+ import * as utils from '@libp2p/pubsub/utils';
6
+ import { PeerStreams } from '@libp2p/pubsub/peer-streams';
7
+ const topic = 'foo';
8
+ const data = uint8ArrayFromString('bar');
9
+ export default (common) => {
10
+ describe('messages', () => {
11
+ let pubsub;
12
+ // Create pubsub router
13
+ beforeEach(async () => {
14
+ pubsub = await common.setup();
15
+ await pubsub.start();
16
+ });
17
+ afterEach(async () => {
18
+ sinon.restore();
19
+ await pubsub.stop();
20
+ await common.teardown();
21
+ });
22
+ it('should emit normalized signed messages on publish', async () => {
23
+ pubsub.globalSignaturePolicy = 'StrictSign';
24
+ // @ts-expect-error protected field
25
+ sinon.spy(pubsub, '_emitMessage');
26
+ await pubsub.publish(topic, data);
27
+ // @ts-expect-error protected field
28
+ expect(pubsub._emitMessage.callCount).to.eql(1);
29
+ // @ts-expect-error protected field
30
+ const [messageToEmit] = pubsub._emitMessage.getCall(0).args;
31
+ expect(messageToEmit.seqno).to.not.eql(undefined);
32
+ expect(messageToEmit.key).to.not.eql(undefined);
33
+ expect(messageToEmit.signature).to.not.eql(undefined);
34
+ });
35
+ it('should drop unsigned messages', async () => {
36
+ // @ts-expect-error protected field
37
+ sinon.spy(pubsub, '_emitMessage');
38
+ // @ts-expect-error protected field
39
+ sinon.spy(pubsub, '_publish');
40
+ sinon.spy(pubsub, 'validate');
41
+ const peerStream = new PeerStreams({
42
+ id: await PeerIdFactory.createEd25519PeerId(),
43
+ protocol: 'test'
44
+ });
45
+ const rpc = {
46
+ subscriptions: [],
47
+ msgs: [{
48
+ receivedFrom: peerStream.id.toString(),
49
+ from: peerStream.id.toBytes(),
50
+ data,
51
+ seqno: utils.randomSeqno(),
52
+ topicIDs: [topic]
53
+ }]
54
+ };
55
+ pubsub.subscribe(topic);
56
+ // @ts-expect-error protected field
57
+ await pubsub._processRpc(peerStream.id.toString(), peerStream, rpc);
58
+ expect(pubsub.validate).to.have.property('callCount', 1);
59
+ // @ts-expect-error protected field
60
+ expect(pubsub._emitMessage).to.have.property('called', false);
61
+ // @ts-expect-error protected field
62
+ expect(pubsub._publish).to.have.property('called', false);
63
+ });
64
+ it('should not drop unsigned messages if strict signing is disabled', async () => {
65
+ pubsub.globalSignaturePolicy = 'StrictNoSign';
66
+ // @ts-expect-error protected field
67
+ sinon.spy(pubsub, '_emitMessage');
68
+ // @ts-expect-error protected field
69
+ sinon.spy(pubsub, '_publish');
70
+ sinon.spy(pubsub, 'validate');
71
+ const peerStream = new PeerStreams({
72
+ id: await PeerIdFactory.createEd25519PeerId(),
73
+ protocol: 'test'
74
+ });
75
+ const rpc = {
76
+ subscriptions: [],
77
+ msgs: [{
78
+ data,
79
+ topicIDs: [topic]
80
+ }]
81
+ };
82
+ pubsub.subscribe(topic);
83
+ // @ts-expect-error protected field
84
+ await pubsub._processRpc(peerStream.id.toString(), peerStream, rpc);
85
+ expect(pubsub.validate).to.have.property('callCount', 1);
86
+ // @ts-expect-error protected field
87
+ expect(pubsub._emitMessage).to.have.property('called', 1);
88
+ // @ts-expect-error protected field
89
+ expect(pubsub._publish).to.have.property('called', 1);
90
+ });
91
+ });
92
+ };
93
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/pubsub/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { PubSub } from '@libp2p/interfaces/pubsub';
3
+ import type { Startable } from '@libp2p/interfaces';
4
+ declare const _default: (common: TestSetup<PubSub & Startable>) => void;
5
+ export default _default;
6
+ //# sourceMappingURL=multiple-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiple-nodes.d.ts","sourceRoot":"","sources":["../../../src/pubsub/multiple-nodes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;iCAE3B,UAAU,MAAM,GAAG,SAAS,CAAC;AAArD,wBAmVC"}