@libp2p/interface-compliance-tests 3.0.5 → 3.0.7-05abd49f
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.
- package/README.md +14 -5
- package/dist/src/connection/index.d.ts +5 -0
- package/dist/src/connection/index.d.ts.map +1 -0
- package/dist/src/connection/index.js +151 -0
- package/dist/src/connection/index.js.map +1 -0
- package/dist/src/connection-encryption/index.d.ts +5 -0
- package/dist/src/connection-encryption/index.d.ts.map +1 -0
- package/dist/src/connection-encryption/index.js +71 -0
- package/dist/src/connection-encryption/index.js.map +1 -0
- package/dist/src/connection-encryption/utils/index.d.ts +3 -0
- package/dist/src/connection-encryption/utils/index.d.ts.map +1 -0
- package/dist/src/connection-encryption/utils/index.js +18 -0
- package/dist/src/connection-encryption/utils/index.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/is-valid-tick.d.ts.map +1 -1
- package/dist/src/mocks/connection-encrypter.d.ts +3 -0
- package/dist/src/mocks/connection-encrypter.d.ts.map +1 -0
- package/dist/src/mocks/connection-encrypter.js +98 -0
- package/dist/src/mocks/connection-encrypter.js.map +1 -0
- package/dist/src/mocks/connection-gater.d.ts +3 -0
- package/dist/src/mocks/connection-gater.d.ts.map +1 -0
- package/dist/src/mocks/connection-gater.js +17 -0
- package/dist/src/mocks/connection-gater.js.map +1 -0
- package/dist/src/mocks/connection-manager.d.ts +27 -0
- package/dist/src/mocks/connection-manager.d.ts.map +1 -0
- package/dist/src/mocks/connection-manager.js +145 -0
- package/dist/src/mocks/connection-manager.js.map +1 -0
- package/dist/src/mocks/connection.d.ts +32 -0
- package/dist/src/mocks/connection.d.ts.map +1 -0
- package/dist/src/mocks/connection.js +162 -0
- package/dist/src/mocks/connection.js.map +1 -0
- package/dist/src/mocks/duplex.d.ts +3 -0
- package/dist/src/mocks/duplex.d.ts.map +1 -0
- package/dist/src/mocks/duplex.js +9 -0
- package/dist/src/mocks/duplex.js.map +1 -0
- package/dist/src/mocks/index.d.ts +13 -0
- package/dist/src/mocks/index.d.ts.map +1 -0
- package/dist/src/mocks/index.js +11 -0
- package/dist/src/mocks/index.js.map +1 -0
- package/dist/src/mocks/metrics.d.ts +3 -0
- package/dist/src/mocks/metrics.d.ts.map +1 -0
- package/dist/src/mocks/metrics.js +115 -0
- package/dist/src/mocks/metrics.js.map +1 -0
- package/dist/src/mocks/multiaddr-connection.d.ts +17 -0
- package/dist/src/mocks/multiaddr-connection.d.ts.map +1 -0
- package/dist/src/mocks/multiaddr-connection.js +51 -0
- package/dist/src/mocks/multiaddr-connection.js.map +1 -0
- package/dist/src/mocks/muxer.d.ts +8 -0
- package/dist/src/mocks/muxer.d.ts.map +1 -0
- package/dist/src/mocks/muxer.js +341 -0
- package/dist/src/mocks/muxer.js.map +1 -0
- package/dist/src/mocks/peer-discovery.d.ts +22 -0
- package/dist/src/mocks/peer-discovery.d.ts.map +1 -0
- package/dist/src/mocks/peer-discovery.js +47 -0
- package/dist/src/mocks/peer-discovery.js.map +1 -0
- package/dist/src/mocks/registrar.d.ts +18 -0
- package/dist/src/mocks/registrar.d.ts.map +1 -0
- package/dist/src/mocks/registrar.js +66 -0
- package/dist/src/mocks/registrar.js.map +1 -0
- package/dist/src/mocks/upgrader.d.ts +10 -0
- package/dist/src/mocks/upgrader.d.ts.map +1 -0
- package/dist/src/mocks/upgrader.js +31 -0
- package/dist/src/mocks/upgrader.js.map +1 -0
- package/dist/src/peer-discovery/index.d.ts +5 -0
- package/dist/src/peer-discovery/index.d.ts.map +1 -0
- package/dist/src/peer-discovery/index.js +66 -0
- package/dist/src/peer-discovery/index.js.map +1 -0
- package/dist/src/stream-muxer/base-test.d.ts +5 -0
- package/dist/src/stream-muxer/base-test.d.ts.map +1 -0
- package/dist/src/stream-muxer/base-test.js +153 -0
- package/dist/src/stream-muxer/base-test.js.map +1 -0
- package/dist/src/stream-muxer/close-test.d.ts +5 -0
- package/dist/src/stream-muxer/close-test.d.ts.map +1 -0
- package/dist/src/stream-muxer/close-test.js +269 -0
- package/dist/src/stream-muxer/close-test.js.map +1 -0
- package/dist/src/stream-muxer/index.d.ts +5 -0
- package/dist/src/stream-muxer/index.d.ts.map +1 -0
- package/dist/src/stream-muxer/index.js +13 -0
- package/dist/src/stream-muxer/index.js.map +1 -0
- package/dist/src/stream-muxer/mega-stress-test.d.ts +5 -0
- package/dist/src/stream-muxer/mega-stress-test.d.ts.map +1 -0
- package/dist/src/stream-muxer/mega-stress-test.js +11 -0
- package/dist/src/stream-muxer/mega-stress-test.js.map +1 -0
- package/dist/src/stream-muxer/spawner.d.ts +4 -0
- package/dist/src/stream-muxer/spawner.d.ts.map +1 -0
- package/dist/src/stream-muxer/spawner.js +36 -0
- package/dist/src/stream-muxer/spawner.js.map +1 -0
- package/dist/src/stream-muxer/stress-test.d.ts +5 -0
- package/dist/src/stream-muxer/stress-test.d.ts.map +1 -0
- package/dist/src/stream-muxer/stress-test.js +23 -0
- package/dist/src/stream-muxer/stress-test.js.map +1 -0
- package/dist/src/transport/dial-test.d.ts +5 -0
- package/dist/src/transport/dial-test.d.ts.map +1 -0
- package/dist/src/transport/dial-test.js +98 -0
- package/dist/src/transport/dial-test.js.map +1 -0
- package/dist/src/transport/filter-test.d.ts +5 -0
- package/dist/src/transport/filter-test.d.ts.map +1 -0
- package/dist/src/transport/filter-test.js +18 -0
- package/dist/src/transport/filter-test.js.map +1 -0
- package/dist/src/transport/index.d.ts +15 -0
- package/dist/src/transport/index.d.ts.map +1 -0
- package/dist/src/transport/index.js +11 -0
- package/dist/src/transport/index.js.map +1 -0
- package/dist/src/transport/listen-test.d.ts +5 -0
- package/dist/src/transport/listen-test.d.ts.map +1 -0
- package/dist/src/transport/listen-test.js +152 -0
- package/dist/src/transport/listen-test.js.map +1 -0
- package/package.json +66 -95
- package/src/connection/index.ts +184 -0
- package/src/connection-encryption/index.ts +97 -0
- package/src/connection-encryption/utils/index.ts +23 -0
- package/src/index.ts +1 -1
- package/src/is-valid-tick.ts +1 -1
- package/src/mocks/connection-encrypter.ts +113 -0
- package/src/mocks/connection-gater.ts +18 -0
- package/src/mocks/connection-manager.ts +209 -0
- package/src/mocks/connection.ts +218 -0
- package/src/mocks/duplex.ts +10 -0
- package/src/mocks/index.ts +12 -0
- package/src/mocks/metrics.ts +162 -0
- package/src/mocks/multiaddr-connection.ts +67 -0
- package/src/mocks/muxer.ts +447 -0
- package/src/mocks/peer-discovery.ts +60 -0
- package/src/mocks/registrar.ts +88 -0
- package/src/mocks/upgrader.ts +49 -0
- package/src/peer-discovery/index.ts +90 -0
- package/src/stream-muxer/base-test.ts +196 -0
- package/src/stream-muxer/close-test.ts +346 -0
- package/src/stream-muxer/index.ts +15 -0
- package/src/stream-muxer/mega-stress-test.ts +14 -0
- package/src/stream-muxer/spawner.ts +54 -0
- package/src/stream-muxer/stress-test.ts +27 -0
- package/src/transport/dial-test.ts +124 -0
- package/src/transport/filter-test.ts +25 -0
- package/src/transport/index.ts +25 -0
- package/src/transport/listen-test.ts +191 -0
- package/dist/typedoc-urls.json +0 -3
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { start, stop } from '@libp2p/interface/startable';
|
|
2
|
+
import { isMultiaddr } from '@multiformats/multiaddr';
|
|
3
|
+
import { expect } from 'aegir/chai';
|
|
4
|
+
import delay from 'delay';
|
|
5
|
+
import pDefer from 'p-defer';
|
|
6
|
+
export default (common) => {
|
|
7
|
+
describe('interface-peer-discovery compliance tests', () => {
|
|
8
|
+
let discovery;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
discovery = await common.setup();
|
|
11
|
+
});
|
|
12
|
+
afterEach('ensure discovery was stopped', async () => {
|
|
13
|
+
await stop(discovery);
|
|
14
|
+
await common.teardown();
|
|
15
|
+
});
|
|
16
|
+
it('can start the service', async () => {
|
|
17
|
+
await start(discovery);
|
|
18
|
+
});
|
|
19
|
+
it('can start and stop the service', async () => {
|
|
20
|
+
await start(discovery);
|
|
21
|
+
await stop(discovery);
|
|
22
|
+
});
|
|
23
|
+
it('should not fail to stop the service if it was not started', async () => {
|
|
24
|
+
await stop(discovery);
|
|
25
|
+
});
|
|
26
|
+
it('should not fail to start the service if it is already started', async () => {
|
|
27
|
+
await start(discovery);
|
|
28
|
+
await start(discovery);
|
|
29
|
+
});
|
|
30
|
+
it('should emit a peer event after start', async () => {
|
|
31
|
+
const defer = pDefer();
|
|
32
|
+
discovery.addEventListener('peer', (evt) => {
|
|
33
|
+
const { id, multiaddrs } = evt.detail;
|
|
34
|
+
expect(id).to.exist();
|
|
35
|
+
expect(id)
|
|
36
|
+
.to.have.property('type')
|
|
37
|
+
.that.is.oneOf(['RSA', 'Ed25519', 'secp256k1']);
|
|
38
|
+
expect(multiaddrs).to.exist();
|
|
39
|
+
multiaddrs.forEach((m) => expect(isMultiaddr(m)).to.eql(true));
|
|
40
|
+
defer.resolve();
|
|
41
|
+
});
|
|
42
|
+
await start(discovery);
|
|
43
|
+
await defer.promise;
|
|
44
|
+
});
|
|
45
|
+
it('should not receive a peer event before start', async () => {
|
|
46
|
+
discovery.addEventListener('peer', () => {
|
|
47
|
+
throw new Error('should not receive a peer event before start');
|
|
48
|
+
});
|
|
49
|
+
await delay(2000);
|
|
50
|
+
});
|
|
51
|
+
it('should not receive a peer event after stop', async () => {
|
|
52
|
+
const deferStart = pDefer();
|
|
53
|
+
discovery.addEventListener('peer', () => {
|
|
54
|
+
deferStart.resolve();
|
|
55
|
+
});
|
|
56
|
+
await start(discovery);
|
|
57
|
+
await deferStart.promise;
|
|
58
|
+
await stop(discovery);
|
|
59
|
+
discovery.addEventListener('peer', () => {
|
|
60
|
+
throw new Error('should not receive a peer event after stop');
|
|
61
|
+
});
|
|
62
|
+
await delay(2000);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer-discovery/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-test.d.ts","sourceRoot":"","sources":["../../../src/stream-muxer/base-test.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;iCAQhD,UAAU,kBAAkB,CAAC,KAAG,IAAI;AAA5D,wBA8KC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { expect } from 'aegir/chai';
|
|
2
|
+
import all from 'it-all';
|
|
3
|
+
import drain from 'it-drain';
|
|
4
|
+
import map from 'it-map';
|
|
5
|
+
import { duplexPair } from 'it-pair/duplex';
|
|
6
|
+
import { pipe } from 'it-pipe';
|
|
7
|
+
import defer from 'p-defer';
|
|
8
|
+
import { Uint8ArrayList } from 'uint8arraylist';
|
|
9
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
10
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
11
|
+
import { isValidTick } from '../is-valid-tick.js';
|
|
12
|
+
async function drainAndClose(stream) {
|
|
13
|
+
await pipe([], stream, drain);
|
|
14
|
+
}
|
|
15
|
+
export default (common) => {
|
|
16
|
+
describe('base', () => {
|
|
17
|
+
it('Open a stream from the dialer', async () => {
|
|
18
|
+
const p = duplexPair();
|
|
19
|
+
const dialerFactory = await common.setup();
|
|
20
|
+
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' });
|
|
21
|
+
const onStreamPromise = defer();
|
|
22
|
+
const onStreamEndPromise = defer();
|
|
23
|
+
const listenerFactory = await common.setup();
|
|
24
|
+
const listener = listenerFactory.createStreamMuxer({
|
|
25
|
+
direction: 'inbound',
|
|
26
|
+
onIncomingStream: (stream) => {
|
|
27
|
+
onStreamPromise.resolve(stream);
|
|
28
|
+
},
|
|
29
|
+
onStreamEnd: (stream) => {
|
|
30
|
+
onStreamEndPromise.resolve(stream);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
void pipe(p[0], dialer, p[0]);
|
|
34
|
+
void pipe(p[1], listener, p[1]);
|
|
35
|
+
const conn = await dialer.newStream();
|
|
36
|
+
expect(dialer.streams).to.include(conn);
|
|
37
|
+
expect(isValidTick(conn.stat.timeline.open)).to.equal(true);
|
|
38
|
+
void drainAndClose(conn);
|
|
39
|
+
const stream = await onStreamPromise.promise;
|
|
40
|
+
expect(isValidTick(stream.stat.timeline.open)).to.equal(true);
|
|
41
|
+
// Make sure the stream is being tracked
|
|
42
|
+
expect(listener.streams).to.include(stream);
|
|
43
|
+
void drainAndClose(stream);
|
|
44
|
+
// Make sure stream is closed properly
|
|
45
|
+
const endedStream = await onStreamEndPromise.promise;
|
|
46
|
+
expect(listener.streams).to.not.include(endedStream);
|
|
47
|
+
if (endedStream.stat.timeline.close == null) {
|
|
48
|
+
throw new Error('timeline had no close time');
|
|
49
|
+
}
|
|
50
|
+
// Make sure the stream is removed from tracking
|
|
51
|
+
expect(isValidTick(endedStream.stat.timeline.close)).to.equal(true);
|
|
52
|
+
await drainAndClose(dialer);
|
|
53
|
+
await drainAndClose(listener);
|
|
54
|
+
// ensure we have no streams left
|
|
55
|
+
expect(dialer.streams).to.have.length(0);
|
|
56
|
+
expect(listener.streams).to.have.length(0);
|
|
57
|
+
});
|
|
58
|
+
it('Open a stream from the listener', async () => {
|
|
59
|
+
const p = duplexPair();
|
|
60
|
+
const onStreamPromise = defer();
|
|
61
|
+
const dialerFactory = await common.setup();
|
|
62
|
+
const dialer = dialerFactory.createStreamMuxer({
|
|
63
|
+
direction: 'outbound',
|
|
64
|
+
onIncomingStream: (stream) => {
|
|
65
|
+
onStreamPromise.resolve(stream);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
const listenerFactory = await common.setup();
|
|
69
|
+
const listener = listenerFactory.createStreamMuxer({ direction: 'inbound' });
|
|
70
|
+
void pipe(p[0], dialer, p[0]);
|
|
71
|
+
void pipe(p[1], listener, p[1]);
|
|
72
|
+
const conn = await listener.newStream();
|
|
73
|
+
void drainAndClose(conn);
|
|
74
|
+
const stream = await onStreamPromise.promise;
|
|
75
|
+
expect(isValidTick(stream.stat.timeline.open)).to.equal(true);
|
|
76
|
+
expect(listener.streams).to.include(conn);
|
|
77
|
+
expect(isValidTick(conn.stat.timeline.open)).to.equal(true);
|
|
78
|
+
void drainAndClose(stream);
|
|
79
|
+
await drainAndClose(dialer);
|
|
80
|
+
await drainAndClose(listener);
|
|
81
|
+
});
|
|
82
|
+
it('Open a stream on both sides', async () => {
|
|
83
|
+
const p = duplexPair();
|
|
84
|
+
const onDialerStreamPromise = defer();
|
|
85
|
+
const onListenerStreamPromise = defer();
|
|
86
|
+
const dialerFactory = await common.setup();
|
|
87
|
+
const dialer = dialerFactory.createStreamMuxer({
|
|
88
|
+
direction: 'outbound',
|
|
89
|
+
onIncomingStream: (stream) => {
|
|
90
|
+
onDialerStreamPromise.resolve(stream);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const listenerFactory = await common.setup();
|
|
94
|
+
const listener = listenerFactory.createStreamMuxer({
|
|
95
|
+
direction: 'inbound',
|
|
96
|
+
onIncomingStream: (stream) => {
|
|
97
|
+
onListenerStreamPromise.resolve(stream);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
void pipe(p[0], dialer, p[0]);
|
|
101
|
+
void pipe(p[1], listener, p[1]);
|
|
102
|
+
const dialerInitiatorStream = await dialer.newStream();
|
|
103
|
+
const listenerInitiatorStream = await listener.newStream();
|
|
104
|
+
await Promise.all([
|
|
105
|
+
drainAndClose(dialerInitiatorStream),
|
|
106
|
+
drainAndClose(listenerInitiatorStream),
|
|
107
|
+
onDialerStreamPromise.promise.then(async (stream) => { await drainAndClose(stream); }),
|
|
108
|
+
onListenerStreamPromise.promise.then(async (stream) => { await drainAndClose(stream); })
|
|
109
|
+
]);
|
|
110
|
+
await Promise.all([
|
|
111
|
+
drainAndClose(dialer),
|
|
112
|
+
drainAndClose(listener)
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
it('Open a stream on one side, write, open a stream on the other side', async () => {
|
|
116
|
+
const toString = (source) => map(source, (u) => uint8ArrayToString(u.subarray()));
|
|
117
|
+
const p = duplexPair();
|
|
118
|
+
const onDialerStreamPromise = defer();
|
|
119
|
+
const onListenerStreamPromise = defer();
|
|
120
|
+
const dialerFactory = await common.setup();
|
|
121
|
+
const dialer = dialerFactory.createStreamMuxer({
|
|
122
|
+
direction: 'outbound',
|
|
123
|
+
onIncomingStream: (stream) => {
|
|
124
|
+
onDialerStreamPromise.resolve(stream);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
const listenerFactory = await common.setup();
|
|
128
|
+
const listener = listenerFactory.createStreamMuxer({
|
|
129
|
+
direction: 'inbound',
|
|
130
|
+
onIncomingStream: (stream) => {
|
|
131
|
+
onListenerStreamPromise.resolve(stream);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
void pipe(p[0], dialer, p[0]);
|
|
135
|
+
void pipe(p[1], listener, p[1]);
|
|
136
|
+
const dialerConn = await dialer.newStream();
|
|
137
|
+
const listenerConn = await listener.newStream();
|
|
138
|
+
void pipe([new Uint8ArrayList(uint8ArrayFromString('hey'))], dialerConn);
|
|
139
|
+
void pipe([new Uint8ArrayList(uint8ArrayFromString('hello'))], listenerConn);
|
|
140
|
+
const [dialerStream, listenerStream] = await Promise.all([
|
|
141
|
+
onDialerStreamPromise.promise,
|
|
142
|
+
onListenerStreamPromise.promise
|
|
143
|
+
]);
|
|
144
|
+
const [listenerChunks, dialerChunks] = await Promise.all([
|
|
145
|
+
pipe(listenerStream, toString, async (source) => all(source)),
|
|
146
|
+
pipe(dialerStream, toString, async (source) => all(source))
|
|
147
|
+
]);
|
|
148
|
+
expect(listenerChunks).to.be.eql(['hey']);
|
|
149
|
+
expect(dialerChunks).to.be.eql(['hello']);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=base-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-test.js","sourceRoot":"","sources":["../../../src/stream-muxer/base-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-test.d.ts","sourceRoot":"","sources":["../../../src/stream-muxer/close-test.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;iCAehD,UAAU,kBAAkB,CAAC,KAAG,IAAI;AAA5D,wBA8TC"}
|
|
@@ -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 @@
|
|
|
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"}
|