@capgo/camera-preview 3.2.8 → 3.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CapgoCameraPreview.podspec +1 -1
  2. package/README.md +263 -46
  3. package/android/.gradle/7.4.2/checksums/checksums.lock +0 -0
  4. package/android/.gradle/7.4.2/checksums/md5-checksums.bin +0 -0
  5. package/android/.gradle/7.4.2/checksums/sha1-checksums.bin +0 -0
  6. package/android/.gradle/7.4.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  7. package/android/.gradle/7.4.2/dependencies-accessors/gc.properties +0 -0
  8. package/android/.gradle/7.4.2/executionHistory/executionHistory.lock +0 -0
  9. package/android/.gradle/7.4.2/fileChanges/last-build.bin +0 -0
  10. package/android/.gradle/7.4.2/fileHashes/fileHashes.lock +0 -0
  11. package/android/.gradle/7.4.2/gc.properties +0 -0
  12. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  13. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  14. package/android/.gradle/vcs-1/gc.properties +0 -0
  15. package/android/build.gradle +8 -8
  16. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  17. package/android/gradle/wrapper/gradle-wrapper.properties +2 -3
  18. package/android/gradlew +182 -108
  19. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +5 -7
  20. package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +17 -9
  21. package/dist/docs.json +407 -0
  22. package/dist/esm/definitions.d.ts +12 -6
  23. package/dist/esm/index.d.ts +1 -1
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/web.d.ts +6 -4
  26. package/dist/esm/web.js +98 -82
  27. package/dist/esm/web.js.map +1 -1
  28. package/dist/plugin.cjs.js +165 -0
  29. package/dist/plugin.cjs.js.map +1 -0
  30. package/dist/plugin.js +168 -0
  31. package/dist/plugin.js.map +1 -0
  32. package/ios/Plugin/CameraController.swift +19 -1
  33. package/ios/Plugin/Plugin.m +1 -0
  34. package/ios/Plugin/Plugin.swift +42 -7
  35. package/ios/Plugin.xcodeproj/project.pbxproj +10 -4
  36. package/ios/Podfile +1 -1
  37. package/ios/Podfile.lock +4 -4
  38. package/package.json +40 -35
package/dist/esm/web.js CHANGED
@@ -7,102 +7,119 @@ export class CameraPreviewWeb extends WebPlugin {
7
7
  });
8
8
  }
