#!/usr/bin/env node
'use strict';
// Test transport only: exact one-shot product Worker executes the sole core.
// This is NOT a browser Worker and does not attest browser CSP, cancellation or downloads.
const {Worker}=require('worker_threads'),path=require('path');
function decode(p){switch(p[0]){case 'null':return null;case 'string':case 'boolean':case 'number':return p[1];case 'array':return p[1].map(decode);case 'object':return Object.fromEntries(p[1].map(([k,v])=>[k,decode(v)]));case 'bytes':{const b=Buffer.from(p[1],'base64');return b.buffer.slice(b.byteOffset,b.byteOffset+b.byteLength);}default:throw Error('Неизвестный вид тестового транспорта');}}
function encode(v){if(v===null)return ['null'];if(v instanceof ArrayBuffer)return ['bytes',Buffer.from(v).toString('base64')];if(ArrayBuffer.isView(v))return ['bytes',Buffer.from(v.buffer,v.byteOffset,v.byteLength).toString('base64')];if(Array.isArray(v))return ['array',v.map(encode)];if(typeof v==='object')return ['object',Object.entries(v).map(([k,x])=>[k,encode(x)])];if(['string','number','boolean'].includes(typeof v))return [typeof v,v];throw Error('Непереносимый вид результата');}
let input='';process.stdin.setEncoding('utf8');process.stdin.on('data',s=>{input+=s;if(input.length>64*1024*1024)throw Error('Предел тестового транспорта');});
process.stdin.on('end',()=>{let w;const messages=[];let done=false;const timer=setTimeout(()=>finish(Error('Таймаут моста 60 секунд')),60000);async function finish(error){if(done)return;done=true;clearTimeout(timer);if(w)await w.terminate();if(error){console.error(error.stack||error);process.exitCode=1;}else process.stdout.write(JSON.stringify(messages));}
 try{const m=decode(JSON.parse(input));w=new Worker(path.resolve(__dirname,'../ресурсы/сценарии/поток-доказательного-контура.js'));w.on('message',x=>{messages.push(encode(x));if(x.type==='result'||x.type==='error')finish();});w.on('error',finish);w.postMessage(m);}catch(e){finish(e);}
});
