Skip to content

Commit 94d8581

Browse files
Improve retry policy resolution, falling back to defaults
1 parent ad48d18 commit 94d8581

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

packages/openworkflow/worker.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Backend } from "./backend.js";
22
import { type BackoffPolicy, computeBackoffDelayMs } from "./core/backoff.js";
3+
import { parseDuration } from "./core/duration.js";
34
import type { WorkflowRun } from "./core/workflow.js";
45
import { executeWorkflow } from "./execution.js";
56
import { WorkflowRegistry } from "./registry.js";
@@ -325,5 +326,39 @@ export function resolveRetryPolicy(
325326
partial?: Partial<RetryPolicy>,
326327
): RetryPolicy {
327328
if (!partial) return DEFAULT_WORKFLOW_RETRY_POLICY;
328-
return { ...DEFAULT_WORKFLOW_RETRY_POLICY, ...partial };
329+
330+
const merged = { ...DEFAULT_WORKFLOW_RETRY_POLICY, ...partial };
331+
return {
332+
initialInterval: resolveDuration(
333+
merged.initialInterval,
334+
DEFAULT_WORKFLOW_RETRY_POLICY.initialInterval,
335+
),
336+
backoffCoefficient:
337+
Number.isFinite(merged.backoffCoefficient) &&
338+
merged.backoffCoefficient > 0
339+
? merged.backoffCoefficient
340+
: DEFAULT_WORKFLOW_RETRY_POLICY.backoffCoefficient,
341+
maximumInterval: resolveDuration(
342+
merged.maximumInterval,
343+
DEFAULT_WORKFLOW_RETRY_POLICY.maximumInterval,
344+
),
345+
maximumAttempts:
346+
Number.isInteger(merged.maximumAttempts) && merged.maximumAttempts >= 0
347+
? merged.maximumAttempts
348+
: DEFAULT_WORKFLOW_RETRY_POLICY.maximumAttempts,
349+
};
350+
}
351+
352+
/**
353+
* Return a duration string when it parses to a positive value, otherwise fallback.
354+
* @param value - Duration string to validate
355+
* @param fallback - Default duration string to use when invalid
356+
* @returns Valid duration string
357+
*/
358+
function resolveDuration(
359+
value: RetryPolicy["initialInterval"],
360+
fallback: RetryPolicy["initialInterval"],
361+
): RetryPolicy["initialInterval"] {
362+
const parsed = parseDuration(value);
363+
return parsed.ok && parsed.value > 0 ? value : fallback;
329364
}

0 commit comments

Comments
 (0)