diginext-utils 2.0.32 → 2.0.35

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 (304) hide show
  1. package/README.md +162 -162
  2. package/package.json +66 -66
  3. package/src/Checker.ts +29 -29
  4. package/src/EventDispatcher.ts +62 -62
  5. package/src/FileUpload.ts +66 -66
  6. package/src/Slug.ts +365 -365
  7. package/src/Timer.ts +7 -7
  8. package/src/Validation.ts +36 -36
  9. package/src/array.ts +285 -285
  10. package/src/color.ts +87 -87
  11. package/src/console/enableConsole.ts +8 -8
  12. package/src/console/index.ts +17 -17
  13. package/src/console/log.ts +39 -39
  14. package/src/device/browser.ts +29 -29
  15. package/src/device/camera.ts +207 -207
  16. package/src/device/index.ts +230 -230
  17. package/src/device/os.ts +29 -29
  18. package/src/file/createDir.ts +14 -14
  19. package/src/file/fileMove.ts +32 -32
  20. package/src/file/findFilesByExt.ts +46 -46
  21. package/src/file/index.ts +7 -7
  22. package/src/images/index.ts +3 -3
  23. package/src/images/loadImage.ts +16 -0
  24. package/src/images/resize.ts +35 -35
  25. package/src/images/upload.ts +24 -24
  26. package/src/index.ts +39 -39
  27. package/src/json.ts +29 -29
  28. package/src/math/diffDate.ts +10 -10
  29. package/src/math/index.ts +90 -90
  30. package/src/math/positiveNumber.ts +12 -12
  31. package/src/name/en.ts +27 -27
  32. package/src/name/index.ts +8 -8
  33. package/src/name/vi.ts +23 -23
  34. package/src/object.ts +72 -72
  35. package/src/permission/index.ts +6 -6
  36. package/src/permission/requestCamera.ts +43 -43
  37. package/src/permission/requestDeviceOrientationControl.ts +33 -33
  38. package/src/response/index.ts +45 -45
  39. package/src/string/formatNumber.ts +12 -12
  40. package/src/string/generatePassword.ts +18 -18
  41. package/src/string/generateUUID.ts +37 -37
  42. package/src/string/index.ts +180 -180
  43. package/src/string/makeDaySlug.ts +40 -40
  44. package/src/string/random.ts +24 -24
  45. package/src/string/trimNull.ts +16 -16
  46. package/src/string/url.ts +116 -116
  47. package/dist/Checker.d.ts +0 -8
  48. package/dist/Checker.js +0 -32
  49. package/dist/Checker.js.map +0 -1
  50. package/dist/EventDispatcher.d.ts +0 -13
  51. package/dist/EventDispatcher.js +0 -52
  52. package/dist/EventDispatcher.js.map +0 -1
  53. package/dist/FileUpload.d.ts +0 -12
  54. package/dist/FileUpload.js +0 -65
  55. package/dist/FileUpload.js.map +0 -1
  56. package/dist/Slug.d.ts +0 -9
  57. package/dist/Slug.js +0 -334
  58. package/dist/Slug.js.map +0 -1
  59. package/dist/Timer.d.ts +0 -4
  60. package/dist/Timer.js +0 -9
  61. package/dist/Timer.js.map +0 -1
  62. package/dist/Validation.d.ts +0 -5
  63. package/dist/Validation.js +0 -39
  64. package/dist/Validation.js.map +0 -1
  65. package/dist/array.d.ts +0 -113
  66. package/dist/array.js +0 -297
  67. package/dist/array.js.map +0 -1
  68. package/dist/color.d.ts +0 -23
  69. package/dist/color.js +0 -89
  70. package/dist/color.js.map +0 -1
  71. package/dist/console/enableConsole.d.ts +0 -2
  72. package/dist/console/enableConsole.js +0 -14
  73. package/dist/console/enableConsole.js.map +0 -1
  74. package/dist/console/index.d.ts +0 -11
  75. package/dist/console/index.js +0 -18
  76. package/dist/console/index.js.map +0 -1
  77. package/dist/console/log.d.ts +0 -15
  78. package/dist/console/log.js +0 -45
  79. package/dist/console/log.js.map +0 -1
  80. package/dist/device/browser.d.ts +0 -5
  81. package/dist/device/browser.js +0 -38
  82. package/dist/device/browser.js.map +0 -1
  83. package/dist/device/camera.d.ts +0 -7
  84. package/dist/device/camera.js +0 -172
  85. package/dist/device/camera.js.map +0 -1
  86. package/dist/device/index.d.ts +0 -5
  87. package/dist/device/index.js +0 -225
  88. package/dist/device/index.js.map +0 -1
  89. package/dist/device/os.d.ts +0 -11
  90. package/dist/device/os.js +0 -38
  91. package/dist/device/os.js.map +0 -1
  92. package/dist/file/createDir.d.ts +0 -5
  93. package/dist/file/createDir.js +0 -16
  94. package/dist/file/createDir.js.map +0 -1
  95. package/dist/file/fileMove.d.ts +0 -4
  96. package/dist/file/fileMove.js +0 -33
  97. package/dist/file/fileMove.js.map +0 -1
  98. package/dist/file/findFilesByExt.d.ts +0 -13
  99. package/dist/file/findFilesByExt.js +0 -50
  100. package/dist/file/findFilesByExt.js.map +0 -1
  101. package/dist/file/index.d.ts +0 -9
  102. package/dist/file/index.js +0 -11
  103. package/dist/file/index.js.map +0 -1
  104. package/dist/images/index.d.ts +0 -2
  105. package/dist/images/index.js +0 -9
  106. package/dist/images/index.js.map +0 -1
  107. package/dist/images/resize.d.ts +0 -2
  108. package/dist/images/resize.js +0 -38
  109. package/dist/images/resize.js.map +0 -1
  110. package/dist/images/upload.d.ts +0 -10
  111. package/dist/images/upload.js +0 -27
  112. package/dist/images/upload.js.map +0 -1
  113. package/dist/index.d.ts +0 -37
  114. package/dist/index.js +0 -63
  115. package/dist/index.js.map +0 -1
  116. package/dist/json.d.ts +0 -8
  117. package/dist/json.js +0 -32
  118. package/dist/json.js.map +0 -1
  119. package/dist/math/diffDate.d.ts +0 -5
  120. package/dist/math/diffDate.js +0 -14
  121. package/dist/math/diffDate.js.map +0 -1
  122. package/dist/math/index.d.ts +0 -30
  123. package/dist/math/index.js +0 -93
  124. package/dist/math/index.js.map +0 -1
  125. package/dist/math/positiveNumber.d.ts +0 -2
  126. package/dist/math/positiveNumber.js +0 -17
  127. package/dist/math/positiveNumber.js.map +0 -1
  128. package/dist/name/en.d.ts +0 -5
  129. package/dist/name/en.js +0 -26
  130. package/dist/name/en.js.map +0 -1
  131. package/dist/name/index.d.ts +0 -12
  132. package/dist/name/index.js +0 -13
  133. package/dist/name/index.js.map +0 -1
  134. package/dist/name/vi.d.ts +0 -5
  135. package/dist/name/vi.js +0 -28
  136. package/dist/name/vi.js.map +0 -1
  137. package/dist/object.d.ts +0 -59
  138. package/dist/object.js +0 -80
  139. package/dist/object.js.map +0 -1
  140. package/dist/permission/index.d.ts +0 -8
  141. package/dist/permission/index.js +0 -7
  142. package/dist/permission/index.js.map +0 -1
  143. package/dist/permission/requestCamera.d.ts +0 -5
  144. package/dist/permission/requestCamera.js +0 -43
  145. package/dist/permission/requestCamera.js.map +0 -1
  146. package/dist/permission/requestDeviceOrientationControl.d.ts +0 -2
  147. package/dist/permission/requestDeviceOrientationControl.js +0 -39
  148. package/dist/permission/requestDeviceOrientationControl.js.map +0 -1
  149. package/dist/response/index.d.ts +0 -49
  150. package/dist/response/index.js +0 -52
  151. package/dist/response/index.js.map +0 -1
  152. package/dist/string/formatNumber.d.ts +0 -6
  153. package/dist/string/formatNumber.js +0 -15
  154. package/dist/string/formatNumber.js.map +0 -1
  155. package/dist/string/generatePassword.d.ts +0 -9
  156. package/dist/string/generatePassword.js +0 -24
  157. package/dist/string/generatePassword.js.map +0 -1
  158. package/dist/string/generateUUID.d.ts +0 -2
  159. package/dist/string/generateUUID.js +0 -37
  160. package/dist/string/generateUUID.js.map +0 -1
  161. package/dist/string/index.d.ts +0 -65
  162. package/dist/string/index.js +0 -161
  163. package/dist/string/index.js.map +0 -1
  164. package/dist/string/makeDaySlug.d.ts +0 -31
  165. package/dist/string/makeDaySlug.js +0 -23
  166. package/dist/string/makeDaySlug.js.map +0 -1
  167. package/dist/string/random.d.ts +0 -14
  168. package/dist/string/random.js +0 -25
  169. package/dist/string/random.js.map +0 -1
  170. package/dist/string/trimNull.d.ts +0 -2
  171. package/dist/string/trimNull.js +0 -21
  172. package/dist/string/trimNull.js.map +0 -1
  173. package/dist/string/url.d.ts +0 -36
  174. package/dist/string/url.js +0 -108
  175. package/dist/string/url.js.map +0 -1
  176. package/esm/Checker.d.ts +0 -8
  177. package/esm/Checker.js +0 -28
  178. package/esm/Checker.js.map +0 -1
  179. package/esm/EventDispatcher.d.ts +0 -13
  180. package/esm/EventDispatcher.js +0 -49
  181. package/esm/EventDispatcher.js.map +0 -1
  182. package/esm/FileUpload.d.ts +0 -12
  183. package/esm/FileUpload.js +0 -62
  184. package/esm/FileUpload.js.map +0 -1
  185. package/esm/Slug.d.ts +0 -9
  186. package/esm/Slug.js +0 -330
  187. package/esm/Slug.js.map +0 -1
  188. package/esm/Timer.d.ts +0 -4
  189. package/esm/Timer.js +0 -7
  190. package/esm/Timer.js.map +0 -1
  191. package/esm/Validation.d.ts +0 -5
  192. package/esm/Validation.js +0 -37
  193. package/esm/Validation.js.map +0 -1
  194. package/esm/array.d.ts +0 -113
  195. package/esm/array.js +0 -275
  196. package/esm/array.js.map +0 -1
  197. package/esm/color.d.ts +0 -23
  198. package/esm/color.js +0 -80
  199. package/esm/color.js.map +0 -1
  200. package/esm/console/enableConsole.d.ts +0 -2
  201. package/esm/console/enableConsole.js +0 -7
  202. package/esm/console/enableConsole.js.map +0 -1
  203. package/esm/console/index.d.ts +0 -11
  204. package/esm/console/index.js +0 -13
  205. package/esm/console/index.js.map +0 -1
  206. package/esm/console/log.d.ts +0 -15
  207. package/esm/console/log.js +0 -33
  208. package/esm/console/log.js.map +0 -1
  209. package/esm/device/browser.d.ts +0 -5
  210. package/esm/device/browser.js +0 -30
  211. package/esm/device/browser.js.map +0 -1
  212. package/esm/device/camera.d.ts +0 -7
  213. package/esm/device/camera.js +0 -168
  214. package/esm/device/camera.js.map +0 -1
  215. package/esm/device/index.d.ts +0 -5
  216. package/esm/device/index.js +0 -217
  217. package/esm/device/index.js.map +0 -1
  218. package/esm/device/os.d.ts +0 -11
  219. package/esm/device/os.js +0 -28
  220. package/esm/device/os.js.map +0 -1
  221. package/esm/file/createDir.d.ts +0 -5
  222. package/esm/file/createDir.js +0 -13
  223. package/esm/file/createDir.js.map +0 -1
  224. package/esm/file/fileMove.d.ts +0 -4
  225. package/esm/file/fileMove.js +0 -29
  226. package/esm/file/fileMove.js.map +0 -1
  227. package/esm/file/findFilesByExt.d.ts +0 -13
  228. package/esm/file/findFilesByExt.js +0 -46
  229. package/esm/file/findFilesByExt.js.map +0 -1
  230. package/esm/file/index.d.ts +0 -9
  231. package/esm/file/index.js +0 -6
  232. package/esm/file/index.js.map +0 -1
  233. package/esm/images/index.d.ts +0 -2
  234. package/esm/images/index.js +0 -4
  235. package/esm/images/index.js.map +0 -1
  236. package/esm/images/resize.d.ts +0 -2
  237. package/esm/images/resize.js +0 -31
  238. package/esm/images/resize.js.map +0 -1
  239. package/esm/images/upload.d.ts +0 -10
  240. package/esm/images/upload.js +0 -20
  241. package/esm/images/upload.js.map +0 -1
  242. package/esm/index.d.ts +0 -37
  243. package/esm/index.js +0 -38
  244. package/esm/index.js.map +0 -1
  245. package/esm/json.d.ts +0 -8
  246. package/esm/json.js +0 -28
  247. package/esm/json.js.map +0 -1
  248. package/esm/math/diffDate.d.ts +0 -5
  249. package/esm/math/diffDate.js +0 -10
  250. package/esm/math/diffDate.js.map +0 -1
  251. package/esm/math/index.d.ts +0 -30
  252. package/esm/math/index.js +0 -78
  253. package/esm/math/index.js.map +0 -1
  254. package/esm/math/positiveNumber.d.ts +0 -2
  255. package/esm/math/positiveNumber.js +0 -13
  256. package/esm/math/positiveNumber.js.map +0 -1
  257. package/esm/name/en.d.ts +0 -5
  258. package/esm/name/en.js +0 -22
  259. package/esm/name/en.js.map +0 -1
  260. package/esm/name/index.d.ts +0 -12
  261. package/esm/name/index.js +0 -6
  262. package/esm/name/index.js.map +0 -1
  263. package/esm/name/vi.d.ts +0 -5
  264. package/esm/name/vi.js +0 -24
  265. package/esm/name/vi.js.map +0 -1
  266. package/esm/object.d.ts +0 -59
  267. package/esm/object.js +0 -70
  268. package/esm/object.js.map +0 -1
  269. package/esm/permission/index.d.ts +0 -8
  270. package/esm/permission/index.js +0 -5
  271. package/esm/permission/index.js.map +0 -1
  272. package/esm/permission/requestCamera.d.ts +0 -5
  273. package/esm/permission/requestCamera.js +0 -39
  274. package/esm/permission/requestCamera.js.map +0 -1
  275. package/esm/permission/requestDeviceOrientationControl.d.ts +0 -2
  276. package/esm/permission/requestDeviceOrientationControl.js +0 -35
  277. package/esm/permission/requestDeviceOrientationControl.js.map +0 -1
  278. package/esm/response/index.d.ts +0 -49
  279. package/esm/response/index.js +0 -46
  280. package/esm/response/index.js.map +0 -1
  281. package/esm/string/formatNumber.d.ts +0 -6
  282. package/esm/string/formatNumber.js +0 -11
  283. package/esm/string/formatNumber.js.map +0 -1
  284. package/esm/string/generatePassword.d.ts +0 -9
  285. package/esm/string/generatePassword.js +0 -20
  286. package/esm/string/generatePassword.js.map +0 -1
  287. package/esm/string/generateUUID.d.ts +0 -2
  288. package/esm/string/generateUUID.js +0 -33
  289. package/esm/string/generateUUID.js.map +0 -1
  290. package/esm/string/index.d.ts +0 -65
  291. package/esm/string/index.js +0 -150
  292. package/esm/string/index.js.map +0 -1
  293. package/esm/string/makeDaySlug.d.ts +0 -31
  294. package/esm/string/makeDaySlug.js +0 -16
  295. package/esm/string/makeDaySlug.js.map +0 -1
  296. package/esm/string/random.d.ts +0 -14
  297. package/esm/string/random.js +0 -20
  298. package/esm/string/random.js.map +0 -1
  299. package/esm/string/trimNull.d.ts +0 -2
  300. package/esm/string/trimNull.js +0 -14
  301. package/esm/string/trimNull.js.map +0 -1
  302. package/esm/string/url.d.ts +0 -36
  303. package/esm/string/url.js +0 -98
  304. package/esm/string/url.js.map +0 -1
