62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import type {
|
|
PipelineFallbackAction,
|
|
PipelineFallbackPolicy,
|
|
PipelineStageName,
|
|
PipelineStageStatus,
|
|
} from "./types.js";
|
|
|
|
export type PipelineFallbackReason = "unavailable" | "failed";
|
|
|
|
export type PipelineFallbackDecision = {
|
|
stage: PipelineStageName;
|
|
reason: PipelineFallbackReason;
|
|
action: PipelineFallbackAction;
|
|
shouldContinue: boolean;
|
|
shouldNotifyUser: boolean;
|
|
shouldFailRequest: boolean;
|
|
};
|
|
|
|
const DEFAULT_ACTION_BY_REASON: Record<PipelineFallbackReason, PipelineFallbackAction> = {
|
|
unavailable: "continue_without_stage",
|
|
failed: "fail_request",
|
|
};
|
|
|
|
export function resolvePipelineFallbackAction(params: {
|
|
stage: PipelineStageName;
|
|
reason: PipelineFallbackReason;
|
|
policies: readonly PipelineFallbackPolicy[];
|
|
}): PipelineFallbackAction {
|
|
const policy = params.policies.find(item => item.stage === params.stage);
|
|
if (!policy) return DEFAULT_ACTION_BY_REASON[params.reason];
|
|
|
|
return params.reason === "unavailable"
|
|
? policy.onUnavailable
|
|
: policy.onFailed;
|
|
}
|
|
|
|
export function decidePipelineFallback(params: {
|
|
stage: PipelineStageName;
|
|
reason: PipelineFallbackReason;
|
|
policies: readonly PipelineFallbackPolicy[];
|
|
}): PipelineFallbackDecision {
|
|
const action = resolvePipelineFallbackAction(params);
|
|
|
|
return {
|
|
stage: params.stage,
|
|
reason: params.reason,
|
|
action,
|
|
shouldContinue: action === "ignore"
|
|
|| action === "continue_without_stage"
|
|
|| action === "notify_user"
|
|
|| action === "use_alternate_target",
|
|
shouldNotifyUser: action === "notify_user",
|
|
shouldFailRequest: action === "fail_request",
|
|
};
|
|
}
|
|
|
|
export function fallbackReasonFromStageStatus(status: PipelineStageStatus): PipelineFallbackReason | undefined {
|
|
if (status === "skipped") return "unavailable";
|
|
if (status === "failed") return "failed";
|
|
return undefined;
|
|
}
|