@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.
- package/README.md +1 -2
- package/dist/errors.d.ts +36 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +244 -8
- package/dist/errors.js.map +1 -1
- package/dist/errors.test.d.ts +2 -0
- package/dist/errors.test.d.ts.map +1 -0
- package/dist/errors.test.js +189 -0
- package/dist/errors.test.js.map +1 -0
- package/dist/integrations/base/decode-worker-binary-response.d.ts.map +1 -1
- package/dist/integrations/base/decode-worker-binary-response.js +2 -5
- package/dist/integrations/base/decode-worker-binary-response.js.map +1 -1
- package/dist/integrations/base/index.d.ts +2 -1
- package/dist/integrations/base/index.d.ts.map +1 -1
- package/dist/integrations/base/index.js +1 -0
- package/dist/integrations/base/index.js.map +1 -1
- package/dist/integrations/base/request-body.d.ts +29 -0
- package/dist/integrations/base/request-body.d.ts.map +1 -0
- package/dist/integrations/base/request-body.js +238 -0
- package/dist/integrations/base/request-body.js.map +1 -0
- package/dist/integrations/base/request-body.test.d.ts +2 -0
- package/dist/integrations/base/request-body.test.d.ts.map +1 -0
- package/dist/integrations/base/request-body.test.js +466 -0
- package/dist/integrations/base/request-body.test.js.map +1 -0
- package/dist/integrations/base/rest-api-client-base.d.ts.map +1 -1
- package/dist/integrations/base/rest-api-client-base.js +15 -14
- package/dist/integrations/base/rest-api-client-base.js.map +1 -1
- package/dist/integrations/base/rest-api-integration-client.d.ts +2 -2
- package/dist/integrations/base/rest-api-integration-client.d.ts.map +1 -1
- package/dist/integrations/base/rest-api-integration-client.js +5 -6
- package/dist/integrations/base/rest-api-integration-client.js.map +1 -1
- package/dist/integrations/base/types.d.ts +55 -11
- package/dist/integrations/base/types.d.ts.map +1 -1
- package/dist/integrations/base/types.js +7 -0
- package/dist/integrations/base/types.js.map +1 -1
- package/dist/integrations/cosmosdb/client.d.ts.map +1 -1
- package/dist/integrations/cosmosdb/client.js +2 -5
- package/dist/integrations/cosmosdb/client.js.map +1 -1
- package/dist/integrations/documentation-resolver.test.js +106 -1
- package/dist/integrations/documentation-resolver.test.js.map +1 -1
- package/dist/integrations/dynamodb/client.d.ts.map +1 -1
- package/dist/integrations/dynamodb/client.js +2 -5
- package/dist/integrations/dynamodb/client.js.map +1 -1
- package/dist/integrations/gcs/client.d.ts.map +1 -1
- package/dist/integrations/gcs/client.js +2 -5
- package/dist/integrations/gcs/client.js.map +1 -1
- package/dist/integrations/gsheets/client.d.ts.map +1 -1
- package/dist/integrations/gsheets/client.js +2 -5
- package/dist/integrations/gsheets/client.js.map +1 -1
- package/dist/integrations/mongodb/client.d.ts.map +1 -1
- package/dist/integrations/mongodb/client.js +2 -5
- package/dist/integrations/mongodb/client.js.map +1 -1
- package/dist/integrations/restapiintegration/client.body-types.test.d.ts +2 -0
- package/dist/integrations/restapiintegration/client.body-types.test.d.ts.map +1 -0
- package/dist/integrations/restapiintegration/client.body-types.test.js +227 -0
- package/dist/integrations/restapiintegration/client.body-types.test.js.map +1 -0
- package/dist/integrations/restapiintegration/client.test.js +56 -30
- package/dist/integrations/restapiintegration/client.test.js.map +1 -1
- package/dist/integrations/s3/client.d.ts.map +1 -1
- package/dist/integrations/s3/client.js +2 -5
- package/dist/integrations/s3/client.js.map +1 -1
- package/dist/integrations/salesforce/client.d.ts.map +1 -1
- package/dist/integrations/salesforce/client.js +2 -5
- package/dist/integrations/salesforce/client.js.map +1 -1
- package/dist/integrations/slack/client.d.ts.map +1 -1
- package/dist/integrations/slack/client.js +4 -13
- package/dist/integrations/slack/client.js.map +1 -1
- package/dist/integrations/slack/client.test.js +20 -0
- package/dist/integrations/slack/client.test.js.map +1 -1
- package/dist/integrations/utils.d.ts +8 -3
- package/dist/integrations/utils.d.ts.map +1 -1
- package/dist/integrations/utils.js +42 -1
- package/dist/integrations/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/errors.test.ts +257 -0
- package/src/errors.ts +304 -10
- package/src/integrations/base/decode-worker-binary-response.ts +5 -7
- package/src/integrations/base/index.ts +3 -0
- package/src/integrations/base/request-body.test.ts +565 -0
- package/src/integrations/base/request-body.ts +392 -0
- package/src/integrations/base/rest-api-client-base.ts +24 -19
- package/src/integrations/base/rest-api-integration-client.ts +14 -10
- package/src/integrations/base/types.ts +66 -11
- package/src/integrations/box/README.md +4 -60
- package/src/integrations/cosmosdb/client.ts +8 -7
- package/src/integrations/documentation-resolver.test.ts +130 -1
- package/src/integrations/dropbox/README.md +1 -71
- package/src/integrations/dropbox/docs.manifest.json +10 -1
- package/src/integrations/dropbox/overlays/upload-unsupported.md +3 -0
- package/src/integrations/dropbox/overlays/upload.md +89 -0
- package/src/integrations/dynamodb/client.ts +8 -7
- package/src/integrations/elasticsearch/README.md +0 -80
- package/src/integrations/elasticsearch/docs.manifest.json +10 -1
- package/src/integrations/elasticsearch/overlays/bulk-unsupported.md +3 -0
- package/src/integrations/elasticsearch/overlays/bulk.md +80 -0
- package/src/integrations/gcs/client.ts +8 -7
- package/src/integrations/googledrive/README.md +10 -36
- package/src/integrations/gsheets/client.ts +8 -7
- package/src/integrations/jira/README.md +0 -26
- package/src/integrations/jira/docs.manifest.json +10 -1
- package/src/integrations/jira/overlays/attachments-unsupported.md +3 -0
- package/src/integrations/jira/overlays/attachments.md +30 -0
- package/src/integrations/lakebase/README.md +1 -3
- package/src/integrations/mongodb/client.ts +8 -7
- package/src/integrations/postgres/README.md +1 -3
- package/src/integrations/restapiintegration/client.body-types.test.ts +323 -0
- package/src/integrations/restapiintegration/client.test.ts +68 -32
- package/src/integrations/restapiintegration/docs.manifest.json +8 -0
- package/src/integrations/restapiintegration/overlays/request-body-types-unsupported.md +7 -0
- package/src/integrations/restapiintegration/overlays/request-body-types.md +115 -0
- package/src/integrations/restapiintegration/overlays/response-types-binary.md +4 -8
- package/src/integrations/s3/client.ts +8 -7
- package/src/integrations/salesforce/client.ts +9 -7
- package/src/integrations/slack/client.test.ts +30 -0
- package/src/integrations/slack/client.ts +13 -19
- package/src/integrations/snowflakepostgres/README.md +1 -3
- package/src/integrations/stabilityai/README.md +0 -87
- package/src/integrations/stabilityai/docs.manifest.json +10 -1
- package/src/integrations/stabilityai/overlays/image-uploads-unsupported.md +3 -0
- package/src/integrations/stabilityai/overlays/image-uploads.md +120 -0
- package/src/integrations/stripe/README.md +0 -201
- package/src/integrations/stripe/docs.manifest.json +10 -1
- package/src/integrations/stripe/overlays/request-bodies-unsupported.md +3 -0
- package/src/integrations/stripe/overlays/request-bodies.md +204 -0
- package/src/integrations/utils.ts +51 -1
package/README.md
CHANGED
package/dist/errors.d.ts
CHANGED
|
@@ -1,16 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Error classes for SDK runtime errors.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
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
|
|
13
|
-
*
|
|
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
|
*
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
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
|
-
|
|
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
|
|
27
|
-
*
|
|
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
|
*
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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,
|
|
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
|
|
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,
|
|
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"}
|