@peerbit/stream 5.1.5 → 5.2.0

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.
@@ -1,251 +0,0 @@
1
- import { tcp } from "@libp2p/tcp";
2
- import { TestSession } from "@peerbit/libp2p-test-utils";
3
- import { AcknowledgeDelivery } from "@peerbit/stream-interface";
4
- import { waitForResolved } from "@peerbit/time";
5
- import crypto from "crypto";
6
- import fs from "node:fs/promises";
7
- import path from "node:path";
8
- import { DirectStream, waitForNeighbour, } from "../src/index.js";
9
- class TestStreamImpl extends DirectStream {
10
- constructor(c) {
11
- super(c, ["bench/0.0.0"], {
12
- canRelayMessage: true,
13
- connectionManager: false,
14
- });
15
- }
16
- }
17
- const parseArgs = (argv) => {
18
- const get = (key) => {
19
- const idx = argv.indexOf(key);
20
- if (idx === -1)
21
- return undefined;
22
- return argv[idx + 1];
23
- };
24
- if (argv.includes("--help") || argv.includes("-h")) {
25
- console.log([
26
- "transfer.ts",
27
- "",
28
- "Real libp2p direct-stream transfer benchmark.",
29
- "",
30
- "Args:",
31
- " --sizes BYTES[,BYTES...] payload sizes (default: 262144,1048576)",
32
- " --iterations N measured iterations per run (default: 10)",
33
- " --warmup N warmup iterations per run (default: 2)",
34
- " --runs N repeated runs per case (default: 3)",
35
- " --timeoutMs N per-iteration timeout (default: 30000)",
36
- " --mode silent|ack|both delivery mode (default: both)",
37
- " --json PATH write JSON results to file",
38
- "",
39
- "Examples:",
40
- " pnpm -C packages/transport/stream run bench -- transfer",
41
- " pnpm -C packages/transport/stream run bench -- transfer --sizes 1048576 --mode ack --runs 5",
42
- ].join("\n"));
43
- process.exit(0);
44
- }
45
- const sizes = (get("--sizes") ?? "262144,1048576")
46
- .split(",")
47
- .map((value) => Number(value.trim()))
48
- .filter((value) => Number.isFinite(value) && value > 0);
49
- if (sizes.length === 0) {
50
- throw new Error("Expected at least one positive size in --sizes");
51
- }
52
- const mode = (get("--mode") ?? "both");
53
- if (!["silent", "ack", "both"].includes(mode)) {
54
- throw new Error(`Unsupported --mode "${mode}"`);
55
- }
56
- return {
57
- sizes,
58
- iterations: Number(get("--iterations") ?? 10),
59
- warmup: Number(get("--warmup") ?? 2),
60
- runs: Number(get("--runs") ?? 3),
61
- timeoutMs: Number(get("--timeoutMs") ?? 30_000),
62
- mode,
63
- json: get("--json"),
64
- };
65
- };
66
- const average = (values) => values.reduce((sum, value) => sum + value, 0) / values.length;
67
- const percentile = (values, p) => {
68
- const sorted = [...values].sort((a, b) => a - b);
69
- const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * p) - 1));
70
- return sorted[idx];
71
- };
72
- const round = (value, digits = 2) => Number(value.toFixed(digits));
73
- const makePayload = (size, sequence) => {
74
- const payload = crypto.randomBytes(size);
75
- if (size >= 8) {
76
- payload.writeUInt32BE(sequence >>> 0, 0);
77
- payload.writeUInt32BE((sequence ^ 0x9e3779b9) >>> 0, 4);
78
- }
79
- return payload;
80
- };
81
- const matchesPayload = (data, sequence) => {
82
- if (data.byteLength < 8) {
83
- return true;
84
- }
85
- const view = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
86
- return (view.readUInt32BE(0) === (sequence >>> 0) &&
87
- view.readUInt32BE(4) === ((sequence ^ 0x9e3779b9) >>> 0));
88
- };
89
- const waitForPayload = (receiver, sequence, timeoutMs) => new Promise((resolve, reject) => {
90
- const timer = setTimeout(() => {
91
- cleanup();
92
- reject(new Error(`Timed out waiting for payload sequence=${sequence}`));
93
- }, timeoutMs);
94
- const onData = (event) => {
95
- const data = event.detail.data;
96
- if (!matchesPayload(data, sequence)) {
97
- return;
98
- }
99
- cleanup();
100
- resolve();
101
- };
102
- const cleanup = () => {
103
- clearTimeout(timer);
104
- receiver.removeEventListener("data", onData);
105
- };
106
- receiver.addEventListener("data", onData);
107
- });
108
- const modeOptions = (mode, receiver) => mode === "ack"
109
- ? {
110
- mode: new AcknowledgeDelivery({
111
- redundancy: 1,
112
- to: [receiver.publicKey],
113
- }),
114
- }
115
- : {
116
- to: [receiver.publicKey],
117
- };
118
- const summarize = (mode, sizeBytes, iterations, warmup, runs, iterationResults) => {
119
- const publishResolved = iterationResults.map((result) => result.publishResolvedMs);
120
- const receiverObserved = iterationResults.map((result) => result.receiverObservedMs);
121
- const publisherTail = iterationResults.map((result) => result.publisherTailMs);
122
- const complete = iterationResults.map((result) => result.completeMs);
123
- const elapsedSeconds = complete.reduce((sum, value) => sum + value, 0) / 1_000;
124
- const totalMb = (sizeBytes * iterationResults.length) / (1024 * 1024);
125
- return {
126
- mode,
127
- sizeBytes,
128
- iterations,
129
- warmup,
130
- runs,
131
- metrics: {
132
- publishResolvedMsAvg: round(average(publishResolved)),
133
- receiverObservedMsAvg: round(average(receiverObserved)),
134
- publisherTailMsAvg: round(average(publisherTail)),
135
- publisherTailMsMedian: round(percentile(publisherTail, 0.5)),
136
- publisherTailMsP95: round(percentile(publisherTail, 0.95)),
137
- completeMsAvg: round(average(complete)),
138
- completeMsMedian: round(percentile(complete, 0.5)),
139
- completeMsP95: round(percentile(complete, 0.95)),
140
- opsPerSecond: round(iterationResults.length / elapsedSeconds),
141
- mbPerSecond: round(totalMb / elapsedSeconds),
142
- },
143
- iterationResults,
144
- };
145
- };
146
- const main = async () => {
147
- const options = parseArgs(process.argv.slice(2));
148
- const session = await TestSession.disconnected(4, {
149
- transports: [tcp()],
150
- services: { directstream: (c) => new TestStreamImpl(c) },
151
- });
152
- try {
153
- await session.connect([
154
- [session.peers[0], session.peers[1]],
155
- [session.peers[1], session.peers[2]],
156
- [session.peers[2], session.peers[3]],
157
- ]);
158
- const stream = (i) => session.peers[i].services.directstream;
159
- await waitForNeighbour(stream(0), stream(1));
160
- await waitForNeighbour(stream(1), stream(2));
161
- await waitForNeighbour(stream(2), stream(3));
162
- await stream(0).publish(new Uint8Array([123]), {
163
- mode: new AcknowledgeDelivery({
164
- redundancy: 1,
165
- to: [stream(session.peers.length - 1).publicKey],
166
- }),
167
- });
168
- await waitForResolved(() => stream(0).routes.isReachable(stream(0).publicKeyHash, stream(3).publicKeyHash));
169
- const sender = stream(0);
170
- const receiver = stream(3);
171
- const modes = options.mode === "both" ? ["silent", "ack"] : [options.mode];
172
- const results = [];
173
- let sequence = 0;
174
- for (const mode of modes) {
175
- for (const sizeBytes of options.sizes) {
176
- console.log(`Running transfer benchmark mode=${mode} sizeBytes=${sizeBytes} runs=${options.runs} iterations=${options.iterations} warmup=${options.warmup}`);
177
- const iterationResults = [];
178
- for (let run = 0; run < options.runs; run++) {
179
- for (let warmupIteration = 0; warmupIteration < options.warmup; warmupIteration++) {
180
- sequence++;
181
- const payload = makePayload(sizeBytes, sequence);
182
- const receivePromise = waitForPayload(receiver, sequence, options.timeoutMs);
183
- await Promise.all([
184
- sender.publish(payload, modeOptions(mode, receiver)),
185
- receivePromise,
186
- ]);
187
- }
188
- for (let measuredIteration = 0; measuredIteration < options.iterations; measuredIteration++) {
189
- sequence++;
190
- const payload = makePayload(sizeBytes, sequence);
191
- let publishResolvedMs = 0;
192
- let receiverObservedMs = 0;
193
- const startedAt = performance.now();
194
- const receivePromise = waitForPayload(receiver, sequence, options.timeoutMs).then(() => {
195
- receiverObservedMs = performance.now() - startedAt;
196
- });
197
- const publishPromise = sender
198
- .publish(payload, modeOptions(mode, receiver))
199
- .then(() => {
200
- publishResolvedMs = performance.now() - startedAt;
201
- });
202
- await Promise.all([publishPromise, receivePromise]);
203
- const publisherTailMs = Math.max(0, publishResolvedMs - receiverObservedMs);
204
- iterationResults.push({
205
- iteration: run * options.iterations + measuredIteration + 1,
206
- publishResolvedMs: round(publishResolvedMs, 3),
207
- receiverObservedMs: round(receiverObservedMs, 3),
208
- publisherTailMs: round(publisherTailMs, 3),
209
- completeMs: round(Math.max(publishResolvedMs, receiverObservedMs), 3),
210
- });
211
- }
212
- }
213
- results.push(summarize(mode, sizeBytes, options.iterations, options.warmup, options.runs, iterationResults));
214
- }
215
- }
216
- console.table(results.map((result) => ({
217
- mode: result.mode,
218
- sizeBytes: result.sizeBytes,
219
- runs: result.runs,
220
- iterationsPerRun: result.iterations,
221
- completeMsAvg: result.metrics.completeMsAvg,
222
- completeMsMedian: result.metrics.completeMsMedian,
223
- completeMsP95: result.metrics.completeMsP95,
224
- publishResolvedMsAvg: result.metrics.publishResolvedMsAvg,
225
- receiverObservedMsAvg: result.metrics.receiverObservedMsAvg,
226
- publisherTailMsAvg: result.metrics.publisherTailMsAvg,
227
- publisherTailMsMedian: result.metrics.publisherTailMsMedian,
228
- publisherTailMsP95: result.metrics.publisherTailMsP95,
229
- opsPerSecond: result.metrics.opsPerSecond,
230
- mbPerSecond: result.metrics.mbPerSecond,
231
- })));
232
- const output = {
233
- options,
234
- results,
235
- };
236
- if (options.json) {
237
- const outPath = path.resolve(options.json);
238
- await fs.mkdir(path.dirname(outPath), { recursive: true });
239
- await fs.writeFile(outPath, `${JSON.stringify(output, null, 2)}\n`);
240
- }
241
- console.log(JSON.stringify(output, null, 2));
242
- }
243
- finally {
244
- await session.stop();
245
- }
246
- };
247
- main().catch((error) => {
248
- console.error(error);
249
- process.exitCode = 1;
250
- });
251
- //# sourceMappingURL=transfer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../benchmark/transfer.ts"],"names":[],"mappings":"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"}