UNPKG

@bronlabs/intents-sdk

Version:
56 lines 2.12 kB
import { EventQueue } from './eventQueue.js'; import { log, sleep } from './utils.js'; export class OrderProcessor { constructor() { this.isRunning = true; this.delayedQueue = new EventQueue(); this.processDelayedQueue().then(() => undefined); } async stop() { if (!this.isRunning) { log.warn('Order processor already stopped'); return; } log.info('Stopping Order processor...'); this.isRunning = false; await sleep(3000); log.info('Order processor stopped.'); } async processDelayedQueue() { const start = this.delayedQueue.peek(); let looped = false; while (!this.delayedQueue.isEmpty() && this.isRunning) { const event = this.delayedQueue.peek(); if (!event) break; event.attempts = event.attempts ?? 0; event.nextAttemptAt = event.nextAttemptAt ?? 0; if (event.nextAttemptAt > Date.now()) { this.delayedQueue.remove(); this.delayedQueue.add(event); if (start && event.orderId === start.orderId) { if (looped) break; looped = true; } continue; } try { await this.process(event.orderId, event.status); this.delayedQueue.remove(); } catch (error) { log.error(`Error processing delayed event ${event.orderId} ${event.status}: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`); event.attempts += 1; event.nextAttemptAt = Date.now() + this.backoffMs(event.attempts); this.delayedQueue.remove(); this.delayedQueue.add(event); } } setTimeout(async () => await this.processDelayedQueue(), 1000); } backoffMs(attempts) { return Math.min(60000, 3000 * 2 ** Math.max(0, attempts - 1)); } } //# sourceMappingURL=orderProcessor.js.map