@camera.ui/camera-ui-wasm-motion 0.0.4 → 0.0.6

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.
@@ -0,0 +1,4 @@
1
+ export declare const DEFAULT_MOTION_AREA = 500;
2
+ export declare const DEFAULT_THRESHOLD = 20;
3
+ export declare const DEFAULT_BLUR_RADIUS = 3;
4
+ export declare const DEFAULT_DILATION_SIZE = 15;
@@ -0,0 +1,5 @@
1
+ export const DEFAULT_MOTION_AREA = 500;
2
+ export const DEFAULT_THRESHOLD = 20;
3
+ export const DEFAULT_BLUR_RADIUS = 3;
4
+ export const DEFAULT_DILATION_SIZE = 15;
5
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC"}
@@ -1,24 +1,30 @@
1
1
  import type { CameraDevice, CameraStorage, PluginAPI, PluginLogger } from '@camera.ui/types';
2
+ import type { CameraStorageValues } from './types.js';
2
3
  export declare class CameraDetector {
3
- cameraStorage: CameraStorage;
4
+ cameraStorage: CameraStorage<CameraStorageValues>;
4
5
  private api;
5
6
  private cameraDevice;
6
7
  private logger;
7
8
  private started;
8
9
  private closed;
10
+ private restarting;
9
11
  private wasmModule?;
10
- private firstFramePtr;
12
+ private previousFramePtr;
13
+ private framePtr;
14
+ private boxesPtr;
11
15
  private tempPtr;
12
16
  private visitedPtr;
13
17
  private queuePtr;
14
18
  private memoryBuffer;
15
- private lastFrameTime;
16
19
  constructor(cameraDevice: CameraDevice, api: PluginAPI, logger: PluginLogger);
17
20
  start(): Promise<void>;
21
+ private setupMemory;
18
22
  close(): void;
19
- restart(): void;
23
+ restart(): Promise<void>;
20
24
  private startDetection;
21
- private setupFirstFrame;
25
+ private setupPreviousFrame;
22
26
  private getMotionData;
23
27
  private createCameraStorage;
28
+ private unpinSafe;
29
+ private collectSafe;
24
30
  }
package/dist/detector.js CHANGED
@@ -2,11 +2,7 @@ import { instantiate } from '@assemblyscript/loader';
2
2
  import fs from 'node:fs';
3
3
  import { dirname, resolve } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
- const defaultThreshold = 50;
6
- const defaultBlurRadius = 9;
7
- const defaultDilationSize = 3;
8
- const defaultMotionArea = 250;
9
- const defaultReferenceFrameFrequency = 5;
5
+ import { DEFAULT_BLUR_RADIUS, DEFAULT_DILATION_SIZE, DEFAULT_MOTION_AREA, DEFAULT_THRESHOLD } from './defaults.js';
10
6
  const __filename = fileURLToPath(import.meta.url);
11
7
  const __dirname = dirname(__filename);
12
8
  export class CameraDetector {
@@ -16,14 +12,15 @@ export class CameraDetector {
16
12
  logger;
17
13
  started = false;
18
14
  closed = false;
15
+ restarting = false;
19
16
  wasmModule;
20
- firstFramePtr = null;
17
+ previousFramePtr = null;
18
+ framePtr = 0;
19
+ boxesPtr = 0;
21
20
  tempPtr = 0;
22
21
  visitedPtr = 0;
23
22
  queuePtr = 0;
24
- // private boxesPtr = 0;
25
23
  memoryBuffer;
26
- lastFrameTime = 0;
27
24
  constructor(cameraDevice, api, logger) {
28
25
  this.api = api;
29
26
  this.cameraDevice = cameraDevice;
@@ -53,200 +50,219 @@ export class CameraDetector {
53
50
  },
54
51
  env: {
55
52
  abort: (msg, file, line, column) => {
56
- this.logger.error('WASM Error message: ', this.wasmModule.exports.__getString(msg));
57
- this.logger.error('WASM Error file: ', this.wasmModule.exports.__getString(file));
58
- this.logger.error('WASM Error line: ', line);
59
- this.logger.error('WASM Error column: ', column);
53
+ this.logger.warn(`WASM abort message: ${this.wasmModule.exports.__getString(msg)} at ${this.wasmModule.exports.__getString(file)}:${line}:${column}`);
60
54
  },
61
55
  },
62
56
  });
63
- this.memoryBuffer = new Uint8Array(this.wasmModule.exports.memory.buffer);
64
- const width = this.cameraDevice.frameWorkerSettings.resolution;
65
- const maxFrameLength = width * width;
66
- this.tempPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength, this.wasmModule.exports.Uint8Array_ID.value));
67
- this.visitedPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength, this.wasmModule.exports.Uint8Array_ID.value));
68
- this.queuePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength * 4, this.wasmModule.exports.Uint8Array_ID.value));
69
- // this.boxesPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength * 4, this.wasmModule.exports.Uint8Array_ID.value));
57
+ this.setupMemory();
70
58
  }
