pollSaga
@mineflow/client-core / pollSaga
Function: pollSaga()
function pollSaga(
client: SagaStatusClient,
sagaId: string,
opts?: PollSagaOptions): Promise<{
sagaId: string;
steps: object[];
}>;
Defined in: packages/client-core/src/saga.ts:175
Опрашивает статус async-саги до терминального состояния и возвращает финальный
снимок. Бэк выполняет некоторые POST асинхронно (возвращая 202 + sagaId),
SSE для саг нет — поэтому статус тянется поллингом.
Поведение:
- провал (failed/compensated) возвращается немедленно — он окончателен;
- успех стабилизируется: возвращается только когда число различных шагов не изменилось между двумя опросами (защита от «все текущие шаги completed, но саге ещё предстоят шаги»);
- по истечении
timeoutMsбросает SagaTimeoutError.
Важно: терминал «провал» — это НЕ исключение; pollSaga резолвится снимком с
failed/compensated. Различай успех и провал по содержимому status.steps.
Parameters
| Parameter | Type | Description |
|---|---|---|
client | SagaStatusClient | openapi-fetch-клиент (или мок) с методом saga-status. |
sagaId | string | идентификатор саги из ответа 202. |
opts | PollSagaOptions | интервал, таймаут, предикат завершённости, инъекции sleep/now. |
Returns
Promise<{
sagaId: string;
steps: object[];
}>
финальный SagaStatus (успешный или провальный терминал).
Throws
SagaTimeoutError если сага не завершилась за timeoutMs.
Example
const { sagaId } = unwrap(await client.POST('/api/v1/prd/shift-reports/{id}/approve', { ... }));
const final = await pollSaga(client, sagaId, { intervalMs: 1000, timeoutMs: 60_000 });