awaitly 1.34.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
- package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
- package/dist/errors-DtXvrCiO.d.cts +708 -0
- package/dist/errors-DtXvrCiO.d.ts +708 -0
- package/dist/index.cjs +4594 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1970 -141
- package/dist/index.d.ts +1970 -141
- package/dist/index.js +4398 -1
- package/dist/index.js.map +1 -1
- package/dist/result.cjs +641 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.cts +35 -5
- package/dist/result.d.ts +35 -5
- package/dist/result.js +561 -1
- package/dist/result.js.map +1 -1
- package/dist/testing.cjs +4202 -8
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +2 -6
- package/dist/testing.d.ts +2 -6
- package/dist/testing.js +4154 -8
- package/dist/testing.js.map +1 -1
- package/dist/{run-entry-D2MmJFj9.d.cts → types-B8NfNRGX.d.ts} +1152 -1499
- package/dist/{run-entry-Dduz-is2.d.ts → types-BZ2f4MRR.d.cts} +1152 -1499
- package/dist/workflow.cjs +7096 -6
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3346 -22
- package/dist/workflow.d.ts +3346 -22
- package/dist/workflow.js +6929 -6
- package/dist/workflow.js.map +1 -1
- package/package.json +13 -178
- package/dist/adapters.cjs +0 -7
- package/dist/adapters.cjs.map +0 -1
- package/dist/adapters.d.cts +0 -179
- package/dist/adapters.d.ts +0 -179
- package/dist/adapters.js +0 -7
- package/dist/adapters.js.map +0 -1
- package/dist/batch.cjs +0 -7
- package/dist/batch.cjs.map +0 -1
- package/dist/batch.d.cts +0 -200
- package/dist/batch.d.ts +0 -200
- package/dist/batch.js +0 -7
- package/dist/batch.js.map +0 -1
- package/dist/bind-deps.cjs +0 -2
- package/dist/bind-deps.cjs.map +0 -1
- package/dist/bind-deps.d.cts +0 -28
- package/dist/bind-deps.d.ts +0 -28
- package/dist/bind-deps.js +0 -2
- package/dist/bind-deps.js.map +0 -1
- package/dist/cache.cjs +0 -2
- package/dist/cache.cjs.map +0 -1
- package/dist/cache.d.cts +0 -269
- package/dist/cache.d.ts +0 -269
- package/dist/cache.js +0 -2
- package/dist/cache.js.map +0 -1
- package/dist/circuit-breaker.cjs +0 -7
- package/dist/circuit-breaker.cjs.map +0 -1
- package/dist/circuit-breaker.d.cts +0 -211
- package/dist/circuit-breaker.d.ts +0 -211
- package/dist/circuit-breaker.js +0 -7
- package/dist/circuit-breaker.js.map +0 -1
- package/dist/conditional.cjs +0 -2
- package/dist/conditional.cjs.map +0 -1
- package/dist/conditional.d.cts +0 -252
- package/dist/conditional.d.ts +0 -252
- package/dist/conditional.js +0 -2
- package/dist/conditional.js.map +0 -1
- package/dist/core.cjs +0 -7
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.cts +0 -5
- package/dist/core.d.ts +0 -5
- package/dist/core.js +0 -7
- package/dist/core.js.map +0 -1
- package/dist/di-COl5oFnR.d.cts +0 -15
- package/dist/di-CyDj_JyZ.d.ts +0 -15
- package/dist/diagnostics.cjs +0 -8
- package/dist/diagnostics.cjs.map +0 -1
- package/dist/diagnostics.d.cts +0 -68
- package/dist/diagnostics.d.ts +0 -68
- package/dist/diagnostics.js +0 -8
- package/dist/diagnostics.js.map +0 -1
- package/dist/durable.cjs +0 -11
- package/dist/durable.cjs.map +0 -1
- package/dist/durable.d.cts +0 -9
- package/dist/durable.d.ts +0 -9
- package/dist/durable.js +0 -11
- package/dist/durable.js.map +0 -1
- package/dist/duration.cjs +0 -2
- package/dist/duration.cjs.map +0 -1
- package/dist/duration.js +0 -2
- package/dist/duration.js.map +0 -1
- package/dist/engine.cjs +0 -11
- package/dist/engine.cjs.map +0 -1
- package/dist/engine.d.cts +0 -115
- package/dist/engine.d.ts +0 -115
- package/dist/engine.js +0 -11
- package/dist/engine.js.map +0 -1
- package/dist/errors.cjs +0 -2
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -361
- package/dist/errors.d.ts +0 -361
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +0 -1
- package/dist/fetch.cjs +0 -7
- package/dist/fetch.cjs.map +0 -1
- package/dist/fetch.d.cts +0 -86
- package/dist/fetch.d.ts +0 -86
- package/dist/fetch.js +0 -7
- package/dist/fetch.js.map +0 -1
- package/dist/flow.cjs +0 -7
- package/dist/flow.cjs.map +0 -1
- package/dist/flow.d.cts +0 -163
- package/dist/flow.d.ts +0 -163
- package/dist/flow.js +0 -7
- package/dist/flow.js.map +0 -1
- package/dist/functional.cjs +0 -2
- package/dist/functional.cjs.map +0 -1
- package/dist/functional.d.cts +0 -444
- package/dist/functional.d.ts +0 -444
- package/dist/functional.js +0 -2
- package/dist/functional.js.map +0 -1
- package/dist/guards-BodHXLzX.d.cts +0 -72
- package/dist/guards-CeWoQ8fn.d.ts +0 -72
- package/dist/hitl-BPE_1UiM.d.cts +0 -468
- package/dist/hitl-byp570uC.d.ts +0 -468
- package/dist/hitl.cjs +0 -7
- package/dist/hitl.cjs.map +0 -1
- package/dist/hitl.d.cts +0 -442
- package/dist/hitl.d.ts +0 -442
- package/dist/hitl.js +0 -7
- package/dist/hitl.js.map +0 -1
- package/dist/index-BYT3amEz.d.ts +0 -417
- package/dist/index-C_ak66jy.d.cts +0 -417
- package/dist/match-entry-DjI2bLpD.d.cts +0 -209
- package/dist/match-entry-DjI2bLpD.d.ts +0 -209
- package/dist/match.cjs +0 -2
- package/dist/match.cjs.map +0 -1
- package/dist/match.d.cts +0 -1
- package/dist/match.d.ts +0 -1
- package/dist/match.js +0 -2
- package/dist/match.js.map +0 -1
- package/dist/otel.cjs +0 -2
- package/dist/otel.cjs.map +0 -1
- package/dist/otel.d.cts +0 -188
- package/dist/otel.d.ts +0 -188
- package/dist/otel.js +0 -2
- package/dist/otel.js.map +0 -1
- package/dist/persistence-entry-DOMx3woy.d.ts +0 -822
- package/dist/persistence-entry-ymCA4iDu.d.cts +0 -822
- package/dist/persistence.cjs +0 -2
- package/dist/persistence.cjs.map +0 -1
- package/dist/persistence.d.cts +0 -7
- package/dist/persistence.d.ts +0 -7
- package/dist/persistence.js +0 -2
- package/dist/persistence.js.map +0 -1
- package/dist/policies.cjs +0 -2
- package/dist/policies.cjs.map +0 -1
- package/dist/policies.d.cts +0 -379
- package/dist/policies.d.ts +0 -379
- package/dist/policies.js +0 -2
- package/dist/policies.js.map +0 -1
- package/dist/ratelimit.cjs +0 -7
- package/dist/ratelimit.cjs.map +0 -1
- package/dist/ratelimit.d.cts +0 -458
- package/dist/ratelimit.d.ts +0 -458
- package/dist/ratelimit.js +0 -7
- package/dist/ratelimit.js.map +0 -1
- package/dist/reliability.cjs +0 -11
- package/dist/reliability.cjs.map +0 -1
- package/dist/reliability.d.cts +0 -11
- package/dist/reliability.d.ts +0 -11
- package/dist/reliability.js +0 -11
- package/dist/reliability.js.map +0 -1
- package/dist/resolver.cjs +0 -7
- package/dist/resolver.cjs.map +0 -1
- package/dist/resolver.d.cts +0 -68
- package/dist/resolver.d.ts +0 -68
- package/dist/resolver.js +0 -7
- package/dist/resolver.js.map +0 -1
- package/dist/resource.cjs +0 -7
- package/dist/resource.cjs.map +0 -1
- package/dist/resource.d.cts +0 -174
- package/dist/resource.d.ts +0 -174
- package/dist/resource.js +0 -7
- package/dist/resource.js.map +0 -1
- package/dist/result/retry.cjs +0 -2
- package/dist/result/retry.cjs.map +0 -1
- package/dist/result/retry.d.cts +0 -70
- package/dist/result/retry.d.ts +0 -70
- package/dist/result/retry.js +0 -2
- package/dist/result/retry.js.map +0 -1
- package/dist/retry.cjs +0 -2
- package/dist/retry.cjs.map +0 -1
- package/dist/retry.d.cts +0 -388
- package/dist/retry.d.ts +0 -388
- package/dist/retry.js +0 -2
- package/dist/retry.js.map +0 -1
- package/dist/run.cjs +0 -7
- package/dist/run.cjs.map +0 -1
- package/dist/run.d.cts +0 -4
- package/dist/run.d.ts +0 -4
- package/dist/run.js +0 -7
- package/dist/run.js.map +0 -1
- package/dist/saga.cjs +0 -11
- package/dist/saga.cjs.map +0 -1
- package/dist/saga.d.cts +0 -164
- package/dist/saga.d.ts +0 -164
- package/dist/saga.js +0 -11
- package/dist/saga.js.map +0 -1
- package/dist/singleflight.cjs +0 -2
- package/dist/singleflight.cjs.map +0 -1
- package/dist/singleflight.d.cts +0 -145
- package/dist/singleflight.d.ts +0 -145
- package/dist/singleflight.js +0 -2
- package/dist/singleflight.js.map +0 -1
- package/dist/slugs.cjs +0 -2
- package/dist/slugs.cjs.map +0 -1
- package/dist/slugs.d.cts +0 -67
- package/dist/slugs.d.ts +0 -67
- package/dist/slugs.js +0 -2
- package/dist/slugs.js.map +0 -1
- package/dist/streaming.cjs +0 -9
- package/dist/streaming.cjs.map +0 -1
- package/dist/streaming.d.cts +0 -596
- package/dist/streaming.d.ts +0 -596
- package/dist/streaming.js +0 -9
- package/dist/streaming.js.map +0 -1
- package/dist/tagged-error.cjs +0 -2
- package/dist/tagged-error.cjs.map +0 -1
- package/dist/tagged-error.d.cts +0 -275
- package/dist/tagged-error.d.ts +0 -275
- package/dist/tagged-error.js +0 -2
- package/dist/tagged-error.js.map +0 -1
- package/dist/types-DQmzO9f4.d.ts +0 -323
- package/dist/types-qBUOYi-4.d.cts +0 -323
- package/dist/webhook.cjs +0 -7
- package/dist/webhook.cjs.map +0 -1
- package/dist/webhook.d.cts +0 -499
- package/dist/webhook.d.ts +0 -499
- package/dist/webhook.js +0 -7
- package/dist/webhook.js.map +0 -1
package/dist/duration.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var f=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var J=(i,t)=>{for(var n in t)f(i,n,{get:t[n],enumerable:!0})},K=(i,t,n,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of B(t))!G.call(i,r)&&r!==n&&f(i,r,{get:()=>t[r],enumerable:!(u=A(t,r))||u.enumerable});return i};var P=i=>K(f({},"__esModule",{value:!0}),i);var Q={};J(Q,{Duration:()=>N,add:()=>_,clamp:()=>w,days:()=>m,divide:()=>q,equals:()=>O,format:()=>Z,greaterThan:()=>E,greaterThanOrEqual:()=>F,hours:()=>l,infinity:()=>x,isDuration:()=>S,isFinite:()=>H,isInfinite:()=>z,isZero:()=>j,lessThan:()=>$,lessThanOrEqual:()=>I,max:()=>c,millis:()=>e,min:()=>D,minutes:()=>s,multiply:()=>M,parse:()=>k,seconds:()=>a,subtract:()=>T,toDays:()=>y,toHours:()=>g,toMillis:()=>d,toMinutes:()=>b,toSeconds:()=>h,zero:()=>p});module.exports=P(Q);function e(i){return{_tag:"Duration",millis:i}}function a(i){return{_tag:"Duration",millis:i*1e3}}function s(i){return{_tag:"Duration",millis:i*60*1e3}}function l(i){return{_tag:"Duration",millis:i*60*60*1e3}}function m(i){return{_tag:"Duration",millis:i*24*60*60*1e3}}var p={_tag:"Duration",millis:0},x={_tag:"Duration",millis:1/0};function d(i){return i.millis}function h(i){return i.millis/1e3}function b(i){return i.millis/(60*1e3)}function g(i){return i.millis/(3600*1e3)}function y(i){return i.millis/(1440*60*1e3)}function _(i,t){return{_tag:"Duration",millis:i.millis+t.millis}}function T(i,t){return{_tag:"Duration",millis:Math.max(0,i.millis-t.millis)}}function M(i,t){return{_tag:"Duration",millis:i.millis*t}}function q(i,t){return{_tag:"Duration",millis:i.millis/t}}function $(i,t){return i.millis<t.millis}function I(i,t){return i.millis<=t.millis}function E(i,t){return i.millis>t.millis}function F(i,t){return i.millis>=t.millis}function O(i,t){return i.millis===t.millis}function D(i,t){return i.millis<=t.millis?i:t}function c(i,t){return i.millis>=t.millis?i:t}function w(i,t,n){return D(c(i,t),n)}function j(i){return i.millis===0}function z(i){return i.millis===1/0}function H(i){return Number.isFinite(i.millis)&&i.millis>0}function S(i){return typeof i=="object"&&i!==null&&"_tag"in i&&i._tag==="Duration"&&"millis"in i&&typeof i.millis=="number"}function Z(i){let t=i.millis;if(t===1/0)return"\u221E";if(t===0)return"0ms";let n=Math.floor(t/(1440*60*1e3)),u=Math.floor(t%(1440*60*1e3)/(3600*1e3)),r=Math.floor(t%(3600*1e3)/(60*1e3)),C=Math.floor(t%(60*1e3)/1e3),L=t%1e3,o=[];return n>0&&o.push(`${n}d`),u>0&&o.push(`${u}h`),r>0&&o.push(`${r}m`),C>0&&o.push(`${C}s`),L>0&&o.length===0&&o.push(`${L}ms`),o.join(" ")||"0ms"}function k(i){let t=i.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return e(n);case"s":return a(n);case"m":return s(n);case"h":return l(n);case"d":return m(n);default:return}}var N={millis:e,seconds:a,minutes:s,hours:l,days:m,zero:p,infinity:x,toMillis:d,toSeconds:h,toMinutes:b,toHours:g,toDays:y,add:_,subtract:T,multiply:M,divide:q,lessThan:$,lessThanOrEqual:I,greaterThan:E,greaterThanOrEqual:F,equals:O,min:D,max:c,clamp:w,isZero:j,isInfinite:z,isFinite:H,isDuration:S,format:Z,parse:k};0&&(module.exports={Duration,add,clamp,days,divide,equals,format,greaterThan,greaterThanOrEqual,hours,infinity,isDuration,isFinite,isInfinite,isZero,lessThan,lessThanOrEqual,max,millis,min,minutes,multiply,parse,seconds,subtract,toDays,toHours,toMillis,toMinutes,toSeconds,zero});
|
|
2
|
-
//# sourceMappingURL=duration.cjs.map
|
package/dist/duration.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/duration-entry.ts","../src/duration.ts"],"sourcesContent":["/**\n * awaitly/duration\n *\n * Type-safe time duration utilities: avoid \"is this milliseconds or seconds?\" confusion.\n *\n * @example\n * ```typescript\n * import { Duration, millis, seconds, toMillis } from 'awaitly/duration';\n *\n * const timeout = Duration.seconds(30);\n * const delay = Duration.millis(100);\n *\n * // Convert to milliseconds for setTimeout\n * setTimeout(() => {}, toMillis(timeout));\n * ```\n */\n\nexport {\n // Types\n type Duration as DurationType,\n\n // Namespace\n Duration,\n\n // Individual exports (for tree-shaking)\n millis,\n seconds,\n minutes,\n hours,\n days,\n toMillis,\n toSeconds,\n toMinutes,\n toHours,\n toDays,\n isDuration,\n\n // Arithmetic\n add,\n subtract,\n multiply,\n divide,\n\n // Comparison\n lessThan,\n lessThanOrEqual,\n greaterThan,\n greaterThanOrEqual,\n equals,\n\n // Utilities\n isZero,\n isInfinite,\n isFinite,\n min,\n max,\n clamp,\n format,\n parse,\n\n // Constants\n zero,\n infinity,\n} from \"./duration\";\n","/**\n * awaitly/duration\n *\n * Type-safe duration handling inspired by Effect's Duration module.\n * Prevents unit confusion (milliseconds vs seconds) with explicit constructors.\n */\n\n// =============================================================================\n// Duration Type\n// =============================================================================\n\n/**\n * A type-safe representation of a time duration.\n * Use the constructor functions (millis, seconds, etc.) to create durations.\n */\nexport interface Duration {\n readonly _tag: \"Duration\";\n readonly millis: number;\n}\n\n// =============================================================================\n// Constructors\n// =============================================================================\n\n/**\n * Create a Duration from milliseconds.\n *\n * @example\n * ```typescript\n * const d = Duration.millis(500)\n * ```\n */\nexport function millis(ms: number): Duration {\n return { _tag: \"Duration\", millis: ms };\n}\n\n/**\n * Create a Duration from seconds.\n *\n * @example\n * ```typescript\n * const d = Duration.seconds(5) // 5000ms\n * ```\n */\nexport function seconds(s: number): Duration {\n return { _tag: \"Duration\", millis: s * 1000 };\n}\n\n/**\n * Create a Duration from minutes.\n *\n * @example\n * ```typescript\n * const d = Duration.minutes(2) // 120000ms\n * ```\n */\nexport function minutes(m: number): Duration {\n return { _tag: \"Duration\", millis: m * 60 * 1000 };\n}\n\n/**\n * Create a Duration from hours.\n *\n * @example\n * ```typescript\n * const d = Duration.hours(1) // 3600000ms\n * ```\n */\nexport function hours(h: number): Duration {\n return { _tag: \"Duration\", millis: h * 60 * 60 * 1000 };\n}\n\n/**\n * Create a Duration from days.\n *\n * @example\n * ```typescript\n * const d = Duration.days(1) // 86400000ms\n * ```\n */\nexport function days(d: number): Duration {\n return { _tag: \"Duration\", millis: d * 24 * 60 * 60 * 1000 };\n}\n\n/**\n * Zero duration.\n */\nexport const zero: Duration = { _tag: \"Duration\", millis: 0 };\n\n/**\n * Infinite duration (represented as Infinity milliseconds).\n */\nexport const infinity: Duration = { _tag: \"Duration\", millis: Infinity };\n\n// =============================================================================\n// Conversions\n// =============================================================================\n\n/**\n * Convert a Duration to milliseconds.\n */\nexport function toMillis(duration: Duration): number {\n return duration.millis;\n}\n\n/**\n * Convert a Duration to seconds.\n */\nexport function toSeconds(duration: Duration): number {\n return duration.millis / 1000;\n}\n\n/**\n * Convert a Duration to minutes.\n */\nexport function toMinutes(duration: Duration): number {\n return duration.millis / (60 * 1000);\n}\n\n/**\n * Convert a Duration to hours.\n */\nexport function toHours(duration: Duration): number {\n return duration.millis / (60 * 60 * 1000);\n}\n\n/**\n * Convert a Duration to days.\n */\nexport function toDays(duration: Duration): number {\n return duration.millis / (24 * 60 * 60 * 1000);\n}\n\n// =============================================================================\n// Operations\n// =============================================================================\n\n/**\n * Add two durations.\n *\n * @example\n * ```typescript\n * const total = Duration.add(Duration.seconds(5), Duration.millis(500))\n * // 5500ms\n * ```\n */\nexport function add(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: a.millis + b.millis };\n}\n\n/**\n * Subtract duration b from duration a.\n * Result is clamped to zero (no negative durations).\n *\n * @example\n * ```typescript\n * const remaining = Duration.subtract(Duration.seconds(5), Duration.seconds(2))\n * // 3000ms\n * ```\n */\nexport function subtract(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: Math.max(0, a.millis - b.millis) };\n}\n\n/**\n * Multiply a duration by a factor.\n *\n * @example\n * ```typescript\n * const doubled = Duration.multiply(Duration.seconds(5), 2)\n * // 10000ms\n * ```\n */\nexport function multiply(duration: Duration, factor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis * factor };\n}\n\n/**\n * Divide a duration by a divisor.\n *\n * @example\n * ```typescript\n * const half = Duration.divide(Duration.seconds(10), 2)\n * // 5000ms\n * ```\n */\nexport function divide(duration: Duration, divisor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis / divisor };\n}\n\n// =============================================================================\n// Comparisons\n// =============================================================================\n\n/**\n * Check if duration a is less than duration b.\n */\nexport function lessThan(a: Duration, b: Duration): boolean {\n return a.millis < b.millis;\n}\n\n/**\n * Check if duration a is less than or equal to duration b.\n */\nexport function lessThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis <= b.millis;\n}\n\n/**\n * Check if duration a is greater than duration b.\n */\nexport function greaterThan(a: Duration, b: Duration): boolean {\n return a.millis > b.millis;\n}\n\n/**\n * Check if duration a is greater than or equal to duration b.\n */\nexport function greaterThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis >= b.millis;\n}\n\n/**\n * Check if two durations are equal.\n */\nexport function equals(a: Duration, b: Duration): boolean {\n return a.millis === b.millis;\n}\n\n/**\n * Get the minimum of two durations.\n */\nexport function min(a: Duration, b: Duration): Duration {\n return a.millis <= b.millis ? a : b;\n}\n\n/**\n * Get the maximum of two durations.\n */\nexport function max(a: Duration, b: Duration): Duration {\n return a.millis >= b.millis ? a : b;\n}\n\n/**\n * Clamp a duration between a minimum and maximum.\n */\nexport function clamp(duration: Duration, minimum: Duration, maximum: Duration): Duration {\n return min(max(duration, minimum), maximum);\n}\n\n// =============================================================================\n// Predicates\n// =============================================================================\n\n/**\n * Check if a duration is zero.\n */\nexport function isZero(duration: Duration): boolean {\n return duration.millis === 0;\n}\n\n/**\n * Check if a duration is infinite.\n */\nexport function isInfinite(duration: Duration): boolean {\n return duration.millis === Infinity;\n}\n\n/**\n * Check if a duration is finite and positive.\n */\nexport function isFinite(duration: Duration): boolean {\n return Number.isFinite(duration.millis) && duration.millis > 0;\n}\n\n/**\n * Type guard to check if a value is a Duration.\n */\nexport function isDuration(value: unknown): value is Duration {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n value._tag === \"Duration\" &&\n \"millis\" in value &&\n typeof value.millis === \"number\"\n );\n}\n\n// =============================================================================\n// Formatting\n// =============================================================================\n\n/**\n * Format a duration as a human-readable string.\n *\n * @example\n * ```typescript\n * Duration.format(Duration.seconds(90)) // \"1m 30s\"\n * Duration.format(Duration.millis(500)) // \"500ms\"\n * ```\n */\nexport function format(duration: Duration): string {\n const ms = duration.millis;\n\n if (ms === Infinity) return \"∞\";\n if (ms === 0) return \"0ms\";\n\n const days = Math.floor(ms / (24 * 60 * 60 * 1000));\n const hours = Math.floor((ms % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((ms % (60 * 1000)) / 1000);\n const millis = ms % 1000;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (seconds > 0) parts.push(`${seconds}s`);\n if (millis > 0 && parts.length === 0) parts.push(`${millis}ms`);\n\n return parts.join(\" \") || \"0ms\";\n}\n\n// =============================================================================\n// Parsing\n// =============================================================================\n\n/**\n * Parse a duration from a string like \"100ms\", \"5s\", \"2m\", \"1h\", \"1d\".\n * Returns undefined if parsing fails.\n *\n * @example\n * ```typescript\n * Duration.parse(\"5s\") // Duration.seconds(5)\n * Duration.parse(\"100ms\") // Duration.millis(100)\n * Duration.parse(\"2m\") // Duration.minutes(2)\n * ```\n */\nexport function parse(input: string): Duration | undefined {\n const match = input.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/i);\n if (!match) return undefined;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase();\n\n switch (unit) {\n case \"ms\":\n return millis(value);\n case \"s\":\n return seconds(value);\n case \"m\":\n return minutes(value);\n case \"h\":\n return hours(value);\n case \"d\":\n return days(value);\n default:\n return undefined;\n }\n}\n\n// =============================================================================\n// Namespace Export\n// =============================================================================\n\n/**\n * Duration namespace with all functions for convenient access.\n *\n * @example\n * ```typescript\n * import { Duration } from \"awaitly\";\n *\n * const timeout = Duration.seconds(30);\n * const delay = Duration.millis(100);\n * const total = Duration.add(timeout, delay);\n *\n * console.log(Duration.format(total)); // \"30s 100ms\"\n * ```\n */\nexport const Duration = {\n // Constructors\n millis,\n seconds,\n minutes,\n hours,\n days,\n zero,\n infinity,\n\n // Conversions\n toMillis,\n toSeconds,\n toMinutes,\n toHours,\n toDays,\n\n // Operations\n add,\n subtract,\n multiply,\n divide,\n\n // Comparisons\n lessThan,\n lessThanOrEqual,\n greaterThan,\n greaterThanOrEqual,\n equals,\n min,\n max,\n clamp,\n\n // Predicates\n isZero,\n isInfinite,\n isFinite,\n isDuration,\n\n // Formatting\n format,\n parse,\n} as const;\n\nexport type { Duration as DurationType };\n"],"mappings":"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","names":["duration_entry_exports","__export","Duration","add","clamp","days","divide","equals","format","greaterThan","greaterThanOrEqual","hours","infinity","isDuration","isFinite","isInfinite","isZero","lessThan","lessThanOrEqual","max","millis","min","minutes","multiply","parse","seconds","subtract","toDays","toHours","toMillis","toMinutes","toSeconds","zero","__toCommonJS","millis","ms","seconds","s","minutes","m","hours","h","days","d","zero","infinity","toMillis","duration","toSeconds","toMinutes","toHours","toDays","add","a","b","subtract","multiply","factor","divide","divisor","lessThan","lessThanOrEqual","greaterThan","greaterThanOrEqual","equals","min","max","clamp","minimum","maximum","isZero","isInfinite","isFinite","isDuration","value","format","parts","parse","input","match","Duration"]}
|
package/dist/duration.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function u(i){return{_tag:"Duration",millis:i}}function e(i){return{_tag:"Duration",millis:i*1e3}}function a(i){return{_tag:"Duration",millis:i*60*1e3}}function s(i){return{_tag:"Duration",millis:i*60*60*1e3}}function l(i){return{_tag:"Duration",millis:i*24*60*60*1e3}}var x={_tag:"Duration",millis:0},d={_tag:"Duration",millis:1/0};function h(i){return i.millis}function b(i){return i.millis/1e3}function g(i){return i.millis/(60*1e3)}function y(i){return i.millis/(3600*1e3)}function _(i){return i.millis/(1440*60*1e3)}function T(i,t){return{_tag:"Duration",millis:i.millis+t.millis}}function M(i,t){return{_tag:"Duration",millis:Math.max(0,i.millis-t.millis)}}function q(i,t){return{_tag:"Duration",millis:i.millis*t}}function $(i,t){return{_tag:"Duration",millis:i.millis/t}}function I(i,t){return i.millis<t.millis}function E(i,t){return i.millis<=t.millis}function F(i,t){return i.millis>t.millis}function O(i,t){return i.millis>=t.millis}function w(i,t){return i.millis===t.millis}function m(i,t){return i.millis<=t.millis?i:t}function D(i,t){return i.millis>=t.millis?i:t}function j(i,t,n){return m(D(i,t),n)}function z(i){return i.millis===0}function H(i){return i.millis===1/0}function S(i){return Number.isFinite(i.millis)&&i.millis>0}function Z(i){return typeof i=="object"&&i!==null&&"_tag"in i&&i._tag==="Duration"&&"millis"in i&&typeof i.millis=="number"}function k(i){let t=i.millis;if(t===1/0)return"\u221E";if(t===0)return"0ms";let n=Math.floor(t/(1440*60*1e3)),o=Math.floor(t%(1440*60*1e3)/(3600*1e3)),c=Math.floor(t%(3600*1e3)/(60*1e3)),f=Math.floor(t%(60*1e3)/1e3),p=t%1e3,r=[];return n>0&&r.push(`${n}d`),o>0&&r.push(`${o}h`),c>0&&r.push(`${c}m`),f>0&&r.push(`${f}s`),p>0&&r.length===0&&r.push(`${p}ms`),r.join(" ")||"0ms"}function C(i){let t=i.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return u(n);case"s":return e(n);case"m":return a(n);case"h":return s(n);case"d":return l(n);default:return}}var L={millis:u,seconds:e,minutes:a,hours:s,days:l,zero:x,infinity:d,toMillis:h,toSeconds:b,toMinutes:g,toHours:y,toDays:_,add:T,subtract:M,multiply:q,divide:$,lessThan:I,lessThanOrEqual:E,greaterThan:F,greaterThanOrEqual:O,equals:w,min:m,max:D,clamp:j,isZero:z,isInfinite:H,isFinite:S,isDuration:Z,format:k,parse:C};export{L as Duration,T as add,j as clamp,l as days,$ as divide,w as equals,k as format,F as greaterThan,O as greaterThanOrEqual,s as hours,d as infinity,Z as isDuration,S as isFinite,H as isInfinite,z as isZero,I as lessThan,E as lessThanOrEqual,D as max,u as millis,m as min,a as minutes,q as multiply,C as parse,e as seconds,M as subtract,_ as toDays,y as toHours,h as toMillis,g as toMinutes,b as toSeconds,x as zero};
|
|
2
|
-
//# sourceMappingURL=duration.js.map
|
package/dist/duration.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/duration.ts"],"sourcesContent":["/**\n * awaitly/duration\n *\n * Type-safe duration handling inspired by Effect's Duration module.\n * Prevents unit confusion (milliseconds vs seconds) with explicit constructors.\n */\n\n// =============================================================================\n// Duration Type\n// =============================================================================\n\n/**\n * A type-safe representation of a time duration.\n * Use the constructor functions (millis, seconds, etc.) to create durations.\n */\nexport interface Duration {\n readonly _tag: \"Duration\";\n readonly millis: number;\n}\n\n// =============================================================================\n// Constructors\n// =============================================================================\n\n/**\n * Create a Duration from milliseconds.\n *\n * @example\n * ```typescript\n * const d = Duration.millis(500)\n * ```\n */\nexport function millis(ms: number): Duration {\n return { _tag: \"Duration\", millis: ms };\n}\n\n/**\n * Create a Duration from seconds.\n *\n * @example\n * ```typescript\n * const d = Duration.seconds(5) // 5000ms\n * ```\n */\nexport function seconds(s: number): Duration {\n return { _tag: \"Duration\", millis: s * 1000 };\n}\n\n/**\n * Create a Duration from minutes.\n *\n * @example\n * ```typescript\n * const d = Duration.minutes(2) // 120000ms\n * ```\n */\nexport function minutes(m: number): Duration {\n return { _tag: \"Duration\", millis: m * 60 * 1000 };\n}\n\n/**\n * Create a Duration from hours.\n *\n * @example\n * ```typescript\n * const d = Duration.hours(1) // 3600000ms\n * ```\n */\nexport function hours(h: number): Duration {\n return { _tag: \"Duration\", millis: h * 60 * 60 * 1000 };\n}\n\n/**\n * Create a Duration from days.\n *\n * @example\n * ```typescript\n * const d = Duration.days(1) // 86400000ms\n * ```\n */\nexport function days(d: number): Duration {\n return { _tag: \"Duration\", millis: d * 24 * 60 * 60 * 1000 };\n}\n\n/**\n * Zero duration.\n */\nexport const zero: Duration = { _tag: \"Duration\", millis: 0 };\n\n/**\n * Infinite duration (represented as Infinity milliseconds).\n */\nexport const infinity: Duration = { _tag: \"Duration\", millis: Infinity };\n\n// =============================================================================\n// Conversions\n// =============================================================================\n\n/**\n * Convert a Duration to milliseconds.\n */\nexport function toMillis(duration: Duration): number {\n return duration.millis;\n}\n\n/**\n * Convert a Duration to seconds.\n */\nexport function toSeconds(duration: Duration): number {\n return duration.millis / 1000;\n}\n\n/**\n * Convert a Duration to minutes.\n */\nexport function toMinutes(duration: Duration): number {\n return duration.millis / (60 * 1000);\n}\n\n/**\n * Convert a Duration to hours.\n */\nexport function toHours(duration: Duration): number {\n return duration.millis / (60 * 60 * 1000);\n}\n\n/**\n * Convert a Duration to days.\n */\nexport function toDays(duration: Duration): number {\n return duration.millis / (24 * 60 * 60 * 1000);\n}\n\n// =============================================================================\n// Operations\n// =============================================================================\n\n/**\n * Add two durations.\n *\n * @example\n * ```typescript\n * const total = Duration.add(Duration.seconds(5), Duration.millis(500))\n * // 5500ms\n * ```\n */\nexport function add(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: a.millis + b.millis };\n}\n\n/**\n * Subtract duration b from duration a.\n * Result is clamped to zero (no negative durations).\n *\n * @example\n * ```typescript\n * const remaining = Duration.subtract(Duration.seconds(5), Duration.seconds(2))\n * // 3000ms\n * ```\n */\nexport function subtract(a: Duration, b: Duration): Duration {\n return { _tag: \"Duration\", millis: Math.max(0, a.millis - b.millis) };\n}\n\n/**\n * Multiply a duration by a factor.\n *\n * @example\n * ```typescript\n * const doubled = Duration.multiply(Duration.seconds(5), 2)\n * // 10000ms\n * ```\n */\nexport function multiply(duration: Duration, factor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis * factor };\n}\n\n/**\n * Divide a duration by a divisor.\n *\n * @example\n * ```typescript\n * const half = Duration.divide(Duration.seconds(10), 2)\n * // 5000ms\n * ```\n */\nexport function divide(duration: Duration, divisor: number): Duration {\n return { _tag: \"Duration\", millis: duration.millis / divisor };\n}\n\n// =============================================================================\n// Comparisons\n// =============================================================================\n\n/**\n * Check if duration a is less than duration b.\n */\nexport function lessThan(a: Duration, b: Duration): boolean {\n return a.millis < b.millis;\n}\n\n/**\n * Check if duration a is less than or equal to duration b.\n */\nexport function lessThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis <= b.millis;\n}\n\n/**\n * Check if duration a is greater than duration b.\n */\nexport function greaterThan(a: Duration, b: Duration): boolean {\n return a.millis > b.millis;\n}\n\n/**\n * Check if duration a is greater than or equal to duration b.\n */\nexport function greaterThanOrEqual(a: Duration, b: Duration): boolean {\n return a.millis >= b.millis;\n}\n\n/**\n * Check if two durations are equal.\n */\nexport function equals(a: Duration, b: Duration): boolean {\n return a.millis === b.millis;\n}\n\n/**\n * Get the minimum of two durations.\n */\nexport function min(a: Duration, b: Duration): Duration {\n return a.millis <= b.millis ? a : b;\n}\n\n/**\n * Get the maximum of two durations.\n */\nexport function max(a: Duration, b: Duration): Duration {\n return a.millis >= b.millis ? a : b;\n}\n\n/**\n * Clamp a duration between a minimum and maximum.\n */\nexport function clamp(duration: Duration, minimum: Duration, maximum: Duration): Duration {\n return min(max(duration, minimum), maximum);\n}\n\n// =============================================================================\n// Predicates\n// =============================================================================\n\n/**\n * Check if a duration is zero.\n */\nexport function isZero(duration: Duration): boolean {\n return duration.millis === 0;\n}\n\n/**\n * Check if a duration is infinite.\n */\nexport function isInfinite(duration: Duration): boolean {\n return duration.millis === Infinity;\n}\n\n/**\n * Check if a duration is finite and positive.\n */\nexport function isFinite(duration: Duration): boolean {\n return Number.isFinite(duration.millis) && duration.millis > 0;\n}\n\n/**\n * Type guard to check if a value is a Duration.\n */\nexport function isDuration(value: unknown): value is Duration {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n value._tag === \"Duration\" &&\n \"millis\" in value &&\n typeof value.millis === \"number\"\n );\n}\n\n// =============================================================================\n// Formatting\n// =============================================================================\n\n/**\n * Format a duration as a human-readable string.\n *\n * @example\n * ```typescript\n * Duration.format(Duration.seconds(90)) // \"1m 30s\"\n * Duration.format(Duration.millis(500)) // \"500ms\"\n * ```\n */\nexport function format(duration: Duration): string {\n const ms = duration.millis;\n\n if (ms === Infinity) return \"∞\";\n if (ms === 0) return \"0ms\";\n\n const days = Math.floor(ms / (24 * 60 * 60 * 1000));\n const hours = Math.floor((ms % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((ms % (60 * 1000)) / 1000);\n const millis = ms % 1000;\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (seconds > 0) parts.push(`${seconds}s`);\n if (millis > 0 && parts.length === 0) parts.push(`${millis}ms`);\n\n return parts.join(\" \") || \"0ms\";\n}\n\n// =============================================================================\n// Parsing\n// =============================================================================\n\n/**\n * Parse a duration from a string like \"100ms\", \"5s\", \"2m\", \"1h\", \"1d\".\n * Returns undefined if parsing fails.\n *\n * @example\n * ```typescript\n * Duration.parse(\"5s\") // Duration.seconds(5)\n * Duration.parse(\"100ms\") // Duration.millis(100)\n * Duration.parse(\"2m\") // Duration.minutes(2)\n * ```\n */\nexport function parse(input: string): Duration | undefined {\n const match = input.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/i);\n if (!match) return undefined;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase();\n\n switch (unit) {\n case \"ms\":\n return millis(value);\n case \"s\":\n return seconds(value);\n case \"m\":\n return minutes(value);\n case \"h\":\n return hours(value);\n case \"d\":\n return days(value);\n default:\n return undefined;\n }\n}\n\n// =============================================================================\n// Namespace Export\n// =============================================================================\n\n/**\n * Duration namespace with all functions for convenient access.\n *\n * @example\n * ```typescript\n * import { Duration } from \"awaitly\";\n *\n * const timeout = Duration.seconds(30);\n * const delay = Duration.millis(100);\n * const total = Duration.add(timeout, delay);\n *\n * console.log(Duration.format(total)); // \"30s 100ms\"\n * ```\n */\nexport const Duration = {\n // Constructors\n millis,\n seconds,\n minutes,\n hours,\n days,\n zero,\n infinity,\n\n // Conversions\n toMillis,\n toSeconds,\n toMinutes,\n toHours,\n toDays,\n\n // Operations\n add,\n subtract,\n multiply,\n divide,\n\n // Comparisons\n lessThan,\n lessThanOrEqual,\n greaterThan,\n greaterThanOrEqual,\n equals,\n min,\n max,\n clamp,\n\n // Predicates\n isZero,\n isInfinite,\n isFinite,\n isDuration,\n\n // Formatting\n format,\n parse,\n} as const;\n\nexport type { Duration as DurationType };\n"],"mappings":"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","names":["millis","ms","seconds","s","minutes","m","hours","h","days","d","zero","infinity","toMillis","duration","toSeconds","toMinutes","toHours","toDays","add","a","b","subtract","multiply","factor","divide","divisor","lessThan","lessThanOrEqual","greaterThan","greaterThanOrEqual","equals","min","max","clamp","minimum","maximum","isZero","isInfinite","isFinite","isDuration","value","format","parts","parse","input","match","Duration"]}
|
package/dist/engine.cjs
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";var qe=Object.defineProperty;var Ut=Object.getOwnPropertyDescriptor;var Wt=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var jt=(t,e)=>{for(var o in e)qe(t,o,{get:e[o],enumerable:!0})},Kt=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of Wt(e))!Nt.call(t,m)&&m!==o&&qe(t,m,{get:()=>e[m],enumerable:!(a=Ut(e,m))||a.enumerable});return t};var Ft=t=>Kt(qe({},"__esModule",{value:!0}),t);var ur={};jt(ur,{createEngine:()=>Mt});module.exports=Ft(ur);var at=require("crypto");var Lt={"step-require-id":"step-require-id","step-no-immediate-execution":"step-no-immediate-execution","step-require-thunk-for-key":"step-require-thunk-for-key","step-no-bare-await":"step-no-bare-await","step-no-try-catch-wrap":"step-no-try-catch-wrap","step-stable-cache-keys":"step-stable-cache-keys","workflow-no-floating":"workflow-no-floating","workflow-options-position":"workflow-options-position","workflow-callback-shape":"workflow-callback-shape","workflow-no-callable-form":"workflow-no-callable-form","workflow-no-dynamic-import":"workflow-no-dynamic-import","result-no-floating":"result-no-floating","result-require-handling":"result-require-handling","result-no-double-wrap":"result-no-double-wrap","result-no-manual-propagation":"result-no-manual-propagation","result-no-direct-ok-err":"result-no-direct-ok-err","error-check-unexpected-first":"error-check-unexpected-first","error-access-cause":"error-access-cause","error-normalize":"error-normalize","error-no-throw-in-deps":"error-no-throw-in-deps","concurrency-no-promise-all":"concurrency-no-promise-all","concurrency-no-promise-race":"concurrency-no-promise-race","concurrency-no-promise-allsettled":"concurrency-no-promise-allsettled","runtime-step-timeout":"runtime-step-timeout","runtime-step-aborted":"runtime-step-aborted","runtime-retry-exhausted":"runtime-retry-exhausted","runtime-rate-limit":"runtime-rate-limit","runtime-circuit-open":"runtime-circuit-open","runtime-unexpected":"runtime-unexpected","runtime-resolver-not-found":"runtime-resolver-not-found","runtime-saga-compensation":"runtime-saga-compensation"};function ut(t){return`https://jagreehal.github.io/awaitly/rules/#${t}`}var cr=Object.keys(Lt);var Ne=class extends Error{_tag};function ge(t,e){return class extends Ne{_tag=t;constructor(o,a){let m=e?.message?e.message(o??{}):t;if(super(m),this.name=t,e?.slug!==void 0){if(!e.hint)throw new TypeError(`TaggedError: 'hint' is required when 'slug' is set (slug: "${e.slug}")`);Object.defineProperty(this,"code",{value:e.slug,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"hint",{value:e.hint,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"docsUrl",{value:ut(e.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),o&&typeof o=="object"){let c;if(e?.slug!==void 0){let{_tag:i,name:$,message:I,stack:S,code:pe,hint:d,docsUrl:re,...G}=o;c=G}else{let{_tag:i,name:$,message:I,stack:S,...pe}=o;c=pe}let g=Object.prototype.hasOwnProperty.call(c,"cause"),R=g?c.cause:void 0;g&&delete c.cause;let L=a?.cause!==void 0;if(g&&L)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,c),g&&(this.cause=R),L&&(this.cause=a?.cause)}else a?.cause!==void 0&&(this.cause=a.cause)}}}Object.defineProperty(ge,Symbol.hasInstance,{value:t=>t instanceof Ne});(m=>{function t(c){return c instanceof Error}m.isError=t;function e(c){return c instanceof Ne}m.isTaggedError=e;function o(c,g){let R=c._tag,L=g[R];return L(c)}m.match=o;function a(c,g,R){let L=c._tag,i=g[L];return i?i(c):R(c)}m.matchPartial=a})(ge||={});var lt=class extends ge("TimeoutError",{slug:"runtime-step-timeout",hint:"Increase the step's timeout option, or check why the upstream operation is slow.",message:e=>e.operation?`TimeoutError: ${e.operation} timed out after ${e.ms}ms`:`TimeoutError: Operation timed out after ${e.ms}ms`}){},ct=class extends ge("RetryExhaustedError",{slug:"runtime-retry-exhausted",hint:"All retry attempts failed. Inspect lastError and decide whether to surface it or compensate.",message:e=>e.operation?`RetryExhaustedError: ${e.operation} failed after ${e.attempts} attempts`:`RetryExhaustedError: Operation failed after ${e.attempts} attempts`}){},pt=class extends ge("RateLimitError",{slug:"runtime-rate-limit",hint:"Wait retryAfterMs before retrying, or apply step.cache to deduplicate calls.",message:e=>e.limiterName?`RateLimitError: Rate limit exceeded for ${e.limiterName}${e.retryAfterMs?`, retry after ${e.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${e.retryAfterMs?`, retry after ${e.retryAfterMs}ms`:""}`}){},dt=class extends ge("CircuitBreakerOpenError",{slug:"runtime-circuit-open",hint:"The circuit is open. Wait for it to half-open or fall back to a degraded path.",message:e=>`CircuitBreakerOpenError: Circuit ${e.circuitName} is ${e.state??"OPEN"}${e.retryAfterMs?`, retry after ${Math.ceil(e.retryAfterMs/1e3)}s`:""}`}){},mt=class extends ge("ValidationError",{message:e=>`ValidationError: Invalid ${e.field} - ${e.reason}`}){},ft=class extends ge("NotFoundError",{message:e=>e.id?`NotFoundError: ${e.resource} with id ${e.id} not found`:`NotFoundError: ${e.resource} not found`}){},Et=class extends ge("UnauthorizedError",{message:e=>e.reason?`UnauthorizedError: ${e.reason}`:e.action&&e.resource?`UnauthorizedError: Not authorized to ${e.action} ${e.resource}`:"UnauthorizedError: Access denied"}){},wt=class extends ge("NetworkError",{message:e=>e.url?`NetworkError: ${e.reason} (${e.url})`:`NetworkError: ${e.reason}`}){},yt=class extends ge("CompensationError",{slug:"runtime-saga-compensation",hint:"A saga compensation step failed. Inspect compensationError and ensure compensation is idempotent.",message:e=>`CompensationError: Failed to compensate step ${e.step}`}){},je=class extends ge("UnexpectedError",{slug:"runtime-unexpected",hint:"An unexpected exception escaped a step. Inspect cause; consider returning a typed Result instead of throwing.",message:e=>`UnexpectedError: ${e.cause instanceof Error?e.cause.message:String(e.cause??"unknown")}`}){};function Vt(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let o=parseFloat(e[1]),a=e[2].toLowerCase();return{_tag:"Duration",millis:o*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[a]??1)}}function $e(t){return new je({cause:t})}function ne(t){return{ok:!0,value:t}}function _(t,e){let o=e?.cause;return{ok:!1,error:t,...o!==void 0?{cause:o}:{}}}var Tt=t=>t instanceof je||typeof t=="object"&&t!==null&&"_tag"in t&&t._tag==="UnexpectedError";function $t(t){if(t==null)return"unknown";if(typeof t=="string")return t.trim()||"unknown";if(typeof t=="object"){let e=t;if(typeof e._tag=="string"){let o=e._tag.trim();if(o)return o}if(typeof e.tag=="string"){let o=e.tag.trim();if(o)return o}if(typeof e.code=="string"){let o=e.code.trim();if(o)return o}else if(typeof e.code=="number")return String(e.code);if(t instanceof Error&&t.name){let o=t.name.trim();if(o)return o}}return"unknown"}function Bt(t,e){if(!(!e||!t))return e[t]}function Ye(t){let{intent:e,domain:o,owner:a,tags:m,stateChanges:c,emits:g,calls:R}=t;if(!e&&!o&&!a&&!m?.length&&!c?.length&&!g?.length&&!R?.length)return;let L={};return e&&(L.intent=e),o&&(L.domain=o),a&&(L.owner=a),m?.length&&(L.tags=m),c?.length&&(L.stateChanges=c),g?.length&&(L.emits=g),R?.length&&(L.calls=R),L}function ke(t,e,o,a,m){let c=$t(t),g=Bt(c,e),R={tag:c,origin:o};return g!==void 0&&(R.classification=g),a!==void 0&&(R.attempt=a),m!==void 0&&(R.cumulativeDurationMs=m),R}var De=Symbol.for("step_timeout_marker");function gt(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:De in t}function Ht(t){if(!(typeof t!="object"||t===null)){if(t.type==="STEP_TIMEOUT"){let e=t;return{timeoutMs:e.timeoutMs,stepName:e.stepName,stepKey:e.stepKey,attempt:e.attempt}}if(De in t)return t[De]}}var ht=Symbol("early-exit");function Oe(t,e){return{[ht]:!0,error:t,meta:e}}function be(t){return typeof t=="object"&&t!==null&&t[ht]===!0}var xt=Symbol("mapper-exception");function Ae(t){return{[xt]:!0,thrown:t}}function qt(t){return typeof t=="object"&&t!==null&&t[xt]===!0}function Je(t,e){let{backoff:o,initialDelay:a,maxDelay:m,jitter:c}=e,g;switch(o){case"fixed":g=a;break;case"linear":g=a*t;break;case"exponential":g=a*Math.pow(2,t-1);break}if(g=Math.min(g,m),c){let R=g*.25*Math.random();g=g+R}return Math.floor(g)}function ze(t){return new Promise(e=>setTimeout(e,t))}var kt=Symbol("timeout"),Le=Symbol("timeout-option");function Jt(t){return typeof t=="object"&&t!==null&&t[Le]===!0}async function zt(t,e,o,a){let m=new AbortController,c=e.onTimeout??"error",g=()=>typeof c=="function"?c({name:o.name,key:o.key,ms:e.ms}):e.error??{type:"STEP_TIMEOUT",stepName:o.name,stepKey:o.key,timeoutMs:e.ms,attempt:o.attempt},R;a?.aborted&&m.abort(a.reason);let L;a&&!a.aborted&&(L=()=>m.abort(a.reason),a.addEventListener("abort",L,{once:!0}));let i=new Promise((I,S)=>{R=setTimeout(()=>{if(c!=="disconnect"&&m.abort(),c==="option"){S({[Le]:!0,ms:e.ms});return}S({[kt]:!0,error:g()})},e.ms)}),$;e.signal?$=Promise.resolve(t(m.signal)):$=Promise.resolve(t());try{return await Promise.race([$,i])}catch(I){if(typeof I=="object"&&I!==null&&I[Le]===!0)throw{[Le]:!0,ms:e.ms};if(typeof I=="object"&&I!==null&&I[kt]===!0){c==="disconnect"&&$.catch(()=>{});let S=I.error;if(typeof S=="object"&&S!==null&&S.type!=="STEP_TIMEOUT"){let pe={timeoutMs:e.ms,stepName:o.name,stepKey:o.key,attempt:o.attempt};De in S?S[De]=pe:Object.defineProperty(S,De,{value:pe,enumerable:!1,writable:!0,configurable:!1})}throw S}throw I}finally{clearTimeout(R),L&&a&&a.removeEventListener("abort",L)}}var _e={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function Ve(t,e){let{onError:o,onEvent:a,catchUnexpected:m,workflowId:c,workflowName:g,context:R,_workflowSignal:L}=e&&typeof e=="object"?e:{},i=c??crypto.randomUUID(),$=m??$e,I=[],S=0,pe=f=>f??`step_${++S}`,d=f=>{let ue=f.context!==void 0||R===void 0?f:{...f,context:R},Z=g!==void 0&&ue.workflowName===void 0?{...ue,workflowName:g}:ue;if(Z.type==="step_success"){let q=Z.stepId;for(let le=I.length-1;le>=0;le--){let oe=I[le];if(oe.type==="race"&&!oe.winnerId){oe.winnerId=q;break}}}a?.(Z,R)},re=Oe,G=f=>be(f),h=(f,ue)=>f,F=f=>typeof f=="function"?!1:!!(f&&typeof f=="object"&&"ok"in f||f&&typeof f=="object"&&"then"in f&&typeof f.then=="function");try{let ue=function(p){let C={};for(let[s,r]of Object.entries(p))if(typeof r=="function")C[s]=r;else if(r&&typeof r=="object"&&"fn"in r)C[s]=r.fn;else throw new TypeError(`step.all: operation "${s}" must be a function or { fn, errors? } object`);return C},Z=function(p,C){let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),n=!1;I.push({scopeId:s,type:"parallel"});let E=()=>{if(n)return;n=!0;let x=I.findIndex(v=>v.scopeId===s);x!==-1&&I.splice(x,1),d({type:"scope_end",workflowId:i,scopeId:s,ts:Date.now(),durationMs:performance.now()-r})};d({type:"scope_start",workflowId:i,scopeId:s,scopeType:"parallel",name:p,ts:Date.now()});try{let x=await C();if(E(),!x.ok)throw o?.(x.error,p,R),re(x.error,{origin:"result",resultCause:x.cause});return x.value}catch(x){throw E(),x}})()},q=function(p,C){let s=Object.keys(p),r=C.name??`Parallel(${s.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let E=performance.now(),x=!1;I.push({scopeId:n,type:"parallel"});let v=()=>{if(x)return;x=!0;let l=I.findIndex(D=>D.scopeId===n);l!==-1&&I.splice(l,1),d({type:"scope_end",workflowId:i,scopeId:n,ts:Date.now(),durationMs:performance.now()-E})};d({type:"scope_start",workflowId:i,scopeId:n,scopeType:"parallel",name:r,ts:Date.now()});try{let l=await new Promise(M=>{if(s.length===0){M([]);return}let B=!1,J=s.length,U=new Array(s.length);for(let X=0;X<s.length;X++){let j=s[X],z=X;Promise.resolve(p[j]()).catch(W=>_({type:"PROMISE_REJECTED",cause:W},{cause:{type:"PROMISE_REJECTION",reason:W}})).then(W=>{if(!B){if(!W.ok){B=!0,M([{key:j,result:W}]);return}U[z]={key:j,result:W},J--,J===0&&M(U)}})}});v();let D={};for(let{key:M,result:B}of l){if(!B.ok)throw o?.(B.error,M,R),re(B.error,{origin:"result",resultCause:B.cause});D[M]=B.value}return D}catch(l){throw v(),l}})()};var ie=ue,fe=Z,ee=q;let f=(p,C,s)=>(async()=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let r=s??{},n=Ye(r),E=p,x=r.key??p,v=r.key??p,{description:l,retry:D,timeout:M}=r,B=pe(x),J=a,U=J?performance.now():0,j=F(C)?()=>C:C,W={attempts:Math.max(1,D?.attempts??1),backoff:D?.backoff??_e.backoff,initialDelay:D?.initialDelay??_e.initialDelay,maxDelay:D?.maxDelay??_e.maxDelay,jitter:D?.jitter??_e.jitter,shouldRetry:D?.shouldRetry??_e.shouldRetry,onRetry:D?.onRetry??_e.onRetry};a&&d({type:"step_start",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),...n&&{metadata:n}});let Te;for(let u=1;u<=W.attempts;u++){let y=J?performance.now():0;try{let w;if(M?w=await zt(j,M,{name:E,key:x,attempt:u},L):w=await j(),w.ok){let Y=performance.now()-U;return d({type:"step_success",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),durationMs:Y,...n&&{metadata:n}}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:E,description:l,ts:Date.now(),durationMs:Y,result:w,...n&&{metadata:n}}),w.value}if(Te=w,u<W.attempts&&W.shouldRetry(w.error,u)){let Y=Je(u,W);d({type:"step_retry",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),attempt:u+1,maxAttempts:W.attempts,delayMs:Y,error:w.error,...n&&{metadata:n},diagnostics:ke(w.error,r.errorMeta,"result",u,performance.now()-U)}),W.onRetry(w.error,u,Y),await ze(Y);continue}W.attempts>1&&d({type:"step_retries_exhausted",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),durationMs:performance.now()-U,attempts:u,lastError:w.error,...n&&{metadata:n},diagnostics:ke(w.error,r.errorMeta,"result",u,performance.now()-U)});break}catch(w){let Y=performance.now()-y;if(Jt(w)){let b=w.ms;d({type:"step_timeout",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),timeoutMs:b,attempt:u,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u)}),d({type:"step_success",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),durationMs:performance.now()-U,...n&&{metadata:n}}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:E,description:l,ts:Date.now(),durationMs:performance.now()-U,result:ne(void 0),...n&&{metadata:n}});return}if(G(w))throw d({type:"step_aborted",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),durationMs:Y,...n&&{metadata:n}}),w;if(gt(w)){let b=Ht(w),P=M?.ms??b?.timeoutMs??0;if(d({type:"step_timeout",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),timeoutMs:P,attempt:u,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u)}),u<W.attempts&&W.shouldRetry(w,u)){let K=Je(u,W);d({type:"step_retry",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),attempt:u+1,maxAttempts:W.attempts,delayMs:K,error:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u,performance.now()-U)}),W.onRetry(w,u,K),await ze(K);continue}W.attempts>1&&d({type:"step_retries_exhausted",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),durationMs:performance.now()-U,attempts:u,lastError:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u,performance.now()-U)});let O=performance.now()-U;throw d({type:"step_error",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),durationMs:O,error:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"timeout",u,O)}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:E,description:l,ts:Date.now(),durationMs:O,result:_(w,{cause:w}),meta:{origin:"throw",thrown:w},...n&&{metadata:n}}),o?.(w,E,R),re(w,{origin:"throw",thrown:w})}if(u<W.attempts&&W.shouldRetry(w,u)){let b=Je(u,W);d({type:"step_retry",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),attempt:u+1,maxAttempts:W.attempts,delayMs:b,error:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"throw",u,performance.now()-U)}),W.onRetry(w,u,b),await ze(b);continue}W.attempts>1&&!gt(w)&&d({type:"step_retries_exhausted",workflowId:i,stepId:B,stepKey:x,name:E,ts:Date.now(),durationMs:performance.now()-U,attempts:u,lastError:w,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"throw",u,performance.now()-U)});let k=performance.now()-U,A;try{A=$(w)}catch(b){throw Ae(b)}throw d({type:"step_error",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),durationMs:k,error:A,...n&&{metadata:n},diagnostics:ke(w,r.errorMeta,"throw",u,k)}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:E,description:l,ts:Date.now(),durationMs:k,result:_(A,{cause:w}),meta:{origin:"throw",thrown:w},...n&&{metadata:n}}),o?.(A,E,R),re(A,{origin:"throw",thrown:w})}}let Re=Te,de=performance.now()-U,xe=h(Re.error,{origin:"result",resultCause:Re.cause});throw d({type:"step_error",workflowId:i,stepId:B,stepKey:x,name:E,description:l,ts:Date.now(),durationMs:de,error:xe,...n&&{metadata:n},diagnostics:ke(Re.error,r.errorMeta,"result",W.attempts,de)}),v&&d({type:"step_complete",workflowId:i,stepKey:v,name:E,description:l,ts:Date.now(),durationMs:de,result:Re,meta:{origin:"result",resultCause:Re.cause},...n&&{metadata:n}}),o?.(xe,E,R),re(xe,{origin:"result",resultCause:Re.cause})})();f.try=(p,C,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let r="error"in s?()=>s.error:s.onError;if(s.retry||s.timeout)return f.retry(p,async()=>{try{return ne(await C())}catch(l){return _(r(l),{cause:l})}},{attempts:s.retry?.attempts??1,...s.retry??{},key:s.key,timeout:s.timeout});let n=s.key??p,E=p,x=p,v=a;return(async()=>{let l=v?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:x,stepKey:n,name:E,ts:Date.now()});try{let D=await C(),M=performance.now()-l;return d({type:"step_success",workflowId:i,stepId:x,stepKey:n,name:E,ts:Date.now(),durationMs:M}),n&&d({type:"step_complete",workflowId:i,stepKey:n,name:E,ts:Date.now(),durationMs:M,result:ne(D)}),D}catch(D){let M=r(D),B=performance.now()-l,J=h(M,{origin:"throw",thrown:D});throw d({type:"step_error",workflowId:i,stepId:x,stepKey:n,name:E,ts:Date.now(),durationMs:B,error:J}),n&&d({type:"step_complete",workflowId:i,stepKey:n,name:E,ts:Date.now(),durationMs:B,result:_(M,{cause:D}),meta:{origin:"throw",thrown:D}}),o?.(J,E,R),re(J,{origin:"throw",thrown:D})}})()},f.fromResult=(p,C,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let r=s.key??p,n=p,E=p,x="error"in s?()=>s.error:s.onError,v=a;return(async()=>{let l=v?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now()});let D=await C();if(D.ok){let M=performance.now()-l;return d({type:"step_success",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:M}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:M,result:ne(D.value)}),D.value}else{let M=x(D.error),B=performance.now()-l,J=h(M,{origin:"result",resultCause:D.error});throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:B,error:J}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:B,result:_(M,{cause:D.error}),meta:{origin:"result",resultCause:D.error}}),o?.(J,n,R),re(J,{origin:"result",resultCause:D.error})}})()},f.fromNullable=(p,C,s,r)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return f(p,async()=>{let n=await C();return n!=null?ne(n):_(s())},r)},f.retry=(p,C,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return f(p,C,{key:s.key??p,retry:{attempts:s.attempts,backoff:s.backoff,initialDelay:s.initialDelay,maxDelay:s.maxDelay,jitter:s.jitter,shouldRetry:s.shouldRetry,onRetry:s.onRetry},timeout:s.timeout})},f.withTimeout=(p,C,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return f(p,C,{key:s.key??p,timeout:s})},f.sleep=(p,C,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let r=typeof C=="string"?Vt(C):C;if(!r)throw new Error(`step.sleep: invalid duration '${C}'`);let n=r.millis,E=s?.signal;return f(p,async()=>{if(L?.aborted||E?.aborted){let x=new Error("Sleep aborted");throw x.name="AbortError",x}return new Promise((x,v)=>{let l={timeoutId:void 0},D=()=>{l.timeoutId&&clearTimeout(l.timeoutId);let M=new Error("Sleep aborted");M.name="AbortError",v(M)};L?.addEventListener("abort",D,{once:!0}),E?.addEventListener("abort",D,{once:!0}),l.timeoutId=setTimeout(()=>{L?.removeEventListener("abort",D),E?.removeEventListener("abort",D),x(ne(void 0))},n)})},{key:s?.key??p,description:s?.description})},f.all=((...p)=>{if(typeof p[0]!="string")throw new TypeError("step.all(name, ...): first argument must be a string (step name). Example: step.all('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let C=p[0],s=p[1];if(typeof s=="function")return Z(C,s);if(s&&typeof s=="object"&&!Array.isArray(s)){let n=ue(s);return q(n,{name:C})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),f.race=(p,C)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),n=!1,E={scopeId:s,type:"race",winnerId:void 0};I.push(E);let x=()=>{if(n)return;n=!0;let v=I.findIndex(l=>l.scopeId===s);v!==-1&&I.splice(v,1),d({type:"scope_end",workflowId:i,scopeId:s,ts:Date.now(),durationMs:performance.now()-r,winnerId:E.winnerId})};d({type:"scope_start",workflowId:i,scopeId:s,scopeType:"race",name:p,ts:Date.now()});try{let v=await C();if(x(),!v.ok)throw o?.(v.error,p,R),re(v.error,{origin:"result",resultCause:v.cause});return v.value}catch(v){throw x(),v}})()},f.if=(p,C,s)=>s(),f.label=f.if,f.branch=async(p,C)=>{let{condition:s,then:r,else:n}=C;if(s())return await r();if(n)return await n()},f.arm=(p,C)=>({fn:p,errors:C}),f.forEach=async(p,C,s)=>{let r=[],n=s.maxIterations,E=0,x="run"in s,v=Symbol.asyncIterator in C?C:(async function*(){yield*C})();for await(let l of v){if(n!==void 0&&E>=n)break;let D;x?D=await s.run(l,E):D=await s.item.handler(l,E,f),r.push(D),E++}return r},f.item=p=>({__forEachItemHandler:!0,handler:p}),f.dep=(p,C)=>C,f.workflow=(p,C,s)=>f(p,C,s),f.map=async(p,C,s,r)=>{let n=r?.concurrency??C.length;return f(p,()=>n>=C.length?Rt(C.map((E,x)=>s(E,x))):(async()=>{let E=[];for(let x=0;x<C.length;x+=n){let v=C.slice(x,x+n),l=await Rt(v.map((D,M)=>s(D,x+M)));if(!l.ok)return l;E.push(...l.value)}return ne(E)})(),{key:r?.key})},f.withFallback=(p,C,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let r=s.key??p,n=p,E=pe(r),x=a;return(async()=>{let v=x?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now()});let l;try{l=await C()}catch(U){if(G(U))throw d({type:"step_aborted",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-v}),U;let X;try{X=$(U)}catch(z){throw Ae(z)}if(s.on!==void 0&&s.on!==X){let z=performance.now()-v;throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:z,error:X}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:z,result:_(X,{cause:U}),meta:{origin:"throw",thrown:U}}),o?.(X,n,R),re(X,{origin:"throw",thrown:U})}let j;try{j=await s.fallback()}catch(z){if(G(z))throw d({type:"step_aborted",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-v}),z;let W;try{W=$(z)}catch(Re){throw Ae(Re)}let Te=performance.now()-v;throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:Te,error:W}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:Te,result:_(W,{cause:z}),meta:{origin:"throw",thrown:z}}),o?.(W,n,R),re(W,{origin:"throw",thrown:z})}if(j.ok){let z=performance.now()-v;return d({type:"step_success",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:z}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:z,result:j,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(X)}}),j.value}else{let z=performance.now()-v,W=h(j.error,{origin:"result",resultCause:j.cause});throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:z,error:W}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:z,result:j,meta:{origin:"result",resultCause:j.cause}}),o?.(W,n,R),re(W,{origin:"result",resultCause:j.cause})}}if(l.ok){let U=performance.now()-v;return d({type:"step_success",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:U}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:U,result:l}),l.value}let D=l.error;if(s.on!==void 0&&s.on!==D){let U=performance.now()-v,X=h(D,{origin:"result",resultCause:l.cause});throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:U,error:X}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:U,result:l,meta:{origin:"result",resultCause:l.cause}}),o?.(X,n,R),re(X,{origin:"result",resultCause:l.cause})}let M;try{M=await s.fallback()}catch(U){if(G(U))throw d({type:"step_aborted",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-v}),U;let X;try{X=$(U)}catch(z){throw Ae(z)}let j=performance.now()-v;throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:j,error:X}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:j,result:_(X,{cause:U}),meta:{origin:"throw",thrown:U}}),o?.(X,n,R),re(X,{origin:"throw",thrown:U})}if(M.ok){let U=performance.now()-v;return d({type:"step_success",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:U}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:U,result:M,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(D)}}),M.value}let B=performance.now()-v,J=h(M.error,{origin:"result",resultCause:M.cause});throw d({type:"step_error",workflowId:i,stepId:E,stepKey:r,name:n,ts:Date.now(),durationMs:B,error:J}),r&&d({type:"step_complete",workflowId:i,stepKey:r,name:n,ts:Date.now(),durationMs:B,result:M,meta:{origin:"result",resultCause:M.cause}}),o?.(J,n,R),re(J,{origin:"result",resultCause:M.cause})})()},f.withResource=(p,C)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let s=p,r=p,n=pe(s),E=a;return(async()=>{let x=E?performance.now():0;a&&d({type:"step_start",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now()});let v;try{v=await C.acquire()}catch(j){if(G(j))throw d({type:"step_aborted",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now(),durationMs:performance.now()-x}),j;let z;try{z=$(j)}catch(Te){throw Ae(Te)}let W=performance.now()-x;throw d({type:"step_error",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now(),durationMs:W,error:z}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:r,ts:Date.now(),durationMs:W,result:_(z,{cause:j}),meta:{origin:"throw",thrown:j}}),o?.(z,r,R),re(z,{origin:"throw",thrown:j})}if(!v.ok){let j=performance.now()-x,z=h(v.error,{origin:"result",resultCause:v.cause});throw d({type:"step_error",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now(),durationMs:j,error:z}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:r,ts:Date.now(),durationMs:j,result:v,meta:{origin:"result",resultCause:v.cause}}),o?.(z,r,R),re(z,{origin:"result",resultCause:v.cause})}let l=v.value,D,M,B=!1;try{D=await C.use(l)}catch(j){if(G(j)){try{await C.release(l)}catch(z){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,z)}throw j}M=j,B=!0}try{await C.release(l)}catch(j){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,j)}if(B){let j;try{j=$(M)}catch(W){throw Ae(W)}let z=performance.now()-x;throw d({type:"step_error",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now(),durationMs:z,error:j}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:r,ts:Date.now(),durationMs:z,result:_(j,{cause:M}),meta:{origin:"throw",thrown:M}}),o?.(j,r,R),re(j,{origin:"throw",thrown:M})}let J=D;if(J.ok){let j=performance.now()-x;return d({type:"step_success",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now(),durationMs:j}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:r,ts:Date.now(),durationMs:j,result:J}),J.value}let U=performance.now()-x,X=h(J.error,{origin:"result",resultCause:J.cause});throw d({type:"step_error",workflowId:i,stepId:n,stepKey:s,name:r,ts:Date.now(),durationMs:U,error:X}),s&&d({type:"step_complete",workflowId:i,stepKey:s,name:r,ts:Date.now(),durationMs:U,result:J,meta:{origin:"result",resultCause:J.cause}}),o?.(X,r,R),re(X,{origin:"result",resultCause:J.cause})})()};let oe=await t({step:f});if(process.env.NODE_ENV!=="production"&&oe!==null&&typeof oe=="object"&&"ok"in oe&&typeof oe.ok=="boolean"){let p=oe;(p.ok===!0&&"value"in p||p.ok===!1&&"error"in p)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
|
|
2
|
-
|
|
3
|
-
Incorrect: return ok({ data });
|
|
4
|
-
Correct: return { data };
|
|
5
|
-
|
|
6
|
-
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return ne(oe)}catch(f){if(qt(f))throw f.thrown;if(G(f)){let Z=f.meta.origin==="throw"?f.meta.thrown:f.meta.origin==="result"?f.meta.resultCause:void 0;return _(f.error,{cause:Z})}let ue=$(f);return o?.(ue,"unexpected",R),_(ue,{cause:f})}}Ve.strict=(t,e)=>Ve(t,e);async function Rt(t){return t.length===0?ne([]):new Promise(e=>{let o=!1,a=t.length,m=new Array(t.length);for(let c=0;c<t.length;c++){let g=c;Promise.resolve(t[g]).catch(R=>_({type:"PROMISE_REJECTED",cause:R},{cause:{type:"PROMISE_REJECTION",reason:R}})).then(R=>{if(!o){if(!R.ok){o=!0,e(R);return}m[g]=R.value,a--,a===0&&e(ne(m))}})}})}function St(t){return t.type==="step_complete"}function Xe(t){return typeof t=="object"&&t!==null&&t.type==="WORKFLOW_CANCELLED"}var ve=class extends Error{constructor(o,a=[]){super(o);this.errors=a;this.name="SnapshotFormatError"}};var Pe=class extends Error{constructor(o,a,m){super(o);this.stepId=a;this.originalError=m;this.name="SnapshotDecodeError"}};function Yt(t){let e=[];if(typeof t!="object"||t===null)return{valid:!1,errors:["Snapshot must be an object"]};let o=t;if("formatVersion"in o?o.formatVersion!==1&&e.push(`Invalid formatVersion: expected 1, got ${o.formatVersion}`):e.push("Missing required field: formatVersion"),!("steps"in o))e.push("Missing required field: steps");else if(typeof o.steps!="object"||o.steps===null)e.push("steps must be an object");else{let a=o.steps;for(let[m,c]of Object.entries(a)){if(typeof c!="object"||c===null){e.push(`steps["${m}"] must be an object`);continue}let g=c;"ok"in g?typeof g.ok!="boolean"?e.push(`steps["${m}"].ok must be a boolean`):g.ok===!1&&("error"in g||e.push(`steps["${m}"] is error result but missing error field`),"cause"in g||e.push(`steps["${m}"] is error result but missing cause field`)):e.push(`steps["${m}"] missing required field: ok`)}}if(!("execution"in o))e.push("Missing required field: execution");else if(typeof o.execution!="object"||o.execution===null)e.push("execution must be an object");else{let a=o.execution;"status"in a?["running","completed","failed"].includes(a.status)||e.push("execution.status must be one of: running, completed, failed"):e.push("execution missing required field: status"),"lastUpdated"in a?typeof a.lastUpdated!="string"&&e.push("execution.lastUpdated must be a string (ISO timestamp)"):e.push("execution missing required field: lastUpdated")}return e.length>0?{valid:!1,errors:e}:{valid:!0,snapshot:t}}function bt(t){let e=Yt(t);if(!e.valid)throw new ve(`Invalid snapshot format: ${e.errors[0]}`,e.errors);return e.snapshot}function vt(t,e){let o=Object.create(null);for(let[g,R]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,g)&&(o[g]=R);for(let[g,R]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,g)&&(o[g]=R);let a=t.metadata||e.metadata?{...t.metadata,...e.metadata}:void 0,c=[...(t.warnings||[]).filter(g=>!Object.prototype.hasOwnProperty.call(e.steps,g.stepId)),...e.warnings||[]];return{formatVersion:1,steps:o,execution:{...e.execution},metadata:a,warnings:c.length>0?c:void 0}}var Ct=1e3;function Ge(t){let e={type:"error",name:t.name,message:t.message};t.stack&&(e.stack=t.stack);let o=t;return o.cause!==void 0&&(o.cause instanceof Error?e.cause=Ge(o.cause):e.cause=Ze(o.cause)),e}function Ze(t){let e,o=!1;try{e=String(t),e.length>Ct&&(e=e.slice(0,Ct),o=!0)}catch{e="[unable to convert to string]"}let a=t===null?"null":typeof t=="object"?t.constructor?.name??"Object":typeof t,m;try{let g=JSON.stringify(t);g!==void 0&&(m=JSON.parse(g))}catch{}let c={type:"thrown",originalType:a,stringRepresentation:e};return m!==void 0&&(c.value=m),o&&(c.truncated=!0),c}function Qe(t){if(t.type==="error"){let e=new Error(t.message);return e.name=t.name,t.stack&&(e.stack=t.stack),t.cause&&(e.cause=Qe(t.cause)),e}return t.value!==void 0?t.value:t.stringRepresentation}function Xt(t){return typeof t=="object"&&t!==null&&t.__cachedMeta===!0}function Ce(t,e,o){return _(t,{cause:{__cachedMeta:!0,originalCause:o,meta:e}})}function Ke(t){return Xt(t)?t.meta:{origin:"result",resultCause:t}}function Fe(){let t=new Map;return{handleEvent:e=>{St(e)&&t.set(e.stepKey,{result:e.result,meta:e.meta})},getResumeState:()=>({steps:new Map(t)}),clear:()=>t.clear()}}var Gt="STREAM_WRITE_ERROR",Zt="STREAM_READ_ERROR",Qt="STREAM_CLOSE_ERROR";var er="STREAM_ENDED";function Be(t,e,o){return{type:Gt,reason:t,message:e,...o!==void 0?{cause:o}:{}}}function et(t,e,o){return{type:Zt,reason:t,message:e,...o!==void 0?{cause:o}:{}}}function tt(t,e,o){return{type:Qt,reason:t,message:e,...o!==void 0?{cause:o}:{}}}function He(t){return{type:er,finalPosition:t}}function At(t={}){let e=t.highWaterMark??16,o=t.lowWaterMark??Math.floor(e/2),a=t.onStateChange,m="flowing",c=0,g=[];function R(i){if(m!==i&&(m=i,a?.(i),i==="flowing"&&g.length>0)){let $=g;g=[];for(let I of $)I()}}function L(){m==="flowing"&&c>=e?R("paused"):m==="paused"&&c<=o&&R("flowing")}return{get state(){return m},get bufferedCount(){return c},get highWaterMark(){return e},get lowWaterMark(){return o},increment(){c++,L()},decrement(){c>0&&(c--,L())},setCount(i){c=Math.max(0,i),L()},waitForDrain(){return m==="flowing"?Promise.resolve():new Promise(i=>{g.push(i)})},reset(){c=0,g=[],R("flowing")}}}function tr(t){return{_tag:"Duration",millis:t}}function rr(t){return{_tag:"Duration",millis:t*1e3}}function nr(t){return{_tag:"Duration",millis:t*60*1e3}}function or(t){return{_tag:"Duration",millis:t*60*60*1e3}}function sr(t){return{_tag:"Duration",millis:t*24*60*60*1e3}}function _t(t){return t.millis}function Dt(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let o=parseFloat(e[1]);switch(e[2].toLowerCase()){case"ms":return tr(o);case"s":return rr(o);case"m":return nr(o);case"h":return or(o);case"d":return sr(o);default:return}}async function Ot(t,e){let o=t["~standard"].validate(e),a=o instanceof Promise?await o:o;return a.issues?_({type:"INPUT_VALIDATION_ERROR",issues:a.issues.map(m=>({message:m.message,path:m.path?.map(c=>typeof c=="object"?c.key:c)})),message:`Input validation failed: ${a.issues.map(m=>m.message).join(", ")}`}):ne(a.value)}function rt(t,e){let o=a=>((...m)=>{let c=m.at(-1),g=m.length>0&&typeof c=="object"&&c!==null&&!Array.isArray(c)&&typeof c!="function",R=g?c:void 0,L=g?m.slice(0,-1):m,i={...e,...R?.deps??{}},$=R?{...R,deps:i}:{deps:i};return t[a](...L,$)});return{run:o("run"),runWithState:o("runWithState"),withDeps(a){return rt(t,{...e,...a})}}}function nt(t,e,o){if(typeof t!="string"||t.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let a=e??{},m=o;async function c(i,$,I){let S=i??crypto.randomUUID(),pe=I?.deps?{...a,...I.deps}:a,d=[],re=I?.createContext??m?.createContext,G=re?await re():void 0,h=I?.signal??m?.signal,F=I?.onEvent??m?.onEvent,ie=I?.onError??m?.onError,fe=I?.shouldRun??m?.shouldRun,ee=I?.onBeforeStart??m?.onBeforeStart,f=I?.onAfterStep??m?.onAfterStep,ue=I?.resumeState??m?.resumeState,Z=m?.catchUnexpected??$e,q={},le=(I?.devWarnings??m?.devWarnings)===!0&&process.env.NODE_ENV!=="production",oe=new Set,p=new Set,C={workflowId:S,onEvent:F,context:G!==void 0?G:void 0,signal:h,input:{},ref:u=>q[u],set:(u,y)=>{le&&!oe.has(u)&&(oe.add(u),console.warn(`awaitly: ctx.set('${u}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${u}' }) instead.`)),q[u]=y},get:u=>(le&&!p.has(u)&&(p.add(u),console.warn(`awaitly: ctx.get('${u}') is deprecated for static analysis. Use ctx.ref('${u}') instead for tracked dependencies.`)),q[u])},s=u=>{let y=u.context!==void 0||G===void 0?u:{...u,context:G},w=y.workflowName===void 0?{...y,workflowName:t}:y;F?.(w,G)},r=(u,y)=>{let w={type:"WORKFLOW_CANCELLED",reason:u,lastStepKey:y};return _(Z(w),{cause:w})};if(h?.aborted){let u=typeof h.reason=="string"?h.reason:h.reason instanceof Error?h.reason.message:void 0;return s({type:"workflow_cancelled",workflowId:S,ts:Date.now(),durationMs:0,reason:u}),r(u)}if(fe){let u=performance.now();try{let y=await fe(S,G),w=performance.now()-u;if(s({type:"hook_should_run",workflowId:S,ts:Date.now(),durationMs:w,result:y,skipped:!y}),!y){let Y=new Error("Workflow skipped by shouldRun hook");return _(Z(Y),{cause:Y})}}catch(y){let w=performance.now()-u;return s({type:"hook_should_run_error",workflowId:S,ts:Date.now(),durationMs:w,error:y}),_(Z(y),{cause:y})}}if(ee){let u=performance.now();try{let y=await ee(S,G),w=performance.now()-u;if(s({type:"hook_before_start",workflowId:S,ts:Date.now(),durationMs:w,result:y,skipped:!y}),!y){let Y=new Error("Workflow skipped by onBeforeStart hook");return _(Z(Y),{cause:Y})}}catch(y){let w=performance.now()-u;return s({type:"hook_before_start_error",workflowId:S,ts:Date.now(),durationMs:w,error:y}),_(Z(y),{cause:y})}}let n=m?.inputSchema,E=m?.input;if(n){let u=await Ot(n,E);if(!u.ok)return _(u.error);C.input=u.value}else E!==void 0&&(C.input=E);let x=Date.now(),v=performance.now();s({type:"workflow_start",workflowId:S,ts:x});let l=I?.cache??m?.cache,D=I?.streamStore??m?.streamStore;if(ue&&!l&&(l=new Map),ue&&l){let u=typeof ue=="function"?await ue():ue;u.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof u.steps}). This usually happens when state is serialized with JSON.stringify() directly.
|
|
7
|
-
Use stringifyState() and parseState() from 'awaitly/persistence' instead:
|
|
8
|
-
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
9
|
-
const json = stringifyState(state); // Save this
|
|
10
|
-
const restored = parseState(json); // Load this`),typeof u.steps=="object"&&u.steps!==null&&(u.steps=new Map(Object.entries(u.steps))));for(let[y,w]of u.steps){let{result:Y,meta:k}=w;if(Y.ok)l.set(y,Y);else{let A=k??{origin:"result",resultCause:Y.cause};l.set(y,Ce(Y.error,A,Y.cause))}}}let M=I?.snapshot??m?.snapshot,B=m?.serialization;if(M&&!ue){l||(l=new Map);let u=M,y=B?.decode;for(let[w,Y]of Object.entries(u.steps))if(Object.prototype.hasOwnProperty.call(u.steps,w))try{if(Y.ok){let k=y?y(Y.value):Y.value;l.set(w,ne(k))}else{let k=y?y(Y.error):Y.error,A=Qe(Y.cause),b=Y.meta?.origin==="throw"?{origin:"throw",thrown:A}:{origin:"result",resultCause:A};l.set(w,Ce(k,b,A))}}catch(k){throw new Pe(`Failed to decode step "${w}": ${k instanceof Error?k.message:String(k)}`,w,k instanceof Error?k:void 0)}}let J=!1,U,X,j=()=>{J=!0,U=typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0};h&&!h.aborted&&h.addEventListener("abort",j,{once:!0});let z=()=>{if(J||h?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:U??(typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0),lastStepKey:X}},W=async(u,y,w)=>{if(!f)return;let Y=performance.now();try{await f(u,y,S,G);let k=performance.now()-Y;s({type:"hook_after_step",workflowId:S,stepKey:u,ts:Date.now(),durationMs:k})}catch(k){let A=performance.now()-Y;throw s({type:"hook_after_step_error",workflowId:S,stepKey:u,ts:Date.now(),durationMs:A,error:k}),k}},Te=u=>{let y=async(k,A,b)=>{if(typeof k!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let P=k,O=b??{},K=P,T=Object.prototype.hasOwnProperty.call(O,"key")?O.key:P,{ttl:V,out:se}=O;z();let te=Ye(O);if(T&&l&&l.has(T)){s({type:"step_cache_hit",workflowId:S,stepKey:T,name:K,ts:Date.now(),...te&&{metadata:te}});let N=l.get(T);if(N.ok)return X=T,se&&(q[se]=N.value),N.value;let H=Ke(N.cause);throw Oe(N.error,H)}T&&l&&s({type:"step_cache_miss",workflowId:S,stepKey:T,name:K,ts:Date.now(),...te&&{metadata:te}});try{let N=await u(P,A,O);return se&&(q[se]=N),O.compensate&&d.push({stepName:K,value:N,compensate:O.compensate}),T&&(X=T,l&&l.set(T,ne(N),V?{ttl:V}:void 0),await W(T,ne(N))),N}catch(N){if(T&&be(N)){let H=N,me=H.meta.origin==="result"?H.meta.resultCause:H.meta.origin==="throw"?H.meta.thrown:void 0,Q=Ce(H.error,H.meta,me);l&&l.set(T,Q,V?{ttl:V}:void 0),await W(T,Q,H.meta)}throw N}};y.try=async(k,A,b)=>{let{ttl:P}=b,O=b.key??k,K=k;if(l&&l.has(O)){s({type:"step_cache_hit",workflowId:S,stepKey:O,name:K,ts:Date.now()});let T=l.get(O);if(T.ok)return T.value;let V=Ke(T.cause);throw Oe(T.error,V)}l&&s({type:"step_cache_miss",workflowId:S,stepKey:O,name:K,ts:Date.now()});try{let T=await u.try(k,A,{...b,key:O});return b.compensate&&d.push({stepName:K,value:T,compensate:b.compensate}),l&&l.set(O,ne(T),P?{ttl:P}:void 0),await W(O,ne(T)),T}catch(T){if(be(T)){let V=T,se=V.meta.origin==="result"?V.meta.resultCause:V.meta.origin==="throw"?V.meta.thrown:void 0,te=Ce(V.error,V.meta,se);l&&l.set(O,te,P?{ttl:P}:void 0),await W(O,te,V.meta)}throw T}},y.fromResult=async(k,A,b)=>{let{ttl:P}=b,O=b.key??k,K=k;if(l&&l.has(O)){s({type:"step_cache_hit",workflowId:S,stepKey:O,name:K,ts:Date.now()});let T=l.get(O);if(T.ok)return T.value;let V=Ke(T.cause);throw Oe(T.error,V)}l&&s({type:"step_cache_miss",workflowId:S,stepKey:O,name:K,ts:Date.now()});try{let T=await u.fromResult(k,A,{...b,key:O});return l&&l.set(O,ne(T),P?{ttl:P}:void 0),await W(O,ne(T)),T}catch(T){if(be(T)){let V=T,se=V.meta.origin==="result"?V.meta.resultCause:V.meta.origin==="throw"?V.meta.thrown:void 0,te=Ce(V.error,V.meta,se);l&&l.set(O,te,P?{ttl:P}:void 0),await W(O,te,V.meta)}throw T}},y.race=u.race,y.withFallback=async(k,A,b)=>{let P=b.key??k,O=k;if(l&&l.has(P)){s({type:"step_cache_hit",workflowId:S,stepKey:P,name:O,ts:Date.now()});let K=l.get(P);if(K.ok)return K.value;let T=Ke(K.cause);throw Oe(K.error,T)}l&&s({type:"step_cache_miss",workflowId:S,stepKey:P,name:O,ts:Date.now()});try{let K=await u.withFallback(k,A,b);return l&&l.set(P,ne(K)),await W(P,ne(K)),K}catch(K){if(be(K)){let T=K,V=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,se=Ce(T.error,T.meta,V);l&&l.set(P,se),await W(P,se,T.meta)}throw K}},y.withResource=async(k,A)=>{let b=k;try{let P=await u.withResource(k,A);return await W(b,ne(P)),P}catch(P){if(be(P)){let O=P,K=O.meta.origin==="result"?O.meta.resultCause:O.meta.origin==="throw"?O.meta.thrown:void 0,T=Ce(O.error,O.meta,K);await W(b,T,O.meta)}throw P}},y.retry=(k,A,b)=>{let P={key:b.key,retry:{attempts:b.attempts,backoff:b.backoff,initialDelay:b.initialDelay,maxDelay:b.maxDelay,jitter:b.jitter,shouldRetry:b.shouldRetry,onRetry:b.onRetry},timeout:b.timeout,ttl:b.ttl};return y(k,A,P)},y.withTimeout=(k,A,b)=>{let P={key:b.key,timeout:b,ttl:b.ttl};return y(k,A,P)},y.sleep=(k,A,b)=>{if(typeof k!="string"||k.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let P=typeof A=="string"?Dt(A):A;if(!P)throw new Error(`step.sleep: invalid duration '${A}'`);let O=_t(P),K=b?.signal;return y(k,async()=>{if(h?.aborted||K?.aborted){let V=new Error("Sleep aborted");throw V.name="AbortError",V}return new Promise((V,se)=>{let te={timeoutId:void 0},N=()=>{te.timeoutId&&clearTimeout(te.timeoutId);let H=new Error("Sleep aborted");H.name="AbortError",se(H)};h?.addEventListener("abort",N,{once:!0}),K?.addEventListener("abort",N,{once:!0}),te.timeoutId=setTimeout(()=>{h?.removeEventListener("abort",N),K?.removeEventListener("abort",N),V(ne(void 0))},O)})},{key:b?.key,ttl:b?.ttl,description:b?.description})};let w=new Map,Y=new Map;return y.getWritable=k=>{let A=k?.namespace??"default",b=k?.highWaterMark??16;if(!D)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let P=`${S}:${A}`,O=w.get(P);if(O&&!O.closed&&!O.aborted)return O.writer;let K=At({highWaterMark:b,onStateChange:H=>{s({type:"stream_backpressure",workflowId:S,namespace:A,bufferedCount:K.bufferedCount,state:H,ts:Date.now()})}}),T=0,V=!0,se=!1,te=!1;s({type:"stream_created",workflowId:S,namespace:A,ts:Date.now()});let N={async write(H){if(te)return _(Be("closed","Stream is closed"));if(se)return _(Be("aborted","Stream was aborted"));K.state==="paused"&&await K.waitForDrain();let me={value:H,position:T,ts:Date.now()},Q=await D.append(S,A,me);return Q.ok?(s({type:"stream_write",workflowId:S,namespace:A,position:T,ts:Date.now()}),T++,K.increment(),ne(void 0)):(s({type:"stream_error",workflowId:S,namespace:A,error:Q.error,position:T,ts:Date.now()}),_(Be("store_error",Q.error.message,Q.error)))},async close(){if(te)return _(tt("already_closed","Stream is already closed"));let H=await D.closeStream(S,A);return H.ok?(te=!0,V=!1,s({type:"stream_close",workflowId:S,namespace:A,finalPosition:T,ts:Date.now()}),w.delete(P),ne(void 0)):_(tt("store_error",H.error.message,H.error))},abort(H){se=!0,V=!1,te=!0,s({type:"stream_error",workflowId:S,namespace:A,error:H,position:T,ts:Date.now()}),w.delete(P)},get writable(){return V},get position(){return T},get namespace(){return A}};return w.set(P,{writer:N,backpressure:K,aborted:se,closed:te}),N},y.getReadable=k=>{let A=k?.namespace??"default",b=k?.startIndex??0,P=k?.pollInterval??10,O=k?.pollTimeout??3e4;if(!D)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let K=`${S}:${A}:${b}`,T=Y.get(K);if(T&&!T.closed)return T.reader;let V=()=>{let he=`${S}:${A}`,ce=w.get(he);ce&&ce.backpressure.decrement()},se=b,te=!0,N=!1,H=[],me=0,Q={async read(){if(N)return _(et("closed","Reader is closed"));if(me<H.length){let ye=H[me++];return se=ye.position+1,V(),s({type:"stream_read",workflowId:S,namespace:A,position:ye.position,ts:Date.now()}),ne(ye.value)}let he=`${S}:${A}`,ce=Date.now(),we=w.has(he),ae=await D.getMetadata(S,A),Ee=ae.ok&&ae.value!==void 0;for(;Date.now()-ce<O;){let ye=await D.read(S,A,se,100);if(!ye.ok)return _(et("store_error",ye.error.message,ye.error));let Me=ye.value;if(Me.length>0){H=Me,me=1;let We=Me[0];return se=We.position+1,V(),s({type:"stream_read",workflowId:S,namespace:A,position:We.position,ts:Date.now()}),ne(We.value)}let Ue=w.has(he),Se=await D.getMetadata(S,A),it=Se.ok&&Se.value!==void 0;if(Ue&&(we=!0),it&&(Ee=!0),Se.ok&&Se.value?.closed)return te=!1,_(He(se));if(we&&!Ue&&!it)return te=!1,_(He(se));Ee&&!Ue&&Se.ok&&Se.value?.closed,await new Promise(We=>setTimeout(We,P))}return te=!1,_(He(se))},close(){N=!0,te=!1,H=[],Y.delete(K)},get readable(){return te},get position(){return se},get namespace(){return A}};return Y.set(K,{reader:Q,position:se,closed:N}),Q},y.streamForEach=async(k,A,b)=>{let P=b?.checkpointInterval??1,O=b?.concurrency??1,K=[],T=0,V=-1,se=N=>typeof N=="object"&&N!==null&&"read"in N&&typeof N.read=="function",te=async(N,H,me,Q)=>{let ce=P>0&&H%P===0?`stream-foreach:${Q}:pos-${me}`:void 0,we=ce??`stream-item-${me}`,ae=await y(we,()=>A(N,H),{key:ce});return{index:H,position:me,result:ae}};if(se(k))if(O<=1){let N=k.position,H=await k.read();for(;H.ok;){let me=H.value,{result:Q}=await te(me,T,N,k.namespace);K.push(Q),V=N,T++,N=k.position,H=await k.read()}}else{let N=new Map,H=0,me=0,Q=new Array(O).fill(null),he=async()=>{for(let ye=0;ye<Q.length;ye++)if(Q[ye]===null)return ye;let ae=Q.filter(ye=>ye!==null),Ee=await Promise.race(ae);return N.set(Ee.index,{position:Ee.position,result:Ee.result}),Q[Ee.slotIndex]=null,Ee.slotIndex},ce=k.position,we=await k.read();for(;we.ok;){let ae=await he(),Ee=H,ye=ce,Me=we.value,Ue=ae;Q[ae]=te(Me,Ee,ye,k.namespace).then(Se=>({slotIndex:Ue,...Se})),me++,H++,ce=k.position,we=await k.read()}for(let ae=0;ae<Q.length;ae++)if(Q[ae]!==null){let Ee=await Q[ae];N.set(Ee.index,{position:Ee.position,result:Ee.result})}for(let ae=0;ae<me;ae++){let Ee=N.get(ae);Ee&&(K.push(Ee.result),V=Ee.position,T++)}}else if(O<=1){let N=0;for await(let H of k){let{result:me}=await te(H,N,N,"async-iterable");K.push(me),V=N,T++,N++}}else{let N=new Map,H=0,me=0,Q=new Array(O).fill(null),he=async()=>{for(let ae=0;ae<Q.length;ae++)if(Q[ae]===null)return ae;let ce=Q.filter(ae=>ae!==null),we=await Promise.race(ce);return N.set(we.index,we.result),Q[we.slotIndex]=null,we.slotIndex};for await(let ce of k){let we=await he(),ae=H,Ee=we;Q[we]=te(ce,ae,ae,"async-iterable").then(ye=>({slotIndex:Ee,...ye})),me++,H++}for(let ce=0;ce<Q.length;ce++)if(Q[ce]!==null){let we=await Q[ce];N.set(we.index,we.result)}for(let ce=0;ce<me;ce++)N.has(ce)&&(K.push(N.get(ce)),V=ce,T++)}return{results:K,processedCount:T,lastPosition:V}},y.if=u.if,y.label=u.label,y.branch=u.branch,y.arm=u.arm,y.forEach=u.forEach,y.item=u.item,y.dep=u.dep,y.workflow=(k,A,b)=>y(k,A,b),y.all=(k,A,b)=>{let P=b!==void 0&&Object.prototype.hasOwnProperty.call(b,"key")?b:{...b,key:void 0};return y(k,async()=>ne(await u.all(k,A)),P)},y.map=(k,A,b,P)=>{let O=P!==void 0&&Object.prototype.hasOwnProperty.call(P,"key")?P:{...P,key:void 0};return y(k,async()=>ne(await u.map(k,A,b,P)),O)},y},Re=({step:u})=>$({step:Te(u),deps:pe,ctx:C}),de;try{de=await Ve(Re,{onError:ie,onEvent:F,catchUnexpected:Z,workflowId:S,workflowName:t,context:G,_workflowSignal:h})}finally{h&&h.removeEventListener("abort",j)}if(!de.ok&&d.length>0){let u=[];for(let y=d.length-1;y>=0;y--){let w=d[y];try{await w.compensate(w.value)}catch(Y){u.push({stepName:w.stepName,error:Y})}}if(u.length>0){let y={type:"SAGA_COMPENSATION_ERROR",originalError:de.error,compensationErrors:u};de=_(y,{cause:de.cause})}}let xe=performance.now()-v;if(!de.ok){let u;if(Xe(de.cause)&&(u=de.cause),!u&&J&&Tt(de.error)){let y=de.cause;y!=null&&typeof y=="object"&&"name"in y&&y.name==="AbortError"&&(u={type:"WORKFLOW_CANCELLED",reason:U??(typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0),lastStepKey:X})}if(u)return s({type:"workflow_cancelled",workflowId:S,ts:Date.now(),durationMs:xe,reason:u.reason,lastStepKey:u.lastStepKey}),u&&!Xe(de.cause)?_(de.error,{cause:u}):de}if(de.ok&&J){let u=U??(typeof h?.reason=="string"?h.reason:h?.reason instanceof Error?h.reason.message:void 0);s({type:"workflow_cancelled",workflowId:S,ts:Date.now(),durationMs:xe,reason:u,lastStepKey:X});let y={type:"WORKFLOW_CANCELLED",reason:u,lastStepKey:X};return _(Z(y),{cause:y})}return de.ok?s({type:"workflow_success",workflowId:S,ts:Date.now(),durationMs:xe}):s({type:"workflow_error",workflowId:S,ts:Date.now(),durationMs:xe,error:de.error}),de}function g(i,$,I){let S,pe,d;return typeof i=="string"?(S=i,pe=$,d=I):(pe=i,d=$),c(S,pe,d)}async function R(i,$,I){let S,pe,d;typeof i=="string"?(S=i,pe=$,d=I):(pe=i,d=$);let re=Fe(),G=d?.onEvent,F={...d,onEvent:(ee,f)=>{re.handleEvent(ee);try{G?.(ee,f)}catch{}}},ie,fe;try{ie=await c(S,pe,F)}catch(ee){let f=m?.catchUnexpected??$e;ie=_(f(ee),{cause:ee})}finally{fe=re.getResumeState()}return{result:ie,resumeState:fe}}let L={withDeps:i=>rt(L,i),run:g,runWithState:R};return L}var ot;function ar(){let t=new Map;return{async save(e,o){t.set(e,{snapshot:o,updatedAt:new Date})},async load(e){return t.get(e)?.snapshot??null},async delete(e){t.delete(e)},async list(e){let o=e?.prefix??"",a=e?.limit??100,m=[];for(let[c,g]of t.entries())if(!(o&&!c.startsWith(o))&&(m.push({id:c,updatedAt:g.updatedAt.toISOString()}),m.length>=a))break;return m.sort((c,g)=>g.updatedAt.localeCompare(c.updatedAt)),m},async close(){}}}function ir(){return ot===void 0&&(ot=ar()),ot}function Pt(t){return typeof t.tryAcquire=="function"&&typeof t.release=="function"}var st=new Set,Ie=new Map,It={async run(t,e,o){let{id:a,store:m,version:c=1,allowConcurrent:g=!1,lockTtlMs:R=6e4,heartbeatIntervalMs:L,abortOnLeaseLoss:i,metadata:$,signal:I,createContext:S,onEvent:pe,onError:d,onVersionMismatch:re,idempotencyKey:G,input:h}=o,F=m??ir(),ie;if(G){let q=`idem:${G}`,le=Ie.get(q);if(le)return await le;Ie.set(q,new Promise(oe=>{ie=oe}));try{let oe=await F.load(q);if(oe){if(h!==void 0&&oe.metadata?.input!==void 0){let p=JSON.stringify(oe.metadata.input),C=JSON.stringify(h);if(p!==C){let s=_({type:"IDEMPOTENCY_CONFLICT",idempotencyKey:G,workflowId:a,message:`Idempotency key '${G}' already used with different input for workflow '${a}'.`});return ie(s),Ie.delete(q),ie=void 0,s}}if(oe.execution.status==="completed"&&oe.metadata?.finalResult!==void 0){let p=oe.metadata.finalResult;return ie(p),Ie.delete(q),ie=void 0,p}if(oe.execution.status==="running"){let p=_({type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' with idempotency key '${G}' is already running.`,reason:"cross-process"});return ie(p),Ie.delete(q),ie=void 0,p}}}catch{}try{await F.save(q,{formatVersion:1,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{workflowId:a,idempotencyKey:G,input:h}})}catch{}}if(!g&&st.has(a)){let q={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return _(q)}let fe=null;if(!g&&Pt(F)){let q;try{q=await F.tryAcquire(a,{ttlMs:R})}catch(le){let oe={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:le,message:`Failed to acquire lock for workflow '${a}': ${le instanceof Error?le.message:String(le)}`};return _(oe)}if(q===null){let le={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return _(le)}fe=q.ownerToken}let ee,f,ue=F;if(fe&&typeof ue.renew=="function"){let q=L??Math.floor(R/3);f=new AbortController,ee=setInterval(async()=>{try{await ue.renew(a,fe,{ttlMs:R})||f.abort(new Error("Lease expired"))}catch{f.abort(new Error("Lease renewal failed"))}},q)}st.add(a);let Z;try{let q=null;try{q=await F.load(a)}catch(r){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Failed to load state for workflow '${a}': ${r instanceof Error?r.message:String(r)}`};return Z=_(n),_(n)}if(q)try{bt(q)}catch(r){if(r instanceof ve){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return Z=_(n),_(n)}throw r}if(q){let r=typeof q.metadata?.version=="number"?q.metadata.version:1;if(r!==c){let n={type:"VERSION_MISMATCH",workflowId:a,storedVersion:r,requestedVersion:c,currentVersion:c,message:`Workflow '${a}' has stored state at version ${r} but this run requested version ${c}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${a}')) and re-run.`};if(!re)return Z=_(n),_(n);let E=await Promise.resolve(re({id:a,storedVersion:r,requestedVersion:c}));if(E==="throw")return Z=_(n),_(n);if(E==="clear"){try{await F.delete(a)}catch{}q=null}else q=E.migratedSnapshot}}let le=(r,n)=>{pe&&pe(r,n)},oe=Fe(),p={snapshot:q,onAfterStep:async(r,n,E,x)=>{try{let v=oe.getResumeState(),l={};for(let[B,J]of v.steps)if(J.result.ok)l[B]={ok:!0,value:J.result.value};else{let U=J.result.cause,X=U instanceof Error?Ge(U):Ze(U),j=J.meta?.origin==="throw"?"throw":"result";l[B]={ok:!1,error:J.result.error,cause:X,meta:{origin:j}}}let D={formatVersion:1,workflowName:a,steps:l,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...q?.metadata??{},...$,version:c,lastStepKey:r}},M=q?vt(q,D):D;if(M.warnings&&M.warnings.length>0){let B=new Set(Object.keys(D.steps)),J=M.warnings.filter(U=>!B.has(U.stepId));M={...M,warnings:J.length>0?J:void 0}}await F.save(a,M),le({type:"persist_success",workflowId:E,stepKey:r,ts:Date.now(),context:x},x)}catch(v){le({type:"persist_error",workflowId:E,stepKey:r,error:v,ts:Date.now(),context:x},x)}},onEvent:(r,n)=>{oe.handleEvent(r),le(r,n)},onError:d,signal:f&&I?AbortSignal.any([I,f.signal]):f?.signal??I,createContext:S},C;try{C=nt(a,t,p)}catch(r){if(r instanceof ve){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return Z=_(n),_(n)}throw r}let s;try{s=await C.run(e)}catch(r){if(r instanceof ve||r instanceof Pe){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return Z=_(n),_(n)}throw r}if(i!==!1&&f?.signal.aborted){let r=_({type:"LEASE_EXPIRED",workflowId:a,message:`Lease expired for workflow '${a}' during execution. The workflow may have been reclaimed by another process.`});return Z=r,r}if(s.ok){try{await F.delete(a)}catch(r){let n={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:a,cause:r,message:`Failed to delete state for workflow '${a}': ${r instanceof Error?r.message:String(r)}`};return Z=_(n),_(n)}if(G){let r=`idem:${G}`;try{await F.save(r,{formatVersion:1,steps:{},execution:{status:"completed",lastUpdated:new Date().toISOString(),completedAt:new Date().toISOString()},metadata:{workflowId:a,idempotencyKey:G,input:h,finalResult:s}})}catch{}}}return Z=s,s}finally{if(st.delete(a),ie&&(ie(Z),Ie.delete(`idem:${G}`)),ee&&clearInterval(ee),fe!==null&&Pt(F))try{await F.release(a,fe)}catch{}}},async clearState(t){let e=t;if(typeof e.clear=="function"){await e.clear();return}let o=100;for(;;){let a=await t.list({limit:o});if(a.length===0)break;let m=a.map(c=>c.id);if(await this.deleteStates(t,m,{continueOnError:!0}),a.length<o)break}},async hasState(t,e){try{return await t.load(e)!==null}catch{return!1}},async deleteState(t,e){try{return await t.delete(e),!0}catch{return!1}},async deleteStates(t,e,o={}){let{concurrency:a=10,continueOnError:m=!0}=o;if(e.length===0)return{deleted:0};let c=[],g=0,R=async i=>{try{await t.delete(i),g++}catch($){if(m)c.push({id:i,error:$});else throw $}},L=Math.max(1,a);for(let i=0;i<e.length;i+=L){let $=e.slice(i,i+L);await Promise.all($.map(I=>R(I)))}return c.length>0?{deleted:g,errors:c}:{deleted:g}},async listPending(t,e){try{return await t.list(e)}catch{return[]}}};function Mt(t){let{store:e,workflows:o,concurrency:a=5,onEvent:m,onError:c}=t,g=new Map,R,L=!1,i=!1;function $(h){try{m?.(h)}catch{}}async function I(h,F){if(!o[h])throw new Error(`Unknown workflow: '${h}'. Registered: ${Object.keys(o).join(", ")}`);let fe=F?.id??`${h}:${(0,at.randomUUID)()}`,ee={formatVersion:1,workflowName:h,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{engineState:"queued",workflowName:h,input:F?.input??null,idempotencyKey:F?.idempotencyKey,enqueuedAt:new Date().toISOString(),...F?.metadata}};return await e.save(fe,ee),$({type:"workflow_enqueued",workflowName:h,id:fe,ts:Date.now()}),fe}async function S(){if(i)return 0;i=!0;try{let h=await e.list({limit:a*2}),F=0,ie=[];for(let ee of h){if(ie.length>=a)break;let f=await e.load(ee.id);f&&f.metadata?.engineState==="queued"&&typeof f.metadata?.workflowName=="string"&&ie.push({id:ee.id,workflowName:f.metadata.workflowName,snapshot:f})}let fe=await Promise.allSettled(ie.map(async({id:ee,workflowName:f,snapshot:ue})=>{let Z=o[f];if(!Z)return;let q={...ue,metadata:{...ue.metadata,engineState:"processing"}};await e.save(ee,q),$({type:"workflow_started",workflowName:f,id:ee,ts:Date.now()});let le=await It.run(Z.deps,Z.fn,{id:ee,store:e,idempotencyKey:ue.metadata?.idempotencyKey,input:ue.metadata?.input,...Z.durableDefaults});le.ok?$({type:"workflow_completed",workflowName:f,id:ee,ts:Date.now()}):$({type:"workflow_failed",workflowName:f,id:ee,error:le.error,ts:Date.now()}),F++}));for(let ee of fe)if(ee.status==="rejected")try{c?.(ee.reason)}catch{}return $({type:"engine_tick",ts:Date.now(),processed:F}),F}finally{i=!1}}function pe(h,F){let ie=F?.id?`schedule:${F.id}`:`schedule:${(0,at.randomUUID)()}`;F.immediate&&I(h,F).catch(ee=>{try{c?.(ee)}catch{}});let fe=setInterval(()=>{I(h,F).catch(ee=>{try{c?.(ee)}catch{}})},F.intervalMs);return g.set(ie,fe),$({type:"schedule_created",workflowName:h,scheduleId:ie,intervalMs:F.intervalMs,ts:Date.now()}),ie}function d(h){let F=g.get(h);return F?(clearInterval(F),g.delete(h),$({type:"schedule_removed",scheduleId:h,ts:Date.now()}),!0):!1}function re(h=1e3){L||(L=!0,$({type:"engine_start",ts:Date.now()}),S().catch(F=>{try{c?.(F)}catch{}}),R=setInterval(()=>{S().catch(F=>{try{c?.(F)}catch{}})},h))}async function G(){if(L){L=!1,R&&(clearInterval(R),R=void 0);for(let[h,F]of g)clearInterval(F),g.delete(h);for(;i;)await new Promise(h=>setTimeout(h,50));$({type:"engine_stop",ts:Date.now()})}}return{enqueue:I,schedule:pe,unschedule:d,start:re,stop:G,tick:S,status:()=>({running:L,pendingSchedules:g.size})}}0&&(module.exports={createEngine});
|
|
11
|
-
//# sourceMappingURL=engine.cjs.map
|