@peerbit/pubsub 1.0.1

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.
@@ -0,0 +1,477 @@
1
+ import { logger as logFn } from "@peerbit/logger";
2
+ import { DataMessage } from "@peerbit/stream-interface";
3
+ import { DirectStream, } from "@peerbit/stream";
4
+ import { CodeError } from "@libp2p/interfaces/errors";
5
+ import { PubSubMessage, Subscribe, PubSubData, toUint8Array, Unsubscribe, GetSubscribers, Subscription, } from "@peerbit/pubsub-interface";
6
+ import { getPublicKeyFromPeerId, PublicSignKey } from "@peerbit/crypto";
7
+ import { CustomEvent } from "@libp2p/interfaces/events";
8
+ import { waitFor } from "@peerbit/time";
9
+ import { equals, startsWith } from "@peerbit/uint8arrays";
10
+ export const logger = logFn({ module: "direct-sub", level: "warn" });
11
+ export class DirectSub extends DirectStream {
12
+ topics; // topic -> peers --> Uint8Array subscription metadata (the latest recieved)
13
+ peerToTopic; // peer -> topics
14
+ topicsToPeers; // topic -> peers
15
+ subscriptions; // topic -> subscription ids
16
+ lastSubscriptionMessages = new Map();
17
+ constructor(components, props) {
18
+ super(components, ["pubsub/0.0.0"], props);
19
+ this.subscriptions = new Map();
20
+ this.topics = new Map();
21
+ this.topicsToPeers = new Map();
22
+ this.peerToTopic = new Map();
23
+ }
24
+ stop() {
25
+ this.subscriptions.clear();
26
+ this.topics.clear();
27
+ this.peerToTopic.clear();
28
+ this.topicsToPeers.clear();
29
+ return super.stop();
30
+ }
31
+ async onPeerReachable(publicKey) {
32
+ // Aggregate subscribers for my topics through this new peer because if we don't do this we might end up with a situtation where
33
+ // we act as a relay and relay messages for a topic, but don't forward it to this new peer because we never learned about their subscriptions
34
+ await this.requestSubscribers([...this.topics.keys()], publicKey);
35
+ return super.onPeerReachable(publicKey);
36
+ }
37
+ async onPeerDisconnected(peerId, conn) {
38
+ return super.onPeerDisconnected(peerId, conn);
39
+ }
40
+ initializeTopic(topic) {
41
+ this.topics.get(topic) || this.topics.set(topic, new Map());
42
+ this.topicsToPeers.get(topic) || this.topicsToPeers.set(topic, new Set());
43
+ }
44
+ initializePeer(publicKey) {
45
+ this.peerToTopic.get(publicKey.hashcode()) ||
46
+ this.peerToTopic.set(publicKey.hashcode(), new Set());
47
+ }
48
+ /**
49
+ * Subscribes to a given topic.
50
+ */
51
+ /**
52
+ * @param topic,
53
+ * @param data, metadata associated with the subscription, shared with peers
54
+ */
55
+ async subscribe(topic, options) {
56
+ if (!this.started) {
57
+ throw new Error("Pubsub has not started");
58
+ }
59
+ topic = typeof topic === "string" ? [topic] : topic;
60
+ const newTopicsForTopicData = [];
61
+ for (const t of topic) {
62
+ const prev = this.subscriptions.get(t);
63
+ if (prev) {
64
+ const difference = !!prev.data != !!options?.data ||
65
+ (prev.data && options?.data && !equals(prev.data, options?.data));
66
+ prev.counter += 1;
67
+ if (difference) {
68
+ prev.data = options?.data;
69
+ newTopicsForTopicData.push(t);
70
+ }
71
+ }
72
+ else {
73
+ this.subscriptions.set(t, {
74
+ counter: 1,
75
+ data: options?.data,
76
+ });
77
+ newTopicsForTopicData.push(t);
78
+ this.listenForSubscribers(t);
79
+ }
80
+ }
81
+ if (newTopicsForTopicData.length > 0) {
82
+ const message = new DataMessage({
83
+ data: toUint8Array(new Subscribe({
84
+ subscriptions: newTopicsForTopicData.map((x) => new Subscription(x, options?.data)),
85
+ }).serialize()),
86
+ });
87
+ await this.publishMessage(this.components.peerId, await message.sign(this.sign));
88
+ }
89
+ }
90
+ /**
91
+ *
92
+ * @param topic
93
+ * @param force
94
+ * @returns true unsubscribed completely
95
+ */
96
+ async unsubscribe(topic, options) {
97
+ if (!this.started) {
98
+ throw new Error("Pubsub is not started");
99
+ }
100
+ const subscriptions = this.subscriptions.get(topic);
101
+ logger.debug(`unsubscribe from ${topic} - am subscribed with subscriptions ${subscriptions}`);
102
+ if (subscriptions?.counter && subscriptions?.counter >= 0) {
103
+ subscriptions.counter -= 1;
104
+ }
105
+ const peersOnTopic = this.topicsToPeers.get(topic);
106
+ if (peersOnTopic) {
107
+ for (const peer of peersOnTopic) {
108
+ this.lastSubscriptionMessages.delete(peer);
109
+ }
110
+ }
111
+ if (!subscriptions?.counter || options?.force) {
112
+ this.subscriptions.delete(topic);
113
+ this.topics.delete(topic);
114
+ this.topicsToPeers.delete(topic);
115
+ await this.publishMessage(this.components.peerId, await new DataMessage({
116
+ data: toUint8Array(new Unsubscribe({ topics: [topic] }).serialize()),
117
+ }).sign(this.sign));
118
+ return true;
119
+ }
120
+ return false;
121
+ }
122
+ getSubscribers(topic) {
123
+ if (!this.started) {
124
+ throw new CodeError("not started yet", "ERR_NOT_STARTED_YET");
125
+ }
126
+ if (topic == null) {
127
+ throw new CodeError("topic is required", "ERR_NOT_VALID_TOPIC");
128
+ }
129
+ return this.topics.get(topic.toString());
130
+ }
131
+ getSubscribersWithData(topic, data, options) {
132
+ const map = this.topics.get(topic);
133
+ if (map) {
134
+ const results = [];
135
+ for (const [peer, info] of map.entries()) {
136
+ if (!info.data) {
137
+ continue;
138
+ }
139
+ if (options?.prefix) {
140
+ if (!startsWith(info.data, data)) {
141
+ continue;
142
+ }
143
+ }
144
+ else {
145
+ if (!equals(info.data, data)) {
146
+ continue;
147
+ }
148
+ }
149
+ results.push(peer);
150
+ }
151
+ return results;
152
+ }
153
+ return;
154
+ }
155
+ listenForSubscribers(topic) {
156
+ this.initializeTopic(topic);
157
+ }
158
+ async requestSubscribers(topic, from) {
159
+ if (!this.started) {
160
+ throw new CodeError("not started yet", "ERR_NOT_STARTED_YET");
161
+ }
162
+ if (topic == null) {
163
+ throw new CodeError("topic is required", "ERR_NOT_VALID_TOPIC");
164
+ }
165
+ if (topic.length === 0) {
166
+ return;
167
+ }
168
+ const topics = typeof topic === "string" ? [topic] : topic;
169
+ for (const topic of topics) {
170
+ this.listenForSubscribers(topic);
171
+ }
172
+ return this.publishMessage(this.components.peerId, await new DataMessage({
173
+ to: from ? [from.hashcode()] : [],
174
+ data: toUint8Array(new GetSubscribers({ topics }).serialize()),
175
+ }).sign(this.sign));
176
+ }
177
+ getPeersWithTopics(topics, otherPeers) {
178
+ const peers = otherPeers ? new Set(otherPeers) : new Set();
179
+ if (topics?.length) {
180
+ for (const topic of topics) {
181
+ const peersOnTopic = this.topicsToPeers.get(topic.toString());
182
+ if (peersOnTopic) {
183
+ peersOnTopic.forEach((peer) => {
184
+ peers.add(peer);
185
+ });
186
+ }
187
+ }
188
+ }
189
+ return peers;
190
+ }
191
+ /* getStreamsWithTopics(topics: string[], otherPeers?: string[]): PeerStreams[] {
192
+ const peers = this.getNeighboursWithTopics(topics, otherPeers);
193
+ return [...this.peers.values()].filter((s) =>
194
+ peers.has(s.publicKey.hashcode())
195
+ );
196
+ } */
197
+ async publish(data, options) {
198
+ const topics = options.topics?.map((x) => x.toString()) || [];
199
+ const tos = options?.to?.map((x) => x instanceof PublicSignKey
200
+ ? x.hashcode()
201
+ : typeof x === "string"
202
+ ? x
203
+ : getPublicKeyFromPeerId(x).hashcode()) || [];
204
+ // Embedd topic info before the data so that peers/relays can also use topic info to route messages efficiently
205
+ const message = new PubSubData({
206
+ topics: topics.map((x) => x.toString()),
207
+ data,
208
+ strict: options.strict,
209
+ });
210
+ const bytes = message.serialize();
211
+ return super.publish(bytes instanceof Uint8Array ? bytes : bytes.subarray(), { to: options?.strict ? tos : this.getPeersWithTopics(topics, tos) });
212
+ }
213
+ deletePeerFromTopic(topic, publicKeyHash) {
214
+ const peers = this.topics.get(topic);
215
+ let change = undefined;
216
+ if (peers) {
217
+ change = peers.get(publicKeyHash);
218
+ }
219
+ this.topics.get(topic)?.delete(publicKeyHash);
220
+ this.peerToTopic.get(publicKeyHash)?.delete(topic);
221
+ if (!this.peerToTopic.get(publicKeyHash)?.size) {
222
+ this.peerToTopic.delete(publicKeyHash);
223
+ }
224
+ this.topicsToPeers.get(topic)?.delete(publicKeyHash);
225
+ return change;
226
+ }
227
+ onPeerUnreachable(publicKey) {
228
+ super.onPeerUnreachable(publicKey);
229
+ const publicKeyHash = publicKey.hashcode();
230
+ const peerTopics = this.peerToTopic.get(publicKeyHash);
231
+ const changed = [];
232
+ if (peerTopics) {
233
+ for (const topic of peerTopics) {
234
+ const change = this.deletePeerFromTopic(topic, publicKeyHash);
235
+ if (change) {
236
+ changed.push(new Subscription(topic, change.data));
237
+ }
238
+ }
239
+ }
240
+ this.lastSubscriptionMessages.delete(publicKeyHash);
241
+ if (changed.length > 0) {
242
+ this.dispatchEvent(new CustomEvent("unsubscribe", {
243
+ detail: { from: publicKey, unsubscriptions: changed },
244
+ }));
245
+ }
246
+ }
247
+ subscriptionMessageIsLatest(message, pubsubMessage) {
248
+ const subscriber = message.signatures.signatures[0].publicKey;
249
+ const subscriberKey = subscriber.hashcode(); // Assume first signature is the one who is signing
250
+ for (const topic of pubsubMessage.topics) {
251
+ const lastTimestamp = this.lastSubscriptionMessages
252
+ .get(subscriberKey)
253
+ ?.get(topic)?.header.timetamp;
254
+ if (lastTimestamp != null && lastTimestamp > message.header.timetamp) {
255
+ return false; // message is old
256
+ }
257
+ }
258
+ for (const topic of pubsubMessage.topics) {
259
+ if (!this.lastSubscriptionMessages.has(subscriberKey)) {
260
+ this.lastSubscriptionMessages.set(subscriberKey, new Map());
261
+ }
262
+ this.lastSubscriptionMessages.get(subscriberKey)?.set(topic, message);
263
+ }
264
+ return true;
265
+ }
266
+ async onDataMessage(from, stream, message) {
267
+ const pubsubMessage = PubSubMessage.deserialize(message.data);
268
+ if (pubsubMessage instanceof PubSubData) {
269
+ /**
270
+ * See if we know more subscribers of the message topics. If so, add aditional end recievers of the message
271
+ */
272
+ let verified = undefined;
273
+ const isFromSelf = this.components.peerId.equals(from);
274
+ if (!isFromSelf || this.emitSelf) {
275
+ let isForMe;
276
+ if (pubsubMessage.strict) {
277
+ isForMe =
278
+ !!pubsubMessage.topics.find((topic) => this.subscriptions.has(topic)) && !!message.to.find((x) => this.publicKeyHash === x);
279
+ }
280
+ else {
281
+ isForMe =
282
+ !!pubsubMessage.topics.find((topic) => this.subscriptions.has(topic)) ||
283
+ (pubsubMessage.topics.length === 0 &&
284
+ !!message.to.find((x) => this.publicKeyHash === x));
285
+ }
286
+ if (isForMe) {
287
+ if (verified === undefined) {
288
+ verified = await message.verify(this.signaturePolicy === "StictSign" ? true : false);
289
+ }
290
+ if (!verified) {
291
+ logger.warn("Recieved message that did not verify PubSubData");
292
+ return false;
293
+ }
294
+ this.dispatchEvent(new CustomEvent("data", {
295
+ detail: { data: pubsubMessage, message },
296
+ }));
297
+ }
298
+ }
299
+ // Forward
300
+ if (!pubsubMessage.strict) {
301
+ const newTos = this.getPeersWithTopics(pubsubMessage.topics, message.to);
302
+ newTos.delete(this.publicKeyHash);
303
+ message.to = [...newTos];
304
+ }
305
+ // Only relay if we got additional recievers
306
+ // or we are NOT subscribing ourselves (if we are not subscribing ourselves we are)
307
+ // If we are not subscribing ourselves, then we don't have enough information to "stop" message propagation here
308
+ if (message.to.length > 0 ||
309
+ !pubsubMessage.topics.find((topic) => this.topics.has(topic))) {
310
+ await this.relayMessage(from, message);
311
+ }
312
+ }
313
+ else if (pubsubMessage instanceof Subscribe) {
314
+ if (!(await message.verify(true))) {
315
+ logger.warn("Recieved message that did not verify Subscribe");
316
+ return false;
317
+ }
318
+ if (message.signatures.signatures.length === 0) {
319
+ logger.warn("Recieved subscription message with no signers");
320
+ return false;
321
+ }
322
+ if (pubsubMessage.subscriptions.length === 0) {
323
+ logger.info("Recieved subscription message with no topics");
324
+ return false;
325
+ }
326
+ if (!this.subscriptionMessageIsLatest(message, pubsubMessage)) {
327
+ logger.trace("Recieved old subscription message");
328
+ return false;
329
+ }
330
+ const subscriber = message.signatures.signatures[0].publicKey;
331
+ const subscriberKey = subscriber.hashcode(); // Assume first signature is the one who is signing
332
+ this.initializePeer(subscriber);
333
+ const changed = [];
334
+ pubsubMessage.subscriptions.forEach((subscription) => {
335
+ const peers = this.topics.get(subscription.topic);
336
+ if (peers == null) {
337
+ return;
338
+ }
339
+ // if no subscription data, or new subscription has data (and is newer) then overwrite it.
340
+ // subscription where data is undefined is not intended to replace existing data
341
+ const existingSubscription = peers.get(subscriberKey);
342
+ if (!existingSubscription ||
343
+ (existingSubscription.timestamp < message.header.timetamp &&
344
+ subscription.data)) {
345
+ peers.set(subscriberKey, {
346
+ timestamp: message.header.timetamp,
347
+ data: subscription.data,
348
+ });
349
+ if (!existingSubscription?.data ||
350
+ !equals(existingSubscription.data, subscription.data)) {
351
+ changed.push(subscription);
352
+ }
353
+ }
354
+ this.topicsToPeers.get(subscription.topic)?.add(subscriberKey);
355
+ this.peerToTopic.get(subscriberKey)?.add(subscription.topic);
356
+ });
357
+ if (changed.length > 0) {
358
+ const subscriptionEvent = {
359
+ from: subscriber,
360
+ subscriptions: changed,
361
+ };
362
+ this.dispatchEvent(new CustomEvent("subscribe", {
363
+ detail: subscriptionEvent,
364
+ }));
365
+ }
366
+ // Forward
367
+ await this.relayMessage(from, message);
368
+ }
369
+ else if (pubsubMessage instanceof Unsubscribe) {
370
+ if (!(await message.verify(true))) {
371
+ logger.warn("Recieved message that did not verify Unsubscribe");
372
+ return false;
373
+ }
374
+ if (message.signatures.signatures.length === 0) {
375
+ logger.warn("Recieved subscription message with no signers");
376
+ return false;
377
+ }
378
+ if (!this.subscriptionMessageIsLatest(message, pubsubMessage)) {
379
+ logger.trace("Recieved old subscription message");
380
+ return false;
381
+ }
382
+ const changed = [];
383
+ const subscriber = message.signatures.signatures[0].publicKey;
384
+ const subscriberKey = subscriber.hashcode(); // Assume first signature is the one who is signing
385
+ for (const unsubscription of pubsubMessage.unsubscriptions) {
386
+ const change = this.deletePeerFromTopic(unsubscription.topic, subscriberKey);
387
+ if (change) {
388
+ changed.push(new Subscription(unsubscription.topic, change.data));
389
+ }
390
+ }
391
+ if (changed.length > 0) {
392
+ this.dispatchEvent(new CustomEvent("unsubscribe", {
393
+ detail: { from: subscriber, unsubscriptions: changed },
394
+ }));
395
+ }
396
+ // Forward
397
+ await this.relayMessage(from, message);
398
+ }
399
+ else if (pubsubMessage instanceof GetSubscribers) {
400
+ if (!(await message.verify(true))) {
401
+ logger.warn("Recieved message that did not verify Unsubscribe");
402
+ return false;
403
+ }
404
+ const subscriptionsToSend = [];
405
+ for (const topic of pubsubMessage.topics) {
406
+ const subscription = this.subscriptions.get(topic);
407
+ if (subscription) {
408
+ subscriptionsToSend.push(new Subscription(topic, subscription.data));
409
+ }
410
+ }
411
+ if (subscriptionsToSend.length > 0) {
412
+ // respond
413
+ if (!stream.isWritable) {
414
+ try {
415
+ await waitFor(() => stream.isWritable);
416
+ }
417
+ catch (error) {
418
+ logger.warn(`Failed to respond to GetSubscribers request to ${from.toString()} stream is not writable`);
419
+ return false;
420
+ }
421
+ }
422
+ this.publishMessage(this.components.peerId, await new DataMessage({
423
+ data: toUint8Array(new Subscribe({
424
+ subscriptions: subscriptionsToSend,
425
+ }).serialize()),
426
+ }).sign(this.sign), [stream]); // send back to same stream
427
+ }
428
+ // Forward
429
+ await this.relayMessage(from, message);
430
+ }
431
+ return true;
432
+ }
433
+ }
434
+ export const waitForSubscribers = async (libp2p, peersToWait, topic) => {
435
+ const peersToWaitArr = Array.isArray(peersToWait)
436
+ ? peersToWait
437
+ : [peersToWait];
438
+ const peerIdsToWait = peersToWaitArr.map((peer) => {
439
+ if (typeof peer === "string") {
440
+ return peer;
441
+ }
442
+ const id = peer["peerId"] || peer;
443
+ if (typeof id === "string") {
444
+ return id;
445
+ }
446
+ return id instanceof PublicSignKey
447
+ ? id.hashcode()
448
+ : getPublicKeyFromPeerId(id).hashcode();
449
+ });
450
+ await libp2p.services.pubsub.requestSubscribers(topic);
451
+ return new Promise((resolve, reject) => {
452
+ let counter = 0;
453
+ const interval = setInterval(async () => {
454
+ counter += 1;
455
+ if (counter > 100) {
456
+ clearInterval(interval);
457
+ reject(new Error("Failed to find expected subscribers for topic: " + topic));
458
+ }
459
+ try {
460
+ const peers = libp2p.services.pubsub.getSubscribers(topic);
461
+ const hasAllPeers = peerIdsToWait
462
+ .map((e) => peers && peers.has(e))
463
+ .filter((e) => e === false).length === 0;
464
+ // FIXME: Does not fail on timeout, not easily fixable
465
+ if (hasAllPeers) {
466
+ clearInterval(interval);
467
+ resolve();
468
+ }
469
+ }
470
+ catch (e) {
471
+ clearInterval(interval);
472
+ reject(e);
473
+ }
474
+ }, 200);
475
+ });
476
+ };
477
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@peerbit/pubsub",
3
+ "version": "1.0.1",
4
+ "description": "Direct streaming for libp2p",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "private": false,
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "module": "lib/esm/index.js",
12
+ "types": "lib/esm/index.d.ts",
13
+ "exports": {
14
+ "import": "./lib/esm/index.js"
15
+ },
16
+ "scripts": {
17
+ "clean": "shx rm -rf lib/*",
18
+ "build": "yarn clean && tsc -p tsconfig.json",
19
+ "postbuild": "echo '{\"type\":\"module\"} ' | node ../../../node_modules/.bin/json > lib/esm/package.json",
20
+ "test": "node ../../../node_modules/.bin/jest test -c ../../../jest.config.ts --runInBand --forceExit",
21
+ "test:unit": "node ../../../node_modules/.bin/jest test -c ../../../jest.config.unit.ts --runInBand --forceExit",
22
+ "test:integration": "node ../node_modules/.bin/jest test -c ../../../jest.config.integration.ts --runInBand --forceExit"
23
+ },
24
+ "files": [
25
+ "lib",
26
+ "src",
27
+ "!src/**/__tests__",
28
+ "!lib/**/__tests__",
29
+ "!src/**/__benchmark__",
30
+ "!lib/**/__benchmark__",
31
+ "LICENSE"
32
+ ],
33
+ "engines": {
34
+ "node": ">=16.15.1"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/dao-xyz/peerbit.git"
39
+ },
40
+ "keywords": [
41
+ "peerbit"
42
+ ],
43
+ "author": "dao.xyz",
44
+ "license": "MIT",
45
+ "bugs": {
46
+ "url": "https://github.com/dao-xyz/peerbit/issues"
47
+ },
48
+ "homepage": "https://github.com/dao-xyz/peerbit#readme",
49
+ "localMaintainers": [
50
+ "dao.xyz"
51
+ ],
52
+ "devDependencies": {
53
+ "@peerbit/libp2p-test-utils": "1.0.0"
54
+ },
55
+ "dependencies": {
56
+ "@libp2p/interfaces": "^3.3.2",
57
+ "@peerbit/logger": "1.0.0",
58
+ "@peerbit/stream": "1.0.1",
59
+ "@peerbit/uint8arrays": "2.0.0",
60
+ "abstract-level": "^1.0.3",
61
+ "libp2p": "^0.45.9",
62
+ "memory-level": "^1.0.0"
63
+ },
64
+ "gitHead": "069ce2f62a76c342875a1cc695c6f210beff13fd"
65
+ }