@peerbit/program 5.6.3-07ba572 → 5.6.3-3f16953

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.
@@ -64,8 +64,15 @@ export declare abstract class Program<Args = any, Events extends ProgramEvents =
64
64
  abstract open(args?: Args): Promise<void>;
65
65
  private _clear;
66
66
  private _emittedEventsFor;
67
+ private _peerTopicsByHash;
68
+ private _seedPeerTopicsFromSubscribers?;
67
69
  private get emittedEventsFor();
70
+ private get peerTopicsByHash();
71
+ private recordPeerSubscription;
72
+ private recordPeerUnsubscription;
73
+ private peerHasAllTopics;
68
74
  private getAllTopicsIncludingThis;
75
+ private seedPeerTopicsSnapshot;
69
76
  private _emitJoinNetworkEvents;
70
77
  private _emitLeaveNetworkEvents;
71
78
  private _subscriptionEventListener;
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/program.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/program.ts"],"names":[],"mappings":"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"}
@@ -54,24 +54,6 @@ export class MissingAddressError extends Error {
54
54
  super("Address does not exist, please open or save this program once to obtain it");
55
55
  }
56
56
  }
57
- const intersection = (a, b) => {
58
- const newSet = new Map();
59
- if (Array.isArray(b)) {
60
- for (const el of b) {
61
- if (!a || a.has(el.hashcode())) {
62
- newSet.set(el.hashcode(), el);
63
- }
64
- }
65
- }
66
- else {
67
- for (const [key, el] of b) {
68
- if (!a || a.has(key)) {
69
- newSet.set(key, el);
70
- }
71
- }
72
- }
73
- return newSet;
74
- };
75
57
  const getAllParentAddresses = (p) => {
76
58
  return getAllParent(p, [])
77
59
  .filter((x) => x instanceof Program)
@@ -255,9 +237,50 @@ let Program = (() => {
255
237
  this._allPrograms = undefined;
256
238
  }
257
239
  _emittedEventsFor;
240
+ _peerTopicsByHash;
241
+ _seedPeerTopicsFromSubscribers;
258
242
  get emittedEventsFor() {
259
243
  return (this._emittedEventsFor = this._emittedEventsFor || new Set());
260
244
  }
245
+ get peerTopicsByHash() {
246
+ return (this._peerTopicsByHash =
247
+ this._peerTopicsByHash ||
248
+ new Map());
249
+ }
250
+ recordPeerSubscription(from, topics) {
251
+ if (!topics || topics.length === 0)
252
+ return;
253
+ const fromHash = from.hashcode();
254
+ const existing = this.peerTopicsByHash.get(fromHash);
255
+ if (!existing) {
256
+ const set = new Set();
257
+ for (const topic of topics)
258
+ set.add(topic);
259
+ this.peerTopicsByHash.set(fromHash, { publicKey: from, topics: set });
260
+ return;
261
+ }
262
+ for (const topic of topics)
263
+ existing.topics.add(topic);
264
+ }
265
+ recordPeerUnsubscription(from, topics) {
266
+ if (!topics || topics.length === 0)
267
+ return;
268
+ const fromHash = from.hashcode();
269
+ const existing = this.peerTopicsByHash.get(fromHash);
270
+ if (!existing)
271
+ return;
272
+ for (const topic of topics)
273
+ existing.topics.delete(topic);
274
+ if (existing.topics.size === 0)
275
+ this.peerTopicsByHash.delete(fromHash);
276
+ }
277
+ peerHasAllTopics(entry, allTopics) {
278
+ for (const topic of allTopics) {
279
+ if (!entry.topics.has(topic))
280
+ return false;
281
+ }
282
+ return true;
283
+ }
261
284
  getAllTopicsIncludingThis() {
262
285
  const allTopics = [this, ...this.allPrograms]
263
286
  // TODO test this code path closed true/false
@@ -266,49 +289,66 @@ let Program = (() => {
266
289
  .flat();
267
290
  return allTopics;
268
291
  }
269
- async _emitJoinNetworkEvents(s) {
270
- if (this.emittedEventsFor.has(s.from.hashcode())) {
271
- return;
272
- }
292
+ async seedPeerTopicsSnapshot(allTopics) {
293
+ // Subscription events are edge-triggered: if a peer subscribed before this program
294
+ // attached its listeners, we'd miss it and `waitFor()` could hang. Seed an initial
295
+ // snapshot from `pubsub.getSubscribers()` once, then keep it up to date via events.
296
+ //
297
+ // This is best-effort and does not imply the system has global membership knowledge
298
+ // (implementations may only return known peers).
299
+ if (this._seedPeerTopicsFromSubscribers) {
300
+ return this._seedPeerTopicsFromSubscribers;
301
+ }
302
+ this._seedPeerTopicsFromSubscribers = (async () => {
303
+ if (!this.node)
304
+ return;
305
+ const pubsub = this.node.services.pubsub;
306
+ for (const topic of allTopics) {
307
+ const subscribers = await pubsub.getSubscribers(topic);
308
+ if (!subscribers || subscribers.length === 0)
309
+ continue;
310
+ for (const subscriber of subscribers) {
311
+ this.recordPeerSubscription(subscriber, [topic]);
312
+ }
313
+ }
314
+ })();
315
+ return this._seedPeerTopicsFromSubscribers;
316
+ }
317
+ _emitJoinNetworkEvents(s) {
273
318
  const allTopics = this.getAllTopicsIncludingThis();
274
319
  if (allTopics.length === 0) {
275
320
  return; // this is important (see events.spec.ts)
276
321
  }
277
- // if subscribing to all topics, emit "join" event
278
- for (const topic of allTopics) {
279
- if (!(await this.node.services.pubsub.getSubscribers(topic))?.find((x) => s.from.equals(x))) {
280
- return;
281
- }
282
- }
283
- if (this.emittedEventsFor.has(s.from.hashcode())) {
322
+ this.recordPeerSubscription(s.from, s.topics);
323
+ const fromHash = s.from.hashcode();
324
+ if (this.emittedEventsFor.has(fromHash)) {
284
325
  return;
285
326
  }
286
- this.emittedEventsFor.add(s.from.hashcode());
327
+ const entry = this.peerTopicsByHash.get(fromHash);
328
+ if (!entry)
329
+ return;
330
+ if (!this.peerHasAllTopics(entry, allTopics))
331
+ return;
332
+ this.emittedEventsFor.add(fromHash);
287
333
  this.events.dispatchEvent(new CustomEvent("join", { detail: s.from }));
288
334
  }
289
- async _emitLeaveNetworkEvents(s) {
290
- if (!this.emittedEventsFor.has(s.from.hashcode())) {
291
- return;
292
- }
335
+ _emitLeaveNetworkEvents(s) {
293
336
  const allTopics = this.getAllTopicsIncludingThis();
294
337
  if (allTopics.length === 0) {
295
338
  return; // this is important (see events.spec.ts)
296
339
  }
297
- // if subscribing not subscribing to any topics, emit "leave" event
298
- let hasAllTopics = true;
299
- for (const topic of allTopics) {
300
- if (!(await this.node.services.pubsub.getSubscribers(topic))?.find((x) => s.from.equals(x))) {
301
- hasAllTopics = false;
302
- break;
303
- }
304
- }
340
+ this.recordPeerUnsubscription(s.from, s.topics);
341
+ const fromHash = s.from.hashcode();
342
+ if (!this.emittedEventsFor.has(fromHash))
343
+ return;
344
+ const entry = this.peerTopicsByHash.get(fromHash);
345
+ const hasAllTopics = entry
346
+ ? this.peerHasAllTopics(entry, allTopics)
347
+ : false;
305
348
  if (hasAllTopics) {
306
349
  return; // still here!?
307
350
  }
308
- if (!this.emittedEventsFor.has(s.from.hashcode())) {
309
- return;
310
- }
311
- this.emittedEventsFor.delete(s.from.hashcode());
351
+ this.emittedEventsFor.delete(fromHash);
312
352
  this.events.dispatchEvent(new CustomEvent("leave", { detail: s.from }));
313
353
  }
314
354
  _subscriptionEventListener;
@@ -375,6 +415,11 @@ let Program = (() => {
375
415
  if (end) {
376
416
  this.node?.services.pubsub.removeEventListener("subscribe", this._subscriptionEventListener);
377
417
  this.node?.services.pubsub.removeEventListener("unsubscribe", this._unsubscriptionEventListener);
418
+ this._emittedEventsFor?.clear();
419
+ this._emittedEventsFor = undefined;
420
+ this._peerTopicsByHash?.clear();
421
+ this._peerTopicsByHash = undefined;
422
+ this._seedPeerTopicsFromSubscribers = undefined;
378
423
  this._eventOptions = undefined;
379
424
  if (parentIdx !== -1) {
380
425
  this.parents.splice(parentIdx, 1); // We splice this here because this._end depends on this parent to exist
@@ -415,12 +460,61 @@ let Program = (() => {
415
460
  signal: options?.signal,
416
461
  timeout: options?.timeout,
417
462
  });
463
+ const allTopics = this.getAllTopicsIncludingThis();
464
+ if (allTopics.length === 0) {
465
+ throw new Error("Program has no topics, cannot get ready");
466
+ }
467
+ const pubsub = this.node.services.pubsub;
468
+ // Prefer a direct neighbour stream when available. This avoids cases where
469
+ // peers are "reachable" via the routing table but we haven't established
470
+ // a writable protocol stream yet (initial control-plane gossip can be dropped).
471
+ const neighborProbeTimeout = Math.min(options?.timeout ?? 10_000, 3_000);
472
+ await Promise.all(expectedHashes.map((hash) => pubsub
473
+ .waitFor(hash, { target: "neighbor", timeout: neighborProbeTimeout })
474
+ .catch(() => {
475
+ // Multi-hop overlays may never be direct neighbours; best-effort only.
476
+ })));
477
+ // Best-effort seeding: subscribe events are edge-triggered and can be missed if a peer
478
+ // subscribed before this program attached listeners. Actively ask for subscriber
479
+ // snapshots while waiting, but rate-limit to avoid fanout in larger overlays.
480
+ const REQUEST_MIN_INTERVAL_MS = 500;
481
+ const lastRequestAtByPeer = new Map();
482
+ const publicKeyByHash = new Map();
483
+ const resolvePublicKey = (hash) => {
484
+ let existing = publicKeyByHash.get(hash);
485
+ if (!existing) {
486
+ existing = Promise.resolve(pubsub.getPublicKey(hash)).catch(() => undefined);
487
+ publicKeyByHash.set(hash, existing);
488
+ }
489
+ return existing;
490
+ };
491
+ const requestSubscriberSnapshots = (hash) => {
492
+ const now = Date.now();
493
+ const last = lastRequestAtByPeer.get(hash) ?? 0;
494
+ if (now - last < REQUEST_MIN_INTERVAL_MS)
495
+ return;
496
+ lastRequestAtByPeer.set(hash, now);
497
+ void resolvePublicKey(hash).then((publicKey) => {
498
+ for (const topic of allTopics) {
499
+ void Promise.resolve(pubsub.requestSubscribers(topic, publicKey)).catch(() => {
500
+ // best-effort; the wait loop will retry and/or time out
501
+ });
502
+ }
503
+ });
504
+ };
505
+ for (const hash of expectedHashes) {
506
+ requestSubscriberSnapshots(hash);
507
+ }
418
508
  // wait for subscribing to topics
419
509
  return new Promise((resolve, reject) => {
420
510
  let settled = false;
421
- const timeoutMs = options?.timeout || 10 * 1000;
511
+ // Historically this was ~20s; keep enough headroom for initial control-plane
512
+ // convergence (stream establishment + subscription gossip) in sparse overlays.
513
+ const timeoutMs = options?.timeout || 20 * 1000;
422
514
  let timeout = undefined;
423
515
  let listener = undefined;
516
+ let poll = undefined;
517
+ let checking = false;
424
518
  const clear = () => {
425
519
  if (listener) {
426
520
  this.node.services.pubsub.removeEventListener("subscribe", listener);
@@ -429,7 +523,9 @@ let Program = (() => {
429
523
  this.events.removeEventListener("close", closeListener);
430
524
  this.events.removeEventListener("drop", dropListener);
431
525
  timeout && clearTimeout(timeout);
526
+ poll && clearInterval(poll);
432
527
  timeout = undefined;
528
+ poll = undefined;
433
529
  };
434
530
  const resolveOnce = (hashes) => {
435
531
  if (settled)
@@ -467,15 +563,51 @@ let Program = (() => {
467
563
  options?.signal?.addEventListener("abort", abortListener, { once: true });
468
564
  this.events.addEventListener("close", closeListener, { once: true });
469
565
  this.events.addEventListener("drop", dropListener, { once: true });
566
+ const isPeerReady = async (hash) => {
567
+ const cached = this._peerTopicsByHash?.get(hash);
568
+ if (cached && this.peerHasAllTopics(cached, allTopics)) {
569
+ return true;
570
+ }
571
+ // Subscription events are edge-triggered: we may have missed earlier subscribe
572
+ // events (e.g. if they arrived during program open). Fall back to best-effort
573
+ // pubsub snapshots to avoid false timeouts.
574
+ const pubsubAny = this.node.services.pubsub;
575
+ let key;
576
+ for (const topic of allTopics) {
577
+ // Fast path for TopicControlPlane: O(1) membership check without allocations.
578
+ const topicPeers = pubsubAny?.topics?.get?.(topic);
579
+ if (topicPeers?.has?.(hash)) {
580
+ key ||= topicPeers.get(hash)?.publicKey;
581
+ continue;
582
+ }
583
+ const subscribers = await this.node.services.pubsub.getSubscribers(topic);
584
+ if (!subscribers || subscribers.length === 0) {
585
+ return false;
586
+ }
587
+ const found = subscribers.find((x) => x.hashcode() === hash);
588
+ if (!found) {
589
+ return false;
590
+ }
591
+ key ||= found;
592
+ }
593
+ if (key) {
594
+ this.recordPeerSubscription(key, allTopics);
595
+ }
596
+ return true;
597
+ };
470
598
  const checkReady = async () => {
471
599
  if (settled) {
472
600
  return;
473
601
  }
602
+ if (checking) {
603
+ return;
604
+ }
605
+ checking = true;
474
606
  let ready = true;
475
607
  try {
476
- const allReadyHashes = await this.getReady();
477
608
  for (const hash of expectedHashes) {
478
- if (!allReadyHashes.has(hash)) {
609
+ if (!(await isPeerReady(hash))) {
610
+ requestSubscriberSnapshots(hash);
479
611
  ready = false;
480
612
  break;
481
613
  }
@@ -487,30 +619,33 @@ let Program = (() => {
487
619
  catch (error) {
488
620
  rejectOnce(error);
489
621
  }
622
+ finally {
623
+ checking = false;
624
+ }
490
625
  };
491
626
  listener = () => {
492
627
  void checkReady();
493
628
  };
494
629
  this.node.services.pubsub.addEventListener("subscribe", listener);
630
+ poll = setInterval(() => void checkReady(), 200);
631
+ poll.unref?.();
495
632
  checkReady();
496
633
  });
497
634
  }
498
635
  async getReady() {
499
- // all peers that subscribe to all topics
500
- let ready = undefined; // the interesection of all ready
636
+ // Observed peers that subscribe to all topics.
637
+ // We intentionally do not depend on `pubsub.getSubscribers()` since that implies
638
+ // global membership knowledge which does not scale for large overlays.
501
639
  const allTopics = this.getAllTopicsIncludingThis();
502
640
  if (allTopics.length === 0) {
503
641
  throw new Error("Program has no topics, cannot get ready");
504
642
  }
505
- for (const topic of allTopics) {
506
- const subscribers = await this.node.services.pubsub.getSubscribers(topic);
507
- if (!subscribers) {
643
+ const ready = new Map();
644
+ await this.seedPeerTopicsSnapshot(allTopics);
645
+ for (const [hash, entry] of this.peerTopicsByHash) {
646
+ if (!this.peerHasAllTopics(entry, allTopics))
508
647
  continue;
509
- }
510
- ready = intersection(ready, subscribers);
511
- }
512
- if (ready == null) {
513
- return new Map();
648
+ ready.set(hash, entry.publicKey);
514
649
  }
515
650
  return ready;
516
651
  }
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/program.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/program.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/program",
3
- "version": "5.6.3-07ba572",
3
+ "version": "5.6.3-3f16953",
4
4
  "description": "Program interface",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -53,18 +53,18 @@
53
53
  "license": "MIT",
54
54
  "dependencies": {
55
55
  "@dao-xyz/borsh": "^6.0.0",
56
- "@peerbit/crypto": "2.4.1-07ba572",
57
- "@peerbit/keychain": "1.2.4-07ba572",
58
- "@peerbit/blocks-interface": "1.5.2-07ba572",
59
- "@peerbit/pubsub-interface": "4.1.2-07ba572",
60
- "@peerbit/any-store-interface": "1.1.0-07ba572",
61
- "@peerbit/libp2p-test-utils": "2.2.0-07ba572",
62
- "@peerbit/indexer-interface": "2.1.1-07ba572",
63
- "@peerbit/stream-interface": "5.4.0-07ba572",
64
- "@peerbit/time": "2.3.0-07ba572",
65
- "@peerbit/logger": "2.0.0-07ba572",
66
- "@peerbit/blocks": "3.1.8-07ba572",
67
- "@peerbit/pubsub": "4.1.4-07ba572",
56
+ "@peerbit/crypto": "2.4.1-3f16953",
57
+ "@peerbit/keychain": "1.2.4-3f16953",
58
+ "@peerbit/blocks-interface": "1.5.2-3f16953",
59
+ "@peerbit/pubsub-interface": "4.1.2-3f16953",
60
+ "@peerbit/any-store-interface": "1.1.0-3f16953",
61
+ "@peerbit/libp2p-test-utils": "2.2.0-3f16953",
62
+ "@peerbit/indexer-interface": "2.1.1-3f16953",
63
+ "@peerbit/stream-interface": "5.4.0-3f16953",
64
+ "@peerbit/time": "2.3.0-3f16953",
65
+ "@peerbit/logger": "2.0.0-3f16953",
66
+ "@peerbit/blocks": "3.1.8-3f16953",
67
+ "@peerbit/pubsub": "4.1.4-3f16953",
68
68
  "@libp2p/interface": "^3.1.0",
69
69
  "@multiformats/multiaddr": "^13.0.1",
70
70
  "multiformats": "^13.4.1",
package/src/program.ts CHANGED
@@ -37,28 +37,6 @@ export class MissingAddressError extends Error {
37
37
  }
38
38
  }
39
39
 
40
- const intersection = (
41
- a: Map<string, PublicSignKey> | undefined,
42
- b: Map<string, PublicSignKey> | PublicSignKey[],
43
- ) => {
44
- const newSet = new Map<string, PublicSignKey>();
45
-
46
- if (Array.isArray(b)) {
47
- for (const el of b) {
48
- if (!a || a.has(el.hashcode())) {
49
- newSet.set(el.hashcode(), el);
50
- }
51
- }
52
- } else {
53
- for (const [key, el] of b) {
54
- if (!a || a.has(key)) {
55
- newSet.set(key, el);
56
- }
57
- }
58
- }
59
- return newSet;
60
- };
61
-
62
40
  export type OpenProgram = (program: Program) => Promise<Program>;
63
41
 
64
42
  export interface NetworkEvents {
@@ -302,9 +280,53 @@ export abstract class Program<
302
280
  this._allPrograms = undefined;
303
281
  }
304
282
  private _emittedEventsFor: Set<string> | undefined;
283
+ private _peerTopicsByHash:
284
+ | Map<string, { publicKey: PublicSignKey; topics: Set<string> }>
285
+ | undefined;
286
+ private _seedPeerTopicsFromSubscribers?: Promise<void>;
305
287
  private get emittedEventsFor(): Set<string> {
306
288
  return (this._emittedEventsFor = this._emittedEventsFor || new Set());
307
289
  }
290
+ private get peerTopicsByHash(): Map<
291
+ string,
292
+ { publicKey: PublicSignKey; topics: Set<string> }
293
+ > {
294
+ return (this._peerTopicsByHash =
295
+ this._peerTopicsByHash ||
296
+ new Map<string, { publicKey: PublicSignKey; topics: Set<string> }>());
297
+ }
298
+
299
+ private recordPeerSubscription(from: PublicSignKey, topics: string[]) {
300
+ if (!topics || topics.length === 0) return;
301
+ const fromHash = from.hashcode();
302
+ const existing = this.peerTopicsByHash.get(fromHash);
303
+ if (!existing) {
304
+ const set = new Set<string>();
305
+ for (const topic of topics) set.add(topic);
306
+ this.peerTopicsByHash.set(fromHash, { publicKey: from, topics: set });
307
+ return;
308
+ }
309
+ for (const topic of topics) existing.topics.add(topic);
310
+ }
311
+
312
+ private recordPeerUnsubscription(from: PublicSignKey, topics: string[]) {
313
+ if (!topics || topics.length === 0) return;
314
+ const fromHash = from.hashcode();
315
+ const existing = this.peerTopicsByHash.get(fromHash);
316
+ if (!existing) return;
317
+ for (const topic of topics) existing.topics.delete(topic);
318
+ if (existing.topics.size === 0) this.peerTopicsByHash.delete(fromHash);
319
+ }
320
+
321
+ private peerHasAllTopics(
322
+ entry: { topics: Set<string> },
323
+ allTopics: string[],
324
+ ): boolean {
325
+ for (const topic of allTopics) {
326
+ if (!entry.topics.has(topic)) return false;
327
+ }
328
+ return true;
329
+ }
308
330
 
309
331
  private getAllTopicsIncludingThis(): string[] {
310
332
  const allTopics = [this, ...this.allPrograms]
@@ -314,64 +336,72 @@ export abstract class Program<
314
336
  .flat() as string[];
315
337
  return allTopics;
316
338
  }
317
- private async _emitJoinNetworkEvents(s: SubscriptionEvent) {
318
- if (this.emittedEventsFor.has(s.from.hashcode())) {
319
- return;
320
- }
321
339
 
340
+ private async seedPeerTopicsSnapshot(allTopics: string[]) {
341
+ // Subscription events are edge-triggered: if a peer subscribed before this program
342
+ // attached its listeners, we'd miss it and `waitFor()` could hang. Seed an initial
343
+ // snapshot from `pubsub.getSubscribers()` once, then keep it up to date via events.
344
+ //
345
+ // This is best-effort and does not imply the system has global membership knowledge
346
+ // (implementations may only return known peers).
347
+ if (this._seedPeerTopicsFromSubscribers) {
348
+ return this._seedPeerTopicsFromSubscribers;
349
+ }
350
+ this._seedPeerTopicsFromSubscribers = (async () => {
351
+ if (!this.node) return;
352
+ const pubsub = this.node.services.pubsub;
353
+ for (const topic of allTopics) {
354
+ const subscribers = await pubsub.getSubscribers(topic);
355
+ if (!subscribers || subscribers.length === 0) continue;
356
+ for (const subscriber of subscribers) {
357
+ this.recordPeerSubscription(subscriber, [topic]);
358
+ }
359
+ }
360
+ })();
361
+ return this._seedPeerTopicsFromSubscribers;
362
+ }
363
+ private _emitJoinNetworkEvents(s: SubscriptionEvent) {
322
364
  const allTopics = this.getAllTopicsIncludingThis();
323
365
  if (allTopics.length === 0) {
324
366
  return; // this is important (see events.spec.ts)
325
367
  }
326
368
 
327
- // if subscribing to all topics, emit "join" event
328
- for (const topic of allTopics) {
329
- if (
330
- !(await this.node.services.pubsub.getSubscribers(topic))?.find((x) =>
331
- s.from.equals(x),
332
- )
333
- ) {
334
- return;
335
- }
336
- }
337
- if (this.emittedEventsFor.has(s.from.hashcode())) {
369
+ this.recordPeerSubscription(s.from, s.topics);
370
+
371
+ const fromHash = s.from.hashcode();
372
+ if (this.emittedEventsFor.has(fromHash)) {
338
373
  return;
339
374
  }
340
- this.emittedEventsFor.add(s.from.hashcode());
375
+
376
+ const entry = this.peerTopicsByHash.get(fromHash);
377
+ if (!entry) return;
378
+ if (!this.peerHasAllTopics(entry, allTopics)) return;
379
+
380
+ this.emittedEventsFor.add(fromHash);
341
381
  this.events.dispatchEvent(new CustomEvent("join", { detail: s.from }));
342
382
  }
343
383
 
344
- private async _emitLeaveNetworkEvents(s: UnsubcriptionEvent) {
345
- if (!this.emittedEventsFor.has(s.from.hashcode())) {
346
- return;
347
- }
348
-
384
+ private _emitLeaveNetworkEvents(s: UnsubcriptionEvent) {
349
385
  const allTopics = this.getAllTopicsIncludingThis();
350
386
  if (allTopics.length === 0) {
351
387
  return; // this is important (see events.spec.ts)
352
388
  }
353
389
 
354
- // if subscribing not subscribing to any topics, emit "leave" event
355
- let hasAllTopics = true;
356
- for (const topic of allTopics) {
357
- if (
358
- !(await this.node.services.pubsub.getSubscribers(topic))?.find((x) =>
359
- s.from.equals(x),
360
- )
361
- ) {
362
- hasAllTopics = false;
363
- break;
364
- }
365
- }
390
+ this.recordPeerUnsubscription(s.from, s.topics);
391
+
392
+ const fromHash = s.from.hashcode();
393
+ if (!this.emittedEventsFor.has(fromHash)) return;
394
+
395
+ const entry = this.peerTopicsByHash.get(fromHash);
396
+ const hasAllTopics = entry
397
+ ? this.peerHasAllTopics(entry, allTopics)
398
+ : false;
366
399
 
367
400
  if (hasAllTopics) {
368
401
  return; // still here!?
369
402
  }
370
403
 
371
- if (!this.emittedEventsFor.has(s.from.hashcode())) {
372
- return;
373
- }
374
- this.emittedEventsFor.delete(s.from.hashcode());
404
+ this.emittedEventsFor.delete(fromHash);
375
405
  this.events.dispatchEvent(new CustomEvent("leave", { detail: s.from }));
376
406
  }
377
407
 
@@ -451,6 +481,11 @@ export abstract class Program<
451
481
  "unsubscribe",
452
482
  this._unsubscriptionEventListener,
453
483
  );
484
+ this._emittedEventsFor?.clear();
485
+ this._emittedEventsFor = undefined;
486
+ this._peerTopicsByHash?.clear();
487
+ this._peerTopicsByHash = undefined;
488
+ this._seedPeerTopicsFromSubscribers = undefined;
454
489
 
455
490
  this._eventOptions = undefined;
456
491
 
@@ -504,12 +539,78 @@ export abstract class Program<
504
539
  timeout: options?.timeout,
505
540
  });
506
541
 
542
+ const allTopics = this.getAllTopicsIncludingThis();
543
+ if (allTopics.length === 0) {
544
+ throw new Error("Program has no topics, cannot get ready");
545
+ }
546
+ const pubsub = this.node.services.pubsub;
547
+
548
+ // Prefer a direct neighbour stream when available. This avoids cases where
549
+ // peers are "reachable" via the routing table but we haven't established
550
+ // a writable protocol stream yet (initial control-plane gossip can be dropped).
551
+ const neighborProbeTimeout = Math.min(options?.timeout ?? 10_000, 3_000);
552
+ await Promise.all(
553
+ expectedHashes.map((hash) =>
554
+ pubsub
555
+ .waitFor(hash, { target: "neighbor", timeout: neighborProbeTimeout })
556
+ .catch(() => {
557
+ // Multi-hop overlays may never be direct neighbours; best-effort only.
558
+ }),
559
+ ),
560
+ );
561
+
562
+ // Best-effort seeding: subscribe events are edge-triggered and can be missed if a peer
563
+ // subscribed before this program attached listeners. Actively ask for subscriber
564
+ // snapshots while waiting, but rate-limit to avoid fanout in larger overlays.
565
+ const REQUEST_MIN_INTERVAL_MS = 500;
566
+ const lastRequestAtByPeer = new Map<string, number>();
567
+ const publicKeyByHash = new Map<
568
+ string,
569
+ Promise<PublicSignKey | undefined>
570
+ >();
571
+ const resolvePublicKey = (
572
+ hash: string,
573
+ ): Promise<PublicSignKey | undefined> => {
574
+ let existing = publicKeyByHash.get(hash);
575
+ if (!existing) {
576
+ existing = Promise.resolve(pubsub.getPublicKey(hash)).catch(
577
+ (): PublicSignKey | undefined => undefined,
578
+ );
579
+ publicKeyByHash.set(hash, existing);
580
+ }
581
+ return existing;
582
+ };
583
+ const requestSubscriberSnapshots = (hash: string): void => {
584
+ const now = Date.now();
585
+ const last = lastRequestAtByPeer.get(hash) ?? 0;
586
+ if (now - last < REQUEST_MIN_INTERVAL_MS) return;
587
+ lastRequestAtByPeer.set(hash, now);
588
+
589
+ void resolvePublicKey(hash).then((publicKey) => {
590
+ for (const topic of allTopics) {
591
+ void Promise.resolve(
592
+ pubsub.requestSubscribers(topic, publicKey),
593
+ ).catch(() => {
594
+ // best-effort; the wait loop will retry and/or time out
595
+ });
596
+ }
597
+ });
598
+ };
599
+
600
+ for (const hash of expectedHashes) {
601
+ requestSubscriberSnapshots(hash);
602
+ }
603
+
507
604
  // wait for subscribing to topics
508
605
  return new Promise<string[]>((resolve, reject) => {
509
606
  let settled = false;
510
- const timeoutMs = options?.timeout || 10 * 1000;
607
+ // Historically this was ~20s; keep enough headroom for initial control-plane
608
+ // convergence (stream establishment + subscription gossip) in sparse overlays.
609
+ const timeoutMs = options?.timeout || 20 * 1000;
511
610
  let timeout: ReturnType<typeof setTimeout> | undefined = undefined;
512
611
  let listener: (() => void) | undefined = undefined;
612
+ let poll: ReturnType<typeof setInterval> | undefined = undefined;
613
+ let checking = false;
513
614
 
514
615
  const clear = () => {
515
616
  if (listener) {
@@ -519,7 +620,9 @@ export abstract class Program<
519
620
  this.events.removeEventListener("close", closeListener);
520
621
  this.events.removeEventListener("drop", dropListener);
521
622
  timeout && clearTimeout(timeout);
623
+ poll && clearInterval(poll);
522
624
  timeout = undefined;
625
+ poll = undefined;
523
626
  };
524
627
 
525
628
  const resolveOnce = (hashes: string[]) => {
@@ -567,15 +670,59 @@ export abstract class Program<
567
670
  this.events.addEventListener("close", closeListener, { once: true });
568
671
  this.events.addEventListener("drop", dropListener, { once: true });
569
672
 
673
+ const isPeerReady = async (hash: string) => {
674
+ const cached = this._peerTopicsByHash?.get(hash);
675
+ if (cached && this.peerHasAllTopics(cached, allTopics)) {
676
+ return true;
677
+ }
678
+
679
+ // Subscription events are edge-triggered: we may have missed earlier subscribe
680
+ // events (e.g. if they arrived during program open). Fall back to best-effort
681
+ // pubsub snapshots to avoid false timeouts.
682
+ const pubsubAny = this.node.services.pubsub as any;
683
+ let key: PublicSignKey | undefined;
684
+
685
+ for (const topic of allTopics) {
686
+ // Fast path for TopicControlPlane: O(1) membership check without allocations.
687
+ const topicPeers:
688
+ | Map<string, { publicKey: PublicSignKey }>
689
+ | undefined = pubsubAny?.topics?.get?.(topic);
690
+ if (topicPeers?.has?.(hash)) {
691
+ key ||= topicPeers.get(hash)?.publicKey;
692
+ continue;
693
+ }
694
+
695
+ const subscribers =
696
+ await this.node.services.pubsub.getSubscribers(topic);
697
+ if (!subscribers || subscribers.length === 0) {
698
+ return false;
699
+ }
700
+ const found = subscribers.find((x) => x.hashcode() === hash);
701
+ if (!found) {
702
+ return false;
703
+ }
704
+ key ||= found;
705
+ }
706
+
707
+ if (key) {
708
+ this.recordPeerSubscription(key, allTopics);
709
+ }
710
+ return true;
711
+ };
712
+
570
713
  const checkReady = async () => {
571
714
  if (settled) {
572
715
  return;
573
716
  }
717
+ if (checking) {
718
+ return;
719
+ }
720
+ checking = true;
574
721
  let ready = true;
575
722
  try {
576
- const allReadyHashes = await this.getReady();
577
723
  for (const hash of expectedHashes) {
578
- if (!allReadyHashes.has(hash)) {
724
+ if (!(await isPeerReady(hash))) {
725
+ requestSubscriberSnapshots(hash);
579
726
  ready = false;
580
727
  break;
581
728
  }
@@ -585,33 +732,35 @@ export abstract class Program<
585
732
  }
586
733
  } catch (error) {
587
734
  rejectOnce(error);
735
+ } finally {
736
+ checking = false;
588
737
  }
589
738
  };
590
739
  listener = () => {
591
740
  void checkReady();
592
741
  };
593
742
  this.node.services.pubsub.addEventListener("subscribe", listener);
743
+ poll = setInterval(() => void checkReady(), 200);
744
+ poll.unref?.();
594
745
  checkReady();
595
746
  });
596
747
  }
597
748
 
598
749
  async getReady(): Promise<Map<string, PublicSignKey>> {
599
- // all peers that subscribe to all topics
600
- let ready: Map<string, PublicSignKey> | undefined = undefined; // the interesection of all ready
750
+ // Observed peers that subscribe to all topics.
751
+ // We intentionally do not depend on `pubsub.getSubscribers()` since that implies
752
+ // global membership knowledge which does not scale for large overlays.
601
753
  const allTopics = this.getAllTopicsIncludingThis();
602
754
  if (allTopics.length === 0) {
603
755
  throw new Error("Program has no topics, cannot get ready");
604
756
  }
605
757
 
606
- for (const topic of allTopics) {
607
- const subscribers = await this.node.services.pubsub.getSubscribers(topic);
608
- if (!subscribers) {
609
- continue;
610
- }
611
- ready = intersection(ready, subscribers);
612
- }
613
- if (ready == null) {
614
- return new Map();
758
+ const ready = new Map<string, PublicSignKey>();
759
+ await this.seedPeerTopicsSnapshot(allTopics);
760
+
761
+ for (const [hash, entry] of this.peerTopicsByHash) {
762
+ if (!this.peerHasAllTopics(entry, allTopics)) continue;
763
+ ready.set(hash, entry.publicKey);
615
764
  }
616
765
  return ready;
617
766
  }