@libp2p/interface-compliance-tests 1.1.8 → 1.1.12

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 (79) hide show
  1. package/dist/src/mocks/connection.d.ts +5 -3
  2. package/dist/src/mocks/connection.d.ts.map +1 -1
  3. package/dist/src/mocks/connection.js +21 -13
  4. package/dist/src/mocks/connection.js.map +1 -1
  5. package/dist/src/mocks/muxer.d.ts.map +1 -1
  6. package/dist/src/mocks/muxer.js +201 -131
  7. package/dist/src/mocks/muxer.js.map +1 -1
  8. package/dist/src/mocks/registrar.d.ts +5 -1
  9. package/dist/src/mocks/registrar.d.ts.map +1 -1
  10. package/dist/src/mocks/registrar.js +8 -10
  11. package/dist/src/mocks/registrar.js.map +1 -1
  12. package/dist/src/mocks/upgrader.d.ts +2 -2
  13. package/dist/src/mocks/upgrader.d.ts.map +1 -1
  14. package/dist/src/mocks/upgrader.js +2 -2
  15. package/dist/src/mocks/upgrader.js.map +1 -1
  16. package/dist/src/pubsub/api.d.ts +3 -2
  17. package/dist/src/pubsub/api.d.ts.map +1 -1
  18. package/dist/src/pubsub/api.js +8 -6
  19. package/dist/src/pubsub/api.js.map +1 -1
  20. package/dist/src/pubsub/connection-handlers.d.ts +3 -2
  21. package/dist/src/pubsub/connection-handlers.d.ts.map +1 -1
  22. package/dist/src/pubsub/connection-handlers.js +128 -34
  23. package/dist/src/pubsub/connection-handlers.js.map +1 -1
  24. package/dist/src/pubsub/emit-self.d.ts +3 -2
  25. package/dist/src/pubsub/emit-self.d.ts.map +1 -1
  26. package/dist/src/pubsub/emit-self.js +3 -2
  27. package/dist/src/pubsub/emit-self.js.map +1 -1
  28. package/dist/src/pubsub/index.d.ts +5 -2
  29. package/dist/src/pubsub/index.d.ts.map +1 -1
  30. package/dist/src/pubsub/index.js.map +1 -1
  31. package/dist/src/pubsub/messages.d.ts +3 -2
  32. package/dist/src/pubsub/messages.d.ts.map +1 -1
  33. package/dist/src/pubsub/messages.js +16 -17
  34. package/dist/src/pubsub/messages.js.map +1 -1
  35. package/dist/src/pubsub/multiple-nodes.d.ts +3 -2
  36. package/dist/src/pubsub/multiple-nodes.d.ts.map +1 -1
  37. package/dist/src/pubsub/multiple-nodes.js +89 -58
  38. package/dist/src/pubsub/multiple-nodes.js.map +1 -1
  39. package/dist/src/pubsub/two-nodes.d.ts +3 -2
  40. package/dist/src/pubsub/two-nodes.d.ts.map +1 -1
  41. package/dist/src/pubsub/two-nodes.js +74 -32
  42. package/dist/src/pubsub/two-nodes.js.map +1 -1
  43. package/dist/src/pubsub/utils.d.ts +3 -0
  44. package/dist/src/pubsub/utils.d.ts.map +1 -0
  45. package/dist/src/pubsub/utils.js +9 -0
  46. package/dist/src/pubsub/utils.js.map +1 -0
  47. package/dist/src/stream-muxer/base-test.d.ts.map +1 -1
  48. package/dist/src/stream-muxer/base-test.js +27 -21
  49. package/dist/src/stream-muxer/base-test.js.map +1 -1
  50. package/dist/src/stream-muxer/close-test.d.ts.map +1 -1
  51. package/dist/src/stream-muxer/close-test.js +25 -28
  52. package/dist/src/stream-muxer/close-test.js.map +1 -1
  53. package/dist/src/stream-muxer/spawner.d.ts.map +1 -1
  54. package/dist/src/stream-muxer/spawner.js +2 -3
  55. package/dist/src/stream-muxer/spawner.js.map +1 -1
  56. package/dist/src/transport/dial-test.d.ts.map +1 -1
  57. package/dist/src/transport/dial-test.js +16 -5
  58. package/dist/src/transport/dial-test.js.map +1 -1
  59. package/dist/src/transport/listen-test.d.ts.map +1 -1
  60. package/dist/src/transport/listen-test.js +13 -2
  61. package/dist/src/transport/listen-test.js.map +1 -1
  62. package/package.json +6 -2
  63. package/src/mocks/connection.ts +27 -15
  64. package/src/mocks/muxer.ts +271 -147
  65. package/src/mocks/registrar.ts +12 -10
  66. package/src/mocks/upgrader.ts +4 -4
  67. package/src/pubsub/api.ts +13 -9
  68. package/src/pubsub/connection-handlers.ts +148 -43
  69. package/src/pubsub/emit-self.ts +9 -7
  70. package/src/pubsub/index.ts +5 -2
  71. package/src/pubsub/messages.ts +24 -23
  72. package/src/pubsub/multiple-nodes.ts +104 -74
  73. package/src/pubsub/two-nodes.ts +87 -39
  74. package/src/pubsub/utils.ts +12 -0
  75. package/src/stream-muxer/base-test.ts +35 -24
  76. package/src/stream-muxer/close-test.ts +32 -29
  77. package/src/stream-muxer/spawner.ts +3 -6
  78. package/src/transport/dial-test.ts +23 -6
  79. package/src/transport/listen-test.ts +16 -2
