@workflow/core 5.0.0-beta.36 → 5.0.0-beta.37

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 (112) hide show
  1. package/dist/capabilities.d.ts +6 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +13 -1
  4. package/dist/encryption.d.ts +15 -2
  5. package/dist/encryption.d.ts.map +1 -1
  6. package/dist/encryption.js +28 -7
  7. package/dist/flushable-stream.d.ts +26 -0
  8. package/dist/flushable-stream.d.ts.map +1 -1
  9. package/dist/flushable-stream.js +63 -187
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/log-format.js +3 -3
  14. package/dist/private.d.ts +76 -33
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +149 -22
  17. package/dist/replay-payload-cache.d.ts +3 -2
  18. package/dist/replay-payload-cache.d.ts.map +1 -1
  19. package/dist/replay-payload-cache.js +8 -2
  20. package/dist/runtime/count-step-started-events.d.ts +52 -0
  21. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  22. package/dist/runtime/count-step-started-events.js +72 -0
  23. package/dist/runtime/helpers.d.ts +41 -12
  24. package/dist/runtime/helpers.d.ts.map +1 -1
  25. package/dist/runtime/helpers.js +75 -22
  26. package/dist/runtime/resume-hook.d.ts +2 -2
  27. package/dist/runtime/resume-hook.d.ts.map +1 -1
  28. package/dist/runtime/resume-hook.js +174 -55
  29. package/dist/runtime/run.d.ts.map +1 -1
  30. package/dist/runtime/run.js +3 -3
  31. package/dist/runtime/runs.d.ts.map +1 -1
  32. package/dist/runtime/runs.js +5 -3
  33. package/dist/runtime/start.d.ts.map +1 -1
  34. package/dist/runtime/start.js +65 -18
  35. package/dist/runtime/step-executor.d.ts +9 -8
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +17 -17
  38. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  39. package/dist/runtime/suspension-handler.js +2 -3
  40. package/dist/runtime/world.d.ts +2 -7
  41. package/dist/runtime/world.d.ts.map +1 -1
  42. package/dist/runtime/world.js +3 -10
  43. package/dist/runtime.d.ts +1 -1
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +74 -122
  46. package/dist/sealed-box.d.ts +167 -0
  47. package/dist/sealed-box.d.ts.map +1 -0
  48. package/dist/sealed-box.js +571 -0
  49. package/dist/serialization/client.d.ts +3 -3
  50. package/dist/serialization/client.d.ts.map +1 -1
  51. package/dist/serialization/client.js +1 -1
  52. package/dist/serialization/codec.d.ts +6 -4
  53. package/dist/serialization/codec.d.ts.map +1 -1
  54. package/dist/serialization/codec.js +1 -1
  55. package/dist/serialization/encryption.d.ts +118 -17
  56. package/dist/serialization/encryption.d.ts.map +1 -1
  57. package/dist/serialization/encryption.js +131 -15
  58. package/dist/serialization/step.d.ts +4 -4
  59. package/dist/serialization/step.d.ts.map +1 -1
  60. package/dist/serialization/step.js +2 -2
  61. package/dist/serialization/types.d.ts +20 -0
  62. package/dist/serialization/types.d.ts.map +1 -1
  63. package/dist/serialization/types.js +11 -1
  64. package/dist/serialization-format.d.ts +44 -4
  65. package/dist/serialization-format.d.ts.map +1 -1
  66. package/dist/serialization-format.js +66 -9
  67. package/dist/serialization.d.ts +21 -21
  68. package/dist/serialization.d.ts.map +1 -1
  69. package/dist/serialization.js +496 -174
  70. package/dist/set-attributes.d.ts +2 -7
  71. package/dist/set-attributes.d.ts.map +1 -1
  72. package/dist/set-attributes.js +1 -6
  73. package/dist/step/context-storage.d.ts +2 -2
  74. package/dist/step/context-storage.d.ts.map +1 -1
  75. package/dist/step/context-storage.js +2 -2
  76. package/dist/step/writable-stream.d.ts.map +1 -1
  77. package/dist/step/writable-stream.js +14 -3
  78. package/dist/step.d.ts.map +1 -1
  79. package/dist/step.js +79 -8
  80. package/dist/symbols.d.ts +23 -10
  81. package/dist/symbols.d.ts.map +1 -1
  82. package/dist/symbols.js +24 -11
  83. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  84. package/dist/telemetry/semantic-conventions.js +2 -2
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.js +2 -2
  87. package/dist/vm/index.d.ts.map +1 -1
  88. package/dist/vm/index.js +76 -9
  89. package/dist/workflow/abort-controller.d.ts +1 -1
  90. package/dist/workflow/abort-controller.d.ts.map +1 -1
  91. package/dist/workflow/abort-controller.js +36 -2
  92. package/dist/workflow/hook.d.ts.map +1 -1
  93. package/dist/workflow/hook.js +64 -24
  94. package/dist/workflow/index.d.ts +1 -1
  95. package/dist/workflow/index.d.ts.map +1 -1
  96. package/dist/workflow/index.js +2 -2
  97. package/dist/workflow/set-attributes.d.ts +0 -9
  98. package/dist/workflow/set-attributes.d.ts.map +1 -1
  99. package/dist/workflow/set-attributes.js +1 -6
  100. package/dist/workflow/sleep.d.ts.map +1 -1
  101. package/dist/workflow/sleep.js +21 -9
  102. package/dist/workflow.d.ts +2 -2
  103. package/dist/workflow.d.ts.map +1 -1
  104. package/dist/workflow.js +22 -83
  105. package/docs/api-reference/set-attributes.mdx +0 -4
  106. package/docs/how-it-works/cancellation.mdx +2 -2
  107. package/docs/how-it-works/code-transform.mdx +19 -15
  108. package/docs/how-it-works/framework-integrations.mdx +95 -341
  109. package/package.json +6 -6
  110. package/dist/runtime/step-handler.d.ts +0 -2
  111. package/dist/runtime/step-handler.d.ts.map +0 -1
  112. package/dist/runtime/step-handler.js +0 -839
@@ -31,6 +31,12 @@
31
31
  * - `gzip` (gzip payload compression): added in `5.0.0-beta.18`
32
32
  * - `zstd` (zstd payload compression, preferred codec): added in `5.0.0-beta.18`
33
33
  * alongside gzip — they co-ship, so any run that can read one can read both.
34
+ * - `encp` (X25519 sealed-box encryption for cross-run writes): added in
35
+ * `5.0.0-beta.37`. Note that producers do **not** gate `encp` on this table:
36
+ * they gate on the presence of `encryptionPublicKey` on the target run,
37
+ * which a run only carries if the deployment that created it could also
38
+ * open `encp`. The entry exists so the capability set stays a complete,
39
+ * auditable description of a run's decoding ability.
34
40
  */
35
41
  import { type SerializationFormatType } from './serialization.js';
36
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAEvD;;;;;;;OAOG;IACH,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAgDD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,eAAe,CA4BjB"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAGH,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAEvD;;;;;;;OAOG;IACH,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,eAAe,CA4BjB"}
@@ -31,6 +31,12 @@
31
31
  * - `gzip` (gzip payload compression): added in `5.0.0-beta.18`
32
32
  * - `zstd` (zstd payload compression, preferred codec): added in `5.0.0-beta.18`
33
33
  * alongside gzip — they co-ship, so any run that can read one can read both.
34
+ * - `encp` (X25519 sealed-box encryption for cross-run writes): added in
35
+ * `5.0.0-beta.37`. Note that producers do **not** gate `encp` on this table:
36
+ * they gate on the presence of `encryptionPublicKey` on the target run,
37
+ * which a run only carries if the deployment that created it could also
38
+ * open `encp`. The entry exists so the capability set stays a complete,
39
+ * auditable description of a run's decoding ability.
34
40
  */
35
41
  import semver from 'semver';
36
42
  import { SerializationFormat, } from './serialization.js';
