UNPKG

@iexec/dataprotector

Version:

This product enables users to confidentially store data–such as mail address, documents, personal information ...

79 lines (76 loc) 2.2 kB
import { WorkflowError } from '../../utils/errors.js'; import { taskIdSchema, throwIfMissing, validateOnStatusUpdateCallback, } from '../../utils/validators.js'; import { OnStatusUpdateFn, WaitForTaskCompletionParams, WaitForTaskCompletionResponse, WaitForTaskCompletionStatuses, } from '../types/index.js'; import { IExecConsumer } from '../types/internalTypes.js'; export const waitForTaskCompletion = async ({ iexec = throwIfMissing(), dealId, taskId, onStatusUpdate = () => {}, }: IExecConsumer & WaitForTaskCompletionParams): Promise<WaitForTaskCompletionResponse> => { const vTaskId = taskIdSchema() .required() .label('taskId') .validateSync(taskId); const vDealId = taskIdSchema() .required() .label('dealId') .validateSync(dealId); const vOnStatusUpdate = validateOnStatusUpdateCallback< OnStatusUpdateFn<WaitForTaskCompletionStatuses> >(onStatusUpdate); try { const taskObservable = await iexec.task.obsTask(vTaskId, { dealid: vDealId, }); let status: 'COMPLETED' | 'FAILED' | 'TIMEOUT'; let success: boolean; await new Promise((resolve, reject) => { taskObservable.subscribe({ next: (data) => { const isDone = data?.task?.statusName === 'COMPLETED' || data?.task?.statusName === 'FAILED' || data?.task?.statusName === 'TIMEOUT'; if (isDone) { status = data?.task?.statusName as | 'COMPLETED' | 'FAILED' | 'TIMEOUT'; success = data?.task?.statusName === 'COMPLETED'; } vOnStatusUpdate({ title: 'TASK_UPDATED', isDone, payload: { taskId: vTaskId, status: data?.task?.statusName, }, }); }, error: (e) => { reject(e); }, complete: () => resolve(undefined), }); }); return { status, success }; } catch (error) { console.error('Error in waitForTaskCompletion:', error); throw new WorkflowError({ message: 'Failed to wait for task completion', errorCause: error, }); } };