@camera.ui/browser 0.0.94 → 0.0.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.
Files changed (47) hide show
  1. package/dist/bundle.js +1 -1
  2. package/dist/types/packages/client/browser/src/proxy/cameraDevice.d.ts +3 -1
  3. package/dist/types/packages/client/browser/src/proxy/coreManager.d.ts +2 -2
  4. package/dist/types/packages/common/src/utils/subscribed.d.ts +9 -0
  5. package/dist/types/packages/plugineer/src/polyglot/node/camera/index.d.ts +4 -3
  6. package/dist/types/packages/plugineer/src/polyglot/node/camera/interfaces/prebuffer.d.ts +1 -2
  7. package/dist/types/packages/plugineer/src/polyglot/node/camera/types.d.ts +15 -0
  8. package/dist/types/packages/plugineer/src/polyglot/node/plugins/types.d.ts +136 -0
  9. package/dist/types/packages/plugineer/src/types.d.ts +4 -0
  10. package/dist/types/packages/{common/src/messaging/index.d.ts → plugineer/src/utils/messageQueue.d.ts} +3 -3
  11. package/dist/types/packages/types/src/index.d.ts +657 -0
  12. package/dist/types/server/src/api/database/types.d.ts +1 -122
  13. package/dist/types/server/src/api/schemas/cameras.schema.d.ts +89 -69
  14. package/dist/types/server/src/api/schemas/config.schema.d.ts +6 -6
  15. package/dist/types/server/src/api/schemas/go2rtc.schema.d.ts +84 -84
  16. package/dist/types/server/src/api/schemas/plugins.schema.d.ts +5 -5
  17. package/dist/types/server/src/api/schemas/users.schema.d.ts +48 -48
  18. package/dist/types/server/src/api/services/cameras.service.d.ts +6 -5
  19. package/dist/types/server/src/api/types/index.d.ts +3 -3
  20. package/dist/types/server/src/api/utils/cameraSource.d.ts +2 -0
  21. package/dist/types/server/src/api/websocket/nsp/plugins.d.ts +1 -1
  22. package/dist/types/server/src/api/websocket/types.d.ts +1 -1
  23. package/dist/types/server/src/api.d.ts +2 -2
  24. package/dist/types/server/src/camera/controller.d.ts +13 -3
  25. package/dist/types/server/src/camera/types.d.ts +1 -318
  26. package/dist/types/server/src/decoder/types.d.ts +0 -127
  27. package/dist/types/server/src/decoder/worker.d.ts +2 -2
  28. package/dist/types/server/src/nats/index.d.ts +4 -4
  29. package/dist/types/server/src/nats/proxy/cameraDevice.d.ts +3 -3
  30. package/dist/types/server/src/nats/proxy/coreManager.d.ts +3 -5
  31. package/dist/types/server/src/nats/proxy/deviceManager.d.ts +3 -5
  32. package/dist/types/server/src/nats/types.d.ts +3 -101
  33. package/dist/types/server/src/nats/utils.d.ts +1 -1
  34. package/dist/types/server/src/nats/websocket.d.ts +2 -2
  35. package/dist/types/server/src/plugins/plugin.d.ts +2 -2
  36. package/dist/types/server/src/plugins/types.d.ts +1 -181
  37. package/dist/types/server/src/plugins/worker.d.ts +1 -1
  38. package/dist/types/server/src/services/config/constants.d.ts +2 -1
  39. package/dist/types/server/src/services/config/types.d.ts +1 -5
  40. package/dist/types/shared/types/index.d.ts +4 -3
  41. package/package.json +4 -4
  42. package/dist/types/server/src/plugins/interfaces/audioDetection.d.ts +0 -7
  43. package/dist/types/server/src/plugins/interfaces/base.d.ts +0 -6
  44. package/dist/types/server/src/plugins/interfaces/motionDetection.d.ts +0 -6
  45. package/dist/types/server/src/plugins/interfaces/objectDetection.d.ts +0 -7
  46. /package/dist/types/packages/{common/src/nats/index.d.ts → plugineer/src/utils/nats.d.ts} +0 -0
  47. /package/dist/types/packages/{common/src/packer/index.d.ts → plugineer/src/utils/packer.d.ts} +0 -0