@@ -1,207 +1,207 @@
1
- import { requestCamera } from "../permission/requestCamera";
2
-
3
- type GetWebcamParams = {
4
- container?: HTMLElement;
5
- facingMode: string;
6
- audio: boolean;
7
- };
8
-
9
- export function getWebcam(params: GetWebcamParams = { facingMode: "environment", audio: true }) {
10
- if (typeof window == "undefined") return;
11
-
12
- const { container, facingMode = "environment", audio = true } = params;
13
- const _container = container || document.body;
14
-
15
- return new Promise(async (resolve, reject) => {
16
- const video = document.createElement("video") as any;
17
- video.style.position = "absolute";
18
- video.style.top = "0";
19
- video.style.left = "0";
20
- video.style.width = "100%";
21
- video.style.height = "100%";
22
- _container.append(video);
23
-
24
- let inputCameras: any[] = [];
25
- let currentCamera: any;
26
-
27
- const requestedMediaConstraints: MediaStreamConstraints = {
28
- video: {
29
- facingMode: { exact: facingMode },
30
- },
31
- audio,
32
- };
33
-
34
- let stream: any;
35
- let isAllowed = false;
36
-
37
- console.log("[Camera.js] Requesting:", requestedMediaConstraints);
38
- const res = await requestCamera({ audio });
39
- if (!res) {
40
- setTimeout(function () {
41
- handleError({ name: "Error", message: "NotSupported" });
42
- }, 50);
43
- }
44
-
45
- // start requesting media permissions:
46
-
47
- // console.log("[Camera.js] Requesting:", requestedMediaConstraints);
48
-
49
- // if (navigator.mediaDevices.enumerateDevices === undefined) {
50
- // setTimeout(function () {
51
- // handleError({ name: "Error", message: "NotSupported" });
52
- // }, 50);
53
- // } else {
54
- navigator.mediaDevices.enumerateDevices().then(parseDevices).catch(handleError);
55
- // }
56
-
57
- function parseDevices(devices: MediaDeviceInfo[]) {
58
- inputCameras = [];
59
- let backCameras: any[] = [];
60
-
61
- devices.forEach(function (device) {
62
- if (device.kind == "videoinput" && typeof device.deviceId != "undefined" && device.deviceId != "") {
63
- inputCameras.push(device);
64
- }
65
- });
66
- // //alert (JSON.stringify (devices));
67
- console.log("[Camera.js] inputCameras:", inputCameras);
68
-
69
- if (inputCameras.length > 0) {
70
- let cams = "";
71
- let backCamera: any;
72
-
73
- inputCameras.map((cam, index) => {
74
- cams += `[${cam.deviceId}] ${cam.kind} | ${cam.label}\n`;
75
- // console.log(cam);
76
- let label = cam.label.toLowerCase();
77
- if (label.indexOf("back") > -1 || label.indexOf("facetime") > -1) {
78
- backCamera = cam;
79
- backCameras.push(backCamera);
80
- }
81
- });
82
-
83
- if (backCameras.length > 1) {
84
- backCamera = backCameras[backCameras.length - 1];
85
- }
86
-
87
- console.log(`[Camera.js] All input sources:`, cams);
88
- console.log(`[Camera.js] This device has ${backCameras.length} back camera${backCameras.length > 1 ? "s" : ""}.`);
89
- console.log("[Camera.js] backCameras:", JSON.stringify(backCameras));
90
-
91
- currentCamera = backCamera;
92
-
93
- // if (scope.onGotDevices) {
94
- // scope.onGotDevices(devices);
95
- // }
96
-
97
- // Lấy stream của camera sau
98
- // (Lấy cái cuối cùng trong danh sách trước, thường sẽ là camera chính trên Android)
99
- getStreamOfCameraId(backCamera.deviceId)
100
- .then(onStreamReceived)
101
- .catch((e) => {
102
- if (backCameras.length > 1) {
103
- // nếu thiết bị có nhiều hơn 1 camera sau -> thử lấy camera khác
104
- backCamera = backCameras[backCameras.length - 2];
105
- getStreamOfCameraId(backCamera.deviceId).then(onStreamReceived).catch(handleError);
106
- } else if (backCameras.length > 2) {
107
- // nếu thiết bị có nhiều hơn 2 camera sau -> thử lấy camera khác nữa
108
- backCamera = backCameras[backCameras.length - 3];
109
- getStreamOfCameraId(backCamera.deviceId).then(onStreamReceived).catch(handleError);
110
- } else {
111
- // nếu thiết bị đéo có camera sau...
112
- handleError(e);
113
- }
114
- });
115
- } else {
116
- navigator.mediaDevices.getUserMedia(requestedMediaConstraints).then(onStreamReceived).catch(handleError);
117
-
118
- // if (scope.onGotDevicesFailed) scope.onGotDevicesFailed();
119
- }
120
- }
121
-
122
- function onStreamReceived(stream: any): void {
123
- if (inputCameras.length == 0) {
124
- console.log("[Camera.js] Not found any back cameras, request again?");
125
- navigator.mediaDevices.enumerateDevices().then(parseDevices).catch(handleError);
126
- return;
127
- }
128
-
129
- isAllowed = true;
130
-
131
- playWebcamVideo(stream);
132
- }
133
-
134
- function playWebcamVideo(_stream: any) {
135
- stream = _stream;
136
-
137
- if ("srcObject" in video) {
138
- // //alert ('GOT STREAM VIDEO OBJECT');
139
- video.srcObject = _stream;
140
- } else {
141
- // //alert ('GOT STREAM VIDEO SOURCE URL');
142
- // Avoid using this in new browsers, as it is going away.
143
- video.src = window.URL.createObjectURL(_stream);
144
- }
145
-
146
- // required to tell iOS safari we don't want fullscreen
147
- video.setAttribute("playsinline", "true");
148
- video.setAttribute("muted", "true");
149
- video.setAttribute("autoplay", "true");
150
- video.muted = true;
151
- video.autoplay = true;
152
- video.style.objectFit = "cover";
153
- video.play();
154
-
155
- // auto play
156
- video.addEventListener("canplay", function (e: any) {
157
- // //alert ('CAN PLAY');
158
- });
159
-
160
- video.addEventListener("canplaythrough", function (e: any) {
161
- // //alert ('CAN PLAY THROUGH');
162
- });
163
-
164
- video.addEventListener("error", (e: any) => console.log("[Camera.js] <video> error:", e));
165
-
166
- video.addEventListener("stalled", function (e: any) {
167
- // //alert ('CANNOT GET METADATA');
168
- isAllowed = false;
169
- console.log("[Camera.js] <video> stalled:", e);
170
-
171
- reject();
172
- });
173
-
174
- video.addEventListener("loadedmetadata", function (e: any) {
175
- if (currentCamera.label.toLowerCase().indexOf("facetime") > -1) {
176
- video.style.transform = "scaleX(-1)";
177
- video.style.webkitTransform = "scaleX(-1)";
178
- }
179
-
180
- video.play();
181
-
182
- resolve(video);
183
- });
184
- }
185
-
186
- function getStreamOfCameraId(id: any) {
187
- const constraints = {
188
- video: { deviceId: { exact: id } },
189
- audio: false,
190
- };
191
-
192
- return new Promise((resolve, reject) => {
193
- navigator.mediaDevices.getUserMedia(constraints).then(resolve).catch(reject);
194
- });
195
- }
196
-
197
- function handleError(err: any) {
198
- console.error(err);
199
- const errMsg = "[Camera.js] " + err.name + ": " + err.message;
200
- console.error(errMsg);
201
-
202
- isAllowed = false;
203
-
204
- reject();
205
- }
206
- });
207
- }
1
+ import { requestCamera } from "../permission/requestCamera";
2
+
3
+ type GetWebcamParams = {
4
+ container?: HTMLElement;
5
+ facingMode: string;
6
+ audio: boolean;
7
+ };
8
+
9
+ export function getWebcam(params: GetWebcamParams = { facingMode: "environment", audio: true }) {
10
+ if (typeof window == "undefined") return;
11
+
12
+ const { container, facingMode = "environment", audio = true } = params;
13
+ const _container = container || document.body;
14
+
15
+ return new Promise(async (resolve, reject) => {
16
+ const video = document.createElement("video") as any;
17
+ video.style.position = "absolute";
18
+ video.style.top = "0";
19
+ video.style.left = "0";
20
+ video.style.width = "100%";
21
+ video.style.height = "100%";
22
+ _container.append(video);
23
+
24
+ let inputCameras: any[] = [];
25
+ let currentCamera: any;
26
+
27
+ const requestedMediaConstraints: MediaStreamConstraints = {
28
+ video: {
29
+ facingMode: { exact: facingMode },
30
+ },
31
+ audio,
32
+ };
33
+
34
+ let stream: any;
35
+ let isAllowed = false;
36
+
37
+ console.log("[Camera.js] Requesting:", requestedMediaConstraints);
38
+ const res = await requestCamera({ audio });
39
+ if (!res) {
40
+ setTimeout(function () {
41
+ handleError({ name: "Error", message: "NotSupported" });
42
+ }, 50);
43
+ }
44
+
45
+ // start requesting media permissions:
46
+
47
+ // console.log("[Camera.js] Requesting:", requestedMediaConstraints);
48
+
49
+ // if (navigator.mediaDevices.enumerateDevices === undefined) {
50
+ // setTimeout(function () {
51
+ // handleError({ name: "Error", message: "NotSupported" });
52
+ // }, 50);
53
+ // } else {
54
+ navigator.mediaDevices.enumerateDevices().then(parseDevices).catch(handleError);
55
+ // }
56
+
57
+ function parseDevices(devices: MediaDeviceInfo[]) {
58
+ inputCameras = [];
59
+ let backCameras: any[] = [];
60
+
61
+ devices.forEach(function (device) {
62
+ if (device.kind == "videoinput" && typeof device.deviceId != "undefined" && device.deviceId != "") {
63
+ inputCameras.push(device);
64
+ }
65
+ });
66
+ // //alert (JSON.stringify (devices));
67
+ console.log("[Camera.js] inputCameras:", inputCameras);
68
+
69
+ if (inputCameras.length > 0) {
70
+ let cams = "";
71
+ let backCamera: any;
72
+
73
+ inputCameras.map((cam, index) => {
74
+ cams += `[${cam.deviceId}] ${cam.kind} | ${cam.label}\n`;
75
+ // console.log(cam);
76
+ let label = cam.label.toLowerCase();
77
+ if (label.indexOf("back") > -1 || label.indexOf("facetime") > -1) {
78
+ backCamera = cam;
79
+ backCameras.push(backCamera);
80
+ }
81
+ });
82
+
83
+ if (backCameras.length > 1) {
84
+ backCamera = backCameras[backCameras.length - 1];
85
+ }
86
+
87
+ console.log(`[Camera.js] All input sources:`, cams);
88
+ console.log(`[Camera.js] This device has ${backCameras.length} back camera${backCameras.length > 1 ? "s" : ""}.`);
89
+ console.log("[Camera.js] backCameras:", JSON.stringify(backCameras));
90
+
91
+ currentCamera = backCamera;
92
+
93
+ // if (scope.onGotDevices) {
94
+ // scope.onGotDevices(devices);
95
+ // }
96
+
97
+ // Lấy stream của camera sau
98
+ // (Lấy cái cuối cùng trong danh sách trước, thường sẽ là camera chính trên Android)
99
+ getStreamOfCameraId(backCamera.deviceId)
100
+ .then(onStreamReceived)
101
+ .catch((e) => {
102
+ if (backCameras.length > 1) {
103
+ // nếu thiết bị có nhiều hơn 1 camera sau -> thử lấy camera khác
104
+ backCamera = backCameras[backCameras.length - 2];
105
+ getStreamOfCameraId(backCamera.deviceId).then(onStreamReceived).catch(handleError);
106
+ } else if (backCameras.length > 2) {
107
+ // nếu thiết bị có nhiều hơn 2 camera sau -> thử lấy camera khác nữa
108
+ backCamera = backCameras[backCameras.length - 3];
109
+ getStreamOfCameraId(backCamera.deviceId).then(onStreamReceived).catch(handleError);
110
+ } else {
111
+ // nếu thiết bị đéo có camera sau...
112
+ handleError(e);
113
+ }
114
+ });
115
+ } else {
116
+ navigator.mediaDevices.getUserMedia(requestedMediaConstraints).then(onStreamReceived).catch(handleError);
117
+
118
+ // if (scope.onGotDevicesFailed) scope.onGotDevicesFailed();
119
+ }
120
+ }
121
+
122
+ function onStreamReceived(stream: any): void {
123
+ if (inputCameras.length == 0) {
124
+ console.log("[Camera.js] Not found any back cameras, request again?");
125
+ navigator.mediaDevices.enumerateDevices().then(parseDevices).catch(handleError);
126
+ return;
127
+ }
128
+
129
+ isAllowed = true;
130
+
131
+ playWebcamVideo(stream);
132
+ }
133
+
134
+ function playWebcamVideo(_stream: any) {
135
+ stream = _stream;
136
+
137
+ if ("srcObject" in video) {
138
+ // //alert ('GOT STREAM VIDEO OBJECT');
139
+ video.srcObject = _stream;
140
+ } else {
141
+ // //alert ('GOT STREAM VIDEO SOURCE URL');
142
+ // Avoid using this in new browsers, as it is going away.
143
+ video.src = window.URL.createObjectURL(_stream);
144
+ }
145
+
146
+ // required to tell iOS safari we don't want fullscreen
147
+ video.setAttribute("playsinline", "true");
148
+ video.setAttribute("muted", "true");
149
+ video.setAttribute("autoplay", "true");
150
+ video.muted = true;
151
+ video.autoplay = true;
152
+ video.style.objectFit = "cover";
153
+ video.play();
154
+
155
+ // auto play
156
+ video.addEventListener("canplay", function (e: any) {
157
+ // //alert ('CAN PLAY');
158
+ });
159
+
160
+ video.addEventListener("canplaythrough", function (e: any) {
161
+ // //alert ('CAN PLAY THROUGH');
162
+ });
163
+
164
+ video.addEventListener("error", (e: any) => console.log("[Camera.js] <video> error:", e));
165
+
166
+ video.addEventListener("stalled", function (e: any) {
167
+ // //alert ('CANNOT GET METADATA');
168
+ isAllowed = false;
169
+ console.log("[Camera.js] <video> stalled:", e);
170
+
171
+ reject();
172
+ });
173
+
174
+ video.addEventListener("loadedmetadata", function (e: any) {
175
+ if (currentCamera.label.toLowerCase().indexOf("facetime") > -1) {
176
+ video.style.transform = "scaleX(-1)";
177
+ video.style.webkitTransform = "scaleX(-1)";
178
+ }
179
+
180
+ video.play();
181
+
182
+ resolve(video);
183
+ });
184
+ }
185
+
186
+ function getStreamOfCameraId(id: any) {
187
+ const constraints = {
188
+ video: { deviceId: { exact: id } },
189
+ audio: false,
190
+ };
191
+
192
+ return new Promise((resolve, reject) => {
193
+ navigator.mediaDevices.getUserMedia(constraints).then(resolve).catch(reject);
194
+ });
195
+ }
196
+
197
+ function handleError(err: any) {
198
+ console.error(err);
199
+ const errMsg = "[Camera.js] " + err.name + ": " + err.message;
200
+ console.error(errMsg);
201
+
202
+ isAllowed = false;
203
+
204
+ reject();
205
+ }
206
+ });
207
+ }