@capgo/camera-preview 6.2.30 → 6.3.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.
- package/README.md +50 -28
- package/dist/docs.json +45 -45
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +4 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +2 -2
- package/dist/esm/web.js +48 -43
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +49 -44
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +50 -45
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/CameraController.swift +56 -18
- package/ios/Plugin/Plugin.swift +19 -1
- package/ios/Podfile.lock +2 -2
- package/package.json +24 -16
package/dist/esm/web.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import { WebPlugin } from
|
|
1
|
+
import { WebPlugin } from "@capacitor/core";
|
|
2
2
|
export class CameraPreviewWeb extends WebPlugin {
|
|
3
3
|
constructor() {
|
|
4
4
|
super({
|
|
5
|
-
name:
|
|
6
|
-
platforms: [
|
|
5
|
+
name: "CameraPreview",
|
|
6
|
+
platforms: ["web"],
|
|
7
7
|
});
|
|
8
|
+
/**
|
|
9
|
+
* track which camera is used based on start options
|
|
10
|
+
* used in capture
|
|
11
|
+
*/
|
|
12
|
+
this.isBackCamera = false;
|
|
8
13
|
}
|
|
9
14
|
async start(options) {
|
|
10
15
|
var _a;
|
|
@@ -15,32 +20,32 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
15
20
|
})
|
|
16
21
|
.then((stream) => {
|
|
17
22
|
// Stop any existing stream so we can request media with different constraints based on user input
|
|
18
|
-
stream.getTracks().forEach(track => track.stop());
|
|
23
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
19
24
|
})
|
|
20
25
|
.catch((error) => {
|
|
21
26
|
Promise.reject(error);
|
|
22
27
|
});
|
|
23
|
-
const video = document.getElementById(
|
|
24
|
-
const parent = document.getElementById(options.parent);
|
|
28
|
+
const video = document.getElementById("video");
|
|
29
|
+
const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || "");
|
|
25
30
|
if (!video) {
|
|
26
|
-
const videoElement = document.createElement(
|
|
27
|
-
videoElement.id =
|
|
28
|
-
videoElement.setAttribute(
|
|
31
|
+
const videoElement = document.createElement("video");
|
|
32
|
+
videoElement.id = "video";
|
|
33
|
+
videoElement.setAttribute("class", (options === null || options === void 0 ? void 0 : options.className) || "");
|
|
29
34
|
// Don't flip video feed if camera is rear facing
|
|
30
|
-
if (options.position !==
|
|
31
|
-
videoElement.setAttribute(
|
|
35
|
+
if (options.position !== "rear") {
|
|
36
|
+
videoElement.setAttribute("style", "-webkit-transform: scaleX(-1); transform: scaleX(-1);");
|
|
32
37
|
}
|
|
33
38
|
const userAgent = navigator.userAgent.toLowerCase();
|
|
34
|
-
const isSafari = userAgent.includes(
|
|
39
|
+
const isSafari = userAgent.includes("safari") && !userAgent.includes("chrome");
|
|
35
40
|
// Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
|
|
36
41
|
// Without these attributes videoElement.play() will throw a NotAllowedError
|
|
37
42
|
// https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
|
|
38
43
|
if (isSafari) {
|
|
39
|
-
videoElement.setAttribute(
|
|
40
|
-
videoElement.setAttribute(
|
|
41
|
-
videoElement.setAttribute(
|
|
44
|
+
videoElement.setAttribute("autoplay", "true");
|
|
45
|
+
videoElement.setAttribute("muted", "true");
|
|
46
|
+
videoElement.setAttribute("playsinline", "true");
|
|
42
47
|
}
|
|
43
|
-
parent.appendChild(videoElement);
|
|
48
|
+
parent === null || parent === void 0 ? void 0 : parent.appendChild(videoElement);
|
|
44
49
|
if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
|
|
45
50
|
const constraints = {
|
|
46
51
|
video: {
|
|
@@ -48,18 +53,17 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
48
53
|
height: { ideal: options.height },
|
|
49
54
|
},
|
|
50
55
|
};
|
|
51
|
-
if (options.position ===
|
|
52
|
-
constraints.video.facingMode
|
|
53
|
-
|
|
56
|
+
if (options.position === "rear") {
|
|
57
|
+
constraints.video.facingMode =
|
|
58
|
+
"environment";
|
|
54
59
|
this.isBackCamera = true;
|
|
55
60
|
}
|
|
56
61
|
else {
|
|
57
62
|
this.isBackCamera = false;
|
|
58
63
|
}
|
|
59
|
-
// eslint-disable-next-line ts/no-this-alias
|
|
60
64
|
const self = this;
|
|
61
65
|
await navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
|
|
62
|
-
if (document.getElementById(
|
|
66
|
+
if (document.getElementById("video")) {
|
|
63
67
|
// video.src = window.URL.createObjectURL(stream);
|
|
64
68
|
videoElement.srcObject = stream;
|
|
65
69
|
videoElement.play();
|
|
@@ -67,7 +71,7 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
67
71
|
}
|
|
68
72
|
else {
|
|
69
73
|
self.stopStream(stream);
|
|
70
|
-
Promise.reject(new Error(
|
|
74
|
+
Promise.reject(new Error("camera already stopped"));
|
|
71
75
|
}
|
|
72
76
|
}, (err) => {
|
|
73
77
|
Promise.reject(new Error(err));
|
|
@@ -75,7 +79,7 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
else {
|
|
78
|
-
Promise.reject(new Error(
|
|
82
|
+
Promise.reject(new Error("camera already started"));
|
|
79
83
|
}
|
|
80
84
|
}
|
|
81
85
|
stopStream(stream) {
|
|
@@ -86,7 +90,7 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
86
90
|
}
|
|
87
91
|
}
|
|
88
92
|
async stop() {
|
|
89
|
-
const video = document.getElementById(
|
|
93
|
+
const video = document.getElementById("video");
|
|
90
94
|
if (video) {
|
|
91
95
|
video.pause();
|
|
92
96
|
this.stopStream(video.srcObject);
|
|
@@ -95,33 +99,33 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
95
99
|
}
|
|
96
100
|
async capture(options) {
|
|
97
101
|
return new Promise((resolve, reject) => {
|
|
98
|
-
const video = document.getElementById(
|
|
102
|
+
const video = document.getElementById("video");
|
|
99
103
|
if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {
|
|
100
|
-
reject(new Error(
|
|
104
|
+
reject(new Error("camera is not running"));
|
|
101
105
|
return;
|
|
102
106
|
}
|
|
103
107
|
// video.width = video.offsetWidth;
|
|
104
108
|
let base64EncodedImage;
|
|
105
109
|
if (video && video.videoWidth > 0 && video.videoHeight > 0) {
|
|
106
|
-
const canvas = document.createElement(
|
|
107
|
-
const context = canvas.getContext(
|
|
110
|
+
const canvas = document.createElement("canvas");
|
|
111
|
+
const context = canvas.getContext("2d");
|
|
108
112
|
canvas.width = video.videoWidth;
|
|
109
113
|
canvas.height = video.videoHeight;
|
|
110
114
|
// flip horizontally back camera isn't used
|
|
111
115
|
if (!this.isBackCamera) {
|
|
112
|
-
context.translate(video.videoWidth, 0);
|
|
113
|
-
context.scale(-1, 1);
|
|
116
|
+
context === null || context === void 0 ? void 0 : context.translate(video.videoWidth, 0);
|
|
117
|
+
context === null || context === void 0 ? void 0 : context.scale(-1, 1);
|
|
114
118
|
}
|
|
115
|
-
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
116
|
-
if ((options.format ||
|
|
119
|
+
context === null || context === void 0 ? void 0 : context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
120
|
+
if ((options.format || "jpeg") === "jpeg") {
|
|
117
121
|
base64EncodedImage = canvas
|
|
118
|
-
.toDataURL(
|
|
119
|
-
.replace(
|
|
122
|
+
.toDataURL("image/jpeg", (options.quality || 85) / 100.0)
|
|
123
|
+
.replace("data:image/jpeg;base64,", "");
|
|
120
124
|
}
|
|
121
125
|
else {
|
|
122
126
|
base64EncodedImage = canvas
|
|
123
|
-
.toDataURL(
|
|
124
|
-
.replace(
|
|
127
|
+
.toDataURL("image/png")
|
|
128
|
+
.replace("data:image/png;base64,", "");
|
|
125
129
|
}
|
|
126
130
|
}
|
|
127
131
|
resolve({
|
|
@@ -133,27 +137,28 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
133
137
|
return this.capture(_options);
|
|
134
138
|
}
|
|
135
139
|
async stopRecordVideo() {
|
|
136
|
-
throw new Error(
|
|
140
|
+
throw new Error("stopRecordVideo not supported under the web platform");
|
|
137
141
|
}
|
|
138
142
|
async startRecordVideo(_options) {
|
|
139
|
-
|
|
143
|
+
console.log("startRecordVideo", _options);
|
|
144
|
+
throw new Error("startRecordVideo not supported under the web platform");
|
|
140
145
|
}
|
|
141
146
|
async getSupportedFlashModes() {
|
|
142
|
-
throw new Error(
|
|
147
|
+
throw new Error("getSupportedFlashModes not supported under the web platform");
|
|
143
148
|
}
|
|
144
149
|
async getHorizontalFov() {
|
|
145
|
-
throw new Error(
|
|
150
|
+
throw new Error("getHorizontalFov not supported under the web platform");
|
|
146
151
|
}
|
|
147
152
|
async setFlashMode(_options) {
|
|
148
153
|
throw new Error(`setFlashMode not supported under the web platform${_options}`);
|
|
149
154
|
}
|
|
150
155
|
async flip() {
|
|
151
|
-
throw new Error(
|
|
156
|
+
throw new Error("flip not supported under the web platform");
|
|
152
157
|
}
|
|
153
158
|
async setOpacity(_options) {
|
|
154
|
-
const video = document.getElementById(
|
|
159
|
+
const video = document.getElementById("video");
|
|
155
160
|
if (!!video && !!_options.opacity)
|
|
156
|
-
video.style.setProperty(
|
|
161
|
+
video.style.setProperty("opacity", _options.opacity.toString());
|
|
157
162
|
}
|
|
158
163
|
}
|
|
159
164
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core'\n\nimport type {\n CameraOpacityOptions,\n CameraPreviewFlashMode,\n CameraPreviewOptions,\n CameraPreviewPictureOptions,\n CameraPreviewPlugin,\n CameraSampleOptions,\n} from './definitions'\n\nexport class CameraPreviewWeb extends WebPlugin implements CameraPreviewPlugin {\n /**\n * track which camera is used based on start options\n * used in capture\n */\n private isBackCamera: boolean\n\n constructor() {\n super({\n name: 'CameraPreview',\n platforms: ['web'],\n })\n }\n\n async start(options: CameraPreviewOptions): Promise<void> {\n await navigator.mediaDevices\n .getUserMedia({\n audio: !options.disableAudio,\n video: true,\n })\n .then((stream: MediaStream) => {\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach(track => track.stop())\n })\n .catch((error) => {\n Promise.reject(error)\n })\n\n const video = document.getElementById('video')\n const parent = document.getElementById(options.parent)\n\n if (!video) {\n const videoElement = document.createElement('video')\n videoElement.id = 'video'\n videoElement.setAttribute('class', options.className || '')\n\n // Don't flip video feed if camera is rear facing\n if (options.position !== 'rear') {\n videoElement.setAttribute(\n 'style',\n '-webkit-transform: scaleX(-1); transform: scaleX(-1);',\n )\n }\n\n const userAgent = navigator.userAgent.toLowerCase()\n const isSafari\n = userAgent.includes('safari') && !userAgent.includes('chrome')\n\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute('autoplay', 'true')\n videoElement.setAttribute('muted', 'true')\n videoElement.setAttribute('playsinline', 'true')\n }\n\n parent.appendChild(videoElement)\n\n if (navigator?.mediaDevices?.getUserMedia) {\n const constraints: MediaStreamConstraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n }\n\n if (options.position === 'rear') {\n (constraints.video as MediaTrackConstraints).facingMode\n = 'environment'\n this.isBackCamera = true\n }\n else {\n this.isBackCamera = false\n }\n\n // eslint-disable-next-line ts/no-this-alias\n const self = this\n await navigator.mediaDevices.getUserMedia(constraints).then(\n (stream) => {\n if (document.getElementById('video')) {\n // video.src = window.URL.createObjectURL(stream);\n videoElement.srcObject = stream\n videoElement.play()\n Promise.resolve({})\n }\n else {\n self.stopStream(stream)\n Promise.reject(new Error('camera already stopped'))\n }\n },\n (err) => {\n Promise.reject(new Error(err))\n },\n )\n }\n }\n else {\n Promise.reject(new Error('camera already started'))\n }\n }\n\n private stopStream(stream: any) {\n if (stream) {\n const tracks = stream.getTracks()\n\n for (const track of tracks) track.stop()\n }\n }\n\n async stop(): Promise<any> {\n const video = document.getElementById('video') as HTMLVideoElement\n if (video) {\n video.pause()\n\n this.stopStream(video.srcObject)\n\n video.remove()\n }\n }\n\n async capture(options: CameraPreviewPictureOptions): Promise<any> {\n return new Promise((resolve, reject) => {\n const video = document.getElementById('video') as HTMLVideoElement\n if (!video?.srcObject) {\n reject(new Error('camera is not running'))\n return\n }\n\n // video.width = video.offsetWidth;\n\n let base64EncodedImage\n\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')\n canvas.width = video.videoWidth\n canvas.height = video.videoHeight\n\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context.translate(video.videoWidth, 0)\n context.scale(-1, 1)\n }\n context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight)\n\n if ((options.format || 'jpeg') === 'jpeg') {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', (options.quality || 85) / 100.0)\n .replace('data:image/jpeg;base64,', '')\n }\n else {\n base64EncodedImage = canvas\n .toDataURL('image/png')\n .replace('data:image/png;base64,', '')\n }\n }\n\n resolve({\n value: base64EncodedImage,\n })\n })\n }\n\n async captureSample(_options: CameraSampleOptions): Promise<any> {\n return this.capture(_options)\n }\n\n async stopRecordVideo(): Promise<any> {\n throw new Error('stopRecordVideo not supported under the web platform')\n }\n\n async startRecordVideo(_options: CameraPreviewOptions): Promise<any> {\n throw new Error('startRecordVideo not supported under the web platform')\n }\n\n async getSupportedFlashModes(): Promise<{\n result: CameraPreviewFlashMode[]\n }> {\n throw new Error(\n 'getSupportedFlashModes not supported under the web platform',\n )\n }\n\n async getHorizontalFov(): Promise<{\n result: any\n }> {\n throw new Error('getHorizontalFov not supported under the web platform')\n }\n\n async setFlashMode(_options: {\n flashMode: CameraPreviewFlashMode | string\n }): Promise<void> {\n throw new Error(\n `setFlashMode not supported under the web platform${_options}`,\n )\n }\n\n async flip(): Promise<void> {\n throw new Error('flip not supported under the web platform')\n }\n\n async setOpacity(_options: CameraOpacityOptions): Promise<any> {\n const video = document.getElementById('video') as HTMLVideoElement\n if (!!video && !!_options.opacity)\n video.style.setProperty('opacity', _options.opacity.toString())\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from \"@capacitor/core\";\n\nimport type {\n CameraOpacityOptions,\n CameraPreviewFlashMode,\n CameraPreviewOptions,\n CameraPreviewPictureOptions,\n CameraPreviewPlugin,\n CameraSampleOptions,\n} from \"./definitions\";\n\nexport class CameraPreviewWeb extends WebPlugin implements CameraPreviewPlugin {\n /**\n * track which camera is used based on start options\n * used in capture\n */\n private isBackCamera: boolean = false;\n\n constructor() {\n super({\n name: \"CameraPreview\",\n platforms: [\"web\"],\n });\n }\n\n async start(options: CameraPreviewOptions): Promise<void> {\n await navigator.mediaDevices\n .getUserMedia({\n audio: !options.disableAudio,\n video: true,\n })\n .then((stream: MediaStream) => {\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach((track) => track.stop());\n })\n .catch((error) => {\n Promise.reject(error);\n });\n\n const video = document.getElementById(\"video\");\n const parent = document.getElementById(options?.parent || \"\");\n\n if (!video) {\n const videoElement = document.createElement(\"video\");\n videoElement.id = \"video\";\n videoElement.setAttribute(\"class\", options?.className || \"\");\n\n // Don't flip video feed if camera is rear facing\n if (options.position !== \"rear\") {\n videoElement.setAttribute(\n \"style\",\n \"-webkit-transform: scaleX(-1); transform: scaleX(-1);\",\n );\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari =\n userAgent.includes(\"safari\") && !userAgent.includes(\"chrome\");\n\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute(\"autoplay\", \"true\");\n videoElement.setAttribute(\"muted\", \"true\");\n videoElement.setAttribute(\"playsinline\", \"true\");\n }\n\n parent?.appendChild(videoElement);\n\n if (navigator?.mediaDevices?.getUserMedia) {\n const constraints: MediaStreamConstraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n\n if (options.position === \"rear\") {\n (constraints.video as MediaTrackConstraints).facingMode =\n \"environment\";\n this.isBackCamera = true;\n } else {\n this.isBackCamera = false;\n }\n\n const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then(\n (stream) => {\n if (document.getElementById(\"video\")) {\n // video.src = window.URL.createObjectURL(stream);\n videoElement.srcObject = stream;\n videoElement.play();\n Promise.resolve({});\n } else {\n self.stopStream(stream);\n Promise.reject(new Error(\"camera already stopped\"));\n }\n },\n (err) => {\n Promise.reject(new Error(err));\n },\n );\n }\n } else {\n Promise.reject(new Error(\"camera already started\"));\n }\n }\n\n private stopStream(stream: any) {\n if (stream) {\n const tracks = stream.getTracks();\n\n for (const track of tracks) track.stop();\n }\n }\n\n async stop(): Promise<any> {\n const video = document.getElementById(\"video\") as HTMLVideoElement;\n if (video) {\n video.pause();\n\n this.stopStream(video.srcObject);\n\n video.remove();\n }\n }\n\n async capture(options: CameraPreviewPictureOptions): Promise<any> {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(\"video\") as HTMLVideoElement;\n if (!video?.srcObject) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n\n // video.width = video.offsetWidth;\n\n let base64EncodedImage;\n\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context?.translate(video.videoWidth, 0);\n context?.scale(-1, 1);\n }\n context?.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n } else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n\n async captureSample(_options: CameraSampleOptions): Promise<any> {\n return this.capture(_options);\n }\n\n async stopRecordVideo(): Promise<any> {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n\n async startRecordVideo(_options: CameraPreviewOptions): Promise<any> {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n\n async getSupportedFlashModes(): Promise<{\n result: CameraPreviewFlashMode[];\n }> {\n throw new Error(\n \"getSupportedFlashModes not supported under the web platform\",\n );\n }\n\n async getHorizontalFov(): Promise<{\n result: any;\n }> {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n\n async setFlashMode(_options: {\n flashMode: CameraPreviewFlashMode | string;\n }): Promise<void> {\n throw new Error(\n `setFlashMode not supported under the web platform${_options}`,\n );\n }\n\n async flip(): Promise<void> {\n throw new Error(\"flip not supported under the web platform\");\n }\n\n async setOpacity(_options: CameraOpacityOptions): Promise<any> {\n const video = document.getElementById(\"video\") as HTMLVideoElement;\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n}\n"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -2,16 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@capacitor/core');
|
|
4
4
|
|
|
5
|
-
const CameraPreview = core.registerPlugin(
|
|
6
|
-
web: () => Promise.resolve().then(function () { return web; }).then(m => new m.CameraPreviewWeb()),
|
|
5
|
+
const CameraPreview = core.registerPlugin("CameraPreview", {
|
|
6
|
+
web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.CameraPreviewWeb()),
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
class CameraPreviewWeb extends core.WebPlugin {
|
|
10
10
|
constructor() {
|
|
11
11
|
super({
|
|
12
|
-
name:
|
|
13
|
-
platforms: [
|
|
12
|
+
name: "CameraPreview",
|
|
13
|
+
platforms: ["web"],
|
|
14
14
|
});
|
|
15
|
+
/**
|
|
16
|
+
* track which camera is used based on start options
|
|
17
|
+
* used in capture
|
|
18
|
+
*/
|
|
19
|
+
this.isBackCamera = false;
|
|
15
20
|
}
|
|
16
21
|
async start(options) {
|
|
17
22
|
var _a;
|
|
@@ -22,32 +27,32 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
22
27
|
})
|
|
23
28
|
.then((stream) => {
|
|
24
29
|
// Stop any existing stream so we can request media with different constraints based on user input
|
|
25
|
-
stream.getTracks().forEach(track => track.stop());
|
|
30
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
26
31
|
})
|
|
27
32
|
.catch((error) => {
|
|
28
33
|
Promise.reject(error);
|
|
29
34
|
});
|
|
30
|
-
const video = document.getElementById(
|
|
31
|
-
const parent = document.getElementById(options.parent);
|
|
35
|
+
const video = document.getElementById("video");
|
|
36
|
+
const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || "");
|
|
32
37
|
if (!video) {
|
|
33
|
-
const videoElement = document.createElement(
|
|
34
|
-
videoElement.id =
|
|
35
|
-
videoElement.setAttribute(
|
|
38
|
+
const videoElement = document.createElement("video");
|
|
39
|
+
videoElement.id = "video";
|
|
40
|
+
videoElement.setAttribute("class", (options === null || options === void 0 ? void 0 : options.className) || "");
|
|
36
41
|
// Don't flip video feed if camera is rear facing
|
|
37
|
-
if (options.position !==
|
|
38
|
-
videoElement.setAttribute(
|
|
42
|
+
if (options.position !== "rear") {
|
|
43
|
+
videoElement.setAttribute("style", "-webkit-transform: scaleX(-1); transform: scaleX(-1);");
|
|
39
44
|
}
|
|
40
45
|
const userAgent = navigator.userAgent.toLowerCase();
|
|
41
|
-
const isSafari = userAgent.includes(
|
|
46
|
+
const isSafari = userAgent.includes("safari") && !userAgent.includes("chrome");
|
|
42
47
|
// Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
|
|
43
48
|
// Without these attributes videoElement.play() will throw a NotAllowedError
|
|
44
49
|
// https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
|
|
45
50
|
if (isSafari) {
|
|
46
|
-
videoElement.setAttribute(
|
|
47
|
-
videoElement.setAttribute(
|
|
48
|
-
videoElement.setAttribute(
|
|
51
|
+
videoElement.setAttribute("autoplay", "true");
|
|
52
|
+
videoElement.setAttribute("muted", "true");
|
|
53
|
+
videoElement.setAttribute("playsinline", "true");
|
|
49
54
|
}
|
|
50
|
-
parent.appendChild(videoElement);
|
|
55
|
+
parent === null || parent === void 0 ? void 0 : parent.appendChild(videoElement);
|
|
51
56
|
if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
|
|
52
57
|
const constraints = {
|
|
53
58
|
video: {
|
|
@@ -55,18 +60,17 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
55
60
|
height: { ideal: options.height },
|
|
56
61
|
},
|
|
57
62
|
};
|
|
58
|
-
if (options.position ===
|
|
59
|
-
constraints.video.facingMode
|
|
60
|
-
|
|
63
|
+
if (options.position === "rear") {
|
|
64
|
+
constraints.video.facingMode =
|
|
65
|
+
"environment";
|
|
61
66
|
this.isBackCamera = true;
|
|
62
67
|
}
|
|
63
68
|
else {
|
|
64
69
|
this.isBackCamera = false;
|
|
65
70
|
}
|
|
66
|
-
// eslint-disable-next-line ts/no-this-alias
|
|
67
71
|
const self = this;
|
|
68
72
|
await navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
|
|
69
|
-
if (document.getElementById(
|
|
73
|
+
if (document.getElementById("video")) {
|
|
70
74
|
// video.src = window.URL.createObjectURL(stream);
|
|
71
75
|
videoElement.srcObject = stream;
|
|
72
76
|
videoElement.play();
|
|
@@ -74,7 +78,7 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
74
78
|
}
|
|
75
79
|
else {
|
|
76
80
|
self.stopStream(stream);
|
|
77
|
-
Promise.reject(new Error(
|
|
81
|
+
Promise.reject(new Error("camera already stopped"));
|
|
78
82
|
}
|
|
79
83
|
}, (err) => {
|
|
80
84
|
Promise.reject(new Error(err));
|
|
@@ -82,7 +86,7 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
88
|
else {
|
|
85
|
-
Promise.reject(new Error(
|
|
89
|
+
Promise.reject(new Error("camera already started"));
|
|
86
90
|
}
|
|
87
91
|
}
|
|
88
92
|
stopStream(stream) {
|
|
@@ -93,7 +97,7 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
99
|
async stop() {
|
|
96
|
-
const video = document.getElementById(
|
|
100
|
+
const video = document.getElementById("video");
|
|
97
101
|
if (video) {
|
|
98
102
|
video.pause();
|
|
99
103
|
this.stopStream(video.srcObject);
|
|
@@ -102,33 +106,33 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
102
106
|
}
|
|
103
107
|
async capture(options) {
|
|
104
108
|
return new Promise((resolve, reject) => {
|
|
105
|
-
const video = document.getElementById(
|
|
109
|
+
const video = document.getElementById("video");
|
|
106
110
|
if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {
|
|
107
|
-
reject(new Error(
|
|
111
|
+
reject(new Error("camera is not running"));
|
|
108
112
|
return;
|
|
109
113
|
}
|
|
110
114
|
// video.width = video.offsetWidth;
|
|
111
115
|
let base64EncodedImage;
|
|
112
116
|
if (video && video.videoWidth > 0 && video.videoHeight > 0) {
|
|
113
|
-
const canvas = document.createElement(
|
|
114
|
-
const context = canvas.getContext(
|
|
117
|
+
const canvas = document.createElement("canvas");
|
|
118
|
+
const context = canvas.getContext("2d");
|
|
115
119
|
canvas.width = video.videoWidth;
|
|
116
120
|
canvas.height = video.videoHeight;
|
|
117
121
|
// flip horizontally back camera isn't used
|
|
118
122
|
if (!this.isBackCamera) {
|
|
119
|
-
context.translate(video.videoWidth, 0);
|
|
120
|
-
context.scale(-1, 1);
|
|
123
|
+
context === null || context === void 0 ? void 0 : context.translate(video.videoWidth, 0);
|
|
124
|
+
context === null || context === void 0 ? void 0 : context.scale(-1, 1);
|
|
121
125
|
}
|
|
122
|
-
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
123
|
-
if ((options.format ||
|
|
126
|
+
context === null || context === void 0 ? void 0 : context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
127
|
+
if ((options.format || "jpeg") === "jpeg") {
|
|
124
128
|
base64EncodedImage = canvas
|
|
125
|
-
.toDataURL(
|
|
126
|
-
.replace(
|
|
129
|
+
.toDataURL("image/jpeg", (options.quality || 85) / 100.0)
|
|
130
|
+
.replace("data:image/jpeg;base64,", "");
|
|
127
131
|
}
|
|
128
132
|
else {
|
|
129
133
|
base64EncodedImage = canvas
|
|
130
|
-
.toDataURL(
|
|
131
|
-
.replace(
|
|
134
|
+
.toDataURL("image/png")
|
|
135
|
+
.replace("data:image/png;base64,", "");
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
138
|
resolve({
|
|
@@ -140,27 +144,28 @@ class CameraPreviewWeb extends core.WebPlugin {
|
|
|
140
144
|
return this.capture(_options);
|
|
141
145
|
}
|
|
142
146
|
async stopRecordVideo() {
|
|
143
|
-
throw new Error(
|
|
147
|
+
throw new Error("stopRecordVideo not supported under the web platform");
|
|
144
148
|
}
|
|
145
149
|
async startRecordVideo(_options) {
|
|
146
|
-
|
|
150
|
+
console.log("startRecordVideo", _options);
|
|
151
|
+
throw new Error("startRecordVideo not supported under the web platform");
|
|
147
152
|
}
|
|
148
153
|
async getSupportedFlashModes() {
|
|
149
|
-
throw new Error(
|
|
154
|
+
throw new Error("getSupportedFlashModes not supported under the web platform");
|
|
150
155
|
}
|
|
151
156
|
async getHorizontalFov() {
|
|
152
|
-
throw new Error(
|
|
157
|
+
throw new Error("getHorizontalFov not supported under the web platform");
|
|
153
158
|
}
|
|
154
159
|
async setFlashMode(_options) {
|
|
155
160
|
throw new Error(`setFlashMode not supported under the web platform${_options}`);
|
|
156
161
|
}
|
|
157
162
|
async flip() {
|
|
158
|
-
throw new Error(
|
|
163
|
+
throw new Error("flip not supported under the web platform");
|
|
159
164
|
}
|
|
160
165
|
async setOpacity(_options) {
|
|
161
|
-
const video = document.getElementById(
|
|
166
|
+
const video = document.getElementById("video");
|
|
162
167
|
if (!!video && !!_options.opacity)
|
|
163
|
-
video.style.setProperty(
|
|
168
|
+
video.style.setProperty("opacity", _options.opacity.toString());
|
|
164
169
|
}
|
|
165
170
|
}
|
|
166
171
|
|
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';\nconst CameraPreview = registerPlugin('CameraPreview', {\n web: () => import('./web').then(m => new m.CameraPreviewWeb()),\n});\nexport * from './definitions';\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super({\n name: 'CameraPreview',\n platforms: ['web'],\n });\n }\n async start(options) {\n var _a;\n await navigator.mediaDevices\n .getUserMedia({\n audio: !options.disableAudio,\n video: true,\n })\n .then((stream) => {\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach(track => track.stop());\n })\n .catch((error) => {\n Promise.reject(error);\n });\n const video = document.getElementById('video');\n const parent = document.getElementById(options.parent);\n if (!video) {\n const videoElement = document.createElement('video');\n videoElement.id = 'video';\n videoElement.setAttribute('class', options.className || '');\n // Don't flip video feed if camera is rear facing\n if (options.position !== 'rear') {\n videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');\n }\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute('autoplay', 'true');\n videoElement.setAttribute('muted', 'true');\n videoElement.setAttribute('playsinline', 'true');\n }\n parent.appendChild(videoElement);\n if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {\n const constraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n if (options.position === 'rear') {\n constraints.video.facingMode\n = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n // eslint-disable-next-line ts/no-this-alias\n const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then((stream) => {\n if (document.getElementById('video')) {\n // video.src = window.URL.createObjectURL(stream);\n videoElement.srcObject = stream;\n videoElement.play();\n Promise.resolve({});\n }\n else {\n self.stopStream(stream);\n Promise.reject(new Error('camera already stopped'));\n }\n }, (err) => {\n Promise.reject(new Error(err));\n });\n }\n }\n else {\n Promise.reject(new Error('camera already started'));\n }\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById('video');\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById('video');\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error('camera is not running'));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context.translate(video.videoWidth, 0);\n context.scale(-1, 1);\n }\n context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n if ((options.format || 'jpeg') === 'jpeg') {\n base64EncodedImage = canvas\n .toDataURL('image/jpeg', (options.quality || 85) / 100.0)\n .replace('data:image/jpeg;base64,', '');\n }\n else {\n base64EncodedImage = canvas\n .toDataURL('image/png')\n .replace('data:image/png;base64,', '');\n }\n }\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error('stopRecordVideo not supported under the web platform');\n }\n async startRecordVideo(_options) {\n throw new Error('startRecordVideo not supported under the web platform');\n }\n async getSupportedFlashModes() {\n throw new Error('getSupportedFlashModes not supported under the web platform');\n }\n async getHorizontalFov() {\n throw new Error('getHorizontalFov not supported under the web platform');\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n throw new Error('flip not supported under the web platform');\n }\n async setOpacity(_options) {\n const video = document.getElementById('video');\n if (!!video && !!_options.opacity)\n video.style.setProperty('opacity', _options.opacity.toString());\n }\n}\n//# sourceMappingURL=web.js.map"],"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\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super({\n name: \"CameraPreview\",\n platforms: [\"web\"],\n });\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n }\n async start(options) {\n var _a;\n await navigator.mediaDevices\n .getUserMedia({\n audio: !options.disableAudio,\n video: true,\n })\n .then((stream) => {\n // Stop any existing stream so we can request media with different constraints based on user input\n stream.getTracks().forEach((track) => track.stop());\n })\n .catch((error) => {\n Promise.reject(error);\n });\n const video = document.getElementById(\"video\");\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n if (!video) {\n const videoElement = document.createElement(\"video\");\n videoElement.id = \"video\";\n videoElement.setAttribute(\"class\", (options === null || options === void 0 ? void 0 : options.className) || \"\");\n // Don't flip video feed if camera is rear facing\n if (options.position !== \"rear\") {\n videoElement.setAttribute(\"style\", \"-webkit-transform: scaleX(-1); transform: scaleX(-1);\");\n }\n const userAgent = navigator.userAgent.toLowerCase();\n const isSafari = userAgent.includes(\"safari\") && !userAgent.includes(\"chrome\");\n // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful\n // Without these attributes videoElement.play() will throw a NotAllowedError\n // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari\n if (isSafari) {\n videoElement.setAttribute(\"autoplay\", \"true\");\n videoElement.setAttribute(\"muted\", \"true\");\n videoElement.setAttribute(\"playsinline\", \"true\");\n }\n parent === null || parent === void 0 ? void 0 : parent.appendChild(videoElement);\n if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {\n const constraints = {\n video: {\n width: { ideal: options.width },\n height: { ideal: options.height },\n },\n };\n if (options.position === \"rear\") {\n constraints.video.facingMode =\n \"environment\";\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then((stream) => {\n if (document.getElementById(\"video\")) {\n // video.src = window.URL.createObjectURL(stream);\n videoElement.srcObject = stream;\n videoElement.play();\n Promise.resolve({});\n }\n else {\n self.stopStream(stream);\n Promise.reject(new Error(\"camera already stopped\"));\n }\n }, (err) => {\n Promise.reject(new Error(err));\n });\n }\n }\n else {\n Promise.reject(new Error(\"camera already started\"));\n }\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(\"video\");\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n }\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(\"video\");\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(video.videoWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n throw new Error(\"flip not supported under the web platform\");\n }\n async setOpacity(_options) {\n const video = document.getElementById(\"video\");\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|