@@ -63,39 +63,62 @@ jobs:
6363 const wantAll = argv.includes('all');
6464 const wantSharedLog =
6565 wantAll || argv.includes('shared-log') || argv.includes('sharedlog') || argv.includes('shared');
66- const wantDocument = wantAll || argv.includes('document') || argv.includes('doc');
66+ const wantTransport =
67+ wantAll ||
68+ argv.includes('transport') ||
69+ argv.includes('stream') ||
70+ argv.includes('transfer') ||
71+ argv.includes('ack');
72+ const wantDocument =
73+ wantAll ||
74+ argv.includes('document') ||
75+ argv.includes('doc') ||
76+ argv.includes('ingest') ||
77+ argv.includes('file-ingest');
6778
6879 const touchedSharedLog = filenames.some(
6980 (p) =>
7081 p.startsWith('packages/programs/data/shared-log/') ||
7182 p.startsWith('packages/utils/rateless-iblt/'),
7283 );
73- const touchedDocument = filenames.some((p) => p.startsWith('packages/programs/data/document/'));
84+ const touchedIngestStack = filenames.some(
85+ (p) =>
86+ p.startsWith('packages/programs/data/document/') ||
87+ p.startsWith('packages/programs/data/shared-log/') ||
88+ p.startsWith('packages/log/') ||
89+ p.startsWith('packages/transport/stream/') ||
90+ p.startsWith('packages/transport/stream-interface/') ||
91+ p.startsWith('packages/transport/blocks/') ||
92+ p.startsWith('packages/transport/blocks-interface/') ||
93+ p.startsWith('packages/utils/indexer/') ||
94+ p.startsWith('packages/utils/crypto/'),
95+ );
96+ const touchedTransport = filenames.some(
97+ (p) =>
98+ p.startsWith('packages/transport/stream/') ||
99+ p.startsWith('packages/transport/stream-interface/') ||
100+ p.startsWith('packages/utils/crypto/'),
101+ );
74102
75103 const runSharedLog = wantSharedLog || (!hasArgs && touchedSharedLog);
76- const runDocument = wantDocument || (!hasArgs && touchedDocument);
104+ const runTransport = wantTransport || (!hasArgs && touchedTransport);
105+ const runDocument = wantDocument || (!hasArgs && touchedIngestStack);
77106
78107 core.setOutput('run_shared_log', runSharedLog ? 'true' : 'false');
108+ core.setOutput('run_transport', runTransport ? 'true' : 'false');
79109 core.setOutput('run_document', runDocument ? 'true' : 'false');
80110
81111 const selected = [];
82112 if (runSharedLog) selected.push('shared-log');
113+ if (runTransport) selected.push('transport');
83114 if (runDocument) selected.push('document');
84115 core.setOutput('selected', selected.join(',') || 'none');
85116 core.setOutput('mode', hasArgs ? 'manual' : 'auto');
86117 core.setOutput('args', argv.join(' '));
87118
88- const runAny = runSharedLog || runDocument;
119+ const runAny = runSharedLog || runTransport || runDocument;
89120 core.setOutput('run_any', runAny ? 'true' : 'false');
90121
91- let buildFilter = '';
92- if (runDocument) {
93- buildFilter = '@peerbit/document...';
94- } else if (runSharedLog) {
95- buildFilter = '@peerbit/shared-log...';
96- }
97- core.setOutput('build_filter', buildFilter);
98-
99122 - name : Skip forked PRs
100123 if : steps.pr.outputs.same_repo != 'true'
101124 run : |
@@ -145,12 +168,30 @@ jobs:
145168 - name : Build (base)
146169 if : steps.pr.outputs.same_repo == 'true' && steps.pr.outputs.run_any == 'true'
147170 working-directory : bench-base
148- run : pnpm --filter ${{ steps.pr.outputs.build_filter }} run build
171+ run : |
172+ if [ "${{ steps.pr.outputs.run_shared_log }}" = "true" ]; then
173+ pnpm --filter @peerbit/shared-log... run build
174+ fi
175+ if [ "${{ steps.pr.outputs.run_transport }}" = "true" ]; then
176+ pnpm --filter @peerbit/stream... run build
177+ fi
178+ if [ "${{ steps.pr.outputs.run_document }}" = "true" ]; then
179+ pnpm --filter @peerbit/document... run build
180+ fi
149181
150182 - name : Build (head)
151183 if : steps.pr.outputs.same_repo == 'true' && steps.pr.outputs.run_any == 'true'
152184 working-directory : bench-head
153- run : pnpm --filter ${{ steps.pr.outputs.build_filter }} run build
185+ run : |
186+ if [ "${{ steps.pr.outputs.run_shared_log }}" = "true" ]; then
187+ pnpm --filter @peerbit/shared-log... run build
188+ fi
189+ if [ "${{ steps.pr.outputs.run_transport }}" = "true" ]; then
190+ pnpm --filter @peerbit/stream... run build
191+ fi
192+ if [ "${{ steps.pr.outputs.run_document }}" = "true" ]; then
193+ pnpm --filter @peerbit/document... run build
194+ fi
154195
155196 - name : Run shared-log benchmarks (base)
156197 if : steps.pr.outputs.same_repo == 'true' && steps.pr.outputs.run_shared_log == 'true'
@@ -202,13 +243,42 @@ jobs:
202243 BENCH_JSON : " 1"
203244 DOC_WARMUP : " 2"
204245 DOC_ITERATIONS : " 10"
246+ FILE_INGEST_WARMUP : " 1"
247+ FILE_INGEST_ITERATIONS : " 3"
248+ FILE_INGEST_CHUNKS : " 24"
249+ FILE_INGEST_CHUNK_BYTES : " 262144"
250+ FILE_INGEST_READY_TIMEOUT_MS : " 30000"
205251 run : |
206252 mkdir -p "$GITHUB_WORKSPACE/bench-results/base"
207253 if [ -f ./benchmark/document-put.ts ]; then
208254 node --loader ts-node/esm ./benchmark/document-put.ts > "$GITHUB_WORKSPACE/bench-results/base/document-put.json"
209255 else
210256 echo "document-put benchmark not present in base; skipping."
211257 fi
258+ if [ -f ./benchmark/file-ingest.ts ]; then
259+ node --loader ts-node/esm ./benchmark/file-ingest.ts > "$GITHUB_WORKSPACE/bench-results/base/file-ingest.json"
260+ else
261+ echo "file-ingest benchmark not present in base; skipping."
262+ fi
263+
264+ - name : Run transport benchmarks (base)
265+ if : steps.pr.outputs.same_repo == 'true' && steps.pr.outputs.run_transport == 'true'
266+ working-directory : bench-base/packages/transport/stream
267+ env :
268+ NODE_OPTIONS : --no-warnings
269+ BENCH_JSON : " 1"
270+ CHUNK_TRANSFER_WARMUP : " 1"
271+ CHUNK_TRANSFER_ITERATIONS : " 3"
272+ CHUNK_TRANSFER_CHUNKS : " 24"
273+ CHUNK_TRANSFER_CHUNK_BYTES : " 262144"
274+ CHUNK_TRANSFER_TIMEOUT_MS : " 30000"
275+ run : |
276+ mkdir -p "$GITHUB_WORKSPACE/bench-results/base"
277+ if [ -f ./benchmark/chunk-transfer.ts ]; then
278+ node ./dist/benchmark/chunk-transfer.js > "$GITHUB_WORKSPACE/bench-results/base/chunk-transfer.json"
279+ else
280+ echo "chunk-transfer benchmark not present in base; skipping."
281+ fi
212282
213283 - name : Run document benchmarks (head)
214284 if : steps.pr.outputs.same_repo == 'true' && steps.pr.outputs.run_document == 'true'
@@ -218,13 +288,42 @@ jobs:
218288 BENCH_JSON : " 1"
219289 DOC_WARMUP : " 2"
220290 DOC_ITERATIONS : " 10"
291+ FILE_INGEST_WARMUP : " 1"
292+ FILE_INGEST_ITERATIONS : " 3"
293+ FILE_INGEST_CHUNKS : " 24"
294+ FILE_INGEST_CHUNK_BYTES : " 262144"
295+ FILE_INGEST_READY_TIMEOUT_MS : " 30000"
221296 run : |
222297 mkdir -p "$GITHUB_WORKSPACE/bench-results/head"
223298 if [ -f ./benchmark/document-put.ts ]; then
224299 node --loader ts-node/esm ./benchmark/document-put.ts > "$GITHUB_WORKSPACE/bench-results/head/document-put.json"
225300 else
226301 echo "document-put benchmark not present in head; skipping."
227302 fi
303+ if [ -f ./benchmark/file-ingest.ts ]; then
304+ node --loader ts-node/esm ./benchmark/file-ingest.ts > "$GITHUB_WORKSPACE/bench-results/head/file-ingest.json"
305+ else
306+ echo "file-ingest benchmark not present in head; skipping."
307+ fi
308+
309+ - name : Run transport benchmarks (head)
310+ if : steps.pr.outputs.same_repo == 'true' && steps.pr.outputs.run_transport == 'true'
311+ working-directory : bench-head/packages/transport/stream
312+ env :
313+ NODE_OPTIONS : --no-warnings
314+ BENCH_JSON : " 1"
315+ CHUNK_TRANSFER_WARMUP : " 1"
316+ CHUNK_TRANSFER_ITERATIONS : " 3"
317+ CHUNK_TRANSFER_CHUNKS : " 24"
318+ CHUNK_TRANSFER_CHUNK_BYTES : " 262144"
319+ CHUNK_TRANSFER_TIMEOUT_MS : " 30000"
320+ run : |
321+ mkdir -p "$GITHUB_WORKSPACE/bench-results/head"
322+ if [ -f ./benchmark/chunk-transfer.ts ]; then
323+ node ./dist/benchmark/chunk-transfer.js > "$GITHUB_WORKSPACE/bench-results/head/chunk-transfer.json"
324+ else
325+ echo "chunk-transfer benchmark not present in head; skipping."
326+ fi
228327
229328 - name : Comment results
230329 if : always() && steps.pr.outputs.same_repo == 'true'
@@ -270,9 +369,28 @@ jobs:
270369 base: 'bench-results/base/document-put.json',
271370 head: 'bench-results/head/document-put.json',
272371 },
372+ {
373+ title: 'transport: multi-hop chunk transfer',
374+ base: 'bench-results/base/chunk-transfer.json',
375+ head: 'bench-results/head/chunk-transfer.json',
376+ },
377+ {
378+ title: 'document: chunked file-ingest',
379+ base: 'bench-results/base/file-ingest.json',
380+ head: 'bench-results/head/file-ingest.json',
381+ },
273382 ];
274383
275- const readJson = (file) => JSON.parse(fs.readFileSync(file, 'utf8'));
384+ const readJson = (file) => {
385+ try {
386+ return JSON.parse(fs.readFileSync(file, 'utf8'));
387+ } catch (error) {
388+ return {
389+ tasks: [],
390+ __parseError: error instanceof Error ? error.message : String(error),
391+ };
392+ }
393+ };
276394
277395 const format = (value, digits = 3) => {
278396 if (value === null || value === undefined || Number.isNaN(value)) return '-';
@@ -339,6 +457,13 @@ jobs:
339457 const headJson = headExists ? readJson(suite.head) : { tasks: [] };
340458 body += `### ${suite.title}\n\n`;
341459 body += formatSuite(baseJson, headJson);
460+ if (baseJson.__parseError || headJson.__parseError) {
461+ body += '\n\n';
462+ body += [
463+ baseJson.__parseError ? `base parse error: ${baseJson.__parseError}` : null,
464+ headJson.__parseError ? `head parse error: ${headJson.__parseError}` : null,
465+ ].filter(Boolean).join(' • ');
466+ }
342467 body += `\n\n`;
343468 includedSuites += 1;
344469 }
0 commit comments