velocious 1.0.571 → 1.0.573

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 (80) hide show
  1. package/README.md +2 -0
  2. package/build/background-jobs/web/authorization.js +2 -33
  3. package/build/background-jobs/web/path-matcher.js +5 -30
  4. package/build/database/drivers/base.js +17 -0
  5. package/build/database/drivers/mssql/index.js +30 -0
  6. package/build/database/record/index.js +22 -10
  7. package/build/deployment-api/controller.js +437 -0
  8. package/build/deployment-api/index.js +210 -0
  9. package/build/deployment-api/path-matcher.js +45 -0
  10. package/build/deployment-api/registry.js +84 -0
  11. package/build/deployment-api/run-store.js +798 -0
  12. package/build/deployment-api/sanitize.js +114 -0
  13. package/build/http-client/request.js +3 -1
  14. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  15. package/build/src/background-jobs/web/authorization.js +3 -29
  16. package/build/src/background-jobs/web/path-matcher.d.ts +2 -12
  17. package/build/src/background-jobs/web/path-matcher.d.ts.map +1 -1
  18. package/build/src/background-jobs/web/path-matcher.js +5 -30
  19. package/build/src/database/drivers/base.d.ts +16 -0
  20. package/build/src/database/drivers/base.d.ts.map +1 -1
  21. package/build/src/database/drivers/base.js +16 -1
  22. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  23. package/build/src/database/drivers/mssql/index.js +29 -1
  24. package/build/src/database/record/index.d.ts +3 -2
  25. package/build/src/database/record/index.d.ts.map +1 -1
  26. package/build/src/database/record/index.js +21 -10
  27. package/build/src/deployment-api/controller.d.ts +117 -0
  28. package/build/src/deployment-api/controller.d.ts.map +1 -0
  29. package/build/src/deployment-api/controller.js +384 -0
  30. package/build/src/deployment-api/index.d.ts +46 -0
  31. package/build/src/deployment-api/index.d.ts.map +1 -0
  32. package/build/src/deployment-api/index.js +178 -0
  33. package/build/src/deployment-api/path-matcher.d.ts +31 -0
  34. package/build/src/deployment-api/path-matcher.d.ts.map +1 -0
  35. package/build/src/deployment-api/path-matcher.js +39 -0
  36. package/build/src/deployment-api/registry.d.ts +106 -0
  37. package/build/src/deployment-api/registry.d.ts.map +1 -0
  38. package/build/src/deployment-api/registry.js +74 -0
  39. package/build/src/deployment-api/run-store.d.ts +402 -0
  40. package/build/src/deployment-api/run-store.d.ts.map +1 -0
  41. package/build/src/deployment-api/run-store.js +711 -0
  42. package/build/src/deployment-api/sanitize.d.ts +27 -0
  43. package/build/src/deployment-api/sanitize.d.ts.map +1 -0
  44. package/build/src/deployment-api/sanitize.js +100 -0
  45. package/build/src/http-client/request.d.ts.map +1 -1
  46. package/build/src/http-client/request.js +4 -2
  47. package/build/src/sync/signed-sync-envelope-replay-service.d.ts +154 -0
  48. package/build/src/sync/signed-sync-envelope-replay-service.d.ts.map +1 -0
  49. package/build/src/sync/signed-sync-envelope-replay-service.js +294 -0
  50. package/build/src/sync/sync-envelope-replay-service.d.ts +84 -15
  51. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  52. package/build/src/sync/sync-envelope-replay-service.js +98 -16
  53. package/build/src/utils/bearer-token.d.ts +15 -0
  54. package/build/src/utils/bearer-token.d.ts.map +1 -0
  55. package/build/src/utils/bearer-token.js +29 -0
  56. package/build/src/utils/mount-prefix.d.ts +21 -0
  57. package/build/src/utils/mount-prefix.d.ts.map +1 -0
  58. package/build/src/utils/mount-prefix.js +35 -0
  59. package/build/sync/signed-sync-envelope-replay-service.js +342 -0
  60. package/build/sync/sync-envelope-replay-service.js +110 -15
  61. package/build/tsconfig.tsbuildinfo +1 -1
  62. package/build/utils/bearer-token.js +34 -0
  63. package/build/utils/mount-prefix.js +36 -0
  64. package/package.json +2 -1
  65. package/src/background-jobs/web/authorization.js +2 -33
  66. package/src/background-jobs/web/path-matcher.js +5 -30
  67. package/src/database/drivers/base.js +17 -0
  68. package/src/database/drivers/mssql/index.js +30 -0
  69. package/src/database/record/index.js +22 -10
  70. package/src/deployment-api/controller.js +437 -0
  71. package/src/deployment-api/index.js +210 -0
  72. package/src/deployment-api/path-matcher.js +45 -0
  73. package/src/deployment-api/registry.js +84 -0
  74. package/src/deployment-api/run-store.js +798 -0
  75. package/src/deployment-api/sanitize.js +114 -0
  76. package/src/http-client/request.js +3 -1
  77. package/src/sync/signed-sync-envelope-replay-service.js +342 -0
  78. package/src/sync/sync-envelope-replay-service.js +110 -15
  79. package/src/utils/bearer-token.js +34 -0
  80. package/src/utils/mount-prefix.js +36 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Converts an integration-owned value (adapter report, live status, audit
3
+ * payload fragment) into a bounded JSON-safe structure: plain objects, arrays,
4
+ * strings, finite numbers, booleans, and null survive; everything else
5
+ * (functions, class instances, undefined) is dropped. String values and object
6
+ * keys are redacted and capped in length; deterministic suffixes preserve every
7
+ * value when redacted keys collide.
8
+ * @param {?} value - Raw value from the integration.
9
+ * @param {string[]} secrets - Secret values to redact.
10
+ * @param {number} [depth] - Current recursion depth.
11
+ * @returns {?} - JSON-safe redacted value, or undefined when the value cannot be represented.
12
+ */
13
+ export function sanitizeAdapterValue(value: unknown, secrets: string[], depth?: number): unknown;
14
+ /**
15
+ * Builds the sanitized failure payload persisted for a failed run. The message
16
+ * is redacted; an integration-provided plain-object `error.recovery` (e.g.
17
+ * Rampway reporting restoration of the previous release) is included after
18
+ * sanitization.
19
+ * @param {?} error - Thrown error from the adapter.
20
+ * @param {string[]} secrets - Secret values to redact.
21
+ * @returns {{message: string, recovery: (? | undefined)}} - Sanitized failure payload.
22
+ */
23
+ export function sanitizeErrorPayload(error: unknown, secrets: string[]): {
24
+ message: string;
25
+ recovery: (unknown | undefined);
26
+ };
27
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/deployment-api/sanitize.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;GAWG;AACH,4CALW,OAAC,WACD,MAAM,EAAE,UACR,MAAM,GACJ,OAAC,CA2Db;AAED;;;;;;;;GAQG;AACH,4CAJW,OAAC,WACD,MAAM,EAAE,GACN;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,OAAC,GAAG,SAAS,CAAC,CAAA;CAAC,CAQxD"}
@@ -0,0 +1,100 @@
1
+ // @ts-check
2
+ const MAX_STRING_LENGTH = 4000;
3
+ const MAX_DEPTH = 20;
4
+ const REDACTED = "[redacted]";
5
+ /**
6
+ * Replaces every occurrence of each configured secret in a string so tokens
7
+ * never leak into persisted run state, audit payloads, or API responses.
8
+ * @param {string} value - Raw string.
9
+ * @param {string[]} secrets - Secret values to redact.
10
+ * @returns {string} - Redacted string.
11
+ */
12
+ function redactString(value, secrets) {
13
+ let result = value;
14
+ for (const secret of secrets) {
15
+ if (secret.length > 0)
16
+ result = result.split(secret).join(REDACTED);
17
+ }
18
+ if (result.length > MAX_STRING_LENGTH) {
19
+ result = `${result.slice(0, MAX_STRING_LENGTH)}…`;
20
+ }
21
+ return result;
22
+ }
23
+ /**
24
+ * Converts an integration-owned value (adapter report, live status, audit
25
+ * payload fragment) into a bounded JSON-safe structure: plain objects, arrays,
26
+ * strings, finite numbers, booleans, and null survive; everything else
27
+ * (functions, class instances, undefined) is dropped. String values and object
28
+ * keys are redacted and capped in length; deterministic suffixes preserve every
29
+ * value when redacted keys collide.
30
+ * @param {?} value - Raw value from the integration.
31
+ * @param {string[]} secrets - Secret values to redact.
32
+ * @param {number} [depth] - Current recursion depth.
33
+ * @returns {?} - JSON-safe redacted value, or undefined when the value cannot be represented.
34
+ */
35
+ export function sanitizeAdapterValue(value, secrets, depth = 0) {
36
+ if (value === null)
37
+ return null;
38
+ if (depth > MAX_DEPTH)
39
+ return undefined;
40
+ const valueType = typeof value;
41
+ if (valueType === "string")
42
+ return redactString(value, secrets);
43
+ if (valueType === "number")
44
+ return Number.isFinite(value) ? value : null;
45
+ if (valueType === "boolean")
46
+ return value;
47
+ if (Array.isArray(value)) {
48
+ /** @type {Array<?>} */
49
+ const result = [];
50
+ for (const entry of value) {
51
+ const sanitized = sanitizeAdapterValue(entry, secrets, depth + 1);
52
+ if (sanitized !== undefined)
53
+ result.push(sanitized);
54
+ }
55
+ return result;
56
+ }
57
+ if (valueType === "object") {
58
+ const prototype = Object.getPrototypeOf(value);
59
+ if (prototype !== Object.prototype && prototype !== null)
60
+ return undefined;
61
+ /** @type {Record<string, ?>} */
62
+ const result = {};
63
+ for (const [key, entry] of Object.entries(value)) {
64
+ const sanitized = sanitizeAdapterValue(entry, secrets, depth + 1);
65
+ if (sanitized === undefined)
66
+ continue;
67
+ const redactedKey = redactString(key, secrets);
68
+ let availableKey = redactedKey;
69
+ let collisionNumber = 2;
70
+ while (Object.hasOwn(result, availableKey)) {
71
+ availableKey = `${redactedKey}#${collisionNumber}`;
72
+ collisionNumber++;
73
+ }
74
+ Object.defineProperty(result, availableKey, {
75
+ configurable: true,
76
+ enumerable: true,
77
+ value: sanitized,
78
+ writable: true
79
+ });
80
+ }
81
+ return result;
82
+ }
83
+ return undefined;
84
+ }
85
+ /**
86
+ * Builds the sanitized failure payload persisted for a failed run. The message
87
+ * is redacted; an integration-provided plain-object `error.recovery` (e.g.
88
+ * Rampway reporting restoration of the previous release) is included after
89
+ * sanitization.
90
+ * @param {?} error - Thrown error from the adapter.
91
+ * @param {string[]} secrets - Secret values to redact.
92
+ * @returns {{message: string, recovery: (? | undefined)}} - Sanitized failure payload.
93
+ */
94
+ export function sanitizeErrorPayload(error, secrets) {
95
+ const rawMessage = error instanceof Error ? error.message : String(error);
96
+ const rawRecovery = error instanceof Error ? /** @type {Record<string, ?>} */ (error).recovery : undefined;
97
+ const recovery = sanitizeAdapterValue(rawRecovery, secrets);
98
+ return { message: redactString(rawMessage, secrets), recovery };
99
+ }
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FuaXRpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVwbG95bWVudC1hcGkvc2FuaXRpemUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFBO0FBQzlCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQTtBQUNwQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUE7QUFFN0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU87SUFDbEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFBO0lBRWxCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQTtJQUNuRCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUM1RCxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDL0IsSUFBSSxLQUFLLEdBQUcsU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFBO0lBRXZDLE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxDQUFBO0lBRTlCLElBQUksU0FBUyxLQUFLLFFBQVE7UUFBRSxPQUFPLFlBQVksQ0FBQyxLQUFLLEVB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QUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmNvbnN0IE1BWF9TVFJJTkdfTEVOR1RIID0gNDAwMFxuY29uc3QgTUFYX0RFUFRIID0gMjBcbmNvbnN0IFJFREFDVEVEID0gXCJbcmVkYWN0ZWRdXCJcblxuLyoqXG4gKiBSZXBsYWNlcyBldmVyeSBvY2N1cnJlbmNlIG9mIGVhY2ggY29uZmlndXJlZCBzZWNyZXQgaW4gYSBzdHJpbmcgc28gdG9rZW5zXG4gKiBuZXZlciBsZWFrIGludG8gcGVyc2lzdGVkIHJ1biBzdGF0ZSwgYXVkaXQgcGF5bG9hZHMsIG9yIEFQSSByZXNwb25zZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSYXcgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gc2VjcmV0cyAtIFNlY3JldCB2YWx1ZXMgdG8gcmVkYWN0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBSZWRhY3RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlZGFjdFN0cmluZyh2YWx1ZSwgc2VjcmV0cykge1xuICBsZXQgcmVzdWx0ID0gdmFsdWVcblxuICBmb3IgKGNvbnN0IHNlY3JldCBvZiBzZWNyZXRzKSB7XG4gICAgaWYgKHNlY3JldC5sZW5ndGggPiAwKSByZXN1bHQgPSByZXN1bHQuc3BsaXQoc2VjcmV0KS5qb2luKFJFREFDVEVEKVxuICB9XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGggPiBNQVhfU1RSSU5HX0xFTkdUSCkge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBNQVhfU1RSSU5HX0xFTkdUSCl94oCmYFxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGludGVncmF0aW9uLW93bmVkIHZhbHVlIChhZGFwdGVyIHJlcG9ydCwgbGl2ZSBzdGF0dXMsIGF1ZGl0XG4gKiBwYXlsb2FkIGZyYWdtZW50KSBpbnRvIGEgYm91bmRlZCBKU09OLXNhZmUgc3RydWN0dXJlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsXG4gKiBzdHJpbmdzLCBmaW5pdGUgbnVtYmVycywgYm9vbGVhbnMsIGFuZCBudWxsIHN1cnZpdmU7IGV2ZXJ5dGhpbmcgZWxzZVxuICogKGZ1bmN0aW9ucywgY2xhc3MgaW5zdGFuY2VzLCB1bmRlZmluZWQpIGlzIGRyb3BwZWQuIFN0cmluZyB2YWx1ZXMgYW5kIG9iamVjdFxuICoga2V5cyBhcmUgcmVkYWN0ZWQgYW5kIGNhcHBlZCBpbiBsZW5ndGg7IGRldGVybWluaXN0aWMgc3VmZml4ZXMgcHJlc2VydmUgZXZlcnlcbiAqIHZhbHVlIHdoZW4gcmVkYWN0ZWQga2V5cyBjb2xsaWRlLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIFJhdyB2YWx1ZSBmcm9tIHRoZSBpbnRlZ3JhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHNlY3JldHMgLSBTZWNyZXQgdmFsdWVzIHRvIHJlZGFjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGhdIC0gQ3VycmVudCByZWN1cnNpb24gZGVwdGguXG4gKiBAcmV0dXJucyB7P30gLSBKU09OLXNhZmUgcmVkYWN0ZWQgdmFsdWUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUFkYXB0ZXJWYWx1ZSh2YWx1ZSwgc2VjcmV0cywgZGVwdGggPSAwKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgaWYgKGRlcHRoID4gTUFYX0RFUFRIKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlXG5cbiAgaWYgKHZhbHVlVHlwZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHJlZGFjdFN0cmluZyh2YWx1ZSwgc2VjcmV0cylcbiAgaWYgKHZhbHVlVHlwZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IG51bGxcbiAgaWYgKHZhbHVlVHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIC8qKiBAdHlwZSB7QXJyYXk8Pz59ICovXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplQWRhcHRlclZhbHVlKGVudHJ5LCBzZWNyZXRzLCBkZXB0aCArIDEpXG5cbiAgICAgIGlmIChzYW5pdGl6ZWQgIT09IHVuZGVmaW5lZCkgcmVzdWx0LnB1c2goc2FuaXRpemVkKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGlmICh2YWx1ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUFkYXB0ZXJWYWx1ZShlbnRyeSwgc2VjcmV0cywgZGVwdGggKyAxKVxuXG4gICAgICBpZiAoc2FuaXRpemVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlZGFjdGVkS2V5ID0gcmVkYWN0U3RyaW5nKGtleSwgc2VjcmV0cylcbiAgICAgIGxldCBhdmFpbGFibGVLZXkgPSByZWRhY3RlZEtleVxuICAgICAgbGV0IGNvbGxpc2lvbk51bWJlciA9IDJcblxuICAgICAgd2hpbGUgKE9iamVjdC5oYXNPd24ocmVzdWx0LCBhdmFpbGFibGVLZXkpKSB7XG4gICAgICAgIGF2YWlsYWJsZUtleSA9IGAke3JlZGFjdGVkS2V5fSMke2NvbGxpc2lvbk51bWJlcn1gXG4gICAgICAgIGNvbGxpc2lvbk51bWJlcisrXG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIGF2YWlsYWJsZUtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHNhbml0aXplZCBmYWlsdXJlIHBheWxvYWQgcGVyc2lzdGVkIGZvciBhIGZhaWxlZCBydW4uIFRoZSBtZXNzYWdlXG4gKiBpcyByZWRhY3RlZDsgYW4gaW50ZWdyYXRpb24tcHJvdmlkZWQgcGxhaW4tb2JqZWN0IGBlcnJvci5yZWNvdmVyeWAgKGUuZy5cbiAqIFJhbXB3YXkgcmVwb3J0aW5nIHJlc3RvcmF0aW9uIG9mIHRoZSBwcmV2aW91cyByZWxlYXNlKSBpcyBpbmNsdWRlZCBhZnRlclxuICogc2FuaXRpemF0aW9uLlxuICogQHBhcmFtIHs/fSBlcnJvciAtIFRocm93biBlcnJvciBmcm9tIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gc2VjcmV0cyAtIFNlY3JldCB2YWx1ZXMgdG8gcmVkYWN0LlxuICogQHJldHVybnMge3ttZXNzYWdlOiBzdHJpbmcsIHJlY292ZXJ5OiAoPyB8IHVuZGVmaW5lZCl9fSAtIFNhbml0aXplZCBmYWlsdXJlIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUVycm9yUGF5bG9hZChlcnJvciwgc2VjcmV0cykge1xuICBjb25zdCByYXdNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gIGNvbnN0IHJhd1JlY292ZXJ5ID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChlcnJvcikucmVjb3ZlcnkgOiB1bmRlZmluZWRcbiAgY29uc3QgcmVjb3ZlcnkgPSBzYW5pdGl6ZUFkYXB0ZXJWYWx1ZShyYXdSZWNvdmVyeSwgc2VjcmV0cylcblxuICByZXR1cm4ge21lc3NhZ2U6IHJlZGFjdFN0cmluZyhyYXdNZXNzYWdlLCBzZWNyZXRzKSwgcmVjb3Zlcnl9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/http-client/request.js"],"names":[],"mappings":"AAIA;IACE;;;;;;;;OAQG;IACH,sDANG;QAAsB,IAAI;QACL,MAAM,EAAnB,MAAM;QACS,OAAO,EAAtB,MAAM,EAAE;QACK,IAAI,EAAjB,MAAM;QACO,OAAO,EAApB,MAAM;KAChB,EAOA;IALC,yBAAgB;IAChB,kBAAsB;IACtB,eAAoB;IACpB,aAAgB;IAChB,gBAAsB;IAGxB,mBAQC;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;;OAKG;IACH,gBAJW,MAAM,SACN,MAAM,GAAG,MAAM,GACb,IAAI,CAIhB;IAED;;;OAGG;IACH,WAFa,IAAI,CAMhB;IAED;;;;OAIG;IACH,iBAHW,CAAS,IAAM,EAAN,MAAM,KAAI,IAAI,GACrB,IAAI,CAkBhB;CACF;mBA3FkB,aAAa"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/http-client/request.js"],"names":[],"mappings":"AAIA;IACE;;;;;;;;OAQG;IACH,sDANG;QAAsB,IAAI;QACL,MAAM,EAAnB,MAAM;QACS,OAAO,EAAtB,MAAM,EAAE;QACK,IAAI,EAAjB,MAAM;QACO,OAAO,EAApB,MAAM;KAChB,EAOA;IALC,yBAAgB;IAChB,kBAAsB;IACtB,eAAoB;IACpB,aAAgB;IAChB,gBAAsB;IAGxB,mBAQC;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;;OAKG;IACH,gBAJW,MAAM,SACN,MAAM,GAAG,MAAM,GACb,IAAI,CAIhB;IAED;;;OAGG;IACH,WAFa,IAAI,CAQhB;IAED;;;;OAIG;IACH,iBAHW,CAAS,IAAM,EAAN,MAAM,KAAI,IAAI,GACrB,IAAI,CAkBhB;CACF;mBA7FkB,aAAa"}
@@ -54,7 +54,9 @@ export default class Request {
54
54
  */
55
55
  prepare() {
56
56
  if (this.body) {
57
- this.addHeader("Content-Length", Buffer.from(this.body).byteLength);
57
+ // Buffer.byteLength computes the UTF-8 length of strings without copying and
58
+ // returns .byteLength unchanged for Buffer/Uint8Array bodies.
59
+ this.addHeader("Content-Length", Buffer.byteLength(this.body, "utf8"));
58
60
  }
59
61
  }
60
62
  /**
@@ -75,4 +77,4 @@ export default class Request {
75
77
  }
76
78
  }
77
79
  }
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC9yZXF1ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxPQUFPO0lBQzFCOzs7Ozs7OztPQVFHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUM7UUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFFdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BCLGFBQWEsSUFBSSxLQUFLLENBQUE7UUFDeEIsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxJQUFJO1FBQ1osTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1FBRTdDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBRS9ELElBQUksV0FBVyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sTUFBTSxDQUFBO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDckUsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFFBQVE7UUFDYixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFZCxNQUFNLGFBQWEsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsT0FBTyxNQUFNLENBQUE7UUFFNUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXZCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUVELFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVoQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcXVlc3Qge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHBhcmFtIHtIZWFkZXJbXX0gYXJncy5oZWFkZXJzIC0gSGVhZGVyIGxpc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy52ZXJzaW9uIC0gVmVyc2lvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtib2R5LCBtZXRob2QgPSBcIkdFVFwiLCBoZWFkZXJzID0gW10sIHBhdGgsIHZlcnNpb24gPSBcIjEuMVwifSkge1xuICAgIHRoaXMuYm9keSA9IGJvZHlcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzXG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2RcbiAgICB0aGlzLnBhdGggPSBwYXRoXG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvblxuICB9XG5cbiAgYXNTdHJpbmcoKSB7XG4gICAgbGV0IHJlcXVlc3RTdHJpbmcgPSBcIlwiXG5cbiAgICB0aGlzLnN0cmVhbSgoY2h1bmspID0+IHtcbiAgICAgIHJlcXVlc3RTdHJpbmcgKz0gY2h1bmtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlcXVlc3RTdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAgICogQHJldHVybnMge0hlYWRlcn0gLSBUaGUgaGVhZGVyLlxuICAgKi9cbiAgZ2V0SGVhZGVyKG5hbWUpIHtcbiAgICBjb25zdCBjb21wYXJlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKS50cmltKClcblxuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHRoaXMuaGVhZGVycykge1xuICAgICAgY29uc3QgaGVhZGVyQ29tcGFyZU5hbWUgPSBoZWFkZXIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkudHJpbSgpXG5cbiAgICAgIGlmIChjb21wYXJlTmFtZSA9PSBoZWFkZXJDb21wYXJlTmFtZSkge1xuICAgICAgICByZXR1cm4gaGVhZGVyXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBIZWFkZXIgJHtuYW1lfSBub3QgZm91bmRgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZEhlYWRlcihuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuaGVhZGVycy5wdXNoKG5ldyBIZWFkZXIobmFtZSwgdmFsdWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJlcGFyZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcHJlcGFyZSgpIHtcbiAgICBpZiAodGhpcy5ib2R5KSB7XG4gICAgICB0aGlzLmFkZEhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIsIEJ1ZmZlci5mcm9tKHRoaXMuYm9keSkuYnl0ZUxlbmd0aClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdHJlYW0uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKSA6IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0cmVhbShjYWxsYmFjaykge1xuICAgIHRoaXMucHJlcGFyZSgpXG5cbiAgICBjb25zdCByZXF1ZXN0U3RyaW5nID0gYCR7dGhpcy5tZXRob2R9ICR7dGhpcy5wYXRofSBIVFRQLyR7dGhpcy52ZXJzaW9ufVxcclxcbmBcblxuICAgIGNhbGxiYWNrKHJlcXVlc3RTdHJpbmcpXG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiB0aGlzLmhlYWRlcnMpIHtcbiAgICAgIGNhbGxiYWNrKGAke2hlYWRlci50b1N0cmluZygpfVxcclxcbmApXG4gICAgfVxuXG4gICAgY2FsbGJhY2soYFxcclxcbmApXG5cbiAgICBpZiAodGhpcy5ib2R5KSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmJvZHkpXG4gICAgfVxuICB9XG59XG4iXX0=
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC9yZXF1ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxPQUFPO0lBQzFCOzs7Ozs7OztPQVFHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUM7UUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFFdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BCLGFBQWEsSUFBSSxLQUFLLENBQUE7UUFDeEIsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxJQUFJO1FBQ1osTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1FBRTdDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBRS9ELElBQUksV0FBVyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sTUFBTSxDQUFBO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLDZFQUE2RTtZQUM3RSw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBUTtRQUNiLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVkLE1BQU0sYUFBYSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxPQUFPLE1BQU0sQ0FBQTtRQUU1RSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFdkIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN0QyxDQUFDO1FBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWhCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBIZWFkZXIgZnJvbSBcIi4vaGVhZGVyLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYm9keV0gLSBSZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZCAtIEhUVFAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0hlYWRlcltdfSBhcmdzLmhlYWRlcnMgLSBIZWFkZXIgbGlzdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZlcnNpb24gLSBWZXJzaW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2JvZHksIG1ldGhvZCA9IFwiR0VUXCIsIGhlYWRlcnMgPSBbXSwgcGF0aCwgdmVyc2lvbiA9IFwiMS4xXCJ9KSB7XG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZFxuICAgIHRoaXMucGF0aCA9IHBhdGhcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG4gIH1cblxuICBhc1N0cmluZygpIHtcbiAgICBsZXQgcmVxdWVzdFN0cmluZyA9IFwiXCJcblxuICAgIHRoaXMuc3RyZWFtKChjaHVuaykgPT4ge1xuICAgICAgcmVxdWVzdFN0cmluZyArPSBjaHVua1xuICAgIH0pXG5cbiAgICByZXR1cm4gcmVxdWVzdFN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lLlxuICAgKiBAcmV0dXJucyB7SGVhZGVyfSAtIFRoZSBoZWFkZXIuXG4gICAqL1xuICBnZXRIZWFkZXIobmFtZSkge1xuICAgIGNvbnN0IGNvbXBhcmVOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXIgb2YgdGhpcy5oZWFkZXJzKSB7XG4gICAgICBjb25zdCBoZWFkZXJDb21wYXJlTmFtZSA9IGhlYWRlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS50cmltKClcblxuICAgICAgaWYgKGNvbXBhcmVOYW1lID09IGhlYWRlckNvbXBhcmVOYW1lKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEhlYWRlciAke25hbWV9IG5vdCBmb3VuZGApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYWRkSGVhZGVyKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5oZWFkZXJzLnB1c2gobmV3IEhlYWRlcihuYW1lLCB2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcmVwYXJlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwcmVwYXJlKCkge1xuICAgIGlmICh0aGlzLmJvZHkpIHtcbiAgICAgIC8vIEJ1ZmZlci5ieXRlTGVuZ3RoIGNvbXB1dGVzIHRoZSBVVEYtOCBsZW5ndGggb2Ygc3RyaW5ncyB3aXRob3V0IGNvcHlpbmcgYW5kXG4gICAgICAvLyByZXR1cm5zIC5ieXRlTGVuZ3RoIHVuY2hhbmdlZCBmb3IgQnVmZmVyL1VpbnQ4QXJyYXkgYm9kaWVzLlxuICAgICAgdGhpcy5hZGRIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiLCBCdWZmZXIuYnl0ZUxlbmd0aCh0aGlzLmJvZHksIFwidXRmOFwiKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdHJlYW0uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKSA6IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0cmVhbShjYWxsYmFjaykge1xuICAgIHRoaXMucHJlcGFyZSgpXG5cbiAgICBjb25zdCByZXF1ZXN0U3RyaW5nID0gYCR7dGhpcy5tZXRob2R9ICR7dGhpcy5wYXRofSBIVFRQLyR7dGhpcy52ZXJzaW9ufVxcclxcbmBcblxuICAgIGNhbGxiYWNrKHJlcXVlc3RTdHJpbmcpXG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiB0aGlzLmhlYWRlcnMpIHtcbiAgICAgIGNhbGxiYWNrKGAke2hlYWRlci50b1N0cmluZygpfVxcclxcbmApXG4gICAgfVxuXG4gICAgY2FsbGJhY2soYFxcclxcbmApXG5cbiAgICBpZiAodGhpcy5ib2R5KSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmJvZHkpXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @typedef {import("./device-identity.js").SignedSyncMutation} SignedSyncMutation
3
+ * @typedef {import("./offline-grant.js").SignedOfflineGrant} SignedOfflineGrant
4
+ */
5
+ /**
6
+ * Sync-envelope replay service that authenticates via backend-signed device
7
+ * certificates and signed offline grants instead of online session tokens.
8
+ *
9
+ * This is the generic Velocious primitive for long-offline and peer-forwarded
10
+ * mutations: the HTTP uploader may differ from the mutation actor, but replay
11
+ * authority is derived from the signed envelope and grant, not the uploader's
12
+ * session.
13
+ *
14
+ * Every mutation is validated against the current sync manifest (the same
15
+ * contract as the controller's sync replay endpoint): the model and operation
16
+ * must be enabled in the current manifest, the grant resource entry must be
17
+ * enabled and list the operation, and the grant policy hash must equal both the
18
+ * mutation policy hash and the current manifest policy hash. Routed resources
19
+ * are authorized through an actor/grant-scoped ability built by the configured
20
+ * `abilityFactory`; without one, routed signed replay fails closed.
21
+ */
22
+ export default class SignedSyncEnvelopeReplayService extends SyncEnvelopeReplayService {
23
+ /**
24
+ * Creates a signed sync-envelope replay service.
25
+ * @param {object} args - Constructor arguments.
26
+ * @param {import("./device-identity.js").SyncJsonWebKey} args.backendPublicKey - Backend public key used to verify device certificates.
27
+ * @param {Array<import("./offline-grant.js").OfflineGrantSigningKey>} [args.offlineGrantSigningKeys] - Offline-grant verification keys.
28
+ * @param {(userId: string) => Promise<{id: () => string} | null>} [args.actorLookup] - Optional lookup from grant user id to an actor object with an `id()` method. Defaults to a wrapper around the grant user id.
29
+ * @param {(args: {actor: ?, configuration: import("../configuration.js").default | null, grant: import("./offline-grant.js").OfflineGrant}) => Promise<import("../authorization/ability.js").default | null> | import("../authorization/ability.js").default | null} [args.abilityFactory] - Builds the actor/grant-scoped ability used to authorize routed resources. Required for routed signed replay; without it every routed sync fails closed.
30
+ * @param {Record<string, ?>} [args.rest] - Remaining arguments forwarded to {@link SyncEnvelopeReplayService}.
31
+ */
32
+ constructor({ abilityFactory, backendPublicKey, offlineGrantSigningKeys, actorLookup, ...rest }: {
33
+ backendPublicKey: import("./device-identity.js").SyncJsonWebKey;
34
+ offlineGrantSigningKeys?: import("./offline-grant.js").OfflineGrantSigningKey[] | undefined;
35
+ actorLookup?: ((userId: string) => Promise<{
36
+ id: () => string;
37
+ } | null>) | undefined;
38
+ abilityFactory?: ((args: {
39
+ actor: unknown;
40
+ configuration: import("../configuration.js").default | null;
41
+ grant: import("./offline-grant.js").OfflineGrant;
42
+ }) => Promise<import("../authorization/ability.js").default | null> | import("../authorization/ability.js").default | null) | undefined;
43
+ rest?: Record<string, any> | undefined;
44
+ });
45
+ abilityFactory: ((args: {
46
+ actor: unknown;
47
+ configuration: import("../configuration.js").default | null;
48
+ grant: import("./offline-grant.js").OfflineGrant;
49
+ }) => Promise<import("../authorization/ability.js").default | null> | import("../authorization/ability.js").default | null) | null;
50
+ backendPublicKey: import("node:crypto").webcrypto.JsonWebKey;
51
+ offlineGrantSigningKeys: import("./offline-grant.js").OfflineGrantSigningKey[];
52
+ actorLookup: ((userId: string) => Promise<{
53
+ id: () => string;
54
+ } | null>) | null;
55
+ /**
56
+ * Verifies signed mutations and then runs the generic replay loop over the
57
+ * derived sync envelopes. Verified actor, grant, and derived syncs are kept
58
+ * in the request-local `requestState` object so concurrent replay calls on
59
+ * one service instance cannot cross their authentication state.
60
+ * @param {Record<string, ?>} params - Request params.
61
+ * @param {Record<string, ?>} [requestState] - Request-local state shared with the base replay hooks.
62
+ * @returns {Promise<{syncs: Array<Record<string, ?>>}>} Replay response.
63
+ */
64
+ replay(params: Record<string, unknown>, requestState?: Record<string, unknown>): Promise<{
65
+ syncs: Array<Record<string, unknown>>;
66
+ }>;
67
+ /**
68
+ * Returns the verified actor prepared during {@link SignedSyncEnvelopeReplayService#replay}.
69
+ * @param {Record<string, ?>} _params - Request params.
70
+ * @param {Record<string, ?>} requestState - Request-local state.
71
+ * @returns {Promise<{authenticated: true, actor: ?} | {authenticated: false, errorCode: string, errorMessage: string}>} Auth result.
72
+ */
73
+ authenticateReplay(_params: Record<string, unknown>, requestState: Record<string, unknown>): Promise<{
74
+ authenticated: true;
75
+ actor: unknown;
76
+ } | {
77
+ authenticated: false;
78
+ errorCode: string;
79
+ errorMessage: string;
80
+ }>;
81
+ /**
82
+ * Returns the sync envelopes derived from the verified signed mutations.
83
+ * @param {Record<string, ?>} _params - Request params.
84
+ * @param {Record<string, ?>} requestState - Request-local state.
85
+ * @returns {Array<Record<string, ?>>} Sync envelopes.
86
+ */
87
+ replaySyncs(_params: Record<string, unknown>, requestState: Record<string, unknown>): Array<Record<string, unknown>>;
88
+ /**
89
+ * Derives the routed-resource ability from the verified signed actor and
90
+ * grant through the configured `abilityFactory`. The constructor-wide
91
+ * uploader ability is never used for signed replay: without a factory (or a
92
+ * factory result) every routed sync fails closed with a client-safe error.
93
+ * @param {{actor: ?, context: Record<string, ?>}} args - Verified actor and replay context.
94
+ * @returns {Promise<{ability: import("../authorization/ability.js").default, abilityContext: Record<string, ?>}>} Scoped ability and resource context.
95
+ */
96
+ replayAbilityFor({ actor, context }: {
97
+ actor: unknown;
98
+ context: Record<string, unknown>;
99
+ }): Promise<{
100
+ ability: import("../authorization/ability.js").default;
101
+ abilityContext: Record<string, unknown>;
102
+ }>;
103
+ /**
104
+ * Verifies every signed mutation, its offline grant, and the actor/grant
105
+ * consistency, then transforms the envelopes into the sync format the base
106
+ * replay service understands.
107
+ * @param {Record<string, ?>} params - Request params.
108
+ * @returns {Promise<{actor: ?, grant: import("./offline-grant.js").OfflineGrant, syncs: Array<Record<string, ?>>}>} Verified actor, common grant, and derived syncs.
109
+ */
110
+ verifyAndTransformSignedReplay(params: Record<string, unknown>): Promise<{
111
+ actor: unknown;
112
+ grant: import("./offline-grant.js").OfflineGrant;
113
+ syncs: Array<Record<string, unknown>>;
114
+ }>;
115
+ /**
116
+ * Validates a mutation against the current sync manifest: the model and the
117
+ * operation must be enabled, and the mutation's policy hash must match the
118
+ * current manifest policy hash.
119
+ * @param {{mutation: import("./device-identity.js").SyncMutation, syncManifest: Record<string, import("../configuration-types.js").NormalizedFrontendModelResourceSyncConfiguration>}} args - Validation args.
120
+ * @returns {void} Throws a client-safe error when the current policy denies the mutation.
121
+ */
122
+ validateCurrentSyncPolicy({ mutation, syncManifest }: {
123
+ mutation: import("./device-identity.js").SyncMutation;
124
+ syncManifest: Record<string, import("../configuration-types.js").NormalizedFrontendModelResourceSyncConfiguration>;
125
+ }): void;
126
+ /**
127
+ * Validates the verified offline grant against the current sync policy, the
128
+ * same contract as the controller's sync replay endpoint: the grant resource
129
+ * entry must be a normalized manifest entry (enabled with an operations list
130
+ * and the current policy hash), it must list the mutation operation, and its
131
+ * policy hash must equal both the mutation and current manifest hashes.
132
+ * Legacy array/true grant-resource shortcuts are not the bootstrap contract
133
+ * and never authorize a mutation.
134
+ * @param {{mutation: import("./device-identity.js").SyncMutation, offlineGrant: import("./offline-grant.js").OfflineGrant, syncManifest: Record<string, import("../configuration-types.js").NormalizedFrontendModelResourceSyncConfiguration>}} args - Validation args.
135
+ * @returns {void} Throws a client-safe error when the grant does not authorize the mutation.
136
+ */
137
+ validateGrantAgainstSyncPolicy({ mutation, offlineGrant, syncManifest }: {
138
+ mutation: import("./device-identity.js").SyncMutation;
139
+ offlineGrant: import("./offline-grant.js").OfflineGrant;
140
+ syncManifest: Record<string, import("../configuration-types.js").NormalizedFrontendModelResourceSyncConfiguration>;
141
+ }): void;
142
+ /**
143
+ * Transforms a verified signed mutation into a generic sync envelope.
144
+ * @param {{mutation: import("./device-identity.js").SyncMutation}} args - Transform args.
145
+ * @returns {Record<string, ?>} Sync envelope.
146
+ */
147
+ syncFromSignedMutation({ mutation }: {
148
+ mutation: import("./device-identity.js").SyncMutation;
149
+ }): Record<string, unknown>;
150
+ }
151
+ export type SignedSyncMutation = import("./device-identity.js").SignedSyncMutation;
152
+ export type SignedOfflineGrant = import("./offline-grant.js").SignedOfflineGrant;
153
+ import SyncEnvelopeReplayService from "./sync-envelope-replay-service.js";
154
+ //# sourceMappingURL=signed-sync-envelope-replay-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-sync-envelope-replay-service.d.ts","sourceRoot":"","sources":["../../../src/sync/signed-sync-envelope-replay-service.js"],"names":[],"mappings":"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"}