From dbb72514e05f790002878b19081e28a0d322b246 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sun, 24 Oct 2021 13:14:33 -0700 Subject: [PATCH] webhook: mediaobject support --- plugins/webhook/package-lock.json | 4 ++-- plugins/webhook/package.json | 2 +- plugins/webhook/src/main.ts | 31 ++++++++++++++++++++++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/plugins/webhook/package-lock.json b/plugins/webhook/package-lock.json index 72299d7ec..d70164236 100644 --- a/plugins/webhook/package-lock.json +++ b/plugins/webhook/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/webhook", - "version": "0.0.2", + "version": "0.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/webhook", - "version": "0.0.2", + "version": "0.0.3", "dependencies": { "@types/node": "^16.6.1" }, diff --git a/plugins/webhook/package.json b/plugins/webhook/package.json index b32905b5b..3d0bfdd52 100644 --- a/plugins/webhook/package.json +++ b/plugins/webhook/package.json @@ -34,5 +34,5 @@ "devDependencies": { "@scrypted/sdk": "file:../../sdk" }, - "version": "0.0.2" + "version": "0.0.3" } diff --git a/plugins/webhook/src/main.ts b/plugins/webhook/src/main.ts index 7cbb46526..15ade2d89 100644 --- a/plugins/webhook/src/main.ts +++ b/plugins/webhook/src/main.ts @@ -8,7 +8,12 @@ import { randomBytes } from 'crypto'; const allInterfaceMethods: string[] = [].concat(...Object.values(ScryptedInterfaceDescriptors).map((type: any) => type.methods)); const allInterfaceProperties: string[] = [].concat(...Object.values(ScryptedInterfaceDescriptors).map((type: any) => type.properties)); -const { systemManager, endpointManager } = sdk; +const { systemManager, endpointManager, mediaManager } = sdk; + +const mediaObjectMethods = [ + 'takePicture', + 'getVideoStream', +] class WebhookMixin extends SettingsMixinDeviceBase { async getMixinSettings(): Promise { @@ -75,6 +80,20 @@ class WebhookMixin extends SettingsMixinDeviceBase { this.console.log("##################################################") } + async maybeSendMediaObject(response: HttpResponse, value: any, method: string) { + if (!mediaObjectMethods.includes(method)) { + response?.send(value.toString()); + return; + } + + const buffer = await mediaManager.convertMediaObjectToBuffer(value, 'image/jpeg'); + response?.send(buffer, { + headers: { + 'Content-Type': 'image/jpeg', + } + }); + } + async handle(request: HttpRequest, response: HttpResponse, device: ScryptedDevice, pathSegments: string[]) { const token = pathSegments[2]; if (token !== this.storage.getItem('token')) { @@ -92,13 +111,15 @@ class WebhookMixin extends SettingsMixinDeviceBase { parameters = JSON.parse(p); } - response?.send('ok'); - try { - await device[methodOrProperty](...parameters); + const result = await device[methodOrProperty](...parameters); + this.maybeSendMediaObject(response, result, methodOrProperty); } catch (e) { this.console.error('webhook action error', e); + response.send('Internal Error', { + code: 500, + }) } } else if (allInterfaceProperties.includes(methodOrProperty)) { @@ -111,7 +132,7 @@ class WebhookMixin extends SettingsMixinDeviceBase { }); } else { - response?.send(value); + response?.send(value.toString()); } } else {