@libp2p/interface-compliance-tests 6.5.0-8484de8a2 → 6.5.0-87bc8d4fb
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/dist/src/connection-encryption/index.d.ts.map +1 -1
- package/dist/src/connection-encryption/index.js +15 -24
- package/dist/src/connection-encryption/index.js.map +1 -1
- 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 +21 -0
- package/dist/src/connection-encryption/utils/index.js.map +1 -0
- package/dist/src/matchers.d.ts +12 -0
- package/dist/src/matchers.d.ts.map +1 -0
- package/dist/src/matchers.js +14 -0
- package/dist/src/matchers.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 +147 -0
- package/dist/src/mocks/connection-manager.js.map +1 -0
- package/dist/src/mocks/connection.d.ts +41 -0
- package/dist/src/mocks/connection.d.ts.map +1 -0
- package/dist/src/mocks/connection.js +236 -0
- package/dist/src/mocks/connection.js.map +1 -0
- package/dist/src/mocks/duplex.d.ts +4 -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 +12 -0
- package/dist/src/mocks/index.d.ts.map +1 -0
- package/dist/src/mocks/index.js +8 -0
- package/dist/src/mocks/index.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 +64 -0
- package/dist/src/mocks/multiaddr-connection.js.map +1 -0
- package/dist/src/mocks/muxer.d.ts +36 -0
- package/dist/src/mocks/muxer.d.ts.map +1 -0
- package/dist/src/mocks/muxer.js +234 -0
- package/dist/src/mocks/muxer.js.map +1 -0
- package/dist/src/mocks/registrar.d.ts +16 -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 +9 -0
- package/dist/src/mocks/upgrader.d.ts.map +1 -0
- package/dist/src/mocks/upgrader.js +46 -0
- package/dist/src/mocks/upgrader.js.map +1 -0
- package/dist/src/pubsub/api.d.ts +6 -0
- package/dist/src/pubsub/api.d.ts.map +1 -0
- package/dist/src/pubsub/api.js +88 -0
- package/dist/src/pubsub/api.js.map +1 -0
- package/dist/src/pubsub/connection-handlers.d.ts +6 -0
- package/dist/src/pubsub/connection-handlers.d.ts.map +1 -0
- package/dist/src/pubsub/connection-handlers.js +329 -0
- package/dist/src/pubsub/connection-handlers.js.map +1 -0
- package/dist/src/pubsub/emit-self.d.ts +6 -0
- package/dist/src/pubsub/emit-self.d.ts.map +1 -0
- package/dist/src/pubsub/emit-self.js +80 -0
- package/dist/src/pubsub/emit-self.js.map +1 -0
- package/dist/src/pubsub/index.d.ts +18 -0
- package/dist/src/pubsub/index.d.ts.map +1 -0
- package/dist/src/pubsub/index.js +17 -0
- package/dist/src/pubsub/index.js.map +1 -0
- package/dist/src/pubsub/messages.d.ts +6 -0
- package/dist/src/pubsub/messages.d.ts.map +1 -0
- package/dist/src/pubsub/messages.js +48 -0
- package/dist/src/pubsub/messages.js.map +1 -0
- package/dist/src/pubsub/multiple-nodes.d.ts +6 -0
- package/dist/src/pubsub/multiple-nodes.d.ts.map +1 -0
- package/dist/src/pubsub/multiple-nodes.js +350 -0
- package/dist/src/pubsub/multiple-nodes.js.map +1 -0
- package/dist/src/pubsub/two-nodes.d.ts +6 -0
- package/dist/src/pubsub/two-nodes.d.ts.map +1 -0
- package/dist/src/pubsub/two-nodes.js +216 -0
- package/dist/src/pubsub/two-nodes.js.map +1 -0
- package/dist/src/pubsub/utils.d.ts +5 -0
- package/dist/src/pubsub/utils.d.ts.map +1 -0
- package/dist/src/pubsub/utils.js +27 -0
- package/dist/src/pubsub/utils.js.map +1 -0
- package/dist/src/stream-muxer/base-test.d.ts.map +1 -1
- package/dist/src/stream-muxer/base-test.js +345 -62
- package/dist/src/stream-muxer/base-test.js.map +1 -1
- package/dist/src/stream-muxer/close-test.d.ts.map +1 -1
- package/dist/src/stream-muxer/close-test.js +320 -253
- package/dist/src/stream-muxer/close-test.js.map +1 -1
- package/dist/src/stream-muxer/index.js +2 -2
- package/dist/src/stream-muxer/index.js.map +1 -1
- package/dist/src/stream-muxer/{stream-test.d.ts → mega-stress-test.d.ts} +2 -2
- 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 +39 -0
- package/dist/src/stream-muxer/spawner.js.map +1 -0
- package/dist/src/stream-muxer/stress-test.d.ts.map +1 -1
- package/dist/src/stream-muxer/stress-test.js +16 -70
- package/dist/src/stream-muxer/stress-test.js.map +1 -1
- package/dist/src/transport/index.d.ts.map +1 -1
- package/dist/src/transport/index.js +203 -232
- package/dist/src/transport/index.js.map +1 -1
- package/dist/src/transport/utils.js +2 -2
- package/dist/src/transport/utils.js.map +1 -1
- package/package.json +51 -23
- package/src/connection-encryption/index.ts +20 -27
- package/src/connection-encryption/utils/index.ts +27 -0
- package/src/matchers.ts +18 -0
- package/src/mocks/connection-manager.ts +216 -0
- package/src/mocks/connection.ts +309 -0
- package/src/mocks/duplex.ts +11 -0
- package/src/mocks/index.ts +11 -0
- package/src/mocks/multiaddr-connection.ts +80 -0
- package/src/mocks/muxer.ts +331 -0
- package/src/mocks/registrar.ts +86 -0
- package/src/mocks/upgrader.ts +65 -0
- package/src/pubsub/api.ts +116 -0
- package/src/pubsub/connection-handlers.ts +413 -0
- package/src/pubsub/emit-self.ts +99 -0
- package/src/pubsub/index.ts +34 -0
- package/src/pubsub/messages.ts +59 -0
- package/src/pubsub/multiple-nodes.ts +440 -0
- package/src/pubsub/two-nodes.ts +272 -0
- package/src/pubsub/utils.ts +34 -0
- package/src/stream-muxer/base-test.ts +413 -75
- package/src/stream-muxer/close-test.ts +343 -304
- package/src/stream-muxer/index.ts +2 -2
- package/src/stream-muxer/mega-stress-test.ts +14 -0
- package/src/stream-muxer/spawner.ts +57 -0
- package/src/stream-muxer/stress-test.ts +18 -92
- package/src/transport/index.ts +241 -280
- package/src/transport/utils.ts +2 -2
- package/dist/src/stream-muxer/stream-test.d.ts.map +0 -1
- package/dist/src/stream-muxer/stream-test.js +0 -289
- package/dist/src/stream-muxer/stream-test.js.map +0 -1
- package/src/stream-muxer/stream-test.ts +0 -380
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import baseTest from './base-test.js'
|
|
2
2
|
import closeTest from './close-test.js'
|
|
3
|
-
import
|
|
3
|
+
import megaStressTest from './mega-stress-test.js'
|
|
4
4
|
import stressTest from './stress-test.js'
|
|
5
5
|
import type { TestSetup } from '../index.js'
|
|
6
6
|
import type { StreamMuxerFactory } from '@libp2p/interface'
|
|
@@ -9,7 +9,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
9
9
|
describe('interface-stream-muxer', () => {
|
|
10
10
|
baseTest(common)
|
|
11
11
|
closeTest(common)
|
|
12
|
-
steamTest(common)
|
|
13
12
|
stressTest(common)
|
|
13
|
+
megaStressTest(common)
|
|
14
14
|
})
|
|
15
15
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import spawn from './spawner.js'
|
|
2
|
+
import type { TestSetup } from '../index.js'
|
|
3
|
+
import type { StreamMuxer, StreamMuxerFactory, StreamMuxerInit } from '@libp2p/interface'
|
|
4
|
+
|
|
5
|
+
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
6
|
+
const createMuxer = async (init?: StreamMuxerInit): Promise<StreamMuxer> => {
|
|
7
|
+
const factory = await common.setup()
|
|
8
|
+
return factory.createStreamMuxer(init)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
describe.skip('mega stress test', function () {
|
|
12
|
+
it('10,000 streams with 10,000 msg', async () => { await spawn(createMuxer, 10000, 10000, 5000) })
|
|
13
|
+
})
|
|
14
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface'
|
|
10
|
+
|
|
11
|
+
export default async (createMuxer: (init?: StreamMuxerInit) => Promise<StreamMuxer>, nStreams: number, nMsg: number, limit?: number): Promise<void> => {
|
|
12
|
+
const [dialerSocket, listenerSocket] = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
13
|
+
|
|
14
|
+
const msg = new Uint8ArrayList(uint8ArrayFromString('simple msg'))
|
|
15
|
+
|
|
16
|
+
const listener = await createMuxer({
|
|
17
|
+
direction: 'inbound',
|
|
18
|
+
onIncomingStream: (stream) => {
|
|
19
|
+
void pipe(
|
|
20
|
+
stream,
|
|
21
|
+
drain
|
|
22
|
+
).then(async () => {
|
|
23
|
+
await stream.close()
|
|
24
|
+
})
|
|
25
|
+
.catch(err => { stream.abort(err) })
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
const dialer = await createMuxer({
|
|
29
|
+
direction: 'outbound'
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
void pipe(listenerSocket, listener, listenerSocket)
|
|
33
|
+
void pipe(dialerSocket, dialer, dialerSocket)
|
|
34
|
+
|
|
35
|
+
const spawnStream = async (): Promise<void> => {
|
|
36
|
+
const stream = await dialer.newStream()
|
|
37
|
+
expect(stream).to.exist // eslint-disable-line
|
|
38
|
+
|
|
39
|
+
const res = await pipe(
|
|
40
|
+
(async function * () {
|
|
41
|
+
for (let i = 0; i < nMsg; i++) {
|
|
42
|
+
yield msg
|
|
43
|
+
}
|
|
44
|
+
}()),
|
|
45
|
+
stream,
|
|
46
|
+
async (source) => all(source)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
expect(res).to.be.eql([])
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const limiter = pLimit(limit ?? Infinity)
|
|
53
|
+
|
|
54
|
+
await Promise.all(
|
|
55
|
+
Array.from(Array(nStreams), async () => { await limiter(async () => { await spawnStream() }) })
|
|
56
|
+
)
|
|
57
|
+
}
|
|
@@ -1,101 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { expect } from 'aegir/chai'
|
|
3
|
-
import { pEvent } from 'p-event'
|
|
4
|
-
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
5
|
-
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
1
|
+
import spawn from './spawner.js'
|
|
6
2
|
import type { TestSetup } from '../index.js'
|
|
7
|
-
import type { StreamMuxerFactory,
|
|
8
|
-
|
|
9
|
-
async function * messages (nMsg: number): AsyncGenerator<Uint8Array> {
|
|
10
|
-
for (let i = 0; i < nMsg; i++) {
|
|
11
|
-
yield uint8ArrayFromString(`message ${i + 1}/${nMsg}`)
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async function spawn (createMuxer: (maConn: MultiaddrConnection) => Promise<StreamMuxer>, nStreams: number, nMsg: number): Promise<void> {
|
|
16
|
-
const [outboundConnection, inboundConnection] = multiaddrConnectionPair()
|
|
17
|
-
|
|
18
|
-
const listener = await createMuxer(inboundConnection)
|
|
19
|
-
listener.addEventListener('stream', function echoStreamHandler (evt) {
|
|
20
|
-
echo(evt.detail)
|
|
21
|
-
.catch(err => {
|
|
22
|
-
evt.detail.abort(err)
|
|
23
|
-
})
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const dialer = await createMuxer(outboundConnection)
|
|
27
|
-
|
|
28
|
-
const spawnStream = async (): Promise<void> => {
|
|
29
|
-
let receivedBytes = 0
|
|
30
|
-
let sentBytes = 0
|
|
31
|
-
|
|
32
|
-
for await (const buf of messages(nMsg)) {
|
|
33
|
-
sentBytes += buf.byteLength
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const receivedAllMessagesPromise = Promise.withResolvers<void>()
|
|
37
|
-
const outboundStream = await dialer.createStream()
|
|
38
|
-
|
|
39
|
-
outboundStream.addEventListener('message', function countMessages (evt) {
|
|
40
|
-
receivedBytes += evt.data.byteLength
|
|
41
|
-
|
|
42
|
-
outboundStream.log('%s - echoed bytes %d/%d', uint8ArrayToString(evt.data.subarray()), receivedBytes, sentBytes)
|
|
43
|
-
|
|
44
|
-
if (receivedBytes === sentBytes) {
|
|
45
|
-
outboundStream.log('received all bytes')
|
|
46
|
-
receivedAllMessagesPromise.resolve()
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
for await (const buf of messages(nMsg)) {
|
|
51
|
-
const sendMore = outboundStream.send(buf)
|
|
52
|
-
|
|
53
|
-
if (sendMore === false) {
|
|
54
|
-
await pEvent(outboundStream, 'drain', {
|
|
55
|
-
rejectionEvents: ['close']
|
|
56
|
-
})
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
await receivedAllMessagesPromise.promise
|
|
61
|
-
outboundStream.log('sent and received all messages %d/%d', receivedBytes, sentBytes)
|
|
62
|
-
|
|
63
|
-
await Promise.all([
|
|
64
|
-
pEvent(outboundStream, 'close'),
|
|
65
|
-
outboundStream.close()
|
|
66
|
-
])
|
|
67
|
-
|
|
68
|
-
expect(receivedBytes).to.equal(sentBytes)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
await Promise.all(
|
|
72
|
-
Array.from(Array(nStreams), async () => {
|
|
73
|
-
await spawnStream()
|
|
74
|
-
})
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
await listener.close()
|
|
78
|
-
await dialer.close()
|
|
79
|
-
}
|
|
3
|
+
import type { StreamMuxerFactory, StreamMuxerInit, StreamMuxer } from '@libp2p/interface'
|
|
80
4
|
|
|
81
5
|
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
82
|
-
const createMuxer = async (
|
|
6
|
+
const createMuxer = async (init?: StreamMuxerInit): Promise<StreamMuxer> => {
|
|
83
7
|
const factory = await common.setup()
|
|
84
|
-
return factory.createStreamMuxer(
|
|
8
|
+
return factory.createStreamMuxer(init)
|
|
85
9
|
}
|
|
86
10
|
|
|
87
|
-
const streams = [1, 10, 100, 1000]
|
|
88
|
-
const messages = [1, 10, 100]
|
|
89
|
-
|
|
90
11
|
describe('stress test', function () {
|
|
91
|
-
this.timeout(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
12
|
+
this.timeout(1600000)
|
|
13
|
+
|
|
14
|
+
it('1 stream with 1 msg', async () => { await spawn(createMuxer, 1, 1) })
|
|
15
|
+
it('1 stream with 10 msg', async () => { await spawn(createMuxer, 1, 10) })
|
|
16
|
+
it('1 stream with 100 msg', async () => { await spawn(createMuxer, 1, 100) })
|
|
17
|
+
it('10 streams with 1 msg', async () => { await spawn(createMuxer, 10, 1) })
|
|
18
|
+
it('10 streams with 10 msg', async () => { await spawn(createMuxer, 10, 10) })
|
|
19
|
+
it('10 streams with 100 msg', async () => { await spawn(createMuxer, 10, 100) })
|
|
20
|
+
it('100 streams with 1 msg', async () => { await spawn(createMuxer, 100, 1) })
|
|
21
|
+
it('100 streams with 10 msg', async () => { await spawn(createMuxer, 100, 10) })
|
|
22
|
+
it('100 streams with 100 msg', async () => { await spawn(createMuxer, 100, 100) })
|
|
23
|
+
it('1000 streams with 1 msg', async () => { await spawn(createMuxer, 1000, 1) })
|
|
24
|
+
it('1000 streams with 10 msg', async () => { await spawn(createMuxer, 1000, 10) })
|
|
25
|
+
it('1000 streams with 100 msg', async () => { await spawn(createMuxer, 1000, 100) })
|
|
100
26
|
})
|
|
101
27
|
}
|