@scrypted/server 0.7.93 → 0.7.95
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/dist/asynciterable-utils.d.ts +2 -0
- package/dist/asynciterable-utils.js +24 -0
- package/dist/asynciterable-utils.js.map +1 -0
- package/dist/cert.d.ts +6 -0
- package/dist/cert.js +75 -0
- package/dist/cert.js.map +1 -0
- package/dist/collection.d.ts +1 -0
- package/dist/collection.js +16 -0
- package/dist/collection.js.map +1 -0
- package/dist/db-types.d.ts +38 -0
- package/dist/db-types.js +45 -0
- package/dist/db-types.js.map +1 -0
- package/dist/event-registry.d.ts +19 -0
- package/dist/event-registry.js +92 -0
- package/dist/event-registry.js.map +1 -0
- package/dist/http-interfaces.d.ts +3 -0
- package/dist/http-interfaces.js +73 -0
- package/dist/http-interfaces.js.map +1 -0
- package/dist/infer-defaults.d.ts +11 -0
- package/dist/infer-defaults.js +119 -0
- package/dist/infer-defaults.js.map +1 -0
- package/dist/io.d.ts +22 -0
- package/dist/io.js +3 -0
- package/dist/io.js.map +1 -0
- package/dist/level.d.ts +110 -0
- package/dist/level.js +135 -0
- package/dist/level.js.map +1 -0
- package/dist/listen-zero.d.ts +13 -0
- package/dist/listen-zero.js +48 -0
- package/dist/listen-zero.js.map +1 -0
- package/dist/logger.d.ts +29 -0
- package/dist/logger.js +78 -0
- package/dist/logger.js.map +1 -0
- package/dist/media-helpers.d.ts +5 -0
- package/dist/media-helpers.js +89 -0
- package/dist/media-helpers.js.map +1 -0
- package/dist/mixin/mixin-cycle.d.ts +3 -0
- package/dist/mixin/mixin-cycle.js +32 -0
- package/dist/mixin/mixin-cycle.js.map +1 -0
- package/dist/plugin/acl.d.ts +16 -0
- package/dist/plugin/acl.js +83 -0
- package/dist/plugin/acl.js.map +1 -0
- package/dist/plugin/descriptor.d.ts +22 -0
- package/dist/plugin/descriptor.js +35 -0
- package/dist/plugin/descriptor.js.map +1 -0
- package/dist/plugin/media.d.ts +71 -0
- package/dist/plugin/media.js +420 -0
- package/dist/plugin/media.js.map +1 -0
- package/dist/plugin/mediaobject.d.ts +10 -0
- package/dist/plugin/mediaobject.js +26 -0
- package/dist/plugin/mediaobject.js.map +1 -0
- package/dist/plugin/plugin-api.d.ts +106 -0
- package/dist/plugin/plugin-api.js +120 -0
- package/dist/plugin/plugin-api.js.map +1 -0
- package/dist/plugin/plugin-console.d.ts +28 -0
- package/dist/plugin/plugin-console.js +291 -0
- package/dist/plugin/plugin-console.js.map +1 -0
- package/dist/plugin/plugin-debug.d.ts +4 -0
- package/dist/plugin/plugin-debug.js +3 -0
- package/dist/plugin/plugin-debug.js.map +1 -0
- package/dist/plugin/plugin-device.d.ts +54 -0
- package/dist/plugin/plugin-device.js +413 -0
- package/dist/plugin/plugin-device.js.map +1 -0
- package/dist/plugin/plugin-error.d.ts +2 -0
- package/dist/plugin/plugin-error.js +7 -0
- package/dist/plugin/plugin-error.js.map +1 -0
- package/dist/plugin/plugin-host-api.d.ts +43 -0
- package/dist/plugin/plugin-host-api.js +179 -0
- package/dist/plugin/plugin-host-api.js.map +1 -0
- package/dist/plugin/plugin-host.d.ts +45 -0
- package/dist/plugin/plugin-host.js +398 -0
- package/dist/plugin/plugin-host.js.map +1 -0
- package/dist/plugin/plugin-http.d.ts +18 -0
- package/dist/plugin/plugin-http.js +120 -0
- package/dist/plugin/plugin-http.js.map +1 -0
- package/dist/plugin/plugin-lazy-remote.d.ts +31 -0
- package/dist/plugin/plugin-lazy-remote.js +75 -0
- package/dist/plugin/plugin-lazy-remote.js.map +1 -0
- package/dist/plugin/plugin-npm-dependencies.d.ts +8 -0
- package/dist/plugin/plugin-npm-dependencies.js +103 -0
- package/dist/plugin/plugin-npm-dependencies.js.map +1 -0
- package/dist/plugin/plugin-remote-stats.d.ts +8 -0
- package/dist/plugin/plugin-remote-stats.js +30 -0
- package/dist/plugin/plugin-remote-stats.js.map +1 -0
- package/dist/plugin/plugin-remote-websocket.d.ts +29 -0
- package/dist/plugin/plugin-remote-websocket.js +152 -0
- package/dist/plugin/plugin-remote-websocket.js.map +1 -0
- package/dist/plugin/plugin-remote-worker.d.ts +5 -0
- package/dist/plugin/plugin-remote-worker.js +348 -0
- package/dist/plugin/plugin-remote-worker.js.map +1 -0
- package/dist/plugin/plugin-remote.d.ts +75 -0
- package/dist/plugin/plugin-remote.js +598 -0
- package/dist/plugin/plugin-remote.js.map +1 -0
- package/dist/plugin/plugin-repl.d.ts +2 -0
- package/dist/plugin/plugin-repl.js +74 -0
- package/dist/plugin/plugin-repl.js.map +1 -0
- package/dist/plugin/plugin-state-check.d.ts +1 -0
- package/dist/plugin/plugin-state-check.js +27 -0
- package/dist/plugin/plugin-state-check.js.map +1 -0
- package/dist/plugin/plugin-volume.d.ts +3 -0
- package/dist/plugin/plugin-volume.js +31 -0
- package/dist/plugin/plugin-volume.js.map +1 -0
- package/dist/plugin/runtime/child-process-worker.d.ts +20 -0
- package/dist/plugin/runtime/child-process-worker.js +42 -0
- package/dist/plugin/runtime/child-process-worker.js.map +1 -0
- package/dist/plugin/runtime/node-fork-worker.d.ts +9 -0
- package/dist/plugin/runtime/node-fork-worker.js +67 -0
- package/dist/plugin/runtime/node-fork-worker.js.map +1 -0
- package/dist/plugin/runtime/node-thread-worker.d.ts +20 -0
- package/dist/plugin/runtime/node-thread-worker.js +73 -0
- package/dist/plugin/runtime/node-thread-worker.js.map +1 -0
- package/dist/plugin/runtime/python-worker.d.ts +10 -0
- package/dist/plugin/runtime/python-worker.js +91 -0
- package/dist/plugin/runtime/python-worker.js.map +1 -0
- package/dist/plugin/runtime/runtime-worker.d.ts +26 -0
- package/dist/plugin/runtime/runtime-worker.js +3 -0
- package/dist/plugin/runtime/runtime-worker.js.map +1 -0
- package/dist/plugin/socket-serializer.d.ts +5 -0
- package/dist/plugin/socket-serializer.js +17 -0
- package/dist/plugin/socket-serializer.js.map +1 -0
- package/dist/plugin/system.d.ts +39 -0
- package/dist/plugin/system.js +216 -0
- package/dist/plugin/system.js.map +1 -0
- package/dist/rpc-buffer-serializer.d.ts +11 -0
- package/dist/rpc-buffer-serializer.js +30 -0
- package/dist/rpc-buffer-serializer.js.map +1 -0
- package/dist/rpc-serializer.d.ts +24 -0
- package/dist/rpc-serializer.js +144 -0
- package/dist/rpc-serializer.js.map +1 -0
- package/dist/rpc.d.ts +147 -0
- package/dist/rpc.js +689 -0
- package/dist/rpc.js.map +1 -0
- package/dist/runtime.d.ts +103 -0
- package/dist/runtime.js +815 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scrypted-main-exports.d.ts +6 -0
- package/dist/scrypted-main-exports.js +57 -0
- package/dist/scrypted-main-exports.js.map +1 -0
- package/dist/scrypted-main.d.ts +1 -0
- package/dist/scrypted-main.js +8 -0
- package/dist/scrypted-main.js.map +1 -0
- package/dist/scrypted-plugin-main.d.ts +2 -0
- package/dist/scrypted-plugin-main.js +43 -0
- package/dist/scrypted-plugin-main.js.map +1 -0
- package/dist/scrypted-server-main.d.ts +6 -0
- package/dist/scrypted-server-main.js +559 -0
- package/dist/scrypted-server-main.js.map +1 -0
- package/dist/server-settings.d.ts +5 -0
- package/dist/server-settings.js +91 -0
- package/dist/server-settings.js.map +1 -0
- package/dist/services/addresses.d.ts +7 -0
- package/dist/services/addresses.js +43 -0
- package/dist/services/addresses.js.map +1 -0
- package/dist/services/alerts.d.ts +9 -0
- package/dist/services/alerts.js +27 -0
- package/dist/services/alerts.js.map +1 -0
- package/dist/services/cors.d.ts +18 -0
- package/dist/services/cors.js +18 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/info.d.ts +5 -0
- package/dist/services/info.js +18 -0
- package/dist/services/info.js.map +1 -0
- package/dist/services/plugin.d.ts +46 -0
- package/dist/services/plugin.js +172 -0
- package/dist/services/plugin.js.map +1 -0
- package/dist/services/service-control.d.ts +8 -0
- package/dist/services/service-control.js +39 -0
- package/dist/services/service-control.js.map +1 -0
- package/dist/services/users.d.ts +19 -0
- package/dist/services/users.js +75 -0
- package/dist/services/users.js.map +1 -0
- package/dist/sleep.d.ts +1 -0
- package/dist/sleep.js +8 -0
- package/dist/sleep.js.map +1 -0
- package/dist/state.d.ts +39 -0
- package/dist/state.js +247 -0
- package/dist/state.js.map +1 -0
- package/dist/threading.d.ts +3 -0
- package/dist/threading.js +93 -0
- package/dist/threading.js.map +1 -0
- package/dist/usertoken.d.ts +11 -0
- package/dist/usertoken.js +52 -0
- package/dist/usertoken.js.map +1 -0
- package/package.json +2 -2
- package/src/plugin/plugin-host-api.ts +3 -1
@@ -0,0 +1,598 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.attachPluginRemote = exports.setupPluginRemote = exports.DeviceManagerImpl = void 0;
|
4
|
+
const types_1 = require("@scrypted/types");
|
5
|
+
const rpc_1 = require("../rpc");
|
6
|
+
const rpc_buffer_serializer_1 = require("../rpc-buffer-serializer");
|
7
|
+
const plugin_remote_websocket_1 = require("./plugin-remote-websocket");
|
8
|
+
const plugin_state_check_1 = require("./plugin-state-check");
|
9
|
+
const system_1 = require("./system");
|
10
|
+
class DeviceLogger {
|
11
|
+
console;
|
12
|
+
nativeId;
|
13
|
+
api;
|
14
|
+
logger;
|
15
|
+
constructor(api, nativeId, console) {
|
16
|
+
this.console = console;
|
17
|
+
this.api = api;
|
18
|
+
this.nativeId = nativeId;
|
19
|
+
}
|
20
|
+
async ensureLogger() {
|
21
|
+
if (!this.logger)
|
22
|
+
this.logger = this.api.getLogger(this.nativeId);
|
23
|
+
return await this.logger;
|
24
|
+
}
|
25
|
+
async log(level, message) {
|
26
|
+
(await this.ensureLogger()).log(level, message);
|
27
|
+
}
|
28
|
+
a(msg) {
|
29
|
+
this.log('a', msg);
|
30
|
+
}
|
31
|
+
async clear() {
|
32
|
+
(await this.ensureLogger()).clear();
|
33
|
+
}
|
34
|
+
async clearAlert(msg) {
|
35
|
+
(await this.ensureLogger()).clearAlert(msg);
|
36
|
+
}
|
37
|
+
async clearAlerts() {
|
38
|
+
(await this.ensureLogger()).clearAlerts();
|
39
|
+
}
|
40
|
+
d(msg) {
|
41
|
+
this.log('d', msg);
|
42
|
+
}
|
43
|
+
e(msg) {
|
44
|
+
this.log('e', msg);
|
45
|
+
}
|
46
|
+
i(msg) {
|
47
|
+
this.log('i', msg);
|
48
|
+
}
|
49
|
+
v(msg) {
|
50
|
+
this.log('v', msg);
|
51
|
+
}
|
52
|
+
w(msg) {
|
53
|
+
this.log('w', msg);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
class EndpointManagerImpl {
|
57
|
+
deviceManager;
|
58
|
+
api;
|
59
|
+
pluginId;
|
60
|
+
mediaManager;
|
61
|
+
getEndpoint(nativeId) {
|
62
|
+
if (!nativeId)
|
63
|
+
return this.pluginId;
|
64
|
+
const id = this.deviceManager.nativeIds.get(nativeId)?.id;
|
65
|
+
if (!id)
|
66
|
+
throw new Error('invalid nativeId ' + nativeId);
|
67
|
+
if (!nativeId)
|
68
|
+
return this.pluginId;
|
69
|
+
return id;
|
70
|
+
}
|
71
|
+
async getUrlSafeIp() {
|
72
|
+
// ipv6 addresses have colons and need to be bracketed for url safety
|
73
|
+
const ip = await this.api.getComponent('SCRYPTED_IP_ADDRESS');
|
74
|
+
return ip?.includes(':') ? `[${ip}]` : ip;
|
75
|
+
}
|
76
|
+
/**
|
77
|
+
* @deprecated
|
78
|
+
*/
|
79
|
+
async getAuthenticatedPath(nativeId) {
|
80
|
+
return this.getPath(nativeId);
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* @deprecated
|
84
|
+
*/
|
85
|
+
async getInsecurePublicLocalEndpoint(nativeId) {
|
86
|
+
return this.getLocalEndpoint(nativeId, {
|
87
|
+
insecure: true,
|
88
|
+
public: true,
|
89
|
+
});
|
90
|
+
}
|
91
|
+
/**
|
92
|
+
* @deprecated
|
93
|
+
*/
|
94
|
+
async getPublicCloudEndpoint(nativeId) {
|
95
|
+
return this.getCloudEndpoint(nativeId, {
|
96
|
+
public: true,
|
97
|
+
});
|
98
|
+
}
|
99
|
+
/**
|
100
|
+
* @deprecated
|
101
|
+
*/
|
102
|
+
async getPublicLocalEndpoint(nativeId) {
|
103
|
+
return this.getLocalEndpoint(nativeId, {
|
104
|
+
public: true,
|
105
|
+
});
|
106
|
+
}
|
107
|
+
/**
|
108
|
+
* @deprecated
|
109
|
+
*/
|
110
|
+
async getPublicPushEndpoint(nativeId) {
|
111
|
+
const mo = await this.mediaManager.createMediaObject(Buffer.from(this.getEndpoint(nativeId)), types_1.ScryptedMimeTypes.PushEndpoint);
|
112
|
+
return this.mediaManager.convertMediaObjectToUrl(mo, types_1.ScryptedMimeTypes.PushEndpoint);
|
113
|
+
}
|
114
|
+
async getPath(nativeId, options) {
|
115
|
+
return `/endpoint/${this.getEndpoint(nativeId)}/${options?.public ? 'public/' : ''}`;
|
116
|
+
}
|
117
|
+
async getLocalEndpoint(nativeId, options) {
|
118
|
+
const protocol = options?.insecure ? 'http' : 'https';
|
119
|
+
const port = await this.api.getComponent(options?.insecure ? 'SCRYPTED_INSECURE_PORT' : 'SCRYPTED_SECURE_PORT');
|
120
|
+
const path = await this.getPath(nativeId, options);
|
121
|
+
const url = `${protocol}://${await this.getUrlSafeIp()}:${port}${path}`;
|
122
|
+
return url;
|
123
|
+
}
|
124
|
+
async getCloudEndpoint(nativeId, options) {
|
125
|
+
const local = await this.getLocalEndpoint(nativeId, options);
|
126
|
+
const mo = await this.mediaManager.createMediaObject(Buffer.from(local), types_1.ScryptedMimeTypes.LocalUrl);
|
127
|
+
return this.mediaManager.convertMediaObjectToUrl(mo, types_1.ScryptedMimeTypes.LocalUrl);
|
128
|
+
}
|
129
|
+
async getCloudPushEndpoint(nativeId) {
|
130
|
+
const mo = await this.mediaManager.createMediaObject(Buffer.from(this.getEndpoint(nativeId)), types_1.ScryptedMimeTypes.PushEndpoint);
|
131
|
+
return this.mediaManager.convertMediaObjectToUrl(mo, types_1.ScryptedMimeTypes.PushEndpoint);
|
132
|
+
}
|
133
|
+
async setLocalAddresses(addresses) {
|
134
|
+
const addressSettings = await this.api.getComponent('addresses');
|
135
|
+
return addressSettings.setLocalAddresses(addresses);
|
136
|
+
}
|
137
|
+
async getLocalAddresses() {
|
138
|
+
const addressSettings = await this.api.getComponent('addresses');
|
139
|
+
return await addressSettings.getLocalAddresses();
|
140
|
+
}
|
141
|
+
async setAccessControlAllowOrigin(options) {
|
142
|
+
const self = this;
|
143
|
+
const setAccessControlAllowOrigin = await this.deviceManager.systemManager.getComponent('setAccessControlAllowOrigin');
|
144
|
+
return setAccessControlAllowOrigin(options);
|
145
|
+
}
|
146
|
+
}
|
147
|
+
class DeviceStateProxyHandler {
|
148
|
+
deviceManager;
|
149
|
+
id;
|
150
|
+
setState;
|
151
|
+
constructor(deviceManager, id, setState) {
|
152
|
+
this.deviceManager = deviceManager;
|
153
|
+
this.id = id;
|
154
|
+
this.setState = setState;
|
155
|
+
}
|
156
|
+
get(target, p, receiver) {
|
157
|
+
if (p === 'id')
|
158
|
+
return this.id;
|
159
|
+
if (p === rpc_1.RpcPeer.PROPERTY_PROXY_PROPERTIES)
|
160
|
+
return { id: this.id };
|
161
|
+
if (p === 'setState')
|
162
|
+
return this.setState;
|
163
|
+
return this.deviceManager.systemManager.state[this.id][p]?.value;
|
164
|
+
}
|
165
|
+
set(target, p, value, receiver) {
|
166
|
+
(0, plugin_state_check_1.checkProperty)(p.toString(), value);
|
167
|
+
const now = Date.now();
|
168
|
+
this.deviceManager.systemManager.state[this.id][p] = {
|
169
|
+
value,
|
170
|
+
};
|
171
|
+
this.setState(p.toString(), value);
|
172
|
+
return true;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
class DeviceManagerImpl {
|
176
|
+
systemManager;
|
177
|
+
getDeviceConsole;
|
178
|
+
getMixinConsole;
|
179
|
+
api;
|
180
|
+
nativeIds = new Map();
|
181
|
+
deviceStorage = new Map();
|
182
|
+
mixinStorage = new Map();
|
183
|
+
constructor(systemManager, getDeviceConsole, getMixinConsole) {
|
184
|
+
this.systemManager = systemManager;
|
185
|
+
this.getDeviceConsole = getDeviceConsole;
|
186
|
+
this.getMixinConsole = getMixinConsole;
|
187
|
+
}
|
188
|
+
async requestRestart() {
|
189
|
+
return this.api.requestRestart();
|
190
|
+
}
|
191
|
+
getDeviceLogger(nativeId) {
|
192
|
+
return new DeviceLogger(this.api, nativeId, this.getDeviceConsole?.(nativeId) || console);
|
193
|
+
}
|
194
|
+
getDeviceState(nativeId) {
|
195
|
+
const handler = new DeviceStateProxyHandler(this, this.nativeIds.get(nativeId).id, (property, value) => this.api.setState(nativeId, property, value));
|
196
|
+
return new Proxy(handler, handler);
|
197
|
+
}
|
198
|
+
createDeviceState(id, setState) {
|
199
|
+
const handler = new DeviceStateProxyHandler(this, id, setState);
|
200
|
+
return new Proxy(handler, handler);
|
201
|
+
}
|
202
|
+
getDeviceStorage(nativeId) {
|
203
|
+
let ret = this.deviceStorage.get(nativeId);
|
204
|
+
if (!ret) {
|
205
|
+
ret = new StorageImpl(this, nativeId);
|
206
|
+
this.deviceStorage.set(nativeId, ret);
|
207
|
+
}
|
208
|
+
return ret;
|
209
|
+
}
|
210
|
+
getMixinStorage(id, nativeId) {
|
211
|
+
let ms = this.mixinStorage.get(nativeId);
|
212
|
+
if (!ms) {
|
213
|
+
ms = new Map();
|
214
|
+
this.mixinStorage.set(nativeId, ms);
|
215
|
+
}
|
216
|
+
let ret = ms.get(id);
|
217
|
+
if (!ret) {
|
218
|
+
ret = new StorageImpl(this, nativeId, `mixin:${id}:`);
|
219
|
+
ms.set(id, ret);
|
220
|
+
}
|
221
|
+
return ret;
|
222
|
+
}
|
223
|
+
pruneMixinStorage() {
|
224
|
+
for (const nativeId of this.nativeIds.keys()) {
|
225
|
+
const storage = this.nativeIds.get(nativeId).storage;
|
226
|
+
for (const key of Object.keys(storage)) {
|
227
|
+
if (!key.startsWith('mixin:'))
|
228
|
+
continue;
|
229
|
+
const [, id,] = key.split(':');
|
230
|
+
// there's no rush to persist this, it will happen automatically on the plugin
|
231
|
+
// persisting something at some point.
|
232
|
+
// the key itself is unreachable due to the device no longer existing.
|
233
|
+
if (id && !this.systemManager.state[id])
|
234
|
+
delete storage[key];
|
235
|
+
}
|
236
|
+
}
|
237
|
+
}
|
238
|
+
async onMixinEvent(id, nativeId, eventInterface, eventData) {
|
239
|
+
return this.api.onMixinEvent(id, nativeId, eventInterface, eventData);
|
240
|
+
}
|
241
|
+
getNativeIds() {
|
242
|
+
return Array.from(this.nativeIds.keys());
|
243
|
+
}
|
244
|
+
async onDeviceDiscovered(device) {
|
245
|
+
return this.api.onDeviceDiscovered(device);
|
246
|
+
}
|
247
|
+
async onDeviceRemoved(nativeId) {
|
248
|
+
return this.api.onDeviceRemoved(nativeId);
|
249
|
+
}
|
250
|
+
async onDeviceEvent(nativeId, eventInterface, eventData) {
|
251
|
+
return this.api.onDeviceEvent(nativeId, eventInterface, eventData);
|
252
|
+
}
|
253
|
+
async onDevicesChanged(devices) {
|
254
|
+
return this.api.onDevicesChanged(devices);
|
255
|
+
}
|
256
|
+
}
|
257
|
+
exports.DeviceManagerImpl = DeviceManagerImpl;
|
258
|
+
function toStorageString(value) {
|
259
|
+
if (value === null)
|
260
|
+
return 'null';
|
261
|
+
if (value === undefined)
|
262
|
+
return 'undefined';
|
263
|
+
return value.toString();
|
264
|
+
}
|
265
|
+
class StorageImpl {
|
266
|
+
deviceManager;
|
267
|
+
nativeId;
|
268
|
+
prefix;
|
269
|
+
api;
|
270
|
+
static allowedMethods = [
|
271
|
+
'length',
|
272
|
+
'clear',
|
273
|
+
'getItem',
|
274
|
+
'setItem',
|
275
|
+
'key',
|
276
|
+
'removeItem',
|
277
|
+
];
|
278
|
+
static indexedHandler = {
|
279
|
+
get(target, property) {
|
280
|
+
const keyString = property.toString();
|
281
|
+
if (StorageImpl.allowedMethods.includes(keyString)) {
|
282
|
+
const f = target[keyString];
|
283
|
+
if (keyString === 'length')
|
284
|
+
return f;
|
285
|
+
return f.bind(target);
|
286
|
+
}
|
287
|
+
return target.getItem(toStorageString(property));
|
288
|
+
},
|
289
|
+
set(target, property, value) {
|
290
|
+
target.setItem(toStorageString(property), value);
|
291
|
+
return true;
|
292
|
+
}
|
293
|
+
};
|
294
|
+
constructor(deviceManager, nativeId, prefix) {
|
295
|
+
this.deviceManager = deviceManager;
|
296
|
+
this.nativeId = nativeId;
|
297
|
+
this.prefix = prefix;
|
298
|
+
this.deviceManager = deviceManager;
|
299
|
+
this.api = deviceManager.api;
|
300
|
+
this.nativeId = nativeId;
|
301
|
+
if (!this.prefix)
|
302
|
+
this.prefix = '';
|
303
|
+
return new Proxy(this, StorageImpl.indexedHandler);
|
304
|
+
}
|
305
|
+
get storage() {
|
306
|
+
return this.deviceManager.nativeIds.get(this.nativeId).storage;
|
307
|
+
}
|
308
|
+
get length() {
|
309
|
+
return Object.keys(this.storage).filter(key => key.startsWith(this.prefix)).length;
|
310
|
+
}
|
311
|
+
clear() {
|
312
|
+
if (!this.prefix) {
|
313
|
+
this.deviceManager.nativeIds.get(this.nativeId).storage = {};
|
314
|
+
}
|
315
|
+
else {
|
316
|
+
const storage = this.storage;
|
317
|
+
Object.keys(this.storage).filter(key => key.startsWith(this.prefix)).forEach(key => delete storage[key]);
|
318
|
+
}
|
319
|
+
this.api.setStorage(this.nativeId, this.storage);
|
320
|
+
}
|
321
|
+
getItem(key) {
|
322
|
+
return this.storage[this.prefix + key];
|
323
|
+
}
|
324
|
+
key(index) {
|
325
|
+
if (!this.prefix) {
|
326
|
+
return Object.keys(this.storage)[index];
|
327
|
+
}
|
328
|
+
return Object.keys(this.storage).filter(key => key.startsWith(this.prefix))[index].substring(this.prefix.length);
|
329
|
+
}
|
330
|
+
removeItem(key) {
|
331
|
+
delete this.storage[this.prefix + key];
|
332
|
+
this.api.setStorage(this.nativeId, this.storage);
|
333
|
+
}
|
334
|
+
setItem(key, value) {
|
335
|
+
key = toStorageString(key);
|
336
|
+
value = toStorageString(value);
|
337
|
+
if (this.storage[this.prefix + key] === value)
|
338
|
+
return;
|
339
|
+
this.storage[this.prefix + key] = value;
|
340
|
+
this.api.setStorage(this.nativeId, this.storage);
|
341
|
+
}
|
342
|
+
}
|
343
|
+
async function setupPluginRemote(peer, api, pluginId, hostInfo, getSystemState) {
|
344
|
+
try {
|
345
|
+
// the host/remote connection can be from server to plugin (node to node),
|
346
|
+
// core plugin to web (node to browser).
|
347
|
+
// always add the BufferSerializer, so serialization is gauranteed to work.
|
348
|
+
// but in plugin-host, mark Buffer as transport safe.
|
349
|
+
if (!peer.constructorSerializerMap.get(Buffer))
|
350
|
+
peer.addSerializer(Buffer, 'Buffer', new rpc_buffer_serializer_1.BufferSerializer());
|
351
|
+
const getRemote = await peer.getParam('getRemote');
|
352
|
+
const remote = await getRemote(api, pluginId, hostInfo);
|
353
|
+
const accessControls = peer.tags.acl;
|
354
|
+
const getAccessControlDeviceState = (id, state) => {
|
355
|
+
state = state || getSystemState()[id];
|
356
|
+
if (accessControls && state) {
|
357
|
+
state = Object.assign({}, state);
|
358
|
+
for (const property of Object.keys(state)) {
|
359
|
+
if (accessControls.shouldRejectProperty(id, property))
|
360
|
+
delete state[property];
|
361
|
+
}
|
362
|
+
let interfaces = state.interfaces?.value;
|
363
|
+
if (interfaces) {
|
364
|
+
interfaces = interfaces.filter(scryptedInterface => !accessControls.shouldRejectInterface(id, scryptedInterface));
|
365
|
+
state.interfaces = {
|
366
|
+
value: interfaces,
|
367
|
+
};
|
368
|
+
}
|
369
|
+
}
|
370
|
+
return state;
|
371
|
+
};
|
372
|
+
const getAccessControlSystemState = () => {
|
373
|
+
let state = getSystemState();
|
374
|
+
if (accessControls) {
|
375
|
+
state = Object.assign({}, state);
|
376
|
+
for (const id of Object.keys(state)) {
|
377
|
+
if (accessControls.shouldRejectDevice(id)) {
|
378
|
+
delete state[id];
|
379
|
+
continue;
|
380
|
+
}
|
381
|
+
state[id] = getAccessControlDeviceState(id, state[id]);
|
382
|
+
}
|
383
|
+
}
|
384
|
+
return state;
|
385
|
+
};
|
386
|
+
await remote.setSystemState(getAccessControlSystemState());
|
387
|
+
api.listen((id, eventDetails, eventData) => {
|
388
|
+
if (accessControls?.shouldRejectEvent(eventDetails.property === types_1.ScryptedInterfaceProperty.id ? eventData : id, eventDetails))
|
389
|
+
return;
|
390
|
+
// ScryptedDevice events will be handled specially and repropagated by the remote.
|
391
|
+
if (eventDetails.eventInterface === types_1.ScryptedInterface.ScryptedDevice) {
|
392
|
+
if (eventDetails.property === types_1.ScryptedInterfaceProperty.id) {
|
393
|
+
// a change on the id property means device was deleted
|
394
|
+
remote.updateDeviceState(eventData, undefined);
|
395
|
+
}
|
396
|
+
else {
|
397
|
+
// a change on anything else is a descriptor update
|
398
|
+
remote.updateDeviceState(id, getAccessControlDeviceState(id));
|
399
|
+
}
|
400
|
+
return;
|
401
|
+
}
|
402
|
+
if (eventDetails.property && !eventDetails.mixinId) {
|
403
|
+
remote.notify(id, eventDetails, getSystemState()[id]?.[eventDetails.property]).catch(() => { });
|
404
|
+
}
|
405
|
+
else {
|
406
|
+
remote.notify(id, eventDetails, eventData).catch(() => { });
|
407
|
+
}
|
408
|
+
});
|
409
|
+
return remote;
|
410
|
+
}
|
411
|
+
catch (e) {
|
412
|
+
throw new rpc_1.RPCResultError(peer, 'error while retrieving PluginRemote', e);
|
413
|
+
}
|
414
|
+
}
|
415
|
+
exports.setupPluginRemote = setupPluginRemote;
|
416
|
+
function attachPluginRemote(peer, options) {
|
417
|
+
const { createMediaManager, getServicePort, getDeviceConsole, getMixinConsole } = options || {};
|
418
|
+
if (!peer.constructorSerializerMap.get(Buffer))
|
419
|
+
peer.addSerializer(Buffer, 'Buffer', new rpc_buffer_serializer_1.BufferSerializer());
|
420
|
+
const ioSockets = {};
|
421
|
+
const websocketSerializer = new plugin_remote_websocket_1.WebSocketSerializer();
|
422
|
+
peer.addSerializer(plugin_remote_websocket_1.WebSocketConnection, plugin_remote_websocket_1.WebSocketConnection.name, websocketSerializer);
|
423
|
+
let done;
|
424
|
+
const retPromise = new Promise(resolve => done = resolve);
|
425
|
+
peer.params.getRemote = async (api, pluginId, hostInfo) => {
|
426
|
+
websocketSerializer.WebSocket = (0, plugin_remote_websocket_1.createWebSocketClass)((connection, callbacks) => {
|
427
|
+
const { url } = connection;
|
428
|
+
if (url.startsWith('io://') || url.startsWith('ws://')) {
|
429
|
+
const id = url.substring('xx://'.length);
|
430
|
+
ioSockets[id] = callbacks;
|
431
|
+
callbacks.connect(undefined, {
|
432
|
+
close: (message) => connection.close(message),
|
433
|
+
send: (message) => connection.send(message),
|
434
|
+
});
|
435
|
+
}
|
436
|
+
else {
|
437
|
+
throw new Error('unsupported websocket');
|
438
|
+
}
|
439
|
+
});
|
440
|
+
await options?.onGetRemote?.(api, pluginId);
|
441
|
+
const systemManager = new system_1.SystemManagerImpl();
|
442
|
+
const deviceManager = new DeviceManagerImpl(systemManager, getDeviceConsole, getMixinConsole);
|
443
|
+
const endpointManager = new EndpointManagerImpl();
|
444
|
+
const hostMediaManager = await api.getMediaManager();
|
445
|
+
if (!hostMediaManager) {
|
446
|
+
peer.params['createMediaManager'] = async () => createMediaManager(systemManager, deviceManager);
|
447
|
+
}
|
448
|
+
const mediaManager = hostMediaManager || await createMediaManager(systemManager, deviceManager);
|
449
|
+
peer.params['mediaManager'] = mediaManager;
|
450
|
+
systemManager.api = api;
|
451
|
+
deviceManager.api = api;
|
452
|
+
const log = deviceManager.getDeviceLogger(undefined);
|
453
|
+
systemManager.log = log;
|
454
|
+
const ret = {
|
455
|
+
systemManager,
|
456
|
+
deviceManager,
|
457
|
+
endpointManager,
|
458
|
+
mediaManager,
|
459
|
+
log,
|
460
|
+
pluginHostAPI: api,
|
461
|
+
pluginRemoteAPI: undefined,
|
462
|
+
serverVersion: hostInfo?.serverVersion,
|
463
|
+
};
|
464
|
+
delete peer.params.getRemote;
|
465
|
+
endpointManager.api = api;
|
466
|
+
endpointManager.deviceManager = deviceManager;
|
467
|
+
endpointManager.mediaManager = mediaManager;
|
468
|
+
endpointManager.pluginId = pluginId;
|
469
|
+
const localStorage = new StorageImpl(deviceManager, undefined);
|
470
|
+
const remote = {
|
471
|
+
[rpc_1.RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION]: true,
|
472
|
+
[rpc_1.RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]: [
|
473
|
+
'notify',
|
474
|
+
'updateDeviceState',
|
475
|
+
'setSystemState',
|
476
|
+
'ioEvent',
|
477
|
+
'setNativeId',
|
478
|
+
],
|
479
|
+
getServicePort,
|
480
|
+
async createDeviceState(id, setState) {
|
481
|
+
return deviceManager.createDeviceState(id, setState);
|
482
|
+
},
|
483
|
+
async ioEvent(id, event, message) {
|
484
|
+
// console.log(id, event, message);
|
485
|
+
const io = ioSockets[id];
|
486
|
+
if (!io)
|
487
|
+
return;
|
488
|
+
switch (event) {
|
489
|
+
case 'message':
|
490
|
+
io.data(message);
|
491
|
+
break;
|
492
|
+
case 'close':
|
493
|
+
io.end();
|
494
|
+
delete ioSockets[id];
|
495
|
+
break;
|
496
|
+
}
|
497
|
+
},
|
498
|
+
async setNativeId(nativeId, id, storage) {
|
499
|
+
// JSON stringify over rpc turns undefined into null.
|
500
|
+
if (nativeId === null)
|
501
|
+
nativeId = undefined;
|
502
|
+
if (id) {
|
503
|
+
deviceManager.nativeIds.set(nativeId?.toString(), {
|
504
|
+
id,
|
505
|
+
storage,
|
506
|
+
});
|
507
|
+
}
|
508
|
+
else {
|
509
|
+
deviceManager.nativeIds.delete(nativeId);
|
510
|
+
}
|
511
|
+
},
|
512
|
+
async updateDeviceState(id, state) {
|
513
|
+
if (!state) {
|
514
|
+
delete systemManager.state[id];
|
515
|
+
systemManager.events.notify(undefined, undefined, types_1.ScryptedInterface.ScryptedDevice, types_1.ScryptedInterfaceProperty.id, id, { changed: true });
|
516
|
+
}
|
517
|
+
else {
|
518
|
+
systemManager.state[id] = state;
|
519
|
+
systemManager.events.notify(id, undefined, types_1.ScryptedInterface.ScryptedDevice, undefined, state, { changed: true });
|
520
|
+
}
|
521
|
+
},
|
522
|
+
async notify(id, eventTimeOrDetails, eventInterfaceOrData, property, value, changed) {
|
523
|
+
if (typeof eventTimeOrDetails === 'number') {
|
524
|
+
// TODO: remove legacy code path
|
525
|
+
// 12/30/2022
|
526
|
+
const eventTime = eventTimeOrDetails;
|
527
|
+
const eventInterface = eventInterfaceOrData;
|
528
|
+
if (property) {
|
529
|
+
const state = systemManager.state?.[id];
|
530
|
+
if (!state) {
|
531
|
+
log.w(`state not found for ${id}`);
|
532
|
+
return;
|
533
|
+
}
|
534
|
+
state[property] = value;
|
535
|
+
systemManager.events.notify(id, eventTime, eventInterface, property, value.value, { changed });
|
536
|
+
}
|
537
|
+
else {
|
538
|
+
systemManager.events.notify(id, eventTime, eventInterface, property, value, { changed });
|
539
|
+
}
|
540
|
+
}
|
541
|
+
else {
|
542
|
+
const eventDetails = eventTimeOrDetails;
|
543
|
+
const eventData = eventInterfaceOrData;
|
544
|
+
if (eventDetails.property && !eventDetails.mixinId) {
|
545
|
+
const state = systemManager.state?.[id];
|
546
|
+
if (!state) {
|
547
|
+
log.w(`state not found for ${id}`);
|
548
|
+
return;
|
549
|
+
}
|
550
|
+
state[eventDetails.property] = eventData;
|
551
|
+
systemManager.events.notifyEventDetails(id, eventDetails, eventData.value);
|
552
|
+
}
|
553
|
+
else {
|
554
|
+
systemManager.events.notifyEventDetails(id, eventDetails, eventData);
|
555
|
+
}
|
556
|
+
}
|
557
|
+
},
|
558
|
+
async setSystemState(state) {
|
559
|
+
systemManager.state = state;
|
560
|
+
deviceManager.pruneMixinStorage();
|
561
|
+
done(ret);
|
562
|
+
},
|
563
|
+
async loadZip(packageJson, zipData, zipOptions) {
|
564
|
+
const params = {
|
565
|
+
__filename: undefined,
|
566
|
+
deviceManager,
|
567
|
+
systemManager,
|
568
|
+
mediaManager,
|
569
|
+
endpointManager,
|
570
|
+
log,
|
571
|
+
localStorage,
|
572
|
+
pluginHostAPI: api,
|
573
|
+
// TODO:
|
574
|
+
// 10/10/2022: remove this shim from all plugins and server.
|
575
|
+
WebSocket: function (url) {
|
576
|
+
if (typeof url === 'string')
|
577
|
+
throw new Error('unsupported websocket');
|
578
|
+
return url;
|
579
|
+
},
|
580
|
+
pluginRuntimeAPI: ret,
|
581
|
+
};
|
582
|
+
params.pluginRuntimeAPI = ret;
|
583
|
+
try {
|
584
|
+
return await options.onLoadZip(ret, params, packageJson, zipData, zipOptions);
|
585
|
+
}
|
586
|
+
catch (e) {
|
587
|
+
console.error('plugin start/fork failed', e);
|
588
|
+
throw e;
|
589
|
+
}
|
590
|
+
},
|
591
|
+
};
|
592
|
+
ret.pluginRemoteAPI = remote;
|
593
|
+
return remote;
|
594
|
+
};
|
595
|
+
return retPromise;
|
596
|
+
}
|
597
|
+
exports.attachPluginRemote = attachPluginRemote;
|
598
|
+
//# sourceMappingURL=plugin-remote.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"plugin-remote.js","sourceRoot":"","sources":["../../src/plugin/plugin-remote.ts"],"names":[],"mappings":"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"}
|