@@ -27,10 +27,10 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
27
27
  const onStreamEndPromise: DeferredPromise<Stream> = defer()
28
28
 
29
29
  const listener = await common.setup({
30
- onStream: stream => {
30
+ onIncomingStream: (stream) => {
31
31
  onStreamPromise.resolve(stream)
32
32
  },
33
- onStreamEnd: stream => {
33
+ onStreamEnd: (stream) => {
34
34
  onStreamEndPromise.resolve(stream)
35
35
  }
36
36
  })
@@ -74,7 +74,7 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
74
74
  const p = duplexPair<Uint8Array>()
75
75
  const onStreamPromise: DeferredPromise<Stream> = defer()
76
76
  const dialer = await common.setup({
77
- onStream: stream => {
77
+ onIncomingStream: (stream: Stream) => {
78
78
  onStreamPromise.resolve(stream)
79
79
  }
80
80
  })
@@ -103,12 +103,13 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
103
103
  const onDialerStreamPromise: DeferredPromise<Stream> = defer()
104
104
  const onListenerStreamPromise: DeferredPromise<Stream> = defer()
105
105
  const dialer = await common.setup({
106
- onStream: stream => {
106
+ onIncomingStream: (stream) => {
107
107
  onDialerStreamPromise.resolve(stream)
108
108
  }
109
109
  })
110
+
110
111
  const listener = await common.setup({
111
- onStream: stream => {
112
+ onIncomingStream: (stream) => {
112
113
  onListenerStreamPromise.resolve(stream)
113
114
  }
114
115
  })
@@ -116,20 +117,20 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
116
117
  void pipe(p[0], dialer, p[0])
117
118
  void pipe(p[1], listener, p[1])
118
119
 
119
- const listenerConn = listener.newStream()
120
- const dialerConn = dialer.newStream()
121
-
122
- void drainAndClose(dialerConn)
123
- void drainAndClose(listenerConn)
120
+ const dialerInitiatorStream = dialer.newStream()
121
+ const listenerInitiatorStream = listener.newStream()
124
122
 
125
- const dialerStream = await onDialerStreamPromise.promise
126
- const listenerStream = await onListenerStreamPromise.promise
123
+ await Promise.all([
124
+ drainAndClose(dialerInitiatorStream),
125
+ drainAndClose(listenerInitiatorStream),
126
+ onDialerStreamPromise.promise.then(async stream => await drainAndClose(stream)),
127
+ onListenerStreamPromise.promise.then(async stream => await drainAndClose(stream))
128
+ ])
127
129
 
128
- await drainAndClose(dialerStream)
129
- await drainAndClose(listenerStream)
130
-
131
- await drainAndClose(dialer)
132
- await drainAndClose(listener)
130
+ await Promise.all([
131
+ drainAndClose(dialer),
132
+ drainAndClose(listener)
133
+ ])
133
134
  })
134
135
 
135
136
  it('Open a stream on one side, write, open a stream on the other side', async () => {
@@ -138,12 +139,12 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
138
139
  const onDialerStreamPromise: DeferredPromise<Stream> = defer()
139
140
  const onListenerStreamPromise: DeferredPromise<Stream> = defer()
140
141
  const dialer = await common.setup({
141
- onStream: stream => {
142
+ onIncomingStream: (stream) => {
142
143
  onDialerStreamPromise.resolve(stream)
143
144
  }
144
145
  })
145
146
  const listener = await common.setup({
146
- onStream: stream => {
147
+ onIncomingStream: (stream) => {
147
148
  onListenerStreamPromise.resolve(stream)
148
149
  }
149
150
  })
@@ -157,13 +158,23 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
157
158
  void pipe([uint8ArrayFromString('hey')], dialerConn)
158
159
  void pipe([uint8ArrayFromString('hello')], listenerConn)
159
160
 
160
- const listenerStream = await onListenerStreamPromise.promise
161
- const dialerStream = await onDialerStreamPromise.promise
161
+ const [
162
+ dialerStream,
163
+ listenerStream
164
+ ] = await Promise.all([
165
+ onDialerStreamPromise.promise,
166
+ onListenerStreamPromise.promise
167
+ ])
168
+
169
+ const [
170
+ listenerChunks,
171
+ dialerChunks
172
+ ] = await Promise.all([
173
+ pipe(listenerStream, toString, async (source) => await all(source)),
174
+ pipe(dialerStream, toString, async (source) => await all(source))
175
+ ])
162
176
 
163
- const listenerChunks = await pipe(listenerStream, toString, async (source) => await all(source))
164
177
  expect(listenerChunks).to.be.eql(['hey'])
165
-
166
- const dialerChunks = await pipe(dialerStream, toString, async (source) => await all(source))
167
178
  expect(dialerChunks).to.be.eql(['hello'])
168
179
  })
169
180
  })
@@ -1,16 +1,13 @@
1
1
  /* eslint max-nested-callbacks: ["error", 8] */
2
2
  import { pipe } from 'it-pipe'
3
3
  import { duplexPair } from 'it-pair/duplex'
4
- import { abortableSource, abortableDuplex } from 'abortable-iterator'
4
+ import { abortableSource } from 'abortable-iterator'
5
5
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
6
6
  import drain from 'it-drain'
7
- import { mockUpgrader } from '../mocks/upgrader.js'
8
- import { mockMultiaddrConnection } from '../mocks/multiaddr-connection.js'
9
7
  import { expect } from 'aegir/utils/chai.js'
10
8
  import delay from 'delay'
11
9
  import type { TestSetup } from '../index.js'
12
10
  import type { Muxer, MuxerOptions } from '@libp2p/interfaces/stream-muxer'
13
- import { createEd25519PeerId } from '@libp2p/peer-id-factory'
14
11
 
15
12
  function randomBuffer () {
16
13
  return uint8ArrayFromString(Math.random().toString())
@@ -28,38 +25,42 @@ const infiniteRandom = {
28
25
  export default (common: TestSetup<Muxer, MuxerOptions>) => {
29
26
  describe('close', () => {
30
27
  it('closing underlying socket closes streams', async () => {
31
- const localPeer = await createEd25519PeerId()
32
- const remotePeer = await createEd25519PeerId()
33
- const muxer = await common.setup({
34
- onStream: (stream) => {
35
- void pipe(stream, drain)
36
- }
37
- })
38
- const upgrader = mockUpgrader({ muxer })
28
+ let openedStreams = 0
29
+ const expectedStreams = 5
30
+ const dialer = await common.setup()
39
31
 
40
- const [local, remote] = duplexPair<Uint8Array>()
41
- const controller = new AbortController()
42
- const abortableRemote = abortableDuplex(remote, controller.signal, {
43
- returnOnAbort: true
32
+ // Listener is echo server :)
33
+ const listener = await common.setup({
34
+ onIncomingStream: (stream) => {
35
+ openedStreams++
36
+ void pipe(stream, stream)
37
+ }
44
38
  })
45
39
 
46
- await upgrader.upgradeInbound(mockMultiaddrConnection(abortableRemote, localPeer))
47
- const dialerConn = await upgrader.upgradeOutbound(mockMultiaddrConnection(local, remotePeer))
40
+ const p = duplexPair<Uint8Array>()
41
+ void pipe(p[0], dialer, p[0])
42
+ void pipe(p[1], listener, p[1])
48
43
 
49
- const s1 = await dialerConn.newStream([''])
50
- const s2 = await dialerConn.newStream([''])
44
+ const streams = Array(expectedStreams).fill(0).map(() => dialer.newStream())
51
45
 
52
- // close the remote in a bit
53
- setTimeout(() => controller.abort(), 50)
46
+ void Promise.all(
47
+ streams.map(async stream => {
48
+ return await pipe(
49
+ infiniteRandom,
50
+ stream,
51
+ drain
52
+ )
53
+ })
54
+ )
54
55
 
55
- const s1Result = pipe(infiniteRandom, s1.stream, drain)
56
- const s2Result = pipe(infiniteRandom, s2.stream, drain)
56
+ expect(dialer.streams).to.have.lengthOf(expectedStreams)
57
57
 
58
- // test is complete when all muxed streams have closed
59
- await s1Result
60
- await s2Result
58
+ // Pause, and then send some data and close the dialer
59
+ await delay(50)
60
+ await pipe([randomBuffer()], dialer, drain)
61
61
 
62
- expect(muxer.streams).to.be.empty()
62
+ expect(openedStreams).to.have.equal(expectedStreams)
63
+ expect(dialer.streams).to.have.lengthOf(0)
63
64
  })
64
65
 
65
66
  it('closing one of the muxed streams doesn\'t close others', async () => {
@@ -68,7 +69,9 @@ export default (common: TestSetup<Muxer, MuxerOptions>) => {
68
69
 
69
70
  // Listener is echo server :)
70
71
  const listener = await common.setup({
71
- onStream: async (stream) => await pipe(stream, stream)
72
+ onIncomingStream: (stream) => {
73
+ void pipe(stream, stream)
74
+ }
72
75
  })
73
76
 
74
77
  void pipe(p[0], dialer, p[0])
@@ -13,16 +13,13 @@ export default async (createMuxer: (options?: MuxerOptions) => Promise<Muxer>, n
13
13
  const msg = uint8ArrayFromString('simple msg')
14
14
 
15
15
  const listener = await createMuxer({
16
- onStream: async (stream) => {
17
- await pipe(
16
+ onIncomingStream: (stream) => {
17
+ void pipe(
18
18
  stream,
19
19
  drain
20
- )
21
-
22
- void pipe([], stream)
20
+ ).then(async () => await pipe([], stream))
23
21
  }
24
22
  })
25
-
26
23
  const dialer = await createMuxer()
27
24
 
28
25
  void pipe(listenerSocket, listener, listenerSocket)
@@ -1,26 +1,34 @@
1
1
  import { expect } from 'aegir/utils/chai.js'
2
2
  import { isValidTick } from '../utils/is-valid-tick.js'
3
3
  import { mockUpgrader } from '../mocks/upgrader.js'
4
- import { goodbye } from 'it-goodbye'
4
+ import { mockRegistrar } from '../mocks/registrar.js'
5
5
  import all from 'it-all'
6
6
  import { pipe } from 'it-pipe'
7
7
  import { AbortError } from '@libp2p/interfaces/errors'
8
8
  import sinon from 'sinon'
9
9
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
10
+ import drain from 'it-drain'
10
11
  import type { TestSetup } from '../index.js'
11
- import type { Transport, Listener } from '@libp2p/interfaces/transport'
12
+ import type { Transport, Listener, Upgrader } from '@libp2p/interfaces/transport'
12
13
  import type { TransportTestFixtures, SetupArgs, Connector } from './index.js'
13
14
  import type { Multiaddr } from '@multiformats/multiaddr'
15
+ import type { Registrar } from '@libp2p/interfaces/src/registrar'
14
16
 
15
17
  export default (common: TestSetup<TransportTestFixtures, SetupArgs>) => {
16
18
  describe('dial', () => {
17
- const upgrader = mockUpgrader()
19
+ let upgrader: Upgrader
20
+ let registrar: Registrar
18
21
  let addrs: Multiaddr[]
19
22
  let transport: Transport<any, any>
20
23
  let connector: Connector
21
24
  let listener: Listener
22
25
 
23
26
  before(async () => {
27
+ registrar = mockRegistrar()
28
+ upgrader = mockUpgrader({
29
+ registrar
30
+ });
31
+
24
32
  ({ addrs, transport, connector } = await common.setup({ upgrader }))
25
33
  })
26
34
 
@@ -40,12 +48,21 @@ export default (common: TestSetup<TransportTestFixtures, SetupArgs>) => {
40
48
  })
41
49
 
42
50
  it('simple', async () => {
51
+ const protocol = '/hello/1.0.0'
52
+ void registrar.handle(protocol, (evt) => {
53
+ void pipe([
54
+ uint8ArrayFromString('hey')
55
+ ],
56
+ evt.detail.stream,
57
+ drain
58
+ )
59
+ })
60
+
43
61
  const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
44
62
  const conn = await transport.dial(addrs[0])
45
- const { stream } = await conn.newStream(['/hello'])
46
- const s = goodbye({ source: [uint8ArrayFromString('hey')], sink: async (source) => await all(source) })
47
63
 
48
- const result = await pipe(s, stream, s)
64
+ const { stream } = await conn.newStream([protocol])
65
+ const result = await all(stream.source)
49
66
 
50
67
  expect(upgradeSpy.callCount).to.equal(1)
51
68
  await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
@@ -13,14 +13,23 @@ import type { Transport } from '@libp2p/interfaces/transport'
13
13
  import type { TransportTestFixtures, SetupArgs } from './index.js'
14
14
  import type { Multiaddr } from '@multiformats/multiaddr'
15
15
  import type { Connection } from '@libp2p/interfaces/connection'
16
+ import type { Registrar } from '@libp2p/interfaces/src/registrar'
17
+ import { mockRegistrar } from '../mocks/registrar.js'
18
+ import drain from 'it-drain'
16
19
 
17
20
  export default (common: TestSetup<TransportTestFixtures, SetupArgs>) => {
18
21
  describe('listen', () => {
19
- const upgrader = mockUpgrader()
22
+ let upgrader = mockUpgrader()
20
23
  let addrs: Multiaddr[]
21
24
  let transport: Transport
25
+ let registrar: Registrar
22
26
 
23
27
  before(async () => {
28
+ registrar = mockRegistrar()
29
+ upgrader = mockUpgrader({
30
+ registrar
31
+ });
32
+
24
33
  ({ transport, addrs } = await common.setup({ upgrader }))
25
34
  })
26
35
 
@@ -42,6 +51,11 @@ export default (common: TestSetup<TransportTestFixtures, SetupArgs>) => {
42
51
  const upgradeSpy = sinon.spy(upgrader, 'upgradeInbound')
43
52
  const listenerConns: Connection[] = []
44
53
 
54
+ const protocol = '/test/protocol'
55
+ void registrar.handle(protocol, (evt) => {
56
+ void drain(evt.detail.stream.source)
57
+ })
58
+
45
59
  const listener = transport.createListener({
46
60
  handler: (conn) => {
47
61
  listenerConns.push(conn)
@@ -60,7 +74,7 @@ export default (common: TestSetup<TransportTestFixtures, SetupArgs>) => {
60
74
  // Give the listener a chance to finish its upgrade
61
75
  await pWaitFor(() => listenerConns.length === 2)
62
76
 
63
- const { stream: stream1 } = await conn1.newStream(['/test/protocol'])
77
+ const { stream: stream1 } = await conn1.newStream([protocol])
64
78
 
65
79
  // Wait for the data send and close to finish
66
80
  await Promise.all([