@copilotkit/aimock 1.21.0 → 1.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +56 -0
  4. package/README.md +1 -0
  5. package/dist/a2a-mock.cjs +1 -1
  6. package/dist/a2a-mock.cjs.map +1 -1
  7. package/dist/a2a-mock.d.cts.map +1 -1
  8. package/dist/a2a-mock.d.ts.map +1 -1
  9. package/dist/a2a-mock.js +1 -1
  10. package/dist/a2a-mock.js.map +1 -1
  11. package/dist/agui-recorder.cjs +25 -12
  12. package/dist/agui-recorder.cjs.map +1 -1
  13. package/dist/agui-recorder.js +25 -12
  14. package/dist/agui-recorder.js.map +1 -1
  15. package/dist/agui-types.d.cts.map +1 -1
  16. package/dist/aimock-cli.cjs +0 -0
  17. package/dist/aimock-cli.js +0 -0
  18. package/dist/bedrock-converse.cjs +72 -26
  19. package/dist/bedrock-converse.cjs.map +1 -1
  20. package/dist/bedrock-converse.d.cts.map +1 -1
  21. package/dist/bedrock-converse.d.ts.map +1 -1
  22. package/dist/bedrock-converse.js +73 -27
  23. package/dist/bedrock-converse.js.map +1 -1
  24. package/dist/bedrock.cjs +69 -24
  25. package/dist/bedrock.cjs.map +1 -1
  26. package/dist/bedrock.d.cts.map +1 -1
  27. package/dist/bedrock.d.ts.map +1 -1
  28. package/dist/bedrock.js +70 -25
  29. package/dist/bedrock.js.map +1 -1
  30. package/dist/cli.cjs +2 -2
  31. package/dist/cli.cjs.map +1 -1
  32. package/dist/cli.js +2 -2
  33. package/dist/cli.js.map +1 -1
  34. package/dist/cohere.cjs +34 -11
  35. package/dist/cohere.cjs.map +1 -1
  36. package/dist/cohere.d.cts.map +1 -1
  37. package/dist/cohere.d.ts.map +1 -1
  38. package/dist/cohere.js +35 -12
  39. package/dist/cohere.js.map +1 -1
  40. package/dist/config-loader.d.ts.map +1 -1
  41. package/dist/constants.cjs +8 -0
  42. package/dist/constants.cjs.map +1 -0
  43. package/dist/constants.d.cts +8 -0
  44. package/dist/constants.d.cts.map +1 -0
  45. package/dist/constants.d.ts +8 -0
  46. package/dist/constants.d.ts.map +1 -0
  47. package/dist/constants.js +7 -0
  48. package/dist/constants.js.map +1 -0
  49. package/dist/elevenlabs-audio.cjs +46 -20
  50. package/dist/elevenlabs-audio.cjs.map +1 -1
  51. package/dist/elevenlabs-audio.d.cts.map +1 -1
  52. package/dist/elevenlabs-audio.d.ts.map +1 -1
  53. package/dist/elevenlabs-audio.js +47 -21
  54. package/dist/elevenlabs-audio.js.map +1 -1
  55. package/dist/embeddings.cjs +25 -21
  56. package/dist/embeddings.cjs.map +1 -1
  57. package/dist/embeddings.d.cts.map +1 -1
  58. package/dist/embeddings.d.ts.map +1 -1
  59. package/dist/embeddings.js +26 -22
  60. package/dist/embeddings.js.map +1 -1
  61. package/dist/fal-audio.cjs +138 -43
  62. package/dist/fal-audio.cjs.map +1 -1
  63. package/dist/fal-audio.d.cts.map +1 -1
  64. package/dist/fal-audio.d.ts.map +1 -1
  65. package/dist/fal-audio.js +139 -44
  66. package/dist/fal-audio.js.map +1 -1
  67. package/dist/fal.cjs +27 -8
  68. package/dist/fal.cjs.map +1 -1
  69. package/dist/fal.d.cts.map +1 -1
  70. package/dist/fal.d.ts.map +1 -1
  71. package/dist/fal.js +28 -9
  72. package/dist/fal.js.map +1 -1
  73. package/dist/fixture-loader.cjs +9 -1
  74. package/dist/fixture-loader.cjs.map +1 -1
  75. package/dist/fixture-loader.js +9 -1
  76. package/dist/fixture-loader.js.map +1 -1
  77. package/dist/gemini-interactions.cjs +34 -9
  78. package/dist/gemini-interactions.cjs.map +1 -1
  79. package/dist/gemini-interactions.d.cts.map +1 -1
  80. package/dist/gemini-interactions.d.ts.map +1 -1
  81. package/dist/gemini-interactions.js +34 -11
  82. package/dist/gemini-interactions.js.map +1 -1
  83. package/dist/gemini.cjs +50 -21
  84. package/dist/gemini.cjs.map +1 -1
  85. package/dist/gemini.d.cts.map +1 -1
  86. package/dist/gemini.d.ts.map +1 -1
  87. package/dist/gemini.js +51 -22
  88. package/dist/gemini.js.map +1 -1
  89. package/dist/helpers.cjs +82 -8
  90. package/dist/helpers.cjs.map +1 -1
  91. package/dist/helpers.d.cts +7 -0
  92. package/dist/helpers.d.cts.map +1 -1
  93. package/dist/helpers.d.ts +7 -0
  94. package/dist/helpers.d.ts.map +1 -1
  95. package/dist/helpers.js +80 -9
  96. package/dist/helpers.js.map +1 -1
  97. package/dist/images.cjs +31 -10
  98. package/dist/images.cjs.map +1 -1
  99. package/dist/images.d.cts.map +1 -1
  100. package/dist/images.d.ts.map +1 -1
  101. package/dist/images.js +32 -11
  102. package/dist/images.js.map +1 -1
  103. package/dist/index.cjs +2 -1
  104. package/dist/index.d.cts +2 -1
  105. package/dist/index.d.ts +2 -1
  106. package/dist/index.js +2 -1
  107. package/dist/journal.cjs +17 -7
  108. package/dist/journal.cjs.map +1 -1
  109. package/dist/journal.d.cts +2 -3
  110. package/dist/journal.d.cts.map +1 -1
  111. package/dist/journal.d.ts +2 -3
  112. package/dist/journal.d.ts.map +1 -1
  113. package/dist/journal.js +15 -4
  114. package/dist/journal.js.map +1 -1
  115. package/dist/mcp-mock.cjs +1 -1
  116. package/dist/mcp-mock.cjs.map +1 -1
  117. package/dist/mcp-mock.d.cts.map +1 -1
  118. package/dist/mcp-mock.d.ts.map +1 -1
  119. package/dist/mcp-mock.js +1 -1
  120. package/dist/mcp-mock.js.map +1 -1
  121. package/dist/messages.cjs +38 -14
  122. package/dist/messages.cjs.map +1 -1
  123. package/dist/messages.d.cts.map +1 -1
  124. package/dist/messages.d.ts.map +1 -1
  125. package/dist/messages.js +39 -15
  126. package/dist/messages.js.map +1 -1
  127. package/dist/moderation.cjs +3 -2
  128. package/dist/moderation.cjs.map +1 -1
  129. package/dist/moderation.js +3 -2
  130. package/dist/moderation.js.map +1 -1
  131. package/dist/ollama.cjs +69 -22
  132. package/dist/ollama.cjs.map +1 -1
  133. package/dist/ollama.d.cts.map +1 -1
  134. package/dist/ollama.d.ts.map +1 -1
  135. package/dist/ollama.js +70 -23
  136. package/dist/ollama.js.map +1 -1
  137. package/dist/recorder.cjs +89 -41
  138. package/dist/recorder.cjs.map +1 -1
  139. package/dist/recorder.d.cts +3 -2
  140. package/dist/recorder.d.cts.map +1 -1
  141. package/dist/recorder.d.ts +3 -2
  142. package/dist/recorder.d.ts.map +1 -1
  143. package/dist/recorder.js +89 -41
  144. package/dist/recorder.js.map +1 -1
  145. package/dist/rerank.cjs +3 -2
  146. package/dist/rerank.cjs.map +1 -1
  147. package/dist/rerank.js +3 -2
  148. package/dist/rerank.js.map +1 -1
  149. package/dist/responses.cjs +66 -54
  150. package/dist/responses.cjs.map +1 -1
  151. package/dist/responses.d.cts +1 -1
  152. package/dist/responses.d.cts.map +1 -1
  153. package/dist/responses.d.ts +1 -1
  154. package/dist/responses.d.ts.map +1 -1
  155. package/dist/responses.js +67 -55
  156. package/dist/responses.js.map +1 -1
  157. package/dist/search.cjs +3 -2
  158. package/dist/search.cjs.map +1 -1
  159. package/dist/search.js +3 -2
  160. package/dist/search.js.map +1 -1
  161. package/dist/server.cjs +117 -171
  162. package/dist/server.cjs.map +1 -1
  163. package/dist/server.d.cts.map +1 -1
  164. package/dist/server.d.ts.map +1 -1
  165. package/dist/server.js +95 -149
  166. package/dist/server.js.map +1 -1
  167. package/dist/speech.cjs +31 -10
  168. package/dist/speech.cjs.map +1 -1
  169. package/dist/speech.d.cts.map +1 -1
  170. package/dist/speech.d.ts.map +1 -1
  171. package/dist/speech.js +32 -11
  172. package/dist/speech.js.map +1 -1
  173. package/dist/stream-collapse.cjs +51 -21
  174. package/dist/stream-collapse.cjs.map +1 -1
  175. package/dist/stream-collapse.d.cts +1 -0
  176. package/dist/stream-collapse.d.cts.map +1 -1
  177. package/dist/stream-collapse.d.ts +1 -0
  178. package/dist/stream-collapse.d.ts.map +1 -1
  179. package/dist/stream-collapse.js +51 -21
  180. package/dist/stream-collapse.js.map +1 -1
  181. package/dist/transcription.cjs +59 -19
  182. package/dist/transcription.cjs.map +1 -1
  183. package/dist/transcription.d.cts.map +1 -1
  184. package/dist/transcription.d.ts.map +1 -1
  185. package/dist/transcription.js +60 -20
  186. package/dist/transcription.js.map +1 -1
  187. package/dist/types.d.cts +4 -0
  188. package/dist/types.d.cts.map +1 -1
  189. package/dist/types.d.ts +4 -0
  190. package/dist/types.d.ts.map +1 -1
  191. package/dist/vector-mock.cjs +10 -8
  192. package/dist/vector-mock.cjs.map +1 -1
  193. package/dist/vector-mock.d.cts.map +1 -1
  194. package/dist/vector-mock.d.ts.map +1 -1
  195. package/dist/vector-mock.js +10 -8
  196. package/dist/vector-mock.js.map +1 -1
  197. package/dist/vector-types.d.ts.map +1 -1
  198. package/dist/video.cjs +55 -16
  199. package/dist/video.cjs.map +1 -1
  200. package/dist/video.d.cts +8 -1
  201. package/dist/video.d.cts.map +1 -1
  202. package/dist/video.d.ts +8 -1
  203. package/dist/video.d.ts.map +1 -1
  204. package/dist/video.js +56 -17
  205. package/dist/video.js.map +1 -1
  206. package/dist/ws-gemini-live.cjs +40 -31
  207. package/dist/ws-gemini-live.cjs.map +1 -1
  208. package/dist/ws-gemini-live.d.cts +2 -0
  209. package/dist/ws-gemini-live.d.cts.map +1 -1
  210. package/dist/ws-gemini-live.d.ts +2 -0
  211. package/dist/ws-gemini-live.d.ts.map +1 -1
  212. package/dist/ws-gemini-live.js +40 -31
  213. package/dist/ws-gemini-live.js.map +1 -1
  214. package/dist/ws-realtime.cjs +257 -16
  215. package/dist/ws-realtime.cjs.map +1 -1
  216. package/dist/ws-realtime.d.cts +2 -0
  217. package/dist/ws-realtime.d.cts.map +1 -1
  218. package/dist/ws-realtime.d.ts +2 -0
  219. package/dist/ws-realtime.d.ts.map +1 -1
  220. package/dist/ws-realtime.js +257 -16
  221. package/dist/ws-realtime.js.map +1 -1
  222. package/dist/ws-responses.cjs +54 -16
  223. package/dist/ws-responses.cjs.map +1 -1
  224. package/dist/ws-responses.d.cts +2 -0
  225. package/dist/ws-responses.d.cts.map +1 -1
  226. package/dist/ws-responses.d.ts +2 -0
  227. package/dist/ws-responses.d.ts.map +1 -1
  228. package/dist/ws-responses.js +55 -17
  229. package/dist/ws-responses.js.map +1 -1
  230. package/package.json +2 -2
