@elizaos/capacitor-camera 2.0.0-beta.1 → 2.0.11-beta.7
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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/android/build.gradle +16 -2
- package/dist/esm/web.d.ts +2 -1
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +113 -87
- package/dist/plugin.cjs.js +113 -87
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +113 -87
- package/dist/plugin.js.map +1 -1
- package/package.json +13 -9
package/dist/plugin.cjs.js
CHANGED
|
@@ -14,6 +14,37 @@ const VIDEO_MIME_TYPES = [
|
|
|
14
14
|
"video/mp4",
|
|
15
15
|
];
|
|
16
16
|
const getSupportedMimeType = () => VIDEO_MIME_TYPES.find((m) => MediaRecorder.isTypeSupported(m)) ?? null;
|
|
17
|
+
const getMediaDevices = () => {
|
|
18
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
19
|
+
throw new Error("Camera media devices API is not available");
|
|
20
|
+
}
|
|
21
|
+
return navigator.mediaDevices;
|
|
22
|
+
};
|
|
23
|
+
const assertPositiveFinite = (value, name) => {
|
|
24
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
25
|
+
throw new Error(`${name} must be a positive finite number`);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const assertRecordingOptions = (options) => {
|
|
29
|
+
if (!options)
|
|
30
|
+
return;
|
|
31
|
+
if (options.quality !== undefined &&
|
|
32
|
+
!["low", "medium", "high", "highest"].includes(options.quality)) {
|
|
33
|
+
throw new Error("quality must be one of low, medium, high, or highest");
|
|
34
|
+
}
|
|
35
|
+
if (options.maxDuration !== undefined) {
|
|
36
|
+
assertPositiveFinite(options.maxDuration, "maxDuration");
|
|
37
|
+
}
|
|
38
|
+
if (options.maxFileSize !== undefined) {
|
|
39
|
+
assertPositiveFinite(options.maxFileSize, "maxFileSize");
|
|
40
|
+
}
|
|
41
|
+
if (options.bitrate !== undefined) {
|
|
42
|
+
assertPositiveFinite(options.bitrate, "bitrate");
|
|
43
|
+
}
|
|
44
|
+
if (options.frameRate !== undefined) {
|
|
45
|
+
assertPositiveFinite(options.frameRate, "frameRate");
|
|
46
|
+
}
|
|
47
|
+
};
|
|
17
48
|
class CameraWeb extends core.WebPlugin {
|
|
18
49
|
constructor() {
|
|
19
50
|
super(...arguments);
|
|
@@ -37,27 +68,29 @@ class CameraWeb extends core.WebPlugin {
|
|
|
37
68
|
this.pluginListeners = [];
|
|
38
69
|
}
|
|
39
70
|
async getDevices() {
|
|
40
|
-
// enumerateDevices() returns device
|
|
41
|
-
//
|
|
71
|
+
// enumerateDevices() returns unlabeled device records unless the user has
|
|
72
|
+
// already granted camera permission via a prior getUserMedia() call.
|
|
42
73
|
// We intentionally do NOT call getUserMedia() here because it requires a
|
|
43
74
|
// user gesture and would throw NotAllowedError if called programmatically.
|
|
44
|
-
const
|
|
75
|
+
const mediaDevices = getMediaDevices();
|
|
76
|
+
if (!mediaDevices.enumerateDevices) {
|
|
77
|
+
throw new Error("Camera device enumeration is not available");
|
|
78
|
+
}
|
|
79
|
+
const allDevices = await mediaDevices.enumerateDevices();
|
|
45
80
|
const videoDevices = allDevices.filter((d) => d.kind === "videoinput");
|
|
46
|
-
const devices = await Promise.all(videoDevices.map(async (device, index) => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
};
|
|
60
|
-
}));
|
|
81
|
+
const devices = await Promise.all(videoDevices.map(async (device, index) => ({
|
|
82
|
+
deviceId: device.deviceId,
|
|
83
|
+
label: device.label || `Camera ${index + 1}`,
|
|
84
|
+
direction: this.inferDirection(device.label),
|
|
85
|
+
// Capability probing requires getUserMedia(), which can prompt for
|
|
86
|
+
// camera permission. Enumeration stays prompt-free and reports
|
|
87
|
+
// unknown capabilities until preview/capture has explicit access.
|
|
88
|
+
hasFlash: false,
|
|
89
|
+
hasZoom: false,
|
|
90
|
+
maxZoom: 1,
|
|
91
|
+
supportedResolutions: [],
|
|
92
|
+
supportedFrameRates: [],
|
|
93
|
+
})));
|
|
61
94
|
return { devices };
|
|
62
95
|
}
|
|
63
96
|
inferDirection(label) {
|
|
@@ -74,60 +107,17 @@ class CameraWeb extends core.WebPlugin {
|
|
|
74
107
|
}
|
|
75
108
|
return "external";
|
|
76
109
|
}
|
|
77
|
-
async
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
stream = await navigator.mediaDevices.getUserMedia({
|
|
81
|
-
video: { deviceId: { exact: deviceId } },
|
|
82
|
-
});
|
|
110
|
+
async startPreview(options) {
|
|
111
|
+
if (!options?.element?.appendChild) {
|
|
112
|
+
throw new Error("Preview element is required");
|
|
83
113
|
}
|
|
84
|
-
|
|
85
|
-
|
|
114
|
+
if (options.resolution) {
|
|
115
|
+
assertPositiveFinite(options.resolution.width, "resolution.width");
|
|
116
|
+
assertPositiveFinite(options.resolution.height, "resolution.height");
|
|
86
117
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
stream.getTracks().forEach((t) => {
|
|
90
|
-
t.stop();
|
|
91
|
-
});
|
|
92
|
-
return null;
|
|
118
|
+
if (options.frameRate !== undefined) {
|
|
119
|
+
assertPositiveFinite(options.frameRate, "frameRate");
|
|
93
120
|
}
|
|
94
|
-
const capabilities = track.getCapabilities ? track.getCapabilities() : {};
|
|
95
|
-
stream.getTracks().forEach((t) => {
|
|
96
|
-
t.stop();
|
|
97
|
-
});
|
|
98
|
-
const caps = capabilities;
|
|
99
|
-
// Build resolutions from actual device capabilities only
|
|
100
|
-
const resolutions = [];
|
|
101
|
-
if (caps.width?.max && caps.height?.max) {
|
|
102
|
-
resolutions.push({ width: caps.width.max, height: caps.height.max });
|
|
103
|
-
// Add common lower resolutions only if device supports them
|
|
104
|
-
if (caps.width.max >= 1280 && caps.height.max >= 720) {
|
|
105
|
-
resolutions.push({ width: 1280, height: 720 });
|
|
106
|
-
}
|
|
107
|
-
if (caps.width.max >= 640 && caps.height.max >= 480) {
|
|
108
|
-
resolutions.push({ width: 640, height: 480 });
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// Build frameRates from actual device capabilities only
|
|
112
|
-
const frameRates = [];
|
|
113
|
-
if (caps.frameRate?.max) {
|
|
114
|
-
if (caps.frameRate.max >= 60)
|
|
115
|
-
frameRates.push(60);
|
|
116
|
-
if (caps.frameRate.max >= 30)
|
|
117
|
-
frameRates.push(30);
|
|
118
|
-
if (caps.frameRate.max >= 24)
|
|
119
|
-
frameRates.push(24);
|
|
120
|
-
if (caps.frameRate.max >= 15)
|
|
121
|
-
frameRates.push(15);
|
|
122
|
-
}
|
|
123
|
-
return {
|
|
124
|
-
zoom: caps.zoom,
|
|
125
|
-
resolutions: resolutions.length > 0 ? resolutions : undefined,
|
|
126
|
-
frameRates: frameRates.length > 0 ? frameRates : undefined,
|
|
127
|
-
hasFlash: caps.torch === true, // Torch capability indicates flash support
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
async startPreview(options) {
|
|
131
121
|
await this.stopPreview();
|
|
132
122
|
const constraints = {
|
|
133
123
|
video: {
|
|
@@ -149,13 +139,9 @@ class CameraWeb extends core.WebPlugin {
|
|
|
149
139
|
},
|
|
150
140
|
audio: false,
|
|
151
141
|
};
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
// `packages/agent/src/services/permissions/probers/camera.ts` first,
|
|
156
|
-
// then asks the user, only then opens the stream. Will be retired by
|
|
157
|
-
// the chat-surface migration agent.
|
|
158
|
-
this.mediaStream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
142
|
+
// Browser camera permission is requested by opening the stream. Native
|
|
143
|
+
// permission probing is handled outside this Capacitor web fallback.
|
|
144
|
+
this.mediaStream = await getMediaDevices().getUserMedia(constraints);
|
|
159
145
|
this.previewElement = options.element;
|
|
160
146
|
this.videoElement = document.createElement("video");
|
|
161
147
|
this.videoElement.srcObject = this.mediaStream;
|
|
@@ -189,8 +175,10 @@ class CameraWeb extends core.WebPlugin {
|
|
|
189
175
|
});
|
|
190
176
|
this.mediaStream = null;
|
|
191
177
|
}
|
|
192
|
-
if (this.videoElement
|
|
193
|
-
this.previewElement
|
|
178
|
+
if (this.videoElement) {
|
|
179
|
+
if (this.previewElement?.contains(this.videoElement)) {
|
|
180
|
+
this.previewElement.removeChild(this.videoElement);
|
|
181
|
+
}
|
|
194
182
|
this.videoElement = null;
|
|
195
183
|
}
|
|
196
184
|
this.previewElement = null;
|
|
@@ -216,8 +204,18 @@ class CameraWeb extends core.WebPlugin {
|
|
|
216
204
|
const settings = track.getSettings();
|
|
217
205
|
const videoWidth = settings.width || this.videoElement.videoWidth;
|
|
218
206
|
const videoHeight = settings.height || this.videoElement.videoHeight;
|
|
207
|
+
assertPositiveFinite(videoWidth, "videoWidth");
|
|
208
|
+
assertPositiveFinite(videoHeight, "videoHeight");
|
|
219
209
|
const targetWidth = options?.width || videoWidth;
|
|
220
210
|
const targetHeight = options?.height || videoHeight;
|
|
211
|
+
assertPositiveFinite(targetWidth, "width");
|
|
212
|
+
assertPositiveFinite(targetHeight, "height");
|
|
213
|
+
if (options?.quality !== undefined &&
|
|
214
|
+
(!Number.isFinite(options.quality) ||
|
|
215
|
+
options.quality < 0 ||
|
|
216
|
+
options.quality > 100)) {
|
|
217
|
+
throw new Error("quality must be a finite number between 0 and 100");
|
|
218
|
+
}
|
|
221
219
|
const canvas = document.createElement("canvas");
|
|
222
220
|
canvas.width = targetWidth;
|
|
223
221
|
canvas.height = targetHeight;
|
|
@@ -240,7 +238,11 @@ class CameraWeb extends core.WebPlugin {
|
|
|
240
238
|
: format === "webp"
|
|
241
239
|
? "image/webp"
|
|
242
240
|
: "image/jpeg";
|
|
243
|
-
const
|
|
241
|
+
const dataUrl = canvas.toDataURL(mimeType, quality);
|
|
242
|
+
const base64 = dataUrl.split(",")[1];
|
|
243
|
+
if (!base64) {
|
|
244
|
+
throw new Error("Failed to encode captured photo");
|
|
245
|
+
}
|
|
244
246
|
return {
|
|
245
247
|
base64,
|
|
246
248
|
format,
|
|
@@ -255,9 +257,10 @@ class CameraWeb extends core.WebPlugin {
|
|
|
255
257
|
if (this.isRecording) {
|
|
256
258
|
throw new Error("Recording already in progress");
|
|
257
259
|
}
|
|
260
|
+
assertRecordingOptions(options);
|
|
258
261
|
let streamToRecord = this.mediaStream;
|
|
259
262
|
if (options?.audio !== false) {
|
|
260
|
-
const audioStream = await
|
|
263
|
+
const audioStream = await getMediaDevices().getUserMedia({
|
|
261
264
|
audio: true,
|
|
262
265
|
});
|
|
263
266
|
streamToRecord = new MediaStream([
|
|
@@ -379,17 +382,28 @@ class CameraWeb extends core.WebPlugin {
|
|
|
379
382
|
return { settings: { ...this.currentSettings } };
|
|
380
383
|
}
|
|
381
384
|
async setSettings(options) {
|
|
385
|
+
if (!options?.settings || typeof options.settings !== "object") {
|
|
386
|
+
throw new Error("settings object is required");
|
|
387
|
+
}
|
|
388
|
+
if (options.settings.zoom !== undefined) {
|
|
389
|
+
const zoom = options.settings.zoom;
|
|
390
|
+
this.assertValidZoom(zoom);
|
|
391
|
+
}
|
|
382
392
|
this.currentSettings = { ...this.currentSettings, ...options.settings };
|
|
383
393
|
if (this.mediaStream && options.settings.zoom !== undefined) {
|
|
384
394
|
await this.applyZoom(options.settings.zoom);
|
|
385
395
|
}
|
|
386
396
|
}
|
|
387
397
|
async setZoom(options) {
|
|
388
|
-
|
|
389
|
-
|
|
398
|
+
const zoom = options?.zoom;
|
|
399
|
+
this.assertValidZoom(zoom);
|
|
400
|
+
await this.applyZoom(zoom);
|
|
401
|
+
this.currentSettings.zoom = zoom;
|
|
402
|
+
}
|
|
403
|
+
assertValidZoom(zoom) {
|
|
404
|
+
if (typeof zoom !== "number" || !Number.isFinite(zoom) || zoom < 0) {
|
|
405
|
+
throw new Error(`Invalid zoom value: ${zoom}. Must be a non-negative finite number.`);
|
|
390
406
|
}
|
|
391
|
-
await this.applyZoom(options.zoom);
|
|
392
|
-
this.currentSettings.zoom = options.zoom;
|
|
393
407
|
}
|
|
394
408
|
async applyZoom(zoom) {
|
|
395
409
|
if (!this.mediaStream)
|
|
@@ -409,6 +423,7 @@ class CameraWeb extends core.WebPlugin {
|
|
|
409
423
|
async setFocusPoint(options) {
|
|
410
424
|
if (!this.mediaStream)
|
|
411
425
|
throw new Error("Preview not started");
|
|
426
|
+
this.assertNormalizedPoint(options, "focus point");
|
|
412
427
|
const track = this.mediaStream.getVideoTracks()[0];
|
|
413
428
|
if (!track)
|
|
414
429
|
throw new Error("No video track available");
|
|
@@ -434,6 +449,7 @@ class CameraWeb extends core.WebPlugin {
|
|
|
434
449
|
async setExposurePoint(options) {
|
|
435
450
|
if (!this.mediaStream)
|
|
436
451
|
throw new Error("Preview not started");
|
|
452
|
+
this.assertNormalizedPoint(options, "exposure point");
|
|
437
453
|
const track = this.mediaStream.getVideoTracks()[0];
|
|
438
454
|
if (!track)
|
|
439
455
|
throw new Error("No video track available");
|
|
@@ -456,6 +472,16 @@ class CameraWeb extends core.WebPlugin {
|
|
|
456
472
|
throw new Error(`Failed to set exposure point: ${e instanceof Error ? e.message : "unknown error"}`);
|
|
457
473
|
}
|
|
458
474
|
}
|
|
475
|
+
assertNormalizedPoint(options, name) {
|
|
476
|
+
if (!Number.isFinite(options?.x) ||
|
|
477
|
+
!Number.isFinite(options?.y) ||
|
|
478
|
+
options.x < 0 ||
|
|
479
|
+
options.x > 1 ||
|
|
480
|
+
options.y < 0 ||
|
|
481
|
+
options.y > 1) {
|
|
482
|
+
throw new Error(`${name} must use finite x/y values between 0 and 1`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
459
485
|
async checkPermissions() {
|
|
460
486
|
let cameraStatus = "prompt";
|
|
461
487
|
let microphoneStatus = "prompt";
|
|
@@ -489,7 +515,7 @@ class CameraWeb extends core.WebPlugin {
|
|
|
489
515
|
let cameraStatus = "denied";
|
|
490
516
|
let microphoneStatus = "denied";
|
|
491
517
|
try {
|
|
492
|
-
const stream = await
|
|
518
|
+
const stream = await getMediaDevices().getUserMedia({
|
|
493
519
|
video: true,
|
|
494
520
|
audio: true,
|
|
495
521
|
});
|
|
@@ -501,7 +527,7 @@ class CameraWeb extends core.WebPlugin {
|
|
|
501
527
|
}
|
|
502
528
|
catch {
|
|
503
529
|
try {
|
|
504
|
-
const videoStream = await
|
|
530
|
+
const videoStream = await getMediaDevices().getUserMedia({
|
|
505
531
|
video: true,
|
|
506
532
|
});
|
|
507
533
|
videoStream.getTracks().forEach((track) => {
|
|
@@ -513,7 +539,7 @@ class CameraWeb extends core.WebPlugin {
|
|
|
513
539
|
cameraStatus = "denied";
|
|
514
540
|
}
|
|
515
541
|
try {
|
|
516
|
-
const audioStream = await
|
|
542
|
+
const audioStream = await getMediaDevices().getUserMedia({
|
|
517
543
|
audio: true,
|
|
518
544
|
});
|
|
519
545
|
audioStream.getTracks().forEach((track) => {
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.CameraWeb());\nexport const Camera = registerPlugin(\"ElizaCamera\", {\n web: loadWeb,\n});\n","import { WebPlugin } from \"@capacitor/core\";\nconst VIDEO_MIME_TYPES = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n \"video/mp4\",\n];\nconst getSupportedMimeType = () => VIDEO_MIME_TYPES.find((m) => MediaRecorder.isTypeSupported(m)) ?? null;\nexport class CameraWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.mediaStream = null;\n this.videoElement = null;\n this.previewElement = null;\n this.currentDeviceId = null;\n this.mediaRecorder = null;\n this.recordedChunks = [];\n this.recordingStartTime = 0;\n this.recordingStateInterval = null;\n this.isRecording = false;\n this.currentSettings = {\n flash: \"off\",\n zoom: 1,\n focusMode: \"continuous\",\n exposureMode: \"continuous\",\n exposureCompensation: 0,\n whiteBalance: \"auto\",\n };\n this.pluginListeners = [];\n }\n async getDevices() {\n // enumerateDevices() returns device stubs without labels unless the user\n // has already granted camera permission via a prior getUserMedia() call.\n // We intentionally do NOT call getUserMedia() here because it requires a\n // user gesture and would throw NotAllowedError if called programmatically.\n const allDevices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = allDevices.filter((d) => d.kind === \"videoinput\");\n const devices = await Promise.all(videoDevices.map(async (device, index) => {\n const capabilities = await this.getDeviceCapabilities(device.deviceId);\n return {\n deviceId: device.deviceId,\n label: device.label || `Camera ${index + 1}`,\n direction: this.inferDirection(device.label),\n // Flash detection not available via MediaDevices API on web\n hasFlash: capabilities?.hasFlash ?? false,\n hasZoom: !!capabilities?.zoom,\n maxZoom: capabilities?.zoom?.max ?? 1,\n // Return actual capabilities or empty array to indicate unknown\n supportedResolutions: capabilities?.resolutions ?? [],\n supportedFrameRates: capabilities?.frameRates ?? [],\n };\n }));\n return { devices };\n }\n inferDirection(label) {\n const lowerLabel = label.toLowerCase();\n if (lowerLabel.includes(\"front\") ||\n lowerLabel.includes(\"facetime\") ||\n lowerLabel.includes(\"user\")) {\n return \"front\";\n }\n if (lowerLabel.includes(\"back\") ||\n lowerLabel.includes(\"rear\") ||\n lowerLabel.includes(\"environment\")) {\n return \"back\";\n }\n return \"external\";\n }\n async getDeviceCapabilities(deviceId) {\n let stream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: deviceId } },\n });\n }\n catch {\n return null; // Device not accessible\n }\n const track = stream.getVideoTracks()[0];\n if (!track) {\n stream.getTracks().forEach((t) => {\n t.stop();\n });\n return null;\n }\n const capabilities = track.getCapabilities ? track.getCapabilities() : {};\n stream.getTracks().forEach((t) => {\n t.stop();\n });\n const caps = capabilities;\n // Build resolutions from actual device capabilities only\n const resolutions = [];\n if (caps.width?.max && caps.height?.max) {\n resolutions.push({ width: caps.width.max, height: caps.height.max });\n // Add common lower resolutions only if device supports them\n if (caps.width.max >= 1280 && caps.height.max >= 720) {\n resolutions.push({ width: 1280, height: 720 });\n }\n if (caps.width.max >= 640 && caps.height.max >= 480) {\n resolutions.push({ width: 640, height: 480 });\n }\n }\n // Build frameRates from actual device capabilities only\n const frameRates = [];\n if (caps.frameRate?.max) {\n if (caps.frameRate.max >= 60)\n frameRates.push(60);\n if (caps.frameRate.max >= 30)\n frameRates.push(30);\n if (caps.frameRate.max >= 24)\n frameRates.push(24);\n if (caps.frameRate.max >= 15)\n frameRates.push(15);\n }\n return {\n zoom: caps.zoom,\n resolutions: resolutions.length > 0 ? resolutions : undefined,\n frameRates: frameRates.length > 0 ? frameRates : undefined,\n hasFlash: caps.torch === true, // Torch capability indicates flash support\n };\n }\n async startPreview(options) {\n await this.stopPreview();\n const constraints = {\n video: {\n deviceId: options.deviceId ? { exact: options.deviceId } : undefined,\n facingMode: options.direction === \"front\"\n ? \"user\"\n : options.direction === \"back\"\n ? \"environment\"\n : undefined,\n width: options.resolution?.width\n ? { ideal: options.resolution.width }\n : { ideal: 1920 },\n height: options.resolution?.height\n ? { ideal: options.resolution.height }\n : { ideal: 1080 },\n frameRate: options.frameRate\n ? { ideal: options.frameRate }\n : { ideal: 30 },\n },\n audio: false,\n };\n // PERMISSIONS_MIGRATION: this getUserMedia() call triggers the OS\n // camera-permission dialog implicitly. New flow probes via\n // `cameraProber` from\n // `packages/agent/src/services/permissions/probers/camera.ts` first,\n // then asks the user, only then opens the stream. Will be retired by\n // the chat-surface migration agent.\n this.mediaStream = await navigator.mediaDevices.getUserMedia(constraints);\n this.previewElement = options.element;\n this.videoElement = document.createElement(\"video\");\n this.videoElement.srcObject = this.mediaStream;\n this.videoElement.autoplay = true;\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.style.width = \"100%\";\n this.videoElement.style.height = \"100%\";\n this.videoElement.style.objectFit = \"cover\";\n if (options.mirror) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n this.previewElement.appendChild(this.videoElement);\n await this.videoElement.play();\n const track = this.mediaStream.getVideoTracks()[0];\n const settings = track.getSettings();\n this.currentDeviceId = settings.deviceId || options.deviceId || \"\";\n return {\n width: settings.width || options.resolution?.width || 1920,\n height: settings.height || options.resolution?.height || 1080,\n deviceId: this.currentDeviceId,\n };\n }\n async stopPreview() {\n if (this.isRecording) {\n await this.stopRecording();\n }\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach((track) => {\n track.stop();\n });\n this.mediaStream = null;\n }\n if (this.videoElement && this.previewElement) {\n this.previewElement.removeChild(this.videoElement);\n this.videoElement = null;\n }\n this.previewElement = null;\n this.currentDeviceId = null;\n }\n async switchCamera(options) {\n if (!this.previewElement) {\n throw new Error(\"Preview not started\");\n }\n const mirror = options.direction === \"front\";\n return this.startPreview({\n element: this.previewElement,\n deviceId: options.deviceId,\n direction: options.direction,\n mirror,\n });\n }\n async capturePhoto(options) {\n if (!this.videoElement || !this.mediaStream) {\n throw new Error(\"Preview not started\");\n }\n const track = this.mediaStream.getVideoTracks()[0];\n const settings = track.getSettings();\n const videoWidth = settings.width || this.videoElement.videoWidth;\n const videoHeight = settings.height || this.videoElement.videoHeight;\n const targetWidth = options?.width || videoWidth;\n const targetHeight = options?.height || videoHeight;\n const canvas = document.createElement(\"canvas\");\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get canvas context\");\n }\n const scaleX = targetWidth / videoWidth;\n const scaleY = targetHeight / videoHeight;\n const scale = Math.max(scaleX, scaleY);\n const drawWidth = videoWidth * scale;\n const drawHeight = videoHeight * scale;\n const drawX = (targetWidth - drawWidth) / 2;\n const drawY = (targetHeight - drawHeight) / 2;\n ctx.drawImage(this.videoElement, drawX, drawY, drawWidth, drawHeight);\n const quality = (options?.quality ?? 90) / 100;\n const format = options?.format || \"jpeg\";\n const mimeType = format === \"png\"\n ? \"image/png\"\n : format === \"webp\"\n ? \"image/webp\"\n : \"image/jpeg\";\n const base64 = canvas.toDataURL(mimeType, quality).split(\",\")[1];\n return {\n base64,\n format,\n width: targetWidth,\n height: targetHeight,\n };\n }\n async startRecording(options) {\n if (!this.mediaStream) {\n throw new Error(\"Preview not started\");\n }\n if (this.isRecording) {\n throw new Error(\"Recording already in progress\");\n }\n let streamToRecord = this.mediaStream;\n if (options?.audio !== false) {\n const audioStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n streamToRecord = new MediaStream([\n ...this.mediaStream.getVideoTracks(),\n ...audioStream.getAudioTracks(),\n ]);\n }\n const mimeType = getSupportedMimeType();\n if (!mimeType)\n throw new Error(\"No supported video mime type found\");\n const recorderOptions = { mimeType };\n if (options?.bitrate)\n recorderOptions.videoBitsPerSecond = options.bitrate;\n this.recordedChunks = [];\n this.mediaRecorder = new MediaRecorder(streamToRecord, recorderOptions);\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n }\n };\n this.mediaRecorder.onerror = (event) => {\n this.notifyListeners(\"error\", {\n code: \"RECORDING_ERROR\",\n message: `Recording error: ${event.message || \"Unknown error\"}`,\n });\n };\n this.recordingStartTime = Date.now();\n this.isRecording = true;\n this.mediaRecorder.start(1000);\n this.notifyListeners(\"recordingState\", {\n isRecording: true,\n duration: 0,\n fileSize: 0,\n });\n let autoStopping = false;\n this.recordingStateInterval = setInterval(() => {\n if (!this.isRecording || autoStopping)\n return;\n const duration = (Date.now() - this.recordingStartTime) / 1000;\n const fileSize = this.recordedChunks.reduce((acc, chunk) => acc + chunk.size, 0);\n this.notifyListeners(\"recordingState\", {\n isRecording: true,\n duration,\n fileSize,\n });\n const overLimit = (options?.maxDuration && duration >= options.maxDuration) ||\n (options?.maxFileSize && fileSize >= options.maxFileSize);\n if (overLimit) {\n autoStopping = true;\n this.stopRecording().catch((err) => {\n console.error(\"[Camera] Auto-stop recording failed:\", err);\n });\n }\n }, 500);\n }\n async stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n throw new Error(\"Not recording\");\n }\n return new Promise((resolve, reject) => {\n if (!this.mediaRecorder) {\n reject(new Error(\"MediaRecorder not initialized\"));\n return;\n }\n const duration = (Date.now() - this.recordingStartTime) / 1000;\n this.mediaRecorder.onstop = () => {\n if (this.recordingStateInterval) {\n clearInterval(this.recordingStateInterval);\n this.recordingStateInterval = null;\n }\n this.isRecording = false;\n const blob = new Blob(this.recordedChunks, {\n type: this.mediaRecorder?.mimeType || \"video/webm\",\n });\n const url = URL.createObjectURL(blob);\n const video = document.createElement(\"video\");\n video.src = url;\n video.onloadedmetadata = () => {\n resolve({\n path: url,\n duration,\n width: video.videoWidth,\n height: video.videoHeight,\n fileSize: blob.size,\n mimeType: this.mediaRecorder?.mimeType || \"video/webm\",\n });\n };\n video.onerror = () => {\n resolve({\n path: url,\n duration,\n width: 0,\n height: 0,\n fileSize: blob.size,\n mimeType: this.mediaRecorder?.mimeType || \"video/webm\",\n });\n };\n this.notifyListeners(\"recordingState\", {\n isRecording: false,\n duration,\n fileSize: blob.size,\n });\n };\n this.mediaRecorder.stop();\n });\n }\n async getRecordingState() {\n const duration = this.isRecording\n ? (Date.now() - this.recordingStartTime) / 1000\n : 0;\n const fileSize = this.recordedChunks.reduce((acc, chunk) => acc + chunk.size, 0);\n return {\n isRecording: this.isRecording,\n duration,\n fileSize,\n };\n }\n async getSettings() {\n return { settings: { ...this.currentSettings } };\n }\n async setSettings(options) {\n this.currentSettings = { ...this.currentSettings, ...options.settings };\n if (this.mediaStream && options.settings.zoom !== undefined) {\n await this.applyZoom(options.settings.zoom);\n }\n }\n async setZoom(options) {\n if (!Number.isFinite(options.zoom) || options.zoom < 0) {\n throw new Error(`Invalid zoom value: ${options.zoom}. Must be a non-negative finite number.`);\n }\n await this.applyZoom(options.zoom);\n this.currentSettings.zoom = options.zoom;\n }\n async applyZoom(zoom) {\n if (!this.mediaStream)\n return;\n const track = this.mediaStream.getVideoTracks()[0];\n if (!track)\n return;\n const capabilities = track.getCapabilities ? track.getCapabilities() : {};\n const caps = capabilities;\n if (caps.zoom) {\n const clampedZoom = Math.max(caps.zoom.min, Math.min(caps.zoom.max, zoom));\n await track.applyConstraints({\n advanced: [{ zoom: clampedZoom }],\n });\n }\n }\n async setFocusPoint(options) {\n if (!this.mediaStream)\n throw new Error(\"Preview not started\");\n const track = this.mediaStream.getVideoTracks()[0];\n if (!track)\n throw new Error(\"No video track available\");\n // Check if focus control is supported\n const caps = track.getCapabilities ? track.getCapabilities() : {};\n if (!caps.focusMode?.includes(\"manual\")) {\n throw new Error(\"Manual focus not supported by this camera\");\n }\n try {\n await track.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n pointsOfInterest: [{ x: options.x, y: options.y }],\n },\n ],\n });\n }\n catch (e) {\n throw new Error(`Failed to set focus point: ${e instanceof Error ? e.message : \"unknown error\"}`);\n }\n }\n async setExposurePoint(options) {\n if (!this.mediaStream)\n throw new Error(\"Preview not started\");\n const track = this.mediaStream.getVideoTracks()[0];\n if (!track)\n throw new Error(\"No video track available\");\n // Check if exposure control is supported\n const caps = track.getCapabilities ? track.getCapabilities() : {};\n if (!caps.exposureMode?.includes(\"manual\")) {\n throw new Error(\"Manual exposure not supported by this camera\");\n }\n try {\n await track.applyConstraints({\n advanced: [\n {\n exposureMode: \"manual\",\n pointsOfInterest: [{ x: options.x, y: options.y }],\n },\n ],\n });\n }\n catch (e) {\n throw new Error(`Failed to set exposure point: ${e instanceof Error ? e.message : \"unknown error\"}`);\n }\n }\n async checkPermissions() {\n let cameraStatus = \"prompt\";\n let microphoneStatus = \"prompt\";\n try {\n const cameraResult = await navigator.permissions.query({\n name: \"camera\",\n });\n cameraStatus = cameraResult.state;\n }\n catch (err) {\n console.debug(\"[Camera] permissions.query('camera') not supported:\", err);\n }\n try {\n const micResult = await navigator.permissions.query({\n name: \"microphone\",\n });\n microphoneStatus = micResult.state;\n }\n catch (err) {\n console.debug(\"[Camera] permissions.query('microphone') not supported:\", err);\n }\n // Note: Web platform doesn't have a \"photos\" permission concept.\n // Photos are captured from camera stream, so camera permission covers this.\n return {\n camera: cameraStatus,\n microphone: microphoneStatus,\n photos: cameraStatus, // Photos access follows camera permission on web\n };\n }\n async requestPermissions() {\n let cameraStatus = \"denied\";\n let microphoneStatus = \"denied\";\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: true,\n audio: true,\n });\n stream.getTracks().forEach((track) => {\n track.stop();\n });\n cameraStatus = \"granted\";\n microphoneStatus = \"granted\";\n }\n catch {\n try {\n const videoStream = await navigator.mediaDevices.getUserMedia({\n video: true,\n });\n videoStream.getTracks().forEach((track) => {\n track.stop();\n });\n cameraStatus = \"granted\";\n }\n catch {\n cameraStatus = \"denied\";\n }\n try {\n const audioStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n audioStream.getTracks().forEach((track) => {\n track.stop();\n });\n microphoneStatus = \"granted\";\n }\n catch {\n microphoneStatus = \"denied\";\n }\n }\n return {\n camera: cameraStatus,\n microphone: microphoneStatus,\n photos: cameraStatus, // Photos access follows camera permission on web\n };\n }\n async addListener(eventName, listenerFunc) {\n const entry = { eventName, callback: listenerFunc };\n this.pluginListeners.push(entry);\n return {\n remove: async () => {\n const i = this.pluginListeners.indexOf(entry);\n if (i >= 0)\n this.pluginListeners.splice(i, 1);\n },\n };\n }\n async removeAllListeners() {\n this.pluginListeners = [];\n }\n notifyListeners(eventName, data) {\n this.pluginListeners\n .filter((l) => l.eventName === eventName)\n .forEach((l) => {\n l.callback(data);\n });\n }\n}\n"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.CameraWeb());\nexport const Camera = registerPlugin(\"ElizaCamera\", {\n web: loadWeb,\n});\n","import { WebPlugin } from \"@capacitor/core\";\nconst VIDEO_MIME_TYPES = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n \"video/mp4\",\n];\nconst getSupportedMimeType = () => VIDEO_MIME_TYPES.find((m) => MediaRecorder.isTypeSupported(m)) ?? null;\nconst getMediaDevices = () => {\n if (!navigator.mediaDevices?.getUserMedia) {\n throw new Error(\"Camera media devices API is not available\");\n }\n return navigator.mediaDevices;\n};\nconst assertPositiveFinite = (value, name) => {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a positive finite number`);\n }\n};\nconst assertRecordingOptions = (options) => {\n if (!options)\n return;\n if (options.quality !== undefined &&\n ![\"low\", \"medium\", \"high\", \"highest\"].includes(options.quality)) {\n throw new Error(\"quality must be one of low, medium, high, or highest\");\n }\n if (options.maxDuration !== undefined) {\n assertPositiveFinite(options.maxDuration, \"maxDuration\");\n }\n if (options.maxFileSize !== undefined) {\n assertPositiveFinite(options.maxFileSize, \"maxFileSize\");\n }\n if (options.bitrate !== undefined) {\n assertPositiveFinite(options.bitrate, \"bitrate\");\n }\n if (options.frameRate !== undefined) {\n assertPositiveFinite(options.frameRate, \"frameRate\");\n }\n};\nexport class CameraWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.mediaStream = null;\n this.videoElement = null;\n this.previewElement = null;\n this.currentDeviceId = null;\n this.mediaRecorder = null;\n this.recordedChunks = [];\n this.recordingStartTime = 0;\n this.recordingStateInterval = null;\n this.isRecording = false;\n this.currentSettings = {\n flash: \"off\",\n zoom: 1,\n focusMode: \"continuous\",\n exposureMode: \"continuous\",\n exposureCompensation: 0,\n whiteBalance: \"auto\",\n };\n this.pluginListeners = [];\n }\n async getDevices() {\n // enumerateDevices() returns unlabeled device records unless the user has\n // already granted camera permission via a prior getUserMedia() call.\n // We intentionally do NOT call getUserMedia() here because it requires a\n // user gesture and would throw NotAllowedError if called programmatically.\n const mediaDevices = getMediaDevices();\n if (!mediaDevices.enumerateDevices) {\n throw new Error(\"Camera device enumeration is not available\");\n }\n const allDevices = await mediaDevices.enumerateDevices();\n const videoDevices = allDevices.filter((d) => d.kind === \"videoinput\");\n const devices = await Promise.all(videoDevices.map(async (device, index) => ({\n deviceId: device.deviceId,\n label: device.label || `Camera ${index + 1}`,\n direction: this.inferDirection(device.label),\n // Capability probing requires getUserMedia(), which can prompt for\n // camera permission. Enumeration stays prompt-free and reports\n // unknown capabilities until preview/capture has explicit access.\n hasFlash: false,\n hasZoom: false,\n maxZoom: 1,\n supportedResolutions: [],\n supportedFrameRates: [],\n })));\n return { devices };\n }\n inferDirection(label) {\n const lowerLabel = label.toLowerCase();\n if (lowerLabel.includes(\"front\") ||\n lowerLabel.includes(\"facetime\") ||\n lowerLabel.includes(\"user\")) {\n return \"front\";\n }\n if (lowerLabel.includes(\"back\") ||\n lowerLabel.includes(\"rear\") ||\n lowerLabel.includes(\"environment\")) {\n return \"back\";\n }\n return \"external\";\n }\n async startPreview(options) {\n if (!options?.element?.appendChild) {\n throw new Error(\"Preview element is required\");\n }\n if (options.resolution) {\n assertPositiveFinite(options.resolution.width, \"resolution.width\");\n assertPositiveFinite(options.resolution.height, \"resolution.height\");\n }\n if (options.frameRate !== undefined) {\n assertPositiveFinite(options.frameRate, \"frameRate\");\n }\n await this.stopPreview();\n const constraints = {\n video: {\n deviceId: options.deviceId ? { exact: options.deviceId } : undefined,\n facingMode: options.direction === \"front\"\n ? \"user\"\n : options.direction === \"back\"\n ? \"environment\"\n : undefined,\n width: options.resolution?.width\n ? { ideal: options.resolution.width }\n : { ideal: 1920 },\n height: options.resolution?.height\n ? { ideal: options.resolution.height }\n : { ideal: 1080 },\n frameRate: options.frameRate\n ? { ideal: options.frameRate }\n : { ideal: 30 },\n },\n audio: false,\n };\n // Browser camera permission is requested by opening the stream. Native\n // permission probing is handled outside this Capacitor web fallback.\n this.mediaStream = await getMediaDevices().getUserMedia(constraints);\n this.previewElement = options.element;\n this.videoElement = document.createElement(\"video\");\n this.videoElement.srcObject = this.mediaStream;\n this.videoElement.autoplay = true;\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.style.width = \"100%\";\n this.videoElement.style.height = \"100%\";\n this.videoElement.style.objectFit = \"cover\";\n if (options.mirror) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n this.previewElement.appendChild(this.videoElement);\n await this.videoElement.play();\n const track = this.mediaStream.getVideoTracks()[0];\n const settings = track.getSettings();\n this.currentDeviceId = settings.deviceId || options.deviceId || \"\";\n return {\n width: settings.width || options.resolution?.width || 1920,\n height: settings.height || options.resolution?.height || 1080,\n deviceId: this.currentDeviceId,\n };\n }\n async stopPreview() {\n if (this.isRecording) {\n await this.stopRecording();\n }\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach((track) => {\n track.stop();\n });\n this.mediaStream = null;\n }\n if (this.videoElement) {\n if (this.previewElement?.contains(this.videoElement)) {\n this.previewElement.removeChild(this.videoElement);\n }\n this.videoElement = null;\n }\n this.previewElement = null;\n this.currentDeviceId = null;\n }\n async switchCamera(options) {\n if (!this.previewElement) {\n throw new Error(\"Preview not started\");\n }\n const mirror = options.direction === \"front\";\n return this.startPreview({\n element: this.previewElement,\n deviceId: options.deviceId,\n direction: options.direction,\n mirror,\n });\n }\n async capturePhoto(options) {\n if (!this.videoElement || !this.mediaStream) {\n throw new Error(\"Preview not started\");\n }\n const track = this.mediaStream.getVideoTracks()[0];\n const settings = track.getSettings();\n const videoWidth = settings.width || this.videoElement.videoWidth;\n const videoHeight = settings.height || this.videoElement.videoHeight;\n assertPositiveFinite(videoWidth, \"videoWidth\");\n assertPositiveFinite(videoHeight, \"videoHeight\");\n const targetWidth = options?.width || videoWidth;\n const targetHeight = options?.height || videoHeight;\n assertPositiveFinite(targetWidth, \"width\");\n assertPositiveFinite(targetHeight, \"height\");\n if (options?.quality !== undefined &&\n (!Number.isFinite(options.quality) ||\n options.quality < 0 ||\n options.quality > 100)) {\n throw new Error(\"quality must be a finite number between 0 and 100\");\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get canvas context\");\n }\n const scaleX = targetWidth / videoWidth;\n const scaleY = targetHeight / videoHeight;\n const scale = Math.max(scaleX, scaleY);\n const drawWidth = videoWidth * scale;\n const drawHeight = videoHeight * scale;\n const drawX = (targetWidth - drawWidth) / 2;\n const drawY = (targetHeight - drawHeight) / 2;\n ctx.drawImage(this.videoElement, drawX, drawY, drawWidth, drawHeight);\n const quality = (options?.quality ?? 90) / 100;\n const format = options?.format || \"jpeg\";\n const mimeType = format === \"png\"\n ? \"image/png\"\n : format === \"webp\"\n ? \"image/webp\"\n : \"image/jpeg\";\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const base64 = dataUrl.split(\",\")[1];\n if (!base64) {\n throw new Error(\"Failed to encode captured photo\");\n }\n return {\n base64,\n format,\n width: targetWidth,\n height: targetHeight,\n };\n }\n async startRecording(options) {\n if (!this.mediaStream) {\n throw new Error(\"Preview not started\");\n }\n if (this.isRecording) {\n throw new Error(\"Recording already in progress\");\n }\n assertRecordingOptions(options);\n let streamToRecord = this.mediaStream;\n if (options?.audio !== false) {\n const audioStream = await getMediaDevices().getUserMedia({\n audio: true,\n });\n streamToRecord = new MediaStream([\n ...this.mediaStream.getVideoTracks(),\n ...audioStream.getAudioTracks(),\n ]);\n }\n const mimeType = getSupportedMimeType();\n if (!mimeType)\n throw new Error(\"No supported video mime type found\");\n const recorderOptions = { mimeType };\n if (options?.bitrate)\n recorderOptions.videoBitsPerSecond = options.bitrate;\n this.recordedChunks = [];\n this.mediaRecorder = new MediaRecorder(streamToRecord, recorderOptions);\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n }\n };\n this.mediaRecorder.onerror = (event) => {\n this.notifyListeners(\"error\", {\n code: \"RECORDING_ERROR\",\n message: `Recording error: ${event.message || \"Unknown error\"}`,\n });\n };\n this.recordingStartTime = Date.now();\n this.isRecording = true;\n this.mediaRecorder.start(1000);\n this.notifyListeners(\"recordingState\", {\n isRecording: true,\n duration: 0,\n fileSize: 0,\n });\n let autoStopping = false;\n this.recordingStateInterval = setInterval(() => {\n if (!this.isRecording || autoStopping)\n return;\n const duration = (Date.now() - this.recordingStartTime) / 1000;\n const fileSize = this.recordedChunks.reduce((acc, chunk) => acc + chunk.size, 0);\n this.notifyListeners(\"recordingState\", {\n isRecording: true,\n duration,\n fileSize,\n });\n const overLimit = (options?.maxDuration && duration >= options.maxDuration) ||\n (options?.maxFileSize && fileSize >= options.maxFileSize);\n if (overLimit) {\n autoStopping = true;\n this.stopRecording().catch((err) => {\n console.error(\"[Camera] Auto-stop recording failed:\", err);\n });\n }\n }, 500);\n }\n async stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n throw new Error(\"Not recording\");\n }\n return new Promise((resolve, reject) => {\n if (!this.mediaRecorder) {\n reject(new Error(\"MediaRecorder not initialized\"));\n return;\n }\n const duration = (Date.now() - this.recordingStartTime) / 1000;\n this.mediaRecorder.onstop = () => {\n if (this.recordingStateInterval) {\n clearInterval(this.recordingStateInterval);\n this.recordingStateInterval = null;\n }\n this.isRecording = false;\n const blob = new Blob(this.recordedChunks, {\n type: this.mediaRecorder?.mimeType || \"video/webm\",\n });\n const url = URL.createObjectURL(blob);\n const video = document.createElement(\"video\");\n video.src = url;\n video.onloadedmetadata = () => {\n resolve({\n path: url,\n duration,\n width: video.videoWidth,\n height: video.videoHeight,\n fileSize: blob.size,\n mimeType: this.mediaRecorder?.mimeType || \"video/webm\",\n });\n };\n video.onerror = () => {\n resolve({\n path: url,\n duration,\n width: 0,\n height: 0,\n fileSize: blob.size,\n mimeType: this.mediaRecorder?.mimeType || \"video/webm\",\n });\n };\n this.notifyListeners(\"recordingState\", {\n isRecording: false,\n duration,\n fileSize: blob.size,\n });\n };\n this.mediaRecorder.stop();\n });\n }\n async getRecordingState() {\n const duration = this.isRecording\n ? (Date.now() - this.recordingStartTime) / 1000\n : 0;\n const fileSize = this.recordedChunks.reduce((acc, chunk) => acc + chunk.size, 0);\n return {\n isRecording: this.isRecording,\n duration,\n fileSize,\n };\n }\n async getSettings() {\n return { settings: { ...this.currentSettings } };\n }\n async setSettings(options) {\n if (!options?.settings || typeof options.settings !== \"object\") {\n throw new Error(\"settings object is required\");\n }\n if (options.settings.zoom !== undefined) {\n const zoom = options.settings.zoom;\n this.assertValidZoom(zoom);\n }\n this.currentSettings = { ...this.currentSettings, ...options.settings };\n if (this.mediaStream && options.settings.zoom !== undefined) {\n await this.applyZoom(options.settings.zoom);\n }\n }\n async setZoom(options) {\n const zoom = options?.zoom;\n this.assertValidZoom(zoom);\n await this.applyZoom(zoom);\n this.currentSettings.zoom = zoom;\n }\n assertValidZoom(zoom) {\n if (typeof zoom !== \"number\" || !Number.isFinite(zoom) || zoom < 0) {\n throw new Error(`Invalid zoom value: ${zoom}. Must be a non-negative finite number.`);\n }\n }\n async applyZoom(zoom) {\n if (!this.mediaStream)\n return;\n const track = this.mediaStream.getVideoTracks()[0];\n if (!track)\n return;\n const capabilities = track.getCapabilities ? track.getCapabilities() : {};\n const caps = capabilities;\n if (caps.zoom) {\n const clampedZoom = Math.max(caps.zoom.min, Math.min(caps.zoom.max, zoom));\n await track.applyConstraints({\n advanced: [{ zoom: clampedZoom }],\n });\n }\n }\n async setFocusPoint(options) {\n if (!this.mediaStream)\n throw new Error(\"Preview not started\");\n this.assertNormalizedPoint(options, \"focus point\");\n const track = this.mediaStream.getVideoTracks()[0];\n if (!track)\n throw new Error(\"No video track available\");\n // Check if focus control is supported\n const caps = track.getCapabilities ? track.getCapabilities() : {};\n if (!caps.focusMode?.includes(\"manual\")) {\n throw new Error(\"Manual focus not supported by this camera\");\n }\n try {\n await track.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n pointsOfInterest: [{ x: options.x, y: options.y }],\n },\n ],\n });\n }\n catch (e) {\n throw new Error(`Failed to set focus point: ${e instanceof Error ? e.message : \"unknown error\"}`);\n }\n }\n async setExposurePoint(options) {\n if (!this.mediaStream)\n throw new Error(\"Preview not started\");\n this.assertNormalizedPoint(options, \"exposure point\");\n const track = this.mediaStream.getVideoTracks()[0];\n if (!track)\n throw new Error(\"No video track available\");\n // Check if exposure control is supported\n const caps = track.getCapabilities ? track.getCapabilities() : {};\n if (!caps.exposureMode?.includes(\"manual\")) {\n throw new Error(\"Manual exposure not supported by this camera\");\n }\n try {\n await track.applyConstraints({\n advanced: [\n {\n exposureMode: \"manual\",\n pointsOfInterest: [{ x: options.x, y: options.y }],\n },\n ],\n });\n }\n catch (e) {\n throw new Error(`Failed to set exposure point: ${e instanceof Error ? e.message : \"unknown error\"}`);\n }\n }\n assertNormalizedPoint(options, name) {\n if (!Number.isFinite(options?.x) ||\n !Number.isFinite(options?.y) ||\n options.x < 0 ||\n options.x > 1 ||\n options.y < 0 ||\n options.y > 1) {\n throw new Error(`${name} must use finite x/y values between 0 and 1`);\n }\n }\n async checkPermissions() {\n let cameraStatus = \"prompt\";\n let microphoneStatus = \"prompt\";\n try {\n const cameraResult = await navigator.permissions.query({\n name: \"camera\",\n });\n cameraStatus = cameraResult.state;\n }\n catch (err) {\n console.debug(\"[Camera] permissions.query('camera') not supported:\", err);\n }\n try {\n const micResult = await navigator.permissions.query({\n name: \"microphone\",\n });\n microphoneStatus = micResult.state;\n }\n catch (err) {\n console.debug(\"[Camera] permissions.query('microphone') not supported:\", err);\n }\n // Note: Web platform doesn't have a \"photos\" permission concept.\n // Photos are captured from camera stream, so camera permission covers this.\n return {\n camera: cameraStatus,\n microphone: microphoneStatus,\n photos: cameraStatus, // Photos access follows camera permission on web\n };\n }\n async requestPermissions() {\n let cameraStatus = \"denied\";\n let microphoneStatus = \"denied\";\n try {\n const stream = await getMediaDevices().getUserMedia({\n video: true,\n audio: true,\n });\n stream.getTracks().forEach((track) => {\n track.stop();\n });\n cameraStatus = \"granted\";\n microphoneStatus = \"granted\";\n }\n catch {\n try {\n const videoStream = await getMediaDevices().getUserMedia({\n video: true,\n });\n videoStream.getTracks().forEach((track) => {\n track.stop();\n });\n cameraStatus = \"granted\";\n }\n catch {\n cameraStatus = \"denied\";\n }\n try {\n const audioStream = await getMediaDevices().getUserMedia({\n audio: true,\n });\n audioStream.getTracks().forEach((track) => {\n track.stop();\n });\n microphoneStatus = \"granted\";\n }\n catch {\n microphoneStatus = \"denied\";\n }\n }\n return {\n camera: cameraStatus,\n microphone: microphoneStatus,\n photos: cameraStatus, // Photos access follows camera permission on web\n };\n }\n async addListener(eventName, listenerFunc) {\n const entry = { eventName, callback: listenerFunc };\n this.pluginListeners.push(entry);\n return {\n remove: async () => {\n const i = this.pluginListeners.indexOf(entry);\n if (i >= 0)\n this.pluginListeners.splice(i, 1);\n },\n };\n }\n async removeAllListeners() {\n this.pluginListeners = [];\n }\n notifyListeners(eventName, data) {\n this.pluginListeners\n .filter((l) => l.eventName === eventName)\n .forEach((l) => {\n l.callback(data);\n });\n }\n}\n"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|