@workflow/core 5.0.0-beta.0 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.js +1 -1
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.js +1 -1
- package/dist/classify-error.d.ts +11 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +56 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +147 -0
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +165 -0
- package/dist/encryption.d.ts +22 -1
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +72 -27
- package/dist/events-consumer.d.ts +7 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +18 -3
- package/dist/flushable-stream.d.ts +10 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +18 -13
- package/dist/global.d.ts +4 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +28 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +77 -31
- package/dist/private.d.ts +5 -5
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +8 -8
- package/dist/runtime/constants.d.ts +48 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +91 -8
- package/dist/runtime/get-port-lazy.d.ts +10 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +30 -0
- package/dist/runtime/get-world-lazy.d.ts +32 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +56 -0
- package/dist/runtime/helpers.d.ts +40 -7
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +93 -36
- package/dist/runtime/replay-budget.d.ts +98 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +191 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +5 -4
- package/dist/runtime/run.d.ts +10 -32
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +83 -33
- package/dist/runtime/runs.d.ts +1 -1
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +7 -4
- package/dist/runtime/start.js +17 -6
- package/dist/runtime/step-executor.d.ts +40 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +492 -0
- package/dist/runtime/step-handler.d.ts +0 -5
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +227 -119
- package/dist/runtime/suspension-handler.d.ts +22 -4
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +90 -73
- package/dist/runtime/world-init.d.ts +75 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +75 -0
- package/dist/runtime/world.d.ts +4 -3
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +98 -9
- package/dist/runtime.d.ts +8 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +810 -324
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +45 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +98 -0
- package/dist/serialization/codec.d.ts +90 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/encryption.d.ts +32 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +67 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/index.d.ts +18 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +20 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +68 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +417 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +88 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +45 -0
- package/dist/serialization/types.d.ts +222 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +21 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +16 -2
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +104 -5
- package/dist/serialization.d.ts +217 -224
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +940 -643
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +40 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +44 -6
- package/dist/step/context-storage.d.ts +14 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +39 -5
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +97 -19
- package/dist/symbols.d.ts +20 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +21 -1
- package/dist/telemetry/semantic-conventions.d.ts +2 -2
- package/dist/telemetry/semantic-conventions.js +1 -1
- package/dist/telemetry.js +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +18 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +28 -5
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +3 -2
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/vm/uuid.js +1 -1
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +260 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +3 -2
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts +11 -0
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +13 -4
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +74 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +66 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +22 -3
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow/writable-stream.js +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +84 -31
- package/docs/api-reference/create-webhook.mdx +37 -18
- package/docs/api-reference/experimental-set-attributes.mdx +63 -0
- package/docs/api-reference/get-workflow-metadata.mdx +61 -0
- package/docs/api-reference/index.mdx +3 -0
- package/docs/foundations/cancellation.mdx +460 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/index.mdx +3 -3
- package/docs/foundations/meta.json +3 -2
- package/docs/foundations/serialization.mdx +78 -42
- package/docs/foundations/starting-workflows.mdx +6 -2
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +8 -7
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +19 -10
- package/docs/foundations/common-patterns.mdx +0 -265
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import * as Ansi from '@workflow/errors/ansi';
|
|
2
|
+
const INSPECT_CUSTOM = Symbol.for('nodejs.util.inspect.custom');
|
|
3
|
+
function renderSegmentPlain(s) {
|
|
4
|
+
if ('code' in s)
|
|
5
|
+
return `\`${s.code}\``;
|
|
6
|
+
if ('dim' in s)
|
|
7
|
+
return s.dim;
|
|
8
|
+
return s.text;
|
|
9
|
+
}
|
|
10
|
+
function renderSegmentPretty(s) {
|
|
11
|
+
if ('code' in s)
|
|
12
|
+
return Ansi.code(s.code);
|
|
13
|
+
if ('dim' in s)
|
|
14
|
+
return Ansi.dim(s.dim);
|
|
15
|
+
return s.text;
|
|
16
|
+
}
|
|
17
|
+
function renderDetailPlain(d) {
|
|
18
|
+
if (d.type === 'docs')
|
|
19
|
+
return `docs: ${d.url}`;
|
|
20
|
+
return d.segments.map(renderSegmentPlain).join('');
|
|
21
|
+
}
|
|
22
|
+
function renderDetailPretty(d) {
|
|
23
|
+
if (d.type === 'docs')
|
|
24
|
+
return Ansi.docs(d.url);
|
|
25
|
+
return d.segments.map(renderSegmentPretty).join('');
|
|
26
|
+
}
|
|
27
|
+
export function renderPlain(c) {
|
|
28
|
+
// Mimic `Ansi.frame` structure so `.message` is still readable in logs
|
|
29
|
+
// even without the color.
|
|
30
|
+
const title = c.title.map(renderSegmentPlain).join('');
|
|
31
|
+
const lines = [title];
|
|
32
|
+
c.details.forEach((detail, index) => {
|
|
33
|
+
const isLast = index === c.details.length - 1;
|
|
34
|
+
const first = isLast ? '╰▶ ' : '├▶ ';
|
|
35
|
+
const cont = isLast ? ' ' : '│ ';
|
|
36
|
+
const raw = renderDetailPlain(detail).split('\n');
|
|
37
|
+
raw.forEach((line, i) => lines.push(`${i === 0 ? first : cont}${line}`));
|
|
38
|
+
});
|
|
39
|
+
return lines.join('\n');
|
|
40
|
+
}
|
|
41
|
+
export function renderPretty(c) {
|
|
42
|
+
const title = c.title.map(renderSegmentPretty).join('');
|
|
43
|
+
return Ansi.frame(title, c.details.map(renderDetailPretty));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Base class for structured context-violation errors.
|
|
47
|
+
*
|
|
48
|
+
* Design notes:
|
|
49
|
+
*
|
|
50
|
+
* - `.message` is **plain text** (no ANSI escape bytes). Structured logs,
|
|
51
|
+
* log drains, CBOR-serialized event data, and anything else that reads
|
|
52
|
+
* `err.message` / `err.stack` as a string gets clean output — no mojibake
|
|
53
|
+
* in JSON, no `\x1B[...m` noise in Vercel logs.
|
|
54
|
+
*
|
|
55
|
+
* - The ANSI-framed version is rendered **lazily** via `toString()` and
|
|
56
|
+
* `[util.inspect.custom]`. When the error is thrown and Node prints it
|
|
57
|
+
* via `util.inspect`, the user sees the colored, framed box. When it's
|
|
58
|
+
* attached to a structured log field, the consumer sees plain text.
|
|
59
|
+
*
|
|
60
|
+
* - `fatal = true` marks these as non-retryable. Calling `createHook()`
|
|
61
|
+
* from a step function will never succeed no matter how many retries —
|
|
62
|
+
* burning attempts just produces duplicated log output. The runtime's
|
|
63
|
+
* `FatalError.is(err)` gate recognizes any error with `fatal: true`.
|
|
64
|
+
*/
|
|
65
|
+
export class ContextViolationError extends Error {
|
|
66
|
+
/** Non-retryable — see class doc. */
|
|
67
|
+
fatal = true;
|
|
68
|
+
#content;
|
|
69
|
+
constructor(content) {
|
|
70
|
+
super(renderPlain(content));
|
|
71
|
+
this.#content = content;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* `console.log(err)` and most Node internals route through `util.inspect`,
|
|
75
|
+
* which respects this symbol. Returning a custom string here means the
|
|
76
|
+
* thrown error prints as a pretty frame in the terminal while `.message`
|
|
77
|
+
* and `.stack` stay plain.
|
|
78
|
+
*/
|
|
79
|
+
[INSPECT_CUSTOM]() {
|
|
80
|
+
const pretty = renderPretty(this.#content);
|
|
81
|
+
// `stack` starts with `${name}: ${message}\n at ...`. Our message is
|
|
82
|
+
// multi-line (`title\n╰▶ docs: …`), so slicing only the first line glues
|
|
83
|
+
// the framed-detail tail of the message onto the prepended pretty form
|
|
84
|
+
// and renders every detail line twice. Slice past *all* message lines.
|
|
85
|
+
const messageLineCount = this.message.split('\n').length;
|
|
86
|
+
const tail = (this.stack ?? '')
|
|
87
|
+
.split('\n')
|
|
88
|
+
.slice(messageLineCount)
|
|
89
|
+
.join('\n');
|
|
90
|
+
return tail
|
|
91
|
+
? `${this.name}: ${pretty}\n${tail}`
|
|
92
|
+
: `${this.name}: ${pretty}`;
|
|
93
|
+
}
|
|
94
|
+
toString() {
|
|
95
|
+
return `${this.name}: ${renderPretty(this.#content)}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Thrown when an API that must run inside a workflow function is called
|
|
100
|
+
* from outside a workflow context (e.g. from a step function or from
|
|
101
|
+
* regular application code).
|
|
102
|
+
*/
|
|
103
|
+
export class NotInWorkflowContextError extends ContextViolationError {
|
|
104
|
+
name = 'NotInWorkflowContextError';
|
|
105
|
+
constructor(functionName, docsUrl) {
|
|
106
|
+
super({
|
|
107
|
+
title: [
|
|
108
|
+
{ code: functionName },
|
|
109
|
+
{ text: ' can only be called inside a workflow function' },
|
|
110
|
+
],
|
|
111
|
+
details: [{ type: 'docs', url: docsUrl }],
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Thrown when an API that must run inside a step function is called from
|
|
117
|
+
* outside a step context.
|
|
118
|
+
*/
|
|
119
|
+
export class NotInStepContextError extends ContextViolationError {
|
|
120
|
+
name = 'NotInStepContextError';
|
|
121
|
+
constructor(functionName, docsUrl) {
|
|
122
|
+
super({
|
|
123
|
+
title: [
|
|
124
|
+
{ code: functionName },
|
|
125
|
+
{ text: ' can only be called inside a step function' },
|
|
126
|
+
],
|
|
127
|
+
details: [{ type: 'docs', url: docsUrl }],
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Thrown when an API that must run inside either a workflow or step function
|
|
133
|
+
* is called from regular application code.
|
|
134
|
+
*/
|
|
135
|
+
export class NotInWorkflowOrStepContextError extends ContextViolationError {
|
|
136
|
+
name = 'NotInWorkflowOrStepContextError';
|
|
137
|
+
constructor(functionName, docsUrl) {
|
|
138
|
+
super({
|
|
139
|
+
title: [
|
|
140
|
+
{ code: functionName },
|
|
141
|
+
{ text: ' can only be called inside a workflow or step function' },
|
|
142
|
+
],
|
|
143
|
+
details: [{ type: 'docs', url: docsUrl }],
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC12aW9sYXRpb24tZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC12aW9sYXRpb24tZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSx1QkFBdUIsQ0FBQztBQVE5QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUEwQmhFLFNBQVMsa0JBQWtCLENBQUMsQ0FBVTtJQUNwQyxJQUFJLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxDQUFVO0lBQ3JDLElBQUksTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMvQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQVM7SUFDbkMsSUFBSSxDQUFDLENBQUMs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ekMsWUFBWSxZQUFvQixFQUFFLE9BQWdCO1FBQ2hELEtBQUssQ0FBQztZQUNKLEtBQUssRUFBRTtnQkFDTCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ3RCLEVBQUUsSUFBSSxFQUFFLHdEQUF3RCxFQUFFO2FBQ25FO1lBQ0QsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBbnNpIGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMvYW5zaSc7XG5cbi8qKlxuICogQSBgZG9jczpgIGxpbmUgVVJMLiBUaGUgbGVhZGluZyBwcm90b2NvbCBpcyBwYXJ0IG9mIHRoZSB0eXBlIHNvIGNhbGwgc2l0ZXNcbiAqIGNhbid0IGFjY2lkZW50YWxseSBwYXNzIGEgcHJvdG9jb2wtcmVsYXRpdmUgb3IgYmFyZSBwYXRoLlxuICovXG5leHBvcnQgdHlwZSBEb2NzVXJsID0gYGh0dHBzOi8vJHtzdHJpbmd9YDtcblxuY29uc3QgSU5TUEVDVF9DVVNUT00gPSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQgZGF0YSBmb3IgYSBmcmFtZWQgZXJyb3IuIFRoZSBiYXNlIGNsYXNzIHRha2VzIHRoaXMgYW5kIHJlbmRlcnNcbiAqIGl0IHRvIHBsYWluIHRleHQgKGZvciBgLm1lc3NhZ2VgIC8gYC5zdGFja2AgLyBzdHJ1Y3R1cmVkIGxvZ3MpIG9yIHRvIGFuXG4gKiBBTlNJLWZyYW1lZCBzdHJpbmcgKGZvciB0ZXJtaW5hbCBkaXNwbGF5IHZpYSBgdXRpbC5pbnNwZWN0YCAvIGB0b1N0cmluZ2ApLlxuICpcbiAqIEtlZXBpbmcgdGhlIHBpZWNlcyBzdHJ1Y3R1cmVkIG1lYW5zIHdlIG5ldmVyIGhhdmUgdG8gc3RyaXAgQU5TSSBiYWNrIG91dFxuICogb25jZSBpdCdzIGluIHRoZSBtZXNzYWdlIOKAlCB3ZSBqdXN0IGRvbid0IHB1dCBpdCB0aGVyZSBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVkQ29udGVudCB7XG4gIC8qKiBIZWFkbGluZS4gYHsgY29kZTogJ2ZvbygpJyB9YCBzZWdtZW50cyByZW5kZXIgYXMgYmFja3RpY2tlZCBpbmxpbmUgY29kZS4gKi9cbiAgcmVhZG9ubHkgdGl0bGU6IHJlYWRvbmx5IFNlZ21lbnRbXTtcbiAgLyoqIE9uZSBmcmFtZWQgYnJhbmNoIHBlciBlbnRyeS4gVGhlIGxhc3QgdXNlcyBg4pWw4pa2YCwgb3RoZXJzIHVzZSBg4pSc4pa2YC4gKi9cbiAgcmVhZG9ubHkgZGV0YWlsczogcmVhZG9ubHkgRGV0YWlsW107XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnQgPVxuICB8IHsgcmVhZG9ubHkgdGV4dDogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IGNvZGU6IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSBkaW06IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBEZXRhaWwgPVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ3BsYWluJzsgcmVhZG9ubHkgc2VnbWVudHM6IHJlYWRvbmx5IFNlZ21lbnRbXSB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnZG9jcyc7IHJlYWRvbmx5IHVybDogRG9jc1VybCB9O1xuXG5mdW5jdGlvbiByZW5kZXJTZWdtZW50UGxhaW4oczogU2VnbWVudCk6IHN0cmluZyB7XG4gIGlmICgnY29kZScgaW4gcykgcmV0dXJuIGBcXGAke3MuY29kZX1cXGBgO1xuICBpZiAoJ2RpbScgaW4gcykgcmV0dXJuIHMuZGltO1xuICByZXR1cm4gcy50ZXh0O1xufVxuXG5mdW5jdGlvbiByZW5kZXJTZWdtZW50UHJldHR5KHM6IFNlZ21lbnQpOiBzdHJpbmcge1xuICBpZiAoJ2NvZGUnIGluIHMpIHJldHVybiBBbnNpLmNvZGUocy5jb2RlKTtcbiAgaWYgKCdkaW0nIGluIHMpIHJldHVybiBBbnNpLmRpbShzLmRpbSk7XG4gIHJldHVybiBzLnRleHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckRldGFpbFBsYWluKGQ6IERldGFpbCk6IHN0cmluZyB7XG4gIGlmIChkLnR5cGUgPT09ICdkb2NzJykgcmV0dXJuIGBkb2NzOiAke2QudXJsfWA7XG4gIHJldHVybiBkLnNlZ21lbnRzLm1hcChyZW5kZXJTZWdtZW50UGxhaW4pLmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJEZXRhaWxQcmV0dHkoZDogRGV0YWlsKTogc3RyaW5nIHtcbiAgaWYgKGQudHlwZSA9PT0gJ2RvY3MnKSByZXR1cm4gQW5zaS5kb2NzKGQudXJsKTtcbiAgcmV0dXJuIGQuc2VnbWVudHMubWFwKHJlbmRlclNlZ21lbnRQcmV0dHkpLmpvaW4oJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUGxhaW4oYzogRnJhbWVkQ29udGVudCk6IHN0cmluZyB7XG4gIC8vIE1pbWljIGBBbnNpLmZyYW1lYCBzdHJ1Y3R1cmUgc28gYC5tZXNzYWdlYCBpcyBzdGlsbCByZWFkYWJsZSBpbiBsb2dzXG4gIC8vIGV2ZW4gd2l0aG91dCB0aGUgY29sb3IuXG4gIGNvbnN0IHRpdGxlID0gYy50aXRsZS5tYXAocmVuZGVyU2VnbWVudFBsYWluKS5qb2luKCcnKTtcbiAgY29uc3QgbGluZXMgPSBbdGl0bGVdO1xuICBjLmRldGFpbHMuZm9yRWFjaCgoZGV0YWlsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBjLmRldGFpbHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBmaXJzdCA9IGlzTGFzdCA/ICfilbDilrYgJyA6ICfilJzilrYgJztcbiAgICBjb25zdCBjb250ID0gaXNMYXN0ID8gJyAgICcgOiAn4pSCICAnO1xuICAgIGNvbnN0IHJhdyA9IHJlbmRlckRldGFpbFBsYWluKGRldGFpbCkuc3BsaXQoJ1xcbicpO1xuICAgIHJhdy5mb3JFYWNoKChsaW5lLCBpKSA9PiBsaW5lcy5wdXNoKGAke2kgPT09IDAgPyBmaXJzdCA6IGNvbnR9JHtsaW5lfWApKTtcbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByZXR0eShjOiBGcmFtZWRDb250ZW50KTogc3RyaW5nIHtcbiAgY29uc3QgdGl0bGUgPSBjLnRpdGxlLm1hcChyZW5kZXJTZWdtZW50UHJldHR5KS5qb2luKCcnKTtcbiAgcmV0dXJuIEFuc2kuZnJhbWUodGl0bGUsIGMuZGV0YWlscy5tYXAocmVuZGVyRGV0YWlsUHJldHR5KSk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlZCBjb250ZXh0LXZpb2xhdGlvbiBlcnJvcnMuXG4gKlxuICogRGVzaWduIG5vdGVzOlxuICpcbiAqIC0gYC5tZXNzYWdlYCBpcyAqKnBsYWluIHRleHQqKiAobm8gQU5TSSBlc2NhcGUgYnl0ZXMpLiBTdHJ1Y3R1cmVkIGxvZ3MsXG4gKiAgIGxvZyBkcmFpbnMsIENCT1Itc2VyaWFsaXplZCBldmVudCBkYXRhLCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IHJlYWRzXG4gKiAgIGBlcnIubWVzc2FnZWAgLyBgZXJyLnN0YWNrYCBhcyBhIHN0cmluZyBnZXRzIGNsZWFuIG91dHB1dCDigJQgbm8gbW9qaWJha2VcbiAqICAgaW4gSlNPTiwgbm8gYFxceDFCWy4uLm1gIG5vaXNlIGluIFZlcmNlbCBsb2dzLlxuICpcbiAqIC0gVGhlIEFOU0ktZnJhbWVkIHZlcnNpb24gaXMgcmVuZGVyZWQgKipsYXppbHkqKiB2aWEgYHRvU3RyaW5nKClgIGFuZFxuICogICBgW3V0aWwuaW5zcGVjdC5jdXN0b21dYC4gV2hlbiB0aGUgZXJyb3IgaXMgdGhyb3duIGFuZCBOb2RlIHByaW50cyBpdFxuICogICB2aWEgYHV0aWwuaW5zcGVjdGAsIHRoZSB1c2VyIHNlZXMgdGhlIGNvbG9yZWQsIGZyYW1lZCBib3guIFdoZW4gaXQnc1xuICogICBhdHRhY2hlZCB0byBhIHN0cnVjdHVyZWQgbG9nIGZpZWxkLCB0aGUgY29uc3VtZXIgc2VlcyBwbGFpbiB0ZXh0LlxuICpcbiAqIC0gYGZhdGFsID0gdHJ1ZWAgbWFya3MgdGhlc2UgYXMgbm9uLXJldHJ5YWJsZS4gQ2FsbGluZyBgY3JlYXRlSG9vaygpYFxuICogICBmcm9tIGEgc3RlcCBmdW5jdGlvbiB3aWxsIG5ldmVyIHN1Y2NlZWQgbm8gbWF0dGVyIGhvdyBtYW55IHJldHJpZXMg4oCUXG4gKiAgIGJ1cm5pbmcgYXR0ZW1wdHMganVzdCBwcm9kdWNlcyBkdXBsaWNhdGVkIGxvZyBvdXRwdXQuIFRoZSBydW50aW1lJ3NcbiAqICAgYEZhdGFsRXJyb3IuaXMoZXJyKWAgZ2F0ZSByZWNvZ25pemVzIGFueSBlcnJvciB3aXRoIGBmYXRhbDogdHJ1ZWAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250ZXh0VmlvbGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBOb24tcmV0cnlhYmxlIOKAlCBzZWUgY2xhc3MgZG9jLiAqL1xuICByZWFkb25seSBmYXRhbCA9IHRydWU7XG5cbiAgcmVhZG9ubHkgI2NvbnRlbnQ6IEZyYW1lZENvbnRlbnQ7XG5cbiAgY29uc3RydWN0b3IoY29udGVudDogRnJhbWVkQ29udGVudCkge1xuICAgIHN1cGVyKHJlbmRlclBsYWluKGNvbnRlbnQpKTtcbiAgICB0aGlzLiNjb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBgY29uc29sZS5sb2coZXJyKWAgYW5kIG1vc3QgTm9kZSBpbnRlcm5hbHMgcm91dGUgdGhyb3VnaCBgdXRpbC5pbnNwZWN0YCxcbiAgICogd2hpY2ggcmVzcGVjdHMgdGhpcyBzeW1ib2wuIFJldHVybmluZyBhIGN1c3RvbSBzdHJpbmcgaGVyZSBtZWFucyB0aGVcbiAgICogdGhyb3duIGVycm9yIHByaW50cyBhcyBhIHByZXR0eSBmcmFtZSBpbiB0aGUgdGVybWluYWwgd2hpbGUgYC5tZXNzYWdlYFxuICAgKiBhbmQgYC5zdGFja2Agc3RheSBwbGFpbi5cbiAgICovXG4gIFtJTlNQRUNUX0NVU1RPTV0oKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmV0dHkgPSByZW5kZXJQcmV0dHkodGhpcy4jY29udGVudCk7XG4gICAgLy8gYHN0YWNrYCBzdGFydHMgd2l0aCBgJHtuYW1lfTogJHttZXNzYWdlfVxcbiAgICBhdCAuLi5gLiBPdXIgbWVzc2FnZSBpc1xuICAgIC8vIG11bHRpLWxpbmUgKGB0aXRsZVxcbuKVsOKWtiBkb2NzOiDigKZgKSwgc28gc2xpY2luZyBvbmx5IHRoZSBmaXJzdCBsaW5lIGdsdWVzXG4gICAgLy8gdGhlIGZyYW1lZC1kZXRhaWwgdGFpbCBvZiB0aGUgbWVzc2FnZSBvbnRvIHRoZSBwcmVwZW5kZWQgcHJldHR5IGZvcm1cbiAgICAvLyBhbmQgcmVuZGVycyBldmVyeSBkZXRhaWwgbGluZSB0d2ljZS4gU2xpY2UgcGFzdCAqYWxsKiBtZXNzYWdlIGxpbmVzLlxuICAgIGNvbnN0IG1lc3NhZ2VMaW5lQ291bnQgPSB0aGlzLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICBjb25zdCB0YWlsID0gKHRoaXMuc3RhY2sgPz8gJycpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuc2xpY2UobWVzc2FnZUxpbmVDb3VudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGFpbFxuICAgICAgPyBgJHt0aGlzLm5hbWV9OiAke3ByZXR0eX1cXG4ke3RhaWx9YFxuICAgICAgOiBgJHt0aGlzLm5hbWV9OiAke3ByZXR0eX1gO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5uYW1lfTogJHtyZW5kZXJQcmV0dHkodGhpcy4jY29udGVudCl9YDtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIEFQSSB0aGF0IG11c3QgcnVuIGluc2lkZSBhIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGNhbGxlZFxuICogZnJvbSBvdXRzaWRlIGEgd29ya2Zsb3cgY29udGV4dCAoZS5nLiBmcm9tIGEgc3RlcCBmdW5jdGlvbiBvciBmcm9tXG4gKiByZWd1bGFyIGFwcGxpY2F0aW9uIGNvZGUpLlxuICovXG5leHBvcnQgY2xhc3MgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvciBleHRlbmRzIENvbnRleHRWaW9sYXRpb25FcnJvciB7XG4gIG5hbWUgPSAnTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcic7XG5cbiAgY29uc3RydWN0b3IoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGRvY3NVcmw6IERvY3NVcmwpIHtcbiAgICBzdXBlcih7XG4gICAgICB0aXRsZTogW1xuICAgICAgICB7IGNvZGU6IGZ1bmN0aW9uTmFtZSB9LFxuICAgICAgICB7IHRleHQ6ICcgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBhIHdvcmtmbG93IGZ1bmN0aW9uJyB9LFxuICAgICAgXSxcbiAgICAgIGRldGFpbHM6IFt7IHR5cGU6ICdkb2NzJywgdXJsOiBkb2NzVXJsIH1dLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYW4gQVBJIHRoYXQgbXVzdCBydW4gaW5zaWRlIGEgc3RlcCBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbVxuICogb3V0c2lkZSBhIHN0ZXAgY29udGV4dC5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluU3RlcENvbnRleHRFcnJvciBleHRlbmRzIENvbnRleHRWaW9sYXRpb25FcnJvciB7XG4gIG5hbWUgPSAnTm90SW5TdGVwQ29udGV4dEVycm9yJztcblxuICBjb25zdHJ1Y3RvcihmdW5jdGlvbk5hbWU6IHN0cmluZywgZG9jc1VybDogRG9jc1VybCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHRpdGxlOiBbXG4gICAgICAgIHsgY29kZTogZnVuY3Rpb25OYW1lIH0sXG4gICAgICAgIHsgdGV4dDogJyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgc3RlcCBmdW5jdGlvbicgfSxcbiAgICAgIF0sXG4gICAgICBkZXRhaWxzOiBbeyB0eXBlOiAnZG9jcycsIHVybDogZG9jc1VybCB9XSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIEFQSSB0aGF0IG11c3QgcnVuIGluc2lkZSBlaXRoZXIgYSB3b3JrZmxvdyBvciBzdGVwIGZ1bmN0aW9uXG4gKiBpcyBjYWxsZWQgZnJvbSByZWd1bGFyIGFwcGxpY2F0aW9uIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yIGV4dGVuZHMgQ29udGV4dFZpb2xhdGlvbkVycm9yIHtcbiAgbmFtZSA9ICdOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yJztcblxuICBjb25zdHJ1Y3RvcihmdW5jdGlvbk5hbWU6IHN0cmluZywgZG9jc1VybDogRG9jc1VybCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHRpdGxlOiBbXG4gICAgICAgIHsgY29kZTogZnVuY3Rpb25OYW1lIH0sXG4gICAgICAgIHsgdGV4dDogJyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgd29ya2Zsb3cgb3Igc3RlcCBmdW5jdGlvbicgfSxcbiAgICAgIF0sXG4gICAgICBkZXRhaWxzOiBbeyB0eXBlOiAnZG9jcycsIHVybDogZG9jc1VybCB9XSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-hook.d.ts","sourceRoot":"","sources":["../src/create-hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-hook.d.ts","sourceRoot":"","sources":["../src/create-hook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;GAEG;AACH,UAAU,QAAQ,CAAC,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,OAAO;IAClD,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClE;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;;;;;;;;;;;OAYG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,OAAO,CAAE,SAAQ,IAAI,CAAC,CAAC,CAAC;IACzD;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IAExB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,WAAW,CAAC;IAChD;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAMlE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,GAAG;IAAE,WAAW,EAAE,QAAQ,CAAA;CAAE,GAClD,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAChC,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC"}
|
package/dist/create-hook.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { throwNotInWorkflowContext } from './context-errors.js';
|
|
1
2
|
/**
|
|
2
3
|
* Creates a {@link Hook} that can be used to suspend and resume the workflow run with a payload.
|
|
3
4
|
*
|
|
@@ -22,11 +23,11 @@
|
|
|
22
23
|
*/
|
|
23
24
|
// @ts-expect-error `options` is here for types/docs
|
|
24
25
|
export function createHook(options) {
|
|
25
|
-
|
|
26
|
+
throwNotInWorkflowContext('createHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow/create-hook', createHook);
|
|
26
27
|
}
|
|
27
28
|
export function createWebhook(
|
|
28
29
|
// @ts-expect-error `options` is here for types/docs
|
|
29
30
|
options) {
|
|
30
|
-
|
|
31
|
+
throwNotInWorkflowContext('createWebhook()', 'https://workflow-sdk.dev/docs/api-reference/workflow/create-webhook', createWebhook);
|
|
31
32
|
}
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY3JlYXRlLWhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUE0SmhFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLFVBQVUsQ0FBVSxPQUFxQjtJQUN2RCx5QkFBeUIsQ0FDdkIsY0FBYyxFQUNkLGtFQUFrRSxFQUNsRSxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUM7QUFhRCxNQUFNLFVBQVUsYUFBYTtBQUMzQixvREFBb0Q7QUFDcEQsT0FBd0I7SUFFeEIseUJBQXlCLENBQ3ZCLGlCQUFpQixFQUNqQixxRUFBcUUsRUFDckUsYUFBYSxDQUNkLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdGhyb3dOb3RJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vY29udGV4dC1lcnJvcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGNhbiBiZSBhd2FpdGVkIHRvIHJlY2VpdmUgYSB2YWx1ZS5cbiAqL1xuaW50ZXJmYWNlIFRoZW5hYmxlPFQ+IHtcbiAgdGhlbjogUHJvbWlzZTxUPlsndGhlbiddO1xufVxuXG4vKipcbiAqIEEgYFJlcXVlc3RgIHRoYXQgY2FuIGJlIHJlc3BvbmRlZCB0byB3aXRoaW4gYSB3b3JrZmxvd1xuICogc3RlcCBmdW5jdGlvbiBieSBjYWxsaW5nIHRoZSBgcmVzcG9uZFdpdGgoKWAgbWV0aG9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RXaXRoUmVzcG9uc2UgZXh0ZW5kcyBSZXF1ZXN0IHtcbiAgcmVzcG9uZFdpdGg6IChyZXNwb25zZTogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBob29rIHRoYXQgY2FuIGJlIGF3YWl0ZWQgYW5kL29yIGl0ZXJhdGVkIG92ZXIgdG8gcmVjZWl2ZVxuICogYSB2YWx1ZSB3aXRoaW4gYSB3b3JrZmxvdyBmcm9tIGFuIGV4dGVybmFsIHN5c3RlbS5cbiAqXG4gKiBIb29rcyBpbXBsZW1lbnQgdGhlIFRDMzkgRXhwbGljaXQgUmVzb3VyY2UgTWFuYWdlbWVudCBwcm9wb3NhbCxcbiAqIGFsbG93aW5nIHRoZW0gdG8gYmUgdXNlZCB3aXRoIHRoZSBgdXNpbmdgIGtleXdvcmQgZm9yIGF1dG9tYXRpYyBkaXNwb3NhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rPFQgPSBhbnk+IGV4dGVuZHMgQXN5bmNJdGVyYWJsZTxUPiwgVGhlbmFibGU8VD4ge1xuICAvKipcbiAgICogVGhlIHRva2VuIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBob29rLlxuICAgKi9cbiAgdG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIGhvb2ssIHJlbGVhc2luZyBpdHMgdG9rZW4gZm9yIHJldXNlIGJ5IG90aGVyIHdvcmtmbG93cy5cbiAgICpcbiAgICogQWZ0ZXIgY2FsbGluZyBgZGlzcG9zZSgpYCwgdGhlIGhvb2sgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBhbnkgZXZlbnRzLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgcmVsZWFzZSBhIGhvb2sgdG9rZW4gYmVmb3JlXG4gICAqIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIGFsbG93aW5nIGFub3RoZXIgd29ya2Zsb3cgdG8gcmVnaXN0ZXIgYSBob29rXG4gICAqIHdpdGggdGhlIHNhbWUgdG9rZW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGhvb2sgPSBjcmVhdGVIb29rPHsgbWVzc2FnZTogc3RyaW5nIH0+KHsgdG9rZW46ICdteS10b2tlbicgfSk7XG4gICAqXG4gICAqIGZvciBhd2FpdCAoY29uc3QgcGF5bG9hZCBvZiBob29rKSB7XG4gICAqICAgaWYgKHBheWxvYWQubWVzc2FnZSA9PT0gJ2RvbmUnKSB7XG4gICAqICAgICBob29rLmRpc3Bvc2UoKTsgLy8gUmVsZWFzZSB0aGUgdG9rZW4gZWFybHlcbiAgICogICAgIGJyZWFrO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZDtcblxuICAvKipcbiAgICogSW1wbGVtZW50cyB0aGUgVEMzOSBFeHBsaWNpdCBSZXNvdXJjZSBNYW5hZ2VtZW50IHByb3Bvc2FsLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHVzaW5nIHRoZSBgdXNpbmdgIGtleXdvcmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHtcbiAgICogICB1c2luZyBob29rID0gY3JlYXRlSG9vazx7IG1lc3NhZ2U6IHN0cmluZyB9Pih7IHRva2VuOiAnbXktdG9rZW4nIH0pO1xuICAgKiAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBob29rO1xuICAgKiAgIC8vIGhvb2sgaXMgYXV0b21hdGljYWxseSBkaXNwb3NlZCB3aGVuIHRoZSBibG9jayBleGl0c1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgd2ViaG9vayB0aGF0IGNhbiBiZSB1c2VkIHRvIHN1c3BlbmQgYW5kIHJlc3VtZSB0aGUgd29ya2Zsb3cgcnVuXG4gKiB1cG9uIHJlY2VpdmluZyBhbiBIVFRQIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwuXG4gKlxuICogQHNlZSB7QGxpbmsgY3JlYXRlV2ViaG9va31cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rPFQgZXh0ZW5kcyBSZXF1ZXN0PiBleHRlbmRzIEhvb2s8VD4ge1xuICAvKipcbiAgICogVGhlIFVSTCB0aGF0IGV4dGVybmFsIHN5c3RlbXMgY2FuIGNhbGwgdG8gc2VuZCBkYXRhIHRvIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSB0b2tlbiB0aGF0IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGhvb2suXG4gICAqXG4gICAqIFdoZW4gc3BlY2lmeWluZyBhbiBleHBsaWNpdCB0b2tlbiwgdGhlIHRva2VuIHNob3VsZCBiZSBjb25zdHJ1Y3RlZFxuICAgKiB3aXRoIGluZm9ybWF0aW9uIHRoYXQgdGhlIGRpc3BhdGNoaW5nIHNpZGUgY2FuIHJlbGlhYmx5IHJlY29uc3RydWN0XG4gICAqIHRoZSB0b2tlbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBpdCBoYXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBEZXRlcm1pbmlzdGljIHRva2VucyBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGBjcmVhdGVIb29rKClgIGFuZFxuICAgKiBzZXJ2ZXItc2lkZSBgcmVzdW1lSG9vaygpYCBvbmx5LiBGb3Igd2ViaG9va3MgKGBjcmVhdGVXZWJob29rKClgKSxcbiAgICogdG9rZW5zIGFyZSBhbHdheXMgcmFuZG9tbHkgZ2VuZXJhdGVkIHRvIHByZXZlbnQgdW5hdXRob3JpemVkIGFjY2Vzc1xuICAgKiB0byB0aGUgcHVibGljIHdlYmhvb2sgZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSByYW5kb21seSBnZW5lcmF0ZWQgdG9rZW4gd2lsbCBiZSBhc3NpZ25lZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRXhwbGljaXQgdG9rZW4gZm9yIGEgU2xhY2sgYm90IChvbmUgd29ya2Zsb3cgcnVuIHBlciBjaGFubmVsKVxuICAgKiBjb25zdCBob29rID0gY3JlYXRlSG9vazxTbGFja01lc3NhZ2U+KHtcbiAgICogICB0b2tlbjogYHNsYWNrX3dlYmhvb2s6JHtjaGFubmVsSWR9YCxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgdXNlci1kZWZpbmVkIGRhdGEgdG8gaW5jbHVkZSB3aXRoIHRoZSBob29rIHBheWxvYWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGhvb2sgPSBjcmVhdGVIb29rPHsgbmFtZTogc3RyaW5nIH0+KHtcbiAgICogICBtZXRhZGF0YToge1xuICAgKiAgICAgdHlwZTogXCJjYXRcIixcbiAgICogICAgIGNvbG9yOiBcIm9yYW5nZVwiLFxuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG1ldGFkYXRhPzogU2VyaWFsaXphYmxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaG9vayBjYW4gYmUgcmVzdW1lZCB2aWEgdGhlIHB1YmxpYyB3ZWJob29rIGVuZHBvaW50LlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGhvb2sgY2FuIGJlIHRyaWdnZXJlZCBieSBzZW5kaW5nIGFuIEhUVFAgcmVxdWVzdCB0byB0aGVcbiAgICogcHVibGljIGAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay97dG9rZW59YCBVUkwuIFRoaXMgaXMgYXV0b21hdGljYWxseVxuICAgKiBzZXQgd2hlbiB1c2luZyBgY3JlYXRlV2ViaG9vaygpYC5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoZSBob29rIGNhbiBvbmx5IGJlIHJlc3VtZWQgc2VydmVyLXNpZGVcbiAgICogdmlhIGByZXN1bWVIb29rKClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgaXNXZWJob29rPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJob29rT3B0aW9uc1xuICBleHRlbmRzIE9taXQ8SG9va09wdGlvbnMsICd0b2tlbicgfCAnaXNXZWJob29rJz4ge1xuICAvKipcbiAgICogSWYgc2V0IHRvIGEgYFJlc3BvbnNlYCBvYmplY3QsIHRoZSB3ZWJob29rIHdpbGwgYXV0b21hdGljYWxseVxuICAgKiByZXNwb25kIHdpdGggdGhlIHNwZWNpZmllZCByZXNwb25zZS5cbiAgICpcbiAgICogSWYgc2V0IHRvIGBcIm1hbnVhbFwiYCwgZWFjaCBpbmRpdmlkdWFsIHJlcXVlc3Qgd2lsbCBuZWVkIHRvXG4gICAqIGJlIHJlc3BvbmRlZCB0byBtYW51YWxseSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgYnkgY2FsbGluZyB0aGVcbiAgICogYHJlc3BvbmRXaXRoKClgIG1ldGhvZC5cbiAgICpcbiAgICogSWYgbm90IHNldCB0aGVuIHRoZSB3ZWJob29rIHdpbGwgYXV0b21hdGljYWxseSByZXNwb25kIHdpdGhcbiAgICogYSBgMjAyIEFjY2VwdGVkYCByZXNwb25zZS5cbiAgICovXG4gIHJlc3BvbmRXaXRoPzogUmVzcG9uc2UgfCAnbWFudWFsJztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEhvb2t9IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIHRoZSB3b3JrZmxvdyBydW4gd2l0aCBhIHBheWxvYWQuXG4gKlxuICogSG9va3MgYWxsb3cgZXh0ZXJuYWwgc3lzdGVtcyB0byBzZW5kIGFyYml0cmFyeSBzZXJpYWxpemFibGUgZGF0YSBpbnRvIGEgd29ya2Zsb3cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBob29rLlxuICogQHJldHVybnMgQSBgSG9va2AgdGhhdCBjYW4gYmUgYXdhaXRlZCB0byByZWNlaXZlIG9uZSBvciBtb3JlIHBheWxvYWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB3b3JrZmxvd1dpdGhIb29rKCkge1xuICogICBcInVzZSB3b3JrZmxvd1wiO1xuICpcbiAqICAgY29uc3QgaG9vayA9IGNyZWF0ZUhvb2s8eyBtZXNzYWdlOiBzdHJpbmcgfT4oKTtcbiAqICAgY29uc29sZS5sb2coJ0hvb2sgdG9rZW46JywgaG9vay50b2tlbik7XG4gKlxuICogICBjb25zdCBwYXlsb2FkID0gYXdhaXQgaG9vaztcbiAqICAgY29uc29sZS5sb2coJ1JlY2VpdmVkOicsIHBheWxvYWQubWVzc2FnZSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuLy8gQHRzLWV4cGVjdC1lcnJvciBgb3B0aW9uc2AgaXMgaGVyZSBmb3IgdHlwZXMvZG9jc1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCA9IGFueT4ob3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUPiB7XG4gIHRocm93Tm90SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ2NyZWF0ZUhvb2soKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3cvY3JlYXRlLWhvb2snLFxuICAgIGNyZWF0ZUhvb2tcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFdlYmhvb2t9IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIHRoZSB3b3JrZmxvd1xuICogcnVuIHVwb24gcmVjZWl2aW5nIGFuIEhUVFAgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIFVSTC5cbiAqXG4gKiBXZWJob29rcyB3aWxsIHJlc3VsdCBpbiBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdCB8IFJlcXVlc3R9IG9iamVjdFxuICogdGhhdCBjYW4gYmUgaW50ZXJhY3RlZCB3aXRoIGluIHdvcmtmbG93IGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2soXG4gIG9wdGlvbnM6IFdlYmhvb2tPcHRpb25zICYgeyByZXNwb25kV2l0aDogJ21hbnVhbCcgfVxuKTogV2ViaG9vazxSZXF1ZXN0V2l0aFJlc3BvbnNlPjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKG9wdGlvbnM/OiBXZWJob29rT3B0aW9ucyk6IFdlYmhvb2s8UmVxdWVzdD47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBgb3B0aW9uc2AgaXMgaGVyZSBmb3IgdHlwZXMvZG9jc1xuICBvcHRpb25zPzogV2ViaG9va09wdGlvbnNcbik6IFdlYmhvb2s8UmVxdWVzdD4gfCBXZWJob29rPFJlcXVlc3RXaXRoUmVzcG9uc2U+IHtcbiAgdGhyb3dOb3RJbldvcmtmbG93Q29udGV4dChcbiAgICAnY3JlYXRlV2ViaG9vaygpJyxcbiAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy9jcmVhdGUtd2ViaG9vaycsXG4gICAgY3JlYXRlV2ViaG9va1xuICApO1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-hook.d.ts","sourceRoot":"","sources":["../src/define-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"define-hook.d.ts","sourceRoot":"","sources":["../src/define-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,MAAM,EAAE,OAAO;IACxC;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7D;AAED,yBAAiB,SAAS,CAAC;IACzB;;OAEG;IACH,KAAY,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,IAC7C,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,EACnD,MAAM,GACP,GAAE;IACD,MAAM,CAAC,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CA8ClC"}
|
package/dist/define-hook.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { throwNotInWorkflowContext } from './context-errors.js';
|
|
1
2
|
import { resumeHook } from './runtime/resume-hook.js';
|
|
2
3
|
/**
|
|
3
4
|
* Defines a typed hook for type-safe hook creation and resumption.
|
|
@@ -31,10 +32,14 @@ import { resumeHook } from './runtime/resume-hook.js';
|
|
|
31
32
|
* ```
|
|
32
33
|
*/
|
|
33
34
|
export function defineHook({ schema, } = {}) {
|
|
35
|
+
function create(_options) {
|
|
36
|
+
// NOTE: `create` is referenced by name (not `this.create`) so the stack
|
|
37
|
+
// strip still works if the caller destructured the hook (`const { create }
|
|
38
|
+
// = defineHook(); create()`) — in that case `this` is undefined.
|
|
39
|
+
throwNotInWorkflowContext('defineHook().create()', 'https://workflow-sdk.dev/docs/api-reference/workflow/define-hook', create);
|
|
40
|
+
}
|
|
34
41
|
return {
|
|
35
|
-
create
|
|
36
|
-
throw new Error('`defineHook().create()` can only be called inside a workflow function.');
|
|
37
|
-
},
|
|
42
|
+
create,
|
|
38
43
|
async resume(token, payload) {
|
|
39
44
|
if (!schema?.['~standard']) {
|
|
40
45
|
return await resumeHook(token, payload);
|
|
@@ -45,10 +50,20 @@ export function defineHook({ schema, } = {}) {
|
|
|
45
50
|
}
|
|
46
51
|
// if the `issues` field exists, the validation failed
|
|
47
52
|
if (result.issues) {
|
|
48
|
-
|
|
53
|
+
const lines = result.issues.map((issue) => {
|
|
54
|
+
const path = issue.path
|
|
55
|
+
?.map((segment) => typeof segment === 'object' && segment !== null
|
|
56
|
+
? String(segment.key)
|
|
57
|
+
: String(segment))
|
|
58
|
+
.join('.');
|
|
59
|
+
return path
|
|
60
|
+
? ` at "${path}": ${issue.message}`
|
|
61
|
+
: ` ${issue.message}`;
|
|
62
|
+
});
|
|
63
|
+
throw new Error(`Hook payload did not match the defined schema:\n${lines.join('\n')}`);
|
|
49
64
|
}
|
|
50
65
|
return await resumeHook(token, result.value);
|
|
51
66
|
},
|
|
52
67
|
};
|
|
53
68
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmaW5lLWhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBbUN0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBMkIsRUFDbkQsTUFBTSxNQUdKLEVBQUU7SUFDSixTQUFTLE1BQU0sQ0FBQyxRQUFzQjtRQUNwQyx3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUNqRSx5QkFBeUIsQ0FDdkIsdUJBQXVCLEVBQ3ZCLGtFQUFrRSxFQUNsRSxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTTtRQUNOLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQWU7WUFDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFFRCxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELElBQUksTUFBTSxZQUFZLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUM7WUFDeEIsQ0FBQztZQUVELHNEQUFzRDtZQUN0RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDeEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUk7d0JBQ3JCLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDaEIsT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxJQUFJO3dCQUM3QyxDQUFDLENBQUMsTUFBTSxDQUFFLE9BQWdDLENBQUMsR0FBRyxDQUFDO3dCQUMvQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUNwQjt5QkFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2IsT0FBTyxJQUFJO3dCQUNULENBQUMsQ0FBQyxTQUFTLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFO3dCQUNwQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQ2IsbURBQW1ELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEUsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE1BQU0sVUFBVSxDQUFVLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcbmltcG9ydCB0eXBlIHsgSG9vayBhcyBIb29rRW50aXR5IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHRocm93Tm90SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2NvbnRleHQtZXJyb3JzLmpzJztcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcbmltcG9ydCB7IHJlc3VtZUhvb2sgfSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnO1xuXG4vKipcbiAqIEEgdHlwZWQgaG9vayBpbnRlcmZhY2UgZm9yIHR5cGUtc2FmZSBob29rIGNyZWF0aW9uIGFuZCByZXN1bXB0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVkSG9vazxUSW5wdXQsIFRPdXRwdXQ+IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaG9vayB3aXRoIHRoZSBkZWZpbmVkIG91dHB1dCB0eXBlLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgYXZhaWxhYmxlIGluIHJ1bnRpbWUgYnVuZGxlcy4gVXNlIGl0IGZyb20gd29ya2Zsb3cgY29udGV4dHMgb25seS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBob29rIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgQSBIb29rIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlZmluZWQgb3V0cHV0IHR5cGVcbiAgICovXG4gIGNyZWF0ZShvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFRPdXRwdXQ+O1xuICAvKipcbiAgICogUmVzdW1lcyBhIGhvb2sgYnkgc2VuZGluZyBhIHBheWxvYWQgd2l0aCB0aGUgZGVmaW5lZCBpbnB1dCB0eXBlLlxuICAgKiBUaGlzIGlzIGEgdHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIHRoZSBgcmVzdW1lSG9va2AgcnVudGltZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9va1xuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBwYXlsb2FkIHRvIHNlbmQ7IGlmIGEgYHNjaGVtYWAgaXMgY29uZmlndXJlZCBpdCBpcyB2YWxpZGF0ZWQvdHJhbnNmb3JtZWQgYmVmb3JlIHJlc3VtaW5nXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBob29rIGVudGl0eVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBob29rIGlzIG5vdCBmb3VuZCBvciBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB0aGUgcHJvY2Vzc1xuICAgKi9cbiAgcmVzdW1lKHRva2VuOiBzdHJpbmcsIHBheWxvYWQ6IFRJbnB1dCk6IFByb21pc2U8SG9va0VudGl0eT47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVHlwZWRIb29rIHtcbiAgLyoqXG4gICAqIEV4dHJhY3RzIHRoZSBpbnB1dCB0eXBlIGZyb20gYSB7QGxpbmsgVHlwZWRIb29rfVxuICAgKi9cbiAgZXhwb3J0IHR5cGUgSW5wdXQ8VCBleHRlbmRzIFR5cGVkSG9vazxhbnksIGFueT4+ID1cbiAgICBUIGV4dGVuZHMgVHlwZWRIb29rPGluZmVyIEksIGFueT4gPyBJIDogbmV2ZXI7XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIHR5cGVkIGhvb2sgZm9yIHR5cGUtc2FmZSBob29rIGNyZWF0aW9uIGFuZCByZXN1bXB0aW9uLlxuICpcbiAqIFRoaXMgaGVscGVyIHByb3ZpZGVzIHR5cGUgc2FmZXR5IGJ5IGFsbG93aW5nIHlvdSB0byBkZWZpbmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgdHlwZXNcbiAqIGZvciB0aGUgaG9vaydzIHBheWxvYWQsIHdpdGggb3B0aW9uYWwgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gdmlhIGEgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSBzY2hlbWEgLSBTY2hlbWEgdXNlZCB0byB2YWxpZGF0ZSBhbmQgdHJhbnNmb3JtIHRoZSBpbnB1dCBwYXlsb2FkIGJlZm9yZSByZXN1bWluZ1xuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYGNyZWF0ZWAgYW5kIGByZXN1bWVgIGZ1bmN0aW9ucyBwcmUtdHlwZWQgd2l0aCB0aGUgaW5wdXQgYW5kIG91dHB1dCB0eXBlc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIERlZmluZSBhIGhvb2sgd2l0aCBhIHNwZWNpZmljIHBheWxvYWQgdHlwZVxuICogY29uc3QgYXBwcm92YWxIb29rID0gZGVmaW5lSG9vazx7IGFwcHJvdmVkOiBib29sZWFuOyBjb21tZW50OiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAvLyBJbiBhIHdvcmtmbG93XG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gd29ya2Zsb3dXaXRoQXBwcm92YWwoKSB7XG4gKiAgIFwidXNlIHdvcmtmbG93XCI7XG4gKlxuICogICBjb25zdCBob29rID0gYXBwcm92YWxIb29rLmNyZWF0ZSgpO1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBob29rOyAvLyBGdWxseSB0eXBlZCBhcyB7IGFwcHJvdmVkOiBib29sZWFuOyBjb21tZW50OiBzdHJpbmc7IH1cbiAqIH1cbiAqXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgeyB0b2tlbiwgYXBwcm92ZWQsIGNvbW1lbnQgfSA9IGF3YWl0IHJlcXVlc3QuanNvbigpO1xuICogICBhd2FpdCBhcHByb3ZhbEhvb2sucmVzdW1lKHRva2VuLCB7IGFwcHJvdmVkLCBjb21tZW50IH0pOyAvLyBJbnB1dCB0eXBlXG4gKiAgIHJldHVybiBSZXNwb25zZS5qc29uKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lSG9vazxUSW5wdXQsIFRPdXRwdXQgPSBUSW5wdXQ+KHtcbiAgc2NoZW1hLFxufToge1xuICBzY2hlbWE/OiBTdGFuZGFyZFNjaGVtYVYxPFRJbnB1dCwgVE91dHB1dD47XG59ID0ge30pOiBUeXBlZEhvb2s8VElucHV0LCBUT3V0cHV0PiB7XG4gIGZ1bmN0aW9uIGNyZWF0ZShfb3B0aW9ucz86IEhvb2tPcHRpb25zKTogSG9vazxUT3V0cHV0PiB7XG4gICAgLy8gTk9URTogYGNyZWF0ZWAgaXMgcmVmZXJlbmNlZCBieSBuYW1lIChub3QgYHRoaXMuY3JlYXRlYCkgc28gdGhlIHN0YWNrXG4gICAgLy8gc3RyaXAgc3RpbGwgd29ya3MgaWYgdGhlIGNhbGxlciBkZXN0cnVjdHVyZWQgdGhlIGhvb2sgKGBjb25zdCB7IGNyZWF0ZSB9XG4gICAgLy8gPSBkZWZpbmVIb29rKCk7IGNyZWF0ZSgpYCkg4oCUIGluIHRoYXQgY2FzZSBgdGhpc2AgaXMgdW5kZWZpbmVkLlxuICAgIHRocm93Tm90SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgICAnZGVmaW5lSG9vaygpLmNyZWF0ZSgpJyxcbiAgICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93L2RlZmluZS1ob29rJyxcbiAgICAgIGNyZWF0ZVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZSxcbiAgICBhc3luYyByZXN1bWUodG9rZW46IHN0cmluZywgcGF5bG9hZDogVElucHV0KTogUHJvbWlzZTxIb29rRW50aXR5PiB7XG4gICAgICBpZiAoIXNjaGVtYT8uWyd+c3RhbmRhcmQnXSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdW1lSG9vayh0b2tlbiwgcGF5bG9hZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQgPSBzY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBheWxvYWQpO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgYGlzc3Vlc2AgZmllbGQgZXhpc3RzLCB0aGUgdmFsaWRhdGlvbiBmYWlsZWRcbiAgICAgIGlmIChyZXN1bHQuaXNzdWVzKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gcmVzdWx0Lmlzc3Vlcy5tYXAoKGlzc3VlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGlzc3VlLnBhdGhcbiAgICAgICAgICAgID8ubWFwKChzZWdtZW50KSA9PlxuICAgICAgICAgICAgICB0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgJiYgc2VnbWVudCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gU3RyaW5nKChzZWdtZW50IGFzIHsga2V5OiBQcm9wZXJ0eUtleSB9KS5rZXkpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoc2VnbWVudClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCcuJyk7XG4gICAgICAgICAgcmV0dXJuIHBhdGhcbiAgICAgICAgICAgID8gYCAgYXQgXCIke3BhdGh9XCI6ICR7aXNzdWUubWVzc2FnZX1gXG4gICAgICAgICAgICA6IGAgICR7aXNzdWUubWVzc2FnZX1gO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBIb29rIHBheWxvYWQgZGlkIG5vdCBtYXRjaCB0aGUgZGVmaW5lZCBzY2hlbWE6XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN1bWVIb29rPFRPdXRwdXQ+KHRva2VuLCByZXN1bHQudmFsdWUpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type RunErrorCode } from '@workflow/errors';
|
|
2
|
+
/**
|
|
3
|
+
* Attribution of a workflow/step failure for presentation.
|
|
4
|
+
*
|
|
5
|
+
* - `user`: the error came from customer code (a step or workflow function
|
|
6
|
+
* threw, or a value they passed across a boundary wasn't serializable).
|
|
7
|
+
* - `sdk`: the SDK produced the error itself — an internal invariant broke,
|
|
8
|
+
* or a runtime guard rejected the call. These should be rare; when they
|
|
9
|
+
* happen we want to frame the terminal output as "this is us, not you."
|
|
10
|
+
*/
|
|
11
|
+
export type ErrorAttribution = 'user' | 'sdk';
|
|
12
|
+
export interface ErrorDescription {
|
|
13
|
+
attribution: ErrorAttribution;
|
|
14
|
+
errorCode: RunErrorCode;
|
|
15
|
+
/**
|
|
16
|
+
* Short, class-aware hint to help a user understand what the error means.
|
|
17
|
+
* Only set for well-known SDK error classes (SerializationError,
|
|
18
|
+
* WorkflowRuntimeError, context-violation errors); `undefined` for plain
|
|
19
|
+
* user errors, where the stack is already the most useful thing to show.
|
|
20
|
+
*/
|
|
21
|
+
hint?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Error signal fields carried on persisted failure events (e.g.
|
|
25
|
+
* `run_failed` / `step_failed`). The shape is intentionally loose:
|
|
26
|
+
*
|
|
27
|
+
* - `errorCode` is typed as `string` rather than `RunErrorCode` because
|
|
28
|
+
* the value comes from stored JSON/CBOR and may predate the current
|
|
29
|
+
* enum — callers should not narrow on it blindly. Values that don't
|
|
30
|
+
* match a known `RUN_ERROR_CODES` entry fall through to USER_ERROR.
|
|
31
|
+
* - `errorName` is the thrown `Error#name`. It is not universally
|
|
32
|
+
* persisted today; callers that have access to it (either via an
|
|
33
|
+
* in-memory throw or a richer payload) can pass it in to sharpen
|
|
34
|
+
* the attribution and hint. When absent, `describeRunError` still
|
|
35
|
+
* returns a sensible attribution from `errorCode` alone.
|
|
36
|
+
*/
|
|
37
|
+
export interface PersistedErrorSignal {
|
|
38
|
+
errorCode?: string;
|
|
39
|
+
errorName?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Data-driven variant of {@link describeError} that works from persisted
|
|
43
|
+
* event fields instead of a live `Error` instance. Intended for CLI/web
|
|
44
|
+
* renderers that read failure events and no longer have the original
|
|
45
|
+
* thrown object.
|
|
46
|
+
*/
|
|
47
|
+
export declare function describeRunError(signal: PersistedErrorSignal): ErrorDescription;
|
|
48
|
+
/**
|
|
49
|
+
* Describe an error for user-facing presentation. Purely informational —
|
|
50
|
+
* does not change any persisted event data or error classification used by
|
|
51
|
+
* the runtime.
|
|
52
|
+
*
|
|
53
|
+
* The attribution here is more nuanced than `classifyRunError`:
|
|
54
|
+
*
|
|
55
|
+
* - `SerializationError` is technically raised by the SDK, but it almost
|
|
56
|
+
* always points at something the caller did (passed a non-serializable
|
|
57
|
+
* value, didn't register a class). We attribute it to the user.
|
|
58
|
+
* - Context-violation errors (`NotInWorkflowContextError`, etc.) likewise
|
|
59
|
+
* describe a user mistake.
|
|
60
|
+
* - `WorkflowRuntimeError` (and subclasses like `StepNotRegisteredError`)
|
|
61
|
+
* indicates an internal SDK invariant broke — surface that as `sdk`.
|
|
62
|
+
*
|
|
63
|
+
* @param err The error value thrown by the workflow / step.
|
|
64
|
+
* @param errorCode Optional precomputed error code. Callers that already
|
|
65
|
+
* know the code (e.g. `REPLAY_TIMEOUT` or `MAX_DELIVERIES_EXCEEDED`, which
|
|
66
|
+
* `classifyRunError` can't derive from the error alone) should pass it so
|
|
67
|
+
* the attribution and hint reflect the actual failure category.
|
|
68
|
+
*/
|
|
69
|
+
export declare function describeError(err: unknown, errorCode?: RunErrorCode): ErrorDescription;
|
|
70
|
+
//# sourceMappingURL=describe-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-error.d.ts","sourceRoot":"","sources":["../src/describe-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAGlB,MAAM,kBAAkB,CAAC;AAS1B;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,YAAY,CAAC;IACxB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2CD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,oBAAoB,GAC3B,gBAAgB,CA+ClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,SAAS,CAAC,EAAE,YAAY,GACvB,gBAAgB,CAoElB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { CorruptedEventLogError, RUN_ERROR_CODES, SerializationError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
2
|
+
import { classifyRunError } from './classify-error.js';
|
|
3
|
+
import { NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, UnavailableInWorkflowContextError, } from './context-errors.js';
|
|
4
|
+
const CONTEXT_ERROR_NAMES = new Set([
|
|
5
|
+
'NotInWorkflowContextError',
|
|
6
|
+
'NotInStepContextError',
|
|
7
|
+
'NotInWorkflowOrStepContextError',
|
|
8
|
+
'UnavailableInWorkflowContextError',
|
|
9
|
+
]);
|
|
10
|
+
function isContextViolationError(err) {
|
|
11
|
+
return (err instanceof NotInWorkflowContextError ||
|
|
12
|
+
err instanceof NotInStepContextError ||
|
|
13
|
+
err instanceof NotInWorkflowOrStepContextError ||
|
|
14
|
+
err instanceof UnavailableInWorkflowContextError);
|
|
15
|
+
}
|
|
16
|
+
const SERIALIZATION_ERROR_HINT = 'A value passed across a workflow/step boundary could not be serialized. See the error message for the offending path and the Learn More link for details.';
|
|
17
|
+
const CONTEXT_ERROR_HINT = 'A workflow-only or step-only API was called from the wrong context. The error message includes the exact API and how to move the call.';
|
|
18
|
+
const RUNTIME_ERROR_HINT = 'This is an internal workflow SDK error, not a bug in your code. If it keeps happening, please report it with the stack trace and the runId.';
|
|
19
|
+
const CORRUPTED_EVENT_LOG_HINT = 'The workflow event log contains orphaned or mismatched events and cannot be replayed. This is an internal workflow SDK error; please report it with the runId.';
|
|
20
|
+
const REPLAY_TIMEOUT_HINT = 'The workflow replay between step boundaries took too long. This bounds workflow-VM and event-log replay time only — step bodies (`"use step"` functions) are excluded. This usually means the event log is unusually large or the workflow function is doing heavy synchronous work in workflow code outside of step bodies. Override the default budget via the WORKFLOW_REPLAY_TIMEOUT_MS env var if needed.';
|
|
21
|
+
const MAX_DELIVERIES_HINT = 'The workflow queue exceeded its max-delivery budget. This usually indicates a persistent runtime failure — check the most recent stack traces for the underlying cause.';
|
|
22
|
+
const WORLD_CONTRACT_HINT = 'The workflow backend returned data that violated the SDK contract. This is not retryable; please report it with the stack trace and runId.';
|
|
23
|
+
function normalizeErrorCode(code) {
|
|
24
|
+
// Values read back from persisted events are `string | undefined` — we
|
|
25
|
+
// only trust codes that match a known entry in `RUN_ERROR_CODES`.
|
|
26
|
+
const known = Object.values(RUN_ERROR_CODES);
|
|
27
|
+
if (code && known.includes(code)) {
|
|
28
|
+
return code;
|
|
29
|
+
}
|
|
30
|
+
return RUN_ERROR_CODES.USER_ERROR;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Data-driven variant of {@link describeError} that works from persisted
|
|
34
|
+
* event fields instead of a live `Error` instance. Intended for CLI/web
|
|
35
|
+
* renderers that read failure events and no longer have the original
|
|
36
|
+
* thrown object.
|
|
37
|
+
*/
|
|
38
|
+
export function describeRunError(signal) {
|
|
39
|
+
const name = signal.errorName;
|
|
40
|
+
const errorCode = name === 'CorruptedEventLogError'
|
|
41
|
+
? RUN_ERROR_CODES.CORRUPTED_EVENT_LOG
|
|
42
|
+
: normalizeErrorCode(signal.errorCode);
|
|
43
|
+
if (name === 'SerializationError') {
|
|
44
|
+
return { attribution: 'user', errorCode, hint: SERIALIZATION_ERROR_HINT };
|
|
45
|
+
}
|
|
46
|
+
if (name && CONTEXT_ERROR_NAMES.has(name)) {
|
|
47
|
+
return { attribution: 'user', errorCode, hint: CONTEXT_ERROR_HINT };
|
|
48
|
+
}
|
|
49
|
+
if (name === 'CorruptedEventLogError') {
|
|
50
|
+
return {
|
|
51
|
+
attribution: 'sdk',
|
|
52
|
+
errorCode,
|
|
53
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (errorCode === RUN_ERROR_CODES.REPLAY_TIMEOUT) {
|
|
57
|
+
return { attribution: 'sdk', errorCode, hint: REPLAY_TIMEOUT_HINT };
|
|
58
|
+
}
|
|
59
|
+
if (errorCode === RUN_ERROR_CODES.MAX_DELIVERIES_EXCEEDED) {
|
|
60
|
+
return { attribution: 'sdk', errorCode, hint: MAX_DELIVERIES_HINT };
|
|
61
|
+
}
|
|
62
|
+
if (errorCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
|
|
63
|
+
return {
|
|
64
|
+
attribution: 'sdk',
|
|
65
|
+
errorCode,
|
|
66
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (errorCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
|
|
70
|
+
return {
|
|
71
|
+
attribution: 'sdk',
|
|
72
|
+
errorCode,
|
|
73
|
+
hint: WORLD_CONTRACT_HINT,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (name === 'WorkflowRuntimeError' || name === 'StepNotRegisteredError') {
|
|
77
|
+
return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
|
|
78
|
+
}
|
|
79
|
+
if (errorCode === RUN_ERROR_CODES.RUNTIME_ERROR) {
|
|
80
|
+
return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
|
|
81
|
+
}
|
|
82
|
+
return { attribution: 'user', errorCode };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Describe an error for user-facing presentation. Purely informational —
|
|
86
|
+
* does not change any persisted event data or error classification used by
|
|
87
|
+
* the runtime.
|
|
88
|
+
*
|
|
89
|
+
* The attribution here is more nuanced than `classifyRunError`:
|
|
90
|
+
*
|
|
91
|
+
* - `SerializationError` is technically raised by the SDK, but it almost
|
|
92
|
+
* always points at something the caller did (passed a non-serializable
|
|
93
|
+
* value, didn't register a class). We attribute it to the user.
|
|
94
|
+
* - Context-violation errors (`NotInWorkflowContextError`, etc.) likewise
|
|
95
|
+
* describe a user mistake.
|
|
96
|
+
* - `WorkflowRuntimeError` (and subclasses like `StepNotRegisteredError`)
|
|
97
|
+
* indicates an internal SDK invariant broke — surface that as `sdk`.
|
|
98
|
+
*
|
|
99
|
+
* @param err The error value thrown by the workflow / step.
|
|
100
|
+
* @param errorCode Optional precomputed error code. Callers that already
|
|
101
|
+
* know the code (e.g. `REPLAY_TIMEOUT` or `MAX_DELIVERIES_EXCEEDED`, which
|
|
102
|
+
* `classifyRunError` can't derive from the error alone) should pass it so
|
|
103
|
+
* the attribution and hint reflect the actual failure category.
|
|
104
|
+
*/
|
|
105
|
+
export function describeError(err, errorCode) {
|
|
106
|
+
const effectiveCode = errorCode ?? classifyRunError(err);
|
|
107
|
+
if (SerializationError.is(err)) {
|
|
108
|
+
return {
|
|
109
|
+
attribution: 'user',
|
|
110
|
+
errorCode: effectiveCode,
|
|
111
|
+
hint: SERIALIZATION_ERROR_HINT,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (isContextViolationError(err)) {
|
|
115
|
+
return {
|
|
116
|
+
attribution: 'user',
|
|
117
|
+
errorCode: effectiveCode,
|
|
118
|
+
hint: CONTEXT_ERROR_HINT,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (CorruptedEventLogError.is(err)) {
|
|
122
|
+
return {
|
|
123
|
+
attribution: 'sdk',
|
|
124
|
+
errorCode: effectiveCode,
|
|
125
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (err instanceof WorkflowRuntimeError) {
|
|
129
|
+
return {
|
|
130
|
+
attribution: 'sdk',
|
|
131
|
+
errorCode: effectiveCode,
|
|
132
|
+
hint: RUNTIME_ERROR_HINT,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (effectiveCode === RUN_ERROR_CODES.REPLAY_TIMEOUT) {
|
|
136
|
+
return {
|
|
137
|
+
attribution: 'sdk',
|
|
138
|
+
errorCode: effectiveCode,
|
|
139
|
+
hint: REPLAY_TIMEOUT_HINT,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (effectiveCode === RUN_ERROR_CODES.MAX_DELIVERIES_EXCEEDED) {
|
|
143
|
+
return {
|
|
144
|
+
attribution: 'sdk',
|
|
145
|
+
errorCode: effectiveCode,
|
|
146
|
+
hint: MAX_DELIVERIES_HINT,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (effectiveCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
|
|
150
|
+
return {
|
|
151
|
+
attribution: 'sdk',
|
|
152
|
+
errorCode: effectiveCode,
|
|
153
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
if (effectiveCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
|
|
157
|
+
return {
|
|
158
|
+
attribution: 'sdk',
|
|
159
|
+
errorCode: effectiveCode,
|
|
160
|
+
hint: WORLD_CONTRACT_HINT,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return { attribution: 'user', errorCode: effectiveCode };
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVzY3JpYmUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQixpQ0FBaUMsR0FDbEMsTUFBTSxxQkFBcUIsQ0FBQztBQTRDN0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNsQywyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGlDQUFpQztJQUNqQyxtQ0FBbUM7Q0FDcEMsQ0FBQyxDQUFDO0FBRUgsU0FBUyx1QkFBdUIsQ0FBQyxHQUFZO0lBQzNDLE9BQU8sQ0FDTCxHQUFHLFlBQVkseUJBQXlCO1FBQ3hDLEdBQUcsWUFBWSxxQkFBcUI7UUFDcEMsR0FBRyxZQUFZLCtCQUErQjtRQUM5QyxHQUFHLFlBQVksaUNBQWlDLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSx3QkFBd0IsR0FDNUIsMkpBQTJKLENBQUM7QUFDOUosTUFBTSxrQkFBa0IsR0FDdEIsd0lBQXdJLENBQUM7QUFDM0ksTUFBTSxrQkFBa0IsR0FDdEIsNklBQTZJLENBQUM7QUFDaEosTUFBTSx3QkFBd0IsR0FDNUIsZ0tBQWdLLENBQUM7QUFDbkssTUFBTSxtQkFBbUIsR0FDdkIsZ1pBQWdaLENBQUM7QUFDblosTUFBTSxtQkFBbUIsR0FDdkIseUtBQXlLLENBQUM7QUFDNUssTUFBTSxtQkFBbUIsR0FDdkIsNElBQTRJLENBQUM7QUFFL0ksU0FBUyxrQkFBa0IsQ0FBQyxJQUF3QjtJQUNsRCx1RUFBdUU7SUFDdkUsa0VBQWtFO0lBQ2xFLE1B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QUFLO1lBQ2xCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLElBQUksRUFBRSx3QkFBd0I7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGFBQWEsS0FBSyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLEtBQUs7WUFDbEIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsSUFBSSxFQUFFLG1CQUFtQjtTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBjbGFzc2lmeVJ1bkVycm9yIH0gZnJvbSAnLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQge1xuICBOb3RJblN0ZXBDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IsXG4gIFVuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcixcbn0gZnJvbSAnLi9jb250ZXh0LWVycm9ycy5qcyc7XG5cbi8qKlxuICogQXR0cmlidXRpb24gb2YgYSB3b3JrZmxvdy9zdGVwIGZhaWx1cmUgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiAtIGB1c2VyYDogdGhlIGVycm9yIGNhbWUgZnJvbSBjdXN0b21lciBjb2RlIChhIHN0ZXAgb3Igd29ya2Zsb3cgZnVuY3Rpb25cbiAqICAgdGhyZXcsIG9yIGEgdmFsdWUgdGhleSBwYXNzZWQgYWNyb3NzIGEgYm91bmRhcnkgd2Fzbid0IHNlcmlhbGl6YWJsZSkuXG4gKiAtIGBzZGtgOiB0aGUgU0RLIHByb2R1Y2VkIHRoZSBlcnJvciBpdHNlbGYg4oCUIGFuIGludGVybmFsIGludmFyaWFudCBicm9rZSxcbiAqICAgb3IgYSBydW50aW1lIGd1YXJkIHJlamVjdGVkIHRoZSBjYWxsLiBUaGVzZSBzaG91bGQgYmUgcmFyZTsgd2hlbiB0aGV5XG4gKiAgIGhhcHBlbiB3ZSB3YW50IHRvIGZyYW1lIHRoZSB0ZXJtaW5hbCBvdXRwdXQgYXMgXCJ0aGlzIGlzIHVzLCBub3QgeW91LlwiXG4gKi9cbmV4cG9ydCB0eXBlIEVycm9yQXR0cmlidXRpb24gPSAndXNlcicgfCAnc2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckRlc2NyaXB0aW9uIHtcbiAgYXR0cmlidXRpb246IEVycm9yQXR0cmlidXRpb247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICAvKipcbiAgICogU2hvcnQsIGNsYXNzLWF3YXJlIGhpbnQgdG8gaGVscCBhIHVzZXIgdW5kZXJzdGFuZCB3aGF0IHRoZSBlcnJvciBtZWFucy5cbiAgICogT25seSBzZXQgZm9yIHdlbGwta25vd24gU0RLIGVycm9yIGNsYXNzZXMgKFNlcmlhbGl6YXRpb25FcnJvcixcbiAgICogV29ya2Zsb3dSdW50aW1lRXJyb3IsIGNvbnRleHQtdmlvbGF0aW9uIGVycm9ycyk7IGB1bmRlZmluZWRgIGZvciBwbGFpblxuICAgKiB1c2VyIGVycm9ycywgd2hlcmUgdGhlIHN0YWNrIGlzIGFscmVhZHkgdGhlIG1vc3QgdXNlZnVsIHRoaW5nIHRvIHNob3cuXG4gICAqL1xuICBoaW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVycm9yIHNpZ25hbCBmaWVsZHMgY2FycmllZCBvbiBwZXJzaXN0ZWQgZmFpbHVyZSBldmVudHMgKGUuZy5cbiAqIGBydW5fZmFpbGVkYCAvIGBzdGVwX2ZhaWxlZGApLiBUaGUgc2hhcGUgaXMgaW50ZW50aW9uYWxseSBsb29zZTpcbiAqXG4gKiAtIGBlcnJvckNvZGVgIGlzIHR5cGVkIGFzIGBzdHJpbmdgIHJhdGhlciB0aGFuIGBSdW5FcnJvckNvZGVgIGJlY2F1c2VcbiAqICAgdGhlIHZhbHVlIGNvbWVzIGZyb20gc3RvcmVkIEpTT04vQ0JPUiBhbmQgbWF5IHByZWRhdGUgdGhlIGN1cnJlbnRcbiAqICAgZW51bSDigJQgY2FsbGVycyBzaG91bGQgbm90IG5hcnJvdyBvbiBpdCBibGluZGx5LiBWYWx1ZXMgdGhhdCBkb24ndFxuICogICBtYXRjaCBhIGtub3duIGBSVU5fRVJST1JfQ09ERVNgIGVudHJ5IGZhbGwgdGhyb3VnaCB0byBVU0VSX0VSUk9SLlxuICogLSBgZXJyb3JOYW1lYCBpcyB0aGUgdGhyb3duIGBFcnJvciNuYW1lYC4gSXQgaXMgbm90IHVuaXZlcnNhbGx5XG4gKiAgIHBlcnNpc3RlZCB0b2RheTsgY2FsbGVycyB0aGF0IGhhdmUgYWNjZXNzIHRvIGl0IChlaXRoZXIgdmlhIGFuXG4gKiAgIGluLW1lbW9yeSB0aHJvdyBvciBhIHJpY2hlciBwYXlsb2FkKSBjYW4gcGFzcyBpdCBpbiB0byBzaGFycGVuXG4gKiAgIHRoZSBhdHRyaWJ1dGlvbiBhbmQgaGludC4gV2hlbiBhYnNlbnQsIGBkZXNjcmliZVJ1bkVycm9yYCBzdGlsbFxuICogICByZXR1cm5zIGEgc2Vuc2libGUgYXR0cmlidXRpb24gZnJvbSBgZXJyb3JDb2RlYCBhbG9uZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZWRFcnJvclNpZ25hbCB7XG4gIGVycm9yQ29kZT86IHN0cmluZztcbiAgZXJyb3JOYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBDT05URVhUX0VSUk9SX05BTUVTID0gbmV3IFNldChbXG4gICdOb3RJbldvcmtmbG93Q29udGV4dEVycm9yJyxcbiAgJ05vdEluU3RlcENvbnRleHRFcnJvcicsXG4gICdOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yJyxcbiAgJ1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcicsXG5dKTtcblxuZnVuY3Rpb24gaXNDb250ZXh0VmlvbGF0aW9uRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyIGluc3RhbmNlb2YgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvciB8fFxuICAgIGVyciBpbnN0YW5jZW9mIE5vdEluU3RlcENvbnRleHRFcnJvciB8fFxuICAgIGVyciBpbnN0YW5jZW9mIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IgfHxcbiAgICBlcnIgaW5zdGFuY2VvZiBVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3JcbiAgKTtcbn1cblxuY29uc3QgU0VSSUFMSVpBVElPTl9FUlJPUl9ISU5UID1cbiAgJ0EgdmFsdWUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93L3N0ZXAgYm91bmRhcnkgY291bGQgbm90IGJlIHNlcmlhbGl6ZWQuIFNlZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIG9mZmVuZGluZyBwYXRoIGFuZCB0aGUgTGVhcm4gTW9yZSBsaW5rIGZvciBkZXRhaWxzLic7XG5jb25zdCBDT05URVhUX0VSUk9SX0hJTlQgPVxuICAnQSB3b3JrZmxvdy1vbmx5IG9yIHN0ZXAtb25seSBBUEkgd2FzIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyBjb250ZXh0LiBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhhY3QgQVBJIGFuZCBob3cgdG8gbW92ZSB0aGUgY2FsbC4nO1xuY29uc3QgUlVOVElNRV9FUlJPUl9ISU5UID1cbiAgJ1RoaXMgaXMgYW4gaW50ZXJuYWwgd29ya2Zsb3cgU0RLIGVycm9yLCBub3QgYSBidWcgaW4geW91ciBjb2RlLiBJZiBpdCBrZWVwcyBoYXBwZW5pbmcsIHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgc3RhY2sgdHJhY2UgYW5kIHRoZSBydW5JZC4nO1xuY29uc3QgQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5UID1cbiAgJ1RoZSB3b3JrZmxvdyBldmVudCBsb2cgY29udGFpbnMgb3JwaGFuZWQgb3IgbWlzbWF0Y2hlZCBldmVudHMgYW5kIGNhbm5vdCBiZSByZXBsYXllZC4gVGhpcyBpcyBhbiBpbnRlcm5hbCB3b3JrZmxvdyBTREsgZXJyb3I7IHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgcnVuSWQuJztcbmNvbnN0IFJFUExBWV9USU1FT1VUX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHJlcGxheSBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcyB0b29rIHRvbyBsb25nLiBUaGlzIGJvdW5kcyB3b3JrZmxvdy1WTSBhbmQgZXZlbnQtbG9nIHJlcGxheSB0aW1lIG9ubHkg4oCUIHN0ZXAgYm9kaWVzIChgXCJ1c2Ugc3RlcFwiYCBmdW5jdGlvbnMpIGFyZSBleGNsdWRlZC4gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBldmVudCBsb2cgaXMgdW51c3VhbGx5IGxhcmdlIG9yIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBkb2luZyBoZWF2eSBzeW5jaHJvbm91cyB3b3JrIGluIHdvcmtmbG93IGNvZGUgb3V0c2lkZSBvZiBzdGVwIGJvZGllcy4gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVkZ2V0IHZpYSB0aGUgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgZW52IHZhciBpZiBuZWVkZWQuJztcbmNvbnN0IE1BWF9ERUxJVkVSSUVTX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHF1ZXVlIGV4Y2VlZGVkIGl0cyBtYXgtZGVsaXZlcnkgYnVkZ2V0LiBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgcGVyc2lzdGVudCBydW50aW1lIGZhaWx1cmUg4oCUIGNoZWNrIHRoZSBtb3N0IHJlY2VudCBzdGFjayB0cmFjZXMgZm9yIHRoZSB1bmRlcmx5aW5nIGNhdXNlLic7XG5jb25zdCBXT1JMRF9DT05UUkFDVF9ISU5UID1cbiAgJ1RoZSB3b3JrZmxvdyBiYWNrZW5kIHJldHVybmVkIGRhdGEgdGhhdCB2aW9sYXRlZCB0aGUgU0RLIGNvbnRyYWN0LiBUaGlzIGlzIG5vdCByZXRyeWFibGU7IHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgc3RhY2sgdHJhY2UgYW5kIHJ1bklkLic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQ29kZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSdW5FcnJvckNvZGUge1xuICAvLyBWYWx1ZXMgcmVhZCBiYWNrIGZyb20gcGVyc2lzdGVkIGV2ZW50cyBhcmUgYHN0cmluZyB8IHVuZGVmaW5lZGAg4oCUIHdlXG4gIC8vIG9ubHkgdHJ1c3QgY29kZXMgdGhhdCBtYXRjaCBhIGtub3duIGVudHJ5IGluIGBSVU5fRVJST1JfQ09ERVNgLlxuICBjb25zdCBrbm93biA9IE9iamVjdC52YWx1ZXMoUlVOX0VSUk9SX0NPREVTKSBhcyByZWFkb25seSBzdHJpbmdbXTtcbiAgaWYgKGNvZGUgJiYga25vd24uaW5jbHVkZXMoY29kZSkpIHtcbiAgICByZXR1cm4gY29kZSBhcyBSdW5FcnJvckNvZGU7XG4gIH1cbiAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5VU0VSX0VSUk9SO1xufVxuXG4vKipcbiAqIERhdGEtZHJpdmVuIHZhcmlhbnQgb2Yge0BsaW5rIGRlc2NyaWJlRXJyb3J9IHRoYXQgd29ya3MgZnJvbSBwZXJzaXN0ZWRcbiAqIGV2ZW50IGZpZWxkcyBpbnN0ZWFkIG9mIGEgbGl2ZSBgRXJyb3JgIGluc3RhbmNlLiBJbnRlbmRlZCBmb3IgQ0xJL3dlYlxuICogcmVuZGVyZXJzIHRoYXQgcmVhZCBmYWlsdXJlIGV2ZW50cyBhbmQgbm8gbG9uZ2VyIGhhdmUgdGhlIG9yaWdpbmFsXG4gKiB0aHJvd24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVSdW5FcnJvcihcbiAgc2lnbmFsOiBQZXJzaXN0ZWRFcnJvclNpZ25hbFxuKTogRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbnN0IG5hbWUgPSBzaWduYWwuZXJyb3JOYW1lO1xuICBjb25zdCBlcnJvckNvZGUgPVxuICAgIG5hbWUgPT09ICdDb3JydXB0ZWRFdmVudExvZ0Vycm9yJ1xuICAgICAgPyBSVU5fRVJST1JfQ09ERVMuQ09SUlVQVEVEX0VWRU5UX0xPR1xuICAgICAgOiBub3JtYWxpemVFcnJvckNvZGUoc2lnbmFsLmVycm9yQ29kZSk7XG5cbiAgaWYgKG5hbWUgPT09ICdTZXJpYWxpemF0aW9uRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlLCBoaW50OiBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQgfTtcbiAgfVxuICBpZiAobmFtZSAmJiBDT05URVhUX0VSUk9SX05BTUVTLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSwgaGludDogQ09OVEVYVF9FUlJPUl9ISU5UIH07XG4gIH1cbiAgaWYgKG5hbWUgPT09ICdDb3JydXB0ZWRFdmVudExvZ0Vycm9yJykge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGUsXG4gICAgICBoaW50OiBDT1JSVVBURURfRVZFTlRfTE9HX0hJTlQsXG4gICAgfTtcbiAgfVxuICBpZiAoZXJyb3JDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX1RJTUVPVVQpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogUkVQTEFZX1RJTUVPVVRfSElOVCB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBNQVhfREVMSVZFUklFU19ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZSxcbiAgICAgIGhpbnQ6IFdPUkxEX0NPTlRSQUNUX0hJTlQsXG4gICAgfTtcbiAgfVxuICBpZiAobmFtZSA9PT0gJ1dvcmtmbG93UnVudGltZUVycm9yJyB8fCBuYW1lID09PSAnU3RlcE5vdFJlZ2lzdGVyZWRFcnJvcicpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogUlVOVElNRV9FUlJPUl9ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1IpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogUlVOVElNRV9FUlJPUl9ISU5UIH07XG4gIH1cbiAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlIH07XG59XG5cbi8qKlxuICogRGVzY3JpYmUgYW4gZXJyb3IgZm9yIHVzZXItZmFjaW5nIHByZXNlbnRhdGlvbi4gUHVyZWx5IGluZm9ybWF0aW9uYWwg4oCUXG4gKiBkb2VzIG5vdCBjaGFuZ2UgYW55IHBlcnNpc3RlZCBldmVudCBkYXRhIG9yIGVycm9yIGNsYXNzaWZpY2F0aW9uIHVzZWQgYnlcbiAqIHRoZSBydW50aW1lLlxuICpcbiAqIFRoZSBhdHRyaWJ1dGlvbiBoZXJlIGlzIG1vcmUgbnVhbmNlZCB0aGFuIGBjbGFzc2lmeVJ1bkVycm9yYDpcbiAqXG4gKiAtIGBTZXJpYWxpemF0aW9uRXJyb3JgIGlzIHRlY2huaWNhbGx5IHJhaXNlZCBieSB0aGUgU0RLLCBidXQgaXQgYWxtb3N0XG4gKiAgIGFsd2F5cyBwb2ludHMgYXQgc29tZXRoaW5nIHRoZSBjYWxsZXIgZGlkIChwYXNzZWQgYSBub24tc2VyaWFsaXphYmxlXG4gKiAgIHZhbHVlLCBkaWRuJ3QgcmVnaXN0ZXIgYSBjbGFzcykuIFdlIGF0dHJpYnV0ZSBpdCB0byB0aGUgdXNlci5cbiAqIC0gQ29udGV4dC12aW9sYXRpb24gZXJyb3JzIChgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcmAsIGV0Yy4pIGxpa2V3aXNlXG4gKiAgIGRlc2NyaWJlIGEgdXNlciBtaXN0YWtlLlxuICogLSBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIChhbmQgc3ViY2xhc3NlcyBsaWtlIGBTdGVwTm90UmVnaXN0ZXJlZEVycm9yYClcbiAqICAgaW5kaWNhdGVzIGFuIGludGVybmFsIFNESyBpbnZhcmlhbnQgYnJva2Ug4oCUIHN1cmZhY2UgdGhhdCBhcyBgc2RrYC5cbiAqXG4gKiBAcGFyYW0gZXJyIFRoZSBlcnJvciB2YWx1ZSB0aHJvd24gYnkgdGhlIHdvcmtmbG93IC8gc3RlcC5cbiAqIEBwYXJhbSBlcnJvckNvZGUgT3B0aW9uYWwgcHJlY29tcHV0ZWQgZXJyb3IgY29kZS4gQ2FsbGVycyB0aGF0IGFscmVhZHlcbiAqICAga25vdyB0aGUgY29kZSAoZS5nLiBgUkVQTEFZX1RJTUVPVVRgIG9yIGBNQVhfREVMSVZFUklFU19FWENFRURFRGAsIHdoaWNoXG4gKiAgIGBjbGFzc2lmeVJ1bkVycm9yYCBjYW4ndCBkZXJpdmUgZnJvbSB0aGUgZXJyb3IgYWxvbmUpIHNob3VsZCBwYXNzIGl0IHNvXG4gKiAgIHRoZSBhdHRyaWJ1dGlvbiBhbmQgaGludCByZWZsZWN0IHRoZSBhY3R1YWwgZmFpbHVyZSBjYXRlZ29yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoXG4gIGVycjogdW5rbm93bixcbiAgZXJyb3JDb2RlPzogUnVuRXJyb3JDb2RlXG4pOiBFcnJvckRlc2NyaXB0aW9uIHtcbiAgY29uc3QgZWZmZWN0aXZlQ29kZSA9IGVycm9yQ29kZSA/PyBjbGFzc2lmeVJ1bkVycm9yKGVycik7XG5cbiAgaWYgKFNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAndXNlcicsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpc0NvbnRleHRWaW9sYXRpb25FcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAndXNlcicsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBDT05URVhUX0VSUk9SX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZXJyIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogUlVOVElNRV9FUlJPUl9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFJFUExBWV9USU1FT1VUX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChlZmZlY3RpdmVDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogTUFYX0RFTElWRVJJRVNfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5DT1JSVVBURURfRVZFTlRfTE9HKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IENPUlJVUFRFRF9FVkVOVF9MT0dfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBXT1JMRF9DT05UUkFDVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUgfTtcbn1cbiJdfQ==
|
package/dist/encryption.d.ts
CHANGED
|
@@ -22,10 +22,16 @@ export type CryptoKey = import('node:crypto').webcrypto.CryptoKey;
|
|
|
22
22
|
* Callers should call this once per run (after `getEncryptionKeyForRun()`)
|
|
23
23
|
* and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
|
|
24
24
|
*
|
|
25
|
+
* Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
|
|
26
|
+
* where the caller should not be able to perform the inverse operation
|
|
27
|
+
* with the key — for example a child workflow writing into a parent
|
|
28
|
+
* run's forwarded WritableStream only needs to encrypt, never decrypt.
|
|
29
|
+
*
|
|
25
30
|
* @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
|
|
31
|
+
* @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
|
|
26
32
|
* @returns CryptoKey ready for AES-GCM operations
|
|
27
33
|
*/
|
|
28
|
-
export declare function importKey(raw: Uint8Array): Promise<import("crypto").webcrypto.CryptoKey>;
|
|
34
|
+
export declare function importKey(raw: Uint8Array, usages?: ReadonlyArray<'encrypt' | 'decrypt'>): Promise<import("crypto").webcrypto.CryptoKey>;
|
|
29
35
|
/**
|
|
30
36
|
* Encrypt data using AES-256-GCM.
|
|
31
37
|
*
|
|
@@ -37,6 +43,21 @@ export declare function encrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8
|
|
|
37
43
|
/**
|
|
38
44
|
* Decrypt data using AES-256-GCM.
|
|
39
45
|
*
|
|
46
|
+
* Any failure inside the Web Crypto layer — most commonly an
|
|
47
|
+
* `OperationError: The operation failed for an operation-specific reason`
|
|
48
|
+
* raised by `AESCipherJob.onDone` when the GCM authentication tag does
|
|
49
|
+
* not verify — is rewrapped as {@link RuntimeDecryptionError}. The
|
|
50
|
+
* wrapped error carries the original DOMException as `cause`, plus a
|
|
51
|
+
* small diagnostic context (`operation`, input `byteLength`) to help
|
|
52
|
+
* disambiguate ciphertext corruption from key mismatch from truncated
|
|
53
|
+
* transport reads.
|
|
54
|
+
*
|
|
55
|
+
* Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
|
|
56
|
+
* format-prefixed envelope — callers strip the `encr` marker via
|
|
57
|
+
* `decodeFormatPrefix()` before reaching this function. The outer
|
|
58
|
+
* envelope's format prefix is therefore attached by the serialization
|
|
59
|
+
* layer (`serialization/encryption.ts`), which is the layer that has it.
|
|
60
|
+
*
|
|
40
61
|
* @param key - CryptoKey from `importKey()`
|
|
41
62
|
* @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
|
|
42
63
|
* @returns Decrypted plaintext
|
package/dist/encryption.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"
|
|
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"}
|