@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 @@
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/services/users.ts"],"names":[],"mappings":"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"}
|
package/dist/sleep.d.ts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export declare function sleep(ms: number): Promise<void>;
|
package/dist/sleep.js
ADDED
@@ -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"}
|
package/dist/state.d.ts
ADDED
@@ -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.
|
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
|
-
"
|
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
|
-
|
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) {
|