peerbit 5.3.6 → 5.3.7

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,79 @@
1
+ import type { Multiaddr } from "@multiformats/multiaddr";
2
+ /**
3
+ * Automatic bootstrap recovery is opt-in so creating a Peerbit client keeps
4
+ * its existing no-network-side-effect behavior unless an application asks for
5
+ * recovery explicitly.
6
+ */
7
+ export type BootstrapRecoveryOptions = {
8
+ /** Set to false to leave recovery disabled. Defaults to true for an options object. */
9
+ enabled?: boolean;
10
+ /**
11
+ * Fixed bootstrap targets. When omitted, every recovery attempt resolves the
12
+ * current public bootstrap list, including its canonical fallback source.
13
+ */
14
+ addresses?: Array<string | Multiaddr>;
15
+ /**
16
+ * Delay after the first failed attempt. Defaults to 1 second; maximum is
17
+ * 2,147,483,647 ms.
18
+ */
19
+ initialDelayMs?: number;
20
+ /**
21
+ * Maximum retry delay, including jitter. Defaults to 60 seconds; maximum is
22
+ * 2,147,483,647 ms.
23
+ */
24
+ maxDelayMs?: number;
25
+ /** Exponential multiplier applied after each failed attempt. Defaults to 2. */
26
+ backoffFactor?: number;
27
+ /** Symmetric jitter ratio in the inclusive range 0..1. Defaults to 0.2. */
28
+ jitter?: number;
29
+ /**
30
+ * Minimum time between attempts and reconnects. Defaults to 1 second;
31
+ * maximum is 2,147,483,647 ms.
32
+ */
33
+ cooldownMs?: number;
34
+ };
35
+ export type BootstrapRecoveryEventTarget = {
36
+ addEventListener(type: string, listener: EventListener): void;
37
+ removeEventListener(type: string, listener: EventListener): void;
38
+ };
39
+ export type BootstrapRecoveryRuntime = {
40
+ bootstrap(signal: AbortSignal): Promise<unknown>;
41
+ connectionEvents: BootstrapRecoveryEventTarget;
42
+ onlineEvents?: BootstrapRecoveryEventTarget;
43
+ isConnected(): boolean;
44
+ isOnline?: () => boolean;
45
+ now?: () => number;
46
+ random?: () => number;
47
+ onError?: (error: unknown) => void;
48
+ };
49
+ /** Validate policy configuration before an owning client acquires resources. */
50
+ export declare const validateBootstrapRecoveryOptions: (options: BootstrapRecoveryOptions) => void;
51
+ /** Internal lifecycle controller, exported from its source module for tests. */
52
+ export declare class BootstrapRecoveryController {
53
+ private readonly runtime;
54
+ private readonly options;
55
+ private readonly now;
56
+ private readonly random;
57
+ private running;
58
+ private timer?;
59
+ private timerDueAt?;
60
+ private inFlight?;
61
+ private attemptAbort?;
62
+ private consecutiveFailures;
63
+ private lastAttemptAt;
64
+ private retryNotBefore;
65
+ private readonly onConnectionOpen;
66
+ private readonly onConnectionClose;
67
+ private readonly onOnline;
68
+ constructor(runtime: BootstrapRecoveryRuntime, options?: BootstrapRecoveryOptions);
69
+ get started(): boolean;
70
+ start(): void;
71
+ stop(): Promise<void>;
72
+ private markConnected;
73
+ private requestRecovery;
74
+ private clearTimer;
75
+ private schedule;
76
+ private runAttempt;
77
+ private scheduleRetry;
78
+ }
79
+ //# sourceMappingURL=bootstrap-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-recovery.d.ts","sourceRoot":"","sources":["../../src/bootstrap-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACtC,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,MAAM,MAAM,4BAA4B,GAAG;IAC1C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACtC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,gBAAgB,EAAE,4BAA4B,CAAC;IAC/C,YAAY,CAAC,EAAE,4BAA4B,CAAC;IAC5C,WAAW,IAAI,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC,CAAC;AAmEF,gFAAgF;AAChF,eAAO,MAAM,gCAAgC,GAC5C,SAAS,wBAAwB,KAC/B,IAKF,CAAC;AAEF,gFAAgF;AAChF,qBAAa,2BAA2B;IA8BtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IA7BzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,YAAY,CAAC,CAAkB;IACvC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,cAAc,CAA4B;IAElD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAM/B;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEhC;IAEF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAEvB;gBAGgB,OAAO,EAAE,wBAAwB,EAClD,OAAO,GAAE,wBAA6B;IAOvC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,KAAK,IAAI,IAAI;IAoBb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;IAqBhB,OAAO,CAAC,UAAU;IAmDlB,OAAO,CAAC,aAAa;CA0BrB"}
@@ -0,0 +1,216 @@
1
+ const DEFAULT_OPTIONS = {
2
+ initialDelayMs: 1_000,
3
+ maxDelayMs: 60_000,
4
+ backoffFactor: 2,
5
+ jitter: 0.2,
6
+ cooldownMs: 1_000,
7
+ };
8
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
9
+ const finiteNumber = (name, value, minimum) => {
10
+ if (!Number.isFinite(value) || value < minimum) {
11
+ throw new Error(`${name} must be a finite number >= ${minimum}`);
12
+ }
13
+ return value;
14
+ };
15
+ const timerDelay = (name, value, minimum) => {
16
+ const delay = finiteNumber(name, value, minimum);
17
+ if (delay > MAX_TIMER_DELAY_MS) {
18
+ throw new Error(`${name} must be <= ${MAX_TIMER_DELAY_MS}`);
19
+ }
20
+ return delay;
21
+ };
22
+ const normalizeOptions = (options) => {
23
+ const initialDelayMs = timerDelay("bootstrapRecovery.initialDelayMs", options.initialDelayMs ?? DEFAULT_OPTIONS.initialDelayMs, 1);
24
+ const maxDelayMs = timerDelay("bootstrapRecovery.maxDelayMs", options.maxDelayMs ?? DEFAULT_OPTIONS.maxDelayMs, initialDelayMs);
25
+ const backoffFactor = finiteNumber("bootstrapRecovery.backoffFactor", options.backoffFactor ?? DEFAULT_OPTIONS.backoffFactor, 1);
26
+ const jitter = finiteNumber("bootstrapRecovery.jitter", options.jitter ?? DEFAULT_OPTIONS.jitter, 0);
27
+ if (jitter > 1) {
28
+ throw new Error("bootstrapRecovery.jitter must be <= 1");
29
+ }
30
+ const cooldownMs = timerDelay("bootstrapRecovery.cooldownMs", options.cooldownMs ?? DEFAULT_OPTIONS.cooldownMs, 0);
31
+ return {
32
+ initialDelayMs,
33
+ maxDelayMs,
34
+ backoffFactor,
35
+ jitter,
36
+ cooldownMs,
37
+ };
38
+ };
39
+ /** Validate policy configuration before an owning client acquires resources. */
40
+ export const validateBootstrapRecoveryOptions = (options) => {
41
+ if (options.addresses?.length === 0) {
42
+ throw new Error("bootstrapRecovery.addresses must not be empty");
43
+ }
44
+ normalizeOptions(options);
45
+ };
46
+ /** Internal lifecycle controller, exported from its source module for tests. */
47
+ export class BootstrapRecoveryController {
48
+ runtime;
49
+ options;
50
+ now;
51
+ random;
52
+ running = false;
53
+ timer;
54
+ timerDueAt;
55
+ inFlight;
56
+ attemptAbort;
57
+ consecutiveFailures = 0;
58
+ lastAttemptAt = Number.NEGATIVE_INFINITY;
59
+ retryNotBefore = Number.NEGATIVE_INFINITY;
60
+ onConnectionOpen = () => {
61
+ // A bootstrap attempt emits this event from inside its own successful dial.
62
+ // Let that attempt finish all Peerbit bootstrap side effects before treating
63
+ // the recovery as complete.
64
+ if (this.inFlight)
65
+ return;
66
+ this.markConnected();
67
+ };
68
+ onConnectionClose = () => {
69
+ this.requestRecovery(false);
70
+ };
71
+ onOnline = () => {
72
+ this.requestRecovery(true);
73
+ };
74
+ constructor(runtime, options = {}) {
75
+ this.runtime = runtime;
76
+ this.options = normalizeOptions(options);
77
+ this.now = runtime.now ?? Date.now;
78
+ this.random = runtime.random ?? Math.random;
79
+ }
80
+ get started() {
81
+ return this.running;
82
+ }
83
+ start() {
84
+ if (this.running)
85
+ return;
86
+ this.running = true;
87
+ this.runtime.connectionEvents.addEventListener("connection:open", this.onConnectionOpen);
88
+ this.runtime.connectionEvents.addEventListener("connection:close", this.onConnectionClose);
89
+ this.runtime.onlineEvents?.addEventListener("online", this.onOnline);
90
+ if (this.runtime.isConnected()) {
91
+ this.markConnected();
92
+ }
93
+ else {
94
+ this.schedule(0, false);
95
+ }
96
+ }
97
+ stop() {
98
+ if (this.running) {
99
+ this.running = false;
100
+ this.runtime.connectionEvents.removeEventListener("connection:open", this.onConnectionOpen);
101
+ this.runtime.connectionEvents.removeEventListener("connection:close", this.onConnectionClose);
102
+ this.runtime.onlineEvents?.removeEventListener("online", this.onOnline);
103
+ this.clearTimer();
104
+ this.attemptAbort?.abort(new Error("Bootstrap recovery stopped"));
105
+ this.attemptAbort = undefined;
106
+ }
107
+ return this.inFlight ?? Promise.resolve();
108
+ }
109
+ markConnected() {
110
+ if (!this.running)
111
+ return;
112
+ this.consecutiveFailures = 0;
113
+ this.retryNotBefore = Number.NEGATIVE_INFINITY;
114
+ this.lastAttemptAt = this.now();
115
+ this.clearTimer();
116
+ }
117
+ requestRecovery(urgent) {
118
+ if (!this.running || this.runtime.isConnected() || this.inFlight)
119
+ return;
120
+ const now = this.now();
121
+ const cooldownRemaining = Math.max(0, this.lastAttemptAt + this.options.cooldownMs - now);
122
+ const retryRemaining = Math.max(0, this.retryNotBefore - now);
123
+ this.schedule(Math.max(cooldownRemaining, retryRemaining), urgent);
124
+ }
125
+ clearTimer() {
126
+ if (this.timer) {
127
+ clearTimeout(this.timer);
128
+ }
129
+ this.timer = undefined;
130
+ this.timerDueAt = undefined;
131
+ }
132
+ schedule(delayMs, replaceIfEarlier) {
133
+ if (!this.running)
134
+ return;
135
+ const delay = Math.max(0, delayMs);
136
+ const dueAt = this.now() + delay;
137
+ if (this.timer) {
138
+ if (!replaceIfEarlier || (this.timerDueAt ?? dueAt) <= dueAt) {
139
+ return;
140
+ }
141
+ this.clearTimer();
142
+ }
143
+ this.timerDueAt = dueAt;
144
+ this.timer = setTimeout(() => {
145
+ this.timer = undefined;
146
+ this.timerDueAt = undefined;
147
+ this.runAttempt();
148
+ }, delay);
149
+ this.timer.unref?.();
150
+ }
151
+ runAttempt() {
152
+ if (!this.running || this.runtime.isConnected()) {
153
+ if (this.runtime.isConnected())
154
+ this.markConnected();
155
+ return;
156
+ }
157
+ if (this.runtime.isOnline?.() === false) {
158
+ // Browser online events bring this forward immediately; the bounded timer
159
+ // remains as a safety net for missed or unreliable environment signals.
160
+ this.schedule(this.options.maxDelayMs, false);
161
+ return;
162
+ }
163
+ const cooldownRemaining = Math.max(0, this.lastAttemptAt + this.options.cooldownMs - this.now());
164
+ if (cooldownRemaining > 0) {
165
+ this.schedule(cooldownRemaining, false);
166
+ return;
167
+ }
168
+ if (this.inFlight)
169
+ return;
170
+ this.lastAttemptAt = this.now();
171
+ const controller = new AbortController();
172
+ this.attemptAbort = controller;
173
+ const attempt = Promise.resolve().then(async () => {
174
+ await this.runtime.bootstrap(controller.signal);
175
+ });
176
+ const flight = attempt
177
+ .catch((error) => {
178
+ if (this.running && !controller.signal.aborted) {
179
+ this.runtime.onError?.(error);
180
+ }
181
+ })
182
+ .finally(() => {
183
+ if (this.inFlight !== flight)
184
+ return;
185
+ this.inFlight = undefined;
186
+ if (this.attemptAbort === controller) {
187
+ this.attemptAbort = undefined;
188
+ }
189
+ if (!this.running)
190
+ return;
191
+ if (this.runtime.isConnected()) {
192
+ this.markConnected();
193
+ return;
194
+ }
195
+ // A bootstrap call that returns after its connection has already closed is
196
+ // still a recovery failure and must remain on the bounded retry path.
197
+ this.scheduleRetry();
198
+ });
199
+ this.inFlight = flight;
200
+ }
201
+ scheduleRetry() {
202
+ const exponent = Math.min(this.consecutiveFailures, 52);
203
+ const baseDelay = Math.min(this.options.maxDelayMs, this.options.initialDelayMs *
204
+ Math.pow(this.options.backoffFactor, exponent));
205
+ this.consecutiveFailures += 1;
206
+ const random = Math.max(0, Math.min(1, this.random()));
207
+ const jitterMultiplier = 1 + (random * 2 - 1) * this.options.jitter;
208
+ const retryDelay = Math.max(1, Math.min(this.options.maxDelayMs, Math.round(baseDelay * jitterMultiplier)));
209
+ const now = this.now();
210
+ const cooldownRemaining = Math.max(0, this.lastAttemptAt + this.options.cooldownMs - now);
211
+ const delay = Math.max(retryDelay, cooldownRemaining);
212
+ this.retryNotBefore = now + delay;
213
+ this.schedule(delay, false);
214
+ }
215
+ }
216
+ //# sourceMappingURL=bootstrap-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-recovery.js","sourceRoot":"","sources":["../../src/bootstrap-recovery.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  import { type Multiaddr } from "@multiformats/multiaddr";
2
- export declare const resolveBootstrapAddresses: (v?: string) => Promise<string[]>;
2
+ export type ResolveBootstrapAddressesOptions = {
3
+ signal?: AbortSignal;
4
+ };
5
+ export declare const resolveBootstrapAddresses: (v?: string, options?: ResolveBootstrapAddressesOptions) => Promise<string[]>;
3
6
  export declare const getBootstrapPeerId: (address: string | Multiaddr) => string | undefined;
