@libp2p/interop 0.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.
Files changed (75) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +60 -0
  3. package/dist/src/connect.d.ts +3 -0
  4. package/dist/src/connect.d.ts.map +1 -0
  5. package/dist/src/connect.js +54 -0
  6. package/dist/src/connect.js.map +1 -0
  7. package/dist/src/dht/content-fetching.d.ts +3 -0
  8. package/dist/src/dht/content-fetching.d.ts.map +1 -0
  9. package/dist/src/dht/content-fetching.js +50 -0
  10. package/dist/src/dht/content-fetching.js.map +1 -0
  11. package/dist/src/dht/content-routing.d.ts +3 -0
  12. package/dist/src/dht/content-routing.d.ts.map +1 -0
  13. package/dist/src/dht/content-routing.js +50 -0
  14. package/dist/src/dht/content-routing.js.map +1 -0
  15. package/dist/src/dht/index.d.ts +3 -0
  16. package/dist/src/dht/index.d.ts.map +1 -0
  17. package/dist/src/dht/index.js +9 -0
  18. package/dist/src/dht/index.js.map +1 -0
  19. package/dist/src/dht/peer-routing.d.ts +3 -0
  20. package/dist/src/dht/peer-routing.d.ts.map +1 -0
  21. package/dist/src/dht/peer-routing.js +44 -0
  22. package/dist/src/dht/peer-routing.js.map +1 -0
  23. package/dist/src/index.d.ts +20 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +9 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/pubsub/floodsub.d.ts +3 -0
  28. package/dist/src/pubsub/floodsub.d.ts.map +1 -0
  29. package/dist/src/pubsub/floodsub.js +52 -0
  30. package/dist/src/pubsub/floodsub.js.map +1 -0
  31. package/dist/src/pubsub/gossipsub.d.ts +3 -0
  32. package/dist/src/pubsub/gossipsub.d.ts.map +1 -0
  33. package/dist/src/pubsub/gossipsub.js +52 -0
  34. package/dist/src/pubsub/gossipsub.js.map +1 -0
  35. package/dist/src/pubsub/hybrid.d.ts +3 -0
  36. package/dist/src/pubsub/hybrid.d.ts.map +1 -0
  37. package/dist/src/pubsub/hybrid.js +52 -0
  38. package/dist/src/pubsub/hybrid.js.map +1 -0
  39. package/dist/src/pubsub/index.d.ts +3 -0
  40. package/dist/src/pubsub/index.d.ts.map +1 -0
  41. package/dist/src/pubsub/index.js +9 -0
  42. package/dist/src/pubsub/index.js.map +1 -0
  43. package/dist/src/resources/keys/go.ed25519.key +1 -0
  44. package/dist/src/resources/keys/go.rsa.key +0 -0
  45. package/dist/src/resources/keys/go.secp256k1.key +1 -0
  46. package/dist/src/resources/keys/index.d.ts +5 -0
  47. package/dist/src/resources/keys/index.d.ts.map +1 -0
  48. package/dist/src/resources/keys/index.js +18 -0
  49. package/dist/src/resources/keys/index.js.map +1 -0
  50. package/dist/src/resources/keys/js.ed25519.key +1 -0
  51. package/dist/src/resources/keys/js.rsa.key +0 -0
  52. package/dist/src/resources/keys/js.secp256k1.key +1 -0
  53. package/dist/src/utils/dht-record.d.ts +6 -0
  54. package/dist/src/utils/dht-record.d.ts.map +1 -0
  55. package/dist/src/utils/dht-record.js +10 -0
  56. package/dist/src/utils/dht-record.js.map +1 -0
  57. package/package.json +151 -0
  58. package/src/connect.ts +75 -0
  59. package/src/dht/content-fetching.ts +70 -0
  60. package/src/dht/content-routing.ts +74 -0
  61. package/src/dht/index.ts +10 -0
  62. package/src/dht/peer-routing.ts +63 -0
  63. package/src/index.ts +31 -0
  64. package/src/pubsub/floodsub.ts +70 -0
  65. package/src/pubsub/gossipsub.ts +70 -0
  66. package/src/pubsub/hybrid.ts +70 -0
  67. package/src/pubsub/index.ts +10 -0
  68. package/src/resources/keys/go.ed25519.key +1 -0
  69. package/src/resources/keys/go.rsa.key +0 -0
  70. package/src/resources/keys/go.secp256k1.key +1 -0
  71. package/src/resources/keys/index.ts +24 -0
  72. package/src/resources/keys/js.ed25519.key +1 -0
  73. package/src/resources/keys/js.rsa.key +0 -0
  74. package/src/resources/keys/js.secp256k1.key +1 -0
  75. package/src/utils/dht-record.ts +10 -0
