@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.
- package/LICENSE +4 -0
- package/README.md +35 -0
- package/dist/src/errors.d.ts +39 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +41 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +180 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +467 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/message/rpc.d.ts +258 -0
- package/dist/src/message/rpc.js +699 -0
- package/dist/src/message/sign.d.ts +17 -0
- package/dist/src/message/sign.d.ts.map +1 -0
- package/dist/src/message/sign.js +84 -0
- package/dist/src/message/sign.js.map +1 -0
- package/dist/src/message/topic-descriptor.d.ts +254 -0
- package/dist/src/message/topic-descriptor.js +647 -0
- package/dist/src/peer-streams.d.ts +67 -0
- package/dist/src/peer-streams.d.ts.map +1 -0
- package/dist/src/peer-streams.js +112 -0
- package/dist/src/peer-streams.js.map +1 -0
- package/dist/src/utils.d.ts +29 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +80 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/test/emit-self.spec.d.ts +2 -0
- package/dist/test/emit-self.spec.d.ts.map +1 -0
- package/dist/test/emit-self.spec.js +63 -0
- package/dist/test/emit-self.spec.js.map +1 -0
- package/dist/test/instance.spec.d.ts +2 -0
- package/dist/test/instance.spec.d.ts.map +1 -0
- package/dist/test/instance.spec.js +50 -0
- package/dist/test/instance.spec.js.map +1 -0
- package/dist/test/lifesycle.spec.d.ts +2 -0
- package/dist/test/lifesycle.spec.d.ts.map +1 -0
- package/dist/test/lifesycle.spec.js +192 -0
- package/dist/test/lifesycle.spec.js.map +1 -0
- package/dist/test/message.spec.d.ts +2 -0
- package/dist/test/message.spec.d.ts.map +1 -0
- package/dist/test/message.spec.js +83 -0
- package/dist/test/message.spec.js.map +1 -0
- package/dist/test/pubsub.spec.d.ts +2 -0
- package/dist/test/pubsub.spec.d.ts.map +1 -0
- package/dist/test/pubsub.spec.js +310 -0
- package/dist/test/pubsub.spec.js.map +1 -0
- package/dist/test/sign.spec.d.ts +2 -0
- package/dist/test/sign.spec.d.ts.map +1 -0
- package/dist/test/sign.spec.js +93 -0
- package/dist/test/sign.spec.js.map +1 -0
- package/dist/test/topic-validators.spec.d.ts +2 -0
- package/dist/test/topic-validators.spec.d.ts.map +1 -0
- package/dist/test/topic-validators.spec.js +86 -0
- package/dist/test/topic-validators.spec.js.map +1 -0
- package/dist/test/utils/index.d.ts +23 -0
- package/dist/test/utils/index.d.ts.map +1 -0
- package/dist/test/utils/index.js +86 -0
- package/dist/test/utils/index.js.map +1 -0
- package/dist/test/utils.spec.d.ts +2 -0
- package/dist/test/utils.spec.d.ts.map +1 -0
- package/dist/test/utils.spec.js +53 -0
- package/dist/test/utils.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +192 -4
- package/src/README.md +251 -0
- package/src/errors.ts +45 -0
- package/src/index.ts +610 -0
- package/src/message/rpc.d.ts +258 -0
- package/src/message/rpc.js +699 -0
- package/src/message/rpc.proto +20 -0
- package/src/message/sign.ts +101 -0
- package/src/message/topic-descriptor.d.ts +254 -0
- package/src/message/topic-descriptor.js +647 -0
- package/src/message/topic-descriptor.proto +30 -0
- package/src/peer-streams.ts +169 -0
- 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":"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"}
|
@@ -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 @@
|
|
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 @@
|
|
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 @@
|
|
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 @@
|
|
1
|
+
{"version":3,"file":"message.spec.d.ts","sourceRoot":"","sources":["../../test/message.spec.ts"],"names":[],"mappings":""}
|