@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.

Files changed (184) hide show
  1. package/package.json +1 -1
  2. package/dist/asynciterable-utils.d.ts +0 -2
  3. package/dist/asynciterable-utils.js +0 -24
  4. package/dist/asynciterable-utils.js.map +0 -1
  5. package/dist/cert.d.ts +0 -6
  6. package/dist/cert.js +0 -75
  7. package/dist/cert.js.map +0 -1
  8. package/dist/collection.d.ts +0 -1
  9. package/dist/collection.js +0 -16
  10. package/dist/collection.js.map +0 -1
  11. package/dist/db-types.d.ts +0 -38
  12. package/dist/db-types.js +0 -45
  13. package/dist/db-types.js.map +0 -1
  14. package/dist/event-registry.d.ts +0 -19
  15. package/dist/event-registry.js +0 -92
  16. package/dist/event-registry.js.map +0 -1
  17. package/dist/http-interfaces.d.ts +0 -3
  18. package/dist/http-interfaces.js +0 -73
  19. package/dist/http-interfaces.js.map +0 -1
  20. package/dist/infer-defaults.d.ts +0 -11
  21. package/dist/infer-defaults.js +0 -119
  22. package/dist/infer-defaults.js.map +0 -1
  23. package/dist/io.d.ts +0 -22
  24. package/dist/io.js +0 -3
  25. package/dist/io.js.map +0 -1
  26. package/dist/level.d.ts +0 -110
  27. package/dist/level.js +0 -135
  28. package/dist/level.js.map +0 -1
  29. package/dist/listen-zero.d.ts +0 -13
  30. package/dist/listen-zero.js +0 -48
  31. package/dist/listen-zero.js.map +0 -1
  32. package/dist/logger.d.ts +0 -29
  33. package/dist/logger.js +0 -78
  34. package/dist/logger.js.map +0 -1
  35. package/dist/media-helpers.d.ts +0 -5
  36. package/dist/media-helpers.js +0 -89
  37. package/dist/media-helpers.js.map +0 -1
  38. package/dist/mixin/mixin-cycle.d.ts +0 -3
  39. package/dist/mixin/mixin-cycle.js +0 -32
  40. package/dist/mixin/mixin-cycle.js.map +0 -1
  41. package/dist/plugin/acl.d.ts +0 -16
  42. package/dist/plugin/acl.js +0 -83
  43. package/dist/plugin/acl.js.map +0 -1
  44. package/dist/plugin/descriptor.d.ts +0 -22
  45. package/dist/plugin/descriptor.js +0 -35
  46. package/dist/plugin/descriptor.js.map +0 -1
  47. package/dist/plugin/media.d.ts +0 -71
  48. package/dist/plugin/media.js +0 -420
  49. package/dist/plugin/media.js.map +0 -1
  50. package/dist/plugin/mediaobject.d.ts +0 -10
  51. package/dist/plugin/mediaobject.js +0 -26
  52. package/dist/plugin/mediaobject.js.map +0 -1
  53. package/dist/plugin/plugin-api.d.ts +0 -106
  54. package/dist/plugin/plugin-api.js +0 -120
  55. package/dist/plugin/plugin-api.js.map +0 -1
  56. package/dist/plugin/plugin-console.d.ts +0 -28
  57. package/dist/plugin/plugin-console.js +0 -291
  58. package/dist/plugin/plugin-console.js.map +0 -1
  59. package/dist/plugin/plugin-debug.d.ts +0 -4
  60. package/dist/plugin/plugin-debug.js +0 -3
  61. package/dist/plugin/plugin-debug.js.map +0 -1
  62. package/dist/plugin/plugin-device.d.ts +0 -54
  63. package/dist/plugin/plugin-device.js +0 -413
  64. package/dist/plugin/plugin-device.js.map +0 -1
  65. package/dist/plugin/plugin-error.d.ts +0 -2
  66. package/dist/plugin/plugin-error.js +0 -7
  67. package/dist/plugin/plugin-error.js.map +0 -1
  68. package/dist/plugin/plugin-host-api.d.ts +0 -43
  69. package/dist/plugin/plugin-host-api.js +0 -177
  70. package/dist/plugin/plugin-host-api.js.map +0 -1
  71. package/dist/plugin/plugin-host.d.ts +0 -45
  72. package/dist/plugin/plugin-host.js +0 -398
  73. package/dist/plugin/plugin-host.js.map +0 -1
  74. package/dist/plugin/plugin-http.d.ts +0 -18
  75. package/dist/plugin/plugin-http.js +0 -120
  76. package/dist/plugin/plugin-http.js.map +0 -1
  77. package/dist/plugin/plugin-lazy-remote.d.ts +0 -31
  78. package/dist/plugin/plugin-lazy-remote.js +0 -75
  79. package/dist/plugin/plugin-lazy-remote.js.map +0 -1
  80. package/dist/plugin/plugin-npm-dependencies.d.ts +0 -8
  81. package/dist/plugin/plugin-npm-dependencies.js +0 -103
  82. package/dist/plugin/plugin-npm-dependencies.js.map +0 -1
  83. package/dist/plugin/plugin-remote-stats.d.ts +0 -8
  84. package/dist/plugin/plugin-remote-stats.js +0 -30
  85. package/dist/plugin/plugin-remote-stats.js.map +0 -1
  86. package/dist/plugin/plugin-remote-websocket.d.ts +0 -29
  87. package/dist/plugin/plugin-remote-websocket.js +0 -152
  88. package/dist/plugin/plugin-remote-websocket.js.map +0 -1
  89. package/dist/plugin/plugin-remote-worker.d.ts +0 -5
  90. package/dist/plugin/plugin-remote-worker.js +0 -348
  91. package/dist/plugin/plugin-remote-worker.js.map +0 -1
  92. package/dist/plugin/plugin-remote.d.ts +0 -75
  93. package/dist/plugin/plugin-remote.js +0 -598
  94. package/dist/plugin/plugin-remote.js.map +0 -1
  95. package/dist/plugin/plugin-repl.d.ts +0 -2
  96. package/dist/plugin/plugin-repl.js +0 -74
  97. package/dist/plugin/plugin-repl.js.map +0 -1
  98. package/dist/plugin/plugin-state-check.d.ts +0 -1
  99. package/dist/plugin/plugin-state-check.js +0 -27
  100. package/dist/plugin/plugin-state-check.js.map +0 -1
  101. package/dist/plugin/plugin-volume.d.ts +0 -3
  102. package/dist/plugin/plugin-volume.js +0 -31
  103. package/dist/plugin/plugin-volume.js.map +0 -1
  104. package/dist/plugin/runtime/child-process-worker.d.ts +0 -20
  105. package/dist/plugin/runtime/child-process-worker.js +0 -42
  106. package/dist/plugin/runtime/child-process-worker.js.map +0 -1
  107. package/dist/plugin/runtime/node-fork-worker.d.ts +0 -9
  108. package/dist/plugin/runtime/node-fork-worker.js +0 -67
  109. package/dist/plugin/runtime/node-fork-worker.js.map +0 -1
  110. package/dist/plugin/runtime/node-thread-worker.d.ts +0 -20
  111. package/dist/plugin/runtime/node-thread-worker.js +0 -73
  112. package/dist/plugin/runtime/node-thread-worker.js.map +0 -1
  113. package/dist/plugin/runtime/python-worker.d.ts +0 -10
  114. package/dist/plugin/runtime/python-worker.js +0 -91
  115. package/dist/plugin/runtime/python-worker.js.map +0 -1
  116. package/dist/plugin/runtime/runtime-worker.d.ts +0 -26
  117. package/dist/plugin/runtime/runtime-worker.js +0 -3
  118. package/dist/plugin/runtime/runtime-worker.js.map +0 -1
  119. package/dist/plugin/socket-serializer.d.ts +0 -5
  120. package/dist/plugin/socket-serializer.js +0 -17
  121. package/dist/plugin/socket-serializer.js.map +0 -1
  122. package/dist/plugin/system.d.ts +0 -39
  123. package/dist/plugin/system.js +0 -216
  124. package/dist/plugin/system.js.map +0 -1
  125. package/dist/rpc-buffer-serializer.d.ts +0 -11
  126. package/dist/rpc-buffer-serializer.js +0 -30
  127. package/dist/rpc-buffer-serializer.js.map +0 -1
  128. package/dist/rpc-serializer.d.ts +0 -24
  129. package/dist/rpc-serializer.js +0 -144
  130. package/dist/rpc-serializer.js.map +0 -1
  131. package/dist/rpc.d.ts +0 -147
  132. package/dist/rpc.js +0 -689
  133. package/dist/rpc.js.map +0 -1
  134. package/dist/runtime.d.ts +0 -103
  135. package/dist/runtime.js +0 -815
  136. package/dist/runtime.js.map +0 -1
  137. package/dist/scrypted-main-exports.d.ts +0 -6
  138. package/dist/scrypted-main-exports.js +0 -57
  139. package/dist/scrypted-main-exports.js.map +0 -1
  140. package/dist/scrypted-main.d.ts +0 -1
  141. package/dist/scrypted-main.js +0 -8
  142. package/dist/scrypted-main.js.map +0 -1
  143. package/dist/scrypted-plugin-main.d.ts +0 -2
  144. package/dist/scrypted-plugin-main.js +0 -43
  145. package/dist/scrypted-plugin-main.js.map +0 -1
  146. package/dist/scrypted-server-main.d.ts +0 -6
  147. package/dist/scrypted-server-main.js +0 -559
  148. package/dist/scrypted-server-main.js.map +0 -1
  149. package/dist/server-settings.d.ts +0 -5
  150. package/dist/server-settings.js +0 -91
  151. package/dist/server-settings.js.map +0 -1
  152. package/dist/services/addresses.d.ts +0 -7
  153. package/dist/services/addresses.js +0 -41
  154. package/dist/services/addresses.js.map +0 -1
  155. package/dist/services/alerts.d.ts +0 -9
  156. package/dist/services/alerts.js +0 -27
  157. package/dist/services/alerts.js.map +0 -1
  158. package/dist/services/cors.d.ts +0 -18
  159. package/dist/services/cors.js +0 -18
  160. package/dist/services/cors.js.map +0 -1
  161. package/dist/services/info.d.ts +0 -5
  162. package/dist/services/info.js +0 -18
  163. package/dist/services/info.js.map +0 -1
  164. package/dist/services/plugin.d.ts +0 -46
  165. package/dist/services/plugin.js +0 -172
  166. package/dist/services/plugin.js.map +0 -1
  167. package/dist/services/service-control.d.ts +0 -8
  168. package/dist/services/service-control.js +0 -39
  169. package/dist/services/service-control.js.map +0 -1
  170. package/dist/services/users.d.ts +0 -19
  171. package/dist/services/users.js +0 -75
  172. package/dist/services/users.js.map +0 -1
  173. package/dist/sleep.d.ts +0 -1
  174. package/dist/sleep.js +0 -8
  175. package/dist/sleep.js.map +0 -1
  176. package/dist/state.d.ts +0 -39
  177. package/dist/state.js +0 -247
  178. package/dist/state.js.map +0 -1
  179. package/dist/threading.d.ts +0 -3
  180. package/dist/threading.js +0 -93
  181. package/dist/threading.js.map +0 -1
  182. package/dist/usertoken.d.ts +0 -11
  183. package/dist/usertoken.js +0 -52
  184. 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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"}