@camera.ui/sdk 0.0.2 → 0.0.4

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 (76) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +3 -3
  3. package/dist/camera/events.js +2 -0
  4. package/dist/camera/index.js +3 -1
  5. package/dist/external.js +7 -0
  6. package/dist/index.d.ts +7132 -4248
  7. package/dist/index.js +3 -11
  8. package/dist/internal/contract-validators.js +21 -0
  9. package/dist/internal/index.d.ts +915 -0
  10. package/dist/internal/index.js +9 -0
  11. package/dist/internal/sensor-triggers.js +2 -0
  12. package/dist/internal/shared-utils.js +86 -0
  13. package/dist/internal/streaming-internal.js +1 -0
  14. package/dist/manager/index.js +1 -1
  15. package/dist/observable/index.js +419 -0
  16. package/dist/plugin/api.js +21 -0
  17. package/dist/plugin/contract.js +101 -114
  18. package/dist/plugin/helper.js +277 -0
  19. package/dist/plugin/index.js +4 -1
  20. package/dist/plugin/interfaces.js +51 -1
  21. package/dist/plugin/notifier.js +23 -0
  22. package/dist/plugin/oauth.js +1 -0
  23. package/dist/sensor/audio.js +103 -81
  24. package/dist/sensor/base.js +350 -318
  25. package/dist/sensor/battery.js +73 -59
  26. package/dist/sensor/classifier.js +117 -0
  27. package/dist/sensor/clip.js +30 -0
  28. package/dist/sensor/contact.js +37 -18
  29. package/dist/sensor/detection.js +4 -0
  30. package/dist/sensor/doorbell.js +52 -38
  31. package/dist/sensor/face.js +71 -86
  32. package/dist/sensor/garage.js +121 -0
  33. package/dist/sensor/humidity.js +52 -0
  34. package/dist/sensor/index.js +17 -11
  35. package/dist/sensor/leak.js +52 -0
  36. package/dist/sensor/licensePlate.js +70 -79
  37. package/dist/sensor/light.js +82 -38
  38. package/dist/sensor/lock.js +99 -0
  39. package/dist/sensor/motion.js +85 -70
  40. package/dist/sensor/object.js +73 -94
  41. package/dist/sensor/occupancy.js +52 -0
  42. package/dist/sensor/ptz.js +114 -100
  43. package/dist/sensor/securitySystem.js +98 -0
  44. package/dist/sensor/siren.js +75 -43
  45. package/dist/sensor/smoke.js +52 -0
  46. package/dist/sensor/spec.js +1 -0
  47. package/dist/sensor/switch.js +72 -0
  48. package/dist/sensor/temperature.js +52 -0
  49. package/dist/storage/index.js +1 -2
  50. package/dist/types.js +1 -0
  51. package/docs/.vitepress/config.ts +77 -0
  52. package/docs/.vitepress/theme/index.ts +5 -0
  53. package/docs/.vitepress/theme/style.css +117 -0
  54. package/docs/index.md +16 -0
  55. package/docs/logo.png +0 -0
  56. package/docs/public/apple-touch-icon.png +0 -0
  57. package/docs/public/favicon-16.ico +0 -0
  58. package/docs/public/favicon.ico +0 -0
  59. package/docs/public/logo.svg +1 -0
  60. package/examples/README.md +7 -0
  61. package/examples/getting-started.md +535 -0
  62. package/package.json +36 -23
  63. package/scripts/build-example-docs.mjs +62 -0
  64. package/tsconfig.node.json +3 -2
  65. package/typedoc.json +42 -0
  66. package/dist/sensor/guards.js +0 -133
  67. package/dist/sensor/types.js +0 -46
  68. package/dist/service/base.js +0 -96
  69. package/dist/service/index.js +0 -3
  70. /package/dist/camera/{types.js → enums.js} +0 -0
  71. /package/dist/{manager/types.js → camera/frames.js} +0 -0
  72. /package/dist/{plugin/types.js → internal/camera-config-internal.js} +0 -0
  73. /package/dist/{service/services.js → internal/camera-enums.js} +0 -0
  74. /package/dist/{service/types.js → internal/camera-wire.js} +0 -0
  75. /package/dist/{storage/schema.js → internal/manager-rpc.js} +0 -0
  76. /package/dist/{storage/storages.js → internal/sensor-rpc.js} +0 -0