71
- this.startDetection();
59
+ this.startDetection().catch((error) => {
60
+ this.logger.error(this.cameraDevice.name, 'Error generating frames', error);
61
+ this.restart();
62
+ });
63
+ }
64
+ }
65
+ setupMemory() {
66
+ if (!this.wasmModule) {
67
+ throw new Error('Wasm not initiated');
72
68
  }
69
+ this.memoryBuffer = new Uint8Array(this.wasmModule.exports.memory.buffer);
70
+ const width = this.cameraDevice.frameWorkerSettings.resolution;
71
+ const maxFrameLength = width * width;
72
+ this.tempPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength, this.wasmModule.exports.Uint8Array_ID.value));
73
+ this.visitedPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength, this.wasmModule.exports.Uint8Array_ID.value));
74
+ this.queuePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength * 4, this.wasmModule.exports.Uint8Array_ID.value));
75
+ // this.boxesPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(maxFrameLength * 4, this.wasmModule.exports.Uint8Array_ID.value));
76
+ this.previousFramePtr = null;
73
77
  }
74
78
  close() {
75
79
  if (this.started && !this.closed) {
76
80
  this.started = false;
77
81
  this.closed = true;
78
82
  this.logger.log(`Stopping motion detection for camera ${this.cameraDevice.name}`);
83
+ this.cameraDevice.updateState('motion', { state: false, detections: [] });
79
84
  }
80
85
  }
