@authme/util 2.2.0-rc.0 → 2.2.0-rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [2.2.0-rc.6](https://github.com/AuthMe01/web-client-sdk/compare/v2.2.0-rc.5...v2.2.0-rc.6) (2022-12-05)
6
+
7
+ ## [2.2.0-rc.5](https://github.com/AuthMe01/web-client-sdk/compare/v2.2.0-rc.4...v2.2.0-rc.5) (2022-12-03)
8
+
9
+ ## [2.2.0-rc.4](https://github.com/AuthMe01/web-client-sdk/compare/v2.2.0-rc.3...v2.2.0-rc.4) (2022-12-01)
10
+
11
+ ## [2.2.0-rc.3](https://github.com/AuthMe01/web-client-sdk/compare/v2.2.0-rc.2...v2.2.0-rc.3) (2022-11-30)
12
+
13
+ ### Bug Fixes
14
+
15
+ - camera resolution constraints problem ([fa364c9](https://github.com/AuthMe01/web-client-sdk/commit/fa364c9c542bbcf154abe5a0d8d8531d25cab46a))
16
+ - camera sorting priority ([e6dec04](https://github.com/AuthMe01/web-client-sdk/commit/e6dec04b7980af7dd5ed31523bf63c97d3eb27f8))
17
+
18
+ ## [2.2.0-rc.2](https://github.com/AuthMe01/web-client-sdk/compare/v2.2.0-rc.1...v2.2.0-rc.2) (2022-11-28)
19
+
20
+ ## [2.2.0-rc.1](https://github.com/AuthMe01/web-client-sdk/compare/v2.2.0-rc.0...v2.2.0-rc.1) (2022-11-18)
21
+
22
+ ### Features
23
+
24
+ - auto detect camera & fix SAMSUNG camera issue ([15c7153](https://github.com/AuthMe01/web-client-sdk/commit/15c7153ff539289aff445210e952f0cf2671f671))
25
+
5
26
  ## [2.2.0-rc.0](https://github.com/AuthMe01/web-client-sdk/compare/v2.1.1...v2.2.0-rc.0) (2022-11-11)
6
27
 
7
28
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@authme/util",
3
- "version": "2.2.0-rc.0",
3
+ "version": "2.2.0-rc.6",
4
4
  "peerDependencies": {
5
5
  "three": "^0.136.0",
6
6
  "tslib": "^2.3.0"
@@ -27,4 +27,4 @@ export declare const videoConstraintsFactory: (isPC: boolean, facingMode: 'user'
27
27
  facingMode: "user" | "environment";
28
28
  };
29
29
  };
30
- export declare const requestCamera: (video: HTMLVideoElement, constraints: MediaStreamConstraints, facingMode: 'front' | 'back') => Promise<boolean>;
30
+ export declare const requestCamera: (video: HTMLVideoElement, facingMode: 'front' | 'back') => Promise<boolean>;
package/src/ui/camera.js CHANGED
@@ -20,53 +20,80 @@ const videoConstraintsFactory = (isPC, facingMode) => {
20
20
  };
21
21
  };
22
22
  exports.videoConstraintsFactory = videoConstraintsFactory;
23
- const requestCamera = (video, constraints, facingMode) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
23
+ const requestCamera = (video, facingMode) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
24
+ var _a, _b, _c;
24
25
  if (!('mediaDevices' in navigator)) {
25
26
  throw 'NOT_SUPPORT';
26
27
  }
27
- const backCamera = [];
28
- const frontCamera = [];
29
28
  let isSamsung = false;
30
- const devices = yield navigator.mediaDevices.enumerateDevices();
31
- console.log('videoDevice:', devices);
32
- if (navigator.userAgent.match(/SAMSUNG|Samsung|SGH-[I|N|T]|GT-[I|N]|SM-[A|N|P|T|Z]|SHV-E|SCH-[I|J|R|S]|SPH-L/i)) {
29
+ if (navigator.userAgent.match(/SAMSUNG|Samsung|SGH-[I|N|T]|GT-[I|N]|SM-[A|G|N|P|T|Z|S]|SHV-E|SCH-[I|J|R|S]|SPH-L/i)) {
33
30
  isSamsung = true;
34
31
  }
35
- devices
36
- .filter((device) => device.kind === 'videoinput')
37
- .map((videoDevice) => {
38
- const backCameraKeywords = 'rear|back|rück|arrière|trasera|trás|traseira|posteriore|后|後|背|задней|الخلفية|후|arka|achterzijde|หลัง|baksidan|bagside|sau|bak|tylny|takakamera|belakang|אחורית|πίσω|spate|hátsó|zadní|darrere|zadná|задня|stražnja|belakang|बैक';
39
- const regex = new RegExp(backCameraKeywords, 'i');
40
- if (regex.test(videoDevice.label)) {
41
- if (isSamsung) {
42
- const samsungCamera = 'camera2 2';
43
- if (videoDevice.label.includes(samsungCamera)) {
44
- backCamera.push(videoDevice.deviceId);
45
- }
46
- }
47
- else {
48
- backCamera.push(videoDevice.deviceId);
49
- }
32
+ // 必須先請求攝影機權限,才能透過 enumerateDevices 取得攝影機 Label 資訊
33
+ const media = yield navigator.mediaDevices.getUserMedia({
34
+ video: true,
35
+ });
36
+ media.getTracks().forEach(function (track) {
37
+ track.stop(); // 取得後會啟用攝影機,所以要關閉
38
+ });
39
+ // 輪詢取得攝影機 解析度等資訊
40
+ const videoDevices = (yield navigator.mediaDevices.enumerateDevices()).filter((device) => device.kind === 'videoinput');
41
+ const deviceMetaPairs = [];
42
+ for (const device of videoDevices) {
43
+ const stream = yield navigator.mediaDevices.getUserMedia({
44
+ video: {
45
+ deviceId: {
46
+ exact: device.deviceId,
47
+ },
48
+ },
49
+ });
50
+ const track = stream.getVideoTracks()[0];
51
+ const capabilities = track.getCapabilities();
52
+ const widthMax = (_a = capabilities === null || capabilities === void 0 ? void 0 : capabilities.width) === null || _a === void 0 ? void 0 : _a.max;
53
+ const heightMax = (_b = capabilities === null || capabilities === void 0 ? void 0 : capabilities.height) === null || _b === void 0 ? void 0 : _b.max;
54
+ const resolution = widthMax && heightMax ? widthMax * heightMax : 0;
55
+ const meta = { resolution };
56
+ track.stop();
57
+ deviceMetaPairs.push({ device, meta });
58
+ }
59
+ // 依序透過 Label, 解析度, 前後鏡頭等條件排序
60
+ const backCameraKeywords = 'rear|back|rück|arrière|trasera|trás|traseira|posteriore|后|後|背|задней|الخلفية|후|arka|achterzijde|หลัง|baksidan|bagside|sau|bak|tylny|takakamera|belakang|אחורית|πίσω|spate|hátsó|zadní|darrere|zadná|задня|stražnja|belakang|बैक';
61
+ const regex = new RegExp(backCameraKeywords, 'i');
62
+ const deviceId = (_c = deviceMetaPairs.sort((a, b) => {
63
+ // 若是 Samsung 手機且模式為後鏡頭,則優先使用Label為 camera2 0 的鏡頭
64
+ let samsungCondition = 0;
65
+ if (isSamsung && facingMode === 'back') {
66
+ const samsungCamera = 'camera2 0';
67
+ const bScore = b.device.label.includes(samsungCamera) ? 1 : 0; // 特定鏡頭優先
68
+ const aScore = a.device.label.includes(samsungCamera) ? 1 : 0;
69
+ samsungCondition = bScore - aScore;
50
70
  }
51
- else {
52
- frontCamera.push(videoDevice.deviceId);
71
+ let cameraFacingCondition = 0;
72
+ {
73
+ const aFacingMode = regex.test(a.device.label) ? 'back' : 'front';
74
+ const bFacingMode = regex.test(b.device.label) ? 'back' : 'front';
75
+ const bScore = bFacingMode === facingMode ? 1 : 0; // 鏡頭符合 faceMode 優先。
76
+ const aScore = aFacingMode === facingMode ? 1 : 0;
77
+ cameraFacingCondition = bScore - aScore;
53
78
  }
54
- });
55
- console.log('backCamera:', backCamera);
56
- const deviceId = facingMode === 'front'
57
- ? frontCamera.length > 0
58
- ? frontCamera[0]
59
- : ''
60
- : backCamera.length > 0
61
- ? isSamsung
62
- ? backCamera.pop()
63
- : backCamera[0]
64
- : '';
65
- console.log('deviceId:', deviceId);
66
- if (deviceId) {
67
- constraints['deviceId'] = { exact: deviceId };
79
+ const resolutionCondition = b.meta.resolution - a.meta.resolution;
80
+ return samsungCondition || cameraFacingCondition || resolutionCondition;
81
+ })) === null || _c === void 0 ? void 0 : _c[0].device.deviceId;
82
+ if (!deviceId) {
83
+ throw 'NO_CAMERA';
68
84
  }
69
- constraints['focusMode'] = 'auto';
85
+ const constraints = {
86
+ video: {
87
+ // 推測依然需要使用 width & height 的限制條件,
88
+ // 否則即使是高解析度相機,也有可能拿到低解析度的圖片。(待驗證)
89
+ width: { min: 1280, ideal: 1920, max: 1920 },
90
+ height: { min: 720, ideal: 1080, max: 1080 },
91
+ focusMode: 'auto',
92
+ deviceId: {
93
+ exact: deviceId,
94
+ },
95
+ },
96
+ };
70
97
  const stream = yield navigator.mediaDevices.getUserMedia(constraints);
71
98
  video.srcObject = stream;
72
99
  yield video.play();
@@ -1 +1 @@
1
- {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../../../../libs/shared/util/src/ui/camera.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../../../../libs/shared/util/src/ui/camera.ts"],"names":[],"mappings":"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"}