@peerbit/test-utils 2.3.18 → 2.3.19-000e3f1
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/dist/benchmark/fanout-peerbit-sim.d.ts +11 -0
- package/dist/benchmark/fanout-peerbit-sim.d.ts.map +1 -0
- package/dist/benchmark/fanout-peerbit-sim.js +745 -0
- package/dist/benchmark/fanout-peerbit-sim.js.map +1 -0
- package/dist/benchmark/index.d.ts +5 -0
- package/dist/benchmark/index.d.ts.map +1 -0
- package/dist/benchmark/index.js +42 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/src/inmemory-libp2p.d.ts +2 -0
- package/dist/src/inmemory-libp2p.d.ts.map +1 -0
- package/dist/src/inmemory-libp2p.js +2 -0
- package/dist/src/inmemory-libp2p.js.map +1 -0
- package/dist/src/session.d.ts +68 -2
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/session.js +497 -3
- package/dist/src/session.js.map +1 -1
- package/package.json +23 -10
- package/src/inmemory-libp2p.ts +1 -0
- package/src/session.ts +653 -11
package/dist/src/session.js
CHANGED
|
@@ -1,33 +1,404 @@
|
|
|
1
1
|
import { yamux } from "@chainsafe/libp2p-yamux";
|
|
2
2
|
import { DirectBlock } from "@peerbit/blocks";
|
|
3
|
+
import { createStore } from "@peerbit/any-store";
|
|
3
4
|
import { keychain } from "@peerbit/keychain";
|
|
5
|
+
import { DefaultCryptoKeychain } from "@peerbit/keychain";
|
|
6
|
+
import { PreHash, SignatureWithKey } from "@peerbit/crypto";
|
|
4
7
|
import { TestSession as SSession, listenFast, transportsFast, } from "@peerbit/libp2p-test-utils";
|
|
5
8
|
import {} from "@peerbit/program";
|
|
6
|
-
import {
|
|
9
|
+
import { FanoutTree, TopicControlPlane, TopicRootControlPlane } from "@peerbit/pubsub";
|
|
7
10
|
import { waitForNeighbour as waitForPeersStreams, } from "@peerbit/stream";
|
|
8
11
|
import {} from "libp2p";
|
|
9
12
|
import path from "path";
|
|
10
13
|
import {} from "peerbit";
|
|
11
14
|
import { Peerbit } from "peerbit";
|
|
15
|
+
import { InMemoryNetwork, InMemorySession } from "./inmemory-libp2p.js";
|
|
16
|
+
class NoopIndices {
|
|
17
|
+
store = createStore();
|
|
18
|
+
async init(_properties) {
|
|
19
|
+
throw new Error("NoopIndices: indexing disabled for this session (pass `indexer` to enable).");
|
|
20
|
+
}
|
|
21
|
+
async scope(_name) {
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
async start() {
|
|
25
|
+
await this.store.open();
|
|
26
|
+
}
|
|
27
|
+
async stop() {
|
|
28
|
+
await this.store.close();
|
|
29
|
+
}
|
|
30
|
+
async drop() {
|
|
31
|
+
await this.store.clear();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
class SimTopicControlPlane extends TopicControlPlane {
|
|
35
|
+
constructor(c, opts, mockCrypto = true) {
|
|
36
|
+
super(c, opts);
|
|
37
|
+
if (mockCrypto) {
|
|
38
|
+
this.sign = async () => new SignatureWithKey({
|
|
39
|
+
signature: new Uint8Array([0]),
|
|
40
|
+
publicKey: this.publicKey,
|
|
41
|
+
prehash: PreHash.NONE,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async verifyAndProcess(message) {
|
|
46
|
+
const from = message.header.signatures.publicKeys[0];
|
|
47
|
+
if (!this.peers.has(from.hashcode())) {
|
|
48
|
+
this.updateSession(from, Number(message.header.session));
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
class SimFanoutTree extends FanoutTree {
|
|
54
|
+
constructor(c, opts, mockCrypto = true) {
|
|
55
|
+
super(c, opts);
|
|
56
|
+
if (mockCrypto) {
|
|
57
|
+
this.sign = async () => new SignatureWithKey({
|
|
58
|
+
signature: new Uint8Array([0]),
|
|
59
|
+
publicKey: this.publicKey,
|
|
60
|
+
prehash: PreHash.NONE,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async verifyAndProcess(message) {
|
|
65
|
+
const from = message.header.signatures.publicKeys[0];
|
|
66
|
+
if (!this.peers.has(from.hashcode())) {
|
|
67
|
+
this.updateSession(from, Number(message.header.session));
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
class SimDirectBlock extends DirectBlock {
|
|
73
|
+
constructor(c, opts, mockCrypto = true) {
|
|
74
|
+
super(c, opts);
|
|
75
|
+
if (mockCrypto) {
|
|
76
|
+
this.sign = async () => new SignatureWithKey({
|
|
77
|
+
signature: new Uint8Array([0]),
|
|
78
|
+
publicKey: this.publicKey,
|
|
79
|
+
prehash: PreHash.NONE,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async verifyAndProcess(message) {
|
|
84
|
+
const from = message.header.signatures.publicKeys[0];
|
|
85
|
+
if (!this.peers.has(from.hashcode())) {
|
|
86
|
+
this.updateSession(from, Number(message.header.session));
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const mulberry32 = (seed) => {
|
|
92
|
+
let t = seed >>> 0;
|
|
93
|
+
return () => {
|
|
94
|
+
t += 0x6d2b79f5;
|
|
95
|
+
let x = t;
|
|
96
|
+
x = Math.imul(x ^ (x >>> 15), x | 1);
|
|
97
|
+
x ^= x + Math.imul(x ^ (x >>> 7), x | 61);
|
|
98
|
+
return ((x ^ (x >>> 14)) >>> 0) / 4294967296;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
const parseSimPeerIndex = (peerId) => {
|
|
102
|
+
const s = String(peerId?.toString?.() ?? "");
|
|
103
|
+
const m = s.match(/sim-(\d+)/);
|
|
104
|
+
if (!m)
|
|
105
|
+
return 0;
|
|
106
|
+
const n = Number(m[1]);
|
|
107
|
+
return Number.isFinite(n) ? Math.max(0, Math.floor(n)) : 0;
|
|
108
|
+
};
|
|
109
|
+
const int = (rng, maxExclusive) => Math.floor(rng() * maxExclusive);
|
|
110
|
+
const buildRandomGraph = (n, targetDegree, rng) => {
|
|
111
|
+
if (n <= 0)
|
|
112
|
+
throw new Error("nodes must be > 0");
|
|
113
|
+
if (targetDegree < 0)
|
|
114
|
+
throw new Error("degree must be >= 0");
|
|
115
|
+
if (targetDegree >= n) {
|
|
116
|
+
throw new Error("degree must be < nodes for a simple graph");
|
|
117
|
+
}
|
|
118
|
+
const adj = Array.from({ length: n }, () => new Set());
|
|
119
|
+
const degree = new Uint16Array(n);
|
|
120
|
+
const connect = (a, b) => {
|
|
121
|
+
if (a === b)
|
|
122
|
+
return false;
|
|
123
|
+
if (adj[a].has(b))
|
|
124
|
+
return false;
|
|
125
|
+
if (degree[a] >= targetDegree || degree[b] >= targetDegree)
|
|
126
|
+
return false;
|
|
127
|
+
adj[a].add(b);
|
|
128
|
+
adj[b].add(a);
|
|
129
|
+
degree[a] += 1;
|
|
130
|
+
degree[b] += 1;
|
|
131
|
+
return true;
|
|
132
|
+
};
|
|
133
|
+
// Seed connectivity (line or ring).
|
|
134
|
+
if (targetDegree >= 2 && n >= 3) {
|
|
135
|
+
for (let i = 0; i < n; i++)
|
|
136
|
+
connect(i, (i + 1) % n);
|
|
137
|
+
}
|
|
138
|
+
else if (targetDegree >= 1 && n >= 2) {
|
|
139
|
+
for (let i = 0; i < n - 1; i++)
|
|
140
|
+
connect(i, i + 1);
|
|
141
|
+
}
|
|
142
|
+
const available = [];
|
|
143
|
+
const pos = new Int32Array(n).fill(-1);
|
|
144
|
+
for (let i = 0; i < n; i++) {
|
|
145
|
+
if (degree[i] < targetDegree) {
|
|
146
|
+
pos[i] = available.length;
|
|
147
|
+
available.push(i);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const removeAvailable = (id) => {
|
|
151
|
+
const p = pos[id];
|
|
152
|
+
if (p < 0)
|
|
153
|
+
return;
|
|
154
|
+
const last = available.pop();
|
|
155
|
+
if (last !== id) {
|
|
156
|
+
available[p] = last;
|
|
157
|
+
pos[last] = p;
|
|
158
|
+
}
|
|
159
|
+
pos[id] = -1;
|
|
160
|
+
};
|
|
161
|
+
const maxAttempts = n * Math.max(1, targetDegree) * 200;
|
|
162
|
+
let attempts = 0;
|
|
163
|
+
while (available.length > 1 && attempts < maxAttempts) {
|
|
164
|
+
attempts++;
|
|
165
|
+
const a = available[int(rng, available.length)];
|
|
166
|
+
const b = available[int(rng, available.length)];
|
|
167
|
+
if (a === b)
|
|
168
|
+
continue;
|
|
169
|
+
if (!connect(a, b))
|
|
170
|
+
continue;
|
|
171
|
+
if (degree[a] >= targetDegree)
|
|
172
|
+
removeAvailable(a);
|
|
173
|
+
if (degree[b] >= targetDegree)
|
|
174
|
+
removeAvailable(b);
|
|
175
|
+
}
|
|
176
|
+
return adj.map((s) => [...s]);
|
|
177
|
+
};
|
|
178
|
+
const runWithConcurrency = async (tasks, concurrency) => {
|
|
179
|
+
if (tasks.length === 0)
|
|
180
|
+
return [];
|
|
181
|
+
const results = new Array(tasks.length);
|
|
182
|
+
let next = 0;
|
|
183
|
+
const workers = Array.from({ length: Math.min(concurrency, tasks.length) }, async () => {
|
|
184
|
+
for (;;) {
|
|
185
|
+
const i = next++;
|
|
186
|
+
if (i >= tasks.length)
|
|
187
|
+
return;
|
|
188
|
+
results[i] = await tasks[i]();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
await Promise.all(workers);
|
|
192
|
+
return results;
|
|
193
|
+
};
|
|
12
194
|
export class TestSession {
|
|
13
195
|
session;
|
|
14
196
|
_peers;
|
|
15
197
|
connectedGroups;
|
|
16
|
-
|
|
198
|
+
inMemory;
|
|
199
|
+
constructor(session, peers, opts) {
|
|
17
200
|
this.session = session;
|
|
18
201
|
this._peers = peers;
|
|
202
|
+
this.inMemory = opts?.inMemory;
|
|
19
203
|
this.wrapPeerStartForReconnect();
|
|
20
204
|
}
|
|
21
205
|
get peers() {
|
|
22
206
|
return this._peers;
|
|
23
207
|
}
|
|
208
|
+
async configureFanoutShardRoots() {
|
|
209
|
+
if (!this.connectedGroups)
|
|
210
|
+
return;
|
|
211
|
+
// Build a view of direct underlay adjacency from the original dial-groups.
|
|
212
|
+
// This is used to pick "universally reachable" routers in sparse topologies
|
|
213
|
+
// (e.g. a line) so that sharded pubsub roots are directly dialable.
|
|
214
|
+
const adjacency = new Map();
|
|
215
|
+
const addAdj = (a, b) => {
|
|
216
|
+
let sa = adjacency.get(a);
|
|
217
|
+
if (!sa) {
|
|
218
|
+
sa = new Set();
|
|
219
|
+
adjacency.set(a, sa);
|
|
220
|
+
}
|
|
221
|
+
sa.add(b);
|
|
222
|
+
};
|
|
223
|
+
for (const groupSet of this.connectedGroups) {
|
|
224
|
+
const peers = [...groupSet];
|
|
225
|
+
for (let i = 0; i < peers.length; i++) {
|
|
226
|
+
for (let j = i + 1; j < peers.length; j++) {
|
|
227
|
+
const a = peers[i];
|
|
228
|
+
const b = peers[j];
|
|
229
|
+
addAdj(a, b);
|
|
230
|
+
addAdj(b, a);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// `connect(groups)` is sometimes used to form sparse topologies by passing
|
|
235
|
+
// overlapping "dial groups" (e.g. [[a,b],[b,c]] for a line). For shard-root
|
|
236
|
+
// resolution we must instead configure candidates consistently per connected
|
|
237
|
+
// component; otherwise a peer that appears in multiple groups would have its
|
|
238
|
+
// candidate set overwritten and pubsub/rpc can deadlock.
|
|
239
|
+
const mergedComponents = [];
|
|
240
|
+
for (const groupSet of this.connectedGroups) {
|
|
241
|
+
const intersections = [];
|
|
242
|
+
for (let i = 0; i < mergedComponents.length; i++) {
|
|
243
|
+
const existing = mergedComponents[i];
|
|
244
|
+
for (const peer of groupSet) {
|
|
245
|
+
if (existing.has(peer)) {
|
|
246
|
+
intersections.push(i);
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (intersections.length === 0) {
|
|
252
|
+
mergedComponents.push(new Set(groupSet));
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const union = new Set(groupSet);
|
|
256
|
+
intersections.sort((a, b) => b - a); // splice from end
|
|
257
|
+
for (const idx of intersections) {
|
|
258
|
+
for (const peer of mergedComponents[idx])
|
|
259
|
+
union.add(peer);
|
|
260
|
+
mergedComponents.splice(idx, 1);
|
|
261
|
+
}
|
|
262
|
+
mergedComponents.push(union);
|
|
263
|
+
}
|
|
264
|
+
const peerIndex = new Map();
|
|
265
|
+
for (let i = 0; i < this._peers.length; i++) {
|
|
266
|
+
peerIndex.set(this._peers[i], i);
|
|
267
|
+
}
|
|
268
|
+
for (const groupSet of mergedComponents) {
|
|
269
|
+
const group = [...groupSet].sort((a, b) => (peerIndex.get(a) ?? 0) - (peerIndex.get(b) ?? 0));
|
|
270
|
+
if (group.length === 0)
|
|
271
|
+
continue;
|
|
272
|
+
// Prefer routers that are directly connected to every peer in this component
|
|
273
|
+
// (e.g. the center node in a line). This avoids picking a root that some peers
|
|
274
|
+
// cannot dial directly, which can cause fanout join timeouts in sparse graphs.
|
|
275
|
+
const universalRouters = group.filter((p) => {
|
|
276
|
+
const n = adjacency.get(p);
|
|
277
|
+
if (!n)
|
|
278
|
+
return false;
|
|
279
|
+
for (const other of group) {
|
|
280
|
+
if (other === p)
|
|
281
|
+
continue;
|
|
282
|
+
if (!n.has(other))
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
return true;
|
|
286
|
+
});
|
|
287
|
+
// Keep a small deterministic router set so shard roots are always hosted.
|
|
288
|
+
// If no universally reachable peers exist, fall back to a bounded prefix.
|
|
289
|
+
const routers = universalRouters.length > 0
|
|
290
|
+
? universalRouters.slice(0, 8)
|
|
291
|
+
: group.slice(0, Math.min(8, Math.max(1, Math.ceil(Math.log2(Math.max(1, group.length))))));
|
|
292
|
+
const routerHashes = routers
|
|
293
|
+
.map((p) => p?.services?.pubsub?.publicKeyHash ??
|
|
294
|
+
p?.identity?.publicKey?.hashcode?.())
|
|
295
|
+
.filter((x) => typeof x === "string" && x.length > 0);
|
|
296
|
+
if (routerHashes.length === 0)
|
|
297
|
+
continue;
|
|
298
|
+
for (const peer of group) {
|
|
299
|
+
const servicesAny = peer.services;
|
|
300
|
+
// Prefer the pubsub service helper so we also disable its auto-candidate
|
|
301
|
+
// mode (otherwise it can keep gossiping/expanding candidates and shard-root
|
|
302
|
+
// resolution can diverge in sparse topologies).
|
|
303
|
+
try {
|
|
304
|
+
servicesAny?.pubsub?.setTopicRootCandidates?.(routerHashes);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// ignore
|
|
308
|
+
}
|
|
309
|
+
// Also update the shared topic-root control plane directly for any
|
|
310
|
+
// services that are not wired through pubsub.
|
|
311
|
+
const fanoutPlane = servicesAny?.fanout?.topicRootControlPlane;
|
|
312
|
+
const pubsubPlane = servicesAny?.pubsub?.topicRootControlPlane;
|
|
313
|
+
const planes = [...new Set([fanoutPlane, pubsubPlane].filter(Boolean))];
|
|
314
|
+
for (const plane of planes) {
|
|
315
|
+
try {
|
|
316
|
+
plane.setTopicRootCandidates(routerHashes);
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// ignore
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Ensure subsequent root resolution (and root hosting) uses the updated
|
|
324
|
+
// candidate set rather than any earlier auto-candidate cached mapping.
|
|
325
|
+
for (const peer of group) {
|
|
326
|
+
try {
|
|
327
|
+
peer?.services?.pubsub?.shardRootCache?.clear?.();
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// ignore
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Bring up shard roots on router peers.
|
|
334
|
+
await Promise.all(routers.map(async (peer) => {
|
|
335
|
+
try {
|
|
336
|
+
await peer?.services?.pubsub?.hostShardRootsNow?.();
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// ignore
|
|
340
|
+
}
|
|
341
|
+
}));
|
|
342
|
+
// If programs were opened before `connect()`, they may have subscribed under the
|
|
343
|
+
// initial local-only shard mapping. After updating candidates, force a best-effort
|
|
344
|
+
// reconcile so pubsub overlay joins + subscription announcements converge.
|
|
345
|
+
await Promise.all(group.map(async (peer) => {
|
|
346
|
+
try {
|
|
347
|
+
const pubsub = peer?.services?.pubsub;
|
|
348
|
+
pubsub?.shardRootCache?.clear?.();
|
|
349
|
+
await pubsub?.reconcileShardOverlays?.();
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// ignore
|
|
353
|
+
}
|
|
354
|
+
}));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
24
357
|
async connect(groups) {
|
|
25
358
|
await this.session.connect(groups?.map((x) => x.map((y) => y)));
|
|
26
359
|
this.connectedGroups = groups
|
|
27
360
|
? groups.map((group) => new Set(group))
|
|
28
361
|
: [new Set(this._peers)];
|
|
362
|
+
await this.configureFanoutShardRoots();
|
|
29
363
|
return;
|
|
30
364
|
}
|
|
365
|
+
/**
|
|
366
|
+
* Connect peers in a sparse random graph (bounded degree) to enable large-n sims.
|
|
367
|
+
*
|
|
368
|
+
* Returns the adjacency list (by index within each group).
|
|
369
|
+
*/
|
|
370
|
+
async connectRandomGraph(opts) {
|
|
371
|
+
const groups = opts.groups ?? [this._peers];
|
|
372
|
+
const degree = Math.max(0, Math.floor(opts.degree));
|
|
373
|
+
const seed = Math.max(0, Math.floor(opts.seed ?? 1));
|
|
374
|
+
const concurrency = Math.max(1, Math.floor(opts.concurrency ?? 100));
|
|
375
|
+
const rng = mulberry32(seed);
|
|
376
|
+
const out = [];
|
|
377
|
+
for (const group of groups) {
|
|
378
|
+
const n = group.length;
|
|
379
|
+
if (n === 0) {
|
|
380
|
+
out.push([]);
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
const d = Math.min(degree, Math.max(0, n - 1));
|
|
384
|
+
const graph = buildRandomGraph(n, d, rng);
|
|
385
|
+
out.push(graph);
|
|
386
|
+
const tasks = [];
|
|
387
|
+
for (let a = 0; a < graph.length; a++) {
|
|
388
|
+
for (const b of graph[a]) {
|
|
389
|
+
if (b <= a)
|
|
390
|
+
continue;
|
|
391
|
+
const pa = group[a];
|
|
392
|
+
const pb = group[b];
|
|
393
|
+
tasks.push(() => pa.dial(pb));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
await runWithConcurrency(tasks, concurrency);
|
|
397
|
+
}
|
|
398
|
+
this.connectedGroups = groups.map((group) => new Set(group));
|
|
399
|
+
await this.configureFanoutShardRoots();
|
|
400
|
+
return out;
|
|
401
|
+
}
|
|
31
402
|
wrapPeerStartForReconnect() {
|
|
32
403
|
const patchedKey = Symbol.for("@peerbit/test-session.reconnect-on-start");
|
|
33
404
|
for (const peer of this._peers) {
|
|
@@ -72,8 +443,17 @@ export class TestSession {
|
|
|
72
443
|
target: "neighbor",
|
|
73
444
|
timeout: 10_000,
|
|
74
445
|
}),
|
|
446
|
+
other.services.fanout.waitFor(peerHash, {
|
|
447
|
+
target: "neighbor",
|
|
448
|
+
timeout: 10_000,
|
|
449
|
+
}),
|
|
75
450
|
]);
|
|
76
451
|
}));
|
|
452
|
+
// A stop/start can leave sharded pubsub/fanout in a stale state (old shard-root
|
|
453
|
+
// cache, roots no longer hosted on restarted routers, overlays not rejoined).
|
|
454
|
+
// Re-apply the session's deterministic shard-root configuration so program-level
|
|
455
|
+
// RPC/pubsub resumes working without each test having to manually reconnect.
|
|
456
|
+
await this.configureFanoutShardRoots();
|
|
77
457
|
};
|
|
78
458
|
}
|
|
79
459
|
}
|
|
@@ -99,6 +479,10 @@ export class TestSession {
|
|
|
99
479
|
await session.connect();
|
|
100
480
|
// TODO types
|
|
101
481
|
await waitForPeersStreams(...session.peers.map((x) => x.services.blocks));
|
|
482
|
+
// Sharded pubsub/fanout uses its own DirectStream protocols; ensure those
|
|
483
|
+
// neighbor streams are established before tests start opening programs.
|
|
484
|
+
await waitForPeersStreams(...session.peers.map((x) => x.services.pubsub));
|
|
485
|
+
await waitForPeersStreams(...session.peers.map((x) => x.services.fanout));
|
|
102
486
|
return session;
|
|
103
487
|
}
|
|
104
488
|
static async disconnectedMock(n, options) {
|
|
@@ -138,6 +522,10 @@ export class TestSession {
|
|
|
138
522
|
await session.connect();
|
|
139
523
|
// TODO types
|
|
140
524
|
await waitForPeersStreams(...session.peers.map((x) => x.services.blocks));
|
|
525
|
+
// Sharded pubsub/fanout uses its own DirectStream protocols; ensure those
|
|
526
|
+
// neighbor streams are established before tests start opening programs.
|
|
527
|
+
await waitForPeersStreams(...session.peers.map((x) => x.services.pubsub));
|
|
528
|
+
await waitForPeersStreams(...session.peers.map((x) => x.services.fanout));
|
|
141
529
|
return session;
|
|
142
530
|
}
|
|
143
531
|
static async disconnected(n, options) {
|
|
@@ -151,6 +539,27 @@ export class TestSession {
|
|
|
151
539
|
const libp2pOptions = {
|
|
152
540
|
...(o?.libp2p ?? {}),
|
|
153
541
|
};
|
|
542
|
+
// `SSession.disconnected(n, opts)` can re-use the same `opts` object across many
|
|
543
|
+
// libp2p peers. Memoizing a single instance in a closure would accidentally
|
|
544
|
+
// share one FanoutTree (and TopicRootControlPlane) across the entire session.
|
|
545
|
+
// That breaks shard-root resolution (everyone would inherit the first peer's
|
|
546
|
+
// candidate set) and can deadlock fanout joins in disconnected tests.
|
|
547
|
+
const perPeer = new WeakMap();
|
|
548
|
+
const getOrCreatePerPeer = (c) => {
|
|
549
|
+
const key = c?.privateKey ?? c;
|
|
550
|
+
let existing = perPeer.get(key);
|
|
551
|
+
if (existing)
|
|
552
|
+
return existing;
|
|
553
|
+
const topicRootControlPlane = new TopicRootControlPlane();
|
|
554
|
+
const fanout = new FanoutTree(c, {
|
|
555
|
+
connectionManager: false,
|
|
556
|
+
topicRootControlPlane,
|
|
557
|
+
});
|
|
558
|
+
existing = { fanout, topicRootControlPlane };
|
|
559
|
+
perPeer.set(key, existing);
|
|
560
|
+
return existing;
|
|
561
|
+
};
|
|
562
|
+
const getOrCreateFanout = (c) => getOrCreatePerPeer(c).fanout;
|
|
154
563
|
if (useMockSession) {
|
|
155
564
|
libp2pOptions.transports = libp2pOptions.transports ?? transportsFast();
|
|
156
565
|
libp2pOptions.addresses = {
|
|
@@ -168,7 +577,12 @@ export class TestSession {
|
|
|
168
577
|
blocks: (c) => new DirectBlock(c, {
|
|
169
578
|
directory: blocksDirectory,
|
|
170
579
|
}),
|
|
171
|
-
pubsub: (c) => new
|
|
580
|
+
pubsub: (c) => new TopicControlPlane(c, {
|
|
581
|
+
canRelayMessage: true,
|
|
582
|
+
topicRootControlPlane: getOrCreatePerPeer(c).topicRootControlPlane,
|
|
583
|
+
fanout: getOrCreatePerPeer(c).fanout,
|
|
584
|
+
}),
|
|
585
|
+
fanout: (c) => getOrCreateFanout(c),
|
|
172
586
|
keychain: keychain(),
|
|
173
587
|
...libp2pOptions.services,
|
|
174
588
|
}, /// TODO types
|
|
@@ -187,5 +601,85 @@ export class TestSession {
|
|
|
187
601
|
? Peerbit.create({ libp2p: x, directory: options[ix]?.directory })
|
|
188
602
|
: Peerbit.create({ libp2p: x, directory: options?.directory })))));
|
|
189
603
|
}
|
|
604
|
+
/**
|
|
605
|
+
* Create a large-n capable Peerbit session using an in-memory libp2p transport shim.
|
|
606
|
+
*
|
|
607
|
+
* This avoids TCP/noise costs and (optionally) skips expensive crypto verification.
|
|
608
|
+
*
|
|
609
|
+
* Notes:
|
|
610
|
+
* - By default this uses a no-op indexer to avoid spinning up sqlite for each peer.
|
|
611
|
+
* - If you pass `degree`, it will connect a bounded-degree random graph automatically.
|
|
612
|
+
*/
|
|
613
|
+
static async disconnectedInMemory(n, opts = {}) {
|
|
614
|
+
const mockCrypto = opts.mockCrypto !== false;
|
|
615
|
+
const indexer = opts.indexer ?? (() => new NoopIndices());
|
|
616
|
+
const seed = Math.max(0, Math.floor(opts.seed ?? 1));
|
|
617
|
+
const perPeer = new Map();
|
|
618
|
+
const getOrCreatePerPeer = (c) => {
|
|
619
|
+
const key = c?.peerId?.toString?.() ?? "";
|
|
620
|
+
const existing = perPeer.get(key);
|
|
621
|
+
if (existing)
|
|
622
|
+
return existing;
|
|
623
|
+
const topicRootControlPlane = new TopicRootControlPlane();
|
|
624
|
+
const fanout = new SimFanoutTree(c, {
|
|
625
|
+
connectionManager: false,
|
|
626
|
+
random: mulberry32((seed >>> 0) ^ parseSimPeerIndex(c?.peerId)),
|
|
627
|
+
topicRootControlPlane,
|
|
628
|
+
}, mockCrypto);
|
|
629
|
+
const created = { fanout, topicRootControlPlane };
|
|
630
|
+
perPeer.set(key, created);
|
|
631
|
+
return created;
|
|
632
|
+
};
|
|
633
|
+
const inMemory = await InMemorySession.disconnected(n, {
|
|
634
|
+
start: false,
|
|
635
|
+
basePort: opts.basePort ?? 30_000,
|
|
636
|
+
networkOpts: opts.network,
|
|
637
|
+
services: {
|
|
638
|
+
blocks: (c) => new SimDirectBlock(c, {
|
|
639
|
+
directory: opts.directory ? path.join(opts.directory, "/blocks") : undefined,
|
|
640
|
+
canRelayMessage: true,
|
|
641
|
+
}, mockCrypto),
|
|
642
|
+
pubsub: (c) => new SimTopicControlPlane(c, (() => {
|
|
643
|
+
const { fanout, topicRootControlPlane } = getOrCreatePerPeer(c);
|
|
644
|
+
return {
|
|
645
|
+
canRelayMessage: true,
|
|
646
|
+
topicRootControlPlane,
|
|
647
|
+
fanout,
|
|
648
|
+
};
|
|
649
|
+
})(), mockCrypto),
|
|
650
|
+
fanout: (c) => getOrCreatePerPeer(c).fanout,
|
|
651
|
+
keychain: () =>
|
|
652
|
+
// Avoid libp2p keychain (datastore dependency) for large sims.
|
|
653
|
+
// Peerbit only requires the CryptoKeychain surface in these sessions.
|
|
654
|
+
new DefaultCryptoKeychain({ store: createStore() }),
|
|
655
|
+
},
|
|
656
|
+
});
|
|
657
|
+
const peers = (await Promise.all(inMemory.peers.map((x) => Peerbit.create({
|
|
658
|
+
libp2p: x,
|
|
659
|
+
directory: opts.directory,
|
|
660
|
+
indexer,
|
|
661
|
+
}))));
|
|
662
|
+
const sessionLike = {
|
|
663
|
+
peers: inMemory.peers,
|
|
664
|
+
connect: async (groups) => inMemory.connectFully(groups),
|
|
665
|
+
stop: async () => inMemory.stop(),
|
|
666
|
+
};
|
|
667
|
+
return new TestSession(sessionLike, peers, {
|
|
668
|
+
inMemory: { session: inMemory, network: inMemory.network },
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
static async connectedInMemory(n, opts = {}) {
|
|
672
|
+
const session = await TestSession.disconnectedInMemory(n, opts);
|
|
673
|
+
if (opts.degree != null) {
|
|
674
|
+
await session.connectRandomGraph({
|
|
675
|
+
degree: opts.degree,
|
|
676
|
+
seed: opts.seed,
|
|
677
|
+
concurrency: opts.concurrency,
|
|
678
|
+
});
|
|
679
|
+
return session;
|
|
680
|
+
}
|
|
681
|
+
await session.connect();
|
|
682
|
+
return session;
|
|
683
|
+
}
|
|
190
684
|
}
|
|
191
685
|
//# sourceMappingURL=session.js.map
|
package/dist/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|