@ai-sdk/provider-utils 4.0.49 → 4.0.50

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
@@ -693,24 +693,31 @@ function isAbortError(error) {
693
693
 
694
694
  // src/handle-fetch-error.ts
695
695
  var FETCH_FAILED_ERROR_MESSAGES = ["fetch failed", "failed to fetch"];
696
- var BUN_ERROR_CODES = [
696
+ var RETRYABLE_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
697
697
  "ConnectionRefused",
698
698
  "ConnectionClosed",
699
699
  "FailedToOpenSocket",
700
700
  "ECONNRESET",
701
701
  "ECONNREFUSED",
702
702
  "ETIMEDOUT",
703
- "EPIPE"
704
- ];
705
- function isBunNetworkError(error) {
706
- if (!(error instanceof Error)) {
707
- return false;
708
- }
709
- const code = error.code;
710
- if (typeof code === "string" && BUN_ERROR_CODES.includes(code)) {
711
- return true;
712
- }
713
- return false;
703
+ "EPIPE",
704
+ "UND_ERR_SOCKET",
705
+ "UND_ERR_HEADERS_TIMEOUT",
706
+ "UND_ERR_BODY_TIMEOUT",
707
+ "UND_ERR_CONNECT_TIMEOUT"
708
+ ]);
709
+ function findNetworkError(error) {
710
+ const visited = /* @__PURE__ */ new Set();
711
+ let current = error;
712
+ while (current instanceof Error && !visited.has(current)) {
713
+ visited.add(current);
714
+ const errorWithCode = current;
715
+ if (typeof errorWithCode.code === "string" && RETRYABLE_NETWORK_ERROR_CODES.has(errorWithCode.code)) {
716
+ return errorWithCode;
717
+ }
718
+ current = current.cause;
719
+ }
720
+ return void 0;
714
721
  }
715
722
  function handleFetchError({
716
723
  error,
@@ -733,9 +740,23 @@ function handleFetchError({
733
740
  });
734
741
  }
735
742
  }
736
- if (isBunNetworkError(error)) {
743
+ const networkError = findNetworkError(error);
744
+ if (networkError != null) {
745
+ if (APICallError.isInstance(error)) {
746
+ return new APICallError({
747
+ message: error.message,
748
+ cause: error.cause,
749
+ url: error.url,
750
+ requestBodyValues: error.requestBodyValues,
751
+ statusCode: error.statusCode,
752
+ responseHeaders: error.responseHeaders,
753
+ responseBody: error.responseBody,
754
+ data: error.data,
755
+ isRetryable: true
756
+ });
757
+ }
737
758
  return new APICallError({
738
- message: `Cannot connect to API: ${error.message}`,
759
+ message: `Cannot connect to API: ${error instanceof Error ? error.message : networkError.message}`,
739
760
  cause: error,
740
761
  url,
741
762
  requestBodyValues,
@@ -798,7 +819,7 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
798
819
  }
799
820
 
800
821
  // src/version.ts
801
- var VERSION = true ? "4.0.49" : "0.0.0-test";
822
+ var VERSION = true ? "4.0.50" : "0.0.0-test";
802
823
 
803
824
  // src/get-from-api.ts
804
825
  var getOriginalFetch = () => globalThis.fetch;
@@ -2842,6 +2863,62 @@ async function retryWithExponentialBackoffInternal(f, {
2842
2863
  // src/response-handler.ts
2843
2864
  import { APICallError as APICallError4, EmptyResponseBodyError } from "@ai-sdk/provider";
2844
2865
  var textDecoder = new TextDecoder();
2866
+ function wrapResponseBodyStream({
2867
+ stream,
2868
+ url,
2869
+ requestBodyValues,
2870
+ statusCode,
2871
+ responseHeaders
2872
+ }) {
2873
+ const reader = stream.getReader();
2874
+ let readerReleased = false;
2875
+ const releaseReader = () => {
2876
+ if (!readerReleased) {
2877
+ reader.releaseLock();
2878
+ readerReleased = true;
2879
+ }
2880
+ };
2881
+ return new ReadableStream({
2882
+ async pull(controller) {
2883
+ try {
2884
+ const { done, value } = await reader.read();
2885
+ if (done) {
2886
+ releaseReader();
2887
+ controller.close();
2888
+ } else {
2889
+ controller.enqueue(value);
2890
+ }
2891
+ } catch (error) {
2892
+ releaseReader();
2893
+ if (isAbortError(error)) {
2894
+ controller.error(error);
2895
+ return;
2896
+ }
2897
+ controller.error(
2898
+ handleFetchError({
2899
+ error: new APICallError4({
2900
+ message: "Failed to process successful response",
2901
+ cause: error,
2902
+ statusCode,
2903
+ url,
2904
+ responseHeaders,
2905
+ requestBodyValues
2906
+ }),
2907
+ url,
2908
+ requestBodyValues
2909
+ })
2910
+ );
2911
+ }
2912
+ },
2913
+ async cancel(reason) {
2914
+ try {
2915
+ await reader.cancel(reason);
2916
+ } finally {
2917
+ releaseReader();
2918
+ }
2919
+ }
2920
+ });
2921
+ }
2845
2922
  async function readResponseBodyAsText({
2846
2923
  response,
2847
2924
  url
@@ -2907,7 +2984,7 @@ var createJsonErrorResponseHandler = ({
2907
2984
  };
2908
2985
  }
2909
2986
  };
2910
- var createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {
2987
+ var createEventSourceResponseHandler = (chunkSchema) => async ({ response, url, requestBodyValues }) => {
2911
2988
  const responseHeaders = extractResponseHeaders(response);
2912
2989
  if (response.body == null) {
2913
2990
  throw new EmptyResponseBodyError({});
@@ -2915,7 +2992,13 @@ var createEventSourceResponseHandler = (chunkSchema) => async ({ response }) =>
2915
2992
  return {
2916
2993
  responseHeaders,
2917
2994
  value: parseJsonEventStream({
2918
- stream: response.body,
2995
+ stream: wrapResponseBodyStream({
2996
+ stream: response.body,
2997
+ url,
2998
+ requestBodyValues,
2999
+ statusCode: response.status,
3000
+ responseHeaders
3001
+ }),
2919
3002
  schema: chunkSchema
2920
3003
  })
2921
3004
  };