UNPKG

@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
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); } } } }