@@ -0,0 +1,657 @@
1
+ import type { Observable, ReplaySubject, Subject, Subscription } from 'rxjs';
2
+ import type sharp from 'sharp';
3
+ import type { ConnectionState, RTCIceCandidate, RTCSessionDescription, RtpPacket } from 'werift';
4
+ export type { ConnectionState, RTCIceCandidate, RTCSessionDescription, RtpPacket, sharp };
5
+ export type JSONValue = string | number | boolean | JSONObject | JSONArray;
6
+ export interface JSONObject {
7
+ [key: string]: JSONValue;
8
+ }
9
+ export type JSONArray = JSONValue[];
10
+ export type Path = Array<number | string> | number | string;
11
+ export type CameraType = 'camera' | 'doorbell';
12
+ export type ZoneType = 'intersect' | 'contain';
13
+ export type ZoneFilter = 'include' | 'exclude';
14
+ export type ObjectClass = 'person' | 'bicycle' | 'car' | 'motorcycle' | 'airplane' | 'bus' | 'train' | 'truck' | 'boat' | 'traffic light' | 'fire hydrant' | 'stop sign' | 'parking meter' | 'bench' | 'bird' | 'cat' | 'dog' | 'horse' | 'sheep' | 'cow' | 'elephant' | 'bear' | 'zebra' | 'giraffe' | 'backpack' | 'umbrella' | 'handbag' | 'tie' | 'suitcase' | 'frisbee' | 'skis' | 'snowboard' | 'sports ball' | 'kite' | 'baseball bat' | 'baseball glove' | 'skateboard' | 'surfboard' | 'tennis racket' | 'bottle' | 'wine glass' | 'cup' | 'fork' | 'knife' | 'spoon' | 'bowl' | 'banana' | 'apple' | 'sandwich' | 'orange' | 'broccoli' | 'carrot' | 'hot dog' | 'pizza' | 'donut' | 'cake' | 'chair' | 'couch' | 'potted plant' | 'bed' | 'dining table' | 'toilet' | 'tv' | 'laptop' | 'mouse' | 'remote' | 'keyboard' | 'cell phone' | 'microwave' | 'oven' | 'toaster' | 'sink' | 'refrigerator' | 'book' | 'clock' | 'vase' | 'scissors' | 'teddy bear' | 'hair drier' | 'toothbrush' | 'motion';
15
+ export type CameraRoles = 'high-resolution' | 'mid-resolution' | 'low-resolution' | 'snapshot';
16
+ export type Container = 'mp4' | 'mpegts';
17
+ export type DecoderFormat = 'yuv' | 'rgb';
18
+ export type ImageInputFormat = 'yuv' | 'rgb' | 'rgba' | 'gray';
19
+ export type ImageOutputFormat = 'rgb' | 'rgba' | 'gray';
20
+ export type CameraExtension = 'hub' | 'prebuffer' | 'motionDetection' | 'objectDetection' | 'audioDetection' | 'ptz';
21
+ export type CameraFrameWorkerDecoder = 'pillow' | 'wasm';
22
+ export type CameraFrameWorkerResolution = 640 | 480 | 320;
23
+ export type AudioCodec = 'PCMU' | 'PCMA' | 'MPEG4-GENERIC' | 'opus' | 'G722' | 'MPA' | 'PCM' | 'FLAC';
24
+ export type AudioFFmpegCodec = 'pcm_mulaw' | 'pcm_alaw' | 'aac' | 'libopus' | 'g722' | 'mp3' | 'pcm_s16be' | 'pcm_s16le' | 'flac';
25
+ export type VideoCodec = 'H264' | 'H265' | 'VP8' | 'VP9' | 'AV1' | 'JPEG' | 'RAW';
26
+ export type VideoFFmpegCodec = 'h264' | 'hevc' | 'vp8' | 'vp9' | 'av1' | 'mjpeg' | 'rawvideo';
27
+ export interface CameraInformation {
28
+ model?: string;
29
+ manufacturer?: string;
30
+ hardware?: string;
31
+ serialNumber?: string;
32
+ firmwareVersion?: string;
33
+ supportUrl?: string;
34
+ }
35
+ export type Point = [number, number];
36
+ export type BoundingBox = [number, number, number, number];
37
+ export interface Detection {
38
+ id?: string;
39
+ label: ObjectClass;
40
+ confidence: number;
41
+ boundingBox: BoundingBox;
42
+ inputWidth: number;
43
+ inputHeight: number;
44
+ origWidth: number;
45
+ origHeight: number;
46
+ }
47
+ export interface ZoneCoord {
48
+ _id: string;
49
+ points: Point;
50
+ }
51
+ export interface ZoneRegion {
52
+ _id: string;
53
+ coords: ZoneCoord[];
54
+ type: ZoneType;
55
+ filter: ZoneFilter;
56
+ classes: ObjectClass[];
57
+ isPrivacyMask: boolean;
58
+ }
59
+ export interface CameraZone {
60
+ name: string;
61
+ regions: ZoneRegion[];
62
+ }
63
+ export interface DetectionZone {
64
+ name: string;
65
+ points: Point[];
66
+ type: ZoneType;
67
+ filter: ZoneFilter;
68
+ classes: ObjectClass[];
69
+ isPrivacyMask: boolean;
70
+ }
71
+ export interface MotionDetectionSettings {
72
+ timeout: number;
73
+ }
74
+ export interface ObjectDetectionSettings {
75
+ confidence: number;
76
+ }
77
+ export interface CameraActivitySettings {
78
+ motion: MotionDetectionSettings;
79
+ object: ObjectDetectionSettings;
80
+ }
81
+ export interface CameraFrameWorkerSettings {
82
+ decoder: CameraFrameWorkerDecoder;
83
+ fps: number;
84
+ resolution: CameraFrameWorkerResolution;
85
+ }
86
+ export interface CameraInput {
87
+ readonly _id: string;
88
+ name: string;
89
+ roles: CameraRoles[];
90
+ urls: StreamUrls;
91
+ internal: boolean;
92
+ }
93
+ export interface PrebufferState {
94
+ url?: string;
95
+ duration?: number;
96
+ }
97
+ export interface AudioCodecProperties {
98
+ sampleRate: number;
99
+ channels: number;
100
+ payloadType: number;
101
+ }
102
+ export interface VideoCodecProperties {
103
+ clockRate: number;
104
+ payloadType: number;
105
+ }
106
+ export interface AudioStreamInfo {
107
+ codec: AudioCodec;
108
+ ffmpegCodec: AudioFFmpegCodec;
109
+ properties: AudioCodecProperties;
110
+ direction: 'sendonly' | 'recvonly';
111
+ }
112
+ export interface VideoStreamInfo {
113
+ codec: VideoCodec;
114
+ ffmpegCodec: VideoFFmpegCodec;
115
+ properties: VideoCodecProperties;
116
+ direction: 'sendonly';
117
+ }
118
+ export interface ProbeStream {
119
+ sdp: string;
120
+ audio: AudioStreamInfo[];
121
+ video: VideoStreamInfo;
122
+ }
123
+ export interface StreamUrls {
124
+ ws: Go2RtcWSSource;
125
+ rtsp: Go2RtcRTSPSource;
126
+ www: Go2RtcEndpoint;
127
+ }
128
+ export interface Go2RtcRTSPSource {
129
+ single: string;
130
+ default: string;
131
+ mp4: string;
132
+ }
133
+ export interface Go2RtcEndpoint {
134
+ webrtc: string;
135
+ mse: string;
136
+ lmp4: string;
137
+ mmp4: string;
138
+ mp4: string;
139
+ mp4Snapshot: string;
140
+ jpegSnapshot: string;
141
+ lHlsTs: string;
142
+ lHlsFmp4: string;
143
+ mHlsFmp4: string;
144
+ mjpeg: string;
145
+ mjpegHtml: string;
146
+ }
147
+ export interface Go2RtcSource {
148
+ name: string;
149
+ src: string;
150
+ ws: string;
151
+ }
152
+ export interface Go2RtcWSSource {
153
+ webrtc: string;
154
+ }
155
+ export interface BaseState<T extends LightState | AudioState | MotionState | ObjectState | SirenState | BatteryState | DoorbellState> {
156
+ timestamp: number;
157
+ lastEvent?: Omit<T, 'lastEvent'>;
158
+ }
159
+ export interface MotionSetEvent {
160
+ state?: boolean;
161
+ detections: Detection[];
162
+ }
163
+ export interface AudioSetEvent {
164
+ state: boolean;
165
+ db?: number;
166
+ }
167
+ export interface ObjectSetEvent {
168
+ detections: Detection[];
169
+ }
170
+ export interface LightSetEvent {
171
+ state: boolean;
172
+ }
173
+ export interface DoorbellSetEvent {
174
+ state: boolean;
175
+ }
176
+ export interface SirenSetEvent {
177
+ state: boolean;
178
+ level?: number;
179
+ }
180
+ export interface BatterySetEvent {
181
+ level: number;
182
+ lowBattery?: boolean;
183
+ charging?: boolean;
184
+ }
185
+ export type LightState = BaseState<LightState> & LightSetEvent;
186
+ export type MotionState = BaseState<MotionState> & MotionSetEvent;
187
+ export type AudioState = BaseState<AudioState> & AudioSetEvent;
188
+ export type DoorbellState = BaseState<DoorbellState> & DoorbellSetEvent;
189
+ export type SirenState = BaseState<SirenState> & SirenSetEvent;
190
+ export type ObjectState = BaseState<ObjectState> & ObjectSetEvent;
191
+ export type BatteryState = BaseState<BatteryState> & BatterySetEvent;
192
+ export interface StateValues {
193
+ light: LightState;
194
+ motion: MotionState;
195
+ audio: AudioState;
196
+ object: ObjectState;
197
+ doorbell: DoorbellState;
198
+ siren: SirenState;
199
+ battery: BatteryState;
200
+ }
201
+ export interface SetValues {
202
+ light: LightSetEvent;
203
+ motion: MotionSetEvent;
204
+ audio: AudioSetEvent;
205
+ object: ObjectSetEvent;
206
+ doorbell: DoorbellSetEvent;
207
+ siren: SirenSetEvent;
208
+ battery: BatterySetEvent;
209
+ }
210
+ export interface FrameData {
211
+ frameId: string;
212
+ timestamp: number;
213
+ }
214
+ export interface FrameMetadata {
215
+ format: DecoderFormat;
216
+ frameSize: number;
217
+ width: number;
218
+ origWidth: number;
219
+ height: number;
220
+ origHeight: number;
221
+ }
222
+ export interface ImageInformation {
223
+ width: number;
224
+ height: number;
225
+ channels: 1 | 3 | 4;
226
+ format: ImageInputFormat;
227
+ }
228
+ export interface ImageCrop {
229
+ top: number;
230
+ left: number;
231
+ width: number;
232
+ height: number;
233
+ }
234
+ export interface ImageResize {
235
+ width?: number;
236
+ height?: number;
237
+ }
238
+ export interface ImageFormat {
239
+ to: ImageOutputFormat;
240
+ }
241
+ export interface ImageOptions {
242
+ format?: ImageFormat;
243
+ crop?: ImageCrop;
244
+ resize?: ImageResize;
245
+ }
246
+ export interface FrameImage {
247
+ image: sharp.Sharp;
248
+ info: ImageInformation;
249
+ }
250
+ export interface FrameBuffer {
251
+ image: Uint8Array;
252
+ info: ImageInformation;
253
+ }
254
+ export interface VideoFrame {
255
+ readonly frameData: FrameData;
256
+ readonly metadata: FrameMetadata;
257
+ readonly inputWidth: number;
258
+ readonly inputHeight: number;
259
+ readonly inputFormat: DecoderFormat;
260
+ toBuffer(options?: ImageOptions): Promise<FrameBuffer>;
261
+ toImage(options?: ImageOptions): Promise<FrameImage>;
262
+ save(path: string, options?: ImageOptions): Promise<void>;
263
+ }
264
+ export interface MotionFrame extends VideoFrame {
265
+ readonly motion: MotionState;
266
+ }
267
+ export interface CameraInputSettings {
268
+ readonly _id: string;
269
+ name: string;
270
+ roles: CameraRoles[];
271
+ urls: string[];
272
+ internal: boolean;
273
+ }
274
+ export interface CameraConfigInputSettings extends Omit<CameraInputSettings, '_id' | 'internal'> {
275
+ }
276
+ export interface BaseCameraConfig {
277
+ name: string;
278
+ nativeId?: string;
279
+ isCloud?: boolean;
280
+ hasLight?: boolean;
281
+ hasSiren?: boolean;
282
+ hasBinarySensor?: boolean;
283
+ hasBattery?: boolean;
284
+ disabled?: boolean;
285
+ info?: Partial<CameraInformation>;
286
+ }
287
+ export type CameraConfig = BaseCameraConfig & {
288
+ sources: CameraConfigInputSettings[];
289
+ };
290
+ export interface CameraDelegate {
291
+ snapshot(): Promise<ArrayBuffer | undefined>;
292
+ }
293
+ export interface CameraPrebufferDelegate {
294
+ getPrebufferingState(sourceName: string, container: Container): Promise<PrebufferState | undefined>;
295
+ }
296
+ export interface CameraPTZDelegate {
297
+ moveAbsolute(pan: number, tilt: number, zoom: number): Promise<void>;
298
+ moveRelative(pan: number, tilt: number, zoom: number): Promise<void>;
299
+ moveContinuous(pan: number, tilt: number, zoom: number): Promise<void>;
300
+ stop(): Promise<void>;
301
+ }
302
+ export interface CameraDelegates {
303
+ cameraDelegate: CameraDelegate;
304
+ prebufferDelegate: CameraPrebufferDelegate;
305
+ ptzDelegate: CameraPTZDelegate;
306
+ }
307
+ export interface CameraSource extends CameraInput {
308
+ getPrebufferingState(container: Container): Promise<PrebufferState | undefined>;
309
+ probeStream(): Promise<ProbeStream | undefined>;
310
+ }
311
+ export interface CameraInternalSource extends CameraSource {
312
+ type: 'aac' | 'opus' | 'pcma';
313
+ }
314
+ export interface CameraDeviceSource extends CameraSource {
315
+ createSession(options?: StreamingConnectionOptions): WeriftSession;
316
+ }
317
+ export interface CameraDeviceInternalSource extends CameraDeviceSource, CameraInternalSource {
318
+ }
319
+ export interface StreamingConnectionOptions {
320
+ createPeerConnection?: () => BasicPeerConnection;
321
+ iceServers?: IceServer[];
322
+ }
323
+ export interface Subscribed {
324
+ addSubscriptions(...subscriptions: Subscription[]): void;
325
+ addAdditionalSubscriptions(...subscriptions: Subscription[]): void;
326
+ unsubscribe(): void;
327
+ unsubscribeAdditional(): void;
328
+ }
329
+ export interface WeriftSession extends Subscribed {
330
+ readonly onCallEnded: ReplaySubject<void>;
331
+ readonly onVideoRtp: Subject<RtpPacket>;
332
+ readonly onAudioRtp: Subject<RtpPacket>;
333
+ reservePort(bufferPorts?: number): Promise<number>;
334
+ startTranscoding(ffmpegOptions: FfmpegOptions): Promise<void>;
335
+ transcodeReturnAudio(ffmpegOptions: {
336
+ ffmpegPath: string;
337
+ input: SpawnInput[];
338
+ }): Promise<void>;
339
+ stop(): void;
340
+ sendAudioPacket(rtp: RtpPacket): void;
341
+ requestKeyFrame(): void;
342
+ }
343
+ export type SpawnInput = string | number;
344
+ export interface FfmpegOptions {
345
+ ffmpegPath: string;
346
+ input?: SpawnInput[];
347
+ video?: SpawnInput[];
348
+ audio?: SpawnInput[];
349
+ output: SpawnInput[];
350
+ logger?: {
351
+ error: (...args: any[]) => void;
352
+ info: (...args: any[]) => void;
353
+ };
354
+ }
355
+ export interface BasicPeerConnection {
356
+ createOffer(): Promise<RTCSessionDescription>;
357
+ acceptAnswer(answer: {
358
+ type: 'answer';
359
+ sdp: string;
360
+ }): Promise<void>;
361
+ addIceCandidate(candidate: Partial<RTCIceCandidate>): Promise<void>;
362
+ onIceCandidate: Subject<RTCIceCandidate>;
363
+ onConnectionState: Observable<ConnectionState>;
364
+ close(): void;
365
+ requestKeyFrame?: () => void;
366
+ }
367
+ export interface BaseCamera {
368
+ readonly _id: string;
369
+ nativeId?: string;
370
+ pluginId: string;
371
+ name: string;
372
+ disabled: boolean;
373
+ isCloud: boolean;
374
+ hasLight: boolean;
375
+ hasSiren: boolean;
376
+ hasBinarySensor: boolean;
377
+ hasBattery: boolean;
378
+ info: CameraInformation;
379
+ type: CameraType;
380
+ activityZones: CameraZone[];
381
+ activitySettings: CameraActivitySettings;
382
+ frameWorkerSettings: CameraFrameWorkerSettings;
383
+ }
384
+ export interface Camera extends Omit<BaseCamera, 'activityZones'> {
385
+ hasAudioDetector: boolean;
386
+ hasMotionDetector: boolean;
387
+ hasObjectDetector: boolean;
388
+ hasPtz: boolean;
389
+ hasPrebuffer: boolean;
390
+ sources: CameraInput[];
391
+ activityZones: DetectionZone[];
392
+ }
393
+ export interface CameraDevice {
394
+ readonly id: string;
395
+ readonly nativeId: string | undefined;
396
+ readonly pluginId: string;
397
+ readonly connected: boolean;
398
+ readonly disabled: boolean;
399
+ readonly name: string;
400
+ readonly type: CameraType;
401
+ readonly info: CameraInformation;
402
+ readonly isCloud: boolean;
403
+ readonly hasLight: boolean;
404
+ readonly hasSiren: boolean;
405
+ readonly hasBinarySensor: boolean;
406
+ readonly hasBattery: boolean;
407
+ readonly hasMotionDetector: boolean;
408
+ readonly hasAudioDetector: boolean;
409
+ readonly hasObjectDetector: boolean;
410
+ readonly hasPtz: boolean;
411
+ readonly hasPrebuffer: boolean;
412
+ readonly activityZones: DetectionZone[];
413
+ readonly activitySettings: CameraActivitySettings;
414
+ readonly frameWorkerSettings: CameraFrameWorkerSettings;
415
+ readonly ptz: CameraPTZDelegate;
416
+ readonly streamSource: CameraDeviceSource;
417
+ readonly highResolutionSource: CameraDeviceSource | undefined;
418
+ readonly midResolutionSource: CameraDeviceSource | undefined;
419
+ readonly lowResolutionSource: CameraDeviceSource | undefined;
420
+ readonly snapshotSource: CameraSource | undefined;
421
+ readonly sources: CameraDeviceSource[];
422
+ readonly internalSources: CameraDeviceInternalSource[];
423
+ readonly onConnected: Observable<boolean>;
424
+ readonly onLightSwitched: Observable<LightState>;
425
+ readonly onMotionDetected: Observable<MotionState>;
426
+ readonly onAudioDetected: Observable<AudioState>;
427
+ readonly onObjectDetected: Observable<ObjectState>;
428
+ readonly onDoorbellPressed: Observable<DoorbellState>;
429
+ readonly onSirenDetected: Observable<SirenState>;
430
+ readonly onBatteryChanged: Observable<BatteryState>;
431
+ snapshot(forceNew?: boolean): Promise<ArrayBuffer | undefined>;
432
+ onStateChange<T extends keyof StateValues>(stateName: T): Observable<{
433
+ newState: StateValues[T];
434
+ oldState: StateValues[T];
435
+ }>;
436
+ onPropertyChange<T extends keyof Camera>(property: T | T[]): Observable<{
437
+ property: T;
438
+ oldData: Camera[T];
439
+ newData: Camera[T];
440
+ }>;
441
+ getValue<T extends keyof StateValues>(stateName: T): StateValues[T];
442
+ setDelegate<T extends keyof CameraDelegates>(delegateName: T, delegate: CameraDelegates[T]): void;
443
+ connect(): Promise<void>;
444
+ disconnect(): Promise<void>;
445
+ getFrames(prebufferDuration?: number): AsyncIterableIterator<VideoFrame>;
446
+ getMotionFrames(): AsyncIterableIterator<MotionFrame>;
447
+ updateState<T extends keyof Omit<SetValues, 'motion'>>(stateName: T, eventData: SetValues[T]): Promise<void>;
448
+ updateState(stateName: 'motion', eventData: MotionSetEvent, frame?: VideoFrame): Promise<void>;
449
+ addCameraSource(source: CameraConfigInputSettings): Promise<void>;
450
+ updateCameraSource(sourceId: string, source: Partial<CameraConfigInputSettings>): Promise<void>;
451
+ removeCameraSource(sourceId: string): Promise<void>;
452
+ }
453
+ export interface DeviceManager {
454
+ createCamera(cameraConfig: CameraConfig): Promise<CameraDevice>;
455
+ getCameraByName(cameraName: string): Promise<CameraDevice | undefined>;
456
+ getCameraById(cameraId: string): Promise<CameraDevice | undefined>;
457
+ removeCameraByName(cameraName: string): Promise<void>;
458
+ removeCameraById(cameraId: string): Promise<void>;
459
+ on(event: 'cameraSelected', listener: (camera: CameraDevice, extension: CameraExtension) => void): this;
460
+ on(event: 'cameraDeselected', listener: (cameraId: string, extension: CameraExtension) => void): this;
461
+ once(event: 'cameraSelected', listener: (camera: CameraDevice, extension: CameraExtension) => void): this;
462
+ once(event: 'cameraDeselected', listener: (cameraId: string, extension: CameraExtension) => void): this;
463
+ off(event: 'cameraSelected', listener: (camera: CameraDevice, extension: CameraExtension) => void): this;
464
+ off(event: 'cameraDeselected', listener: (cameraId: string, extension: CameraExtension) => void): this;
465
+ removeListener(event: 'cameraSelected', listener: (camera: CameraDevice, extension: CameraExtension) => void): this;
466
+ removeListener(event: 'cameraDeselected', listener: (cameraId: string, extension: CameraExtension) => void): this;
467
+ removeAllListeners(event?: 'cameraSelected' | 'cameraDeselected'): this;
468
+ }
469
+ export interface CoreManager {
470
+ getFFmpegPath(): Promise<string>;
471
+ getHwaccelInfo(): Promise<FfmpegArgs>;
472
+ getServerAddresses(): Promise<string[]>;
473
+ getIceServers(): Promise<IceServer[]>;
474
+ }
475
+ export interface FfmpegArgs {
476
+ hwaccel: string;
477
+ hwaccelArgs: string[];
478
+ hwaccelFilter: string;
479
+ threads: string;
480
+ }
481
+ export interface IceServer {
482
+ urls: string[];
483
+ username?: string;
484
+ credential?: string;
485
+ }
486
+ export type PluginConfig<T = Record<string, any>> = T;
487
+ export type JsonSchemaType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'button';
488
+ export interface JsonBaseSchema<T = any> {
489
+ type: JsonSchemaType;
490
+ key?: string;
491
+ title?: string;
492
+ description?: string;
493
+ required?: boolean;
494
+ readonly?: boolean;
495
+ placeholder?: string;
496
+ hidden?: boolean;
497
+ group?: string;
498
+ defaultValue?: T;
499
+ store?: boolean;
500
+ onSet?: (newValue: any, oldValue: any) => Promise<void>;
501
+ onGet?: () => Promise<any>;
502
+ }
503
+ export interface JsonSchemaString extends JsonBaseSchema<string> {
504
+ type: 'string';
505
+ format?: 'date-time' | 'date' | 'time' | 'email' | 'uuid' | 'ipv4' | 'ipv6' | 'password' | 'qrCode' | 'image';
506
+ minLength?: number;
507
+ maxLength?: number;
508
+ }
509
+ export interface JsonSchemaNumber extends JsonBaseSchema<number> {
510
+ type: 'number';
511
+ minimum?: number;
512
+ maximum?: number;
513
+ step?: number;
514
+ }
515
+ export interface JsonSchemaBoolean extends JsonBaseSchema<boolean> {
516
+ type: 'boolean';
517
+ }
518
+ export interface JsonSchemaEnum extends JsonBaseSchema<string> {
519
+ type: 'string';
520
+ enum: string[];
521
+ multiple?: boolean;
522
+ }
523
+ export interface JsonSchemaObject extends JsonBaseSchema {
524
+ type: 'object';
525
+ opened?: boolean;
526
+ properties?: JsonSchemaForm;
527
+ }
528
+ export interface JsonSchemaArray extends JsonBaseSchema {
529
+ type: 'array';
530
+ opened?: boolean;
531
+ items?: JsonSchema;
532
+ }
533
+ export interface JsonSchemaButton extends JsonBaseSchema {
534
+ type: 'button';
535
+ }
536
+ export interface JsonSchemaObjectButton {
537
+ label: string;
538
+ onSubmit: string;
539
+ }
540
+ export interface JsonSchemaObjectWithButtons extends JsonSchemaObject {
541
+ buttons: JsonSchemaObjectButton[];
542
+ }
543
+ export type JsonSchema = JsonSchemaString | JsonSchemaNumber | JsonSchemaBoolean | JsonSchemaEnum | JsonSchemaObject | JsonSchemaObjectWithButtons | JsonSchemaArray | JsonSchemaButton;
544
+ export interface JsonSchemaForm {
545
+ [key: string]: JsonSchema;
546
+ }
547
+ export interface RootSchema {
548
+ schema: JsonSchemaForm;
549
+ }
550
+ export interface ToastMessage {
551
+ type: 'info' | 'success' | 'warning' | 'error';
552
+ message: string;
553
+ }
554
+ export interface FormSubmitSchema {
555
+ config: JsonSchemaObjectWithButtons;
556
+ }
557
+ export interface FormSubmitResponse {
558
+ toast?: ToastMessage;
559
+ schema?: FormSubmitSchema;
560
+ }
561
+ export interface SchemaConfig {
562
+ rootSchema: RootSchema;
563
+ config: Record<string, any>;
564
+ }
565
+ export interface ImageMetadata {
566
+ width: number;
567
+ height: number;
568
+ }
569
+ export interface AudioMetadata {
570
+ mimeType: 'audio/mpeg' | 'audio/wav' | 'audio/ogg';
571
+ }
572
+ export interface MotionDetectionPluginResponse {
573
+ filePath: string;
574
+ }
575
+ export interface ObjectDetectionPluginResponse {
576
+ detections: Detection[];
577
+ }
578
+ export interface AudioDetectionPluginResponse {
579
+ detected: boolean;
580
+ }
581
+ export interface BasePlugin {
582
+ onFormSubmit(actionId: string, payload: any): Promise<FormSubmitResponse | void>;
583
+ configureCameras(cameras: CameraDevice[]): void;
584
+ }
585
+ export interface AudioDetectionPlugin extends BasePlugin {
586
+ interfaceSchema(): RootSchema | void;
587
+ detectAudio(audioPath: string, metadata: AudioMetadata, config: Record<string, any>): Promise<AudioDetectionPluginResponse>;
588
+ }
589
+ export interface MotionDetectionPlugin extends BasePlugin {
590
+ interfaceSchema(): RootSchema | void;
591
+ detectMotion(videoPath: string, config: Record<string, any>): Promise<MotionDetectionPluginResponse>;
592
+ }
593
+ export interface ObjectDetectionPlugin extends BasePlugin {
594
+ interfaceSchema(): RootSchema | void;
595
+ detectObjects(imagePath: string, metadata: ImageMetadata, config: Record<string, any>): Promise<ObjectDetectionPluginResponse>;
596
+ }
597
+ export interface LoggerService {
598
+ log: (...args: any[]) => void;
599
+ error: (...args: any[]) => void;
600
+ warn: (...args: any[]) => void;
601
+ debug: (...args: any[]) => void;
602
+ trace: (...args: any[]) => void;
603
+ attention: (...args: any[]) => void;
604
+ }
605
+ export interface PluginAPI {
606
+ readonly coreManager: CoreManager;
607
+ readonly deviceManager: DeviceManager;
608
+ readonly storageController: StorageController;
609
+ readonly configService: ConfigService;
610
+ readonly storagePath: string;
611
+ readonly configFile: string;
612
+ on(event: 'finishLaunching', listener: () => void): this;
613
+ on(event: 'shutdown', listener: () => void): this;
614
+ once(event: 'finishLaunching', listener: () => void): this;
615
+ once(event: 'shutdown', listener: () => void): this;
616
+ off(event: 'finishLaunching', listener: () => void): this;
617
+ off(event: 'shutdown', listener: () => void): this;
618
+ removeListener(event: 'finishLaunching', listener: () => void): this;
619
+ removeListener(event: 'shutdown', listener: () => void): this;
620
+ removeAllListeners(event?: 'shutdown' | 'finishLaunching'): this;
621
+ }
622
+ export interface ConfigService {
623
+ get(key: Path, defaultValue: JSONValue, validate: Function, refresh?: boolean, writeIfNotValid?: boolean): any;
624
+ get(key: Path, defaultValue?: unknown, validate?: Function, refresh?: boolean, writeIfNotValid?: boolean): any;
625
+ has(key: Path, refresh?: boolean): boolean;
626
+ ensureExists(key: Path, defaultValue: JSONValue, write?: boolean): void;
627
+ set(key: Path, value: any, write?: boolean): void;
628
+ insert(key: Path, value: any, at?: number, write?: boolean): void;
629
+ push(key: Path, write?: boolean, ...items: any[]): void;
630
+ delete(key: Path, write?: boolean): void;
631
+ all(refresh?: boolean): PluginConfig;
632
+ replace(config: PluginConfig, write?: boolean): void;
633
+ updateValue(path: string, searchKey: string, searchValue: any, targetKey: string, newValue: any, write?: boolean): void;
634
+ replaceOrAddItem(path: string, searchKey: string, searchValue: any, newItem: any, write?: boolean): void;
635
+ }
636
+ export interface CameraStorage<T extends Record<string, any> = Record<string, any>> {
637
+ schema: JsonSchemaForm;
638
+ values: T;
639
+ initializeStorage(): void;
640
+ getValue<U = string>(path: string): Promise<U> | undefined;
641
+ getValue<U = string>(path: string, defaultValue: U): Promise<U>;
642
+ setValue<U = string>(path: string, newValue: U): Promise<void>;
643
+ hasValue(path: string): boolean;
644
+ getConfig(): Promise<SchemaConfig>;
645
+ setConfig(newConfig: T): Promise<void>;
646
+ addSchema(schema: JsonSchemaForm): Promise<void>;
647
+ addSchema(path: string, schema: JsonSchema): Promise<void>;
648
+ removeSchema(path: string): void;
649
+ changeSchema(path: string, newSchema: Partial<JsonSchema>): Promise<void>;
650
+ getSchema<U>(path: string): U | undefined;
651
+ hasSchema(path: string): boolean;
652
+ }
653
+ export interface StorageController {
654
+ createCameraStorage<T extends Record<string, any> = Record<string, any>>(instance: any, cameraId: string, schema?: JsonSchemaForm): CameraStorage<T>;
655
+ getCameraStorage<T extends Record<string, any> = Record<string, any>>(cameraId: string): CameraStorage<T> | undefined;
656
+ removeCameraStorage(cameraId: string): void;
657
+ }