UNPKG

eufy-security-ws

Version:

Node WebSocket server implementation to integrate Eufy Security devices

251 lines 10.8 kB
import date from "date-and-time"; import { UnknownCommandError } from "../error.js"; import { StationCommand } from "./command.js"; import { dumpStationProperties, dumpStationPropertiesMetadata } from "./properties.js"; export class StationMessageHandler { static async handle(message, driver, client) { const { serialNumber, command } = message; const station = await driver.getStation(serialNumber); switch (command) { case StationCommand.reboot: station.rebootHUB(); return client.schemaVersion >= 13 ? { async: true } : {}; case StationCommand.setGuardMode: if (client.schemaVersion <= 12) { station.setGuardMode(message.mode); return {}; } else { throw new UnknownCommandError(command); } case StationCommand.isConnected: { const result = station.isConnected(); if (client.schemaVersion <= 3) { return { connected: result }; } else if (client.schemaVersion >= 4) { return { serialNumber: station.getSerial(), connected: result }; } else { throw new UnknownCommandError(command); } } case StationCommand.isConnectedLegacy: { if (client.schemaVersion <= 12) { const result = station.isConnected(); return { connected: result }; } else { throw new UnknownCommandError(command); } } /*case StationCommand.getCameraInfo: await station.getCameraInfo().catch((error) => { throw error; }); return client.schemaVersion >= 13 ? { async: true } : {}; case StationCommand.getStorageInfo: await station.getStorageInfo().catch((error) => { throw error; }); return client.schemaVersion >= 13 ? { async: true } : {};*/ case StationCommand.connect: await station.connect().catch((error) => { throw error; }); return {}; case StationCommand.disconnect: station.close(); return {}; case StationCommand.getPropertiesMetadata: { const properties = station.getPropertiesMetadata(); if (client.schemaVersion <= 3) { return { properties: properties }; } else if (client.schemaVersion >= 4) { return { serialNumber: station.getSerial(), properties: properties }; } else { return { serialNumber: station.getSerial(), properties: dumpStationPropertiesMetadata(station, client.schemaVersion) }; } } case StationCommand.getProperties: { const properties = station.getProperties(); if (client.schemaVersion <= 3) { return { properties: properties }; } else if (client.schemaVersion >= 4) { return { serialNumber: station.getSerial(), properties: properties }; } else { return { serialNumber: station.getSerial(), properties: dumpStationProperties(station, client.schemaVersion) }; } } case StationCommand.setProperty: await driver.setStationProperty(serialNumber, message.name, message.value).catch((error) => { throw error; }); return client.schemaVersion >= 13 ? { async: true } : {}; case StationCommand.triggerAlarm: if (client.schemaVersion >= 3) { station.triggerStationAlarmSound(message.seconds); return client.schemaVersion >= 13 ? { async: true } : {}; } else { throw new UnknownCommandError(command); } case StationCommand.resetAlarm: if (client.schemaVersion >= 3) { station.resetStationAlarmSound(); return client.schemaVersion >= 13 ? { async: true } : {}; } else { throw new UnknownCommandError(command); } case StationCommand.hasProperty: { if (client.schemaVersion >= 3) { const result = station.hasProperty(message.propertyName); if (client.schemaVersion === 3) { return { exists: result }; } else if (client.schemaVersion >= 4) { return { serialNumber: station.getSerial(), exists: result }; } else { throw new UnknownCommandError(command); } } else { throw new UnknownCommandError(command); } } case StationCommand.hasCommand: { if (client.schemaVersion >= 3) { const result = station.hasCommand(message.commandName); if (client.schemaVersion === 3) { return { exists: result }; } else if (client.schemaVersion >= 4) { return { serialNumber: station.getSerial(), exists: result }; } else { throw new UnknownCommandError(command); } } else { throw new UnknownCommandError(command); } } case StationCommand.getCommands: { if (client.schemaVersion >= 3) { const result = station.getCommands(); if (client.schemaVersion === 3) { return { commands: result }; } else if (client.schemaVersion >= 4) { return { serialNumber: station.getSerial(), commands: result }; } else { throw new UnknownCommandError(command); } } else { throw new UnknownCommandError(command); } } case StationCommand.chime: if (client.schemaVersion >= 15) { const ringtone = message.ringtone; station.chimeHomebase(ringtone !== undefined ? ringtone : 0); return { async: true }; } else { throw new UnknownCommandError(command); } case StationCommand.downloadImage: if (client.schemaVersion >= 17) { const file = message.file; station.downloadImage(file); return { async: true }; } else { throw new UnknownCommandError(command); } case StationCommand.databaseQueryLatestInfo: if (client.schemaVersion >= 18) { station.databaseQueryLatestInfo(); return { async: true }; } else { throw new UnknownCommandError(command); } case StationCommand.databaseQueryLocal: if (client.schemaVersion >= 18) { const serialNumbers = message.serialNumbers; const startDate = date.parse(message.startDate, "YYYYMMDD"); const endDate = date.parse(message.endDate, "YYYYMMDD"); const eventType = message.eventType; const detectionType = message.detectionType; const storageType = message.storageType; station.databaseQueryLocal(serialNumbers, startDate, endDate, eventType, detectionType, storageType); return { async: true }; } else { throw new UnknownCommandError(command); } case StationCommand.databaseCountByDate: if (client.schemaVersion >= 18) { const startDate = date.parse(message.startDate, "YYYYMMDD"); const endDate = date.parse(message.endDate, "YYYYMMDD"); station.databaseCountByDate(startDate, endDate); return { async: true }; } else { throw new UnknownCommandError(command); } case StationCommand.databaseDelete: if (client.schemaVersion >= 18) { const ids = message.ids; station.databaseDelete(ids); return { async: true }; } else { throw new UnknownCommandError(command); } default: throw new UnknownCommandError(command); } } } //# sourceMappingURL=message_handler.js.map