@superblocksteam/sdk-api 2.0.165-next.0 → 2.0.166-next.0

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.
Files changed (125) hide show
  1. package/README.md +1 -2
  2. package/dist/errors.d.ts +36 -3
  3. package/dist/errors.d.ts.map +1 -1
  4. package/dist/errors.js +244 -8
  5. package/dist/errors.js.map +1 -1
  6. package/dist/errors.test.d.ts +2 -0
  7. package/dist/errors.test.d.ts.map +1 -0
  8. package/dist/errors.test.js +189 -0
  9. package/dist/errors.test.js.map +1 -0
  10. package/dist/integrations/base/decode-worker-binary-response.d.ts.map +1 -1
  11. package/dist/integrations/base/decode-worker-binary-response.js +2 -5
  12. package/dist/integrations/base/decode-worker-binary-response.js.map +1 -1
  13. package/dist/integrations/base/index.d.ts +2 -1
  14. package/dist/integrations/base/index.d.ts.map +1 -1
  15. package/dist/integrations/base/index.js +1 -0
  16. package/dist/integrations/base/index.js.map +1 -1
  17. package/dist/integrations/base/request-body.d.ts +29 -0
  18. package/dist/integrations/base/request-body.d.ts.map +1 -0
  19. package/dist/integrations/base/request-body.js +238 -0
  20. package/dist/integrations/base/request-body.js.map +1 -0
  21. package/dist/integrations/base/request-body.test.d.ts +2 -0
  22. package/dist/integrations/base/request-body.test.d.ts.map +1 -0
  23. package/dist/integrations/base/request-body.test.js +466 -0
  24. package/dist/integrations/base/request-body.test.js.map +1 -0
  25. package/dist/integrations/base/rest-api-client-base.d.ts.map +1 -1
  26. package/dist/integrations/base/rest-api-client-base.js +15 -14
  27. package/dist/integrations/base/rest-api-client-base.js.map +1 -1
  28. package/dist/integrations/base/rest-api-integration-client.d.ts +2 -2
  29. package/dist/integrations/base/rest-api-integration-client.d.ts.map +1 -1
  30. package/dist/integrations/base/rest-api-integration-client.js +5 -6
  31. package/dist/integrations/base/rest-api-integration-client.js.map +1 -1
  32. package/dist/integrations/base/types.d.ts +55 -11
  33. package/dist/integrations/base/types.d.ts.map +1 -1
  34. package/dist/integrations/base/types.js +7 -0
  35. package/dist/integrations/base/types.js.map +1 -1
  36. package/dist/integrations/cosmosdb/client.d.ts.map +1 -1
  37. package/dist/integrations/cosmosdb/client.js +2 -5
  38. package/dist/integrations/cosmosdb/client.js.map +1 -1
  39. package/dist/integrations/documentation-resolver.test.js +106 -1
  40. package/dist/integrations/documentation-resolver.test.js.map +1 -1
  41. package/dist/integrations/dynamodb/client.d.ts.map +1 -1
  42. package/dist/integrations/dynamodb/client.js +2 -5
  43. package/dist/integrations/dynamodb/client.js.map +1 -1
  44. package/dist/integrations/gcs/client.d.ts.map +1 -1
  45. package/dist/integrations/gcs/client.js +2 -5
  46. package/dist/integrations/gcs/client.js.map +1 -1
  47. package/dist/integrations/gsheets/client.d.ts.map +1 -1
  48. package/dist/integrations/gsheets/client.js +2 -5
  49. package/dist/integrations/gsheets/client.js.map +1 -1
  50. package/dist/integrations/mongodb/client.d.ts.map +1 -1
  51. package/dist/integrations/mongodb/client.js +2 -5
  52. package/dist/integrations/mongodb/client.js.map +1 -1
  53. package/dist/integrations/restapiintegration/client.body-types.test.d.ts +2 -0
  54. package/dist/integrations/restapiintegration/client.body-types.test.d.ts.map +1 -0
  55. package/dist/integrations/restapiintegration/client.body-types.test.js +227 -0
  56. package/dist/integrations/restapiintegration/client.body-types.test.js.map +1 -0
  57. package/dist/integrations/restapiintegration/client.test.js +56 -30
  58. package/dist/integrations/restapiintegration/client.test.js.map +1 -1
  59. package/dist/integrations/s3/client.d.ts.map +1 -1
  60. package/dist/integrations/s3/client.js +2 -5
  61. package/dist/integrations/s3/client.js.map +1 -1
  62. package/dist/integrations/salesforce/client.d.ts.map +1 -1
  63. package/dist/integrations/salesforce/client.js +2 -5
  64. package/dist/integrations/salesforce/client.js.map +1 -1
  65. package/dist/integrations/slack/client.d.ts.map +1 -1
  66. package/dist/integrations/slack/client.js +4 -13
  67. package/dist/integrations/slack/client.js.map +1 -1
  68. package/dist/integrations/slack/client.test.js +20 -0
  69. package/dist/integrations/slack/client.test.js.map +1 -1
  70. package/dist/integrations/utils.d.ts +8 -3
  71. package/dist/integrations/utils.d.ts.map +1 -1
  72. package/dist/integrations/utils.js +42 -1
  73. package/dist/integrations/utils.js.map +1 -1
  74. package/package.json +2 -2
  75. package/src/errors.test.ts +257 -0
  76. package/src/errors.ts +304 -10
  77. package/src/integrations/base/decode-worker-binary-response.ts +5 -7
  78. package/src/integrations/base/index.ts +3 -0
  79. package/src/integrations/base/request-body.test.ts +565 -0
  80. package/src/integrations/base/request-body.ts +392 -0
  81. package/src/integrations/base/rest-api-client-base.ts +24 -19
  82. package/src/integrations/base/rest-api-integration-client.ts +14 -10
  83. package/src/integrations/base/types.ts +66 -11
  84. package/src/integrations/box/README.md +4 -60
  85. package/src/integrations/cosmosdb/client.ts +8 -7
  86. package/src/integrations/documentation-resolver.test.ts +130 -1
  87. package/src/integrations/dropbox/README.md +1 -71
  88. package/src/integrations/dropbox/docs.manifest.json +10 -1
  89. package/src/integrations/dropbox/overlays/upload-unsupported.md +3 -0
  90. package/src/integrations/dropbox/overlays/upload.md +89 -0
  91. package/src/integrations/dynamodb/client.ts +8 -7
  92. package/src/integrations/elasticsearch/README.md +0 -80
  93. package/src/integrations/elasticsearch/docs.manifest.json +10 -1
  94. package/src/integrations/elasticsearch/overlays/bulk-unsupported.md +3 -0
  95. package/src/integrations/elasticsearch/overlays/bulk.md +80 -0
  96. package/src/integrations/gcs/client.ts +8 -7
  97. package/src/integrations/googledrive/README.md +10 -36
  98. package/src/integrations/gsheets/client.ts +8 -7
  99. package/src/integrations/jira/README.md +0 -26
  100. package/src/integrations/jira/docs.manifest.json +10 -1
  101. package/src/integrations/jira/overlays/attachments-unsupported.md +3 -0
  102. package/src/integrations/jira/overlays/attachments.md +30 -0
  103. package/src/integrations/lakebase/README.md +1 -3
  104. package/src/integrations/mongodb/client.ts +8 -7
  105. package/src/integrations/postgres/README.md +1 -3
  106. package/src/integrations/restapiintegration/client.body-types.test.ts +323 -0
  107. package/src/integrations/restapiintegration/client.test.ts +68 -32
  108. package/src/integrations/restapiintegration/docs.manifest.json +8 -0
  109. package/src/integrations/restapiintegration/overlays/request-body-types-unsupported.md +7 -0
  110. package/src/integrations/restapiintegration/overlays/request-body-types.md +115 -0
  111. package/src/integrations/restapiintegration/overlays/response-types-binary.md +4 -8
  112. package/src/integrations/s3/client.ts +8 -7
  113. package/src/integrations/salesforce/client.ts +9 -7
  114. package/src/integrations/slack/client.test.ts +30 -0
  115. package/src/integrations/slack/client.ts +13 -19
  116. package/src/integrations/snowflakepostgres/README.md +1 -3
  117. package/src/integrations/stabilityai/README.md +0 -87
  118. package/src/integrations/stabilityai/docs.manifest.json +10 -1
  119. package/src/integrations/stabilityai/overlays/image-uploads-unsupported.md +3 -0
  120. package/src/integrations/stabilityai/overlays/image-uploads.md +120 -0
  121. package/src/integrations/stripe/README.md +0 -201
  122. package/src/integrations/stripe/docs.manifest.json +10 -1
  123. package/src/integrations/stripe/overlays/request-bodies-unsupported.md +3 -0
  124. package/src/integrations/stripe/overlays/request-bodies.md +204 -0
  125. package/src/integrations/utils.ts +51 -1
