// Opt-in check of the built production worker; synthetic input only. import assert from 'node:assert/strict'; import { Worker } from 'node:worker_threads'; const entry = new URL('../../dist-server/import-worker.mjs', import.meta.url).href; const harness = new URL(`data:text/javascript,${encodeURIComponent(` import { createRequire } from 'node:module'; import { parentPort } from 'node:worker_threads'; const require = createRequire(${JSON.stringify(entry)}); const send = parentPort.postMessage.bind(parentPort); parentPort.postMessage = result => send({ ...result, markupLoaded: Object.keys(require.cache).some(path => /[\\\\/]node_modules[\\\\/]jsdom[\\\\/]/.test(path)) }); await import(${JSON.stringify(entry)}); `)}`); const csv = '"Domain"\r\n"synthetic.example.invalid"\r\n'; const start = Date.now(); for (let batch = 0; batch < 11; batch++) { await Promise.all([0, 1].map(async index => { const bytes = new TextEncoder().encode(csv); const worker = new Worker(harness, { execArgv: [], workerData: { source: { metadata: { name: `synthetic-${batch}-${index}.csv`, sizeBytes: bytes.length, lastModified: 0 }, bytes } }, resourceLimits: { maxOldGenerationSizeMb: 512, maxYoungGenerationSizeMb: 64, stackSizeMb: 8 } }); try { const result = await new Promise((resolve, reject) => { const timer = setTimeout(() => reject(new Error('Production worker exceeded its unchanged 30-second limit')), 30_000); worker.once('message', result => { clearTimeout(timer); resolve(result); }); worker.once('error', error => { clearTimeout(timer); reject(error); }); }); assert.equal(result.ok, true); assert.equal(result.dataset.format, 'CSV'); assert.equal(result.dataset.rawText, csv); assert.equal(result.dataset.intermediate.tables.length, 1); assert.deepEqual(result.dataset.intermediate.tables[0].rows.map(row => row.cells.map(cell => cell.rawValue)), [['Domain'], ['synthetic.example.invalid']]); assert.equal(result.markupLoaded, false, 'CSV workers must not initialize the unrelated HTML/XML DOM runtime'); } finally { await worker.terminate(); } })); } console.log(JSON.stringify({ syntheticFiles: 22, elapsedMs: Date.now() - start, markupLoaded: false }));