package/dist/server.cjs CHANGED
@@ -113,21 +113,6 @@ const CORS_HEADERS = {
113
113
  function setCorsHeaders(res) {
114
114
  for (const [key, value] of Object.entries(CORS_HEADERS)) res.setHeader(key, value);
115
115
  }
116
- const DEFAULT_MAX_BODY_BYTES = 10 * 1024 * 1024;
117
- async function readBody(req, maxBytes = DEFAULT_MAX_BODY_BYTES) {
118
- const buffers = [];
119
- let totalBytes = 0;
120
- for await (const chunk of req) {
121
- const buf = chunk;
122
- totalBytes += buf.length;
123
- if (totalBytes > maxBytes) {
124
- req.destroy();
125
- throw new Error(`Request body exceeded size limit of ${maxBytes} bytes`);
126
- }
127
- buffers.push(buf);
128
- }
129
- return Buffer.concat(buffers).toString();
130
- }
131
116
  function handleOptions(res) {
132
117
  setCorsHeaders(res);
133
118
  res.writeHead(204);
@@ -162,7 +147,7 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
162
147
  if (subPath === "/fixtures" && req.method === "POST") {
163
148
  let raw;
164
149
  try {
165
- raw = await readBody(req);
150
+ raw = await require_helpers.readBody(req);
166
151
  } catch (err) {
167
152
  const msg = err instanceof Error ? err.message : String(err);
168
153
  defaults.logger.error(`POST /__aimock/fixtures: failed to read body: ${msg}`);
@@ -214,6 +199,8 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
214
199
  videoStates.clear();
215
200
  require_fal_audio.falJobs.clear();
216
201
  require_fal.falQueueStates.clear();
202
+ require_gemini_interactions.resetInteractionCounter();
203
+ require_gemini_interactions.resetEventIdCounter();
217
204
  if (defaults.registry) defaults.registry.setGauge("aimock_fixtures_loaded", {}, fixtures.length);
218
205
  res.writeHead(200, { "Content-Type": "application/json" });
219
206
  res.end(JSON.stringify({ reset: true }));
@@ -222,7 +209,7 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
222
209
  if (subPath === "/error" && req.method === "POST") {
223
210
  let raw;
224
211
  try {
225
- raw = await readBody(req);
212
+ raw = await require_helpers.readBody(req);
226
213
  } catch (err) {
227
214
  const msg = err instanceof Error ? err.message : String(err);
228
215
  defaults.logger.error(`POST /__aimock/error: failed to read body: ${msg}`);
@@ -254,12 +241,17 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
254
241
  }
255
242
  };
256
243
  fixtures.unshift(errorFixture);
244
+ let consumed = false;
257
245
  const original = errorFixture.match.predicate;
258
246
  errorFixture.match.predicate = (req) => {
247
+ if (consumed) return false;
259
248
  const result = original(req);
260
249
  if (result) {
261
- const idx = fixtures.indexOf(errorFixture);
262
- if (idx !== -1) fixtures.splice(idx, 1);
250
+ consumed = true;
251
+ queueMicrotask(() => {
252
+ const idx = fixtures.indexOf(errorFixture);
253
+ if (idx !== -1) fixtures.splice(idx, 1);
254
+ });
263
255
  }
264
256
  return result;
265
257
  };
@@ -274,7 +266,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
274
266
  setCorsHeaders(res);
275
267
  let raw;
276
268
  try {
277
- raw = await readBody(req);
269
+ raw = await require_helpers.readBody(req);
278
270
  } catch (err) {
279
271
  const msg = err instanceof Error ? err.message : "Failed to read request body";
280
272
  journal.add({
@@ -297,7 +289,8 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
297
289
  try {
298
290
  body = JSON.parse(raw);
299
291
  if (modelFallback && !body.model) body.model = modelFallback;
300
- } catch {
292
+ } catch (parseErr) {
293
+ const detail = parseErr instanceof Error ? parseErr.message : "unknown parse error";
301
294
  journal.add({
302
295
  method: req.method ?? "POST",
303
296
  path: req.url ?? COMPLETIONS_PATH,
@@ -309,7 +302,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
309
302
  }
310
303
  });
311
304
  require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
312
- message: "Malformed JSON",
305
+ message: `Malformed JSON: ${detail}`,
313
306
  type: "invalid_request_error",
314
307
  param: null,
315
308
  code: "invalid_json"
@@ -365,6 +358,29 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
365
358
  return;
366
359
  }
367
360
  if (!fixture) {
361
+ if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
362
+ const strictStatus = 503;
363
+ const strictMessage = "Strict mode: no fixture matched";
364
+ defaults.logger.error(`STRICT: No fixture matched for ${req.method ?? "POST"} ${req.url ?? COMPLETIONS_PATH}`);
365
+ journal.add({
366
+ method: req.method ?? "POST",
367
+ path: req.url ?? COMPLETIONS_PATH,
368
+ headers: require_helpers.flattenHeaders(req.headers),
369
+ body,
370
+ response: {
371
+ status: strictStatus,
372
+ fixture: null,
373
+ ...require_helpers.strictOverrideField(defaults.strict, req.headers)
374
+ }
375
+ });
376
+ require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
377
+ message: strictMessage,
378
+ type: "invalid_request_error",
379
+ param: null,
380
+ code: "no_fixture_match"
381
+ } }));
382
+ return;
383
+ }
368
384
  if (defaults.record && providerKey) {
369
385
  const hookOptions = chaosAction === "malformed" ? {
370
386
  beforeWriteResponse: () => {
@@ -372,7 +388,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
372
388
  return true;
373
389
  },
374
390
  onHookBypassed: (reason) => {
375
- defaults.logger.warn(`[chaos] malformed bypassed on proxy: upstream returned SSE (${reason})`);
391
+ defaults.logger.warn(`[chaos] malformed bypassed on proxy: upstream returned streaming response (${reason})`);
376
392
  defaults.registry?.incrementCounter("aimock_chaos_bypassed_total", {
377
393
  action: "malformed",
378
394
  source: "proxy",
@@ -382,7 +398,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
382
398
  } : void 0;
383
399
  const outcome = await require_recorder.proxyAndRecord(req, res, body, providerKey, req.url ?? COMPLETIONS_PATH, fixtures, defaults, raw, hookOptions);
384
400
  if (outcome === "handled_by_hook") return;
385
- if (outcome === "relayed") {
401
+ if (outcome !== "not_configured") {
386
402
  journal.add({
387
403
  method: req.method ?? "POST",
388
404
  path: req.url ?? COMPLETIONS_PATH,
@@ -397,21 +413,19 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
397
413
  return;
398
414
  }
399
415
  }
400
- const strictStatus = defaults.strict ? 503 : 404;
401
- const strictMessage = defaults.strict ? "Strict mode: no fixture matched" : "No fixture matched";
402
- if (defaults.strict) defaults.logger.error(`STRICT: No fixture matched for ${req.method ?? "POST"} ${req.url ?? COMPLETIONS_PATH}`);
403
416
  journal.add({
404
417
  method: req.method ?? "POST",
405
418
  path: req.url ?? COMPLETIONS_PATH,
406
419
  headers: require_helpers.flattenHeaders(req.headers),
407
420
  body,
408
421
  response: {
409
- status: strictStatus,
410
- fixture: null
422
+ status: 404,
423
+ fixture: null,
424
+ ...require_helpers.strictOverrideField(defaults.strict, req.headers)
411
425
  }
412
426
  });
413
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
414
- message: strictMessage,
427
+ require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
428
+ message: "No fixture matched",
415
429
  type: "invalid_request_error",
416
430
  param: null,
417
431
  code: "no_fixture_match"
@@ -433,13 +447,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
433
447
  fixture
434
448
  }
435
449
  });
436
- const errorBody = { error: {
437
- message: response.error.message,
438
- type: response.error.type ?? "server_error",
439
- param: null,
440
- code: response.error.code ?? null
441
- } };
442
- require_sse_writer.writeErrorResponse(res, status, JSON.stringify(errorBody));
450
+ require_sse_writer.writeErrorResponse(res, status, require_helpers.serializeErrorResponse(response));
443
451
  return;
444
452
  }
445
453
  if (require_helpers.isAudioResponse(response)) {
@@ -528,6 +536,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
528
536
  return;
529
537
  }
530
538
  if (require_helpers.isToolCallResponse(response)) {
539
+ if (response.webSearches?.length) defaults.logger.warn("webSearches in fixture response are not supported for Chat Completions API — ignoring");
531
540
  const overrides = require_helpers.extractOverrides(response);
532
541
  const journalEntry = journal.add({
533
542
  method: req.method ?? "POST",
@@ -636,7 +645,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
636
645
  message: msg,
637
646
  type: "server_error"
638
647
  } }));
639
- }
648
+ } else if (!res.writableEnded) res.end();
640
649
  });
