| 287 | } |
| 288 | |
| 289 | export async function fetchAliceWebRequest(request: Request, child: ChildProcess | null, timeoutMs = 30_000): Promise<Response> { |
| 290 | if (!child || !child.connected) { |
| 291 | return new Response('Alice IPC unavailable', { status: 503 }) |
| 292 | } |
| 293 | const id = randomId() |
| 294 | const method = request.method.toUpperCase() |
| 295 | const body = method === 'GET' || method === 'HEAD' |
| 296 | ? undefined |
| 297 | : Buffer.from(await request.arrayBuffer()) |
| 298 | |
| 299 | return new Promise<Response>((resolvePromise, rejectPromise) => { |
| 300 | const timer = setTimeout(() => { |
| 301 | pendingWebRequests.delete(id) |
| 302 | rejectPromise(new Error(`Alice IPC request timed out: ${method} ${request.url}`)) |
| 303 | }, timeoutMs) |
| 304 | pendingWebRequests.set(id, { resolve: resolvePromise, reject: rejectPromise, timer }) |
| 305 | child.send({ |
| 306 | type: MSG_WEB_REQUEST, |
| 307 | id, |
| 308 | method, |
| 309 | url: request.url, |
| 310 | headers: [...request.headers.entries()], |
| 311 | ...(body ? { body } : {}), |
| 312 | }) |
| 313 | }) |
| 314 | } |
| 315 | |
| 316 | export function handleOpenAliceIpcMessage(raw: unknown): boolean { |
| 317 | const msg = raw && typeof raw === 'object' ? raw as Record<string, unknown> : null |