sdk/plugins/client/server: add new ScryptedDeviceCreator ui hooks

This commit is contained in:
Koushik Dutta
2024-07-08 09:43:30 -07:00
parent 470d315eaf
commit 4d471eb285
41 changed files with 188 additions and 68 deletions

View File

@@ -9,7 +9,7 @@
"version": "1.3.5",
"license": "ISC",
"dependencies": {
"@scrypted/types": "^0.3.31",
"@scrypted/types": "^0.3.33",
"engine.io-client": "^6.5.3",
"follow-redirects": "^1.15.6",
"rimraf": "^5.0.5"
@@ -84,9 +84,9 @@
}
},
"node_modules/@scrypted/types": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.31.tgz",
"integrity": "sha512-ZmpHMhCp5Aw6AaRKCTc6+y5u1gaNU6MxktWfeuFQ3djMdeI2XVWbpN9o/uTVeyqCHJzBnFTg1JM52sU9bJpolw=="
"version": "0.3.33",
"resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.33.tgz",
"integrity": "sha512-te81NcMnzQsxv0z4efARDbqMBiGzOPD2H+mOzcYCr2Cm2wpvYMwVt576MoXX890Bxn8omh2aRsFK4xSFTlUWSQ=="
},
"node_modules/@socket.io/component-emitter": {
"version": "3.1.0",

View File

@@ -18,7 +18,7 @@
"typescript": "^5.4.3"
},
"dependencies": {
"@scrypted/types": "^0.3.31",
"@scrypted/types": "^0.3.33",
"engine.io-client": "^6.5.3",
"follow-redirects": "^1.15.6",
"rimraf": "^5.0.5"

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/amcrest",
"version": "0.0.151",
"version": "0.0.152",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@scrypted/amcrest",
"version": "0.0.151",
"version": "0.0.152",
"license": "Apache",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/amcrest",
"version": "0.0.151",
"version": "0.0.152",
"description": "Amcrest Plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",
@@ -27,6 +27,8 @@
"name": "Amcrest Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator"
],

View File

@@ -703,6 +703,9 @@ class AmcrestProvider extends RtspProvider {
];
}
getScryptedDeviceCreator(): string {
return 'Amcrest Camera';
}
async createDevice(settings: DeviceCreatorSettings, nativeId?: string): Promise<string> {
const httpAddress = `${settings.ip}:${settings.httpPort || 80}`;

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/dummy-switch",
"version": "0.0.23",
"version": "0.0.24",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/dummy-switch",
"version": "0.0.23",
"version": "0.0.24",
"dependencies": {
"@types/node": "^16.6.1",
"axios": "^1.3.6"

View File

@@ -26,6 +26,8 @@
"name": "Dummy Switch Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator"
]
@@ -38,5 +40,5 @@
"@scrypted/common": "file:../../common",
"@scrypted/sdk": "file:../../sdk"
},
"version": "0.0.23"
"version": "0.0.24"
}

View File

