A tester binds with a process proof from the bus's own tester-cli.mjs when the business var bus.tester is true. It may send [mos test] messages to a role, receive replies on the tester address and use the read verbs; every other verb refuses. Messages store from_role tester and write no human.input event. turnRequest() marks them as never Jason's instruction. human.mjs is unchanged. Candidate manifest bdaf7f476abd0b2b5095ab2f7f43e38540e6ba48ee14a02a4f4995a1469b79df (Darkwing round 2, packet9f1563ec1), BASEbadfa52b9. Approved by Filbert (comment 28360) and Sage (comment 28361). Sage gate rerun passed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
41 lines
1.5 KiB
JavaScript
41 lines
1.5 KiB
JavaScript
// Row 110 (#1604): the tester's transport shim, human-cli.mjs with its own nonce variable and a
|
|
// tester proof. Not a second product CLI. Input and proof never carry service tokens.
|
|
import { randomBytes } from 'node:crypto';
|
|
import { spawnSync } from 'node:child_process';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { readFileSync } from 'node:fs';
|
|
import { Client } from './client.mjs';
|
|
import { readProcess } from './human.mjs';
|
|
const file = fileURLToPath(import.meta.url);
|
|
if (!process.env.MOSAIC_BUS_TESTER_NONCE) {
|
|
const child = spawnSync(process.execPath, [file, ...process.argv.slice(2)], {
|
|
stdio: 'inherit',
|
|
env: { ...process.env, MOSAIC_BUS_TESTER_NONCE: randomBytes(32).toString('hex') },
|
|
});
|
|
process.exit(child.status ?? 2);
|
|
}
|
|
try {
|
|
const request = JSON.parse(readFileSync(0, 'utf8'));
|
|
if (
|
|
!request ||
|
|
typeof request !== 'object' ||
|
|
Object.keys(request).some((k) => !['business', 'verb', 'args'].includes(k))
|
|
)
|
|
throw Error();
|
|
const me = readProcess(process.pid);
|
|
const client = new Client({
|
|
path: process.argv[2],
|
|
tester: {
|
|
business: request.business,
|
|
pid: me.pid,
|
|
startTime: me.startTime,
|
|
nonce: process.env.MOSAIC_BUS_TESTER_NONCE,
|
|
},
|
|
});
|
|
const result = await client.call(request.verb, request.args ?? {});
|
|
process.stdout.write(JSON.stringify(result) + '\n');
|
|
} catch (e) {
|
|
process.stderr.write((/^[a-z-]{1,64}$/.test(e.code ?? '') ? e.code : 'invalid-request') + '\n');
|
|
process.exitCode = 2;
|
|
}
|