@peerbit/stream 4.6.0-bbf27fa → 4.6.0-cb91e7b

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,410 @@
1
+ /**
2
+ * Lightweight discrete-event simulator for @peerbit/stream-style routing.
3
+ *
4
+ * This is intentionally NOT libp2p-backed. It is meant for 1k–10k+ node
5
+ * experiments (topology / convergence / message overhead) that would be
6
+ * infeasible with real libp2p peers.
7
+ *
8
+ * Run:
9
+ * node --loader ts-node/esm ./packages/transport/stream/benchmark/topology-sim.ts --nodes 2000 --degree 4 --messages 200 --targets 10 --redundancy 2 --seed 1
10
+ */
11
+ import { computeSeekAckRouteUpdate, selectSeekRelayTargets, shouldAcknowledgeDataMessage, shouldIgnoreDataMessage, } from "../src/core/seek-routing.js";
12
+ class MinHeap {
13
+ compare;
14
+ heap = [];
15
+ constructor(compare) {
16
+ this.compare = compare;
17
+ }
18
+ get size() {
19
+ return this.heap.length;
20
+ }
21
+ push(item) {
22
+ this.heap.push(item);
23
+ this.bubbleUp(this.heap.length - 1);
24
+ }
25
+ pop() {
26
+ if (this.heap.length === 0)
27
+ return undefined;
28
+ const root = this.heap[0];
29
+ const last = this.heap.pop();
30
+ if (this.heap.length > 0) {
31
+ this.heap[0] = last;
32
+ this.bubbleDown(0);
33
+ }
34
+ return root;
35
+ }
36
+ bubbleUp(index) {
37
+ while (index > 0) {
38
+ const parentIndex = (index - 1) >> 1;
39
+ if (this.compare(this.heap[index], this.heap[parentIndex]) >= 0)
40
+ break;
41
+ [this.heap[index], this.heap[parentIndex]] = [
42
+ this.heap[parentIndex],
43
+ this.heap[index],
44
+ ];
45
+ index = parentIndex;
46
+ }
47
+ }
48
+ bubbleDown(index) {
49
+ const length = this.heap.length;
50
+ for (;;) {
51
+ const left = index * 2 + 1;
52
+ const right = left + 1;
53
+ let smallest = index;
54
+ if (left < length &&
55
+ this.compare(this.heap[left], this.heap[smallest]) < 0) {
56
+ smallest = left;
57
+ }
58
+ if (right < length &&
59
+ this.compare(this.heap[right], this.heap[smallest]) < 0) {
60
+ smallest = right;
61
+ }
62
+ if (smallest === index)
63
+ break;
64
+ [this.heap[index], this.heap[smallest]] = [
65
+ this.heap[smallest],
66
+ this.heap[index],
67
+ ];
68
+ index = smallest;
69
+ }
70
+ }
71
+ }
72
+ const mulberry32 = (seed) => {
73
+ let t = seed >>> 0;
74
+ return () => {
75
+ t += 0x6d2b79f5;
76
+ let x = t;
77
+ x = Math.imul(x ^ (x >>> 15), x | 1);
78
+ x ^= x + Math.imul(x ^ (x >>> 7), x | 61);
79
+ return ((x ^ (x >>> 14)) >>> 0) / 4294967296;
80
+ };
81
+ };
82
+ const int = (rng, maxExclusive) => Math.floor(rng() * maxExclusive);
83
+ const intBetween = (rng, minInclusive, maxInclusive) => minInclusive + int(rng, maxInclusive - minInclusive + 1);
84
+ const pickDistinct = (rng, n, k, exclude) => {
85
+ const out = new Set();
86
+ while (out.size < k) {
87
+ const candidate = int(rng, n);
88
+ if (candidate === exclude)
89
+ continue;
90
+ out.add(candidate);
91
+ }
92
+ return [...out];
93
+ };
94
+ const buildRandomGraph = (n, targetDegree, rng) => {
95
+ if (n <= 0)
96
+ throw new Error("nodes must be > 0");
97
+ if (targetDegree < 0)
98
+ throw new Error("degree must be >= 0");
99
+ if (targetDegree >= n) {
100
+ throw new Error("degree must be < nodes for a simple graph");
101
+ }
102
+ const adj = Array.from({ length: n }, () => new Set());
103
+ const degree = new Uint16Array(n);
104
+ const connect = (a, b) => {
105
+ if (a === b)
106
+ return false;
107
+ if (adj[a].has(b))
108
+ return false;
109
+ if (degree[a] >= targetDegree || degree[b] >= targetDegree)
110
+ return false;
111
+ adj[a].add(b);
112
+ adj[b].add(a);
113
+ degree[a] += 1;
114
+ degree[b] += 1;
115
+ return true;
116
+ };
117
+ // Seed connectivity so we don't start disconnected.
118
+ if (targetDegree >= 2 && n >= 3) {
119
+ for (let i = 0; i < n; i++)
120
+ connect(i, (i + 1) % n);
121
+ }
122
+ else if (targetDegree >= 1 && n >= 2) {
123
+ for (let i = 0; i < n - 1; i++)
124
+ connect(i, i + 1);
125
+ }
126
+ const available = [];
127
+ const pos = new Int32Array(n).fill(-1);
128
+ for (let i = 0; i < n; i++) {
129
+ if (degree[i] < targetDegree) {
130
+ pos[i] = available.length;
131
+ available.push(i);
132
+ }
133
+ }
134
+ const removeAvailable = (id) => {
135
+ const p = pos[id];
136
+ if (p < 0)
137
+ return;
138
+ const last = available.pop();
139
+ if (last !== id) {
140
+ available[p] = last;
141
+ pos[last] = p;
142
+ }
143
+ pos[id] = -1;
144
+ };
145
+ const maxAttempts = n * Math.max(1, targetDegree) * 200;
146
+ let attempts = 0;
147
+ while (available.length > 1 && attempts < maxAttempts) {
148
+ attempts++;
149
+ const a = available[int(rng, available.length)];
150
+ const b = available[int(rng, available.length)];
151
+ if (a === b)
152
+ continue;
153
+ if (!connect(a, b))
154
+ continue;
155
+ if (degree[a] >= targetDegree)
156
+ removeAvailable(a);
157
+ if (degree[b] >= targetDegree)
158
+ removeAvailable(b);
159
+ }
160
+ return adj.map((s) => [...s]);
161
+ };
162
+ const addRoute = (routesByFrom, from, target, via, distance, maxPerTarget = 8) => {
163
+ let byTarget = routesByFrom.get(from);
164
+ if (!byTarget) {
165
+ byTarget = new Map();
166
+ routesByFrom.set(from, byTarget);
167
+ }
168
+ let list = byTarget.get(target);
169
+ if (!list) {
170
+ list = [];
171
+ byTarget.set(target, list);
172
+ }
173
+ const existing = list.find((x) => x.via === via);
174
+ if (existing) {
175
+ existing.distance = Math.min(existing.distance, distance);
176
+ }
177
+ else {
178
+ list.push({ via, distance });
179
+ }
180
+ list.sort((a, b) => a.distance - b.distance);
181
+ if (list.length > maxPerTarget) {
182
+ list.length = maxPerTarget;
183
+ }
184
+ };
185
+ const traceHas = (trace, node) => {
186
+ let current = trace;
187
+ while (current) {
188
+ if (current.node === node)
189
+ return true;
190
+ current = current.prev;
191
+ }
192
+ return false;
193
+ };
194
+ const simulate = (params) => {
195
+ const rng = mulberry32(params.seed);
196
+ const graph = buildRandomGraph(params.nodes, params.degree, rng);
197
+ const warn = graph.some((nbs) => nbs.length < Math.min(params.degree, params.nodes - 1)) &&
198
+ "graph generation hit degree constraints (some nodes < --degree)";
199
+ const routes = Array.from({ length: params.nodes }, () => new Map());
200
+ // Seed direct neighbor routes: from=self -> target=neighbor via neighbor at distance=-1.
201
+ for (let u = 0; u < params.nodes; u++) {
202
+ for (const v of graph[u]) {
203
+ addRoute(routes[u], u, v, v, -1);
204
+ }
205
+ }
206
+ let dataTx = 0;
207
+ let ackTx = 0;
208
+ let targetDeliveries = 0;
209
+ let targetExpected = 0;
210
+ let firstHopSum = 0;
211
+ let firstHopCount = 0;
212
+ const seen = new Uint8Array(params.nodes);
213
+ const deliveredToTarget = new Uint8Array(params.nodes);
214
+ const heap = new MinHeap((a, b) => a.t - b.t);
215
+ const scheduleData = (now, from, to, signer, hop) => {
216
+ if (params.dropRate > 0 && rng() < params.dropRate)
217
+ return;
218
+ const delay = intBetween(rng, params.minDelay, params.maxDelay);
219
+ dataTx++;
220
+ heap.push({ t: now + delay, kind: "data", from, to, signer, hop });
221
+ };
222
+ const scheduleAck = (now, from, to, trace, target, seenCounter) => {
223
+ if (params.dropRate > 0 && rng() < params.dropRate)
224
+ return;
225
+ const delay = intBetween(rng, params.minDelay, params.maxDelay);
226
+ ackTx++;
227
+ heap.push({
228
+ t: now + delay,
229
+ kind: "ack",
230
+ from,
231
+ to,
232
+ trace,
233
+ target,
234
+ seenCounter,
235
+ });
236
+ };
237
+ for (let msg = 0; msg < params.messages; msg++) {
238
+ seen.fill(0);
239
+ deliveredToTarget.fill(0);
240
+ while (heap.pop() != null) {
241
+ // drain any leftover events (shouldn't happen since we drain per message)
242
+ }
243
+ const source = int(rng, params.nodes);
244
+ const targets = pickDistinct(rng, params.nodes, Math.min(params.targetsPerMessage, params.nodes - 1), source);
245
+ const targetsSet = new Set(targets);
246
+ targetExpected += targets.length;
247
+ const sourceSigner = { node: source };
248
+ const t0 = 0;
249
+ for (const nb of graph[source]) {
250
+ scheduleData(t0, source, nb, sourceSigner, 1);
251
+ }
252
+ while (heap.size > 0) {
253
+ const ev = heap.pop();
254
+ if (ev.kind === "data") {
255
+ const to = ev.to;
256
+ const seenBefore = seen[to];
257
+ const ignored = shouldIgnoreDataMessage({
258
+ signedBySelf: traceHas(ev.signer, to),
259
+ seenBefore,
260
+ mode: { kind: "seek", redundancy: params.redundancy },
261
+ });
262
+ if (ignored) {
263
+ continue;
264
+ }
265
+ seen[to] = Math.min(255, seenBefore + 1);
266
+ if (shouldAcknowledgeDataMessage({
267
+ isRecipient: targetsSet.has(to),
268
+ seenBefore,
269
+ redundancy: params.redundancy,
270
+ })) {
271
+ if (deliveredToTarget[to] === 0) {
272
+ deliveredToTarget[to] = 1;
273
+ targetDeliveries++;
274
+ firstHopSum += ev.hop;
275
+ firstHopCount++;
276
+ }
277
+ // ACK travels backwards along the signer trace.
278
+ scheduleAck(ev.t, to, ev.signer.node, ev.signer, to, seenBefore);
279
+ }
280
+ // Redundant forwarding: forward until local seenBefore reaches redundancy.
281
+ const newSigner = { node: to, prev: ev.signer };
282
+ const relayTo = selectSeekRelayTargets({
283
+ candidates: graph[to],
284
+ getCandidateId: (id) => id,
285
+ inboundId: ev.from,
286
+ hasSigned: (id) => traceHas(ev.signer, id),
287
+ });
288
+ for (const nb of relayTo) {
289
+ scheduleData(ev.t, to, nb, newSigner, ev.hop + 1);
290
+ }
291
+ }
292
+ else {
293
+ // ACK processing at `ev.to` (a signer on the trace).
294
+ const current = ev.to;
295
+ if (ev.trace.node !== current) {
296
+ // Should not happen; indicates a bug in the simulator.
297
+ continue;
298
+ }
299
+ const upstream = ev.trace.prev?.node;
300
+ const routeUpdate = computeSeekAckRouteUpdate({
301
+ current,
302
+ upstream,
303
+ downstream: ev.from,
304
+ target: ev.target,
305
+ distance: ev.seenCounter,
306
+ });
307
+ addRoute(routes[current], routeUpdate.from, routeUpdate.target, routeUpdate.neighbour, routeUpdate.distance);
308
+ if (upstream != null) {
309
+ scheduleAck(ev.t, current, upstream, ev.trace.prev, ev.target, ev.seenCounter);
310
+ }
311
+ }
312
+ }
313
+ }
314
+ let totalRouteEntries = 0;
315
+ let totalRouteTargets = 0;
316
+ for (let i = 0; i < params.nodes; i++) {
317
+ for (const [_from, byTarget] of routes[i]) {
318
+ totalRouteTargets += byTarget.size;
319
+ for (const [_target, list] of byTarget) {
320
+ totalRouteEntries += list.length;
321
+ }
322
+ }
323
+ }
324
+ return {
325
+ dataTx,
326
+ ackTx,
327
+ targetDeliveries,
328
+ targetExpected,
329
+ firstHopSum,
330
+ firstHopCount,
331
+ avgRouteEntriesPerNode: totalRouteEntries / params.nodes,
332
+ avgRouteTargetsPerNode: totalRouteTargets / params.nodes,
333
+ warn: warn || undefined,
334
+ };
335
+ };
336
+ const parseArgs = (argv) => {
337
+ const get = (key) => {
338
+ const idx = argv.indexOf(key);
339
+ if (idx === -1)
340
+ return undefined;
341
+ return argv[idx + 1];
342
+ };
343
+ const has = (key) => argv.includes(key);
344
+ if (has("--help") || has("-h")) {
345
+ console.log([
346
+ "topology-sim.ts",
347
+ "",
348
+ "Args:",
349
+ " --nodes N number of nodes (default: 2000)",
350
+ " --degree K target undirected degree (default: 4)",
351
+ " --messages M number of seek waves (default: 200)",
352
+ " --targets T targets per message (default: 10)",
353
+ " --redundancy R seek redundancy (default: 2)",
354
+ " --seed S RNG seed (default: 1)",
355
+ " --drop P per-edge drop rate [0..1] (default: 0)",
356
+ " --minDelay MS min per-edge delay (default: 1)",
357
+ " --maxDelay MS max per-edge delay (default: 5)",
358
+ "",
359
+ "Example:",
360
+ " node --loader ts-node/esm ./packages/transport/stream/benchmark/topology-sim.ts --nodes 5000 --degree 6 --messages 500 --targets 20 --redundancy 2 --drop 0.01 --seed 42",
361
+ ].join("\n"));
362
+ process.exit(0);
363
+ }
364
+ const nodes = Number(get("--nodes") ?? 2000);
365
+ const degree = Number(get("--degree") ?? 4);
366
+ const messages = Number(get("--messages") ?? 200);
367
+ const targetsPerMessage = Number(get("--targets") ?? 10);
368
+ const redundancy = Number(get("--redundancy") ?? 2);
369
+ const seed = Number(get("--seed") ?? 1);
370
+ const dropRate = Number(get("--drop") ?? 0);
371
+ const minDelay = Number(get("--minDelay") ?? 1);
372
+ const maxDelay = Number(get("--maxDelay") ?? 5);
373
+ return {
374
+ nodes,
375
+ degree,
376
+ messages,
377
+ targetsPerMessage,
378
+ redundancy,
379
+ seed,
380
+ dropRate,
381
+ minDelay,
382
+ maxDelay,
383
+ };
384
+ };
385
+ const main = async () => {
386
+ const params = parseArgs(process.argv.slice(2));
387
+ const started = Date.now();
388
+ const result = simulate(params);
389
+ const elapsedMs = Date.now() - started;
390
+ const deliveryPct = result.targetExpected === 0
391
+ ? 100
392
+ : (result.targetDeliveries / result.targetExpected) * 100;
393
+ const avgFirstHop = result.firstHopCount === 0 ? 0 : result.firstHopSum / result.firstHopCount;
394
+ const lines = [];
395
+ lines.push("stream topology-sim results");
396
+ lines.push(`- nodes: ${params.nodes}, degree: ${params.degree}`);
397
+ lines.push(`- messages: ${params.messages}, targets/message: ${params.targetsPerMessage}, redundancy: ${params.redundancy}`);
398
+ lines.push(`- drop: ${params.dropRate}, delay: ${params.minDelay}..${params.maxDelay} (sim units)`);
399
+ lines.push(`- tx: data=${result.dataTx}, ack=${result.ackTx}`);
400
+ lines.push(`- delivery: ${result.targetDeliveries}/${result.targetExpected} (${deliveryPct.toFixed(2)}%)`);
401
+ lines.push(`- avg first-delivery hop: ${avgFirstHop.toFixed(2)}`);
402
+ lines.push(`- avg route targets/node: ${result.avgRouteTargetsPerNode.toFixed(2)}, entries/node: ${result.avgRouteEntriesPerNode.toFixed(2)}`);
403
+ if (result.warn) {
404
+ lines.push(`- warn: ${result.warn}`);
405
+ }
406
+ lines.push(`- wall time: ${elapsedMs}ms`);
407
+ console.log(lines.join("\n"));
408
+ };
409
+ await main();
410
+ //# sourceMappingURL=topology-sim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology-sim.js","sourceRoot":"","sources":["../../benchmark/topology-sim.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { tcp } from "@libp2p/tcp";
2
2
  import { TestSession } from "@peerbit/libp2p-test-utils";
