import { ScryptedNativeId, ScryptedDevice, Device, DeviceManifest, EventDetails, EventListenerOptions, EventListenerRegister, ScryptedInterfaceProperty, MediaObject, SystemDeviceState, MediaManager, HttpRequest } from '@scrypted/sdk/types' export interface PluginLogger { log(level: string, message: string): Promise; clear(): Promise; clearAlert(message: string): Promise; clearAlerts(): Promise; } export interface PluginAPI { setState(nativeId: ScryptedNativeId, key: string, value: any): Promise; onDevicesChanged(deviceManifest: DeviceManifest): Promise; onDeviceDiscovered(device: Device): Promise; onDeviceEvent(nativeId: ScryptedNativeId, eventInterface: any, eventData?: any): Promise; onMixinEvent(id: string, nativeId: ScryptedNativeId, eventInterface: any, eventData?: any): Promise; onDeviceRemoved(nativeId: string): Promise; setStorage(nativeId: string, storage: {[key: string]: any}): Promise; getDeviceById(id: string): Promise; setDeviceProperty(id: string, property: ScryptedInterfaceProperty, value: any): Promise; removeDevice(id: string): Promise; listen(EventListener: (id: string, eventDetails: EventDetails, eventData: any) => void): Promise; listenDevice(id: string, event: string | EventListenerOptions, callback: (eventDetails: EventDetails, eventData: object) => void): Promise; ioClose(id: string): Promise; ioSend(id: string, message: string): Promise; deliverPush(endpoint: string, request: HttpRequest): Promise; getLogger(nativeId: ScryptedNativeId): Promise; getComponent(id: string): Promise; getMediaManager(): Promise; requestRestart(): Promise; } class EventListenerRegisterProxy implements EventListenerRegister { removeListener() { this.listeners.delete(this); this.listener.removeListener(); } constructor(public listener: EventListenerRegister, public listeners: Set) { this.listeners.add(this); } } export class PluginAPIManagedListeners { listeners = new Set(); manageListener(listener: EventListenerRegister): EventListenerRegister { return new EventListenerRegisterProxy(listener, this.listeners); } removeListeners() { for (const l of [...this.listeners]) { l.removeListener(); } this.listeners.clear(); } } export class PluginAPIProxy extends PluginAPIManagedListeners implements PluginAPI { constructor(public api: PluginAPI, public mediaManager?: MediaManager) { super(); } setState(nativeId: ScryptedNativeId, key: string, value: any): Promise { return this.api.setState(nativeId, key, value); } onDevicesChanged(deviceManifest: DeviceManifest): Promise { return this.api.onDevicesChanged(deviceManifest); } onDeviceDiscovered(device: Device): Promise { return this.api.onDeviceDiscovered(device); } onDeviceEvent(nativeId: ScryptedNativeId, eventInterface: any, eventData?: any): Promise { return this.api.onDeviceEvent(nativeId, eventInterface, eventData); } onMixinEvent(id: string, nativeId: ScryptedNativeId, eventInterface: any, eventData?: any): Promise { return this.api.onMixinEvent(nativeId, eventInterface, eventData); } onDeviceRemoved(nativeId: string): Promise { return this.api.onDeviceRemoved(nativeId); } setStorage(nativeId: ScryptedNativeId, storage: { [key: string]: any; }): Promise { return this.api.setStorage(nativeId, storage); } getDeviceById(id: string): Promise { return this.api.getDeviceById(id); } setDeviceProperty(id: string, property: ScryptedInterfaceProperty, value: any): Promise { return this.api.setDeviceProperty(id, property, value); } removeDevice(id: string): Promise { return this.api.removeDevice(id); } async listen(EventListener: (id: string, eventDetails: EventDetails, eventData: any) => void): Promise { return this.manageListener(await this.api.listen(EventListener)); } async listenDevice(id: string, event: string | EventListenerOptions, callback: (eventDetails: EventDetails, eventData: object) => void): Promise { return this.manageListener(await this.api.listenDevice(id, event, callback)); } ioClose(id: string): Promise { return this.api.ioClose(id); } ioSend(id: string, message: string): Promise { return this.api.ioSend(id, message); } deliverPush(endpoint: string, request: HttpRequest): Promise { return this.api.deliverPush(endpoint, request); } getLogger(nativeId: ScryptedNativeId): Promise { return this.api.getLogger(nativeId); } getComponent(id: string): Promise { return this.api.getComponent(id); } async getMediaManager(): Promise { return this.mediaManager; } async requestRestart() { return this.api.requestRestart(); } } export interface PluginRemoteLoadZipOptions { filename?: string; } export interface PluginRemote { loadZip(packageJson: any, zipData: Buffer, options?: PluginRemoteLoadZipOptions): Promise; setSystemState(state: {[id: string]: {[property: string]: SystemDeviceState}}): Promise; setNativeId(nativeId: ScryptedNativeId, id: string, storage: {[key: string]: any}): Promise; updateDescriptor(id: string, state: {[property: string]: SystemDeviceState}): Promise; notify(id: string, eventTime: number, eventInterface: string, property: string|undefined, value: SystemDeviceState|any, changed?: boolean): Promise; ioEvent(id: string, event: string, message?: any): Promise; createDeviceState(id: string, setState: (property: string, value: any) => Promise): Promise; getServicePort(name: string): Promise; } export interface MediaObjectRemote extends MediaObject { getData(): Promise; }