@libp2p/interface-compliance-tests 3.0.7 → 4.0.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.
- package/README.md +12 -3
- 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 +150 -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 +19 -0
- package/dist/src/connection-encryption/utils/index.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/is-valid-tick.d.ts.map +1 -1
- package/dist/src/is-valid-tick.js.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 +29 -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 +167 -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 +60 -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 +213 -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/pubsub/api.d.ts +6 -0
- package/dist/src/pubsub/api.d.ts.map +1 -0
- package/dist/src/pubsub/api.js +87 -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 +217 -0
- package/dist/src/pubsub/two-nodes.js.map +1 -0
- package/dist/src/pubsub/utils.d.ts +6 -0
- package/dist/src/pubsub/utils.d.ts.map +1 -0
- package/dist/src/pubsub/utils.js +22 -0
- package/dist/src/pubsub/utils.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 +357 -0
- package/dist/src/stream-muxer/close-test.js.map +1 -0
- package/dist/src/stream-muxer/fixtures/pb/message.d.ts +13 -0
- package/dist/src/stream-muxer/fixtures/pb/message.d.ts.map +1 -0
- package/dist/src/stream-muxer/fixtures/pb/message.js +67 -0
- package/dist/src/stream-muxer/fixtures/pb/message.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 +37 -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 +74 -97
- package/src/connection/index.ts +182 -0
- package/src/connection-encryption/index.ts +97 -0
- package/src/connection-encryption/utils/index.ts +24 -0
- package/src/index.ts +0 -1
- package/src/is-valid-tick.ts +0 -1
- package/src/mocks/connection-encrypter.ts +113 -0
- package/src/mocks/connection-gater.ts +18 -0
- package/src/mocks/connection-manager.ts +211 -0
- package/src/mocks/connection.ts +226 -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 +76 -0
- package/src/mocks/muxer.ts +303 -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/pubsub/api.ts +114 -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 +273 -0
- package/src/pubsub/utils.ts +29 -0
- package/src/stream-muxer/base-test.ts +196 -0
- package/src/stream-muxer/close-test.ts +442 -0
- package/src/stream-muxer/fixtures/pb/message.proto +7 -0
- package/src/stream-muxer/fixtures/pb/message.ts +87 -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 +55 -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,87 @@
|
|
|
1
|
+
/* eslint-disable import/export */
|
|
2
|
+
/* eslint-disable complexity */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-namespace */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
6
|
+
|
|
7
|
+
import { encodeMessage, decodeMessage, message } from 'protons-runtime'
|
|
8
|
+
import type { Codec } from 'protons-runtime'
|
|
9
|
+
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
10
|
+
|
|
11
|
+
export interface Message {
|
|
12
|
+
message: string
|
|
13
|
+
value: number
|
|
14
|
+
flag: boolean
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export namespace Message {
|
|
18
|
+
let _codec: Codec<Message>
|
|
19
|
+
|
|
20
|
+
export const codec = (): Codec<Message> => {
|
|
21
|
+
if (_codec == null) {
|
|
22
|
+
_codec = message<Message>((obj, w, opts = {}) => {
|
|
23
|
+
if (opts.lengthDelimited !== false) {
|
|
24
|
+
w.fork()
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if ((obj.message != null && obj.message !== '')) {
|
|
28
|
+
w.uint32(10)
|
|
29
|
+
w.string(obj.message)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if ((obj.value != null && obj.value !== 0)) {
|
|
33
|
+
w.uint32(16)
|
|
34
|
+
w.uint32(obj.value)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if ((obj.flag != null && obj.flag !== false)) {
|
|
38
|
+
w.uint32(24)
|
|
39
|
+
w.bool(obj.flag)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (opts.lengthDelimited !== false) {
|
|
43
|
+
w.ldelim()
|
|
44
|
+
}
|
|
45
|
+
}, (reader, length) => {
|
|
46
|
+
const obj: any = {
|
|
47
|
+
message: '',
|
|
48
|
+
value: 0,
|
|
49
|
+
flag: false
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const end = length == null ? reader.len : reader.pos + length
|
|
53
|
+
|
|
54
|
+
while (reader.pos < end) {
|
|
55
|
+
const tag = reader.uint32()
|
|
56
|
+
|
|
57
|
+
switch (tag >>> 3) {
|
|
58
|
+
case 1:
|
|
59
|
+
obj.message = reader.string()
|
|
60
|
+
break
|
|
61
|
+
case 2:
|
|
62
|
+
obj.value = reader.uint32()
|
|
63
|
+
break
|
|
64
|
+
case 3:
|
|
65
|
+
obj.flag = reader.bool()
|
|
66
|
+
break
|
|
67
|
+
default:
|
|
68
|
+
reader.skipType(tag & 7)
|
|
69
|
+
break
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return obj
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return _codec
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const encode = (obj: Partial<Message>): Uint8Array => {
|
|
81
|
+
return encodeMessage(obj, Message.codec())
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export const decode = (buf: Uint8Array | Uint8ArrayList): Message => {
|
|
85
|
+
return decodeMessage(buf, Message.codec())
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
import type { TestSetup } from '../index.js'
|
|
6
|
+
import type { StreamMuxerFactory } from '@libp2p/interface/stream-muxer'
|
|
7
|
+
|
|
8
|
+
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
9
|
+
describe('interface-stream-muxer', () => {
|
|
10
|
+
baseTest(common)
|
|
11
|
+
closeTest(common)
|
|
12
|
+
stressTest(common)
|
|
13
|
+
megaStressTest(common)
|
|
14
|
+
})
|
|
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/stream-muxer'
|
|
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,55 @@
|
|
|
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/stream-muxer'
|
|
10
|
+
|
|
11
|
+
export default async (createMuxer: (init?: StreamMuxerInit) => Promise<StreamMuxer>, nStreams: number, nMsg: number, limit?: number): Promise<void> => {
|
|
12
|
+
const [dialerSocket, listenerSocket] = duplexPair<Uint8Array>()
|
|
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({ direction: 'outbound' })
|
|
29
|
+
|
|
30
|
+
void pipe(listenerSocket, listener, listenerSocket)
|
|
31
|
+
void pipe(dialerSocket, dialer, dialerSocket)
|
|
32
|
+
|
|
33
|
+
const spawnStream = async (): Promise<void> => {
|
|
34
|
+
const stream = await dialer.newStream()
|
|
35
|
+
expect(stream).to.exist // eslint-disable-line
|
|
36
|
+
|
|
37
|
+
const res = await pipe(
|
|
38
|
+
(async function * () {
|
|
39
|
+
for (let i = 0; i < nMsg; i++) {
|
|
40
|
+
yield msg
|
|
41
|
+
}
|
|
42
|
+
}()),
|
|
43
|
+
stream,
|
|
44
|
+
async (source) => all(source)
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
expect(res).to.be.eql([])
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const limiter = pLimit(limit ?? Infinity)
|
|
51
|
+
|
|
52
|
+
await Promise.all(
|
|
53
|
+
Array.from(Array(nStreams), async () => { await limiter(async () => { await spawnStream() }) })
|
|
54
|
+
)
|
|
55
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import spawn from './spawner.js'
|
|
2
|
+
import type { TestSetup } from '../index.js'
|
|
3
|
+
import type { StreamMuxerFactory, StreamMuxerInit, StreamMuxer } from '@libp2p/interface/stream-muxer'
|
|
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('stress test', function () {
|
|
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) })
|
|
26
|
+
})
|
|
27
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
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
|
+
import type { TransportTestFixtures, Connector } from './index.js'
|
|
12
|
+
import type { TestSetup } from '../index.js'
|
|
13
|
+
import type { Listener, Transport, Upgrader } from '@libp2p/interface/transport'
|
|
14
|
+
import type { Registrar } from '@libp2p/interface-internal/registrar'
|
|
15
|
+
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
16
|
+
|
|
17
|
+
export default (common: TestSetup<TransportTestFixtures>): void => {
|
|
18
|
+
describe('dial', () => {
|
|
19
|
+
let upgrader: Upgrader
|
|
20
|
+
let registrar: Registrar
|
|
21
|
+
let addrs: Multiaddr[]
|
|
22
|
+
let transport: Transport
|
|
23
|
+
let connector: Connector
|
|
24
|
+
let listener: Listener
|
|
25
|
+
|
|
26
|
+
before(async () => {
|
|
27
|
+
registrar = mockRegistrar()
|
|
28
|
+
upgrader = mockUpgrader({
|
|
29
|
+
registrar,
|
|
30
|
+
events: new EventEmitter()
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
({ addrs, transport, connector } = await common.setup())
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
after(async () => {
|
|
37
|
+
await common.teardown()
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
beforeEach(async () => {
|
|
41
|
+
listener = transport.createListener({
|
|
42
|
+
upgrader
|
|
43
|
+
})
|
|
44
|
+
await listener.listen(addrs[0])
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
afterEach(async () => {
|
|
48
|
+
sinon.restore()
|
|
49
|
+
connector.restore()
|
|
50
|
+
await listener.close()
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('simple', async () => {
|
|
54
|
+
const protocol = '/hello/1.0.0'
|
|
55
|
+
void registrar.handle(protocol, (data) => {
|
|
56
|
+
void pipe([
|
|
57
|
+
uint8ArrayFromString('hey')
|
|
58
|
+
],
|
|
59
|
+
data.stream,
|
|
60
|
+
drain
|
|
61
|
+
)
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
|
|
65
|
+
const conn = await transport.dial(addrs[0], {
|
|
66
|
+
upgrader
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
const stream = await conn.newStream([protocol])
|
|
70
|
+
const result = await all(stream.source)
|
|
71
|
+
|
|
72
|
+
expect(upgradeSpy.callCount).to.equal(1)
|
|
73
|
+
await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
|
|
74
|
+
expect(result.length).to.equal(1)
|
|
75
|
+
expect(result[0].subarray()).to.equalBytes(uint8ArrayFromString('hey'))
|
|
76
|
+
await conn.close()
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('can close connections', async () => {
|
|
80
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
|
|
81
|
+
const conn = await transport.dial(addrs[0], {
|
|
82
|
+
upgrader
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
expect(upgradeSpy.callCount).to.equal(1)
|
|
86
|
+
await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
|
|
87
|
+
await conn.close()
|
|
88
|
+
expect(isValidTick(conn.timeline.close)).to.equal(true)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('to non existent listener', async () => {
|
|
92
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
|
|
93
|
+
|
|
94
|
+
await expect(transport.dial(addrs[1], {
|
|
95
|
+
upgrader
|
|
96
|
+
})).to.eventually.be.rejected()
|
|
97
|
+
expect(upgradeSpy.callCount).to.equal(0)
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('abort before dialing throws AbortError', async () => {
|
|
101
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
|
|
102
|
+
const controller = new AbortController()
|
|
103
|
+
controller.abort()
|
|
104
|
+
const conn = transport.dial(addrs[0], { signal: controller.signal, upgrader })
|
|
105
|
+
|
|
106
|
+
await expect(conn).to.eventually.be.rejected().with.property('code', AbortError.code)
|
|
107
|
+
expect(upgradeSpy.callCount).to.equal(0)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
it('abort while dialing throws AbortError', async () => {
|
|
111
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
|
|
112
|
+
// Add a delay to connect() so that we can abort while the dial is in
|
|
113
|
+
// progress
|
|
114
|
+
connector.delay(100)
|
|
115
|
+
|
|
116
|
+
const controller = new AbortController()
|
|
117
|
+
const conn = transport.dial(addrs[0], { signal: controller.signal, upgrader })
|
|
118
|
+
setTimeout(() => { controller.abort() }, 50)
|
|
119
|
+
|
|
120
|
+
await expect(conn).to.eventually.be.rejected().with.property('code', AbortError.code)
|
|
121
|
+
expect(upgradeSpy.callCount).to.equal(0)
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { expect } from 'aegir/chai'
|
|
2
|
+
import type { TransportTestFixtures } from './index.js'
|
|
3
|
+
import type { TestSetup } from '../index.js'
|
|
4
|
+
import type { Transport } from '@libp2p/interface/transport'
|
|
5
|
+
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
6
|
+
|
|
7
|
+
export default (common: TestSetup<TransportTestFixtures>): void => {
|
|
8
|
+
describe('filter', () => {
|
|
9
|
+
let addrs: Multiaddr[]
|
|
10
|
+
let transport: Transport
|
|
11
|
+
|
|
12
|
+
before(async () => {
|
|
13
|
+
({ addrs, transport } = await common.setup())
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
after(async () => {
|
|
17
|
+
await common.teardown()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('filters addresses', () => {
|
|
21
|
+
const filteredAddrs = transport.filter(addrs)
|
|
22
|
+
expect(filteredAddrs).to.eql(addrs)
|
|
23
|
+
})
|
|
24
|
+
})
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import dial from './dial-test.js'
|
|
2
|
+
import filter from './filter-test.js'
|
|
3
|
+
import listen from './listen-test.js'
|
|
4
|
+
import type { TestSetup } from '../index.js'
|
|
5
|
+
import type { Transport } from '@libp2p/interface/transport'
|
|
6
|
+
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
7
|
+
|
|
8
|
+
export interface Connector {
|
|
9
|
+
delay: (ms: number) => void
|
|
10
|
+
restore: () => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface TransportTestFixtures {
|
|
14
|
+
addrs: Multiaddr[]
|
|
15
|
+
transport: Transport
|
|
16
|
+
connector: Connector
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default (common: TestSetup<TransportTestFixtures>): void => {
|
|
20
|
+
describe('interface-transport', () => {
|
|
21
|
+
dial(common)
|
|
22
|
+
listen(common)
|
|
23
|
+
filter(common)
|
|
24
|
+
})
|
|
25
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/* eslint max-nested-callbacks: ["error", 8] */
|
|
2
|
+
import { CustomEvent, EventEmitter } from '@libp2p/interface/events'
|
|
3
|
+
import { expect } from 'aegir/chai'
|
|
4
|
+
import drain from 'it-drain'
|
|
5
|
+
import { pipe } from 'it-pipe'
|
|
6
|
+
import defer from 'p-defer'
|
|
7
|
+
import pWaitFor from 'p-wait-for'
|
|
8
|
+
import sinon from 'sinon'
|
|
9
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
10
|
+
import { isValidTick } from '../is-valid-tick.js'
|
|
11
|
+
import { mockUpgrader, mockRegistrar } from '../mocks/index.js'
|
|
12
|
+
import type { TransportTestFixtures } from './index.js'
|
|
13
|
+
import type { TestSetup } from '../index.js'
|
|
14
|
+
import type { Connection } from '@libp2p/interface/connection'
|
|
15
|
+
import type { Transport, Upgrader } from '@libp2p/interface/transport'
|
|
16
|
+
import type { Registrar } from '@libp2p/interface-internal/registrar'
|
|
17
|
+
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
18
|
+
|
|
19
|
+
export default (common: TestSetup<TransportTestFixtures>): void => {
|
|
20
|
+
describe('listen', () => {
|
|
21
|
+
let upgrader: Upgrader
|
|
22
|
+
let addrs: Multiaddr[]
|
|
23
|
+
let transport: Transport
|
|
24
|
+
let registrar: Registrar
|
|
25
|
+
|
|
26
|
+
before(async () => {
|
|
27
|
+
registrar = mockRegistrar()
|
|
28
|
+
upgrader = mockUpgrader({
|
|
29
|
+
registrar,
|
|
30
|
+
events: new EventEmitter()
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
({ transport, addrs } = await common.setup())
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
after(async () => {
|
|
37
|
+
await common.teardown()
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
sinon.restore()
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('simple', async () => {
|
|
45
|
+
const listener = transport.createListener({
|
|
46
|
+
upgrader
|
|
47
|
+
})
|
|
48
|
+
await listener.listen(addrs[0])
|
|
49
|
+
await listener.close()
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('close listener with connections, through timeout', async () => {
|
|
53
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeInbound')
|
|
54
|
+
const listenerConns: Connection[] = []
|
|
55
|
+
|
|
56
|
+
const protocol = '/test/protocol'
|
|
57
|
+
void registrar.handle(protocol, (data) => {
|
|
58
|
+
void drain(data.stream.source)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
const listener = transport.createListener({
|
|
62
|
+
upgrader,
|
|
63
|
+
handler: (conn) => {
|
|
64
|
+
listenerConns.push(conn)
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// Listen
|
|
69
|
+
await listener.listen(addrs[0])
|
|
70
|
+
|
|
71
|
+
// Create two connections to the listener
|
|
72
|
+
const [conn1] = await Promise.all([
|
|
73
|
+
transport.dial(addrs[0], {
|
|
74
|
+
upgrader
|
|
75
|
+
}),
|
|
76
|
+
transport.dial(addrs[0], {
|
|
77
|
+
upgrader
|
|
78
|
+
})
|
|
79
|
+
])
|
|
80
|
+
|
|
81
|
+
// Give the listener a chance to finish its upgrade
|
|
82
|
+
await pWaitFor(() => listenerConns.length === 2)
|
|
83
|
+
|
|
84
|
+
const stream1 = await conn1.newStream([protocol])
|
|
85
|
+
|
|
86
|
+
// Wait for the data send and close to finish
|
|
87
|
+
await Promise.all([
|
|
88
|
+
pipe(
|
|
89
|
+
[uint8ArrayFromString('Some data that is never handled')],
|
|
90
|
+
stream1
|
|
91
|
+
),
|
|
92
|
+
// Closer the listener (will take a couple of seconds to time out)
|
|
93
|
+
listener.close()
|
|
94
|
+
])
|
|
95
|
+
|
|
96
|
+
await stream1.close()
|
|
97
|
+
await conn1.close()
|
|
98
|
+
|
|
99
|
+
expect(isValidTick(conn1.timeline.close)).to.equal(true)
|
|
100
|
+
listenerConns.forEach(conn => {
|
|
101
|
+
expect(isValidTick(conn.timeline.close)).to.equal(true)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
// 2 dials = 2 connections upgraded
|
|
105
|
+
expect(upgradeSpy.callCount).to.equal(2)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('should not handle connection if upgradeInbound throws', async () => {
|
|
109
|
+
sinon.stub(upgrader, 'upgradeInbound').throws()
|
|
110
|
+
|
|
111
|
+
const listener = transport.createListener({
|
|
112
|
+
upgrader
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
// Listen
|
|
116
|
+
await listener.listen(addrs[0])
|
|
117
|
+
|
|
118
|
+
// Create a connection to the listener
|
|
119
|
+
const conn = await transport.dial(addrs[0], {
|
|
120
|
+
upgrader
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
await pWaitFor(() => typeof conn.timeline.close === 'number')
|
|
124
|
+
await listener.close()
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
describe('events', () => {
|
|
128
|
+
it('connection', async () => {
|
|
129
|
+
const upgradeSpy = sinon.spy(upgrader, 'upgradeInbound')
|
|
130
|
+
const listener = transport.createListener({
|
|
131
|
+
upgrader
|
|
132
|
+
})
|
|
133
|
+
const deferred = defer()
|
|
134
|
+
let conn
|
|
135
|
+
|
|
136
|
+
listener.addEventListener('connection', (evt) => {
|
|
137
|
+
conn = evt.detail
|
|
138
|
+
deferred.resolve()
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
void (async () => {
|
|
142
|
+
await listener.listen(addrs[0])
|
|
143
|
+
await transport.dial(addrs[0], {
|
|
144
|
+
upgrader
|
|
145
|
+
})
|
|
146
|
+
})()
|
|
147
|
+
|
|
148
|
+
await deferred.promise
|
|
149
|
+
|
|
150
|
+
await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
|
|
151
|
+
expect(upgradeSpy.callCount).to.equal(1)
|
|
152
|
+
await listener.close()
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
it('listening', (done) => {
|
|
156
|
+
const listener = transport.createListener({
|
|
157
|
+
upgrader
|
|
158
|
+
})
|
|
159
|
+
listener.addEventListener('listening', () => {
|
|
160
|
+
listener.close().then(done, done)
|
|
161
|
+
})
|
|
162
|
+
void listener.listen(addrs[0])
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
it('error', (done) => {
|
|
166
|
+
const listener = transport.createListener({
|
|
167
|
+
upgrader
|
|
168
|
+
})
|
|
169
|
+
listener.addEventListener('error', (evt) => {
|
|
170
|
+
expect(evt.detail).to.be.an.instanceOf(Error)
|
|
171
|
+
listener.close().then(done, done)
|
|
172
|
+
})
|
|
173
|
+
listener.dispatchEvent(new CustomEvent('error', {
|
|
174
|
+
detail: new Error('my err')
|
|
175
|
+
}))
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
it('close', (done) => {
|
|
179
|
+
const listener = transport.createListener({
|
|
180
|
+
upgrader
|
|
181
|
+
})
|
|
182
|
+
listener.addEventListener('close', () => { done() })
|
|
183
|
+
|
|
184
|
+
void (async () => {
|
|
185
|
+
await listener.listen(addrs[0])
|
|
186
|
+
await listener.close()
|
|
187
|
+
})()
|
|
188
|
+
})
|
|
189
|
+
})
|
|
190
|
+
})
|
|
191
|
+
}
|
package/dist/typedoc-urls.json
DELETED