4
7
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,yBAAyB,CAAC;AAEpE,eAAO,MAAM,yBAAyB,GACrC,IAAG,MAAY,KACb,OAAO,CAAC,MAAM,EAAE,CAWlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC9B,SAAS,MAAM,GAAG,SAAS,KACzB,MAAM,GAAG,SAQX,CAAC"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,yBAAyB,CAAC;AA2PpE,MAAM,MAAM,gCAAgC,GAAG;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACrC,IAAG,MAAY,EACf,UAAS,gCAAqC,KAC5C,OAAO,CAAC,MAAM,EAAE,CA0BlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC9B,SAAS,MAAM,GAAG,SAAS,KACzB,MAAM,GAAG,SAaX,CAAC"}
@@ -1,15 +1,209 @@
1
1
  import { multiaddr } from "@multiformats/multiaddr";
2
- export const resolveBootstrapAddresses = async (v = "5") => {
3
- // Bootstrap addresses for network
4
- return (await (await fetch(`https://bootstrap.peerbit.org/bootstrap${v ? "-" + v : ""}.env`)).text())
5
- .split(/\r?\n/)
6
- .filter((x) => x.length > 0);
2
+ import { Circuit, DNSADDR, TCP, WebRTC, WebSockets, WebSocketsSecure, } from "@multiformats/multiaddr-matcher";
3
+ const BOOTSTRAP_LIST_FETCH_TIMEOUT_MS = 10_000;
4
+ const MAX_BOOTSTRAP_LIST_BYTES = 64 * 1024;
5
+ const MAX_BOOTSTRAP_LIST_LINES = 512;
6
+ const MAX_BOOTSTRAP_ADDRESS_COUNT = 256;
7
+ const hasRemoteEndpoint = (address) => !address
8
+ .getComponents()
9
+ .some((component) => (component.name === "tcp" && component.value === "0") ||
10
+ (component.name === "ip4" && component.value === "0.0.0.0") ||
11
+ (component.name === "ip6" && component.value === "::"));
12
+ const hasDatagramTransport = (address) => address
13
+ .getComponents()
14
+ .some((component) => ["udp", "quic", "quic-v1", "webtransport", "webrtc-direct"].includes(component.name));
15
+ const isWebSocketTarget = (address) => !hasDatagramTransport(address) && WebSockets.exactMatch(address);
16
+ const isSecureWebSocketTarget = (address) => !hasDatagramTransport(address) && WebSocketsSecure.exactMatch(address);
17
+ const hasDefaultDirectPrefix = (address) => !hasDatagramTransport(address) &&
18
+ (DNSADDR.matches(address) ||
19
+ TCP.matches(address) ||
20
+ WebSockets.matches(address) ||
21
+ WebSocketsSecure.matches(address));
22
+ const hasBrowserSafeDirectPrefix = (address) => !hasDatagramTransport(address) &&
23
+ (DNSADDR.matches(address) || WebSocketsSecure.matches(address));
24
+ const hasCircuitPeerIds = (address) => {
25
+ const components = address.getComponents();
26
+ const circuitIndex = components.findIndex((component) => component.name === "p2p-circuit");
27
+ return (circuitIndex >= 0 &&
28
+ components
29
+ .slice(0, circuitIndex)
30
+ .some((component) => component.name === "p2p") &&
31
+ components
32
+ .slice(circuitIndex + 1)
33
+ .some((component) => component.name === "p2p"));
34
+ };
35
+ const classifyBootstrapAddress = (address) => {
36
+ if (!hasRemoteEndpoint(address)) {
37
+ return { supported: false, crossRuntime: false };
38
+ }
39
+ const direct = DNSADDR.exactMatch(address) ||
40
+ TCP.exactMatch(address) ||
41
+ isWebSocketTarget(address) ||
42
+ isSecureWebSocketTarget(address);
43
+ const circuit = hasCircuitPeerIds(address) &&
44
+ Circuit.exactMatch(address) &&
45
+ hasDefaultDirectPrefix(address);
46
+ const webRTC = hasCircuitPeerIds(address) &&
47
+ WebRTC.exactMatch(address) &&
48
+ hasBrowserSafeDirectPrefix(address);
49
+ const crossRuntime = DNSADDR.exactMatch(address) ||
50
+ isSecureWebSocketTarget(address) ||
51
+ (circuit && hasBrowserSafeDirectPrefix(address));
52
+ return { supported: direct || circuit || webRTC, crossRuntime };
53
+ };
54
+ const getBootstrapListSources = (v) => {
55
+ const file = `bootstrap${v ? "-" + encodeURIComponent(v) : ""}.env`;
56
+ return [
57
+ `https://bootstrap.peerbit.org/${file}`,
58
+ `https://raw.githubusercontent.com/dao-xyz/peerbit-bootstrap/master/${file}`,
59
+ ];
60
+ };
61
+ const parseBootstrapAddresses = (value) => {
62
+ const lines = value.split(/\r?\n/);
63
+ if (lines.length > MAX_BOOTSTRAP_LIST_LINES) {
64
+ throw new Error(`Bootstrap list has too many lines (${lines.length} > ${MAX_BOOTSTRAP_LIST_LINES})`);
65
+ }
66
+ const addresses = lines
67
+ .map((line) => line.trim())
68
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
69
+ if (addresses.length === 0) {
70
+ throw new Error("Bootstrap list is empty");
71
+ }
72
+ if (addresses.length > MAX_BOOTSTRAP_ADDRESS_COUNT) {
73
+ throw new Error(`Bootstrap list has too many addresses (${addresses.length} > ${MAX_BOOTSTRAP_ADDRESS_COUNT})`);
74
+ }
75
+ const canonicalAddresses = [];
76
+ let hasCrossRuntimeAddress = false;
77
+ for (const address of addresses) {
78
+ let parsed;
79
+ try {
80
+ parsed = multiaddr(address);
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ const classification = classifyBootstrapAddress(parsed);
86
+ if (!classification.supported) {
87
+ continue;
88
+ }
89
+ hasCrossRuntimeAddress ||= classification.crossRuntime;
90
+ canonicalAddresses.push(parsed.toString());
91
+ }
92
+ if (canonicalAddresses.length === 0) {
93
+ throw new Error("Bootstrap list has no supported dial targets");
94
+ }
95
+ if (!hasCrossRuntimeAddress) {
96
+ throw new Error("Bootstrap list has no browser-safe cross-runtime dial target");
97
+ }
98
+ return [...new Set(canonicalAddresses)];
99
+ };
100
+ const readBootstrapList = async (response) => {
101
+ const declaredLength = response.headers.get("content-length");
102
+ if (declaredLength != null) {
103
+ if (!/^\d+$/.test(declaredLength)) {
104
+ throw new Error(`Invalid bootstrap list Content-Length: ${declaredLength}`);
105
+ }
106
+ const length = Number(declaredLength);
107
+ if (!Number.isSafeInteger(length) || length > MAX_BOOTSTRAP_LIST_BYTES) {
108
+ throw new Error(`Bootstrap list is too large (${declaredLength} > ${MAX_BOOTSTRAP_LIST_BYTES} bytes)`);
109
+ }
110
+ }
111
+ if (!response.body) {
112
+ return "";
113
+ }
114
+ const reader = response.body.getReader();
115
+ const decoder = new TextDecoder("utf-8", { fatal: true });
116
+ let bytesRead = 0;
117
+ let value = "";
118
+ let completed = false;
119
+ try {
120
+ while (true) {
121
+ const chunk = await reader.read();
122
+ if (chunk.done) {
123
+ break;
124
+ }
125
+ bytesRead += chunk.value.byteLength;
126
+ if (bytesRead > MAX_BOOTSTRAP_LIST_BYTES) {
127
+ throw new Error(`Bootstrap list is too large (${bytesRead} > ${MAX_BOOTSTRAP_LIST_BYTES} bytes)`);
128
+ }
129
+ value += decoder.decode(chunk.value, { stream: true });
130
+ }
131
+ value += decoder.decode();
132
+ completed = true;
133
+ return value;
134
+ }
135
+ finally {
136
+ if (!completed) {
137
+ await reader
138
+ .cancel("Bootstrap list read did not complete")
139
+ .catch(() => { });
140
+ }
141
+ reader.releaseLock();
142
+ }
143
+ };
144
+ const abortReason = (signal) => signal.reason ?? new Error("Bootstrap address resolution aborted");
145
+ const fetchBootstrapAddresses = async (source, externalSignal) => {
146
+ const controller = new AbortController();
147
+ const onExternalAbort = () => controller.abort(abortReason(externalSignal));
148
+ if (externalSignal?.aborted) {
149
+ onExternalAbort();
150
+ }
151
+ else {
152
+ externalSignal?.addEventListener("abort", onExternalAbort, { once: true });
153
+ }
154
+ const timeout = setTimeout(() => {
155
+ controller.abort(new Error(`Timed out fetching bootstrap list after ${BOOTSTRAP_LIST_FETCH_TIMEOUT_MS} ms`));
156
+ }, BOOTSTRAP_LIST_FETCH_TIMEOUT_MS);
157
+ let response;
158
+ try {
159
+ response = await fetch(source, { signal: controller.signal });
160
+ if (!response.ok) {
161
+ throw new Error(`Bootstrap list returned HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ""}`);
162
+ }
163
+ return parseBootstrapAddresses(await readBootstrapList(response));
164
+ }
165
+ catch (error) {
166
+ if (response?.body && !response.body.locked) {
167
+ await response.body.cancel(error).catch(() => { });
168
+ }
169
+ if (!controller.signal.aborted) {
170
+ controller.abort(error);
171
+ }
172
+ throw error;
173
+ }
174
+ finally {
175
+ clearTimeout(timeout);
176
+ externalSignal?.removeEventListener("abort", onExternalAbort);
177
+ }
178
+ };
179
+ export const resolveBootstrapAddresses = async (v = "5", options = {}) => {
180
+ const failures = [];
181
+ for (const source of getBootstrapListSources(v)) {
182
+ if (options.signal?.aborted) {
183
+ throw abortReason(options.signal);
184
+ }
185
+ try {
186
+ return await fetchBootstrapAddresses(source, options.signal);
187
+ }
188
+ catch (error) {
189
+ if (options.signal?.aborted) {
190
+ throw abortReason(options.signal);
191
+ }
192
+ failures.push(new Error(`Failed to load bootstrap addresses from ${source}: ${error instanceof Error ? error.message : String(error)}`));
193
+ }
194
+ }
195
+ throw new AggregateError(failures, `Failed to resolve bootstrap addresses for network version ${v || "default"}`);
7
196
  };
8
197
  export const getBootstrapPeerId = (address) => {
9
198
  try {
10
199
  const parsed = typeof address === "string" ? multiaddr(address) : address;
11
- return parsed.getComponents().find((component) => component.name === "p2p")
12
- ?.value;
200
+ const components = parsed.getComponents();
201
+ for (let index = components.length - 1; index >= 0; index--) {
202
+ if (components[index].name === "p2p") {
203
+ return components[index].value;
204
+ }
205
+ }
206
+ return undefined;
13
207
  }
14
208
  catch {
15
209
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAC7C,IAAY,GAAG,EACK,EAAE;IACtB,kCAAkC;IAClC,OAAO,CACN,MAAM,CACL,MAAM,KAAK,CACV,0CAA0C,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAChE,CACD,CAAC,IAAI,EAAE,CACR;SACC,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,OAA2B,EACN,EAAE;IACvB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC;YAC1E,EAAE,KAAK,CAAC;IACV,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC,CAAC"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from "./peer.js";
2
2
  export * from "./bootstrap.js";
3
+ export type { BootstrapRecoveryOptions } from "./bootstrap-recovery.js";
3
4
  export { createLibp2pExtended, type Libp2pExtendServices, type Libp2pExtended, type Libp2pCreateOptions, type Libp2pCreateOptionsWithServices, } from "./libp2p.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACN,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,GACpC,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACN,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,GACpC,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACN,oBAAoB,GAKpB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EACN,oBAAoB,GAKpB,MAAM,aAAa,CAAC"}
@@ -6,6 +6,7 @@ import type { Indices } from "@peerbit/indexer-interface";
6
6
  import { type Address, type ExtractArgs, type OpenOptions, type Program, type ProgramClient, ProgramHandler } from "@peerbit/program";
7
7
  import { FanoutChannel, type FanoutTreeChannelOptions, type FanoutTreeJoinOptions } from "@peerbit/pubsub";
8
8
  import type { RustCoreStream } from "@peerbit/stream";
9
+ import { type BootstrapRecoveryOptions } from "./bootstrap-recovery.js";
9
10
  import { type Libp2pExtended, type PartialLibp2pCreateOptions } from "./libp2p.js";
10
11
  export declare const logger: import("@libp2p/interface").Logger;
11
12
  export type OptionalCreateOptions = {
@@ -124,6 +125,12 @@ export type CreateInstanceOptions = (SimpleLibp2pOptions | Libp2pOptions) & {
124
125
  indexer?: (directory?: string) => Promise<Indices> | Indices;
125
126
  storage?: StorageCreateOptions;
126
127
  network?: NativeNetworkCreateOptions;
128
+ /**
129
+ * Opt-in automatic bootstrap recovery. `true` uses bounded defaults; an
130
+ * options object customizes retry policy or fixed targets. It is disabled by
131
+ * default to avoid unexpected network access from `Peerbit.create()`.
132
+ */
133
+ bootstrapRecovery?: boolean | BootstrapRecoveryOptions;
127
134
  } & OptionalCreateOptions;
128
135
  export type DialReadiness = "connection" | "services" | "services-and-fanout";
129
136
  export type DialOptions = {
@@ -140,6 +147,10 @@ export type BootstrapResult = {
140
147
  connectedPeerIds: string[];
141
148
  failures: BootstrapFailure[];
142
149
  };
150
+ export type BootstrapDialOptions = {
151
+ dialTimeoutMs?: number;
152
+ signal?: AbortSignal;
153
+ };
143
154
  export declare class Peerbit implements ProgramClient {
144
155
  _libp2p: Libp2pExtended;
145
156
  directory?: string;
@@ -147,6 +158,11 @@ export declare class Peerbit implements ProgramClient {
147
158
  private _indexer;
148
159
  private _libp2pExternal?;
149
160
  private _nativeNetwork?;
161
+ private _bootstrapRecoveryOptions?;
162
+ private _bootstrapRecovery?;
163
+ private _bootstrapRecoveryGeneration;
164
+ private _bootstrapRecoveryTransition;
165
+ private _bootstrapRecoveryPaused;
150
166
  /**
151
167
  * Native shared-log defaults advertised to programs opened on this
152
168
  * client; read by `@peerbit/shared-log` (`SharedLogNativeDefaults`).
@@ -170,9 +186,16 @@ export declare class Peerbit implements ProgramClient {
170
186
  */
171
187
  dial(address: string | Multiaddr | Multiaddr[] | ProgramClient, options?: DialOptions): Promise<boolean>;
172
188
  hangUp(address: PeerId | PublicSignKey | string | Multiaddr): Promise<void>;
189
+ get bootstrapRecoveryEnabled(): boolean;
190
+ /** Enable automatic recovery and schedule an immediate attempt if disconnected. */
191
+ enableBootstrapRecovery(options?: BootstrapRecoveryOptions): void;
192
+ /** Disable recovery, remove environment listeners, and abort its active dial. */
193
+ disableBootstrapRecovery(): void;
194
+ private transitionBootstrapRecovery;
195
+ private startBootstrapRecovery;
173
196
  start(): Promise<void>;
174
197
  stop(): Promise<void>;
175
- bootstrap(addresses?: string[] | Multiaddr[]): Promise<BootstrapResult>;
198
+ bootstrap(addresses?: Array<string | Multiaddr>, options?: BootstrapDialOptions): Promise<BootstrapResult>;
176
199
  /**
177
200
  * Default behaviour of a store is only to accept heads that are forks (new roots) with some probability
178
201
  * and to replicate heads (and updates) which is requested by another peer