81
- restart() {
86
+ async restart() {
87
+ if (this.restarting) {
88
+ return;
89
+ }
90
+ this.restarting = true;
82
91
  this.logger.log(`Restarting motion detection for camera ${this.cameraDevice.name}`);
83
92
  this.close();
93
+ await new Promise((resolve) => setTimeout(resolve, 1000));
84
94
  if (this.cameraDevice.connected) {
85
- this.start();
95
+ await this.start();
86
96
  }
97
+ this.restarting = false;
87
98
  }
88
99
  async startDetection() {
89
- try {
90
- for await (const frame of this.cameraDevice.getFrames()) {
91
- if (this.closed) {
92
- break;
93
- }
94
- const frameImage = await frame.toBuffer({
95
- format: {
96
- to: 'gray',
97
- },
100
+ for await (const frame of this.cameraDevice.getFrames()) {
101
+ if (this.closed || this.restarting) {
102
+ break;
103
+ }
104
+ const frameImage = await frame.toBuffer({
105
+ format: {
106
+ to: 'gray',
107
+ },
108
+ });
109
+ if (this.closed || this.restarting) {
110
+ break;
111
+ }
112
+ const detections = [];
113
+ const dets = this.getMotionData(frameImage.image, frameImage.info.width, frameImage.info.height);
114
+ for (const det of dets) {
115
+ detections.push({
116
+ label: 'motion',
117
+ confidence: 1,
118
+ boundingBox: [det[0], det[1], det[2], det[3]],
119
+ inputWidth: frameImage.info.width,
120
+ inputHeight: frameImage.info.height,
121
+ origWidth: frame.metadata.origWidth,
122
+ origHeight: frame.metadata.origHeight,
98
123
  });
99
- const detections = [];
100
- const dets = this.getMotionData(frameImage.image, frameImage.info.width, frameImage.info.height);
101
- for (const det of dets) {
102
- detections.push({
103
- label: 'motion',
104
- confidence: 1,
105
- boundingBox: [det[0], det[1], det[2], det[3]],
106
- inputWidth: frameImage.info.width,
107
- inputHeight: frameImage.info.height,
108
- origWidth: frame.metadata.origWidth,
109
- origHeight: frame.metadata.origHeight,
110
- });
111
- }
112
- await this.cameraDevice.updateState('motion', { detections: detections }, frame);
113
124
  }
114
- }
115
- catch (error) {
116
- this.logger.error(this.cameraDevice.name, 'Error generating frames', error);
125
+ await this.cameraDevice.updateState('motion', { detections: detections }, frame);
117
126
  }
118
127
  }
119
- setupFirstFrame(frame, width, height, blurRadius) {
120
- if (this.firstFramePtr !== null) {
121
- this.wasmModule.exports.__unpin(this.firstFramePtr);
122
- this.wasmModule.exports.__collect();
123
- this.firstFramePtr = null;
128
+ setupPreviousFrame(frame, width, height, blurRadius) {
129
+ if (this.previousFramePtr !== null) {
130
+ this.unpinSafe(this.previousFramePtr);
131
+ this.collectSafe();
132
+ this.previousFramePtr = null;
124
133
  }
125
134
  const frameLength = width * height;
126
135
  const framePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__newArrayBuffer(frame));
127
136
  this.wasmModule.exports.stackBlur(framePtr, this.tempPtr, width, height, blurRadius);
128
- this.firstFramePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__newArrayBuffer(new Uint8Array(this.memoryBuffer.buffer, framePtr, frameLength)));
129
- this.wasmModule.exports.__unpin(framePtr);
137
+ this.previousFramePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__newArrayBuffer(new Uint8Array(this.memoryBuffer.buffer, framePtr, frameLength)));
138
+ this.unpinSafe(framePtr);
130
139
  }
131
140
  getMotionData(frame, width, height) {
132
141
  if (!this.wasmModule) {
133
142
  throw new Error('Wasm not initiated');
134
143
  }
135
- const motionArea = this.cameraStorage.values.area;
136
- const threshold = this.cameraStorage.values.threshold;
137
- const blurRadius = this.cameraStorage.values.blurRadius;
138
- const dilationSize = this.cameraStorage.values.dilationSize;
139
- const referenceFrameFrequency = this.cameraStorage.values.referenceFrameFrequency;
140
- const now = Date.now();
141
- if (this.firstFramePtr === null || now - this.lastFrameTime > referenceFrameFrequency * 1000) {
142
- this.lastFrameTime = now;
143
- this.setupFirstFrame(frame, width, height, blurRadius);
144
- return [];
144
+ try {
145
+ const motionArea = this.cameraStorage.values.area;
146
+ const threshold = this.cameraStorage.values.threshold;
147
+ const blurRadius = this.cameraStorage.values.blurRadius;
148
+ const dilationSize = this.cameraStorage.values.dilationSize;
149
+ if (this.previousFramePtr === null) {
150
+ this.setupPreviousFrame(frame, width, height, blurRadius);
151
+ return [];
152
+ }
153
+ const frameLength = width * height;
154
+ this.framePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__newArrayBuffer(frame));
155
+ this.boxesPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(frameLength, this.wasmModule.exports.Uint8Array_ID.value));
156
+ this.wasmModule.exports.stackBlur(this.framePtr, this.tempPtr, width, height, blurRadius);
157
+ this.wasmModule.exports.createMotionMask(this.previousFramePtr, this.framePtr, width, height, threshold);
158
+ this.wasmModule.exports.dilate(this.framePtr, this.tempPtr, width, height, dilationSize);
159
+ const numBoxes = this.wasmModule.exports.findBoundingBoxes(this.framePtr, this.visitedPtr, this.queuePtr, this.boxesPtr, width, height, motionArea);
160
+ const boxes = [];
161
+ const boxesArray = new Int32Array(this.wasmModule.exports.memory.buffer, this.boxesPtr, numBoxes * 4);
162
+ for (let i = 0; i < numBoxes; i++) {
163
+ const x = boxesArray[i * 4];
164
+ const y = boxesArray[i * 4 + 1];
165
+ const w = boxesArray[i * 4 + 2];
166
+ const h = boxesArray[i * 4 + 3];
167
+ boxes.push([x, y, x + w, y + h]);
168
+ }
169
+ this.unpinSafe(this.framePtr);
170
+ this.unpinSafe(this.boxesPtr);
171
+ this.collectSafe();
172
+ this.setupPreviousFrame(frame, width, height, blurRadius);
173
+ return boxes;
145
174
  }
146
- const frameLength = width * height;
147
- const framePtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__newArrayBuffer(frame));
148
- const boxesPtr = this.wasmModule.exports.__pin(this.wasmModule.exports.__new(frameLength, this.wasmModule.exports.Uint8Array_ID.value));
149
- this.wasmModule.exports.stackBlur(framePtr, this.tempPtr, width, height, blurRadius);
150
- this.wasmModule.exports.createMotionMask(this.firstFramePtr, framePtr, width, height, threshold);
151
- this.wasmModule.exports.dilate(framePtr, this.tempPtr, width, height, dilationSize);
152
- const numBoxes = this.wasmModule.exports.findBoundingBoxes(framePtr, this.visitedPtr, this.queuePtr, boxesPtr, width, height, motionArea);
153
- const boxes = [];
154
- const boxesArray = new Int32Array(this.wasmModule.exports.memory.buffer, boxesPtr, numBoxes * 4);
155
- for (let i = 0; i < numBoxes; i++) {
156
- const x = boxesArray[i * 4];
157
- const y = boxesArray[i * 4 + 1];
158
- const w = boxesArray[i * 4 + 2];
159
- const h = boxesArray[i * 4 + 3];
160
- boxes.push([x, y, x + w, y + h]);
175
+ catch (error) {
176
+ this.logger.error(this.cameraDevice.name, 'Error generating frames', error);
177
+ return [];
161
178
  }
162
- // console.log('Bounding boxes:', boxes);
163
- this.wasmModule.exports.__unpin(framePtr);
164
- this.wasmModule.exports.__unpin(boxesPtr);
165
- this.wasmModule.exports.__collect();
166
- return boxes;
167
179
  }
168
180
  createCameraStorage() {
169
- let cameraStorage = this.api.storageController.getCameraStorage(this.cameraDevice.id);
170
- if (!cameraStorage) {
171
- cameraStorage = this.api.storageController.createCameraStorage(this, this.cameraDevice.id, {
172
- area: {
173
- type: 'number',
174
- key: 'area',
175
- title: 'Area',
176
- description: 'Minimum area for a motion detection',
177
- store: true,
178
- defaultValue: defaultMotionArea,
179
- minimum: 10,
180
- maximum: 1000,
181
- step: 1,
182
- required: true,
183
- onSet: async (newValue, oldValue) => {
184
- this.logger.log(this.cameraDevice.name, `Motion area changed from ${oldValue} to ${newValue}`);
185
- },
181
+ const cameraStorage = this.api.storageController.createCameraStorage(this, this.cameraDevice.id, {
182
+ area: {
183
+ type: 'number',
184
+ key: 'area',
185
+ title: 'Area',
186
+ description: 'Minimum area for a motion detection',
187
+ store: true,
188
+ defaultValue: DEFAULT_MOTION_AREA,
189
+ minimum: 10,
190
+ maximum: 1000,
191
+ step: 1,
192
+ required: true,
193
+ onSet: async (newValue, oldValue) => {
194
+ this.logger.log(this.cameraDevice.name, `Motion area changed from ${oldValue} to ${newValue}`);
195
+ this.restart();
186
196
  },
187
- threshold: {
188
- type: 'number',
189
- key: 'threshold',
190
- title: 'Threshold',
191
- description: 'Threshold for motion detection',
192
- store: true,
193
- defaultValue: defaultThreshold,
194
- minimum: 1,
195
- maximum: 255,
196
- step: 1,
197
- required: true,
198
- onSet: async (newValue, oldValue) => {
199
- this.logger.log(this.cameraDevice.name, `Motion threshold changed from ${oldValue} to ${newValue}`);
200
- },
197
+ },
198
+ threshold: {
199
+ type: 'number',
200
+ key: 'threshold',
201
+ title: 'Threshold',
202
+ description: 'Threshold for motion detection',
203
+ store: true,
204
+ defaultValue: DEFAULT_THRESHOLD,
205
+ minimum: 1,
206
+ maximum: 255,
207
+ step: 1,
208
+ required: true,
209
+ onSet: async (newValue, oldValue) => {
210
+ this.logger.log(this.cameraDevice.name, `Motion threshold changed from ${oldValue} to ${newValue}`);
211
+ this.restart();
201
212
  },
202
- blurRadius: {
203
- type: 'number',
204
- key: 'blurRadius',
205
- title: 'Blur Radius',
206
- description: 'Blur radius for motion detection',
207
- store: true,
208
- defaultValue: defaultBlurRadius,
209
- minimum: 1,
210
- maximum: 21,
211
- step: 1,
212
- required: true,
213
- onSet: async (newValue, oldValue) => {
214
- this.logger.log(this.cameraDevice.name, `Motion blur radius changed from ${oldValue} to ${newValue}`);
215
- },
213
+ },
214
+ blurRadius: {
215
+ type: 'number',
216
+ key: 'blurRadius',
217
+ title: 'Blur Radius',
218
+ description: 'Blur radius for motion detection',
219
+ store: true,
220
+ defaultValue: DEFAULT_BLUR_RADIUS,
221
+ minimum: 1,
222
+ maximum: 21,
223
+ step: 1,
224
+ required: true,
225
+ onSet: async (newValue, oldValue) => {
226
+ this.logger.log(this.cameraDevice.name, `Motion blur radius changed from ${oldValue} to ${newValue}`);
227
+ this.restart();
216
228
  },
217
- dilationSize: {
218
- type: 'number',
219
- key: 'dilationSize',
220
- title: 'Dilation Size',
221
- description: 'Dilation size for motion detection',
222
- store: true,
223
- defaultValue: defaultDilationSize,
224
- minimum: 1,
225
- maximum: 21,
226
- step: 1,
227
- required: true,
228
- onSet: async (newValue, oldValue) => {
229
- this.logger.log(this.cameraDevice.name, `Motion dilation size changed from ${oldValue} to ${newValue}`);
230
- },
229
+ },
230
+ dilationSize: {
231
+ type: 'number',
232
+ key: 'dilationSize',
233
+ title: 'Dilation Size',
234
+ description: 'Dilation size for motion detection',
235
+ store: true,
236
+ defaultValue: DEFAULT_DILATION_SIZE,
237
+ minimum: 1,
238
+ maximum: 21,
239
+ step: 1,
240
+ required: true,
241
+ onSet: async (newValue, oldValue) => {
242
+ this.logger.log(this.cameraDevice.name, `Motion dilation size changed from ${oldValue} to ${newValue}`);
243
+ this.restart();
231
244
  },
232
- referenceFrameFrequency: {
233
- type: 'number',
234
- key: 'referenceFrameFrequency',
235
- title: 'Reference Frame Frequency',
236
- description: 'Frequency to update the reference frame',
237
- store: true,
238
- defaultValue: defaultReferenceFrameFrequency,
239
- minimum: 1,
240
- maximum: 60,
241
- step: 1,
242
- required: true,
243
- onSet: async (newValue, oldValue) => {
244
- this.logger.log(this.cameraDevice.name, `Motion reference frame frequency changed from ${oldValue}s to ${newValue}s`);
245
- },
246
- },
247
- });
248
- }
245
+ },
246
+ });
249
247
  return cameraStorage;
250
248
  }
249
+ unpinSafe(ptr) {
250
+ if (ptr !== null) {
251
+ try {
252
+ this.wasmModule.exports.__unpin(ptr);
253
+ }
254
+ catch {
255
+ //
256
+ }
257
+ }
258
+ }
259
+ collectSafe() {
260
+ try {
261
+ this.wasmModule.exports.__collect();
262
+ }
263
+ catch {
264
+ //
265
+ }
266
+ }
251
267
  }
252
268
  //# sourceMappingURL=detector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOnH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,OAAO,cAAc;IAClB,aAAa,CAAqC;IAEjD,GAAG,CAAY;IACf,YAAY,CAAe;IAC3B,MAAM,CAAe;IAErB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,KAAK,CAAC;IACf,UAAU,GAAG,KAAK,CAAC;IAEnB,UAAU,CAEhB;IAEM,gBAAgB,GAAkB,IAAI,CAAC;IACvC,QAAQ,GAAG,CAAC,CAAC;IACb,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,CAAC,CAAC;IACZ,UAAU,GAAG,CAAC,CAAC;IACf,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAY,CAAc;IAElC,YAAY,YAA0B,EAAE,GAAc,EAAE,MAAoB;QAC1E,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEhD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACpD,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAElF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;gBAClE,IAAI,CAAC,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;oBAC7D,OAAO,EAAE;wBACP,GAAG,EAAE,CAAC,UAAkB,EAAE,EAAE;4BAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;wBACpE,CAAC;qBACF;oBACD,GAAG,EAAE;wBACH,KAAK,EAAE,CAAC,GAAW,EAAE,IAAY,EAAE,IAAY,EAAE,MAAc,EAAE,EAAE;4BACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;wBAC1J,CAAC;qBACF;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAC;gBAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC;QAC/D,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,CAAC;QAErC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACzI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5I,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9I,iJAAiJ;QACjJ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM;YACR,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;gBACtC,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;iBACX;aACF,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM;YACR,CAAC;YAED,MAAM,UAAU,GAAgB,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEjG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,QAAQ;oBACf,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7C,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK;oBACjC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM;oBACnC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS;oBACnC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,KAAiB,EAAE,KAAa,EAAE,MAAc,EAAE,UAAkB;QAC7F,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;QAElG,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACtF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,YAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAEpK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAEO,aAAa,CAAC,KAA0B,EAAE,KAAa,EAAE,MAAc;QAC7E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;YACxD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC;YAE5D,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC1D,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;YAEnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;YAEvI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC1F,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACzG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAEpJ,MAAM,KAAK,GAAe,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAEtG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAE1D,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC5E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,mBAAmB,CAAsB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE;YACpH,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,MAAM;gBACX,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,qCAAqC;gBAClD,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,mBAAmB;gBACjC,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE;oBAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,4BAA4B,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;oBAC/F,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,CAAC;aACF;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,WAAW;gBAChB,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,iBAAiB;gBAC/B,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,GAAG;gBACZ,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE;oBAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,iCAAiC,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;oBACpG,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,CAAC;aACF;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,YAAY;gBACjB,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,kCAAkC;gBAC/C,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,mBAAmB;gBACjC,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE;oBAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,mCAAmC,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;oBACtG,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,CAAC;aACF;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,cAAc;gBACnB,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,oCAAoC;gBACjD,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,qBAAqB;gBACnC,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE;oBAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,qCAAqC,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;oBACxG,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,CAAC;aACF;SACF,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,SAAS,CAAC,GAAkB;QAClC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC;YACH,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,EAAE;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export interface CameraStorageValues {
2
+ area: number;
3
+ threshold: number;
4
+ blurRadius: number;
5
+ dilationSize: number;
6
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -78,6 +78,11 @@ declare namespace __AdaptedExports {
78
78
  /** @type `u32` */
79
79
  get value(): number
80
80
  };
81
+ /** assembly/index/Int32Array_ID */
82
+ export const Int32Array_ID: {
83
+ /** @type `u32` */
84
+ get value(): number
85
+ };
81
86
  /**
82
87
  * assembly/test/blurFrameSIMD
83
88
  * @param framePtr `usize`
@@ -37,6 +37,13 @@ export async function instantiate(module, imports = {}) {
37
37
  return exports.Uint8Array_ID.value >>> 0;
38
38
  }
39
39
  },
40
+ Int32Array_ID: {
41
+ // assembly/index/Int32Array_ID: u32
42
+ valueOf() { return this.value; },
43
+ get value() {
44
+ return exports.Int32Array_ID.value >>> 0;
45
+ }
46
+ },
40
47
  }, exports);
41
48
  function __liftString(pointer) {
42
49
  if (!pointer) return null;
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "WASM Motion",
3
3
  "name": "@camera.ui/camera-ui-wasm-motion",
4
- "version": "0.0.4",
4
+ "version": "0.0.6",
5
5
  "description": "camera.ui wasm motion detection plugin",
6
6
  "author": "seydx (https://github.com/seydx/camera.ui)",
7
7
  "main": "./dist/index.js",
@@ -16,10 +16,10 @@
16
16
  "prepublishOnly": "npm i --package-lock-only && npm run lint && npm run format && npm run build"
17
17
  },
18
18
  "devDependencies": {
19
- "@camera.ui/types": "^0.0.57",
19
+ "@camera.ui/types": "^0.0.58",
20
20
  "@rushstack/eslint-patch": "^1.10.4",
21
21
  "@types/fs-extra": "^11.0.4",
22
- "@types/node": "^22.4.1",
22
+ "@types/node": "^22.5.0",
23
23
  "@types/ws": "^8.5.12",
24
24
  "@typescript-eslint/eslint-plugin": "^8.2.0",
25
25
  "@typescript-eslint/parser": "^8.2.0",
@@ -42,7 +42,7 @@
42
42
  "url": "https://github.com/seydx/camera.ui/issues"
43
43
  },
44
44
  "engines": {
45
- "camera.ui": ">=0.0.1",
45
+ "camera.ui": ">=0.0.17",
46
46
  "node": ">=18.12.0"
47
47
  },
48
48
  "homepage": "https://github.com/seydx/camera.ui#readme",