@cruxstack/node-sdk
Version:
A Node.js SDK for event tracking, user traits lookup, validation, and automatic retry with queueing.
64 lines (63 loc) • 1.87 kB
JavaScript
import { sendEvent } from './api';
const MAX_RETRIES = 3;
const RETRY_INTERVAL = 10000; // 10 seconds
const eventQueue = [];
let retryTimer = null;
export function addToQueue(event) {
const queuedEvent = {
event,
attempts: 0,
timestamp: Date.now()
};
eventQueue.push(queuedEvent);
console.log(`Event queued: ${event.eid}`);
// Start retry timer if not already running
if (!retryTimer) {
startRetryTimer();
}
}
export function getQueueSize() {
return eventQueue.length;
}
export function clearQueue() {
eventQueue.length = 0;
if (retryTimer) {
clearInterval(retryTimer);
retryTimer = null;
}
}
function startRetryTimer() {
retryTimer = setInterval(async () => {
await processQueue();
}, RETRY_INTERVAL);
}
async function processQueue() {
if (eventQueue.length === 0) {
// Stop timer if queue is empty
if (retryTimer) {
clearInterval(retryTimer);
retryTimer = null;
}
return;
}
const eventsToRetry = [...eventQueue];
eventQueue.length = 0; // Clear the queue
for (const queuedEvent of eventsToRetry) {
try {
await sendEvent(queuedEvent.event);
console.log(`Queued event sent successfully: ${queuedEvent.event.eid}`);
}
catch (error) {
queuedEvent.attempts++;
if (queuedEvent.attempts < MAX_RETRIES) {
// Re-queue for retry
eventQueue.push(queuedEvent);
console.log(`Event retry ${queuedEvent.attempts}/${MAX_RETRIES}: ${queuedEvent.event.eid}`);
}
else {
// Max retries reached, log error
console.error(`Event failed after ${MAX_RETRIES} attempts: ${queuedEvent.event.eid}`, error);
}
}
}
}