@libp2p/interop 2.1.0 → 3.0.1
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 +2 -2
- package/dist/src/index.d.ts +6 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/streams/echo.d.ts +3 -0
- package/dist/src/streams/echo.d.ts.map +1 -0
- package/dist/src/streams/echo.js +65 -0
- package/dist/src/streams/echo.js.map +1 -0
- package/dist/src/streams/index.d.ts +3 -0
- package/dist/src/streams/index.d.ts.map +1 -0
- package/dist/src/streams/index.js +6 -0
- package/dist/src/streams/index.js.map +1 -0
- package/package.json +14 -8
- package/src/index.ts +8 -2
- package/src/streams/echo.ts +99 -0
- package/src/streams/index.ts +7 -0
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
- [Running the tests](#running-the-tests)
|
|
16
16
|
- [Contribute](#contribute)
|
|
17
17
|
- [License](#license)
|
|
18
|
-
- [
|
|
18
|
+
- [Contribute](#contribute-1)
|
|
19
19
|
|
|
20
20
|
## Install
|
|
21
21
|
|
|
@@ -80,6 +80,6 @@ Licensed under either of
|
|
|
80
80
|
- Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
|
|
81
81
|
- MIT ([LICENSE-MIT](LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
|
|
82
82
|
|
|
83
|
-
##
|
|
83
|
+
## Contribute
|
|
84
84
|
|
|
85
85
|
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { connectTests } from './connect.js';
|
|
2
2
|
import { dhtTests } from './dht/index.js';
|
|
3
3
|
import { pubsubTests } from './pubsub/index.js';
|
|
4
|
+
import { streamTests } from './streams/index.js';
|
|
4
5
|
import type { DaemonClient } from '@libp2p/daemon-client';
|
|
5
6
|
export interface Daemon {
|
|
6
7
|
stop: () => Promise<void>;
|
|
@@ -8,17 +9,20 @@ export interface Daemon {
|
|
|
8
9
|
}
|
|
9
10
|
export declare type NodeType = 'js' | 'go';
|
|
10
11
|
export declare type PeerIdType = 'rsa' | 'ed25519' | 'secp256k1';
|
|
12
|
+
export declare type PubSubRouter = 'gossipsub' | 'floodsub';
|
|
13
|
+
export declare type Muxer = 'mplex' | 'yamux';
|
|
11
14
|
export interface SpawnOptions {
|
|
12
15
|
type: NodeType;
|
|
13
16
|
key?: string;
|
|
14
17
|
noise?: true;
|
|
15
18
|
dht?: boolean;
|
|
16
19
|
pubsub?: boolean;
|
|
17
|
-
pubsubRouter?:
|
|
20
|
+
pubsubRouter?: PubSubRouter;
|
|
21
|
+
muxer?: Muxer;
|
|
18
22
|
}
|
|
19
23
|
export interface DaemonFactory {
|
|
20
24
|
spawn: (options: SpawnOptions) => Promise<Daemon>;
|
|
21
25
|
}
|
|
22
26
|
export declare function interopTests(factory: DaemonFactory): Promise<void>;
|
|
23
|
-
export { connectTests as connectInteropTests, dhtTests as dhtInteropTests, pubsubTests as pubsubInteropTests };
|
|
27
|
+
export { connectTests as connectInteropTests, dhtTests as dhtInteropTests, pubsubTests as pubsubInteropTests, streamTests as streamInteropTests };
|
|
24
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,EAAE,YAAY,CAAA;CACrB;AAED,oBAAY,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAA;AAClC,oBAAY,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,EAAE,YAAY,CAAA;CACrB;AAED,oBAAY,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAA;AAClC,oBAAY,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,CAAA;AACxD,oBAAY,YAAY,GAAG,WAAW,GAAG,UAAU,CAAA;AACnD,oBAAY,KAAK,GAAG,OAAO,GAAG,OAAO,CAAA;AAErC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAClD;AAED,wBAAsB,YAAY,CAAE,OAAO,EAAE,aAAa,iBAKzD;AAED,OAAO,EACL,YAAY,IAAI,mBAAmB,EACnC,QAAQ,IAAI,eAAe,EAC3B,WAAW,IAAI,kBAAkB,EACjC,WAAW,IAAI,kBAAkB,EAClC,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { connectTests } from './connect.js';
|
|
2
2
|
import { dhtTests } from './dht/index.js';
|
|
3
3
|
import { pubsubTests } from './pubsub/index.js';
|
|
4
|
+
import { streamTests } from './streams/index.js';
|
|
4
5
|
export async function interopTests(factory) {
|
|
5
6
|
await connectTests(factory);
|
|
6
7
|
await dhtTests(factory);
|
|
7
8
|
await pubsubTests(factory);
|
|
9
|
+
await streamTests(factory);
|
|
8
10
|
}
|
|
9
|
-
export { connectTests as connectInteropTests, dhtTests as dhtInteropTests, pubsubTests as pubsubInteropTests };
|
|
11
|
+
export { connectTests as connectInteropTests, dhtTests as dhtInteropTests, pubsubTests as pubsubInteropTests, streamTests as streamInteropTests };
|
|
10
12
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AA2BhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAE,OAAsB;IACxD,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;IAC3B,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IACvB,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC1B,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED,OAAO,EACL,YAAY,IAAI,mBAAmB,EACnC,QAAQ,IAAI,eAAe,EAC3B,WAAW,IAAI,kBAAkB,EACjC,WAAW,IAAI,kBAAkB,EAClC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echo.d.ts","sourceRoot":"","sources":["../../../src/streams/echo.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,aAAa,EAAE,KAAK,EAA0B,MAAM,aAAa,CAAA;AAMvF,wBAAgB,eAAe,CAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,QAapE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
import { expect } from 'aegir/chai';
|
|
3
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
4
|
+
import { pipe } from 'it-pipe';
|
|
5
|
+
import all from 'it-all';
|
|
6
|
+
import defer from 'p-defer';
|
|
7
|
+
export function echoStreamTests(factory, muxer) {
|
|
8
|
+
const nodeTypes = ['js', 'go'];
|
|
9
|
+
for (const typeA of nodeTypes) {
|
|
10
|
+
for (const typeB of nodeTypes) {
|
|
11
|
+
runEchoStreamTests(factory, muxer, { type: typeA, muxer }, { type: typeB, muxer });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function runEchoStreamTests(factory, muxer, optionsA, optionsB) {
|
|
16
|
+
describe(`echo streams - ${muxer}`, () => {
|
|
17
|
+
let daemons;
|
|
18
|
+
// Start Daemons
|
|
19
|
+
before(async function () {
|
|
20
|
+
this.timeout(20 * 1000);
|
|
21
|
+
daemons = await Promise.all([
|
|
22
|
+
factory.spawn(optionsA),
|
|
23
|
+
factory.spawn(optionsB)
|
|
24
|
+
]);
|
|
25
|
+
// connect them
|
|
26
|
+
const identify0 = await daemons[0].client.identify();
|
|
27
|
+
await daemons[1].client.connect(identify0.peerId, identify0.addrs);
|
|
28
|
+
// jsDaemon1 will take some time to get the peers
|
|
29
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
30
|
+
});
|
|
31
|
+
// Stop daemons
|
|
32
|
+
after(async function () {
|
|
33
|
+
if (daemons != null) {
|
|
34
|
+
await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
it(`${optionsA.type} sender to ${optionsB.type} listener`, async function () {
|
|
38
|
+
this.timeout(10 * 1000);
|
|
39
|
+
const receivingIdentity = await daemons[1].client.identify();
|
|
40
|
+
const protocol = '/echo/1.0.0';
|
|
41
|
+
const input = [uint8ArrayFromString('hello world')];
|
|
42
|
+
await daemons[1].client.registerStreamHandler(protocol, async (stream) => {
|
|
43
|
+
await pipe(stream, async function* (source) {
|
|
44
|
+
for await (const buf of source) {
|
|
45
|
+
yield buf.subarray();
|
|
46
|
+
}
|
|
47
|
+
}, stream);
|
|
48
|
+
});
|
|
49
|
+
const stream = await daemons[0].client.openStream(receivingIdentity.peerId, protocol);
|
|
50
|
+
// without this the socket can close before we receive a response
|
|
51
|
+
const responseReceived = defer();
|
|
52
|
+
const output = await pipe(input, async function* (source) {
|
|
53
|
+
yield* source;
|
|
54
|
+
await responseReceived.promise;
|
|
55
|
+
}, stream, async function* (source) {
|
|
56
|
+
for await (const buf of source) {
|
|
57
|
+
yield buf.subarray();
|
|
58
|
+
responseReceived.resolve();
|
|
59
|
+
}
|
|
60
|
+
}, async (source) => await all(source));
|
|
61
|
+
expect(output).to.deep.equal(input);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=echo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echo.js","sourceRoot":"","sources":["../../../src/streams/echo.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,KAAK,MAAM,SAAS,CAAA;AAE3B,MAAM,UAAU,eAAe,CAAE,OAAsB,EAAE,KAAY;IACnE,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,kBAAkB,CAChB,OAAO,EACP,KAAK,EACL,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EACtB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CACvB,CAAA;SACF;KACF;AACH,CAAC;AAED,SAAS,kBAAkB,CAAE,OAAsB,EAAE,KAAY,EAAE,QAAsB,EAAE,QAAsB;IAC/G,QAAQ,CAAC,kBAAkB,KAAK,EAAE,EAAE,GAAG,EAAE;QACvC,IAAI,OAAiB,CAAA;QAErB,gBAAgB;QAChB,MAAM,CAAC,KAAK;YACV,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;YAEvB,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxB,CAAC,CAAA;YAEF,eAAe;YACf,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YAEpD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;YAElE,iDAAiD;YACjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;QAEF,eAAe;QACf,KAAK,CAAC,KAAK;YACT,IAAI,OAAO,IAAI,IAAI,EAAE;gBACnB,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CACnD,CAAA;aACF;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,cAAc,QAAQ,CAAC,IAAI,WAAW,EAAE,KAAK;YAC9D,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;YAEvB,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YAC5D,MAAM,QAAQ,GAAG,aAAa,CAAA;YAC9B,MAAM,KAAK,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAA;YAEnD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACvE,MAAM,IAAI,CACR,MAAM,EACN,KAAK,SAAU,CAAC,EAAE,MAAM;oBACtB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE;wBAC9B,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;qBACrB;gBACH,CAAC,EACD,MAAM,CACP,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAErF,iEAAiE;YACjE,MAAM,gBAAgB,GAAG,KAAK,EAAE,CAAA;YAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,KAAK,EACL,KAAK,SAAU,CAAC,EAAE,MAAM;gBACtB,KAAM,CAAC,CAAC,MAAM,CAAA;gBACd,MAAM,gBAAgB,CAAC,OAAO,CAAA;YAChC,CAAC,EACD,MAAM,EACN,KAAK,SAAU,CAAC,EAAE,MAAM;gBACtB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE;oBAC9B,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;oBACpB,gBAAgB,CAAC,OAAO,EAAE,CAAA;iBAC3B;YACH,CAAC,EACD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CACpC,CAAA;YAED,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/streams/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,wBAAsB,WAAW,CAAE,OAAO,EAAE,aAAa,iBAGxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/streams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAE,OAAsB;IACvD,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/interop",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Interoperability Tests for libp2p",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/interop#readme",
|
|
@@ -65,15 +65,15 @@
|
|
|
65
65
|
"release": "patch"
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
|
-
"type": "
|
|
68
|
+
"type": "docs",
|
|
69
69
|
"release": "patch"
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
|
-
"type": "
|
|
72
|
+
"type": "test",
|
|
73
73
|
"release": "patch"
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
|
-
"type": "
|
|
76
|
+
"type": "deps",
|
|
77
77
|
"release": "patch"
|
|
78
78
|
},
|
|
79
79
|
{
|
|
@@ -103,7 +103,11 @@
|
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
"type": "docs",
|
|
106
|
-
"section": "
|
|
106
|
+
"section": "Documentation"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"type": "deps",
|
|
110
|
+
"section": "Dependencies"
|
|
107
111
|
},
|
|
108
112
|
{
|
|
109
113
|
"type": "test",
|
|
@@ -128,14 +132,16 @@
|
|
|
128
132
|
"release": "aegir release"
|
|
129
133
|
},
|
|
130
134
|
"dependencies": {
|
|
131
|
-
"@libp2p/daemon-client": "^
|
|
132
|
-
"@libp2p/interface-peer-info": "^1.0.
|
|
135
|
+
"@libp2p/daemon-client": "^3.0.1",
|
|
136
|
+
"@libp2p/interface-peer-info": "^1.0.3",
|
|
133
137
|
"@libp2p/logger": "^2.0.0",
|
|
134
138
|
"@libp2p/peer-id": "^1.1.8",
|
|
135
|
-
"@multiformats/multiaddr": "^
|
|
139
|
+
"@multiformats/multiaddr": "^11.0.0",
|
|
136
140
|
"it-all": "^1.0.6",
|
|
137
141
|
"it-first": "^1.0.7",
|
|
142
|
+
"it-pipe": "^2.0.4",
|
|
138
143
|
"multiformats": "^9.4.5",
|
|
144
|
+
"p-defer": "^4.0.0",
|
|
139
145
|
"p-retry": "^5.1.0",
|
|
140
146
|
"uint8arrays": "^3.0.0"
|
|
141
147
|
},
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { connectTests } from './connect.js'
|
|
2
2
|
import { dhtTests } from './dht/index.js'
|
|
3
3
|
import { pubsubTests } from './pubsub/index.js'
|
|
4
|
+
import { streamTests } from './streams/index.js'
|
|
4
5
|
import type { DaemonClient } from '@libp2p/daemon-client'
|
|
5
6
|
|
|
6
7
|
export interface Daemon {
|
|
@@ -10,6 +11,8 @@ export interface Daemon {
|
|
|
10
11
|
|
|
11
12
|
export type NodeType = 'js' | 'go'
|
|
12
13
|
export type PeerIdType = 'rsa' | 'ed25519' | 'secp256k1'
|
|
14
|
+
export type PubSubRouter = 'gossipsub' | 'floodsub'
|
|
15
|
+
export type Muxer = 'mplex' | 'yamux'
|
|
13
16
|
|
|
14
17
|
export interface SpawnOptions {
|
|
15
18
|
type: NodeType
|
|
@@ -17,7 +20,8 @@ export interface SpawnOptions {
|
|
|
17
20
|
noise?: true
|
|
18
21
|
dht?: boolean
|
|
19
22
|
pubsub?: boolean
|
|
20
|
-
pubsubRouter?:
|
|
23
|
+
pubsubRouter?: PubSubRouter
|
|
24
|
+
muxer?: Muxer
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
export interface DaemonFactory {
|
|
@@ -28,10 +32,12 @@ export async function interopTests (factory: DaemonFactory) {
|
|
|
28
32
|
await connectTests(factory)
|
|
29
33
|
await dhtTests(factory)
|
|
30
34
|
await pubsubTests(factory)
|
|
35
|
+
await streamTests(factory)
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
export {
|
|
34
39
|
connectTests as connectInteropTests,
|
|
35
40
|
dhtTests as dhtInteropTests,
|
|
36
|
-
pubsubTests as pubsubInteropTests
|
|
41
|
+
pubsubTests as pubsubInteropTests,
|
|
42
|
+
streamTests as streamInteropTests
|
|
37
43
|
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
|
|
3
|
+
import { expect } from 'aegir/chai'
|
|
4
|
+
import type { Daemon, DaemonFactory, Muxer, NodeType, SpawnOptions } from '../index.js'
|
|
5
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
6
|
+
import { pipe } from 'it-pipe'
|
|
7
|
+
import all from 'it-all'
|
|
8
|
+
import defer from 'p-defer'
|
|
9
|
+
|
|
10
|
+
export function echoStreamTests (factory: DaemonFactory, muxer: Muxer) {
|
|
11
|
+
const nodeTypes: NodeType[] = ['js', 'go']
|
|
12
|
+
|
|
13
|
+
for (const typeA of nodeTypes) {
|
|
14
|
+
for (const typeB of nodeTypes) {
|
|
15
|
+
runEchoStreamTests(
|
|
16
|
+
factory,
|
|
17
|
+
muxer,
|
|
18
|
+
{ type: typeA, muxer },
|
|
19
|
+
{ type: typeB, muxer }
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function runEchoStreamTests (factory: DaemonFactory, muxer: Muxer, optionsA: SpawnOptions, optionsB: SpawnOptions) {
|
|
26
|
+
describe(`echo streams - ${muxer}`, () => {
|
|
27
|
+
let daemons: Daemon[]
|
|
28
|
+
|
|
29
|
+
// Start Daemons
|
|
30
|
+
before(async function () {
|
|
31
|
+
this.timeout(20 * 1000)
|
|
32
|
+
|
|
33
|
+
daemons = await Promise.all([
|
|
34
|
+
factory.spawn(optionsA),
|
|
35
|
+
factory.spawn(optionsB)
|
|
36
|
+
])
|
|
37
|
+
|
|
38
|
+
// connect them
|
|
39
|
+
const identify0 = await daemons[0].client.identify()
|
|
40
|
+
|
|
41
|
+
await daemons[1].client.connect(identify0.peerId, identify0.addrs)
|
|
42
|
+
|
|
43
|
+
// jsDaemon1 will take some time to get the peers
|
|
44
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// Stop daemons
|
|
48
|
+
after(async function () {
|
|
49
|
+
if (daemons != null) {
|
|
50
|
+
await Promise.all(
|
|
51
|
+
daemons.map(async (daemon) => await daemon.stop())
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it(`${optionsA.type} sender to ${optionsB.type} listener`, async function () {
|
|
57
|
+
this.timeout(10 * 1000)
|
|
58
|
+
|
|
59
|
+
const receivingIdentity = await daemons[1].client.identify()
|
|
60
|
+
const protocol = '/echo/1.0.0'
|
|
61
|
+
const input = [uint8ArrayFromString('hello world')]
|
|
62
|
+
|
|
63
|
+
await daemons[1].client.registerStreamHandler(protocol, async (stream) => {
|
|
64
|
+
await pipe(
|
|
65
|
+
stream,
|
|
66
|
+
async function * (source) {
|
|
67
|
+
for await (const buf of source) {
|
|
68
|
+
yield buf.subarray()
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
stream
|
|
72
|
+
)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
const stream = await daemons[0].client.openStream(receivingIdentity.peerId, protocol)
|
|
76
|
+
|
|
77
|
+
// without this the socket can close before we receive a response
|
|
78
|
+
const responseReceived = defer()
|
|
79
|
+
|
|
80
|
+
const output = await pipe(
|
|
81
|
+
input,
|
|
82
|
+
async function * (source) {
|
|
83
|
+
yield * source
|
|
84
|
+
await responseReceived.promise
|
|
85
|
+
},
|
|
86
|
+
stream,
|
|
87
|
+
async function * (source) {
|
|
88
|
+
for await (const buf of source) {
|
|
89
|
+
yield buf.subarray()
|
|
90
|
+
responseReceived.resolve()
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
async (source) => await all(source)
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
expect(output).to.deep.equal(input)
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
}
|