UNPKG

connect-transfer-react-native-sdk

Version:

Connect Transfer React Native SDK for Mastercard Open Banking Connect

96 lines (89 loc) 2.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSendAuditData = exports.queueAuditEvent = exports.eventQueue = void 0; var _store = _interopRequireDefault(require("../redux/store")); var _auditEvents = require("../services/api/auditEvents"); var _constants = require("../constants"); var _auditEventsMapper = require("./auditEventsMapper"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * EventQueue - A singleton class that ensures audit events are processed one at a time * in the order they are received. * * This prevents race conditions and ensures no audit event api is missed * even with rapid or repeated user actions. */ class EventQueue { queue = []; isProcessing = false; isDestroyed = false; /** * Enqueues a new event data and starts the processing loop if not already running. * * @param data - The data task to enqueue * @param processFn - A function that processes each event data (e.g., dispatch) */ enqueue(data, processFn) { if (this.isDestroyed) return; this.queue.push(data); this.processQueue(processFn); } /** * Processes events in the queue one by one in FIFO order. * Prevents concurrent processing via the `isProcessing` flag. */ async processQueue(processFn) { if (this.isProcessing || this.isDestroyed) return; this.isProcessing = true; while (this.queue.length > 0) { const data = this.queue.shift(); if (data) { try { await processFn(data); } catch (err) { console.warn('Failed to process audit event api', err); } } } this.isProcessing = false; } destroy() { this.isDestroyed = true; this.queue = []; this.isProcessing = false; } reset() { this.isDestroyed = false; } } /** * Singleton instance of the EventQueue * This ensures all events are handled in one centralized queue * even if `queueAuditEvent` is called from multiple parts of the app. */ const eventQueue = exports.eventQueue = new EventQueue(); /** * Call this function instead of directly dispatching auditEvents. * This ensures the audit event api is queued and processed sequentially. */ const queueAuditEvent = data => { eventQueue.enqueue(data, async data => { await _store.default.dispatch((0, _auditEvents.auditEvents)(_constants.API_KEYS.auditEvents, data)); }); }; /** * Hook to map and queue audit events in one call. * Can be used inside React components only. */ exports.queueAuditEvent = queueAuditEvent; const useSendAuditData = () => { const mapAuditEvent = (0, _auditEventsMapper.useAuditEventsMapper)(); return (eventName, eventData) => { const data = mapAuditEvent(eventName, eventData); queueAuditEvent(data); }; }; exports.useSendAuditData = useSendAuditData; //# sourceMappingURL=auditEventQueue.js.map