ai 6.0.293 → 6.0.295

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/index.mjs CHANGED
@@ -1224,7 +1224,7 @@ import {
1224
1224
  } from "@ai-sdk/provider-utils";
1225
1225
 
1226
1226
  // src/version.ts
1227
- var VERSION = true ? "6.0.293" : "0.0.0-test";
1227
+ var VERSION = true ? "6.0.295" : "0.0.0-test";
1228
1228
 
1229
1229
  // src/util/download/download.ts
1230
1230
  var download = async ({
@@ -5575,21 +5575,44 @@ function writeToServerResponse({
5575
5575
  response.writeHead(statusCode, headers);
5576
5576
  }
5577
5577
  const reader = stream.getReader();
5578
+ let clientDisconnected = false;
5579
+ let onDisconnect;
5580
+ const handleClose = () => {
5581
+ if (response.writableFinished) {
5582
+ return;
5583
+ }
5584
+ clientDisconnected = true;
5585
+ onDisconnect == null ? void 0 : onDisconnect();
5586
+ reader.cancel(new Error("Client disconnected.")).catch(() => {
5587
+ });
5588
+ };
5589
+ response.once("close", handleClose);
5590
+ if (response.destroyed) {
5591
+ handleClose();
5592
+ }
5578
5593
  const read = async () => {
5579
5594
  try {
5580
5595
  while (true) {
5581
5596
  const { done, value } = await reader.read();
5582
- if (done)
5597
+ if (done || clientDisconnected || response.destroyed)
5583
5598
  break;
5584
5599
  const canContinue = response.write(value);
5585
5600
  if (!canContinue) {
5586
5601
  await new Promise((resolve3) => {
5602
+ onDisconnect = resolve3;
5587
5603
  response.once("drain", resolve3);
5588
5604
  });
5605
+ onDisconnect = void 0;
5589
5606
  }
5590
5607
  }
5591
5608
  } finally {
5592
- response.end();
5609
+ response.off("close", handleClose);
5610
+ if (clientDisconnected || response.destroyed) {
5611
+ reader.cancel().catch(() => {
5612
+ });
5613
+ } else {
5614
+ response.end();
5615
+ }
5593
5616
  }
5594
5617
  };
5595
5618
  return read();
@@ -14417,6 +14440,7 @@ var AbstractChat = class {
14417
14440
  }) {
14418
14441
  this.activeResponse = void 0;
14419
14442
  this.activeResumeRequest = void 0;
14443
+ this.resumableStreamState = void 0;
14420
14444
  this.jobExecutor = new SerialJobExecutor();
14421
14445
  /**
14422
14446
  * Appends or replaces a user message to the chat list. This triggers the API call to fetch
@@ -14696,6 +14720,9 @@ var AbstractChat = class {
14696
14720
  messageId
14697
14721
  }) {
14698
14722
  var _a23, _b, _c;
14723
+ if (trigger !== "resume-stream") {
14724
+ this.resumableStreamState = void 0;
14725
+ }
14699
14726
  const abortController = new AbortController();
14700
14727
  const activeResumeRequest = trigger === "resume-stream" ? { abortController } : void 0;
14701
14728
  if (activeResumeRequest) {
@@ -14723,12 +14750,14 @@ var AbstractChat = class {
14723
14750
  }));
14724
14751
  if (isCurrentRequest()) {
14725
14752
  this.setStatus({ status: "ready" });
14753
+ this.resumableStreamState = void 0;
14726
14754
  }
14727
14755
  clearActiveResumeRequest();
14728
14756
  return;
14729
14757
  }
14730
14758
  if (reconnect == null) {
14731
14759
  this.setStatus({ status: "ready" });
14760
+ this.resumableStreamState = void 0;
14732
14761
  clearActiveResumeRequest();
14733
14762
  return;
14734
14763
  }
@@ -14737,6 +14766,7 @@ var AbstractChat = class {
14737
14766
  if (abortController.signal.aborted || err.name === "AbortError") {
14738
14767
  if (isCurrentRequest()) {
14739
14768
  this.setStatus({ status: "ready" });
14769
+ this.resumableStreamState = void 0;
14740
14770
  }
14741
14771
  clearActiveResumeRequest();
14742
14772
  return;
@@ -14763,7 +14793,7 @@ var AbstractChat = class {
14763
14793
  let activeResponse;
14764
14794
  try {
14765
14795
  const response = {
14766
- state: createStreamingUIMessageState({
14796
+ state: trigger === "resume-stream" && this.resumableStreamState != null ? this.resumableStreamState : createStreamingUIMessageState({
14767
14797
  lastMessage: trigger === "resume-stream" || trigger === "regenerate-message" ? void 0 : this.state.snapshot(responseMessage),
14768
14798
  messageId: this.generateId()
14769
14799
  }),
@@ -14842,17 +14872,26 @@ var AbstractChat = class {
14842
14872
  if (isAbort) {
14843
14873
  if (isCurrentRequest()) {
14844
14874
  this.setStatus({ status: "ready" });
14875
+ if (this.resumableStreamState === response.state) {
14876
+ this.resumableStreamState = void 0;
14877
+ }
14845
14878
  }
14846
14879
  return null;
14847
14880
  }
14848
14881
  if (isCurrentRequest()) {
14849
14882
  this.setStatus({ status: "ready" });
14883
+ if (this.resumableStreamState === response.state) {
14884
+ this.resumableStreamState = void 0;
14885
+ }
14850
14886
  }
14851
14887
  } catch (err) {
14852
14888
  if (isAbort || err.name === "AbortError") {
14853
14889
  isAbort = true;
14854
14890
  if (isCurrentRequest()) {
14855
14891
  this.setStatus({ status: "ready" });
14892
+ if (this.resumableStreamState === (activeResponse == null ? void 0 : activeResponse.state)) {
14893
+ this.resumableStreamState = void 0;
14894
+ }
14856
14895
  }
14857
14896
  return null;
14858
14897
  }
@@ -14863,6 +14902,11 @@ var AbstractChat = class {
14863
14902
  if (err instanceof TypeError && (err.message.toLowerCase().includes("fetch") || err.message.toLowerCase().includes("network"))) {
14864
14903
  isDisconnect = true;
14865
14904
  }
14905
+ if (isDisconnect) {
14906
+ this.resumableStreamState = activeResponse == null ? void 0 : activeResponse.state;
14907
+ } else if (this.resumableStreamState === (activeResponse == null ? void 0 : activeResponse.state)) {
14908
+ this.resumableStreamState = void 0;
14909
+ }
14866
14910
  if (this.onError && err instanceof Error) {
14867
14911
  this.onError(err);
14868
14912
  }