import test from 'node:test'; import assert from 'node:assert/strict'; import { createServer } from 'node:net'; import { mkdtempSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { Client } from '../src/client.mjs'; test('processing halt and resume extend only the socket timeout while ordinary status retains the explicit timeout', async t => { const root = mkdtempSync(join(tmpdir(), 'processing-client-')), path = join(root, 'fixture.sock'); const seen = [], sockets = new Set(); const server = createServer(socket => { sockets.add(socket); let buffer = '', timer; socket.on('error', () => {}); socket.on('close', () => { sockets.delete(socket); clearTimeout(timer); }); socket.on('data', data => { buffer += data; if (!buffer.includes('\n')) return; seen.push(JSON.parse(buffer)); timer = setTimeout(() => socket.end(JSON.stringify({ ok: true, result: { real: 'completion' } }) + '\n'), 80); }); }); await new Promise(resolve => server.listen(path, resolve)); t.after(async () => { for (const socket of sockets) socket.destroy(); await new Promise(resolve => server.close(resolve)); rmSync(root, { recursive: true, force: true }); }); const client = new Client({ path, cap: 'a'.repeat(64), timeout: 15 }); for (const verb of ['processing.halt', 'processing.resume']) { assert.deepEqual(await client.call(verb, {}), { real: 'completion' }); assert.equal(client.timeout, 15, 'the constructor setting stays unchanged'); } await assert.rejects(client.call('processing.status'), { code: 'outcome-unknown' }); assert.deepEqual(seen, ['processing.halt', 'processing.resume', 'processing.status'].map(verb => ({ cap: 'a'.repeat(64), verb, args: {} }))); });