@workflow/core 5.0.0-beta.50 → 5.0.0-beta.52

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 (50) hide show
  1. package/README.md +5 -0
  2. package/dist/events-consumer.d.ts +26 -0
  3. package/dist/events-consumer.d.ts.map +1 -1
  4. package/dist/events-consumer.js +28 -1
  5. package/dist/flushable-stream.d.ts +41 -0
  6. package/dist/flushable-stream.d.ts.map +1 -1
  7. package/dist/flushable-stream.js +169 -1
  8. package/dist/log-format.d.ts +3 -0
  9. package/dist/log-format.d.ts.map +1 -1
  10. package/dist/log-format.js +45 -10
  11. package/dist/replay-divergence.d.ts +25 -0
  12. package/dist/replay-divergence.d.ts.map +1 -0
  13. package/dist/replay-divergence.js +61 -0
  14. package/dist/runtime/helpers.d.ts +75 -1
  15. package/dist/runtime/helpers.d.ts.map +1 -1
  16. package/dist/runtime/helpers.js +134 -5
  17. package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
  18. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-entrypoint.js +209 -32
  20. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  21. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-log-view.js +229 -0
  23. package/dist/runtime/step-executor.d.ts +2 -21
  24. package/dist/runtime/step-executor.d.ts.map +1 -1
  25. package/dist/runtime/step-executor.js +85 -80
  26. package/dist/runtime/suspension-handler.d.ts +0 -22
  27. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  28. package/dist/runtime/suspension-handler.js +126 -75
  29. package/dist/runtime.d.ts.map +1 -1
  30. package/dist/runtime.js +262 -91
  31. package/dist/serialization.d.ts +2 -2
  32. package/dist/serialization.d.ts.map +1 -1
  33. package/dist/serialization.js +16 -13
  34. package/dist/step/context-storage.d.ts +2 -0
  35. package/dist/step/context-storage.d.ts.map +1 -1
  36. package/dist/step/context-storage.js +1 -1
  37. package/dist/step/writable-stream.d.ts.map +1 -1
  38. package/dist/step/writable-stream.js +14 -10
  39. package/dist/telemetry/semantic-conventions.d.ts +36 -0
  40. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  41. package/dist/telemetry/semantic-conventions.js +23 -1
  42. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  43. package/dist/test-support/orchestrator-context.js +8 -2
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +2 -2
  46. package/dist/workflow.d.ts.map +1 -1
  47. package/dist/workflow.js +8 -3
  48. package/docs/foundations/streaming.mdx +1 -1
  49. package/docs/how-it-works/event-sourcing.mdx +27 -0
  50. package/package.json +6 -6
