@getpara/web-sdk 3.4.0 → 3.5.1

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.
@@ -15,6 +15,18 @@ export interface Message {
15
15
  workId?: string;
16
16
  __otel?: Record<string, string>;
17
17
  }
18
+ export declare const WORKER_ERROR_RESPONSE_KEY = "__paraWorkerError";
19
+ export interface SerializedWorkerError {
20
+ message: string;
21
+ name: string;
22
+ code?: string;
23
+ status?: number;
24
+ responseURL?: string;
25
+ data?: object;
26
+ stack?: string;
27
+ isParaApiError?: boolean;
28
+ }
29
+ export declare function serializeWorkerError(error: object | string | null | undefined): SerializedWorkerError;
18
30
  /**
19
31
  * Executes an operation with retry capabilities
20
32
  * @param operation The function to execute
@@ -44,7 +44,40 @@ import {
44
44
  paraVersion
45
45
  } from "@getpara/core-sdk";
46
46
  import { classifyMpcError, unwrapMpcError } from "./mpcWorkerError.js";
47
+ const WORKER_ERROR_RESPONSE_KEY = "__paraWorkerError";
47
48
  let wasmLoaded = false;
49
+ function getSerializableError(error) {
50
+ if (error && typeof error === "object") {
51
+ return error;
52
+ }
53
+ return void 0;
54
+ }
55
+ function serializeWorkerError(error) {
56
+ const errorFields = getSerializableError(error);
57
+ if (!errorFields) {
58
+ return {
59
+ message: typeof error === "string" && error ? error : "Worker operation failed",
60
+ name: "Error"
61
+ };
62
+ }
63
+ return __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
64
+ message: typeof errorFields.message === "string" && errorFields.message ? errorFields.message : "Worker operation failed",
65
+ name: typeof errorFields.name === "string" && errorFields.name ? errorFields.name : "Error"
66
+ }, typeof errorFields.code === "string" && { code: errorFields.code }), typeof errorFields.status === "number" && { status: errorFields.status }), typeof errorFields.responseURL === "string" && { responseURL: errorFields.responseURL }), typeof errorFields.data === "object" && errorFields.data !== null && { data: errorFields.data }), typeof errorFields.stack === "string" && { stack: errorFields.stack }), typeof errorFields.isParaApiError === "boolean" && { isParaApiError: errorFields.isParaApiError });
67
+ }
68
+ function isRetryableError(error) {
69
+ const errorFields = getSerializableError(error);
70
+ if (!errorFields) {
71
+ return true;
72
+ }
73
+ if (errorFields.code === "POLICY_DENIED") {
74
+ return false;
75
+ }
76
+ if (typeof errorFields.status === "number" && errorFields.status >= 400 && errorFields.status < 500) {
77
+ return false;
78
+ }
79
+ return true;
80
+ }
48
81
  function tryFetchWasm(url) {
49
82
  return __async(this, null, function* () {
50
83
  const response = yield fetch(url, { mode: "cors" });
@@ -174,7 +207,7 @@ function withRetry(operation, maxRetries = 2, timeoutMs = 1e4) {
174
207
  }
175
208
  } catch (error) {
176
209
  retries++;
177
- if (retries > maxRetries) {
210
+ if (!isRetryableError(error) || retries > maxRetries) {
178
211
  throw error;
179
212
  }
180
213
  console.warn(`Operation failed (attempt ${retries}/${maxRetries}), retrying...`, error);
@@ -280,6 +313,8 @@ function handleMessage(e, postMessage, useFetchAdapter) {
280
313
  });
281
314
  }
282
315
  export {
316
+ WORKER_ERROR_RESPONSE_KEY,
283
317
  handleMessage,
318
+ serializeWorkerError,
284
319
  withRetry
285
320
  };
@@ -3,7 +3,7 @@ import {
3
3
  __async
4
4
  } from "../chunk-YJOFEY2L.js";
5
5
  import { getPortalBaseURL } from "@getpara/core-sdk";
6
- import { handleMessage } from "./worker.js";
6
+ import { handleMessage, WORKER_ERROR_RESPONSE_KEY } from "./worker.js";
7
7
  const CLEAR_WORKER_TIMEOUT_MS = 1e3 * 90;
8
8
  let workerInstance;
9
9
  const resFunctionMap = {};
@@ -15,6 +15,33 @@ function removeWorkId(workId, skipClearTimeout) {
15
15
  }
16
16
  clearTimeout(timeoutId);
17
17
  }
18
+ function deserializeWorkerError(serializedError) {
19
+ const error = new Error(serializedError.message);
20
+ error.name = serializedError.name;
21
+ if (serializedError.stack) {
22
+ error.stack = serializedError.stack;
23
+ }
24
+ if (serializedError.code) {
25
+ error.code = serializedError.code;
26
+ }
27
+ if (typeof serializedError.status === "number") {
28
+ error.status = serializedError.status;
29
+ }
30
+ if (serializedError.responseURL) {
31
+ error.responseURL = serializedError.responseURL;
32
+ }
33
+ if (serializedError.data) {
34
+ error.data = serializedError.data;
35
+ }
36
+ if (typeof serializedError.isParaApiError === "boolean") {
37
+ Object.defineProperty(error, "isParaApiError", {
38
+ value: serializedError.isParaApiError,
39
+ enumerable: true,
40
+ configurable: true
41
+ });
42
+ }
43
+ return error;
44
+ }
18
45
  function setupWorker(ctx, resFunction, errorFunction, workId, errorContext) {
19
46
  return __async(this, null, function* () {
20
47
  if (ctx.disableWorkers) {
@@ -59,9 +86,16 @@ function setupWorker(ctx, resFunction, errorFunction, workId, errorContext) {
59
86
  const workerScriptURL = URL.createObjectURL(workerBlob);
60
87
  workerInstance = new Worker(workerScriptURL);
61
88
  const onmessage = (event) => __async(this, null, function* () {
89
+ var _a, _b;
62
90
  const { workId: messageWorkId } = event.data;
63
91
  delete event.data.workId;
64
92
  if (messageWorkId && resFunctionMap[messageWorkId]) {
93
+ const workerError = event.data[WORKER_ERROR_RESPONSE_KEY];
94
+ if (workerError) {
95
+ (_b = (_a = resFunctionMap[messageWorkId]).errorFn) == null ? void 0 : _b.call(_a, deserializeWorkerError(workerError));
96
+ removeWorkId(messageWorkId);
97
+ return;
98
+ }
65
99
  yield resFunctionMap[messageWorkId].fn(event.data);
66
100
  removeWorkId(messageWorkId);
67
101
  }
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@getpara/web-sdk",
3
- "version": "3.4.0",
3
+ "version": "3.5.1",
4
4
  "dependencies": {
5
- "@getpara/core-sdk": "3.4.0",
6
- "@getpara/user-management-client": "3.4.0",
5
+ "@getpara/core-sdk": "3.5.1",
6
+ "@getpara/user-management-client": "3.5.1",
7
7
  "@opentelemetry/api": "^1.9.1",
8
8
  "base64url": "^3.0.1",
9
9
  "buffer": "6.0.3",
@@ -30,7 +30,7 @@
30
30
  "dist",
31
31
  "package.json"
32
32
  ],
33
- "gitHead": "795829c50bb71817a84bdbf5e6561ca4df3a827d",
33
+ "gitHead": "362fc377edf3cca5f743679498ff4908921c8468",
34
34
  "main": "dist/index.js",
35
35
  "scripts": {
36
36
  "build": "rm -rf dist && yarn typegen && node ./scripts/build.mjs && yarn post-build",