ai 5.0.267 → 5.0.269

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
@@ -727,7 +727,7 @@ import {
727
727
  } from "@ai-sdk/provider-utils";
728
728
 
729
729
  // src/version.ts
730
- var VERSION = true ? "5.0.267" : "0.0.0-test";
730
+ var VERSION = true ? "5.0.269" : "0.0.0-test";
731
731
 
732
732
  // src/util/download/download.ts
733
733
  var download = async ({
@@ -2935,21 +2935,44 @@ function writeToServerResponse({
2935
2935
  response.writeHead(statusCode, headers);
2936
2936
  }
2937
2937
  const reader = stream.getReader();
2938
+ let clientDisconnected = false;
2939
+ let onDisconnect;
2940
+ const handleClose = () => {
2941
+ if (response.writableFinished) {
2942
+ return;
2943
+ }
2944
+ clientDisconnected = true;
2945
+ onDisconnect == null ? void 0 : onDisconnect();
2946
+ reader.cancel(new Error("Client disconnected.")).catch(() => {
2947
+ });
2948
+ };
2949
+ response.once("close", handleClose);
2950
+ if (response.destroyed) {
2951
+ handleClose();
2952
+ }
2938
2953
  const read = async () => {
2939
2954
  try {
2940
2955
  while (true) {
2941
2956
  const { done, value } = await reader.read();
2942
- if (done)
2957
+ if (done || clientDisconnected || response.destroyed)
2943
2958
  break;
2944
2959
  const canContinue = response.write(value);
2945
2960
  if (!canContinue) {
2946
2961
  await new Promise((resolve2) => {
2962
+ onDisconnect = resolve2;
2947
2963
  response.once("drain", resolve2);
2948
2964
  });
2965
+ onDisconnect = void 0;
2949
2966
  }
2950
2967
  }
2951
2968
  } finally {
2952
- response.end();
2969
+ response.off("close", handleClose);
2970
+ if (clientDisconnected || response.destroyed) {
2971
+ reader.cancel().catch(() => {
2972
+ });
2973
+ } else {
2974
+ response.end();
2975
+ }
2953
2976
  }
2954
2977
  };
2955
2978
  return read();
@@ -8748,28 +8771,51 @@ function smoothStream({
8748
8771
  return () => {
8749
8772
  let buffer = "";
8750
8773
  let id = "";
8774
+ let providerMetadata;
8775
+ function flushBuffer(controller) {
8776
+ if (buffer.length > 0 || providerMetadata != null) {
8777
+ controller.enqueue({
8778
+ type: "text-delta",
8779
+ text: buffer,
8780
+ id,
8781
+ ...providerMetadata != null ? { providerMetadata } : {}
8782
+ });
8783
+ buffer = "";
8784
+ providerMetadata = void 0;
8785
+ }
8786
+ }
8751
8787
  return new TransformStream({
8752
8788
  async transform(chunk, controller) {
8753
8789
  if (chunk.type !== "text-delta") {
8754
- if (buffer.length > 0) {
8755
- controller.enqueue({ type: "text-delta", text: buffer, id });
8756
- buffer = "";
8757
- }
8790
+ flushBuffer(controller);
8758
8791
  controller.enqueue(chunk);
8759
8792
  return;
8760
8793
  }
8761
- if (chunk.id !== id && buffer.length > 0) {
8762
- controller.enqueue({ type: "text-delta", text: buffer, id });
8763
- buffer = "";
8794
+ if (chunk.text.length === 0 && chunk.providerMetadata != null) {
8795
+ flushBuffer(controller);
8796
+ controller.enqueue(chunk);
8797
+ return;
8798
+ }
8799
+ if (buffer.length > 0 && (chunk.id !== id || providerMetadata != null || chunk.providerMetadata != null)) {
8800
+ flushBuffer(controller);
8764
8801
  }
8765
8802
  buffer += chunk.text;
8766
8803
  id = chunk.id;
8804
+ providerMetadata = chunk.providerMetadata;
8767
8805
  let match;
8768
8806
  while ((match = detectChunk(buffer)) != null) {
8769
- controller.enqueue({ type: "text-delta", text: match, id });
8807
+ controller.enqueue({
8808
+ type: "text-delta",
8809
+ text: match,
8810
+ id,
8811
+ ...providerMetadata != null ? { providerMetadata } : {}
8812
+ });
8770
8813
  buffer = buffer.slice(match.length);
8771
8814
  await delay2(isDocumentHidden() ? null : delayInMs);
8772
8815
  }
8816
+ if (buffer.length === 0) {
8817
+ providerMetadata = void 0;
8818
+ }
8773
8819
  }
8774
8820
  });
8775
8821
  };
@@ -9737,6 +9783,7 @@ var AbstractChat = class {
9737
9783
  }) {
9738
9784
  this.activeResponse = void 0;
9739
9785
  this.activeResumeRequest = void 0;
9786
+ this.resumableStreamState = void 0;
9740
9787
  this.jobExecutor = new SerialJobExecutor();
9741
9788
  /**
9742
9789
  * Appends or replaces a user message to the chat list. This triggers the API call to fetch
@@ -9932,6 +9979,9 @@ var AbstractChat = class {
9932
9979
  messageId
9933
9980
  }) {
9934
9981
  var _a16, _b, _c, _d;
9982
+ if (trigger !== "resume-stream") {
9983
+ this.resumableStreamState = void 0;
9984
+ }
9935
9985
  const abortController = new AbortController();
9936
9986
  const activeResumeRequest = trigger === "resume-stream" ? { abortController } : void 0;
9937
9987
  if (activeResumeRequest) {
@@ -9952,7 +10002,7 @@ var AbstractChat = class {
9952
10002
  let activeResponse;
9953
10003
  try {
9954
10004
  const response = {
9955
- state: createStreamingUIMessageState({
10005
+ state: trigger === "resume-stream" && this.resumableStreamState != null ? this.resumableStreamState : createStreamingUIMessageState({
9956
10006
  lastMessage: trigger === "resume-stream" ? void 0 : this.state.snapshot(lastMessage),
9957
10007
  messageId: this.generateId()
9958
10008
  }),
@@ -9977,12 +10027,14 @@ var AbstractChat = class {
9977
10027
  }));
9978
10028
  if (isCurrentRequest()) {
9979
10029
  this.setStatus({ status: "ready" });
10030
+ this.resumableStreamState = void 0;
9980
10031
  }
9981
10032
  return;
9982
10033
  }
9983
10034
  if (reconnect == null) {
9984
10035
  if (isCurrentRequest()) {
9985
10036
  this.setStatus({ status: "ready" });
10037
+ this.resumableStreamState = void 0;
9986
10038
  }
9987
10039
  return;
9988
10040
  }
@@ -10048,17 +10100,26 @@ var AbstractChat = class {
10048
10100
  if (isAbort) {
10049
10101
  if (isCurrentRequest()) {
10050
10102
  this.setStatus({ status: "ready" });
10103
+ if (this.resumableStreamState === response.state) {
10104
+ this.resumableStreamState = void 0;
10105
+ }
10051
10106
  }
10052
10107
  return null;
10053
10108
  }
10054
10109
  if (isCurrentRequest()) {
10055
10110
  this.setStatus({ status: "ready" });
10111
+ if (this.resumableStreamState === response.state) {
10112
+ this.resumableStreamState = void 0;
10113
+ }
10056
10114
  }
10057
10115
  } catch (err) {
10058
10116
  if (isAbort || err.name === "AbortError") {
10059
10117
  isAbort = true;
10060
10118
  if (isCurrentRequest()) {
10061
10119
  this.setStatus({ status: "ready" });
10120
+ if (this.resumableStreamState === (activeResponse == null ? void 0 : activeResponse.state)) {
10121
+ this.resumableStreamState = void 0;
10122
+ }
10062
10123
  }
10063
10124
  return null;
10064
10125
  }
@@ -10069,6 +10130,11 @@ var AbstractChat = class {
10069
10130
  if (err instanceof TypeError && (err.message.toLowerCase().includes("fetch") || err.message.toLowerCase().includes("network"))) {
10070
10131
  isDisconnect = true;
10071
10132
  }
10133
+ if (isDisconnect) {
10134
+ this.resumableStreamState = activeResponse == null ? void 0 : activeResponse.state;
10135
+ } else if (this.resumableStreamState === (activeResponse == null ? void 0 : activeResponse.state)) {
10136
+ this.resumableStreamState = void 0;
10137
+ }
10072
10138
  if (this.onError && err instanceof Error) {
10073
10139
  this.onError(err);
10074
10140
  }