@temelj/workflow 0.0.0-alpha.2 → 0.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +394 -2
- package/dist/attributes.d.mts +11 -9
- package/dist/attributes.mjs +23 -5
- package/dist/bundle.d.mts +5 -23
- package/dist/bundle.mjs +2 -18
- package/dist/client/create.d.mts +26 -23
- package/dist/client/create.mjs +26 -32
- package/dist/client/facades.d.mts +12 -18
- package/dist/client/facades.mjs +102 -93
- package/dist/client/mod.mjs +1 -2
- package/dist/client/run-handle.d.mts +17 -54
- package/dist/client/run-handle.mjs +35 -105
- package/dist/client/worker-options.d.mts +8 -8
- package/dist/client/worker-options.mjs +11 -11
- package/dist/cloudflare/cloudflare.d.mts +4 -5
- package/dist/cloudflare/codec.d.mts +28 -13
- package/dist/cloudflare/codec.mjs +40 -17
- package/dist/cloudflare/entrypoint.d.mts +3 -4
- package/dist/cloudflare/entrypoint.mjs +4 -3
- package/dist/cloudflare/execution.d.mts +3 -4
- package/dist/cloudflare/execution.mjs +20 -13
- package/dist/cloudflare/host.d.mts +6 -7
- package/dist/cloudflare/host.mjs +7 -6
- package/dist/cloudflare/mod.d.mts +4 -4
- package/dist/cloudflare/mod.mjs +2 -2
- package/dist/cloudflare/name.d.mts +3 -4
- package/dist/cloudflare/name.mjs +3 -3
- package/dist/cloudflare/registry.d.mts +3 -23
- package/dist/cloudflare/registry.mjs +2 -20
- package/dist/cloudflare/runtime.d.mts +11 -18
- package/dist/cloudflare/runtime.mjs +52 -73
- package/dist/cloudflare/step.d.mts +6 -6
- package/dist/cloudflare/step.mjs +69 -57
- package/dist/cloudflare/types.d.mts +17 -36
- package/dist/collection.d.mts +8 -11
- package/dist/collection.mjs +10 -14
- package/dist/compiled-function.d.mts +14 -19
- package/dist/compiled-function.mjs +12 -24
- package/dist/compiled.d.mts +4 -0
- package/dist/compiled.mjs +4 -0
- package/dist/compiler/ast.d.mts +26 -0
- package/dist/{vite → compiler}/ast.mjs +24 -16
- package/dist/{vite → compiler}/error.d.mts +4 -6
- package/dist/{vite → compiler}/error.mjs +14 -16
- package/dist/compiler/manifest.d.mts +6 -0
- package/dist/{vite → compiler}/manifest.mjs +9 -7
- package/dist/compiler/plugin.d.mts +7 -0
- package/dist/{vite → compiler}/plugin.mjs +45 -46
- package/dist/compiler/safety.d.mts +12 -0
- package/dist/{vite → compiler}/safety.mjs +5 -11
- package/dist/{vite → compiler}/source-edit.d.mts +3 -4
- package/dist/{vite → compiler}/source-edit.mjs +1 -1
- package/dist/{vite → compiler}/source-map.d.mts +4 -3
- package/dist/{vite → compiler}/source-map.mjs +3 -3
- package/dist/compiler/source.d.mts +7 -0
- package/dist/{vite → compiler}/source.mjs +1 -1
- package/dist/compiler/transform.d.mts +12 -0
- package/dist/{vite → compiler}/transform.mjs +37 -38
- package/dist/definition.d.mts +17 -25
- package/dist/definition.mjs +19 -35
- package/dist/engine/child-workflow.d.mts +5 -9
- package/dist/engine/child-workflow.mjs +46 -67
- package/dist/engine/command-identity.d.mts +5 -6
- package/dist/engine/command-identity.mjs +9 -5
- package/dist/engine/context.d.mts +17 -0
- package/dist/engine/create.d.mts +36 -94
- package/dist/engine/create.mjs +55 -260
- package/dist/engine/deterministic.d.mts +6 -11
- package/dist/engine/deterministic.mjs +47 -68
- package/dist/engine/durable-command.d.mts +5 -5
- package/dist/engine/durable-command.mjs +2 -2
- package/dist/engine/execution-service.d.mts +20 -24
- package/dist/engine/execution-service.mjs +54 -52
- package/dist/engine/hooks.d.mts +17 -39
- package/dist/engine/hooks.mjs +73 -94
- package/dist/engine/inspection.d.mts +23 -15
- package/dist/engine/inspection.mjs +55 -29
- package/dist/engine/lifecycle.d.mts +6 -12
- package/dist/engine/lifecycle.mjs +5 -5
- package/dist/engine/lock-replay.d.mts +8 -15
- package/dist/engine/lock-replay.mjs +12 -25
- package/dist/engine/lock.d.mts +10 -15
- package/dist/engine/lock.mjs +65 -51
- package/dist/engine/message.d.mts +14 -34
- package/dist/engine/message.mjs +94 -127
- package/dist/engine/observation.d.mts +9 -11
- package/dist/engine/observation.mjs +18 -27
- package/dist/engine/replay.d.mts +18 -19
- package/dist/engine/replay.mjs +32 -56
- package/dist/engine/resume.d.mts +16 -0
- package/dist/engine/resume.mjs +24 -0
- package/dist/engine/retry.d.mts +15 -19
- package/dist/engine/retry.mjs +17 -17
- package/dist/engine/run-data.d.mts +4 -8
- package/dist/engine/run-data.mjs +24 -22
- package/dist/engine/run-service.d.mts +24 -33
- package/dist/engine/run-service.mjs +125 -93
- package/dist/engine/run-utils.d.mts +11 -13
- package/dist/engine/run-utils.mjs +23 -46
- package/dist/engine/schedule.d.mts +8 -22
- package/dist/engine/schedule.mjs +37 -34
- package/dist/engine/serialization.d.mts +9 -6
- package/dist/engine/serialization.mjs +30 -21
- package/dist/engine/signals.d.mts +23 -0
- package/dist/engine/signals.mjs +41 -0
- package/dist/engine/start.d.mts +18 -0
- package/dist/engine/start.mjs +88 -0
- package/dist/engine/state.d.mts +37 -67
- package/dist/engine/state.mjs +127 -282
- package/dist/engine/step-api.d.mts +5 -8
- package/dist/engine/step-api.mjs +16 -16
- package/dist/engine/stream-reader.d.mts +12 -0
- package/dist/engine/stream-reader.mjs +154 -0
- package/dist/engine/stream.d.mts +9 -54
- package/dist/engine/stream.mjs +54 -196
- package/dist/engine/summary/recovery.d.mts +35 -0
- package/dist/engine/summary/recovery.mjs +363 -0
- package/dist/engine/summary/runs.d.mts +43 -0
- package/dist/engine/summary/runs.mjs +294 -0
- package/dist/engine/summary/step-attempts.d.mts +5 -10
- package/dist/engine/summary/step-attempts.mjs +157 -36
- package/dist/engine/summary/tally.d.mts +44 -0
- package/dist/engine/summary/tally.mjs +142 -0
- package/dist/engine/task.d.mts +4 -5
- package/dist/engine/task.mjs +40 -48
- package/dist/errors/base.d.mts +17 -77
- package/dist/errors/base.mjs +26 -327
- package/dist/errors/capability.d.mts +3 -6
- package/dist/errors/capability.mjs +4 -8
- package/dist/errors/codes.d.mts +116 -0
- package/dist/{types/error-code.mjs → errors/codes.mjs} +2 -17
- package/dist/errors/definition.d.mts +3 -17
- package/dist/errors/definition.mjs +5 -42
- package/dist/errors/failures.d.mts +17 -51
- package/dist/errors/failures.mjs +35 -102
- package/dist/errors/hook.d.mts +5 -9
- package/dist/errors/hook.mjs +4 -16
- package/dist/errors/implementation.d.mts +3 -6
- package/dist/errors/implementation.mjs +7 -12
- package/dist/errors/lock.d.mts +7 -20
- package/dist/errors/lock.mjs +8 -44
- package/dist/errors/message.d.mts +14 -59
- package/dist/errors/message.mjs +13 -39
- package/dist/errors/mod.d.mts +4 -5
- package/dist/errors/mod.mjs +5 -7
- package/dist/errors/records.d.mts +10 -4
- package/dist/errors/records.mjs +256 -256
- package/dist/errors/run.d.mts +27 -68
- package/dist/errors/run.mjs +31 -85
- package/dist/errors/schedule.d.mts +7 -18
- package/dist/errors/schedule.mjs +7 -39
- package/dist/errors/step.d.mts +12 -45
- package/dist/errors/step.mjs +13 -34
- package/dist/errors/stream.d.mts +8 -16
- package/dist/errors/stream.mjs +7 -41
- package/dist/esbuild.d.mts +6 -4
- package/dist/esbuild.mjs +2 -1
- package/dist/events/descriptors.d.mts +12 -241
- package/dist/events/descriptors.mjs +12 -5
- package/dist/history/projection.d.mts +4 -6
- package/dist/history/projection.mjs +22 -26
- package/dist/history/replay-projection.d.mts +44 -48
- package/dist/history/replay-projection.mjs +41 -50
- package/dist/history/{mod.d.mts → replay.d.mts} +16 -21
- package/dist/history/{mod.mjs → replay.mjs} +21 -25
- package/dist/history/sequencer.d.mts +10 -11
- package/dist/history/sequencer.mjs +11 -7
- package/dist/history/step-attempts.d.mts +4 -7
- package/dist/history/step-attempts.mjs +8 -9
- package/dist/history/timeline.d.mts +4 -13
- package/dist/history/timeline.mjs +46 -265
- package/dist/history/validator.d.mts +5 -7
- package/dist/history/validator.mjs +9 -24
- package/dist/hook-token.d.mts +7 -0
- package/dist/hook-token.mjs +32 -0
- package/dist/ids.d.mts +8 -0
- package/dist/ids.mjs +21 -0
- package/dist/message-options.d.mts +11 -5
- package/dist/message-options.mjs +9 -7
- package/dist/mod.d.mts +32 -36
- package/dist/mod.mjs +9 -13
- package/dist/otel/metrics.d.mts +31 -0
- package/dist/otel/metrics.mjs +60 -0
- package/dist/otel/mod.d.mts +3 -0
- package/dist/otel/mod.mjs +3 -0
- package/dist/otel/spans.d.mts +24 -0
- package/dist/otel/spans.mjs +218 -0
- package/dist/otel/support.d.mts +15 -8
- package/dist/otel/support.mjs +18 -40
- package/dist/{otel.d.mts → otel/telemetry.d.mts} +5 -6
- package/dist/otel/telemetry.mjs +305 -0
- package/dist/pagination.d.mts +6 -12
- package/dist/pagination.mjs +10 -14
- package/dist/registry.d.mts +8 -5
- package/dist/registry.mjs +19 -10
- package/dist/rolldown.d.mts +6 -4
- package/dist/rolldown.mjs +2 -1
- package/dist/rollup.d.mts +6 -4
- package/dist/rollup.mjs +2 -1
- package/dist/rspack.d.mts +6 -4
- package/dist/rspack.mjs +2 -1
- package/dist/run-status.d.mts +29 -0
- package/dist/run-status.mjs +42 -0
- package/dist/schema/common.d.mts +22 -0
- package/dist/schema/common.mjs +54 -0
- package/dist/schema/error.d.mts +17 -0
- package/dist/schema/error.mjs +39 -0
- package/dist/schema/events.d.mts +446 -0
- package/dist/schema/events.mjs +235 -0
- package/dist/schema/pagination.d.mts +5 -0
- package/dist/schema/pagination.mjs +11 -0
- package/dist/schema/persisted-value.d.mts +8 -0
- package/dist/schema/persisted-value.mjs +94 -0
- package/dist/schema/run.d.mts +51 -0
- package/dist/schema/run.mjs +88 -0
- package/dist/schema/store.d.mts +94 -0
- package/dist/schema/store.mjs +116 -0
- package/dist/step-definition.d.mts +4 -9
- package/dist/step-definition.mjs +2 -2
- package/dist/store/capabilities.d.mts +8 -9
- package/dist/store/capabilities.mjs +7 -7
- package/dist/store/cleanup.d.mts +9 -14
- package/dist/store/cleanup.mjs +86 -85
- package/dist/store/create.d.mts +28 -29
- package/dist/store/create.mjs +10 -11
- package/dist/store/events.d.mts +48 -0
- package/dist/store/events.mjs +263 -0
- package/dist/store/indexes.d.mts +25 -0
- package/dist/store/indexes.mjs +282 -0
- package/dist/store/instrumentation.d.mts +2 -3
- package/dist/store/instrumentation.mjs +30 -30
- package/dist/store/lock.d.mts +4 -5
- package/dist/store/lock.mjs +5 -7
- package/dist/store/materialization.d.mts +10 -17
- package/dist/store/materialization.mjs +39 -33
- package/dist/store/mod.d.mts +3 -3
- package/dist/store/mod.mjs +2 -2
- package/dist/store/query.d.mts +13 -17
- package/dist/store/query.mjs +13 -13
- package/dist/store/run.d.mts +25 -34
- package/dist/store/run.mjs +67 -108
- package/dist/store/schedule.d.mts +6 -8
- package/dist/store/schedule.mjs +11 -11
- package/dist/store/step-attempt.d.mts +9 -12
- package/dist/store/step-attempt.mjs +9 -9
- package/dist/store/storage-value.d.mts +3 -3
- package/dist/store/storage-value.mjs +17 -1
- package/dist/store/validation.d.mts +17 -20
- package/dist/store/validation.mjs +30 -33
- package/dist/store-keys.d.mts +35 -47
- package/dist/store-keys.mjs +9 -17
- package/dist/telemetry.d.mts +16 -16
- package/dist/telemetry.mjs +3 -3
- package/dist/temporal.d.mts +11 -16
- package/dist/temporal.mjs +8 -9
- package/dist/timer.d.mts +12 -10
- package/dist/timer.mjs +11 -3
- package/dist/types/cleanup.d.mts +13 -50
- package/dist/types/cleanup.mjs +1 -22
- package/dist/types/client.d.mts +101 -162
- package/dist/types/{vite.d.mts → compiler.d.mts} +17 -24
- package/dist/types/compiler.mjs +1 -0
- package/dist/types/definition.d.mts +22 -34
- package/dist/types/engine-options.d.mts +10 -17
- package/dist/types/engine.d.mts +15 -274
- package/dist/types/error.d.mts +15 -217
- package/dist/types/error.mjs +1 -48
- package/dist/types/events.d.mts +59 -2730
- package/dist/types/events.mjs +1 -283
- package/dist/types/hook.d.mts +27 -85
- package/dist/types/hook.mjs +1 -66
- package/dist/types/ids.d.mts +9 -0
- package/dist/types/ids.mjs +1 -0
- package/dist/types/lock.d.mts +8 -26
- package/dist/types/lock.mjs +1 -18
- package/dist/types/message.d.mts +29 -43
- package/dist/types/observation.d.mts +43 -58
- package/dist/types/pagination.d.mts +6 -22
- package/dist/types/pagination.mjs +1 -13
- package/dist/types/result.d.mts +11 -43
- package/dist/types/retry.d.mts +7 -14
- package/dist/types/run-list.d.mts +9 -11
- package/dist/types/run-options.d.mts +25 -32
- package/dist/types/run.d.mts +35 -315
- package/dist/types/run.mjs +1 -207
- package/dist/types/runtime.d.mts +33 -145
- package/dist/types/runtime.mjs +1 -21
- package/dist/types/schedule.d.mts +13 -72
- package/dist/types/schedule.mjs +1 -48
- package/dist/types/step-attempts.d.mts +65 -261
- package/dist/types/step-attempts.mjs +1 -43
- package/dist/types/step.d.mts +66 -77
- package/dist/types/step.mjs +1 -5
- package/dist/types/store.d.mts +50 -182
- package/dist/types/stream.d.mts +19 -40
- package/dist/types/summary.d.mts +174 -278
- package/dist/types/telemetry.d.mts +23 -28
- package/dist/types/telemetry.mjs +1 -9
- package/dist/types/timeline.d.mts +46 -233
- package/dist/types/worker.d.mts +22 -29
- package/dist/values.d.mts +15 -0
- package/dist/values.mjs +57 -0
- package/dist/vite.d.mts +5 -6
- package/dist/vite.mjs +3 -4
- package/dist/webpack.d.mts +6 -4
- package/dist/webpack.mjs +2 -1
- package/dist/worker/error.d.mts +2 -9
- package/dist/worker/error.mjs +20 -32
- package/dist/worker/missing-implementation.d.mts +19 -0
- package/dist/worker/missing-implementation.mjs +62 -0
- package/dist/worker/worker.d.mts +18 -0
- package/dist/{worker.mjs → worker/worker.mjs} +64 -118
- package/package.json +28 -47
- package/dist/engine/execution-api.d.mts +0 -29
- package/dist/engine/execution-api.mjs +0 -33
- package/dist/engine/inspection-api.d.mts +0 -34
- package/dist/engine/inspection-api.mjs +0 -78
- package/dist/engine/mod.d.mts +0 -4
- package/dist/engine/mod.mjs +0 -2
- package/dist/engine/recovery.d.mts +0 -26
- package/dist/engine/recovery.mjs +0 -92
- package/dist/engine/retry-policy.d.mts +0 -4
- package/dist/engine/retry-policy.mjs +0 -4
- package/dist/engine/start-api.d.mts +0 -30
- package/dist/engine/start-api.mjs +0 -99
- package/dist/engine/summary/active-events.d.mts +0 -34
- package/dist/engine/summary/active-events.mjs +0 -69
- package/dist/engine/summary/child-workflow-runs.d.mts +0 -24
- package/dist/engine/summary/child-workflow-runs.mjs +0 -138
- package/dist/engine/summary/child-workflow-waits.d.mts +0 -21
- package/dist/engine/summary/child-workflow-waits.mjs +0 -67
- package/dist/engine/summary/recovery-child-workflow-waits.d.mts +0 -11
- package/dist/engine/summary/recovery-child-workflow-waits.mjs +0 -89
- package/dist/engine/summary/recovery-due-runs.d.mts +0 -16
- package/dist/engine/summary/recovery-due-runs.mjs +0 -52
- package/dist/engine/summary/recovery-failed-runs.d.mts +0 -14
- package/dist/engine/summary/recovery-failed-runs.mjs +0 -33
- package/dist/engine/summary/recovery-lease-runs.d.mts +0 -16
- package/dist/engine/summary/recovery-lease-runs.mjs +0 -69
- package/dist/engine/summary/recovery-locks.d.mts +0 -18
- package/dist/engine/summary/recovery-locks.mjs +0 -100
- package/dist/engine/summary/recovery-message-waits.d.mts +0 -11
- package/dist/engine/summary/recovery-message-waits.mjs +0 -74
- package/dist/engine/summary/recovery-retry-runs.d.mts +0 -17
- package/dist/engine/summary/recovery-retry-runs.mjs +0 -65
- package/dist/engine/summary/recovery-run-timestamps.d.mts +0 -13
- package/dist/engine/summary/recovery-run-timestamps.mjs +0 -18
- package/dist/engine/summary/recovery-runs.d.mts +0 -23
- package/dist/engine/summary/recovery-runs.mjs +0 -54
- package/dist/engine/summary/recovery-schedules.d.mts +0 -10
- package/dist/engine/summary/recovery-schedules.mjs +0 -46
- package/dist/engine/summary/recovery-sleep-waits.d.mts +0 -10
- package/dist/engine/summary/recovery-sleep-waits.mjs +0 -53
- package/dist/engine/summary/recovery-waits.d.mts +0 -21
- package/dist/engine/summary/recovery-waits.mjs +0 -29
- package/dist/engine/summary/run-availability.d.mts +0 -13
- package/dist/engine/summary/run-availability.mjs +0 -37
- package/dist/engine/summary/run-cleanup.d.mts +0 -14
- package/dist/engine/summary/run-cleanup.mjs +0 -44
- package/dist/engine/summary/run-failure.d.mts +0 -14
- package/dist/engine/summary/run-failure.mjs +0 -62
- package/dist/engine/summary/run-hooks.d.mts +0 -14
- package/dist/engine/summary/run-hooks.mjs +0 -63
- package/dist/engine/summary/run-lease.d.mts +0 -11
- package/dist/engine/summary/run-lease.mjs +0 -64
- package/dist/engine/summary/run-message-waits.d.mts +0 -15
- package/dist/engine/summary/run-message-waits.mjs +0 -62
- package/dist/engine/summary/run-metrics.d.mts +0 -31
- package/dist/engine/summary/run-metrics.mjs +0 -93
- package/dist/engine/summary/run-retry.d.mts +0 -9
- package/dist/engine/summary/run-retry.mjs +0 -69
- package/dist/engine/summary/run-sleeps.d.mts +0 -15
- package/dist/engine/summary/run-sleeps.mjs +0 -61
- package/dist/engine/summary/run-state.d.mts +0 -26
- package/dist/engine/summary/run-state.mjs +0 -48
- package/dist/engine/summary/run-status.d.mts +0 -16
- package/dist/engine/summary/run-status.mjs +0 -35
- package/dist/engine/summary/run-streams.d.mts +0 -14
- package/dist/engine/summary/run-streams.mjs +0 -46
- package/dist/engine/summary/run-transition.d.mts +0 -9
- package/dist/engine/summary/run-transition.mjs +0 -39
- package/dist/engine/summary/run-workflow.d.mts +0 -9
- package/dist/engine/summary/run-workflow.mjs +0 -47
- package/dist/engine/summary/step-attempt-active-child-workflows.d.mts +0 -13
- package/dist/engine/summary/step-attempt-active-child-workflows.mjs +0 -55
- package/dist/engine/summary/step-attempt-active-fields.d.mts +0 -23
- package/dist/engine/summary/step-attempt-active-fields.mjs +0 -14
- package/dist/engine/summary/step-attempt-active-message-waits.d.mts +0 -12
- package/dist/engine/summary/step-attempt-active-message-waits.mjs +0 -47
- package/dist/engine/summary/step-attempt-active-sleeps.d.mts +0 -19
- package/dist/engine/summary/step-attempt-active-sleeps.mjs +0 -44
- package/dist/engine/summary/step-attempt-buckets.d.mts +0 -22
- package/dist/engine/summary/step-attempt-buckets.mjs +0 -152
- package/dist/engine/summary/step-attempt-failure.d.mts +0 -12
- package/dist/engine/summary/step-attempt-failure.mjs +0 -61
- package/dist/engine/summary/step-attempt-lifecycle.d.mts +0 -13
- package/dist/engine/summary/step-attempt-lifecycle.mjs +0 -19
- package/dist/engine/summary.d.mts +0 -32
- package/dist/engine/summary.mjs +0 -37
- package/dist/errors/details.d.mts +0 -13
- package/dist/errors/details.mjs +0 -66
- package/dist/errors/record-view.d.mts +0 -11
- package/dist/errors/record-view.mjs +0 -24
- package/dist/errors/runtime.d.mts +0 -12
- package/dist/errors/runtime.mjs +0 -24
- package/dist/events/mod.d.mts +0 -3
- package/dist/events/mod.mjs +0 -2
- package/dist/history/attempt-key.d.mts +0 -6
- package/dist/history/attempt-key.mjs +0 -7
- package/dist/inspection/mod.d.mts +0 -5
- package/dist/inspection/mod.mjs +0 -3
- package/dist/otel.mjs +0 -590
- package/dist/runtime.d.mts +0 -35
- package/dist/runtime.mjs +0 -198
- package/dist/store/append-projection.d.mts +0 -15
- package/dist/store/append-projection.mjs +0 -26
- package/dist/store/compaction.d.mts +0 -5
- package/dist/store/compaction.mjs +0 -8
- package/dist/store/event-append-project.d.mts +0 -15
- package/dist/store/event-append-project.mjs +0 -77
- package/dist/store/event-append.d.mts +0 -37
- package/dist/store/event-append.mjs +0 -80
- package/dist/store/event-history.d.mts +0 -22
- package/dist/store/event-history.mjs +0 -75
- package/dist/store/event.d.mts +0 -10
- package/dist/store/event.mjs +0 -28
- package/dist/store/idempotency.d.mts +0 -10
- package/dist/store/idempotency.mjs +0 -167
- package/dist/store/message-index.d.mts +0 -21
- package/dist/store/message-index.mjs +0 -122
- package/dist/store/revision.d.mts +0 -4
- package/dist/store/revision.mjs +0 -7
- package/dist/store/schema.d.mts +0 -14
- package/dist/store/schema.mjs +0 -17
- package/dist/types/common.d.mts +0 -20
- package/dist/types/common.mjs +0 -16
- package/dist/types/error-code.d.mts +0 -256
- package/dist/types/message-id.d.mts +0 -7
- package/dist/types/message-id.mjs +0 -5
- package/dist/types/run-id.d.mts +0 -7
- package/dist/types/run-id.mjs +0 -5
- package/dist/types/step-id.d.mts +0 -7
- package/dist/types/step-id.mjs +0 -5
- package/dist/types/stream-id.d.mts +0 -7
- package/dist/types/stream-id.mjs +0 -5
- package/dist/types/worker-id.d.mts +0 -7
- package/dist/types/worker-id.mjs +0 -5
- package/dist/utility.d.mts +0 -49
- package/dist/utility.mjs +0 -122
- package/dist/vite/ast.d.mts +0 -23
- package/dist/vite/generated-name.d.mts +0 -7
- package/dist/vite/generated-name.mjs +0 -9
- package/dist/vite/manifest.d.mts +0 -7
- package/dist/vite/plugin.d.mts +0 -7
- package/dist/vite/safety.d.mts +0 -12
- package/dist/vite/source.d.mts +0 -7
- package/dist/vite/transform.d.mts +0 -7
- package/dist/webhook.d.mts +0 -16
- package/dist/webhook.mjs +0 -17
- package/dist/worker.d.mts +0 -19
- /package/dist/{types/vite.mjs → engine/context.mjs} +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
2
|
+
import { WorkflowOptionsError } from "../errors/base.mjs";
|
|
3
|
+
import { WorkflowStreamError } from "../errors/stream.mjs";
|
|
4
|
+
import { matchesWorkflowError } from "../errors/records.mjs";
|
|
5
|
+
import "../errors/mod.mjs";
|
|
6
|
+
import { History } from "../history/replay.mjs";
|
|
7
|
+
import { isNonNegativeSafeInteger } from "../values.mjs";
|
|
8
|
+
import { getRequiredRun } from "../store/query.mjs";
|
|
9
|
+
import { nonNegativeTimerDelay } from "../timer.mjs";
|
|
10
|
+
import { getStreamInfoFromHistory, readStreamFromHistory } from "./stream.mjs";
|
|
11
|
+
import "temporal-polyfill/global";
|
|
12
|
+
//#region src/engine/stream-reader.ts
|
|
13
|
+
const DEFAULT_STREAM_FOLLOW_POLL_INTERVAL = Temporal.Duration.from({ milliseconds: 100 });
|
|
14
|
+
async function getStreamInfo(context, runId, streamIdOrName) {
|
|
15
|
+
await getRequiredRun(context.store, runId);
|
|
16
|
+
return getStreamInfoFromHistory(runId, new History(await context.store.getEvents(runId)), streamIdOrName);
|
|
17
|
+
}
|
|
18
|
+
async function readStream(context, runId, streamIdOrName, readOptions) {
|
|
19
|
+
await getRequiredRun(context.store, runId);
|
|
20
|
+
return readStreamFromHistory(runId, new History(await context.store.getEvents(runId)), streamIdOrName, readOptions);
|
|
21
|
+
}
|
|
22
|
+
function followStream(context, runId, streamIdOrName, followOptions) {
|
|
23
|
+
return followStreamState((readOptions) => readStream(context, runId, streamIdOrName, readOptions), followOptions, { waitForChange: ({ signal }) => waitForStreamStorageChange(context, runId, signal) });
|
|
24
|
+
}
|
|
25
|
+
async function waitForStream(context, runId, streamIdOrName, waitOptions) {
|
|
26
|
+
return await waitForStreamState(() => getStreamInfo(context, runId, streamIdOrName), waitOptions, { waitForChange: ({ signal }) => waitForStreamStorageChange(context, runId, signal) });
|
|
27
|
+
}
|
|
28
|
+
async function waitForStreamChunk(context, runId, streamIdOrName, afterIndex, waitOptions) {
|
|
29
|
+
return await waitForStreamStateChunk((readOptions) => readStream(context, runId, streamIdOrName, readOptions), afterIndex, waitOptions, { waitForChange: ({ signal }) => waitForStreamStorageChange(context, runId, signal) });
|
|
30
|
+
}
|
|
31
|
+
async function waitForStreamTerminal(context, runId, streamIdOrName, waitOptions) {
|
|
32
|
+
return await waitForStreamStateTerminal(() => getStreamInfo(context, runId, streamIdOrName), waitOptions, { waitForChange: ({ signal }) => waitForStreamStorageChange(context, runId, signal) });
|
|
33
|
+
}
|
|
34
|
+
async function waitForStreamStorageChange(context, runId, signal) {
|
|
35
|
+
await context.store.waitForEventHistoryChange(runId, { signal });
|
|
36
|
+
}
|
|
37
|
+
async function* followStreamState(read, options = {}, waitOptions = {}) {
|
|
38
|
+
if (options.fromIndex !== void 0 && options.fromTail !== void 0) WorkflowStreamError.readOffsetConflict();
|
|
39
|
+
const pollInterval = options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL;
|
|
40
|
+
const maxChunks = options.pageSize ?? options.maxChunks;
|
|
41
|
+
let nextIndex = options.fromIndex;
|
|
42
|
+
let initialFromTail = options.fromTail;
|
|
43
|
+
while (true) {
|
|
44
|
+
if (options.signal?.aborted) return;
|
|
45
|
+
const stream = await read({
|
|
46
|
+
fromIndex: nextIndex,
|
|
47
|
+
fromTail: nextIndex === void 0 ? initialFromTail : void 0,
|
|
48
|
+
maxChunks
|
|
49
|
+
});
|
|
50
|
+
initialFromTail = void 0;
|
|
51
|
+
for (const chunk of stream.chunks) {
|
|
52
|
+
if (options.signal?.aborted) return;
|
|
53
|
+
nextIndex = chunk.index + 1;
|
|
54
|
+
yield {
|
|
55
|
+
kind: "chunk",
|
|
56
|
+
runId: stream.runId,
|
|
57
|
+
streamId: stream.id,
|
|
58
|
+
streamName: stream.name,
|
|
59
|
+
chunk
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (nextIndex !== void 0 && nextIndex < stream.chunkCount) continue;
|
|
63
|
+
if (stream.status !== "open") {
|
|
64
|
+
if (options.includeTerminal !== false) {
|
|
65
|
+
const info = {
|
|
66
|
+
runId: stream.runId,
|
|
67
|
+
id: stream.id,
|
|
68
|
+
name: stream.name,
|
|
69
|
+
status: stream.status,
|
|
70
|
+
createdAt: stream.createdAt,
|
|
71
|
+
updatedAt: stream.updatedAt,
|
|
72
|
+
contentType: stream.contentType,
|
|
73
|
+
metadata: stream.metadata,
|
|
74
|
+
chunkCount: stream.chunkCount,
|
|
75
|
+
lastIndex: stream.lastIndex,
|
|
76
|
+
error: stream.error
|
|
77
|
+
};
|
|
78
|
+
yield {
|
|
79
|
+
kind: stream.status,
|
|
80
|
+
runId: stream.runId,
|
|
81
|
+
streamId: stream.id,
|
|
82
|
+
streamName: stream.name,
|
|
83
|
+
info
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
await waitForStreamChangeOrPoll(nonNegativeTimerDelay(pollInterval, "Workflow stream follow pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Waits for the next stream change, or for one poll interval when changes cannot be watched. */
|
|
92
|
+
async function pollForStreamChange(options, waitOptions) {
|
|
93
|
+
await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
|
|
94
|
+
}
|
|
95
|
+
async function waitForStreamState(readInfo, options = {}, waitOptions = {}) {
|
|
96
|
+
while (true) {
|
|
97
|
+
if (options.signal?.aborted) return;
|
|
98
|
+
try {
|
|
99
|
+
return await readInfo();
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (!matchesWorkflowError(error, WorkflowErrorCode.STREAM_NOT_FOUND)) throw error;
|
|
102
|
+
}
|
|
103
|
+
await pollForStreamChange(options, waitOptions);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function waitForStreamStateChunk(read, afterIndex, options = {}, waitOptions = {}) {
|
|
107
|
+
if (!isNonNegativeSafeInteger(afterIndex)) WorkflowOptionsError.nonNegativeSafeInteger("Workflow stream chunk wait afterIndex");
|
|
108
|
+
while (true) {
|
|
109
|
+
if (options.signal?.aborted) return;
|
|
110
|
+
const stream = await read({ fromIndex: afterIndex + 1 });
|
|
111
|
+
const chunk = stream.chunks[0];
|
|
112
|
+
if (chunk !== void 0) return chunk;
|
|
113
|
+
if (stream.status !== "open") return;
|
|
114
|
+
await pollForStreamChange(options, waitOptions);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function waitForStreamStateTerminal(readInfo, options = {}, waitOptions = {}) {
|
|
118
|
+
while (true) {
|
|
119
|
+
if (options.signal?.aborted === true) return;
|
|
120
|
+
const info = await readInfo();
|
|
121
|
+
if (info.status !== "open") return info;
|
|
122
|
+
await pollForStreamChange(options, waitOptions);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function sleepForStreamFollow(milliseconds, signal) {
|
|
126
|
+
if (milliseconds === 0 || signal?.aborted) return;
|
|
127
|
+
await new Promise((resolve) => {
|
|
128
|
+
const timer = setTimeout(resolve, milliseconds);
|
|
129
|
+
signal?.addEventListener("abort", () => {
|
|
130
|
+
clearTimeout(timer);
|
|
131
|
+
resolve();
|
|
132
|
+
}, { once: true });
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async function waitForStreamChangeOrPoll(milliseconds, signal, waitForChange) {
|
|
136
|
+
if (waitForChange === void 0) {
|
|
137
|
+
await sleepForStreamFollow(milliseconds, signal);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const controller = new AbortController();
|
|
141
|
+
const abort = () => {
|
|
142
|
+
controller.abort();
|
|
143
|
+
};
|
|
144
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
145
|
+
try {
|
|
146
|
+
if (signal?.aborted === true) return;
|
|
147
|
+
await Promise.race([sleepForStreamFollow(milliseconds, controller.signal), waitForChange({ signal: controller.signal })]);
|
|
148
|
+
} finally {
|
|
149
|
+
signal?.removeEventListener("abort", abort);
|
|
150
|
+
controller.abort();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { followStream, getStreamInfo, readStream, waitForStream, waitForStreamChunk, waitForStreamTerminal };
|
package/dist/engine/stream.d.mts
CHANGED
|
@@ -1,56 +1,11 @@
|
|
|
1
|
-
import { RunId } from "../types/
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { EventRecord } from "../types/events.mjs";
|
|
7
|
-
import { WorkflowEventHistoryWatcher, WorkflowEventReader, WorkflowRunReaderRepository } from "../types/store.mjs";
|
|
8
|
-
import { WorkflowExecutionEnvironment } from "../types/engine.mjs";
|
|
1
|
+
import { RunId, StreamIdOrName } from "../types/ids.mjs";
|
|
2
|
+
import { ReadStreamOptions, StreamInfo, StreamState } from "../types/stream.mjs";
|
|
3
|
+
import { StepStreamApi } from "../types/step.mjs";
|
|
4
|
+
import { History } from "../history/replay.mjs";
|
|
5
|
+
import { ExecutionEnvironment } from "../types/engine.mjs";
|
|
9
6
|
import "temporal-polyfill/global";
|
|
10
7
|
//#region src/engine/stream.d.ts
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
(): Promise<StreamInfo>;
|
|
16
|
-
}
|
|
17
|
-
interface WorkflowStreamChangeWaiter {
|
|
18
|
-
(options: {
|
|
19
|
-
readonly signal?: AbortSignal;
|
|
20
|
-
}): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
interface WorkflowStreamWaitOptions {
|
|
23
|
-
readonly waitForChange?: WorkflowStreamChangeWaiter;
|
|
24
|
-
}
|
|
25
|
-
type WorkflowStreamStore = WorkflowRunReaderRepository & WorkflowEventReader & WorkflowEventHistoryWatcher;
|
|
26
|
-
interface WorkflowStreamServiceOptions {
|
|
27
|
-
readonly store: WorkflowStreamStore;
|
|
28
|
-
}
|
|
29
|
-
declare function getStreamInfoForRun(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName): Promise<StreamInfo>;
|
|
30
|
-
declare function readStreamForRun<TChunk = unknown>(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName, readOptions?: ReadStreamOptions): Promise<StreamState<TChunk>>;
|
|
31
|
-
declare function readStreamPageForRun<TChunk = unknown>(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName, readOptions?: ReadStreamPageOptions): Promise<StreamPage<TChunk>>;
|
|
32
|
-
declare function followStreamForRun<TChunk = unknown>(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName, followOptions?: FollowStreamOptions): AsyncIterable<StreamUpdate<TChunk>>;
|
|
33
|
-
declare function waitForStreamForRun(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName, waitOptions?: WaitStreamOptions): Promise<StreamInfo | undefined>;
|
|
34
|
-
declare function waitForStreamChunkForRun<TChunk = unknown>(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName, afterIndex: number, waitOptions?: WaitStreamOptions): Promise<StreamChunk<TChunk> | undefined>;
|
|
35
|
-
declare function waitForStreamTerminalForRun(service: WorkflowStreamServiceOptions, runId: RunId, streamIdOrName: StreamIdOrName, waitOptions?: WaitStreamOptions): Promise<StreamInfo | undefined>;
|
|
36
|
-
declare function createWorkflowStepStreamApi(environment: WorkflowExecutionEnvironment): WorkflowStepStreamApi;
|
|
37
|
-
declare function createStream<TChunk>(environment: WorkflowExecutionEnvironment, identity: WorkflowStepIdentity<"stream">, name: string, options?: CreateStreamOptions): Stream<TChunk>;
|
|
38
|
-
declare class Stream<TChunk> implements Stream$1<TChunk> {
|
|
39
|
-
#private;
|
|
40
|
-
readonly id: string;
|
|
41
|
-
readonly name: string;
|
|
42
|
-
readonly contentType?: string;
|
|
43
|
-
readonly metadata?: unknown;
|
|
44
|
-
constructor(environment: WorkflowExecutionEnvironment, identity: WorkflowStepIdentity<"stream">, name: string, options?: CreateStreamOptions);
|
|
45
|
-
write(chunk: TChunk): Promise<void>;
|
|
46
|
-
close(): Promise<void>;
|
|
47
|
-
error(error: unknown): Promise<void>;
|
|
48
|
-
}
|
|
49
|
-
declare function readStream<TChunk = unknown>(runId: RunId, events: readonly EventRecord[], streamIdOrName: StreamIdOrName, options?: ReadStreamOptions): StreamState<TChunk>;
|
|
50
|
-
declare function followStream<TChunk = unknown>(read: WorkflowStreamReader<TChunk>, options?: FollowStreamOptions, waitOptions?: WorkflowStreamWaitOptions): AsyncIterable<StreamUpdate<TChunk>>;
|
|
51
|
-
declare function waitForStream(readInfo: WorkflowStreamInfoReader, options?: WaitStreamOptions, waitOptions?: WorkflowStreamWaitOptions): Promise<StreamInfo | undefined>;
|
|
52
|
-
declare function waitForStreamChunk<TChunk = unknown>(read: WorkflowStreamReader<TChunk>, afterIndex: number, options?: WaitStreamOptions, waitOptions?: WorkflowStreamWaitOptions): Promise<StreamChunk<TChunk> | undefined>;
|
|
53
|
-
declare function waitForStreamTerminal(readInfo: WorkflowStreamInfoReader, options?: WaitStreamOptions, waitOptions?: WorkflowStreamWaitOptions): Promise<StreamInfo | undefined>;
|
|
54
|
-
declare function getStreamInfo(runId: RunId, events: readonly EventRecord[], streamIdOrName: StreamIdOrName): StreamInfo;
|
|
55
|
-
//#endregion
|
|
56
|
-
export { createStream, createWorkflowStepStreamApi, followStream, followStreamForRun, getStreamInfo, getStreamInfoForRun, readStream, readStreamForRun, readStreamPageForRun, waitForStream, waitForStreamChunk, waitForStreamChunkForRun, waitForStreamForRun, waitForStreamTerminal, waitForStreamTerminalForRun };
|
|
8
|
+
export declare function createStepStreamApi(environment: ExecutionEnvironment): StepStreamApi;
|
|
9
|
+
export declare function readStreamFromHistory(runId: RunId, history: History, streamIdOrName: StreamIdOrName, options?: ReadStreamOptions): StreamState;
|
|
10
|
+
export declare function getStreamInfoFromHistory(runId: RunId, history: History, streamIdOrName: StreamIdOrName): StreamInfo;
|
|
11
|
+
//#endregion
|
package/dist/engine/stream.mjs
CHANGED
|
@@ -1,59 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
2
2
|
import { WorkflowReplayDivergenceError } from "../errors/failures.mjs";
|
|
3
|
-
import { getRequiredRun, isNonNegativeSafeInteger } from "../utility.mjs";
|
|
4
3
|
import { WorkflowStreamError, WorkflowStreamNotFoundError } from "../errors/stream.mjs";
|
|
5
4
|
import "../errors/mod.mjs";
|
|
6
|
-
import { nonNegativeTimerDelay } from "../timer.mjs";
|
|
7
5
|
import { serializeError, toOptionalPersistedValue, toPersistedValue } from "./serialization.mjs";
|
|
8
|
-
import {
|
|
9
|
-
import "./
|
|
10
|
-
import { makeStreamChunkCursorKey, pageItems } from "../pagination.mjs";
|
|
11
|
-
import { resolveWorkflowCommandIdentity } from "./command-identity.mjs";
|
|
12
|
-
import { appendDurableStepStartedEvent, appendDurableStepTerminalEvent } from "./durable-command.mjs";
|
|
6
|
+
import { resolveCommandIdentity } from "./command-identity.mjs";
|
|
7
|
+
import { appendDurableEvent, appendDurableStepStartedEvent } from "./durable-command.mjs";
|
|
13
8
|
import "temporal-polyfill/global";
|
|
14
9
|
import { deepEquals } from "@temelj/value";
|
|
15
10
|
//#region src/engine/stream.ts
|
|
16
11
|
const DEFAULT_MAXIMUM_STREAM_CHUNKS = 1e3;
|
|
17
|
-
|
|
18
|
-
async function getStreamInfoForRun(service, runId, streamIdOrName) {
|
|
19
|
-
await getRequiredRun(service.store, runId);
|
|
20
|
-
return getStreamInfoFromHistory(runId, new WorkflowHistory(await service.store.getEvents(runId)), streamIdOrName);
|
|
21
|
-
}
|
|
22
|
-
async function readStreamForRun(service, runId, streamIdOrName, readOptions) {
|
|
23
|
-
await getRequiredRun(service.store, runId);
|
|
24
|
-
return readStreamFromHistory(runId, new WorkflowHistory(await service.store.getEvents(runId)), streamIdOrName, readOptions);
|
|
25
|
-
}
|
|
26
|
-
async function readStreamPageForRun(service, runId, streamIdOrName, readOptions) {
|
|
27
|
-
const stream = await readStreamForRun(service, runId, streamIdOrName, readOptions);
|
|
28
|
-
return {
|
|
29
|
-
...stream,
|
|
30
|
-
chunks: pageItems(stream.chunks, readOptions, "Workflow stream page", makeStreamChunkCursorKey)
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
function followStreamForRun(service, runId, streamIdOrName, followOptions) {
|
|
34
|
-
return followStream(async (readOptions) => await readStreamForRun(service, runId, streamIdOrName, readOptions), followOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
|
|
35
|
-
}
|
|
36
|
-
async function waitForStreamForRun(service, runId, streamIdOrName, waitOptions) {
|
|
37
|
-
return await waitForStream(async () => await getStreamInfoForRun(service, runId, streamIdOrName), waitOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
|
|
38
|
-
}
|
|
39
|
-
async function waitForStreamChunkForRun(service, runId, streamIdOrName, afterIndex, waitOptions) {
|
|
40
|
-
return await waitForStreamChunk(async (readOptions) => await readStreamForRun(service, runId, streamIdOrName, readOptions), afterIndex, waitOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
|
|
41
|
-
}
|
|
42
|
-
async function waitForStreamTerminalForRun(service, runId, streamIdOrName, waitOptions) {
|
|
43
|
-
return await waitForStreamTerminal(async () => await getStreamInfoForRun(service, runId, streamIdOrName), waitOptions, { waitForChange: async ({ signal }) => await waitForStreamStorageChange(service, runId, signal) });
|
|
44
|
-
}
|
|
45
|
-
async function waitForStreamStorageChange(service, runId, signal) {
|
|
46
|
-
await service.store.waitForEventHistoryChange(runId, { signal });
|
|
47
|
-
}
|
|
48
|
-
function createWorkflowStepStreamApi(environment) {
|
|
12
|
+
function createStepStreamApi(environment) {
|
|
49
13
|
const { history } = environment;
|
|
50
14
|
return { create(commandId, options = {}) {
|
|
51
|
-
return
|
|
15
|
+
return new Stream(environment, resolveCommandIdentity(history, "stream", commandId), commandId, options);
|
|
52
16
|
} };
|
|
53
17
|
}
|
|
54
|
-
function createStream(environment, identity, name, options = {}) {
|
|
55
|
-
return new Stream(environment, identity, name, options);
|
|
56
|
-
}
|
|
57
18
|
var Stream = class {
|
|
58
19
|
id;
|
|
59
20
|
name;
|
|
@@ -83,8 +44,20 @@ var Stream = class {
|
|
|
83
44
|
this.#maximumChunks = maximumChunks;
|
|
84
45
|
this.#persistedMetadata = persistedMetadata;
|
|
85
46
|
}
|
|
86
|
-
async
|
|
47
|
+
async #start() {
|
|
87
48
|
await ensureStreamStarted(this.#environment, this.#identity, this.id, this.contentType, this.#persistedMetadata);
|
|
49
|
+
}
|
|
50
|
+
/** Fields every event of this stream carries. */
|
|
51
|
+
#eventFields() {
|
|
52
|
+
return {
|
|
53
|
+
timestamp: this.#environment.now(),
|
|
54
|
+
stepId: this.#identity.id,
|
|
55
|
+
stepName: this.#identity.name,
|
|
56
|
+
streamId: this.id
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async write(chunk) {
|
|
60
|
+
await this.#start();
|
|
88
61
|
const persistedChunk = toPersistedValue(chunk, `workflow stream ${this.id} chunk`, this.#environment.limits);
|
|
89
62
|
const existing = this.#environment.history.streamChunk(this.#identity.id, this.#nextChunkIndex);
|
|
90
63
|
const index = this.#nextChunkIndex;
|
|
@@ -94,46 +67,37 @@ var Stream = class {
|
|
|
94
67
|
return;
|
|
95
68
|
}
|
|
96
69
|
requireStreamOpen(this.#environment, this.#identity.id, this.id);
|
|
97
|
-
if (index >= this.#maximumChunks) WorkflowStreamError
|
|
98
|
-
await appendDurableStepTerminalEvent(this.#environment, {
|
|
99
|
-
kind: "stream_chunk",
|
|
100
|
-
timestamp: this.#environment.now(),
|
|
101
|
-
stepId: this.#identity.id,
|
|
102
|
-
stepName: this.#identity.name,
|
|
70
|
+
if (index >= this.#maximumChunks) throw new WorkflowStreamError(`Workflow stream ${this.id} chunk count would exceed maximumStreamChunks ${this.#maximumChunks}`, WorkflowErrorCode.STREAM_CHUNK_LIMIT_EXCEEDED, {
|
|
103
71
|
streamId: this.id,
|
|
72
|
+
maximumChunks: this.#maximumChunks
|
|
73
|
+
});
|
|
74
|
+
await appendDurableEvent(this.#environment, {
|
|
75
|
+
kind: "stream_chunk",
|
|
76
|
+
...this.#eventFields(),
|
|
104
77
|
index,
|
|
105
78
|
chunk: persistedChunk
|
|
106
79
|
});
|
|
107
80
|
}
|
|
108
81
|
async close() {
|
|
109
|
-
await
|
|
82
|
+
await this.#start();
|
|
110
83
|
if (this.#environment.history.closedStream(this.#identity.id) !== void 0) return;
|
|
111
84
|
requireStreamOpen(this.#environment, this.#identity.id, this.id);
|
|
112
|
-
await
|
|
85
|
+
await appendDurableEvent(this.#environment, {
|
|
113
86
|
kind: "stream_closed",
|
|
114
|
-
|
|
115
|
-
stepId: this.#identity.id,
|
|
116
|
-
stepName: this.#identity.name,
|
|
117
|
-
streamId: this.id
|
|
87
|
+
...this.#eventFields()
|
|
118
88
|
});
|
|
119
89
|
}
|
|
120
|
-
async error(
|
|
121
|
-
await
|
|
90
|
+
async error(cause) {
|
|
91
|
+
await this.#start();
|
|
122
92
|
if (this.#environment.history.failedStream(this.#identity.id) !== void 0) return;
|
|
123
93
|
requireStreamOpen(this.#environment, this.#identity.id, this.id);
|
|
124
|
-
await
|
|
94
|
+
await appendDurableEvent(this.#environment, {
|
|
125
95
|
kind: "stream_failed",
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
stepName: this.#identity.name,
|
|
129
|
-
streamId: this.id,
|
|
130
|
-
error: serializeError(error)
|
|
96
|
+
...this.#eventFields(),
|
|
97
|
+
error: serializeError(cause)
|
|
131
98
|
});
|
|
132
99
|
}
|
|
133
100
|
};
|
|
134
|
-
function readStream(runId, events, streamIdOrName, options = {}) {
|
|
135
|
-
return readStreamFromHistory(runId, new WorkflowHistory(events), streamIdOrName, options);
|
|
136
|
-
}
|
|
137
101
|
function readStreamFromHistory(runId, history, streamIdOrName, options = {}) {
|
|
138
102
|
if (options.fromIndex !== void 0 && options.fromTail !== void 0) WorkflowStreamError.readOffsetConflict();
|
|
139
103
|
const projection = requireStreamProjectionFromHistory(history, streamIdOrName);
|
|
@@ -149,96 +113,12 @@ function readStreamFromHistory(runId, history, streamIdOrName, options = {}) {
|
|
|
149
113
|
chunks
|
|
150
114
|
};
|
|
151
115
|
}
|
|
152
|
-
async function* followStream(read, options = {}, waitOptions = {}) {
|
|
153
|
-
if (options.fromIndex !== void 0 && options.fromTail !== void 0) WorkflowStreamError.readOffsetConflict();
|
|
154
|
-
const pollInterval = options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL;
|
|
155
|
-
const maxChunks = options.pageSize ?? options.maxChunks;
|
|
156
|
-
let nextIndex = options.fromIndex;
|
|
157
|
-
let initialFromTail = options.fromTail;
|
|
158
|
-
while (true) {
|
|
159
|
-
if (options.signal?.aborted) return;
|
|
160
|
-
const stream = await read({
|
|
161
|
-
...nextIndex === void 0 ? {} : { fromIndex: nextIndex },
|
|
162
|
-
...nextIndex === void 0 && initialFromTail !== void 0 ? { fromTail: initialFromTail } : {},
|
|
163
|
-
...maxChunks === void 0 ? {} : { maxChunks }
|
|
164
|
-
});
|
|
165
|
-
initialFromTail = void 0;
|
|
166
|
-
for (const chunk of stream.chunks) {
|
|
167
|
-
if (options.signal?.aborted) return;
|
|
168
|
-
nextIndex = chunk.index + 1;
|
|
169
|
-
yield {
|
|
170
|
-
kind: "chunk",
|
|
171
|
-
runId: stream.runId,
|
|
172
|
-
streamId: stream.id,
|
|
173
|
-
streamName: stream.name,
|
|
174
|
-
chunk
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
if (nextIndex !== void 0 && nextIndex < stream.chunkCount) continue;
|
|
178
|
-
if (stream.status !== "open") {
|
|
179
|
-
if (options.includeTerminal !== false) yield {
|
|
180
|
-
kind: stream.status,
|
|
181
|
-
runId: stream.runId,
|
|
182
|
-
streamId: stream.id,
|
|
183
|
-
streamName: stream.name,
|
|
184
|
-
info: {
|
|
185
|
-
runId: stream.runId,
|
|
186
|
-
id: stream.id,
|
|
187
|
-
name: stream.name,
|
|
188
|
-
status: stream.status,
|
|
189
|
-
createdAt: stream.createdAt,
|
|
190
|
-
updatedAt: stream.updatedAt,
|
|
191
|
-
...stream.contentType === void 0 ? {} : { contentType: stream.contentType },
|
|
192
|
-
...stream.metadata === void 0 ? {} : { metadata: stream.metadata },
|
|
193
|
-
chunkCount: stream.chunkCount,
|
|
194
|
-
...stream.lastIndex === void 0 ? {} : { lastIndex: stream.lastIndex },
|
|
195
|
-
...stream.error === void 0 ? {} : { error: stream.error }
|
|
196
|
-
}
|
|
197
|
-
};
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
await waitForStreamChangeOrPoll(nonNegativeTimerDelay(pollInterval, "Workflow stream follow pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
async function waitForStream(readInfo, options = {}, waitOptions = {}) {
|
|
204
|
-
while (true) {
|
|
205
|
-
if (options.signal?.aborted) return;
|
|
206
|
-
try {
|
|
207
|
-
return await readInfo();
|
|
208
|
-
} catch (error) {
|
|
209
|
-
if (!WorkflowStreamNotFoundError.isNotFound(error)) throw error;
|
|
210
|
-
}
|
|
211
|
-
await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
async function waitForStreamChunk(read, afterIndex, options = {}, waitOptions = {}) {
|
|
215
|
-
if (!isNonNegativeSafeInteger(afterIndex)) WorkflowOptionsError.nonNegativeSafeInteger("Workflow stream chunk wait afterIndex");
|
|
216
|
-
while (true) {
|
|
217
|
-
if (options.signal?.aborted) return;
|
|
218
|
-
const stream = await read({ fromIndex: afterIndex + 1 });
|
|
219
|
-
const chunk = stream.chunks[0];
|
|
220
|
-
if (chunk !== void 0) return chunk;
|
|
221
|
-
if (stream.status !== "open") return;
|
|
222
|
-
await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
async function waitForStreamTerminal(readInfo, options = {}, waitOptions = {}) {
|
|
226
|
-
while (true) {
|
|
227
|
-
if (options.signal?.aborted === true) return;
|
|
228
|
-
const info = await readInfo();
|
|
229
|
-
if (info.status !== "open") return info;
|
|
230
|
-
await waitForStreamChangeOrPoll(nonNegativeTimerDelay(options.pollInterval ?? DEFAULT_STREAM_FOLLOW_POLL_INTERVAL, "Workflow stream wait pollInterval").clampedDelay, options.signal, waitOptions.waitForChange);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
function getStreamInfo(runId, events, streamIdOrName) {
|
|
234
|
-
return getStreamInfoFromHistory(runId, new WorkflowHistory(events), streamIdOrName);
|
|
235
|
-
}
|
|
236
116
|
function getStreamInfoFromHistory(runId, history, streamIdOrName) {
|
|
237
117
|
return getStreamInfoFromProjection(runId, requireStreamProjectionFromHistory(history, streamIdOrName));
|
|
238
118
|
}
|
|
239
119
|
function requireStreamProjectionFromHistory(history, streamIdOrName) {
|
|
240
120
|
const projection = history.streamProjection(streamIdOrName);
|
|
241
|
-
if (projection === void 0) WorkflowStreamNotFoundError
|
|
121
|
+
if (projection === void 0) throw new WorkflowStreamNotFoundError(streamIdOrName);
|
|
242
122
|
return projection;
|
|
243
123
|
}
|
|
244
124
|
function getStreamInfoFromProjection(runId, projection) {
|
|
@@ -252,20 +132,28 @@ function getStreamInfoFromProjection(runId, projection) {
|
|
|
252
132
|
status: failed === void 0 ? closed === void 0 ? "open" : "closed" : "failed",
|
|
253
133
|
createdAt: started.timestamp,
|
|
254
134
|
updatedAt: failed?.event.timestamp ?? closed?.event.timestamp ?? latestChunk?.timestamp ?? started.timestamp,
|
|
255
|
-
|
|
256
|
-
|
|
135
|
+
contentType: started.contentType,
|
|
136
|
+
metadata: started.metadata,
|
|
257
137
|
chunkCount: chunks.length,
|
|
258
|
-
|
|
259
|
-
|
|
138
|
+
lastIndex: latestChunk?.index,
|
|
139
|
+
error: failed?.event.error
|
|
260
140
|
};
|
|
261
141
|
}
|
|
262
142
|
function requireStreamEventOrder(projection) {
|
|
263
143
|
const { started, chunks, closed, failed } = projection;
|
|
264
|
-
for (const [index, chunk] of chunks.entries()) if (chunk.event.index !== index) WorkflowStreamError
|
|
144
|
+
for (const [index, chunk] of chunks.entries()) if (chunk.event.index !== index) throw new WorkflowStreamError(`Workflow stream ${started.streamId} has non-contiguous chunk index ${chunk.event.index}; expected ${index}`, WorkflowErrorCode.STREAM_CHUNK_INDEX_NON_CONTIGUOUS, {
|
|
145
|
+
streamId: started.streamId,
|
|
146
|
+
actualIndex: chunk.event.index,
|
|
147
|
+
expectedIndex: index
|
|
148
|
+
});
|
|
265
149
|
const terminal = earliestStreamTerminalEvent(closed, failed);
|
|
266
150
|
if (terminal === void 0) return;
|
|
267
151
|
const lateChunk = chunks.find((chunk) => chunk.index > terminal.index);
|
|
268
|
-
if (lateChunk !== void 0) WorkflowStreamError
|
|
152
|
+
if (lateChunk !== void 0) throw new WorkflowStreamError(`Workflow stream ${started.streamId} has chunk ${lateChunk.event.index} after terminal event ${terminal.event.kind}`, WorkflowErrorCode.STREAM_CHUNK_AFTER_TERMINAL, {
|
|
153
|
+
streamId: started.streamId,
|
|
154
|
+
chunkIndex: lateChunk.event.index,
|
|
155
|
+
terminalKind: terminal.event.kind
|
|
156
|
+
});
|
|
269
157
|
}
|
|
270
158
|
function earliestStreamTerminalEvent(closed, failed) {
|
|
271
159
|
if (closed === void 0) return failed;
|
|
@@ -274,47 +162,20 @@ function earliestStreamTerminalEvent(closed, failed) {
|
|
|
274
162
|
}
|
|
275
163
|
async function ensureStreamStarted(environment, identity, streamId, contentType, metadata) {
|
|
276
164
|
if (environment.history.startedStream(identity.id) !== void 0) return;
|
|
277
|
-
|
|
165
|
+
const event = {
|
|
278
166
|
kind: "stream_started",
|
|
279
167
|
timestamp: environment.now(),
|
|
280
168
|
stepId: identity.id,
|
|
281
169
|
stepName: identity.name,
|
|
282
170
|
count: identity.count,
|
|
283
171
|
streamId,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
async function sleepForStreamFollow(milliseconds, signal) {
|
|
289
|
-
if (milliseconds === 0 || signal?.aborted) return;
|
|
290
|
-
await new Promise((resolve) => {
|
|
291
|
-
const timer = setTimeout(resolve, milliseconds);
|
|
292
|
-
signal?.addEventListener("abort", () => {
|
|
293
|
-
clearTimeout(timer);
|
|
294
|
-
resolve();
|
|
295
|
-
}, { once: true });
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
async function waitForStreamChangeOrPoll(milliseconds, signal, waitForChange) {
|
|
299
|
-
if (waitForChange === void 0) {
|
|
300
|
-
await sleepForStreamFollow(milliseconds, signal);
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
const controller = new AbortController();
|
|
304
|
-
const abort = () => {
|
|
305
|
-
controller.abort();
|
|
172
|
+
contentType,
|
|
173
|
+
metadata
|
|
306
174
|
};
|
|
307
|
-
|
|
308
|
-
try {
|
|
309
|
-
if (signal?.aborted === true) return;
|
|
310
|
-
await Promise.race([sleepForStreamFollow(milliseconds, controller.signal), waitForChange({ signal: controller.signal })]);
|
|
311
|
-
} finally {
|
|
312
|
-
signal?.removeEventListener("abort", abort);
|
|
313
|
-
controller.abort();
|
|
314
|
-
}
|
|
175
|
+
await appendDurableStepStartedEvent(environment, event);
|
|
315
176
|
}
|
|
316
177
|
function requireStreamOpen(environment, stepId, streamId) {
|
|
317
|
-
if (environment.history.closedStream(stepId) !== void 0 || environment.history.failedStream(stepId) !== void 0) WorkflowStreamError
|
|
178
|
+
if (environment.history.closedStream(stepId) !== void 0 || environment.history.failedStream(stepId) !== void 0) throw new WorkflowStreamError(`Workflow stream is already closed: ${streamId}`, WorkflowErrorCode.STREAM_ALREADY_CLOSED, { streamId });
|
|
318
179
|
}
|
|
319
180
|
function requireStreamReplayMatches(identity, recorded, next) {
|
|
320
181
|
if (recorded.stepId === identity.id && recorded.stepName === identity.name && recorded.streamId === next.streamId && recorded.contentType === next.contentType && deepEquals(recorded.metadata, next.metadata)) return;
|
|
@@ -325,10 +186,7 @@ function requireStreamReplayMatches(identity, recorded, next) {
|
|
|
325
186
|
}
|
|
326
187
|
function requireStreamChunkReplayMatches(identity, index, recorded, next) {
|
|
327
188
|
if (deepEquals(recorded, next)) return;
|
|
328
|
-
WorkflowReplayDivergenceError.
|
|
329
|
-
expectedStepId: identity.id,
|
|
330
|
-
actualStepId: identity.id
|
|
331
|
-
});
|
|
189
|
+
WorkflowReplayDivergenceError.atStep(identity.id, `recorded stream ${identity.id} chunk ${index} does not match replayed chunk`);
|
|
332
190
|
}
|
|
333
191
|
//#endregion
|
|
334
|
-
export {
|
|
192
|
+
export { createStepStreamApi, getStreamInfoFromHistory, readStreamFromHistory };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ScheduleRecord } from "../../types/schedule.mjs";
|
|
2
|
+
import { LockRecord } from "../../types/lock.mjs";
|
|
3
|
+
import { RecoverySummary } from "../../types/summary.mjs";
|
|
4
|
+
import { StepAttemptRecord } from "../../types/step-attempts.mjs";
|
|
5
|
+
import { RunRecord } from "../../types/run.mjs";
|
|
6
|
+
import { EventRecord } from "../../types/events.mjs";
|
|
7
|
+
//#region src/engine/summary/recovery.d.ts
|
|
8
|
+
export interface RecoverySummaryInputs {
|
|
9
|
+
readonly sleepAttempts?: readonly StepAttemptRecord[];
|
|
10
|
+
readonly messageWaitAttempts?: readonly StepAttemptRecord[];
|
|
11
|
+
readonly childWorkflowAttempts?: readonly StepAttemptRecord[];
|
|
12
|
+
readonly childRuns?: readonly RunRecord[];
|
|
13
|
+
readonly eventsByRunId?: ReadonlyMap<string, readonly EventRecord[]>;
|
|
14
|
+
readonly lockWaitAttempts?: readonly StepAttemptRecord[];
|
|
15
|
+
readonly locks?: readonly LockRecord[];
|
|
16
|
+
readonly schedules?: readonly ScheduleRecord[];
|
|
17
|
+
}
|
|
18
|
+
interface RecoverySummaryOptions {
|
|
19
|
+
readonly runs: readonly RunRecord[];
|
|
20
|
+
readonly now: Temporal.Instant;
|
|
21
|
+
readonly inputs?: RecoverySummaryInputs;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Every run that can make progress now, and when the next sleep, retry, lease, schedule,
|
|
25
|
+
* lock wait, or external wait should be checked again.
|
|
26
|
+
*/
|
|
27
|
+
export declare function summarizeRecovery(options: RecoverySummaryOptions): RecoverySummary;
|
|
28
|
+
interface LockWaitDetails {
|
|
29
|
+
readonly key: string;
|
|
30
|
+
readonly waitDeadlineAt?: Temporal.Instant;
|
|
31
|
+
}
|
|
32
|
+
/** The lock a failed step attempt was waiting for, when it failed because the lock was held. */
|
|
33
|
+
export declare function lockWaitDetails(attempt: StepAttemptRecord): LockWaitDetails | undefined;
|
|
34
|
+
//#endregion
|
|
35
|
+
export {};
|