@libp2p/pubsub 0.0.0 → 1.0.2

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 (76) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +35 -0
  3. package/dist/src/errors.d.ts +39 -0
  4. package/dist/src/errors.d.ts.map +1 -0
  5. package/dist/src/errors.js +41 -0
  6. package/dist/src/errors.js.map +1 -0
  7. package/dist/src/index.d.ts +180 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +467 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/message/rpc.d.ts +258 -0
  12. package/dist/src/message/rpc.js +699 -0
  13. package/dist/src/message/sign.d.ts +17 -0
  14. package/dist/src/message/sign.d.ts.map +1 -0
  15. package/dist/src/message/sign.js +84 -0
  16. package/dist/src/message/sign.js.map +1 -0
  17. package/dist/src/message/topic-descriptor.d.ts +254 -0
  18. package/dist/src/message/topic-descriptor.js +647 -0
  19. package/dist/src/peer-streams.d.ts +67 -0
  20. package/dist/src/peer-streams.d.ts.map +1 -0
  21. package/dist/src/peer-streams.js +112 -0
  22. package/dist/src/peer-streams.js.map +1 -0
  23. package/dist/src/utils.d.ts +29 -0
  24. package/dist/src/utils.d.ts.map +1 -0
  25. package/dist/src/utils.js +80 -0
  26. package/dist/src/utils.js.map +1 -0
  27. package/dist/test/emit-self.spec.d.ts +2 -0
  28. package/dist/test/emit-self.spec.d.ts.map +1 -0
  29. package/dist/test/emit-self.spec.js +63 -0
  30. package/dist/test/emit-self.spec.js.map +1 -0
  31. package/dist/test/instance.spec.d.ts +2 -0
  32. package/dist/test/instance.spec.d.ts.map +1 -0
  33. package/dist/test/instance.spec.js +50 -0
  34. package/dist/test/instance.spec.js.map +1 -0
  35. package/dist/test/lifesycle.spec.d.ts +2 -0
  36. package/dist/test/lifesycle.spec.d.ts.map +1 -0
  37. package/dist/test/lifesycle.spec.js +192 -0
  38. package/dist/test/lifesycle.spec.js.map +1 -0
  39. package/dist/test/message.spec.d.ts +2 -0
  40. package/dist/test/message.spec.d.ts.map +1 -0
  41. package/dist/test/message.spec.js +83 -0
  42. package/dist/test/message.spec.js.map +1 -0
  43. package/dist/test/pubsub.spec.d.ts +2 -0
  44. package/dist/test/pubsub.spec.d.ts.map +1 -0
  45. package/dist/test/pubsub.spec.js +310 -0
  46. package/dist/test/pubsub.spec.js.map +1 -0
  47. package/dist/test/sign.spec.d.ts +2 -0
  48. package/dist/test/sign.spec.d.ts.map +1 -0
  49. package/dist/test/sign.spec.js +93 -0
  50. package/dist/test/sign.spec.js.map +1 -0
  51. package/dist/test/topic-validators.spec.d.ts +2 -0
  52. package/dist/test/topic-validators.spec.d.ts.map +1 -0
  53. package/dist/test/topic-validators.spec.js +86 -0
  54. package/dist/test/topic-validators.spec.js.map +1 -0
  55. package/dist/test/utils/index.d.ts +23 -0
  56. package/dist/test/utils/index.d.ts.map +1 -0
  57. package/dist/test/utils/index.js +86 -0
  58. package/dist/test/utils/index.js.map +1 -0
  59. package/dist/test/utils.spec.d.ts +2 -0
  60. package/dist/test/utils.spec.d.ts.map +1 -0
  61. package/dist/test/utils.spec.js +53 -0
  62. package/dist/test/utils.spec.js.map +1 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +192 -4
  65. package/src/README.md +251 -0
  66. package/src/errors.ts +45 -0
  67. package/src/index.ts +610 -0
  68. package/src/message/rpc.d.ts +258 -0
  69. package/src/message/rpc.js +699 -0
  70. package/src/message/rpc.proto +20 -0
  71. package/src/message/sign.ts +101 -0
  72. package/src/message/topic-descriptor.d.ts +254 -0
  73. package/src/message/topic-descriptor.js +647 -0
  74. package/src/message/topic-descriptor.proto +30 -0
  75. package/src/peer-streams.ts +169 -0
  76. package/src/utils.ts +93 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-streams.d.ts","sourceRoot":"","sources":["../../src/peer-streams.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,QAAQ,MAAM,aAAa,CAAA;AAIlC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAMlE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,SAAgB,EAAE,EAAE,MAAM,CAAA;IAC1B,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAChC;;OAEG;IACI,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,CAAA;IAChE;;OAEG;IACI,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAAA;IAC3D;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAyB;IACnD;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAAyB;IAClD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAiB;gBAE5C,IAAI,EAAE,OAAO;IAS1B;;;;OAIG;IACH,IAAI,UAAU,YAEb;IAED;;;;OAIG;IACH,IAAI,UAAU,YAEb;IAED;;;OAGG;IACH,KAAK,CAAE,IAAI,EAAE,UAAU;IASvB;;OAEG;IACH,mBAAmB,CAAE,MAAM,EAAE,WAAW;IAmBxC;;OAEG;IACG,oBAAoB,CAAE,MAAM,EAAE,WAAW;IAsC/C;;OAEG;IACH,KAAK;CAgBN"}
