134 lines
3.2 KiB
JavaScript
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; |