@scrypted/server 0.7.92 → 0.7.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @scrypted/server might be problematic. Click here for more details.
- package/package.json +1 -1
- package/dist/asynciterable-utils.d.ts +0 -2
- package/dist/asynciterable-utils.js +0 -24
- package/dist/asynciterable-utils.js.map +0 -1
- package/dist/cert.d.ts +0 -6
- package/dist/cert.js +0 -75
- package/dist/cert.js.map +0 -1
- package/dist/collection.d.ts +0 -1
- package/dist/collection.js +0 -16
- package/dist/collection.js.map +0 -1
- package/dist/db-types.d.ts +0 -38
- package/dist/db-types.js +0 -45
- package/dist/db-types.js.map +0 -1
- package/dist/event-registry.d.ts +0 -19
- package/dist/event-registry.js +0 -92
- package/dist/event-registry.js.map +0 -1
- package/dist/http-interfaces.d.ts +0 -3
- package/dist/http-interfaces.js +0 -73
- package/dist/http-interfaces.js.map +0 -1
- package/dist/infer-defaults.d.ts +0 -11
- package/dist/infer-defaults.js +0 -119
- package/dist/infer-defaults.js.map +0 -1
- package/dist/io.d.ts +0 -22
- package/dist/io.js +0 -3
- package/dist/io.js.map +0 -1
- package/dist/level.d.ts +0 -110
- package/dist/level.js +0 -135
- package/dist/level.js.map +0 -1
- package/dist/listen-zero.d.ts +0 -13
- package/dist/listen-zero.js +0 -48
- package/dist/listen-zero.js.map +0 -1
- package/dist/logger.d.ts +0 -29
- package/dist/logger.js +0 -78
- package/dist/logger.js.map +0 -1
- package/dist/media-helpers.d.ts +0 -5
- package/dist/media-helpers.js +0 -89
- package/dist/media-helpers.js.map +0 -1
- package/dist/mixin/mixin-cycle.d.ts +0 -3
- package/dist/mixin/mixin-cycle.js +0 -32
- package/dist/mixin/mixin-cycle.js.map +0 -1
- package/dist/plugin/acl.d.ts +0 -16
- package/dist/plugin/acl.js +0 -83
- package/dist/plugin/acl.js.map +0 -1
- package/dist/plugin/descriptor.d.ts +0 -22
- package/dist/plugin/descriptor.js +0 -35
- package/dist/plugin/descriptor.js.map +0 -1
- package/dist/plugin/media.d.ts +0 -71
- package/dist/plugin/media.js +0 -420
- package/dist/plugin/media.js.map +0 -1
- package/dist/plugin/mediaobject.d.ts +0 -10
- package/dist/plugin/mediaobject.js +0 -26
- package/dist/plugin/mediaobject.js.map +0 -1
- package/dist/plugin/plugin-api.d.ts +0 -106
- package/dist/plugin/plugin-api.js +0 -120
- package/dist/plugin/plugin-api.js.map +0 -1
- package/dist/plugin/plugin-console.d.ts +0 -28
- package/dist/plugin/plugin-console.js +0 -291
- package/dist/plugin/plugin-console.js.map +0 -1
- package/dist/plugin/plugin-debug.d.ts +0 -4
- package/dist/plugin/plugin-debug.js +0 -3
- package/dist/plugin/plugin-debug.js.map +0 -1
- package/dist/plugin/plugin-device.d.ts +0 -54
- package/dist/plugin/plugin-device.js +0 -413
- package/dist/plugin/plugin-device.js.map +0 -1
- package/dist/plugin/plugin-error.d.ts +0 -2
- package/dist/plugin/plugin-error.js +0 -7
- package/dist/plugin/plugin-error.js.map +0 -1
- package/dist/plugin/plugin-host-api.d.ts +0 -43
- package/dist/plugin/plugin-host-api.js +0 -177
- package/dist/plugin/plugin-host-api.js.map +0 -1
- package/dist/plugin/plugin-host.d.ts +0 -45
- package/dist/plugin/plugin-host.js +0 -398
- package/dist/plugin/plugin-host.js.map +0 -1
- package/dist/plugin/plugin-http.d.ts +0 -18
- package/dist/plugin/plugin-http.js +0 -120
- package/dist/plugin/plugin-http.js.map +0 -1
- package/dist/plugin/plugin-lazy-remote.d.ts +0 -31
- package/dist/plugin/plugin-lazy-remote.js +0 -75
- package/dist/plugin/plugin-lazy-remote.js.map +0 -1
- package/dist/plugin/plugin-npm-dependencies.d.ts +0 -8
- package/dist/plugin/plugin-npm-dependencies.js +0 -103
- package/dist/plugin/plugin-npm-dependencies.js.map +0 -1
- package/dist/plugin/plugin-remote-stats.d.ts +0 -8
- package/dist/plugin/plugin-remote-stats.js +0 -30
- package/dist/plugin/plugin-remote-stats.js.map +0 -1
- package/dist/plugin/plugin-remote-websocket.d.ts +0 -29
- package/dist/plugin/plugin-remote-websocket.js +0 -152
- package/dist/plugin/plugin-remote-websocket.js.map +0 -1
- package/dist/plugin/plugin-remote-worker.d.ts +0 -5
- package/dist/plugin/plugin-remote-worker.js +0 -348
- package/dist/plugin/plugin-remote-worker.js.map +0 -1
- package/dist/plugin/plugin-remote.d.ts +0 -75
- package/dist/plugin/plugin-remote.js +0 -598
- package/dist/plugin/plugin-remote.js.map +0 -1
- package/dist/plugin/plugin-repl.d.ts +0 -2
- package/dist/plugin/plugin-repl.js +0 -74
- package/dist/plugin/plugin-repl.js.map +0 -1
- package/dist/plugin/plugin-state-check.d.ts +0 -1
- package/dist/plugin/plugin-state-check.js +0 -27
- package/dist/plugin/plugin-state-check.js.map +0 -1
- package/dist/plugin/plugin-volume.d.ts +0 -3
- package/dist/plugin/plugin-volume.js +0 -31
- package/dist/plugin/plugin-volume.js.map +0 -1
- package/dist/plugin/runtime/child-process-worker.d.ts +0 -20
- package/dist/plugin/runtime/child-process-worker.js +0 -42
- package/dist/plugin/runtime/child-process-worker.js.map +0 -1
- package/dist/plugin/runtime/node-fork-worker.d.ts +0 -9
- package/dist/plugin/runtime/node-fork-worker.js +0 -67
- package/dist/plugin/runtime/node-fork-worker.js.map +0 -1
- package/dist/plugin/runtime/node-thread-worker.d.ts +0 -20
- package/dist/plugin/runtime/node-thread-worker.js +0 -73
- package/dist/plugin/runtime/node-thread-worker.js.map +0 -1
- package/dist/plugin/runtime/python-worker.d.ts +0 -10
- package/dist/plugin/runtime/python-worker.js +0 -91
- package/dist/plugin/runtime/python-worker.js.map +0 -1
- package/dist/plugin/runtime/runtime-worker.d.ts +0 -26
- package/dist/plugin/runtime/runtime-worker.js +0 -3
- package/dist/plugin/runtime/runtime-worker.js.map +0 -1
- package/dist/plugin/socket-serializer.d.ts +0 -5
- package/dist/plugin/socket-serializer.js +0 -17
- package/dist/plugin/socket-serializer.js.map +0 -1
- package/dist/plugin/system.d.ts +0 -39
- package/dist/plugin/system.js +0 -216
- package/dist/plugin/system.js.map +0 -1
- package/dist/rpc-buffer-serializer.d.ts +0 -11
- package/dist/rpc-buffer-serializer.js +0 -30
- package/dist/rpc-buffer-serializer.js.map +0 -1
- package/dist/rpc-serializer.d.ts +0 -24
- package/dist/rpc-serializer.js +0 -144
- package/dist/rpc-serializer.js.map +0 -1
- package/dist/rpc.d.ts +0 -147
- package/dist/rpc.js +0 -689
- package/dist/rpc.js.map +0 -1
- package/dist/runtime.d.ts +0 -103
- package/dist/runtime.js +0 -815
- package/dist/runtime.js.map +0 -1
- package/dist/scrypted-main-exports.d.ts +0 -6
- package/dist/scrypted-main-exports.js +0 -57
- package/dist/scrypted-main-exports.js.map +0 -1
- package/dist/scrypted-main.d.ts +0 -1
- package/dist/scrypted-main.js +0 -8
- package/dist/scrypted-main.js.map +0 -1
- package/dist/scrypted-plugin-main.d.ts +0 -2
- package/dist/scrypted-plugin-main.js +0 -43
- package/dist/scrypted-plugin-main.js.map +0 -1
- package/dist/scrypted-server-main.d.ts +0 -6
- package/dist/scrypted-server-main.js +0 -559
- package/dist/scrypted-server-main.js.map +0 -1
- package/dist/server-settings.d.ts +0 -5
- package/dist/server-settings.js +0 -91
- package/dist/server-settings.js.map +0 -1
- package/dist/services/addresses.d.ts +0 -7
- package/dist/services/addresses.js +0 -41
- package/dist/services/addresses.js.map +0 -1
- package/dist/services/alerts.d.ts +0 -9
- package/dist/services/alerts.js +0 -27
- package/dist/services/alerts.js.map +0 -1
- package/dist/services/cors.d.ts +0 -18
- package/dist/services/cors.js +0 -18
- package/dist/services/cors.js.map +0 -1
- package/dist/services/info.d.ts +0 -5
- package/dist/services/info.js +0 -18
- package/dist/services/info.js.map +0 -1
- package/dist/services/plugin.d.ts +0 -46
- package/dist/services/plugin.js +0 -172
- package/dist/services/plugin.js.map +0 -1
- package/dist/services/service-control.d.ts +0 -8
- package/dist/services/service-control.js +0 -39
- package/dist/services/service-control.js.map +0 -1
- package/dist/services/users.d.ts +0 -19
- package/dist/services/users.js +0 -75
- package/dist/services/users.js.map +0 -1
- package/dist/sleep.d.ts +0 -1
- package/dist/sleep.js +0 -8
- package/dist/sleep.js.map +0 -1
- package/dist/state.d.ts +0 -39
- package/dist/state.js +0 -247
- package/dist/state.js.map +0 -1
- package/dist/threading.d.ts +0 -3
- package/dist/threading.js +0 -93
- package/dist/threading.js.map +0 -1
- package/dist/usertoken.d.ts +0 -11
- package/dist/usertoken.js +0 -52
- package/dist/usertoken.js.map +0 -1
@@ -1,177 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.PluginHostAPI = void 0;
|
7
|
-
const types_1 = require("@scrypted/types");
|
8
|
-
const debounce_1 = __importDefault(require("lodash/debounce"));
|
9
|
-
const db_types_1 = require("../db-types");
|
10
|
-
const rpc_1 = require("../rpc");
|
11
|
-
const state_1 = require("../state");
|
12
|
-
const descriptor_1 = require("./descriptor");
|
13
|
-
const plugin_api_1 = require("./plugin-api");
|
14
|
-
const plugin_state_check_1 = require("./plugin-state-check");
|
15
|
-
class PluginHostAPI extends plugin_api_1.PluginAPIManagedListeners {
|
16
|
-
scrypted;
|
17
|
-
pluginHost;
|
18
|
-
mediaManager;
|
19
|
-
pluginId;
|
20
|
-
typesVersion;
|
21
|
-
descriptors;
|
22
|
-
propertyInterfaces;
|
23
|
-
[rpc_1.RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS] = [
|
24
|
-
'onMixinEvent',
|
25
|
-
'onDeviceEvent',
|
26
|
-
'setStorage',
|
27
|
-
'setDeviceProperty',
|
28
|
-
'requestRestart',
|
29
|
-
"setState",
|
30
|
-
];
|
31
|
-
restartDebounced = (0, debounce_1.default)(async () => {
|
32
|
-
const host = this.scrypted.plugins[this.pluginId];
|
33
|
-
if (host?.api !== this) {
|
34
|
-
const logger = await this.getLogger(undefined);
|
35
|
-
logger.log('w', 'plugin restart was requested, but a different instance was found. restart cancelled.');
|
36
|
-
return;
|
37
|
-
}
|
38
|
-
const plugin = await this.scrypted.datastore.tryGet(db_types_1.Plugin, this.pluginId);
|
39
|
-
this.scrypted.runPlugin(plugin);
|
40
|
-
}, 15000);
|
41
|
-
constructor(scrypted, pluginId, pluginHost, mediaManager) {
|
42
|
-
super();
|
43
|
-
this.scrypted = scrypted;
|
44
|
-
this.pluginHost = pluginHost;
|
45
|
-
this.mediaManager = mediaManager;
|
46
|
-
this.pluginId = pluginId;
|
47
|
-
}
|
48
|
-
// do we care about mixin validation here?
|
49
|
-
// maybe to prevent/notify errant dangling events?
|
50
|
-
async onMixinEvent(id, nativeIdOrMixinDevice, eventInterface, eventData) {
|
51
|
-
// nativeId code path has been deprecated in favor of mixin object 12/10/2021
|
52
|
-
const device = this.scrypted.findPluginDeviceById(id);
|
53
|
-
if (!nativeIdOrMixinDevice || typeof nativeIdOrMixinDevice === 'string') {
|
54
|
-
const nativeId = nativeIdOrMixinDevice;
|
55
|
-
// todo: deprecate this code path
|
56
|
-
const mixinProvider = this.scrypted.findPluginDevice(this.pluginId, nativeId);
|
57
|
-
const mixins = (0, state_1.getState)(device, types_1.ScryptedInterfaceProperty.mixins) || [];
|
58
|
-
if (!mixins.includes(mixinProvider._id))
|
59
|
-
throw new Error(`${mixinProvider._id} is not a mixin provider for ${id}`);
|
60
|
-
this.scrypted.findPluginDevice(this.pluginId, nativeId);
|
61
|
-
const tableEntry = this.scrypted.devices[device._id].handler.mixinTable.find(entry => entry.mixinProviderId === mixinProvider._id);
|
62
|
-
const { interfaces } = await tableEntry.entry;
|
63
|
-
if (!interfaces.has(eventInterface))
|
64
|
-
throw new Error(`${mixinProvider._id} does not mixin ${eventInterface} for ${id}`);
|
65
|
-
this.scrypted.stateManager.notifyInterfaceEvent(device, eventInterface, eventData);
|
66
|
-
}
|
67
|
-
else {
|
68
|
-
const mixin = nativeIdOrMixinDevice;
|
69
|
-
let mixinProviderId = await this.scrypted.devices[device._id]?.handler?.getMixinProviderId(id, mixin);
|
70
|
-
if (!mixinProviderId)
|
71
|
-
throw new Error(`${mixin} does not mixin ${eventInterface} for ${id}`);
|
72
|
-
if (mixinProviderId === true)
|
73
|
-
mixinProviderId = undefined;
|
74
|
-
// this.scrypted.stateManager.notifyInterfaceEvent(device, eventInterface, eventData);
|
75
|
-
this.scrypted.stateManager.notifyInterfaceEventFromMixin(device, eventInterface, eventData, mixinProviderId);
|
76
|
-
}
|
77
|
-
}
|
78
|
-
async getMediaManager() {
|
79
|
-
return this.mediaManager;
|
80
|
-
}
|
81
|
-
async getLogger(nativeId) {
|
82
|
-
const device = this.scrypted.findPluginDevice(this.pluginId, nativeId);
|
83
|
-
return this.scrypted.getDeviceLogger(device);
|
84
|
-
}
|
85
|
-
async getComponent(id) {
|
86
|
-
if (id === 'setAccessControlAllowOrigin') {
|
87
|
-
return async (options) => {
|
88
|
-
const { nativeId, origins } = options;
|
89
|
-
const device = this.scrypted.findPluginDevice(this.pluginId, nativeId);
|
90
|
-
if (!device)
|
91
|
-
throw new Error(`device not found for plugin id ${this.pluginId} native id ${nativeId}`);
|
92
|
-
return this.scrypted.corsControl.setCORS(device._id, origins);
|
93
|
-
};
|
94
|
-
}
|
95
|
-
return this.scrypted.getComponent(id);
|
96
|
-
}
|
97
|
-
setDeviceProperty(id, property, value) {
|
98
|
-
switch (property) {
|
99
|
-
case types_1.ScryptedInterfaceProperty.room:
|
100
|
-
case types_1.ScryptedInterfaceProperty.type:
|
101
|
-
case types_1.ScryptedInterfaceProperty.name:
|
102
|
-
const device = this.scrypted.findPluginDeviceById(id);
|
103
|
-
this.scrypted.stateManager.setPluginDeviceState(device, property, value);
|
104
|
-
this.scrypted.notifyPluginDeviceDescriptorChanged(device);
|
105
|
-
return;
|
106
|
-
default:
|
107
|
-
throw new Error(`Not allowed to set property ${property}`);
|
108
|
-
}
|
109
|
-
}
|
110
|
-
async setState(nativeId, key, value) {
|
111
|
-
(0, plugin_state_check_1.checkProperty)(key, value);
|
112
|
-
const { pluginId } = this;
|
113
|
-
const device = this.scrypted.findPluginDevice(pluginId, nativeId);
|
114
|
-
if (!device)
|
115
|
-
throw new Error(`device not found for plugin id ${pluginId} native id ${nativeId}`);
|
116
|
-
await this.scrypted.stateManager.setPluginDeviceStateFromMixin(device, key, value, this.propertyInterfaces?.[key], device._id);
|
117
|
-
}
|
118
|
-
async setStorage(nativeId, storage) {
|
119
|
-
const device = this.scrypted.findPluginDevice(this.pluginId, nativeId);
|
120
|
-
device.storage = storage;
|
121
|
-
this.scrypted.datastore.upsert(device);
|
122
|
-
this.scrypted.stateManager.notifyInterfaceEvent(device, 'Storage', undefined);
|
123
|
-
}
|
124
|
-
async onDevicesChanged(deviceManifest) {
|
125
|
-
const provider = this.scrypted.findPluginDevice(this.pluginId, deviceManifest.providerNativeId);
|
126
|
-
const existing = this.scrypted.findPluginDevices(this.pluginId).filter(p => p.state[types_1.ScryptedInterfaceProperty.providerId].value === provider._id);
|
127
|
-
const newIds = deviceManifest.devices.map(device => device.nativeId);
|
128
|
-
const toRemove = existing.filter(e => e.nativeId && !newIds.includes(e.nativeId));
|
129
|
-
for (const remove of toRemove) {
|
130
|
-
await this.scrypted.removeDevice(remove);
|
131
|
-
}
|
132
|
-
for (const upsert of deviceManifest.devices) {
|
133
|
-
upsert.providerNativeId = deviceManifest.providerNativeId;
|
134
|
-
const id = await this.pluginHost.upsertDevice(upsert);
|
135
|
-
this.scrypted.getDevice(id)?.probe().catch(() => { });
|
136
|
-
}
|
137
|
-
}
|
138
|
-
async onDeviceDiscovered(device) {
|
139
|
-
return this.pluginHost.upsertDevice(device);
|
140
|
-
}
|
141
|
-
async onDeviceRemoved(nativeId) {
|
142
|
-
await this.scrypted.removeDevice(this.scrypted.findPluginDevice(this.pluginId, nativeId));
|
143
|
-
}
|
144
|
-
async onDeviceEvent(nativeId, eventInterface, eventData) {
|
145
|
-
const plugin = this.scrypted.findPluginDevice(this.pluginId, nativeId);
|
146
|
-
this.scrypted.stateManager.notifyInterfaceEventFromMixin(plugin, eventInterface, eventData, plugin._id);
|
147
|
-
}
|
148
|
-
async getDeviceById(id) {
|
149
|
-
return this.scrypted.getDevice(id);
|
150
|
-
}
|
151
|
-
async listen(callback) {
|
152
|
-
return this.manageListener(this.scrypted.stateManager.listen(callback));
|
153
|
-
}
|
154
|
-
async listenDevice(id, event, callback) {
|
155
|
-
// const device = this.scrypted.findPluginDeviceById(id);
|
156
|
-
// if (device) {
|
157
|
-
// const self = this.scrypted.findPluginDevice(this.pluginId);
|
158
|
-
// this.scrypted.getDeviceLogger(self).log('i', `requested listen ${getState(device, ScryptedInterfaceProperty.name)} ${JSON.stringify(event)}`);
|
159
|
-
// }
|
160
|
-
return this.manageListener(this.scrypted.stateManager.listenDevice(id, event, callback));
|
161
|
-
}
|
162
|
-
async removeDevice(id) {
|
163
|
-
return this.scrypted.removeDevice(this.scrypted.findPluginDeviceById(id));
|
164
|
-
}
|
165
|
-
async requestRestart() {
|
166
|
-
const logger = await this.getLogger(undefined);
|
167
|
-
logger.log('i', 'plugin restart was requested');
|
168
|
-
return this.restartDebounced();
|
169
|
-
}
|
170
|
-
async setScryptedInterfaceDescriptors(typesVersion, descriptors) {
|
171
|
-
this.typesVersion = typesVersion;
|
172
|
-
this.descriptors = descriptors;
|
173
|
-
this.propertyInterfaces = (0, descriptor_1.getPropertyInterfaces)(descriptors);
|
174
|
-
}
|
175
|
-
}
|
176
|
-
exports.PluginHostAPI = PluginHostAPI;
|
177
|
-
//# sourceMappingURL=plugin-host-api.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"plugin-host-api.js","sourceRoot":"","sources":["../../src/plugin/plugin-host-api.ts"],"names":[],"mappings":"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"}
|
@@ -1,45 +0,0 @@
|
|
1
|
-
/// <reference types="node" />
|
2
|
-
/// <reference types="node" />
|
3
|
-
import { Device } from '@scrypted/types';
|
4
|
-
import { Duplex } from 'stream';
|
5
|
-
import WebSocket from 'ws';
|
6
|
-
import { Plugin } from '../db-types';
|
7
|
-
import { IOServer, IOServerSocket } from '../io';
|
8
|
-
import { Logger } from '../logger';
|
9
|
-
import { RpcPeer } from '../rpc';
|
10
|
-
import { ScryptedRuntime } from '../runtime';
|
11
|
-
import { AccessControls } from './acl';
|
12
|
-
import { PluginRemote } from './plugin-api';
|
13
|
-
import { ConsoleServer } from './plugin-console';
|
14
|
-
import { PluginDebug } from './plugin-debug';
|
15
|
-
import { PluginHostAPI } from './plugin-host-api';
|
16
|
-
import { RuntimeWorker } from './runtime/runtime-worker';
|
17
|
-
export declare class PluginHost {
|
18
|
-
worker: RuntimeWorker;
|
19
|
-
peer: RpcPeer;
|
20
|
-
pluginId: string;
|
21
|
-
module: Promise<any>;
|
22
|
-
scrypted: ScryptedRuntime;
|
23
|
-
remote: PluginRemote;
|
24
|
-
io: IOServer;
|
25
|
-
ws: {
|
26
|
-
[id: string]: WebSocket;
|
27
|
-
};
|
28
|
-
api: PluginHostAPI;
|
29
|
-
pluginName: string;
|
30
|
-
packageJson: any;
|
31
|
-
stats: {
|
32
|
-
cpuUsage: NodeJS.CpuUsage;
|
33
|
-
memoryUsage: NodeJS.MemoryUsage;
|
34
|
-
};
|
35
|
-
killed: boolean;
|
36
|
-
consoleServer: Promise<ConsoleServer>;
|
37
|
-
unzippedPath: string;
|
38
|
-
kill(): void;
|
39
|
-
toString(): string;
|
40
|
-
upsertDevice(upsert: Device): Promise<string>;
|
41
|
-
constructor(scrypted: ScryptedRuntime, plugin: Plugin, pluginDebug?: PluginDebug);
|
42
|
-
startPluginHost(logger: Logger, env: any, pluginDebug: PluginDebug): void;
|
43
|
-
createRpcIoPeer(socket: IOServerSocket, accessControls: AccessControls): Promise<PluginRemote>;
|
44
|
-
createRpcPeer(duplex: Duplex, accessControls: AccessControls): Promise<PluginRemote>;
|
45
|
-
}
|
@@ -1,398 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
-
if (k2 === undefined) k2 = k;
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
-
}
|
8
|
-
Object.defineProperty(o, k2, desc);
|
9
|
-
}) : (function(o, m, k, k2) {
|
10
|
-
if (k2 === undefined) k2 = k;
|
11
|
-
o[k2] = m[k];
|
12
|
-
}));
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
-
}) : function(o, v) {
|
16
|
-
o["default"] = v;
|
17
|
-
});
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
-
if (mod && mod.__esModule) return mod;
|
20
|
-
var result = {};
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
-
__setModuleDefault(result, mod);
|
23
|
-
return result;
|
24
|
-
};
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
-
};
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
-
exports.PluginHost = void 0;
|
30
|
-
const os_1 = __importDefault(require("os"));
|
31
|
-
const adm_zip_1 = __importDefault(require("adm-zip"));
|
32
|
-
const crypto_1 = __importDefault(require("crypto"));
|
33
|
-
const io = __importStar(require("engine.io"));
|
34
|
-
const fs_1 = __importDefault(require("fs"));
|
35
|
-
const mkdirp_1 = __importDefault(require("mkdirp"));
|
36
|
-
const path_1 = __importDefault(require("path"));
|
37
|
-
const rimraf_1 = __importDefault(require("rimraf"));
|
38
|
-
const rpc_1 = require("../rpc");
|
39
|
-
const rpc_serializer_1 = require("../rpc-serializer");
|
40
|
-
const sleep_1 = require("../sleep");
|
41
|
-
const media_1 = require("./media");
|
42
|
-
const plugin_api_1 = require("./plugin-api");
|
43
|
-
const plugin_console_1 = require("./plugin-console");
|
44
|
-
const plugin_host_api_1 = require("./plugin-host-api");
|
45
|
-
const plugin_lazy_remote_1 = require("./plugin-lazy-remote");
|
46
|
-
const plugin_remote_1 = require("./plugin-remote");
|
47
|
-
const plugin_remote_websocket_1 = require("./plugin-remote-websocket");
|
48
|
-
const plugin_volume_1 = require("./plugin-volume");
|
49
|
-
const serverVersion = require('../../package.json').version;
|
50
|
-
class PluginHost {
|
51
|
-
worker;
|
52
|
-
peer;
|
53
|
-
pluginId;
|
54
|
-
module;
|
55
|
-
scrypted;
|
56
|
-
remote;
|
57
|
-
io = new io.Server({
|
58
|
-
// object detection drag drop 4k can be massive.
|
59
|
-
// streaming support somehow?
|
60
|
-
maxHttpBufferSize: 20000000,
|
61
|
-
pingTimeout: 120000,
|
62
|
-
perMessageDeflate: true,
|
63
|
-
cors: (req, callback) => {
|
64
|
-
const header = this.scrypted.getAccessControlAllowOrigin(req.headers);
|
65
|
-
callback(undefined, {
|
66
|
-
origin: header,
|
67
|
-
credentials: true,
|
68
|
-
});
|
69
|
-
},
|
70
|
-
});
|
71
|
-
ws = {};
|
72
|
-
api;
|
73
|
-
pluginName;
|
74
|
-
packageJson;
|
75
|
-
stats;
|
76
|
-
killed = false;
|
77
|
-
consoleServer;
|
78
|
-
unzippedPath;
|
79
|
-
kill() {
|
80
|
-
this.killed = true;
|
81
|
-
this.api.removeListeners();
|
82
|
-
this.peer.kill('plugin killed');
|
83
|
-
this.worker.kill();
|
84
|
-
this.io.close();
|
85
|
-
for (const s of Object.values(this.ws)) {
|
86
|
-
s.close();
|
87
|
-
}
|
88
|
-
this.ws = {};
|
89
|
-
const deviceIds = new Set(Object.values(this.scrypted.pluginDevices).filter(d => d.pluginId === this.pluginId).map(d => d._id));
|
90
|
-
this.scrypted.invalidateMixins(deviceIds);
|
91
|
-
this.consoleServer.then(server => server.destroy());
|
92
|
-
}
|
93
|
-
toString() {
|
94
|
-
return this.pluginName || 'no plugin name';
|
95
|
-
}
|
96
|
-
async upsertDevice(upsert) {
|
97
|
-
const { pluginDevicePromise, interfacesChanged } = this.scrypted.upsertDevice(this.pluginId, upsert);
|
98
|
-
const pi = await pluginDevicePromise;
|
99
|
-
await this.remote.setNativeId(pi.nativeId, pi._id, pi.storage || {});
|
100
|
-
// fetch a new device instance if the descriptor changed.
|
101
|
-
// plugin may return the same instance.
|
102
|
-
// this avoids device and mixin churn.
|
103
|
-
// do this on next tick, after this call has returned an id, so the plugin can handle
|
104
|
-
// any subsequent requests.
|
105
|
-
process.nextTick(async () => {
|
106
|
-
let needInvalidate = interfacesChanged;
|
107
|
-
if (!needInvalidate) {
|
108
|
-
// may also need to invalidate if the the plugin did not previously return a device
|
109
|
-
// because it had not yet completed the discovery process.
|
110
|
-
const device = this.scrypted.devices[pi._id];
|
111
|
-
try {
|
112
|
-
if (device.handler?.mixinTable)
|
113
|
-
needInvalidate = !(await device.handler.mixinTable?.[device.handler.mixinTable.length - 1].entry).proxy;
|
114
|
-
}
|
115
|
-
catch (e) {
|
116
|
-
// device retrieval had previously failed, fetch again.
|
117
|
-
needInvalidate = true;
|
118
|
-
}
|
119
|
-
}
|
120
|
-
if (needInvalidate)
|
121
|
-
this.scrypted.invalidatePluginDevice(pi._id);
|
122
|
-
});
|
123
|
-
return pi._id;
|
124
|
-
}
|
125
|
-
constructor(scrypted, plugin, pluginDebug) {
|
126
|
-
this.scrypted = scrypted;
|
127
|
-
this.pluginId = plugin._id;
|
128
|
-
this.pluginName = plugin.packageJson?.name;
|
129
|
-
this.packageJson = plugin.packageJson;
|
130
|
-
let zipBuffer = Buffer.from(plugin.zip, 'base64');
|
131
|
-
// allow garbage collection of the base 64 contents
|
132
|
-
plugin = undefined;
|
133
|
-
const pluginDeviceId = scrypted.findPluginDevice(this.pluginId)._id;
|
134
|
-
const logger = scrypted.getDeviceLogger(scrypted.findPluginDevice(this.pluginId));
|
135
|
-
const volume = (0, plugin_volume_1.getScryptedVolume)();
|
136
|
-
const pluginVolume = (0, plugin_volume_1.ensurePluginVolume)(this.pluginId);
|
137
|
-
this.startPluginHost(logger, {
|
138
|
-
SCRYPTED_PLUGIN_VOLUME: pluginVolume,
|
139
|
-
}, pluginDebug);
|
140
|
-
this.io.on('connection', async (socket) => {
|
141
|
-
try {
|
142
|
-
const { accessControls, endpointRequest, pluginDevice, } = socket.request.scrypted;
|
143
|
-
try {
|
144
|
-
if (socket.request.url.indexOf('/engine.io/api') !== -1) {
|
145
|
-
if (socket.request.url.indexOf('/public') !== -1) {
|
146
|
-
socket.close();
|
147
|
-
return;
|
148
|
-
}
|
149
|
-
await this.createRpcIoPeer(socket, accessControls);
|
150
|
-
return;
|
151
|
-
}
|
152
|
-
}
|
153
|
-
catch (e) {
|
154
|
-
socket.close();
|
155
|
-
return;
|
156
|
-
}
|
157
|
-
const handler = this.scrypted.getDevice(pluginDevice._id);
|
158
|
-
// @ts-expect-error
|
159
|
-
const id = socket.id;
|
160
|
-
socket.on('message', message => {
|
161
|
-
this.remote.ioEvent(id, 'message', message);
|
162
|
-
});
|
163
|
-
socket.on('close', reason => {
|
164
|
-
this.remote.ioEvent(id, 'close');
|
165
|
-
});
|
166
|
-
// @ts-expect-error
|
167
|
-
await handler.onConnection(endpointRequest, new plugin_remote_websocket_1.WebSocketConnection(`io://${id}`, {
|
168
|
-
send(message) {
|
169
|
-
socket.send(message);
|
170
|
-
},
|
171
|
-
close(message) {
|
172
|
-
socket.close();
|
173
|
-
},
|
174
|
-
}));
|
175
|
-
}
|
176
|
-
catch (e) {
|
177
|
-
console.error('engine.io plugin error', e);
|
178
|
-
socket.close();
|
179
|
-
}
|
180
|
-
});
|
181
|
-
const self = this;
|
182
|
-
const { runtime } = this.packageJson.scrypted;
|
183
|
-
const mediaManager = runtime === 'python'
|
184
|
-
? new media_1.MediaManagerHostImpl(pluginDeviceId, () => scrypted.stateManager.getSystemState(), console, id => scrypted.getDevice(id))
|
185
|
-
: undefined;
|
186
|
-
this.api = new plugin_host_api_1.PluginHostAPI(scrypted, this.pluginId, this, mediaManager);
|
187
|
-
const zipDir = path_1.default.join(pluginVolume, 'zip');
|
188
|
-
const extractVersion = "1-";
|
189
|
-
const hash = extractVersion + crypto_1.default.createHash('md5').update(zipBuffer).digest().toString('hex');
|
190
|
-
const zipFilename = `${hash}.zip`;
|
191
|
-
const zipFile = path_1.default.join(zipDir, zipFilename);
|
192
|
-
this.unzippedPath = path_1.default.join(zipDir, 'unzipped');
|
193
|
-
{
|
194
|
-
const zipDirTmp = zipDir + '.tmp';
|
195
|
-
if (!fs_1.default.existsSync(zipFile)) {
|
196
|
-
rimraf_1.default.sync(zipDirTmp);
|
197
|
-
rimraf_1.default.sync(zipDir);
|
198
|
-
mkdirp_1.default.sync(zipDirTmp);
|
199
|
-
fs_1.default.writeFileSync(path_1.default.join(zipDirTmp, zipFilename), zipBuffer);
|
200
|
-
const admZip = new adm_zip_1.default(zipBuffer);
|
201
|
-
admZip.extractAllTo(path_1.default.join(zipDirTmp, 'unzipped'), true);
|
202
|
-
fs_1.default.renameSync(zipDirTmp, zipDir);
|
203
|
-
}
|
204
|
-
}
|
205
|
-
logger.log('i', `loading ${this.pluginName}`);
|
206
|
-
logger.log('i', 'pid ' + this.worker?.pid);
|
207
|
-
const remotePromise = (0, plugin_remote_1.setupPluginRemote)(this.peer, this.api, self.pluginId, { serverVersion }, () => this.scrypted.stateManager.getSystemState());
|
208
|
-
const init = (async () => {
|
209
|
-
const remote = await remotePromise;
|
210
|
-
for (const pluginDevice of scrypted.findPluginDevices(self.pluginId)) {
|
211
|
-
await remote.setNativeId(pluginDevice.nativeId, pluginDevice._id, pluginDevice.storage || {});
|
212
|
-
}
|
213
|
-
const waitDebug = pluginDebug?.waitDebug;
|
214
|
-
if (waitDebug) {
|
215
|
-
console.info('waiting for debugger...');
|
216
|
-
try {
|
217
|
-
await waitDebug;
|
218
|
-
console.info('debugger attached.');
|
219
|
-
await (0, sleep_1.sleep)(1000);
|
220
|
-
}
|
221
|
-
catch (e) {
|
222
|
-
console.error('debugger failed', e);
|
223
|
-
}
|
224
|
-
}
|
225
|
-
const fail = 'Plugin failed to load. View Console for more information.';
|
226
|
-
try {
|
227
|
-
const isPython = runtime === 'python';
|
228
|
-
const loadZipOptions = {
|
229
|
-
clusterId: scrypted.clusterId,
|
230
|
-
clusterSecret: scrypted.clusterSecret,
|
231
|
-
// if debugging, use a normalized path for sourcemap resolution, otherwise
|
232
|
-
// prefix with module path.
|
233
|
-
filename: isPython
|
234
|
-
? pluginDebug
|
235
|
-
? `${volume}/plugin.zip`
|
236
|
-
: zipFile
|
237
|
-
: pluginDebug
|
238
|
-
? '/plugin/main.nodejs.js'
|
239
|
-
: `/${this.pluginId}/main.nodejs.js`,
|
240
|
-
unzippedPath: this.unzippedPath,
|
241
|
-
};
|
242
|
-
// original implementation sent the zipBuffer, sending the zipFile name now.
|
243
|
-
// can switch back for non-local plugins.
|
244
|
-
const modulePromise = remote.loadZip(this.packageJson, zipFile, loadZipOptions);
|
245
|
-
// allow garbage collection of the zip buffer
|
246
|
-
zipBuffer = undefined;
|
247
|
-
const module = await modulePromise;
|
248
|
-
logger.log('i', `loaded ${this.pluginName}`);
|
249
|
-
logger.clearAlert(fail);
|
250
|
-
return { module, remote };
|
251
|
-
}
|
252
|
-
catch (e) {
|
253
|
-
logger.log('a', fail);
|
254
|
-
logger.log('e', `plugin load error ${e}`);
|
255
|
-
console.error('plugin load error', e);
|
256
|
-
throw e;
|
257
|
-
}
|
258
|
-
})();
|
259
|
-
this.module = init.then(({ module }) => module);
|
260
|
-
this.remote = new plugin_lazy_remote_1.LazyRemote(remotePromise, init.then(({ remote }) => remote));
|
261
|
-
init.catch(e => {
|
262
|
-
console.error('plugin failed to load', e);
|
263
|
-
this.api.removeListeners();
|
264
|
-
});
|
265
|
-
}
|
266
|
-
startPluginHost(logger, env, pluginDebug) {
|
267
|
-
let connected = true;
|
268
|
-
let { runtime } = this.packageJson.scrypted;
|
269
|
-
runtime ||= 'node';
|
270
|
-
const workerHost = this.scrypted.pluginHosts.get(runtime);
|
271
|
-
if (!workerHost)
|
272
|
-
throw new Error(`Unsupported Scrypted runtime: ${this.packageJson.scrypted.runtime}`);
|
273
|
-
this.worker = workerHost(this.scrypted.mainFilename, this.pluginId, {
|
274
|
-
env,
|
275
|
-
pluginDebug,
|
276
|
-
});
|
277
|
-
this.peer = new rpc_1.RpcPeer('host', this.pluginId, (message, reject, serializationContext) => {
|
278
|
-
if (connected) {
|
279
|
-
this.worker.send(message, reject, serializationContext);
|
280
|
-
}
|
281
|
-
else if (reject) {
|
282
|
-
reject(new Error('peer disconnected'));
|
283
|
-
}
|
284
|
-
});
|
285
|
-
this.worker.setupRpcPeer(this.peer);
|
286
|
-
this.worker.stdout.on('data', data => console.log(data.toString()));
|
287
|
-
this.worker.stderr.on('data', data => console.error(data.toString()));
|
288
|
-
let consoleHeader = `${os_1.default.platform()} ${os_1.default.arch()} ${os_1.default.version()}\nserver version: ${serverVersion}\nplugin version: ${this.pluginId} ${this.packageJson.version}\n`;
|
289
|
-
if (process.env.SCRYPTED_DOCKER_FLAVOR)
|
290
|
-
consoleHeader += `${process.env.SCRYPTED_DOCKER_FLAVOR}\n`;
|
291
|
-
this.consoleServer = (0, plugin_console_1.createConsoleServer)(this.worker.stdout, this.worker.stderr, consoleHeader);
|
292
|
-
const disconnect = () => {
|
293
|
-
connected = false;
|
294
|
-
this.peer.kill('plugin disconnected');
|
295
|
-
};
|
296
|
-
this.worker.on('close', () => {
|
297
|
-
logger.log('e', `${this.pluginName} close`);
|
298
|
-
disconnect();
|
299
|
-
});
|
300
|
-
this.worker.on('disconnect', () => {
|
301
|
-
logger.log('e', `${this.pluginName} disconnected`);
|
302
|
-
disconnect();
|
303
|
-
});
|
304
|
-
this.worker.on('exit', async (code, signal) => {
|
305
|
-
logger.log('e', `${this.pluginName} exited ${code} ${signal}`);
|
306
|
-
disconnect();
|
307
|
-
});
|
308
|
-
this.worker.on('error', e => {
|
309
|
-
logger.log('e', `${this.pluginName} error ${e}`);
|
310
|
-
disconnect();
|
311
|
-
});
|
312
|
-
this.worker.on('rpc', async (message, sendHandle) => {
|
313
|
-
const socket = sendHandle;
|
314
|
-
const { pluginId, username } = message;
|
315
|
-
const host = this.scrypted.plugins[pluginId];
|
316
|
-
if (!host) {
|
317
|
-
socket.destroy();
|
318
|
-
return;
|
319
|
-
}
|
320
|
-
try {
|
321
|
-
const accessControls = await this.scrypted.getAccessControls(username);
|
322
|
-
host.createRpcPeer(socket, accessControls);
|
323
|
-
}
|
324
|
-
catch (e) {
|
325
|
-
socket.destroy();
|
326
|
-
return;
|
327
|
-
}
|
328
|
-
});
|
329
|
-
// the plugin is expected to send process stats every 10 seconds.
|
330
|
-
// this can be used as a check for liveness.
|
331
|
-
let lastStats;
|
332
|
-
const statsInterval = setInterval(async () => {
|
333
|
-
// plugin may take a while to install, so wait
|
334
|
-
// for 1 stats report before starting the watchdog.
|
335
|
-
if (!lastStats)
|
336
|
-
return;
|
337
|
-
if (!pluginDebug && (lastStats + 60000 < Date.now())) {
|
338
|
-
const logger = await this.api.getLogger(undefined);
|
339
|
-
logger.log('e', 'plugin is unresponsive. restarting.');
|
340
|
-
this.api.requestRestart();
|
341
|
-
}
|
342
|
-
}, 60000);
|
343
|
-
this.peer.killed.finally(() => clearInterval(statsInterval));
|
344
|
-
this.peer.params.updateStats = (stats) => {
|
345
|
-
lastStats = Date.now();
|
346
|
-
this.stats = stats;
|
347
|
-
};
|
348
|
-
}
|
349
|
-
async createRpcIoPeer(socket, accessControls) {
|
350
|
-
const serializer = (0, rpc_serializer_1.createRpcSerializer)({
|
351
|
-
sendMessageBuffer: buffer => socket.send(buffer),
|
352
|
-
sendMessageFinish: message => socket.send(JSON.stringify(message)),
|
353
|
-
});
|
354
|
-
socket.on('message', data => {
|
355
|
-
if (data.constructor === Buffer || data.constructor === ArrayBuffer) {
|
356
|
-
serializer.onMessageBuffer(Buffer.from(data));
|
357
|
-
}
|
358
|
-
else {
|
359
|
-
serializer.onMessageFinish(JSON.parse(data));
|
360
|
-
}
|
361
|
-
});
|
362
|
-
const rpcPeer = new rpc_1.RpcPeer(`api/${this.pluginId}`, 'engine.io', (message, reject, serializationContext) => {
|
363
|
-
try {
|
364
|
-
serializer.sendMessage(message, reject, serializationContext);
|
365
|
-
}
|
366
|
-
catch (e) {
|
367
|
-
reject?.(e);
|
368
|
-
}
|
369
|
-
});
|
370
|
-
rpcPeer.tags.acl = accessControls;
|
371
|
-
serializer.setupRpcPeer(rpcPeer);
|
372
|
-
// wrap the host api with a connection specific api that can be torn down on disconnect
|
373
|
-
const createMediaManager = await this.peer.getParam('createMediaManager');
|
374
|
-
const api = new plugin_api_1.PluginAPIProxy(this.api, await createMediaManager());
|
375
|
-
api.acl = accessControls;
|
376
|
-
const kill = () => {
|
377
|
-
serializer.onDisconnected();
|
378
|
-
api.removeListeners();
|
379
|
-
};
|
380
|
-
socket.on('close', kill);
|
381
|
-
socket.on('error', kill);
|
382
|
-
return (0, plugin_remote_1.setupPluginRemote)(rpcPeer, api, null, { serverVersion }, () => this.scrypted.stateManager.getSystemState());
|
383
|
-
}
|
384
|
-
async createRpcPeer(duplex, accessControls) {
|
385
|
-
const rpcPeer = (0, rpc_serializer_1.createDuplexRpcPeer)(`api/${this.pluginId}`, 'duplex', duplex, duplex);
|
386
|
-
rpcPeer.tags.acl = accessControls;
|
387
|
-
// wrap the host api with a connection specific api that can be torn down on disconnect
|
388
|
-
const createMediaManager = await this.peer.getParam('createMediaManager');
|
389
|
-
const api = new plugin_api_1.PluginAPIProxy(this.api, await createMediaManager());
|
390
|
-
const kill = () => {
|
391
|
-
api.removeListeners();
|
392
|
-
};
|
393
|
-
duplex.on('close', kill);
|
394
|
-
return (0, plugin_remote_1.setupPluginRemote)(rpcPeer, api, null, { serverVersion }, () => this.scrypted.stateManager.getSystemState());
|
395
|
-
}
|
396
|
-
}
|
397
|
-
exports.PluginHost = PluginHost;
|
398
|
-
//# sourceMappingURL=plugin-host.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"plugin-host.js","sourceRoot":"","sources":["../../src/plugin/plugin-host.ts"],"names":[],"mappings":"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"}
|