641
650
  });
642
651
  async function handleHttpRequest(req, res) {
@@ -770,60 +779,54 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
770
779
  }
771
780
  if (pathname === RESPONSES_PATH && req.method === "POST") {
772
781
  try {
773
- await require_responses.handleResponses(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
782
+ await require_responses.handleResponses(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
774
783
  } catch (err) {
775
784
  const msg = err instanceof Error ? err.message : "Internal error";
776
785
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
777
786
  message: msg,
778
787
  type: "server_error"
779
788
  } }));
780
- else if (!res.writableEnded) {
781
- try {
782
- res.write(`event: error\ndata: ${JSON.stringify({ error: { message: msg } })}\n\n`);
783
- } catch (writeErr) {
784
- logger.debug("Failed to write error recovery response:", writeErr);
785
- }
789
+ else if (!res.writableEnded) try {
790
+ res.write(`event: error\ndata: ${JSON.stringify({ error: { message: msg } })}\n\n`);
786
791
  res.end();
792
+ } catch (writeErr) {
793
+ logger.debug("Failed to write error recovery response:", writeErr);
787
794
  }
788
795
  }
789
796
  return;
790
797
  }
791
798
  if (pathname === MESSAGES_PATH && req.method === "POST") {
792
799
  try {
793
- await require_messages.handleMessages(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
800
+ await require_messages.handleMessages(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
794
801
  } catch (err) {
795
802
  const msg = err instanceof Error ? err.message : "Internal error";
796
803
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
797
804
  message: msg,
798
805
  type: "server_error"
799
806
  } }));
