ai 6.0.248 → 6.0.249

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
@@ -1193,7 +1193,7 @@ import {
1193
1193
  } from "@ai-sdk/provider-utils";
1194
1194
 
1195
1195
  // src/version.ts
1196
- var VERSION = true ? "6.0.248" : "0.0.0-test";
1196
+ var VERSION = true ? "6.0.249" : "0.0.0-test";
1197
1197
 
1198
1198
  // src/util/download/download.ts
1199
1199
  var download = async ({
@@ -6517,9 +6517,19 @@ function createAsyncIterableStream(source) {
6517
6517
  // src/util/consume-stream.ts
6518
6518
  async function consumeStream({
6519
6519
  stream,
6520
- onError
6520
+ onError,
6521
+ abortSignal
6521
6522
  }) {
6522
6523
  const reader = stream.getReader();
6524
+ const cancelOnAbort = () => {
6525
+ reader.cancel().catch(() => {
6526
+ });
6527
+ };
6528
+ if (abortSignal == null ? void 0 : abortSignal.aborted) {
6529
+ cancelOnAbort();
6530
+ } else {
6531
+ abortSignal == null ? void 0 : abortSignal.addEventListener("abort", cancelOnAbort, { once: true });
6532
+ }
6523
6533
  try {
6524
6534
  while (true) {
6525
6535
  const { done } = await reader.read();
@@ -6529,6 +6539,7 @@ async function consumeStream({
6529
6539
  } catch (error) {
6530
6540
  onError == null ? void 0 : onError(error);
6531
6541
  } finally {
6542
+ abortSignal == null ? void 0 : abortSignal.removeEventListener("abort", cancelOnAbort);
6532
6543
  reader.releaseLock();
6533
6544
  }
6534
6545
  }
@@ -13653,7 +13664,8 @@ var HttpChatTransport = class {
13653
13664
  const response = await fetch2(api, {
13654
13665
  method: "GET",
13655
13666
  headers,
13656
- credentials
13667
+ credentials,
13668
+ signal: options.abortSignal
13657
13669
  });
13658
13670
  if (response.status === 204) {
13659
13671
  return null;
@@ -13708,6 +13720,7 @@ var AbstractChat = class {
13708
13720
  sendAutomaticallyWhen
13709
13721
  }) {
13710
13722
  this.activeResponse = void 0;
13723
+ this.activeResumeRequest = void 0;
13711
13724
  this.jobExecutor = new SerialJobExecutor();
13712
13725
  /**
13713
13726
  * Appends or replaces a user message to the chat list. This triggers the API call to fetch
@@ -13877,12 +13890,9 @@ var AbstractChat = class {
13877
13890
  * Abort the current request immediately, keep the generated tokens if any.
13878
13891
  */
13879
13892
  this.stop = async () => {
13880
- var _a22;
13881
- if (this.status !== "streaming" && this.status !== "submitted")
13882
- return;
13883
- if ((_a22 = this.activeResponse) == null ? void 0 : _a22.abortController) {
13884
- this.activeResponse.abortController.abort();
13885
- }
13893
+ var _a22, _b;
13894
+ (_a22 = this.activeResumeRequest) == null ? void 0 : _a22.abortController.abort();
13895
+ (_b = this.activeResponse) == null ? void 0 : _b.abortController.abort();
13886
13896
  };
13887
13897
  this.id = id;
13888
13898
  this.transport = transport;
@@ -13946,25 +13956,60 @@ var AbstractChat = class {
13946
13956
  body,
13947
13957
  messageId
13948
13958
  }) {
13949
- var _a22, _b;
13959
+ var _a22, _b, _c;
13960
+ const abortController = new AbortController();
13961
+ const activeResumeRequest = trigger === "resume-stream" ? { abortController } : void 0;
13962
+ if (activeResumeRequest) {
13963
+ (_a22 = this.activeResumeRequest) == null ? void 0 : _a22.abortController.abort();
13964
+ this.activeResumeRequest = activeResumeRequest;
13965
+ }
13966
+ const isCurrentRequest = () => activeResumeRequest == null || this.activeResumeRequest === activeResumeRequest;
13967
+ const clearActiveResumeRequest = () => {
13968
+ if (this.activeResumeRequest === activeResumeRequest) {
13969
+ this.activeResumeRequest = void 0;
13970
+ }
13971
+ };
13950
13972
  let resumeStream;
13951
13973
  if (trigger === "resume-stream") {
13952
13974
  try {
13953
13975
  const reconnect = await this.transport.reconnectToStream({
13954
13976
  chatId: this.id,
13977
+ abortSignal: abortController.signal,
13955
13978
  metadata,
13956
13979
  headers,
13957
13980
  body
13958
13981
  });
13982
+ if (abortController.signal.aborted || !isCurrentRequest()) {
13983
+ await (reconnect == null ? void 0 : reconnect.cancel().catch(() => {
13984
+ }));
13985
+ if (isCurrentRequest()) {
13986
+ this.setStatus({ status: "ready" });
13987
+ }
13988
+ clearActiveResumeRequest();
13989
+ return;
13990
+ }
13959
13991
  if (reconnect == null) {
13992
+ this.setStatus({ status: "ready" });
13993
+ clearActiveResumeRequest();
13960
13994
  return;
13961
13995
  }
13962
13996
  resumeStream = reconnect;
13963
13997
  } catch (err) {
13998
+ if (abortController.signal.aborted || err.name === "AbortError") {
13999
+ if (isCurrentRequest()) {
14000
+ this.setStatus({ status: "ready" });
14001
+ }
14002
+ clearActiveResumeRequest();
14003
+ return;
14004
+ }
14005
+ if (!isCurrentRequest()) {
14006
+ return;
14007
+ }
13964
14008
  if (this.onError && err instanceof Error) {
13965
14009
  this.onError(err);
13966
14010
  }
13967
14011
  this.setStatus({ status: "error", error: err });
14012
+ clearActiveResumeRequest();
13968
14013
  return;
13969
14014
  }
13970
14015
  }
@@ -13980,7 +14025,7 @@ var AbstractChat = class {
13980
14025
  lastMessage: trigger === "regenerate-message" ? void 0 : this.state.snapshot(lastMessage),
13981
14026
  messageId: this.generateId()
13982
14027
  }),
13983
- abortController: new AbortController()
14028
+ abortController
13984
14029
  };
13985
14030
  activeResponse = response;
13986
14031
  response.abortController.signal.addEventListener("abort", () => {
@@ -14004,11 +14049,17 @@ var AbstractChat = class {
14004
14049
  }
14005
14050
  const runUpdateMessageJob = (job) => (
14006
14051
  // serialize the job execution to avoid race conditions:
14007
- this.jobExecutor.run(
14008
- () => job({
14052
+ this.jobExecutor.run(() => {
14053
+ if (response.abortController.signal.aborted) {
14054
+ return Promise.resolve();
14055
+ }
14056
+ return job({
14009
14057
  state: response.state,
14010
14058
  write: () => {
14011
14059
  var _a23;
14060
+ if (response.abortController.signal.aborted) {
14061
+ return;
14062
+ }
14012
14063
  this.setStatus({ status: "streaming" });
14013
14064
  const replaceLastMessage = response.state.message.id === ((_a23 = this.lastMessage) == null ? void 0 : _a23.id);
14014
14065
  if (replaceLastMessage) {
@@ -14020,8 +14071,8 @@ var AbstractChat = class {
14020
14071
  this.state.pushMessage(response.state.message);
14021
14072
  }
14022
14073
  }
14023
- })
14024
- )
14074
+ });
14075
+ })
14025
14076
  );
14026
14077
  await consumeStream({
14027
14078
  stream: processUIMessageStream({
@@ -14035,15 +14086,29 @@ var AbstractChat = class {
14035
14086
  throw error;
14036
14087
  }
14037
14088
  }),
14089
+ abortSignal: response.abortController.signal,
14038
14090
  onError: (error) => {
14039
14091
  throw error;
14040
14092
  }
14041
14093
  });
14042
- this.setStatus({ status: "ready" });
14094
+ if (isAbort) {
14095
+ if (isCurrentRequest()) {
14096
+ this.setStatus({ status: "ready" });
14097
+ }
14098
+ return null;
14099
+ }
14100
+ if (isCurrentRequest()) {
14101
+ this.setStatus({ status: "ready" });
14102
+ }
14043
14103
  } catch (err) {
14044
14104
  if (isAbort || err.name === "AbortError") {
14045
14105
  isAbort = true;
14046
- this.setStatus({ status: "ready" });
14106
+ if (isCurrentRequest()) {
14107
+ this.setStatus({ status: "ready" });
14108
+ }
14109
+ return null;
14110
+ }
14111
+ if (!isCurrentRequest()) {
14047
14112
  return null;
14048
14113
  }
14049
14114
  isError = true;
@@ -14057,7 +14122,7 @@ var AbstractChat = class {
14057
14122
  } finally {
14058
14123
  try {
14059
14124
  if (activeResponse) {
14060
- (_a22 = this.onFinish) == null ? void 0 : _a22.call(this, {
14125
+ (_b = this.onFinish) == null ? void 0 : _b.call(this, {
14061
14126
  message: activeResponse.state.message,
14062
14127
  messages: this.state.messages,
14063
14128
  isAbort,
@@ -14072,11 +14137,12 @@ var AbstractChat = class {
14072
14137
  if (this.activeResponse === activeResponse) {
14073
14138
  this.activeResponse = void 0;
14074
14139
  }
14140
+ clearActiveResumeRequest();
14075
14141
  }
14076
14142
  if (!isError && await this.shouldSendAutomatically()) {
14077
14143
  await this.makeRequest({
14078
14144
  trigger: "submit-message",
14079
- messageId: (_b = this.lastMessage) == null ? void 0 : _b.id,
14145
+ messageId: (_c = this.lastMessage) == null ? void 0 : _c.id,
14080
14146
  metadata,
14081
14147
  headers,
14082
14148
  body