@smthrs/engine-store 0.0.0-stage → 1.0.0-rc.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/CHANGELOG.md +247 -0
- package/LICENSE +21 -0
- package/README.md +146 -2
- package/dist/cjs/ArtifactGc.d.ts +235 -0
- package/dist/cjs/ArtifactGc.d.ts.map +1 -0
- package/dist/cjs/ArtifactGc.js +183 -0
- package/dist/cjs/ArtifactGc.js.map +7 -0
- package/dist/cjs/ArtifactSync.d.ts +164 -0
- package/dist/cjs/ArtifactSync.d.ts.map +1 -0
- package/dist/cjs/ArtifactSync.js +144 -0
- package/dist/cjs/ArtifactSync.js.map +7 -0
- package/dist/cjs/CacheSync.d.ts +112 -0
- package/dist/cjs/CacheSync.d.ts.map +1 -0
- package/dist/cjs/CacheSync.js +64 -0
- package/dist/cjs/CacheSync.js.map +7 -0
- package/dist/cjs/DeferredClockFold.d.ts +354 -0
- package/dist/cjs/DeferredClockFold.d.ts.map +1 -0
- package/dist/cjs/DeferredClockFold.js +335 -0
- package/dist/cjs/DeferredClockFold.js.map +7 -0
- package/dist/cjs/DisasterRecovery.d.ts +431 -0
- package/dist/cjs/DisasterRecovery.d.ts.map +1 -0
- package/dist/cjs/DisasterRecovery.js +453 -0
- package/dist/cjs/DisasterRecovery.js.map +7 -0
- package/dist/cjs/DurableEngineState.d.ts +776 -0
- package/dist/cjs/DurableEngineState.d.ts.map +1 -0
- package/dist/cjs/DurableEngineState.js +1536 -0
- package/dist/cjs/DurableEngineState.js.map +7 -0
- package/dist/cjs/EngineStore.d.ts +158 -0
- package/dist/cjs/EngineStore.d.ts.map +1 -0
- package/dist/cjs/EngineStore.js +398 -0
- package/dist/cjs/EngineStore.js.map +7 -0
- package/dist/cjs/EngineStoreMetrics.d.ts +276 -0
- package/dist/cjs/EngineStoreMetrics.d.ts.map +1 -0
- package/dist/cjs/EngineStoreMetrics.js +135 -0
- package/dist/cjs/EngineStoreMetrics.js.map +7 -0
- package/dist/cjs/Errors.d.ts +22 -0
- package/dist/cjs/Errors.d.ts.map +1 -0
- package/dist/cjs/Errors.js +39 -0
- package/dist/cjs/Errors.js.map +7 -0
- package/dist/cjs/EventTypes.d.ts +27 -0
- package/dist/cjs/EventTypes.d.ts.map +1 -0
- package/dist/cjs/EventTypes.js +37 -0
- package/dist/cjs/EventTypes.js.map +7 -0
- package/dist/cjs/ExecutionFacts.d.ts +59 -0
- package/dist/cjs/ExecutionFacts.d.ts.map +1 -0
- package/dist/cjs/ExecutionFacts.js +123 -0
- package/dist/cjs/ExecutionFacts.js.map +7 -0
- package/dist/cjs/ExecutionSnapshot.d.ts +117 -0
- package/dist/cjs/ExecutionSnapshot.d.ts.map +1 -0
- package/dist/cjs/ExecutionSnapshot.js +111 -0
- package/dist/cjs/ExecutionSnapshot.js.map +7 -0
- package/dist/cjs/Inconsistency.d.ts +154 -0
- package/dist/cjs/Inconsistency.d.ts.map +1 -0
- package/dist/cjs/Inconsistency.js +135 -0
- package/dist/cjs/Inconsistency.js.map +7 -0
- package/dist/cjs/Migrations.d.ts +56 -0
- package/dist/cjs/Migrations.d.ts.map +1 -0
- package/dist/cjs/Migrations.js +78 -0
- package/dist/cjs/Migrations.js.map +7 -0
- package/dist/cjs/OwnerIdentity.d.ts +91 -0
- package/dist/cjs/OwnerIdentity.d.ts.map +1 -0
- package/dist/cjs/OwnerIdentity.js +65 -0
- package/dist/cjs/OwnerIdentity.js.map +7 -0
- package/dist/cjs/PlanInputStore.d.ts +110 -0
- package/dist/cjs/PlanInputStore.d.ts.map +1 -0
- package/dist/cjs/PlanInputStore.js +224 -0
- package/dist/cjs/PlanInputStore.js.map +7 -0
- package/dist/cjs/PlanMergeStore.d.ts +113 -0
- package/dist/cjs/PlanMergeStore.d.ts.map +1 -0
- package/dist/cjs/PlanMergeStore.js +255 -0
- package/dist/cjs/PlanMergeStore.js.map +7 -0
- package/dist/cjs/PlanScheduler.d.ts +363 -0
- package/dist/cjs/PlanScheduler.d.ts.map +1 -0
- package/dist/cjs/PlanScheduler.js +1090 -0
- package/dist/cjs/PlanScheduler.js.map +7 -0
- package/dist/cjs/Reconciliation.d.ts +175 -0
- package/dist/cjs/Reconciliation.d.ts.map +1 -0
- package/dist/cjs/Reconciliation.js +119 -0
- package/dist/cjs/Reconciliation.js.map +7 -0
- package/dist/cjs/ReplayOnly.d.ts +91 -0
- package/dist/cjs/ReplayOnly.d.ts.map +1 -0
- package/dist/cjs/ReplayOnly.js +52 -0
- package/dist/cjs/ReplayOnly.js.map +7 -0
- package/dist/cjs/Retention.d.ts +113 -0
- package/dist/cjs/Retention.d.ts.map +1 -0
- package/dist/cjs/Retention.js +99 -0
- package/dist/cjs/Retention.js.map +7 -0
- package/dist/cjs/RunCatalogRead.d.ts +17 -0
- package/dist/cjs/RunCatalogRead.d.ts.map +1 -0
- package/dist/cjs/RunCatalogRead.js +33 -0
- package/dist/cjs/RunCatalogRead.js.map +7 -0
- package/dist/cjs/RunChangeFeed.d.ts +75 -0
- package/dist/cjs/RunChangeFeed.d.ts.map +1 -0
- package/dist/cjs/RunChangeFeed.js +96 -0
- package/dist/cjs/RunChangeFeed.js.map +7 -0
- package/dist/cjs/RunState.d.ts +116 -0
- package/dist/cjs/RunState.d.ts.map +1 -0
- package/dist/cjs/RunState.js +76 -0
- package/dist/cjs/RunState.js.map +7 -0
- package/dist/cjs/Selection.d.ts +495 -0
- package/dist/cjs/Selection.d.ts.map +1 -0
- package/dist/cjs/Selection.js +288 -0
- package/dist/cjs/Selection.js.map +7 -0
- package/dist/cjs/SelectionStore.d.ts +141 -0
- package/dist/cjs/SelectionStore.d.ts.map +1 -0
- package/dist/cjs/SelectionStore.js +229 -0
- package/dist/cjs/SelectionStore.js.map +7 -0
- package/dist/cjs/StepBoundary.d.ts +501 -0
- package/dist/cjs/StepBoundary.d.ts.map +1 -0
- package/dist/cjs/StepBoundary.js +619 -0
- package/dist/cjs/StepBoundary.js.map +7 -0
- package/dist/cjs/StepCacheFold.d.ts +148 -0
- package/dist/cjs/StepCacheFold.d.ts.map +1 -0
- package/dist/cjs/StepCacheFold.js +131 -0
- package/dist/cjs/StepCacheFold.js.map +7 -0
- package/dist/cjs/StepSandbox.d.ts +78 -0
- package/dist/cjs/StepSandbox.d.ts.map +1 -0
- package/dist/cjs/StepSandbox.js +75 -0
- package/dist/cjs/StepSandbox.js.map +7 -0
- package/dist/cjs/WakeBus.d.ts +116 -0
- package/dist/cjs/WakeBus.d.ts.map +1 -0
- package/dist/cjs/WakeBus.js +89 -0
- package/dist/cjs/WakeBus.js.map +7 -0
- package/dist/cjs/WorkspaceSandbox.d.ts +619 -0
- package/dist/cjs/WorkspaceSandbox.d.ts.map +1 -0
- package/dist/cjs/WorkspaceSandbox.js +711 -0
- package/dist/cjs/WorkspaceSandbox.js.map +7 -0
- package/dist/cjs/index.d.ts +157 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +95 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/ActionPersistence.d.ts +276 -0
- package/dist/cjs/internal/ActionPersistence.d.ts.map +1 -0
- package/dist/cjs/internal/ActionPersistence.js +1395 -0
- package/dist/cjs/internal/ActionPersistence.js.map +7 -0
- package/dist/cjs/internal/ArtifactRoots.d.ts +38 -0
- package/dist/cjs/internal/ArtifactRoots.d.ts.map +1 -0
- package/dist/cjs/internal/ArtifactRoots.js +89 -0
- package/dist/cjs/internal/ArtifactRoots.js.map +7 -0
- package/dist/cjs/internal/AttemptAdmission.d.ts +53 -0
- package/dist/cjs/internal/AttemptAdmission.d.ts.map +1 -0
- package/dist/cjs/internal/AttemptAdmission.js +52 -0
- package/dist/cjs/internal/AttemptAdmission.js.map +7 -0
- package/dist/cjs/internal/AttemptLifecycle.d.ts +245 -0
- package/dist/cjs/internal/AttemptLifecycle.d.ts.map +1 -0
- package/dist/cjs/internal/AttemptLifecycle.js +112 -0
- package/dist/cjs/internal/AttemptLifecycle.js.map +7 -0
- package/dist/cjs/internal/AttemptProbe.d.ts +53 -0
- package/dist/cjs/internal/AttemptProbe.d.ts.map +1 -0
- package/dist/cjs/internal/AttemptProbe.js +66 -0
- package/dist/cjs/internal/AttemptProbe.js.map +7 -0
- package/dist/cjs/internal/CacheAdmission.d.ts +79 -0
- package/dist/cjs/internal/CacheAdmission.d.ts.map +1 -0
- package/dist/cjs/internal/CacheAdmission.js +71 -0
- package/dist/cjs/internal/CacheAdmission.js.map +7 -0
- package/dist/cjs/internal/CacheAgeHistory.d.ts +27 -0
- package/dist/cjs/internal/CacheAgeHistory.d.ts.map +1 -0
- package/dist/cjs/internal/CacheAgeHistory.js +61 -0
- package/dist/cjs/internal/CacheAgeHistory.js.map +7 -0
- package/dist/cjs/internal/CacheAgeVerdicts.d.ts +15 -0
- package/dist/cjs/internal/CacheAgeVerdicts.d.ts.map +1 -0
- package/dist/cjs/internal/CacheAgeVerdicts.js +73 -0
- package/dist/cjs/internal/CacheAgeVerdicts.js.map +7 -0
- package/dist/cjs/internal/CacheOutputPolicy.d.ts +24 -0
- package/dist/cjs/internal/CacheOutputPolicy.d.ts.map +1 -0
- package/dist/cjs/internal/CacheOutputPolicy.js +75 -0
- package/dist/cjs/internal/CacheOutputPolicy.js.map +7 -0
- package/dist/cjs/internal/CachePublication.d.ts +97 -0
- package/dist/cjs/internal/CachePublication.d.ts.map +1 -0
- package/dist/cjs/internal/CachePublication.js +80 -0
- package/dist/cjs/internal/CachePublication.js.map +7 -0
- package/dist/cjs/internal/CallFacts.d.ts +15 -0
- package/dist/cjs/internal/CallFacts.d.ts.map +1 -0
- package/dist/cjs/internal/CallFacts.js +97 -0
- package/dist/cjs/internal/CallFacts.js.map +7 -0
- package/dist/cjs/internal/CopiedRecord.d.ts +61 -0
- package/dist/cjs/internal/CopiedRecord.d.ts.map +1 -0
- package/dist/cjs/internal/CopiedRecord.js +134 -0
- package/dist/cjs/internal/CopiedRecord.js.map +7 -0
- package/dist/cjs/internal/DeferredPersistence.d.ts +108 -0
- package/dist/cjs/internal/DeferredPersistence.d.ts.map +1 -0
- package/dist/cjs/internal/DeferredPersistence.js +270 -0
- package/dist/cjs/internal/DeferredPersistence.js.map +7 -0
- package/dist/cjs/internal/EffectRecords.d.ts +92 -0
- package/dist/cjs/internal/EffectRecords.d.ts.map +1 -0
- package/dist/cjs/internal/EffectRecords.js +63 -0
- package/dist/cjs/internal/EffectRecords.js.map +7 -0
- package/dist/cjs/internal/EngineJj.d.ts +30 -0
- package/dist/cjs/internal/EngineJj.d.ts.map +1 -0
- package/dist/cjs/internal/EngineJj.js +42 -0
- package/dist/cjs/internal/EngineJj.js.map +7 -0
- package/dist/cjs/internal/EngineStateSchema.d.ts +68 -0
- package/dist/cjs/internal/EngineStateSchema.d.ts.map +1 -0
- package/dist/cjs/internal/EngineStateSchema.js +58 -0
- package/dist/cjs/internal/EngineStateSchema.js.map +7 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.d.ts +162 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.d.ts.map +1 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.js +201 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.js.map +7 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts +39 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.js +105 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.js.map +7 -0
- package/dist/cjs/internal/ExitEncoding.d.ts +180 -0
- package/dist/cjs/internal/ExitEncoding.d.ts.map +1 -0
- package/dist/cjs/internal/ExitEncoding.js +236 -0
- package/dist/cjs/internal/ExitEncoding.js.map +7 -0
- package/dist/cjs/internal/FileBoundarySnapshot.d.ts +14 -0
- package/dist/cjs/internal/FileBoundarySnapshot.d.ts.map +1 -0
- package/dist/cjs/internal/FileBoundarySnapshot.js +51 -0
- package/dist/cjs/internal/FileBoundarySnapshot.js.map +7 -0
- package/dist/cjs/internal/FileEnumeration.d.ts +127 -0
- package/dist/cjs/internal/FileEnumeration.d.ts.map +1 -0
- package/dist/cjs/internal/FileEnumeration.js +194 -0
- package/dist/cjs/internal/FileEnumeration.js.map +7 -0
- package/dist/cjs/internal/HostReflection.d.ts +80 -0
- package/dist/cjs/internal/HostReflection.d.ts.map +1 -0
- package/dist/cjs/internal/HostReflection.js +43 -0
- package/dist/cjs/internal/HostReflection.js.map +7 -0
- package/dist/cjs/internal/JournalRecords.d.ts +325 -0
- package/dist/cjs/internal/JournalRecords.d.ts.map +1 -0
- package/dist/cjs/internal/JournalRecords.js +122 -0
- package/dist/cjs/internal/JournalRecords.js.map +7 -0
- package/dist/cjs/internal/NodeJournal.d.ts +157 -0
- package/dist/cjs/internal/NodeJournal.d.ts.map +1 -0
- package/dist/cjs/internal/NodeJournal.js +192 -0
- package/dist/cjs/internal/NodeJournal.js.map +7 -0
- package/dist/cjs/internal/Ordering.d.ts +14 -0
- package/dist/cjs/internal/Ordering.d.ts.map +1 -0
- package/dist/cjs/internal/Ordering.js +25 -0
- package/dist/cjs/internal/Ordering.js.map +7 -0
- package/dist/cjs/internal/PlanInputs.d.ts +14 -0
- package/dist/cjs/internal/PlanInputs.d.ts.map +1 -0
- package/dist/cjs/internal/PlanInputs.js +78 -0
- package/dist/cjs/internal/PlanInputs.js.map +7 -0
- package/dist/cjs/internal/PlanMerges.d.ts +178 -0
- package/dist/cjs/internal/PlanMerges.d.ts.map +1 -0
- package/dist/cjs/internal/PlanMerges.js +125 -0
- package/dist/cjs/internal/PlanMerges.js.map +7 -0
- package/dist/cjs/internal/ProvenanceSlot.d.ts +30 -0
- package/dist/cjs/internal/ProvenanceSlot.d.ts.map +1 -0
- package/dist/cjs/internal/ProvenanceSlot.js +53 -0
- package/dist/cjs/internal/ProvenanceSlot.js.map +7 -0
- package/dist/cjs/internal/ResultEnvelope.d.ts +88 -0
- package/dist/cjs/internal/ResultEnvelope.d.ts.map +1 -0
- package/dist/cjs/internal/ResultEnvelope.js +90 -0
- package/dist/cjs/internal/ResultEnvelope.js.map +7 -0
- package/dist/cjs/internal/RetentionOps.d.ts +414 -0
- package/dist/cjs/internal/RetentionOps.d.ts.map +1 -0
- package/dist/cjs/internal/RetentionOps.js +354 -0
- package/dist/cjs/internal/RetentionOps.js.map +7 -0
- package/dist/cjs/internal/RunCatalogOps.d.ts +118 -0
- package/dist/cjs/internal/RunCatalogOps.d.ts.map +1 -0
- package/dist/cjs/internal/RunCatalogOps.js +85 -0
- package/dist/cjs/internal/RunCatalogOps.js.map +7 -0
- package/dist/cjs/internal/RunCoordinator.d.ts +78 -0
- package/dist/cjs/internal/RunCoordinator.d.ts.map +1 -0
- package/dist/cjs/internal/RunCoordinator.js +123 -0
- package/dist/cjs/internal/RunCoordinator.js.map +7 -0
- package/dist/cjs/internal/RunDriver.d.ts +192 -0
- package/dist/cjs/internal/RunDriver.d.ts.map +1 -0
- package/dist/cjs/internal/RunDriver.js +1586 -0
- package/dist/cjs/internal/RunDriver.js.map +7 -0
- package/dist/cjs/internal/RunLifecycle.d.ts +22 -0
- package/dist/cjs/internal/RunLifecycle.d.ts.map +1 -0
- package/dist/cjs/internal/RunLifecycle.js +63 -0
- package/dist/cjs/internal/RunLifecycle.js.map +7 -0
- package/dist/cjs/internal/RunListing.d.ts +78 -0
- package/dist/cjs/internal/RunListing.d.ts.map +1 -0
- package/dist/cjs/internal/RunListing.js +171 -0
- package/dist/cjs/internal/RunListing.js.map +7 -0
- package/dist/cjs/internal/RunListingError.d.ts +35 -0
- package/dist/cjs/internal/RunListingError.d.ts.map +1 -0
- package/dist/cjs/internal/RunListingError.js +47 -0
- package/dist/cjs/internal/RunListingError.js.map +7 -0
- package/dist/cjs/internal/RuntimeGraph.d.ts +73 -0
- package/dist/cjs/internal/RuntimeGraph.d.ts.map +1 -0
- package/dist/cjs/internal/RuntimeGraph.js +180 -0
- package/dist/cjs/internal/RuntimeGraph.js.map +7 -0
- package/dist/cjs/internal/SandboxedExecution.d.ts +80 -0
- package/dist/cjs/internal/SandboxedExecution.d.ts.map +1 -0
- package/dist/cjs/internal/SandboxedExecution.js +104 -0
- package/dist/cjs/internal/SandboxedExecution.js.map +7 -0
- package/dist/cjs/internal/StateTransaction.d.ts +44 -0
- package/dist/cjs/internal/StateTransaction.d.ts.map +1 -0
- package/dist/cjs/internal/StateTransaction.js +52 -0
- package/dist/cjs/internal/StateTransaction.js.map +7 -0
- package/dist/cjs/internal/StepFacts.d.ts +14 -0
- package/dist/cjs/internal/StepFacts.d.ts.map +1 -0
- package/dist/cjs/internal/StepFacts.js +58 -0
- package/dist/cjs/internal/StepFacts.js.map +7 -0
- package/dist/cjs/internal/TypedEvents.d.ts +14 -0
- package/dist/cjs/internal/TypedEvents.d.ts.map +1 -0
- package/dist/cjs/internal/TypedEvents.js +37 -0
- package/dist/cjs/internal/TypedEvents.js.map +7 -0
- package/dist/cjs/migrations/0001_initial.d.ts +17 -0
- package/dist/cjs/migrations/0001_initial.d.ts.map +1 -0
- package/dist/cjs/migrations/0001_initial.js +61 -0
- package/dist/cjs/migrations/0001_initial.js.map +7 -0
- package/dist/cjs/migrations/0002_selection_store.d.ts +15 -0
- package/dist/cjs/migrations/0002_selection_store.d.ts.map +1 -0
- package/dist/cjs/migrations/0002_selection_store.js +56 -0
- package/dist/cjs/migrations/0002_selection_store.js.map +7 -0
- package/dist/cjs/migrations/0003_plan_inputs.d.ts +13 -0
- package/dist/cjs/migrations/0003_plan_inputs.d.ts.map +1 -0
- package/dist/cjs/migrations/0003_plan_inputs.js +90 -0
- package/dist/cjs/migrations/0003_plan_inputs.js.map +7 -0
- package/dist/cjs/migrations/0004_plan_environment.d.ts +14 -0
- package/dist/cjs/migrations/0004_plan_environment.d.ts.map +1 -0
- package/dist/cjs/migrations/0004_plan_environment.js +56 -0
- package/dist/cjs/migrations/0004_plan_environment.js.map +7 -0
- package/dist/cjs/migrations/0005_plan_merges.d.ts +14 -0
- package/dist/cjs/migrations/0005_plan_merges.d.ts.map +1 -0
- package/dist/cjs/migrations/0005_plan_merges.js +82 -0
- package/dist/cjs/migrations/0005_plan_merges.js.map +7 -0
- package/dist/cjs/migrations/0006_execution_listing.d.ts +15 -0
- package/dist/cjs/migrations/0006_execution_listing.d.ts.map +1 -0
- package/dist/cjs/migrations/0006_execution_listing.js +101 -0
- package/dist/cjs/migrations/0006_execution_listing.js.map +7 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.d.ts +15 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.d.ts.map +1 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.js +40 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.js.map +7 -0
- package/dist/cjs/migrations/0008_deferred_consumption.d.ts +16 -0
- package/dist/cjs/migrations/0008_deferred_consumption.d.ts.map +1 -0
- package/dist/cjs/migrations/0008_deferred_consumption.js +45 -0
- package/dist/cjs/migrations/0008_deferred_consumption.js.map +7 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts +24 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.js +141 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.js.map +7 -0
- package/dist/cjs/migrations/0010_pending_cancellation.d.ts +15 -0
- package/dist/cjs/migrations/0010_pending_cancellation.d.ts.map +1 -0
- package/dist/cjs/migrations/0010_pending_cancellation.js +41 -0
- package/dist/cjs/migrations/0010_pending_cancellation.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/test/TestStores.d.ts +89 -0
- package/dist/cjs/test/TestStores.d.ts.map +1 -0
- package/dist/cjs/test/TestStores.js +98 -0
- package/dist/cjs/test/TestStores.js.map +7 -0
- package/dist/esm/ArtifactGc.d.ts +235 -0
- package/dist/esm/ArtifactGc.d.ts.map +1 -0
- package/dist/esm/ArtifactGc.js +268 -0
- package/dist/esm/ArtifactGc.js.map +1 -0
- package/dist/esm/ArtifactSync.d.ts +164 -0
- package/dist/esm/ArtifactSync.d.ts.map +1 -0
- package/dist/esm/ArtifactSync.js +176 -0
- package/dist/esm/ArtifactSync.js.map +1 -0
- package/dist/esm/CacheSync.d.ts +112 -0
- package/dist/esm/CacheSync.d.ts.map +1 -0
- package/dist/esm/CacheSync.js +94 -0
- package/dist/esm/CacheSync.js.map +1 -0
- package/dist/esm/DeferredClockFold.d.ts +354 -0
- package/dist/esm/DeferredClockFold.d.ts.map +1 -0
- package/dist/esm/DeferredClockFold.js +472 -0
- package/dist/esm/DeferredClockFold.js.map +1 -0
- package/dist/esm/DisasterRecovery.d.ts +431 -0
- package/dist/esm/DisasterRecovery.d.ts.map +1 -0
- package/dist/esm/DisasterRecovery.js +523 -0
- package/dist/esm/DisasterRecovery.js.map +1 -0
- package/dist/esm/DurableEngineState.d.ts +776 -0
- package/dist/esm/DurableEngineState.d.ts.map +1 -0
- package/dist/esm/DurableEngineState.js +1648 -0
- package/dist/esm/DurableEngineState.js.map +1 -0
- package/dist/esm/EngineStore.d.ts +158 -0
- package/dist/esm/EngineStore.d.ts.map +1 -0
- package/dist/esm/EngineStore.js +403 -0
- package/dist/esm/EngineStore.js.map +1 -0
- package/dist/esm/EngineStoreMetrics.d.ts +276 -0
- package/dist/esm/EngineStoreMetrics.d.ts.map +1 -0
- package/dist/esm/EngineStoreMetrics.js +260 -0
- package/dist/esm/EngineStoreMetrics.js.map +1 -0
- package/dist/esm/Errors.d.ts +22 -0
- package/dist/esm/Errors.d.ts.map +1 -0
- package/dist/esm/Errors.js +22 -0
- package/dist/esm/Errors.js.map +1 -0
- package/dist/esm/EventTypes.d.ts +27 -0
- package/dist/esm/EventTypes.d.ts.map +1 -0
- package/dist/esm/EventTypes.js +27 -0
- package/dist/esm/EventTypes.js.map +1 -0
- package/dist/esm/ExecutionFacts.d.ts +59 -0
- package/dist/esm/ExecutionFacts.d.ts.map +1 -0
- package/dist/esm/ExecutionFacts.js +96 -0
- package/dist/esm/ExecutionFacts.js.map +1 -0
- package/dist/esm/ExecutionSnapshot.d.ts +117 -0
- package/dist/esm/ExecutionSnapshot.d.ts.map +1 -0
- package/dist/esm/ExecutionSnapshot.js +95 -0
- package/dist/esm/ExecutionSnapshot.js.map +1 -0
- package/dist/esm/Inconsistency.d.ts +154 -0
- package/dist/esm/Inconsistency.d.ts.map +1 -0
- package/dist/esm/Inconsistency.js +133 -0
- package/dist/esm/Inconsistency.js.map +1 -0
- package/dist/esm/Migrations.d.ts +56 -0
- package/dist/esm/Migrations.d.ts.map +1 -0
- package/dist/esm/Migrations.js +91 -0
- package/dist/esm/Migrations.js.map +1 -0
- package/dist/esm/OwnerIdentity.d.ts +91 -0
- package/dist/esm/OwnerIdentity.d.ts.map +1 -0
- package/dist/esm/OwnerIdentity.js +99 -0
- package/dist/esm/OwnerIdentity.js.map +1 -0
- package/dist/esm/PlanInputStore.d.ts +110 -0
- package/dist/esm/PlanInputStore.d.ts.map +1 -0
- package/dist/esm/PlanInputStore.js +207 -0
- package/dist/esm/PlanInputStore.js.map +1 -0
- package/dist/esm/PlanMergeStore.d.ts +113 -0
- package/dist/esm/PlanMergeStore.d.ts.map +1 -0
- package/dist/esm/PlanMergeStore.js +244 -0
- package/dist/esm/PlanMergeStore.js.map +1 -0
- package/dist/esm/PlanScheduler.d.ts +363 -0
- package/dist/esm/PlanScheduler.d.ts.map +1 -0
- package/dist/esm/PlanScheduler.js +1321 -0
- package/dist/esm/PlanScheduler.js.map +1 -0
- package/dist/esm/Reconciliation.d.ts +175 -0
- package/dist/esm/Reconciliation.d.ts.map +1 -0
- package/dist/esm/Reconciliation.js +175 -0
- package/dist/esm/Reconciliation.js.map +1 -0
- package/dist/esm/ReplayOnly.d.ts +91 -0
- package/dist/esm/ReplayOnly.d.ts.map +1 -0
- package/dist/esm/ReplayOnly.js +59 -0
- package/dist/esm/ReplayOnly.js.map +1 -0
- package/dist/esm/Retention.d.ts +113 -0
- package/dist/esm/Retention.d.ts.map +1 -0
- package/dist/esm/Retention.js +139 -0
- package/dist/esm/Retention.js.map +1 -0
- package/dist/esm/RunCatalogRead.d.ts +17 -0
- package/dist/esm/RunCatalogRead.d.ts.map +1 -0
- package/dist/esm/RunCatalogRead.js +17 -0
- package/dist/esm/RunCatalogRead.js.map +1 -0
- package/dist/esm/RunChangeFeed.d.ts +75 -0
- package/dist/esm/RunChangeFeed.d.ts.map +1 -0
- package/dist/esm/RunChangeFeed.js +81 -0
- package/dist/esm/RunChangeFeed.js.map +1 -0
- package/dist/esm/RunState.d.ts +116 -0
- package/dist/esm/RunState.d.ts.map +1 -0
- package/dist/esm/RunState.js +109 -0
- package/dist/esm/RunState.js.map +1 -0
- package/dist/esm/Selection.d.ts +495 -0
- package/dist/esm/Selection.d.ts.map +1 -0
- package/dist/esm/Selection.js +482 -0
- package/dist/esm/Selection.js.map +1 -0
- package/dist/esm/SelectionStore.d.ts +141 -0
- package/dist/esm/SelectionStore.d.ts.map +1 -0
- package/dist/esm/SelectionStore.js +215 -0
- package/dist/esm/SelectionStore.js.map +1 -0
- package/dist/esm/StepBoundary.d.ts +501 -0
- package/dist/esm/StepBoundary.d.ts.map +1 -0
- package/dist/esm/StepBoundary.js +919 -0
- package/dist/esm/StepBoundary.js.map +1 -0
- package/dist/esm/StepCacheFold.d.ts +148 -0
- package/dist/esm/StepCacheFold.d.ts.map +1 -0
- package/dist/esm/StepCacheFold.js +201 -0
- package/dist/esm/StepCacheFold.js.map +1 -0
- package/dist/esm/StepSandbox.d.ts +78 -0
- package/dist/esm/StepSandbox.d.ts.map +1 -0
- package/dist/esm/StepSandbox.js +70 -0
- package/dist/esm/StepSandbox.js.map +1 -0
- package/dist/esm/WakeBus.d.ts +116 -0
- package/dist/esm/WakeBus.d.ts.map +1 -0
- package/dist/esm/WakeBus.js +121 -0
- package/dist/esm/WakeBus.js.map +1 -0
- package/dist/esm/WorkspaceSandbox.d.ts +619 -0
- package/dist/esm/WorkspaceSandbox.d.ts.map +1 -0
- package/dist/esm/WorkspaceSandbox.js +985 -0
- package/dist/esm/WorkspaceSandbox.js.map +1 -0
- package/dist/esm/index.d.ts +157 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +157 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/ActionPersistence.d.ts +276 -0
- package/dist/esm/internal/ActionPersistence.d.ts.map +1 -0
- package/dist/esm/internal/ActionPersistence.js +2306 -0
- package/dist/esm/internal/ActionPersistence.js.map +1 -0
- package/dist/esm/internal/ArtifactRoots.d.ts +38 -0
- package/dist/esm/internal/ArtifactRoots.d.ts.map +1 -0
- package/dist/esm/internal/ArtifactRoots.js +76 -0
- package/dist/esm/internal/ArtifactRoots.js.map +1 -0
- package/dist/esm/internal/AttemptAdmission.d.ts +53 -0
- package/dist/esm/internal/AttemptAdmission.d.ts.map +1 -0
- package/dist/esm/internal/AttemptAdmission.js +52 -0
- package/dist/esm/internal/AttemptAdmission.js.map +1 -0
- package/dist/esm/internal/AttemptLifecycle.d.ts +245 -0
- package/dist/esm/internal/AttemptLifecycle.d.ts.map +1 -0
- package/dist/esm/internal/AttemptLifecycle.js +104 -0
- package/dist/esm/internal/AttemptLifecycle.js.map +1 -0
- package/dist/esm/internal/AttemptProbe.d.ts +53 -0
- package/dist/esm/internal/AttemptProbe.d.ts.map +1 -0
- package/dist/esm/internal/AttemptProbe.js +83 -0
- package/dist/esm/internal/AttemptProbe.js.map +1 -0
- package/dist/esm/internal/CacheAdmission.d.ts +79 -0
- package/dist/esm/internal/CacheAdmission.d.ts.map +1 -0
- package/dist/esm/internal/CacheAdmission.js +72 -0
- package/dist/esm/internal/CacheAdmission.js.map +1 -0
- package/dist/esm/internal/CacheAgeHistory.d.ts +27 -0
- package/dist/esm/internal/CacheAgeHistory.d.ts.map +1 -0
- package/dist/esm/internal/CacheAgeHistory.js +49 -0
- package/dist/esm/internal/CacheAgeHistory.js.map +1 -0
- package/dist/esm/internal/CacheAgeVerdicts.d.ts +15 -0
- package/dist/esm/internal/CacheAgeVerdicts.d.ts.map +1 -0
- package/dist/esm/internal/CacheAgeVerdicts.js +54 -0
- package/dist/esm/internal/CacheAgeVerdicts.js.map +1 -0
- package/dist/esm/internal/CacheOutputPolicy.d.ts +24 -0
- package/dist/esm/internal/CacheOutputPolicy.d.ts.map +1 -0
- package/dist/esm/internal/CacheOutputPolicy.js +73 -0
- package/dist/esm/internal/CacheOutputPolicy.js.map +1 -0
- package/dist/esm/internal/CachePublication.d.ts +97 -0
- package/dist/esm/internal/CachePublication.d.ts.map +1 -0
- package/dist/esm/internal/CachePublication.js +116 -0
- package/dist/esm/internal/CachePublication.js.map +1 -0
- package/dist/esm/internal/CallFacts.d.ts +15 -0
- package/dist/esm/internal/CallFacts.d.ts.map +1 -0
- package/dist/esm/internal/CallFacts.js +83 -0
- package/dist/esm/internal/CallFacts.js.map +1 -0
- package/dist/esm/internal/CopiedRecord.d.ts +61 -0
- package/dist/esm/internal/CopiedRecord.d.ts.map +1 -0
- package/dist/esm/internal/CopiedRecord.js +165 -0
- package/dist/esm/internal/CopiedRecord.js.map +1 -0
- package/dist/esm/internal/DeferredPersistence.d.ts +108 -0
- package/dist/esm/internal/DeferredPersistence.d.ts.map +1 -0
- package/dist/esm/internal/DeferredPersistence.js +240 -0
- package/dist/esm/internal/DeferredPersistence.js.map +1 -0
- package/dist/esm/internal/EffectRecords.d.ts +92 -0
- package/dist/esm/internal/EffectRecords.d.ts.map +1 -0
- package/dist/esm/internal/EffectRecords.js +94 -0
- package/dist/esm/internal/EffectRecords.js.map +1 -0
- package/dist/esm/internal/EngineJj.d.ts +30 -0
- package/dist/esm/internal/EngineJj.d.ts.map +1 -0
- package/dist/esm/internal/EngineJj.js +29 -0
- package/dist/esm/internal/EngineJj.js.map +1 -0
- package/dist/esm/internal/EngineStateSchema.d.ts +68 -0
- package/dist/esm/internal/EngineStateSchema.d.ts.map +1 -0
- package/dist/esm/internal/EngineStateSchema.js +53 -0
- package/dist/esm/internal/EngineStateSchema.js.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRead.d.ts +162 -0
- package/dist/esm/internal/ExecutionSnapshotRead.d.ts.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRead.js +218 -0
- package/dist/esm/internal/ExecutionSnapshotRead.js.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.d.ts +39 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.js +81 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.js.map +1 -0
- package/dist/esm/internal/ExitEncoding.d.ts +180 -0
- package/dist/esm/internal/ExitEncoding.d.ts.map +1 -0
- package/dist/esm/internal/ExitEncoding.js +361 -0
- package/dist/esm/internal/ExitEncoding.js.map +1 -0
- package/dist/esm/internal/FileBoundarySnapshot.d.ts +14 -0
- package/dist/esm/internal/FileBoundarySnapshot.d.ts.map +1 -0
- package/dist/esm/internal/FileBoundarySnapshot.js +29 -0
- package/dist/esm/internal/FileBoundarySnapshot.js.map +1 -0
- package/dist/esm/internal/FileEnumeration.d.ts +127 -0
- package/dist/esm/internal/FileEnumeration.d.ts.map +1 -0
- package/dist/esm/internal/FileEnumeration.js +236 -0
- package/dist/esm/internal/FileEnumeration.js.map +1 -0
- package/dist/esm/internal/HostReflection.d.ts +80 -0
- package/dist/esm/internal/HostReflection.d.ts.map +1 -0
- package/dist/esm/internal/HostReflection.js +98 -0
- package/dist/esm/internal/HostReflection.js.map +1 -0
- package/dist/esm/internal/JournalRecords.d.ts +325 -0
- package/dist/esm/internal/JournalRecords.d.ts.map +1 -0
- package/dist/esm/internal/JournalRecords.js +306 -0
- package/dist/esm/internal/JournalRecords.js.map +1 -0
- package/dist/esm/internal/NodeJournal.d.ts +157 -0
- package/dist/esm/internal/NodeJournal.d.ts.map +1 -0
- package/dist/esm/internal/NodeJournal.js +298 -0
- package/dist/esm/internal/NodeJournal.js.map +1 -0
- package/dist/esm/internal/Ordering.d.ts +14 -0
- package/dist/esm/internal/Ordering.d.ts.map +1 -0
- package/dist/esm/internal/Ordering.js +14 -0
- package/dist/esm/internal/Ordering.js.map +1 -0
- package/dist/esm/internal/PlanInputs.d.ts +14 -0
- package/dist/esm/internal/PlanInputs.d.ts.map +1 -0
- package/dist/esm/internal/PlanInputs.js +57 -0
- package/dist/esm/internal/PlanInputs.js.map +1 -0
- package/dist/esm/internal/PlanMerges.d.ts +178 -0
- package/dist/esm/internal/PlanMerges.d.ts.map +1 -0
- package/dist/esm/internal/PlanMerges.js +113 -0
- package/dist/esm/internal/PlanMerges.js.map +1 -0
- package/dist/esm/internal/ProvenanceSlot.d.ts +30 -0
- package/dist/esm/internal/ProvenanceSlot.d.ts.map +1 -0
- package/dist/esm/internal/ProvenanceSlot.js +39 -0
- package/dist/esm/internal/ProvenanceSlot.js.map +1 -0
- package/dist/esm/internal/ResultEnvelope.d.ts +88 -0
- package/dist/esm/internal/ResultEnvelope.d.ts.map +1 -0
- package/dist/esm/internal/ResultEnvelope.js +83 -0
- package/dist/esm/internal/ResultEnvelope.js.map +1 -0
- package/dist/esm/internal/RetentionOps.d.ts +414 -0
- package/dist/esm/internal/RetentionOps.d.ts.map +1 -0
- package/dist/esm/internal/RetentionOps.js +576 -0
- package/dist/esm/internal/RetentionOps.js.map +1 -0
- package/dist/esm/internal/RunCatalogOps.d.ts +118 -0
- package/dist/esm/internal/RunCatalogOps.d.ts.map +1 -0
- package/dist/esm/internal/RunCatalogOps.js +120 -0
- package/dist/esm/internal/RunCatalogOps.js.map +1 -0
- package/dist/esm/internal/RunCoordinator.d.ts +78 -0
- package/dist/esm/internal/RunCoordinator.d.ts.map +1 -0
- package/dist/esm/internal/RunCoordinator.js +115 -0
- package/dist/esm/internal/RunCoordinator.js.map +1 -0
- package/dist/esm/internal/RunDriver.d.ts +192 -0
- package/dist/esm/internal/RunDriver.d.ts.map +1 -0
- package/dist/esm/internal/RunDriver.js +2334 -0
- package/dist/esm/internal/RunDriver.js.map +1 -0
- package/dist/esm/internal/RunLifecycle.d.ts +22 -0
- package/dist/esm/internal/RunLifecycle.d.ts.map +1 -0
- package/dist/esm/internal/RunLifecycle.js +49 -0
- package/dist/esm/internal/RunLifecycle.js.map +1 -0
- package/dist/esm/internal/RunListing.d.ts +78 -0
- package/dist/esm/internal/RunListing.d.ts.map +1 -0
- package/dist/esm/internal/RunListing.js +146 -0
- package/dist/esm/internal/RunListing.js.map +1 -0
- package/dist/esm/internal/RunListingError.d.ts +35 -0
- package/dist/esm/internal/RunListingError.d.ts.map +1 -0
- package/dist/esm/internal/RunListingError.js +27 -0
- package/dist/esm/internal/RunListingError.js.map +1 -0
- package/dist/esm/internal/RuntimeGraph.d.ts +73 -0
- package/dist/esm/internal/RuntimeGraph.d.ts.map +1 -0
- package/dist/esm/internal/RuntimeGraph.js +182 -0
- package/dist/esm/internal/RuntimeGraph.js.map +1 -0
- package/dist/esm/internal/SandboxedExecution.d.ts +80 -0
- package/dist/esm/internal/SandboxedExecution.d.ts.map +1 -0
- package/dist/esm/internal/SandboxedExecution.js +107 -0
- package/dist/esm/internal/SandboxedExecution.js.map +1 -0
- package/dist/esm/internal/StateTransaction.d.ts +44 -0
- package/dist/esm/internal/StateTransaction.d.ts.map +1 -0
- package/dist/esm/internal/StateTransaction.js +54 -0
- package/dist/esm/internal/StateTransaction.js.map +1 -0
- package/dist/esm/internal/StepFacts.d.ts +14 -0
- package/dist/esm/internal/StepFacts.d.ts.map +1 -0
- package/dist/esm/internal/StepFacts.js +35 -0
- package/dist/esm/internal/StepFacts.js.map +1 -0
- package/dist/esm/internal/TypedEvents.d.ts +14 -0
- package/dist/esm/internal/TypedEvents.d.ts.map +1 -0
- package/dist/esm/internal/TypedEvents.js +14 -0
- package/dist/esm/internal/TypedEvents.js.map +1 -0
- package/dist/esm/migrations/0001_initial.d.ts +17 -0
- package/dist/esm/migrations/0001_initial.d.ts.map +1 -0
- package/dist/esm/migrations/0001_initial.js +41 -0
- package/dist/esm/migrations/0001_initial.js.map +1 -0
- package/dist/esm/migrations/0002_selection_store.d.ts +15 -0
- package/dist/esm/migrations/0002_selection_store.d.ts.map +1 -0
- package/dist/esm/migrations/0002_selection_store.js +34 -0
- package/dist/esm/migrations/0002_selection_store.js.map +1 -0
- package/dist/esm/migrations/0003_plan_inputs.d.ts +13 -0
- package/dist/esm/migrations/0003_plan_inputs.d.ts.map +1 -0
- package/dist/esm/migrations/0003_plan_inputs.js +70 -0
- package/dist/esm/migrations/0003_plan_inputs.js.map +1 -0
- package/dist/esm/migrations/0004_plan_environment.d.ts +14 -0
- package/dist/esm/migrations/0004_plan_environment.d.ts.map +1 -0
- package/dist/esm/migrations/0004_plan_environment.js +33 -0
- package/dist/esm/migrations/0004_plan_environment.js.map +1 -0
- package/dist/esm/migrations/0005_plan_merges.d.ts +14 -0
- package/dist/esm/migrations/0005_plan_merges.d.ts.map +1 -0
- package/dist/esm/migrations/0005_plan_merges.js +59 -0
- package/dist/esm/migrations/0005_plan_merges.js.map +1 -0
- package/dist/esm/migrations/0006_execution_listing.d.ts +15 -0
- package/dist/esm/migrations/0006_execution_listing.d.ts.map +1 -0
- package/dist/esm/migrations/0006_execution_listing.js +81 -0
- package/dist/esm/migrations/0006_execution_listing.js.map +1 -0
- package/dist/esm/migrations/0007_run_parent_sequence.d.ts +15 -0
- package/dist/esm/migrations/0007_run_parent_sequence.d.ts.map +1 -0
- package/dist/esm/migrations/0007_run_parent_sequence.js +18 -0
- package/dist/esm/migrations/0007_run_parent_sequence.js.map +1 -0
- package/dist/esm/migrations/0008_deferred_consumption.d.ts +16 -0
- package/dist/esm/migrations/0008_deferred_consumption.d.ts.map +1 -0
- package/dist/esm/migrations/0008_deferred_consumption.js +24 -0
- package/dist/esm/migrations/0008_deferred_consumption.js.map +1 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.d.ts +24 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.js +127 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.js.map +1 -0
- package/dist/esm/migrations/0010_pending_cancellation.d.ts +15 -0
- package/dist/esm/migrations/0010_pending_cancellation.d.ts.map +1 -0
- package/dist/esm/migrations/0010_pending_cancellation.js +19 -0
- package/dist/esm/migrations/0010_pending_cancellation.js.map +1 -0
- package/dist/esm/test/TestStores.d.ts +89 -0
- package/dist/esm/test/TestStores.d.ts.map +1 -0
- package/dist/esm/test/TestStores.js +103 -0
- package/dist/esm/test/TestStores.js.map +1 -0
- package/docs/README.md +113 -0
- package/docs/api.md +1494 -0
- package/docs/concepts/attempts-and-replay.md +149 -0
- package/docs/concepts/cache-admission.md +265 -0
- package/docs/concepts/call-facts.md +86 -0
- package/docs/concepts/durable-waits.md +175 -0
- package/docs/concepts/execution-facts.md +90 -0
- package/docs/concepts/ownership-and-fencing.md +128 -0
- package/docs/concepts/step-boundaries.md +148 -0
- package/docs/concepts/workspace-transactions.md +199 -0
- package/docs/event-types.md +14 -0
- package/docs/guides/back-up-and-restore.md +164 -0
- package/docs/guides/collect-unreferenced-artifacts.md +128 -0
- package/docs/guides/compose-a-durable-engine.md +146 -0
- package/docs/guides/coordinate-two-processes.md +120 -0
- package/docs/guides/defer-work-with-selection.md +171 -0
- package/docs/guides/delete-old-run-history.md +154 -0
- package/docs/guides/drive-a-plan.md +314 -0
- package/docs/guides/observe-engine-metrics.md +98 -0
- package/docs/guides/observe-executions.md +187 -0
- package/docs/guides/reclaim-runs-from-a-dead-host.md +133 -0
- package/docs/guides/share-a-cache-across-machines.md +134 -0
- package/docs/guides/testing.md +123 -0
- package/docs/installation.md +102 -0
- package/docs/quickstart.md +215 -0
- package/docs/troubleshooting.md +347 -0
- package/package.json +438 -3
- package/src/ArtifactGc.ts +408 -0
- package/src/ArtifactSync.ts +278 -0
- package/src/CacheSync.ts +131 -0
- package/src/DeferredClockFold.ts +586 -0
- package/src/DisasterRecovery.ts +888 -0
- package/src/DurableEngineState.ts +2656 -0
- package/src/EngineStore.ts +656 -0
- package/src/EngineStoreMetrics.ts +331 -0
- package/src/Errors.ts +28 -0
- package/src/EventTypes.ts +27 -0
- package/src/ExecutionFacts.ts +125 -0
- package/src/ExecutionSnapshot.ts +186 -0
- package/src/Inconsistency.ts +253 -0
- package/src/Migrations.ts +95 -0
- package/src/OwnerIdentity.ts +125 -0
- package/src/PlanInputStore.ts +292 -0
- package/src/PlanMergeStore.ts +330 -0
- package/src/PlanScheduler.ts +1806 -0
- package/src/Reconciliation.ts +224 -0
- package/src/ReplayOnly.ts +95 -0
- package/src/Retention.ts +214 -0
- package/src/RunCatalogRead.ts +27 -0
- package/src/RunChangeFeed.ts +125 -0
- package/src/RunState.ts +137 -0
- package/src/Selection.ts +683 -0
- package/src/SelectionStore.ts +353 -0
- package/src/StepBoundary.ts +1165 -0
- package/src/StepCacheFold.ts +244 -0
- package/src/StepSandbox.ts +110 -0
- package/src/WakeBus.ts +167 -0
- package/src/WorkspaceSandbox.ts +1604 -0
- package/src/index.ts +185 -0
- package/src/internal/ActionPersistence.ts +2687 -0
- package/src/internal/ArtifactRoots.ts +92 -0
- package/src/internal/AttemptAdmission.ts +76 -0
- package/src/internal/AttemptLifecycle.ts +163 -0
- package/src/internal/AttemptProbe.ts +90 -0
- package/src/internal/CacheAdmission.ts +133 -0
- package/src/internal/CacheAgeHistory.ts +58 -0
- package/src/internal/CacheAgeVerdicts.ts +61 -0
- package/src/internal/CacheOutputPolicy.ts +82 -0
- package/src/internal/CachePublication.ts +153 -0
- package/src/internal/CallFacts.ts +87 -0
- package/src/internal/CopiedRecord.ts +201 -0
- package/src/internal/DeferredPersistence.ts +459 -0
- package/src/internal/EffectRecords.ts +136 -0
- package/src/internal/EngineJj.ts +30 -0
- package/src/internal/EngineStateSchema.ts +92 -0
- package/src/internal/ExecutionSnapshotRead.ts +300 -0
- package/src/internal/ExecutionSnapshotRelations.ts +121 -0
- package/src/internal/ExitEncoding.ts +453 -0
- package/src/internal/FileBoundarySnapshot.ts +39 -0
- package/src/internal/FileEnumeration.ts +334 -0
- package/src/internal/HostReflection.ts +128 -0
- package/src/internal/JournalRecords.ts +396 -0
- package/src/internal/NodeJournal.ts +340 -0
- package/src/internal/Ordering.ts +14 -0
- package/src/internal/PlanInputs.ts +62 -0
- package/src/internal/PlanMerges.ts +123 -0
- package/src/internal/ProvenanceSlot.ts +52 -0
- package/src/internal/ResultEnvelope.ts +118 -0
- package/src/internal/RetentionOps.ts +865 -0
- package/src/internal/RunCatalogOps.ts +174 -0
- package/src/internal/RunCoordinator.ts +215 -0
- package/src/internal/RunDriver.ts +3154 -0
- package/src/internal/RunLifecycle.ts +53 -0
- package/src/internal/RunListing.ts +210 -0
- package/src/internal/RunListingError.ts +37 -0
- package/src/internal/RuntimeGraph.ts +253 -0
- package/src/internal/SandboxedExecution.ts +165 -0
- package/src/internal/StateTransaction.ts +71 -0
- package/src/internal/StepFacts.ts +36 -0
- package/src/internal/TypedEvents.ts +29 -0
- package/src/migrations/0001_initial.ts +51 -0
- package/src/migrations/0002_selection_store.ts +38 -0
- package/src/migrations/0003_plan_inputs.ts +75 -0
- package/src/migrations/0004_plan_environment.ts +34 -0
- package/src/migrations/0005_plan_merges.ts +60 -0
- package/src/migrations/0006_execution_listing.ts +86 -0
- package/src/migrations/0007_run_parent_sequence.ts +19 -0
- package/src/migrations/0008_deferred_consumption.ts +27 -0
- package/src/migrations/0009_deferred_clock_facts.ts +163 -0
- package/src/migrations/0010_pending_cancellation.ts +20 -0
- package/src/test/TestStores.ts +145 -0
|
@@ -0,0 +1,1536 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var DurableEngineState_exports = {};
|
|
30
|
+
__export(DurableEngineState_exports, {
|
|
31
|
+
AttemptSurvivors: () => AttemptSurvivors,
|
|
32
|
+
ClockAddress: () => ClockAddress,
|
|
33
|
+
ClockRow: () => ClockRow,
|
|
34
|
+
DeferredAddress: () => DeferredAddress,
|
|
35
|
+
DeferredRow: () => DeferredRow,
|
|
36
|
+
DurableEngineState: () => DurableEngineState,
|
|
37
|
+
EngineStateFault: () => EngineStateFault,
|
|
38
|
+
RunParentCycleError: () => RunParentCycleError,
|
|
39
|
+
RunParentEdge: () => RunParentEdge,
|
|
40
|
+
Waiting: () => Waiting,
|
|
41
|
+
WaitingReason: () => WaitingReason,
|
|
42
|
+
WaitingRow: () => WaitingRow,
|
|
43
|
+
layer: () => layer,
|
|
44
|
+
layerMemory: () => layerMemory,
|
|
45
|
+
make: () => make,
|
|
46
|
+
makeMemory: () => makeMemory,
|
|
47
|
+
waitingTreeMaxDepth: () => waitingTreeMaxDepth
|
|
48
|
+
});
|
|
49
|
+
module.exports = __toCommonJS(DurableEngineState_exports);
|
|
50
|
+
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
51
|
+
var import_DurableWriter = require("@smthrs/database/DurableWriter");
|
|
52
|
+
var import_JournalEvent = require("@smthrs/journal/JournalEvent");
|
|
53
|
+
var Cause = __toESM(require("effect/Cause"), 1);
|
|
54
|
+
var Context = __toESM(require("effect/Context"), 1);
|
|
55
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
56
|
+
var Exit = __toESM(require("effect/Exit"), 1);
|
|
57
|
+
var Layer = __toESM(require("effect/Layer"), 1);
|
|
58
|
+
var Option = __toESM(require("effect/Option"), 1);
|
|
59
|
+
var Result = __toESM(require("effect/Result"), 1);
|
|
60
|
+
var Schema = __toESM(require("effect/Schema"), 1);
|
|
61
|
+
var Semaphore = __toESM(require("effect/Semaphore"), 1);
|
|
62
|
+
var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
|
|
63
|
+
var EngineStateSchema = __toESM(require("./internal/EngineStateSchema.js"), 1);
|
|
64
|
+
var import_Ordering = require("./internal/Ordering.js");
|
|
65
|
+
const pendingCancellationLimit = (limit) => Number.isSafeInteger(limit) && limit >= 0 ? Effect.void : Effect.die(new RangeError("Pending cancellation limit must be a non-negative safe integer"));
|
|
66
|
+
const UnknownFromJsonString = Schema.fromJsonString(Schema.Unknown);
|
|
67
|
+
const NonNegativeSafeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
68
|
+
const DeferredAddress = Schema.Struct({
|
|
69
|
+
flowName: Schema.NonEmptyString,
|
|
70
|
+
executionId: Schema.NonEmptyString,
|
|
71
|
+
deferredName: Schema.NonEmptyString
|
|
72
|
+
});
|
|
73
|
+
const DeferredRow = Schema.Struct({
|
|
74
|
+
...DeferredAddress.fields,
|
|
75
|
+
exit: Schema.Unknown,
|
|
76
|
+
metadata: Schema.optionalKey(Schema.Unknown),
|
|
77
|
+
completedAtMs: NonNegativeSafeInt
|
|
78
|
+
});
|
|
79
|
+
const ClockAddress = Schema.Struct({
|
|
80
|
+
flowName: Schema.NonEmptyString,
|
|
81
|
+
executionId: Schema.NonEmptyString,
|
|
82
|
+
clockName: Schema.NonEmptyString
|
|
83
|
+
});
|
|
84
|
+
const ClockRow = Schema.Struct({
|
|
85
|
+
...ClockAddress.fields,
|
|
86
|
+
deferredName: Schema.NonEmptyString,
|
|
87
|
+
dueAtMs: NonNegativeSafeInt,
|
|
88
|
+
completedAtMs: Schema.NullOr(NonNegativeSafeInt)
|
|
89
|
+
});
|
|
90
|
+
const WaitingReason = Schema.NonEmptyString;
|
|
91
|
+
const Waiting = Schema.Struct({
|
|
92
|
+
reason: WaitingReason,
|
|
93
|
+
wakeAt: Schema.optional(NonNegativeSafeInt),
|
|
94
|
+
token: Schema.optional(Schema.NonEmptyString),
|
|
95
|
+
/**
|
|
96
|
+
* What the wait declared about itself: for a `HumanTask` park, the kind of
|
|
97
|
+
* answer it wants, the prompt, and the attempt budget.
|
|
98
|
+
*
|
|
99
|
+
* `reason` and `token` say that a person owes the run an answer and which
|
|
100
|
+
* wait point holds it. Neither says what was asked, and the question lives
|
|
101
|
+
* in an action payload of an execution that has released its owner, so a
|
|
102
|
+
* reader had nothing to render but the wait's own name. This is the question
|
|
103
|
+
* itself, as the JSON TEXT the declaring flow wrote, stored and cleared with
|
|
104
|
+
* the other waiting columns.
|
|
105
|
+
*/
|
|
106
|
+
request: Schema.optional(Schema.String)
|
|
107
|
+
});
|
|
108
|
+
const WaitingRow = Schema.Struct({
|
|
109
|
+
runId: Schema.NonEmptyString,
|
|
110
|
+
reason: WaitingReason,
|
|
111
|
+
wakeAt: Schema.NullOr(NonNegativeSafeInt),
|
|
112
|
+
token: Schema.NullOr(Schema.NonEmptyString),
|
|
113
|
+
/** The question {@link Waiting} declared, absent on a park that declared none. */
|
|
114
|
+
request: Schema.optionalKey(Schema.Json)
|
|
115
|
+
});
|
|
116
|
+
const RunParentEdge = Schema.Struct({
|
|
117
|
+
childId: Schema.NonEmptyString,
|
|
118
|
+
parentId: Schema.NonEmptyString,
|
|
119
|
+
seq: NonNegativeSafeInt
|
|
120
|
+
});
|
|
121
|
+
const AttemptSurvivors = Schema.Struct({
|
|
122
|
+
/**
|
|
123
|
+
* The lowest surviving attempt number. Anything above 1 means the prune
|
|
124
|
+
* job removed a leading run of attempts; the engine store applies the
|
|
125
|
+
* pruned-prefix tolerance to it so both survivor paths agree (issue #96).
|
|
126
|
+
*/
|
|
127
|
+
earliestAttempt: NonNegativeSafeInt,
|
|
128
|
+
earliestStartedAtMs: NonNegativeSafeInt,
|
|
129
|
+
latest: NonNegativeSafeInt
|
|
130
|
+
});
|
|
131
|
+
class RunParentCycleError extends Schema.TaggedError()(
|
|
132
|
+
"@smthrs/engine-store/RunParentCycleError",
|
|
133
|
+
{
|
|
134
|
+
path: Schema.Array(Schema.String)
|
|
135
|
+
}
|
|
136
|
+
) {
|
|
137
|
+
}
|
|
138
|
+
class EngineStateFault extends Schema.TaggedError()(
|
|
139
|
+
"@smthrs/engine-store/EngineStateFault",
|
|
140
|
+
{
|
|
141
|
+
reason: Schema.Literals([
|
|
142
|
+
"value_not_serializable",
|
|
143
|
+
"value_not_decodable",
|
|
144
|
+
"deferred_completion_missing",
|
|
145
|
+
"run_parent_edge_missing"
|
|
146
|
+
]),
|
|
147
|
+
field: Schema.optional(Schema.String),
|
|
148
|
+
cause: Schema.optional(Schema.Defect())
|
|
149
|
+
}
|
|
150
|
+
) {
|
|
151
|
+
get message() {
|
|
152
|
+
switch (this.reason) {
|
|
153
|
+
case "value_not_serializable":
|
|
154
|
+
return `${this.field} must be JSON-serializable`;
|
|
155
|
+
case "value_not_decodable":
|
|
156
|
+
return `could not decode ${this.field}`;
|
|
157
|
+
case "deferred_completion_missing":
|
|
158
|
+
return "deferred completion disappeared during first-writer transaction";
|
|
159
|
+
case "run_parent_edge_missing":
|
|
160
|
+
return "run parent edge disappeared during first-writer transaction";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
class DurableEngineState extends Context.Service()(
|
|
165
|
+
"@smthrs/engine-store/DurableEngineState"
|
|
166
|
+
) {
|
|
167
|
+
}
|
|
168
|
+
const deferredKey = (address) => JSON.stringify([address.flowName, address.executionId, address.deferredName]);
|
|
169
|
+
const clockKey = (address) => JSON.stringify([address.flowName, address.executionId, address.clockName]);
|
|
170
|
+
const DeferredDatabaseRow = Schema.Struct({
|
|
171
|
+
...DeferredAddress.fields,
|
|
172
|
+
exitJson: Schema.String,
|
|
173
|
+
metadataJson: Schema.NullOr(Schema.String),
|
|
174
|
+
completedAtMs: NonNegativeSafeInt
|
|
175
|
+
});
|
|
176
|
+
const ClockDatabaseRow = Schema.Struct({
|
|
177
|
+
...ClockAddress.fields,
|
|
178
|
+
deferredName: Schema.NonEmptyString,
|
|
179
|
+
dueAtMs: NonNegativeSafeInt,
|
|
180
|
+
completedAtMs: Schema.NullOr(NonNegativeSafeInt)
|
|
181
|
+
});
|
|
182
|
+
const WaitingDatabaseRow = Schema.Struct({
|
|
183
|
+
runId: Schema.NonEmptyString,
|
|
184
|
+
waitingReason: WaitingReason,
|
|
185
|
+
waitingWakeAtMs: Schema.NullOr(NonNegativeSafeInt),
|
|
186
|
+
waitingToken: Schema.NullOr(Schema.NonEmptyString),
|
|
187
|
+
/** Absent rather than null on a database written before `0004_waiting_request`. */
|
|
188
|
+
waitingRequest: Schema.optional(Schema.NullOr(Schema.String))
|
|
189
|
+
});
|
|
190
|
+
const decodeWaitingRequest = (value) => {
|
|
191
|
+
if (value === null || value === void 0) return {};
|
|
192
|
+
try {
|
|
193
|
+
return { request: JSON.parse(value) };
|
|
194
|
+
} catch {
|
|
195
|
+
return {};
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const decodeWaitingRow = (input) => decodeWaitingRowResult(input).pipe(Effect.orDie);
|
|
199
|
+
const decodeWaitingRowResult = (input) => Schema.decodeUnknownEffect(WaitingDatabaseRow)(input).pipe(
|
|
200
|
+
Effect.map((row) => ({
|
|
201
|
+
runId: row.runId,
|
|
202
|
+
reason: row.waitingReason,
|
|
203
|
+
wakeAt: row.waitingWakeAtMs,
|
|
204
|
+
token: row.waitingToken,
|
|
205
|
+
...decodeWaitingRequest(row.waitingRequest)
|
|
206
|
+
}))
|
|
207
|
+
);
|
|
208
|
+
const RunParentDatabaseRow = Schema.Struct({
|
|
209
|
+
childId: Schema.NonEmptyString,
|
|
210
|
+
parentId: Schema.NonEmptyString,
|
|
211
|
+
seq: NonNegativeSafeInt
|
|
212
|
+
});
|
|
213
|
+
const decodeRunParentEdge = (input) => decodeRunParentEdgeResult(input).pipe(Effect.orDie);
|
|
214
|
+
const decodeRunParentEdgeResult = (input) => Schema.decodeUnknownEffect(RunParentDatabaseRow)(input);
|
|
215
|
+
const findCyclePath = (childId, parentId, parentsOf) => Effect.suspend(() => {
|
|
216
|
+
if (parentId === childId) {
|
|
217
|
+
return Effect.succeed([childId]);
|
|
218
|
+
}
|
|
219
|
+
const seen = /* @__PURE__ */ new Set([parentId]);
|
|
220
|
+
const walk = (current, chain) => Effect.gen(function* () {
|
|
221
|
+
const parents = yield* parentsOf(current);
|
|
222
|
+
for (const parent of parents) {
|
|
223
|
+
if (parent === childId) return [...chain, parent].reverse();
|
|
224
|
+
if (seen.has(parent)) continue;
|
|
225
|
+
seen.add(parent);
|
|
226
|
+
const found = yield* walk(parent, [...chain, parent]);
|
|
227
|
+
if (found !== void 0) return found;
|
|
228
|
+
}
|
|
229
|
+
return void 0;
|
|
230
|
+
});
|
|
231
|
+
return walk(parentId, [parentId]);
|
|
232
|
+
});
|
|
233
|
+
const DeferredAddressDatabaseRow = DeferredAddress;
|
|
234
|
+
const deferredDigest = (row) => ({
|
|
235
|
+
exit: (0, import_JournalEvent.contentDigest)(row.exitJson),
|
|
236
|
+
metadata: row.metadataJson === null ? null : (0, import_JournalEvent.contentDigest)(row.metadataJson)
|
|
237
|
+
});
|
|
238
|
+
const memoryDigest = (row) => Effect.gen(function* () {
|
|
239
|
+
const exitJson = yield* encodeJson(row.exit, "exit");
|
|
240
|
+
const metadataJson = row.metadata === void 0 ? null : yield* encodeJson(row.metadata, "metadata");
|
|
241
|
+
return deferredDigest({ exitJson, metadataJson });
|
|
242
|
+
});
|
|
243
|
+
const encodeJson = (value, field) => Schema.encodeEffect(UnknownFromJsonString)(value).pipe(
|
|
244
|
+
Effect.mapError((cause) => new EngineStateFault({ reason: "value_not_serializable", field, cause })),
|
|
245
|
+
Effect.orDie
|
|
246
|
+
);
|
|
247
|
+
const decodeJson = (value, field) => Schema.decodeUnknownEffect(UnknownFromJsonString)(value).pipe(
|
|
248
|
+
Effect.mapError((cause) => new EngineStateFault({ reason: "value_not_decodable", field, cause })),
|
|
249
|
+
Effect.orDie
|
|
250
|
+
);
|
|
251
|
+
const restoreJsonExit = (value) => {
|
|
252
|
+
if (typeof value !== "object" || value === null) return value;
|
|
253
|
+
const record = value;
|
|
254
|
+
if (record["_id"] !== "Exit") return value;
|
|
255
|
+
if (record["_tag"] === "Success") return Exit.succeed(record["value"]);
|
|
256
|
+
if (record["_tag"] !== "Failure") return value;
|
|
257
|
+
const cause = record["cause"];
|
|
258
|
+
if (typeof cause !== "object" || cause === null) return value;
|
|
259
|
+
const failures = cause["failures"];
|
|
260
|
+
if (!Array.isArray(failures)) return value;
|
|
261
|
+
const reasons = [];
|
|
262
|
+
for (const failure of failures) {
|
|
263
|
+
if (typeof failure !== "object" || failure === null) return value;
|
|
264
|
+
const reason = failure;
|
|
265
|
+
switch (reason["_tag"]) {
|
|
266
|
+
case "Fail":
|
|
267
|
+
reasons.push(Cause.makeFailReason(reason["error"]));
|
|
268
|
+
break;
|
|
269
|
+
case "Die":
|
|
270
|
+
reasons.push(Cause.makeDieReason(reason["defect"]));
|
|
271
|
+
break;
|
|
272
|
+
case "Interrupt":
|
|
273
|
+
reasons.push(Cause.makeInterruptReason(
|
|
274
|
+
typeof reason["fiberId"] === "number" ? reason["fiberId"] : void 0
|
|
275
|
+
));
|
|
276
|
+
break;
|
|
277
|
+
default:
|
|
278
|
+
return value;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return Exit.failCause(Cause.fromReasons(reasons));
|
|
282
|
+
};
|
|
283
|
+
const decodeDeferredRow = (input) => Schema.decodeUnknownEffect(DeferredDatabaseRow)(input).pipe(
|
|
284
|
+
Effect.orDie,
|
|
285
|
+
Effect.flatMap(
|
|
286
|
+
(row) => Effect.all({
|
|
287
|
+
exit: decodeJson(row.exitJson, "exit_json").pipe(Effect.map(restoreJsonExit)),
|
|
288
|
+
metadata: row.metadataJson === null ? Effect.succeed(void 0) : decodeJson(row.metadataJson, "metadata_json")
|
|
289
|
+
}).pipe(
|
|
290
|
+
Effect.map(({ exit, metadata }) => ({
|
|
291
|
+
flowName: row.flowName,
|
|
292
|
+
executionId: row.executionId,
|
|
293
|
+
deferredName: row.deferredName,
|
|
294
|
+
exit,
|
|
295
|
+
...metadata === void 0 ? {} : { metadata },
|
|
296
|
+
completedAtMs: row.completedAtMs
|
|
297
|
+
}))
|
|
298
|
+
)
|
|
299
|
+
)
|
|
300
|
+
);
|
|
301
|
+
const decodeClockRow = (input) => decodeClockRowResult(input).pipe(Effect.orDie);
|
|
302
|
+
const decodeClockRowResult = (input) => Schema.decodeUnknownEffect(ClockDatabaseRow)(input).pipe(
|
|
303
|
+
Effect.map((row) => ({
|
|
304
|
+
flowName: row.flowName,
|
|
305
|
+
executionId: row.executionId,
|
|
306
|
+
clockName: row.clockName,
|
|
307
|
+
deferredName: row.deferredName,
|
|
308
|
+
dueAtMs: row.dueAtMs,
|
|
309
|
+
completedAtMs: row.completedAtMs
|
|
310
|
+
}))
|
|
311
|
+
);
|
|
312
|
+
const clockRowKey = (row) => JSON.stringify([row["flowName"], row["executionId"], row["clockName"]]);
|
|
313
|
+
const deferredAddressRowKey = (row) => JSON.stringify([row["flowName"], row["executionId"], row["deferredName"]]);
|
|
314
|
+
const runParentRowKey = (row) => JSON.stringify([row["childId"], row["parentId"]]);
|
|
315
|
+
const waitingTreeMaxDepth = 64;
|
|
316
|
+
const waitingRowKey = (row) => JSON.stringify([row["runId"]]);
|
|
317
|
+
const decodeSweep = (rows, kind, keyOf, decode) => Effect.gen(function* () {
|
|
318
|
+
const decoded = [];
|
|
319
|
+
for (const row of rows) {
|
|
320
|
+
const result = yield* Effect.result(decode(row));
|
|
321
|
+
if (Result.isSuccess(result)) {
|
|
322
|
+
decoded.push(result.success);
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
yield* Effect.logWarning(
|
|
326
|
+
`engine-store: skipping a malformed ${kind} row ${keyOf(row)}`,
|
|
327
|
+
result.failure
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
return decoded;
|
|
331
|
+
});
|
|
332
|
+
const dieOnDatabaseError = (cause) => Cause.fromReasons(
|
|
333
|
+
cause.reasons.map(
|
|
334
|
+
(reason) => Cause.isFailReason(reason) && reason.error instanceof import_DurableWriter.DatabaseError ? Cause.makeDieReason(reason.error).annotate(Cause.reasonAnnotations(reason)) : reason
|
|
335
|
+
)
|
|
336
|
+
);
|
|
337
|
+
const make = Effect.gen(function* () {
|
|
338
|
+
const sql = yield* Effect.service(SqlClient.SqlClient);
|
|
339
|
+
const writer = yield* import_DurableWriter.DurableWriter;
|
|
340
|
+
yield* EngineStateSchema.apply(sql, writer);
|
|
341
|
+
const selectDeferred = (address) => sql`
|
|
342
|
+
SELECT
|
|
343
|
+
flow_name AS "flowName",
|
|
344
|
+
execution_id AS "executionId",
|
|
345
|
+
deferred_name AS "deferredName",
|
|
346
|
+
exit_json AS "exitJson",
|
|
347
|
+
metadata_json AS "metadataJson",
|
|
348
|
+
completed_at_ms AS "completedAtMs"
|
|
349
|
+
FROM flows_deferred_completions
|
|
350
|
+
WHERE flow_name = ${address.flowName}
|
|
351
|
+
AND execution_id = ${address.executionId}
|
|
352
|
+
AND deferred_name = ${address.deferredName}
|
|
353
|
+
`;
|
|
354
|
+
const selectClock = (address) => sql`
|
|
355
|
+
SELECT
|
|
356
|
+
flow_name AS "flowName",
|
|
357
|
+
execution_id AS "executionId",
|
|
358
|
+
clock_name AS "clockName",
|
|
359
|
+
deferred_name AS "deferredName",
|
|
360
|
+
due_at_ms AS "dueAtMs",
|
|
361
|
+
completed_at_ms AS "completedAtMs"
|
|
362
|
+
FROM flows_clock_deadlines
|
|
363
|
+
WHERE flow_name = ${address.flowName}
|
|
364
|
+
AND execution_id = ${address.executionId}
|
|
365
|
+
AND clock_name = ${address.clockName}
|
|
366
|
+
`;
|
|
367
|
+
const deferred = Effect.fn("DurableEngineState.deferred")(
|
|
368
|
+
(address) => selectDeferred(address).pipe(
|
|
369
|
+
Effect.orDie,
|
|
370
|
+
Effect.flatMap(
|
|
371
|
+
(rows) => rows[0] === void 0 ? Effect.succeedNone : Effect.map(decodeDeferredRow(rows[0]), Option.some)
|
|
372
|
+
)
|
|
373
|
+
)
|
|
374
|
+
);
|
|
375
|
+
const consumeDeferred = Effect.fn("DurableEngineState.consumeDeferred")(
|
|
376
|
+
(address, consumedAtMs) => writer.write(sql`
|
|
377
|
+
UPDATE flows_deferred_completions
|
|
378
|
+
SET consumed_at_ms = ${consumedAtMs}
|
|
379
|
+
WHERE flow_name = ${address.flowName}
|
|
380
|
+
AND execution_id = ${address.executionId}
|
|
381
|
+
AND deferred_name = ${address.deferredName}
|
|
382
|
+
AND consumed_at_ms IS NULL
|
|
383
|
+
RETURNING flow_name AS "flowName"
|
|
384
|
+
`).pipe(Effect.orDie, Effect.map((rows) => rows.length > 0))
|
|
385
|
+
);
|
|
386
|
+
const completeDeferred = Effect.fn(
|
|
387
|
+
"DurableEngineState.completeDeferred"
|
|
388
|
+
)(
|
|
389
|
+
(row) => Effect.gen(function* () {
|
|
390
|
+
const exitJson = yield* encodeJson(row.exit, "exit");
|
|
391
|
+
const metadataJson = row.metadata === void 0 ? null : yield* encodeJson(row.metadata, "metadata");
|
|
392
|
+
return yield* writer.write(
|
|
393
|
+
Effect.gen(function* () {
|
|
394
|
+
const inserted = yield* sql`
|
|
395
|
+
INSERT INTO flows_deferred_completions (
|
|
396
|
+
flow_name,
|
|
397
|
+
execution_id,
|
|
398
|
+
deferred_name,
|
|
399
|
+
exit_json,
|
|
400
|
+
metadata_json,
|
|
401
|
+
completed_at_ms
|
|
402
|
+
) VALUES (
|
|
403
|
+
${row.flowName},
|
|
404
|
+
${row.executionId},
|
|
405
|
+
${row.deferredName},
|
|
406
|
+
${exitJson},
|
|
407
|
+
${metadataJson},
|
|
408
|
+
${row.completedAtMs}
|
|
409
|
+
)
|
|
410
|
+
ON CONFLICT (flow_name, execution_id, deferred_name) DO NOTHING
|
|
411
|
+
RETURNING
|
|
412
|
+
flow_name AS "flowName",
|
|
413
|
+
execution_id AS "executionId",
|
|
414
|
+
deferred_name AS "deferredName",
|
|
415
|
+
exit_json AS "exitJson",
|
|
416
|
+
metadata_json AS "metadataJson",
|
|
417
|
+
completed_at_ms AS "completedAtMs"
|
|
418
|
+
`;
|
|
419
|
+
if (inserted[0] !== void 0) {
|
|
420
|
+
return {
|
|
421
|
+
_tag: "Completed",
|
|
422
|
+
row: yield* decodeDeferredRow(inserted[0]),
|
|
423
|
+
digest: deferredDigest(inserted[0])
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
const existing = yield* selectDeferred(row);
|
|
427
|
+
if (existing[0] === void 0) {
|
|
428
|
+
return yield* Effect.die(new EngineStateFault({ reason: "deferred_completion_missing" }));
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
_tag: "Existing",
|
|
432
|
+
row: yield* decodeDeferredRow(existing[0]),
|
|
433
|
+
digest: deferredDigest(existing[0])
|
|
434
|
+
};
|
|
435
|
+
})
|
|
436
|
+
).pipe(Effect.orDie);
|
|
437
|
+
})
|
|
438
|
+
);
|
|
439
|
+
const clock = Effect.fn("DurableEngineState.clock")(
|
|
440
|
+
(address) => selectClock(address).pipe(
|
|
441
|
+
Effect.orDie,
|
|
442
|
+
Effect.flatMap(
|
|
443
|
+
(rows) => rows[0] === void 0 ? Effect.succeedNone : Effect.map(decodeClockRow(rows[0]), Option.some)
|
|
444
|
+
)
|
|
445
|
+
)
|
|
446
|
+
);
|
|
447
|
+
const scheduleClock = Effect.fn("DurableEngineState.scheduleClock")(
|
|
448
|
+
(row, owner) => writer.write(
|
|
449
|
+
Effect.gen(function* () {
|
|
450
|
+
const inserted = yield* sql`
|
|
451
|
+
INSERT INTO flows_clock_deadlines (
|
|
452
|
+
flow_name,
|
|
453
|
+
execution_id,
|
|
454
|
+
clock_name,
|
|
455
|
+
deferred_name,
|
|
456
|
+
due_at_ms,
|
|
457
|
+
completed_at_ms
|
|
458
|
+
)
|
|
459
|
+
SELECT
|
|
460
|
+
${row.flowName},
|
|
461
|
+
${row.executionId},
|
|
462
|
+
${row.clockName},
|
|
463
|
+
${row.deferredName},
|
|
464
|
+
${row.dueAtMs},
|
|
465
|
+
${row.completedAtMs}
|
|
466
|
+
WHERE EXISTS (
|
|
467
|
+
SELECT 1
|
|
468
|
+
FROM flows_runs
|
|
469
|
+
WHERE run_id = ${row.executionId}
|
|
470
|
+
AND status = 'running'
|
|
471
|
+
AND owner_host_id = ${owner.hostId}
|
|
472
|
+
AND owner_pid = ${owner.pid}
|
|
473
|
+
AND owner_nonce = ${owner.nonce}
|
|
474
|
+
)
|
|
475
|
+
ON CONFLICT (flow_name, execution_id, clock_name) DO NOTHING
|
|
476
|
+
RETURNING
|
|
477
|
+
flow_name AS "flowName",
|
|
478
|
+
execution_id AS "executionId",
|
|
479
|
+
clock_name AS "clockName",
|
|
480
|
+
deferred_name AS "deferredName",
|
|
481
|
+
due_at_ms AS "dueAtMs",
|
|
482
|
+
completed_at_ms AS "completedAtMs"
|
|
483
|
+
`;
|
|
484
|
+
if (inserted[0] !== void 0) {
|
|
485
|
+
return {
|
|
486
|
+
_tag: "Scheduled",
|
|
487
|
+
row: yield* decodeClockRow(inserted[0])
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
const existing = yield* selectClock(row);
|
|
491
|
+
if (existing[0] !== void 0) {
|
|
492
|
+
return {
|
|
493
|
+
_tag: "Existing",
|
|
494
|
+
row: yield* decodeClockRow(existing[0])
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
return yield* Effect.interrupt;
|
|
498
|
+
})
|
|
499
|
+
).pipe(Effect.orDie)
|
|
500
|
+
);
|
|
501
|
+
const completeClock = Effect.fn("DurableEngineState.completeClock")(
|
|
502
|
+
(address, completedAtMs) => writer.write(
|
|
503
|
+
Effect.gen(function* () {
|
|
504
|
+
const updated = yield* sql`
|
|
505
|
+
UPDATE flows_clock_deadlines
|
|
506
|
+
SET completed_at_ms = ${completedAtMs}
|
|
507
|
+
WHERE flow_name = ${address.flowName}
|
|
508
|
+
AND execution_id = ${address.executionId}
|
|
509
|
+
AND clock_name = ${address.clockName}
|
|
510
|
+
AND completed_at_ms IS NULL
|
|
511
|
+
RETURNING
|
|
512
|
+
flow_name AS "flowName",
|
|
513
|
+
execution_id AS "executionId",
|
|
514
|
+
clock_name AS "clockName",
|
|
515
|
+
deferred_name AS "deferredName",
|
|
516
|
+
due_at_ms AS "dueAtMs",
|
|
517
|
+
completed_at_ms AS "completedAtMs"
|
|
518
|
+
`;
|
|
519
|
+
if (updated[0] !== void 0) {
|
|
520
|
+
return {
|
|
521
|
+
_tag: "Completed",
|
|
522
|
+
row: yield* decodeClockRow(updated[0])
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
const existing = yield* selectClock(address);
|
|
526
|
+
return existing[0] === void 0 ? { _tag: "NotFound" } : {
|
|
527
|
+
_tag: "AlreadyCompleted",
|
|
528
|
+
row: yield* decodeClockRow(existing[0])
|
|
529
|
+
};
|
|
530
|
+
})
|
|
531
|
+
).pipe(Effect.orDie)
|
|
532
|
+
);
|
|
533
|
+
const dueClocks = Effect.fn("DurableEngineState.dueClocks")(
|
|
534
|
+
(nowMs) => sql`
|
|
535
|
+
SELECT
|
|
536
|
+
flow_name AS "flowName",
|
|
537
|
+
execution_id AS "executionId",
|
|
538
|
+
clock_name AS "clockName",
|
|
539
|
+
deferred_name AS "deferredName",
|
|
540
|
+
due_at_ms AS "dueAtMs",
|
|
541
|
+
completed_at_ms AS "completedAtMs"
|
|
542
|
+
FROM flows_clock_deadlines
|
|
543
|
+
WHERE completed_at_ms IS NULL
|
|
544
|
+
AND due_at_ms <= ${nowMs}
|
|
545
|
+
ORDER BY due_at_ms, execution_id, clock_name
|
|
546
|
+
`.pipe(
|
|
547
|
+
Effect.orDie,
|
|
548
|
+
// This is the whole store's due-timer sweep: dying on one unreadable
|
|
549
|
+
// deadline stopped every timer in every flow from firing.
|
|
550
|
+
Effect.flatMap((rows) => decodeSweep(rows, "clock deadline", clockRowKey, decodeClockRowResult))
|
|
551
|
+
)
|
|
552
|
+
);
|
|
553
|
+
const pendingClocks = Effect.fn("DurableEngineState.pendingClocks")(
|
|
554
|
+
(scope) => (scope.executionId !== void 0 ? sql`
|
|
555
|
+
SELECT
|
|
556
|
+
flow_name AS "flowName",
|
|
557
|
+
execution_id AS "executionId",
|
|
558
|
+
clock_name AS "clockName",
|
|
559
|
+
deferred_name AS "deferredName",
|
|
560
|
+
due_at_ms AS "dueAtMs",
|
|
561
|
+
completed_at_ms AS "completedAtMs"
|
|
562
|
+
FROM flows_clock_deadlines
|
|
563
|
+
WHERE completed_at_ms IS NULL
|
|
564
|
+
AND execution_id = ${scope.executionId}
|
|
565
|
+
AND ${scope.flowName === void 0 ? sql`1 = 1` : sql`flow_name = ${scope.flowName}`}
|
|
566
|
+
AND EXISTS (
|
|
567
|
+
SELECT 1 FROM flows_runs
|
|
568
|
+
WHERE flows_runs.run_id = flows_clock_deadlines.execution_id
|
|
569
|
+
AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
|
|
570
|
+
)
|
|
571
|
+
ORDER BY due_at_ms, execution_id, clock_name
|
|
572
|
+
` : scope.flowName !== void 0 ? sql`
|
|
573
|
+
SELECT
|
|
574
|
+
flow_name AS "flowName",
|
|
575
|
+
execution_id AS "executionId",
|
|
576
|
+
clock_name AS "clockName",
|
|
577
|
+
deferred_name AS "deferredName",
|
|
578
|
+
due_at_ms AS "dueAtMs",
|
|
579
|
+
completed_at_ms AS "completedAtMs"
|
|
580
|
+
FROM flows_clock_deadlines
|
|
581
|
+
WHERE completed_at_ms IS NULL
|
|
582
|
+
AND flow_name = ${scope.flowName}
|
|
583
|
+
AND EXISTS (
|
|
584
|
+
SELECT 1 FROM flows_runs
|
|
585
|
+
WHERE flows_runs.run_id = flows_clock_deadlines.execution_id
|
|
586
|
+
AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
|
|
587
|
+
)
|
|
588
|
+
ORDER BY due_at_ms, execution_id, clock_name
|
|
589
|
+
` : sql`
|
|
590
|
+
SELECT
|
|
591
|
+
flow_name AS "flowName",
|
|
592
|
+
execution_id AS "executionId",
|
|
593
|
+
clock_name AS "clockName",
|
|
594
|
+
deferred_name AS "deferredName",
|
|
595
|
+
due_at_ms AS "dueAtMs",
|
|
596
|
+
completed_at_ms AS "completedAtMs"
|
|
597
|
+
FROM flows_clock_deadlines
|
|
598
|
+
WHERE completed_at_ms IS NULL
|
|
599
|
+
AND EXISTS (
|
|
600
|
+
SELECT 1 FROM flows_runs
|
|
601
|
+
WHERE flows_runs.run_id = flows_clock_deadlines.execution_id
|
|
602
|
+
AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
|
|
603
|
+
)
|
|
604
|
+
ORDER BY due_at_ms, execution_id, clock_name
|
|
605
|
+
`).pipe(
|
|
606
|
+
Effect.orDie,
|
|
607
|
+
// A row that will not decode is a storage-integrity event about that
|
|
608
|
+
// row. Dying here made one of them fatal for the whole sweep, and so
|
|
609
|
+
// for `register` itself (issue B-08).
|
|
610
|
+
Effect.flatMap((rows) => decodeSweep(rows, "clock deadline", clockRowKey, decodeClockRowResult))
|
|
611
|
+
)
|
|
612
|
+
);
|
|
613
|
+
const completedDeferreds = Effect.fn(
|
|
614
|
+
"DurableEngineState.completedDeferreds"
|
|
615
|
+
)(
|
|
616
|
+
(flowName) => sql`
|
|
617
|
+
SELECT
|
|
618
|
+
flow_name AS "flowName",
|
|
619
|
+
execution_id AS "executionId",
|
|
620
|
+
deferred_name AS "deferredName"
|
|
621
|
+
FROM flows_deferred_completions
|
|
622
|
+
WHERE flow_name = ${flowName}
|
|
623
|
+
AND consumed_at_ms IS NULL
|
|
624
|
+
AND EXISTS (
|
|
625
|
+
SELECT 1 FROM flows_runs
|
|
626
|
+
WHERE flows_runs.run_id = flows_deferred_completions.execution_id
|
|
627
|
+
AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
|
|
628
|
+
)
|
|
629
|
+
ORDER BY execution_id, deferred_name
|
|
630
|
+
`.pipe(
|
|
631
|
+
Effect.orDie,
|
|
632
|
+
Effect.flatMap(
|
|
633
|
+
(rows) => decodeSweep(
|
|
634
|
+
rows,
|
|
635
|
+
"deferred completion",
|
|
636
|
+
deferredAddressRowKey,
|
|
637
|
+
(row) => Schema.decodeUnknownEffect(DeferredAddressDatabaseRow)(row)
|
|
638
|
+
)
|
|
639
|
+
)
|
|
640
|
+
)
|
|
641
|
+
);
|
|
642
|
+
const completeRunClocks = Effect.fn(
|
|
643
|
+
"DurableEngineState.completeRunClocks"
|
|
644
|
+
)(
|
|
645
|
+
(executionId, completedAtMs) => writer.write(sql`
|
|
646
|
+
UPDATE flows_clock_deadlines
|
|
647
|
+
SET completed_at_ms = ${completedAtMs}
|
|
648
|
+
WHERE execution_id = ${executionId}
|
|
649
|
+
AND completed_at_ms IS NULL
|
|
650
|
+
RETURNING
|
|
651
|
+
flow_name AS "flowName",
|
|
652
|
+
execution_id AS "executionId",
|
|
653
|
+
clock_name AS "clockName",
|
|
654
|
+
deferred_name AS "deferredName",
|
|
655
|
+
due_at_ms AS "dueAtMs",
|
|
656
|
+
completed_at_ms AS "completedAtMs"
|
|
657
|
+
`).pipe(
|
|
658
|
+
Effect.orDie,
|
|
659
|
+
Effect.flatMap((rows) => Effect.forEach(rows, decodeClockRow)),
|
|
660
|
+
Effect.map(
|
|
661
|
+
(rows) => [...rows].sort(
|
|
662
|
+
(left, right) => (0, import_Ordering.compareText)(left.flowName, right.flowName) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
|
|
663
|
+
)
|
|
664
|
+
)
|
|
665
|
+
)
|
|
666
|
+
);
|
|
667
|
+
const selectWaiting = (runId) => sql`
|
|
668
|
+
SELECT
|
|
669
|
+
run_id AS "runId",
|
|
670
|
+
waiting_reason AS "waitingReason",
|
|
671
|
+
waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
672
|
+
waiting_token AS "waitingToken",
|
|
673
|
+
waiting_request AS "waitingRequest"
|
|
674
|
+
FROM flows_runs
|
|
675
|
+
WHERE run_id = ${runId}
|
|
676
|
+
AND waiting_reason IS NOT NULL
|
|
677
|
+
`;
|
|
678
|
+
const park = Effect.fn("DurableEngineState.park")(
|
|
679
|
+
(runId, waiting2, owner) => writer.write(
|
|
680
|
+
Effect.gen(function* () {
|
|
681
|
+
const updated = yield* sql`
|
|
682
|
+
UPDATE flows_runs
|
|
683
|
+
SET
|
|
684
|
+
waiting_reason = ${waiting2.reason},
|
|
685
|
+
waiting_wake_at_ms = ${waiting2.wakeAt ?? null},
|
|
686
|
+
waiting_token = ${waiting2.token ?? null},
|
|
687
|
+
waiting_request = ${waiting2.request ?? null}
|
|
688
|
+
WHERE run_id = ${runId}
|
|
689
|
+
AND owner_host_id = ${owner.hostId}
|
|
690
|
+
AND owner_pid = ${owner.pid}
|
|
691
|
+
AND owner_nonce = ${owner.nonce}
|
|
692
|
+
RETURNING
|
|
693
|
+
run_id AS "runId",
|
|
694
|
+
waiting_reason AS "waitingReason",
|
|
695
|
+
waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
696
|
+
waiting_token AS "waitingToken",
|
|
697
|
+
waiting_request AS "waitingRequest"
|
|
698
|
+
`;
|
|
699
|
+
if (updated[0] === void 0) {
|
|
700
|
+
return { _tag: "NotFound" };
|
|
701
|
+
}
|
|
702
|
+
return { _tag: "Parked", row: yield* decodeWaitingRow(updated[0]) };
|
|
703
|
+
})
|
|
704
|
+
).pipe(Effect.orDie)
|
|
705
|
+
);
|
|
706
|
+
const wake = Effect.fn("DurableEngineState.wake")(
|
|
707
|
+
(runId) => writer.write(
|
|
708
|
+
Effect.gen(function* () {
|
|
709
|
+
const before = yield* selectWaiting(runId);
|
|
710
|
+
if (before[0] === void 0) {
|
|
711
|
+
const existing = yield* sql`
|
|
712
|
+
SELECT run_id AS "runId" FROM flows_runs WHERE run_id = ${runId}
|
|
713
|
+
`;
|
|
714
|
+
return existing[0] === void 0 ? { _tag: "NotFound" } : { _tag: "NotWaiting" };
|
|
715
|
+
}
|
|
716
|
+
const row = yield* decodeWaitingRow(before[0]);
|
|
717
|
+
yield* sql`
|
|
718
|
+
UPDATE flows_runs
|
|
719
|
+
SET
|
|
720
|
+
waiting_reason = NULL,
|
|
721
|
+
waiting_wake_at_ms = NULL,
|
|
722
|
+
waiting_token = NULL,
|
|
723
|
+
waiting_request = NULL
|
|
724
|
+
WHERE run_id = ${runId}
|
|
725
|
+
AND waiting_reason IS NOT NULL
|
|
726
|
+
`;
|
|
727
|
+
return { _tag: "Woken", row };
|
|
728
|
+
})
|
|
729
|
+
).pipe(Effect.orDie)
|
|
730
|
+
);
|
|
731
|
+
const waiting = Effect.fn("DurableEngineState.waiting")(
|
|
732
|
+
(runId) => selectWaiting(runId).pipe(
|
|
733
|
+
Effect.orDie,
|
|
734
|
+
Effect.flatMap(
|
|
735
|
+
(rows) => rows[0] === void 0 ? Effect.succeedNone : Effect.map(decodeWaitingRow(rows[0]), Option.some)
|
|
736
|
+
)
|
|
737
|
+
)
|
|
738
|
+
);
|
|
739
|
+
const waitingTree = Effect.fn("DurableEngineState.waitingTree")(
|
|
740
|
+
(runId, options) => sql`
|
|
741
|
+
WITH RECURSIVE tree(run_id, depth) AS (
|
|
742
|
+
SELECT run_id, 0 FROM flows_runs WHERE run_id = ${runId}
|
|
743
|
+
UNION
|
|
744
|
+
SELECT child.run_id, tree.depth + 1
|
|
745
|
+
FROM tree
|
|
746
|
+
JOIN flows_runs child ON child.run_id IN (
|
|
747
|
+
SELECT child_id FROM flows_run_parents WHERE parent_id = tree.run_id
|
|
748
|
+
UNION ALL
|
|
749
|
+
SELECT run_id FROM flows_runs WHERE parent_run_id = tree.run_id
|
|
750
|
+
)
|
|
751
|
+
WHERE tree.depth < ${waitingTreeMaxDepth}
|
|
752
|
+
AND (${options?.detached === "include" ? 1 : 0} = 1
|
|
753
|
+
OR child.parent_run_id = tree.run_id
|
|
754
|
+
OR COALESCE(${Dialect.jsonText(sql, sql`child.state_json`, "$.onParentExit")}, 'cancel') <> 'detach')
|
|
755
|
+
), reachable(run_id, depth) AS (
|
|
756
|
+
SELECT run_id, MIN(depth) FROM tree GROUP BY run_id
|
|
757
|
+
)
|
|
758
|
+
SELECT
|
|
759
|
+
parked.run_id AS "runId",
|
|
760
|
+
parked.waiting_reason AS "waitingReason",
|
|
761
|
+
parked.waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
762
|
+
parked.waiting_token AS "waitingToken",
|
|
763
|
+
parked.waiting_request AS "waitingRequest"
|
|
764
|
+
FROM reachable
|
|
765
|
+
JOIN flows_runs parked ON parked.run_id = reachable.run_id
|
|
766
|
+
WHERE parked.waiting_reason IS NOT NULL
|
|
767
|
+
AND parked.status NOT IN ('completed', 'failed', 'cancelled')
|
|
768
|
+
ORDER BY reachable.depth, parked.created_at_ms, parked.run_id
|
|
769
|
+
`.pipe(
|
|
770
|
+
Effect.orDie,
|
|
771
|
+
Effect.flatMap((rows) => decodeSweep(rows, "waiting run", waitingRowKey, decodeWaitingRowResult))
|
|
772
|
+
)
|
|
773
|
+
);
|
|
774
|
+
const waitingRuns = Effect.fn("DurableEngineState.waitingRuns")((filter) => {
|
|
775
|
+
const cancelRequestedOnly = filter?.cancelRequested === true ? 1 : 0;
|
|
776
|
+
return (filter?.reason !== void 0 && filter.dueBeforeMs !== void 0 ? sql`
|
|
777
|
+
SELECT
|
|
778
|
+
run_id AS "runId",
|
|
779
|
+
waiting_reason AS "waitingReason",
|
|
780
|
+
waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
781
|
+
waiting_token AS "waitingToken",
|
|
782
|
+
waiting_request AS "waitingRequest"
|
|
783
|
+
FROM flows_runs
|
|
784
|
+
WHERE waiting_reason = ${filter.reason}
|
|
785
|
+
AND waiting_wake_at_ms IS NOT NULL
|
|
786
|
+
AND waiting_wake_at_ms <= ${filter.dueBeforeMs}
|
|
787
|
+
AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
|
|
788
|
+
AND status NOT IN ('completed', 'failed', 'cancelled')
|
|
789
|
+
ORDER BY waiting_wake_at_ms, run_id
|
|
790
|
+
` : filter?.reason !== void 0 ? sql`
|
|
791
|
+
SELECT
|
|
792
|
+
run_id AS "runId",
|
|
793
|
+
waiting_reason AS "waitingReason",
|
|
794
|
+
waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
795
|
+
waiting_token AS "waitingToken",
|
|
796
|
+
waiting_request AS "waitingRequest"
|
|
797
|
+
FROM flows_runs
|
|
798
|
+
WHERE waiting_reason = ${filter.reason}
|
|
799
|
+
AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
|
|
800
|
+
AND status NOT IN ('completed', 'failed', 'cancelled')
|
|
801
|
+
ORDER BY waiting_wake_at_ms IS NULL, waiting_wake_at_ms, run_id
|
|
802
|
+
` : filter?.dueBeforeMs !== void 0 ? sql`
|
|
803
|
+
SELECT
|
|
804
|
+
run_id AS "runId",
|
|
805
|
+
waiting_reason AS "waitingReason",
|
|
806
|
+
waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
807
|
+
waiting_token AS "waitingToken",
|
|
808
|
+
waiting_request AS "waitingRequest"
|
|
809
|
+
FROM flows_runs
|
|
810
|
+
WHERE waiting_reason IS NOT NULL
|
|
811
|
+
AND waiting_wake_at_ms IS NOT NULL
|
|
812
|
+
AND waiting_wake_at_ms <= ${filter.dueBeforeMs}
|
|
813
|
+
AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
|
|
814
|
+
AND status NOT IN ('completed', 'failed', 'cancelled')
|
|
815
|
+
ORDER BY waiting_wake_at_ms, run_id
|
|
816
|
+
` : sql`
|
|
817
|
+
SELECT
|
|
818
|
+
run_id AS "runId",
|
|
819
|
+
waiting_reason AS "waitingReason",
|
|
820
|
+
waiting_wake_at_ms AS "waitingWakeAtMs",
|
|
821
|
+
waiting_token AS "waitingToken",
|
|
822
|
+
waiting_request AS "waitingRequest"
|
|
823
|
+
FROM flows_runs
|
|
824
|
+
WHERE waiting_reason IS NOT NULL
|
|
825
|
+
AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
|
|
826
|
+
AND status NOT IN ('completed', 'failed', 'cancelled')
|
|
827
|
+
ORDER BY waiting_wake_at_ms IS NULL, waiting_wake_at_ms, run_id
|
|
828
|
+
`).pipe(
|
|
829
|
+
Effect.orDie,
|
|
830
|
+
// The parked-run sweeper's only enumeration: one unreadable waiting
|
|
831
|
+
// payload stranded every parked run, including the ones whose
|
|
832
|
+
// cancellation had already been requested.
|
|
833
|
+
Effect.flatMap((rows) => decodeSweep(rows, "waiting run", waitingRowKey, decodeWaitingRowResult))
|
|
834
|
+
);
|
|
835
|
+
});
|
|
836
|
+
const pendingRows = (flowName, limit, after, through, descending = false, eligibleBeforeMs) => sql`
|
|
837
|
+
SELECT run_id AS "runId", created_at_ms AS "createdAtMs" FROM flows_runs
|
|
838
|
+
${Dialect.isPostgres(sql) ? sql`` : sql`INDEXED BY flows_runs_listing_3`}
|
|
839
|
+
WHERE status = 'pending'
|
|
840
|
+
AND ${eligibleBeforeMs === void 0 ? sql`TRUE` : sql`created_at_ms < ${eligibleBeforeMs}`}
|
|
841
|
+
AND execution_flow = ${flowName}
|
|
842
|
+
AND ${after === void 0 ? sql`TRUE` : sql`(
|
|
843
|
+
created_at_ms > ${after.createdAtMs}
|
|
844
|
+
OR (created_at_ms = ${after.createdAtMs} AND run_id > ${after.runId})
|
|
845
|
+
)`}
|
|
846
|
+
AND ${through === void 0 ? sql`TRUE` : sql`(
|
|
847
|
+
created_at_ms < ${through.createdAtMs}
|
|
848
|
+
OR (created_at_ms = ${through.createdAtMs} AND run_id <= ${through.runId})
|
|
849
|
+
)`}
|
|
850
|
+
ORDER BY ${descending ? sql`created_at_ms DESC, run_id DESC` : sql`created_at_ms, run_id`}
|
|
851
|
+
LIMIT ${limit ?? (Dialect.isPostgres(sql) ? null : -1)}
|
|
852
|
+
`.pipe(
|
|
853
|
+
Effect.orDie,
|
|
854
|
+
Effect.map((rows) => rows.map((row) => ({ runId: row.runId, createdAtMs: Number(row.createdAtMs) })))
|
|
855
|
+
);
|
|
856
|
+
const pendingRuns = Effect.fn("DurableEngineState.pendingRuns")((flowName, limit, after, through, eligibleBeforeMs) => pendingRows(flowName, limit, after, through, false, eligibleBeforeMs));
|
|
857
|
+
const pendingRunTail = Effect.fn("DurableEngineState.pendingRunTail")(
|
|
858
|
+
(flowName, eligibleBeforeMs) => pendingRows(flowName, 1, void 0, void 0, true, eligibleBeforeMs).pipe(
|
|
859
|
+
Effect.map((rows) => Option.fromNullishOr(rows[0]))
|
|
860
|
+
)
|
|
861
|
+
);
|
|
862
|
+
const pendingCancellationRows = (limit, after, through, descending = false) => pendingCancellationLimit(limit).pipe(
|
|
863
|
+
Effect.andThen(sql`
|
|
864
|
+
SELECT run_id AS "runId", created_at_ms AS "createdAtMs" FROM flows_runs
|
|
865
|
+
${Dialect.isPostgres(sql) ? sql`` : sql`INDEXED BY flows_runs_pending_cancel_idx`}
|
|
866
|
+
WHERE status = 'pending' AND cancel_requested_at_ms IS NOT NULL
|
|
867
|
+
AND ${after === void 0 ? sql`TRUE` : sql`(created_at_ms, run_id) > (${after.createdAtMs}, ${after.runId})`}
|
|
868
|
+
AND ${through === void 0 ? sql`TRUE` : sql`(created_at_ms, run_id) <= (${through.createdAtMs}, ${through.runId})`}
|
|
869
|
+
ORDER BY ${descending ? sql`created_at_ms DESC, run_id DESC` : sql`created_at_ms, run_id`}
|
|
870
|
+
LIMIT ${limit}
|
|
871
|
+
`.pipe(
|
|
872
|
+
Effect.orDie,
|
|
873
|
+
Effect.map((rows) => rows.map((row) => ({ runId: row.runId, createdAtMs: Number(row.createdAtMs) })))
|
|
874
|
+
))
|
|
875
|
+
);
|
|
876
|
+
const pendingCancellationRuns = Effect.fn(
|
|
877
|
+
"DurableEngineState.pendingCancellationRuns"
|
|
878
|
+
)((limit, after, through) => pendingCancellationRows(limit, after, through));
|
|
879
|
+
const pendingCancellationTail = Effect.fn(
|
|
880
|
+
"DurableEngineState.pendingCancellationTail"
|
|
881
|
+
)(
|
|
882
|
+
() => pendingCancellationRows(1, void 0, void 0, true).pipe(
|
|
883
|
+
Effect.map((rows) => Option.fromNullishOr(rows[0]))
|
|
884
|
+
)
|
|
885
|
+
);
|
|
886
|
+
const staleRunningRuns = Effect.fn(
|
|
887
|
+
"DurableEngineState.staleRunningRuns"
|
|
888
|
+
)(
|
|
889
|
+
(staleBeforeMs, limit) => (
|
|
890
|
+
// `LIMIT -1` is SQLite's explicit "no limit"; the partial index created
|
|
891
|
+
// in `make` serves the predicate, so the per-tick sweep is an index
|
|
892
|
+
// range read instead of a full table scan (issue #79).
|
|
893
|
+
sql`
|
|
894
|
+
SELECT run_id AS "runId", heartbeat_at_ms AS "heartbeatAtMs"
|
|
895
|
+
FROM flows_runs
|
|
896
|
+
WHERE status = 'running'
|
|
897
|
+
AND heartbeat_at_ms IS NOT NULL
|
|
898
|
+
AND heartbeat_at_ms < ${staleBeforeMs}
|
|
899
|
+
ORDER BY heartbeat_at_ms, run_id
|
|
900
|
+
LIMIT ${limit ?? (Dialect.isPostgres(sql) ? null : -1)}
|
|
901
|
+
`.pipe(
|
|
902
|
+
Effect.orDie,
|
|
903
|
+
Effect.map((rows) => rows.map((row) => ({ runId: String(row.runId), heartbeatAtMs: Number(row.heartbeatAtMs) })))
|
|
904
|
+
)
|
|
905
|
+
)
|
|
906
|
+
);
|
|
907
|
+
const attemptSurvivors = Effect.fn(
|
|
908
|
+
"DurableEngineState.attemptSurvivors"
|
|
909
|
+
)(
|
|
910
|
+
(runId, stepKeyDigest) => sql`
|
|
911
|
+
SELECT attempt AS "attempt", started_at_ms AS "startedAtMs"
|
|
912
|
+
FROM flows_attempts
|
|
913
|
+
WHERE run_id = ${runId}
|
|
914
|
+
AND step_key_digest = ${stepKeyDigest}
|
|
915
|
+
ORDER BY attempt
|
|
916
|
+
`.pipe(
|
|
917
|
+
Effect.orDie,
|
|
918
|
+
Effect.map((rows) => {
|
|
919
|
+
const first = rows[0];
|
|
920
|
+
if (first === void 0) return Option.none();
|
|
921
|
+
let latest = Number(first.attempt);
|
|
922
|
+
for (let index = 1; index < rows.length; index++) {
|
|
923
|
+
const next = Number(rows[index].attempt);
|
|
924
|
+
if (next !== latest + 1) break;
|
|
925
|
+
latest = next;
|
|
926
|
+
}
|
|
927
|
+
return Option.some({
|
|
928
|
+
earliestAttempt: Number(first.attempt),
|
|
929
|
+
earliestStartedAtMs: Number(first.startedAtMs),
|
|
930
|
+
latest
|
|
931
|
+
});
|
|
932
|
+
})
|
|
933
|
+
)
|
|
934
|
+
);
|
|
935
|
+
const selectRunParent = (childId, parentId) => sql`
|
|
936
|
+
SELECT
|
|
937
|
+
child_id AS "childId",
|
|
938
|
+
parent_id AS "parentId",
|
|
939
|
+
seq AS "seq"
|
|
940
|
+
FROM flows_run_parents
|
|
941
|
+
WHERE child_id = ${childId}
|
|
942
|
+
AND parent_id = ${parentId}
|
|
943
|
+
`;
|
|
944
|
+
const parentIdsOf = (id) => sql`
|
|
945
|
+
SELECT
|
|
946
|
+
child_id AS "childId",
|
|
947
|
+
parent_id AS "parentId",
|
|
948
|
+
seq AS "seq"
|
|
949
|
+
FROM flows_run_parents
|
|
950
|
+
WHERE child_id = ${id}
|
|
951
|
+
ORDER BY seq
|
|
952
|
+
`.pipe(
|
|
953
|
+
Effect.orDie,
|
|
954
|
+
Effect.map((rows) => rows.map((row) => String(row.parentId)))
|
|
955
|
+
);
|
|
956
|
+
const recordRunParent = Effect.fn(
|
|
957
|
+
"DurableEngineState.recordRunParent"
|
|
958
|
+
)(
|
|
959
|
+
(childId, parentId) => writer.write(
|
|
960
|
+
Effect.gen(function* () {
|
|
961
|
+
const inserted = yield* sql`
|
|
962
|
+
INSERT INTO flows_run_parents (child_id, parent_id, seq)
|
|
963
|
+
SELECT ${childId}, ${parentId}, COALESCE(MAX(seq), 0) + 1
|
|
964
|
+
FROM flows_run_parents
|
|
965
|
+
WHERE TRUE
|
|
966
|
+
ON CONFLICT (child_id, parent_id) DO NOTHING
|
|
967
|
+
RETURNING
|
|
968
|
+
child_id AS "childId",
|
|
969
|
+
parent_id AS "parentId",
|
|
970
|
+
seq AS "seq"
|
|
971
|
+
`;
|
|
972
|
+
if (inserted[0] !== void 0) {
|
|
973
|
+
const cycle = yield* findCyclePath(childId, parentId, parentIdsOf);
|
|
974
|
+
if (cycle !== void 0) {
|
|
975
|
+
return yield* Effect.fail(new RunParentCycleError({ path: cycle }));
|
|
976
|
+
}
|
|
977
|
+
return {
|
|
978
|
+
_tag: "Recorded",
|
|
979
|
+
edge: yield* decodeRunParentEdge(inserted[0])
|
|
980
|
+
};
|
|
981
|
+
}
|
|
982
|
+
const existing = yield* selectRunParent(childId, parentId);
|
|
983
|
+
if (existing[0] === void 0) {
|
|
984
|
+
return yield* Effect.die(new EngineStateFault({ reason: "run_parent_edge_missing" }));
|
|
985
|
+
}
|
|
986
|
+
return {
|
|
987
|
+
_tag: "Existing",
|
|
988
|
+
edge: yield* decodeRunParentEdge(existing[0])
|
|
989
|
+
};
|
|
990
|
+
})
|
|
991
|
+
).pipe(
|
|
992
|
+
Effect.catch((error) => error instanceof RunParentCycleError ? Effect.fail(error) : Effect.die(error))
|
|
993
|
+
)
|
|
994
|
+
);
|
|
995
|
+
const removeRunParentsForRun = Effect.fn(
|
|
996
|
+
"DurableEngineState.removeRunParentsForRun"
|
|
997
|
+
)(
|
|
998
|
+
(runId) => writer.write(sql`
|
|
999
|
+
DELETE FROM flows_run_parents
|
|
1000
|
+
WHERE child_id = ${runId}
|
|
1001
|
+
OR parent_id = ${runId}
|
|
1002
|
+
`).pipe(Effect.orDie, Effect.asVoid)
|
|
1003
|
+
);
|
|
1004
|
+
const transactionGate = Semaphore.makeUnsafe(1);
|
|
1005
|
+
const transaction = (effect) => Effect.flatMap(Effect.serviceOption(sql.transactionService), (enclosing) => {
|
|
1006
|
+
const write = (body) => writer.write(body).pipe(
|
|
1007
|
+
Effect.catchCause((cause) => {
|
|
1008
|
+
if (cause.reasons.length === 1) {
|
|
1009
|
+
const reason = cause.reasons[0];
|
|
1010
|
+
if (Cause.isFailReason(reason) && reason.error instanceof import_DurableWriter.DatabaseError) {
|
|
1011
|
+
return Effect.die(reason.error);
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
return Effect.failCause(dieOnDatabaseError(cause));
|
|
1015
|
+
})
|
|
1016
|
+
);
|
|
1017
|
+
if (Option.isSome(enclosing)) return write(effect);
|
|
1018
|
+
return Effect.uninterruptibleMask(
|
|
1019
|
+
(restore) => Effect.gen(function* () {
|
|
1020
|
+
yield* restore(transactionGate.take(1));
|
|
1021
|
+
let released = false;
|
|
1022
|
+
const release = Effect.suspend(() => {
|
|
1023
|
+
if (released) return Effect.void;
|
|
1024
|
+
released = true;
|
|
1025
|
+
return transactionGate.release(1).pipe(Effect.asVoid);
|
|
1026
|
+
});
|
|
1027
|
+
return yield* restore(write(Effect.gen(function* () {
|
|
1028
|
+
yield* (0, import_DurableWriter.afterCommit)(release, sql);
|
|
1029
|
+
return yield* effect;
|
|
1030
|
+
}))).pipe(Effect.ensuring(release));
|
|
1031
|
+
})
|
|
1032
|
+
);
|
|
1033
|
+
});
|
|
1034
|
+
const runParents = Effect.fn("DurableEngineState.runParents")(
|
|
1035
|
+
(childId) => sql`
|
|
1036
|
+
SELECT
|
|
1037
|
+
child_id AS "childId",
|
|
1038
|
+
parent_id AS "parentId",
|
|
1039
|
+
seq AS "seq"
|
|
1040
|
+
FROM flows_run_parents
|
|
1041
|
+
WHERE child_id = ${childId}
|
|
1042
|
+
ORDER BY seq
|
|
1043
|
+
`.pipe(
|
|
1044
|
+
Effect.orDie,
|
|
1045
|
+
// One unreadable edge made a run's whole ancestry unreadable, so no
|
|
1046
|
+
// subflow under it could be linked at all.
|
|
1047
|
+
Effect.flatMap((rows) => decodeSweep(rows, "run parent", runParentRowKey, decodeRunParentEdgeResult))
|
|
1048
|
+
)
|
|
1049
|
+
);
|
|
1050
|
+
const runChildren = Effect.fn("DurableEngineState.runChildren")(
|
|
1051
|
+
(parentId) => sql`
|
|
1052
|
+
SELECT
|
|
1053
|
+
child_id AS "childId",
|
|
1054
|
+
parent_id AS "parentId",
|
|
1055
|
+
seq AS "seq"
|
|
1056
|
+
FROM flows_run_parents
|
|
1057
|
+
WHERE parent_id = ${parentId}
|
|
1058
|
+
ORDER BY seq
|
|
1059
|
+
`.pipe(
|
|
1060
|
+
Effect.orDie,
|
|
1061
|
+
// The cancellation cascade's only cross-process way to find a run's
|
|
1062
|
+
// children: one unreadable sibling edge left every child running after
|
|
1063
|
+
// its parent was cancelled.
|
|
1064
|
+
Effect.flatMap((rows) => decodeSweep(rows, "run parent", runParentRowKey, decodeRunParentEdgeResult))
|
|
1065
|
+
)
|
|
1066
|
+
);
|
|
1067
|
+
return DurableEngineState.of({
|
|
1068
|
+
deferred,
|
|
1069
|
+
consumeDeferred,
|
|
1070
|
+
completeDeferred,
|
|
1071
|
+
clock,
|
|
1072
|
+
scheduleClock,
|
|
1073
|
+
completeClock,
|
|
1074
|
+
completeRunClocks,
|
|
1075
|
+
dueClocks,
|
|
1076
|
+
pendingClocks,
|
|
1077
|
+
completedDeferreds,
|
|
1078
|
+
park,
|
|
1079
|
+
wake,
|
|
1080
|
+
waiting,
|
|
1081
|
+
waitingTree,
|
|
1082
|
+
waitingRuns,
|
|
1083
|
+
pendingRuns,
|
|
1084
|
+
pendingRunTail,
|
|
1085
|
+
pendingCancellationRuns,
|
|
1086
|
+
pendingCancellationTail,
|
|
1087
|
+
staleRunningRuns,
|
|
1088
|
+
attemptSurvivors,
|
|
1089
|
+
recordRunParent,
|
|
1090
|
+
removeRunParentsForRun,
|
|
1091
|
+
runParents,
|
|
1092
|
+
runChildren,
|
|
1093
|
+
transaction
|
|
1094
|
+
});
|
|
1095
|
+
});
|
|
1096
|
+
const layer = Layer.effect(
|
|
1097
|
+
DurableEngineState,
|
|
1098
|
+
make
|
|
1099
|
+
);
|
|
1100
|
+
const makeMemory = (options = {}) => {
|
|
1101
|
+
const deferreds = /* @__PURE__ */ new Map();
|
|
1102
|
+
const consumedDeferreds = /* @__PURE__ */ new Map();
|
|
1103
|
+
const clocks = /* @__PURE__ */ new Map();
|
|
1104
|
+
const waitingRows = /* @__PURE__ */ new Map();
|
|
1105
|
+
const parentEdges = /* @__PURE__ */ new Map();
|
|
1106
|
+
let parentSeq = 0;
|
|
1107
|
+
const snapshotDeferred = (row) => Schema.decodeUnknownEffect(DeferredRow)(row).pipe(
|
|
1108
|
+
Effect.orDie,
|
|
1109
|
+
Effect.flatMap(
|
|
1110
|
+
(decoded) => Effect.all({
|
|
1111
|
+
exitJson: encodeJson(decoded.exit, "exit"),
|
|
1112
|
+
metadataJson: decoded.metadata === void 0 ? Effect.succeed(null) : encodeJson(decoded.metadata, "metadata")
|
|
1113
|
+
}).pipe(
|
|
1114
|
+
Effect.flatMap(
|
|
1115
|
+
({ exitJson, metadataJson }) => decodeDeferredRow({
|
|
1116
|
+
flowName: decoded.flowName,
|
|
1117
|
+
executionId: decoded.executionId,
|
|
1118
|
+
deferredName: decoded.deferredName,
|
|
1119
|
+
exitJson,
|
|
1120
|
+
metadataJson,
|
|
1121
|
+
completedAtMs: decoded.completedAtMs
|
|
1122
|
+
})
|
|
1123
|
+
)
|
|
1124
|
+
)
|
|
1125
|
+
)
|
|
1126
|
+
);
|
|
1127
|
+
const snapshotClock = (row) => Schema.decodeUnknownEffect(ClockRow)(row).pipe(
|
|
1128
|
+
Effect.orDie,
|
|
1129
|
+
Effect.map((decoded) => ({ ...decoded }))
|
|
1130
|
+
);
|
|
1131
|
+
const snapshotWaiting = (row) => ({ ...row });
|
|
1132
|
+
const findCyclePathSync = (childId, parentId) => {
|
|
1133
|
+
if (parentId === childId) return [childId];
|
|
1134
|
+
const seen = /* @__PURE__ */ new Set([parentId]);
|
|
1135
|
+
const walk = (current, chain) => {
|
|
1136
|
+
for (const parent of parentEdges.get(current)?.keys() ?? []) {
|
|
1137
|
+
if (parent === childId) return [...chain, parent].reverse();
|
|
1138
|
+
if (seen.has(parent)) continue;
|
|
1139
|
+
seen.add(parent);
|
|
1140
|
+
const found = walk(parent, [...chain, parent]);
|
|
1141
|
+
if (found !== void 0) return found;
|
|
1142
|
+
}
|
|
1143
|
+
return void 0;
|
|
1144
|
+
};
|
|
1145
|
+
return walk(parentId, [parentId]);
|
|
1146
|
+
};
|
|
1147
|
+
const sameOwner = (left, right) => left.hostId === right.hostId && left.pid === right.pid && left.nonce === right.nonce;
|
|
1148
|
+
const runView = (runId, presented) => {
|
|
1149
|
+
if (options.runs === void 0) {
|
|
1150
|
+
return { exists: true, running: true, owned: true };
|
|
1151
|
+
}
|
|
1152
|
+
const view = options.runs(runId);
|
|
1153
|
+
if (Option.isNone(view)) {
|
|
1154
|
+
return { exists: false, running: false, owned: false };
|
|
1155
|
+
}
|
|
1156
|
+
const owned = presented !== void 0 && view.value.owner !== null && sameOwner(view.value.owner, presented);
|
|
1157
|
+
return { exists: true, running: view.value.status === "running", owned };
|
|
1158
|
+
};
|
|
1159
|
+
const isLive = (runId) => {
|
|
1160
|
+
if (options.runs === void 0) return true;
|
|
1161
|
+
const view = options.runs(runId);
|
|
1162
|
+
return Option.isSome(view) && (view.value.status === "pending" || view.value.status === "running" || view.value.status === "suspended");
|
|
1163
|
+
};
|
|
1164
|
+
const pendingMemoryRows = (flowName, after, through, eligibleBeforeMs, cancellationOnly = false) => Array.from(options.listRuns?.() ?? []).filter(
|
|
1165
|
+
([runId, view]) => view.status === "pending" && (flowName === void 0 || view.flowName === flowName) && (!cancellationOnly || view.cancelRequestedAtMs != null) && (eligibleBeforeMs === void 0 || (view.createdAtMs ?? 0) < eligibleBeforeMs) && (after === void 0 || (view.createdAtMs ?? 0) > after.createdAtMs || (view.createdAtMs ?? 0) === after.createdAtMs && (0, import_Ordering.compareText)(runId, after.runId) > 0) && (through === void 0 || (view.createdAtMs ?? 0) < through.createdAtMs || (view.createdAtMs ?? 0) === through.createdAtMs && (0, import_Ordering.compareText)(runId, through.runId) <= 0)
|
|
1166
|
+
).sort(
|
|
1167
|
+
([leftId, left], [rightId, right]) => (left.createdAtMs ?? 0) - (right.createdAtMs ?? 0) || (0, import_Ordering.compareText)(leftId, rightId)
|
|
1168
|
+
).map(([runId, view]) => ({ runId, createdAtMs: view.createdAtMs ?? 0 }));
|
|
1169
|
+
const unguarded = {
|
|
1170
|
+
deferred: Effect.fn("DurableEngineState.deferred")(
|
|
1171
|
+
(address) => Effect.gen(function* () {
|
|
1172
|
+
const row = deferreds.get(deferredKey(address));
|
|
1173
|
+
return row === void 0 ? Option.none() : Option.some(yield* snapshotDeferred(row));
|
|
1174
|
+
})
|
|
1175
|
+
),
|
|
1176
|
+
consumeDeferred: Effect.fn("DurableEngineState.consumeDeferred")(
|
|
1177
|
+
(address, consumedAtMs) => Effect.sync(() => {
|
|
1178
|
+
const key = deferredKey(address);
|
|
1179
|
+
if (!deferreds.has(key) || consumedDeferreds.has(key)) return false;
|
|
1180
|
+
consumedDeferreds.set(key, consumedAtMs);
|
|
1181
|
+
return true;
|
|
1182
|
+
})
|
|
1183
|
+
),
|
|
1184
|
+
completeDeferred: Effect.fn("DurableEngineState.completeDeferred")(
|
|
1185
|
+
(row) => Effect.gen(function* () {
|
|
1186
|
+
const stored = yield* snapshotDeferred(row);
|
|
1187
|
+
const key = deferredKey(stored);
|
|
1188
|
+
const existing = deferreds.get(key);
|
|
1189
|
+
if (existing !== void 0) {
|
|
1190
|
+
return {
|
|
1191
|
+
_tag: "Existing",
|
|
1192
|
+
row: yield* snapshotDeferred(existing),
|
|
1193
|
+
digest: yield* memoryDigest(existing)
|
|
1194
|
+
};
|
|
1195
|
+
}
|
|
1196
|
+
deferreds.set(key, stored);
|
|
1197
|
+
return {
|
|
1198
|
+
_tag: "Completed",
|
|
1199
|
+
row: yield* snapshotDeferred(stored),
|
|
1200
|
+
digest: yield* memoryDigest(stored)
|
|
1201
|
+
};
|
|
1202
|
+
})
|
|
1203
|
+
),
|
|
1204
|
+
clock: Effect.fn("DurableEngineState.clock")(
|
|
1205
|
+
(address) => Effect.gen(function* () {
|
|
1206
|
+
const row = clocks.get(clockKey(address));
|
|
1207
|
+
return row === void 0 ? Option.none() : Option.some(yield* snapshotClock(row));
|
|
1208
|
+
})
|
|
1209
|
+
),
|
|
1210
|
+
scheduleClock: Effect.fn("DurableEngineState.scheduleClock")(
|
|
1211
|
+
(row, owner) => Effect.gen(function* () {
|
|
1212
|
+
const stored = yield* snapshotClock(row);
|
|
1213
|
+
const key = clockKey(stored);
|
|
1214
|
+
const existing = clocks.get(key);
|
|
1215
|
+
if (existing !== void 0) {
|
|
1216
|
+
return { _tag: "Existing", row: yield* snapshotClock(existing) };
|
|
1217
|
+
}
|
|
1218
|
+
const view = runView(stored.executionId, owner);
|
|
1219
|
+
if (!view.exists || !view.running || !view.owned) {
|
|
1220
|
+
return yield* Effect.interrupt;
|
|
1221
|
+
}
|
|
1222
|
+
clocks.set(key, stored);
|
|
1223
|
+
return { _tag: "Scheduled", row: yield* snapshotClock(stored) };
|
|
1224
|
+
})
|
|
1225
|
+
),
|
|
1226
|
+
completeClock: Effect.fn("DurableEngineState.completeClock")(
|
|
1227
|
+
(address, completedAtMs) => Effect.sync(() => {
|
|
1228
|
+
const key = clockKey(address);
|
|
1229
|
+
const existing = clocks.get(key);
|
|
1230
|
+
if (existing === void 0) {
|
|
1231
|
+
return { _tag: "NotFound" };
|
|
1232
|
+
}
|
|
1233
|
+
if (existing.completedAtMs !== null) {
|
|
1234
|
+
return { _tag: "AlreadyCompleted", row: { ...existing } };
|
|
1235
|
+
}
|
|
1236
|
+
const row = { ...existing, completedAtMs };
|
|
1237
|
+
clocks.set(key, row);
|
|
1238
|
+
return { _tag: "Completed", row: { ...row } };
|
|
1239
|
+
})
|
|
1240
|
+
),
|
|
1241
|
+
dueClocks: Effect.fn("DurableEngineState.dueClocks")(
|
|
1242
|
+
(nowMs) => Effect.forEach(
|
|
1243
|
+
Array.from(clocks.values()).filter((row) => row.completedAtMs === null && row.dueAtMs <= nowMs).sort(
|
|
1244
|
+
(left, right) => left.dueAtMs - right.dueAtMs || (0, import_Ordering.compareText)(left.executionId, right.executionId) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
|
|
1245
|
+
),
|
|
1246
|
+
snapshotClock
|
|
1247
|
+
)
|
|
1248
|
+
),
|
|
1249
|
+
completeRunClocks: Effect.fn("DurableEngineState.completeRunClocks")(
|
|
1250
|
+
(executionId, completedAtMs) => Effect.sync(() => {
|
|
1251
|
+
const completed = [];
|
|
1252
|
+
for (const [key, row] of clocks) {
|
|
1253
|
+
if (row.executionId !== executionId || row.completedAtMs !== null) continue;
|
|
1254
|
+
const next = { ...row, completedAtMs };
|
|
1255
|
+
clocks.set(key, next);
|
|
1256
|
+
completed.push({ ...next });
|
|
1257
|
+
}
|
|
1258
|
+
return completed.sort(
|
|
1259
|
+
(left, right) => (0, import_Ordering.compareText)(left.flowName, right.flowName) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
|
|
1260
|
+
);
|
|
1261
|
+
})
|
|
1262
|
+
),
|
|
1263
|
+
pendingClocks: Effect.fn("DurableEngineState.pendingClocks")(
|
|
1264
|
+
(scope) => Effect.flatMap(
|
|
1265
|
+
Effect.sync(
|
|
1266
|
+
() => Array.from(clocks.values()).filter(
|
|
1267
|
+
(row) => row.completedAtMs === null && isLive(row.executionId) && (scope.executionId === void 0 || row.executionId === scope.executionId) && (scope.flowName === void 0 || row.flowName === scope.flowName)
|
|
1268
|
+
).sort(
|
|
1269
|
+
(left, right) => left.dueAtMs - right.dueAtMs || (0, import_Ordering.compareText)(left.executionId, right.executionId) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
|
|
1270
|
+
)
|
|
1271
|
+
),
|
|
1272
|
+
(rows) => Effect.forEach(rows, snapshotClock)
|
|
1273
|
+
)
|
|
1274
|
+
),
|
|
1275
|
+
completedDeferreds: Effect.fn("DurableEngineState.completedDeferreds")(
|
|
1276
|
+
(flowName) => Effect.sync(
|
|
1277
|
+
() => Array.from(deferreds.values()).filter(
|
|
1278
|
+
(row) => row.flowName === flowName && isLive(row.executionId) && !consumedDeferreds.has(deferredKey(row))
|
|
1279
|
+
).map(({ flowName: flowName2, executionId, deferredName }) => ({
|
|
1280
|
+
flowName: flowName2,
|
|
1281
|
+
executionId,
|
|
1282
|
+
deferredName
|
|
1283
|
+
})).sort(
|
|
1284
|
+
(left, right) => (0, import_Ordering.compareText)(left.executionId, right.executionId) || (0, import_Ordering.compareText)(left.deferredName, right.deferredName)
|
|
1285
|
+
)
|
|
1286
|
+
)
|
|
1287
|
+
),
|
|
1288
|
+
park: Effect.fn("DurableEngineState.park")(
|
|
1289
|
+
(runId, waitingPayload, owner) => Effect.sync(() => {
|
|
1290
|
+
const view = runView(runId, owner);
|
|
1291
|
+
if (!view.exists || !view.owned) {
|
|
1292
|
+
return { _tag: "NotFound" };
|
|
1293
|
+
}
|
|
1294
|
+
const row = {
|
|
1295
|
+
runId,
|
|
1296
|
+
reason: waitingPayload.reason,
|
|
1297
|
+
wakeAt: waitingPayload.wakeAt ?? null,
|
|
1298
|
+
token: waitingPayload.token ?? null,
|
|
1299
|
+
...decodeWaitingRequest(waitingPayload.request)
|
|
1300
|
+
};
|
|
1301
|
+
waitingRows.set(runId, row);
|
|
1302
|
+
return { _tag: "Parked", row: snapshotWaiting(row) };
|
|
1303
|
+
})
|
|
1304
|
+
),
|
|
1305
|
+
wake: Effect.fn("DurableEngineState.wake")(
|
|
1306
|
+
(runId) => Effect.sync(() => {
|
|
1307
|
+
const row = waitingRows.get(runId);
|
|
1308
|
+
if (row === void 0) {
|
|
1309
|
+
return runView(runId, void 0).exists ? { _tag: "NotWaiting" } : { _tag: "NotFound" };
|
|
1310
|
+
}
|
|
1311
|
+
waitingRows.delete(runId);
|
|
1312
|
+
return { _tag: "Woken", row: snapshotWaiting(row) };
|
|
1313
|
+
})
|
|
1314
|
+
),
|
|
1315
|
+
waiting: Effect.fn("DurableEngineState.waiting")(
|
|
1316
|
+
(runId) => Effect.sync(() => {
|
|
1317
|
+
const row = waitingRows.get(runId);
|
|
1318
|
+
return row === void 0 ? Option.none() : Option.some(snapshotWaiting(row));
|
|
1319
|
+
})
|
|
1320
|
+
),
|
|
1321
|
+
waitingTree: Effect.fn("DurableEngineState.waitingTree")(
|
|
1322
|
+
(runId, walk) => Effect.sync(() => {
|
|
1323
|
+
const found = [];
|
|
1324
|
+
const seen = /* @__PURE__ */ new Set([runId]);
|
|
1325
|
+
let frontier = [runId];
|
|
1326
|
+
for (let depth = 0; depth <= waitingTreeMaxDepth && frontier.length > 0; depth++) {
|
|
1327
|
+
const next = [];
|
|
1328
|
+
for (const current of frontier) {
|
|
1329
|
+
const row = waitingRows.get(current);
|
|
1330
|
+
if (row !== void 0 && isLive(current)) found.push(snapshotWaiting(row));
|
|
1331
|
+
for (const [childId, parents] of parentEdges) {
|
|
1332
|
+
if (!parents.has(current) || seen.has(childId)) continue;
|
|
1333
|
+
const view = options.runs?.(childId);
|
|
1334
|
+
if (walk?.detached !== "include" && view !== void 0 && Option.isSome(view) && view.value.onParentExit === "detach") continue;
|
|
1335
|
+
seen.add(childId);
|
|
1336
|
+
next.push(childId);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
frontier = next;
|
|
1340
|
+
}
|
|
1341
|
+
return found;
|
|
1342
|
+
})
|
|
1343
|
+
),
|
|
1344
|
+
waitingRuns: Effect.fn("DurableEngineState.waitingRuns")(
|
|
1345
|
+
(filter) => Effect.sync(
|
|
1346
|
+
() => Array.from(waitingRows.values()).filter((row) => isLive(row.runId)).filter((row) => filter?.reason === void 0 || row.reason === filter.reason).filter(
|
|
1347
|
+
(row) => filter?.dueBeforeMs === void 0 || row.wakeAt !== null && row.wakeAt <= filter.dueBeforeMs
|
|
1348
|
+
).filter((row) => {
|
|
1349
|
+
if (filter?.cancelRequested !== true) return true;
|
|
1350
|
+
if (options.runs === void 0) return true;
|
|
1351
|
+
const view = options.runs(row.runId);
|
|
1352
|
+
return Option.isSome(view) && view.value.cancelRequestedAtMs != null;
|
|
1353
|
+
}).sort(
|
|
1354
|
+
(left, right) => Number(left.wakeAt === null) - Number(right.wakeAt === null) || (left.wakeAt ?? 0) - (right.wakeAt ?? 0) || (0, import_Ordering.compareText)(left.runId, right.runId)
|
|
1355
|
+
).map(snapshotWaiting)
|
|
1356
|
+
)
|
|
1357
|
+
),
|
|
1358
|
+
pendingRuns: Effect.fn("DurableEngineState.pendingRuns")(
|
|
1359
|
+
(flowName, limit, after, through, eligibleBeforeMs) => Effect.sync(() => {
|
|
1360
|
+
const ordered = pendingMemoryRows(flowName, after, through, eligibleBeforeMs);
|
|
1361
|
+
return limit === void 0 ? ordered : ordered.slice(0, limit);
|
|
1362
|
+
})
|
|
1363
|
+
),
|
|
1364
|
+
pendingRunTail: Effect.fn("DurableEngineState.pendingRunTail")(
|
|
1365
|
+
(flowName, eligibleBeforeMs) => Effect.sync(
|
|
1366
|
+
() => Option.fromNullishOr(pendingMemoryRows(flowName, void 0, void 0, eligibleBeforeMs).at(-1))
|
|
1367
|
+
)
|
|
1368
|
+
),
|
|
1369
|
+
pendingCancellationRuns: Effect.fn("DurableEngineState.pendingCancellationRuns")(
|
|
1370
|
+
(limit, after, through) => pendingCancellationLimit(limit).pipe(Effect.andThen(
|
|
1371
|
+
Effect.sync(() => pendingMemoryRows(void 0, after, through, void 0, true).slice(0, limit))
|
|
1372
|
+
))
|
|
1373
|
+
),
|
|
1374
|
+
pendingCancellationTail: Effect.fn("DurableEngineState.pendingCancellationTail")(
|
|
1375
|
+
() => Effect.sync(
|
|
1376
|
+
() => Option.fromNullishOr(
|
|
1377
|
+
pendingMemoryRows(void 0, void 0, void 0, void 0, true).at(-1)
|
|
1378
|
+
)
|
|
1379
|
+
)
|
|
1380
|
+
),
|
|
1381
|
+
staleRunningRuns: Effect.fn("DurableEngineState.staleRunningRuns")(
|
|
1382
|
+
(staleBeforeMs, limit) => Effect.sync(() => {
|
|
1383
|
+
if (options.listRuns === void 0) return [];
|
|
1384
|
+
const stale = [];
|
|
1385
|
+
for (const [runId, view] of options.listRuns()) {
|
|
1386
|
+
const heartbeatAtMs = view.heartbeatAtMs;
|
|
1387
|
+
if (view.status === "running" && typeof heartbeatAtMs === "number" && heartbeatAtMs < staleBeforeMs) {
|
|
1388
|
+
stale.push({ runId, heartbeatAtMs });
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
const ordered = stale.sort(
|
|
1392
|
+
(left, right) => left.heartbeatAtMs - right.heartbeatAtMs || (0, import_Ordering.compareText)(left.runId, right.runId)
|
|
1393
|
+
);
|
|
1394
|
+
return limit === void 0 ? ordered : ordered.slice(0, limit);
|
|
1395
|
+
})
|
|
1396
|
+
),
|
|
1397
|
+
recordRunParent: Effect.fn("DurableEngineState.recordRunParent")(
|
|
1398
|
+
(childId, parentId) => (
|
|
1399
|
+
// A single synchronous step mirrors the SQL transaction: the cycle
|
|
1400
|
+
// check and the insert are atomic — no fiber can interleave between
|
|
1401
|
+
// them, and a rejected edge is never observable (issues #54/#55/#56).
|
|
1402
|
+
Effect.suspend(() => {
|
|
1403
|
+
const parents = parentEdges.get(childId) ?? /* @__PURE__ */ new Map();
|
|
1404
|
+
const existing = parents.get(parentId);
|
|
1405
|
+
if (existing !== void 0) {
|
|
1406
|
+
return Effect.succeed({
|
|
1407
|
+
_tag: "Existing",
|
|
1408
|
+
edge: { childId, parentId, seq: existing }
|
|
1409
|
+
});
|
|
1410
|
+
}
|
|
1411
|
+
const cycle = findCyclePathSync(childId, parentId);
|
|
1412
|
+
if (cycle !== void 0) {
|
|
1413
|
+
return Effect.fail(new RunParentCycleError({ path: cycle }));
|
|
1414
|
+
}
|
|
1415
|
+
parentSeq += 1;
|
|
1416
|
+
parents.set(parentId, parentSeq);
|
|
1417
|
+
parentEdges.set(childId, parents);
|
|
1418
|
+
return Effect.succeed({
|
|
1419
|
+
_tag: "Recorded",
|
|
1420
|
+
edge: { childId, parentId, seq: parentSeq }
|
|
1421
|
+
});
|
|
1422
|
+
})
|
|
1423
|
+
)
|
|
1424
|
+
),
|
|
1425
|
+
removeRunParentsForRun: Effect.fn("DurableEngineState.removeRunParentsForRun")(
|
|
1426
|
+
(runId) => Effect.sync(() => {
|
|
1427
|
+
parentEdges.delete(runId);
|
|
1428
|
+
for (const [childId, parents] of parentEdges) {
|
|
1429
|
+
parents.delete(runId);
|
|
1430
|
+
if (parents.size === 0) parentEdges.delete(childId);
|
|
1431
|
+
}
|
|
1432
|
+
})
|
|
1433
|
+
),
|
|
1434
|
+
runParents: Effect.fn("DurableEngineState.runParents")(
|
|
1435
|
+
(childId) => Effect.sync(
|
|
1436
|
+
() => Array.from(parentEdges.get(childId) ?? []).map(([parentId, seq]) => ({ childId, parentId, seq })).sort((left, right) => left.seq - right.seq)
|
|
1437
|
+
)
|
|
1438
|
+
),
|
|
1439
|
+
runChildren: Effect.fn("DurableEngineState.runChildren")(
|
|
1440
|
+
(parentId) => Effect.sync(() => {
|
|
1441
|
+
const edges = [];
|
|
1442
|
+
for (const [childId, parents] of parentEdges) {
|
|
1443
|
+
const seq = parents.get(parentId);
|
|
1444
|
+
if (seq !== void 0) edges.push({ childId, parentId, seq });
|
|
1445
|
+
}
|
|
1446
|
+
return edges.sort((left, right) => left.seq - right.seq);
|
|
1447
|
+
})
|
|
1448
|
+
)
|
|
1449
|
+
};
|
|
1450
|
+
const gate = Semaphore.makeUnsafe(1);
|
|
1451
|
+
const transactionDepth = /* @__PURE__ */ new Map();
|
|
1452
|
+
const guard = (effect) => Effect.flatMap(
|
|
1453
|
+
Effect.fiberId,
|
|
1454
|
+
(fiberId) => (transactionDepth.get(fiberId) ?? 0) > 0 ? effect : gate.withPermit(effect)
|
|
1455
|
+
);
|
|
1456
|
+
const restoreMap = (target, source) => {
|
|
1457
|
+
target.clear();
|
|
1458
|
+
for (const [key, value] of source) target.set(key, value);
|
|
1459
|
+
};
|
|
1460
|
+
const transaction = (effect, options2) => Effect.flatMap(Effect.fiberId, (fiberId) => Effect.uninterruptibleMask(
|
|
1461
|
+
(restore) => Effect.gen(function* () {
|
|
1462
|
+
const nested = (transactionDepth.get(fiberId) ?? 0) > 0;
|
|
1463
|
+
if (!nested) yield* restore(gate.take(1));
|
|
1464
|
+
const before = {
|
|
1465
|
+
deferreds: new Map(deferreds),
|
|
1466
|
+
consumedDeferreds: new Map(consumedDeferreds),
|
|
1467
|
+
clocks: new Map(clocks),
|
|
1468
|
+
waitingRows: new Map(waitingRows),
|
|
1469
|
+
parentEdges: new Map([...parentEdges].map(([child, parents]) => [child, new Map(parents)])),
|
|
1470
|
+
parentSeq
|
|
1471
|
+
};
|
|
1472
|
+
transactionDepth.set(fiberId, (transactionDepth.get(fiberId) ?? 0) + 1);
|
|
1473
|
+
let committed = false;
|
|
1474
|
+
let closed = false;
|
|
1475
|
+
const close = Effect.suspend(() => {
|
|
1476
|
+
if (closed) return Effect.void;
|
|
1477
|
+
closed = true;
|
|
1478
|
+
const depth = transactionDepth.get(fiberId) - 1;
|
|
1479
|
+
if (depth === 0) transactionDepth.delete(fiberId);
|
|
1480
|
+
else transactionDepth.set(fiberId, depth);
|
|
1481
|
+
return nested ? Effect.void : gate.release(1).pipe(Effect.asVoid);
|
|
1482
|
+
});
|
|
1483
|
+
const commit = Effect.sync(() => {
|
|
1484
|
+
committed = true;
|
|
1485
|
+
}).pipe(Effect.andThen(close));
|
|
1486
|
+
return yield* Effect.sync(() => options2?.onCommit(commit)).pipe(
|
|
1487
|
+
Effect.andThen(restore(effect)),
|
|
1488
|
+
Effect.catchCause(
|
|
1489
|
+
(cause) => Effect.sync(() => {
|
|
1490
|
+
if (committed) return;
|
|
1491
|
+
restoreMap(deferreds, before.deferreds);
|
|
1492
|
+
restoreMap(consumedDeferreds, before.consumedDeferreds);
|
|
1493
|
+
restoreMap(clocks, before.clocks);
|
|
1494
|
+
restoreMap(waitingRows, before.waitingRows);
|
|
1495
|
+
restoreMap(parentEdges, before.parentEdges);
|
|
1496
|
+
parentSeq = before.parentSeq;
|
|
1497
|
+
}).pipe(Effect.andThen(Effect.failCause(cause)))
|
|
1498
|
+
),
|
|
1499
|
+
Effect.ensuring(close)
|
|
1500
|
+
);
|
|
1501
|
+
})
|
|
1502
|
+
));
|
|
1503
|
+
return DurableEngineState.of({
|
|
1504
|
+
deferred: (address) => guard(unguarded.deferred(address)),
|
|
1505
|
+
consumeDeferred: (address, consumedAtMs) => guard(unguarded.consumeDeferred(address, consumedAtMs)),
|
|
1506
|
+
completeDeferred: (row) => guard(unguarded.completeDeferred(row)),
|
|
1507
|
+
clock: (address) => guard(unguarded.clock(address)),
|
|
1508
|
+
scheduleClock: (row, owner) => guard(unguarded.scheduleClock(row, owner)),
|
|
1509
|
+
completeClock: (address, completedAtMs) => guard(unguarded.completeClock(address, completedAtMs)),
|
|
1510
|
+
dueClocks: (nowMs) => guard(unguarded.dueClocks(nowMs)),
|
|
1511
|
+
completeRunClocks: (executionId, completedAtMs) => guard(unguarded.completeRunClocks(executionId, completedAtMs)),
|
|
1512
|
+
pendingClocks: (scope) => guard(unguarded.pendingClocks(scope)),
|
|
1513
|
+
completedDeferreds: (flowName) => guard(unguarded.completedDeferreds(flowName)),
|
|
1514
|
+
park: (runId, waiting, owner) => guard(unguarded.park(runId, waiting, owner)),
|
|
1515
|
+
wake: (runId) => guard(unguarded.wake(runId)),
|
|
1516
|
+
waiting: (runId) => guard(unguarded.waiting(runId)),
|
|
1517
|
+
waitingTree: (runId, options2) => guard(unguarded.waitingTree(runId, options2)),
|
|
1518
|
+
waitingRuns: (filter) => guard(unguarded.waitingRuns(filter)),
|
|
1519
|
+
pendingRuns: (flowName, limit, after, through, eligibleBeforeMs) => guard(unguarded.pendingRuns(flowName, limit, after, through, eligibleBeforeMs)),
|
|
1520
|
+
pendingRunTail: (flowName, eligibleBeforeMs) => guard(unguarded.pendingRunTail(flowName, eligibleBeforeMs)),
|
|
1521
|
+
pendingCancellationRuns: (limit, after, through) => guard(unguarded.pendingCancellationRuns(limit, after, through)),
|
|
1522
|
+
pendingCancellationTail: () => guard(unguarded.pendingCancellationTail()),
|
|
1523
|
+
staleRunningRuns: (staleBeforeMs, limit) => guard(unguarded.staleRunningRuns(staleBeforeMs, limit)),
|
|
1524
|
+
attemptSurvivors: void 0,
|
|
1525
|
+
recordRunParent: (childId, parentId) => guard(unguarded.recordRunParent(childId, parentId)),
|
|
1526
|
+
removeRunParentsForRun: (runId) => guard(unguarded.removeRunParentsForRun(runId)),
|
|
1527
|
+
runParents: (childId) => guard(unguarded.runParents(childId)),
|
|
1528
|
+
runChildren: (parentId) => guard(unguarded.runChildren(parentId)),
|
|
1529
|
+
transaction
|
|
1530
|
+
});
|
|
1531
|
+
};
|
|
1532
|
+
const layerMemory = Layer.sync(
|
|
1533
|
+
DurableEngineState,
|
|
1534
|
+
makeMemory
|
|
1535
|
+
);
|
|
1536
|
+
//# sourceMappingURL=DurableEngineState.js.map
|