export const createDebounceDecorator = (delay = 300) => (originalMethod: any, _context: ClassMethodDecoratorContext) => { let timeoutId: NodeJS.Timeout | null = null; let pendingPromise: Promise | null = null; let resolvePromise: ((value: any) => void) | null = null; let rejectPromise: ((reason?: any) => void) | null = null; let lastArgs: any[] = []; function debouncedMethod(this: any, ...args: any[]) { if (timeoutId) { clearTimeout(timeoutId); } lastArgs = args; pendingPromise = new Promise((resolve, reject) => { resolvePromise = resolve; rejectPromise = reject; }); timeoutId = setTimeout(() => { try { const result = originalMethod.call(this, ...lastArgs); Promise.resolve(result).then(resolvePromise!, rejectPromise!); } catch (error) { rejectPromise?.(error); } timeoutId = null; }, delay); return pendingPromise; } return debouncedMethod; };