import assert from "node:assert/strict"; import { INTERACTIVE_SERVICE_TIMEOUT_MS, serviceJson, roleplayService } from "../src/services/product-service-clients.js"; assert.equal(INTERACTIVE_SERVICE_TIMEOUT_MS, 240_000, "interactive service deadline must stay inside the 300s proxy budget"); const originalFetch = globalThis.fetch; const originalTimeout = AbortSignal.timeout; const requests: Request[] = []; let capturedTimeout = 0; AbortSignal.timeout = ((ms: number) => { capturedTimeout = ms; return new AbortController().signal; }) as typeof AbortSignal.timeout; globalThis.fetch = (async (input, init) => { const request = new Request(input, init); requests.push(request); return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "content-type": "application/json" } }); }) as typeof fetch; try { await roleplayService.plan("session-1", "user-1"); assert.equal(new URL(requests[0]!.url).pathname, "/api/v1/roleplays/sessions/session-1/plan"); assert.equal(capturedTimeout, INTERACTIVE_SERVICE_TIMEOUT_MS, "interactive plan calls must use the inner deadline"); requests.length = 0; capturedTimeout = 0; await serviceJson("http://service.test", "/slow", { timeoutMs: 17 }); assert.equal(capturedTimeout, 17); } finally { AbortSignal.timeout = originalTimeout; globalThis.fetch = originalFetch; } console.log("deadline hierarchy tests passed");