@@ -1,118 +1,140 @@
1
- import { Sensor } from './base.js';
2
- import { SensorCategory, SensorType } from './types.js';
1
+ import { Sensor, SensorType, SensorCategory } from './base.js';
2
+ /** Built-in audio label types recognized across the system. */
3
+ export const BASE_AUDIO_LABELS = [
4
+ 'doorbell',
5
+ 'glass_break',
6
+ 'siren',
7
+ 'speaking',
8
+ 'gunshot',
9
+ 'dog_bark',
10
+ 'baby_cry',
11
+ 'alarm',
12
+ 'scream',
13
+ 'cat',
14
+ 'car_alarm',
15
+ 'smoke_alarm',
16
+ ];
3
17
  /**
4
- * Audio sensor property keys
18
+ * Property names of an audio detection sensor.
19
+ *
20
+ * @internal
5
21
  */
6
22
  export var AudioProperty;
7
23
  (function (AudioProperty) {
24
+ /** Whether an audio event is currently detected. */
8
25
  AudioProperty["Detected"] = "detected";
26
+ /** List of detected audio events (e.g. glass break, scream). */
9
27
  AudioProperty["Detections"] = "detections";
28
+ /** Current audio level in decibels. */
10
29
  AudioProperty["Decibels"] = "decibels";
30
+ /** Timestamp in milliseconds of the last detection trigger, set by the backend. */
31
+ AudioProperty["LastTriggered"] = "lastTriggered";
11
32
  })(AudioProperty || (AudioProperty = {}));
12
33
  /**
13
- * Audio Sensor
14
- *
15
- * Base class for external audio detection (Ring, ONVIF events, etc.)
16
- * Properties can be set directly: `sensor.detected = true`
34
+ * Audio sensor that reports audio events and decibel levels.
17
35
  *
18
- * For audio-stream-based detection, use `AudioDetectorSensor` instead.
36
+ * Plugin authors call `reportDetections(list)` to push detected audio events
37
+ * (auto-derives `detected`) and `setDecibels(value)` to update the audio level.
19
38
  */
