@peerbit/pubsub 5.3.10 → 5.3.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/pubsub",
3
- "version": "5.3.10",
3
+ "version": "5.3.11",
4
4
  "description": "Direct streaming for libp2p",
5
5
  "type": "module",
6
6
  "types": "./dist/src/index.d.ts",
@@ -84,12 +84,12 @@
84
84
  "p-defer": "^4.0.0",
85
85
  "uint8arraylist": "^2.4.8",
86
86
  "uint8arrays": "^5.1.0",
87
+ "@peerbit/pubsub-interface": "5.1.9",
87
88
  "@peerbit/any-store-interface": "1.1.2",
88
- "@peerbit/logger": "2.0.1",
89
89
  "@peerbit/stream": "5.1.5",
90
- "@peerbit/stream-interface": "6.0.14",
91
- "@peerbit/pubsub-interface": "5.1.9",
90
+ "@peerbit/logger": "2.0.1",
92
91
  "@peerbit/crypto": "3.1.4",
92
+ "@peerbit/stream-interface": "6.0.14",
93
93
  "@peerbit/time": "3.0.1"
94
94
  },
95
95
  "scripts": {
@@ -956,6 +956,7 @@ type ProviderAnnounceState = {
956
956
  bootstrapOverride?: Multiaddr[];
957
957
  bootstrapDialTimeoutMs: number;
958
958
  bootstrapMaxPeers: number;
959
+ closeController: AbortController;
959
960
  closed: boolean;
960
961
  loop?: Promise<void>;
961
962
  };
@@ -970,6 +971,7 @@ type ProviderWatchState = {
970
971
  bootstrapMaxPeers: number;
971
972
  onProviders: (providers: FanoutProviderCandidate[]) => void;
972
973
  signal?: AbortSignal;
974
+ closeController: AbortController;
973
975
  closed: boolean;
974
976
  trackerPeers: string[];
975
977
  loop?: Promise<void>;
@@ -1000,6 +1002,7 @@ type ChannelState = {
1000
1002
  metrics: FanoutTreeChannelMetrics;
1001
1003
  level: number;
1002
1004
  isRoot: boolean;
1005
+ closeController: AbortController;
1003
1006
  closed: boolean;
1004
1007
  parent?: string;
1005
1008
  children: Map<string, ChildInfo>;
@@ -1399,7 +1402,36 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
1399
1402
  );
1400
1403
  }
1401
1404
 
1405
+ private createLoopCloseController(): AbortController {
1406
+ const controller = new AbortController();
1407
+ const stopSignal = this.closeController.signal;
1408
+ const abortOnStop = () => controller.abort();
1409
+
1410
+ if (stopSignal.aborted) {
1411
+ abortOnStop();
1412
+ } else {
1413
+ stopSignal.addEventListener("abort", abortOnStop, { once: true });
1414
+ controller.signal.addEventListener(
1415
+ "abort",
1416
+ () => stopSignal.removeEventListener("abort", abortOnStop),
1417
+ { once: true },
1418
+ );
1419
+ }
1420
+ return controller;
1421
+ }
1422
+
1402
1423
  public override async stop() {
1424
+ for (const state of this.providerAnnounceBySuffixKey.values()) {
1425
+ state.closeController.abort();
1426
+ }
1427
+ for (const watches of this.providerWatchesBySuffixKey.values()) {
1428
+ for (const watch of watches) {
1429
+ watch.closeController.abort();
1430
+ }
1431
+ }
1432
+ for (const channel of this.channelsBySuffixKey.values()) {
1433
+ channel.closeController.abort();
1434
+ }
1403
1435
  if (this.underlayPeerDisconnectHandler) {
1404
1436
  this.components.events.removeEventListener(
1405
1437
  "peer:disconnect",
@@ -1668,6 +1700,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
1668
1700
  bootstrapOverride,
1669
1701
  bootstrapDialTimeoutMs,
1670
1702
  bootstrapMaxPeers,
1703
+ closeController: this.createLoopCloseController(),
1671
1704
  closed: false,
1672
1705
  };
1673
1706
  this.providerAnnounceBySuffixKey.set(id.suffixKey, state);
@@ -1685,6 +1718,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
1685
1718
  const current = this.providerAnnounceBySuffixKey.get(id.suffixKey);
1686
1719
  if (!current) return;
1687
1720
  current.closed = true;
1721
+ current.closeController.abort();
1688
1722
  this.providerAnnounceBySuffixKey.delete(id.suffixKey);
1689
1723
  // Best-effort immediate withdrawal (ttl=0).
1690
1724
  void this.announceProviderOnce(
@@ -1739,6 +1773,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
1739
1773
  bootstrapOverride,
1740
1774
  bootstrapDialTimeoutMs,
1741
1775
  bootstrapMaxPeers,
1776
+ closeController: new AbortController(),
1742
1777
  closed: false,
1743
1778
  };
1744
1779
 
@@ -1748,7 +1783,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
1748
1783
  private async _providerAnnounceLoop(
1749
1784
  state: ProviderAnnounceState,
1750
1785
  ): Promise<void> {
1751
- const signal = this.closeController.signal;
1786
+ const signal = state.closeController.signal;
1752
1787
  for (;;) {
1753
1788
  if (signal.aborted || state.closed) return;
1754
1789
  try {
@@ -1756,7 +1791,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
1756
1791
  } catch {
1757
1792
  // ignore
1758
1793
  }
1759
- await delay(Math.max(50, state.announceIntervalMs));
1794
+ await delay(Math.max(50, state.announceIntervalMs), { signal });
1760
1795
  }
1761
1796
  }
1762
1797
 
@@ -2008,6 +2043,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
2008
2043
  ),
2009
2044
  onProviders: options.onProviders,
2010
2045
  signal: options.signal,
2046
+ closeController: this.createLoopCloseController(),
2011
2047
  closed: false,
2012
2048
  trackerPeers: [],
2013
2049
  };
@@ -2036,6 +2072,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
2036
2072
  const close = () => {
2037
2073
  if (watch.closed) return;
2038
2074
  watch.closed = true;
2075
+ watch.closeController.abort();
2039
2076
  localWatches?.delete(watch);
2040
2077
  if (localWatches && localWatches.size === 0) {
2041
2078
  this.providerWatchesBySuffixKey.delete(id.suffixKey);
@@ -2053,8 +2090,8 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
2053
2090
  watch.signal?.addEventListener("abort", onAbort, { once: true });
2054
2091
 
2055
2092
  const loopSignal = watch.signal
2056
- ? anySignal([this.closeController.signal, watch.signal])
2057
- : this.closeController.signal;
2093
+ ? anySignal([watch.closeController.signal, watch.signal])
2094
+ : watch.closeController.signal;
2058
2095
 
2059
2096
  watch.loop = (async () => {
2060
2097
  for (;;) {
@@ -2268,6 +2305,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
2268
2305
  metrics: this.getMetricsForSuffixKey(id.suffixKey),
2269
2306
  level: opts.role === "root" ? 0 : Number.POSITIVE_INFINITY,
2270
2307
  isRoot: opts.role === "root",
2308
+ closeController: this.createLoopCloseController(),
2271
2309
  closed: false,
2272
2310
  parent: undefined,
2273
2311
  children: new Map(),
@@ -2624,6 +2662,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
2624
2662
  if (!ch) return;
2625
2663
  if (ch.closed) return;
2626
2664
  ch.closed = true;
2665
+ ch.closeController.abort();
2627
2666
 
2628
2667
  // If a join is in-flight, surface that it won't complete.
2629
2668
  try {
@@ -4900,7 +4939,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
4900
4939
  }
4901
4940
 
4902
4941
  private async _announceLoop(ch: ChannelState): Promise<void> {
4903
- const signal = this.closeController.signal;
4942
+ const signal = ch.closeController.signal;
4904
4943
  for (;;) {
4905
4944
  if (signal.aborted || ch.closed) return;
4906
4945
  try {
@@ -4925,12 +4964,12 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
4925
4964
  // ignore
4926
4965
  }
4927
4966
  const sleepMs = ch.announceIntervalMs > 0 ? ch.announceIntervalMs : 1_000;
4928
- await delay(sleepMs);
4967
+ await delay(sleepMs, { signal });
4929
4968
  }
4930
4969
  }
4931
4970
 
4932
4971
  private async _repairLoop(ch: ChannelState): Promise<void> {
4933
- const signal = this.closeController.signal;
4972
+ const signal = ch.closeController.signal;
4934
4973
  for (;;) {
4935
4974
  if (signal.aborted || ch.closed) return;
4936
4975
  try {
@@ -4941,7 +4980,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
4941
4980
  const activeMs = ch.repairIntervalMs > 0 ? ch.repairIntervalMs : 200;
4942
4981
  const sleepMs =
4943
4982
  ch.missingSeqs.size > 0 ? activeMs : Math.max(activeMs, 1_000);
4944
- await delay(sleepMs);
4983
+ await delay(sleepMs, { signal });
4945
4984
  }
4946
4985
  }
4947
4986
 
@@ -5179,7 +5218,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
5179
5218
  }
5180
5219
 
5181
5220
  private async _meshLoop(ch: ChannelState): Promise<void> {
5182
- const signal = this.closeController.signal;
5221
+ const signal = ch.closeController.signal;
5183
5222
  let lastRefreshAt = 0;
5184
5223
  for (;;) {
5185
5224
  if (signal.aborted || ch.closed) return;
@@ -5209,7 +5248,7 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
5209
5248
  ch.neighborMeshRefreshIntervalMs,
5210
5249
  ].filter((v) => v > 0);
5211
5250
  const sleepMs = intervals.length > 0 ? Math.min(...intervals) : 500;
5212
- await delay(Math.max(50, sleepMs));
5251
+ await delay(Math.max(50, sleepMs), { signal });
5213
5252
  }
5214
5253
  }
5215
5254
 
@@ -5678,8 +5717,8 @@ export class FanoutTree extends DirectStream<FanoutTreeEvents> {
5678
5717
  const start = Date.now();
5679
5718
  const cooldownUntilByHash = new Map<string, number>();
5680
5719
  const combinedSignal = joinOpts.signal
5681
- ? anySignal([this.closeController.signal, joinOpts.signal])
5682
- : this.closeController.signal;
5720
+ ? anySignal([ch.closeController.signal, joinOpts.signal])
5721
+ : ch.closeController.signal;
5683
5722
  const signal = combinedSignal as AbortSignal & { clear?: () => void };
5684
5723
  let nextParentUpgradeCheckAt = 0;
5685
5724
  let parentUpgradeCheckSeq = 0;