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

Files changed (185) hide show
  1. package/dist/asynciterable-utils.d.ts +2 -0
  2. package/dist/asynciterable-utils.js +24 -0
  3. package/dist/asynciterable-utils.js.map +1 -0
  4. package/dist/cert.d.ts +6 -0
  5. package/dist/cert.js +75 -0
  6. package/dist/cert.js.map +1 -0
  7. package/dist/collection.d.ts +1 -0
  8. package/dist/collection.js +16 -0
  9. package/dist/collection.js.map +1 -0
  10. package/dist/db-types.d.ts +38 -0
  11. package/dist/db-types.js +45 -0
  12. package/dist/db-types.js.map +1 -0
  13. package/dist/event-registry.d.ts +19 -0
  14. package/dist/event-registry.js +92 -0
  15. package/dist/event-registry.js.map +1 -0
  16. package/dist/http-interfaces.d.ts +3 -0
  17. package/dist/http-interfaces.js +73 -0
  18. package/dist/http-interfaces.js.map +1 -0
  19. package/dist/infer-defaults.d.ts +11 -0
  20. package/dist/infer-defaults.js +119 -0
  21. package/dist/infer-defaults.js.map +1 -0
  22. package/dist/io.d.ts +22 -0
  23. package/dist/io.js +3 -0
  24. package/dist/io.js.map +1 -0
  25. package/dist/level.d.ts +110 -0
  26. package/dist/level.js +135 -0
  27. package/dist/level.js.map +1 -0
  28. package/dist/listen-zero.d.ts +13 -0
  29. package/dist/listen-zero.js +48 -0
  30. package/dist/listen-zero.js.map +1 -0
  31. package/dist/logger.d.ts +29 -0
  32. package/dist/logger.js +78 -0
  33. package/dist/logger.js.map +1 -0
  34. package/dist/media-helpers.d.ts +5 -0
  35. package/dist/media-helpers.js +89 -0
  36. package/dist/media-helpers.js.map +1 -0
  37. package/dist/mixin/mixin-cycle.d.ts +3 -0
  38. package/dist/mixin/mixin-cycle.js +32 -0
  39. package/dist/mixin/mixin-cycle.js.map +1 -0
  40. package/dist/plugin/acl.d.ts +16 -0
  41. package/dist/plugin/acl.js +83 -0
  42. package/dist/plugin/acl.js.map +1 -0
  43. package/dist/plugin/descriptor.d.ts +22 -0
  44. package/dist/plugin/descriptor.js +35 -0
  45. package/dist/plugin/descriptor.js.map +1 -0
  46. package/dist/plugin/media.d.ts +71 -0
  47. package/dist/plugin/media.js +420 -0
  48. package/dist/plugin/media.js.map +1 -0
  49. package/dist/plugin/mediaobject.d.ts +10 -0
  50. package/dist/plugin/mediaobject.js +26 -0
  51. package/dist/plugin/mediaobject.js.map +1 -0
  52. package/dist/plugin/plugin-api.d.ts +106 -0
  53. package/dist/plugin/plugin-api.js +120 -0
  54. package/dist/plugin/plugin-api.js.map +1 -0
  55. package/dist/plugin/plugin-console.d.ts +28 -0
  56. package/dist/plugin/plugin-console.js +291 -0
  57. package/dist/plugin/plugin-console.js.map +1 -0
  58. package/dist/plugin/plugin-debug.d.ts +4 -0
  59. package/dist/plugin/plugin-debug.js +3 -0
  60. package/dist/plugin/plugin-debug.js.map +1 -0
  61. package/dist/plugin/plugin-device.d.ts +54 -0
  62. package/dist/plugin/plugin-device.js +413 -0
  63. package/dist/plugin/plugin-device.js.map +1 -0
  64. package/dist/plugin/plugin-error.d.ts +2 -0
  65. package/dist/plugin/plugin-error.js +7 -0
  66. package/dist/plugin/plugin-error.js.map +1 -0
  67. package/dist/plugin/plugin-host-api.d.ts +43 -0
  68. package/dist/plugin/plugin-host-api.js +179 -0
  69. package/dist/plugin/plugin-host-api.js.map +1 -0
  70. package/dist/plugin/plugin-host.d.ts +45 -0
  71. package/dist/plugin/plugin-host.js +398 -0
  72. package/dist/plugin/plugin-host.js.map +1 -0
  73. package/dist/plugin/plugin-http.d.ts +18 -0
  74. package/dist/plugin/plugin-http.js +120 -0
  75. package/dist/plugin/plugin-http.js.map +1 -0
  76. package/dist/plugin/plugin-lazy-remote.d.ts +31 -0
  77. package/dist/plugin/plugin-lazy-remote.js +75 -0
  78. package/dist/plugin/plugin-lazy-remote.js.map +1 -0
  79. package/dist/plugin/plugin-npm-dependencies.d.ts +8 -0
  80. package/dist/plugin/plugin-npm-dependencies.js +103 -0
  81. package/dist/plugin/plugin-npm-dependencies.js.map +1 -0
  82. package/dist/plugin/plugin-remote-stats.d.ts +8 -0
  83. package/dist/plugin/plugin-remote-stats.js +30 -0
  84. package/dist/plugin/plugin-remote-stats.js.map +1 -0
  85. package/dist/plugin/plugin-remote-websocket.d.ts +29 -0
  86. package/dist/plugin/plugin-remote-websocket.js +152 -0
  87. package/dist/plugin/plugin-remote-websocket.js.map +1 -0
  88. package/dist/plugin/plugin-remote-worker.d.ts +5 -0
  89. package/dist/plugin/plugin-remote-worker.js +348 -0
  90. package/dist/plugin/plugin-remote-worker.js.map +1 -0
  91. package/dist/plugin/plugin-remote.d.ts +75 -0
  92. package/dist/plugin/plugin-remote.js +598 -0
  93. package/dist/plugin/plugin-remote.js.map +1 -0
  94. package/dist/plugin/plugin-repl.d.ts +2 -0
  95. package/dist/plugin/plugin-repl.js +74 -0
  96. package/dist/plugin/plugin-repl.js.map +1 -0
  97. package/dist/plugin/plugin-state-check.d.ts +1 -0
  98. package/dist/plugin/plugin-state-check.js +27 -0
  99. package/dist/plugin/plugin-state-check.js.map +1 -0
  100. package/dist/plugin/plugin-volume.d.ts +3 -0
  101. package/dist/plugin/plugin-volume.js +31 -0
  102. package/dist/plugin/plugin-volume.js.map +1 -0
  103. package/dist/plugin/runtime/child-process-worker.d.ts +20 -0
  104. package/dist/plugin/runtime/child-process-worker.js +42 -0
  105. package/dist/plugin/runtime/child-process-worker.js.map +1 -0
  106. package/dist/plugin/runtime/node-fork-worker.d.ts +9 -0
  107. package/dist/plugin/runtime/node-fork-worker.js +67 -0
  108. package/dist/plugin/runtime/node-fork-worker.js.map +1 -0
  109. package/dist/plugin/runtime/node-thread-worker.d.ts +20 -0
  110. package/dist/plugin/runtime/node-thread-worker.js +73 -0
  111. package/dist/plugin/runtime/node-thread-worker.js.map +1 -0
  112. package/dist/plugin/runtime/python-worker.d.ts +10 -0
  113. package/dist/plugin/runtime/python-worker.js +91 -0
  114. package/dist/plugin/runtime/python-worker.js.map +1 -0
  115. package/dist/plugin/runtime/runtime-worker.d.ts +26 -0
  116. package/dist/plugin/runtime/runtime-worker.js +3 -0
  117. package/dist/plugin/runtime/runtime-worker.js.map +1 -0
  118. package/dist/plugin/socket-serializer.d.ts +5 -0
  119. package/dist/plugin/socket-serializer.js +17 -0
  120. package/dist/plugin/socket-serializer.js.map +1 -0
  121. package/dist/plugin/system.d.ts +39 -0
  122. package/dist/plugin/system.js +216 -0
  123. package/dist/plugin/system.js.map +1 -0
  124. package/dist/rpc-buffer-serializer.d.ts +11 -0
  125. package/dist/rpc-buffer-serializer.js +30 -0
  126. package/dist/rpc-buffer-serializer.js.map +1 -0
  127. package/dist/rpc-serializer.d.ts +24 -0
  128. package/dist/rpc-serializer.js +144 -0
  129. package/dist/rpc-serializer.js.map +1 -0
  130. package/dist/rpc.d.ts +147 -0
  131. package/dist/rpc.js +689 -0
  132. package/dist/rpc.js.map +1 -0
  133. package/dist/runtime.d.ts +103 -0
  134. package/dist/runtime.js +815 -0
  135. package/dist/runtime.js.map +1 -0
  136. package/dist/scrypted-main-exports.d.ts +6 -0
  137. package/dist/scrypted-main-exports.js +57 -0
  138. package/dist/scrypted-main-exports.js.map +1 -0
  139. package/dist/scrypted-main.d.ts +1 -0
  140. package/dist/scrypted-main.js +8 -0
  141. package/dist/scrypted-main.js.map +1 -0
  142. package/dist/scrypted-plugin-main.d.ts +2 -0
  143. package/dist/scrypted-plugin-main.js +43 -0
  144. package/dist/scrypted-plugin-main.js.map +1 -0
  145. package/dist/scrypted-server-main.d.ts +6 -0
  146. package/dist/scrypted-server-main.js +559 -0
  147. package/dist/scrypted-server-main.js.map +1 -0
  148. package/dist/server-settings.d.ts +5 -0
  149. package/dist/server-settings.js +91 -0
  150. package/dist/server-settings.js.map +1 -0
  151. package/dist/services/addresses.d.ts +7 -0
  152. package/dist/services/addresses.js +43 -0
  153. package/dist/services/addresses.js.map +1 -0
  154. package/dist/services/alerts.d.ts +9 -0
  155. package/dist/services/alerts.js +27 -0
  156. package/dist/services/alerts.js.map +1 -0
  157. package/dist/services/cors.d.ts +18 -0
  158. package/dist/services/cors.js +18 -0
  159. package/dist/services/cors.js.map +1 -0
  160. package/dist/services/info.d.ts +5 -0
  161. package/dist/services/info.js +18 -0
  162. package/dist/services/info.js.map +1 -0
  163. package/dist/services/plugin.d.ts +46 -0
  164. package/dist/services/plugin.js +172 -0
  165. package/dist/services/plugin.js.map +1 -0
  166. package/dist/services/service-control.d.ts +8 -0
  167. package/dist/services/service-control.js +39 -0
  168. package/dist/services/service-control.js.map +1 -0
  169. package/dist/services/users.d.ts +19 -0
  170. package/dist/services/users.js +75 -0
  171. package/dist/services/users.js.map +1 -0
  172. package/dist/sleep.d.ts +1 -0
  173. package/dist/sleep.js +8 -0
  174. package/dist/sleep.js.map +1 -0
  175. package/dist/state.d.ts +39 -0
  176. package/dist/state.js +247 -0
  177. package/dist/state.js.map +1 -0
  178. package/dist/threading.d.ts +3 -0
  179. package/dist/threading.js +93 -0
  180. package/dist/threading.js.map +1 -0
  181. package/dist/usertoken.d.ts +11 -0
  182. package/dist/usertoken.js +52 -0
  183. package/dist/usertoken.js.map +1 -0
  184. package/package.json +2 -2
  185. package/src/plugin/plugin-host-api.ts +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/services/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function sleep(ms: number): Promise<void>;