@@ -84,6 +84,10 @@ class DummyDeviceProvider extends ScryptedDeviceBase implements DeviceProvider,
constructor(nativeId?: string) {
super(nativeId);
this.systemDevice = {
deviceCreator: 'Dummy Switch',
};
for (const camId of deviceManager.getNativeIds()) {
if (camId)
this.getDevice(camId);

View File

@@ -1,5 +1,5 @@
import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from "@scrypted/common/src/settings-mixin";
import { BinarySensor, DeviceState, EventListenerRegister, MixinProvider, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings } from "@scrypted/sdk";
import { BinarySensor, EventListenerRegister, MixinProvider, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings, WritableDeviceState } from "@scrypted/sdk";
import { StorageSettings } from "@scrypted/sdk/storage-settings";
export const ReplaceBinarySensorNativeId = 'replaceBinarySensor';
@@ -63,7 +63,7 @@ export class ReplaceBinarySensor extends ScryptedDeviceBase implements MixinProv
];
}
async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: DeviceState): Promise<any> {
async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: WritableDeviceState): Promise<any> {
return new ReplaceBinarySensorMixin({
group: 'Custom Doorbell Button',
groupKey: 'replaceBinarySensor',

View File

@@ -1,5 +1,5 @@
import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from "@scrypted/common/src/settings-mixin";
import { DeviceState, EventListenerRegister, MixinProvider, MotionSensor, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings } from "@scrypted/sdk";
import { EventListenerRegister, MixinProvider, MotionSensor, ScryptedDevice, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, Setting, SettingValue, Settings, WritableDeviceState } from "@scrypted/sdk";
import { StorageSettings } from "@scrypted/sdk/storage-settings";
export const ReplaceMotionSensorNativeId = 'replaceMotionSensor';
@@ -63,7 +63,7 @@ export class ReplaceMotionSensor extends ScryptedDeviceBase implements MixinProv
];
}
async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: DeviceState): Promise<any> {
async getMixin(mixinDevice: any, mixinDeviceInterfaces: ScryptedInterface[], mixinDeviceState: WritableDeviceState): Promise<any> {
return new ReplaceMotionSensorMixin({
group: 'Custom Motion Sensor',
groupKey: 'replaceMotionSensor',

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/ffmpeg-camera",
"version": "0.0.22",
"version": "0.0.23",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/ffmpeg-camera",
"version": "0.0.22",
"version": "0.0.23",
"license": "Apache",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/ffmpeg-camera",
"version": "0.0.22",
"version": "0.0.23",
"description": "FFmpeg Camera Plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",
@@ -27,6 +27,8 @@
"name": "FFmpeg Camera Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator"
],

View File

@@ -130,6 +130,10 @@ export abstract class CameraProviderBase<T extends ResponseMediaStreamOptions> e
constructor(nativeId?: string) {
super(nativeId);
this.systemDevice = {
deviceCreator: this.getScryptedDeviceCreator(),
};
}
async createDevice(settings: DeviceCreatorSettings, nativeId?: ScryptedNativeId): Promise<string> {
@@ -173,6 +177,7 @@ export abstract class CameraProviderBase<T extends ResponseMediaStreamOptions> e
}
abstract createCamera(nativeId: string): CameraBase<T>;
abstract getScryptedDeviceCreator(): string;
getDevice(nativeId: string) {
let ret = this.devices.get(nativeId);

View File

@@ -130,6 +130,10 @@ class FFmpegProvider extends CameraProviderBase<UrlMediaStreamOptions> {
createCamera(nativeId: string): FFmpegCamera {
return new FFmpegCamera(nativeId, this);
}
getScryptedDeviceCreator(): string {
return 'FFmpeg Camera';
}
}
export default new FFmpegProvider();

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/hikvision",
"version": "0.0.149",
"version": "0.0.150",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/hikvision",
"version": "0.0.149",
"version": "0.0.150",
"license": "Apache",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/hikvision",
"version": "0.0.149",
"version": "0.0.150",
"description": "Hikvision Plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",
@@ -27,6 +27,8 @@
"name": "Hikvision Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator"
],

View File

@@ -593,6 +593,10 @@ class HikvisionProvider extends RtspProvider {
super();
}
getScryptedDeviceCreator(): string {
return 'Hikvision Camera';
}
getAdditionalInterfaces() {
return [
ScryptedInterface.Reboot,

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/mqtt",
"version": "0.0.81",
"version": "0.0.82",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/mqtt",
"version": "0.0.81",
"version": "0.0.82",
"dependencies": {
"aedes": "^0.46.1",
"axios": "^0.23.0",

View File

@@ -22,6 +22,8 @@
"name": "MQTT",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"MixinProvider",
"DeviceProvider",
"DeviceCreator",
@@ -41,5 +43,5 @@
"@types/node": "^18.4.2",
"@types/nunjucks": "^3.2.0"
},
"version": "0.0.81"
"version": "0.0.82"
}

View File

@@ -362,6 +362,10 @@ export class MqttProvider extends ScryptedDeviceBase implements DeviceProvider,
constructor(nativeId?: string) {
super(nativeId);
this.systemDevice = {
deviceCreator: 'MQTT Device',
};
this.maybeEnableBroker();
for (const deviceId of deviceManager.getNativeIds()) {

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/objectdetector",
"version": "0.1.42",
"version": "0.1.43",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/objectdetector",
"version": "0.1.42",
"version": "0.1.43",
"license": "Apache-2.0",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/objectdetector",
"version": "0.1.42",
"version": "0.1.43",
"description": "Scrypted Video Analysis Plugin. Installed alongside a detection service like OpenCV or TensorFlow.",
"author": "Scrypted",
"license": "Apache-2.0",
@@ -35,6 +35,8 @@
"name": "Video Analysis Plugin",
"type": "API",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceCreator",
"DeviceProvider",
"Settings",

View File

@@ -1016,7 +1016,9 @@ export class ObjectDetectionPlugin extends AutoenableMixinProvider implements Se
constructor(nativeId?: ScryptedNativeId) {
super(nativeId, 'v5');
this.createdDevice = 'Smart Motion Sensor';
this.systemDevice = {
deviceCreator: 'Smart Motion Sensor',
};
process.nextTick(() => {
sdk.deviceManager.onDeviceDiscovered({

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/onvif",
"version": "0.1.14",
"version": "0.1.15",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@scrypted/onvif",
"version": "0.1.14",
"version": "0.1.15",
"license": "Apache",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/onvif",
"version": "0.1.14",
"version": "0.1.15",
"description": "ONVIF Camera Plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",
@@ -27,6 +27,8 @@
"name": "ONVIF Camera Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator",
"DeviceDiscovery"

View File

@@ -466,6 +466,10 @@ class OnvifProvider extends RtspProvider implements DeviceDiscovery {
})
}
getScryptedDeviceCreator(): string {
return 'ONVIF Camera';
}
async getDevice(nativeId: string) {
if (nativeId === 'ptz')
return new OnvifPTZMixinProvider('ptz');

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/reolink",
"version": "0.0.82",
"version": "0.0.83",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@scrypted/reolink",
"version": "0.0.82",
"version": "0.0.83",
"license": "Apache",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/reolink",
"version": "0.0.82",
"version": "0.0.83",
"description": "Reolink Plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",
@@ -27,6 +27,8 @@
"name": "Reolink Camera Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator"
],

View File

@@ -667,6 +667,10 @@ class ReolinkCamera extends RtspSmartCamera implements Camera, DeviceProvider, R
}
class ReolinkProvider extends RtspProvider {
getScryptedDeviceCreator(): string {
return 'Reolink Camera';
}
getAdditionalInterfaces() {
return [
ScryptedInterface.Reboot,

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/rtsp",
"version": "0.0.54",
"version": "0.0.55",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@scrypted/rtsp",
"version": "0.0.54",
"version": "0.0.55",
"license": "Apache",
"dependencies": {
"@scrypted/common": "file:../../common",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/rtsp",
"version": "0.0.54",
"version": "0.0.55",
"description": "RTSP Cameras and Streams Plugin for Scrypted",
"author": "Scrypted",
"license": "Apache",
@@ -27,6 +27,8 @@
"name": "RTSP Camera Plugin",
"type": "DeviceProvider",
"interfaces": [
"ScryptedSystemDevice",
"ScryptedDeviceCreator",
"DeviceProvider",
"DeviceCreator"
],

View File

@@ -1,3 +1,7 @@
import { RtspProvider } from "./rtsp";
export default new RtspProvider();
export default class RTSPCameraProvider extends RtspProvider {
getScryptedDeviceCreator(): string {
return 'RTSP Camera';
}
}

View File

@@ -375,7 +375,7 @@ export abstract class RtspSmartCamera extends RtspCamera {
}
}
export class RtspProvider extends CameraProviderBase<UrlMediaStreamOptions> {
export abstract class RtspProvider extends CameraProviderBase<UrlMediaStreamOptions> {
createCamera(nativeId: string): RtspCamera {
return new RtspCamera(nativeId, this);
}

4
sdk/package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/sdk",
"version": "0.3.32",
"version": "0.3.35",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/sdk",
"version": "0.3.32",
"version": "0.3.35",
"license": "ISC",
"dependencies": {
"@babel/preset-typescript": "^7.18.6",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/sdk",
"version": "0.3.32",
"version": "0.3.35",
"description": "",
"main": "dist/src/index.js",
"exports": {

View File

@@ -1,12 +1,12 @@
{
"name": "@scrypted/types",
"version": "0.3.31",
"version": "0.3.33",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@scrypted/types",
"version": "0.3.31",
"version": "0.3.33",
"license": "ISC",
"devDependencies": {
"@types/node": "^18.19.15",

View File

@@ -1,6 +1,6 @@
{
"name": "@scrypted/types",
"version": "0.3.31",
"version": "0.3.33",
"description": "",
"main": "dist/index.js",
"author": "",

View File

@@ -172,8 +172,11 @@ class ScryptedInterface(str, Enum):
Scene = "Scene"
Scriptable = "Scriptable"
ScryptedDevice = "ScryptedDevice"
ScryptedDeviceCreator = "ScryptedDeviceCreator"
ScryptedPlugin = "ScryptedPlugin"
ScryptedPluginRuntime = "ScryptedPluginRuntime"
ScryptedSettings = "ScryptedSettings"
ScryptedSystemDevice = "ScryptedSystemDevice"
ScryptedUser = "ScryptedUser"
SecuritySystem = "SecuritySystem"
Settings = "Settings"
@@ -794,6 +797,11 @@ class ScryptedRuntimeArguments(TypedDict):
arguments: list[str]
executable: str
class ScryptedSystemDeviceInfo(TypedDict):
deviceCreator: str # The description of device that will be created by this DeviceCreator. For example: Example Corp Camera or ACME Light Switch.
settings: str # The name of the device as seen in System Settings.
class ScryptedUserAccessControl(TypedDict):
"""ScryptedUserAccessControl describes the list of devices that may be accessed by the user."""
@@ -982,7 +990,6 @@ class ColorSettingTemperature:
class DeviceCreator:
"""A DeviceProvider that allows the user to create a device."""
createdDevice: str # Type of device that will be created by this DeviceCreator. For example: Example Corp Camera or ACME Light Switch.
async def createDevice(self, settings: DeviceCreatorSettings) -> str:
pass
@@ -1389,6 +1396,11 @@ class ScryptedDevice:
pass
class ScryptedDeviceCreator:
pass
class ScryptedPlugin:
async def getPluginJson(self) -> Any:
@@ -1399,6 +1411,16 @@ class ScryptedPluginRuntime:
scryptedRuntimeArguments: ScryptedRuntimeArguments
class ScryptedSettings:
pass
class ScryptedSystemDevice:
"""SystemDevices are listed in the Scrypted UI."""
systemDevice: ScryptedSystemDeviceInfo # Type of device that will be created by this DeviceCreator. For example: Example Corp Camera or ACME Light Switch.
class ScryptedUser:
"""ScryptedUser represents a user managed by Scrypted. This interface can not be implemented, only extended by Mixins."""
@@ -1757,7 +1779,6 @@ class ScryptedInterfaceProperty(str, Enum):
ptzCapabilities = "ptzCapabilities"
lockState = "lockState"
entryOpen = "entryOpen"
createdDevice = "createdDevice"
batteryLevel = "batteryLevel"
chargeState = "chargeState"
online = "online"
@@ -1788,6 +1809,7 @@ class ScryptedInterfaceProperty(str, Enum):
humiditySetting = "humiditySetting"
fan = "fan"
applicationInfo = "applicationInfo"
systemDevice = "systemDevice"
class ScryptedInterfaceMethods(str, Enum):
listen = "listen"
@@ -2153,14 +2175,6 @@ class DeviceState:
def entryOpen(self, value: bool | Any):
self.setScryptedProperty("entryOpen", value)
@property
def createdDevice(self) -> str:
return self.getScryptedProperty("createdDevice")
@createdDevice.setter
def createdDevice(self, value: str):
self.setScryptedProperty("createdDevice", value)
@property
def batteryLevel(self) -> float:
return self.getScryptedProperty("batteryLevel")
@@ -2401,6 +2415,14 @@ class DeviceState:
def applicationInfo(self, value: LauncherApplicationInfo):
self.setScryptedProperty("applicationInfo", value)
@property
def systemDevice(self) -> ScryptedSystemDeviceInfo:
return self.getScryptedProperty("systemDevice")
@systemDevice.setter
def systemDevice(self, value: ScryptedSystemDeviceInfo):
self.setScryptedProperty("systemDevice", value)
ScryptedInterfaceDescriptors = {
"ScryptedDevice": {
"name": "ScryptedDevice",
@@ -2727,9 +2749,7 @@ ScryptedInterfaceDescriptors = {
"createDevice",
"getCreateDeviceSettings"
],
"properties": [
"createdDevice"
]
"properties": []
},
"Battery": {
"name": "Battery",
@@ -3105,6 +3125,23 @@ ScryptedInterfaceDescriptors = {
"connectStream"
],
"properties": []
},
"ScryptedSystemDevice": {
"name": "ScryptedSystemDevice",
"methods": [],
"properties": [
"systemDevice"
]
},
"ScryptedDeviceCreator": {
"name": "ScryptedDeviceCreator",
"methods": [],
"properties": []
},
"ScryptedSettings": {
"name": "ScryptedSettings",
"methods": [],
"properties": []
}
}

View File

@@ -1037,11 +1037,6 @@ export interface DeviceCreator {
* Return the id of the created device.
*/
createDevice(settings: DeviceCreatorSettings): Promise<string>;
/**
* Type of device that will be created by this DeviceCreator.
* For example: Example Corp Camera or ACME Light Switch.
*/
createdDevice?: string;
}
export interface DiscoveredDevice {
name: string;
@@ -1190,6 +1185,34 @@ export interface Settings {
putSetting(key: string, value: SettingValue): Promise<void>;
}
/**
* SystemDevices are listed in the Scrypted UI.
*/
export interface ScryptedSystemDevice {
/**
* Type of device that will be created by this DeviceCreator.
* For example: Example Corp Camera or ACME Light Switch.
*/
systemDevice?: ScryptedSystemDeviceInfo;
}
export interface ScryptedSystemDeviceInfo {
/**
* The name of the device as seen in System Settings.
*/
settings?: string;
/**
* The description of device that will be created by this DeviceCreator.
* For example: Example Corp Camera or ACME Light Switch.
*/
deviceCreator?: string;
}
export interface ScryptedSettings {
}
export interface ScryptedDeviceCreator {
}
export interface BinarySensor {
binaryState?: boolean;
}
@@ -2106,6 +2129,10 @@ export enum ScryptedInterface {
ScryptedUser = "ScryptedUser",
VideoFrameGenerator = 'VideoFrameGenerator',
StreamService = 'StreamService',
ScryptedSystemDevice = "ScryptedSystemDevice",
ScryptedDeviceCreator = "ScryptedDeviceCreator",
ScryptedSettings = "ScryptedSettings",
}
/**

View File

@@ -13,7 +13,7 @@
"@mapbox/node-pre-gyp": "^1.0.11",
"@scrypted/ffmpeg-static": "^6.1.0-build1",
"@scrypted/node-pty": "^1.0.14",
"@scrypted/types": "^0.3.31",
"@scrypted/types": "^0.3.33",
"adm-zip": "^0.5.14",
"body-parser": "^1.20.2",
"cookie-parser": "^1.4.6",
@@ -711,9 +711,9 @@
}
},
"node_modules/@scrypted/types": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.31.tgz",
"integrity": "sha512-ZmpHMhCp5Aw6AaRKCTc6+y5u1gaNU6MxktWfeuFQ3djMdeI2XVWbpN9o/uTVeyqCHJzBnFTg1JM52sU9bJpolw=="
"version": "0.3.33",
"resolved": "https://registry.npmjs.org/@scrypted/types/-/types-0.3.33.tgz",
"integrity": "sha512-te81NcMnzQsxv0z4efARDbqMBiGzOPD2H+mOzcYCr2Cm2wpvYMwVt576MoXX890Bxn8omh2aRsFK4xSFTlUWSQ=="
},
"node_modules/@types/adm-zip": {
"version": "0.5.5",

View File

@@ -6,7 +6,7 @@
"@mapbox/node-pre-gyp": "^1.0.11",
"@scrypted/ffmpeg-static": "^6.1.0-build1",
"@scrypted/node-pty": "^1.0.14",
"@scrypted/types": "^0.3.31",
"@scrypted/types": "^0.3.33",
"adm-zip": "^0.5.14",
"body-parser": "^1.20.2",
"cookie-parser": "^1.4.6",