@@ -49,6 +55,12 @@ const FORMAT_VERSION_TABLE = [
49
55
  // they share a min version — a run that can read one can read both.
50
56
  { format: SerializationFormat.GZIP, minVersion: '5.0.0-beta.18' },
51
57
  { format: SerializationFormat.ZSTD, minVersion: '5.0.0-beta.18' },
58
+ // TODO(release): verify this matches the actual version that ships sealed-box
59
+ // encryption. If a "Version Packages (beta)" PR merges before this change,
60
+ // bump to the next beta. Unlike the entries above, a wrong cutoff here is
61
+ // not a correctness hazard: producers gate `encp` on the target run carrying
62
+ // an `encryptionPublicKey`, not on this table (see History above).
63
+ { format: SerializationFormat.SEALED, minVersion: '5.0.0-beta.37' },
52
64
  // Future entries:
53
65
  // { format: SerializationFormat.CBOR, minVersion: '5.x.y' },
54
66
  // { format: SerializationFormat.ENCRYPTED_V2, minVersion: '5.x.y' },
@@ -99,4 +111,4 @@ export function getRunCapabilities(workflowCoreVersion) {
99
111
  }
100
112
  return result;
101
113
  }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBRUgsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFDTCxtQkFBbUIsR0FFcEIsTUFBTSxvQkFBb0IsQ0FBQztBQXdCNUI7Ozs7R0FJRztBQUNILE1BQU0sb0JBQW9CLEdBR3JCO0lBQ0gsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDdEUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxvRUFBb0U7SUFDcEUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSxvRUFBb0U7SUFDcEUsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDakUsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDakUsa0JBQWtCO0lBQ2xCLDZEQUE2RDtJQUM3RCxxRUFBcUU7Q0FDdEUsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sd0JBQXdCLEdBUXpCLENBQUMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7QUFFeEU7Ozs7R0FJRztBQUNILE1BQU0sZ0JBQWdCLEdBQXlDLElBQUksR0FBRyxDQUFDO0lBQ3JFLG1CQUFtQixDQUFDLFVBQVU7Q0FDL0IsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLG1CQUF1QztJQUV2QyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMvRCxPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLGlCQUFpQixFQUFFLEtBQUs7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBMEIsZ0JBQWdCLENBQUMsQ0FBQztJQUVuRSxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMxRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQW9CO1FBQzlCLGdCQUFnQixFQUFFLE9BQU87UUFDekIsaUJBQWlCLEVBQUUsS0FBSztLQUN6QixDQUFDO0lBRUYsS0FBSyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDbEUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhcGFiaWxpdGllcyB0YWJsZSBmb3Igd29ya2Zsb3cgcnVucyBiYXNlZCBvbiB0aGVpciBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKlxuICogV2hlbiByZXN1bWluZyBhIGhvb2sgb3Igd2ViaG9vaywgdGhlIHBheWxvYWQgbXVzdCBiZSBlbmNvZGVkIGluIGEgZm9ybWF0XG4gKiB0aGF0IHRoZSAqdGFyZ2V0KiB3b3JrZmxvdyBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIFRoaXMgbW9kdWxlIHByb3ZpZGVzXG4gKiBhIHdheSB0byBsb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBmb3JtYXRzIGEgZ2l2ZW4gYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uXG4gKiBzdXBwb3J0cywgc28gdGhhdCBuZXdlciBkZXBsb3ltZW50cyBjYW4gYXZvaWQgZW5jb2RpbmcgcGF5bG9hZHMgaW4gZm9ybWF0c1xuICogdGhhdCBvbGRlciBkZXBsb3ltZW50cyBkb24ndCB1bmRlcnN0YW5kIChlLmcuLCB0aGUgYGVuY3JgIGVuY3J5cHRpb24gZm9ybWF0KS5cbiAqXG4gKiAjIyBBZGRpbmcgYSBuZXcgZm9ybWF0XG4gKlxuICogV2hlbiBhIG5ldyBzZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBpbnRyb2R1Y2VkOlxuICogMS4gQWRkIHRoZSBmb3JtYXQgY29uc3RhbnQgdG8gYFNlcmlhbGl6YXRpb25Gb3JtYXRgIGluIGBzZXJpYWxpemF0aW9uLnRzYFxuICogMi4gQWRkIGFuIGVudHJ5IHRvIGBGT1JNQVRfVkVSU0lPTl9UQUJMRWAgYmVsb3cgd2l0aCB0aGUgbWluaW11bVxuICogICAgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXRcbiAqIDMuIFRoZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzKClgIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBpbmNsdWRlIGl0XG4gKlxuICogIyMgQWRkaW5nIGEgbmV3IG5vbi1mb3JtYXQgY2FwYWJpbGl0eVxuICpcbiAqIFNvbWUgY2FwYWJpbGl0aWVzIGFyZW4ndCBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlcyDigJQgZS5nLlxuICogYnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nIGlzIGFuIGVudmVsb3BlIGFyb3VuZCBjaHVua3MgcmF0aGVyIHRoYW5cbiAqIGEgY29udGVudCBmb3JtYXQuIEZvciB0aG9zZSwgYWRkIGEgYm9vbGVhbiBmaWVsZCB0byBgUnVuQ2FwYWJpbGl0aWVzYFxuICogYW5kIGFuIGVudHJ5IGluIGBDQVBBQklMSVRZX1ZFUlNJT05fVEFCTEVgIGJlbG93LlxuICpcbiAqICMjIEhpc3RvcnlcbiAqXG4gKiAtIGBlbmNyYCAoQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbik6IGFkZGVkIGluIGA0LjIuMC1iZXRhLjY0YFxuICogICBDb21taXQ6IDc2MThhYzM2IFwiV2lyZSBBRVMtR0NNIGVuY3J5cHRpb24gaW50byBzZXJpYWxpemF0aW9uIGxheWVyICgjMTI1MSlcIlxuICogICBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2NvbW1pdC83NjE4YWMzNlxuICogLSBgZnJhbWVkQnl0ZVN0cmVhbXNgICh3aXJlLWxldmVsIGNodW5rIGZyYW1pbmcgZm9yIGJ5dGUgc3RyZWFtcyk6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE1YFxuICogLSBgZ3ppcGAgKGd6aXAgcGF5bG9hZCBjb21wcmVzc2lvbik6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE4YFxuICogLSBgenN0ZGAgKHpzdGQgcGF5bG9hZCBjb21wcmVzc2lvbiwgcHJlZmVycmVkIGNvZGVjKTogYWRkZWQgaW4gYDUuMC4wLWJldGEuMThgXG4gKiAgIGFsb25nc2lkZSBnemlwIOKAlCB0aGV5IGNvLXNoaXAsIHNvIGFueSBydW4gdGhhdCBjYW4gcmVhZCBvbmUgY2FuIHJlYWQgYm90aC5cbiAqL1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuXG4vKipcbiAqIENhcGFiaWxpdGllcyBvZiBhIHdvcmtmbG93IHJ1biBiYXNlZCBvbiBpdHMgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNhcGFiaWxpdGllcyB7XG4gIC8qKlxuICAgKiBUaGUgc2V0IG9mIHNlcmlhbGl6YXRpb24gZm9ybWF0IHByZWZpeGVzIHRoYXQgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZS5cbiAgICogVXNlIGBzdXBwb3J0ZWRGb3JtYXRzLmhhcyhTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRClgIHRvIGNoZWNrXG4gICAqIGlmIGVuY3J5cHRpb24gaXMgc3VwcG9ydGVkLCBldGMuXG4gICAqL1xuICBzdXBwb3J0ZWRGb3JtYXRzOiBSZWFkb25seVNldDxTZXJpYWxpemF0aW9uRm9ybWF0VHlwZT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZSB3aXJlLWZyYW1lZCBieXRlIHN0cmVhbXMuIFdoZW4gdHJ1ZSxcbiAgICogYnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2AgUmVhZGFibGVTdHJlYW1zIHBhc3NlZCBhY3Jvc3MgYm91bmRhcmllcylcbiAgICogYXJlIHdyYXBwZWQgaW4gYSBsZW5ndGgtcHJlZml4ZWQgZnJhbWUgZW52ZWxvcGUgb24gdGhlIHdpcmUgc28gdGhlXG4gICAqIHJlYWRlciBjYW4gaWRlbnRpZnkgY2h1bmsgYm91bmRhcmllcyDigJQgd2hpY2ggZW5hYmxlcyBhdXRvLXJlY29ubmVjdFxuICAgKiBvbiB0cmFuc2llbnQgc3RyZWFtIGVycm9ycy4gV2hlbiBmYWxzZSwgYnl0ZSBzdHJlYW1zIGFyZSB3cml0dGVuIGFzXG4gICAqIHJhdyBieXRlcyAodGhlIGxlZ2FjeSBmb3JtYXQpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAgICovXG4gIGZyYW1lZEJ5dGVTdHJlYW1zOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hcHMgc2VyaWFsaXphdGlvbiBmb3JtYXQgaWRlbnRpZmllcnMgdG8gdGhlIG1pbmltdW0gYEB3b3JrZmxvdy9jb3JlYFxuICogdmVyc2lvbiB0aGF0IGludHJvZHVjZWQgc3VwcG9ydCBmb3IgdGhlbS4gRm9ybWF0cyBub3QgbGlzdGVkIGhlcmUgYXJlXG4gKiBhc3N1bWVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwgc3BlY1ZlcnNpb24gMiBydW5zIChlLmcuLCBgZGV2bGApLlxuICovXG5jb25zdCBGT1JNQVRfVkVSU0lPTl9UQUJMRTogUmVhZG9ubHlBcnJheTx7XG4gIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdFR5cGU7XG4gIG1pblZlcnNpb246IHN0cmluZztcbn0+ID0gW1xuICB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQsIG1pblZlcnNpb246ICc0LjIuMC1iZXRhLjY0JyB9LFxuICAvLyBUT0RPKHJlbGVhc2UpOiB2ZXJpZnkgdGhpcyBtYXRjaGVzIHRoZSBhY3R1YWwgdmVyc2lvbiB0aGF0IHNoaXBzIHBheWxvYWRcbiAgLy8gY29tcHJlc3Npb24uIElmIGEgXCJWZXJzaW9uIFBhY2thZ2VzIChiZXRhKVwiIFBSIG1lcmdlcyBiZWZvcmUgdGhpcyBjaGFuZ2UsXG4gIC8vIGJ1bXAgdG8gdGhlIG5leHQgYmV0YS4gQSB0b28tbG93IGN1dG9mZiBtYWtlcyBuZXcgcHJvZHVjZXJzIHdyaXRlXG4gIC8vIGNvbXByZXNzZWQgcGF5bG9hZHMgdG8gY29uc3VtZXJzIHRoYXQgY2Fubm90IGRlY29tcHJlc3MgdGhlbTsgdG9vLWhpZ2hcbiAgLy8gbWVyZWx5IGRlbGF5cyB0aGUgb3B0aW1pemF0aW9uIChzYWZlKS4gZ3ppcCBhbmQgenN0ZCBzaGlwIHRvZ2V0aGVyLCBzb1xuICAvLyB0aGV5IHNoYXJlIGEgbWluIHZlcnNpb24g4oCUIGEgcnVuIHRoYXQgY2FuIHJlYWQgb25lIGNhbiByZWFkIGJvdGguXG4gIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVAsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjE4JyB9LFxuICB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5aU1RELCBtaW5WZXJzaW9uOiAnNS4wLjAtYmV0YS4xOCcgfSxcbiAgLy8gRnV0dXJlIGVudHJpZXM6XG4gIC8vIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkNCT1IsIG1pblZlcnNpb246ICc1LngueScgfSxcbiAgLy8geyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEX1YyLCBtaW5WZXJzaW9uOiAnNS54LnknIH0sXG5dO1xuXG4vKipcbiAqIE1hcHMgbm9uLWZvcm1hdCBjYXBhYmlsaXR5IGZsYWdzIChib29sZWFucyBvbiBgUnVuQ2FwYWJpbGl0aWVzYCkgdG8gdGhlXG4gKiBtaW5pbXVtIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbiB0aGF0IGludHJvZHVjZWQgc3VwcG9ydCBmb3IgdGhlbS5cbiAqL1xuY29uc3QgQ0FQQUJJTElUWV9WRVJTSU9OX1RBQkxFOiBSZWFkb25seUFycmF5PHtcbiAgY2FwYWJpbGl0eToga2V5b2YgT21pdDxSdW5DYXBhYmlsaXRpZXMsICdzdXBwb3J0ZWRGb3JtYXRzJz47XG4gIG1pblZlcnNpb246IHN0cmluZztcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBieXRlLXN0cmVhbVxuICAvLyBmcmFtaW5nLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLCBidW1wXG4gIC8vIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZSBmcmFtZWQgYnl0ZXMgdG9cbiAgLy8gY29uc3VtZXJzIHRoYXQgY2Fubm90IHVuZnJhbWUgdGhlbSAoc2lsZW50IGNvcnJ1cHRpb24pOyB0b28taGlnaCBtZXJlbHlcbiAgLy8gZGVsYXlzIHRoZSBvcHRpbWl6YXRpb24gKHNhZmUpLlxufT4gPSBbeyBjYXBhYmlsaXR5OiAnZnJhbWVkQnl0ZVN0cmVhbXMnLCBtaW5WZXJzaW9uOiAnNS4wLjAtYmV0YS4xNScgfV07XG5cbi8qKlxuICogVGhlIHNldCBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSBhbGwgc3BlY1ZlcnNpb24gMiBydW5zLCByZWdhcmRsZXNzIG9mXG4gKiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uIFRoZXNlIGFyZSB0aGUgYmFzZWxpbmUgZm9ybWF0cyB0aGF0IHdlcmUgcHJlc2VudFxuICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNwZWNWZXJzaW9uIDIgcHJvdG9jb2wuXG4gKi9cbmNvbnN0IEJBU0VMSU5FX0ZPUk1BVFM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPiA9IG5ldyBTZXQoW1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5dKTtcblxuLyoqXG4gKiBMb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBjYXBhYmlsaXRpZXMgYSB3b3JrZmxvdyBydW4gc3VwcG9ydHMgYmFzZWQgb25cbiAqIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gc3RyaW5nIChmcm9tIGBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Q29yZVZlcnNpb25gKS5cbiAqXG4gKiBXaGVuIHRoZSB2ZXJzaW9uIGlzIGB1bmRlZmluZWRgLCBub3QgYSBzdHJpbmcsIG9yIG5vdCBhIHZhbGlkIHNlbXZlciBzdHJpbmdcbiAqIChlLmcuIHZlcnkgb2xkIHJ1bnMgdGhhdCBwcmVkYXRlIHRoZSBmaWVsZCwgb3IgY29ycnVwdGVkIG1ldGFkYXRhKSxcbiAqIHdlIGFzc3VtZSB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgY2FwYWJpbGl0aWVzIChiYXNlbGluZSBmb3JtYXRzIG9ubHksXG4gKiBub24tZm9ybWF0IGNhcGFiaWxpdGllcyBhbGwgYGZhbHNlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gIHdvcmtmbG93Q29yZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUnVuQ2FwYWJpbGl0aWVzIHtcbiAgaWYgKCF3b3JrZmxvd0NvcmVWZXJzaW9uIHx8ICFzZW12ZXIudmFsaWQod29ya2Zsb3dDb3JlVmVyc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VwcG9ydGVkRm9ybWF0czogQkFTRUxJTkVfRk9STUFUUyxcbiAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZm9ybWF0cyA9IG5ldyBTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+KEJBU0VMSU5FX0ZPUk1BVFMpO1xuXG4gIGZvciAoY29uc3QgeyBmb3JtYXQsIG1pblZlcnNpb24gfSBvZiBGT1JNQVRfVkVSU0lPTl9UQUJMRSkge1xuICAgIGlmIChzZW12ZXIuZ3RlKHdvcmtmbG93Q29yZVZlcnNpb24sIG1pblZlcnNpb24pKSB7XG4gICAgICBmb3JtYXRzLmFkZChmb3JtYXQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUnVuQ2FwYWJpbGl0aWVzID0ge1xuICAgIHN1cHBvcnRlZEZvcm1hdHM6IGZvcm1hdHMsXG4gICAgZnJhbWVkQnl0ZVN0cmVhbXM6IGZhbHNlLFxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBjYXBhYmlsaXR5LCBtaW5WZXJzaW9uIH0gb2YgQ0FQQUJJTElUWV9WRVJTSU9OX1RBQkxFKSB7XG4gICAgaWYgKHNlbXZlci5ndGUod29ya2Zsb3dDb3JlVmVyc2lvbiwgbWluVmVyc2lvbikpIHtcbiAgICAgIHJlc3VsdFtjYXBhYmlsaXR5XSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBRUgsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFDTCxtQkFBbUIsR0FFcEIsTUFBTSxvQkFBb0IsQ0FBQztBQXdCNUI7Ozs7R0FJRztBQUNILE1BQU0sb0JBQW9CLEdBR3JCO0lBQ0gsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDdEUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxvRUFBb0U7SUFDcEUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSxvRUFBb0U7SUFDcEUsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDakUsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDakUsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLG1FQUFtRTtJQUNuRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNuRSxrQkFBa0I7SUFDbEIsNkRBQTZEO0lBQzdELHFFQUFxRTtDQUN0RSxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSx3QkFBd0IsR0FRekIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztBQUV4RTs7OztHQUlHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBeUMsSUFBSSxHQUFHLENBQUM7SUFDckUsbUJBQW1CLENBQUMsVUFBVTtDQUMvQixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsbUJBQXVDO0lBRXZDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQy9ELE9BQU87WUFDTCxnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsaUJBQWlCLEVBQUUsS0FBSztTQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUEwQixnQkFBZ0IsQ0FBQyxDQUFDO0lBRW5FLEtBQUssTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzFELElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBb0I7UUFDOUIsZ0JBQWdCLEVBQUUsT0FBTztRQUN6QixpQkFBaUIsRUFBRSxLQUFLO0tBQ3pCLENBQUM7SUFFRixLQUFLLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FwYWJpbGl0aWVzIHRhYmxlIGZvciB3b3JrZmxvdyBydW5zIGJhc2VkIG9uIHRoZWlyIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbi5cbiAqXG4gKiBXaGVuIHJlc3VtaW5nIGEgaG9vayBvciB3ZWJob29rLCB0aGUgcGF5bG9hZCBtdXN0IGJlIGVuY29kZWQgaW4gYSBmb3JtYXRcbiAqIHRoYXQgdGhlICp0YXJnZXQqIHdvcmtmbG93IHJ1bidzIGRlcGxveW1lbnQgY2FuIGRlY29kZS4gVGhpcyBtb2R1bGUgcHJvdmlkZXNcbiAqIGEgd2F5IHRvIGxvb2sgdXAgd2hhdCBzZXJpYWxpemF0aW9uIGZvcm1hdHMgYSBnaXZlbiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb25cbiAqIHN1cHBvcnRzLCBzbyB0aGF0IG5ld2VyIGRlcGxveW1lbnRzIGNhbiBhdm9pZCBlbmNvZGluZyBwYXlsb2FkcyBpbiBmb3JtYXRzXG4gKiB0aGF0IG9sZGVyIGRlcGxveW1lbnRzIGRvbid0IHVuZGVyc3RhbmQgKGUuZy4sIHRoZSBgZW5jcmAgZW5jcnlwdGlvbiBmb3JtYXQpLlxuICpcbiAqICMjIEFkZGluZyBhIG5ldyBmb3JtYXRcbiAqXG4gKiBXaGVuIGEgbmV3IHNlcmlhbGl6YXRpb24gZm9ybWF0IGlzIGludHJvZHVjZWQ6XG4gKiAxLiBBZGQgdGhlIGZvcm1hdCBjb25zdGFudCB0byBgU2VyaWFsaXphdGlvbkZvcm1hdGAgaW4gYHNlcmlhbGl6YXRpb24udHNgXG4gKiAyLiBBZGQgYW4gZW50cnkgdG8gYEZPUk1BVF9WRVJTSU9OX1RBQkxFYCBiZWxvdyB3aXRoIHRoZSBtaW5pbXVtXG4gKiAgICBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBpdFxuICogMy4gVGhlIGBnZXRSdW5DYXBhYmlsaXRpZXMoKWAgZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgaXRcbiAqXG4gKiAjIyBBZGRpbmcgYSBuZXcgbm9uLWZvcm1hdCBjYXBhYmlsaXR5XG4gKlxuICogU29tZSBjYXBhYmlsaXRpZXMgYXJlbid0IHNlcmlhbGl6YXRpb24gZm9ybWF0IHByZWZpeGVzIOKAlCBlLmcuXG4gKiBieXRlLXN0cmVhbSB3aXJlIGZyYW1pbmcgaXMgYW4gZW52ZWxvcGUgYXJvdW5kIGNodW5rcyByYXRoZXIgdGhhblxuICogYSBjb250ZW50IGZvcm1hdC4gRm9yIHRob3NlLCBhZGQgYSBib29sZWFuIGZpZWxkIHRvIGBSdW5DYXBhYmlsaXRpZXNgXG4gKiBhbmQgYW4gZW50cnkgaW4gYENBUEFCSUxJVFlfVkVSU0lPTl9UQUJMRWAgYmVsb3cuXG4gKlxuICogIyMgSGlzdG9yeVxuICpcbiAqIC0gYGVuY3JgIChBRVMtMjU2LUdDTSBlbmNyeXB0aW9uKTogYWRkZWQgaW4gYDQuMi4wLWJldGEuNjRgXG4gKiAgIENvbW1pdDogNzYxOGFjMzYgXCJXaXJlIEFFUy1HQ00gZW5jcnlwdGlvbiBpbnRvIHNlcmlhbGl6YXRpb24gbGF5ZXIgKCMxMjUxKVwiXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvY29tbWl0Lzc2MThhYzM2XG4gKiAtIGBmcmFtZWRCeXRlU3RyZWFtc2AgKHdpcmUtbGV2ZWwgY2h1bmsgZnJhbWluZyBmb3IgYnl0ZSBzdHJlYW1zKTogYWRkZWQgaW4gYDUuMC4wLWJldGEuMTVgXG4gKiAtIGBnemlwYCAoZ3ppcCBwYXlsb2FkIGNvbXByZXNzaW9uKTogYWRkZWQgaW4gYDUuMC4wLWJldGEuMThgXG4gKiAtIGB6c3RkYCAoenN0ZCBwYXlsb2FkIGNvbXByZXNzaW9uLCBwcmVmZXJyZWQgY29kZWMpOiBhZGRlZCBpbiBgNS4wLjAtYmV0YS4xOGBcbiAqICAgYWxvbmdzaWRlIGd6aXAg4oCUIHRoZXkgY28tc2hpcCwgc28gYW55IHJ1biB0aGF0IGNhbiByZWFkIG9uZSBjYW4gcmVhZCBib3RoLlxuICogLSBgZW5jcGAgKFgyNTUxOSBzZWFsZWQtYm94IGVuY3J5cHRpb24gZm9yIGNyb3NzLXJ1biB3cml0ZXMpOiBhZGRlZCBpblxuICogICBgNS4wLjAtYmV0YS4zN2AuIE5vdGUgdGhhdCBwcm9kdWNlcnMgZG8gKipub3QqKiBnYXRlIGBlbmNwYCBvbiB0aGlzIHRhYmxlOlxuICogICB0aGV5IGdhdGUgb24gdGhlIHByZXNlbmNlIG9mIGBlbmNyeXB0aW9uUHVibGljS2V5YCBvbiB0aGUgdGFyZ2V0IHJ1bixcbiAqICAgd2hpY2ggYSBydW4gb25seSBjYXJyaWVzIGlmIHRoZSBkZXBsb3ltZW50IHRoYXQgY3JlYXRlZCBpdCBjb3VsZCBhbHNvXG4gKiAgIG9wZW4gYGVuY3BgLiBUaGUgZW50cnkgZXhpc3RzIHNvIHRoZSBjYXBhYmlsaXR5IHNldCBzdGF5cyBhIGNvbXBsZXRlLFxuICogICBhdWRpdGFibGUgZGVzY3JpcHRpb24gb2YgYSBydW4ncyBkZWNvZGluZyBhYmlsaXR5LlxuICovXG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7XG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG4gIHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbi8qKlxuICogQ2FwYWJpbGl0aWVzIG9mIGEgd29ya2Zsb3cgcnVuIGJhc2VkIG9uIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ2FwYWJpbGl0aWVzIHtcbiAgLyoqXG4gICAqIFRoZSBzZXQgb2Ygc2VyaWFsaXphdGlvbiBmb3JtYXQgcHJlZml4ZXMgdGhhdCB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlLlxuICAgKiBVc2UgYHN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKWAgdG8gY2hlY2tcbiAgICogaWYgZW5jcnlwdGlvbiBpcyBzdXBwb3J0ZWQsIGV0Yy5cbiAgICovXG4gIHN1cHBvcnRlZEZvcm1hdHM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkIGJ5dGUgc3RyZWFtcy4gV2hlbiB0cnVlLFxuICAgKiBieXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYCBSZWFkYWJsZVN0cmVhbXMgcGFzc2VkIGFjcm9zcyBib3VuZGFyaWVzKVxuICAgKiBhcmUgd3JhcHBlZCBpbiBhIGxlbmd0aC1wcmVmaXhlZCBmcmFtZSBlbnZlbG9wZSBvbiB0aGUgd2lyZSBzbyB0aGVcbiAgICogcmVhZGVyIGNhbiBpZGVudGlmeSBjaHVuayBib3VuZGFyaWVzIOKAlCB3aGljaCBlbmFibGVzIGF1dG8tcmVjb25uZWN0XG4gICAqIG9uIHRyYW5zaWVudCBzdHJlYW0gZXJyb3JzLiBXaGVuIGZhbHNlLCBieXRlIHN0cmVhbXMgYXJlIHdyaXR0ZW4gYXNcbiAgICogcmF3IGJ5dGVzICh0aGUgbGVnYWN5IGZvcm1hdCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICAgKi9cbiAgZnJhbWVkQnl0ZVN0cmVhbXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTWFwcyBzZXJpYWxpemF0aW9uIGZvcm1hdCBpZGVudGlmaWVycyB0byB0aGUgbWluaW11bSBgQHdvcmtmbG93L2NvcmVgXG4gKiB2ZXJzaW9uIHRoYXQgaW50cm9kdWNlZCBzdXBwb3J0IGZvciB0aGVtLiBGb3JtYXRzIG5vdCBsaXN0ZWQgaGVyZSBhcmVcbiAqIGFzc3VtZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGFsbCBzcGVjVmVyc2lvbiAyIHJ1bnMgKGUuZy4sIGBkZXZsYCkuXG4gKi9cbmNvbnN0IEZPUk1BVF9WRVJTSU9OX1RBQkxFOiBSZWFkb25seUFycmF5PHtcbiAgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZTtcbiAgbWluVmVyc2lvbjogc3RyaW5nO1xufT4gPSBbXG4gIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCwgbWluVmVyc2lvbjogJzQuMi4wLWJldGEuNjQnIH0sXG4gIC8vIFRPRE8ocmVsZWFzZSk6IHZlcmlmeSB0aGlzIG1hdGNoZXMgdGhlIGFjdHVhbCB2ZXJzaW9uIHRoYXQgc2hpcHMgcGF5bG9hZFxuICAvLyBjb21wcmVzc2lvbi4gSWYgYSBcIlZlcnNpb24gUGFja2FnZXMgKGJldGEpXCIgUFIgbWVyZ2VzIGJlZm9yZSB0aGlzIGNoYW5nZSxcbiAgLy8gYnVtcCB0byB0aGUgbmV4dCBiZXRhLiBBIHRvby1sb3cgY3V0b2ZmIG1ha2VzIG5ldyBwcm9kdWNlcnMgd3JpdGVcbiAgLy8gY29tcHJlc3NlZCBwYXlsb2FkcyB0byBjb25zdW1lcnMgdGhhdCBjYW5ub3QgZGVjb21wcmVzcyB0aGVtOyB0b28taGlnaFxuICAvLyBtZXJlbHkgZGVsYXlzIHRoZSBvcHRpbWl6YXRpb24gKHNhZmUpLiBnemlwIGFuZCB6c3RkIHNoaXAgdG9nZXRoZXIsIHNvXG4gIC8vIHRoZXkgc2hhcmUgYSBtaW4gdmVyc2lvbiDigJQgYSBydW4gdGhhdCBjYW4gcmVhZCBvbmUgY2FuIHJlYWQgYm90aC5cbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMTgnIH0sXG4gIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjE4JyB9LFxuICAvLyBUT0RPKHJlbGVhc2UpOiB2ZXJpZnkgdGhpcyBtYXRjaGVzIHRoZSBhY3R1YWwgdmVyc2lvbiB0aGF0IHNoaXBzIHNlYWxlZC1ib3hcbiAgLy8gZW5jcnlwdGlvbi4gSWYgYSBcIlZlcnNpb24gUGFja2FnZXMgKGJldGEpXCIgUFIgbWVyZ2VzIGJlZm9yZSB0aGlzIGNoYW5nZSxcbiAgLy8gYnVtcCB0byB0aGUgbmV4dCBiZXRhLiBVbmxpa2UgdGhlIGVudHJpZXMgYWJvdmUsIGEgd3JvbmcgY3V0b2ZmIGhlcmUgaXNcbiAgLy8gbm90IGEgY29ycmVjdG5lc3MgaGF6YXJkOiBwcm9kdWNlcnMgZ2F0ZSBgZW5jcGAgb24gdGhlIHRhcmdldCBydW4gY2FycnlpbmdcbiAgLy8gYW4gYGVuY3J5cHRpb25QdWJsaWNLZXlgLCBub3Qgb24gdGhpcyB0YWJsZSAoc2VlIEhpc3RvcnkgYWJvdmUpLlxuICB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjM3JyB9LFxuICAvLyBGdXR1cmUgZW50cmllczpcbiAgLy8geyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuQ0JPUiwgbWluVmVyc2lvbjogJzUueC55JyB9LFxuICAvLyB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURURfVjIsIG1pblZlcnNpb246ICc1LngueScgfSxcbl07XG5cbi8qKlxuICogTWFwcyBub24tZm9ybWF0IGNhcGFiaWxpdHkgZmxhZ3MgKGJvb2xlYW5zIG9uIGBSdW5DYXBhYmlsaXRpZXNgKSB0byB0aGVcbiAqIG1pbmltdW0gYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHRoYXQgaW50cm9kdWNlZCBzdXBwb3J0IGZvciB0aGVtLlxuICovXG5jb25zdCBDQVBBQklMSVRZX1ZFUlNJT05fVEFCTEU6IFJlYWRvbmx5QXJyYXk8e1xuICBjYXBhYmlsaXR5OiBrZXlvZiBPbWl0PFJ1bkNhcGFiaWxpdGllcywgJ3N1cHBvcnRlZEZvcm1hdHMnPjtcbiAgbWluVmVyc2lvbjogc3RyaW5nO1xuICAvLyBUT0RPKHJlbGVhc2UpOiB2ZXJpZnkgdGhpcyBtYXRjaGVzIHRoZSBhY3R1YWwgdmVyc2lvbiB0aGF0IHNoaXBzIGJ5dGUtc3RyZWFtXG4gIC8vIGZyYW1pbmcuIElmIGEgXCJWZXJzaW9uIFBhY2thZ2VzIChiZXRhKVwiIFBSIG1lcmdlcyBiZWZvcmUgdGhpcyBjaGFuZ2UsIGJ1bXBcbiAgLy8gdG8gdGhlIG5leHQgYmV0YS4gQSB0b28tbG93IGN1dG9mZiBtYWtlcyBuZXcgcHJvZHVjZXJzIHdyaXRlIGZyYW1lZCBieXRlcyB0b1xuICAvLyBjb25zdW1lcnMgdGhhdCBjYW5ub3QgdW5mcmFtZSB0aGVtIChzaWxlbnQgY29ycnVwdGlvbik7IHRvby1oaWdoIG1lcmVseVxuICAvLyBkZWxheXMgdGhlIG9wdGltaXphdGlvbiAoc2FmZSkuXG59PiA9IFt7IGNhcGFiaWxpdHk6ICdmcmFtZWRCeXRlU3RyZWFtcycsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjE1JyB9XTtcblxuLyoqXG4gKiBUaGUgc2V0IG9mIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IGFsbCBzcGVjVmVyc2lvbiAyIHJ1bnMsIHJlZ2FyZGxlc3Mgb2ZcbiAqIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbi4gVGhlc2UgYXJlIHRoZSBiYXNlbGluZSBmb3JtYXRzIHRoYXQgd2VyZSBwcmVzZW50XG4gKiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3BlY1ZlcnNpb24gMiBwcm90b2NvbC5cbiAqL1xuY29uc3QgQkFTRUxJTkVfRk9STUFUUzogUmVhZG9ubHlTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+ID0gbmV3IFNldChbXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbl0pO1xuXG4vKipcbiAqIExvb2sgdXAgd2hhdCBzZXJpYWxpemF0aW9uIGNhcGFiaWxpdGllcyBhIHdvcmtmbG93IHJ1biBzdXBwb3J0cyBiYXNlZCBvblxuICogaXRzIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbiBzdHJpbmcgKGZyb20gYGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvbmApLlxuICpcbiAqIFdoZW4gdGhlIHZlcnNpb24gaXMgYHVuZGVmaW5lZGAsIG5vdCBhIHN0cmluZywgb3Igbm90IGEgdmFsaWQgc2VtdmVyIHN0cmluZ1xuICogKGUuZy4gdmVyeSBvbGQgcnVucyB0aGF0IHByZWRhdGUgdGhlIGZpZWxkLCBvciBjb3JydXB0ZWQgbWV0YWRhdGEpLFxuICogd2UgYXNzdW1lIHRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBjYXBhYmlsaXRpZXMgKGJhc2VsaW5lIGZvcm1hdHMgb25seSxcbiAqIG5vbi1mb3JtYXQgY2FwYWJpbGl0aWVzIGFsbCBgZmFsc2VgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkNhcGFiaWxpdGllcyhcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSdW5DYXBhYmlsaXRpZXMge1xuICBpZiAoIXdvcmtmbG93Q29yZVZlcnNpb24gfHwgIXNlbXZlci52YWxpZCh3b3JrZmxvd0NvcmVWZXJzaW9uKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdXBwb3J0ZWRGb3JtYXRzOiBCQVNFTElORV9GT1JNQVRTLFxuICAgICAgZnJhbWVkQnl0ZVN0cmVhbXM6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBmb3JtYXRzID0gbmV3IFNldDxTZXJpYWxpemF0aW9uRm9ybWF0VHlwZT4oQkFTRUxJTkVfRk9STUFUUyk7XG5cbiAgZm9yIChjb25zdCB7IGZvcm1hdCwgbWluVmVyc2lvbiB9IG9mIEZPUk1BVF9WRVJTSU9OX1RBQkxFKSB7XG4gICAgaWYgKHNlbXZlci5ndGUod29ya2Zsb3dDb3JlVmVyc2lvbiwgbWluVmVyc2lvbikpIHtcbiAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBSdW5DYXBhYmlsaXRpZXMgPSB7XG4gICAgc3VwcG9ydGVkRm9ybWF0czogZm9ybWF0cyxcbiAgICBmcmFtZWRCeXRlU3RyZWFtczogZmFsc2UsXG4gIH07XG5cbiAgZm9yIChjb25zdCB7IGNhcGFiaWxpdHksIG1pblZlcnNpb24gfSBvZiBDQVBBQklMSVRZX1ZFUlNJT05fVEFCTEUpIHtcbiAgICBpZiAoc2VtdmVyLmd0ZSh3b3JrZmxvd0NvcmVWZXJzaW9uLCBtaW5WZXJzaW9uKSkge1xuICAgICAgcmVzdWx0W2NhcGFiaWxpdHldID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
