| 363 | } |
| 364 | |
| 365 | async function proxyLocalRequest(config, request) { |
| 366 | const target = new URL(request.path, `${config.localUrl}/`); |
| 367 | if (!target.searchParams.has("simdeckToken")) { |
| 368 | target.searchParams.set("simdeckToken", config.localToken); |
| 369 | } |
| 370 | const headers = new Headers(request.headers || {}); |
| 371 | headers.set("x-simdeck-token", config.localToken); |
| 372 | headers.delete("host"); |
| 373 | headers.delete("content-length"); |
| 374 | const response = await fetch(target, { |
| 375 | body: request.bodyBase64 |
| 376 | ? Buffer.from(request.bodyBase64, "base64") |
| 377 | : undefined, |
| 378 | headers, |
| 379 | method: request.method, |
| 380 | signal: AbortSignal.timeout(config.proxyTimeoutMs), |
| 381 | }); |
| 382 | const responseHeaders = {}; |
| 383 | for (const [name, value] of response.headers.entries()) { |
| 384 | const lower = name.toLowerCase(); |
| 385 | if ( |
| 386 | lower === "connection" || |
| 387 | lower === "content-encoding" || |
| 388 | lower === "content-length" || |
| 389 | lower === "transfer-encoding" |
| 390 | ) { |
| 391 | continue; |
| 392 | } |
| 393 | responseHeaders[name] = value; |
| 394 | } |
| 395 | return { |
| 396 | responseBodyBase64: Buffer.from(await response.arrayBuffer()).toString( |
| 397 | "base64", |
| 398 | ), |
| 399 | responseHeaders, |
| 400 | responseStatus: response.status, |
| 401 | }; |
| 402 | } |
| 403 | |
| 404 | async function completeJob(config, jobId, body) { |
| 405 | return studioJson(config, "/api/actions/provider-hosts/jobs/complete", { |