@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.
- 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 +22 -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 +109 -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,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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"}
|