package/README.md CHANGED
@@ -629,8 +629,7 @@ export default api({
629
629
  }
630
630
 
631
631
  const department = ctx.user.customClaims["department"] as
632
- | string
633
- | undefined;
632
+ string | undefined;
634
633
 
635
634
  ctx.log.info("Fetching tenant data", {
636
635
  userId: ctx.user.userId,
package/dist/errors.d.ts CHANGED
@@ -1,16 +1,40 @@
1
1
  /**
2
2
  * Error classes for SDK runtime errors.
3
3
  */
4
- import type { z } from "zod";
4
+ import { z } from "zod";
5
5
  export declare const REDACTED_BINARY_RESPONSE_DATA: Readonly<{
6
6
  dataType: "binary";
7
7
  redacted: true;
8
8
  }>;
9
+ export declare function isBinaryData(value: unknown): value is ArrayBuffer | ArrayBufferView;
10
+ /**
11
+ * Key path to the first value inside `data` — including `data` itself —
12
+ * that satisfies `isBinary`, walking into plain objects, arrays, Map keys
13
+ * and values, and Set values. Shares `containsBinary`'s cycle guard and
14
+ * depth cap; a chain deeper than `MAX_BINARY_SCAN_DEPTH` throws the same
15
+ * way.
16
+ */
17
+ export declare function findBinaryDataPath(data: unknown, isBinary: (value: object) => boolean): (string | number)[] | undefined;
18
+ /**
19
+ * Returns a ZodError whose issues never expose binary bytes, so the
20
+ * returned error's own `.message` (JSON.stringify of the issues) is safe
21
+ * to embed in a caller-built error string. Callers must build their
22
+ * message from this return value, not the original `zodError` argument;
23
+ * `restApiValidationErrorFromZodError` does this for `RestApiValidationError`.
24
+ */
25
+ export declare function redactBinaryFromZodError(zodError: z.ZodError): z.ZodError;
9
26
  /**
10
27
  * Error thrown when REST API response or request body validation fails.
11
28
  *
12
- * Contains the complete Zod error object and the actual data that failed validation,
13
- * providing full context for debugging schema mismatches.
29
+ * Contains the actual data that failed validation (redacted when it
30
+ * contains binary) and a Zod error scrubbed of any binary `received`
31
+ * values, providing full context for debugging schema mismatches without
32
+ * leaking bytes into logs or telemetry via `details`.
33
+ *
34
+ * The constructor only scrubs `details`; a `message` built from the raw
35
+ * `ZodError` before construction still carries bytes. Build from a Zod
36
+ * failure through `restApiValidationErrorFromZodError` so `.message` is
37
+ * scrubbed too, not just `details.zodError`.
14
38
  */
15
39
  export declare class RestApiValidationError extends Error {
16
40
  readonly details: {
@@ -22,6 +46,15 @@ export declare class RestApiValidationError extends Error {
22
46
  zodError: z.ZodError;
23
47
  });
24
48
  }
49
+ /**
50
+ * Builds a `RestApiValidationError` from a Zod validation failure. Redacts
51
+ * `zodError` before composing `message`, so the thrown error's `message`
52
+ * can never carry bytes that `details.zodError` already scrubs. This is
53
+ * the only site that needs to reason about redaction order; every caller
54
+ * with a `ZodError` from a `safeParse` failure should use this instead of
55
+ * constructing `RestApiValidationError` directly.
56
+ */
57
+ export declare function restApiValidationErrorFromZodError(prefix: string, zodError: z.ZodError, data: unknown): RestApiValidationError;
25
58
  /**
26
59
  * Error thrown when query results fail schema validation.
27
60
  *
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,eAAO,MAAM,6BAA6B;;;EAGxC,CAAC;AAmBH;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QAChB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;KACtB,CAAC;gBAGA,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;KACtB;CAUJ;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,OAAO,EAAE;QACvB,wDAAwD;QACxD,QAAQ,EAAE,MAAM,CAAC;QACjB,sDAAsD;QACtD,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9D,8CAA8C;QAC9C,GAAG,EAAE,OAAO,CAAC;KACd;gBARD,OAAO,EAAE,MAAM,EACC,OAAO,EAAE;QACvB,wDAAwD;QACxD,QAAQ,EAAE,MAAM,CAAC;QACjB,sDAAsD;QACtD,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9D,8CAA8C;QAC9C,GAAG,EAAE,OAAO,CAAC;KACd;CAOJ;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,OAAO,CAAC,EAAE;QACxB,iCAAiC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,4CAA4C;QAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,+CAA+C;QAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,gDAAgD;QAChD,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;QACtB,gDAAgD;QAChD,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;gBAZD,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE;QACxB,iCAAiC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,4CAA4C;QAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,+CAA+C;QAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,gDAAgD;QAChD,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;QACtB,gDAAgD;QAChD,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,YAAA;CAOJ"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,6BAA6B;;;EAGxC,CAAC;AAUH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,WAAW,GAAG,eAAe,CAExC;AAwCD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GACnC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,CAEjC;AAyHD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAEzE;AA0FD;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QAChB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;KACtB,CAAC;gBAGA,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;KACtB;CAUJ;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,IAAI,EAAE,OAAO,GACZ,sBAAsB,CAMxB;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,OAAO,EAAE;QACvB,wDAAwD;QACxD,QAAQ,EAAE,MAAM,CAAC;QACjB,sDAAsD;QACtD,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9D,8CAA8C;QAC9C,GAAG,EAAE,OAAO,CAAC;KACd;gBARD,OAAO,EAAE,MAAM,EACC,OAAO,EAAE;QACvB,wDAAwD;QACxD,QAAQ,EAAE,MAAM,CAAC;QACjB,sDAAsD;QACtD,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9D,8CAA8C;QAC9C,GAAG,EAAE,OAAO,CAAC;KACd;CAOJ;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,OAAO,CAAC,EAAE;QACxB,iCAAiC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,4CAA4C;QAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,+CAA+C;QAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,gDAAgD;QAChD,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;QACtB,gDAAgD;QAChD,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;gBAZD,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE;QACxB,iCAAiC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,4CAA4C;QAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,+CAA+C;QAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,gDAAgD;QAChD,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;QACtB,gDAAgD;QAChD,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,YAAA;CAOJ"}
package/dist/errors.js CHANGED
@@ -1,30 +1,251 @@
1
1
  /**
2
2
  * Error classes for SDK runtime errors.
3
3
  */
4
+ import { z } from "zod";
4
5
  export const REDACTED_BINARY_RESPONSE_DATA = Object.freeze({
5
6
  dataType: "binary",
6
7
  redacted: true,
7
8
  });
9
+ // Recursion guard for containsBinary/redactBinaryDeep: a cycle is caught by
10
+ // tracking visited objects, but a long non-cyclic chain has no other bound,
11
+ // so it would otherwise recurse until the real call stack overflows at a
12
+ // depth that varies by environment (e.g. the WASM sdk-api sandbox vs. Node).
13
+ // Cap at a fixed depth instead so the failure is deterministic and caught by
14
+ // the try/catch below rather than crashing the walk.
15
+ const MAX_BINARY_SCAN_DEPTH = 100;
16
+ export function isBinaryData(value) {
17
+ return value instanceof ArrayBuffer || ArrayBuffer.isView(value);
18
+ }
8
19
  function isWorkerBufferJson(data) {
9
- if (typeof data !== "object" || data === null) {
10
- return false;
11
- }
12
20
  if (!("data" in data) || !("type" in data)) {
13
21
  return false;
14
22
  }
15
23
  return data.type === "Buffer" && Array.isArray(data.data);
16
24
  }
25
+ function containsBinary(data, seen, depth = 0) {
26
+ if (typeof data !== "object" || data === null)
27
+ return false;
28
+ if (isBinaryData(data) || isWorkerBufferJson(data))
29
+ return true;
30
+ if (seen.has(data))
31
+ return false;
32
+ if (depth >= MAX_BINARY_SCAN_DEPTH) {
33
+ throw new RangeError(`binary scan exceeded depth ${MAX_BINARY_SCAN_DEPTH}`);
34
+ }
35
+ seen.add(data);
36
+ if (Array.isArray(data)) {
37
+ return data.some((item) => containsBinary(item, seen, depth + 1));
38
+ }
39
+ if (data instanceof Map) {
40
+ return ([...data.keys()].some((key) => containsBinary(key, seen, depth + 1)) ||
41
+ [...data.values()].some((value) => containsBinary(value, seen, depth + 1)));
42
+ }
43
+ if (data instanceof Set) {
44
+ return [...data.values()].some((value) => containsBinary(value, seen, depth + 1));
45
+ }
46
+ return Object.keys(data).some((key) => containsBinary(Reflect.get(data, key), seen, depth + 1));
47
+ }
48
+ /**
49
+ * Key path to the first value inside `data` — including `data` itself —
50
+ * that satisfies `isBinary`, walking into plain objects, arrays, Map keys
51
+ * and values, and Set values. Shares `containsBinary`'s cycle guard and
52
+ * depth cap; a chain deeper than `MAX_BINARY_SCAN_DEPTH` throws the same
53
+ * way.
54
+ */
55
+ export function findBinaryDataPath(data, isBinary) {
56
+ return findBinaryDataPathIn(data, isBinary, [], new WeakSet(), 0);
57
+ }
58
+ function findBinaryDataPathIn(data, isBinary, path, seen, depth) {
59
+ if (typeof data !== "object" || data === null)
60
+ return undefined;
61
+ if (isBinary(data))
62
+ return path;
63
+ if (seen.has(data))
64
+ return undefined;
65
+ if (depth >= MAX_BINARY_SCAN_DEPTH) {
66
+ throw new RangeError(`binary scan exceeded depth ${MAX_BINARY_SCAN_DEPTH}`);
67
+ }
68
+ seen.add(data);
69
+ if (Array.isArray(data)) {
70
+ for (let index = 0; index < data.length; index++) {
71
+ const found = findBinaryDataPathIn(data[index], isBinary, [...path, index], seen, depth + 1);
72
+ if (found !== undefined)
73
+ return found;
74
+ }
75
+ return undefined;
76
+ }
77
+ if (data instanceof Map) {
78
+ for (const [key, value] of data) {
79
+ const keyFound = findBinaryDataPathIn(key, isBinary, [...path, "<map-key>"], seen, depth + 1);
80
+ if (keyFound !== undefined)
81
+ return keyFound;
82
+ const valueFound = findBinaryDataPathIn(value, isBinary, [...path, "<map-value>"], seen, depth + 1);
83
+ if (valueFound !== undefined)
84
+ return valueFound;
85
+ }
86
+ return undefined;
87
+ }
88
+ if (data instanceof Set) {
89
+ let index = 0;
90
+ for (const value of data) {
91
+ const found = findBinaryDataPathIn(value, isBinary, [...path, index], seen, depth + 1);
92
+ if (found !== undefined)
93
+ return found;
94
+ index++;
95
+ }
96
+ return undefined;
97
+ }
98
+ for (const key of Object.keys(data)) {
99
+ const found = findBinaryDataPathIn(Reflect.get(data, key), isBinary, [...path, key], seen, depth + 1);
100
+ if (found !== undefined)
101
+ return found;
102
+ }
103
+ return undefined;
104
+ }
105
+ // `invalid_literal` is the only issue whose `received` is the raw input
106
+ // (`unknown`); `invalid_type`/`invalid_enum_value` only ever carry a type
107
+ // name or a string|number enum member, never bytes. `invalid_union` nests a
108
+ // full ZodError per attempted branch. `custom` issues carry an arbitrary
109
+ // caller-defined `params` bag from `ctx.addIssue`, which a hand-written
110
+ // `bodySchema.superRefine()` can populate with anything, including bytes.
111
+ // Either can carry the same binary payloads `containsBinary` detects in
112
+ // `data`, so any message or zodError callers derive from an issue list must
113
+ // be scrubbed the same way.
114
+ function sanitizeZodIssue(issue) {
115
+ if (issue.code === z.ZodIssueCode.invalid_literal &&
116
+ safeContainsBinary(issue.received)) {
117
+ return { ...issue, received: REDACTED_BINARY_RESPONSE_DATA };
118
+ }
119
+ if (issue.code === z.ZodIssueCode.custom &&
120
+ issue.params !== undefined &&
121
+ safeContainsBinary(issue.params)) {
122
+ return { ...issue, params: REDACTED_BINARY_RESPONSE_DATA };
123
+ }
124
+ if (issue.code === z.ZodIssueCode.invalid_union) {
125
+ return {
126
+ ...issue,
127
+ unionErrors: issue.unionErrors.map(redactBinaryFromZodError),
128
+ };
129
+ }
130
+ if (issue.code === z.ZodIssueCode.invalid_arguments) {
131
+ return {
132
+ ...issue,
133
+ argumentsError: redactBinaryFromZodError(issue.argumentsError),
134
+ };
135
+ }
136
+ if (issue.code === z.ZodIssueCode.invalid_return_type) {
137
+ return {
138
+ ...issue,
139
+ returnTypeError: redactBinaryFromZodError(issue.returnTypeError),
140
+ };
141
+ }
142
+ return issue;
143
+ }
144
+ /**
145
+ * Returns a ZodError whose issues never expose binary bytes, so the
146
+ * returned error's own `.message` (JSON.stringify of the issues) is safe
147
+ * to embed in a caller-built error string. Callers must build their
148
+ * message from this return value, not the original `zodError` argument;
149
+ * `restApiValidationErrorFromZodError` does this for `RestApiValidationError`.
150
+ */
151
+ export function redactBinaryFromZodError(zodError) {
152
+ return new z.ZodError(zodError.issues.map(sanitizeZodIssue));
153
+ }
154
+ // A walk that cannot finish (a throwing getter, an unusual structure) fails
155
+ // closed: treat it as binary so every caller redacts rather than risks
156
+ // leaking bytes. Shared by data and zodError redaction so both paths fail
157
+ // the same way.
158
+ function safeContainsBinary(data) {
159
+ try {
160
+ return containsBinary(data, new WeakSet());
161
+ }
162
+ catch {
163
+ return true;
164
+ }
165
+ }
166
+ // Binary can arrive at the top level (binary responses, binary request bodies)
167
+ // or nested inside a multipart body's { value, filename } parts. Only the
168
+ // binary leaf is replaced, not the whole payload, so sibling fields (e.g. a
169
+ // multipart part's `filename`, or an unrelated field in the same body) stay
170
+ // visible for debugging. `seen` maps each visited object to its output
171
+ // container, registered *before* that container is filled in, so a repeat
172
+ // reference to the same object - a second, non-cyclic pointer (one
173
+ // multipart part reused under two keys) or a genuine cycle's back-edge -
174
+ // always resolves to the redacted copy being built, never to the raw
175
+ // original. Only called once `redactBinaryValidationData` has confirmed the
176
+ // payload contains binary somewhere, so every container along the way is
177
+ // rebuilt; reference identity for the no-binary-anywhere case is handled by
178
+ // that caller instead.
179
+ function redactBinaryDeep(data, seen, depth) {
180
+ if (typeof data !== "object" || data === null)
181
+ return data;
182
+ if (isBinaryData(data) || isWorkerBufferJson(data)) {
183
+ return REDACTED_BINARY_RESPONSE_DATA;
184
+ }
185
+ if (seen.has(data))
186
+ return seen.get(data);
187
+ if (depth >= MAX_BINARY_SCAN_DEPTH) {
188
+ throw new RangeError(`binary scan exceeded depth ${MAX_BINARY_SCAN_DEPTH}`);
189
+ }
190
+ if (Array.isArray(data)) {
191
+ const next = [];
192
+ seen.set(data, next);
193
+ for (const item of data) {
194
+ next.push(redactBinaryDeep(item, seen, depth + 1));
195
+ }
196
+ return next;
197
+ }
198
+ if (data instanceof Map) {
199
+ const next = new Map();
200
+ seen.set(data, next);
201
+ for (const [key, value] of data) {
202
+ next.set(redactBinaryDeep(key, seen, depth + 1), redactBinaryDeep(value, seen, depth + 1));
203
+ }
204
+ return next;
205
+ }
206
+ if (data instanceof Set) {
207
+ const next = new Set();
208
+ seen.set(data, next);
209
+ for (const value of data) {
210
+ next.add(redactBinaryDeep(value, seen, depth + 1));
211
+ }
212
+ return next;
213
+ }
214
+ const next = {};
215
+ seen.set(data, next);
216
+ for (const key of Object.keys(data)) {
217
+ next[key] = redactBinaryDeep(Reflect.get(data, key), seen, depth + 1);
218
+ }
219
+ return next;
220
+ }
221
+ // A walk that cannot finish (a throwing getter, an unusual structure, or a
222
+ // depth-capped chain) fails closed: redact the whole payload rather than
223
+ // risk leaking bytes from a partially-completed walk. The `containsBinary`
224
+ // check runs first so a payload with no binary anywhere - including a
225
+ // circular one - comes back as the exact same object, matching how the rest
226
+ // of this module treats data with nothing to redact.
17
227
  function redactBinaryValidationData(data) {
18
- if (data instanceof Uint8Array || isWorkerBufferJson(data)) {
228
+ try {
229
+ if (!containsBinary(data, new WeakSet()))
230
+ return data;
231
+ return redactBinaryDeep(data, new Map(), 0);
232
+ }
233
+ catch {
19
234
  return REDACTED_BINARY_RESPONSE_DATA;
20
235
  }
21
- return data;
22
236
  }
23
237
  /**
24
238
  * Error thrown when REST API response or request body validation fails.
25
239
  *
26
- * Contains the complete Zod error object and the actual data that failed validation,
27
- * providing full context for debugging schema mismatches.
240
+ * Contains the actual data that failed validation (redacted when it
241
+ * contains binary) and a Zod error scrubbed of any binary `received`
242
+ * values, providing full context for debugging schema mismatches without
243
+ * leaking bytes into logs or telemetry via `details`.
244
+ *
245
+ * The constructor only scrubs `details`; a `message` built from the raw
246
+ * `ZodError` before construction still carries bytes. Build from a Zod
247
+ * failure through `restApiValidationErrorFromZodError` so `.message` is
248
+ * scrubbed too, not just `details.zodError`.
28
249
  */
29
250
  export class RestApiValidationError extends Error {
30
251
  details;
@@ -33,11 +254,26 @@ export class RestApiValidationError extends Error {
33
254
  this.name = "RestApiValidationError";
34
255
  this.details = {
35
256
  data: redactBinaryValidationData(details.data),
36
- zodError: details.zodError,
257
+ zodError: redactBinaryFromZodError(details.zodError),
37
258
  };
38
259
  Object.setPrototypeOf(this, RestApiValidationError.prototype);
39
260
  }
40
261
  }
262
+ /**
263
+ * Builds a `RestApiValidationError` from a Zod validation failure. Redacts
264
+ * `zodError` before composing `message`, so the thrown error's `message`
265
+ * can never carry bytes that `details.zodError` already scrubs. This is
266
+ * the only site that needs to reason about redaction order; every caller
267
+ * with a `ZodError` from a `safeParse` failure should use this instead of
268
+ * constructing `RestApiValidationError` directly.
269
+ */
270
+ export function restApiValidationErrorFromZodError(prefix, zodError, data) {
271
+ const sanitized = redactBinaryFromZodError(zodError);
272
+ return new RestApiValidationError(`${prefix}: ${sanitized.message}`, {
273
+ zodError: sanitized,
274
+ data,
275
+ });
276
+ }
41
277
  /**
42
278
  * Error thrown when query results fail schema validation.
43
279
  *
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC,MAAM,CAAC;IACzD,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,SAAS,kBAAkB,CAAC,IAAa;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAa;IAC/C,IAAI,IAAI,YAAY,UAAU,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,6BAA6B,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,OAAO,CAGd;IAEF,YACE,OAAe,EACf,OAGC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAG3B;IAFlB,YACE,OAAe,EACC,OAOf;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QATC,YAAO,GAAP,OAAO,CAOtB;QAGD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,sDAAsD;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,OAWf;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QAbC,YAAO,GAAP,OAAO,CAWtB;QAGD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,sDAAsD;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC,MAAM,CAAC;IACzD,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,6EAA6E;AAC7E,qDAAqD;AACrD,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,MAAM,UAAU,YAAY,CAC1B,KAAc;IAEd,OAAO,KAAK,YAAY,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CACrB,IAAa,EACb,IAAqB,EACrB,KAAK,GAAG,CAAC;IAET,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,KAAK,IAAI,qBAAqB,EAAE,CAAC;QACnC,MAAM,IAAI,UAAU,CAAC,8BAA8B,qBAAqB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,OAAO,CACL,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACpE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAC3E,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACvC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CACvC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACpC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CACxD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAa,EACb,QAAoC;IAEpC,OAAO,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAa,EACb,QAAoC,EACpC,IAAyB,EACzB,IAAqB,EACrB,KAAa;IAEb,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChE,IAAI,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,KAAK,IAAI,qBAAqB,EAAE,CAAC;QACnC,MAAM,IAAI,UAAU,CAAC,8BAA8B,qBAAqB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,oBAAoB,CAChC,IAAI,CAAC,KAAK,CAAC,EACX,QAAQ,EACR,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAChB,IAAI,EACJ,KAAK,GAAG,CAAC,CACV,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,oBAAoB,CACnC,GAAG,EACH,QAAQ,EACR,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,EACtB,IAAI,EACJ,KAAK,GAAG,CAAC,CACV,CAAC;YACF,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAC5C,MAAM,UAAU,GAAG,oBAAoB,CACrC,KAAK,EACL,QAAQ,EACR,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,EACxB,IAAI,EACJ,KAAK,GAAG,CAAC,CACV,CAAC;YACF,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,UAAU,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,oBAAoB,CAChC,KAAK,EACL,QAAQ,EACR,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAChB,IAAI,EACJ,KAAK,GAAG,CAAC,CACV,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACtC,KAAK,EAAE,CAAC;QACV,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,oBAAoB,CAChC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EACtB,QAAQ,EACR,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EACd,IAAI,EACJ,KAAK,GAAG,CAAC,CACV,CAAC;QACF,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,wEAAwE;AACxE,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,0EAA0E;AAC1E,wEAAwE;AACxE,4EAA4E;AAC5E,4BAA4B;AAC5B,SAAS,gBAAgB,CAAC,KAAiB;IACzC,IACE,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,eAAe;QAC7C,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAClC,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,6BAA6B,EAAE,CAAC;IAC/D,CAAC;IACD,IACE,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM;QACpC,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,EAChC,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QAChD,OAAO;YACL,GAAG,KAAK;YACR,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,wBAAwB,CAAC;SAC7D,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;QACpD,OAAO;YACL,GAAG,KAAK;YACR,cAAc,EAAE,wBAAwB,CAAC,KAAK,CAAC,cAAc,CAAC;SAC/D,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC;QACtD,OAAO;YACL,GAAG,KAAK;YACR,eAAe,EAAE,wBAAwB,CAAC,KAAK,CAAC,eAAe,CAAC;SACjE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAoB;IAC3D,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,4EAA4E;AAC5E,uEAAuE;AACvE,0EAA0E;AAC1E,gBAAgB;AAChB,SAAS,kBAAkB,CAAC,IAAa;IACvC,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,uEAAuE;AACvE,0EAA0E;AAC1E,mEAAmE;AACnE,yEAAyE;AACzE,qEAAqE;AACrE,4EAA4E;AAC5E,yEAAyE;AACzE,4EAA4E;AAC5E,uBAAuB;AACvB,SAAS,gBAAgB,CACvB,IAAa,EACb,IAA0B,EAC1B,KAAa;IAEb,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,6BAA6B,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,KAAK,IAAI,qBAAqB,EAAE,CAAC;QACnC,MAAM,IAAI,UAAU,CAAC,8BAA8B,qBAAqB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CACN,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EACtC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CACzC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,YAAY,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,sEAAsE;AACtE,4EAA4E;AAC5E,qDAAqD;AACrD,SAAS,0BAA0B,CAAC,IAAa;IAC/C,IAAI,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACtD,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6BAA6B,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,OAAO,CAGd;IAEF,YACE,OAAe,EACf,OAGC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9C,QAAQ,EAAE,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC;SACrD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kCAAkC,CAChD,MAAc,EACd,QAAoB,EACpB,IAAa;IAEb,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,IAAI,sBAAsB,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,OAAO,EAAE,EAAE;QACnE,QAAQ,EAAE,SAAS;QACnB,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAG3B;IAFlB,YACE,OAAe,EACC,OAOf;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QATC,YAAO,GAAP,OAAO,CAOtB;QAGD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,sDAAsD;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,OAWf;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QAbC,YAAO,GAAP,OAAO,CAWtB;QAGD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,sDAAsD;QACtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../src/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,189 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { z } from "zod";
3
+ import { REDACTED_BINARY_RESPONSE_DATA, RestApiValidationError, redactBinaryFromZodError, } from "./errors.js";
4
+ function validationErrorFor(data) {
5
+ return new RestApiValidationError("validation failed", {
6
+ data,
7
+ zodError: new z.ZodError([]),
8
+ });
9
+ }
10
+ describe("RestApiValidationError", () => {
11
+ it("keeps non-binary data and redacts only the binary leaf", () => {
12
+ expect(validationErrorFor({ amount: 1 }).details.data).toEqual({
13
+ amount: 1,
14
+ });
15
+ const bytes = Uint8Array.from([1, 2, 3]);
16
+ expect(validationErrorFor(bytes).details.data).toBe(REDACTED_BINARY_RESPONSE_DATA);
17
+ expect(validationErrorFor({ file: bytes }).details.data).toEqual({
18
+ file: REDACTED_BINARY_RESPONSE_DATA,
19
+ });
20
+ expect(validationErrorFor([bytes.buffer]).details.data).toEqual([
21
+ REDACTED_BINARY_RESPONSE_DATA,
22
+ ]);
23
+ expect(validationErrorFor({ type: "Buffer", data: [1, 2, 3] }).details.data).toBe(REDACTED_BINARY_RESPONSE_DATA);
24
+ expect(validationErrorFor({
25
+ attachment: { value: new DataView(bytes.buffer), filename: "a.png" },
26
+ note: "hello",
27
+ }).details.data).toEqual({
28
+ attachment: { value: REDACTED_BINARY_RESPONSE_DATA, filename: "a.png" },
29
+ note: "hello",
30
+ });
31
+ });
32
+ it("redacts binary nested inside Map and Set values and keys, keeping siblings", () => {
33
+ const bytes = Uint8Array.from([1, 2, 3]);
34
+ expect(validationErrorFor(new Map([["file", bytes]])).details.data).toEqual(new Map([["file", REDACTED_BINARY_RESPONSE_DATA]]));
35
+ expect(validationErrorFor(new Map([[bytes, "file"]])).details.data).toEqual(new Map([[REDACTED_BINARY_RESPONSE_DATA, "file"]]));
36
+ expect(validationErrorFor(new Set([bytes])).details.data).toEqual(new Set([REDACTED_BINARY_RESPONSE_DATA]));
37
+ expect(validationErrorFor({
38
+ attachments: new Set([{ value: bytes, filename: "a.png" }]),
39
+ }).details.data).toEqual({
40
+ attachments: new Set([
41
+ { value: REDACTED_BINARY_RESPONSE_DATA, filename: "a.png" },
42
+ ]),
43
+ });
44
+ });
45
+ it("keeps circular non-binary data", () => {
46
+ const circular = { amount: 1 };
47
+ circular.self = circular;
48
+ expect(validationErrorFor(circular).details.data).toBe(circular);
49
+ });
50
+ it("redacts binary reached through a second, non-cyclic reference to the same object", () => {
51
+ const bytes = Uint8Array.from([1, 2, 3]);
52
+ const part = { value: bytes, filename: "a.png" };
53
+ const data = { first: part, second: part };
54
+ const result = validationErrorFor(data).details.data;
55
+ expect(result.first).toEqual({
56
+ value: REDACTED_BINARY_RESPONSE_DATA,
57
+ filename: "a.png",
58
+ });
59
+ expect(result.second).toEqual({
60
+ value: REDACTED_BINARY_RESPONSE_DATA,
61
+ filename: "a.png",
62
+ });
63
+ expect(result.second).toBe(result.first);
64
+ });
65
+ it("redacts binary reachable through a self-cycle's back-edge", () => {
66
+ const bytes = Uint8Array.from([1, 2, 3]);
67
+ const data = { bytes };
68
+ data.self = data;
69
+ const result = validationErrorFor(data).details.data;
70
+ expect(result.bytes).toBe(REDACTED_BINARY_RESPONSE_DATA);
71
+ expect(result.self).toBe(result);
72
+ expect(result.self.bytes).toBe(REDACTED_BINARY_RESPONSE_DATA);
73
+ });
74
+ it("redacts binary reachable through a mutual two-object cycle's back-edge", () => {
75
+ const bytes = Uint8Array.from([1, 2, 3]);
76
+ const a = {};
77
+ const b = { bytes, a };
78
+ a.b = b;
79
+ const result = validationErrorFor(a).details.data;
80
+ expect(result.b.bytes).toBe(REDACTED_BINARY_RESPONSE_DATA);
81
+ expect(result.b.a).toBe(result);
82
+ expect(result.b.a.b).toBe(result.b);
83
+ });
84
+ it("fails closed when the binary walk cannot finish", () => {
85
+ const throwingGetter = {
86
+ get secret() {
87
+ throw new Error("getter boom");
88
+ },
89
+ };
90
+ expect(validationErrorFor(throwingGetter).details.data).toBe(REDACTED_BINARY_RESPONSE_DATA);
91
+ });
92
+ it("fails closed when nesting exceeds the binary scan depth cap", () => {
93
+ let deep = { leaf: true };
94
+ for (let i = 0; i < 200; i++) {
95
+ deep = { child: deep };
96
+ }
97
+ expect(validationErrorFor(deep).details.data).toBe(REDACTED_BINARY_RESPONSE_DATA);
98
+ });
99
+ });
100
+ describe("redactBinaryFromZodError", () => {
101
+ it("redacts binary `received` values from invalid_literal issues", () => {
102
+ const bytes = Uint8Array.from([137, 80, 78, 71]);
103
+ const { error } = z.object({ v: z.literal("none") }).safeParse({
104
+ v: bytes,
105
+ });
106
+ const sanitized = redactBinaryFromZodError(error);
107
+ expect(error.message).toContain("137");
108
+ expect(sanitized.message).not.toContain("137");
109
+ expect(sanitized.issues[0]).toMatchObject({
110
+ code: "invalid_literal",
111
+ received: REDACTED_BINARY_RESPONSE_DATA,
112
+ });
113
+ });
114
+ it("redacts binary nested inside invalid_union branch errors", () => {
115
+ const bytes = Uint8Array.from([137, 80, 78, 71]);
116
+ const schema = z.union([z.literal("none"), z.literal("all")]);
117
+ const { error } = schema.safeParse(bytes);
118
+ const sanitized = redactBinaryFromZodError(error);
119
+ expect(sanitized.message).not.toContain("137");
120
+ });
121
+ it("leaves non-binary issues untouched", () => {
122
+ const { error } = z
123
+ .object({ v: z.literal("none") })
124
+ .safeParse({ v: "other" });
125
+ const sanitized = redactBinaryFromZodError(error);
126
+ expect(sanitized.issues).toEqual(error.issues);
127
+ });
128
+ it("fails closed when the invalid_literal received value cannot be walked", () => {
129
+ const throwingGetter = {
130
+ get secret() {
131
+ throw new Error("getter boom");
132
+ },
133
+ };
134
+ const { error } = z.object({ v: z.literal("none") }).safeParse({
135
+ v: throwingGetter,
136
+ });
137
+ const sanitized = redactBinaryFromZodError(error);
138
+ expect(sanitized.issues[0]).toMatchObject({
139
+ code: "invalid_literal",
140
+ received: REDACTED_BINARY_RESPONSE_DATA,
141
+ });
142
+ });
143
+ it("redacts binary carried in a custom issue's params", () => {
144
+ const bytes = Uint8Array.from([137, 80, 78, 71]);
145
+ const schema = z.string().superRefine((_value, ctx) => {
146
+ ctx.addIssue({
147
+ code: z.ZodIssueCode.custom,
148
+ message: "rejected",
149
+ params: { offendingBytes: bytes },
150
+ });
151
+ });
152
+ const { error } = schema.safeParse("anything");
153
+ const sanitized = redactBinaryFromZodError(error);
154
+ expect(sanitized.issues[0]).toMatchObject({
155
+ code: "custom",
156
+ params: REDACTED_BINARY_RESPONSE_DATA,
157
+ });
158
+ });
159
+ it("leaves non-binary custom issue params untouched", () => {
160
+ const schema = z.string().superRefine((_value, ctx) => {
161
+ ctx.addIssue({
162
+ code: z.ZodIssueCode.custom,
163
+ message: "rejected",
164
+ params: { reason: "too short" },
165
+ });
166
+ });
167
+ const { error } = schema.safeParse("anything");
168
+ const sanitized = redactBinaryFromZodError(error);
169
+ expect(sanitized.issues[0]).toMatchObject({
170
+ code: "custom",
171
+ params: { reason: "too short" },
172
+ });
173
+ });
174
+ });
175
+ describe("RestApiValidationError zodError redaction", () => {
176
+ it("scrubs binary from details.zodError even when the caller does not pre-sanitize it", () => {
177
+ const bytes = Uint8Array.from([137, 80, 78, 71]);
178
+ const { error } = z.object({ v: z.literal("none") }).safeParse({
179
+ v: bytes,
180
+ });
181
+ const validationError = new RestApiValidationError("validation failed", {
182
+ data: bytes,
183
+ zodError: error,
184
+ });
185
+ expect(validationError.details.data).toBe(REDACTED_BINARY_RESPONSE_DATA);
186
+ expect(JSON.stringify(validationError.details.zodError.issues)).not.toContain("137");
187
+ });
188
+ });
189
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../src/errors.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"decode-worker-binary-response.d.ts","sourceRoot":"","sources":["../../../src/integrations/base/decode-worker-binary-response.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,6BAA6B,EAE9B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,6BAA6B,EAAE,CAAC;AA0CzC,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAYrE"}
1
+ {"version":3,"file":"decode-worker-binary-response.d.ts","sourceRoot":"","sources":["../../../src/integrations/base/decode-worker-binary-response.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,6BAA6B,EAE9B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,6BAA6B,EAAE,CAAC;AA0CzC,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAUrE"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { REDACTED_BINARY_RESPONSE_DATA, RestApiValidationError, } from "../../errors.js";
2
+ import { REDACTED_BINARY_RESPONSE_DATA, restApiValidationErrorFromZodError, } from "../../errors.js";
3
3
  export { REDACTED_BINARY_RESPONSE_DATA };
4
4
  const workerBinaryResponseSchema = z.union([
5
5
  z.instanceof(Uint8Array).transform((value) => new Uint8Array(value)),
@@ -39,10 +39,7 @@ const workerBinaryResponseSchema = z.union([
39
39
  export function decodeWorkerBinaryResponse(value) {
40
40
  const result = workerBinaryResponseSchema.safeParse(value);
41
41
  if (!result.success) {
42
- throw new RestApiValidationError(`Binary response is malformed: ${result.error.message}`, {
43
- data: REDACTED_BINARY_RESPONSE_DATA,
44
- zodError: result.error,
45
- });
42
+ throw restApiValidationErrorFromZodError("Binary response is malformed", result.error, REDACTED_BINARY_RESPONSE_DATA);
46
43
  }
47
44
  return result.data;
48
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"decode-worker-binary-response.js","sourceRoot":"","sources":["../../../src/integrations/base/decode-worker-binary-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC;IACzC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;SACE,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC1B,CAAC;SACD,SAAS,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC;gBACf,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,CAAC,MAAM,CAAC;aACf,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,IACE,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;gBACvB,IAAI,GAAG,CAAC;gBACR,IAAI,GAAG,GAAG,EACV,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC;oBACf,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;oBAC3B,OAAO,EAAE,4CAA4C;oBACrD,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;iBACtB,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC,KAAK,CAAC;YACjB,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;CACL,CAAC,CAAC;AAEH,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,sBAAsB,CAC9B,iCAAiC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EACvD;YACE,IAAI,EAAE,6BAA6B;YACnC,QAAQ,EAAE,MAAM,CAAC,KAAK;SACvB,CACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"decode-worker-binary-response.js","sourceRoot":"","sources":["../../../src/integrations/base/decode-worker-binary-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC;IACzC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;SACE,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC1B,CAAC;SACD,SAAS,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC;gBACf,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,CAAC,MAAM,CAAC;aACf,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,IACE,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;gBACvB,IAAI,GAAG,CAAC;gBACR,IAAI,GAAG,GAAG,EACV,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC;oBACf,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;oBAC3B,OAAO,EAAE,4CAA4C;oBACrD,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;iBACtB,CAAC,CAAC;gBACH,OAAO,CAAC,CAAC,KAAK,CAAC;YACjB,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;CACL,CAAC,CAAC;AAEH,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,kCAAkC,CACtC,8BAA8B,EAC9B,MAAM,CAAC,KAAK,EACZ,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}