9
9
  async start(options) {
10
- return new Promise(async (resolve, reject) => {
11
- await navigator.mediaDevices
12
- .getUserMedia({
13
- audio: !options.disableAudio,
14
- video: true
15
- })
16
- .then((stream) => {
17
- // Stop any existing stream so we can request media with different constraints based on user input
18
- stream.getTracks().forEach((track) => track.stop());
19
- })
20
- .catch((error) => {
21
- reject(error);
22
- });
23
- const video = document.getElementById('video');
24
- const parent = document.getElementById(options.parent);
25
- if (!video) {
26
- const videoElement = document.createElement('video');
27
- videoElement.id = 'video';
28
- videoElement.setAttribute('class', options.className || '');
29
- // Don't flip video feed if camera is rear facing
30
- if (options.position !== 'rear') {
31
- videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
10
+ var _a;
11
+ await navigator.mediaDevices
12
+ .getUserMedia({
13
+ audio: !options.disableAudio,
14
+ video: true,
15
+ })
16
+ .then((stream) => {
17
+ // Stop any existing stream so we can request media with different constraints based on user input
18
+ stream.getTracks().forEach((track) => track.stop());
19
+ })
20
+ .catch((error) => {
21
+ Promise.reject(error);
22
+ });
23
+ const video = document.getElementById('video');
24
+ const parent = document.getElementById(options.parent);
25
+ if (!video) {
26
+ const videoElement = document.createElement('video');
27
+ videoElement.id = 'video';
28
+ videoElement.setAttribute('class', options.className || '');
29
+ // Don't flip video feed if camera is rear facing
30
+ if (options.position !== 'rear') {
31
+ videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
32
+ }
33
+ const userAgent = navigator.userAgent.toLowerCase();
34
+ const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
35
+ // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
36
+ // Without these attributes videoElement.play() will throw a NotAllowedError
37
+ // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
38
+ if (isSafari) {
39
+ videoElement.setAttribute('autoplay', 'true');
40
+ videoElement.setAttribute('muted', 'true');
41
+ videoElement.setAttribute('playsinline', 'true');
42
+ }
43
+ parent.appendChild(videoElement);
44
+ if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
45
+ const constraints = {
46
+ video: {
47
+ width: { ideal: options.width },
48
+ height: { ideal: options.height },
49
+ },
50
+ };
51
+ if (options.position === 'rear') {
52
+ constraints.video.facingMode = 'environment';
53
+ this.isBackCamera = true;
32
54
  }
33
- const userAgent = navigator.userAgent.toLowerCase();
34
- const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
35
- // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
36
- // Without these attributes videoElement.play() will throw a NotAllowedError
37
- // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
38
- if (isSafari) {
39
- videoElement.setAttribute('autoplay', 'true');
40
- videoElement.setAttribute('muted', 'true');
41
- videoElement.setAttribute('playsinline', 'true');
55
+ else {
56
+ this.isBackCamera = false;
42
57
  }
43
- parent.appendChild(videoElement);
44
- if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
45
- const constraints = {
46
- video: {
47
- width: { ideal: options.width },
48
- height: { ideal: options.height }
49
- }
50
- };
51
- if (options.position === 'rear') {
52
- constraints.video.facingMode = 'environment';
53
- this.isBackCamera = true;
54
- }
55
- else {
56
- this.isBackCamera = false;
57
- }
58
- navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
58
+ const self = this;
59
+ await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
60
+ if (document.getElementById('video')) {
59
61
  //video.src = window.URL.createObjectURL(stream);
60
62
  videoElement.srcObject = stream;
61
63
  videoElement.play();
62
- resolve({});
63
- }, (err) => {
64
- reject(err);
65
- });
66
- }
64
+ Promise.resolve({});
65
+ }
66
+ else {
67
+ self.stopStream(stream);
68
+ Promise.reject({ message: 'camera already stopped' });
69
+ }
70
+ }, (err) => {
71
+ Promise.reject(err);
72
+ });
67
73
  }
68
- else {
69
- reject({ message: 'camera already started' });
74
+ }
75
+ else {
76
+ Promise.reject({ message: 'camera already started' });
77
+ }
78
+ }
79
+ stopStream(stream) {
80
+ if (stream) {
81
+ const tracks = stream.getTracks();
82
+ for (const track of tracks) {
83
+ track.stop();
70
84
  }
71
- });
85
+ }
72
86
  }
73
87
  async stop() {
74
88
  const video = document.getElementById('video');
75
89
  if (video) {
76
90
  video.pause();
77
- const st = video.srcObject;
78
- const tracks = st.getTracks();
79
- for (var i = 0; i < tracks.length; i++) {
80
- var track = tracks[i];
81
- track.stop();
82
- }
91
+ this.stopStream(video.srcObject);
83
92
  video.remove();
84
93
  }
85
94
  }