800
- else if (!res.writableEnded) {
801
- try {
802
- res.write(`event: error\ndata: ${JSON.stringify({ error: { message: msg } })}\n\n`);
803
- } catch (writeErr) {
804
- logger.debug("Failed to write error recovery response:", writeErr);
805
- }
807
+ else if (!res.writableEnded) try {
808
+ res.write(`event: error\ndata: ${JSON.stringify({ error: { message: msg } })}\n\n`);
806
809
  res.end();
810
+ } catch (writeErr) {
811
+ logger.debug("Failed to write error recovery response:", writeErr);
807
812
  }
808
813
  }
809
814
  return;
810
815
  }
811
816
  if (pathname === COHERE_CHAT_PATH && req.method === "POST") {
812
817
  try {
813
- await require_cohere.handleCohere(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
818
+ await require_cohere.handleCohere(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
814
819
  } catch (err) {
815
820
  const msg = err instanceof Error ? err.message : "Internal error";
816
821
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
817
822
  message: msg,
818
823
  type: "server_error"
819
824
  } }));
820
- else if (!res.writableEnded) {
821
- try {
822
- res.write(`event: error\ndata: ${JSON.stringify({ error: { message: msg } })}\n\n`);
823
- } catch (writeErr) {
824
- logger.debug("Failed to write error recovery response:", writeErr);
825
- }
825
+ else if (!res.writableEnded) try {
826
+ res.write(`event: error\ndata: ${JSON.stringify({ error: { message: msg } })}\n\n`);
826
827
  res.end();
828
+ } catch (writeErr) {
829
+ logger.debug("Failed to write error recovery response:", writeErr);
827
830
  }
828
831
  }