package/dist/sleep.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sleep = void 0;
4
+ async function sleep(ms) {
5
+ await new Promise(resolve => setTimeout(resolve, ms));
6
+ }
7
+ exports.sleep = sleep;
8
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../src/sleep.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,KAAK,CAAC,EAAU;IAClC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAFD,sBAEC"}
@@ -0,0 +1,39 @@
1
+ /// <reference types="lodash" />
2
+ import { EventDetails, EventListenerOptions, EventListenerRegister, ScryptedInterface, SystemDeviceState } from "@scrypted/types";
3
+ import { PluginDevice } from "./db-types";
4
+ import { EventRegistry } from "./event-registry";
5
+ import { ScryptedRuntime } from "./runtime";
6
+ export declare class ScryptedStateManager extends EventRegistry {
7
+ scrypted: ScryptedRuntime;
8
+ upserts: Set<string>;
9
+ upsertThrottle: import("lodash").DebouncedFunc<() => void>;
10
+ constructor(scrypted: ScryptedRuntime);
11
+ getImplementerId(pluginDevice: PluginDevice, eventInterface: ScryptedInterface | string): Promise<string>;
12
+ notifyInterfaceEventFromMixin(pluginDevice: PluginDevice, eventInterface: ScryptedInterface | string, value: any, mixinId: string): Promise<void>;
13
+ setPluginDeviceStateFromMixin(pluginDevice: PluginDevice, property: string, value: any, eventInterface: ScryptedInterface, mixinId: string): Promise<boolean>;
14
+ setPluginDeviceState(device: PluginDevice, property: string, value: any, eventInterface?: ScryptedInterface): boolean;
15
+ updateDescriptor(device: PluginDevice): void;
16
+ removeDevice(id: string): void;
17
+ notifyInterfaceEvent(device: PluginDevice, eventInterface: ScryptedInterface | string, value: any, mixinId?: string): void;
18
+ setState(id: string, property: string, value: any): boolean;
19
+ getSystemState(): {
20
+ [id: string]: {
21
+ [property: string]: SystemDeviceState;
22
+ };
23
+ };
24
+ listenDevice(id: string, options: string | EventListenerOptions, callback: (eventDetails: EventDetails, eventData: any) => void): EventListenerRegister;
25
+ refreshThrottles: {
26
+ [id: string]: RefreshThrottle;
27
+ };
28
+ getOrCreateRefreshThrottle(id: string, refreshInterface: string, userInitiated: boolean): RefreshThrottle;
29
+ refresh(id: string, refreshInterface: string, userInitiated: boolean): Promise<void>;
30
+ }
31
+ interface RefreshThrottle {
32
+ promise: Promise<void>;
33
+ refreshInterface: string;
34
+ userInitiated: boolean;
35
+ tailRefresh: boolean;
36
+ }
37
+ export declare function setState(pluginDevice: PluginDevice, property: string, value: any): boolean;
38
+ export declare function getState(pluginDevice: PluginDevice, property: string): any;
39
+ export {};
package/dist/state.js ADDED
@@ -0,0 +1,247 @@
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.getState = exports.setState = exports.ScryptedStateManager = void 0;
7
+ const types_1 = require("@scrypted/types");
8
+ const throttle_1 = __importDefault(require("lodash/throttle"));
9
+ const event_registry_1 = require("./event-registry");
10
+ const descriptor_1 = require("./plugin/descriptor");
11
+ const plugin_device_1 = require("./plugin/plugin-device");
12
+ const sleep_1 = require("./sleep");
13
+ class ScryptedStateManager extends event_registry_1.EventRegistry {
14
+ scrypted;
15
+ upserts = new Set();
16
+ upsertThrottle = (0, throttle_1.default)(() => {
17
+ const ids = [...this.upserts.values()];
18
+ this.upserts.clear();
19
+ for (const id of ids) {
20
+ try {
21
+ const pluginDevice = this.scrypted.findPluginDeviceById(id);
22
+ // may have been deleted
23
+ if (pluginDevice)
24
+ this.scrypted.datastore.upsert(pluginDevice);
25
+ }
26
+ catch (e) {
27
+ console.error('save state error', e);
28
+ }
29
+ }
30
+ }, 30000, {
31
+ leading: false,
32
+ trailing: true,
33
+ });
34
+ constructor(scrypted) {
35
+ super();
36
+ this.scrypted = scrypted;
37
+ }
38
+ async getImplementerId(pluginDevice, eventInterface) {
39
+ if (!eventInterface)
40
+ throw new Error(`ScryptedInterface is required`);
41
+ const device = this.scrypted.getDevice(pluginDevice._id);
42
+ if (!device)
43
+ throw new Error(`device ${pluginDevice._id} not found?`);
44
+ const implementerId = await device[plugin_device_1.QueryInterfaceSymbol](eventInterface);
45
+ return implementerId;
46
+ }
47
+ async notifyInterfaceEventFromMixin(pluginDevice, eventInterface, value, mixinId) {
48
+ // TODO: figure out how to clean this up this hack. For now,
49
+ // Settings interface is allowed to bubble from mixin devices..
50
+ // TODO: mixin masking of property-less events is disabled due to ObjectDetector.
51
+ // Running opencv and tensorflow-lite masks one or the other object events.
52
+ // Need to think this through more.
53
+ if (false && eventInterface !== types_1.ScryptedInterface.Settings) {
54
+ const implementerId = await this.getImplementerId(pluginDevice, eventInterface);
55
+ if (implementerId !== mixinId) {
56
+ const event = (0, event_registry_1.getMixinEventName)({
57
+ event: eventInterface,
58
+ mixinId,
59
+ });
60
+ this.notifyEventDetails(pluginDevice._id, {
61
+ eventId: undefined,
62
+ eventInterface,
63
+ eventTime: Date.now(),
64
+ mixinId,
65
+ }, value, event);
66
+ return;
67
+ }
68
+ }
69
+ this.notify(pluginDevice?._id, Date.now(), eventInterface, undefined, value);
70
+ }
71
+ async setPluginDeviceStateFromMixin(pluginDevice, property, value, eventInterface, mixinId) {
72
+ // TODO: crashing here. send descriptor from python too.
73
+ eventInterface = eventInterface || descriptor_1.propertyInterfaces[property];
74
+ const implementerId = await this.getImplementerId(pluginDevice, eventInterface);
75
+ if (implementerId !== mixinId) {
76
+ const event = (0, event_registry_1.getMixinEventName)({
77
+ event: eventInterface,
78
+ mixinId,
79
+ });
80
+ this.scrypted.getDeviceLogger(pluginDevice).log('i', `${property}: ${value} (mixin)`);
81
+ this.notifyEventDetails(pluginDevice._id, {
82
+ eventId: undefined,
83
+ eventInterface,
84
+ eventTime: Date.now(),
85
+ mixinId,
86
+ property,
87
+ }, value, event);
88
+ return false;
89
+ }
90
+ return this.setPluginDeviceState(pluginDevice, property, value, eventInterface);
91
+ }
92
+ setPluginDeviceState(device, property, value, eventInterface) {
93
+ eventInterface = eventInterface || descriptor_1.propertyInterfaces[property];
94
+ if (!eventInterface)
95
+ throw new Error(`eventInterface must be provided`);
96
+ const changed = setState(device, property, value);
97
+ if (eventInterface !== types_1.ScryptedInterface.ScryptedDevice) {
98
+ if (this.notify(device?._id, Date.now(), eventInterface, property, value, { changed }) && device) {
99
+ this.scrypted.getDeviceLogger(device).log('i', `${property}: ${value}`);
100
+ }
101
+ }
102
+ this.upserts.add(device._id);
103
+ this.upsertThrottle();
104
+ return changed;
105
+ }
106
+ updateDescriptor(device) {
107
+ this.notify(device._id, undefined, types_1.ScryptedInterface.ScryptedDevice, undefined, device.state, { changed: true });
108
+ }
109
+ removeDevice(id) {
110
+ this.notify(undefined, undefined, types_1.ScryptedInterface.ScryptedDevice, types_1.ScryptedInterfaceProperty.id, id, { changed: true });
111
+ }
112
+ notifyInterfaceEvent(device, eventInterface, value, mixinId) {
113
+ this.notify(device?._id, Date.now(), eventInterface, undefined, value, {
114
+ changed: true,
115
+ mixinId,
116
+ });
117
+ }
118
+ setState(id, property, value) {
119
+ const device = this.scrypted.pluginDevices[id];
120
+ if (!device)
121
+ throw new Error(`device not found for id ${id}`);
122
+ return this.setPluginDeviceState(device, property, value);
123
+ }
124
+ getSystemState() {
125
+ const systemState = {};
126
+ for (const pluginDevice of Object.values(this.scrypted.pluginDevices)) {
127
+ systemState[pluginDevice._id] = pluginDevice.state;
128
+ }
129
+ return systemState;
130
+ }
131
+ listenDevice(id, options, callback) {
132
+ let { denoise, event, watch } = (options || {});
133
+ if (!event && typeof options === 'string')
134
+ event = options;
135
+ if (!event)
136
+ event = undefined;
137
+ let polling = true;
138
+ const device = this.scrypted.getDevice(id);
139
+ if (device.interfaces.includes(types_1.ScryptedInterface.Refresh)) {
140
+ (async () => {
141
+ while (polling && !watch) {
142
+ // listen is not user initiated. an explicit refresh call would be.
143
+ try {
144
+ await this.refresh(id, event, false);
145
+ }
146
+ catch (e) {
147
+ console.error('refresh ended by exception', e);
148
+ break;
149
+ }
150
+ }
151
+ })();
152
+ }
153
+ let lastData = undefined;
154
+ let cb = (eventDetails, eventData) => {
155
+ if (denoise && lastData === eventData)
156
+ return;
157
+ callback?.(eventDetails, eventData);
158
+ };
159
+ const wrappedRegister = super.listenDevice(id, options, cb);
160
+ return new event_registry_1.EventListenerRegisterImpl(() => {
161
+ wrappedRegister.removeListener();
162
+ cb = undefined;
163
+ callback = undefined;
164
+ polling = false;
165
+ });
166
+ }
167
+ refreshThrottles = {};
168
+ getOrCreateRefreshThrottle(id, refreshInterface, userInitiated) {
169
+ let throttle = this.refreshThrottles[id];
170
+ if (throttle) {
171
+ if (userInitiated)
172
+ throttle.userInitiated = true;
173
+ if (throttle.refreshInterface !== refreshInterface)
174
+ throttle.refreshInterface = undefined;
175
+ throttle.tailRefresh = true;
176
+ return throttle;
177
+ }
178
+ const device = this.scrypted.getDevice(id);
179
+ const logger = this.scrypted.getDeviceLogger(this.scrypted.findPluginDeviceById(id));
180
+ if (!device.interfaces.includes(types_1.ScryptedInterface.Refresh))
181
+ throw new Error('device does not implement refresh');
182
+ // further refreshes will block
183
+ const ret = this.refreshThrottles[id] = {
184
+ promise: (async () => {
185
+ let timeout = 30000;
186
+ try {
187
+ timeout = await device.getRefreshFrequency() * 1000;
188
+ }
189
+ catch (e) {
190
+ }
191
+ await (0, sleep_1.sleep)(timeout);
192
+ try {
193
+ const rt = this.refreshThrottles[id];
194
+ if (!rt.tailRefresh)
195
+ return;
196
+ await device[plugin_device_1.RefreshSymbol](rt.refreshInterface, rt.userInitiated);
197
+ }
198
+ catch (e) {
199
+ logger.log('e', 'Refresh failed');
200
+ logger.log('e', e.toString());
201
+ }
202
+ finally {
203
+ delete this.refreshThrottles[id];
204
+ }
205
+ })(),
206
+ userInitiated,
207
+ refreshInterface,
208
+ tailRefresh: false,
209
+ };
210
+ // initial refresh does not block
211
+ const promise = device[plugin_device_1.RefreshSymbol](ret.refreshInterface, ret.userInitiated);
212
+ return {
213
+ promise,
214
+ refreshInterface,
215
+ userInitiated,
216
+ tailRefresh: false,
217
+ };
218
+ }
219
+ async refresh(id, refreshInterface, userInitiated) {
220
+ const throttle = this.getOrCreateRefreshThrottle(id, refreshInterface, userInitiated);
221
+ return throttle.promise;
222
+ }
223
+ }
224
+ exports.ScryptedStateManager = ScryptedStateManager;
225
+ function isSameValue(value1, value2) {
226
+ return value1 === value2 || JSON.stringify(value1) === JSON.stringify(value2);
227
+ }
228
+ function setState(pluginDevice, property, value) {
229
+ // device may have been deleted.
230
+ if (!pluginDevice.state)
231
+ return;
232
+ if (!pluginDevice.state[property])
233
+ pluginDevice.state[property] = {};
234
+ const state = pluginDevice.state[property];
235
+ const changed = !isSameValue(value, state.value);
236
+ state.value = value;
237
+ return changed;
238
+ }
239
+ exports.setState = setState;
240
+ function getState(pluginDevice, property) {
241
+ const ret = pluginDevice.state?.[property]?.value;
242
+ if (typeof ret === 'object')
243
+ return JSON.parse(JSON.stringify(ret));
244
+ return ret;
245
+ }
246
+ exports.getState = getState;
247
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function newThread<T>(thread: () => Promise<T>): Promise<T>;
2
+ export declare function newThread<V, T>(params: V, thread: (params: V) => Promise<T>): Promise<T>;
3
+ export declare function newThread<M, V, T>(modules: M, params: V, thread: (params: M & V) => Promise<T>): Promise<T>;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ // WARNING: threading.ts does not work because RpcPeer transpilation does not include readonly static properties in the class definition
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.newThread = void 0;
8
+ const worker_threads_1 = __importDefault(require("worker_threads"));
9
+ const rpc_1 = require("./rpc");
10
+ const v8_1 = __importDefault(require("v8"));
11
+ async function newThread(...args) {
12
+ let params = {};
13
+ let modules = {};
14
+ let thread;
15
+ if (args[2]) {
16
+ modules = args[0];
17
+ params = args[1];
18
+ thread = args[2];
19
+ }
20
+ else if (args[1]) {
21
+ params = args[0];
22
+ thread = args[1];
23
+ }
24
+ else {
25
+ thread = args[0];
26
+ }
27
+ const m = (customRequire, RpcPeer) => {
28
+ if (customRequire) {
29
+ const g = global;
30
+ g[customRequire] = g.require;
31
+ }
32
+ const thread_v8 = global.require('v8');
33
+ const thread_worker_threads = global.require('worker_threads');
34
+ const thread_vm = global.require('vm');
35
+ const mainPeer = new RpcPeer('thread', 'main', (message, reject) => {
36
+ try {
37
+ thread_worker_threads.parentPort.postMessage(thread_v8.serialize(message));
38
+ }
39
+ catch (e) {
40
+ reject?.(e);
41
+ }
42
+ });
43
+ mainPeer.transportSafeArgumentTypes.add(Buffer.name);
44
+ mainPeer.transportSafeArgumentTypes.add(Uint8Array.name);
45
+ thread_worker_threads.parentPort.on('message', (message) => mainPeer.handleMessage(thread_v8.deserialize(message)));
46
+ mainPeer.params.eval = async (script, moduleNames, paramNames, ...paramValues) => {
47
+ const f = thread_vm.compileFunction(`return (${script})`, paramNames, {
48
+ filename: 'script.js',
49
+ });
50
+ const params = {};
51
+ for (const module of moduleNames) {
52
+ params[module] = global.require(module);
53
+ }
54
+ for (let i = 0; i < paramNames.length; i++) {
55
+ params[paramNames[i]] = paramValues[i];
56
+ }
57
+ const c = await f(...paramValues);
58
+ return await c(params);
59
+ };
60
+ };
61
+ const rpcSource = (0, rpc_1.getEvalSource)();
62
+ let customRequire = params.customRequire || '';
63
+ const workerSource = `
64
+ const {RpcPeer} = ${rpcSource};
65
+
66
+ (${m})("${customRequire}", RpcPeer)`;
67
+ const worker = new worker_threads_1.default.Worker(workerSource, {
68
+ eval: true,
69
+ });
70
+ const threadPeer = new rpc_1.RpcPeer('main', 'thread', (message, reject) => {
71
+ try {
72
+ worker.postMessage(v8_1.default.serialize(message));
73
+ }
74
+ catch (e) {
75
+ reject?.(e);
76
+ }
77
+ });
78
+ threadPeer.transportSafeArgumentTypes.add(Buffer.name);
79
+ threadPeer.transportSafeArgumentTypes.add(Uint8Array.name);
80
+ worker.on('message', (message) => threadPeer.handleMessage(v8_1.default.deserialize(message)));
81
+ const e = await threadPeer.getParam('eval');
82
+ const moduleNames = Object.keys(modules);
83
+ const paramNames = Object.keys(params);
84
+ const paramValues = Object.values(params);
85
+ try {
86
+ return await e(thread.toString(), moduleNames, paramNames, ...paramValues);
87
+ }
88
+ finally {
89
+ worker.terminate();
90
+ }
91
+ }
92
+ exports.newThread = newThread;
93
+ //# sourceMappingURL=threading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threading.js","sourceRoot":"","sources":["../src/threading.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const ONE_DAY_MILLISECONDS = 86400000;
2
+ export declare const ONE_YEAR_MILLISECONDS: number;
3
+ export declare class UserToken {
4
+ username: string;
5
+ aclId: string;
6
+ timestamp: number;
7
+ duration: number;
8
+ constructor(username: string, aclId: string, timestamp?: number, duration?: number);
9
+ static validateToken(token: string): UserToken;
10
+ toString(): string;
11
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserToken = exports.ONE_YEAR_MILLISECONDS = exports.ONE_DAY_MILLISECONDS = void 0;
4
+ exports.ONE_DAY_MILLISECONDS = 86400000;
5
+ exports.ONE_YEAR_MILLISECONDS = exports.ONE_DAY_MILLISECONDS * 365;
6
+ class UserToken {
7
+ username;
8
+ aclId;
9
+ timestamp;
10
+ duration;
11
+ constructor(username, aclId, timestamp = Date.now(), duration = exports.ONE_DAY_MILLISECONDS) {
12
+ this.username = username;
13
+ this.aclId = aclId;
14
+ this.timestamp = timestamp;
15
+ this.duration = duration;
16
+ }
17
+ static validateToken(token) {
18
+ if (!token)
19
+ throw new Error('Token not found.');
20
+ let json;
21
+ try {
22
+ json = JSON.parse(token);
23
+ }
24
+ catch (e) {
25
+ throw new Error('Token malformed, unparseable.');
26
+ }
27
+ let { u, a, t, d } = json;
28
+ u = u?.toString();
29
+ t = parseInt(t?.toString());
30
+ d = parseInt(d?.toString());
31
+ a = a?.toString();
32
+ if (!u || !t || !d)
33
+ throw new Error('Token malformed, missing properties.');
34
+ if (d > exports.ONE_YEAR_MILLISECONDS)
35
+ throw new Error('Token duration too long.');
36
+ if (t > Date.now())
37
+ throw new Error('Token from the future.');
38
+ if (t + d < Date.now())
39
+ throw new Error('Token expired.');
40
+ return new UserToken(u, a, t, d);
41
+ }
42
+ toString() {
43
+ return JSON.stringify({
44
+ u: this.username,
45
+ a: this.aclId,
46
+ t: this.timestamp,
47
+ d: this.duration,
48
+ });
49
+ }
50
+ }
51
+ exports.UserToken = UserToken;
52
+ //# sourceMappingURL=usertoken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usertoken.js","sourceRoot":"","sources":["../src/usertoken.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,QAAQ,CAAC;AAChC,QAAA,qBAAqB,GAAG,4BAAoB,GAAG,GAAG,CAAC;AAEhE,MAAa,SAAS;IACC;IAAyB;IAAsB;IAA+B;IAAjG,YAAmB,QAAgB,EAAS,KAAa,EAAS,YAAY,IAAI,CAAC,GAAG,EAAE,EAAS,WAAW,4BAAoB;QAA7G,aAAQ,GAAR,QAAQ,CAAQ;QAAS,UAAK,GAAL,KAAK,CAAQ;QAAS,cAAS,GAAT,SAAS,CAAa;QAAS,aAAQ,GAAR,QAAQ,CAAuB;IAChI,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,KAAa;QAC9B,IAAI,CAAC,KAAK;YACN,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAExC,IAAI,IAKH,CAAC;QACF,IAAI;YACA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC5B;QACD,OAAO,CAAC,EAAE;YACN,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QACD,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;QAC1B,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;QAClB,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5B,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5B,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,6BAAqB;YACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC/C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACtC,OAAO,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC;YAClB,CAAC,EAAE,IAAI,CAAC,QAAQ;YAChB,CAAC,EAAE,IAAI,CAAC,KAAK;YACb,CAAC,EAAE,IAAI,CAAC,SAAS;YACjB,CAAC,EAAE,IAAI,CAAC,QAAQ;SACnB,CAAC,CAAA;IACN,CAAC;CACJ;AA5CD,8BA4CC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrypted/server",
3
- "version": "0.7.93",
3
+ "version": "0.7.95",
4
4
  "description": "",
5
5
  "dependencies": {
6
6
  "@mapbox/node-pre-gyp": "^1.0.10",
@@ -72,7 +72,7 @@
72
72
  "beta": "npm publish --tag beta",
73
73
  "postbeta": "npm version patch && git add package.json && npm run build && git commit -m postbeta",
74
74
  "release": "npm publish",
75
- "prepublish": "npm run build",
75
+ "prepublishOnly": "npm run build",
76
76
  "postrelease": "git tag v$npm_package_version && git push origin v$npm_package_version && npm version patch && git add package.json && git commit -m postrelease",
77
77
  "docker": "scripts/github-workflow-publish-docker.sh"
78
78
  },
@@ -147,7 +147,9 @@ export class PluginHostAPI extends PluginAPIManagedListeners implements PluginAP
147
147
  }
148
148
 
149
149
  async onDeviceDiscovered(device: Device) {
150
- return this.pluginHost.upsertDevice(device);
150
+ const id = await this.pluginHost.upsertDevice(device);
151
+ this.scrypted.getDevice(id)?.probe().catch(() => { });
152
+ return id;
151
153
  }
152
154
 
153
155
  async onDeviceRemoved(nativeId: string) {