@@ -0,0 +1,129 @@
1
+ import { type Event } from '@workflow/world';
2
+ /**
3
+ * The QuickJS engine's bookkeeping for the run's event log, giving that engine
4
+ * the same relationship to a World's write responses that the node:vm replay
5
+ * loop has.
6
+ *
7
+ * The node engine holds the log as an array it replays from, so a page a World
8
+ * hands back on a write (a skipped-slot report against `eventCount`, or an
9
+ * inline delta against `sinceCursor`; see `CreateEventParams` in
10
+ * `@workflow/world`) is merged into that array and the next replay reads it
11
+ * there. The QuickJS engine holds a LIVE VM instead: events are delivered to it
12
+ * incrementally through `continueWithEvents`, in log order, exactly once. So
13
+ * for this engine a returned page is not merged into a log; it is queued to be
14
+ * delivered. This class owns that queue and the three numbers around it:
15
+ *
16
+ * - `knownMaxSlot`, the highest position this invocation has seen anywhere
17
+ * (fed, buffered, or its own write). Reported as `eventCount` on every write
18
+ * this invocation makes from its view of the log, so the World can hand
19
+ * back what landed above it.
20
+ * - `fedMaxSlot`, the highest position delivered to the VM. Delivery is
21
+ * strictly in position order with no gaps, because the VM consumes events
22
+ * as they arrive and a later replay will read the log in position order;
23
+ * feeding position 13 before 12 exists would let the two disagree.
24
+ * - `cursor`, the read position for `events.list`, advanced by list pages and
25
+ * by a complete inline delta.
26
+ *
27
+ * Only PAGES are queued for delivery, never the created event a write returns
28
+ * on its own. A World reads a report or a delta the way it reads a listing,
29
+ * with payload refs resolved, so those events are what a listing would have
30
+ * delivered. The created event on a create response is not: a World may hand
31
+ * it back with its payload still a ref descriptor and telemetry fields
32
+ * stripped (the Vercel World does, for every type whose entity the runtime
33
+ * does not read off the response), and a VM given that copy of a `step_failed`
34
+ * sees a step that failed with no error in it. The created event still counts
35
+ * toward the position the next write names; it is delivered by the page that
36
+ * covers it or by the next listing. `deliverEvent` opts a write in when its
37
+ * event carries nothing a VM reads (`wait_completed`).
38
+ *
39
+ * Positions come from slot-numbered event ids. A log whose ids are not slots
40
+ * (a World on the old id scheme, or a mocked World) turns tracking off for the
41
+ * rest of the invocation: no `eventCount` is sent, nothing is buffered, and the
42
+ * engine reads the log back the way it did before any of this existed.
43
+ */
44
+ export declare class QuickJSLogView {
45
+ private slotTracking;
46
+ private knownMaxSlot;
47
+ private fedMaxSlot;
48
+ /** Events handed back by a World that the VM has not been given yet. */
49
+ private readonly unfed;
50
+ private cursor;
51
+ constructor(fedEvents: readonly Event[], cursor: string | null);
52
+ /** Read position for the next `events.list`, or `null` for the start. */
53
+ get logCursor(): string | null;
54
+ /** How many events are queued for delivery to the VM. */
55
+ get bufferedCount(): number;
56
+ /** Whether positions are being tracked (see class doc). */
57
+ get tracking(): boolean;
58
+ /**
59
+ * The `eventCount` to attach to a write made from this view. Empty while no
60
+ * position is known (an empty log) or once tracking has been turned off.
61
+ */
62
+ snapshotParams(): {
63
+ eventCount?: number;
64
+ };
65
+ /** A page of `events.list` was read to `cursor`. */
66
+ advanceCursor(cursor: string | null): void;
67
+ /**
68
+ * Events delivered to the VM by the caller (the initial load, or an
69
+ * `events.list` page). Removes them from the delivery queue if a write
70
+ * response had already handed them back.
71
+ */
72
+ markFed(events: readonly Event[]): void;
73
+ /**
74
+ * Absorb a write's response: note the committed event's position, and
75
+ * queue the skipped-slot report a World attached to it.
76
+ *
77
+ * A truncated page (`hasMore`) is dropped whole, the same policy as
78
+ * `absorbSkippedSlotReport` in the node engine: it covers a span of
79
+ * positions but carries only some of them, and queuing part of a span
80
+ * would have this view claim, on its next write, to have seen positions it
81
+ * never received. The committed event is queued only under `deliverEvent`
82
+ * (see the class doc for why not by default); its position always counts.
83
+ */
84
+ absorb(result: {
85
+ event?: Event;
86
+ events?: readonly Event[];
87
+ hasMore?: boolean;
88
+ }, options?: {
89
+ deliverEvent?: boolean;
90
+ }): {
91
+ queued: number;
92
+ truncated: boolean;
93
+ };
94
+ /**
95
+ * Absorb the inline delta a step-terminal write returned for
96
+ * `sinceCursor`, and advance the read cursor past it when that is safe.
97
+ *
98
+ * The delta is everything after `sentCursor`, so it may be taken only if
99
+ * the view still stands at that cursor (a list in between would have moved
100
+ * it, and appending a delta computed from an older position could deliver
101
+ * events behind ones already fed). The cursor advances only when the queue
102
+ * then holds every position between what the VM has and the delta's end:
103
+ * with a hole in between, a later `events.list` from the advanced cursor
104
+ * would never return the missing event and the VM would stall on it.
105
+ *
106
+ * @returns whether the cursor was advanced.
107
+ */
108
+ absorbDelta(sentCursor: string, delta: {
109
+ events: readonly Event[];
110
+ cursor: string | null;
111
+ hasMore: boolean;
112
+ }): boolean;
113
+ /**
114
+ * Drain the events that can be delivered to the VM now: the queued run of
115
+ * consecutive positions directly above the highest one already fed. A queued
116
+ * event above a position nothing has filled yet stays queued until a list
117
+ * fills the gap.
118
+ */
119
+ takeContiguous(): Event[];
120
+ private queueIsDense;
121
+ /** Queue one event for delivery unless the VM already has it. */
122
+ private queue;
123
+ /**
124
+ * The event's position, bumping `knownMaxSlot`. `undefined` once an id
125
+ * turns out not to be a slot, which turns tracking off for good.
126
+ */
127
+ private slotOf;
128
+ }
129
+ //# sourceMappingURL=quickjs-log-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickjs-log-view.d.ts","sourceRoot":"","sources":["../../src/runtime/quickjs-log-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAmC,MAAM,iBAAiB,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAqB;IACvC,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAClD,OAAO,CAAC,MAAM,CAAgB;gBAElB,SAAS,EAAE,SAAS,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9D,yEAAyE;IACzE,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,yDAAyD;IACzD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,2DAA2D;IAC3D,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,cAAc,IAAI;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAMzC,oDAAoD;IACpD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAM1C;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,IAAI;IAWvC;;;;;;;;;;OAUG;IACH,MAAM,CACJ,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,EACD,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;IAsBzC;;;;;;;;;;;;;OAaG;IACH,WAAW,CACT,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;QAAE,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAC3E,OAAO;IAiBV;;;;;OAKG;IACH,cAAc,IAAI,KAAK,EAAE;IAqBzB,OAAO,CAAC,YAAY;IAQpB,iEAAiE;IACjE,OAAO,CAAC,KAAK;IAWb;;;OAGG;IACH,OAAO,CAAC,MAAM;CAef"}
@@ -0,0 +1,229 @@
1
+ import { eventIdToSlot, FIRST_EVENT_SLOT } from '@workflow/world';
2
+ /**
3
+ * The QuickJS engine's bookkeeping for the run's event log, giving that engine
4
+ * the same relationship to a World's write responses that the node:vm replay
5
+ * loop has.
6
+ *
7
+ * The node engine holds the log as an array it replays from, so a page a World
8
+ * hands back on a write (a skipped-slot report against `eventCount`, or an
9
+ * inline delta against `sinceCursor`; see `CreateEventParams` in
10
+ * `@workflow/world`) is merged into that array and the next replay reads it
11
+ * there. The QuickJS engine holds a LIVE VM instead: events are delivered to it
12
+ * incrementally through `continueWithEvents`, in log order, exactly once. So
13
+ * for this engine a returned page is not merged into a log; it is queued to be
14
+ * delivered. This class owns that queue and the three numbers around it:
15
+ *
16
+ * - `knownMaxSlot`, the highest position this invocation has seen anywhere
17
+ * (fed, buffered, or its own write). Reported as `eventCount` on every write
18
+ * this invocation makes from its view of the log, so the World can hand
19
+ * back what landed above it.
20
+ * - `fedMaxSlot`, the highest position delivered to the VM. Delivery is
21
+ * strictly in position order with no gaps, because the VM consumes events
22
+ * as they arrive and a later replay will read the log in position order;
23
+ * feeding position 13 before 12 exists would let the two disagree.
24
+ * - `cursor`, the read position for `events.list`, advanced by list pages and
25
+ * by a complete inline delta.
26
+ *
27
+ * Only PAGES are queued for delivery, never the created event a write returns
28
+ * on its own. A World reads a report or a delta the way it reads a listing,
29
+ * with payload refs resolved, so those events are what a listing would have
30
+ * delivered. The created event on a create response is not: a World may hand
31
+ * it back with its payload still a ref descriptor and telemetry fields
32
+ * stripped (the Vercel World does, for every type whose entity the runtime
33
+ * does not read off the response), and a VM given that copy of a `step_failed`
34
+ * sees a step that failed with no error in it. The created event still counts
35
+ * toward the position the next write names; it is delivered by the page that
36
+ * covers it or by the next listing. `deliverEvent` opts a write in when its
37
+ * event carries nothing a VM reads (`wait_completed`).
38
+ *
39
+ * Positions come from slot-numbered event ids. A log whose ids are not slots
40
+ * (a World on the old id scheme, or a mocked World) turns tracking off for the
41
+ * rest of the invocation: no `eventCount` is sent, nothing is buffered, and the
42
+ * engine reads the log back the way it did before any of this existed.
43
+ */
44
+ export class QuickJSLogView {
45
+ slotTracking = true;
46
+ knownMaxSlot;
47
+ fedMaxSlot;
48
+ /** Events handed back by a World that the VM has not been given yet. */
49
+ unfed = new Map();
50
+ cursor;
51
+ constructor(fedEvents, cursor) {
52
+ this.cursor = cursor;
53
+ this.markFed(fedEvents);
54
+ }
55
+ /** Read position for the next `events.list`, or `null` for the start. */
56
+ get logCursor() {
57
+ return this.cursor;
58
+ }
59
+ /** How many events are queued for delivery to the VM. */
60
+ get bufferedCount() {
61
+ return this.unfed.size;
62
+ }
63
+ /** Whether positions are being tracked (see class doc). */
64
+ get tracking() {
65
+ return this.slotTracking;
66
+ }
67
+ /**
68
+ * The `eventCount` to attach to a write made from this view. Empty while no
69
+ * position is known (an empty log) or once tracking has been turned off.
70
+ */
71
+ snapshotParams() {
72
+ return this.slotTracking && this.knownMaxSlot !== undefined
73
+ ? { eventCount: this.knownMaxSlot }
74
+ : {};
75
+ }
76
+ /** A page of `events.list` was read to `cursor`. */
77
+ advanceCursor(cursor) {
78
+ if (cursor !== null) {
79
+ this.cursor = cursor;
80
+ }
81
+ }
82
+ /**
83
+ * Events delivered to the VM by the caller (the initial load, or an
84
+ * `events.list` page). Removes them from the delivery queue if a write
85
+ * response had already handed them back.
86
+ */
87
+ markFed(events) {
88
+ for (const event of events) {
89
+ const slot = this.slotOf(event);
90
+ if (slot === undefined)
91
+ continue;
92
+ this.unfed.delete(slot);
93
+ if (this.fedMaxSlot === undefined || slot > this.fedMaxSlot) {
94
+ this.fedMaxSlot = slot;
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Absorb a write's response: note the committed event's position, and
100
+ * queue the skipped-slot report a World attached to it.
101
+ *
102
+ * A truncated page (`hasMore`) is dropped whole, the same policy as
103
+ * `absorbSkippedSlotReport` in the node engine: it covers a span of
104
+ * positions but carries only some of them, and queuing part of a span
105
+ * would have this view claim, on its next write, to have seen positions it
106
+ * never received. The committed event is queued only under `deliverEvent`
107
+ * (see the class doc for why not by default); its position always counts.
108
+ */
109
+ absorb(result, options = {}) {
110
+ let queued = 0;
111
+ if (result.event) {
112
+ if (options.deliverEvent === true) {
113
+ if (this.queue(result.event))
114
+ queued++;
115
+ }
116
+ else {
117
+ this.slotOf(result.event);
118
+ }
119
+ }
120
+ const page = result.events ?? [];
121
+ if (page.length === 0) {
122
+ return { queued, truncated: false };
123
+ }
124
+ if (result.hasMore === true) {
125
+ return { queued, truncated: true };
126
+ }
127
+ for (const event of page) {
128
+ if (this.queue(event))
129
+ queued++;
130
+ }
131
+ return { queued, truncated: false };
132
+ }
133
+ /**
134
+ * Absorb the inline delta a step-terminal write returned for
135
+ * `sinceCursor`, and advance the read cursor past it when that is safe.
136
+ *
137
+ * The delta is everything after `sentCursor`, so it may be taken only if
138
+ * the view still stands at that cursor (a list in between would have moved
139
+ * it, and appending a delta computed from an older position could deliver
140
+ * events behind ones already fed). The cursor advances only when the queue
141
+ * then holds every position between what the VM has and the delta's end:
142
+ * with a hole in between, a later `events.list` from the advanced cursor
143
+ * would never return the missing event and the VM would stall on it.
144
+ *
145
+ * @returns whether the cursor was advanced.
146
+ */
147
+ absorbDelta(sentCursor, delta) {
148
+ if (!this.slotTracking || this.cursor !== sentCursor) {
149
+ return false;
150
+ }
151
+ if (delta.hasMore) {
152
+ return false;
153
+ }
154
+ for (const event of delta.events) {
155
+ this.queue(event);
156
+ }
157
+ if (!this.queueIsDense()) {
158
+ return false;
159
+ }
160
+ this.advanceCursor(delta.cursor);
161
+ return true;
162
+ }
163
+ /**
164
+ * Drain the events that can be delivered to the VM now: the queued run of
165
+ * consecutive positions directly above the highest one already fed. A queued
166
+ * event above a position nothing has filled yet stays queued until a list
167
+ * fills the gap.
168
+ */
169
+ takeContiguous() {
170
+ if (!this.slotTracking) {
171
+ return [];
172
+ }
173
+ const out = [];
174
+ // A VM started on an empty log is waiting for the first position.
175
+ let next = this.fedMaxSlot === undefined ? FIRST_EVENT_SLOT : this.fedMaxSlot + 1;
176
+ for (;;) {
177
+ const event = this.unfed.get(next);
178
+ if (event === undefined)
179
+ break;
180
+ this.unfed.delete(next);
181
+ out.push(event);
182
+ next++;
183
+ }
184
+ if (out.length > 0) {
185
+ this.fedMaxSlot = next - 1;
186
+ }
187
+ return out;
188
+ }
189
+ queueIsDense() {
190
+ if (this.knownMaxSlot === undefined) {
191
+ return this.unfed.size === 0;
192
+ }
193
+ const fed = this.fedMaxSlot ?? FIRST_EVENT_SLOT - 1;
194
+ return this.unfed.size === this.knownMaxSlot - fed;
195
+ }
196
+ /** Queue one event for delivery unless the VM already has it. */
197
+ queue(event) {
198
+ const slot = this.slotOf(event);
199
+ if (slot === undefined)
200
+ return false;
201
+ if (this.fedMaxSlot !== undefined && slot <= this.fedMaxSlot) {
202
+ return false;
203
+ }
204
+ if (this.unfed.has(slot))
205
+ return false;
206
+ this.unfed.set(slot, event);
207
+ return true;
208
+ }
209
+ /**
210
+ * The event's position, bumping `knownMaxSlot`. `undefined` once an id
211
+ * turns out not to be a slot, which turns tracking off for good.
212
+ */
213
+ slotOf(event) {
214
+ if (!this.slotTracking)
215
+ return undefined;
216
+ const slot = typeof event.eventId === 'string' ? eventIdToSlot(event.eventId) : null;
217
+ if (slot === null) {
218
+ this.slotTracking = false;
219
+ this.knownMaxSlot = undefined;
220
+ this.unfed.clear();
221
+ return undefined;
222
+ }
223
+ if (this.knownMaxSlot === undefined || slot > this.knownMaxSlot) {
224
+ this.knownMaxSlot = slot;
225
+ }
226
+ return slot;
227
+ }
228
+ }
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1sb2ctdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3F1aWNranMtbG9nLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDcEIsWUFBWSxDQUFxQjtJQUNqQyxVQUFVLENBQXFCO0lBQ3ZDLHdFQUF3RTtJQUN2RCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFDMUMsTUFBTSxDQUFnQjtJQUU5QixZQUFZLFNBQTJCLEVBQUUsTUFBcUI7UUFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQseURBQXlEO0lBQ3pELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BE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IGV2ZW50SWRUb1Nsb3QsIEZJUlNUX0VWRU5UX1NMT1QgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIFRoZSBRdWlja0pTIGVuZ2luZSdzIGJvb2trZWVwaW5nIGZvciB0aGUgcnVuJ3MgZXZlbnQgbG9nLCBnaXZpbmcgdGhhdCBlbmdpbmVcbiAqIHRoZSBzYW1lIHJlbGF0aW9uc2hpcCB0byBhIFdvcmxkJ3Mgd3JpdGUgcmVzcG9uc2VzIHRoYXQgdGhlIG5vZGU6dm0gcmVwbGF5XG4gKiBsb29wIGhhcy5cbiAqXG4gKiBUaGUgbm9kZSBlbmdpbmUgaG9sZHMgdGhlIGxvZyBhcyBhbiBhcnJheSBpdCByZXBsYXlzIGZyb20sIHNvIGEgcGFnZSBhIFdvcmxkXG4gKiBoYW5kcyBiYWNrIG9uIGEgd3JpdGUgKGEgc2tpcHBlZC1zbG90IHJlcG9ydCBhZ2FpbnN0IGBldmVudENvdW50YCwgb3IgYW5cbiAqIGlubGluZSBkZWx0YSBhZ2FpbnN0IGBzaW5jZUN1cnNvcmA7IHNlZSBgQ3JlYXRlRXZlbnRQYXJhbXNgIGluXG4gKiBgQHdvcmtmbG93L3dvcmxkYCkgaXMgbWVyZ2VkIGludG8gdGhhdCBhcnJheSBhbmQgdGhlIG5leHQgcmVwbGF5IHJlYWRzIGl0XG4gKiB0aGVyZS4gVGhlIFF1aWNrSlMgZW5naW5lIGhvbGRzIGEgTElWRSBWTSBpbnN0ZWFkOiBldmVudHMgYXJlIGRlbGl2ZXJlZCB0byBpdFxuICogaW5jcmVtZW50YWxseSB0aHJvdWdoIGBjb250aW51ZVdpdGhFdmVudHNgLCBpbiBsb2cgb3JkZXIsIGV4YWN0bHkgb25jZS4gU29cbiAqIGZvciB0aGlzIGVuZ2luZSBhIHJldHVybmVkIHBhZ2UgaXMgbm90IG1lcmdlZCBpbnRvIGEgbG9nOyBpdCBpcyBxdWV1ZWQgdG8gYmVcbiAqIGRlbGl2ZXJlZC4gVGhpcyBjbGFzcyBvd25zIHRoYXQgcXVldWUgYW5kIHRoZSB0aHJlZSBudW1iZXJzIGFyb3VuZCBpdDpcbiAqXG4gKiAtIGBrbm93bk1heFNsb3RgLCB0aGUgaGlnaGVzdCBwb3NpdGlvbiB0aGlzIGludm9jYXRpb24gaGFzIHNlZW4gYW55d2hlcmVcbiAqICAgKGZlZCwgYnVmZmVyZWQsIG9yIGl0cyBvd24gd3JpdGUpLiBSZXBvcnRlZCBhcyBgZXZlbnRDb3VudGAgb24gZXZlcnkgd3JpdGVcbiAqICAgdGhpcyBpbnZvY2F0aW9uIG1ha2VzIGZyb20gaXRzIHZpZXcgb2YgdGhlIGxvZywgc28gdGhlIFdvcmxkIGNhbiBoYW5kXG4gKiAgIGJhY2sgd2hhdCBsYW5kZWQgYWJvdmUgaXQuXG4gKiAtIGBmZWRNYXhTbG90YCwgdGhlIGhpZ2hlc3QgcG9zaXRpb24gZGVsaXZlcmVkIHRvIHRoZSBWTS4gRGVsaXZlcnkgaXNcbiAqICAgc3RyaWN0bHkgaW4gcG9zaXRpb24gb3JkZXIgd2l0aCBubyBnYXBzLCBiZWNhdXNlIHRoZSBWTSBjb25zdW1lcyBldmVudHNcbiAqICAgYXMgdGhleSBhcnJpdmUgYW5kIGEgbGF0ZXIgcmVwbGF5IHdpbGwgcmVhZCB0aGUgbG9nIGluIHBvc2l0aW9uIG9yZGVyO1xuICogICBmZWVkaW5nIHBvc2l0aW9uIDEzIGJlZm9yZSAxMiBleGlzdHMgd291bGQgbGV0IHRoZSB0d28gZGlzYWdyZWUuXG4gKiAtIGBjdXJzb3JgLCB0aGUgcmVhZCBwb3NpdGlvbiBmb3IgYGV2ZW50cy5saXN0YCwgYWR2YW5jZWQgYnkgbGlzdCBwYWdlcyBhbmRcbiAqICAgYnkgYSBjb21wbGV0ZSBpbmxpbmUgZGVsdGEuXG4gKlxuICogT25seSBQQUdFUyBhcmUgcXVldWVkIGZvciBkZWxpdmVyeSwgbmV2ZXIgdGhlIGNyZWF0ZWQgZXZlbnQgYSB3cml0ZSByZXR1cm5zXG4gKiBvbiBpdHMgb3duLiBBIFdvcmxkIHJlYWRzIGEgcmVwb3J0IG9yIGEgZGVsdGEgdGhlIHdheSBpdCByZWFkcyBhIGxpc3RpbmcsXG4gKiB3aXRoIHBheWxvYWQgcmVmcyByZXNvbHZlZCwgc28gdGhvc2UgZXZlbnRzIGFyZSB3aGF0IGEgbGlzdGluZyB3b3VsZCBoYXZlXG4gKiBkZWxpdmVyZWQuIFRoZSBjcmVhdGVkIGV2ZW50IG9uIGEgY3JlYXRlIHJlc3BvbnNlIGlzIG5vdDogYSBXb3JsZCBtYXkgaGFuZFxuICogaXQgYmFjayB3aXRoIGl0cyBwYXlsb2FkIHN0aWxsIGEgcmVmIGRlc2NyaXB0b3IgYW5kIHRlbGVtZXRyeSBmaWVsZHNcbiAqIHN0cmlwcGVkICh0aGUgVmVyY2VsIFdvcmxkIGRvZXMsIGZvciBldmVyeSB0eXBlIHdob3NlIGVudGl0eSB0aGUgcnVudGltZVxuICogZG9lcyBub3QgcmVhZCBvZmYgdGhlIHJlc3BvbnNlKSwgYW5kIGEgVk0gZ2l2ZW4gdGhhdCBjb3B5IG9mIGEgYHN0ZXBfZmFpbGVkYFxuICogc2VlcyBhIHN0ZXAgdGhhdCBmYWlsZWQgd2l0aCBubyBlcnJvciBpbiBpdC4gVGhlIGNyZWF0ZWQgZXZlbnQgc3RpbGwgY291bnRzXG4gKiB0b3dhcmQgdGhlIHBvc2l0aW9uIHRoZSBuZXh0IHdyaXRlIG5hbWVzOyBpdCBpcyBkZWxpdmVyZWQgYnkgdGhlIHBhZ2UgdGhhdFxuICogY292ZXJzIGl0IG9yIGJ5IHRoZSBuZXh0IGxpc3RpbmcuIGBkZWxpdmVyRXZlbnRgIG9wdHMgYSB3cml0ZSBpbiB3aGVuIGl0c1xuICogZXZlbnQgY2FycmllcyBub3RoaW5nIGEgVk0gcmVhZHMgKGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFBvc2l0aW9ucyBjb21lIGZyb20gc2xvdC1udW1iZXJlZCBldmVudCBpZHMuIEEgbG9nIHdob3NlIGlkcyBhcmUgbm90IHNsb3RzXG4gKiAoYSBXb3JsZCBvbiB0aGUgb2xkIGlkIHNjaGVtZSwgb3IgYSBtb2NrZWQgV29ybGQpIHR1cm5zIHRyYWNraW5nIG9mZiBmb3IgdGhlXG4gKiByZXN0IG9mIHRoZSBpbnZvY2F0aW9uOiBubyBgZXZlbnRDb3VudGAgaXMgc2VudCwgbm90aGluZyBpcyBidWZmZXJlZCwgYW5kIHRoZVxuICogZW5naW5lIHJlYWRzIHRoZSBsb2cgYmFjayB0aGUgd2F5IGl0IGRpZCBiZWZvcmUgYW55IG9mIHRoaXMgZXhpc3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1aWNrSlNMb2dWaWV3IHtcbiAgcHJpdmF0ZSBzbG90VHJhY2tpbmcgPSB0cnVlO1xuICBwcml2YXRlIGtub3duTWF4U2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZlZE1heFNsb3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEV2ZW50cyBoYW5kZWQgYmFjayBieSBhIFdvcmxkIHRoYXQgdGhlIFZNIGhhcyBub3QgYmVlbiBnaXZlbiB5ZXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5mZWQgPSBuZXcgTWFwPG51bWJlciwgRXZlbnQ+KCk7XG4gIHByaXZhdGUgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGZlZEV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSwgY3Vyc29yOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5jdXJzb3IgPSBjdXJzb3I7XG4gICAgdGhpcy5tYXJrRmVkKGZlZEV2ZW50cyk7XG4gIH1cblxuICAvKiogUmVhZCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgYGV2ZW50cy5saXN0YCwgb3IgYG51bGxgIGZvciB0aGUgc3RhcnQuICovXG4gIGdldCBsb2dDdXJzb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yO1xuICB9XG5cbiAgLyoqIEhvdyBtYW55IGV2ZW50cyBhcmUgcXVldWVkIGZvciBkZWxpdmVyeSB0byB0aGUgVk0uICovXG4gIGdldCBidWZmZXJlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudW5mZWQuc2l6ZTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHBvc2l0aW9ucyBhcmUgYmVpbmcgdHJhY2tlZCAoc2VlIGNsYXNzIGRvYykuICovXG4gIGdldCB0cmFja2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zbG90VHJhY2tpbmc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGBldmVudENvdW50YCB0byBhdHRhY2ggdG8gYSB3cml0ZSBtYWRlIGZyb20gdGhpcyB2aWV3LiBFbXB0eSB3aGlsZSBub1xuICAgKiBwb3NpdGlvbiBpcyBrbm93biAoYW4gZW1wdHkgbG9nKSBvciBvbmNlIHRyYWNraW5nIGhhcyBiZWVuIHR1cm5lZCBvZmYuXG4gICAqL1xuICBzbmFwc2hvdFBhcmFtcygpOiB7IGV2ZW50Q291bnQ/OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHRoaXMuc2xvdFRyYWNraW5nICYmIHRoaXMua25vd25NYXhTbG90ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBldmVudENvdW50OiB0aGlzLmtub3duTWF4U2xvdCB9XG4gICAgICA6IHt9O1xuICB9XG5cbiAgLyoqIEEgcGFnZSBvZiBgZXZlbnRzLmxpc3RgIHdhcyByZWFkIHRvIGBjdXJzb3JgLiAqL1xuICBhZHZhbmNlQ3Vyc29yKGN1cnNvcjogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY3Vyc29yID0gY3Vyc29yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudHMgZGVsaXZlcmVkIHRvIHRoZSBWTSBieSB0aGUgY2FsbGVyICh0aGUgaW5pdGlhbCBsb2FkLCBvciBhblxuICAgKiBgZXZlbnRzLmxpc3RgIHBhZ2UpLiBSZW1vdmVzIHRoZW0gZnJvbSB0aGUgZGVsaXZlcnkgcXVldWUgaWYgYSB3cml0ZVxuICAgKiByZXNwb25zZSBoYWQgYWxyZWFkeSBoYW5kZWQgdGhlbSBiYWNrLlxuICAgKi9cbiAgbWFya0ZlZChldmVudHM6IHJlYWRvbmx5IEV2ZW50W10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgY29uc3Qgc2xvdCA9IHRoaXMuc2xvdE9mKGV2ZW50KTtcbiAgICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgdGhpcy51bmZlZC5kZWxldGUoc2xvdCk7XG4gICAgICBpZiAodGhpcy5mZWRNYXhTbG90ID09PSB1bmRlZmluZWQgfHwgc2xvdCA+IHRoaXMuZmVkTWF4U2xvdCkge1xuICAgICAgICB0aGlzLmZlZE1heFNsb3QgPSBzbG90O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBYnNvcmIgYSB3cml0ZSdzIHJlc3BvbnNlOiBub3RlIHRoZSBjb21taXR0ZWQgZXZlbnQncyBwb3NpdGlvbiwgYW5kXG4gICAqIHF1ZXVlIHRoZSBza2lwcGVkLXNsb3QgcmVwb3J0IGEgV29ybGQgYXR0YWNoZWQgdG8gaXQuXG4gICAqXG4gICAqIEEgdHJ1bmNhdGVkIHBhZ2UgKGBoYXNNb3JlYCkgaXMgZHJvcHBlZCB3aG9sZSwgdGhlIHNhbWUgcG9saWN5IGFzXG4gICAqIGBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydGAgaW4gdGhlIG5vZGUgZW5naW5lOiBpdCBjb3ZlcnMgYSBzcGFuIG9mXG4gICAqIHBvc2l0aW9ucyBidXQgY2FycmllcyBvbmx5IHNvbWUgb2YgdGhlbSwgYW5kIHF1ZXVpbmcgcGFydCBvZiBhIHNwYW5cbiAgICogd291bGQgaGF2ZSB0aGlzIHZpZXcgY2xhaW0sIG9uIGl0cyBuZXh0IHdyaXRlLCB0byBoYXZlIHNlZW4gcG9zaXRpb25zIGl0XG4gICAqIG5ldmVyIHJlY2VpdmVkLiBUaGUgY29tbWl0dGVkIGV2ZW50IGlzIHF1ZXVlZCBvbmx5IHVuZGVyIGBkZWxpdmVyRXZlbnRgXG4gICAqIChzZWUgdGhlIGNsYXNzIGRvYyBmb3Igd2h5IG5vdCBieSBkZWZhdWx0KTsgaXRzIHBvc2l0aW9uIGFsd2F5cyBjb3VudHMuXG4gICAqL1xuICBhYnNvcmIoXG4gICAgcmVzdWx0OiB7XG4gICAgICBldmVudD86IEV2ZW50O1xuICAgICAgZXZlbnRzPzogcmVhZG9ubHkgRXZlbnRbXTtcbiAgICAgIGhhc01vcmU/OiBib29sZWFuO1xuICAgIH0sXG4gICAgb3B0aW9uczogeyBkZWxpdmVyRXZlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IHF1ZXVlZDogbnVtYmVyOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfSB7XG4gICAgbGV0IHF1ZXVlZCA9IDA7XG4gICAgaWYgKHJlc3VsdC5ldmVudCkge1xuICAgICAgaWYgKG9wdGlvbnMuZGVsaXZlckV2ZW50ID09PSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlKHJlc3VsdC5ldmVudCkpIHF1ZXVlZCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zbG90T2YocmVzdWx0LmV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFnZSA9IHJlc3VsdC5ldmVudHMgPz8gW107XG4gICAgaWYgKHBhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBxdWV1ZWQsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5oYXNNb3JlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4geyBxdWV1ZWQsIHRydW5jYXRlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHBhZ2UpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlKGV2ZW50KSkgcXVldWVkKys7XG4gICAgfVxuICAgIHJldHVybiB7IHF1ZXVlZCwgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFic29yYiB0aGUgaW5saW5lIGRlbHRhIGEgc3RlcC10ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCBmb3JcbiAgICogYHNpbmNlQ3Vyc29yYCwgYW5kIGFkdmFuY2UgdGhlIHJlYWQgY3Vyc29yIHBhc3QgaXQgd2hlbiB0aGF0IGlzIHNhZmUuXG4gICAqXG4gICAqIFRoZSBkZWx0YSBpcyBldmVyeXRoaW5nIGFmdGVyIGBzZW50Q3Vyc29yYCwgc28gaXQgbWF5IGJlIHRha2VuIG9ubHkgaWZcbiAgICogdGhlIHZpZXcgc3RpbGwgc3RhbmRzIGF0IHRoYXQgY3Vyc29yIChhIGxpc3QgaW4gYmV0d2VlbiB3b3VsZCBoYXZlIG1vdmVkXG4gICAqIGl0LCBhbmQgYXBwZW5kaW5nIGEgZGVsdGEgY29tcHV0ZWQgZnJvbSBhbiBvbGRlciBwb3NpdGlvbiBjb3VsZCBkZWxpdmVyXG4gICAqIGV2ZW50cyBiZWhpbmQgb25lcyBhbHJlYWR5IGZlZCkuIFRoZSBjdXJzb3IgYWR2YW5jZXMgb25seSB3aGVuIHRoZSBxdWV1ZVxuICAgKiB0aGVuIGhvbGRzIGV2ZXJ5IHBvc2l0aW9uIGJldHdlZW4gd2hhdCB0aGUgVk0gaGFzIGFuZCB0aGUgZGVsdGEncyBlbmQ6XG4gICAqIHdpdGggYSBob2xlIGluIGJldHdlZW4sIGEgbGF0ZXIgYGV2ZW50cy5saXN0YCBmcm9tIHRoZSBhZHZhbmNlZCBjdXJzb3JcbiAgICogd291bGQgbmV2ZXIgcmV0dXJuIHRoZSBtaXNzaW5nIGV2ZW50IGFuZCB0aGUgVk0gd291bGQgc3RhbGwgb24gaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnNvciB3YXMgYWR2YW5jZWQuXG4gICAqL1xuICBhYnNvcmJEZWx0YShcbiAgICBzZW50Q3Vyc29yOiBzdHJpbmcsXG4gICAgZGVsdGE6IHsgZXZlbnRzOiByZWFkb25seSBFdmVudFtdOyBjdXJzb3I6IHN0cmluZyB8IG51bGw7IGhhc01vcmU6IGJvb2xlYW4gfVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2xvdFRyYWNraW5nIHx8IHRoaXMuY3Vyc29yICE9PSBzZW50Q3Vyc29yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkZWx0YS5oYXNNb3JlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZGVsdGEuZXZlbnRzKSB7XG4gICAgICB0aGlzLnF1ZXVlKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnF1ZXVlSXNEZW5zZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYWR2YW5jZUN1cnNvcihkZWx0YS5jdXJzb3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWluIHRoZSBldmVudHMgdGhhdCBjYW4gYmUgZGVsaXZlcmVkIHRvIHRoZSBWTSBub3c6IHRoZSBxdWV1ZWQgcnVuIG9mXG4gICAqIGNvbnNlY3V0aXZlIHBvc2l0aW9ucyBkaXJlY3RseSBhYm92ZSB0aGUgaGlnaGVzdCBvbmUgYWxyZWFkeSBmZWQuIEEgcXVldWVkXG4gICAqIGV2ZW50IGFib3ZlIGEgcG9zaXRpb24gbm90aGluZyBoYXMgZmlsbGVkIHlldCBzdGF5cyBxdWV1ZWQgdW50aWwgYSBsaXN0XG4gICAqIGZpbGxzIHRoZSBnYXAuXG4gICAqL1xuICB0YWtlQ29udGlndW91cygpOiBFdmVudFtdIHtcbiAgICBpZiAoIXRoaXMuc2xvdFRyYWNraW5nKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG91dDogRXZlbnRbXSA9IFtdO1xuICAgIC8vIEEgVk0gc3RhcnRlZCBvbiBhbiBlbXB0eSBsb2cgaXMgd2FpdGluZyBmb3IgdGhlIGZpcnN0IHBvc2l0aW9uLlxuICAgIGxldCBuZXh0ID1cbiAgICAgIHRoaXMuZmVkTWF4U2xvdCA9PT0gdW5kZWZpbmVkID8gRklSU1RfRVZFTlRfU0xPVCA6IHRoaXMuZmVkTWF4U2xvdCArIDE7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnVuZmVkLmdldChuZXh0KTtcbiAgICAgIGlmIChldmVudCA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIHRoaXMudW5mZWQuZGVsZXRlKG5leHQpO1xuICAgICAgb3V0LnB1c2goZXZlbnQpO1xuICAgICAgbmV4dCsrO1xuICAgIH1cbiAgICBpZiAob3V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZmVkTWF4U2xvdCA9IG5leHQgLSAxO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHJpdmF0ZSBxdWV1ZUlzRGVuc2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMua25vd25NYXhTbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuZmVkLnNpemUgPT09IDA7XG4gICAgfVxuICAgIGNvbnN0IGZlZCA9IHRoaXMuZmVkTWF4U2xvdCA/PyBGSVJTVF9FVkVOVF9TTE9UIC0gMTtcbiAgICByZXR1cm4gdGhpcy51bmZlZC5zaXplID09PSB0aGlzLmtub3duTWF4U2xvdCAtIGZlZDtcbiAgfVxuXG4gIC8qKiBRdWV1ZSBvbmUgZXZlbnQgZm9yIGRlbGl2ZXJ5IHVubGVzcyB0aGUgVk0gYWxyZWFkeSBoYXMgaXQuICovXG4gIHByaXZhdGUgcXVldWUoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2xvdE9mKGV2ZW50KTtcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZmVkTWF4U2xvdCAhPT0gdW5kZWZpbmVkICYmIHNsb3QgPD0gdGhpcy5mZWRNYXhTbG90KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLnVuZmVkLmhhcyhzbG90KSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudW5mZWQuc2V0KHNsb3QsIGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQncyBwb3NpdGlvbiwgYnVtcGluZyBga25vd25NYXhTbG90YC4gYHVuZGVmaW5lZGAgb25jZSBhbiBpZFxuICAgKiB0dXJucyBvdXQgbm90IHRvIGJlIGEgc2xvdCwgd2hpY2ggdHVybnMgdHJhY2tpbmcgb2ZmIGZvciBnb29kLlxuICAgKi9cbiAgcHJpdmF0ZSBzbG90T2YoZXZlbnQ6IEV2ZW50KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuc2xvdFRyYWNraW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNsb3QgPVxuICAgICAgdHlwZW9mIGV2ZW50LmV2ZW50SWQgPT09ICdzdHJpbmcnID8gZXZlbnRJZFRvU2xvdChldmVudC5ldmVudElkKSA6IG51bGw7XG4gICAgaWYgKHNsb3QgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2xvdFRyYWNraW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmtub3duTWF4U2xvdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudW5mZWQuY2xlYXIoKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmtub3duTWF4U2xvdCA9PT0gdW5kZWZpbmVkIHx8IHNsb3QgPiB0aGlzLmtub3duTWF4U2xvdCkge1xuICAgICAgdGhpcy5rbm93bk1heFNsb3QgPSBzbG90O1xuICAgIH1cbiAgICByZXR1cm4gc2xvdDtcbiAgfVxufVxuIl19
@@ -1,10 +1,11 @@
1
1
  import type { Event, SerializedData, StartedStep, World } from '@workflow/world';
2
2
  import type { PayloadKey } from '../serialization/encryption.js';
3
- import { type SlotSnapshotParams } from './helpers.js';
4
3
  import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
5
4
  import { type ResumeTtrTracking } from './resume-latency.js';
6
5
  import { type StepLatencyTracking } from './step-latency.js';
7
6
  export declare const DEFAULT_STEP_MAX_RETRIES = 3;
7
+ export declare const STEP_STREAM_DRAIN_TIMEOUT_MS = 30000;
8
+ export declare function getStepStreamDrainTimeoutMs(): number;
8
9
  export interface StepExecutorParams {
9
10
  world: World;
10
11
  workflowRunId: string;
@@ -72,26 +73,6 @@ export interface StepExecutorParams {
72
73
  * handler is the sole inline writer for the run on this iteration.
73
74
  */
74
75
  inlineDeltaSinceCursor?: string;
75
- /**
76
- * How much of the run's log the caller's replay had loaded when it scheduled
77
- * this step, as the highest slot that log occupies. Seeds the snapshot every
78
- * write this executor makes carries; each committed event advances it to its
79
- * own slot, so a later write never names a position that predates an earlier
80
- * one from the same step.
81
- *
82
- * It matters most on the lazy inline path, where the `step_started` claim is
83
- * the step's FIRST durable write (its `step_created` is deferred): without a
84
- * seed the claim would name no position at all, and a replay working from a
85
- * stale view could claim (and then commit) a step scheduled without
86
- * observing an event it never loaded.
87
- *
88
- * A World that fences rejects a stale claim with `PreconditionFailedError`
89
- * (412); executeStep does NOT translate that rejection (re-claiming in place
90
- * would still commit the stale schedule), so it propagates for the caller to
91
- * abandon the batch and restart its replay. Undefined for a caller with
92
- * nothing loaded.
93
- */
94
- slotSnapshot?: SlotSnapshotParams;
95
76
  /**
96
77
  * Suppress optimistic inline start for this step regardless of
97
78
  * `WORKFLOW_OPTIMISTIC_INLINE_START` / `forceOptimisticStart`: take the
@@ -1 +1 @@
1
- {"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"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"}