86
95
  async capture(options) {
87
- return new Promise((resolve, _) => {
96
+ return new Promise((resolve, reject) => {
88
97
  const video = document.getElementById('video');
89
- const canvas = document.createElement('canvas');
90
- // video.width = video.offsetWidth;
91
- const context = canvas.getContext('2d');
92
- canvas.width = video.videoWidth;
93
- canvas.height = video.videoHeight;
94
- // flip horizontally back camera isn't used
95
- if (!this.isBackCamera) {
96
- context.translate(video.videoWidth, 0);
97
- context.scale(-1, 1);
98
+ if (!video || !video.srcObject) {
99
+ reject({ message: 'camera is not running' });
100
+ return;
98
101
  }
99
- context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
102
+ // video.width = video.offsetWidth;
100
103
  let base64EncodedImage;
101
- if (options.quality != undefined) {
102
- base64EncodedImage = canvas.toDataURL('image/jpeg', options.quality / 100.0).replace('data:image/jpeg;base64,', '');
103
- }
104
- else {
105
- base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
104
+ if (video && video.videoWidth > 0 && video.videoHeight > 0) {
105
+ const canvas = document.createElement('canvas');
106
+ const context = canvas.getContext('2d');
107
+ canvas.width = video.videoWidth;
108
+ canvas.height = video.videoHeight;
109
+ // flip horizontally back camera isn't used
110
+ if (!this.isBackCamera) {
111
+ context.translate(video.videoWidth, 0);
112
+ context.scale(-1, 1);
113
+ }
114
+ context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
115
+ if ((options.format || 'jpeg') === 'jpeg') {
116
+ base64EncodedImage = canvas
117
+ .toDataURL('image/jpeg', (options.quality || 85) / 100.0)
118
+ .replace('data:image/jpeg;base64,', '');
119
+ }
120
+ else {
121
+ base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
122
+ }
106
123
  }
107
124
  resolve({
108
125
  value: base64EncodedImage,
@@ -115,8 +132,11 @@ export class CameraPreviewWeb extends WebPlugin {
115
132
  async getSupportedFlashModes() {
116
133
  throw new Error('getSupportedFlashModes not supported under the web platform');
117
134
  }
135
+ async getHorizontalFov() {
136
+ throw new Error('getHorizontalFov not supported under the web platform');
137
+ }
118
138
  async setFlashMode(_options) {
119
- throw new Error('setFlashMode not supported under the web platform');
139
+ throw new Error('setFlashMode not supported under the web platform' + _options);
120
140
  }
121
141
  async flip() {
122
142
  throw new Error('flip not supported under the web platform');
@@ -128,8 +148,4 @@ export class CameraPreviewWeb extends WebPlugin {
128
148
  }
129
149
  }
130
150
  }
131
- const CameraPreview = new CameraPreviewWeb();
132
- export { CameraPreview };
133
- import { registerWebPlugin } from '@capacitor/core';
134
- registerWebPlugin(CameraPreview);
135
151
  //# sourceMappingURL=web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ const CameraPreview = core.registerPlugin('CameraPreview', {
6
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.CameraPreviewWeb()),
7
+ });
8
+
9
+ class CameraPreviewWeb extends core.WebPlugin {
10
+ constructor() {
11
+ super({
12
+ name: 'CameraPreview',
13
+ platforms: ['web'],
14
+ });
15
+ }
16
+ async start(options) {
17
+ var _a;
18
+ await navigator.mediaDevices
19
+ .getUserMedia({
20
+ audio: !options.disableAudio,
21
+ video: true,
22
+ })
23
+ .then((stream) => {
24
+ // Stop any existing stream so we can request media with different constraints based on user input
25
+ stream.getTracks().forEach((track) => track.stop());
26
+ })
27
+ .catch((error) => {
28
+ Promise.reject(error);
29
+ });
30
+ const video = document.getElementById('video');
31
+ const parent = document.getElementById(options.parent);
32
+ if (!video) {
33
+ const videoElement = document.createElement('video');
34
+ videoElement.id = 'video';
35
+ videoElement.setAttribute('class', options.className || '');
36
+ // Don't flip video feed if camera is rear facing
37
+ if (options.position !== 'rear') {
38
+ videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
39
+ }
40
+ const userAgent = navigator.userAgent.toLowerCase();
41
+ const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
42
+ // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
43
+ // Without these attributes videoElement.play() will throw a NotAllowedError
44
+ // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
45
+ if (isSafari) {
46
+ videoElement.setAttribute('autoplay', 'true');
47
+ videoElement.setAttribute('muted', 'true');
48
+ videoElement.setAttribute('playsinline', 'true');
49
+ }
50
+ parent.appendChild(videoElement);
51
+ if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
52
+ const constraints = {
53
+ video: {
54
+ width: { ideal: options.width },
55
+ height: { ideal: options.height },
56
+ },
57
+ };
58
+ if (options.position === 'rear') {
59
+ constraints.video.facingMode = 'environment';
60
+ this.isBackCamera = true;
61
+ }
62
+ else {
63
+ this.isBackCamera = false;
64
+ }
65
+ const self = this;
66
+ await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
67
+ if (document.getElementById('video')) {
68
+ //video.src = window.URL.createObjectURL(stream);
69
+ videoElement.srcObject = stream;
70
+ videoElement.play();
71
+ Promise.resolve({});
72
+ }
73
+ else {
74
+ self.stopStream(stream);
75
+ Promise.reject({ message: 'camera already stopped' });
76
+ }
77
+ }, (err) => {
78
+ Promise.reject(err);
79
+ });
80
+ }
81
+ }
82
+ else {
83
+ Promise.reject({ message: 'camera already started' });
84
+ }
85
+ }
86
+ stopStream(stream) {
87
+ if (stream) {
88
+ const tracks = stream.getTracks();
89
+ for (const track of tracks) {
90
+ track.stop();
91
+ }
92
+ }
93
+ }
94
+ async stop() {
95
+ const video = document.getElementById('video');
96
+ if (video) {
97
+ video.pause();
98
+ this.stopStream(video.srcObject);
99
+ video.remove();
100
+ }
101
+ }
102
+ async capture(options) {
103
+ return new Promise((resolve, reject) => {
104
+ const video = document.getElementById('video');
105
+ if (!video || !video.srcObject) {
106
+ reject({ message: 'camera is not running' });
107
+ return;
108
+ }
109
+ // video.width = video.offsetWidth;
110
+ let base64EncodedImage;
111
+ if (video && video.videoWidth > 0 && video.videoHeight > 0) {
112
+ const canvas = document.createElement('canvas');
113
+ const context = canvas.getContext('2d');
114
+ canvas.width = video.videoWidth;
115
+ canvas.height = video.videoHeight;
116
+ // flip horizontally back camera isn't used
117
+ if (!this.isBackCamera) {
118
+ context.translate(video.videoWidth, 0);
119
+ context.scale(-1, 1);
120
+ }
121
+ context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
122
+ if ((options.format || 'jpeg') === 'jpeg') {
123
+ base64EncodedImage = canvas
124
+ .toDataURL('image/jpeg', (options.quality || 85) / 100.0)
125
+ .replace('data:image/jpeg;base64,', '');
126
+ }
127
+ else {
128
+ base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
129
+ }
130
+ }
131
+ resolve({
132
+ value: base64EncodedImage,
133
+ });
134
+ });
135
+ }
136
+ async captureSample(_options) {
137
+ return this.capture(_options);
138
+ }
139
+ async getSupportedFlashModes() {
140
+ throw new Error('getSupportedFlashModes not supported under the web platform');
141
+ }
142
+ async getHorizontalFov() {
143
+ throw new Error('getHorizontalFov not supported under the web platform');
144
+ }
145
+ async setFlashMode(_options) {
146
+ throw new Error('setFlashMode not supported under the web platform' + _options);
147
+ }
148
+ async flip() {
149
+ throw new Error('flip not supported under the web platform');
150
+ }
151
+ async setOpacity(_options) {
152
+ const video = document.getElementById('video');
153
+ if (!!video && !!_options['opacity']) {
154
+ video.style.setProperty('opacity', _options['opacity'].toString());
155
+ }
156
+ }
157
+ }
158
+
159
+ var web = /*#__PURE__*/Object.freeze({
160
+ __proto__: null,
161
+ CameraPreviewWeb: CameraPreviewWeb
162
+ });
163
+
164
+ exports.CameraPreview = CameraPreview;
165
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +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 = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then(function (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({ message: 'camera already stopped' });\n }\n }, (err) => {\n Promise.reject(err);\n });\n }\n }\n else {\n Promise.reject({ message: '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 }\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 || !video.srcObject) {\n reject({ message: '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.toDataURL('image/png').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 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}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,aAAa,GAAGA,mBAAc,CAAC,eAAe,EAAE;AACtD,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;AACpE,CAAC;;ACFM,MAAM,gBAAgB,SAASC,cAAS,CAAC;AAChD,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,CAAC;AACd,YAAY,IAAI,EAAE,eAAe;AACjC,YAAY,SAAS,EAAE,CAAC,KAAK,CAAC;AAC9B,SAAS,CAAC,CAAC;AACX,KAAK;AACL,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE;AACzB,QAAQ,IAAI,EAAE,CAAC;AACf,QAAQ,MAAM,SAAS,CAAC,YAAY;AACpC,aAAa,YAAY,CAAC;AAC1B,YAAY,KAAK,EAAE,CAAC,OAAO,CAAC,YAAY;AACxC,YAAY,KAAK,EAAE,IAAI;AACvB,SAAS,CAAC;AACV,aAAa,IAAI,CAAC,CAAC,MAAM,KAAK;AAC9B;AACA,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,SAAS,CAAC;AACV,aAAa,KAAK,CAAC,CAAC,KAAK,KAAK;AAC9B,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClC,SAAS,CAAC,CAAC;AACX,QAAQ,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACvD,QAAQ,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC/D,QAAQ,IAAI,CAAC,KAAK,EAAE;AACpB,YAAY,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACjE,YAAY,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC;AACtC,YAAY,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AACxE;AACA,YAAY,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE;AAC7C,gBAAgB,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,uDAAuD,CAAC,CAAC;AAC5G,aAAa;AACb,YAAY,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAChE,YAAY,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC3F;AACA;AACA;AACA,YAAY,IAAI,QAAQ,EAAE;AAC1B,gBAAgB,YAAY,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC9D,gBAAgB,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3D,gBAAgB,YAAY,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AACjE,aAAa;AACb,YAAY,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC7C,YAAY,IAAI,CAAC,EAAE,GAAG,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,SAAS,CAAC,YAAY,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE;AAC1J,gBAAgB,MAAM,WAAW,GAAG;AACpC,oBAAoB,KAAK,EAAE;AAC3B,wBAAwB,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;AACvD,wBAAwB,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;AACzD,qBAAqB;AACrB,iBAAiB,CAAC;AAClB,gBAAgB,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE;AACjD,oBAAoB,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;AACjE,oBAAoB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC7C,iBAAiB;AACjB,qBAAqB;AACrB,oBAAoB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC9C,iBAAiB;AACjB,gBAAgB,MAAM,IAAI,GAAG,IAAI,CAAC;AAClC,gBAAgB,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE;AAC9F,oBAAoB,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;AAC1D;AACA,wBAAwB,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;AACxD,wBAAwB,YAAY,CAAC,IAAI,EAAE,CAAC;AAC5C,wBAAwB,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC5C,qBAAqB;AACrB,yBAAyB;AACzB,wBAAwB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAChD,wBAAwB,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAC9E,qBAAqB;AACrB,iBAAiB,EAAE,CAAC,GAAG,KAAK;AAC5B,oBAAoB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACxC,iBAAiB,CAAC,CAAC;AACnB,aAAa;AACb,SAAS;AACT,aAAa;AACb,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAClE,SAAS;AACT,KAAK;AACL,IAAI,UAAU,CAAC,MAAM,EAAE;AACvB,QAAQ,IAAI,MAAM,EAAE;AACpB,YAAY,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;AAC9C,YAAY,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AACxC,gBAAgB,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7B,aAAa;AACb,SAAS;AACT,KAAK;AACL,IAAI,MAAM,IAAI,GAAG;AACjB,QAAQ,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACvD,QAAQ,IAAI,KAAK,EAAE;AACnB,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC;AAC1B,YAAY,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC7C,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC;AAC3B,SAAS;AACT,KAAK;AACL,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE;AAC3B,QAAQ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAChD,YAAY,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC3D,YAAY,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AAC5C,gBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;AAC7D,gBAAgB,OAAO;AACvB,aAAa;AACb;AACA,YAAY,IAAI,kBAAkB,CAAC;AACnC,YAAY,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE;AACxE,gBAAgB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAChE,gBAAgB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACxD,gBAAgB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;AAChD,gBAAgB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;AAClD;AACA,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACxC,oBAAoB,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC3D,oBAAoB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,iBAAiB;AACjB,gBAAgB,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AACpF,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,MAAM,MAAM,EAAE;AAC3D,oBAAoB,kBAAkB,GAAG,MAAM;AAC/C,yBAAyB,SAAS,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC;AACjF,yBAAyB,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;AAChE,iBAAiB;AACjB,qBAAqB;AACrB,oBAAoB,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;AAC7G,iBAAiB;AACjB,aAAa;AACb,YAAY,OAAO,CAAC;AACpB,gBAAgB,KAAK,EAAE,kBAAkB;AACzC,aAAa,CAAC,CAAC;AACf,SAAS,CAAC,CAAC;AACX,KAAK;AACL,IAAI,MAAM,aAAa,CAAC,QAAQ,EAAE;AAClC,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACtC,KAAK;AACL,IAAI,MAAM,sBAAsB,GAAG;AACnC,QAAQ,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;AACvF,KAAK;AACL,IAAI,MAAM,gBAAgB,GAAG;AAC7B,QAAQ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;AACjF,KAAK;AACL,IAAI,MAAM,YAAY,CAAC,QAAQ,EAAE;AACjC,QAAQ,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,QAAQ,CAAC,CAAC;AACxF,KAAK;AACL,IAAI,MAAM,IAAI,GAAG;AACjB,QAAQ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AACrE,KAAK;AACL,IAAI,MAAM,UAAU,CAAC,QAAQ,EAAE;AAC/B,QAAQ,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACvD,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAC9C,YAAY,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/E,SAAS;AACT,KAAK;AACL;;;;;;;;;"}
package/dist/plugin.js ADDED
@@ -0,0 +1,168 @@
1
+ var capacitorApp = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ const CameraPreview = core.registerPlugin('CameraPreview', {
5
+ web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.CameraPreviewWeb()),
6
+ });
7
+
8
+ class CameraPreviewWeb extends core.WebPlugin {
9
+ constructor() {
10
+ super({
11
+ name: 'CameraPreview',
12
+ platforms: ['web'],
13
+ });
14
+ }
15
+ async start(options) {
16
+ var _a;
17
+ await navigator.mediaDevices
18
+ .getUserMedia({
19
+ audio: !options.disableAudio,
20
+ video: true,
21
+ })
22
+ .then((stream) => {
23
+ // Stop any existing stream so we can request media with different constraints based on user input
24
+ stream.getTracks().forEach((track) => track.stop());
25
+ })
26
+ .catch((error) => {
27
+ Promise.reject(error);
28
+ });
29
+ const video = document.getElementById('video');
30
+ const parent = document.getElementById(options.parent);
31
+ if (!video) {
32
+ const videoElement = document.createElement('video');
33
+ videoElement.id = 'video';
34
+ videoElement.setAttribute('class', options.className || '');
35
+ // Don't flip video feed if camera is rear facing
36
+ if (options.position !== 'rear') {
37
+ videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
38
+ }
39
+ const userAgent = navigator.userAgent.toLowerCase();
40
+ const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
41
+ // Safari on iOS needs to have the autoplay, muted and playsinline attributes set for video.play() to be successful
42
+ // Without these attributes videoElement.play() will throw a NotAllowedError
43
+ // https://developer.apple.com/documentation/webkit/delivering_video_content_for_safari
44
+ if (isSafari) {
45
+ videoElement.setAttribute('autoplay', 'true');
46
+ videoElement.setAttribute('muted', 'true');
47
+ videoElement.setAttribute('playsinline', 'true');
48
+ }
49
+ parent.appendChild(videoElement);
50
+ if ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) {
51
+ const constraints = {
52
+ video: {
53
+ width: { ideal: options.width },
54
+ height: { ideal: options.height },
55
+ },
56
+ };
57
+ if (options.position === 'rear') {
58
+ constraints.video.facingMode = 'environment';
59
+ this.isBackCamera = true;
60
+ }
61
+ else {
62
+ this.isBackCamera = false;
63
+ }
64
+ const self = this;
65
+ await navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
66
+ if (document.getElementById('video')) {
67
+ //video.src = window.URL.createObjectURL(stream);
68
+ videoElement.srcObject = stream;
69
+ videoElement.play();
70
+ Promise.resolve({});
71
+ }
72
+ else {
73
+ self.stopStream(stream);
74
+ Promise.reject({ message: 'camera already stopped' });
75
+ }
76
+ }, (err) => {
77
+ Promise.reject(err);
78
+ });
79
+ }
80
+ }
81
+ else {
82
+ Promise.reject({ message: 'camera already started' });
83
+ }
84
+ }
85
+ stopStream(stream) {
86
+ if (stream) {
87
+ const tracks = stream.getTracks();
88
+ for (const track of tracks) {
89
+ track.stop();
90
+ }
91
+ }
92
+ }
93
+ async stop() {
94
+ const video = document.getElementById('video');
95
+ if (video) {
96
+ video.pause();
97
+ this.stopStream(video.srcObject);
98
+ video.remove();
99
+ }
100
+ }
101
+ async capture(options) {
102
+ return new Promise((resolve, reject) => {
103
+ const video = document.getElementById('video');
104
+ if (!video || !video.srcObject) {
105
+ reject({ message: 'camera is not running' });
106
+ return;
107
+ }
108
+ // video.width = video.offsetWidth;
109
+ let base64EncodedImage;
110
+ if (video && video.videoWidth > 0 && video.videoHeight > 0) {
111
+ const canvas = document.createElement('canvas');
112
+ const context = canvas.getContext('2d');
113
+ canvas.width = video.videoWidth;
114
+ canvas.height = video.videoHeight;
115
+ // flip horizontally back camera isn't used
116
+ if (!this.isBackCamera) {
117
+ context.translate(video.videoWidth, 0);
118
+ context.scale(-1, 1);
119
+ }
120
+ context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
121
+ if ((options.format || 'jpeg') === 'jpeg') {
122
+ base64EncodedImage = canvas
123
+ .toDataURL('image/jpeg', (options.quality || 85) / 100.0)
124
+ .replace('data:image/jpeg;base64,', '');
125
+ }
126
+ else {
127
+ base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
128
+ }
129
+ }
130
+ resolve({
131
+ value: base64EncodedImage,
132
+ });
133
+ });
134
+ }
135
+ async captureSample(_options) {
136
+ return this.capture(_options);
137
+ }
138
+ async getSupportedFlashModes() {
139
+ throw new Error('getSupportedFlashModes not supported under the web platform');
140
+ }
141
+ async getHorizontalFov() {
142
+ throw new Error('getHorizontalFov not supported under the web platform');
143
+ }
144
+ async setFlashMode(_options) {
145
+ throw new Error('setFlashMode not supported under the web platform' + _options);
146
+ }
147
+ async flip() {
148
+ throw new Error('flip not supported under the web platform');
149
+ }
150
+ async setOpacity(_options) {
151
+ const video = document.getElementById('video');
152
+ if (!!video && !!_options['opacity']) {
153
+ video.style.setProperty('opacity', _options['opacity'].toString());
154
+ }
155
+ }
156
+ }
157
+
158
+ var web = /*#__PURE__*/Object.freeze({
159
+ __proto__: null,
160
+ CameraPreviewWeb: CameraPreviewWeb
161
+ });
162
+
163
+ exports.CameraPreview = CameraPreview;
164
+
165
+ return exports;
166
+
167
+ })({}, capacitorExports);
168
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.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 = 'environment';\n this.isBackCamera = true;\n }\n else {\n this.isBackCamera = false;\n }\n const self = this;\n await navigator.mediaDevices.getUserMedia(constraints).then(function (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({ message: 'camera already stopped' });\n }\n }, (err) => {\n Promise.reject(err);\n });\n }\n }\n else {\n Promise.reject({ message: '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 }\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 || !video.srcObject) {\n reject({ message: '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.toDataURL('image/png').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 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}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}