const db = global.db; const { EventEmitter } = require('events'); const log = require("./logger"); require("dotenv").config({ quiet: true }); log.info("Starting event watcher..."); const emitter = new EventEmitter(); var lastEventIndex = 0; async function getLastEventIndex() { const result = await db.query('SELECT EventIndex FROM Events ORDER BY EventIndex DESC LIMIT 1'); if (result && result.length > 0) { lastEventIndex = result[0].EventIndex; log.info(`Last event index: ${lastEventIndex}`); } } async function fetchEvents() { try { const events = await db.query('SELECT * FROM Events WHERE EventIndex > ? ORDER BY EventIndex ASC', [lastEventIndex]); if (events && events.length > 0) { log.debug(`Fetched ${events.length} new event(s)`); events.forEach(event => { emitter.emit('event', event); lastEventIndex = event.EventIndex; log.debug(`Processed event index: ${lastEventIndex}; ${JSON.stringify(event)}`); }); } } catch (err) { log.error(`Error fetching events: ${err}`); } setTimeout(fetchEvents, 1000); } dataTypes = { DoorMode: { 1: 'NormallyOpen', 2: 'NormallyClosed', 3: 'Controlled' }, Direction: { 1: 'In', 2: 'Out' }, EventType: { 0: 'None', 1: 'Swipe', 2: 'Door', 3: 'Alarm', 255: 'Overwritten' }, EventReason: { 0: 'None', 1: 'Swipe', 2: 'SwipeOpen', 3: 'SwipeClose', 5: 'Denied', 6: 'NoAccessRights', 7: 'IncorrectPassword', 8: 'AntiPassback', 9: 'MoreCards', 10: 'FirstCardOpen', 11: 'DoorIsNormallyClosed', 12: 'Interlock', 13: 'NotInAllowedTimePeriod', 15: 'InvalidTimezone', 18: 'AccessDenied', 20: 'PushbuttonOk', 23: 'DoorOpened', 24: 'DoorClosed', 25: 'DoorOpenedSupervisorPassword', 28: 'ControllerPowerOn', 29: 'ControllerReset', 31: 'PushbuttonInvalidDoorLocked', 32: 'PushbuttonInvalidOffline', 33: 'PushbuttonInvalidInterlock', 34: 'PushbuttonInvalidThreat', 37: 'DoorOpenTooLong', 38: 'ForcedOpen', 39: 'Fire', 40: 'ForcedClosed', 41: 'TheftPrevention', 42: 'Zone24x7', 43: 'Emergency', 44: 'RemoteOpenDoor', 45: 'RemoteOpenDoorUSBReader' } } const validEvents = { 1: [1, 2, 3, 6, 7], 2: [25], 3: [23, 24, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45] } if (process.env.EVENT_TESTING == true) { } (async () => { await getLastEventIndex(); await fetchEvents(); })(); test = false if (test == true) { log.warn("EVENT_TESTING is enabled - generating test events"); setInterval(() => { const eventTypes = Object.keys(validEvents); const eventType = parseInt(eventTypes[Math.floor(Math.random() * eventTypes.length)]); const reasons = validEvents[eventType]; const eventReason = reasons[Math.floor(Math.random() * reasons.length)]; const cardNumber = Math.floor(Math.random() * 1000000) + 1; const granted = [5, 6, 7, 18].includes(eventReason) ? false : true; const testEvent = { Controller: 123456789, EventIndex: ++lastEventIndex, Timestamp: new Date().toISOString().replace('T', ' ').substring(0, 19), Type: eventType, Reason: eventReason, Granted: granted, CardNumber: cardNumber, Door: 1, Direction: eventType == 1 ? (Math.random() < 0.5 ? 1 : 2) : 0, } log.info(`Generated test event: ${JSON.stringify(testEvent)}`); emitter.emit('event', testEvent); }, 1000); } module.exports = emitter;