@copilotkit/aimock 1.35.0 → 1.35.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.
package/dist/recorder.js CHANGED
@@ -231,6 +231,7 @@ async function proxyAndRecord(req, res, request, providerKey, pathname, fixtures
231
231
  let hardCeilingExceeded = false;
232
232
  let streamedToClient = false;
233
233
  let clientDisconnected = false;
234
+ let sawDone = false;
234
235
  let frameTimestamps = [];
235
236
  let streamStartTime = 0;
236
237
  const maxProxyBufferBytes = clampMaxBufferBytes(record.maxProxyBufferBytes);
@@ -246,6 +247,7 @@ async function proxyAndRecord(req, res, request, providerKey, pathname, fixtures
246
247
  rawBuffer = result.rawBuffer;
247
248
  streamedToClient = result.streamedToClient;
248
249
  clientDisconnected = result.clientDisconnected;
250
+ sawDone = result.sawDone;
249
251
  frameTimestamps = result.frameTimestamps;
250
252
  streamStartTime = result.streamStartTime;
251
253
  bufferTruncated = result.bufferTruncated;
@@ -400,8 +402,11 @@ async function proxyAndRecord(req, res, request, providerKey, pathname, fixtures
400
402
  } else fixtureResponse = buildFixtureResponse(parsedResponse, upstreamStatus, defaults.logger);
401
403
  }
402
404
  if (clientDisconnected) {
403
- defaults.logger.warn("Client disconnected mid-stream — skipping fixture save to avoid truncated data");
404
- return "relayed";
405
+ if (!sawDone) {
406
+ defaults.logger.warn("Client disconnected mid-stream — skipping fixture save to avoid truncated data");
407
+ return "relayed";
408
+ }
409
+ defaults.logger.warn("Client closed connection before upstream end — upstream response completed, recording full fixture");
405
410
  }
406
411
  let recordedTimings;
407
412
  if (frameTimestamps.length > 1) {
@@ -548,6 +553,7 @@ function makeUpstreamRequest(target, headers, body, clientRes, method = "POST",
548
553
  let binaryFrameBuffer = Buffer.alloc(0);
549
554
  let streamedToClient = false;
550
555
  let clientDisconnected = false;
556
+ let sawDone = false;
551
557
  if (isProgressiveStream && clientRes && !clientRes.headersSent) {
552
558
  const relayHeaders = {
553
559
  "Cache-Control": "no-cache, no-transform",
@@ -563,13 +569,15 @@ function makeUpstreamRequest(target, headers, body, clientRes, method = "POST",
563
569
  clientRes.on("close", () => {
564
570
  if (!clientRes.writableFinished) {
565
571
  clientDisconnected = true;
566
- req.destroy();
567
- res.removeListener("data", onUpstreamData);
568
- chunks.length = 0;
569
- bufferedBytes = 0;
570
- frameTimestamps.length = 0;
571
- frameBuffer = "";
572
- binaryFrameBuffer = Buffer.alloc(0);
572
+ if (!sawDone) {
573
+ req.destroy();
574
+ res.removeListener("data", onUpstreamData);
575
+ chunks.length = 0;
576
+ bufferedBytes = 0;
577
+ frameTimestamps.length = 0;
578
+ frameBuffer = "";
579
+ binaryFrameBuffer = Buffer.alloc(0);
580
+ }
573
581
  }
574
582
  });
575
583
  }
@@ -621,7 +629,11 @@ function makeUpstreamRequest(target, headers, body, clientRes, method = "POST",
621
629
  tripTruncation("frame");
622
630
  break;
623
631
  }
624
- if (parts[fi].trim().length > 0) frameTimestamps.push(Date.now());
632
+ const frame = parts[fi].trim();
633
+ if (frame.length > 0) {
634
+ frameTimestamps.push(Date.now());
635
+ if (frame === "data: [DONE]") sawDone = true;
636
+ }
625
637
  }
626
638
  if (!bufferTruncated) frameBuffer = parts[parts.length - 1];
627
639
  }
@@ -673,7 +685,8 @@ function makeUpstreamRequest(target, headers, body, clientRes, method = "POST",
673
685
  bufferTruncated,
674
686
  truncationCap,
675
687
  totalBytes,
676
- hardCeilingExceeded
688
+ hardCeilingExceeded,
689
+ sawDone
677
690
  });
678
691
  });
679
692
  });