20
39
  export class AudioSensor extends Sensor {
21
40
  type = SensorType.Audio;
22
41
  category = SensorCategory.Sensor;
23
- name;
24
- /**
25
- * External audio sensors don't require audio frames.
26
- * They receive detection events from external sources (APIs, ONVIF, etc.)
27
- */
28
42
  _requiresFrames = false;
29
43
  constructor(name = 'Audio Sensor') {
30
- super();
31
- this.name = name;
32
- // Initialize defaults
33
- this.props.detected = false;
34
- this.props.detections = [];
35
- this.props.decibels = 0;
44
+ super(name);
45
+ this._writeState({
46
+ [AudioProperty.Detected]: false,
47
+ [AudioProperty.Detections]: [],
48
+ [AudioProperty.Decibels]: 0,
49
+ });
36
50
  }
37
- /** Whether audio event is currently detected */
51
+ /** Whether an audio event is currently detected. */
38
52
  get detected() {
39
- return this.rawProps.detected;
53
+ return this.props.detected;
40
54
  }
41
- /** Set audio detected state */
42
- set detected(value) {
43
- this.props.detected = value;
44
- }
45
- /** Current audio detections */
55
+ /** Current detection list. */
46
56
  get detections() {
47
- return this.rawProps.detections;
48
- }
49
- /** Set audio detections */
50
- set detections(value) {
51
- this.props.detections = value;
57
+ return this.props.detections;
52
58
  }
53
- /** Current decibel level */
59
+ /** Current audio level in decibels. */
54
60
  get decibels() {
55
- return this.rawProps.decibels;
61
+ return this.props.decibels;
56
62
  }
57
- /** Set decibel level */
58
- set decibels(value) {
59
- this.props.decibels = value;
63
+ /**
64
+ * Report detected audio events.
65
+ *
66
+ * - `reportDetections(true)` — audio detected without specifics. The SDK
67
+ * synthesizes a single full-frame `'audio'` detection.
68
+ * - `reportDetections(true, [...])` — audio detected with explicit detections.
69
+ * - `reportDetections(false)` — clear.
70
+ *
71
+ * @param detected - Whether an audio event is currently detected.
72
+ *
73
+ * @param detections - Optional explicit detections produced for this event.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * import type { Detection } from '@camera.ui/sdk';
78
+ * sensor.reportDetections(true, [
79
+ * { label: 'glass_break', confidence: 0.91, box: { x: 0, y: 0, width: 1, height: 1 } } satisfies Detection,
80
+ * ]);
81
+ * sensor.reportDetections(false);
82
+ * ```
83
+ */
84
+ reportDetections(detected, detections) {
85
+ const list = this._normalizeReportedDetections(detected, detections, 'audio');
86
+ this._writeState({
87
+ [AudioProperty.Detected]: detected,
88
+ [AudioProperty.Detections]: list,
89
+ });
60
90
  }
61
91
  /**
62
- * Update audio detection state
92
+ * Explicitly clear audio detection state (detected = false, detections = []).
63
93
  *
64
- * @param detected - Whether audio event is currently detected
94
+ * @example
95
+ * ```ts
96
+ * sensor.clearDetections();
97
+ * ```
98
+ */
99
+ clearDetections() {
100
+ this.reportDetections(false);
101
+ }
102
+ /**
103
+ * Update the current audio level (in decibels).
65
104
  *
66
- * @param detections - Array of detection events
105
+ * @param value - Audio level in decibels.
67
106
  *
68
- * @param decibels - Current decibel level
107
+ * @example
108
+ * ```ts
109
+ * sensor.setDecibels(72);
110
+ * ```
69
111
  */
70
- setAudio(detected, detections = [], decibels) {
71
- this.props.detected = detected;
72
- this.props.detections = detections;
73
- if (decibels !== undefined) {
74
- this.props.decibels = decibels;
75
- }
112
+ setDecibels(value) {
113
+ this._writeState({ [AudioProperty.Decibels]: value });
76
114
  }
77
- /** Clear audio detection state */
78
- clearAudio() {
79
- this.props.detected = false;
80
- this.props.detections = [];
81
- this.props.decibels = 0;
115
+ /**
116
+ * Read-only sensor: external writes are ignored. State is reported via `reportDetections`/`setDecibels`.
117
+ *
118
+ * Called by the cross-process plugin host when a generic property write is received.
119
+ * Audio sensors have no externally writable properties, so the parameters are
120
+ * unused (underscore-prefixed) and the call is a no-op.
121
+ *
122
+ * @param _property - Unused — audio sensors expose no writable properties.
123
+ *
124
+ * @param _value - Unused — audio sensors expose no writable properties.
125
+ *
126
+ * @internal
127
+ */
128
+ updateValue(_property, _value) {
129
+ // No-op — audio state is reported by the plugin, not set externally.
82
130
  }
83
131
  }
84
132
  /**
85
- * Audio Detector Sensor (Active Detection)
86
- *
87
- * Use this class for audio-based event detection (glass break, screams, etc.)
88
- * The `inputProperties` getter specifies the required audio input format.
89
- *
90
- * @example
91
- * ```typescript
92
- * class GlassBreakDetector extends AudioDetectorSensor {
93
- * get inputProperties(): AudioInputProperties {
94
- * return { sampleRate: 16000, channels: 1, format: 'pcm16' };
95
- * }
96
- *
97
- * async detectAudio(audio: AudioData): Promise<AudioResult> {
98
- * const events = await this.classifier.classify(audio.data);
99
- * return {
100
- * detected: events.some(e => e.label === 'glass_break'),
101
- * detections: events.map(e => ({
102
- * label: e.label,
103
- * confidence: e.score,
104
- * box: { x: 0, y: 0, width: 1, height: 1 },
105
- * })),
106
- * decibels: audio.decibels,
107
- * };
108
- * }
109
- * }
110
- * ```
133
+ * Audio detector that receives audio frames from the backend pipeline.
134
+ * Extend this class and implement {@link detectAudio} to classify audio events.
135
+ * The backend resamples and buffers audio to match {@link modelSpec} before
136
+ * each call.
111
137
  */
112
138
  export class AudioDetectorSensor extends AudioSensor {
113
- /**
114
- * Indicates this sensor requires audio frames for detection.
115
- * Used by the backend to determine streaming requirements.
116
- */
117
139
  _requiresFrames = true;
118
140
  }