@@ -16,6 +16,12 @@
16
16
  * by the serialization layer in `maybeEncrypt`/`maybeDecrypt`.
17
17
  */
18
18
  export type CryptoKey = import('node:crypto').webcrypto.CryptoKey;
19
+ /** AES-GCM nonce length in bytes. */
20
+ export declare const NONCE_LENGTH = 12;
21
+ /** AES-GCM authentication tag length in bits. */
22
+ export declare const TAG_LENGTH = 128;
23
+ /** AES-GCM authentication tag length in bytes. */
24
+ export declare const TAG_BYTES: number;
19
25
  /**
20
26
  * Import a raw AES-256 key as a `CryptoKey` for use with `encrypt()`/`decrypt()`.
21
27
  *
@@ -37,9 +43,13 @@ export declare function importKey(raw: Uint8Array, usages?: ReadonlyArray<'encry
37
43
  *
38
44
  * @param key - CryptoKey from `importKey()`
39
45
  * @param data - Plaintext to encrypt
46
+ * @param aad - Optional additional authenticated data. Not encrypted, but
47
+ * covered by the GCM auth tag: decryption fails unless the exact same
48
+ * bytes are supplied. Used by the sealed-box layer to bind ciphertext to
49
+ * a `projectId|runId` context. Omit for no AAD (the legacy behavior).
40
50
  * @returns `[nonce (12 bytes)][ciphertext + GCM auth tag]`
41
51
  */
