From 9f4144ffaae456ce9bfbaa1d0a9534fe2d77d231 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 27 Jun 2022 12:31:36 -0700 Subject: [PATCH] unifi-protect: watch for websocket silent death --- external/unifi-protect | 2 +- plugins/unifi-protect/package-lock.json | 4 ++-- plugins/unifi-protect/package.json | 3 +-- plugins/unifi-protect/src/main.ts | 21 +++++++++++++++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/external/unifi-protect b/external/unifi-protect index 2cad2cdf2..564bfda55 160000 --- a/external/unifi-protect +++ b/external/unifi-protect @@ -1 +1 @@ -Subproject commit 2cad2cdf2e0d1f8d0e905e37662e28c4b42605da +Subproject commit 564bfda557532cd9b57bb7aceb71370a72de7dca diff --git a/plugins/unifi-protect/package-lock.json b/plugins/unifi-protect/package-lock.json index 2399d5624..c3c9085ca 100644 --- a/plugins/unifi-protect/package-lock.json +++ b/plugins/unifi-protect/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/unifi-protect", - "version": "0.0.117", + "version": "0.0.118", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/unifi-protect", - "version": "0.0.117", + "version": "0.0.118", "hasInstallScript": true, "license": "Apache", "dependencies": { diff --git a/plugins/unifi-protect/package.json b/plugins/unifi-protect/package.json index f9875a636..93e6324b8 100644 --- a/plugins/unifi-protect/package.json +++ b/plugins/unifi-protect/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/unifi-protect", - "version": "0.0.117", + "version": "0.0.118", "description": "Unifi Protect Plugin for Scrypted", "author": "Scrypted", "license": "Apache", @@ -33,7 +33,6 @@ ] }, "devDependencies": { - "@types/lodash": "^4.14.158", "@types/node": "^16.7.1", "@types/ws": "^7.4.7" }, diff --git a/plugins/unifi-protect/src/main.ts b/plugins/unifi-protect/src/main.ts index 2e8f7ebcb..a0cb71109 100644 --- a/plugins/unifi-protect/src/main.ts +++ b/plugins/unifi-protect/src/main.ts @@ -95,7 +95,7 @@ export class UnifiProtect extends ScryptedDeviceBase implements Settings, Device return fetch(url, options); } - listener = (event: Buffer) => { + listener(event: Buffer) { const updatePacket = ProtectApiUpdates.decodeUpdatePacket(this.console, event); if (!updatePacket) return; @@ -249,6 +249,7 @@ export class UnifiProtect extends ScryptedDeviceBase implements Settings, Device } this.api?.eventsWs?.removeAllListeners(); + this.api?.eventsWs?.close(); if (!this.api) { this.api = new ProtectApi(ip, username, password, { debug() { }, @@ -268,7 +269,23 @@ export class UnifiProtect extends ScryptedDeviceBase implements Settings, Device return; } - this.api.eventsWs?.on('message', this.listener); + const onWsTimeout = () => { + this.console.log('Event Listener timeout. Restarting listener.'); + this.api?.eventsWs?.removeAllListeners(); + this.api?.eventsWs?.close(); + this.discoverDevices(0); + }; + let wsTimeout: NodeJS.Timeout; + const resetWsTimeout = () => { + clearTimeout(wsTimeout); + wsTimeout = setTimeout(onWsTimeout, 5 * 60 * 1000); + }; + resetWsTimeout(); + + this.api.eventsWs?.on('message', (data) => { + resetWsTimeout(); + this.listener(data as Buffer); + }); this.api.eventsWs?.on('close', async () => { this.console.error('Event Listener closed. Reconnecting in 10 seconds.'); await sleep(10000);