829
832
  return;
@@ -832,14 +835,16 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
832
835
  try {
833
836
  const deploymentId = azureDeploymentId;
834
837
  const embeddingsProvider = azureDeploymentId ? "azure" : "openai";
835
- let raw = await readBody(req);
838
+ let raw = await require_helpers.readBody(req);
836
839
  if (deploymentId) try {
837
840
  const parsed = JSON.parse(raw);
838
841
  if (!parsed.model) {
839
842
  parsed.model = deploymentId;
840
843
  raw = JSON.stringify(parsed);
841
844
  }
842
- } catch {}
845
+ } catch (err) {
846
+ if (!(err instanceof SyntaxError)) defaults.logger.error(`Unexpected error in Azure model injection: ${err instanceof Error ? err.message : String(err)}`);
847
+ }
843
848
  await require_embeddings.handleEmbeddings(req, res, raw, fixtures, journal, defaults, setCorsHeaders, embeddingsProvider);
844
849
  } catch (err) {
845
850
  const msg = err instanceof Error ? err.message : "Internal error";
@@ -853,7 +858,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
853
858
  }
854
859
  if (pathname === IMAGES_PATH && req.method === "POST") {
855
860
  try {
856
- await require_images.handleImages(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
861
+ await require_images.handleImages(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
857
862
  } catch (err) {
858
863
  const msg = err instanceof Error ? err.message : "Internal error";
859
864
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -866,7 +871,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
866
871
  }
867
872
  if (pathname === SPEECH_PATH && req.method === "POST") {
868
873
  try {
869
- await require_speech.handleSpeech(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
874
+ await require_speech.handleSpeech(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
870
875
  } catch (err) {
871
876
  const msg = err instanceof Error ? err.message : "Internal error";
872
877
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -879,7 +884,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
879
884
  }
880
885
  if (pathname === TRANSCRIPTIONS_PATH && req.method === "POST") {
881
886
  try {
882
- await require_transcription.handleTranscription(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
887
+ await require_transcription.handleTranscription(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
883
888
  } catch (err) {
884
889
  const msg = err instanceof Error ? err.message : "Internal error";
885
890
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -892,7 +897,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
892
897
  }
893
898
  if (pathname === VIDEOS_PATH && req.method === "POST") {
894
899
  try {
895
- await require_video.handleVideoCreate(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders, videoStates);
900
+ await require_video.handleVideoCreate(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders, videoStates);
896
901
  } catch (err) {
897
902
  const msg = err instanceof Error ? err.message : "Internal error";
898
903
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -913,7 +918,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
913
918
  if (geminiPredictMatch && req.method === "POST") {
914
919
  const predictModel = geminiPredictMatch[1];
915
920
  try {
916
- await require_images.handleImages(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders, "gemini", predictModel);
921
+ await require_images.handleImages(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders, "gemini", predictModel);
917
922
  } catch (err) {
918
923
  const msg = err instanceof Error ? err.message : "Internal error";
919
924
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -926,20 +931,18 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
926
931
  }
927
932
  if (pathname === GEMINI_INTERACTIONS_PATH && req.method === "POST") {
928
933
  try {
929
- await require_gemini_interactions.handleGeminiInteractions(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
934
+ await require_gemini_interactions.handleGeminiInteractions(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
930
935
  } catch (err) {
931
936
  const msg = err instanceof Error ? err.message : "Internal error";
932
937
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
933
938
  message: msg,
934
939
  type: "server_error"
935
940
  } }));
936
- else if (!res.writableEnded) {
937
- try {
938
- res.write(`data: ${JSON.stringify({ error: { message: msg } })}\n\n`);
939
- } catch (writeErr) {
940
- logger.debug("Failed to write error recovery response:", writeErr);
941
- }
941
+ else if (!res.writableEnded) try {
942
+ res.write(`data: ${JSON.stringify({ error: { message: msg } })}\n\n`);
942
943
  res.end();
944
+ } catch (writeErr) {
945
+ logger.debug("Failed to write error recovery response:", writeErr);
943
946
  }
944
947
  }
945
948
  return;
@@ -949,20 +952,18 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
949
952
  const geminiModel = geminiMatch[1];
950
953
  const streaming = geminiMatch[2] === "streamGenerateContent";
951
954
  try {
952
- await require_gemini.handleGemini(req, res, await readBody(req), geminiModel, streaming, fixtures, journal, defaults, setCorsHeaders);
955
+ await require_gemini.handleGemini(req, res, await require_helpers.readBody(req), geminiModel, streaming, fixtures, journal, defaults, setCorsHeaders);
953
956
  } catch (err) {
954
957
  const msg = err instanceof Error ? err.message : "Internal error";
955
958
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
956
959
  message: msg,
957
960
  type: "server_error"
958
961
  } }));
959
- else if (!res.writableEnded) {
960
- try {
961
- res.write(`data: ${JSON.stringify({ error: { message: msg } })}\n\n`);
962
- } catch (writeErr) {
963
- logger.debug("Failed to write error recovery response:", writeErr);
964
- }
962
+ else if (!res.writableEnded) try {
963
+ res.write(`data: ${JSON.stringify({ error: { message: msg } })}\n\n`);
965
964
  res.end();
965
+ } catch (writeErr) {
966
+ logger.debug("Failed to write error recovery response:", writeErr);
966
967
  }
967
968
  }
968
969
  return;
@@ -972,20 +973,18 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
972
973
  const vertexModel = vertexMatch[1];
973
974
  const streaming = vertexMatch[2] === "streamGenerateContent";
974
975
  try {
975
- await require_gemini.handleGemini(req, res, await readBody(req), vertexModel, streaming, fixtures, journal, defaults, setCorsHeaders, "vertexai");
976
+ await require_gemini.handleGemini(req, res, await require_helpers.readBody(req), vertexModel, streaming, fixtures, journal, defaults, setCorsHeaders, "vertexai");
976
977
  } catch (err) {
977
978
  const msg = err instanceof Error ? err.message : "Internal error";
978
979
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
979
980
  message: msg,
980
981
  type: "server_error"
981
982
  } }));
982
- else if (!res.writableEnded) {
983
- try {
984
- res.write(`data: ${JSON.stringify({ error: { message: msg } })}\n\n`);
985
- } catch (writeErr) {
986
- logger.debug("Failed to write error recovery response:", writeErr);
987
- }
983
+ else if (!res.writableEnded) try {
984
+ res.write(`data: ${JSON.stringify({ error: { message: msg } })}\n\n`);
988
985
  res.end();
986
+ } catch (writeErr) {
987
+ logger.debug("Failed to write error recovery response:", writeErr);
989
988
  }
990
989
  }
991
990
  return;
@@ -994,7 +993,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
994
993
  if (bedrockMatch && req.method === "POST") {
995
994
  const bedrockModelId = bedrockMatch[1];
996
995
  try {
997
- await require_bedrock.handleBedrock(req, res, await readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
996
+ await require_bedrock.handleBedrock(req, res, await require_helpers.readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
998
997
  } catch (err) {
999
998
  const msg = err instanceof Error ? err.message : "Internal error";
1000
999
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1009,7 +1008,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1009
1008
  if (bedrockStreamMatch && req.method === "POST") {
1010
1009
  const bedrockModelId = bedrockStreamMatch[1];
1011
1010
  try {
1012
- await require_bedrock.handleBedrockStream(req, res, await readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
1011
+ await require_bedrock.handleBedrockStream(req, res, await require_helpers.readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
1013
1012
  } catch (err) {
1014
1013
  const msg = err instanceof Error ? err.message : "Internal error";
1015
1014
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1024,7 +1023,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1024
1023
  if (converseMatch && req.method === "POST") {
1025
1024
  const converseModelId = converseMatch[1];
1026
1025
  try {
1027
- await require_bedrock_converse.handleConverse(req, res, await readBody(req), converseModelId, fixtures, journal, defaults, setCorsHeaders);
1026
+ await require_bedrock_converse.handleConverse(req, res, await require_helpers.readBody(req), converseModelId, fixtures, journal, defaults, setCorsHeaders);
1028
1027
  } catch (err) {
1029
1028
  const msg = err instanceof Error ? err.message : "Internal error";
1030
1029
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1039,7 +1038,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1039
1038
  if (converseStreamMatch && req.method === "POST") {
1040
1039
  const converseStreamModelId = converseStreamMatch[1];
1041
1040
  try {
1042
- await require_bedrock_converse.handleConverseStream(req, res, await readBody(req), converseStreamModelId, fixtures, journal, defaults, setCorsHeaders);
1041
+ await require_bedrock_converse.handleConverseStream(req, res, await require_helpers.readBody(req), converseStreamModelId, fixtures, journal, defaults, setCorsHeaders);
1043
1042
  } catch (err) {
1044
1043
  const msg = err instanceof Error ? err.message : "Internal error";
1045
1044
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1052,7 +1051,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1052
1051
  }
1053
1052
  if (pathname === OLLAMA_CHAT_PATH && req.method === "POST") {
1054
1053
  try {
1055
- await require_ollama.handleOllama(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
1054
+ await require_ollama.handleOllama(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
1056
1055
  } catch (err) {
1057
1056
  const msg = err instanceof Error ? err.message : "Internal error";
1058
1057
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1065,7 +1064,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1065
1064
  }
1066
1065
  if (pathname === OLLAMA_GENERATE_PATH && req.method === "POST") {
1067
1066
  try {
1068
- await require_ollama.handleOllamaGenerate(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
1067
+ await require_ollama.handleOllamaGenerate(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
1069
1068
  } catch (err) {
1070
1069
  const msg = err instanceof Error ? err.message : "Internal error";
1071
1070
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1094,7 +1093,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1094
1093
  }
1095
1094
  if (pathname === SEARCH_PATH && req.method === "POST") {
1096
1095
  try {
1097
- await require_search.handleSearch(req, res, await readBody(req), serviceFixtures?.search ?? [], journal, defaults, setCorsHeaders);
1096
+ await require_search.handleSearch(req, res, await require_helpers.readBody(req), serviceFixtures?.search ?? [], journal, defaults, setCorsHeaders);
1098
1097
  } catch (err) {
1099
1098
  const msg = err instanceof Error ? err.message : "Internal error";
1100
1099
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1107,7 +1106,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1107
1106
  }
1108
1107
  if (pathname === RERANK_PATH && req.method === "POST") {
1109
1108
  try {
1110
- await require_rerank.handleRerank(req, res, await readBody(req), serviceFixtures?.rerank ?? [], journal, defaults, setCorsHeaders);
1109
+ await require_rerank.handleRerank(req, res, await require_helpers.readBody(req), serviceFixtures?.rerank ?? [], journal, defaults, setCorsHeaders);
1111
1110
  } catch (err) {
1112
1111
  const msg = err instanceof Error ? err.message : "Internal error";
1113
1112
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1120,7 +1119,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1120
1119
  }
1121
1120
  if (pathname === MODERATIONS_PATH && req.method === "POST") {
1122
1121
  try {
1123
- await require_moderation.handleModeration(req, res, await readBody(req), serviceFixtures?.moderation ?? [], journal, defaults, setCorsHeaders);
1122
+ await require_moderation.handleModeration(req, res, await require_helpers.readBody(req), serviceFixtures?.moderation ?? [], journal, defaults, setCorsHeaders);
1124
1123
  } catch (err) {
1125
1124
  const msg = err instanceof Error ? err.message : "Internal error";
1126
1125
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1134,21 +1133,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1134
1133
  if (pathname === ELEVENLABS_SOUND_GENERATION_PATH && req.method === "POST") {
1135
1134
  setCorsHeaders(res);
1136
1135
  try {
1137
- const raw = await readBody(req);
1138
- const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1139
- if (chaosAction) {
1140
- require_chaos.applyChaosAction(chaosAction, res, null, journal, {
1141
- method: req.method ?? "POST",
1142
- path: pathname,
1143
- headers: require_helpers.flattenHeaders(req.headers),
1144
- body: {
1145
- model: "",
1146
- messages: []
1147
- }
1148
- }, "fixture", defaults.registry);
1149
- return;
1150
- }
1151
- await require_elevenlabs_audio.handleElevenLabsAudio(req, res, raw, fixtures, defaults, journal, "sound-generation");
1136
+ await require_elevenlabs_audio.handleElevenLabsAudio(req, res, await require_helpers.readBody(req), fixtures, defaults, journal, "sound-generation");
1152
1137
  } catch (err) {
1153
1138
  const msg = err instanceof Error ? err.message : "Internal error";
1154
1139
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1164,21 +1149,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1164
1149
  setCorsHeaders(res);
1165
1150
  const musicSubType = musicMatch[1] ?? "music";
1166
1151
  try {
1167
- const raw = await readBody(req);
1168
- const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1169
- if (chaosAction) {
1170
- require_chaos.applyChaosAction(chaosAction, res, null, journal, {
1171
- method: req.method ?? "POST",
1172
- path: pathname,
1173
- headers: require_helpers.flattenHeaders(req.headers),
1174
- body: {
1175
- model: "",
1176
- messages: []
1177
- }
1178
- }, "fixture", defaults.registry);
1179
- return;
1180
- }
1181
- await require_elevenlabs_audio.handleElevenLabsAudio(req, res, raw, fixtures, defaults, journal, musicSubType);
1152
+ await require_elevenlabs_audio.handleElevenLabsAudio(req, res, await require_helpers.readBody(req), fixtures, defaults, journal, musicSubType);
1182
1153
  } catch (err) {
1183
1154
  const msg = err instanceof Error ? err.message : "Internal error";
1184
1155
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1189,10 +1160,12 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1189
1160
  }
1190
1161
  return;
1191
1162
  }
1163
+ let falBody;
1192
1164
  if (FAL_PREFIX_RE.test(pathname) && req.headers["x-fal-target-host"]) {
1193
1165
  setCorsHeaders(res);
1194
1166
  try {
1195
- const raw = req.method === "POST" || req.method === "PUT" ? await readBody(req) : "";
1167
+ falBody = req.method === "POST" || req.method === "PUT" ? await require_helpers.readBody(req) : "";
1168
+ const raw = falBody;
1196
1169
  const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1197
1170
  if (chaosAction) {
1198
1171
  require_chaos.applyChaosAction(chaosAction, res, null, journal, {
@@ -1220,21 +1193,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1220
1193
  if (pathname.match(FAL_QUEUE_SUBMIT_RE) && req.method === "POST") {
1221
1194
  setCorsHeaders(res);
1222
1195
  try {
1223
- const raw = await readBody(req);
1224
- const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1225
- if (chaosAction) {
1226
- require_chaos.applyChaosAction(chaosAction, res, null, journal, {
1227
- method: req.method ?? "POST",
1228
- path: pathname,
1229
- headers: require_helpers.flattenHeaders(req.headers),
1230
- body: {
1231
- model: "",
1232
- messages: []
1233
- }
1234
- }, "fixture", defaults.registry);
1235
- return;
1236
- }
1237
- await require_fal_audio.handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);
1196
+ await require_fal_audio.handleFalQueue(req, res, falBody ?? await require_helpers.readBody(req), pathname, fixtures, defaults, journal);
1238
1197
  } catch (err) {
1239
1198
  const msg = err instanceof Error ? err.message : "Internal error";
1240
1199
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1248,7 +1207,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1248
1207
  if (pathname.match(FAL_QUEUE_REQUESTS_RE) && (req.method === "GET" || req.method === "POST" || req.method === "PUT")) {
1249
1208
  setCorsHeaders(res);
1250
1209
  try {
1251
- const raw = req.method === "POST" ? await readBody(req) : "{}";
1210
+ const raw = req.method === "POST" || req.method === "PUT" ? falBody ?? await require_helpers.readBody(req) : "{}";
1252
1211
  const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1253
1212
  if (chaosAction) {
1254
1213
  require_chaos.applyChaosAction(chaosAction, res, null, journal, {
@@ -1276,21 +1235,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1276
1235
  if (pathname.match(FAL_RUN_RE) && req.method === "POST") {
1277
1236
  setCorsHeaders(res);
1278
1237
  try {
1279
- const raw = await readBody(req);
1280
- const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1281
- if (chaosAction) {
1282
- require_chaos.applyChaosAction(chaosAction, res, null, journal, {
1283
- method: req.method ?? "POST",
1284
- path: pathname,
1285
- headers: require_helpers.flattenHeaders(req.headers),
1286
- body: {
1287
- model: "",
1288
- messages: []
1289
- }
1290
- }, "fixture", defaults.registry);
1291
- return;
1292
- }
1293
- await require_fal_audio.handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);
1238
+ await require_fal_audio.handleFalQueue(req, res, falBody ?? await require_helpers.readBody(req), pathname, fixtures, defaults, journal);
1294
1239
  } catch (err) {
1295
1240
  const msg = err instanceof Error ? err.message : "Internal error";
1296
1241
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1318,16 +1263,14 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1318
1263
  message: msg,
1319
1264
  type: "server_error"
1320
1265
  } }));
1321
- else if (!res.writableEnded) {
1322
- try {
1323
- res.write(`data: ${JSON.stringify({ error: {
1324
- message: msg,
1325
- type: "server_error"
1326
- } })}\n\n`);
1327
- } catch (writeErr) {
1328
- logger.debug("Failed to write error recovery response:", writeErr);
1329
- }
1266
+ else if (!res.writableEnded) try {
1267
+ res.write(`data: ${JSON.stringify({ error: {
1268
+ message: msg,
1269
+ type: "server_error"
1270
+ } })}\n\n`);
1330
1271
  res.end();
1272
+ } catch (writeErr) {
1273
+ logger.debug("Failed to write error recovery response:", writeErr);
1331
1274
  }
1332
1275
  }
1333
1276
  }
@@ -1376,19 +1319,22 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1376
1319
  if (pathname === RESPONSES_PATH) require_ws_responses.handleWebSocketResponses(ws, fixtures, journal, {
1377
1320
  ...defaults,
1378
1321
  model: "gpt-4",
1379
- testId: wsTestId
1322
+ testId: wsTestId,
1323
+ upgradeHeaders: req.headers
1380
1324
  });
1381
1325
  else if (pathname === REALTIME_PATH) {
1382
1326
  const model = parsedUrl.searchParams.get("model") ?? "gpt-4o-realtime";
1383
1327
  require_ws_realtime.handleWebSocketRealtime(ws, fixtures, journal, {
1384
1328
  ...defaults,
1385
1329
  model,
1386
- testId: wsTestId
1330
+ testId: wsTestId,
1331
+ upgradeHeaders: req.headers
1387
1332
  });
1388
1333
  } else if (pathname === GEMINI_LIVE_PATH) require_ws_gemini_live.handleWebSocketGeminiLive(ws, fixtures, journal, {
1389
1334
  ...defaults,
1390
1335
  model: "gemini-2.0-flash",
1391
- testId: wsTestId
1336
+ testId: wsTestId,
1337
+ upgradeHeaders: req.headers
1392
1338
  });
1393
1339
  }
1394
1340
  const originalClose = server.close.bind(server);