42
- export declare function encrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8Array>;
52
+ export declare function encrypt(key: CryptoKey, data: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
43
53
  /**
44
54
  * Decrypt data using AES-256-GCM.
45
55
  *
@@ -60,7 +70,10 @@ export declare function encrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8
60
70
  *
61
71
  * @param key - CryptoKey from `importKey()`
62
72
  * @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
73
+ * @param aad - Optional additional authenticated data. Must match the bytes
74
+ * passed to {@link encrypt} exactly, otherwise the GCM tag fails to verify
75
+ * and a {@link RuntimeDecryptionError} is thrown.
63
76
  * @returns Decrypted plaintext
64
77
  */
65
- export declare function decrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8Array>;
78
+ export declare function decrypt(key: CryptoKey, data: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
66
79
  //# sourceMappingURL=encryption.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAMlE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,aAAa,CAAC,SAAS,GAAG,SAAS,CAA0B,iDAiBtE;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA4BrB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA0CrB"}
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAElE,qCAAqC;AACrC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,iDAAiD;AACjD,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,kDAAkD;AAClD,eAAO,MAAM,SAAS,QAAiB,CAAC;AAGxC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,aAAa,CAAC,SAAS,GAAG,SAAS,CAA0B,iDAiBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAiCrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA+CrB"}
@@ -1,6 +1,10 @@
1
1
  import { RuntimeDecryptionError, WorkflowRuntimeError } from '@workflow/errors';
2
- const NONCE_LENGTH = 12;
3
- const TAG_LENGTH = 128; // bits
2
+ /** AES-GCM nonce length in bytes. */
3
+ export const NONCE_LENGTH = 12;
4
+ /** AES-GCM authentication tag length in bits. */
5
+ export const TAG_LENGTH = 128;
6
+ /** AES-GCM authentication tag length in bytes. */
7
+ export const TAG_BYTES = TAG_LENGTH / 8;
4
8
  const KEY_LENGTH = 32; // bytes (AES-256)
5
9
  /**
6
10
  * Import a raw AES-256 key as a `CryptoKey` for use with `encrypt()`/`decrypt()`.
@@ -32,13 +36,22 @@ export async function importKey(raw, usages = ['encrypt', 'decrypt']) {
32
36
  *
33
37
  * @param key - CryptoKey from `importKey()`
34
38
  * @param data - Plaintext to encrypt
39
+ * @param aad - Optional additional authenticated data. Not encrypted, but
40
+ * covered by the GCM auth tag: decryption fails unless the exact same
41
+ * bytes are supplied. Used by the sealed-box layer to bind ciphertext to
42
+ * a `projectId|runId` context. Omit for no AAD (the legacy behavior).
35
43
  * @returns `[nonce (12 bytes)][ciphertext + GCM auth tag]`
36
44
  */
37
- export async function encrypt(key, data) {
45
+ export async function encrypt(key, data, aad) {
38
46
  const nonce = globalThis.crypto.getRandomValues(new Uint8Array(NONCE_LENGTH));
39
47
  let ciphertext;
40
48
  try {
41
- ciphertext = await globalThis.crypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, data);
49
+ ciphertext = await globalThis.crypto.subtle.encrypt({
50
+ name: 'AES-GCM',
51
+ iv: nonce,
52
+ tagLength: TAG_LENGTH,
53
+ ...(aad ? { additionalData: aad } : {}),
54
+ }, key, data);
42
55
  }
43
56
  catch (cause) {
44
57
  // Re-wrap any Web Crypto failure (DOMException etc.) as a
@@ -77,9 +90,12 @@ export async function encrypt(key, data) {
77
90
  *
78
91
  * @param key - CryptoKey from `importKey()`
79
92
  * @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
93
+ * @param aad - Optional additional authenticated data. Must match the bytes
94
+ * passed to {@link encrypt} exactly, otherwise the GCM tag fails to verify
95
+ * and a {@link RuntimeDecryptionError} is thrown.
80
96
  * @returns Decrypted plaintext
81
97
  */
82
- export async function decrypt(key, data) {
98
+ export async function decrypt(key, data, aad) {
83
99
  const minLength = NONCE_LENGTH + TAG_LENGTH / 8; // nonce + auth tag
84
100
  if (data.byteLength < minLength) {
85
101
  throw new RuntimeDecryptionError(`Encrypted data too short: expected at least ${minLength} bytes, got ${data.byteLength}`, {
@@ -93,7 +109,12 @@ export async function decrypt(key, data) {
93
109
  const ciphertext = data.subarray(NONCE_LENGTH);
94
110
  let plaintext;
95
111
  try {
96
- plaintext = await globalThis.crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, ciphertext);
112
+ plaintext = await globalThis.crypto.subtle.decrypt({
113
+ name: 'AES-GCM',
114
+ iv: nonce,
115
+ tagLength: TAG_LENGTH,
116
+ ...(aad ? { additionalData: aad } : {}),
117
+ }, key, ciphertext);
97
118
  }
98
119
  catch (cause) {
99
120
  // The most common shape we see in the wild is a DOMException with
@@ -113,4 +134,4 @@ export async function decrypt(key, data) {
113
134
  }
114
135
  return new Uint8Array(plaintext);
115
136
  }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJoRixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTztBQUMvQixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7QUFFekM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsR0FBZSxFQUNmLFNBQStDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUVyRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixrQ0FBa0MsVUFBVSxlQUFlLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDdkMsS0FBSyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBQ1QsS0FBSztJQUNMLG1FQUFtRTtJQUNuRSxvRUFBb0U7SUFDcEUsMERBQTBEO0lBQzFELE1BQW1DLENBQ3BDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLEdBQWMsRUFDZCxJQUFnQjtJQUVoQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzlFLElBQUksVUFBdUIsQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxD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ZWNyeXB0aW9uRXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5cbi8qKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gbW9kdWxlLlxuICpcbiAqIFVzZXMgdGhlIFdlYiBDcnlwdG8gQVBJIChgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlYCkgd2hpY2ggd29ya3MgaW5cbiAqIGJvdGggbW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKy4gVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseVxuICogZnJlZSBvZiBOb2RlLmpzLXNwZWNpZmljIGltcG9ydHMgc28gaXQgY2FuIGJlIGJ1bmRsZWQgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSBXb3JsZCBpbnRlcmZhY2UgKGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCkgcmV0dXJucyBhIHJhdyAzMi1ieXRlXG4gKiBBRVMtMjU2IGtleS4gQ2FsbGVycyBzaG91bGQgdXNlIGBpbXBvcnRLZXkoKWAgb25jZSB0byBjb252ZXJ0IGl0IHRvIGFcbiAqIGBDcnlwdG9LZXlgLCB0aGVuIHBhc3MgdGhhdCB0byBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYCBmb3IgYWxsXG4gKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBydW4uIFRoaXMgYXZvaWRzIHJlcGVhdGVkIGBpbXBvcnRLZXkoKWBcbiAqIGNhbGxzIG9uIGV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBpbnZvY2F0aW9uLlxuICpcbiAqIFdpcmUgZm9ybWF0OiBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBhdXRoIHRhZ11gXG4gKiBUaGUgYGVuY3JgIGZvcm1hdCBwcmVmaXggaXMgTk9UIHBhcnQgb2YgdGhpcyBtb2R1bGUg4oCUIGl0J3MgYWRkZWQvc3RyaXBwZWRcbiAqIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIGluIGBtYXliZUVuY3J5cHRgL2BtYXliZURlY3J5cHRgLlxuICovXG5cbi8vIENyeXB0b0tleSBpcyBhIGdsb2JhbCB0eXBlIGluIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKywgYnV0IFR5cGVTY3JpcHQnc1xuLy8gYGVzMjAyMmAgbGliIGRvZXNuJ3QgaW5jbHVkZSBpdC4gUmUtZXhwb3J0IGl0IGZyb20gdGhlIG5vZGU6Y3J5cHRvIHR5cGVzXG4vLyBzbyBjb25zdW1lcnMgY2FuIHJlZmVyZW5jZSBpdCB3aXRob3V0IGFkZGluZyBgZG9tYCBsaWIuXG5leHBvcnQgdHlwZSBDcnlwdG9LZXkgPSBpbXBvcnQoJ25vZGU6Y3J5cHRvJykud2ViY3J5cHRvLkNyeXB0b0tleTtcblxuY29uc3QgTk9OQ0VfTEVOR1RIID0gMTI7XG5jb25zdCBUQUdfTEVOR1RIID0gMTI4OyAvLyBiaXRzXG5jb25zdCBLRVlfTEVOR1RIID0gMzI7IC8vIGJ5dGVzIChBRVMtMjU2KVxuXG4vKipcbiAqIEltcG9ydCBhIHJhdyBBRVMtMjU2IGtleSBhcyBhIGBDcnlwdG9LZXlgIGZvciB1c2Ugd2l0aCBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYC5cbiAqXG4gKiBDYWxsZXJzIHNob3VsZCBjYWxsIHRoaXMgb25jZSBwZXIgcnVuIChhZnRlciBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bigpYClcbiAqIGFuZCBwYXNzIHRoZSByZXN1bHRpbmcgYENyeXB0b0tleWAgdG8gYWxsIHN1YnNlcXVlbnQgZW5jcnlwdC9kZWNyeXB0IGNhbGxzLlxuICpcbiAqIFBhc3MgYHVzYWdlczogWydlbmNyeXB0J11gIChvciBgWydkZWNyeXB0J11gKSBmb3IgY3Jvc3MtcnVuIHNjZW5hcmlvc1xuICogd2hlcmUgdGhlIGNhbGxlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcGVyZm9ybSB0aGUgaW52ZXJzZSBvcGVyYXRpb25cbiAqIHdpdGggdGhlIGtleSDigJQgZm9yIGV4YW1wbGUgYSBjaGlsZCB3b3JrZmxvdyB3cml0aW5nIGludG8gYSBwYXJlbnRcbiAqIHJ1bidzIGZvcndhcmRlZCBXcml0YWJsZVN0cmVhbSBvbmx5IG5lZWRzIHRvIGVuY3J5cHQsIG5ldmVyIGRlY3J5cHQuXG4gKlxuICogQHBhcmFtIHJhdyAtIFJhdyAzMi1ieXRlIEFFUy0yNTYga2V5IChmcm9tIFdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pXG4gKiBAcGFyYW0gdXNhZ2VzIC0gS2V5IHVzYWdlcy4gRGVmYXVsdHMgdG8gYFsnZW5jcnlwdCcsICdkZWNyeXB0J11gLlxuICogQHJldHVybnMgQ3J5cHRvS2V5IHJlYWR5IGZvciBBRVMtR0NNIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEtleShcbiAgcmF3OiBVaW50OEFycmF5LFxuICB1c2FnZXM6IFJlYWRvbmx5QXJyYXk8J2VuY3J5cHQnIHwgJ2RlY3J5cHQnPiA9IFsnZW5jcnlwdCcsICdkZWNyeXB0J11cbikge1xuICBpZiAocmF3LmJ5dGVMZW5ndGggIT09IEtFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgRW5jcnlwdGlvbiBrZXkgbXVzdCBiZSBleGFjdGx5ICR7S0VZX0xFTkdUSH0gYnl0ZXMsIGdvdCAke3Jhdy5ieXRlTGVuZ3RofWBcbiAgICApO1xuICB9XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICdyYXcnLFxuICAgIHJhdyxcbiAgICAnQUVTLUdDTScsXG4gICAgZmFsc2UsXG4gICAgLy8gYEtleVVzYWdlYCBpcyBhIERPTS1saWIgdHlwZSB0aGF0J3Mgbm90IGluIHNjb3BlIHVuZGVyIGBlczIwMjJgLlxuICAgIC8vIFRoZSBgUmVhZG9ubHlBcnJheTwnZW5jcnlwdCcgfCAnZGVjcnlwdCc+YCBwYXJhbWV0ZXIgdHlwZSBtYXRjaGVzXG4gICAgLy8gYSBzdHJpY3Qgc3Vic2V0IG9mIGBLZXlVc2FnZVtdYCwgc28gdGhpcyBjYXN0IGlzIHNvdW5kLlxuICAgIHVzYWdlcyBhcyAoJ2VuY3J5cHQnIHwgJ2RlY3J5cHQnKVtdXG4gICk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtR0NNLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIFBsYWludGV4dCB0byBlbmNyeXB0XG4gKiBAcmV0dXJucyBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gYXV0aCB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBub25jZSA9IGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEgpKTtcbiAgbGV0IGNpcGhlcnRleHQ6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIGNpcGhlcnRleHQgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogbm9uY2UsIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gUmUtd3JhcCBhbnkgV2ViIENyeXB0byBmYWlsdXJlIChET01FeGNlcHRpb24gZXRjLikgYXMgYVxuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuIEZhaWx1cmVzIGhlcmUgYXJlIHJhcmUg4oCUIHRoZXkgaGFwcGVuIGUuZy5cbiAgICAvLyB3aGVuIGEgQ3J5cHRvS2V5IHdhcyBpbXBvcnRlZCB3aXRoIGB1c2FnZXM6IFsnZGVjcnlwdCddYCBvbmx5LlxuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gZmFpbGVkOiAke2NhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5tZXNzYWdlIDogU3RyaW5nKGNhdXNlKX1gLFxuICAgICAge1xuICAgICAgICBjYXVzZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2VuY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCArIGNpcGhlcnRleHQuYnl0ZUxlbmd0aCk7XG4gIHJlc3VsdC5zZXQobm9uY2UsIDApO1xuICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KGNpcGhlcnRleHQpLCBOT05DRV9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSB1c2luZyBBRVMtMjU2LUdDTS5cbiAqXG4gKiBBbnkgZmFpbHVyZSBpbnNpZGUgdGhlIFdlYiBDcnlwdG8gbGF5ZXIg4oCUIG1vc3QgY29tbW9ubHkgYW5cbiAqIGBPcGVyYXRpb25FcnJvcjogVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIGFuIG9wZXJhdGlvbi1zcGVjaWZpYyByZWFzb25gXG4gKiByYWlzZWQgYnkgYEFFU0NpcGhlckpvYi5vbkRvbmVgIHdoZW4gdGhlIEdDTSBhdXRoZW50aWNhdGlvbiB0YWcgZG9lc1xuICogbm90IHZlcmlmeSDigJQgaXMgcmV3cmFwcGVkIGFzIHtAbGluayBSdW50aW1lRGVjcnlwdGlvbkVycm9yfS4gVGhlXG4gKiB3cmFwcGVkIGVycm9yIGNhcnJpZXMgdGhlIG9yaWdpbmFsIERPTUV4Y2VwdGlvbiBhcyBgY2F1c2VgLCBwbHVzIGFcbiAqIHNtYWxsIGRpYWdub3N0aWMgY29udGV4dCAoYG9wZXJhdGlvbmAsIGlucHV0IGBieXRlTGVuZ3RoYCkgdG8gaGVscFxuICogZGlzYW1iaWd1YXRlIGNpcGhlcnRleHQgY29ycnVwdGlvbiBmcm9tIGtleSBtaXNtYXRjaCBmcm9tIHRydW5jYXRlZFxuICogdHJhbnNwb3J0IHJlYWRzLlxuICpcbiAqIE5vdGU6IGBkYXRhYCBpcyB0aGUgcmF3IEFFUyBwYXlsb2FkIChgW25vbmNlXVtjaXBoZXJ0ZXh0ICsgdGFnXWApLCBub3QgYVxuICogZm9ybWF0LXByZWZpeGVkIGVudmVsb3BlIOKAlCBjYWxsZXJzIHN0cmlwIHRoZSBgZW5jcmAgbWFya2VyIHZpYVxuICogYGRlY29kZUZvcm1hdFByZWZpeCgpYCBiZWZvcmUgcmVhY2hpbmcgdGhpcyBmdW5jdGlvbi4gVGhlIG91dGVyXG4gKiBlbnZlbG9wZSdzIGZvcm1hdCBwcmVmaXggaXMgdGhlcmVmb3JlIGF0dGFjaGVkIGJ5IHRoZSBzZXJpYWxpemF0aW9uXG4gKiBsYXllciAoYHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50c2ApLCB3aGljaCBpcyB0aGUgbGF5ZXIgdGhhdCBoYXMgaXQuXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gYFtub25jZSAoMTIgYnl0ZXMpXVtjaXBoZXJ0ZXh0ICsgR0NNIGF1dGggdGFnXWBcbiAqIEByZXR1cm5zIERlY3J5cHRlZCBwbGFpbnRleHRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQoXG4gIGtleTogQ3J5cHRvS2V5LFxuICBkYXRhOiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgbWluTGVuZ3RoID0gTk9OQ0VfTEVOR1RIICsgVEFHX0xFTkdUSCAvIDg7IC8vIG5vbmNlICsgYXV0aCB0YWdcbiAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEVuY3J5cHRlZCBkYXRhIHRvbyBzaG9ydDogZXhwZWN0ZWQgYXQgbGVhc3QgJHttaW5MZW5ndGh9IGJ5dGVzLCBnb3QgJHtkYXRhLmJ5dGVMZW5ndGh9YCxcbiAgICAgIHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIGNvbnN0IG5vbmNlID0gZGF0YS5zdWJhcnJheSgwLCBOT05DRV9MRU5HVEgpO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gZGF0YS5zdWJhcnJheShOT05DRV9MRU5HVEgpO1xuICBsZXQgcGxhaW50ZXh0OiBBcnJheUJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBwbGFpbnRleHQgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogbm9uY2UsIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCB9LFxuICAgICAga2V5LFxuICAgICAgY2lwaGVydGV4dFxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gVGhlIG1vc3QgY29tbW9uIHNoYXBlIHdlIHNlZSBpbiB0aGUgd2lsZCBpcyBhIERPTUV4Y2VwdGlvbiB3aXRoXG4gICAgLy8gYG5hbWU6ICdPcGVyYXRpb25FcnJvcidgIGFuZCBtZXNzYWdlIFwiVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yXG4gICAgLy8gYW4gb3BlcmF0aW9uLXNwZWNpZmljIHJlYXNvblwiIOKAlCB0aGlzIGlzIHdoYXQgV2ViIENyeXB0byB0aHJvd3NcbiAgICAvLyB3aGVuIHRoZSBHQ00gYXV0aCB0YWcgZG9lcyBub3QgdmVyaWZ5LiBSZS10aHJvdyBhc1xuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsIGF0dGFjaGluZyBkaWFnbm9zdGljIGNvbnRleHQgKGJ5dGUgbGVuZ3RoKVxuICAgIC8vIHRoYXQgdGhlIGJhcmUgRE9NRXhjZXB0aW9uIGxhY2tzLlxuICAgIGNvbnN0IGNhdXNlTXNnID0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEFFUy0yNTYtR0NNIGRlY3J5cHRpb24gZmFpbGVkOiAke2NhdXNlTXNnfWAsXG4gICAgICB7XG4gICAgICAgIGNhdXNlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBsYWludGV4dCk7XG59XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJoRixxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO0FBRXpDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLEdBQWUsRUFDZixTQUErQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFFckUsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsa0NBQWtDLFVBQVUsZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQzVFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3ZDLEtBQUssRUFDTCxHQUFHLEVBQ0gsU0FBUyxFQUNULEtBQUs7SUFDTCxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLDBEQUEwRDtJQUMxRCxNQUFtQyxDQUNwQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCLEVBQ2hCLEdBQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFB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QUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLHNCQUFzQixDQUM5QixrQ0FBa0MsUUFBUSxFQUFFLEVBQzVDO1lBQ0UsS0FBSztZQUNMLE9BQU8sRUFBRTtnQkFDUCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5cbi8qKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gbW9kdWxlLlxuICpcbiAqIFVzZXMgdGhlIFdlYiBDcnlwdG8gQVBJIChgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlYCkgd2hpY2ggd29ya3MgaW5cbiAqIGJvdGggbW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKy4gVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseVxuICogZnJlZSBvZiBOb2RlLmpzLXNwZWNpZmljIGltcG9ydHMgc28gaXQgY2FuIGJlIGJ1bmRsZWQgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSBXb3JsZCBpbnRlcmZhY2UgKGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCkgcmV0dXJucyBhIHJhdyAzMi1ieXRlXG4gKiBBRVMtMjU2IGtleS4gQ2FsbGVycyBzaG91bGQgdXNlIGBpbXBvcnRLZXkoKWAgb25jZSB0byBjb252ZXJ0IGl0IHRvIGFcbiAqIGBDcnlwdG9LZXlgLCB0aGVuIHBhc3MgdGhhdCB0byBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYCBmb3IgYWxsXG4gKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBydW4uIFRoaXMgYXZvaWRzIHJlcGVhdGVkIGBpbXBvcnRLZXkoKWBcbiAqIGNhbGxzIG9uIGV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBpbnZvY2F0aW9uLlxuICpcbiAqIFdpcmUgZm9ybWF0OiBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBhdXRoIHRhZ11gXG4gKiBUaGUgYGVuY3JgIGZvcm1hdCBwcmVmaXggaXMgTk9UIHBhcnQgb2YgdGhpcyBtb2R1bGUg4oCUIGl0J3MgYWRkZWQvc3RyaXBwZWRcbiAqIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIGluIGBtYXliZUVuY3J5cHRgL2BtYXliZURlY3J5cHRgLlxuICovXG5cbi8vIENyeXB0b0tleSBpcyBhIGdsb2JhbCB0eXBlIGluIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKywgYnV0IFR5cGVTY3JpcHQnc1xuLy8gYGVzMjAyMmAgbGliIGRvZXNuJ3QgaW5jbHVkZSBpdC4gUmUtZXhwb3J0IGl0IGZyb20gdGhlIG5vZGU6Y3J5cHRvIHR5cGVzXG4vLyBzbyBjb25zdW1lcnMgY2FuIHJlZmVyZW5jZSBpdCB3aXRob3V0IGFkZGluZyBgZG9tYCBsaWIuXG5leHBvcnQgdHlwZSBDcnlwdG9LZXkgPSBpbXBvcnQoJ25vZGU6Y3J5cHRvJykud2ViY3J5cHRvLkNyeXB0b0tleTtcblxuLyoqIEFFUy1HQ00gbm9uY2UgbGVuZ3RoIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IE5PTkNFX0xFTkdUSCA9IDEyO1xuLyoqIEFFUy1HQ00gYXV0aGVudGljYXRpb24gdGFnIGxlbmd0aCBpbiBiaXRzLiAqL1xuZXhwb3J0IGNvbnN0IFRBR19MRU5HVEggPSAxMjg7XG4vKiogQUVTLUdDTSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IFRBR19CWVRFUyA9IFRBR19MRU5HVEggLyA4O1xuY29uc3QgS0VZX0xFTkdUSCA9IDMyOyAvLyBieXRlcyAoQUVTLTI1NilcblxuLyoqXG4gKiBJbXBvcnQgYSByYXcgQUVTLTI1NiBrZXkgYXMgYSBgQ3J5cHRvS2V5YCBmb3IgdXNlIHdpdGggYGVuY3J5cHQoKWAvYGRlY3J5cHQoKWAuXG4gKlxuICogQ2FsbGVycyBzaG91bGQgY2FsbCB0aGlzIG9uY2UgcGVyIHJ1biAoYWZ0ZXIgYGdldEVuY3J5cHRpb25LZXlGb3JSdW4oKWApXG4gKiBhbmQgcGFzcyB0aGUgcmVzdWx0aW5nIGBDcnlwdG9LZXlgIHRvIGFsbCBzdWJzZXF1ZW50IGVuY3J5cHQvZGVjcnlwdCBjYWxscy5cbiAqXG4gKiBQYXNzIGB1c2FnZXM6IFsnZW5jcnlwdCddYCAob3IgYFsnZGVjcnlwdCddYCkgZm9yIGNyb3NzLXJ1biBzY2VuYXJpb3NcbiAqIHdoZXJlIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHBlcmZvcm0gdGhlIGludmVyc2Ugb3BlcmF0aW9uXG4gKiB3aXRoIHRoZSBrZXkg4oCUIGZvciBleGFtcGxlIGEgY2hpbGQgd29ya2Zsb3cgd3JpdGluZyBpbnRvIGEgcGFyZW50XG4gKiBydW4ncyBmb3J3YXJkZWQgV3JpdGFibGVTdHJlYW0gb25seSBuZWVkcyB0byBlbmNyeXB0LCBuZXZlciBkZWNyeXB0LlxuICpcbiAqIEBwYXJhbSByYXcgLSBSYXcgMzItYnl0ZSBBRVMtMjU2IGtleSAoZnJvbSBXb3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKVxuICogQHBhcmFtIHVzYWdlcyAtIEtleSB1c2FnZXMuIERlZmF1bHRzIHRvIGBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddYC5cbiAqIEByZXR1cm5zIENyeXB0b0tleSByZWFkeSBmb3IgQUVTLUdDTSBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRLZXkoXG4gIHJhdzogVWludDhBcnJheSxcbiAgdXNhZ2VzOiBSZWFkb25seUFycmF5PCdlbmNyeXB0JyB8ICdkZWNyeXB0Jz4gPSBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddXG4pIHtcbiAgaWYgKHJhdy5ieXRlTGVuZ3RoICE9PSBLRVlfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgYEVuY3J5cHRpb24ga2V5IG11c3QgYmUgZXhhY3RseSAke0tFWV9MRU5HVEh9IGJ5dGVzLCBnb3QgJHtyYXcuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAncmF3JyxcbiAgICByYXcsXG4gICAgJ0FFUy1HQ00nLFxuICAgIGZhbHNlLFxuICAgIC8vIGBLZXlVc2FnZWAgaXMgYSBET00tbGliIHR5cGUgdGhhdCdzIG5vdCBpbiBzY29wZSB1bmRlciBgZXMyMDIyYC5cbiAgICAvLyBUaGUgYFJlYWRvbmx5QXJyYXk8J2VuY3J5cHQnIHwgJ2RlY3J5cHQnPmAgcGFyYW1ldGVyIHR5cGUgbWF0Y2hlc1xuICAgIC8vIGEgc3RyaWN0IHN1YnNldCBvZiBgS2V5VXNhZ2VbXWAsIHNvIHRoaXMgY2FzdCBpcyBzb3VuZC5cbiAgICB1c2FnZXMgYXMgKCdlbmNyeXB0JyB8ICdkZWNyeXB0JylbXVxuICApO1xufVxuXG4vKipcbiAqIEVuY3J5cHQgZGF0YSB1c2luZyBBRVMtMjU2LUdDTS5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gQ3J5cHRvS2V5IGZyb20gYGltcG9ydEtleSgpYFxuICogQHBhcmFtIGRhdGEgLSBQbGFpbnRleHQgdG8gZW5jcnlwdFxuICogQHBhcmFtIGFhZCAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgYXV0aGVudGljYXRlZCBkYXRhLiBOb3QgZW5jcnlwdGVkLCBidXRcbiAqICAgY292ZXJlZCBieSB0aGUgR0NNIGF1dGggdGFnOiBkZWNyeXB0aW9uIGZhaWxzIHVubGVzcyB0aGUgZXhhY3Qgc2FtZVxuICogICBieXRlcyBhcmUgc3VwcGxpZWQuIFVzZWQgYnkgdGhlIHNlYWxlZC1ib3ggbGF5ZXIgdG8gYmluZCBjaXBoZXJ0ZXh0IHRvXG4gKiAgIGEgYHByb2plY3RJZHxydW5JZGAgY29udGV4dC4gT21pdCBmb3Igbm8gQUFEICh0aGUgbGVnYWN5IGJlaGF2aW9yKS5cbiAqIEByZXR1cm5zIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheSxcbiAgYWFkPzogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IG5vbmNlID0gZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCkpO1xuICBsZXQgY2lwaGVydGV4dDogQXJyYXlCdWZmZXI7XG4gIHRyeSB7XG4gICAgY2lwaGVydGV4dCA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQUVTLUdDTScsXG4gICAgICAgIGl2OiBub25jZSxcbiAgICAgICAgdGFnTGVuZ3RoOiBUQUdfTEVOR1RILFxuICAgICAgICAuLi4oYWFkID8geyBhZGRpdGlvbmFsRGF0YTogYWFkIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gUmUtd3JhcCBhbnkgV2ViIENyeXB0byBmYWlsdXJlIChET01FeGNlcHRpb24gZXRjLikgYXMgYVxuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuIEZhaWx1cmVzIGhlcmUgYXJlIHJhcmUg4oCUIHRoZXkgaGFwcGVuIGUuZy5cbiAgICAvLyB3aGVuIGEgQ3J5cHRvS2V5IHdhcyBpbXBvcnRlZCB3aXRoIGB1c2FnZXM6IFsnZGVjcnlwdCddYCBvbmx5LlxuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gZmFpbGVkOiAke2NhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5tZXNzYWdlIDogU3RyaW5nKGNhdXNlKX1gLFxuICAgICAge1xuICAgICAgICBjYXVzZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2VuY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCArIGNpcGhlcnRleHQuYnl0ZUxlbmd0aCk7XG4gIHJlc3VsdC5zZXQobm9uY2UsIDApO1xuICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KGNpcGhlcnRleHQpLCBOT05DRV9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSB1c2luZyBBRVMtMjU2LUdDTS5cbiAqXG4gKiBBbnkgZmFpbHVyZSBpbnNpZGUgdGhlIFdlYiBDcnlwdG8gbGF5ZXIg4oCUIG1vc3QgY29tbW9ubHkgYW5cbiAqIGBPcGVyYXRpb25FcnJvcjogVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIGFuIG9wZXJhdGlvbi1zcGVjaWZpYyByZWFzb25gXG4gKiByYWlzZWQgYnkgYEFFU0NpcGhlckpvYi5vbkRvbmVgIHdoZW4gdGhlIEdDTSBhdXRoZW50aWNhdGlvbiB0YWcgZG9lc1xuICogbm90IHZlcmlmeSDigJQgaXMgcmV3cmFwcGVkIGFzIHtAbGluayBSdW50aW1lRGVjcnlwdGlvbkVycm9yfS4gVGhlXG4gKiB3cmFwcGVkIGVycm9yIGNhcnJpZXMgdGhlIG9yaWdpbmFsIERPTUV4Y2VwdGlvbiBhcyBgY2F1c2VgLCBwbHVzIGFcbiAqIHNtYWxsIGRpYWdub3N0aWMgY29udGV4dCAoYG9wZXJhdGlvbmAsIGlucHV0IGBieXRlTGVuZ3RoYCkgdG8gaGVscFxuICogZGlzYW1iaWd1YXRlIGNpcGhlcnRleHQgY29ycnVwdGlvbiBmcm9tIGtleSBtaXNtYXRjaCBmcm9tIHRydW5jYXRlZFxuICogdHJhbnNwb3J0IHJlYWRzLlxuICpcbiAqIE5vdGU6IGBkYXRhYCBpcyB0aGUgcmF3IEFFUyBwYXlsb2FkIChgW25vbmNlXVtjaXBoZXJ0ZXh0ICsgdGFnXWApLCBub3QgYVxuICogZm9ybWF0LXByZWZpeGVkIGVudmVsb3BlIOKAlCBjYWxsZXJzIHN0cmlwIHRoZSBgZW5jcmAgbWFya2VyIHZpYVxuICogYGRlY29kZUZvcm1hdFByZWZpeCgpYCBiZWZvcmUgcmVhY2hpbmcgdGhpcyBmdW5jdGlvbi4gVGhlIG91dGVyXG4gKiBlbnZlbG9wZSdzIGZvcm1hdCBwcmVmaXggaXMgdGhlcmVmb3JlIGF0dGFjaGVkIGJ5IHRoZSBzZXJpYWxpemF0aW9uXG4gKiBsYXllciAoYHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50c2ApLCB3aGljaCBpcyB0aGUgbGF5ZXIgdGhhdCBoYXMgaXQuXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gYFtub25jZSAoMTIgYnl0ZXMpXVtjaXBoZXJ0ZXh0ICsgR0NNIGF1dGggdGFnXWBcbiAqIEBwYXJhbSBhYWQgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0ZWQgZGF0YS4gTXVzdCBtYXRjaCB0aGUgYnl0ZXNcbiAqICAgcGFzc2VkIHRvIHtAbGluayBlbmNyeXB0fSBleGFjdGx5LCBvdGhlcndpc2UgdGhlIEdDTSB0YWcgZmFpbHMgdG8gdmVyaWZ5XG4gKiAgIGFuZCBhIHtAbGluayBSdW50aW1lRGVjcnlwdGlvbkVycm9yfSBpcyB0aHJvd24uXG4gKiBAcmV0dXJucyBEZWNyeXB0ZWQgcGxhaW50ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheSxcbiAgYWFkPzogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IG1pbkxlbmd0aCA9IE5PTkNFX0xFTkdUSCArIFRBR19MRU5HVEggLyA4OyAvLyBub25jZSArIGF1dGggdGFnXG4gIGlmIChkYXRhLmJ5dGVMZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgIGBFbmNyeXB0ZWQgZGF0YSB0b28gc2hvcnQ6IGV4cGVjdGVkIGF0IGxlYXN0ICR7bWluTGVuZ3RofSBieXRlcywgZ290ICR7ZGF0YS5ieXRlTGVuZ3RofWAsXG4gICAgICB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBkYXRhLmJ5dGVMZW5ndGgsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBjb25zdCBub25jZSA9IGRhdGEuc3ViYXJyYXkoMCwgTk9OQ0VfTEVOR1RIKTtcbiAgY29uc3QgY2lwaGVydGV4dCA9IGRhdGEuc3ViYXJyYXkoTk9OQ0VfTEVOR1RIKTtcbiAgbGV0IHBsYWludGV4dDogQXJyYXlCdWZmZXI7XG4gIHRyeSB7XG4gICAgcGxhaW50ZXh0ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdBRVMtR0NNJyxcbiAgICAgICAgaXY6IG5vbmNlLFxuICAgICAgICB0YWdMZW5ndGg6IFRBR19MRU5HVEgsXG4gICAgICAgIC4uLihhYWQgPyB7IGFkZGl0aW9uYWxEYXRhOiBhYWQgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBjaXBoZXJ0ZXh0XG4gICAgKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAvLyBUaGUgbW9zdCBjb21tb24gc2hhcGUgd2Ugc2VlIGluIHRoZSB3aWxkIGlzIGEgRE9NRXhjZXB0aW9uIHdpdGhcbiAgICAvLyBgbmFtZTogJ09wZXJhdGlvbkVycm9yJ2AgYW5kIG1lc3NhZ2UgXCJUaGUgb3BlcmF0aW9uIGZhaWxlZCBmb3JcbiAgICAvLyBhbiBvcGVyYXRpb24tc3BlY2lmaWMgcmVhc29uXCIg4oCUIHRoaXMgaXMgd2hhdCBXZWIgQ3J5cHRvIHRocm93c1xuICAgIC8vIHdoZW4gdGhlIEdDTSBhdXRoIHRhZyBkb2VzIG5vdCB2ZXJpZnkuIFJlLXRocm93IGFzXG4gICAgLy8gUnVudGltZURlY3J5cHRpb25FcnJvciwgYXR0YWNoaW5nIGRpYWdub3N0aWMgY29udGV4dCAoYnl0ZSBsZW5ndGgpXG4gICAgLy8gdGhhdCB0aGUgYmFyZSBET01FeGNlcHRpb24gbGFja3MuXG4gICAgY29uc3QgY2F1c2VNc2cgPSBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgQUVTLTI1Ni1HQ00gZGVjcnlwdGlvbiBmYWlsZWQ6ICR7Y2F1c2VNc2d9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBkYXRhLmJ5dGVMZW5ndGgsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocGxhaW50ZXh0KTtcbn1cbiJdfQ==
@@ -1,4 +1,10 @@
1
1
  import { type PromiseWithResolvers } from '@workflow/utils';
2
+ /**
3
+ * A durability barrier a sink may expose under {@link STREAM_DRAIN_SYMBOL}:
4
+ * resolves once every chunk the sink has accepted is durably written, rejects
5
+ * if any server write failed. See `WorkflowServerWritableStream`.
6
+ */
7
+ type DrainBarrier = () => Promise<void>;
2
8
  /**
3
9
  * Flow-control knob: upper bound on chunks read-but-not-yet-durably-written
4
10
  * while coalescing. Once this many chunks are outstanding the producer stops
@@ -12,6 +18,7 @@ import { type PromiseWithResolvers } from '@workflow/utils';
12
18
  * limit — batch sizing enforces that independently.
13
19
  */
14
20
  export declare const MAX_INFLIGHT_CHUNKS = 1000;
21
+ export declare const getMaxInflightChunks: () => number;
15
22
  /**
16
23
  * Wire limit: maximum number of chunks in a single coalesced `writeMulti`.
17
24
  * The server enforces a per-multi-write chunk cap (1,000 today); a batch is
@@ -19,6 +26,7 @@ export declare const MAX_INFLIGHT_CHUNKS = 1000;
19
26
  * the backpressure knob above. Override: `WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH`.
20
27
  */
21
28
  export declare const MAX_CHUNKS_PER_BATCH = 1000;
29
+ export declare const getMaxChunksPerBatch: () => number;
22
30
  /**
23
31
  * Wire limit: maximum cumulative bytes in a single coalesced `writeMulti`.
24
32
  * Chunk *count* alone is not enough — 1,000 small chunks are ~100KB but 1,000
@@ -28,6 +36,16 @@ export declare const MAX_CHUNKS_PER_BATCH = 1000;
28
36
  * out alone). Default 1 MiB. Override: `WORKFLOW_STREAM_MAX_BYTES_PER_BATCH`.
29
37
  */
30
38
  export declare const MAX_BYTES_PER_BATCH: number;
39
+ export declare const getMaxBytesPerBatch: () => number;
40
+ /**
41
+ * Buffer bound (bytes) for the server writable's group-commit buffer — the
42
+ * byte-denominated counterpart of {@link MAX_INFLIGHT_CHUNKS}. `write()`
43
+ * blocks once this much data is buffered-but-not-durable, so a fast producer
44
+ * of large chunks can't grow client memory without bound. Default 8 MiB
45
+ * (eight request-sized groups). Override: `WORKFLOW_STREAM_MAX_BUFFERED_BYTES`.
46
+ */
47
+ export declare const MAX_BUFFERED_BYTES: number;
48
+ export declare const getMaxBufferedBytes: () => number;
31
49
  /**
32
50
  * Polling interval (in ms) for lock release detection.
33
51
  *
@@ -72,6 +90,13 @@ export interface FlushableStreamState extends PromiseWithResolvers<void> {
72
90
  writablePollingInterval?: ReturnType<typeof setInterval>;
73
91
  /** Interval ID for readable lock polling (if active) */
74
92
  readablePollingInterval?: ReturnType<typeof setInterval>;
93
+ /**
94
+ * Durability barrier of the pipe's sink, when it acks writes on buffer
95
+ * entry (see {@link STREAM_DRAIN_SYMBOL}). Lock-release completion awaits
96
+ * this before resolving so `pendingOps === 0` (fast, buffered acks) can't
97
+ * complete a step while data is still client-side.
98
+ */
99
+ drainBarrier?: DrainBarrier;
75
100
  }
76
101
  export declare function createFlushableState(): FlushableStreamState;
77
102
  /**
@@ -108,4 +133,5 @@ export declare function pollReadableLock(readable: ReadableStream, state: Flusha
108
133
  * @returns Promise that resolves when stream ends (not when done promise resolves)
109
134
  */
110
135
  export declare function flushablePipe(source: ReadableStream, sink: WritableStream, state: FlushableStreamState): Promise<void>;
136
+ export {};
111
137
  //# sourceMappingURL=flushable-stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flushable-stream.d.ts","sourceRoot":"","sources":["../src/flushable-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;AAW3E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAQxC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAQzC;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAQ/C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AASxC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB,CAAC,IAAI,CAAC;IACtE,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;CAC1D;AAED,wBAAgB,oBAAoB,IAAI,oBAAoB,CAa3D;AA2DD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAwBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAwBN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAcf"}
1
+ {"version":3,"file":"flushable-stream.d.ts","sourceRoot":"","sources":["../src/flushable-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;AAI3E;;;;GAIG;AACH,KAAK,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,eAAO,MAAM,oBAAoB,QAAO,MAIpC,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,eAAO,MAAM,oBAAoB,QAAO,MAIpC,CAAC;AAEL;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,eAAO,MAAM,mBAAmB,QAAO,MAInC,CAAC;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAElD,eAAO,MAAM,mBAAmB,QAAO,MAInC,CAAC;AAEL;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AASxC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB,CAAC,IAAI,CAAC;IACtE,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,IAAI,oBAAoB,CAa3D;AAgFD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAwBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAwBN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAcf"}