@bronlabs/intents-sdk
Version:
SDK for Intents DeFi smart contracts
56 lines • 2.12 kB
JavaScript
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