42 lines
1.8 KiB
JavaScript
42 lines
1.8 KiB
JavaScript
// Row 252 (#1753, design section 2): the Console owner's transport shim, spawned only by the webui
|
|
// `cli.mjs serve` process for one preview or one answer. Not a second product CLI. The Console sets
|
|
// the nonce, the business and the signed-in (provider, iss, sub) in the spawn environment, and the
|
|
// bus reads them back from this process's initial environment. Nothing respawns here, so the
|
|
// Console stays the direct parent. Input is a verb and its args only: a body that names a business,
|
|
// a subject or any other key is refused, never merged.
|
|
import { readFileSync } from 'node:fs';
|
|
import { Client } from './client.mjs';
|
|
import { readProcess } from './human.mjs';
|
|
import { CONSOLE_VERBS } from './broker.mjs';
|
|
const env = process.env;
|
|
try {
|
|
if (!/^[a-f0-9]{64}$/.test(env.MOSAIC_BUS_CONSOLE_NONCE ?? '')) throw Object.assign(Error(), { code: 'human-required' });
|
|
const request = JSON.parse(readFileSync(0, 'utf8'));
|
|
if (
|
|
!request ||
|
|
typeof request !== 'object' ||
|
|
Array.isArray(request) ||
|
|
Object.keys(request).some((k) => !['verb', 'args'].includes(k)) ||
|
|
!CONSOLE_VERBS.includes(request.verb)
|
|
)
|
|
throw Error();
|
|
const me = readProcess(process.pid);
|
|
const client = new Client({
|
|
path: process.argv[2],
|
|
console: {
|
|
business: env.MOSAIC_BUS_CONSOLE_BUSINESS,
|
|
provider: env.MOSAIC_BUS_CONSOLE_PROVIDER,
|
|
iss: env.MOSAIC_BUS_CONSOLE_ISS,
|
|
sub: env.MOSAIC_BUS_CONSOLE_SUB,
|
|
pid: me.pid,
|
|
startTime: me.startTime,
|
|
nonce: env.MOSAIC_BUS_CONSOLE_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;
|
|
}
|