import { assertMethodDecorator } from "../common/decorators.js"; import type { AsyncMethod } from "../common/types.js"; export function createMultiDispatchMethod( originalMethod: AsyncMethod, dispatchesAmount: number, ): AsyncMethod { return function(this: This, ...args: Args): Promise { return new Promise((resolve, reject) => { let rejectionsAmount = 0; let lastError: unknown; for (let index = 0; index < dispatchesAmount; index += 1) { Promise.resolve() .then(() => { return originalMethod.apply(this, args); }) .then(resolve) .catch((error) => { lastError = error; rejectionsAmount += 1; if (rejectionsAmount === dispatchesAmount) { reject(lastError); } }); } }); }; } export function multiDispatch(dispatchesAmount: number) { return function( value: AsyncMethod, context: ClassMethodDecoratorContext>, ): AsyncMethod { assertMethodDecorator("multiDispatch", value, context); return createMultiDispatchMethod(value, dispatchesAmount); }; }