ai 6.0.293 → 6.0.294

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # ai
2
2
 
3
+ ## 6.0.294
4
+
5
+ ### Patch Changes
6
+
7
+ - 16a04d7: fix(ai): cancel response streams when clients disconnect
8
+ - Updated dependencies [29dc427]
9
+ - @ai-sdk/provider-utils@4.0.56
10
+ - @ai-sdk/gateway@3.0.204
11
+
3
12
  ## 6.0.293
4
13
 
5
14
  ### Patch Changes
package/dist/index.js CHANGED
@@ -1334,7 +1334,7 @@ function detectMediaType({
1334
1334
  var import_provider_utils3 = require("@ai-sdk/provider-utils");
1335
1335
 
1336
1336
  // src/version.ts
1337
- var VERSION = true ? "6.0.293" : "0.0.0-test";
1337
+ var VERSION = true ? "6.0.294" : "0.0.0-test";
1338
1338
 
1339
1339
  // src/util/download/download.ts
1340
1340
  var download = async ({
@@ -5648,21 +5648,44 @@ function writeToServerResponse({
5648
5648
  response.writeHead(statusCode, headers);
5649
5649
  }
5650
5650
  const reader = stream.getReader();
5651
+ let clientDisconnected = false;
5652
+ let onDisconnect;
5653
+ const handleClose = () => {
5654
+ if (response.writableFinished) {
5655
+ return;
5656
+ }
5657
+ clientDisconnected = true;
5658
+ onDisconnect == null ? void 0 : onDisconnect();
5659
+ reader.cancel(new Error("Client disconnected.")).catch(() => {
5660
+ });
5661
+ };
5662
+ response.once("close", handleClose);
5663
+ if (response.destroyed) {
5664
+ handleClose();
5665
+ }
5651
5666
  const read = async () => {
5652
5667
  try {
5653
5668
  while (true) {
5654
5669
  const { done, value } = await reader.read();
5655
- if (done)
5670
+ if (done || clientDisconnected || response.destroyed)
5656
5671
  break;
5657
5672
  const canContinue = response.write(value);
5658
5673
  if (!canContinue) {
5659
5674
  await new Promise((resolve3) => {
5675
+ onDisconnect = resolve3;
5660
5676
  response.once("drain", resolve3);
5661
5677
  });
5678
+ onDisconnect = void 0;
5662
5679
  }
5663
5680
  }
5664
5681
  } finally {
5665
- response.end();
5682
+ response.off("close", handleClose);
5683
+ if (clientDisconnected || response.destroyed) {
5684
+ reader.cancel().catch(() => {
5685
+ });
5686
+ } else {
5687
+ response.end();
5688
+ }
5666
5689
  }
5667
5690
  };
5668
5691
  return read();