3
- import { SeekDelivery } from "@peerbit/stream-interface";
3
+ import { AcknowledgeDelivery } from "@peerbit/stream-interface";
4
4
  import { waitForResolved } from "@peerbit/time";
5
5
  import B from "benchmark";
6
6
  import crypto from "crypto";
@@ -46,7 +46,7 @@ await waitForNeighbour(stream(0), stream(1));
46
46
  await waitForNeighbour(stream(1), stream(2));
47
47
  await waitForNeighbour(stream(2), stream(3));
48
48
  stream(0).publish(new Uint8Array([123]), {
49
- mode: new SeekDelivery({
49
+ mode: new AcknowledgeDelivery({
50
50
  redundancy: 1,
51
51
  to: [stream(session.peers.length - 1).publicKey],
52
52
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../benchmark/transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../benchmark/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type SeekRoutingMode = {
2
+ kind: "seek";
3
+ redundancy: number;
4
+ } | {
5
+ kind: "non-seek";
6
+ };
7
+ export type ShouldIgnoreDataMessageArgs = {
8
+ signedBySelf: boolean;
9
+ seenBefore: number;
10
+ mode: SeekRoutingMode;
11
+ };
12
+ export declare const shouldIgnoreDataMessage: (args: ShouldIgnoreDataMessageArgs) => boolean;
13
+ export type SelectSeekRelayTargetsArgs<T, Id extends string | number> = {
14
+ candidates: Iterable<T>;
15
+ getCandidateId: (candidate: T) => Id;
16
+ inboundId: Id;
17
+ hasSigned: (candidateId: Id) => boolean;
18
+ };
19
+ export declare const selectSeekRelayTargets: <T, Id extends string | number>(args: SelectSeekRelayTargetsArgs<T, Id>) => T[];
20
+ export type ShouldAcknowledgeDataMessageArgs = {
21
+ isRecipient: boolean;
22
+ seenBefore: number;
23
+ redundancy: number;
24
+ };
25
+ export declare const shouldAcknowledgeDataMessage: (args: ShouldAcknowledgeDataMessageArgs) => boolean;
26
+ export type SeekAckRouteUpdate<Id extends string | number> = {
27
+ from: Id;
28
+ neighbour: Id;
29
+ target: Id;
30
+ distance: number;
31
+ };
32
+ export declare const computeSeekAckRouteUpdate: <Id extends string | number>(args: {
33
+ current: Id;
34
+ upstream?: Id;
35
+ downstream: Id;
36
+ target: Id;
37
+ distance: number;
38
+ }) => SeekAckRouteUpdate<Id>;
39
+ //# sourceMappingURL=seek-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seek-routing.d.ts","sourceRoot":"","sources":["../../../src/core/seek-routing.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAExB,MAAM,MAAM,2BAA2B,GAAG;IACzC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,MAAM,2BAA2B,YAUxE,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI;IACvE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,cAAc,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;IACrC,SAAS,EAAE,EAAE,CAAC;IACd,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,OAAO,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EACnE,MAAM,0BAA0B,CAAC,CAAC,EAAE,EAAE,CAAC,KACrC,CAAC,EASH,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACxC,MAAM,gCAAgC,YAGtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI;IAC5D,IAAI,EAAE,EAAE,CAAC;IACT,SAAS,EAAE,EAAE,CAAC;IACd,MAAM,EAAE,EAAE,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,MAAM;IAC3E,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,CAAC,EAAE,EAAE,CAAC;IACd,UAAU,EAAE,EAAE,CAAC;IACf,MAAM,EAAE,EAAE,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CACjB,KAAG,kBAAkB,CAAC,EAAE,CAOxB,CAAC"}
@@ -0,0 +1,33 @@
1
+ export const shouldIgnoreDataMessage = (args) => {
2
+ if (args.signedBySelf) {
3
+ return true;
4
+ }
5
+ if (args.mode.kind === "seek") {
6
+ return args.seenBefore >= args.mode.redundancy;
7
+ }
8
+ return args.seenBefore > 0;
9
+ };
10
+ export const selectSeekRelayTargets = (args) => {
11
+ const out = [];
12
+ for (const candidate of args.candidates) {
13
+ const candidateId = args.getCandidateId(candidate);
14
+ if (candidateId === args.inboundId)
15
+ continue;
16
+ if (args.hasSigned(candidateId))
17
+ continue;
18
+ out.push(candidate);
19
+ }
20
+ return out;
21
+ };
22
+ export const shouldAcknowledgeDataMessage = (args) => {
23
+ return args.isRecipient && args.seenBefore < args.redundancy;
24
+ };
25
+ export const computeSeekAckRouteUpdate = (args) => {
26
+ return {
27
+ from: args.upstream ?? args.current,
28
+ neighbour: args.downstream,
29
+ target: args.target,
30
+ distance: args.distance,
31
+ };
32
+ };
33
+ //# sourceMappingURL=seek-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seek-routing.js","sourceRoot":"","sources":["../../../src/core/seek-routing.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAiC,EAAE,EAAE;IAC5E,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AAC5B,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACrC,IAAuC,EACjC,EAAE;IACR,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,WAAW,KAAK,IAAI,CAAC,SAAS;YAAE,SAAS;QAC7C,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,SAAS;QAC1C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC3C,IAAsC,EACrC,EAAE;IACH,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AAC9D,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAA6B,IAMrE,EAA0B,EAAE;IAC5B,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;QACnC,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACvB,CAAC;AACH,CAAC,CAAC"}
@@ -5,7 +5,7 @@ import { type Multiaddr } from "@multiformats/multiaddr";
5
5
  import { Cache } from "@peerbit/cache";
6
6
  import { PublicSignKey } from "@peerbit/crypto";
7
7
  import type { SignatureWithKey } from "@peerbit/crypto";
8
- import { ACK, AcknowledgeDelivery, AnyWhere, DataMessage, Goodbye, Message, MultiAddrinfo, SeekDelivery, SilentDelivery } from "@peerbit/stream-interface";
8
+ import { ACK, AcknowledgeAnyWhere, AcknowledgeDelivery, AnyWhere, DataMessage, Goodbye, Message, MultiAddrinfo, SilentDelivery } from "@peerbit/stream-interface";
9
9
  import type { IdOptions, PeerRefs, PriorityOptions, PublicKeyFromHashResolver, StreamEvents, WaitForAnyOpts, WaitForPeer, WaitForPresentOpts, WithExtraSigners, WithMode, WithTo } from "@peerbit/stream-interface";
10
10
  import { pipe } from "it-pipe";
11
11
  import { type Pushable } from "it-pushable";
@@ -66,6 +66,8 @@ export declare class PeerStreams extends TypedEventEmitter<PeerStreamEvents> {
66
66
  private outboundStreams;
67
67
  get rawOutboundStreams(): Stream[];
68
68
  _getActiveOutboundPushable(): PushableLanes<Uint8Array> | undefined;
69
+ getOutboundQueuedBytes(): number;
70
+ getOutboundQueuedBytesByLane(): number[];
69
71
  _getOutboundCount(): number;
70
72
  _getInboundCount(): number;
71
73
  _debugInboundStats(): {
@@ -153,9 +155,27 @@ export type DirectStreamOptions = {
153
155
  maxOutboundStreams?: number;
154
156
  inboundIdleTimeout?: number;
155
157
  connectionManager?: ConnectionManagerArguments;
156
- routeSeekInterval?: number;
157
158
  seekTimeout?: number;
158
159
  routeMaxRetentionPeriod?: number;
160
+ /**
161
+ * Best-effort bounds for the per-process route cache. These exist to prevent
162
+ * unbounded memory growth in large networks/simulations.
163
+ */
164
+ routeCacheMaxFromEntries?: number;
165
+ routeCacheMaxTargetsPerFrom?: number;
166
+ routeCacheMaxRelaysPerTarget?: number;
167
+ /**
168
+ * Share node-level routing/session state across DirectStream instances created
169
+ * from the same libp2p private key.
170
+ *
171
+ * This reduces duplicated topology knowledge when multiple protocols run on
172
+ * the same node (e.g. pubsub + fanout overlays).
173
+ *
174
+ * Defaults to `true`.
175
+ */
176
+ sharedRouting?: boolean;
177
+ seenCacheMax?: number;
178
+ seenCacheTtlMs?: number;
159
179
  };
160
180
  type ConnectionManagerLike = {
161
181
  getConnections(peerId?: PeerId): Connection[];
@@ -206,6 +226,8 @@ export declare abstract class DirectStream<Events extends {
206
226
  multicodecs: string[];
207
227
  seenCache: Cache<number>;
208
228
  private _registrarTopologyIds;
229
+ private _peerConnectListener?;
230
+ private _peerDisconnectListener?;
209
231
  private readonly maxInboundStreams?;
210
232
  private readonly maxOutboundStreams?;
211
233
  connectionManagerOptions: ConnectionManagerOptions;
@@ -213,19 +235,28 @@ export declare abstract class DirectStream<Events extends {
213
235
  private healthChecks;
214
236
  private pruneConnectionsTimeout;
215
237
  private prunedConnectionsCache?;
238
+ private pruneToLimitsInFlight?;
239
+ private _startInFlight?;
216
240
  private routeMaxRetentionPeriod;
241
+ private routeCacheMaxFromEntries?;
242
+ private routeCacheMaxTargetsPerFrom?;
243
+ private routeCacheMaxRelaysPerTarget?;
244
+ private readonly sharedRouting;
245
+ private sharedRoutingKey?;
246
+ private sharedRoutingState?;
217
247
  outboundInflightQueue: Pushable<{
218
248
  connection: Connection;
219
249
  peerId: PeerId;
220
250
  }>;
221
- routeSeekInterval: number;
222
251
  seekTimeout: number;
223
252
  closeController: AbortController;
224
253
  session: number;
225
254
  _outboundPump: ReturnType<typeof pipe> | undefined;
226
255
  private _ackCallbacks;
227
256
  constructor(components: DirectStreamComponents, multicodecs: string[], options?: DirectStreamOptions);
257
+ private pruneConnectionsToLimits;
228
258
  start(): Promise<void>;
259
+ private _startImpl;
229
260
  /**
230
261
  * Unregister the pubsub protocol and the streams with other peers will be closed.
231
262
  */
@@ -285,13 +316,14 @@ export declare abstract class DirectStream<Events extends {
285
316
  private checkIsAlive;
286
317
  createMessage(data: Uint8Array | Uint8ArrayList | undefined, options: (WithTo | WithMode) & PriorityOptions & IdOptions & {
287
318
  skipRecipientValidation?: boolean;
288
- } & WithExtraSigners): Promise<DataMessage<SilentDelivery | AcknowledgeDelivery | SeekDelivery | AnyWhere>>;
319
+ } & WithExtraSigners): Promise<DataMessage<SilentDelivery | AcknowledgeDelivery | AcknowledgeAnyWhere | AnyWhere>>;
289
320
  /**
290
321
  * Publishes messages to all peers
291
322
  */
292
323
  publish(data: Uint8Array | Uint8ArrayList | undefined, options?: PublishOptions): Promise<Uint8Array | undefined>;
293
324
  relayMessage(from: PublicSignKey, message: Message, to?: PeerStreams[] | Map<string, PeerStreams>): Promise<void>;
294
325
  private clearHealthcheckTimer;
326
+ private formatDeliveryDebugState;
295
327
  private createDeliveryPromise;
296
328
  publishMessage(from: PublicSignKey, message: Message, to?: PeerStreams[] | Map<string, PeerStreams>, relayed?: boolean, signal?: AbortSignal): Promise<void>;
297
329
  maybeConnectDirectly(toHash: string, origin: MultiAddrinfo): Promise<void>;