From 167a3b968148f1eb22c97c6ca05c551dc849e01c Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 18 Apr 2022 13:56:04 -0700 Subject: [PATCH] server: fix plugin default export when device is a class or function. fix pluginId state missing. --- server/package-lock.json | 4 ++-- server/package.json | 2 +- server/src/plugin/plugin-remote.ts | 15 ++++++++------- server/src/plugin/system.ts | 2 ++ server/src/runtime.ts | 3 ++- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 3a5b0f24c..cfa235f01 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/server", - "version": "0.0.168", + "version": "0.0.169", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/server", - "version": "0.0.168", + "version": "0.0.169", "license": "ISC", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.8", diff --git a/server/package.json b/server/package.json index d4b29a978..99645b04e 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/server", - "version": "0.0.168", + "version": "0.0.169", "description": "", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.8", diff --git a/server/src/plugin/plugin-remote.ts b/server/src/plugin/plugin-remote.ts index e0bb5e48a..1e32cd887 100644 --- a/server/src/plugin/plugin-remote.ts +++ b/server/src/plugin/plugin-remote.ts @@ -561,16 +561,17 @@ export function attachPluginRemote(peer: RpcPeer, options?: PluginRemoteAttachOp try { peer.evalLocal(script, zipOptions?.filename || '/plugin/main.nodejs.js', params); pluginConsole?.log('plugin successfully loaded'); - await options?.onPluginReady?.(ret, params, exports.default); - const defaultExport = exports.default; + let pluginInstance = exports.default; // support exporting a plugin class, plugin main function, // or a plugin instance - if (defaultExport.toString().startsWith('class ')) - return new defaultExport(); - if (typeof defaultExport === 'function') - return await defaultExport(); - return defaultExport; + if (pluginInstance.toString().startsWith('class ')) + pluginInstance = new pluginInstance(); + if (typeof pluginInstance === 'function') + pluginInstance = await pluginInstance(); + + await options?.onPluginReady?.(ret, params, pluginInstance); + return pluginInstance; } catch (e) { pluginConsole?.error('plugin failed to start', e); diff --git a/server/src/plugin/system.ts b/server/src/plugin/system.ts index c3bc82a7a..a866ba9d0 100644 --- a/server/src/plugin/system.ts +++ b/server/src/plugin/system.ts @@ -125,6 +125,8 @@ export class SystemManagerImpl implements SystemManager { getDeviceByName(name: string): any { for (const id of Object.keys(this.state)) { const s = this.state[id]; + if ((s.interfaces?.value as string[])?.includes(ScryptedInterface.ScryptedPlugin) && s.pluginId?.value === name) + return this.getDeviceById(id); if (s.name.value === name) return this.getDeviceById(id); } diff --git a/server/src/runtime.ts b/server/src/runtime.ts index 5c7e31af0..3601cc047 100644 --- a/server/src/runtime.ts +++ b/server/src/runtime.ts @@ -765,7 +765,8 @@ export class ScryptedRuntime extends PluginHttp { setState(pluginDevice, ScryptedInterfaceProperty.providedInterfaces, PluginDeviceProxyHandler.sortInterfaces(interfaces)); } - if (!pluginDevice.pluginId) { + const pluginId: string = getState(pluginDevice, ScryptedInterfaceProperty.pluginId); + if (!pluginId) { dirty = true; setState(pluginDevice, ScryptedInterfaceProperty.pluginId, pluginDevice.pluginId); }