@libp2p/interface-compliance-tests 4.1.5 → 5.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 +1 -1
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/index.js.map +1 -1
- package/dist/src/connection-encryption/index.d.ts +1 -1
- package/dist/src/connection-encryption/index.d.ts.map +1 -1
- package/dist/src/connection-encryption/index.js +4 -2
- package/dist/src/connection-encryption/index.js.map +1 -1
- package/dist/src/connection-encryption/utils/index.d.ts +1 -1
- package/dist/src/connection-encryption/utils/index.d.ts.map +1 -1
- package/dist/src/connection-encryption/utils/index.js +3 -1
- package/dist/src/connection-encryption/utils/index.js.map +1 -1
- package/dist/src/is-valid-tick.js.map +1 -1
- package/dist/src/mocks/connection-gater.d.ts +1 -1
- package/dist/src/mocks/connection-gater.d.ts.map +1 -1
- package/dist/src/mocks/connection-manager.d.ts +3 -6
- package/dist/src/mocks/connection-manager.d.ts.map +1 -1
- package/dist/src/mocks/connection-manager.js +2 -2
- package/dist/src/mocks/connection-manager.js.map +1 -1
- package/dist/src/mocks/connection.d.ts +3 -4
- package/dist/src/mocks/connection.d.ts.map +1 -1
- package/dist/src/mocks/connection.js +57 -13
- package/dist/src/mocks/connection.js.map +1 -1
- package/dist/src/mocks/duplex.d.ts +2 -1
- package/dist/src/mocks/duplex.d.ts.map +1 -1
- package/dist/src/mocks/duplex.js.map +1 -1
- package/dist/src/mocks/index.d.ts +0 -1
- package/dist/src/mocks/index.d.ts.map +1 -1
- package/dist/src/mocks/index.js +0 -1
- package/dist/src/mocks/index.js.map +1 -1
- package/dist/src/mocks/metrics.d.ts +1 -1
- package/dist/src/mocks/metrics.d.ts.map +1 -1
- package/dist/src/mocks/metrics.js.map +1 -1
- package/dist/src/mocks/multiaddr-connection.d.ts +3 -3
- package/dist/src/mocks/multiaddr-connection.d.ts.map +1 -1
- package/dist/src/mocks/multiaddr-connection.js +6 -2
- package/dist/src/mocks/multiaddr-connection.js.map +1 -1
- package/dist/src/mocks/muxer.d.ts +2 -3
- package/dist/src/mocks/muxer.d.ts.map +1 -1
- package/dist/src/mocks/muxer.js +17 -5
- package/dist/src/mocks/muxer.js.map +1 -1
- package/dist/src/mocks/peer-discovery.d.ts +3 -4
- package/dist/src/mocks/peer-discovery.d.ts.map +1 -1
- package/dist/src/mocks/peer-discovery.js +3 -5
- package/dist/src/mocks/peer-discovery.js.map +1 -1
- package/dist/src/mocks/registrar.d.ts +2 -4
- package/dist/src/mocks/registrar.d.ts.map +1 -1
- package/dist/src/mocks/registrar.js.map +1 -1
- package/dist/src/mocks/upgrader.d.ts +2 -4
- package/dist/src/mocks/upgrader.d.ts.map +1 -1
- package/dist/src/mocks/upgrader.js.map +1 -1
- package/dist/src/peer-discovery/index.d.ts +1 -1
- package/dist/src/peer-discovery/index.d.ts.map +1 -1
- package/dist/src/peer-discovery/index.js +1 -1
- package/dist/src/peer-discovery/index.js.map +1 -1
- package/dist/src/pubsub/api.d.ts +1 -1
- package/dist/src/pubsub/api.d.ts.map +1 -1
- package/dist/src/pubsub/api.js +1 -3
- package/dist/src/pubsub/api.js.map +1 -1
- package/dist/src/pubsub/connection-handlers.d.ts +1 -1
- package/dist/src/pubsub/connection-handlers.d.ts.map +1 -1
- package/dist/src/pubsub/connection-handlers.js +1 -1
- package/dist/src/pubsub/connection-handlers.js.map +1 -1
- package/dist/src/pubsub/emit-self.d.ts +1 -1
- package/dist/src/pubsub/emit-self.d.ts.map +1 -1
- package/dist/src/pubsub/emit-self.js +1 -1
- package/dist/src/pubsub/emit-self.js.map +1 -1
- package/dist/src/pubsub/index.d.ts +3 -4
- package/dist/src/pubsub/index.d.ts.map +1 -1
- package/dist/src/pubsub/index.js.map +1 -1
- package/dist/src/pubsub/messages.d.ts +1 -1
- package/dist/src/pubsub/messages.d.ts.map +1 -1
- package/dist/src/pubsub/messages.js +1 -1
- package/dist/src/pubsub/messages.js.map +1 -1
- package/dist/src/pubsub/multiple-nodes.d.ts +1 -1
- package/dist/src/pubsub/multiple-nodes.d.ts.map +1 -1
- package/dist/src/pubsub/multiple-nodes.js +1 -1
- package/dist/src/pubsub/multiple-nodes.js.map +1 -1
- package/dist/src/pubsub/two-nodes.d.ts +1 -1
- package/dist/src/pubsub/two-nodes.d.ts.map +1 -1
- package/dist/src/pubsub/two-nodes.js +4 -5
- package/dist/src/pubsub/two-nodes.js.map +1 -1
- package/dist/src/pubsub/utils.d.ts +1 -2
- package/dist/src/pubsub/utils.d.ts.map +1 -1
- package/dist/src/pubsub/utils.js +4 -2
- package/dist/src/pubsub/utils.js.map +1 -1
- package/dist/src/stream-muxer/base-test.d.ts +1 -1
- package/dist/src/stream-muxer/base-test.d.ts.map +1 -1
- package/dist/src/stream-muxer/base-test.js.map +1 -1
- package/dist/src/stream-muxer/close-test.d.ts +1 -1
- package/dist/src/stream-muxer/close-test.d.ts.map +1 -1
- package/dist/src/stream-muxer/close-test.js +44 -13
- package/dist/src/stream-muxer/close-test.js.map +1 -1
- package/dist/src/stream-muxer/fixtures/pb/message.js.map +1 -1
- package/dist/src/stream-muxer/index.d.ts +1 -1
- package/dist/src/stream-muxer/index.d.ts.map +1 -1
- package/dist/src/stream-muxer/mega-stress-test.d.ts +1 -1
- package/dist/src/stream-muxer/mega-stress-test.d.ts.map +1 -1
- package/dist/src/stream-muxer/spawner.d.ts +1 -1
- package/dist/src/stream-muxer/spawner.d.ts.map +1 -1
- package/dist/src/stream-muxer/spawner.js.map +1 -1
- package/dist/src/stream-muxer/stress-test.d.ts +1 -1
- package/dist/src/stream-muxer/stress-test.d.ts.map +1 -1
- package/dist/src/transport/dial-test.d.ts.map +1 -1
- package/dist/src/transport/dial-test.js +1 -2
- package/dist/src/transport/dial-test.js.map +1 -1
- package/dist/src/transport/index.d.ts +1 -1
- package/dist/src/transport/index.d.ts.map +1 -1
- package/dist/src/transport/listen-test.d.ts.map +1 -1
- package/dist/src/transport/listen-test.js +1 -1
- package/dist/src/transport/listen-test.js.map +1 -1
- package/dist/typedoc-urls.json +0 -1
- package/package.json +15 -15
- package/src/connection/index.ts +1 -1
- package/src/connection-encryption/index.ts +5 -4
- package/src/connection-encryption/utils/index.ts +7 -4
- package/src/mocks/connection-gater.ts +1 -1
- package/src/mocks/connection-manager.ts +4 -9
- package/src/mocks/connection.ts +67 -20
- package/src/mocks/duplex.ts +2 -1
- package/src/mocks/index.ts +0 -1
- package/src/mocks/metrics.ts +1 -2
- package/src/mocks/multiaddr-connection.ts +10 -6
- package/src/mocks/muxer.ts +21 -10
- package/src/mocks/peer-discovery.ts +4 -7
- package/src/mocks/registrar.ts +2 -4
- package/src/mocks/upgrader.ts +2 -5
- package/src/peer-discovery/index.ts +2 -2
- package/src/pubsub/api.ts +2 -4
- package/src/pubsub/connection-handlers.ts +2 -2
- package/src/pubsub/emit-self.ts +2 -2
- package/src/pubsub/index.ts +3 -4
- package/src/pubsub/messages.ts +2 -2
- package/src/pubsub/multiple-nodes.ts +2 -2
- package/src/pubsub/two-nodes.ts +5 -6
- package/src/pubsub/utils.ts +5 -4
- package/src/stream-muxer/base-test.ts +5 -6
- package/src/stream-muxer/close-test.ts +57 -19
- package/src/stream-muxer/index.ts +1 -1
- package/src/stream-muxer/mega-stress-test.ts +1 -1
- package/src/stream-muxer/spawner.ts +2 -2
- package/src/stream-muxer/stress-test.ts +1 -1
- package/src/transport/dial-test.ts +3 -4
- package/src/transport/filter-test.ts +1 -1
- package/src/transport/index.ts +1 -1
- package/src/transport/listen-test.ts +3 -4
- package/dist/src/mocks/connection-encrypter.d.ts +0 -3
- package/dist/src/mocks/connection-encrypter.d.ts.map +0 -1
- package/dist/src/mocks/connection-encrypter.js +0 -98
- package/dist/src/mocks/connection-encrypter.js.map +0 -1
- package/src/mocks/connection-encrypter.ts +0 -113
package/src/pubsub/emit-self.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { start, stop } from '@libp2p/interface
|
|
1
|
+
import { start, stop } from '@libp2p/interface'
|
|
2
2
|
import { expect } from 'aegir/chai'
|
|
3
3
|
import sinon from 'sinon'
|
|
4
4
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
@@ -6,7 +6,7 @@ import { mockNetwork } from '../mocks/index.js'
|
|
|
6
6
|
import { createComponents } from './utils.js'
|
|
7
7
|
import type { PubSubArgs, PubSubComponents } from './index.js'
|
|
8
8
|
import type { TestSetup } from '../index.js'
|
|
9
|
-
import type { PubSub } from '@libp2p/interface
|
|
9
|
+
import type { PubSub } from '@libp2p/interface'
|
|
10
10
|
|
|
11
11
|
const topic = 'foo'
|
|
12
12
|
const data = uint8ArrayFromString('bar')
|
package/src/pubsub/index.ts
CHANGED
|
@@ -5,16 +5,15 @@ import messagesTest from './messages.js'
|
|
|
5
5
|
import multipleNodesTest from './multiple-nodes.js'
|
|
6
6
|
import twoNodesTest from './two-nodes.js'
|
|
7
7
|
import type { TestSetup } from '../index.js'
|
|
8
|
-
import type { PeerId } from '@libp2p/interface
|
|
9
|
-
import type {
|
|
10
|
-
import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
|
|
11
|
-
import type { Registrar } from '@libp2p/interface-internal/registrar'
|
|
8
|
+
import type { ComponentLogger, PeerId, PubSub, PubSubInit } from '@libp2p/interface'
|
|
9
|
+
import type { ConnectionManager, Registrar } from '@libp2p/interface-internal'
|
|
12
10
|
|
|
13
11
|
export interface PubSubComponents {
|
|
14
12
|
peerId: PeerId
|
|
15
13
|
registrar: Registrar
|
|
16
14
|
connectionManager: ConnectionManager
|
|
17
15
|
pubsub?: PubSub
|
|
16
|
+
logger: ComponentLogger
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
export interface PubSubArgs {
|
package/src/pubsub/messages.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { start, stop } from '@libp2p/interface
|
|
1
|
+
import { start, stop } from '@libp2p/interface'
|
|
2
2
|
import { expect } from 'aegir/chai'
|
|
3
3
|
import { pEvent } from 'p-event'
|
|
4
4
|
import sinon from 'sinon'
|
|
@@ -7,7 +7,7 @@ import { mockNetwork } from '../mocks/index.js'
|
|
|
7
7
|
import { createComponents } from './utils.js'
|
|
8
8
|
import type { PubSubArgs, PubSubComponents } from './index.js'
|
|
9
9
|
import type { TestSetup } from '../index.js'
|
|
10
|
-
import type { Message, PubSub } from '@libp2p/interface
|
|
10
|
+
import type { Message, PubSub } from '@libp2p/interface'
|
|
11
11
|
|
|
12
12
|
const topic = 'foo'
|
|
13
13
|
const data = uint8ArrayFromString('bar')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint max-nested-callbacks: ["error", 6] */
|
|
2
|
-
import { start, stop } from '@libp2p/interface
|
|
2
|
+
import { start, stop } from '@libp2p/interface'
|
|
3
3
|
import { expect } from 'aegir/chai'
|
|
4
4
|
import delay from 'delay'
|
|
5
5
|
import pDefer from 'p-defer'
|
|
@@ -11,7 +11,7 @@ import { mockNetwork } from '../mocks/index.js'
|
|
|
11
11
|
import { createComponents, waitForSubscriptionUpdate } from './utils.js'
|
|
12
12
|
import type { PubSubArgs, PubSubComponents } from './index.js'
|
|
13
13
|
import type { TestSetup } from '../index.js'
|
|
14
|
-
import type { Message, PubSub } from '@libp2p/interface
|
|
14
|
+
import type { Message, PubSub } from '@libp2p/interface'
|
|
15
15
|
|
|
16
16
|
export default (common: TestSetup<PubSub, PubSubArgs>): void => {
|
|
17
17
|
describe('pubsub with multiple nodes', function () {
|
package/src/pubsub/two-nodes.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/* eslint max-nested-callbacks: ["error", 6] */
|
|
2
|
-
import { TopicValidatorResult } from '@libp2p/interface
|
|
3
|
-
import { start, stop } from '@libp2p/interface/startable'
|
|
2
|
+
import { TopicValidatorResult, start, stop } from '@libp2p/interface'
|
|
4
3
|
import { expect } from 'aegir/chai'
|
|
5
4
|
import pDefer from 'p-defer'
|
|
6
5
|
import pWaitFor from 'p-wait-for'
|
|
@@ -11,7 +10,7 @@ import { mockNetwork } from '../mocks/index.js'
|
|
|
11
10
|
import { createComponents, waitForSubscriptionUpdate } from './utils.js'
|
|
12
11
|
import type { PubSubArgs, PubSubComponents } from './index.js'
|
|
13
12
|
import type { TestSetup } from '../index.js'
|
|
14
|
-
import type { Message, PubSub } from '@libp2p/interface
|
|
13
|
+
import type { Message, PubSub } from '@libp2p/interface'
|
|
15
14
|
|
|
16
15
|
const topic = 'foo'
|
|
17
16
|
|
|
@@ -73,7 +72,7 @@ export default (common: TestSetup<PubSub, PubSubArgs>): void => {
|
|
|
73
72
|
expect(psA.getTopics()).to.deep.equal([topic])
|
|
74
73
|
expect(psB.getPeers()).to.have.lengthOf(1)
|
|
75
74
|
expect(psB.getSubscribers(topic).map(p => p.toString())).to.deep.equal([componentsA.peerId.toString()])
|
|
76
|
-
expect(changedPeerId).to.
|
|
75
|
+
expect(changedPeerId.toString()).to.equal(psB.getPeers()[0].toString())
|
|
77
76
|
expect(changedSubs).to.have.lengthOf(1)
|
|
78
77
|
expect(changedSubs[0].topic).to.equal(topic)
|
|
79
78
|
expect(changedSubs[0].subscribe).to.equal(true)
|
|
@@ -243,7 +242,7 @@ export default (common: TestSetup<PubSub, PubSubArgs>): void => {
|
|
|
243
242
|
const { peerId: changedPeerId, subscriptions: changedSubs } = evt.detail
|
|
244
243
|
expect(psB.getPeers()).to.have.lengthOf(1)
|
|
245
244
|
expect(psB.getTopics()).to.be.empty()
|
|
246
|
-
expect(changedPeerId).to.
|
|
245
|
+
expect(changedPeerId.toString()).to.equal(psB.getPeers()[0].toString())
|
|
247
246
|
expect(changedSubs).to.have.lengthOf(1)
|
|
248
247
|
expect(changedSubs[0].topic).to.equal(topic)
|
|
249
248
|
expect(changedSubs[0].subscribe).to.equal(true)
|
|
@@ -252,7 +251,7 @@ export default (common: TestSetup<PubSub, PubSubArgs>): void => {
|
|
|
252
251
|
const { peerId: changedPeerId, subscriptions: changedSubs } = evt.detail
|
|
253
252
|
expect(psB.getPeers()).to.have.lengthOf(1)
|
|
254
253
|
expect(psB.getTopics()).to.be.empty()
|
|
255
|
-
expect(changedPeerId).to.
|
|
254
|
+
expect(changedPeerId.toString()).to.equal(psB.getPeers()[0].toString())
|
|
256
255
|
expect(changedSubs).to.have.lengthOf(1)
|
|
257
256
|
expect(changedSubs[0].topic).to.equal(topic)
|
|
258
257
|
expect(changedSubs[0].subscribe).to.equal(false)
|
package/src/pubsub/utils.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { TypedEventEmitter } from '@libp2p/interface
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface'
|
|
2
|
+
import { defaultLogger } from '@libp2p/logger'
|
|
2
3
|
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
|
|
3
4
|
import { pEvent } from 'p-event'
|
|
4
5
|
import pWaitFor from 'p-wait-for'
|
|
5
6
|
import { mockConnectionManager, mockRegistrar, mockNetwork } from '../mocks/index.js'
|
|
6
7
|
import type { MockNetworkComponents } from '../mocks/index.js'
|
|
7
|
-
import type { PeerId } from '@libp2p/interface
|
|
8
|
-
import type { PubSub, SubscriptionChangeData } from '@libp2p/interface/pubsub'
|
|
8
|
+
import type { PeerId, PubSub, SubscriptionChangeData } from '@libp2p/interface'
|
|
9
9
|
|
|
10
10
|
export async function waitForSubscriptionUpdate (a: PubSub, b: PeerId): Promise<void> {
|
|
11
11
|
await pWaitFor(async () => {
|
|
@@ -19,7 +19,8 @@ export async function createComponents (): Promise<MockNetworkComponents> {
|
|
|
19
19
|
const components: any = {
|
|
20
20
|
peerId: await createEd25519PeerId(),
|
|
21
21
|
registrar: mockRegistrar(),
|
|
22
|
-
events: new TypedEventEmitter()
|
|
22
|
+
events: new TypedEventEmitter(),
|
|
23
|
+
logger: defaultLogger()
|
|
23
24
|
}
|
|
24
25
|
components.connectionManager = mockConnectionManager(components)
|
|
25
26
|
|
|
@@ -10,8 +10,7 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
|
10
10
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
11
11
|
import { isValidTick } from '../is-valid-tick.js'
|
|
12
12
|
import type { TestSetup } from '../index.js'
|
|
13
|
-
import type { Stream } from '@libp2p/interface
|
|
14
|
-
import type { StreamMuxerFactory } from '@libp2p/interface/stream-muxer'
|
|
13
|
+
import type { Stream, StreamMuxerFactory } from '@libp2p/interface'
|
|
15
14
|
import type { Source, Duplex } from 'it-stream-types'
|
|
16
15
|
import type { DeferredPromise } from 'p-defer'
|
|
17
16
|
|
|
@@ -22,7 +21,7 @@ async function drainAndClose (stream: Duplex<any>): Promise<void> {
|
|
|
22
21
|
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
23
22
|
describe('base', () => {
|
|
24
23
|
it('Open a stream from the dialer', async () => {
|
|
25
|
-
const p = duplexPair<Uint8Array>()
|
|
24
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
26
25
|
const dialerFactory = await common.setup()
|
|
27
26
|
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' })
|
|
28
27
|
const onStreamPromise: DeferredPromise<Stream> = defer()
|
|
@@ -75,7 +74,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
75
74
|
})
|
|
76
75
|
|
|
77
76
|
it('Open a stream from the listener', async () => {
|
|
78
|
-
const p = duplexPair<Uint8Array>()
|
|
77
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
79
78
|
const onStreamPromise: DeferredPromise<Stream> = defer()
|
|
80
79
|
const dialerFactory = await common.setup()
|
|
81
80
|
const dialer = dialerFactory.createStreamMuxer({
|
|
@@ -106,7 +105,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
106
105
|
})
|
|
107
106
|
|
|
108
107
|
it('Open a stream on both sides', async () => {
|
|
109
|
-
const p = duplexPair<Uint8Array>()
|
|
108
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
110
109
|
const onDialerStreamPromise: DeferredPromise<Stream> = defer()
|
|
111
110
|
const onListenerStreamPromise: DeferredPromise<Stream> = defer()
|
|
112
111
|
const dialerFactory = await common.setup()
|
|
@@ -146,7 +145,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
146
145
|
|
|
147
146
|
it('Open a stream on one side, write, open a stream on the other side', async () => {
|
|
148
147
|
const toString = (source: Source<Uint8ArrayList>): AsyncGenerator<string> => map(source, (u) => uint8ArrayToString(u.subarray()))
|
|
149
|
-
const p = duplexPair<Uint8Array>()
|
|
148
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
150
149
|
const onDialerStreamPromise: DeferredPromise<Stream> = defer()
|
|
151
150
|
const onListenerStreamPromise: DeferredPromise<Stream> = defer()
|
|
152
151
|
const dialerFactory = await common.setup()
|
|
@@ -13,19 +13,57 @@ import { Uint8ArrayList } from 'uint8arraylist'
|
|
|
13
13
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
14
14
|
import { Message } from './fixtures/pb/message.js'
|
|
15
15
|
import type { TestSetup } from '../index.js'
|
|
16
|
-
import type { StreamMuxerFactory } from '@libp2p/interface
|
|
16
|
+
import type { StreamMuxerFactory } from '@libp2p/interface'
|
|
17
17
|
|
|
18
18
|
function randomBuffer (): Uint8Array {
|
|
19
19
|
return uint8ArrayFromString(Math.random().toString())
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
function infiniteRandom (): AsyncGenerator<Uint8ArrayList, void, unknown> {
|
|
23
|
+
let done: Error | boolean = false
|
|
24
|
+
|
|
25
|
+
const generator: AsyncGenerator<Uint8ArrayList, void, unknown> = {
|
|
26
|
+
[Symbol.asyncIterator]: () => {
|
|
27
|
+
return generator
|
|
28
|
+
},
|
|
29
|
+
async next () {
|
|
30
|
+
await delay(10)
|
|
31
|
+
|
|
32
|
+
if (done instanceof Error) {
|
|
33
|
+
throw done
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (done) {
|
|
37
|
+
return {
|
|
38
|
+
done: true,
|
|
39
|
+
value: undefined
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
done: false,
|
|
45
|
+
value: new Uint8ArrayList(randomBuffer())
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
async return (): Promise<IteratorReturnResult<void>> {
|
|
49
|
+
done = true
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
done: true,
|
|
53
|
+
value: undefined
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
async throw (err: Error): Promise<IteratorReturnResult<void>> {
|
|
57
|
+
done = err
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
done: true,
|
|
61
|
+
value: undefined
|
|
62
|
+
}
|
|
27
63
|
}
|
|
28
64
|
}
|
|
65
|
+
|
|
66
|
+
return generator
|
|
29
67
|
}
|
|
30
68
|
|
|
31
69
|
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
@@ -46,7 +84,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
46
84
|
}
|
|
47
85
|
})
|
|
48
86
|
|
|
49
|
-
const p = duplexPair<Uint8Array>()
|
|
87
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
50
88
|
void pipe(p[0], dialer, p[0])
|
|
51
89
|
void pipe(p[1], listener, p[1])
|
|
52
90
|
|
|
@@ -55,7 +93,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
55
93
|
void Promise.all(
|
|
56
94
|
streams.map(async stream => {
|
|
57
95
|
await pipe(
|
|
58
|
-
infiniteRandom,
|
|
96
|
+
infiniteRandom(),
|
|
59
97
|
stream,
|
|
60
98
|
drain
|
|
61
99
|
)
|
|
@@ -66,7 +104,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
66
104
|
|
|
67
105
|
// Pause, and then close the dialer
|
|
68
106
|
await delay(50)
|
|
69
|
-
await pipe(
|
|
107
|
+
await pipe(async function * () {}, dialer, drain)
|
|
70
108
|
|
|
71
109
|
expect(openedStreams).to.have.equal(expectedStreams)
|
|
72
110
|
expect(dialer.streams).to.have.lengthOf(0)
|
|
@@ -88,7 +126,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
88
126
|
}
|
|
89
127
|
})
|
|
90
128
|
|
|
91
|
-
const p = duplexPair<Uint8Array>()
|
|
129
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
92
130
|
void pipe(p[0], dialer, p[0])
|
|
93
131
|
void pipe(p[1], listener, p[1])
|
|
94
132
|
|
|
@@ -97,7 +135,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
97
135
|
void Promise.all(
|
|
98
136
|
streams.map(async stream => {
|
|
99
137
|
await pipe(
|
|
100
|
-
infiniteRandom,
|
|
138
|
+
infiniteRandom(),
|
|
101
139
|
stream,
|
|
102
140
|
drain
|
|
103
141
|
)
|
|
@@ -131,7 +169,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
131
169
|
}
|
|
132
170
|
})
|
|
133
171
|
|
|
134
|
-
const p = duplexPair<Uint8Array>()
|
|
172
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
135
173
|
void pipe(p[0], dialer, p[0])
|
|
136
174
|
void pipe(p[1], listener, p[1])
|
|
137
175
|
|
|
@@ -139,7 +177,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
139
177
|
|
|
140
178
|
const streamPipes = streams.map(async stream => {
|
|
141
179
|
await pipe(
|
|
142
|
-
infiniteRandom,
|
|
180
|
+
infiniteRandom(),
|
|
143
181
|
stream,
|
|
144
182
|
drain
|
|
145
183
|
)
|
|
@@ -187,7 +225,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
187
225
|
})
|
|
188
226
|
|
|
189
227
|
it('closing one of the muxed streams doesn\'t close others', async () => {
|
|
190
|
-
const p = duplexPair<Uint8Array>()
|
|
228
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
191
229
|
const dialerFactory = await common.setup()
|
|
192
230
|
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' })
|
|
193
231
|
|
|
@@ -213,7 +251,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
213
251
|
controllers.push(controller)
|
|
214
252
|
|
|
215
253
|
try {
|
|
216
|
-
const abortableRand = abortableSource(infiniteRandom, controller.signal, { abortCode: 'ERR_TEST_ABORT' })
|
|
254
|
+
const abortableRand = abortableSource(infiniteRandom(), controller.signal, { abortCode: 'ERR_TEST_ABORT' })
|
|
217
255
|
await pipe(abortableRand, stream, drain)
|
|
218
256
|
} catch (err: any) {
|
|
219
257
|
if (err.code !== 'ERR_TEST_ABORT') throw err
|
|
@@ -238,7 +276,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
238
276
|
it('can close a stream for writing', async () => {
|
|
239
277
|
const deferred = pDefer<Error>()
|
|
240
278
|
|
|
241
|
-
const p = duplexPair<Uint8Array>()
|
|
279
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
242
280
|
const dialerFactory = await common.setup()
|
|
243
281
|
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' })
|
|
244
282
|
const data = [randomBuffer(), randomBuffer()]
|
|
@@ -283,7 +321,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
283
321
|
|
|
284
322
|
it('can close a stream for reading', async () => {
|
|
285
323
|
const deferred = pDefer<Uint8ArrayList[]>()
|
|
286
|
-
const p = duplexPair<Uint8Array>()
|
|
324
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
287
325
|
const dialerFactory = await common.setup()
|
|
288
326
|
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' })
|
|
289
327
|
const data = [randomBuffer(), randomBuffer()].map(d => new Uint8ArrayList(d))
|
|
@@ -349,7 +387,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
349
387
|
it('should wait for all data to be sent when closing streams', async () => {
|
|
350
388
|
const deferred = pDefer<Message>()
|
|
351
389
|
|
|
352
|
-
const p = duplexPair<Uint8Array>()
|
|
390
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
353
391
|
const dialerFactory = await common.setup()
|
|
354
392
|
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' })
|
|
355
393
|
|
|
@@ -391,7 +429,7 @@ export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
|
391
429
|
it('should abort closing a stream with outstanding data to read', async () => {
|
|
392
430
|
const deferred = pDefer<Message>()
|
|
393
431
|
|
|
394
|
-
const p = duplexPair<Uint8Array>()
|
|
432
|
+
const p = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
395
433
|
const dialerFactory = await common.setup()
|
|
396
434
|
const dialer = dialerFactory.createStreamMuxer({ direction: 'outbound' })
|
|
397
435
|
|
|
@@ -3,7 +3,7 @@ import closeTest from './close-test.js'
|
|
|
3
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
|
-
import type { StreamMuxerFactory } from '@libp2p/interface
|
|
6
|
+
import type { StreamMuxerFactory } from '@libp2p/interface'
|
|
7
7
|
|
|
8
8
|
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
9
9
|
describe('interface-stream-muxer', () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import spawn from './spawner.js'
|
|
2
2
|
import type { TestSetup } from '../index.js'
|
|
3
|
-
import type { StreamMuxer, StreamMuxerFactory, StreamMuxerInit } from '@libp2p/interface
|
|
3
|
+
import type { StreamMuxer, StreamMuxerFactory, StreamMuxerInit } from '@libp2p/interface'
|
|
4
4
|
|
|
5
5
|
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
6
6
|
const createMuxer = async (init?: StreamMuxerInit): Promise<StreamMuxer> => {
|
|
@@ -6,10 +6,10 @@ import { pipe } from 'it-pipe'
|
|
|
6
6
|
import pLimit from 'p-limit'
|
|
7
7
|
import { Uint8ArrayList } from 'uint8arraylist'
|
|
8
8
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
9
|
-
import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface
|
|
9
|
+
import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface'
|
|
10
10
|
|
|
11
11
|
export default async (createMuxer: (init?: StreamMuxerInit) => Promise<StreamMuxer>, nStreams: number, nMsg: number, limit?: number): Promise<void> => {
|
|
12
|
-
const [dialerSocket, listenerSocket] = duplexPair<Uint8Array>()
|
|
12
|
+
const [dialerSocket, listenerSocket] = duplexPair<Uint8Array | Uint8ArrayList>()
|
|
13
13
|
|
|
14
14
|
const msg = new Uint8ArrayList(uint8ArrayFromString('simple msg'))
|
|
15
15
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import spawn from './spawner.js'
|
|
2
2
|
import type { TestSetup } from '../index.js'
|
|
3
|
-
import type { StreamMuxerFactory, StreamMuxerInit, StreamMuxer } from '@libp2p/interface
|
|
3
|
+
import type { StreamMuxerFactory, StreamMuxerInit, StreamMuxer } from '@libp2p/interface'
|
|
4
4
|
|
|
5
5
|
export default (common: TestSetup<StreamMuxerFactory>): void => {
|
|
6
6
|
const createMuxer = async (init?: StreamMuxerInit): Promise<StreamMuxer> => {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { AbortError } from '@libp2p/interface
|
|
2
|
-
import { TypedEventEmitter } from '@libp2p/interface/events'
|
|
1
|
+
import { AbortError, TypedEventEmitter } from '@libp2p/interface'
|
|
3
2
|
import { expect } from 'aegir/chai'
|
|
4
3
|
import all from 'it-all'
|
|
5
4
|
import drain from 'it-drain'
|
|
@@ -10,8 +9,8 @@ import { isValidTick } from '../is-valid-tick.js'
|
|
|
10
9
|
import { mockUpgrader, mockRegistrar } from '../mocks/index.js'
|
|
11
10
|
import type { TransportTestFixtures, Connector } from './index.js'
|
|
12
11
|
import type { TestSetup } from '../index.js'
|
|
13
|
-
import type { Listener, Transport, Upgrader } from '@libp2p/interface
|
|
14
|
-
import type { Registrar } from '@libp2p/interface-internal
|
|
12
|
+
import type { Listener, Transport, Upgrader } from '@libp2p/interface'
|
|
13
|
+
import type { Registrar } from '@libp2p/interface-internal'
|
|
15
14
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
16
15
|
|
|
17
16
|
export default (common: TestSetup<TransportTestFixtures>): void => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { expect } from 'aegir/chai'
|
|
2
2
|
import type { TransportTestFixtures } from './index.js'
|
|
3
3
|
import type { TestSetup } from '../index.js'
|
|
4
|
-
import type { Transport } from '@libp2p/interface
|
|
4
|
+
import type { Transport } from '@libp2p/interface'
|
|
5
5
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
6
6
|
|
|
7
7
|
export default (common: TestSetup<TransportTestFixtures>): void => {
|
package/src/transport/index.ts
CHANGED
|
@@ -2,7 +2,7 @@ import dial from './dial-test.js'
|
|
|
2
2
|
import filter from './filter-test.js'
|
|
3
3
|
import listen from './listen-test.js'
|
|
4
4
|
import type { TestSetup } from '../index.js'
|
|
5
|
-
import type { Transport } from '@libp2p/interface
|
|
5
|
+
import type { Transport } from '@libp2p/interface'
|
|
6
6
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
7
7
|
|
|
8
8
|
export interface Connector {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint max-nested-callbacks: ["error", 8] */
|
|
2
|
-
import { CustomEvent, TypedEventEmitter } from '@libp2p/interface
|
|
2
|
+
import { CustomEvent, TypedEventEmitter } from '@libp2p/interface'
|
|
3
3
|
import { expect } from 'aegir/chai'
|
|
4
4
|
import drain from 'it-drain'
|
|
5
5
|
import { pipe } from 'it-pipe'
|
|
@@ -11,9 +11,8 @@ import { isValidTick } from '../is-valid-tick.js'
|
|
|
11
11
|
import { mockUpgrader, mockRegistrar } from '../mocks/index.js'
|
|
12
12
|
import type { TransportTestFixtures } from './index.js'
|
|
13
13
|
import type { TestSetup } from '../index.js'
|
|
14
|
-
import type { Connection } from '@libp2p/interface
|
|
15
|
-
import type {
|
|
16
|
-
import type { Registrar } from '@libp2p/interface-internal/registrar'
|
|
14
|
+
import type { Connection, Transport, Upgrader } from '@libp2p/interface'
|
|
15
|
+
import type { Registrar } from '@libp2p/interface-internal'
|
|
17
16
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
18
17
|
|
|
19
18
|
export default (common: TestSetup<TransportTestFixtures>): void => {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection-encrypter.d.ts","sourceRoot":"","sources":["../../../src/mocks/connection-encrypter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAYjF,wBAAgB,uBAAuB,IAAK,mBAAmB,CA6F9D"}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { UnexpectedPeerError } from '@libp2p/interface/errors';
|
|
2
|
-
import { peerIdFromBytes } from '@libp2p/peer-id';
|
|
3
|
-
import { multiaddr } from '@multiformats/multiaddr';
|
|
4
|
-
import { handshake } from 'it-handshake';
|
|
5
|
-
import map from 'it-map';
|
|
6
|
-
import { duplexPair } from 'it-pair/duplex';
|
|
7
|
-
import { pipe } from 'it-pipe';
|
|
8
|
-
// A basic transform that does nothing to the data
|
|
9
|
-
const transform = () => {
|
|
10
|
-
return (source) => (async function* () {
|
|
11
|
-
for await (const chunk of source) {
|
|
12
|
-
yield chunk;
|
|
13
|
-
}
|
|
14
|
-
})();
|
|
15
|
-
};
|
|
16
|
-
export function mockConnectionEncrypter() {
|
|
17
|
-
const encrypter = {
|
|
18
|
-
protocol: 'insecure',
|
|
19
|
-
secureInbound: async (localPeer, duplex, expectedPeer) => {
|
|
20
|
-
// 1. Perform a basic handshake.
|
|
21
|
-
const shake = handshake(duplex);
|
|
22
|
-
shake.write(localPeer.toBytes());
|
|
23
|
-
const remoteId = await shake.read();
|
|
24
|
-
if (remoteId == null) {
|
|
25
|
-
throw new Error('Could not read remote ID');
|
|
26
|
-
}
|
|
27
|
-
const remotePeer = peerIdFromBytes(remoteId.slice());
|
|
28
|
-
shake.rest();
|
|
29
|
-
if (expectedPeer?.equals(remotePeer) === false) {
|
|
30
|
-
throw new UnexpectedPeerError();
|
|
31
|
-
}
|
|
32
|
-
// 2. Create your encryption box/unbox wrapper
|
|
33
|
-
const wrapper = duplexPair();
|
|
34
|
-
const encrypt = transform(); // Use transform iterables to modify data
|
|
35
|
-
const decrypt = transform();
|
|
36
|
-
void pipe(wrapper[0], // We write to wrapper
|
|
37
|
-
encrypt, // The data is encrypted
|
|
38
|
-
shake.stream, // It goes to the remote peer
|
|
39
|
-
// It goes to the remote peer
|
|
40
|
-
source => map(source, (list) => list.subarray()), // turn lists into arrays
|
|
41
|
-
decrypt, // Decrypt the incoming data
|
|
42
|
-
wrapper[0] // Pipe to the wrapper
|
|
43
|
-
);
|
|
44
|
-
return {
|
|
45
|
-
conn: {
|
|
46
|
-
...wrapper[1],
|
|
47
|
-
close: async () => { },
|
|
48
|
-
localAddr: multiaddr('/ip4/127.0.0.1/tcp/4001'),
|
|
49
|
-
remoteAddr: multiaddr('/ip4/127.0.0.1/tcp/4002'),
|
|
50
|
-
timeline: {
|
|
51
|
-
open: Date.now()
|
|
52
|
-
},
|
|
53
|
-
conn: true
|
|
54
|
-
},
|
|
55
|
-
remotePeer,
|
|
56
|
-
remoteExtensions: {}
|
|
57
|
-
};
|
|
58
|
-
},
|
|
59
|
-
secureOutbound: async (localPeer, duplex, remotePeer) => {
|
|
60
|
-
// 1. Perform a basic handshake.
|
|
61
|
-
const shake = handshake(duplex);
|
|
62
|
-
shake.write(localPeer.toBytes());
|
|
63
|
-
const remoteId = await shake.read();
|
|
64
|
-
if (remoteId == null) {
|
|
65
|
-
throw new Error('Could not read remote ID');
|
|
66
|
-
}
|
|
67
|
-
shake.rest();
|
|
68
|
-
// 2. Create your encryption box/unbox wrapper
|
|
69
|
-
const wrapper = duplexPair();
|
|
70
|
-
const encrypt = transform();
|
|
71
|
-
const decrypt = transform();
|
|
72
|
-
void pipe(wrapper[0], // We write to wrapper
|
|
73
|
-
encrypt, // The data is encrypted
|
|
74
|
-
shake.stream, // It goes to the remote peer
|
|
75
|
-
// It goes to the remote peer
|
|
76
|
-
source => map(source, (list) => list.subarray()), // turn lists into arrays
|
|
77
|
-
decrypt, // Decrypt the incoming data
|
|
78
|
-
wrapper[0] // Pipe to the wrapper
|
|
79
|
-
);
|
|
80
|
-
return {
|
|
81
|
-
conn: {
|
|
82
|
-
...wrapper[1],
|
|
83
|
-
close: async () => { },
|
|
84
|
-
localAddr: multiaddr('/ip4/127.0.0.1/tcp/4001'),
|
|
85
|
-
remoteAddr: multiaddr('/ip4/127.0.0.1/tcp/4002'),
|
|
86
|
-
timeline: {
|
|
87
|
-
open: Date.now()
|
|
88
|
-
},
|
|
89
|
-
conn: true
|
|
90
|
-
},
|
|
91
|
-
remotePeer: peerIdFromBytes(remoteId.slice()),
|
|
92
|
-
remoteExtensions: {}
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
return encrypter;
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=connection-encrypter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection-encrypter.js","sourceRoot":"","sources":["../../../src/mocks/connection-encrypter.ts"],"names":[],"mappings":"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"}
|