uhppoted-db-web/eventWatcher.js
2025-09-01 03:10:07 -06:00

134 lines
3.2 KiB
JavaScript

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;