package/LICENSE ADDED
@@ -0,0 +1,4 @@
1
+ This project is dual licensed under MIT and Apache-2.0.
2
+
3
+ MIT: https://www.opensource.org/licenses/mit
4
+ Apache-2.0: https://www.apache.org/licenses/license-2.0
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Interoperability Tests for libp2p
2
+
3
+ [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai/)
4
+ [![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
5
+ [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
6
+ [![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io)
7
+
8
+ > Interoperability tests for libp2p Implementations
9
+
10
+ This repository will be used for interop tests.
11
+
12
+ ## Lead Maintainer
13
+
14
+ [Vasco Santos](https://github.com/vasco-santos)
15
+
16
+ ## Usage
17
+
18
+ ### Install
19
+
20
+ ```
21
+ > git clone git@github.com:libp2p/interop.git
22
+ > cd interop
23
+ > npm install
24
+ ```
25
+
26
+ ### Run the tests
27
+
28
+ ```
29
+ > npm test
30
+ ```
31
+
32
+ #### Testing local daemons
33
+
34
+ It is possible to test local versions of the go and js daemons exporting the respective path before running the tests.
35
+
36
+ **Specifying the go-libp2p daemon**
37
+ See the go-libp2p-daemon [install instructions](https://github.com/libp2p/go-libp2p-daemon#install) for building the local binary.
38
+
39
+ ```sh
40
+ $ LIBP2P_GO_BIN=$GOPATH/bin/p2pd npm run test
41
+ ```
42
+
43
+ **Specifying the js-libp2p daemon**
44
+ From the js-libp2p-daemon local repo checkout you can perform an `npm link` to create a binary, `jsp2pd` in the global npm space.
45
+
46
+ ```sh
47
+ $ LIBP2P_JS_BIN=$(which jsp2pd) npm run test
48
+ ```
49
+
50
+ ## Contribute
51
+
52
+ Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/ipfs-interop/issues)!
53
+
54
+ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).
55
+
56
+ [![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md)
57
+
58
+ ## License
59
+
60
+ MIT
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from './index.js';
2
+ export declare function connectTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/connect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkC,aAAa,EAAc,MAAM,YAAY,CAAA;AAG3F,wBAAgB,YAAY,CAAE,OAAO,EAAE,aAAa,QAgBnD"}
@@ -0,0 +1,54 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import { keys } from './resources/keys/index.js';
3
+ export function connectTests(factory) {
4
+ const keyTypes = ['ed25519', 'rsa', 'secp256k1'];
5
+ const impls = ['js', 'go'];
6
+ for (const keyType of keyTypes) {
7
+ for (const implA of impls) {
8
+ for (const implB of impls) {
9
+ runConnectTests(`noise/${keyType}`, factory, { type: implA, noise: true, key: keys.go[keyType] }, { type: implB, noise: true, key: keys.js[keyType] });
10
+ }
11
+ }
12
+ }
13
+ }
14
+ function runConnectTests(name, factory, optionsA, optionsB) {
15
+ describe(`connect using ${name}`, () => {
16
+ let daemons;
17
+ // Start Daemons
18
+ before(async function () {
19
+ this.timeout(20 * 1000);
20
+ daemons = await Promise.all([
21
+ factory.spawn(optionsA),
22
+ factory.spawn(optionsB)
23
+ ]);
24
+ });
25
+ // Stop daemons
26
+ after(async function () {
27
+ if (daemons != null) {
28
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
29
+ }
30
+ });
31
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
32
+ this.timeout(10 * 1000);
33
+ const identify1 = await daemons[0].client.identify();
34
+ const identify2 = await daemons[1].client.identify();
35
+ // verify connected peers
36
+ const knownPeersBeforeConnect1 = await daemons[0].client.listPeers();
37
+ expect(knownPeersBeforeConnect1).to.have.lengthOf(0);
38
+ const knownPeersBeforeConnect2 = await daemons[1].client.listPeers();
39
+ expect(knownPeersBeforeConnect2).to.have.lengthOf(0);
40
+ // connect peers
41
+ await daemons[0].client.connect(identify2.peerId, identify2.addrs);
42
+ // daemons[0] will take some time to get the peers
43
+ await new Promise(resolve => setTimeout(resolve, 1000));
44
+ // verify connected peers
45
+ const knownPeersAfterConnect1 = await daemons[0].client.listPeers();
46
+ expect(knownPeersAfterConnect1).to.have.lengthOf(1);
47
+ expect(knownPeersAfterConnect1[0].toString()).to.equal(identify2.peerId.toString());
48
+ const knownPeersAfterConnect2 = await daemons[1].client.listPeers();
49
+ expect(knownPeersAfterConnect2).to.have.lengthOf(1);
50
+ expect(knownPeersAfterConnect2[0].toString()).to.equal(identify1.peerId.toString());
51
+ });
52
+ });
53
+ }
54
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function contentFetchingTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=content-fetching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-fetching.d.ts","sourceRoot":"","sources":["../../../src/dht/content-fetching.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,aAAa,EAA0B,MAAM,aAAa,CAAA;AAYhF,wBAAgB,oBAAoB,CAAE,OAAO,EAAE,aAAa,QAY3D"}
@@ -0,0 +1,50 @@
1
+ /* eslint-env mocha */
2
+ import { expect } from 'aegir/utils/chai.js';
3
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
5
+ const record = {
6
+ key: uint8ArrayConcat([
7
+ uint8ArrayFromString('/pk/'),
8
+ uint8ArrayFromString('muft89xjpybos8eas1vaq2xrbsx2vkll7is4ocy7pia5fsjlt3c2', 'base36')
9
+ ]),
10
+ value: uint8ArrayFromString('080012a60230820122300d06092a864886f70d01010105000382010f003082010a0282010100c2588f998971dac9e3eef76a311bf9159505aff69ea3b664c55a36aa28ee08de1127228a4d431bb9c0840240c75f6e98a0843a78d945491a3ea5e1f7cee2bc71383510db5290702383975b7bffae9fb40c84cc1220fb4a7db862fffb0de42f8fd8fb33a17deb20f30e2d0f194791fe69355a392f77df35f101e08a2fc95b2c018768938814fcb52482f899f5e90a1905e8abbcdbb1647ad80a5b0417e1ce8320d64197a6ba3848926375c63adebabdf6eb82109bcadfee13b62bf922bbb6f74c1a26c9bc6122d1436787e0e6de3c152b1959701092abef84599f73eaedb2fcef9f87293e1bbe8e0fef3f1a7fd2e8b94c7e633f88473644a63cb948e4d25c54490203010001', 'hex')
11
+ };
12
+ export function contentFetchingTests(factory) {
13
+ const nodeTypes = ['js', 'go'];
14
+ for (const typeA of nodeTypes) {
15
+ for (const typeB of nodeTypes) {
16
+ runContentFetchingTests(factory, { type: typeA, dht: true }, { type: typeB, dht: true });
17
+ }
18
+ }
19
+ }
20
+ function runContentFetchingTests(factory, optionsA, optionsB) {
21
+ describe('dht.contentFetching', () => {
22
+ let daemons;
23
+ // Start Daemons
24
+ before(async function () {
25
+ this.timeout(20 * 1000);
26
+ daemons = await Promise.all([
27
+ factory.spawn(optionsA),
28
+ factory.spawn(optionsB)
29
+ ]);
30
+ // connect them
31
+ const identify0 = await daemons[0].client.identify();
32
+ await daemons[1].client.connect(identify0.peerId, identify0.addrs);
33
+ // jsDaemon1 will take some time to get the peers
34
+ await new Promise(resolve => setTimeout(resolve, 1000));
35
+ });
36
+ // Stop daemons
37
+ after(async function () {
38
+ if (daemons != null) {
39
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
40
+ }
41
+ });
42
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
43
+ this.timeout(10 * 1000);
44
+ await daemons[0].client.dht.put(record.key, record.value);
45
+ const data = await daemons[1].client.dht.get(record.key);
46
+ expect(data).to.equalBytes(record.value);
47
+ });
48
+ });
49
+ }
50
+ //# sourceMappingURL=content-fetching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-fetching.js","sourceRoot":"","sources":["../../../src/dht/content-fetching.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE/D,MAAM,MAAM,GAAG;IACb,GAAG,EAAE,gBAAgB,CAAC;QACpB,oBAAoB,CAAC,MAAM,CAAC;QAC5B,oBAAoB,CAAC,sDAAsD,EAAE,QAAQ,CAAC;KACvF,CAAC;IACF,KAAK,EAAE,oBAAoB,CAAC,wlBAAwlB,EAAE,KAAK,CAAC;CAC7nB,CAAA;AAED,MAAM,UAAU,oBAAoB,CAAE,OAAsB;IAC1D,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,uBAAuB,CACrB,OAAO,EACP,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAC1B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAC3B,CAAA;SACF;KACF;AACH,CAAC;AAED,SAAS,uBAAuB,CAAE,OAAsB,EAAE,QAAsB,EAAE,QAAsB;IACtG,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,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,YAAY,QAAQ,CAAC,IAAI,OAAO,EAAE,KAAK;YACxD,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;YAEvB,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAEzD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function contentRoutingTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=content-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-routing.d.ts","sourceRoot":"","sources":["../../../src/dht/content-routing.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAU,aAAa,EAA0B,MAAM,aAAa,CAAA;AAGhF,wBAAgB,mBAAmB,CAAE,OAAO,EAAE,aAAa,QAiB1D"}
@@ -0,0 +1,50 @@
1
+ /* eslint-env mocha */
2
+ import { expect } from 'aegir/utils/chai.js';
3
+ import { CID } from 'multiformats/cid';
4
+ import all from 'it-all';
5
+ export function contentRoutingTests(factory) {
6
+ const nodeTypes = ['js', 'go'];
7
+ for (const typeA of nodeTypes) {
8
+ for (const typeB of nodeTypes) {
9
+ if (typeA === 'go' && typeB === 'go') {
10
+ // skip go<->go as it never seems to populate the routing tables
11
+ continue;
12
+ }
13
+ runContentRoutingTests(factory, { type: typeA, dht: true }, { type: typeB, dht: true });
14
+ }
15
+ }
16
+ }
17
+ function runContentRoutingTests(factory, optionsA, optionsB) {
18
+ describe('dht.contentRouting', () => {
19
+ let daemons;
20
+ let identify;
21
+ // Start Daemons
22
+ before(async function () {
23
+ this.timeout(20 * 1000);
24
+ daemons = await Promise.all([
25
+ factory.spawn(optionsA),
26
+ factory.spawn(optionsB),
27
+ factory.spawn(optionsB)
28
+ ]);
29
+ identify = await Promise.all(daemons.map(async (d) => await d.client.identify()));
30
+ await daemons[0].client.connect(identify[1].peerId, identify[1].addrs);
31
+ await daemons[0].client.connect(identify[2].peerId, identify[2].addrs);
32
+ // get the peers in the table
33
+ await new Promise(resolve => setTimeout(resolve, 1000));
34
+ });
35
+ // Stop daemons
36
+ after(async function () {
37
+ if (daemons != null) {
38
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
39
+ }
40
+ });
41
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
42
+ const cid = CID.parse('QmVzw6MPsF96TyXBSRs1ptLoVMWRv5FCYJZZGJSVB2Hp39');
43
+ await daemons[0].client.dht.provide(cid);
44
+ const providers = await all(daemons[1].client.dht.findProviders(cid, 1));
45
+ expect(providers).to.exist();
46
+ expect(providers.length).to.be.greaterThan(0);
47
+ });
48
+ });
49
+ }
50
+ //# sourceMappingURL=content-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-routing.js","sourceRoot":"","sources":["../../../src/dht/content-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function dhtTests(factory: DaemonFactory): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dht/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKhD,wBAAsB,QAAQ,CAAE,OAAO,EAAE,aAAa,iBAIrD"}
@@ -0,0 +1,9 @@
1
+ import { contentFetchingTests } from './content-fetching.js';
2
+ import { contentRoutingTests } from './content-routing.js';
3
+ import { peerRoutingTests } from './peer-routing.js';
4
+ export async function dhtTests(factory) {
5
+ await contentFetchingTests(factory);
6
+ await contentRoutingTests(factory);
7
+ await peerRoutingTests(factory);
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dht/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAE,OAAsB;IACpD,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function peerRoutingTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=peer-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-routing.d.ts","sourceRoot":"","sources":["../../../src/dht/peer-routing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,aAAa,EAA0B,MAAM,aAAa,CAAA;AAIhF,wBAAgB,gBAAgB,CAAE,OAAO,EAAE,aAAa,QAYvD"}
@@ -0,0 +1,44 @@
1
+ /* eslint-env mocha */
2
+ import { expect } from 'aegir/utils/chai.js';
3
+ import pRetry from 'p-retry';
4
+ export function peerRoutingTests(factory) {
5
+ const nodeTypes = ['js', 'go'];
6
+ for (const typeA of nodeTypes) {
7
+ for (const typeB of nodeTypes) {
8
+ runPeerRoutingTests(factory, { type: typeA, dht: true }, { type: typeB, dht: true });
9
+ }
10
+ }
11
+ }
12
+ function runPeerRoutingTests(factory, optionsA, optionsB) {
13
+ describe('dht.peerRouting', () => {
14
+ let daemons;
15
+ // Start Daemons
16
+ before(async function () {
17
+ this.timeout(20 * 1000);
18
+ daemons = await Promise.all([
19
+ factory.spawn(optionsA),
20
+ factory.spawn(optionsB),
21
+ factory.spawn(optionsB)
22
+ ]);
23
+ });
24
+ // Stop daemons
25
+ after(async function () {
26
+ if (daemons != null) {
27
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
28
+ }
29
+ });
30
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
31
+ const identify1 = await daemons[1].client.identify();
32
+ const identify2 = await daemons[2].client.identify();
33
+ // peers need at least one peer in their routing table or they fail with:
34
+ // connect 0 => 1
35
+ await daemons[0].client.connect(identify1.peerId, identify1.addrs);
36
+ // connect 0 => 2
37
+ await daemons[0].client.connect(identify2.peerId, identify2.addrs);
38
+ // peer 1 find peer 2, retry up to 10 times to allow the routing table to refresh
39
+ const peerData = await pRetry(async () => await daemons[1].client.dht.findPeer(identify2.peerId), { retries: 10 });
40
+ expect(identify2.addrs.map(ma => ma.toString())).to.include.deep.members(peerData.multiaddrs.map(ma => ma.toString()));
41
+ });
42
+ });
43
+ }
44
+ //# sourceMappingURL=peer-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-routing.js","sourceRoot":"","sources":["../../../src/dht/peer-routing.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,MAAM,MAAM,SAAS,CAAA;AAG5B,MAAM,UAAU,gBAAgB,CAAE,OAAsB;IACtD,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,mBAAmB,CACjB,OAAO,EACP,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAC1B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAC3B,CAAA;SACF;KACF;AACH,CAAC;AAED,SAAS,mBAAmB,CAAE,OAAsB,EAAE,QAAsB,EAAE,QAAsB;IAClG,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,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;gBACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxB,CAAC,CAAA;QACJ,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,YAAY,QAAQ,CAAC,IAAI,OAAO,EAAE,KAAK;YACxD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YACpD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YAEpD,yEAAyE;YACzE,iBAAiB;YACjB,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;YAElE,iBAAiB;YACjB,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;YAElE,iFAAiF;YACjF,MAAM,QAAQ,GAAa,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;YAE5H,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QACxH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { DaemonClient } from '@libp2p/daemon-client';
2
+ export interface Daemon {
3
+ stop: () => Promise<void>;
4
+ client: DaemonClient;
5
+ }
6
+ export declare type NodeType = 'js' | 'go';
7
+ export declare type PeerIdType = 'rsa' | 'ed25519' | 'secp256k1';
8
+ export interface SpawnOptions {
9
+ type: NodeType;
10
+ key?: string;
11
+ noise?: true;
12
+ dht?: boolean;
13
+ pubsub?: boolean;
14
+ pubsubRouter?: 'gossipsub' | 'floodsub';
15
+ }
16
+ export interface DaemonFactory {
17
+ spawn: (options: SpawnOptions) => Promise<Daemon>;
18
+ }
19
+ export default function interopTests(factory: DaemonFactory): Promise<void>;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,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;AAExD,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,WAAW,GAAG,UAAU,CAAA;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAClD;AAED,wBAA8B,YAAY,CAAE,OAAO,EAAE,aAAa,iBAIjE"}
@@ -0,0 +1,9 @@
1
+ import { connectTests } from './connect.js';
2
+ import { dhtTests } from './dht/index.js';
3
+ import { pubsubTests } from './pubsub/index.js';
4
+ export default async function interopTests(factory) {
5
+ await connectTests(factory);
6
+ await dhtTests(factory);
7
+ await pubsubTests(factory);
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;AAwB/C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,YAAY,CAAE,OAAsB;IAChE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;IAC3B,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IACvB,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function floodsubTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=floodsub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floodsub.d.ts","sourceRoot":"","sources":["../../../src/pubsub/floodsub.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,aAAa,EAA0B,MAAM,aAAa,CAAA;AAIhF,wBAAgB,aAAa,CAAE,OAAO,EAAE,aAAa,QAYpD"}
@@ -0,0 +1,52 @@
1
+ /* eslint-env mocha */
2
+ import { expect } from 'aegir/utils/chai.js';
3
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ import first from 'it-first';
5
+ export function floodsubTests(factory) {
6
+ const nodeTypes = ['js', 'go'];
7
+ for (const typeA of nodeTypes) {
8
+ for (const typeB of nodeTypes) {
9
+ runFloodsubTests(factory, { type: typeA, pubsub: true, pubsubRouter: 'floodsub' }, { type: typeB, pubsub: true, pubsubRouter: 'floodsub' });
10
+ }
11
+ }
12
+ }
13
+ function runFloodsubTests(factory, optionsA, optionsB) {
14
+ describe('pubsub.floodSub', () => {
15
+ let daemons;
16
+ // Start Daemons
17
+ before(async function () {
18
+ this.timeout(20 * 1000);
19
+ daemons = await Promise.all([
20
+ factory.spawn(optionsA),
21
+ factory.spawn(optionsB),
22
+ factory.spawn(optionsB)
23
+ ]);
24
+ });
25
+ // Stop daemons
26
+ after(async function () {
27
+ if (daemons != null) {
28
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
29
+ }
30
+ });
31
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
32
+ const topic = 'test-topic';
33
+ const data = uint8ArrayFromString('test-data');
34
+ const subscribeIterator = await daemons[1].client.pubsub.subscribe(topic);
35
+ const subscriber = async () => {
36
+ const message = await first(subscribeIterator);
37
+ expect(message).to.exist();
38
+ expect(message).to.have.property('data').that.equalBytes(data);
39
+ };
40
+ const publisher = async () => {
41
+ // wait for subscription stream
42
+ await new Promise(resolve => setTimeout(resolve, 800));
43
+ await daemons[0].client.pubsub.publish(topic, data);
44
+ };
45
+ return await Promise.all([
46
+ subscriber(),
47
+ publisher()
48
+ ]);
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=floodsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floodsub.js","sourceRoot":"","sources":["../../../src/pubsub/floodsub.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,KAAK,MAAM,UAAU,CAAA;AAE5B,MAAM,UAAU,aAAa,CAAE,OAAsB;IACnD,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,gBAAgB,CACd,OAAO,EACP,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EACvD,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CACxD,CAAA;SACF;KACF;AACH,CAAC;AAED,SAAS,gBAAgB,CAAE,OAAsB,EAAE,QAAsB,EAAE,QAAsB;IAC/F,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,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;gBACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxB,CAAC,CAAA;QACJ,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,YAAY,QAAQ,CAAC,IAAI,OAAO,EAAE,KAAK;YACxD,MAAM,KAAK,GAAG,YAAY,CAAA;YAC1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAA;YAE9C,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACzE,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;gBAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBAE9C,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;gBAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAChE,CAAC,CAAA;YAED,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC3B,+BAA+B;gBAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBACtD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACrD,CAAC,CAAA;YAED,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvB,UAAU,EAAE;gBACZ,SAAS,EAAE;aACZ,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function gossipsubTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=gossipsub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gossipsub.d.ts","sourceRoot":"","sources":["../../../src/pubsub/gossipsub.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,aAAa,EAA0B,MAAM,aAAa,CAAA;AAIhF,wBAAgB,cAAc,CAAE,OAAO,EAAE,aAAa,QAYrD"}
@@ -0,0 +1,52 @@
1
+ /* eslint-env mocha */
2
+ import { expect } from 'aegir/utils/chai.js';
3
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ import first from 'it-first';
5
+ export function gossipsubTests(factory) {
6
+ const nodeTypes = ['js', 'go'];
7
+ for (const typeA of nodeTypes) {
8
+ for (const typeB of nodeTypes) {
9
+ runGossipsubTests(factory, { type: typeA, pubsub: true, pubsubRouter: 'gossipsub' }, { type: typeB, pubsub: true, pubsubRouter: 'gossipsub' });
10
+ }
11
+ }
12
+ }
13
+ function runGossipsubTests(factory, optionsA, optionsB) {
14
+ describe('pubsub.gossipsub', () => {
15
+ let daemons;
16
+ // Start Daemons
17
+ before(async function () {
18
+ this.timeout(20 * 1000);
19
+ daemons = await Promise.all([
20
+ factory.spawn(optionsA),
21
+ factory.spawn(optionsB),
22
+ factory.spawn(optionsB)
23
+ ]);
24
+ });
25
+ // Stop daemons
26
+ after(async function () {
27
+ if (daemons != null) {
28
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
29
+ }
30
+ });
31
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
32
+ const topic = 'test-topic';
33
+ const data = uint8ArrayFromString('test-data');
34
+ const subscribeIterator = await daemons[1].client.pubsub.subscribe(topic);
35
+ const subscriber = async () => {
36
+ const message = await first(subscribeIterator);
37
+ expect(message).to.exist();
38
+ expect(message).to.have.property('data').that.equalBytes(data);
39
+ };
40
+ const publisher = async () => {
41
+ // wait for subscription stream
42
+ await new Promise(resolve => setTimeout(resolve, 800));
43
+ await daemons[0].client.pubsub.publish(topic, data);
44
+ };
45
+ return await Promise.all([
46
+ subscriber(),
47
+ publisher()
48
+ ]);
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=gossipsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gossipsub.js","sourceRoot":"","sources":["../../../src/pubsub/gossipsub.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,KAAK,MAAM,UAAU,CAAA;AAE5B,MAAM,UAAU,cAAc,CAAE,OAAsB;IACpD,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,iBAAiB,CACf,OAAO,EACP,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,EACxD,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CACzD,CAAA;SACF;KACF;AACH,CAAC;AAED,SAAS,iBAAiB,CAAE,OAAsB,EAAE,QAAsB,EAAE,QAAsB;IAChG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,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;gBACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxB,CAAC,CAAA;QACJ,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,YAAY,QAAQ,CAAC,IAAI,OAAO,EAAE,KAAK;YACxD,MAAM,KAAK,GAAG,YAAY,CAAA;YAC1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAA;YAE9C,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACzE,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;gBAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBAE9C,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;gBAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAChE,CAAC,CAAA;YAED,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC3B,+BAA+B;gBAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBACtD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACrD,CAAC,CAAA;YAED,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvB,UAAU,EAAE;gBACZ,SAAS,EAAE;aACZ,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function hybridTests(factory: DaemonFactory): void;
3
+ //# sourceMappingURL=hybrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../../src/pubsub/hybrid.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,aAAa,EAA0B,MAAM,aAAa,CAAA;AAIhF,wBAAgB,WAAW,CAAE,OAAO,EAAE,aAAa,QAYlD"}
@@ -0,0 +1,52 @@
1
+ /* eslint-env mocha */
2
+ import { expect } from 'aegir/utils/chai.js';
3
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ import first from 'it-first';
5
+ export function hybridTests(factory) {
6
+ const nodeTypes = ['js', 'go'];
7
+ for (const typeA of nodeTypes) {
8
+ for (const typeB of nodeTypes) {
9
+ runHybridTests(factory, { type: typeA, pubsub: true, pubsubRouter: 'floodsub' }, { type: typeB, pubsub: true, pubsubRouter: 'gossipsub' });
10
+ }
11
+ }
12
+ }
13
+ function runHybridTests(factory, optionsA, optionsB) {
14
+ describe('pubsub.hybrid', () => {
15
+ let daemons;
16
+ // Start Daemons
17
+ before(async function () {
18
+ this.timeout(20 * 1000);
19
+ daemons = await Promise.all([
20
+ factory.spawn(optionsA),
21
+ factory.spawn(optionsB),
22
+ factory.spawn(optionsB)
23
+ ]);
24
+ });
25
+ // Stop daemons
26
+ after(async function () {
27
+ if (daemons != null) {
28
+ await Promise.all(daemons.map(async (daemon) => await daemon.stop()));
29
+ }
30
+ });
31
+ it(`${optionsA.type} peer to ${optionsB.type} peer`, async function () {
32
+ const topic = 'test-topic';
33
+ const data = uint8ArrayFromString('test-data');
34
+ const subscribeIterator = await daemons[1].client.pubsub.subscribe(topic);
35
+ const subscriber = async () => {
36
+ const message = await first(subscribeIterator);
37
+ expect(message).to.exist();
38
+ expect(message).to.have.property('data').that.equalBytes(data);
39
+ };
40
+ const publisher = async () => {
41
+ // wait for subscription stream
42
+ await new Promise(resolve => setTimeout(resolve, 800));
43
+ await daemons[0].client.pubsub.publish(topic, data);
44
+ };
45
+ return await Promise.all([
46
+ subscriber(),
47
+ publisher()
48
+ ]);
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=hybrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../../src/pubsub/hybrid.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,KAAK,MAAM,UAAU,CAAA;AAE5B,MAAM,UAAU,WAAW,CAAE,OAAsB;IACjD,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAE1C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;YAC7B,cAAc,CACZ,OAAO,EACP,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EACvD,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CACzD,CAAA;SACF;KACF;AACH,CAAC;AAED,SAAS,cAAc,CAAE,OAAsB,EAAE,QAAsB,EAAE,QAAsB;IAC7F,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,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;gBACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aACxB,CAAC,CAAA;QACJ,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,YAAY,QAAQ,CAAC,IAAI,OAAO,EAAE,KAAK;YACxD,MAAM,KAAK,GAAG,YAAY,CAAA;YAC1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAA;YAE9C,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACzE,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;gBAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBAE9C,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;gBAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAChE,CAAC,CAAA;YAED,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC3B,+BAA+B;gBAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBACtD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACrD,CAAC,CAAA;YAED,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvB,UAAU,EAAE;gBACZ,SAAS,EAAE;aACZ,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DaemonFactory } from '../index.js';
2
+ export declare function pubsubTests(factory: DaemonFactory): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pubsub/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKhD,wBAAsB,WAAW,CAAE,OAAO,EAAE,aAAa,iBAIxD"}
@@ -0,0 +1,9 @@
1
+ import { floodsubTests } from './floodsub.js';
2
+ import { gossipsubTests } from './gossipsub.js';
3
+ import { hybridTests } from './hybrid.js';
4
+ export async function pubsubTests(factory) {
5
+ await floodsubTests(factory);
6
+ await gossipsubTests(factory);
7
+ await hybridTests(factory);
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pubsub/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAE,OAAsB;IACvD,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,cAAc,CAAC,OAAO,CAAC,CAAA;IAC7B,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC"}
@@ -0,0 +1 @@
1
+ `��‘�W��ע���Fv=�E�O*bb��eJK"��Pk�a��W��bs��|��������8*�y+���Pk�a��W��bs��|��������8*�y+