@libp2p/interface-compliance-tests 3.0.6 → 3.0.7-06f4901a

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 (176) hide show
  1. package/README.md +12 -3
  2. package/dist/src/connection/index.d.ts +5 -0
  3. package/dist/src/connection/index.d.ts.map +1 -0
  4. package/dist/src/connection/index.js +151 -0
  5. package/dist/src/connection/index.js.map +1 -0
  6. package/dist/src/connection-encryption/index.d.ts +5 -0
  7. package/dist/src/connection-encryption/index.d.ts.map +1 -0
  8. package/dist/src/connection-encryption/index.js +71 -0
  9. package/dist/src/connection-encryption/index.js.map +1 -0
  10. package/dist/src/connection-encryption/utils/index.d.ts +3 -0
  11. package/dist/src/connection-encryption/utils/index.d.ts.map +1 -0
  12. package/dist/src/connection-encryption/utils/index.js +18 -0
  13. package/dist/src/connection-encryption/utils/index.js.map +1 -0
  14. package/dist/src/index.d.ts +1 -1
  15. package/dist/src/index.d.ts.map +1 -1
  16. package/dist/src/mocks/connection-encrypter.d.ts +3 -0
  17. package/dist/src/mocks/connection-encrypter.d.ts.map +1 -0
  18. package/dist/src/mocks/connection-encrypter.js +98 -0
  19. package/dist/src/mocks/connection-encrypter.js.map +1 -0
  20. package/dist/src/mocks/connection-gater.d.ts +3 -0
  21. package/dist/src/mocks/connection-gater.d.ts.map +1 -0
  22. package/dist/src/mocks/connection-gater.js +17 -0
  23. package/dist/src/mocks/connection-gater.js.map +1 -0
  24. package/dist/src/mocks/connection-manager.d.ts +29 -0
  25. package/dist/src/mocks/connection-manager.d.ts.map +1 -0
  26. package/dist/src/mocks/connection-manager.js +145 -0
  27. package/dist/src/mocks/connection-manager.js.map +1 -0
  28. package/dist/src/mocks/connection.d.ts +32 -0
  29. package/dist/src/mocks/connection.d.ts.map +1 -0
  30. package/dist/src/mocks/connection.js +162 -0
  31. package/dist/src/mocks/connection.js.map +1 -0
  32. package/dist/src/mocks/duplex.d.ts +3 -0
  33. package/dist/src/mocks/duplex.d.ts.map +1 -0
  34. package/dist/src/mocks/duplex.js +9 -0
  35. package/dist/src/mocks/duplex.js.map +1 -0
  36. package/dist/src/mocks/index.d.ts +13 -0
  37. package/dist/src/mocks/index.d.ts.map +1 -0
  38. package/dist/src/mocks/index.js +11 -0
  39. package/dist/src/mocks/index.js.map +1 -0
  40. package/dist/src/mocks/metrics.d.ts +3 -0
  41. package/dist/src/mocks/metrics.d.ts.map +1 -0
  42. package/dist/src/mocks/metrics.js +115 -0
  43. package/dist/src/mocks/metrics.js.map +1 -0
  44. package/dist/src/mocks/multiaddr-connection.d.ts +17 -0
  45. package/dist/src/mocks/multiaddr-connection.d.ts.map +1 -0
  46. package/dist/src/mocks/multiaddr-connection.js +51 -0
  47. package/dist/src/mocks/multiaddr-connection.js.map +1 -0
  48. package/dist/src/mocks/muxer.d.ts +8 -0
  49. package/dist/src/mocks/muxer.d.ts.map +1 -0
  50. package/dist/src/mocks/muxer.js +341 -0
  51. package/dist/src/mocks/muxer.js.map +1 -0
  52. package/dist/src/mocks/peer-discovery.d.ts +22 -0
  53. package/dist/src/mocks/peer-discovery.d.ts.map +1 -0
  54. package/dist/src/mocks/peer-discovery.js +47 -0
  55. package/dist/src/mocks/peer-discovery.js.map +1 -0
  56. package/dist/src/mocks/registrar.d.ts +18 -0
  57. package/dist/src/mocks/registrar.d.ts.map +1 -0
  58. package/dist/src/mocks/registrar.js +66 -0
  59. package/dist/src/mocks/registrar.js.map +1 -0
  60. package/dist/src/mocks/upgrader.d.ts +10 -0
  61. package/dist/src/mocks/upgrader.d.ts.map +1 -0
  62. package/dist/src/mocks/upgrader.js +31 -0
  63. package/dist/src/mocks/upgrader.js.map +1 -0
  64. package/dist/src/peer-discovery/index.d.ts +5 -0
  65. package/dist/src/peer-discovery/index.d.ts.map +1 -0
  66. package/dist/src/peer-discovery/index.js +66 -0
  67. package/dist/src/peer-discovery/index.js.map +1 -0
  68. package/dist/src/pubsub/api.d.ts +6 -0
  69. package/dist/src/pubsub/api.d.ts.map +1 -0
  70. package/dist/src/pubsub/api.js +87 -0
  71. package/dist/src/pubsub/api.js.map +1 -0
  72. package/dist/src/pubsub/connection-handlers.d.ts +6 -0
  73. package/dist/src/pubsub/connection-handlers.d.ts.map +1 -0
  74. package/dist/src/pubsub/connection-handlers.js +329 -0
  75. package/dist/src/pubsub/connection-handlers.js.map +1 -0
  76. package/dist/src/pubsub/emit-self.d.ts +6 -0
  77. package/dist/src/pubsub/emit-self.d.ts.map +1 -0
  78. package/dist/src/pubsub/emit-self.js +80 -0
  79. package/dist/src/pubsub/emit-self.js.map +1 -0
  80. package/dist/src/pubsub/index.d.ts +18 -0
  81. package/dist/src/pubsub/index.d.ts.map +1 -0
  82. package/dist/src/pubsub/index.js +17 -0
  83. package/dist/src/pubsub/index.js.map +1 -0
  84. package/dist/src/pubsub/messages.d.ts +6 -0
  85. package/dist/src/pubsub/messages.d.ts.map +1 -0
  86. package/dist/src/pubsub/messages.js +48 -0
  87. package/dist/src/pubsub/messages.js.map +1 -0
  88. package/dist/src/pubsub/multiple-nodes.d.ts +6 -0
  89. package/dist/src/pubsub/multiple-nodes.d.ts.map +1 -0
  90. package/dist/src/pubsub/multiple-nodes.js +350 -0
  91. package/dist/src/pubsub/multiple-nodes.js.map +1 -0
  92. package/dist/src/pubsub/two-nodes.d.ts +6 -0
  93. package/dist/src/pubsub/two-nodes.d.ts.map +1 -0
  94. package/dist/src/pubsub/two-nodes.js +217 -0
  95. package/dist/src/pubsub/two-nodes.js.map +1 -0
  96. package/dist/src/pubsub/utils.d.ts +6 -0
  97. package/dist/src/pubsub/utils.d.ts.map +1 -0
  98. package/dist/src/pubsub/utils.js +22 -0
  99. package/dist/src/pubsub/utils.js.map +1 -0
  100. package/dist/src/stream-muxer/base-test.d.ts +5 -0
  101. package/dist/src/stream-muxer/base-test.d.ts.map +1 -0
  102. package/dist/src/stream-muxer/base-test.js +153 -0
  103. package/dist/src/stream-muxer/base-test.js.map +1 -0
  104. package/dist/src/stream-muxer/close-test.d.ts +5 -0
  105. package/dist/src/stream-muxer/close-test.d.ts.map +1 -0
  106. package/dist/src/stream-muxer/close-test.js +269 -0
  107. package/dist/src/stream-muxer/close-test.js.map +1 -0
  108. package/dist/src/stream-muxer/index.d.ts +5 -0
  109. package/dist/src/stream-muxer/index.d.ts.map +1 -0
  110. package/dist/src/stream-muxer/index.js +13 -0
  111. package/dist/src/stream-muxer/index.js.map +1 -0
  112. package/dist/src/stream-muxer/mega-stress-test.d.ts +5 -0
  113. package/dist/src/stream-muxer/mega-stress-test.d.ts.map +1 -0
  114. package/dist/src/stream-muxer/mega-stress-test.js +11 -0
  115. package/dist/src/stream-muxer/mega-stress-test.js.map +1 -0
  116. package/dist/src/stream-muxer/spawner.d.ts +4 -0
  117. package/dist/src/stream-muxer/spawner.d.ts.map +1 -0
  118. package/dist/src/stream-muxer/spawner.js +36 -0
  119. package/dist/src/stream-muxer/spawner.js.map +1 -0
  120. package/dist/src/stream-muxer/stress-test.d.ts +5 -0
  121. package/dist/src/stream-muxer/stress-test.d.ts.map +1 -0
  122. package/dist/src/stream-muxer/stress-test.js +23 -0
  123. package/dist/src/stream-muxer/stress-test.js.map +1 -0
  124. package/dist/src/transport/dial-test.d.ts +5 -0
  125. package/dist/src/transport/dial-test.d.ts.map +1 -0
  126. package/dist/src/transport/dial-test.js +98 -0
  127. package/dist/src/transport/dial-test.js.map +1 -0
  128. package/dist/src/transport/filter-test.d.ts +5 -0
  129. package/dist/src/transport/filter-test.d.ts.map +1 -0
  130. package/dist/src/transport/filter-test.js +18 -0
  131. package/dist/src/transport/filter-test.js.map +1 -0
  132. package/dist/src/transport/index.d.ts +15 -0
  133. package/dist/src/transport/index.d.ts.map +1 -0
  134. package/dist/src/transport/index.js +11 -0
  135. package/dist/src/transport/index.js.map +1 -0
  136. package/dist/src/transport/listen-test.d.ts +5 -0
  137. package/dist/src/transport/listen-test.d.ts.map +1 -0
  138. package/dist/src/transport/listen-test.js +152 -0
  139. package/dist/src/transport/listen-test.js.map +1 -0
  140. package/package.json +71 -95
  141. package/src/connection/index.ts +184 -0
  142. package/src/connection-encryption/index.ts +97 -0
  143. package/src/connection-encryption/utils/index.ts +23 -0
  144. package/src/index.ts +1 -1
  145. package/src/mocks/connection-encrypter.ts +113 -0
  146. package/src/mocks/connection-gater.ts +18 -0
  147. package/src/mocks/connection-manager.ts +211 -0
  148. package/src/mocks/connection.ts +218 -0
  149. package/src/mocks/duplex.ts +10 -0
  150. package/src/mocks/index.ts +12 -0
  151. package/src/mocks/metrics.ts +162 -0
  152. package/src/mocks/multiaddr-connection.ts +67 -0
  153. package/src/mocks/muxer.ts +447 -0
  154. package/src/mocks/peer-discovery.ts +60 -0
  155. package/src/mocks/registrar.ts +88 -0
  156. package/src/mocks/upgrader.ts +49 -0
  157. package/src/peer-discovery/index.ts +90 -0
  158. package/src/pubsub/api.ts +114 -0
  159. package/src/pubsub/connection-handlers.ts +413 -0
  160. package/src/pubsub/emit-self.ts +99 -0
  161. package/src/pubsub/index.ts +34 -0
  162. package/src/pubsub/messages.ts +59 -0
  163. package/src/pubsub/multiple-nodes.ts +440 -0
  164. package/src/pubsub/two-nodes.ts +273 -0
  165. package/src/pubsub/utils.ts +29 -0
  166. package/src/stream-muxer/base-test.ts +196 -0
  167. package/src/stream-muxer/close-test.ts +346 -0
  168. package/src/stream-muxer/index.ts +15 -0
  169. package/src/stream-muxer/mega-stress-test.ts +14 -0
  170. package/src/stream-muxer/spawner.ts +54 -0
  171. package/src/stream-muxer/stress-test.ts +27 -0
  172. package/src/transport/dial-test.ts +124 -0
  173. package/src/transport/filter-test.ts +25 -0
  174. package/src/transport/index.ts +25 -0
  175. package/src/transport/listen-test.ts +191 -0
  176. package/dist/typedoc-urls.json +0 -3
