From 8d5376b21f7edf05aedb67df480ff4107158df80 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Thu, 11 Aug 2022 09:28:35 -0700 Subject: [PATCH] server: expose worker thread --- sdk/gen/types.input.ts | 4 +-- sdk/types/index.d.ts | 6 ++-- sdk/types/index.js | 2 +- sdk/types/index.ts | 6 ++-- server/package-lock.json | 14 ++++---- server/package.json | 2 +- server/src/plugin/plugin-remote-worker.ts | 41 ++++++++++++----------- 7 files changed, 39 insertions(+), 36 deletions(-) diff --git a/sdk/gen/types.input.ts b/sdk/gen/types.input.ts index 17406f8d0..b03cfe03d 100644 --- a/sdk/gen/types.input.ts +++ b/sdk/gen/types.input.ts @@ -1640,8 +1640,8 @@ export interface ScryptedStatic { pluginHostAPI: any; - fork?: () => { - result: Promise; + fork?(): { + result: Promise; worker: { terminate(): Promise; }; diff --git a/sdk/types/index.d.ts b/sdk/types/index.d.ts index 724e8ede4..40779f83c 100644 --- a/sdk/types/index.d.ts +++ b/sdk/types/index.d.ts @@ -1,5 +1,5 @@ /// -export declare const TYPES_VERSION = "0.0.63"; +export declare const TYPES_VERSION = "0.0.64"; export interface DeviceState { id?: string; info?: DeviceInformation; @@ -1663,8 +1663,8 @@ export interface ScryptedStatic { mediaManager: MediaManager; systemManager: SystemManager; pluginHostAPI: any; - fork?: () => { - result: Promise; + fork?(): { + result: Promise; worker: { terminate(): Promise; }; diff --git a/sdk/types/index.js b/sdk/types/index.js index ceef0f114..662ccfbb1 100644 --- a/sdk/types/index.js +++ b/sdk/types/index.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ScryptedMimeTypes = exports.ScryptedInterface = exports.MediaPlayerState = exports.SecuritySystemObstruction = exports.SecuritySystemMode = exports.AirQuality = exports.LockState = exports.ThermostatMode = exports.TemperatureUnit = exports.FanMode = exports.HumidityMode = exports.ScryptedDeviceType = exports.ScryptedInterfaceDescriptors = exports.ScryptedInterfaceProperty = exports.DeviceBase = exports.TYPES_VERSION = void 0; -exports.TYPES_VERSION = "0.0.63"; +exports.TYPES_VERSION = "0.0.64"; class DeviceBase { } exports.DeviceBase = DeviceBase; diff --git a/sdk/types/index.ts b/sdk/types/index.ts index 52785b658..59573fd10 100644 --- a/sdk/types/index.ts +++ b/sdk/types/index.ts @@ -1,5 +1,5 @@ -export const TYPES_VERSION = "0.0.63"; +export const TYPES_VERSION = "0.0.64"; export interface DeviceState { @@ -2416,8 +2416,8 @@ export interface ScryptedStatic { pluginHostAPI: any; - fork?: () => { - result: Promise; + fork?(): { + result: Promise; worker: { terminate(): Promise; }; diff --git a/server/package-lock.json b/server/package-lock.json index 70bfa67dc..cf7b6eb1e 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.8", - "@scrypted/types": "^0.0.56", + "@scrypted/types": "^0.0.64", "adm-zip": "^0.5.3", "axios": "^0.21.1", "body-parser": "^1.19.0", @@ -134,9 +134,9 @@ } }, "node_modules/@scrypted/types": { - "version": "0.0.56", - "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.0.56.tgz", - "integrity": "sha512-32txJCj3Dgx0NowtYNZBLQeJ1b5dK6c2wDrX4Cij11hGDaPThsc66roFknEmF1IbmQRQGKVA8acKfQPWb4yCfA==" + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.0.64.tgz", + "integrity": "sha512-j0/VYkUkQVpxvpPQl+cEnNqVwiWmjyGNRcy06Unmq8SWwrea/+wYdM92nnVdz0okrAijCgYutzwfCqfMlyNsyA==" }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", @@ -3085,9 +3085,9 @@ } }, "@scrypted/types": { - "version": "0.0.56", - "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.0.56.tgz", - "integrity": "sha512-32txJCj3Dgx0NowtYNZBLQeJ1b5dK6c2wDrX4Cij11hGDaPThsc66roFknEmF1IbmQRQGKVA8acKfQPWb4yCfA==" + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.0.64.tgz", + "integrity": "sha512-j0/VYkUkQVpxvpPQl+cEnNqVwiWmjyGNRcy06Unmq8SWwrea/+wYdM92nnVdz0okrAijCgYutzwfCqfMlyNsyA==" }, "@socket.io/component-emitter": { "version": "3.1.0", diff --git a/server/package.json b/server/package.json index 20b5df429..cf6478288 100644 --- a/server/package.json +++ b/server/package.json @@ -4,7 +4,7 @@ "description": "", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.8", - "@scrypted/types": "^0.0.56", + "@scrypted/types": "^0.0.64", "adm-zip": "^0.5.3", "axios": "^0.21.1", "body-parser": "^1.19.0", diff --git a/server/src/plugin/plugin-remote-worker.ts b/server/src/plugin/plugin-remote-worker.ts index 69cbdc25d..2b5586d65 100644 --- a/server/src/plugin/plugin-remote-worker.ts +++ b/server/src/plugin/plugin-remote-worker.ts @@ -316,27 +316,32 @@ export function startPluginRemote(pluginId: string, peerSend: (message: RpcMessa pluginReader = undefined; const script = main.toString(); - scrypted.fork = async () => { + scrypted.fork = () => { const ntw = new NodeThreadWorker(pluginId, { env: process.env, pluginDebug: undefined, }); - const threadPeer = new RpcPeer('main', 'thread', (message, reject) => ntw.send(message, reject)); - threadPeer.params.updateStats = (stats: any) => { - // todo: merge. - // this.stats = stats; + return { + worker: ntw.worker, + result: (async() => { + const threadPeer = new RpcPeer('main', 'thread', (message, reject) => ntw.send(message, reject)); + threadPeer.params.updateStats = (stats: any) => { + // todo: merge. + // this.stats = stats; + } + ntw.setupRpcPeer(threadPeer); + + const remote = await setupPluginRemote(threadPeer, api, pluginId, () => systemManager.getSystemState()); + + for (const [nativeId, dmd] of deviceManager.nativeIds.entries()) { + await remote.setNativeId(nativeId, dmd.id, dmd.storage); + } + + const forkOptions = Object.assign({}, zipOptions); + forkOptions.fork = true; + return remote.loadZip(packageJson, zipData, forkOptions) + })(), } - ntw.setupRpcPeer(threadPeer); - - const remote = await setupPluginRemote(threadPeer, api, pluginId, () => systemManager.getSystemState()); - - for (const [nativeId, dmd] of deviceManager.nativeIds.entries()) { - await remote.setNativeId(nativeId, dmd.id, dmd.storage); - } - - const forkOptions = Object.assign({}, zipOptions); - forkOptions.fork = true; - return remote.loadZip(packageJson, zipData, forkOptions) } try { @@ -345,9 +350,7 @@ export function startPluginRemote(pluginId: string, peerSend: (message: RpcMessa if (zipOptions?.fork) { const fork = exports.fork; - const ret = await fork(); - ret[RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION] = true; - return ret; + return fork(); } let pluginInstance = exports.default;