@dudousxd/nestjs-durable-core 0.68.0 → 0.69.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +29 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +27 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -3692,6 +3692,15 @@ declare class WorkflowEngine {
|
|
|
3692
3692
|
/**
|
|
3693
3693
|
* Resume each run only if this instance can acquire its recovery lease — so when several
|
|
3694
3694
|
* replicas recover or poll at once, each run is picked up by exactly one of them.
|
|
3695
|
+
*
|
|
3696
|
+
* A run this instance cannot resume is SKIPPED, not allowed to abort the batch. The canonical
|
|
3697
|
+
* case is skew protection: mid-rolling-deploy a pod leases a run whose workflow it does not have
|
|
3698
|
+
* and `resume` throws by design — but the rest of the batch is runs it can drive perfectly well,
|
|
3699
|
+
* and every caller here is a recovery sweep. Letting the first such run end the loop means one
|
|
3700
|
+
* row stops recovery for the whole deployment, and (since the callers are pollers) sends the
|
|
3701
|
+
* rejection into a lifecycle hook. Skipping leaves the run locked only until its lease expires,
|
|
3702
|
+
* for a pod that does have the workflow — which is exactly what the skew-protection error asks
|
|
3703
|
+
* for. Same posture as `publishEvent`'s per-subscriber isolation.
|
|
3695
3704
|
*/
|
|
3696
3705
|
private resumeLeased;
|
|
3697
3706
|
/**
|
|
@@ -4502,6 +4511,22 @@ declare function mergeRunFacetRows(rows: readonly {
|
|
|
4502
4511
|
declare const RUN_VALUE_FACET_LIMIT = 100;
|
|
4503
4512
|
/** Runs read when an axis has to be counted in-process (see {@link RunValueFacetOptions.scan}). */
|
|
4504
4513
|
declare const RUN_VALUE_FACET_SCAN = 5000;
|
|
4514
|
+
/**
|
|
4515
|
+
* Tag prefixes the ENGINE mints one of PER KEY — `singleton:<key>` is stamped on every run of a
|
|
4516
|
+
* singleton workflow so the admission gate can find its siblings.
|
|
4517
|
+
*
|
|
4518
|
+
* A picker ranks these last. They are machine bookkeeping with cardinality that grows with the data,
|
|
4519
|
+
* and on a real deployment they crowd out everything an operator would actually choose: measured on
|
|
4520
|
+
* a 12k-run control plane, 82 of the top 100 tags were `singleton:*`, pushing genuine tags like
|
|
4521
|
+
* `type:mvr` to the edge of the list and past it.
|
|
4522
|
+
*
|
|
4523
|
+
* Ranked, not REMOVED: a singleton tag is still a legitimate thing to filter by (a run row's tag chip
|
|
4524
|
+
* sets exactly that), so it stays offered — just after the tags a human wrote. `version:undeclared`
|
|
4525
|
+
* is engine-minted too but is a single fixed value, so it competes fairly and is not listed here.
|
|
4526
|
+
*/
|
|
4527
|
+
declare const ENGINE_MINTED_TAG_PREFIXES: readonly ["singleton:"];
|
|
4528
|
+
/** Is this a tag the engine mints one of per key? See {@link ENGINE_MINTED_TAG_PREFIXES}. */
|
|
4529
|
+
declare function isEngineMintedTag(value: string | null): boolean;
|
|
4505
4530
|
/**
|
|
4506
4531
|
* Is this axis a plain column on the runs table, and so countable with a `GROUP BY` over the whole
|
|
4507
4532
|
* matching set?
|
|
@@ -5217,4 +5242,4 @@ declare class InMemoryTransport implements Transport, ControlPlane {
|
|
|
5217
5242
|
onControl(handler: (msg: ControlMessage) => void): void;
|
|
5218
5243
|
}
|
|
5219
5244
|
|
|
5220
|
-
export { type AccumulatorHost, type Admission, type AdmissionBackend, type AdmissionItem, type AnnouncedWorkflow, type AnnouncementEvidence, type AttributeFilter, type AttributeOp, type AttributePredicateOperand, type AttributeValue, type BackoffStrategy, type BlockedDispatch, type BlockedResolution, CONTROL_FLOW_SIGNAL, CURRENT_PROTOCOL_VERSION, type CapabilityRequirement, type ChildCallOptions, CodecStateStore, ContinueAsNew, type ControlMessage, type ControlPlane, DEFAULT_PARTITION, DURABLE_OPTIONS, DURABLE_OPTIONS_CANONICAL, DURABLE_STEP_CONFIG, DURABLE_STEP_NAME, type Disagreement, type DispatchDiagnostics, type DispatchPlan, type DurableExecution, type DurableExecutionWrapper, type DurableTopology, type DurableWebhook, DurableWorkflow, EVENT_BUFFER_SCAN_LIMIT, EVENT_TOKEN_PREFIX, type EngineEvent, type EngineEventType, type EngineListener, Entities, type EntityConfig, type EntityHandler, type EntityHost, EventAccumulators, type EventBatchConfig, FatalError, GatherError, type GroupHealth, type Heartbeat, type HeartbeatSighting, type HeartbeatStatus, type HistoryEvent, InMemoryAdmissionBackend, InMemoryStateStore, InMemoryTransport, type InferSearchAttributes, LEGACY_V1_CAPABILITIES, LEGACY_V1_PROTOCOL, type MetricsCollector, type MetricsSnapshot, type NamedTransport, type NegotiateOptions, type NegotiationOutcome, type NegotiationReason, type NegotiationResult, NonDeterminismError, type PartitionSighting, type PayloadCodec, type QueueConfig, QueueController, RUN_VALUE_FACET_LIMIT, RUN_VALUE_FACET_SCAN, type RawWorkerDescriptor, RemoteStepError, RemoteStepTimeout, type RemoteTask, RemoteWorkflowExecutor, RemoteWorkflowTimeout, type RetentionPolicy, type RoutableDispatch, type RoutableResolution, type RoutingResolution, type RunAttributeRow, type RunDetail, type RunDispatcher, type RunFacetQuery, type RunFacetRow, RunGateway, type RunListItem, type RunQuery, type RunReply, type RunReplyResult, type RunRequest, type RunRequestKind, type RunResult, type RunSchedulesOptions, type RunStatus, type RunValueAxis, type RunValueFacetOptions, type RunValueFacetRow, type RunWaiting, STATE_STORE, STATE_STORE_CANONICAL, type ScalarAttributeFilter, type ScheduledWorkflow, type SearchAttributes, type SearchAttributesSchema, SignalTimeoutError, type SignalWaiter, type SingletonConfig, SingletonQueueFullError, StandardSchemaV1, type StartOptions, type StartRunMessage, type StateStore, type StepCheckpoint, type StepConfig, type StepDef, type StepDispatchOpts, type StepError, type StepEvent, type StepHandler, type StepInterceptor, type StepInvocation, type StepKind, type StepLogger, type StepOptions, type StepRef, type StepResult, type StepUndo, type StoreTransaction, type SubProcessHandle, TERMINAL_RUN_STATUSES, TRANSPORT, TRANSPORT_CANONICAL, type TenantEvent, type Transport, type UndoOf, type UpdateResult, type UpdateValidator, VERSION_UNDECLARED_TAG, WORKFLOW_NAME_KEY, type WireDates, type WorkerAdjust, type WorkerConcurrencyStatus, type WorkerDescriptor, type WorkerHeartbeat, type WorkerLifecycle, type WorkerStatus, type WorkflowAnnouncement, WorkflowBlocked, type WorkflowClass, type WorkflowCommand, type WorkflowCtx, type WorkflowDecision, type WorkflowDirectory, WorkflowEngine, type WorkflowEngineDeps, type WorkflowExecutor, type WorkflowHandler, type WorkflowInputOf, type WorkflowOutputOf, type WorkflowRef, type WorkflowRegistration, type WorkflowRun, type WorkflowStartClient, type WorkflowStepEvent, WorkflowSuspended, type WorkflowTask, aggregateAnnouncements, announcementsOf, applyAttributeQuery, attributeColumnFor, attributeOperand, attributePredicateOperands, axisIsRunColumn, bindWorkflowClass, breakpointToken, buildWorkflowDirectory, canRoute, capableWorkers, classifyWaiterToken, clearDurableExecutionWrappers, collectMetrics, controlPlaneDescriptor, coveredTokens, createStepLogger, currentStep, currentWorkflowCtx, debug, describeWorker, descriptorHash, error, eventMatchOf, eventMatches, eventNameOf, eventPrefix, eventToken, facetOrigin, hasDurableExecutionWrappers, heartbeatStatus, indexWaitersByRun, info, isEventToken, isLegacyDescriptor, isWorkflowControlFlowSignal, log, matchesAttributes, mergeRunFacetRows, mergeRunValueFacetRows, missingCapabilities, negotiate, normalizeAttributeRows, normalizeDescriptor, observedAnnouncements, parseDuration, partitionOfToken, planDispatch, prevCronFireMs, readSearchAttributes, requiredCapabilities, resolveRouting, resolveRunWaiting, runDurableExecution, runInStepLogger, runInWorkflowCtx, runSchedules, runStepHandler, runValueFacetsFromRuns, sanitizeQueueToken, scheduledRunId, sqlComparator, stepConfigOf, stepId, stepNameOf, sub, subEvent, subProcess, tenantGroup, useDurableExecution, warn, workflowName };
|
|
5245
|
+
export { type AccumulatorHost, type Admission, type AdmissionBackend, type AdmissionItem, type AnnouncedWorkflow, type AnnouncementEvidence, type AttributeFilter, type AttributeOp, type AttributePredicateOperand, type AttributeValue, type BackoffStrategy, type BlockedDispatch, type BlockedResolution, CONTROL_FLOW_SIGNAL, CURRENT_PROTOCOL_VERSION, type CapabilityRequirement, type ChildCallOptions, CodecStateStore, ContinueAsNew, type ControlMessage, type ControlPlane, DEFAULT_PARTITION, DURABLE_OPTIONS, DURABLE_OPTIONS_CANONICAL, DURABLE_STEP_CONFIG, DURABLE_STEP_NAME, type Disagreement, type DispatchDiagnostics, type DispatchPlan, type DurableExecution, type DurableExecutionWrapper, type DurableTopology, type DurableWebhook, DurableWorkflow, ENGINE_MINTED_TAG_PREFIXES, EVENT_BUFFER_SCAN_LIMIT, EVENT_TOKEN_PREFIX, type EngineEvent, type EngineEventType, type EngineListener, Entities, type EntityConfig, type EntityHandler, type EntityHost, EventAccumulators, type EventBatchConfig, FatalError, GatherError, type GroupHealth, type Heartbeat, type HeartbeatSighting, type HeartbeatStatus, type HistoryEvent, InMemoryAdmissionBackend, InMemoryStateStore, InMemoryTransport, type InferSearchAttributes, LEGACY_V1_CAPABILITIES, LEGACY_V1_PROTOCOL, type MetricsCollector, type MetricsSnapshot, type NamedTransport, type NegotiateOptions, type NegotiationOutcome, type NegotiationReason, type NegotiationResult, NonDeterminismError, type PartitionSighting, type PayloadCodec, type QueueConfig, QueueController, RUN_VALUE_FACET_LIMIT, RUN_VALUE_FACET_SCAN, type RawWorkerDescriptor, RemoteStepError, RemoteStepTimeout, type RemoteTask, RemoteWorkflowExecutor, RemoteWorkflowTimeout, type RetentionPolicy, type RoutableDispatch, type RoutableResolution, type RoutingResolution, type RunAttributeRow, type RunDetail, type RunDispatcher, type RunFacetQuery, type RunFacetRow, RunGateway, type RunListItem, type RunQuery, type RunReply, type RunReplyResult, type RunRequest, type RunRequestKind, type RunResult, type RunSchedulesOptions, type RunStatus, type RunValueAxis, type RunValueFacetOptions, type RunValueFacetRow, type RunWaiting, STATE_STORE, STATE_STORE_CANONICAL, type ScalarAttributeFilter, type ScheduledWorkflow, type SearchAttributes, type SearchAttributesSchema, SignalTimeoutError, type SignalWaiter, type SingletonConfig, SingletonQueueFullError, StandardSchemaV1, type StartOptions, type StartRunMessage, type StateStore, type StepCheckpoint, type StepConfig, type StepDef, type StepDispatchOpts, type StepError, type StepEvent, type StepHandler, type StepInterceptor, type StepInvocation, type StepKind, type StepLogger, type StepOptions, type StepRef, type StepResult, type StepUndo, type StoreTransaction, type SubProcessHandle, TERMINAL_RUN_STATUSES, TRANSPORT, TRANSPORT_CANONICAL, type TenantEvent, type Transport, type UndoOf, type UpdateResult, type UpdateValidator, VERSION_UNDECLARED_TAG, WORKFLOW_NAME_KEY, type WireDates, type WorkerAdjust, type WorkerConcurrencyStatus, type WorkerDescriptor, type WorkerHeartbeat, type WorkerLifecycle, type WorkerStatus, type WorkflowAnnouncement, WorkflowBlocked, type WorkflowClass, type WorkflowCommand, type WorkflowCtx, type WorkflowDecision, type WorkflowDirectory, WorkflowEngine, type WorkflowEngineDeps, type WorkflowExecutor, type WorkflowHandler, type WorkflowInputOf, type WorkflowOutputOf, type WorkflowRef, type WorkflowRegistration, type WorkflowRun, type WorkflowStartClient, type WorkflowStepEvent, WorkflowSuspended, type WorkflowTask, aggregateAnnouncements, announcementsOf, applyAttributeQuery, attributeColumnFor, attributeOperand, attributePredicateOperands, axisIsRunColumn, bindWorkflowClass, breakpointToken, buildWorkflowDirectory, canRoute, capableWorkers, classifyWaiterToken, clearDurableExecutionWrappers, collectMetrics, controlPlaneDescriptor, coveredTokens, createStepLogger, currentStep, currentWorkflowCtx, debug, describeWorker, descriptorHash, error, eventMatchOf, eventMatches, eventNameOf, eventPrefix, eventToken, facetOrigin, hasDurableExecutionWrappers, heartbeatStatus, indexWaitersByRun, info, isEngineMintedTag, isEventToken, isLegacyDescriptor, isWorkflowControlFlowSignal, log, matchesAttributes, mergeRunFacetRows, mergeRunValueFacetRows, missingCapabilities, negotiate, normalizeAttributeRows, normalizeDescriptor, observedAnnouncements, parseDuration, partitionOfToken, planDispatch, prevCronFireMs, readSearchAttributes, requiredCapabilities, resolveRouting, resolveRunWaiting, runDurableExecution, runInStepLogger, runInWorkflowCtx, runSchedules, runStepHandler, runValueFacetsFromRuns, sanitizeQueueToken, scheduledRunId, sqlComparator, stepConfigOf, stepId, stepNameOf, sub, subEvent, subProcess, tenantGroup, useDurableExecution, warn, workflowName };
|
package/dist/index.d.ts
CHANGED
|
@@ -3692,6 +3692,15 @@ declare class WorkflowEngine {
|
|
|
3692
3692
|
/**
|
|
3693
3693
|
* Resume each run only if this instance can acquire its recovery lease — so when several
|
|
3694
3694
|
* replicas recover or poll at once, each run is picked up by exactly one of them.
|
|
3695
|
+
*
|
|
3696
|
+
* A run this instance cannot resume is SKIPPED, not allowed to abort the batch. The canonical
|
|
3697
|
+
* case is skew protection: mid-rolling-deploy a pod leases a run whose workflow it does not have
|
|
3698
|
+
* and `resume` throws by design — but the rest of the batch is runs it can drive perfectly well,
|
|
3699
|
+
* and every caller here is a recovery sweep. Letting the first such run end the loop means one
|
|
3700
|
+
* row stops recovery for the whole deployment, and (since the callers are pollers) sends the
|
|
3701
|
+
* rejection into a lifecycle hook. Skipping leaves the run locked only until its lease expires,
|
|
3702
|
+
* for a pod that does have the workflow — which is exactly what the skew-protection error asks
|
|
3703
|
+
* for. Same posture as `publishEvent`'s per-subscriber isolation.
|
|
3695
3704
|
*/
|
|
3696
3705
|
private resumeLeased;
|
|
3697
3706
|
/**
|
|
@@ -4502,6 +4511,22 @@ declare function mergeRunFacetRows(rows: readonly {
|
|
|
4502
4511
|
declare const RUN_VALUE_FACET_LIMIT = 100;
|
|
4503
4512
|
/** Runs read when an axis has to be counted in-process (see {@link RunValueFacetOptions.scan}). */
|
|
4504
4513
|
declare const RUN_VALUE_FACET_SCAN = 5000;
|
|
4514
|
+
/**
|
|
4515
|
+
* Tag prefixes the ENGINE mints one of PER KEY — `singleton:<key>` is stamped on every run of a
|
|
4516
|
+
* singleton workflow so the admission gate can find its siblings.
|
|
4517
|
+
*
|
|
4518
|
+
* A picker ranks these last. They are machine bookkeeping with cardinality that grows with the data,
|
|
4519
|
+
* and on a real deployment they crowd out everything an operator would actually choose: measured on
|
|
4520
|
+
* a 12k-run control plane, 82 of the top 100 tags were `singleton:*`, pushing genuine tags like
|
|
4521
|
+
* `type:mvr` to the edge of the list and past it.
|
|
4522
|
+
*
|
|
4523
|
+
* Ranked, not REMOVED: a singleton tag is still a legitimate thing to filter by (a run row's tag chip
|
|
4524
|
+
* sets exactly that), so it stays offered — just after the tags a human wrote. `version:undeclared`
|
|
4525
|
+
* is engine-minted too but is a single fixed value, so it competes fairly and is not listed here.
|
|
4526
|
+
*/
|
|
4527
|
+
declare const ENGINE_MINTED_TAG_PREFIXES: readonly ["singleton:"];
|
|
4528
|
+
/** Is this a tag the engine mints one of per key? See {@link ENGINE_MINTED_TAG_PREFIXES}. */
|
|
4529
|
+
declare function isEngineMintedTag(value: string | null): boolean;
|
|
4505
4530
|
/**
|
|
4506
4531
|
* Is this axis a plain column on the runs table, and so countable with a `GROUP BY` over the whole
|
|
4507
4532
|
* matching set?
|
|
@@ -5217,4 +5242,4 @@ declare class InMemoryTransport implements Transport, ControlPlane {
|
|
|
5217
5242
|
onControl(handler: (msg: ControlMessage) => void): void;
|
|
5218
5243
|
}
|
|
5219
5244
|
|
|
5220
|
-
export { type AccumulatorHost, type Admission, type AdmissionBackend, type AdmissionItem, type AnnouncedWorkflow, type AnnouncementEvidence, type AttributeFilter, type AttributeOp, type AttributePredicateOperand, type AttributeValue, type BackoffStrategy, type BlockedDispatch, type BlockedResolution, CONTROL_FLOW_SIGNAL, CURRENT_PROTOCOL_VERSION, type CapabilityRequirement, type ChildCallOptions, CodecStateStore, ContinueAsNew, type ControlMessage, type ControlPlane, DEFAULT_PARTITION, DURABLE_OPTIONS, DURABLE_OPTIONS_CANONICAL, DURABLE_STEP_CONFIG, DURABLE_STEP_NAME, type Disagreement, type DispatchDiagnostics, type DispatchPlan, type DurableExecution, type DurableExecutionWrapper, type DurableTopology, type DurableWebhook, DurableWorkflow, EVENT_BUFFER_SCAN_LIMIT, EVENT_TOKEN_PREFIX, type EngineEvent, type EngineEventType, type EngineListener, Entities, type EntityConfig, type EntityHandler, type EntityHost, EventAccumulators, type EventBatchConfig, FatalError, GatherError, type GroupHealth, type Heartbeat, type HeartbeatSighting, type HeartbeatStatus, type HistoryEvent, InMemoryAdmissionBackend, InMemoryStateStore, InMemoryTransport, type InferSearchAttributes, LEGACY_V1_CAPABILITIES, LEGACY_V1_PROTOCOL, type MetricsCollector, type MetricsSnapshot, type NamedTransport, type NegotiateOptions, type NegotiationOutcome, type NegotiationReason, type NegotiationResult, NonDeterminismError, type PartitionSighting, type PayloadCodec, type QueueConfig, QueueController, RUN_VALUE_FACET_LIMIT, RUN_VALUE_FACET_SCAN, type RawWorkerDescriptor, RemoteStepError, RemoteStepTimeout, type RemoteTask, RemoteWorkflowExecutor, RemoteWorkflowTimeout, type RetentionPolicy, type RoutableDispatch, type RoutableResolution, type RoutingResolution, type RunAttributeRow, type RunDetail, type RunDispatcher, type RunFacetQuery, type RunFacetRow, RunGateway, type RunListItem, type RunQuery, type RunReply, type RunReplyResult, type RunRequest, type RunRequestKind, type RunResult, type RunSchedulesOptions, type RunStatus, type RunValueAxis, type RunValueFacetOptions, type RunValueFacetRow, type RunWaiting, STATE_STORE, STATE_STORE_CANONICAL, type ScalarAttributeFilter, type ScheduledWorkflow, type SearchAttributes, type SearchAttributesSchema, SignalTimeoutError, type SignalWaiter, type SingletonConfig, SingletonQueueFullError, StandardSchemaV1, type StartOptions, type StartRunMessage, type StateStore, type StepCheckpoint, type StepConfig, type StepDef, type StepDispatchOpts, type StepError, type StepEvent, type StepHandler, type StepInterceptor, type StepInvocation, type StepKind, type StepLogger, type StepOptions, type StepRef, type StepResult, type StepUndo, type StoreTransaction, type SubProcessHandle, TERMINAL_RUN_STATUSES, TRANSPORT, TRANSPORT_CANONICAL, type TenantEvent, type Transport, type UndoOf, type UpdateResult, type UpdateValidator, VERSION_UNDECLARED_TAG, WORKFLOW_NAME_KEY, type WireDates, type WorkerAdjust, type WorkerConcurrencyStatus, type WorkerDescriptor, type WorkerHeartbeat, type WorkerLifecycle, type WorkerStatus, type WorkflowAnnouncement, WorkflowBlocked, type WorkflowClass, type WorkflowCommand, type WorkflowCtx, type WorkflowDecision, type WorkflowDirectory, WorkflowEngine, type WorkflowEngineDeps, type WorkflowExecutor, type WorkflowHandler, type WorkflowInputOf, type WorkflowOutputOf, type WorkflowRef, type WorkflowRegistration, type WorkflowRun, type WorkflowStartClient, type WorkflowStepEvent, WorkflowSuspended, type WorkflowTask, aggregateAnnouncements, announcementsOf, applyAttributeQuery, attributeColumnFor, attributeOperand, attributePredicateOperands, axisIsRunColumn, bindWorkflowClass, breakpointToken, buildWorkflowDirectory, canRoute, capableWorkers, classifyWaiterToken, clearDurableExecutionWrappers, collectMetrics, controlPlaneDescriptor, coveredTokens, createStepLogger, currentStep, currentWorkflowCtx, debug, describeWorker, descriptorHash, error, eventMatchOf, eventMatches, eventNameOf, eventPrefix, eventToken, facetOrigin, hasDurableExecutionWrappers, heartbeatStatus, indexWaitersByRun, info, isEventToken, isLegacyDescriptor, isWorkflowControlFlowSignal, log, matchesAttributes, mergeRunFacetRows, mergeRunValueFacetRows, missingCapabilities, negotiate, normalizeAttributeRows, normalizeDescriptor, observedAnnouncements, parseDuration, partitionOfToken, planDispatch, prevCronFireMs, readSearchAttributes, requiredCapabilities, resolveRouting, resolveRunWaiting, runDurableExecution, runInStepLogger, runInWorkflowCtx, runSchedules, runStepHandler, runValueFacetsFromRuns, sanitizeQueueToken, scheduledRunId, sqlComparator, stepConfigOf, stepId, stepNameOf, sub, subEvent, subProcess, tenantGroup, useDurableExecution, warn, workflowName };
|
|
5245
|
+
export { type AccumulatorHost, type Admission, type AdmissionBackend, type AdmissionItem, type AnnouncedWorkflow, type AnnouncementEvidence, type AttributeFilter, type AttributeOp, type AttributePredicateOperand, type AttributeValue, type BackoffStrategy, type BlockedDispatch, type BlockedResolution, CONTROL_FLOW_SIGNAL, CURRENT_PROTOCOL_VERSION, type CapabilityRequirement, type ChildCallOptions, CodecStateStore, ContinueAsNew, type ControlMessage, type ControlPlane, DEFAULT_PARTITION, DURABLE_OPTIONS, DURABLE_OPTIONS_CANONICAL, DURABLE_STEP_CONFIG, DURABLE_STEP_NAME, type Disagreement, type DispatchDiagnostics, type DispatchPlan, type DurableExecution, type DurableExecutionWrapper, type DurableTopology, type DurableWebhook, DurableWorkflow, ENGINE_MINTED_TAG_PREFIXES, EVENT_BUFFER_SCAN_LIMIT, EVENT_TOKEN_PREFIX, type EngineEvent, type EngineEventType, type EngineListener, Entities, type EntityConfig, type EntityHandler, type EntityHost, EventAccumulators, type EventBatchConfig, FatalError, GatherError, type GroupHealth, type Heartbeat, type HeartbeatSighting, type HeartbeatStatus, type HistoryEvent, InMemoryAdmissionBackend, InMemoryStateStore, InMemoryTransport, type InferSearchAttributes, LEGACY_V1_CAPABILITIES, LEGACY_V1_PROTOCOL, type MetricsCollector, type MetricsSnapshot, type NamedTransport, type NegotiateOptions, type NegotiationOutcome, type NegotiationReason, type NegotiationResult, NonDeterminismError, type PartitionSighting, type PayloadCodec, type QueueConfig, QueueController, RUN_VALUE_FACET_LIMIT, RUN_VALUE_FACET_SCAN, type RawWorkerDescriptor, RemoteStepError, RemoteStepTimeout, type RemoteTask, RemoteWorkflowExecutor, RemoteWorkflowTimeout, type RetentionPolicy, type RoutableDispatch, type RoutableResolution, type RoutingResolution, type RunAttributeRow, type RunDetail, type RunDispatcher, type RunFacetQuery, type RunFacetRow, RunGateway, type RunListItem, type RunQuery, type RunReply, type RunReplyResult, type RunRequest, type RunRequestKind, type RunResult, type RunSchedulesOptions, type RunStatus, type RunValueAxis, type RunValueFacetOptions, type RunValueFacetRow, type RunWaiting, STATE_STORE, STATE_STORE_CANONICAL, type ScalarAttributeFilter, type ScheduledWorkflow, type SearchAttributes, type SearchAttributesSchema, SignalTimeoutError, type SignalWaiter, type SingletonConfig, SingletonQueueFullError, StandardSchemaV1, type StartOptions, type StartRunMessage, type StateStore, type StepCheckpoint, type StepConfig, type StepDef, type StepDispatchOpts, type StepError, type StepEvent, type StepHandler, type StepInterceptor, type StepInvocation, type StepKind, type StepLogger, type StepOptions, type StepRef, type StepResult, type StepUndo, type StoreTransaction, type SubProcessHandle, TERMINAL_RUN_STATUSES, TRANSPORT, TRANSPORT_CANONICAL, type TenantEvent, type Transport, type UndoOf, type UpdateResult, type UpdateValidator, VERSION_UNDECLARED_TAG, WORKFLOW_NAME_KEY, type WireDates, type WorkerAdjust, type WorkerConcurrencyStatus, type WorkerDescriptor, type WorkerHeartbeat, type WorkerLifecycle, type WorkerStatus, type WorkflowAnnouncement, WorkflowBlocked, type WorkflowClass, type WorkflowCommand, type WorkflowCtx, type WorkflowDecision, type WorkflowDirectory, WorkflowEngine, type WorkflowEngineDeps, type WorkflowExecutor, type WorkflowHandler, type WorkflowInputOf, type WorkflowOutputOf, type WorkflowRef, type WorkflowRegistration, type WorkflowRun, type WorkflowStartClient, type WorkflowStepEvent, WorkflowSuspended, type WorkflowTask, aggregateAnnouncements, announcementsOf, applyAttributeQuery, attributeColumnFor, attributeOperand, attributePredicateOperands, axisIsRunColumn, bindWorkflowClass, breakpointToken, buildWorkflowDirectory, canRoute, capableWorkers, classifyWaiterToken, clearDurableExecutionWrappers, collectMetrics, controlPlaneDescriptor, coveredTokens, createStepLogger, currentStep, currentWorkflowCtx, debug, describeWorker, descriptorHash, error, eventMatchOf, eventMatches, eventNameOf, eventPrefix, eventToken, facetOrigin, hasDurableExecutionWrappers, heartbeatStatus, indexWaitersByRun, info, isEngineMintedTag, isEventToken, isLegacyDescriptor, isWorkflowControlFlowSignal, log, matchesAttributes, mergeRunFacetRows, mergeRunValueFacetRows, missingCapabilities, negotiate, normalizeAttributeRows, normalizeDescriptor, observedAnnouncements, parseDuration, partitionOfToken, planDispatch, prevCronFireMs, readSearchAttributes, requiredCapabilities, resolveRouting, resolveRunWaiting, runDurableExecution, runInStepLogger, runInWorkflowCtx, runSchedules, runStepHandler, runValueFacetsFromRuns, sanitizeQueueToken, scheduledRunId, sqlComparator, stepConfigOf, stepId, stepNameOf, sub, subEvent, subProcess, tenantGroup, useDurableExecution, warn, workflowName };
|
package/dist/index.js
CHANGED
|
@@ -3889,6 +3889,15 @@ var WorkflowEngine = class {
|
|
|
3889
3889
|
/**
|
|
3890
3890
|
* Resume each run only if this instance can acquire its recovery lease — so when several
|
|
3891
3891
|
* replicas recover or poll at once, each run is picked up by exactly one of them.
|
|
3892
|
+
*
|
|
3893
|
+
* A run this instance cannot resume is SKIPPED, not allowed to abort the batch. The canonical
|
|
3894
|
+
* case is skew protection: mid-rolling-deploy a pod leases a run whose workflow it does not have
|
|
3895
|
+
* and `resume` throws by design — but the rest of the batch is runs it can drive perfectly well,
|
|
3896
|
+
* and every caller here is a recovery sweep. Letting the first such run end the loop means one
|
|
3897
|
+
* row stops recovery for the whole deployment, and (since the callers are pollers) sends the
|
|
3898
|
+
* rejection into a lifecycle hook. Skipping leaves the run locked only until its lease expires,
|
|
3899
|
+
* for a pod that does have the workflow — which is exactly what the skew-protection error asks
|
|
3900
|
+
* for. Same posture as `publishEvent`'s per-subscriber isolation.
|
|
3892
3901
|
*/
|
|
3893
3902
|
async resumeLeased(runs, nowMs = this.clock(), onLocked) {
|
|
3894
3903
|
if (this.draining) return [];
|
|
@@ -3896,8 +3905,12 @@ var WorkflowEngine = class {
|
|
|
3896
3905
|
for (const run of runs) {
|
|
3897
3906
|
const acquired = await this.store.tryLockRun(run.id, this.instanceId, nowMs + this.leaseMs, nowMs);
|
|
3898
3907
|
if (!acquired) continue;
|
|
3899
|
-
|
|
3900
|
-
|
|
3908
|
+
try {
|
|
3909
|
+
const settled = onLocked ? await onLocked(run) : void 0;
|
|
3910
|
+
results.push(settled ?? await this.resume(run.id));
|
|
3911
|
+
} catch (error2) {
|
|
3912
|
+
console.error(`[nestjs-durable] could not resume run ${run.id} (${run.workflow}@${run.workflowVersion}); leaving it for another instance:`, error2);
|
|
3913
|
+
}
|
|
3901
3914
|
}
|
|
3902
3915
|
return results;
|
|
3903
3916
|
}
|
|
@@ -6003,6 +6016,13 @@ __name(mergeRunFacetRows, "mergeRunFacetRows");
|
|
|
6003
6016
|
// src/run-value-facets.ts
|
|
6004
6017
|
var RUN_VALUE_FACET_LIMIT = 100;
|
|
6005
6018
|
var RUN_VALUE_FACET_SCAN = 5e3;
|
|
6019
|
+
var ENGINE_MINTED_TAG_PREFIXES = [
|
|
6020
|
+
"singleton:"
|
|
6021
|
+
];
|
|
6022
|
+
function isEngineMintedTag(value) {
|
|
6023
|
+
return value !== null && ENGINE_MINTED_TAG_PREFIXES.some((prefix) => value.startsWith(prefix));
|
|
6024
|
+
}
|
|
6025
|
+
__name(isEngineMintedTag, "isEngineMintedTag");
|
|
6006
6026
|
function axisIsRunColumn(axis) {
|
|
6007
6027
|
return axis.field === "workflow" || axis.field === "status" || axis.field === "origin" || axis.field === "namespace";
|
|
6008
6028
|
}
|
|
@@ -6050,6 +6070,9 @@ function mergeRunValueFacetRows(rows, opts) {
|
|
|
6050
6070
|
value,
|
|
6051
6071
|
count
|
|
6052
6072
|
})).filter((row) => row.count > 0).sort((a, b) => {
|
|
6073
|
+
const engineA = isEngineMintedTag(a.value);
|
|
6074
|
+
const engineB = isEngineMintedTag(b.value);
|
|
6075
|
+
if (engineA !== engineB) return engineA ? 1 : -1;
|
|
6053
6076
|
if (b.count !== a.count) return b.count - a.count;
|
|
6054
6077
|
if (a.value === null) return 1;
|
|
6055
6078
|
if (b.value === null) return -1;
|
|
@@ -6977,6 +7000,7 @@ export {
|
|
|
6977
7000
|
DURABLE_STEP_CONFIG,
|
|
6978
7001
|
DURABLE_STEP_NAME,
|
|
6979
7002
|
DurableWorkflow,
|
|
7003
|
+
ENGINE_MINTED_TAG_PREFIXES,
|
|
6980
7004
|
EVENT_BUFFER_SCAN_LIMIT,
|
|
6981
7005
|
EVENT_TOKEN_PREFIX,
|
|
6982
7006
|
Entities,
|
|
@@ -7043,6 +7067,7 @@ export {
|
|
|
7043
7067
|
heartbeatStatus,
|
|
7044
7068
|
indexWaitersByRun,
|
|
7045
7069
|
info,
|
|
7070
|
+
isEngineMintedTag,
|
|
7046
7071
|
isEventToken,
|
|
7047
7072
|
isLegacyDescriptor,
|
|
7048
7073
|
isWorkflowControlFlowSignal,
|