@@ -0,0 +1,112 @@
1
+ import debug from 'debug';
2
+ import { EventEmitter } from 'events';
3
+ import lp from 'it-length-prefixed';
4
+ import pushable from 'it-pushable';
5
+ import { pipe } from 'it-pipe';
6
+ import { source as abortable } from 'abortable-iterator';
7
+ import AbortController from 'abort-controller';
8
+ const log = Object.assign(debug('libp2p-pubsub:peer-streams'), {
9
+ error: debug('libp2p-pubsub:peer-streams:err')
10
+ });
11
+ /**
12
+ * Thin wrapper around a peer's inbound / outbound pubsub streams
13
+ */
14
+ export class PeerStreams extends EventEmitter {
15
+ constructor(opts) {
16
+ super();
17
+ this.id = opts.id;
18
+ this.protocol = opts.protocol;
19
+ this._inboundAbortController = new AbortController();
20
+ }
21
+ /**
22
+ * Do we have a connection to read from?
23
+ *
24
+ * @type {boolean}
25
+ */
26
+ get isReadable() {
27
+ return Boolean(this.inboundStream);
28
+ }
29
+ /**
30
+ * Do we have a connection to write on?
31
+ *
32
+ * @type {boolean}
33
+ */
34
+ get isWritable() {
35
+ return Boolean(this.outboundStream);
36
+ }
37
+ /**
38
+ * Send a message to this peer.
39
+ * Throws if there is no `stream` to write to available.
40
+ */
41
+ write(data) {
42
+ if (this.outboundStream == null) {
43
+ const id = this.id.toString();
44
+ throw new Error('No writable connection to ' + id);
45
+ }
46
+ this.outboundStream.push(data);
47
+ }
48
+ /**
49
+ * Attach a raw inbound stream and setup a read stream
50
+ */
51
+ attachInboundStream(stream) {
52
+ // Create and attach a new inbound stream
53
+ // The inbound stream is:
54
+ // - abortable, set to only return on abort, rather than throw
55
+ // - transformed with length-prefix transform
56
+ this._rawInboundStream = stream;
57
+ this.inboundStream = abortable(pipe(this._rawInboundStream, lp.decode()), this._inboundAbortController.signal, { returnOnAbort: true });
58
+ this.emit('stream:inbound');
59
+ return this.inboundStream;
60
+ }
61
+ /**
62
+ * Attach a raw outbound stream and setup a write stream
63
+ */
64
+ async attachOutboundStream(stream) {
65
+ // If an outbound stream already exists, gently close it
66
+ const _prevStream = this.outboundStream;
67
+ if (this.outboundStream != null) {
68
+ // End the stream without emitting a close event
69
+ await this.outboundStream.end();
70
+ }
71
+ this._rawOutboundStream = stream;
72
+ this.outboundStream = pushable({
73
+ onEnd: (shouldEmit) => {
74
+ // close writable side of the stream
75
+ if ((this._rawOutboundStream?.reset) != null) {
76
+ this._rawOutboundStream.reset();
77
+ }
78
+ this._rawOutboundStream = undefined;
79
+ this.outboundStream = undefined;
80
+ if (shouldEmit != null) {
81
+ this.emit('close');
82
+ }
83
+ }
84
+ });
85
+ pipe(this.outboundStream, lp.encode(), this._rawOutboundStream).catch((err) => {
86
+ log.error(err);
87
+ });
88
+ // Only emit if the connection is new
89
+ if (_prevStream == null) {
90
+ this.emit('stream:outbound');
91
+ }
92
+ }
93
+ /**
94
+ * Closes the open connection to peer
95
+ */
96
+ close() {
97
+ // End the outbound stream
98
+ if (this.outboundStream != null) {
99
+ this.outboundStream.end();
100
+ }
101
+ // End the inbound stream
102
+ if (this.inboundStream != null) {
103
+ this._inboundAbortController.abort();
104
+ }
105
+ this._rawOutboundStream = undefined;
106
+ this.outboundStream = undefined;
107
+ this._rawInboundStream = undefined;
108
+ this.inboundStream = undefined;
109
+ this.emit('close');
110
+ }
111
+ }
112
+ //# sourceMappingURL=peer-streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-streams.js","sourceRoot":"","sources":["../../src/peer-streams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACnC,OAAO,QAAQ,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,eAAe,MAAM,kBAAkB,CAAA;AAI9C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE;IAC7D,KAAK,EAAE,KAAK,CAAC,gCAAgC,CAAC;CAC/C,CAAC,CAAA;AAOF;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IAwB3C,YAAa,IAAa;QACxB,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE7B,IAAI,CAAC,uBAAuB,GAAG,IAAI,eAAe,EAAE,CAAA;IACtD,CAAC;IAED;;;;OAIG;IACH,IAAI,UAAU;QACZ,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACH,IAAI,UAAU;QACZ,OAAO,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACrC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAE,IAAgB;QACrB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAA;YAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAA;SACnD;QAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAE,MAAmB;QACtC,yCAAyC;QACzC,yBAAyB;QACzB,8DAA8D;QAC9D,6CAA6C;QAC7C,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAC5B,IAAI,CACF,IAAI,CAAC,iBAAiB,EACtB,EAAE,CAAC,MAAM,EAAE,CACZ,EACD,IAAI,CAAC,uBAAuB,CAAC,MAAM,EACnC,EAAE,aAAa,EAAE,IAAI,EAAE,CACxB,CAAA;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAE,MAAmB;QAC7C,wDAAwD;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAA;QACvC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;YAC/B,gDAAgD;YAChD,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;SAChC;QAED,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAA;QAChC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;YAC7B,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;gBACpB,oCAAoC;gBACpC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;oBAC5C,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;iBAChC;gBAED,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAA;gBACnC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;gBAC/B,IAAI,UAAU,IAAI,IAAI,EAAE;oBACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;iBACnB;YACH,CAAC;SACF,CAAC,CAAA;QAEF,IAAI,CACF,IAAI,CAAC,cAAc,EACnB,EAAE,CAAC,MAAM,EAAE,EACX,IAAI,CAAC,kBAAkB,CACxB,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YACrB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;QAEF,qCAAqC;QACrC,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;SAC7B;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,0BAA0B;QAC1B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;YAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;SAC1B;QACD,yBAAyB;QACzB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAA;SACrC;QAED,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAA;QACnC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;QAC/B,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import type * as RPC from './message/rpc.js';
2
+ import type { Message } from '@libp2p/interfaces/pubsub';
3
+ /**
4
+ * Generate a random sequence number
5
+ */
6
+ export declare const randomSeqno: () => any;
7
+ /**
8
+ * Generate a message id, based on the `from` and `seqno`
9
+ */
10
+ export declare const msgId: (from: Uint8Array | string, seqno: Uint8Array) => Uint8Array;
11
+ /**
12
+ * Generate a message id, based on message `data`
13
+ */
14
+ export declare const noSignMsgId: (data: Uint8Array) => import("multiformats/hashes/hasher").Await<Uint8Array>;
15
+ /**
16
+ * Check if any member of the first set is also a member
17
+ * of the second set
18
+ */
19
+ export declare const anyMatch: (a: Set<number> | number[], b: Set<number> | number[]) => boolean;
20
+ /**
21
+ * Make everything an array
22
+ */
23
+ export declare const ensureArray: <T>(maybeArray: T | T[]) => T[];
24
+ /**
25
+ * Ensures `message.from` is base58 encoded
26
+ */
27
+ export declare const normalizeInRpcMessage: (message: RPC.RPC.IMessage, peerId?: string | undefined) => any;
28
+ export declare const normalizeOutRpcMessage: (message: Message) => Message;
29
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,GAAG,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,WAAW,WAEvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,SAAU,UAAU,GAAG,MAAM,SAAS,UAAU,eAajE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,SAAU,UAAU,2DAAwB,CAAA;AAEpE;;;GAGG;AACH,eAAO,MAAM,QAAQ,MAAO,IAAI,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,GAAG,MAAM,EAAE,YAe5E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,iCAMvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,YAAa,OAAO,CAAC,QAAQ,qCAS9D,CAAA;AAED,eAAO,MAAM,sBAAsB,YAAa,OAAO,YAStD,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { randomBytes } from 'iso-random-stream';
2
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
3
+ import { PeerId } from '@libp2p/peer-id';
4
+ import { sha256 } from 'multiformats/hashes/sha2';
5
+ /**
6
+ * Generate a random sequence number
7
+ */
8
+ export const randomSeqno = () => {
9
+ return randomBytes(8);
10
+ };
11
+ /**
12
+ * Generate a message id, based on the `from` and `seqno`
13
+ */
14
+ export const msgId = (from, seqno) => {
15
+ let fromBytes;
16
+ if (from instanceof Uint8Array) {
17
+ fromBytes = PeerId.fromBytes(from).multihash.digest;
18
+ }
19
+ else {
20
+ fromBytes = PeerId.fromString(from).multihash.digest;
21
+ }
22
+ const msgId = new Uint8Array(fromBytes.length + seqno.length);
23
+ msgId.set(fromBytes, 0);
24
+ msgId.set(seqno, fromBytes.length);
25
+ return msgId;
26
+ };
27
+ /**
28
+ * Generate a message id, based on message `data`
29
+ */
30
+ export const noSignMsgId = (data) => sha256.encode(data);
31
+ /**
32
+ * Check if any member of the first set is also a member
33
+ * of the second set
34
+ */
35
+ export const anyMatch = (a, b) => {
36
+ let bHas;
37
+ if (Array.isArray(b)) {
38
+ bHas = (val) => b.includes(val);
39
+ }
40
+ else {
41
+ bHas = (val) => b.has(val);
42
+ }
43
+ for (const val of a) {
44
+ if (bHas(val)) {
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ };
50
+ /**
51
+ * Make everything an array
52
+ */
53
+ export const ensureArray = function (maybeArray) {
54
+ if (!Array.isArray(maybeArray)) {
55
+ return [maybeArray];
56
+ }
57
+ return maybeArray;
58
+ };
59
+ /**
60
+ * Ensures `message.from` is base58 encoded
61
+ */
62
+ export const normalizeInRpcMessage = (message, peerId) => {
63
+ // @ts-expect-error receivedFrom not yet defined
64
+ const m = Object.assign({}, message);
65
+ if (peerId != null) {
66
+ m.receivedFrom = peerId;
67
+ }
68
+ return m;
69
+ };
70
+ export const normalizeOutRpcMessage = (message) => {
71
+ const m = Object.assign({}, message);
72
+ if (typeof message.from === 'string') {
73
+ m.from = uint8ArrayFromString(message.from, 'base58btc');
74
+ }
75
+ if (typeof message.data === 'string') {
76
+ m.data = uint8ArrayFromString(message.data);
77
+ }
78
+ return m;
79
+ };
80
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=emit-self.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-self.spec.d.ts","sourceRoot":"","sources":["../../test/emit-self.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import { createPeerId, mockRegistrar, PubsubImplementation } from './utils/index.js';
3
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ import delay from 'delay';
5
+ const protocol = '/pubsub/1.0.0';
6
+ const topic = 'foo';
7
+ const data = uint8ArrayFromString('bar');
8
+ const shouldNotHappen = () => expect.fail();
9
+ describe('emitSelf', () => {
10
+ let pubsub;
11
+ describe('enabled', () => {
12
+ before(async () => {
13
+ const peerId = await createPeerId();
14
+ pubsub = new PubsubImplementation({
15
+ multicodecs: [protocol],
16
+ libp2p: {
17
+ peerId,
18
+ registrar: mockRegistrar
19
+ },
20
+ emitSelf: true
21
+ });
22
+ });
23
+ before(async () => {
24
+ await pubsub.start();
25
+ pubsub.subscribe(topic);
26
+ });
27
+ after(async () => {
28
+ await pubsub.stop();
29
+ });
30
+ it('should emit to self on publish', async () => {
31
+ const promise = new Promise((resolve) => pubsub.once(topic, resolve));
32
+ await pubsub.publish(topic, data);
33
+ return await promise;
34
+ });
35
+ });
36
+ describe('disabled', () => {
37
+ before(async () => {
38
+ const peerId = await createPeerId();
39
+ pubsub = new PubsubImplementation({
40
+ multicodecs: [protocol],
41
+ libp2p: {
42
+ peerId,
43
+ registrar: mockRegistrar
44
+ },
45
+ emitSelf: false
46
+ });
47
+ });
48
+ before(async () => {
49
+ await pubsub.start();
50
+ pubsub.subscribe(topic);
51
+ });
52
+ after(async () => {
53
+ await pubsub.stop();
54
+ });
55
+ it('should not emit to self on publish', async () => {
56
+ pubsub.once(topic, () => shouldNotHappen);
57
+ await pubsub.publish(topic, data);
58
+ // Wait 1 second to guarantee that self is not noticed
59
+ await delay(1000);
60
+ });
61
+ });
62
+ });
63
+ //# sourceMappingURL=emit-self.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-self.spec.js","sourceRoot":"","sources":["../../test/emit-self.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,oBAAoB,EACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,QAAQ,GAAG,eAAe,CAAA;AAChC,MAAM,KAAK,GAAG,KAAK,CAAA;AACnB,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;AACxC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AAE3C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,MAA4B,CAAA;IAEhC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAA;YAEnC,MAAM,GAAG,IAAI,oBAAoB,CAAC;gBAChC,WAAW,EAAE,CAAC,QAAQ,CAAC;gBACvB,MAAM,EAAE;oBACN,MAAM;oBACN,SAAS,EAAE,aAAa;iBACzB;gBACD,QAAQ,EAAE,IAAI;aACf,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;YAErE,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAEjC,OAAO,MAAM,OAAO,CAAA;QACtB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAA;YAEnC,MAAM,GAAG,IAAI,oBAAoB,CAAC;gBAChC,WAAW,EAAE,CAAC,QAAQ,CAAC;gBACvB,MAAM,EAAE;oBACN,MAAM;oBACN,SAAS,EAAE,aAAa;iBACzB;gBACD,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAA;YAEzC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAEjC,sDAAsD;YACtD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=instance.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.spec.d.ts","sourceRoot":"","sources":["../../test/instance.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import { PubsubBaseProtocol } from '../src/index.js';
3
+ import { createPeerId, mockRegistrar } from './utils/index.js';
4
+ class PubsubProtocol extends PubsubBaseProtocol {
5
+ async _publish(message) {
6
+ throw new Error('Method not implemented.');
7
+ }
8
+ }
9
+ describe('pubsub instance', () => {
10
+ let peerId;
11
+ before(async () => {
12
+ peerId = await createPeerId();
13
+ });
14
+ it('should throw if no debugName is provided', () => {
15
+ expect(() => {
16
+ // @ts-expect-error incorrect constructor args
17
+ new PubsubProtocol(); // eslint-disable-line no-new
18
+ }).to.throw();
19
+ });
20
+ it('should throw if no multicodec is provided', () => {
21
+ expect(() => {
22
+ // @ts-expect-error incorrect constructor args
23
+ new PubsubProtocol({
24
+ debugName: 'pubsub'
25
+ });
26
+ }).to.throw();
27
+ });
28
+ it('should throw if no libp2p is provided', () => {
29
+ expect(() => {
30
+ // @ts-expect-error incorrect constructor args
31
+ new PubsubProtocol({
32
+ debugName: 'pubsub',
33
+ multicodecs: ['/pubsub/1.0.0']
34
+ });
35
+ }).to.throw();
36
+ });
37
+ it('should accept valid parameters', () => {
38
+ expect(() => {
39
+ new PubsubProtocol({
40
+ debugName: 'pubsub',
41
+ multicodecs: ['/pubsub/1.0.0'],
42
+ libp2p: {
43
+ peerId: peerId,
44
+ registrar: mockRegistrar
45
+ }
46
+ });
47
+ }).not.to.throw();
48
+ });
49
+ });
50
+ //# sourceMappingURL=instance.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.spec.js","sourceRoot":"","sources":["../../test/instance.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EACL,YAAY,EACZ,aAAa,EACd,MAAM,kBAAkB,CAAA;AAIzB,MAAM,cAAe,SAAQ,kBAAkB;IAC7C,KAAK,CAAC,QAAQ,CAAE,OAAgB;QAC9B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;CACF;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,MAAc,CAAA;IAElB,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,GAAG,MAAM,YAAY,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE;YACV,8CAA8C;YAC9C,IAAI,cAAc,EAAE,CAAA,CAAC,6BAA6B;QACpD,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE;YACV,8CAA8C;YAC9C,IAAI,cAAc,CAAC;gBACjB,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE;YACV,8CAA8C;YAC9C,IAAI,cAAc,CAAC;gBACjB,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,CAAC,eAAe,CAAC;aAC/B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE;YACV,IAAI,cAAc,CAAC;gBACjB,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,CAAC,eAAe,CAAC;gBAC9B,MAAM,EAAE;oBACN,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,aAAa;iBACzB;aACF,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lifesycle.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifesycle.spec.d.ts","sourceRoot":"","sources":["../../test/lifesycle.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,192 @@
1
+ import { expect } from 'aegir/utils/chai.js';
2
+ import sinon from 'sinon';
3
+ import { PubsubBaseProtocol } from '../src/index.js';
4
+ import { createPeerId, createMockRegistrar, PubsubImplementation, ConnectionPair } from './utils/index.js';
5
+ class PubsubProtocol extends PubsubBaseProtocol {
6
+ async _publish(message) {
7
+ throw new Error('Method not implemented.');
8
+ }
9
+ }
10
+ describe('pubsub base lifecycle', () => {
11
+ describe('should start and stop properly', () => {
12
+ let pubsub;
13
+ let sinonMockRegistrar;
14
+ beforeEach(async () => {
15
+ const peerId = await createPeerId();
16
+ sinonMockRegistrar = {
17
+ handle: sinon.stub(),
18
+ register: sinon.stub().returns(`id-${Math.random()}`),
19
+ unregister: sinon.stub()
20
+ };
21
+ pubsub = new PubsubProtocol({
22
+ debugName: 'pubsub',
23
+ multicodecs: ['/pubsub/1.0.0'],
24
+ libp2p: {
25
+ peerId: peerId,
26
+ registrar: sinonMockRegistrar
27
+ }
28
+ });
29
+ expect(pubsub.peers.size).to.be.eql(0);
30
+ });
31
+ afterEach(() => {
32
+ sinon.restore();
33
+ });
34
+ it('should be able to start and stop', async () => {
35
+ await pubsub.start();
36
+ expect(sinonMockRegistrar.handle).to.have.property('calledOnce', true);
37
+ expect(sinonMockRegistrar.register).to.have.property('calledOnce', true);
38
+ await pubsub.stop();
39
+ expect(sinonMockRegistrar.unregister).to.have.property('calledOnce', true);
40
+ });
41
+ it('starting should not throw if already started', async () => {
42
+ await pubsub.start();
43
+ await pubsub.start();
44
+ expect(sinonMockRegistrar.handle).to.have.property('calledOnce', true);
45
+ expect(sinonMockRegistrar.register).to.have.property('calledOnce', true);
46
+ await pubsub.stop();
47
+ expect(sinonMockRegistrar.unregister).to.have.property('calledOnce', true);
48
+ });
49
+ it('stopping should not throw if not started', async () => {
50
+ await pubsub.stop();
51
+ expect(sinonMockRegistrar.register).to.have.property('calledOnce', false);
52
+ expect(sinonMockRegistrar.unregister).to.have.property('calledOnce', false);
53
+ });
54
+ });
55
+ describe('should be able to register two nodes', () => {
56
+ const protocol = '/pubsub/1.0.0';
57
+ let pubsubA, pubsubB;
58
+ let peerIdA, peerIdB;
59
+ const registrarRecordA = new Map();
60
+ const registrarRecordB = new Map();
61
+ // mount pubsub
62
+ beforeEach(async () => {
63
+ peerIdA = await createPeerId();
64
+ peerIdB = await createPeerId();
65
+ pubsubA = new PubsubImplementation({
66
+ multicodecs: [protocol],
67
+ libp2p: {
68
+ peerId: peerIdA,
69
+ registrar: createMockRegistrar(registrarRecordA)
70
+ }
71
+ });
72
+ pubsubB = new PubsubImplementation({
73
+ multicodecs: [protocol],
74
+ libp2p: {
75
+ peerId: peerIdB,
76
+ registrar: createMockRegistrar(registrarRecordB)
77
+ }
78
+ });
79
+ });
80
+ // start pubsub
81
+ beforeEach(() => {
82
+ pubsubA.start();
83
+ pubsubB.start();
84
+ expect(registrarRecordA).to.have.lengthOf(1);
85
+ expect(registrarRecordB).to.have.lengthOf(1);
86
+ });
87
+ afterEach(async () => {
88
+ sinon.restore();
89
+ return await Promise.all([
90
+ pubsubA.stop(),
91
+ pubsubB.stop()
92
+ ]);
93
+ });
94
+ it('should handle onConnect as expected', async () => {
95
+ const onConnectA = registrarRecordA.get(protocol).onConnect;
96
+ const handlerB = registrarRecordB.get(protocol).handler;
97
+ // Notice peers of connection
98
+ const [c0, c1] = ConnectionPair();
99
+ await onConnectA(peerIdB, c0);
100
+ await handlerB({
101
+ protocol,
102
+ stream: c1.stream,
103
+ connection: {
104
+ remotePeer: peerIdA
105
+ }
106
+ });
107
+ expect(pubsubA.peers.size).to.be.eql(1);
108
+ expect(pubsubB.peers.size).to.be.eql(1);
109
+ });
110
+ it('should use the latest connection if onConnect is called more than once', async () => {
111
+ const onConnectA = registrarRecordA.get(protocol).onConnect;
112
+ const handlerB = registrarRecordB.get(protocol).handler;
113
+ // Notice peers of connection
114
+ const [c0, c1] = ConnectionPair();
115
+ const [c2] = ConnectionPair();
116
+ sinon.spy(c0, 'newStream');
117
+ await onConnectA(peerIdB, c0);
118
+ await handlerB({
119
+ protocol,
120
+ stream: c1.stream,
121
+ connection: {
122
+ remotePeer: peerIdA
123
+ }
124
+ });
125
+ expect(c0.newStream).to.have.property('callCount', 1);
126
+ // @ts-expect-error _removePeer is a protected method
127
+ sinon.spy(pubsubA, '_removePeer');
128
+ sinon.spy(c2, 'newStream');
129
+ await onConnectA(peerIdB, c2);
130
+ expect(c2.newStream).to.have.property('callCount', 1);
131
+ // @ts-expect-error _removePeer is a protected method
132
+ expect(pubsubA._removePeer).to.have.property('callCount', 0);
133
+ // Verify the first stream was closed
134
+ // @ts-expect-error .returnValues is a sinon property
135
+ const { stream: firstStream } = await c0.newStream.returnValues[0];
136
+ try {
137
+ await firstStream.sink(['test']);
138
+ }
139
+ catch (err) {
140
+ expect(err).to.exist();
141
+ return;
142
+ }
143
+ expect.fail('original stream should have ended');
144
+ });
145
+ it('should handle newStream errors in onConnect', async () => {
146
+ const onConnectA = registrarRecordA.get(protocol).onConnect;
147
+ const handlerB = registrarRecordB.get(protocol).handler;
148
+ // Notice peers of connection
149
+ const [c0, c1] = ConnectionPair();
150
+ const error = new Error('new stream error');
151
+ sinon.stub(c0, 'newStream').throws(error);
152
+ await onConnectA(peerIdB, c0);
153
+ await handlerB({
154
+ protocol,
155
+ stream: c1.stream,
156
+ connection: {
157
+ remotePeer: peerIdA
158
+ }
159
+ });
160
+ expect(c0.newStream).to.have.property('callCount', 1);
161
+ });
162
+ it('should handle onDisconnect as expected', async () => {
163
+ const onConnectA = registrarRecordA.get(protocol).onConnect;
164
+ const onDisconnectA = registrarRecordA.get(protocol).onDisconnect;
165
+ const handlerB = registrarRecordB.get(protocol).handler;
166
+ const onDisconnectB = registrarRecordB.get(protocol).onDisconnect;
167
+ // Notice peers of connection
168
+ const [c0, c1] = ConnectionPair();
169
+ await onConnectA(peerIdB, c0);
170
+ await handlerB({
171
+ protocol,
172
+ stream: c1.stream,
173
+ connection: {
174
+ remotePeer: peerIdA
175
+ }
176
+ });
177
+ // Notice peers of disconnect
178
+ onDisconnectA(peerIdB);
179
+ onDisconnectB(peerIdA);
180
+ expect(pubsubA.peers.size).to.be.eql(0);
181
+ expect(pubsubB.peers.size).to.be.eql(0);
182
+ });
183
+ it('should handle onDisconnect for unknown peers', () => {
184
+ const onDisconnectA = registrarRecordA.get(protocol).onDisconnect;
185
+ expect(pubsubA.peers.size).to.be.eql(0);
186
+ // Notice peers of disconnect
187
+ onDisconnectA(peerIdB);
188
+ expect(pubsubA.peers.size).to.be.eql(0);
189
+ });
190
+ });
191
+ });
192
+ //# sourceMappingURL=lifesycle.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifesycle.spec.js","sourceRoot":"","sources":["../../test/lifesycle.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.spec.d.ts","sourceRoot":"","sources":["../../test/message.spec.ts"],"names":[],"mappings":""}