connect-transfer-react-native-sdk
Version:
Connect Transfer React Native SDK for Mastercard Open Banking Connect
96 lines (89 loc) • 2.91 kB
JavaScript
;
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