@@ -0,0 +1,269 @@
1
+ /* eslint max-nested-callbacks: ["error", 8] */
2
+ import { abortableSource } from 'abortable-iterator';
3
+ import { expect } from 'aegir/chai';
4
+ import delay from 'delay';
5
+ import all from 'it-all';
6
+ import drain from 'it-drain';
7
+ import { duplexPair } from 'it-pair/duplex';
8
+ import { pipe } from 'it-pipe';
9
+ import pDefer from 'p-defer';
10
+ import { Uint8ArrayList } from 'uint8arraylist';
11
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
12
+ function randomBuffer() {
13
+ return uint8ArrayFromString(Math.random().toString());
14
+ }
15
+ const infiniteRandom = {
16
+ [Symbol.asyncIterator]: async function* () {
17
+ while (true) {
18
+ yield new Uint8ArrayList(randomBuffer());
19
+ await delay(50);
20
+ }
21
+ }
22
+ };
23
+ export default (common) => {
24
+ describe('close', () => {
25
+ it('closing underlying socket closes streams', async () => {
26
+ let openedStreams = 0;
27
+ const expectedStreams = 5;
28
+ const dialerFactory = await common.setup();
29
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
30
+ // Listener is echo server :)
31
+ const listenerFactory = await common.setup();
32
+ const listener = listenerFactory.createStreamMuxer({
33
+ direction: 'inbound',
34
+ onIncomingStream: (stream) => {
35
+ openedStreams++;
36
+ void pipe(stream, stream);
37
+ }
38
+ });
39
+ const p = duplexPair();
40
+ void pipe(p[0], dialer, p[0]);
41
+ void pipe(p[1], listener, p[1]);
42
+ const streams = await Promise.all(Array(expectedStreams).fill(0).map(async () => dialer.newStream()));
43
+ void Promise.all(streams.map(async (stream) => {
44
+ await pipe(infiniteRandom, stream, drain);
45
+ }));
46
+ expect(dialer.streams).to.have.lengthOf(expectedStreams);
47
+ // Pause, and then send some data and close the dialer
48
+ await delay(50);
49
+ await pipe([randomBuffer()], dialer, drain);
50
+ expect(openedStreams).to.have.equal(expectedStreams);
51
+ expect(dialer.streams).to.have.lengthOf(0);
52
+ });
53
+ it('calling close closes streams', async () => {
54
+ let openedStreams = 0;
55
+ const expectedStreams = 5;
56
+ const dialerFactory = await common.setup();
57
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
58
+ // Listener is echo server :)
59
+ const listenerFactory = await common.setup();
60
+ const listener = listenerFactory.createStreamMuxer({
61
+ direction: 'inbound',
62
+ onIncomingStream: (stream) => {
63
+ openedStreams++;
64
+ void pipe(stream, stream).catch(() => { });
65
+ }
66
+ });
67
+ const p = duplexPair();
68
+ void pipe(p[0], dialer, p[0]);
69
+ void pipe(p[1], listener, p[1]);
70
+ const streams = await Promise.all(Array(expectedStreams).fill(0).map(async () => dialer.newStream()));
71
+ void Promise.all(streams.map(async (stream) => {
72
+ await pipe(infiniteRandom, stream, drain);
73
+ }));
74
+ expect(dialer.streams, 'dialer - number of opened streams should match number of calls to newStream').to.have.lengthOf(expectedStreams);
75
+ // Pause, and then close the dialer
76
+ await delay(50);
77
+ dialer.close();
78
+ expect(openedStreams, 'listener - number of opened streams should match number of calls to newStream').to.have.equal(expectedStreams);
79
+ expect(dialer.streams, 'all tracked streams should be deleted after the muxer has called close').to.have.lengthOf(0);
80
+ });
81
+ it('calling close with an error aborts streams', async () => {
82
+ let openedStreams = 0;
83
+ const expectedStreams = 5;
84
+ const dialerFactory = await common.setup();
85
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
86
+ // Listener is echo server :)
87
+ const listenerFactory = await common.setup();
88
+ const listener = listenerFactory.createStreamMuxer({
89
+ direction: 'inbound',
90
+ onIncomingStream: (stream) => {
91
+ openedStreams++;
92
+ void pipe(stream, stream).catch(() => { });
93
+ }
94
+ });
95
+ const p = duplexPair();
96
+ void pipe(p[0], dialer, p[0]);
97
+ void pipe(p[1], listener, p[1]);
98
+ const streams = await Promise.all(Array(expectedStreams).fill(0).map(async () => dialer.newStream()));
99
+ const streamPipes = streams.map(async (stream) => {
100
+ await pipe(infiniteRandom, stream, drain);
101
+ });
102
+ expect(dialer.streams, 'dialer - number of opened streams should match number of calls to newStream').to.have.lengthOf(expectedStreams);
103
+ // Pause, and then close the dialer
104
+ await delay(50);
105
+ // close _with an error_
106
+ dialer.close(new Error());
107
+ const timeoutError = new Error('timeout');
108
+ for (const pipe of streamPipes) {
109
+ try {
110
+ await Promise.race([
111
+ pipe,
112
+ new Promise((_resolve, reject) => setTimeout(() => { reject(timeoutError); }, 20))
113
+ ]);
114
+ expect.fail('stream pipe with infinite source should never return');
115
+ }
116
+ catch (e) {
117
+ if (e === timeoutError) {
118
+ expect.fail('expected stream pipe to throw an error after muxer closed with error');
119
+ }
120
+ }
121
+ }
122
+ expect(openedStreams, 'listener - number of opened streams should match number of calls to newStream').to.have.equal(expectedStreams);
123
+ expect(dialer.streams, 'all tracked streams should be deleted after the muxer has called close').to.have.lengthOf(0);
124
+ });
125
+ it('calling newStream after close throws an error', async () => {
126
+ const dialerFactory = await common.setup();
127
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
128
+ dialer.close();
129
+ try {
130
+ await dialer.newStream();
131
+ expect.fail('newStream should throw if called after close');
132
+ }
133
+ catch (e) {
134
+ expect(dialer.streams, 'closed muxer should have no streams').to.have.lengthOf(0);
135
+ }
136
+ });
137
+ it('closing one of the muxed streams doesn\'t close others', async () => {
138
+ const p = duplexPair();
139
+ const dialerFactory = await common.setup();
140
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
141
+ // Listener is echo server :)
142
+ const listenerFactory = await common.setup();
143
+ const listener = listenerFactory.createStreamMuxer({
144
+ direction: 'inbound',
145
+ onIncomingStream: (stream) => {
146
+ void pipe(stream, stream).catch(() => { });
147
+ }
148
+ });
149
+ void pipe(p[0], dialer, p[0]);
150
+ void pipe(p[1], listener, p[1]);
151
+ const stream = await dialer.newStream();
152
+ const streams = await Promise.all(Array.from(Array(5), async () => dialer.newStream()));
153
+ let closed = false;
154
+ const controllers = [];
155
+ const streamResults = streams.map(async (stream) => {
156
+ const controller = new AbortController();
157
+ controllers.push(controller);
158
+ try {
159
+ const abortableRand = abortableSource(infiniteRandom, controller.signal, { abortCode: 'ERR_TEST_ABORT' });
160
+ await pipe(abortableRand, stream, drain);
161
+ }
162
+ catch (err) {
163
+ if (err.code !== 'ERR_TEST_ABORT')
164
+ throw err;
165
+ }
166
+ if (!closed)
167
+ throw new Error('stream should not have ended yet!');
168
+ });
169
+ // Pause, and then send some data and close the first stream
170
+ await delay(50);
171
+ await pipe([new Uint8ArrayList(randomBuffer())], stream, drain);
172
+ closed = true;
173
+ // Abort all the other streams later
174
+ await delay(50);
175
+ controllers.forEach(c => { c.abort(); });
176
+ // These should now all resolve without error
177
+ await Promise.all(streamResults);
178
+ });
179
+ it('can close a stream for writing', async () => {
180
+ const deferred = pDefer();
181
+ const p = duplexPair();
182
+ const dialerFactory = await common.setup();
183
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
184
+ const data = [randomBuffer(), randomBuffer()];
185
+ const listenerFactory = await common.setup();
186
+ const listener = listenerFactory.createStreamMuxer({
187
+ direction: 'inbound',
188
+ onIncomingStream: (stream) => {
189
+ void Promise.resolve().then(async () => {
190
+ // Immediate close for write
191
+ stream.closeWrite();
192
+ const results = await pipe(stream, async (source) => {
193
+ const data = [];
194
+ for await (const chunk of source) {
195
+ data.push(chunk.slice());
196
+ }
197
+ return data;
198
+ });
199
+ expect(results).to.eql(data);
200
+ try {
201
+ await stream.sink([new Uint8ArrayList(randomBuffer())]);
202
+ }
203
+ catch (err) {
204
+ deferred.resolve(err);
205
+ }
206
+ deferred.reject(new Error('should not support writing to closed writer'));
207
+ });
208
+ }
209
+ });
210
+ void pipe(p[0], dialer, p[0]);
211
+ void pipe(p[1], listener, p[1]);
212
+ const stream = await dialer.newStream();
213
+ await stream.sink(data);
214
+ const err = await deferred.promise;
215
+ expect(err).to.have.property('message').that.matches(/stream closed for writing/);
216
+ });
217
+ it('can close a stream for reading', async () => {
218
+ const deferred = pDefer();
219
+ const p = duplexPair();
220
+ const dialerFactory = await common.setup();
221
+ const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
222
+ const data = [randomBuffer(), randomBuffer()].map(d => new Uint8ArrayList(d));
223
+ const listenerFactory = await common.setup();
224
+ const listener = listenerFactory.createStreamMuxer({
225
+ direction: 'inbound',
226
+ onIncomingStream: (stream) => {
227
+ void all(stream.source).then(deferred.resolve, deferred.reject);
228
+ }
229
+ });
230
+ void pipe(p[0], dialer, p[0]);
231
+ void pipe(p[1], listener, p[1]);
232
+ const stream = await dialer.newStream();
233
+ stream.closeRead();
234
+ // Source should be done
235
+ void Promise.resolve().then(async () => {
236
+ expect(await stream.source.next()).to.have.property('done', true);
237
+ await stream.sink(data);
238
+ });
239
+ const results = await deferred.promise;
240
+ expect(results).to.eql(data);
241
+ });
242
+ it('calls onStreamEnd for closed streams not previously written', async () => {
243
+ const deferred = pDefer();
244
+ const onStreamEnd = () => { deferred.resolve(); };
245
+ const dialerFactory = await common.setup();
246
+ const dialer = dialerFactory.createStreamMuxer({
247
+ direction: 'outbound',
248
+ onStreamEnd
249
+ });
250
+ const stream = await dialer.newStream();
251
+ stream.close();
252
+ await deferred.promise;
253
+ });
254
+ it('calls onStreamEnd for read and write closed streams not previously written', async () => {
255
+ const deferred = pDefer();
256
+ const onStreamEnd = () => { deferred.resolve(); };
257
+ const dialerFactory = await common.setup();
258
+ const dialer = dialerFactory.createStreamMuxer({
259
+ direction: 'outbound',
260
+ onStreamEnd
261
+ });
262
+ const stream = await dialer.newStream();
263
+ stream.closeWrite();
264
+ stream.closeRead();
265
+ await deferred.promise;
266
+ });
267
+ });
268
+ };
269
+ //# sourceMappingURL=close-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-test.js","sourceRoot":"","sources":["../../../src/stream-muxer/close-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { StreamMuxerFactory } from '@libp2p/interface/stream-muxer';
3
+ declare const _default: (common: TestSetup<StreamMuxerFactory>) => void;
4
+ export default _default;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stream-muxer/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;iCAEhD,UAAU,kBAAkB,CAAC,KAAG,IAAI;AAA5D,wBAOC"}
@@ -0,0 +1,13 @@
1
+ import baseTest from './base-test.js';
2
+ import closeTest from './close-test.js';
3
+ import megaStressTest from './mega-stress-test.js';
4
+ import stressTest from './stress-test.js';
5
+ export default (common) => {
6
+ describe('interface-stream-muxer', () => {
7
+ baseTest(common);
8
+ closeTest(common);
9
+ stressTest(common);
10
+ megaStressTest(common);
11
+ });
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stream-muxer/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,cAAc,MAAM,uBAAuB,CAAA;AAClD,OAAO,UAAU,MAAM,kBAAkB,CAAA;AAIzC,eAAe,CAAC,MAAqC,EAAQ,EAAE;IAC7D,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChB,SAAS,CAAC,MAAM,CAAC,CAAA;QACjB,UAAU,CAAC,MAAM,CAAC,CAAA;QAClB,cAAc,CAAC,MAAM,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { StreamMuxerFactory } from '@libp2p/interface/stream-muxer';
3
+ declare const _default: (common: TestSetup<StreamMuxerFactory>) => void;
4
+ export default _default;
5
+ //# sourceMappingURL=mega-stress-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mega-stress-test.d.ts","sourceRoot":"","sources":["../../../src/stream-muxer/mega-stress-test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAe,kBAAkB,EAAmB,MAAM,gCAAgC,CAAA;iCAE9E,UAAU,kBAAkB,CAAC,KAAG,IAAI;AAA5D,wBASC"}
@@ -0,0 +1,11 @@
1
+ import spawn from './spawner.js';
2
+ export default (common) => {
3
+ const createMuxer = async (init) => {
4
+ const factory = await common.setup();
5
+ return factory.createStreamMuxer(init);
6
+ };
7
+ describe.skip('mega stress test', function () {
8
+ it('10,000 streams with 10,000 msg', async () => { await spawn(createMuxer, 10000, 10000, 5000); });
9
+ });
10
+ };
11
+ //# sourceMappingURL=mega-stress-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mega-stress-test.js","sourceRoot":"","sources":["../../../src/stream-muxer/mega-stress-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAIhC,eAAe,CAAC,MAAqC,EAAQ,EAAE;IAC7D,MAAM,WAAW,GAAG,KAAK,EAAE,IAAsB,EAAwB,EAAE;QACzE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC,CAAA;IAED,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAChC,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface/stream-muxer';
2
+ declare const _default: (createMuxer: (init?: StreamMuxerInit) => Promise<StreamMuxer>, nStreams: number, nMsg: number, limit?: number) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../../src/stream-muxer/spawner.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;8CAEvC,eAAe,KAAK,QAAQ,WAAW,CAAC,YAAY,MAAM,QAAQ,MAAM,UAAU,MAAM,KAAG,QAAQ,IAAI,CAAC;AAAnJ,wBA2CC"}
@@ -0,0 +1,36 @@
1
+ import { expect } from 'aegir/chai';
2
+ import all from 'it-all';
3
+ import drain from 'it-drain';
4
+ import { duplexPair } from 'it-pair/duplex';
5
+ import { pipe } from 'it-pipe';
6
+ import pLimit from 'p-limit';
7
+ import { Uint8ArrayList } from 'uint8arraylist';
8
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
9
+ export default async (createMuxer, nStreams, nMsg, limit) => {
10
+ const [dialerSocket, listenerSocket] = duplexPair();
11
+ const msg = new Uint8ArrayList(uint8ArrayFromString('simple msg'));
12
+ const listener = await createMuxer({
13
+ direction: 'inbound',
14
+ onIncomingStream: (stream) => {
15
+ void pipe(stream, drain).then(() => {
16
+ stream.close();
17
+ });
18
+ }
19
+ });
20
+ const dialer = await createMuxer({ direction: 'outbound' });
21
+ void pipe(listenerSocket, listener, listenerSocket);
22
+ void pipe(dialerSocket, dialer, dialerSocket);
23
+ const spawnStream = async () => {
24
+ const stream = await dialer.newStream();
25
+ expect(stream).to.exist; // eslint-disable-line
26
+ const res = await pipe((async function* () {
27
+ for (let i = 0; i < nMsg; i++) {
28
+ yield msg;
29
+ }
30
+ }()), stream, async (source) => all(source));
31
+ expect(res).to.be.eql([]);
32
+ };
33
+ const limiter = pLimit(limit ?? Infinity);
34
+ await Promise.all(Array.from(Array(nStreams), async () => { await limiter(async () => { await spawnStream(); }); }));
35
+ };
36
+ //# sourceMappingURL=spawner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../../src/stream-muxer/spawner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAG5E,eAAe,KAAK,EAAE,WAA6D,EAAE,QAAgB,EAAE,IAAY,EAAE,KAAc,EAAiB,EAAE;IACpJ,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,UAAU,EAAc,CAAA;IAE/D,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAA;IAElE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC;QACjC,SAAS,EAAE,SAAS;QACpB,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3B,KAAK,IAAI,CACP,MAAM,EACN,KAAK,CACN,CAAC,IAAI,CAAC,GAAG,EAAE;gBACV,MAAM,CAAC,KAAK,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAA;IAE3D,KAAK,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;IACnD,KAAK,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;IAE7C,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAA,CAAC,sBAAsB;QAE9C,MAAM,GAAG,GAAG,MAAM,IAAI,CACpB,CAAC,KAAK,SAAU,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC7B,MAAM,GAAG,CAAA;aACV;QACH,CAAC,EAAE,CAAC,EACJ,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAC9B,CAAA;QAED,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAA;IAEzC,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAChG,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { StreamMuxerFactory } from '@libp2p/interface/stream-muxer';
3
+ declare const _default: (common: TestSetup<StreamMuxerFactory>) => void;
4
+ export default _default;
5
+ //# sourceMappingURL=stress-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress-test.d.ts","sourceRoot":"","sources":["../../../src/stream-muxer/stress-test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAgC,MAAM,gCAAgC,CAAA;iCAE9E,UAAU,kBAAkB,CAAC,KAAG,IAAI;AAA5D,wBAsBC"}
@@ -0,0 +1,23 @@
1
+ import spawn from './spawner.js';
2
+ export default (common) => {
3
+ const createMuxer = async (init) => {
4
+ const factory = await common.setup();
5
+ return factory.createStreamMuxer(init);
6
+ };
7
+ describe('stress test', function () {
8
+ this.timeout(800000);
9
+ it('1 stream with 1 msg', async () => { await spawn(createMuxer, 1, 1); });
10
+ it('1 stream with 10 msg', async () => { await spawn(createMuxer, 1, 10); });
11
+ it('1 stream with 100 msg', async () => { await spawn(createMuxer, 1, 100); });
12
+ it('10 streams with 1 msg', async () => { await spawn(createMuxer, 10, 1); });
13
+ it('10 streams with 10 msg', async () => { await spawn(createMuxer, 10, 10); });
14
+ it('10 streams with 100 msg', async () => { await spawn(createMuxer, 10, 100); });
15
+ it('100 streams with 1 msg', async () => { await spawn(createMuxer, 100, 1); });
16
+ it('100 streams with 10 msg', async () => { await spawn(createMuxer, 100, 10); });
17
+ it('100 streams with 100 msg', async () => { await spawn(createMuxer, 100, 100); });
18
+ it('1000 streams with 1 msg', async () => { await spawn(createMuxer, 1000, 1); });
19
+ it('1000 streams with 10 msg', async () => { await spawn(createMuxer, 1000, 10); });
20
+ it('1000 streams with 100 msg', async () => { await spawn(createMuxer, 1000, 100); });
21
+ });
22
+ };
23
+ //# sourceMappingURL=stress-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress-test.js","sourceRoot":"","sources":["../../../src/stream-muxer/stress-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAA;AAIhC,eAAe,CAAC,MAAqC,EAAQ,EAAE;IAC7D,MAAM,WAAW,GAAG,KAAK,EAAE,IAAsB,EAAwB,EAAE;QACzE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC,CAAA;IAED,QAAQ,CAAC,aAAa,EAAE;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAEpB,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QACzE,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC3E,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC7E,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC5E,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC9E,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAChF,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC9E,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAChF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAClF,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAChF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAClF,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { TransportTestFixtures } from './index.js';
2
+ import type { TestSetup } from '../index.js';
3
+ declare const _default: (common: TestSetup<TransportTestFixtures>) => void;
4
+ export default _default;
5
+ //# sourceMappingURL=dial-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dial-test.d.ts","sourceRoot":"","sources":["../../../src/transport/dial-test.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAa,MAAM,YAAY,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;iCAKpB,UAAU,qBAAqB,CAAC,KAAG,IAAI;AAA/D,wBA2GC"}
@@ -0,0 +1,98 @@
1
+ import { AbortError } from '@libp2p/interface/errors';
2
+ import { EventEmitter } from '@libp2p/interface/events';
3
+ import { expect } from 'aegir/chai';
4
+ import all from 'it-all';
5
+ import drain from 'it-drain';
6
+ import { pipe } from 'it-pipe';
7
+ import sinon from 'sinon';
8
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
9
+ import { isValidTick } from '../is-valid-tick.js';
10
+ import { mockUpgrader, mockRegistrar } from '../mocks/index.js';
11
+ export default (common) => {
12
+ describe('dial', () => {
13
+ let upgrader;
14
+ let registrar;
15
+ let addrs;
16
+ let transport;
17
+ let connector;
18
+ let listener;
19
+ before(async () => {
20
+ registrar = mockRegistrar();
21
+ upgrader = mockUpgrader({
22
+ registrar,
23
+ events: new EventEmitter()
24
+ });
25
+ ({ addrs, transport, connector } = await common.setup());
26
+ });
27
+ after(async () => {
28
+ await common.teardown();
29
+ });
30
+ beforeEach(async () => {
31
+ listener = transport.createListener({
32
+ upgrader
33
+ });
34
+ await listener.listen(addrs[0]);
35
+ });
36
+ afterEach(async () => {
37
+ sinon.restore();
38
+ connector.restore();
39
+ await listener.close();
40
+ });
41
+ it('simple', async () => {
42
+ const protocol = '/hello/1.0.0';
43
+ void registrar.handle(protocol, (data) => {
44
+ void pipe([
45
+ uint8ArrayFromString('hey')
46
+ ], data.stream, drain);
47
+ });
48
+ const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound');
49
+ const conn = await transport.dial(addrs[0], {
50
+ upgrader
51
+ });
52
+ const stream = await conn.newStream([protocol]);
53
+ const result = await all(stream.source);
54
+ expect(upgradeSpy.callCount).to.equal(1);
55
+ await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn);
56
+ expect(result.length).to.equal(1);
57
+ expect(result[0].subarray()).to.equalBytes(uint8ArrayFromString('hey'));
58
+ await conn.close();
59
+ });
60
+ it('can close connections', async () => {
61
+ const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound');
62
+ const conn = await transport.dial(addrs[0], {
63
+ upgrader
64
+ });
65
+ expect(upgradeSpy.callCount).to.equal(1);
66
+ await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn);
67
+ await conn.close();
68
+ expect(isValidTick(conn.stat.timeline.close)).to.equal(true);
69
+ });
70
+ it('to non existent listener', async () => {
71
+ const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound');
72
+ await expect(transport.dial(addrs[1], {
73
+ upgrader
74
+ })).to.eventually.be.rejected();
75
+ expect(upgradeSpy.callCount).to.equal(0);
76
+ });
77
+ it('abort before dialing throws AbortError', async () => {
78
+ const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound');
79
+ const controller = new AbortController();
80
+ controller.abort();
81
+ const conn = transport.dial(addrs[0], { signal: controller.signal, upgrader });
82
+ await expect(conn).to.eventually.be.rejected().with.property('code', AbortError.code);
83
+ expect(upgradeSpy.callCount).to.equal(0);
84
+ });
85
+ it('abort while dialing throws AbortError', async () => {
86
+ const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound');
87
+ // Add a delay to connect() so that we can abort while the dial is in
88
+ // progress
89
+ connector.delay(100);
90
+ const controller = new AbortController();
91
+ const conn = transport.dial(addrs[0], { signal: controller.signal, upgrader });
92
+ setTimeout(() => { controller.abort(); }, 50);
93
+ await expect(conn).to.eventually.be.rejected().with.property('code', AbortError.code);
94
+ expect(upgradeSpy.callCount).to.equal(0);
95
+ });
96
+ });
97
+ };
98
+ //# sourceMappingURL=dial-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dial-test.js","sourceRoot":"","sources":["../../../src/transport/dial-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TransportTestFixtures } from './index.js';
2
+ import type { TestSetup } from '../index.js';
3
+ declare const _default: (common: TestSetup<TransportTestFixtures>) => void;
4
+ export default _default;
5
+ //# sourceMappingURL=filter-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-test.d.ts","sourceRoot":"","sources":["../../../src/transport/filter-test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;iCAIpB,UAAU,qBAAqB,CAAC,KAAG,IAAI;AAA/D,wBAkBC"}
@@ -0,0 +1,18 @@
1
+ import { expect } from 'aegir/chai';
2
+ export default (common) => {
3
+ describe('filter', () => {
4
+ let addrs;
5
+ let transport;
6
+ before(async () => {
7
+ ({ addrs, transport } = await common.setup());
8
+ });
9
+ after(async () => {
10
+ await common.teardown();
11
+ });
12
+ it('filters addresses', () => {
13
+ const filteredAddrs = transport.filter(addrs);
14
+ expect(filteredAddrs).to.eql(addrs);
15
+ });
16
+ });
17
+ };
18
+ //# sourceMappingURL=filter-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-test.js","sourceRoot":"","sources":["../../../src/transport/filter-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAMnC,eAAe,CAAC,MAAwC,EAAQ,EAAE;IAChE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,IAAI,KAAkB,CAAA;QACtB,IAAI,SAAoB,CAAA;QAExB,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC7C,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { TestSetup } from '../index.js';
2
+ import type { Transport } from '@libp2p/interface/transport';
3
+ import type { Multiaddr } from '@multiformats/multiaddr';
4
+ export interface Connector {
5
+ delay: (ms: number) => void;
6
+ restore: () => void;
7
+ }
8
+ export interface TransportTestFixtures {
9
+ addrs: Multiaddr[];
10
+ transport: Transport;
11
+ connector: Connector;
12
+ }
13
+ declare const _default: (common: TestSetup<TransportTestFixtures>) => void;
14
+ export default _default;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;CACrB;iCAEuB,UAAU,qBAAqB,CAAC,KAAG,IAAI;AAA/D,wBAMC"}
@@ -0,0 +1,11 @@
1
+ import dial from './dial-test.js';
2
+ import filter from './filter-test.js';
3
+ import listen from './listen-test.js';
4
+ export default (common) => {
5
+ describe('interface-transport', () => {
6
+ dial(common);
7
+ listen(common);
8
+ filter(common);
9
+ });
10
+ };
11
+ //# sourceMappingURL=index.js.map