@libp2p/pubsub 0.0.0 → 0.2.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 (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 +22 -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 +109 -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,467 @@
1
+ import debug from 'debug';
2
+ import { EventEmitter } from 'events';
3
+ import errcode from 'err-code';
4
+ import { pipe } from 'it-pipe';
5
+ import Queue from 'p-queue';
6
+ import { MulticodecTopology } from '@libp2p/topology/multicodec-topology';
7
+ import { codes } from './errors.js';
8
+ import { RPC } from './message/rpc.js';
9
+ import { PeerStreams } from './peer-streams.js';
10
+ import * as utils from './utils.js';
11
+ import { signMessage, verifySignature } from './message/sign.js';
12
+ /**
13
+ * PubsubBaseProtocol handles the peers and connections logic for pubsub routers
14
+ * and specifies the API that pubsub routers should have.
15
+ */
16
+ export class PubsubBaseProtocol extends EventEmitter {
17
+ constructor(props) {
18
+ super();
19
+ const { debugName = 'libp2p:pubsub', multicodecs = [], libp2p = null, globalSignaturePolicy = 'StrictSign', canRelayMessage = false, emitSelf = false, messageProcessingConcurrency = 10 } = props;
20
+ this.log = Object.assign(debug(debugName), {
21
+ err: debug(`${debugName}:error`)
22
+ });
23
+ this.multicodecs = utils.ensureArray(multicodecs);
24
+ this._libp2p = libp2p;
25
+ this.registrar = libp2p.registrar;
26
+ this.peerId = libp2p.peerId;
27
+ this.started = false;
28
+ this.topics = new Map();
29
+ this.subscriptions = new Set();
30
+ this.peers = new Map();
31
+ this.globalSignaturePolicy = globalSignaturePolicy === 'StrictNoSign' ? 'StrictNoSign' : 'StrictSign';
32
+ this.canRelayMessage = canRelayMessage;
33
+ this.emitSelf = emitSelf;
34
+ this.topicValidators = new Map();
35
+ this.queue = new Queue({ concurrency: messageProcessingConcurrency });
36
+ this._onIncomingStream = this._onIncomingStream.bind(this);
37
+ this._onPeerConnected = this._onPeerConnected.bind(this);
38
+ this._onPeerDisconnected = this._onPeerDisconnected.bind(this);
39
+ }
40
+ // LIFECYCLE METHODS
41
+ /**
42
+ * Register the pubsub protocol onto the libp2p node.
43
+ *
44
+ * @returns {void}
45
+ */
46
+ start() {
47
+ if (this.started) {
48
+ return;
49
+ }
50
+ this.log('starting');
51
+ // Incoming streams
52
+ // Called after a peer dials us
53
+ this.registrar.handle(this.multicodecs, this._onIncomingStream);
54
+ // register protocol with topology
55
+ // Topology callbacks called on connection manager changes
56
+ const topology = new MulticodecTopology({
57
+ multicodecs: this.multicodecs,
58
+ handlers: {
59
+ onConnect: this._onPeerConnected,
60
+ onDisconnect: this._onPeerDisconnected
61
+ }
62
+ });
63
+ this._registrarId = this.registrar.register(topology);
64
+ this.log('started');
65
+ this.started = true;
66
+ }
67
+ /**
68
+ * Unregister the pubsub protocol and the streams with other peers will be closed.
69
+ *
70
+ * @returns {void}
71
+ */
72
+ stop() {
73
+ if (!this.started) {
74
+ return;
75
+ }
76
+ // unregister protocol and handlers
77
+ if (this._registrarId != null) {
78
+ this.registrar.unregister(this._registrarId);
79
+ }
80
+ this.log('stopping');
81
+ this.peers.forEach((peerStreams) => peerStreams.close());
82
+ this.peers = new Map();
83
+ this.subscriptions = new Set();
84
+ this.started = false;
85
+ this.log('stopped');
86
+ }
87
+ isStarted() {
88
+ return this.started;
89
+ }
90
+ /**
91
+ * On an inbound stream opened
92
+ */
93
+ _onIncomingStream({ protocol, stream, connection }) {
94
+ const peerId = connection.remotePeer;
95
+ const idB58Str = peerId.toString();
96
+ const peer = this._addPeer(peerId, protocol);
97
+ const inboundStream = peer.attachInboundStream(stream);
98
+ this._processMessages(idB58Str, inboundStream, peer)
99
+ .catch(err => this.log(err));
100
+ }
101
+ /**
102
+ * Registrar notifies an established connection with pubsub protocol
103
+ */
104
+ async _onPeerConnected(peerId, conn) {
105
+ const idB58Str = peerId.toString();
106
+ this.log('connected', idB58Str);
107
+ try {
108
+ const { stream, protocol } = await conn.newStream(this.multicodecs);
109
+ const peer = this._addPeer(peerId, protocol);
110
+ await peer.attachOutboundStream(stream);
111
+ }
112
+ catch (err) {
113
+ this.log.err(err);
114
+ }
115
+ // Immediately send my own subscriptions to the newly established conn
116
+ this._sendSubscriptions(idB58Str, Array.from(this.subscriptions), true);
117
+ }
118
+ /**
119
+ * Registrar notifies a closing connection with pubsub protocol
120
+ */
121
+ _onPeerDisconnected(peerId, conn) {
122
+ const idB58Str = peerId.toString();
123
+ this.log('connection ended', idB58Str);
124
+ this._removePeer(peerId);
125
+ }
126
+ /**
127
+ * Notifies the router that a peer has been connected
128
+ */
129
+ _addPeer(peerId, protocol) {
130
+ const id = peerId.toString();
131
+ const existing = this.peers.get(id);
132
+ // If peer streams already exists, do nothing
133
+ if (existing != null) {
134
+ return existing;
135
+ }
136
+ // else create a new peer streams
137
+ this.log('new peer', id);
138
+ const peerStreams = new PeerStreams({
139
+ id: peerId,
140
+ protocol
141
+ });
142
+ this.peers.set(id, peerStreams);
143
+ peerStreams.once('close', () => this._removePeer(peerId));
144
+ return peerStreams;
145
+ }
146
+ /**
147
+ * Notifies the router that a peer has been disconnected
148
+ */
149
+ _removePeer(peerId) {
150
+ const id = peerId.toString();
151
+ const peerStreams = this.peers.get(id);
152
+ if (peerStreams == null)
153
+ return;
154
+ // close peer streams
155
+ peerStreams.removeAllListeners();
156
+ peerStreams.close();
157
+ // delete peer streams
158
+ this.log('delete peer', id);
159
+ this.peers.delete(id);
160
+ // remove peer from topics map
161
+ for (const peers of this.topics.values()) {
162
+ peers.delete(id);
163
+ }
164
+ return peerStreams;
165
+ }
166
+ // MESSAGE METHODS
167
+ /**
168
+ * Responsible for processing each RPC message received by other peers.
169
+ */
170
+ async _processMessages(idB58Str, stream, peerStreams) {
171
+ try {
172
+ await pipe(stream, async (source) => {
173
+ for await (const data of source) {
174
+ const rpcBytes = data instanceof Uint8Array ? data : data.slice();
175
+ const rpcMsg = this._decodeRpc(rpcBytes);
176
+ // Since _processRpc may be overridden entirely in unsafe ways,
177
+ // the simplest/safest option here is to wrap in a function and capture all errors
178
+ // to prevent a top-level unhandled exception
179
+ // This processing of rpc messages should happen without awaiting full validation/execution of prior messages
180
+ this._processRpc(idB58Str, peerStreams, rpcMsg)
181
+ .catch(err => this.log(err));
182
+ }
183
+ });
184
+ }
185
+ catch (err) {
186
+ this._onPeerDisconnected(peerStreams.id, err);
187
+ }
188
+ }
189
+ /**
190
+ * Handles an rpc request from a peer
191
+ */
192
+ async _processRpc(idB58Str, peerStreams, rpc) {
193
+ this.log('rpc from', idB58Str);
194
+ const subs = rpc.subscriptions;
195
+ const msgs = rpc.msgs;
196
+ if (subs.length > 0) {
197
+ // update peer subscriptions
198
+ subs.forEach((subOpt) => {
199
+ this._processRpcSubOpt(idB58Str, subOpt);
200
+ });
201
+ this.emit('pubsub:subscription-change', { peerId: peerStreams.id, subscriptions: subs });
202
+ }
203
+ if (!this._acceptFrom(idB58Str)) {
204
+ this.log('received message from unacceptable peer %s', idB58Str);
205
+ return false;
206
+ }
207
+ if (msgs.length > 0) {
208
+ this.queue.addAll(msgs.map(message => async () => {
209
+ const topics = message.topicIDs != null ? message.topicIDs : [];
210
+ const hasSubscription = topics.some((topic) => this.subscriptions.has(topic));
211
+ if (!hasSubscription && !this.canRelayMessage) {
212
+ this.log('received message we didn\'t subscribe to. Dropping.');
213
+ return;
214
+ }
215
+ try {
216
+ const msg = utils.normalizeInRpcMessage(message, idB58Str);
217
+ await this._processRpcMessage(msg);
218
+ }
219
+ catch (err) {
220
+ this.log.err(err);
221
+ }
222
+ }))
223
+ .catch(err => this.log(err));
224
+ }
225
+ return true;
226
+ }
227
+ /**
228
+ * Handles a subscription change from a peer
229
+ */
230
+ _processRpcSubOpt(id, subOpt) {
231
+ const t = subOpt.topicID;
232
+ if (t == null) {
233
+ return;
234
+ }
235
+ let topicSet = this.topics.get(t);
236
+ if (topicSet == null) {
237
+ topicSet = new Set();
238
+ this.topics.set(t, topicSet);
239
+ }
240
+ if (subOpt.subscribe === true) {
241
+ // subscribe peer to new topic
242
+ topicSet.add(id);
243
+ }
244
+ else {
245
+ // unsubscribe from existing topic
246
+ topicSet.delete(id);
247
+ }
248
+ }
249
+ /**
250
+ * Handles an message from a peer
251
+ */
252
+ async _processRpcMessage(msg) {
253
+ if ((msg.from != null) && this.peerId.equals(msg.from) && !this.emitSelf) {
254
+ return;
255
+ }
256
+ // Ensure the message is valid before processing it
257
+ try {
258
+ await this.validate(msg);
259
+ }
260
+ catch (err) {
261
+ this.log('Message is invalid, dropping it. %O', err);
262
+ return;
263
+ }
264
+ // Emit to self
265
+ this._emitMessage(msg);
266
+ return await this._publish(utils.normalizeOutRpcMessage(msg));
267
+ }
268
+ /**
269
+ * Emit a message from a peer
270
+ */
271
+ _emitMessage(message) {
272
+ message.topicIDs.forEach((topic) => {
273
+ if (this.subscriptions.has(topic)) {
274
+ this.emit(topic, message);
275
+ }
276
+ });
277
+ }
278
+ /**
279
+ * The default msgID implementation
280
+ * Child class can override this.
281
+ */
282
+ getMsgId(msg) {
283
+ const signaturePolicy = this.globalSignaturePolicy;
284
+ switch (signaturePolicy) {
285
+ case 'StrictSign':
286
+ // @ts-expect-error seqno is optional in protobuf definition but it will exist
287
+ return utils.msgId(msg.from, msg.seqno);
288
+ case 'StrictNoSign':
289
+ return utils.noSignMsgId(msg.data);
290
+ default:
291
+ throw errcode(new Error('Cannot get message id: unhandled signature policy'), codes.ERR_UNHANDLED_SIGNATURE_POLICY);
292
+ }
293
+ }
294
+ /**
295
+ * Whether to accept a message from a peer
296
+ * Override to create a graylist
297
+ */
298
+ _acceptFrom(id) {
299
+ return true;
300
+ }
301
+ /**
302
+ * Decode Uint8Array into an RPC object.
303
+ * This can be override to use a custom router protobuf.
304
+ */
305
+ _decodeRpc(bytes) {
306
+ return RPC.decode(bytes);
307
+ }
308
+ /**
309
+ * Encode RPC object into a Uint8Array.
310
+ * This can be override to use a custom router protobuf.
311
+ */
312
+ _encodeRpc(rpc) {
313
+ return RPC.encode(rpc).finish();
314
+ }
315
+ /**
316
+ * Send an rpc object to a peer
317
+ */
318
+ _sendRpc(id, rpc) {
319
+ const peerStreams = this.peers.get(id);
320
+ if ((peerStreams == null) || !peerStreams.isWritable) {
321
+ const msg = `Cannot send RPC to ${id} as there is no open stream to it available`;
322
+ this.log.err(msg);
323
+ return;
324
+ }
325
+ peerStreams.write(this._encodeRpc(rpc));
326
+ }
327
+ /**
328
+ * Send subscriptions to a peer
329
+ */
330
+ _sendSubscriptions(id, topics, subscribe) {
331
+ return this._sendRpc(id, {
332
+ subscriptions: topics.map(t => ({ topicID: t, subscribe: subscribe }))
333
+ });
334
+ }
335
+ /**
336
+ * Validates the given message. The signature will be checked for authenticity.
337
+ * Throws an error on invalid messages
338
+ */
339
+ async validate(message) {
340
+ const signaturePolicy = this.globalSignaturePolicy;
341
+ switch (signaturePolicy) {
342
+ case 'StrictNoSign':
343
+ if (message.from != null) {
344
+ throw errcode(new Error('StrictNoSigning: from should not be present'), codes.ERR_UNEXPECTED_FROM);
345
+ }
346
+ if (message.signature != null) {
347
+ throw errcode(new Error('StrictNoSigning: signature should not be present'), codes.ERR_UNEXPECTED_SIGNATURE);
348
+ }
349
+ if (message.key != null) {
350
+ throw errcode(new Error('StrictNoSigning: key should not be present'), codes.ERR_UNEXPECTED_KEY);
351
+ }
352
+ if (message.seqno != null) {
353
+ throw errcode(new Error('StrictNoSigning: seqno should not be present'), codes.ERR_UNEXPECTED_SEQNO);
354
+ }
355
+ break;
356
+ case 'StrictSign':
357
+ if (message.signature == null) {
358
+ throw errcode(new Error('StrictSigning: Signing required and no signature was present'), codes.ERR_MISSING_SIGNATURE);
359
+ }
360
+ if (message.seqno == null) {
361
+ throw errcode(new Error('StrictSigning: Signing required and no seqno was present'), codes.ERR_MISSING_SEQNO);
362
+ }
363
+ if (!(await verifySignature(message))) {
364
+ throw errcode(new Error('StrictSigning: Invalid message signature'), codes.ERR_INVALID_SIGNATURE);
365
+ }
366
+ break;
367
+ default:
368
+ throw errcode(new Error('Cannot validate message: unhandled signature policy'), codes.ERR_UNHANDLED_SIGNATURE_POLICY);
369
+ }
370
+ for (const topic of message.topicIDs) {
371
+ const validatorFn = this.topicValidators.get(topic);
372
+ if (validatorFn != null) {
373
+ await validatorFn(topic, message);
374
+ }
375
+ }
376
+ }
377
+ /**
378
+ * Normalizes the message and signs it, if signing is enabled.
379
+ * Should be used by the routers to create the message to send.
380
+ */
381
+ async _buildMessage(message) {
382
+ const signaturePolicy = this.globalSignaturePolicy;
383
+ switch (signaturePolicy) {
384
+ case 'StrictSign':
385
+ message.from = this.peerId.multihash.bytes;
386
+ message.seqno = utils.randomSeqno();
387
+ return await signMessage(this.peerId, message);
388
+ case 'StrictNoSign':
389
+ return await Promise.resolve(message);
390
+ default:
391
+ throw errcode(new Error('Cannot build message: unhandled signature policy'), codes.ERR_UNHANDLED_SIGNATURE_POLICY);
392
+ }
393
+ }
394
+ // API METHODS
395
+ /**
396
+ * Get a list of the peer-ids that are subscribed to one topic.
397
+ */
398
+ getSubscribers(topic) {
399
+ if (!this.started) {
400
+ throw errcode(new Error('not started yet'), 'ERR_NOT_STARTED_YET');
401
+ }
402
+ if (topic == null) {
403
+ throw errcode(new Error('topic is required'), 'ERR_NOT_VALID_TOPIC');
404
+ }
405
+ const peersInTopic = this.topics.get(topic);
406
+ if (peersInTopic == null) {
407
+ return [];
408
+ }
409
+ return Array.from(peersInTopic);
410
+ }
411
+ /**
412
+ * Publishes messages to all subscribed peers
413
+ */
414
+ async publish(topic, message) {
415
+ if (!this.started) {
416
+ throw new Error('Pubsub has not started');
417
+ }
418
+ this.log('publish', topic, message);
419
+ const from = this.peerId.toString();
420
+ const msgObject = {
421
+ receivedFrom: from,
422
+ data: message,
423
+ topicIDs: [topic]
424
+ };
425
+ // ensure that the message follows the signature policy
426
+ const outMsg = await this._buildMessage(msgObject);
427
+ const msg = utils.normalizeInRpcMessage(outMsg);
428
+ // Emit to self if I'm interested and emitSelf enabled
429
+ this.emitSelf && this._emitMessage(msg);
430
+ // send to all the other peers
431
+ await this._publish(msg);
432
+ }
433
+ /**
434
+ * Subscribes to a given topic.
435
+ */
436
+ subscribe(topic) {
437
+ if (!this.started) {
438
+ throw new Error('Pubsub has not started');
439
+ }
440
+ if (!this.subscriptions.has(topic)) {
441
+ this.subscriptions.add(topic);
442
+ this.peers.forEach((_, id) => this._sendSubscriptions(id, [topic], true));
443
+ }
444
+ }
445
+ /**
446
+ * Unsubscribe from the given topic.
447
+ */
448
+ unsubscribe(topic) {
449
+ if (!this.started) {
450
+ throw new Error('Pubsub is not started');
451
+ }
452
+ if (this.subscriptions.has(topic) && this.listenerCount(topic) === 0) {
453
+ this.subscriptions.delete(topic);
454
+ this.peers.forEach((_, id) => this._sendSubscriptions(id, [topic], false));
455
+ }
456
+ }
457
+ /**
458
+ * Get the list of topics which the peer is subscribed to.
459
+ */
460
+ getTopics() {
461
+ if (!this.started) {
462
+ throw new Error('Pubsub is not started');
463
+ }
464
+ return Array.from(this.subscriptions);
465
+ }
466
+ }
467
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}