import { parentPort } from "node:worker_threads";

import { decodePacketBaseEnvelope } from "./inbound_gateway.js";

/**
 * Node `worker_threads` gateway worker의 entry다. main thread가 보낸 raw `PacketBase` frame을 off-thread에서
 * decode하고, 결과 envelope을 다시 main thread로 보낸다. decode는 순수 작업이며 공유 상태를 건드리지 않는다.
 *
 * decode된 payload(`data`)는 새로 할당된 owned buffer이므로 transferable로 전달해 clone 복사를 피한다.
 */
interface DecodeRequest {
  id: number;
  bytes: Uint8Array;
}

const port = parentPort;
if (port === null) {
  throw new Error("node_inbound_gateway_worker must run as a worker_threads worker");
}

port.on("message", (req: DecodeRequest) => {
  try {
    const env = decodePacketBaseEnvelope(req.bytes);
    // 갓 디코드된 payload buffer는 owned이므로 transfer해 clone 복사를 줄인다.
    const transfer = env.data.buffer instanceof ArrayBuffer ? [env.data.buffer] : [];
    port.postMessage({ id: req.id, env }, transfer);
  } catch (err) {
    port.postMessage({ id: req.id, error: err instanceof Error ? err.message : String(err) });
  }
});
