import { AbortSignal } from "@aws-sdk/types"; import { runPolling } from "./poller"; import { validateWaiterOptions } from "./utils"; import { WaiterOptions, WaiterResult, waiterServiceDefaults, WaiterState } from "./waiter"; const abortTimeout = async (abortSignal: AbortSignal): Promise => { return new Promise((resolve) => { abortSignal.onabort = () => resolve({ state: WaiterState.ABORTED }); }); }; /** * Create a waiter promise that only resolves when: * 1. Abort controller is signaled * 2. Max wait time is reached * 3. `acceptorChecks` succeeds, or fails * Otherwise, it invokes `acceptorChecks` with exponential-backoff delay. * * @internal */ export const createWaiter = async ( options: WaiterOptions, input: Input, acceptorChecks: (client: Client, input: Input) => Promise ): Promise => { const params = { ...waiterServiceDefaults, ...options, }; validateWaiterOptions(params); const exitConditions = [runPolling(params, input, acceptorChecks)]; if (options.abortController) { exitConditions.push(abortTimeout(options.abortController.signal)); } if (options.abortSignal) { exitConditions.push(abortTimeout(options.abortSignal)); } return Promise.race(exitConditions); };