diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index a978311..72af59e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,15 @@ +## v7.6.3 + +### Improvements + +- Improved automatic lightweight build detection for mobile devices + - Now uses Device Memory API to detect low-memory devices (< 4GB) + - Applies to all mobile devices (phones and tablets) with available memory information + - Falls back to `undefined` when memory information is unavailable, allowing manual configuration + - Previously used a simple user agent check for all mobile devices +- Updated the camera picking logic +- Improved error handling on the `Camera` class + ## 7.6.2 ### Bugfixes diff --git a/packages/blinkid-core/CHANGELOG.md b/packages/blinkid-core/CHANGELOG.md index 310d96d..f3716d4 100644 --- a/packages/blinkid-core/CHANGELOG.md +++ b/packages/blinkid-core/CHANGELOG.md @@ -1,12 +1,25 @@ # @microblink/blinkid-core +## 7.6.3 + +### Patch Changes + +- Improved automatic lightweight build detection for mobile devices + - Now uses Device Memory API to detect low-memory devices (< 4GB) + - Applies to all mobile devices (phones and tablets) with available memory information + - Falls back to `undefined` when memory information is unavailable, allowing manual configuration + - Previously used a simple user agent check for all mobile devices +- Updated dependencies + - @microblink/blinkid-worker@7.6.3 + - @microblink/blinkid-wasm@7.6.3 + ## 7.6.2 ### Patch Changes - Fixes `microblinkProxyUrl` handling - - Prevent an extra ping to the Microblink server when a proxy URL is configured (previously one redundant request was sent). - - Preserve the user-provided path when using a proxy URL (previously the path was removed). + - Prevent an extra ping to the Microblink server when a proxy URL is configured (previously one redundant request was sent). + - Preserve the user-provided path when using a proxy URL (previously the path was removed). - Updated dependencies - @microblink/blinkid-wasm@7.6.2 - @microblink/blinkid-worker@7.6.2 diff --git a/packages/blinkid-core/docs/type-aliases/HardwareCameraInfoData.md b/packages/blinkid-core/docs/type-aliases/HardwareCameraInfoData.md index 367aa5d..8d08e72 100644 --- a/packages/blinkid-core/docs/type-aliases/HardwareCameraInfoData.md +++ b/packages/blinkid-core/docs/type-aliases/HardwareCameraInfoData.md @@ -24,6 +24,10 @@ Represents the data for the `ping.hardware.camera.info` event. > **cameraFacing**: `"Front"` \| `"Back"` \| `"Unknown"` +#### deviceId + +> **deviceId**: `string` + #### focus? > `optional` **focus**: `"Auto"` \| `"Fixed"` diff --git a/packages/blinkid-core/docs/type-aliases/PingHardwareCameraInfo.md b/packages/blinkid-core/docs/type-aliases/PingHardwareCameraInfo.md index 9719368..d884679 100644 --- a/packages/blinkid-core/docs/type-aliases/PingHardwareCameraInfo.md +++ b/packages/blinkid-core/docs/type-aliases/PingHardwareCameraInfo.md @@ -6,6 +6,6 @@ # Type Alias: PingHardwareCameraInfo -> **PingHardwareCameraInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`HardwareCameraInfoData`](HardwareCameraInfoData.md), `"ping.hardware.camera.info"`, `"1.0.1"`, `0`\> +> **PingHardwareCameraInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`HardwareCameraInfoData`](HardwareCameraInfoData.md), `"ping.hardware.camera.info"`, `"1.0.3"`, `0`\> Represents the `ping.hardware.camera.info` event. diff --git a/packages/blinkid-core/docs/type-aliases/PingSdkCameraInputInfo.md b/packages/blinkid-core/docs/type-aliases/PingSdkCameraInputInfo.md index 0416b16..353680f 100644 --- a/packages/blinkid-core/docs/type-aliases/PingSdkCameraInputInfo.md +++ b/packages/blinkid-core/docs/type-aliases/PingSdkCameraInputInfo.md @@ -6,6 +6,6 @@ # Type Alias: PingSdkCameraInputInfo -> **PingSdkCameraInputInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`SdkCameraInputInfoData`](SdkCameraInputInfoData.md), `"ping.sdk.camera.input.info"`, `"1.0.1"`\> +> **PingSdkCameraInputInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`SdkCameraInputInfoData`](SdkCameraInputInfoData.md), `"ping.sdk.camera.input.info"`, `"1.0.2"`\> Represents the `ping.sdk.camera.input.info` event. diff --git a/packages/blinkid-core/docs/type-aliases/SdkCameraInputInfoData.md b/packages/blinkid-core/docs/type-aliases/SdkCameraInputInfoData.md index 16ec019..183b435 100644 --- a/packages/blinkid-core/docs/type-aliases/SdkCameraInputInfoData.md +++ b/packages/blinkid-core/docs/type-aliases/SdkCameraInputInfoData.md @@ -30,6 +30,12 @@ Represents the data for the `ping.sdk.camera.input.info` event. *** +### deviceId + +> **deviceId**: `string` + +*** + ### roiHeight > **roiHeight**: `number` diff --git a/packages/blinkid-core/package.json b/packages/blinkid-core/package.json index 48873c6..9faa2d2 100644 --- a/packages/blinkid-core/package.json +++ b/packages/blinkid-core/package.json @@ -1,7 +1,7 @@ { "name": "@microblink/blinkid-core", "description": "BlinkID Core SDK", - "version": "7.6.2", + "version": "7.6.3", "author": "Microblink", "scripts": { "build": "concurrently pnpm:build:js pnpm:build:types", diff --git a/packages/blinkid-core/src/BlinkIdCore.ts b/packages/blinkid-core/src/BlinkIdCore.ts index 983ff9a..bcfc3aa 100644 --- a/packages/blinkid-core/src/BlinkIdCore.ts +++ b/packages/blinkid-core/src/BlinkIdCore.ts @@ -12,6 +12,7 @@ import { createProxyWorker } from "./createProxyWorker"; import { getUserId } from "./getUserId"; import { proxy, Remote } from "comlink"; import { defaultSessionSettings } from "./defaultSessionSettings"; +import { shouldUseLightweightBuild } from "./shouldUseLightweightBuild"; /** * Configuration options for initializing the BlinkID core. @@ -56,11 +57,7 @@ export async function loadBlinkIdCore( } if (settings.useLightweightBuild === undefined) { - // use only on desktop devices - settings.useLightweightBuild = - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent, - ); + settings.useLightweightBuild = await shouldUseLightweightBuild(); } const proxyProgressCallback = progressCallback diff --git a/packages/blinkid-core/src/shouldUseLightweightBuild.test.ts b/packages/blinkid-core/src/shouldUseLightweightBuild.test.ts new file mode 100644 index 0000000..e5c797b --- /dev/null +++ b/packages/blinkid-core/src/shouldUseLightweightBuild.test.ts @@ -0,0 +1,209 @@ +/** + * Copyright (c) 2025 Microblink Ltd. All rights reserved. + */ + +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { shouldUseLightweightBuild } from "./shouldUseLightweightBuild"; +import * as deviceInfoModule from "./deviceInfo/deviceInfo"; +import type { DeviceInfo } from "./deviceInfo/deviceInfo"; + +// Mock the getDeviceInfo function +vi.mock("./deviceInfo/deviceInfo", () => ({ + getDeviceInfo: vi.fn(), +})); + +describe("shouldUseLightweightBuild", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should return true for mobile device with less than 4GB memory", async () => { + const mockDeviceInfo: Partial = { + memory: 2.0, + derivedDeviceInfo: { + formFactors: ["Mobile"], + model: "Test Phone", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(true); + }); + + it("should return false for mobile device with 4GB or more memory", async () => { + const mockDeviceInfo: Partial = { + memory: 4.0, + derivedDeviceInfo: { + formFactors: ["Mobile"], + model: "Test Phone", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(false); + }); + + it("should return true for mobile device with 2GB memory", async () => { + const mockDeviceInfo: Partial = { + memory: 2, + derivedDeviceInfo: { + formFactors: ["Mobile"], + model: "Test Phone", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(true); + }); + + it("should return true for tablet device with less than 4GB memory", async () => { + const mockDeviceInfo: Partial = { + memory: 2.0, + derivedDeviceInfo: { + formFactors: ["Tablet"], + model: "Test Tablet", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(true); + }); + + it("should return undefined for mobile device without memory info", async () => { + const mockDeviceInfo: Partial = { + memory: undefined, + derivedDeviceInfo: { + formFactors: ["Mobile"], + model: "Test Phone", + platform: "iOS", + browser: { brand: "Safari", version: "17.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBeUndefined(); + }); + + it("should return undefined for desktop device with memory info", async () => { + const mockDeviceInfo: Partial = { + memory: 8.0, + derivedDeviceInfo: { + formFactors: ["Desktop"], + model: "Mac", + platform: "macOS", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBeUndefined(); + }); + + it("should return undefined for desktop device without memory info", async () => { + const mockDeviceInfo: Partial = { + memory: undefined, + derivedDeviceInfo: { + formFactors: ["Desktop"], + model: "Mac", + platform: "macOS", + browser: { brand: "Safari", version: "17.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBeUndefined(); + }); + + it("should handle device with multiple form factors including Mobile", async () => { + const mockDeviceInfo: Partial = { + memory: 2.0, + derivedDeviceInfo: { + formFactors: ["Mobile", "Tablet"], + model: "Test Device", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(true); + }); + + it("should return true for very low memory mobile device (1GB)", async () => { + const mockDeviceInfo: Partial = { + memory: 1, + derivedDeviceInfo: { + formFactors: ["Mobile"], + model: "Budget Phone", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(true); + }); + + it("should return false for high-end mobile device (8GB)", async () => { + const mockDeviceInfo: Partial = { + memory: 8.0, + derivedDeviceInfo: { + formFactors: ["Mobile"], + model: "Flagship Phone", + platform: "Android", + browser: { brand: "Chrome", version: "120.0" }, + }, + }; + + vi.mocked(deviceInfoModule.getDeviceInfo).mockResolvedValue( + mockDeviceInfo as DeviceInfo, + ); + + const result = await shouldUseLightweightBuild(); + expect(result).toBe(false); + }); +}); diff --git a/packages/blinkid-core/src/shouldUseLightweightBuild.ts b/packages/blinkid-core/src/shouldUseLightweightBuild.ts new file mode 100644 index 0000000..69d89b5 --- /dev/null +++ b/packages/blinkid-core/src/shouldUseLightweightBuild.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2025 Microblink Ltd. All rights reserved. + */ + +import { getDeviceInfo } from "./deviceInfo/deviceInfo"; + +/** + * Determines whether to use the lightweight build based on device capabilities. + * + * This function checks if the device is mobile (Mobile or Tablet form factor) and + * has less than 4GB of memory. The lightweight build is only used for low-budget + * mobile devices where memory information is available. For iOS device this will always + * return undefined, since we don't have memory information. + * + * @returns `true` if lightweight build should be used, `false` if full build should be used, + * or `undefined` if the decision cannot be made (e.g., memory info unavailable) + */ +export async function shouldUseLightweightBuild(): Promise< + boolean | undefined +> { + const deviceInfo = await getDeviceInfo(); + + const isMobile = deviceInfo.derivedDeviceInfo.formFactors.some( + (formFactor) => formFactor === "Mobile" || formFactor === "Tablet", + ); + if (isMobile && deviceInfo.memory !== undefined) { + return deviceInfo.memory < 4; + } + + // If not mobile or memory info unavailable, return undefined + return undefined; +} diff --git a/packages/blinkid-ux-manager/CHANGELOG.md b/packages/blinkid-ux-manager/CHANGELOG.md index 80f704a..67eee09 100644 --- a/packages/blinkid-ux-manager/CHANGELOG.md +++ b/packages/blinkid-ux-manager/CHANGELOG.md @@ -1,5 +1,13 @@ # @microblink/blinkid-ux-manager +## 7.6.3 + +### Patch Changes + +- Updated dependencies + - @microblink/camera-manager@7.2.7 + - @microblink/blinkid-core@7.6.3 + ## 7.6.2 ### Patch Changes diff --git a/packages/blinkid-ux-manager/package.json b/packages/blinkid-ux-manager/package.json index 8eb668c..d5a27da 100644 --- a/packages/blinkid-ux-manager/package.json +++ b/packages/blinkid-ux-manager/package.json @@ -1,7 +1,7 @@ { "name": "@microblink/blinkid-ux-manager", "description": "BlinkID UX Manager provides user feedback based on the blinkid process results.", - "version": "7.6.2", + "version": "7.6.3", "author": "Microblink", "scripts": { "build": "concurrently pnpm:build:js pnpm:build:types", diff --git a/packages/blinkid-ux-manager/src/core/ping-camera-utils.ts b/packages/blinkid-ux-manager/src/core/ping-camera-utils.ts index e97cf88..c6aa08d 100644 --- a/packages/blinkid-ux-manager/src/core/ping-camera-utils.ts +++ b/packages/blinkid-ux-manager/src/core/ping-camera-utils.ts @@ -30,6 +30,7 @@ export const createCameraInputInfo = ({ : videoResolution.height; return new PingSdkCameraInputInfoImpl({ + deviceId: selectedCamera.name, cameraFacing: mapCameraFacingToPingFacing(selectedCamera.facingMode), cameraFrameWidth: videoResolution.width, cameraFrameHeight: videoResolution.height, @@ -56,6 +57,7 @@ export const mapCameraFacingToPingFacing = ( export const convertCameraToPingCamera = (camera: Camera): PingCamera => { return { + deviceId: camera.name, cameraFacing: mapCameraFacingToPingFacing(camera.facingMode), /** we can't know this */ availableResolutions: undefined, diff --git a/packages/blinkid-ux-manager/src/shared/ping-implementations.ts b/packages/blinkid-ux-manager/src/shared/ping-implementations.ts index a2bd9a0..959c87e 100644 --- a/packages/blinkid-ux-manager/src/shared/ping-implementations.ts +++ b/packages/blinkid-ux-manager/src/shared/ping-implementations.ts @@ -60,7 +60,7 @@ export class PingHardwareCameraInfoImpl implements PingHardwareCameraInfo { readonly data: HardwareCameraInfoData; readonly schemaName = "ping.hardware.camera.info"; - readonly schemaVersion = "1.0.1"; + readonly schemaVersion = "1.0.3"; readonly sessionNumber = 0; } @@ -81,7 +81,7 @@ export class PingSdkCameraInputInfoImpl implements PingSdkCameraInputInfo { readonly data: SdkCameraInputInfoData; readonly schemaName = "ping.sdk.camera.input.info"; - readonly schemaVersion = "1.0.1"; + readonly schemaVersion = "1.0.2"; } export class PingSdkCameraPermissionImpl implements PingSdkCameraPermission { diff --git a/packages/blinkid-wasm/CHANGELOG.md b/packages/blinkid-wasm/CHANGELOG.md index 18a47fd..1032c78 100644 --- a/packages/blinkid-wasm/CHANGELOG.md +++ b/packages/blinkid-wasm/CHANGELOG.md @@ -1,5 +1,11 @@ # @microblink/blinkid-wasm +## 7.6.3 + +### Patch Changes + +- Update version + ## 7.6.2 ### Patch Changes diff --git a/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.js b/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.js index a669957..03c4fda 100644 --- a/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.js +++ b/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.js @@ -1,16 +1,16 @@ async function createModule(moduleArg={}){var moduleRtn;var h=moduleArg,ba="object"==typeof window,ca="undefined"!=typeof WorkerGlobalScope,n=ca&&self.name?.startsWith("em-pthread");let da;(da=h).expectedDataFileDownloads??(da.expectedDataFileDownloads=0);h.expectedDataFileDownloads++; (()=>{var a="undefined"!=typeof ENVIRONMENT_IS_WASM_WORKER&&ENVIRONMENT_IS_WASM_WORKER;"undefined"!=typeof n&&n||a||function(b){function c(m,r,p){let w;(w=h).dataFileDownloads??(w.dataFileDownloads={});fetch(m).catch(v=>Promise.reject(Error(`Network Error: ${m}`,{cause:v}))).then(v=>{if(!v.ok)return Promise.reject(Error(`${v.status}: ${v.url}`));if(!v.body&&v.arrayBuffer)return v.arrayBuffer().then(p);const t=v.body.getReader(),y=()=>t.read().then(L).catch(u=>Promise.reject(Error(`Unexpected error while handling : ${v.url} ${u}`, {cause:u}))),A=[],J=Number(v.headers.get("Content-Length")??r);let F=0;const L=({done:u,value:H})=>{if(u){var G=new Uint8Array(A.map(aa=>aa.length).reduce((aa,qa)=>aa+qa,0));u=0;for(var C of A)G.set(C,u),u+=C.length;p(G.buffer)}else{A.push(H);F+=H.length;h.dataFileDownloads[m]={loaded:F,total:J};u=C=0;for(G of Object.values(h.dataFileDownloads))C+=G.loaded,u+=G.total;h.setStatus?.(`Downloading data... (${C}/${u})`);return y()}};h.setStatus?.("Downloading data...");return y()})}function d(m){console.error("package error:", -m)}function e(m){function r(t,y,A){this.start=t;this.end=y;this.audio=A}function p(t){if(!t)throw"Loading data file failed."+Error().stack;if(t.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;t=new Uint8Array(t);r.prototype.wc=t;t=b.files;for(var y=0;y{k?(k(m),k=null):l=m},d);if(h.calledRun)e(h);else{let m;((m=h).preRun??(m.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop",start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop", -start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop",start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop", -start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8326c5065a6d8451d6d004db73babf4a4a9f502c68643a14934cc098d04bf44f.strop",start:5147659,end:5535353},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop",start:5535353,end:6562208},{filename:"/microblink/blinkid/Model_93607315418f2c5d3abec06d0b2a81e69abeb1b8d0506ed6373d7d74bd5e4b05.strop", -start:6562208,end:7807199},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:7807199,end:8103001},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop",start:8103001,end:8109497},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:8109497,end:9532942},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop", -start:9532942,end:9608344},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:9608344,end:10271397},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop",start:10271397,end:10287070},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop",start:10287070,end:10359768},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:10359768, -end:10380237},{filename:"/microblink/blinkid/serialized_embedder_db_1.9.bin",start:10380237,end:13393962}],remote_package_size:13393962})})();h.onAbort=function(a){q("Aborted with message: "+a);try{throw new WebAssembly.RuntimeError(a);}catch(b){q("Stacktrace: "+b.stack)}};h="undefined"!==typeof h?h:{}; -(function(){var a="",b=!1;try{if("undefined"!==typeof self&&self.location&&self.location.href){var c=self.location.href;0===c.indexOf("blob:")&&(a=c,b=!0)}}catch(d){}b&&!h.locateFile&&(h.locateFile=function(d,e){return"BlinkIdModule.wasm"===d?a:e+d})})();var ea="./this.program",fa=import.meta.url,ha="",ia,ja; +m)}function e(m){function r(t,y,A){this.start=t;this.end=y;this.audio=A}function p(t){if(!t)throw"Loading data file failed."+Error().stack;if(t.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;t=new Uint8Array(t);r.prototype.wc=t;t=b.files;for(var y=0;y{k?(k(m),k=null):l=m},d);if(h.calledRun)e(h);else{let m;((m=h).preRun??(m.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", +start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", +start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8326c5065a6d8451d6d004db73babf4a4a9f502c68643a14934cc098d04bf44f.strop", +start:5147659,end:5535353},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop",start:5535353,end:6562208},{filename:"/microblink/blinkid/Model_93607315418f2c5d3abec06d0b2a81e69abeb1b8d0506ed6373d7d74bd5e4b05.strop",start:6562208,end:7807199},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:7807199,end:8103001},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop", +start:8103001,end:8109497},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:8109497,end:9532942},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop",start:9532942,end:9608344},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:9608344,end:10271397},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop", +start:10271397,end:10287070},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop",start:10287070,end:10359768},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:10359768,end:10380237},{filename:"/microblink/blinkid/serialized_embedder_db_1.9.bin",start:10380237,end:13393962}],remote_package_size:13393962})})();h.onAbort=function(a){q("Aborted with message: "+a);try{throw new WebAssembly.RuntimeError(a);}catch(b){q("Stacktrace: "+b.stack)}}; +h="undefined"!==typeof h?h:{};(function(){var a="",b=!1;try{if("undefined"!==typeof self&&self.location&&self.location.href){var c=self.location.href;0===c.indexOf("blob:")&&(a=c,b=!0)}}catch(d){}b&&!h.locateFile&&(h.locateFile=function(d,e){return"BlinkIdModule.wasm"===d?a:e+d})})();var ea="./this.program",fa=import.meta.url,ha="",ia,ja; if(ba||ca){try{ha=(new URL(".",fa)).href}catch{}ca&&(ja=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});ia=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);}}var ka=console.log.bind(console),q=console.error.bind(console),la,ma,na=!1,oa;function x(){pa.buffer!=z.buffer&&ra()}var sa,ta,ua,va; if(n){var wa=!1;self.onunhandledrejection=b=>{throw b.reason||b;};function a(b){try{var c=b.data,d=c.nb;if("load"===d){let e=[];self.onmessage=f=>e.push(f);va=()=>{postMessage({nb:"loaded"});for(let f of e)a(f);self.onmessage=a};for(const f of c.Hc)if(!h[f]||h[f].proxy)h[f]=(...g)=>{postMessage({nb:"callHandler",Gc:f,tc:g})},"print"==f&&(ka=h[f]),"printErr"==f&&(q=h[f]);pa=c.gd;ra();ua(c.hd)}else if("run"===d){xa(c.jb);ya(c.jb,0,0,1,0,0);za();Aa(c.jb);wa||(Ba(),wa=!0);try{Ca(c.cd,c.Tb)}catch(e){if("unwind"!= e)throw e;}}else"setimmediate"!==c.target&&("checkMailbox"===d?wa&&Da():d&&(q(`worker: received unknown command ${d}`),q(c)))}catch(e){throw Ea(),e;}}self.onmessage=a}var pa,z,B,D,Fa,E,I,Ga,Ha,K,Ia,Ja=!1;function ra(){var a=pa.buffer;z=new Int8Array(a);D=new Int16Array(a);B=new Uint8Array(a);Fa=new Uint16Array(a);E=new Int32Array(a);I=new Uint32Array(a);Ga=new Float32Array(a);Ha=new Float64Array(a);K=new BigInt64Array(a);Ia=new BigUint64Array(a)} @@ -137,7 +137,7 @@ Object.assign(Re.prototype,{Cc(a){this.pc&&(a=this.pc(a));return a},jc(a){this.k e?b.call(this):this.Kb?Qe(d.Ra.ub,{Ua:d,Sa:e,eb:this,Za:a}):Qe(d.Ra.ub,{Ua:d,Sa:e})}});Gf=new If;n||(Ta("library_fetch_init"),Jf(a=>{Kf=a;Ua("library_fetch_init")},()=>{Kf=!1;Ua("library_fetch_init")}));n||(pa=h.wasmMemory?h.wasmMemory:new WebAssembly.Memory({initial:(h.INITIAL_MEMORY||209715200)/65536,maximum:32768,shared:!0}),ra());h.noExitRuntime&&(Hc=h.noExitRuntime);h.preloadPlugins&&(yd=h.preloadPlugins);h.print&&(ka=h.print);h.printErr&&(q=h.printErr);h.wasmBinary&&(la=h.wasmBinary); h.thisProgram&&(ea=h.thisProgram);h.addRunDependency=Ta;h.removeRunDependency=Ua;h.FS_createPreloadedFile=(a,b,c,d,e,f,g,k,l,m)=>{function r(v){function t(y){m?.();k||fe(a,b,y,d,e,l);f?.();Ua(w)}zd(v,p,t,()=>{g?.();Ua(w)})||t(v)}var p=b?cd(Zc(a+"/"+b)):a,w=`cp ${p}`;Ta(w);"string"==typeof c?xd(c).then(r,g):r(c)};h.FS_unlink=(...a)=>Yd(...a);h.FS_createPath=(...a)=>de(...a);h.FS_createDevice=(...a)=>Ma(...a);h.FS_createDataFile=(...a)=>fe(...a);h.FS_createLazyFile=(...a)=>he(...a); var tf=[rc,Ic,Vc,db,eb,fb,gb,hb,ib,jb,function(a,b,c,d,e,f,g){if(n)return N(10,1,a,b,c,d,e,f,g);e=-9007199254740992>e||9007199254740992>2]=l.qb;(x(),I)[g>>2]=m;return 0}catch(r){if("undefined"==typeof S||"ErrnoError"!==r.name)throw r;return-r.Wa}},function(a,b,c,d,e,f){if(n)return N(11, -1,a,b,c,d,e,f);f=-9007199254740992>f||9007199254740992{a=T(a);b=T(b);c=T(c);d=T(d);throw Error(a+b+c+d);},336002:(a,b)=>{a=T(a);b=T(b);throw Error(a+b);}}; +1,a,b,c,d,e,f);f=-9007199254740992>f||9007199254740992{a=T(a);b=T(b);c=T(c);d=T(d);throw Error(a+b+c+d);},336018:(a,b)=>{a=T(a);b=T(b);throw Error(a+b);}}; function Xb(){var a=h.allowedThreads;return a?a:navigator.hardwareConcurrency}function qc(){var a=self.navigator.userAgent,b=hd(a)+1,c=ff(b);Y(a,c,b);return c}function pc(){var a=stackTrace(),b=hd(a)+1,c=ff(b);Y(a,c,b);return c}var Ue,Ba,Ve,ff,Oc,rd,ya,Ea,Fc,Mc,Uc,Df,qf,Qc,Gc,Ec,Dc;h.__ZN2MB2NN28LinearDefragmentingAllocator10Allocation4nullE=93824; var ab,Pa=await (async function(){function a(c,d){Pa=c.exports;Jc.push(Pa.za);Sc=Pa.Ba;ma=d;c=Pa;Ue=c.ua;Ba=c.va;Ve=c.wa;ff=c.xa;Oc=c.ya;rd=c.Aa;ya=c.Ca;Ea=c.Da;Fc=c.Ea;Mc=c.Fa;Uc=c.Ga;Df=c.Ha;qf=c.Ia;Qc=c.Ja;Gc=c.Ka;Ec=c.La;Dc=c.Ma;Ua("wasm-instantiate");return Pa}Ta("wasm-instantiate");var b=$a();if(h.instantiateWasm)return new Promise(c=>{h.instantiateWasm(b,(d,e)=>{c(a(d,e))})});if(n)return new Promise(c=>{ua=d=>{var e=new WebAssembly.Instance(d,$a());c(a(e,d))}});Wa??=h.locateFile? h.locateFile?h.locateFile("BlinkIdModule.wasm",ha):ha+"BlinkIdModule.wasm":(new URL("BlinkIdModule.wasm",import.meta.url)).href;return function(c){return a(c.instance,c.module)}(await Za(b))}()); diff --git a/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.wasm b/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.wasm index 96990c4..86eeca6 100755 Binary files a/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.wasm and b/packages/blinkid-wasm/dist/full/advanced-threads/BlinkIdModule.wasm differ diff --git a/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.js b/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.js index 7a8757f..2913717 100644 --- a/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.js +++ b/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.js @@ -1,11 +1,11 @@ async function createModule(moduleArg={}){var moduleRtn;var m=moduleArg,aa="object"==typeof window,ba="undefined"!=typeof WorkerGlobalScope;let ca;(ca=m).expectedDataFileDownloads??(ca.expectedDataFileDownloads=0);m.expectedDataFileDownloads++; (()=>{var a="undefined"!=typeof ENVIRONMENT_IS_WASM_WORKER&&ENVIRONMENT_IS_WASM_WORKER;"undefined"!=typeof ENVIRONMENT_IS_PTHREAD&&ENVIRONMENT_IS_PTHREAD||a||function(b){function c(k,u,n){let q;(q=m).dataFileDownloads??(q.dataFileDownloads={});fetch(k).catch(v=>Promise.reject(Error(`Network Error: ${k}`,{cause:v}))).then(v=>{if(!v.ok)return Promise.reject(Error(`${v.status}: ${v.url}`));if(!v.body&&v.arrayBuffer)return v.arrayBuffer().then(n);const p=v.body.getReader(),x=()=>p.read().then(K).catch(t=> Promise.reject(Error(`Unexpected error while handling : ${v.url} ${t}`,{cause:t}))),z=[],I=Number(v.headers.get("Content-Length")??u);let E=0;const K=({done:t,value:G})=>{if(t){var F=new Uint8Array(z.map(T=>T.length).reduce((T,ka)=>T+ka,0));t=0;for(var C of z)F.set(C,t),t+=C.length;n(F.buffer)}else{z.push(G);E+=G.length;m.dataFileDownloads[k]={loaded:E,total:I};t=C=0;for(F of Object.values(m.dataFileDownloads))C+=F.loaded,t+=F.total;m.setStatus?.(`Downloading data... (${C}/${t})`);return x()}};m.setStatus?.("Downloading data..."); -return x()})}function d(k){console.error("package error:",k)}function e(k){function u(p,x,z){this.start=p;this.end=x;this.audio=z}function n(p){if(!p)throw"Loading data file failed."+Error().stack;if(p.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;p=new Uint8Array(p);u.prototype.Ub=p;p=b.files;for(var x=0;x{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop",start:0, -end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", +q[v].filename);k.addRunDependency("datafile_/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.data");k.preloadResults??(k.preloadResults={});k.preloadResults["/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.data"]={Gc:!1};l?(n(l),l=null):h=n}"object"===typeof window?window.encodeURIComponent(window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+ +"/"):"undefined"===typeof process&&"undefined"!==typeof location&&encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/");var f=m.locateFile?m.locateFile("BlinkIdModule.data",""):"BlinkIdModule.data",g=b.remote_package_size,h=null,l=m.getPreloadedPackage?m.getPreloadedPackage(f,g):null;l||c(f,g,k=>{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", +start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8326c5065a6d8451d6d004db73babf4a4a9f502c68643a14934cc098d04bf44f.strop", start:5147659,end:5535353},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop",start:5535353,end:6562208},{filename:"/microblink/blinkid/Model_93607315418f2c5d3abec06d0b2a81e69abeb1b8d0506ed6373d7d74bd5e4b05.strop",start:6562208,end:7807199},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:7807199,end:8103001},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop", start:8103001,end:8109497},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:8109497,end:9532942},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop",start:9532942,end:9608344},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:9608344,end:10271397},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop", diff --git a/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.wasm b/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.wasm index 5a35437..9a497a8 100755 Binary files a/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.wasm and b/packages/blinkid-wasm/dist/full/advanced/BlinkIdModule.wasm differ diff --git a/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.js b/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.js index a6b10f5..221b849 100644 --- a/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.js +++ b/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.js @@ -1,16 +1,16 @@ async function createModule(moduleArg={}){var moduleRtn;var m=moduleArg,aa="object"==typeof window,ba="undefined"!=typeof WorkerGlobalScope;let ca;(ca=m).expectedDataFileDownloads??(ca.expectedDataFileDownloads=0);m.expectedDataFileDownloads++; (()=>{var a="undefined"!=typeof ENVIRONMENT_IS_WASM_WORKER&&ENVIRONMENT_IS_WASM_WORKER;"undefined"!=typeof ENVIRONMENT_IS_PTHREAD&&ENVIRONMENT_IS_PTHREAD||a||function(b){function c(k,u,n){let q;(q=m).dataFileDownloads??(q.dataFileDownloads={});fetch(k).catch(v=>Promise.reject(Error(`Network Error: ${k}`,{cause:v}))).then(v=>{if(!v.ok)return Promise.reject(Error(`${v.status}: ${v.url}`));if(!v.body&&v.arrayBuffer)return v.arrayBuffer().then(n);const p=v.body.getReader(),x=()=>p.read().then(K).catch(r=> Promise.reject(Error(`Unexpected error while handling : ${v.url} ${r}`,{cause:r}))),z=[],I=Number(v.headers.get("Content-Length")??u);let E=0;const K=({done:r,value:G})=>{if(r){var F=new Uint8Array(z.map(T=>T.length).reduce((T,ka)=>T+ka,0));r=0;for(var C of z)F.set(C,r),r+=C.length;n(F.buffer)}else{z.push(G);E+=G.length;m.dataFileDownloads[k]={loaded:E,total:I};r=C=0;for(F of Object.values(m.dataFileDownloads))C+=F.loaded,r+=F.total;m.setStatus?.(`Downloading data... (${C}/${r})`);return x()}};m.setStatus?.("Downloading data..."); -return x()})}function d(k){console.error("package error:",k)}function e(k){function u(p,x,z){this.start=p;this.end=x;this.audio=z}function n(p){if(!p)throw"Loading data file failed."+Error().stack;if(p.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;p=new Uint8Array(p);u.prototype.Tb=p;p=b.files;for(var x=0;x{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop",start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop", -start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop",start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop", -start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8326c5065a6d8451d6d004db73babf4a4a9f502c68643a14934cc098d04bf44f.strop",start:5147659,end:5535353},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop", -start:5535353,end:6562208},{filename:"/microblink/blinkid/Model_93607315418f2c5d3abec06d0b2a81e69abeb1b8d0506ed6373d7d74bd5e4b05.strop",start:6562208,end:7807199},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:7807199,end:8103001},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop",start:8103001,end:8109497},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop", -start:8109497,end:9532942},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop",start:9532942,end:9608344},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:9608344,end:10271397},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop",start:10271397,end:10287070},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop", -start:10287070,end:10359768},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:10359768,end:10380237},{filename:"/microblink/blinkid/serialized_embedder_db_1.9.bin",start:10380237,end:13393962}],remote_package_size:13393962})})();m.onAbort=function(a){t("Aborted with message: "+a);try{throw new WebAssembly.RuntimeError(a);}catch(b){t("Stacktrace: "+b.stack)}};m="undefined"!==typeof m?m:{}; -(function(){var a="",b=!1;try{if("undefined"!==typeof self&&self.location&&self.location.href){var c=self.location.href;0===c.indexOf("blob:")&&(a=c,b=!0)}}catch(d){}b&&!m.locateFile&&(m.locateFile=function(d,e){return"BlinkIdModule.wasm"===d?a:e+d})})();var da="./this.program",ea=import.meta.url,fa="",ha,ia; +q[v].filename);k.addRunDependency("datafile_/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.data");k.preloadResults??(k.preloadResults={});k.preloadResults["/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.data"]={Fc:!1};l?(n(l),l=null):h=n}"object"===typeof window?window.encodeURIComponent(window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+ +"/"):"undefined"===typeof process&&"undefined"!==typeof location&&encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/");var f=m.locateFile?m.locateFile("BlinkIdModule.data",""):"BlinkIdModule.data",g=b.remote_package_size,h=null,l=m.getPreloadedPackage?m.getPreloadedPackage(f,g):null;l||c(f,g,k=>{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", +start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", +start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8326c5065a6d8451d6d004db73babf4a4a9f502c68643a14934cc098d04bf44f.strop", +start:5147659,end:5535353},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop",start:5535353,end:6562208},{filename:"/microblink/blinkid/Model_93607315418f2c5d3abec06d0b2a81e69abeb1b8d0506ed6373d7d74bd5e4b05.strop",start:6562208,end:7807199},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:7807199,end:8103001},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop", +start:8103001,end:8109497},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:8109497,end:9532942},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop",start:9532942,end:9608344},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:9608344,end:10271397},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop", +start:10271397,end:10287070},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop",start:10287070,end:10359768},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:10359768,end:10380237},{filename:"/microblink/blinkid/serialized_embedder_db_1.9.bin",start:10380237,end:13393962}],remote_package_size:13393962})})();m.onAbort=function(a){t("Aborted with message: "+a);try{throw new WebAssembly.RuntimeError(a);}catch(b){t("Stacktrace: "+b.stack)}}; +m="undefined"!==typeof m?m:{};(function(){var a="",b=!1;try{if("undefined"!==typeof self&&self.location&&self.location.href){var c=self.location.href;0===c.indexOf("blob:")&&(a=c,b=!0)}}catch(d){}b&&!m.locateFile&&(m.locateFile=function(d,e){return"BlinkIdModule.wasm"===d?a:e+d})})();var da="./this.program",ea=import.meta.url,fa="",ha,ia; if(aa||ba){try{fa=(new URL(".",ea)).href}catch{}ba&&(ia=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});ha=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);}}var ja=console.log.bind(console),t=console.error.bind(console),la,ma=!1,na,oa,pa,qa,w,y,A,ra,B,D,sa,ta,H,ua,va=!1; function wa(){var a=qa.buffer;w=new Int8Array(a);A=new Int16Array(a);y=new Uint8Array(a);ra=new Uint16Array(a);B=new Int32Array(a);D=new Uint32Array(a);sa=new Float32Array(a);ta=new Float64Array(a);H=new BigInt64Array(a);ua=new BigUint64Array(a)}var xa=0,ya=null;function za(){xa++;m.monitorRunDependencies?.(xa)}function Aa(){xa--;m.monitorRunDependencies?.(xa);if(0==xa&&ya){var a=ya;ya=null;a()}} function Ba(a){m.onAbort?.(a);a="Aborted("+a+")";t(a);ma=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");pa?.(a);throw a;}var Ca;async function Da(a){if(!la)try{var b=await ha(a);return new Uint8Array(b)}catch{}if(a==Ca&&la)a=new Uint8Array(la);else if(ia)a=ia(a);else throw"both async and sync fetching of the wasm failed";return a} diff --git a/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.wasm b/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.wasm index 027d463..d5508dc 100755 Binary files a/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.wasm and b/packages/blinkid-wasm/dist/full/basic/BlinkIdModule.wasm differ diff --git a/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.js b/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.js index ce9b7c7..61c1187 100644 --- a/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.js +++ b/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.js @@ -1,15 +1,16 @@ async function createModule(moduleArg={}){var moduleRtn;var h=moduleArg,ba="object"==typeof window,ca="undefined"!=typeof WorkerGlobalScope,n=ca&&self.name?.startsWith("em-pthread");let da;(da=h).expectedDataFileDownloads??(da.expectedDataFileDownloads=0);h.expectedDataFileDownloads++; (()=>{var a="undefined"!=typeof ENVIRONMENT_IS_WASM_WORKER&&ENVIRONMENT_IS_WASM_WORKER;"undefined"!=typeof n&&n||a||function(b){function c(m,r,p){let w;(w=h).dataFileDownloads??(w.dataFileDownloads={});fetch(m).catch(v=>Promise.reject(Error(`Network Error: ${m}`,{cause:v}))).then(v=>{if(!v.ok)return Promise.reject(Error(`${v.status}: ${v.url}`));if(!v.body&&v.arrayBuffer)return v.arrayBuffer().then(p);const t=v.body.getReader(),y=()=>t.read().then(L).catch(u=>Promise.reject(Error(`Unexpected error while handling : ${v.url} ${u}`, {cause:u}))),A=[],J=Number(v.headers.get("Content-Length")??r);let F=0;const L=({done:u,value:H})=>{if(u){var G=new Uint8Array(A.map(aa=>aa.length).reduce((aa,qa)=>aa+qa,0));u=0;for(var C of A)G.set(C,u),u+=C.length;p(G.buffer)}else{A.push(H);F+=H.length;h.dataFileDownloads[m]={loaded:F,total:J};u=C=0;for(G of Object.values(h.dataFileDownloads))C+=G.loaded,u+=G.total;h.setStatus?.(`Downloading data... (${C}/${u})`);return y()}};h.setStatus?.("Downloading data...");return y()})}function d(m){console.error("package error:", -m)}function e(m){function r(t,y,A){this.start=t;this.end=y;this.audio=A}function p(t){if(!t)throw"Loading data file failed."+Error().stack;if(t.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;t=new Uint8Array(t);r.prototype.wc=t;t=b.files;for(var y=0;y{k?(k(m),k=null):l=m},d);if(h.calledRun)e(h);else{let m;((m=h).preRun??(m.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop",start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198, -end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop",start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop", -start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop",start:5147659,end:6174514},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop", -start:6174514,end:6470316},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop",start:6470316,end:6476812},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:6476812,end:7900257},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop",start:7900257,end:7975659},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop", -start:7975659,end:8638712},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop",start:8638712,end:8654385},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop",start:8654385,end:8727083},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:8727083,end:8747552},{filename:"/microblink/blinkid/serialized_embedder_db_1.9.bin",start:8747552,end:11761277}],remote_package_size:11761277})})(); -h.onAbort=function(a){q("Aborted with message: "+a);try{throw new WebAssembly.RuntimeError(a);}catch(b){q("Stacktrace: "+b.stack)}};h="undefined"!==typeof h?h:{};(function(){var a="",b=!1;try{if("undefined"!==typeof self&&self.location&&self.location.href){var c=self.location.href;0===c.indexOf("blob:")&&(a=c,b=!0)}}catch(d){}b&&!h.locateFile&&(h.locateFile=function(d,e){return"BlinkIdModule.wasm"===d?a:e+d})})();var ea="./this.program",fa=import.meta.url,ha="",ia,ja; +m)}function e(m){function r(t,y,A){this.start=t;this.end=y;this.audio=A}function p(t){if(!t)throw"Loading data file failed."+Error().stack;if(t.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;t=new Uint8Array(t);r.prototype.wc=t;t=b.files;for(var y=0;y{k?(k(m),k=null):l=m},d);if(h.calledRun)e(h);else{let m;((m=h).preRun??(m.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", +start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", +start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop", +start:5147659,end:6174514},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:6174514,end:6470316},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop",start:6470316,end:6476812},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:6476812,end:7900257},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop", +start:7900257,end:7975659},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:7975659,end:8638712},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop",start:8638712,end:8654385},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop",start:8654385,end:8727083},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:8727083, +end:8747552},{filename:"/microblink/blinkid/serialized_embedder_db_1.9.bin",start:8747552,end:11761277}],remote_package_size:11761277})})();h.onAbort=function(a){q("Aborted with message: "+a);try{throw new WebAssembly.RuntimeError(a);}catch(b){q("Stacktrace: "+b.stack)}};h="undefined"!==typeof h?h:{}; +(function(){var a="",b=!1;try{if("undefined"!==typeof self&&self.location&&self.location.href){var c=self.location.href;0===c.indexOf("blob:")&&(a=c,b=!0)}}catch(d){}b&&!h.locateFile&&(h.locateFile=function(d,e){return"BlinkIdModule.wasm"===d?a:e+d})})();var ea="./this.program",fa=import.meta.url,ha="",ia,ja; if(ba||ca){try{ha=(new URL(".",fa)).href}catch{}ca&&(ja=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});ia=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);}}var ka=console.log.bind(console),q=console.error.bind(console),la,ma,na=!1,oa;function x(){pa.buffer!=z.buffer&&ra()}var sa,ta,ua,va; if(n){var wa=!1;self.onunhandledrejection=b=>{throw b.reason||b;};function a(b){try{var c=b.data,d=c.nb;if("load"===d){let e=[];self.onmessage=f=>e.push(f);va=()=>{postMessage({nb:"loaded"});for(let f of e)a(f);self.onmessage=a};for(const f of c.Hc)if(!h[f]||h[f].proxy)h[f]=(...g)=>{postMessage({nb:"callHandler",Gc:f,tc:g})},"print"==f&&(ka=h[f]),"printErr"==f&&(q=h[f]);pa=c.gd;ra();ua(c.hd)}else if("run"===d){xa(c.jb);ya(c.jb,0,0,1,0,0);za();Aa(c.jb);wa||(Ba(),wa=!0);try{Ca(c.cd,c.Tb)}catch(e){if("unwind"!= e)throw e;}}else"setimmediate"!==c.target&&("checkMailbox"===d?wa&&Da():d&&(q(`worker: received unknown command ${d}`),q(c)))}catch(e){throw Ea(),e;}}self.onmessage=a}var pa,z,B,D,Fa,E,I,Ga,Ha,K,Ia,Ja=!1;function ra(){var a=pa.buffer;z=new Int8Array(a);D=new Int16Array(a);B=new Uint8Array(a);Fa=new Uint16Array(a);E=new Int32Array(a);I=new Uint32Array(a);Ga=new Float32Array(a);Ha=new Float64Array(a);K=new BigInt64Array(a);Ia=new BigUint64Array(a)} @@ -136,7 +137,7 @@ Object.assign(Re.prototype,{Cc(a){this.pc&&(a=this.pc(a));return a},jc(a){this.k e?b.call(this):this.Kb?Qe(d.Ra.ub,{Ua:d,Sa:e,eb:this,Za:a}):Qe(d.Ra.ub,{Ua:d,Sa:e})}});Gf=new If;n||(Ta("library_fetch_init"),Jf(a=>{Kf=a;Ua("library_fetch_init")},()=>{Kf=!1;Ua("library_fetch_init")}));n||(pa=h.wasmMemory?h.wasmMemory:new WebAssembly.Memory({initial:(h.INITIAL_MEMORY||209715200)/65536,maximum:32768,shared:!0}),ra());h.noExitRuntime&&(Hc=h.noExitRuntime);h.preloadPlugins&&(yd=h.preloadPlugins);h.print&&(ka=h.print);h.printErr&&(q=h.printErr);h.wasmBinary&&(la=h.wasmBinary); h.thisProgram&&(ea=h.thisProgram);h.addRunDependency=Ta;h.removeRunDependency=Ua;h.FS_createPreloadedFile=(a,b,c,d,e,f,g,k,l,m)=>{function r(v){function t(y){m?.();k||fe(a,b,y,d,e,l);f?.();Ua(w)}zd(v,p,t,()=>{g?.();Ua(w)})||t(v)}var p=b?cd(Zc(a+"/"+b)):a,w=`cp ${p}`;Ta(w);"string"==typeof c?xd(c).then(r,g):r(c)};h.FS_unlink=(...a)=>Yd(...a);h.FS_createPath=(...a)=>de(...a);h.FS_createDevice=(...a)=>Ma(...a);h.FS_createDataFile=(...a)=>fe(...a);h.FS_createLazyFile=(...a)=>he(...a); var tf=[rc,Ic,Vc,db,eb,fb,gb,hb,ib,jb,function(a,b,c,d,e,f,g){if(n)return N(10,1,a,b,c,d,e,f,g);e=-9007199254740992>e||9007199254740992>2]=l.qb;(x(),I)[g>>2]=m;return 0}catch(r){if("undefined"==typeof S||"ErrnoError"!==r.name)throw r;return-r.Wa}},function(a,b,c,d,e,f){if(n)return N(11, -1,a,b,c,d,e,f);f=-9007199254740992>f||9007199254740992{a=T(a);b=T(b);c=T(c);d=T(d);throw Error(a+b+c+d);},343042:(a,b)=>{a=T(a);b=T(b);throw Error(a+b);}}; +1,a,b,c,d,e,f);f=-9007199254740992>f||9007199254740992{a=T(a);b=T(b);c=T(c);d=T(d);throw Error(a+b+c+d);},343058:(a,b)=>{a=T(a);b=T(b);throw Error(a+b);}}; function Xb(){var a=h.allowedThreads;return a?a:navigator.hardwareConcurrency}function qc(){var a=self.navigator.userAgent,b=hd(a)+1,c=ff(b);Y(a,c,b);return c}function pc(){var a=stackTrace(),b=hd(a)+1,c=ff(b);Y(a,c,b);return c}var Ue,Ba,Ve,ff,Oc,rd,ya,Ea,Fc,Mc,Uc,Df,qf,Qc,Gc,Ec,Dc;h.__ZN2MB2NN28LinearDefragmentingAllocator10Allocation4nullE=99616; var ab,Pa=await (async function(){function a(c,d){Pa=c.exports;Jc.push(Pa.za);Sc=Pa.Ba;ma=d;c=Pa;Ue=c.ua;Ba=c.va;Ve=c.wa;ff=c.xa;Oc=c.ya;rd=c.Aa;ya=c.Ca;Ea=c.Da;Fc=c.Ea;Mc=c.Fa;Uc=c.Ga;Df=c.Ha;qf=c.Ia;Qc=c.Ja;Gc=c.Ka;Ec=c.La;Dc=c.Ma;Ua("wasm-instantiate");return Pa}Ta("wasm-instantiate");var b=$a();if(h.instantiateWasm)return new Promise(c=>{h.instantiateWasm(b,(d,e)=>{c(a(d,e))})});if(n)return new Promise(c=>{ua=d=>{var e=new WebAssembly.Instance(d,$a());c(a(e,d))}});Wa??=h.locateFile? h.locateFile?h.locateFile("BlinkIdModule.wasm",ha):ha+"BlinkIdModule.wasm":(new URL("BlinkIdModule.wasm",import.meta.url)).href;return function(c){return a(c.instance,c.module)}(await Za(b))}()); diff --git a/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.wasm b/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.wasm index 074ccbb..531b618 100755 Binary files a/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.wasm and b/packages/blinkid-wasm/dist/lightweight/advanced-threads/BlinkIdModule.wasm differ diff --git a/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.js b/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.js index 2d39fea..ecc85b2 100644 --- a/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.js +++ b/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.js @@ -1,10 +1,10 @@ async function createModule(moduleArg={}){var moduleRtn;var m=moduleArg,aa="object"==typeof window,ba="undefined"!=typeof WorkerGlobalScope;let ca;(ca=m).expectedDataFileDownloads??(ca.expectedDataFileDownloads=0);m.expectedDataFileDownloads++; (()=>{var a="undefined"!=typeof ENVIRONMENT_IS_WASM_WORKER&&ENVIRONMENT_IS_WASM_WORKER;"undefined"!=typeof ENVIRONMENT_IS_PTHREAD&&ENVIRONMENT_IS_PTHREAD||a||function(b){function c(k,u,n){let q;(q=m).dataFileDownloads??(q.dataFileDownloads={});fetch(k).catch(v=>Promise.reject(Error(`Network Error: ${k}`,{cause:v}))).then(v=>{if(!v.ok)return Promise.reject(Error(`${v.status}: ${v.url}`));if(!v.body&&v.arrayBuffer)return v.arrayBuffer().then(n);const p=v.body.getReader(),x=()=>p.read().then(K).catch(t=> Promise.reject(Error(`Unexpected error while handling : ${v.url} ${t}`,{cause:t}))),z=[],I=Number(v.headers.get("Content-Length")??u);let E=0;const K=({done:t,value:G})=>{if(t){var F=new Uint8Array(z.map(T=>T.length).reduce((T,ka)=>T+ka,0));t=0;for(var C of z)F.set(C,t),t+=C.length;n(F.buffer)}else{z.push(G);E+=G.length;m.dataFileDownloads[k]={loaded:E,total:I};t=C=0;for(F of Object.values(m.dataFileDownloads))C+=F.loaded,t+=F.total;m.setStatus?.(`Downloading data... (${C}/${t})`);return x()}};m.setStatus?.("Downloading data..."); -return x()})}function d(k){console.error("package error:",k)}function e(k){function u(p,x,z){this.start=p;this.end=x;this.audio=z}function n(p){if(!p)throw"Loading data file failed."+Error().stack;if(p.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;p=new Uint8Array(p);u.prototype.Ub=p;p=b.files;for(var x=0;x{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", +q[v].filename);k.addRunDependency("datafile_/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.data");k.preloadResults??(k.preloadResults={});k.preloadResults["/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.data"]={Gc:!1};l?(n(l),l=null):h=n}"object"===typeof window?window.encodeURIComponent(window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+ +"/"):"undefined"===typeof process&&"undefined"!==typeof location&&encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/");var f=m.locateFile?m.locateFile("BlinkIdModule.data",""):"BlinkIdModule.data",g=b.remote_package_size,h=null,l=m.getPreloadedPackage?m.getPreloadedPackage(f,g):null;l||c(f,g,k=>{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop", start:5147659,end:6174514},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:6174514,end:6470316},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop",start:6470316,end:6476812},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:6476812,end:7900257},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop", diff --git a/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.wasm b/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.wasm index 1ba2cbe..7ccd8a2 100755 Binary files a/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.wasm and b/packages/blinkid-wasm/dist/lightweight/advanced/BlinkIdModule.wasm differ diff --git a/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.js b/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.js index fae8f79..6b68aff 100644 --- a/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.js +++ b/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.js @@ -1,11 +1,11 @@ async function createModule(moduleArg={}){var moduleRtn;var m=moduleArg,aa="object"==typeof window,ba="undefined"!=typeof WorkerGlobalScope;let ca;(ca=m).expectedDataFileDownloads??(ca.expectedDataFileDownloads=0);m.expectedDataFileDownloads++; (()=>{var a="undefined"!=typeof ENVIRONMENT_IS_WASM_WORKER&&ENVIRONMENT_IS_WASM_WORKER;"undefined"!=typeof ENVIRONMENT_IS_PTHREAD&&ENVIRONMENT_IS_PTHREAD||a||function(b){function c(k,u,n){let q;(q=m).dataFileDownloads??(q.dataFileDownloads={});fetch(k).catch(v=>Promise.reject(Error(`Network Error: ${k}`,{cause:v}))).then(v=>{if(!v.ok)return Promise.reject(Error(`${v.status}: ${v.url}`));if(!v.body&&v.arrayBuffer)return v.arrayBuffer().then(n);const p=v.body.getReader(),x=()=>p.read().then(K).catch(r=> Promise.reject(Error(`Unexpected error while handling : ${v.url} ${r}`,{cause:r}))),z=[],I=Number(v.headers.get("Content-Length")??u);let E=0;const K=({done:r,value:G})=>{if(r){var F=new Uint8Array(z.map(T=>T.length).reduce((T,ka)=>T+ka,0));r=0;for(var C of z)F.set(C,r),r+=C.length;n(F.buffer)}else{z.push(G);E+=G.length;m.dataFileDownloads[k]={loaded:E,total:I};r=C=0;for(F of Object.values(m.dataFileDownloads))C+=F.loaded,r+=F.total;m.setStatus?.(`Downloading data... (${C}/${r})`);return x()}};m.setStatus?.("Downloading data..."); -return x()})}function d(k){console.error("package error:",k)}function e(k){function u(p,x,z){this.start=p;this.end=x;this.audio=z}function n(p){if(!p)throw"Loading data file failed."+Error().stack;if(p.constructor.name!==ArrayBuffer.name)throw"bad input to processPackageData"+Error().stack;p=new Uint8Array(p);u.prototype.Tb=p;p=b.files;for(var x=0;x{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop",start:0, -end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", +q[v].filename);k.addRunDependency("datafile_/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.data");k.preloadResults??(k.preloadResults={});k.preloadResults["/opt/jenkins/android-arm64-samsung-s21-ultra/root/E0/blinkid-next/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.data"]={Fc:!1};l?(n(l),l=null):h=n}"object"===typeof window?window.encodeURIComponent(window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+ +"/"):"undefined"===typeof process&&"undefined"!==typeof location&&encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/");var f=m.locateFile?m.locateFile("BlinkIdModule.data",""):"BlinkIdModule.data",g=b.remote_package_size,h=null,l=m.getPreloadedPackage?m.getPreloadedPackage(f,g):null;l||c(f,g,k=>{h?(h(k),h=null):l=k},d);if(m.calledRun)e(m);else{let k;((k=m).preRun??(k.preRun=[])).push(e)}}({files:[{filename:"/microblink/blinkid/Model_07c7ab860e77ec2e92bb822f6d62424b8595a5beb4340f6b2f7f6a4cffa5d050.strop", +start:0,end:103198},{filename:"/microblink/blinkid/Model_083e679074e33233cdf9028116ed7803443e2acc876b915ecf4749ce6c33ee5c.strop",start:103198,end:228280},{filename:"/microblink/blinkid/Model_2880751121560047e6dc571bc8ff4683aeb863886f7c0789234594ceb1e23577.strop",start:228280,end:232015},{filename:"/microblink/blinkid/Model_36d8e94f4cb46097bd6b7385f2aa91fcdee1a5fefeec59e56d1b9e82c94b00a7.strop",start:232015,end:576471},{filename:"/microblink/blinkid/Model_3b11c3ffacbbf390b932fb9a7024f1a0016f66281ea8c790f8b5903374ad89c2.strop", start:576471,end:845192},{filename:"/microblink/blinkid/Model_4336af7999b059ac75281d0d71b60dd55b33c2b22c2b2c8e2b9ab56fe6ad720d.strop",start:845192,end:1172060},{filename:"/microblink/blinkid/Model_473ac5f5e256623c0a6b282698c1f1b033b9fb5359e6aa142e9fb4a4022afe4e.strop",start:1172060,end:1178509},{filename:"/microblink/blinkid/Model_7403cf61ed10e7e93ab9ebb030ee2aa31f5d3d19346a271859924d0288d2c8ba.strop",start:1178509,end:5147659},{filename:"/microblink/blinkid/Model_8c7727da554fd257fa758787ca3d0f517b47f6c5ba791792f516da7dd210fde8.strop", start:5147659,end:6174514},{filename:"/microblink/blinkid/Model_a1516add883f909ebecf9b565238086f8f31bbb3e7fb2113258e3ae7c659555e.strop",start:6174514,end:6470316},{filename:"/microblink/blinkid/Model_b452fd3cd4037080cfcb4c423dba5bc58c8ceafc28427fdf9c5778fb353f088e.strop",start:6470316,end:6476812},{filename:"/microblink/blinkid/Model_dd833eb903e57415810f0f7beffb6eca256b1d070825dde8e54a46d684920682.strop",start:6476812,end:7900257},{filename:"/microblink/blinkid/Model_f2874f5766b779c063dbe30467979163497dc4b29c43bab23d70c798ee32993a.strop", start:7900257,end:7975659},{filename:"/microblink/blinkid/Model_f531088a1f65a31d6ba039e09446fe24c18360080fec3792308ac01514803620.strop",start:7975659,end:8638712},{filename:"/microblink/blinkid/Model_faf688599c7e261a2a7404730f69ed029115bb0d3e7a3657731d88e701720efe.strop",start:8638712,end:8654385},{filename:"/microblink/blinkid/Model_fc22f7553e3e85531eb79ef6db1474302664508cc7ae4ff0d950447b20f2f8ee.strop",start:8654385,end:8727083},{filename:"/microblink/blinkid/ccc_lookup_table.zzip",start:8727083, @@ -93,7 +93,7 @@ Object.assign(Lc.prototype,{Zb(a){this.Ob&&(a=this.Ob(a));return a},Hb(a){this.M e?b.call(this):this.kb?Kc(d.ua.Va,{xa:d,va:e,Ha:this,Ca:a}):Kc(d.ua.Va,{xa:d,va:e})}});Y=new xd;za("library_fetch_init");(function(a,b){try{var c=indexedDB.open("emscripten_filesystem",1)}catch(d){b(d);return}c.onupgradeneeded=d=>{d=d.target.result;d.objectStoreNames.contains("FILES")&&d.deleteObjectStore("FILES");d.createObjectStore("FILES")};c.onsuccess=d=>a(d.target.result);c.onerror=b})(a=>{yd=a;Aa("library_fetch_init")},()=>{yd=!1;Aa("library_fetch_init")}); qa=m.wasmMemory?m.wasmMemory:new WebAssembly.Memory({initial:(m.INITIAL_MEMORY||209715200)/65536,maximum:32768});wa();m.noExitRuntime&&(La=m.noExitRuntime);m.preloadPlugins&&(nb=m.preloadPlugins);m.print&&(ja=m.print);m.printErr&&(t=m.printErr);m.wasmBinary&&(la=m.wasmBinary);m.thisProgram&&(da=m.thisProgram);m.addRunDependency=za;m.removeRunDependency=Aa; m.FS_createPreloadedFile=(a,b,c,d,e,f,g,h,l,k)=>{function u(v){function p(x){k?.();h||Zb(a,b,x,d,e,l);f?.();Aa(q)}ob(v,n,p,()=>{g?.();Aa(q)})||p(v)}var n=b?Va(Ra(a+"/"+b)):a,q=`cp ${n}`;za(q);"string"==typeof c?mb(c).then(u,g):u(c)};m.FS_unlink=(...a)=>Qb(...a);m.FS_createPath=(...a)=>Xb(...a);m.FS_createDevice=(...a)=>$b(...a);m.FS_createDataFile=(...a)=>Zb(...a);m.FS_createLazyFile=(...a)=>bc(...a); -var Id={340025:(a,b,c,d)=>{a=a?L(y,a):"";b=b?L(y,b):"";c=c?L(y,c):"";d=d?L(y,d):"";throw Error(a+b+c+d);},340241:(a,b)=>{a=a?L(y,a):"";b=b?L(y,b):"";throw Error(a+b);}},Oc,Pc,Ad,gb,Jd;m.__ZN2MB2NN28LinearDefragmentingAllocator10Allocation4nullE=1024; +var Id={340041:(a,b,c,d)=>{a=a?L(y,a):"";b=b?L(y,b):"";c=c?L(y,c):"";d=d?L(y,d):"";throw Error(a+b+c+d);},340257:(a,b)=>{a=a?L(y,a):"";b=b?L(y,b):"";throw Error(a+b);}},Oc,Pc,Ad,gb,Jd;m.__ZN2MB2NN28LinearDefragmentingAllocator10Allocation4nullE=1024; var Kd={y:(a,b)=>Oa(a)(b),q:function(a,b,c){Pa=c;try{var d=Hb(a);switch(b){case 0:var e=J();if(0>e)break;for(;sb[e];)e++;return Jb(d,e).Sa;case 1:case 2:return 0;case 3:return d.flags;case 4:return e=J(),d.flags|=e,0;case 12:return e=J(),A[e+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(f){if("undefined"==typeof R||"ErrnoError"!==f.name)throw f;return-f.Aa}},R:function(a,b){try{var c=Hb(a),d=c.node,e=c.sa.Ja;a=e?c:d;e??=d.ta.Ja;Gb(e);var f=e(a);return ec(b,f)}catch(g){if("undefined"==typeof R|| "ErrnoError"!==g.name)throw g;return-g.Aa}},S:function(a,b,c){Pa=c;try{var d=Hb(a);switch(b){case 21509:return d.wa?0:-59;case 21505:if(!d.wa)return-59;if(d.wa.Qa.fc){a=[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];var e=J();B[e>>2]=25856;B[e+4>>2]=5;B[e+8>>2]=191;B[e+12>>2]=35387;for(var f=0;32>f;f++)w[e+f+17]=a[f]||0}return 0;case 21510:case 21511:case 21512:return d.wa?0:-59;case 21506:case 21507:case 21508:if(!d.wa)return-59;if(d.wa.Qa.hc)for(e=J(),a=[],f=0;32>f;f++)a.push(w[e+ f+17]);return 0;case 21519:if(!d.wa)return-59;e=J();return B[e>>2]=0;case 21520:return d.wa?-28:-59;case 21537:case 21531:e=J();if(!d.sa.ec)throw new N(59);return d.sa.ec(d,b,e);case 21523:if(!d.wa)return-59;d.wa.Qa.ic&&(f=[24,80],e=J(),A[e>>1]=f[0],A[e+2>>1]=f[1]);return 0;case 21524:return d.wa?0:-59;case 21515:return d.wa?0:-59;default:return-28}}catch(g){if("undefined"==typeof R||"ErrnoError"!==g.name)throw g;return-g.Aa}},P:function(a,b){try{return a=a?L(y,a):"",ec(b,Rb(a,!0))}catch(c){if("undefined"== diff --git a/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.wasm b/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.wasm index 9a6d68f..1cb1219 100755 Binary files a/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.wasm and b/packages/blinkid-wasm/dist/lightweight/basic/BlinkIdModule.wasm differ diff --git a/packages/blinkid-wasm/dist/size-manifest.json b/packages/blinkid-wasm/dist/size-manifest.json index 70ba10c..e5d3a16 100644 --- a/packages/blinkid-wasm/dist/size-manifest.json +++ b/packages/blinkid-wasm/dist/size-manifest.json @@ -1,16 +1,16 @@ { "wasm": { "basic": { - "full": 3242571, - "lightweight": 3280459 + "full": 3242861, + "lightweight": 3280274 }, "advanced": { - "full": 3261161, - "lightweight": 3298193 + "full": 3261875, + "lightweight": 3298460 }, "advanced-threads": { - "full": 3309330, - "lightweight": 3343822 + "full": 3308759, + "lightweight": 3343810 } }, "data": { diff --git a/packages/blinkid-wasm/docs/type-aliases/HardwareCameraInfoData.md b/packages/blinkid-wasm/docs/type-aliases/HardwareCameraInfoData.md index 5841911..879ea5b 100644 --- a/packages/blinkid-wasm/docs/type-aliases/HardwareCameraInfoData.md +++ b/packages/blinkid-wasm/docs/type-aliases/HardwareCameraInfoData.md @@ -24,6 +24,10 @@ Represents the data for the `ping.hardware.camera.info` event. > **cameraFacing**: `"Front"` \| `"Back"` \| `"Unknown"` +#### deviceId + +> **deviceId**: `string` + #### focus? > `optional` **focus**: `"Auto"` \| `"Fixed"` diff --git a/packages/blinkid-wasm/docs/type-aliases/PingHardwareCameraInfo.md b/packages/blinkid-wasm/docs/type-aliases/PingHardwareCameraInfo.md index a7fa2fa..8b0bd2e 100644 --- a/packages/blinkid-wasm/docs/type-aliases/PingHardwareCameraInfo.md +++ b/packages/blinkid-wasm/docs/type-aliases/PingHardwareCameraInfo.md @@ -6,6 +6,6 @@ # Type Alias: PingHardwareCameraInfo -> **PingHardwareCameraInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`HardwareCameraInfoData`](HardwareCameraInfoData.md), `"ping.hardware.camera.info"`, `"1.0.1"`, `0`\> +> **PingHardwareCameraInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`HardwareCameraInfoData`](HardwareCameraInfoData.md), `"ping.hardware.camera.info"`, `"1.0.3"`, `0`\> Represents the `ping.hardware.camera.info` event. diff --git a/packages/blinkid-wasm/docs/type-aliases/PingSdkCameraInputInfo.md b/packages/blinkid-wasm/docs/type-aliases/PingSdkCameraInputInfo.md index ed5902f..0152196 100644 --- a/packages/blinkid-wasm/docs/type-aliases/PingSdkCameraInputInfo.md +++ b/packages/blinkid-wasm/docs/type-aliases/PingSdkCameraInputInfo.md @@ -6,6 +6,6 @@ # Type Alias: PingSdkCameraInputInfo -> **PingSdkCameraInputInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`SdkCameraInputInfoData`](SdkCameraInputInfoData.md), `"ping.sdk.camera.input.info"`, `"1.0.1"`\> +> **PingSdkCameraInputInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`SdkCameraInputInfoData`](SdkCameraInputInfoData.md), `"ping.sdk.camera.input.info"`, `"1.0.2"`\> Represents the `ping.sdk.camera.input.info` event. diff --git a/packages/blinkid-wasm/docs/type-aliases/SdkCameraInputInfoData.md b/packages/blinkid-wasm/docs/type-aliases/SdkCameraInputInfoData.md index ac34b61..3af3560 100644 --- a/packages/blinkid-wasm/docs/type-aliases/SdkCameraInputInfoData.md +++ b/packages/blinkid-wasm/docs/type-aliases/SdkCameraInputInfoData.md @@ -30,6 +30,12 @@ Represents the data for the `ping.sdk.camera.input.info` event. *** +### deviceId + +> **deviceId**: `string` + +*** + ### roiHeight > **roiHeight**: `number` diff --git a/packages/blinkid-wasm/package.json b/packages/blinkid-wasm/package.json index cb8f91b..21fd354 100644 --- a/packages/blinkid-wasm/package.json +++ b/packages/blinkid-wasm/package.json @@ -1,7 +1,7 @@ { "name": "@microblink/blinkid-wasm", "private": true, - "version": "7.6.2", + "version": "7.6.3", "scripts": { "build": "tsc", "build:publish": "tsc", diff --git a/packages/blinkid-wasm/src/ping/ping.hardware.camera.info.ts b/packages/blinkid-wasm/src/ping/ping.hardware.camera.info.ts index 7a2744a..6757cba 100644 --- a/packages/blinkid-wasm/src/ping/ping.hardware.camera.info.ts +++ b/packages/blinkid-wasm/src/ping/ping.hardware.camera.info.ts @@ -7,6 +7,7 @@ import { PingBase } from "./PingBase"; /** Represents the data for the `ping.hardware.camera.info` event. */ export type HardwareCameraInfoData = { availableCameras: { + deviceId: string; cameraFacing: "Front" | "Back" | "Unknown"; focus?: "Auto" | "Fixed"; availableResolutions?: { @@ -20,6 +21,6 @@ export type HardwareCameraInfoData = { export type PingHardwareCameraInfo = PingBase< HardwareCameraInfoData, "ping.hardware.camera.info", - "1.0.1", + "1.0.3", 0 >; diff --git a/packages/blinkid-wasm/src/ping/ping.sdk.camera.input.info.ts b/packages/blinkid-wasm/src/ping/ping.sdk.camera.input.info.ts index cfd9e74..0e3ada7 100644 --- a/packages/blinkid-wasm/src/ping/ping.sdk.camera.input.info.ts +++ b/packages/blinkid-wasm/src/ping/ping.sdk.camera.input.info.ts @@ -6,6 +6,7 @@ import { PingBase } from "./PingBase"; /** Represents the data for the `ping.sdk.camera.input.info` event. */ export type SdkCameraInputInfoData = { + deviceId: string; cameraFacing: "Front" | "Back" | "Unknown"; cameraFrameWidth: number; cameraFrameHeight: number; @@ -18,5 +19,5 @@ export type SdkCameraInputInfoData = { export type PingSdkCameraInputInfo = PingBase< SdkCameraInputInfoData, "ping.sdk.camera.input.info", - "1.0.1" + "1.0.2" >; diff --git a/packages/blinkid-worker/CHANGELOG.md b/packages/blinkid-worker/CHANGELOG.md index f59a9f8..7e9290a 100644 --- a/packages/blinkid-worker/CHANGELOG.md +++ b/packages/blinkid-worker/CHANGELOG.md @@ -1,12 +1,19 @@ # @microblink/blinkid-worker +## 7.6.3 + +### Patch Changes + +- Updated dependencies + - @microblink/blinkid-wasm@7.6.3 + ## 7.6.2 ### Patch Changes - Fixes `microblinkProxyUrl` handling - - Prevent an extra ping to the Microblink server when a proxy URL is configured (previously one redundant request was sent). - - Preserve the user-provided path when using a proxy URL (previously the path was removed). + - Prevent an extra ping to the Microblink server when a proxy URL is configured (previously one redundant request was sent). + - Preserve the user-provided path when using a proxy URL (previously the path was removed). - Updated dependencies - @microblink/blinkid-wasm@7.6.2 diff --git a/packages/blinkid-worker/package.json b/packages/blinkid-worker/package.json index 60743f5..ada38f2 100644 --- a/packages/blinkid-worker/package.json +++ b/packages/blinkid-worker/package.json @@ -2,7 +2,7 @@ "name": "@microblink/blinkid-worker", "description": "Provides a worker which runs the BlinkID WebAssembly in separate thread", "private": true, - "version": "7.6.2", + "version": "7.6.3", "scripts": { "build": "concurrently pnpm:build:js pnpm:build:types", "build:js": "vite build", diff --git a/packages/blinkid/CHANGELOG.md b/packages/blinkid/CHANGELOG.md index 7e43358..118a6c6 100644 --- a/packages/blinkid/CHANGELOG.md +++ b/packages/blinkid/CHANGELOG.md @@ -1,5 +1,14 @@ # @microblink/blinkid +## 7.6.3 + +### Patch Changes + +- Updated dependencies + - @microblink/blinkid-ux-manager@7.6.3 + - @microblink/camera-manager@7.2.7 + - @microblink/blinkid-core@7.6.3 + ## 7.6.2 ### Patch Changes diff --git a/packages/blinkid/docs/type-aliases/HardwareCameraInfoData.md b/packages/blinkid/docs/type-aliases/HardwareCameraInfoData.md index b03c576..4de3cfe 100644 --- a/packages/blinkid/docs/type-aliases/HardwareCameraInfoData.md +++ b/packages/blinkid/docs/type-aliases/HardwareCameraInfoData.md @@ -24,6 +24,10 @@ Represents the data for the `ping.hardware.camera.info` event. > **cameraFacing**: `"Front"` \| `"Back"` \| `"Unknown"` +#### deviceId + +> **deviceId**: `string` + #### focus? > `optional` **focus**: `"Auto"` \| `"Fixed"` diff --git a/packages/blinkid/docs/type-aliases/PingHardwareCameraInfo.md b/packages/blinkid/docs/type-aliases/PingHardwareCameraInfo.md index 763db49..7e54ea2 100644 --- a/packages/blinkid/docs/type-aliases/PingHardwareCameraInfo.md +++ b/packages/blinkid/docs/type-aliases/PingHardwareCameraInfo.md @@ -6,6 +6,6 @@ # Type Alias: PingHardwareCameraInfo -> **PingHardwareCameraInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`HardwareCameraInfoData`](HardwareCameraInfoData.md), `"ping.hardware.camera.info"`, `"1.0.1"`, `0`\> +> **PingHardwareCameraInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`HardwareCameraInfoData`](HardwareCameraInfoData.md), `"ping.hardware.camera.info"`, `"1.0.3"`, `0`\> Represents the `ping.hardware.camera.info` event. diff --git a/packages/blinkid/docs/type-aliases/PingSdkCameraInputInfo.md b/packages/blinkid/docs/type-aliases/PingSdkCameraInputInfo.md index 7ea09af..ee07374 100644 --- a/packages/blinkid/docs/type-aliases/PingSdkCameraInputInfo.md +++ b/packages/blinkid/docs/type-aliases/PingSdkCameraInputInfo.md @@ -6,6 +6,6 @@ # Type Alias: PingSdkCameraInputInfo -> **PingSdkCameraInputInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`SdkCameraInputInfoData`](SdkCameraInputInfoData.md), `"ping.sdk.camera.input.info"`, `"1.0.1"`\> +> **PingSdkCameraInputInfo** = [`PingBase`](../interfaces/PingBase.md)\<[`SdkCameraInputInfoData`](SdkCameraInputInfoData.md), `"ping.sdk.camera.input.info"`, `"1.0.2"`\> Represents the `ping.sdk.camera.input.info` event. diff --git a/packages/blinkid/docs/type-aliases/SdkCameraInputInfoData.md b/packages/blinkid/docs/type-aliases/SdkCameraInputInfoData.md index 4dfbc53..f45e7c5 100644 --- a/packages/blinkid/docs/type-aliases/SdkCameraInputInfoData.md +++ b/packages/blinkid/docs/type-aliases/SdkCameraInputInfoData.md @@ -30,6 +30,12 @@ Represents the data for the `ping.sdk.camera.input.info` event. *** +### deviceId + +> **deviceId**: `string` + +*** + ### roiHeight > **roiHeight**: `number` diff --git a/packages/blinkid/package.json b/packages/blinkid/package.json index 4838769..43cb21d 100644 --- a/packages/blinkid/package.json +++ b/packages/blinkid/package.json @@ -1,7 +1,7 @@ { "name": "@microblink/blinkid", "description": "All-in-one BlinkID browser SDK for fast and accurate ID document scanning and recognition in web applications.", - "version": "7.6.2", + "version": "7.6.3", "author": "Microblink", "scripts": { "build": "concurrently pnpm:build:js pnpm:build:types", diff --git a/packages/camera-manager/CHANGELOG.md b/packages/camera-manager/CHANGELOG.md index 6b7f23e..cb39634 100644 --- a/packages/camera-manager/CHANGELOG.md +++ b/packages/camera-manager/CHANGELOG.md @@ -1,5 +1,12 @@ # @microblink/camera-manager +## 7.2.7 + +### Patch Changes + +- Updated the camera picking logic +- Improved error handling on the `Camera` class + ## 7.2.6 ### Patch Changes diff --git a/packages/camera-manager/package.json b/packages/camera-manager/package.json index fd7fb75..649f84c 100644 --- a/packages/camera-manager/package.json +++ b/packages/camera-manager/package.json @@ -1,7 +1,7 @@ { "name": "@microblink/camera-manager", "description": "Manages cameras and stream, provides both a headless component and a UI component", - "version": "7.2.6", + "version": "7.2.7", "author": "Microblink", "scripts": { "build": "concurrently pnpm:build:js pnpm:build:types", diff --git a/packages/camera-manager/src/core/Camera.test.ts b/packages/camera-manager/src/core/Camera.test.ts index 4ab2c7b..c43173c 100644 --- a/packages/camera-manager/src/core/Camera.test.ts +++ b/packages/camera-manager/src/core/Camera.test.ts @@ -3,7 +3,7 @@ */ import { beforeEach, describe, expect, test, vi } from "vitest"; -import { createInputDeviceInfo } from "../media-mock/createInputDeviceInfo"; +import { createMockInputDeviceInfo } from "../media-mock/createInputDeviceInfo"; import { Camera, VideoResolutionName, videoResolutions } from "./Camera"; // Mock getUserMedia @@ -45,7 +45,7 @@ Object.defineProperty(globalThis, "navigator", { describe("Camera facingMode label detection", () => { test("Front label is applied correctly", () => { const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ mockCapabilities: { facingMode: ["user"], }, @@ -57,7 +57,7 @@ describe("Camera facingMode label detection", () => { test("Back label is applied correctly", () => { const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Camera 1, 0 back", mockCapabilities: { facingMode: ["environment"], @@ -78,7 +78,7 @@ describe("Camera resolution fallback", () => { mockGetUserMedia.mockResolvedValue(mockStream); const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Test Camera", mockCapabilities: { facingMode: ["environment"], @@ -104,7 +104,7 @@ describe("Camera resolution fallback", () => { }); const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Test Camera", mockCapabilities: { facingMode: ["environment"], @@ -143,7 +143,7 @@ describe("Camera resolution fallback", () => { }); const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Test Camera", mockCapabilities: { facingMode: ["environment"], @@ -171,7 +171,7 @@ describe("Camera resolution fallback", () => { mockGetUserMedia.mockRejectedValue(new Error("No resolution supported")); const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Test Camera", mockCapabilities: { facingMode: ["environment"], @@ -189,7 +189,7 @@ describe("Camera resolution fallback", () => { mockGetUserMedia.mockResolvedValue(mockStream); const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Test Camera", mockCapabilities: { facingMode: ["environment"], @@ -214,7 +214,7 @@ describe("Camera resolution fallback", () => { mockGetUserMedia.mockResolvedValue(mockStream); const camera = new Camera( - createInputDeviceInfo({ + createMockInputDeviceInfo({ label: "Test Camera", mockCapabilities: { facingMode: ["environment"], diff --git a/packages/camera-manager/src/core/Camera.ts b/packages/camera-manager/src/core/Camera.ts index 1a046e9..c0b27b1 100644 --- a/packages/camera-manager/src/core/Camera.ts +++ b/packages/camera-manager/src/core/Camera.ts @@ -3,11 +3,11 @@ */ import { subscribeWithSelector } from "zustand/middleware"; +import { shallow } from "zustand/shallow"; import { createStore } from "zustand/vanilla"; import { CameraError } from "./cameraError"; import { isBackCameraName, isFrontCameraName } from "./cameraNames"; import { closeStreamTracks, createConstraints } from "./cameraUtils"; -import { shallow } from "zustand/shallow"; interface CameraState { deviceInfo: InputDeviceInfo; @@ -19,6 +19,8 @@ interface CameraState { singleShotSupported: boolean; maxSupportedResolution?: VideoResolutionName; streamCapabilities?: ReturnType; + /** not implemented in iOS Safari and Firefox at the time of writing */ + deviceCapabilities?: ReturnType; error?: CameraError; } @@ -39,6 +41,7 @@ const initialCameraState: CameraState = { singleShotSupported: false, maxSupportedResolution: undefined, streamCapabilities: undefined, + deviceCapabilities: undefined, error: undefined, } as CameraState; @@ -77,6 +80,15 @@ export class Camera { } get activeStream() { + if (this.store.getState().activeStream?.active === false) { + console.warn( + "Detected inactive stream on camera:", + this.name, + this.store.getState().activeStream, + ); + // stream is inactive, clear it from state + this.store.setState({ activeStream: undefined }); + } return this.store.getState().activeStream; } @@ -174,9 +186,6 @@ export class Camera { fireImmediately?: boolean; }, ): () => void { - // Add your side effects here - console.debug(`Creating subscription for camera: ${this.name}`); - // Call original method with proper argument handling let unsubscribe: () => void; @@ -237,13 +246,15 @@ export class Camera { // Happens when camera device disconnects videoTrack.onended = () => { + const error = new CameraError( + "Camera stream ended unexpectedly", + "STREAM_ENDED_UNEXPECTEDLY", + ); this.store.setState({ - error: new CameraError( - "Camera stream ended unexpectedly", - "STREAM_ENDED_UNEXPECTEDLY", - ), + error, }); this.stopStream(); + throw error; }; return stream; @@ -266,8 +277,10 @@ export class Camera { this.deviceInfo.deviceId, ); + const stream = await navigator.mediaDevices.getUserMedia(constraints); + // can throw if device is currently in use by another process - return await navigator.mediaDevices.getUserMedia(constraints); + return stream; } catch (error) { // This branch shouldn't happen as we are using `ideal` when making // constraints, however it's a good fallback to have @@ -300,6 +313,12 @@ export class Camera { private populateCapabilities(stream: MediaStream) { const streamCapabilities = stream.getVideoTracks()[0].getCapabilities(); + if ("getCapabilities" in this.deviceInfo) { + // not implemented in iOS Safari and Firefox at the time of writing + const deviceCapabilities = this.deviceInfo.getCapabilities(); + this.store.setState({ deviceCapabilities }); + } + // shallow compare and set to avoid unnecessary updates const same = shallow(streamCapabilities, this.streamCapabilities); diff --git a/packages/camera-manager/src/core/CameraManager.ts b/packages/camera-manager/src/core/CameraManager.ts index 87598e2..bbd40fc 100644 --- a/packages/camera-manager/src/core/CameraManager.ts +++ b/packages/camera-manager/src/core/CameraManager.ts @@ -680,7 +680,7 @@ export class CameraManager { async #startCameraStream({ autoplay = true, preferredCamera, - preferredFacing, + preferredFacing = "back", }: StartCameraStreamOptions = {}) { const videoElement = store.getState().videoElement; diff --git a/packages/camera-manager/src/core/cameraUtils.test.ts b/packages/camera-manager/src/core/cameraUtils.test.ts index 083b148..3609789 100644 --- a/packages/camera-manager/src/core/cameraUtils.test.ts +++ b/packages/camera-manager/src/core/cameraUtils.test.ts @@ -188,14 +188,15 @@ describe("filterCamerasByFacing", () => { expect(filtered.map((c) => c.name)).toEqual(["Front Camera", "front 1"]); }); - test("defaults to back cameras when facing is undefined", () => { + test("returns all cameras when no facing mode is requested", () => { const cameras = [ new MockCamera("Back Camera", { facingMode: "back" }), new MockCamera("Front Camera", { facingMode: "front" }), + new MockCamera("back 0", { facingMode: "back" }), + new MockCamera("front 1", { facingMode: "front" }), ]; const filtered = filterCamerasByFacing(cameras, undefined); - expect(filtered).toHaveLength(1); - expect(filtered[0].name).toBe("Back Camera"); + expect(filtered).toHaveLength(4); }); test("returns empty array when no matching cameras", () => { @@ -210,12 +211,14 @@ describe("filterCamerasByFacing", () => { describe("findIdealCamera", () => { test("throws error when no cameras available", async () => { - await expect(findIdealCamera([])).rejects.toThrow("No cameras found"); + await expect(findIdealCamera([], "1080p", "back")).rejects.toThrow( + "No cameras found", + ); }); test("returns single camera when only one available", async () => { const camera = new MockCamera("Test Camera"); - const result = await findIdealCamera([camera]); + const result = await findIdealCamera([camera], "1080p", "front"); expect(result).toBe(camera); }); @@ -285,7 +288,8 @@ describe("findIdealCamera", () => { expect(result.name).toBe("Unknown Camera 3"); }); - test("handles stream failures and retries", async () => { + // TODO: shouldn't be a capability of `findIdealCamera` + test.fails("falls back to last known working camera", async () => { let camera1Attempts = 0; let camera2Attempts = 0; @@ -310,7 +314,7 @@ describe("findIdealCamera", () => { }), ]; - const result = await findIdealCamera(cameras); + const result = await findIdealCamera(cameras, "1080p", undefined); expect(result.name).toBe("Camera 1"); expect(camera1Attempts).toBe(2); expect(camera2Attempts).toBe(1); diff --git a/packages/camera-manager/src/core/cameraUtils.ts b/packages/camera-manager/src/core/cameraUtils.ts index 4ae47c4..0cc2063 100644 --- a/packages/camera-manager/src/core/cameraUtils.ts +++ b/packages/camera-manager/src/core/cameraUtils.ts @@ -13,7 +13,7 @@ import { } from "./Camera"; import { isBackCameraName, isFrontCameraName } from "./cameraNames"; import { backDualWideCameraLocalizations } from "./iosCameraNames"; -import { asError } from "./utils"; +import { asError, isIOS } from "./utils"; import { CameraError } from "./cameraError"; /** @@ -140,11 +140,15 @@ export function filterCamerasByFacing( requestedFacing: FacingMode, ): Camera[] { return cameras.filter((camera) => { - if (requestedFacing === "back" || requestedFacing === undefined) { + if (requestedFacing === "back") { return isBackCameraName(camera.name); - } else { + } + if (requestedFacing === "front") { return isFrontCameraName(camera.name); } + + // If no facing mode is requested, return all cameras + return true; }); } @@ -160,12 +164,12 @@ export function filterCamerasByFacing( */ export const findIdealCamera = async ( cameras: Camera[], - resolution: VideoResolutionName = "4k", - requestedFacing: FacingMode = "back", + resolution: VideoResolutionName, + requestedFacing: FacingMode, ): Promise => { // if there are no cameras, throw an error if (cameras.length === 0) { - throw new Error("No cameras found"); + throw new Error("No cameras found on device"); } // if there's only one camera, we can return it immediately @@ -216,10 +220,12 @@ export const findIdealCamera = async ( let maxScore = -Infinity; // we iterate in reverse order to prioritize the last camera - // this is usually the best camera on Android - for (let i = cameraPool.length - 1; i >= 0; i--) { - const camera = cameraPool[i]; + // this is usually the best camera on Android devices + if (!isIOS()) { + cameraPool.reverse(); + } + for (const camera of cameraPool) { try { // Start stream to detect capabilities await camera.startStream(resolution); @@ -230,22 +236,23 @@ export const findIdealCamera = async ( // Update best camera if this one has a higher score if (score > maxScore) { - // Stop stream on previous best camera if it exists - if (bestCamera && bestCamera !== camera) { - bestCamera.stopStream(); - } maxScore = score; bestCamera = camera; } else { // Not the best camera, stop its stream camera.stopStream(); + + // go to next loop + continue; } // Perfect match - has both torch and single shot support if (score === 2) { - console.debug("Found camera with all capabilities, returning early"); return camera; } + + // Stop stream to free camera for the best candidate search + camera.stopStream(); } catch (error) { console.warn(`Failed to test camera ${camera.name}:`, error); // Stop stream if it was started @@ -253,15 +260,12 @@ export const findIdealCamera = async ( } } - // Return the best camera we found - if (bestCamera) { - return bestCamera; + if (!bestCamera) { + throw new Error("No suitable camera found, should not happen!"); } - // If we haven't found any working camera, try one last time with the first camera - const firstCamera = cameraPool[0]; - await firstCamera.startStream(resolution); - return firstCamera; + // Return the best camera we found, or the last one that was tested + return bestCamera; }; /** diff --git a/packages/camera-manager/src/core/utils.ts b/packages/camera-manager/src/core/utils.ts index e628b81..c6b0d51 100644 --- a/packages/camera-manager/src/core/utils.ts +++ b/packages/camera-manager/src/core/utils.ts @@ -48,3 +48,8 @@ export function getKeyWithHighestValue(map: Map) { return maxKey; } + +export function isIOS(): boolean { + const userAgent = self.navigator.userAgent.toLowerCase(); + return /iphone|ipad|ipod/.test(userAgent); +} diff --git a/packages/camera-manager/src/media-mock/MediaMocker.ts b/packages/camera-manager/src/media-mock/MediaMocker.ts index 80c9546..7a5e7b7 100644 --- a/packages/camera-manager/src/media-mock/MediaMocker.ts +++ b/packages/camera-manager/src/media-mock/MediaMocker.ts @@ -3,7 +3,7 @@ */ import { FacingMode } from "../core/Camera"; -import { createInputDeviceInfo } from "./createInputDeviceInfo"; +import { createMockInputDeviceInfo } from "./createInputDeviceInfo"; import { defineProperty } from "./defineProperty"; import { ExtendedCameraInfo, fakeDevices } from "./fake-devices"; import { getResolutionFromConstraints } from "./utils"; @@ -58,7 +58,7 @@ class MediaMocker { * @returns The camera devices. */ getCameraDevices() { - return fakeDevices[this.fakeDevice].cameras; + return this.cameras; } /** @@ -100,7 +100,7 @@ class MediaMocker { "enumerateDevices", (): Promise => { const devices = this.cameras.map((camera) => { - return createInputDeviceInfo(camera.inputDeviceInfo); + return createMockInputDeviceInfo(camera.inputDeviceInfo); }); return Promise.resolve(devices); diff --git a/packages/camera-manager/src/media-mock/createInputDeviceInfo.ts b/packages/camera-manager/src/media-mock/createInputDeviceInfo.ts index 2e5a4fa..5e97de3 100644 --- a/packages/camera-manager/src/media-mock/createInputDeviceInfo.ts +++ b/packages/camera-manager/src/media-mock/createInputDeviceInfo.ts @@ -24,7 +24,7 @@ interface CreateInputDeviceProps extends Partial { * @param props - The properties for the device. * @returns The fake `InputDeviceInfo` info object. */ -export const createInputDeviceInfo = ({ +export const createMockInputDeviceInfo = ({ label, deviceId = crypto.randomUUID(), groupId = crypto.randomUUID(), @@ -48,12 +48,7 @@ export const createInputDeviceInfo = ({ }; }, getCapabilities: () => { - // throw error if Firefox user agent - // not supported as of Firefox 133 - // https://bugzilla.mozilla.org/show_bug.cgi?id=1179084 - if (navigator.userAgent.includes("Firefox")) { - throw new Error("Not implemented"); - } + // not supported as of Firefox 133 and iOS 16.4 return mockCapabilities; }, }; diff --git a/packages/camera-manager/src/media-mock/fake-devices.ts b/packages/camera-manager/src/media-mock/fake-devices.ts index 0b44d4f..449b102 100644 --- a/packages/camera-manager/src/media-mock/fake-devices.ts +++ b/packages/camera-manager/src/media-mock/fake-devices.ts @@ -6,15 +6,21 @@ import { MockiPhone15 } from "./fakeDevices/iPhone15"; import { MockiPhoneSE } from "./fakeDevices/iPhoneSE"; import { MockSamsungS21FE } from "./fakeDevices/SamsungS21FE"; import { desktopSingleFrontFacing } from "./fakeDevices/DesktopSingleFrontFacing"; +import { MockiPhoneX } from "./fakeDevices/iPhoneX"; + +// Not available in iOS Safari +type DeviceCapabilities = ReturnType | null; +type StreamCapabilities = ReturnType; +type MediaTrackSettings = ReturnType; /** * `deviceCapabilities` and `streamCapabilities` seem to be the same on iOS Safari */ export type ExtendedCameraInfo = { inputDeviceInfo: Omit; - deviceCapabilities: ReturnType; - streamCapabilities: ReturnType; - mediaTrackSettings: ReturnType; + deviceCapabilities?: DeviceCapabilities; + streamCapabilities: StreamCapabilities; + mediaTrackSettings: MediaTrackSettings; }; /** @@ -31,6 +37,7 @@ export type FakeDevice = { export const fakeDevices: Record = { "iPhone 15": MockiPhone15, "iPhone SE": MockiPhoneSE, + "iPhone X": MockiPhoneX, "Samsung S21FE": MockSamsungS21FE, "Desktop Single Front Facing": desktopSingleFrontFacing, } as const; diff --git a/packages/camera-manager/src/media-mock/fakeDevices/iPhoneX.ts b/packages/camera-manager/src/media-mock/fakeDevices/iPhoneX.ts new file mode 100644 index 0000000..3e2f7ad --- /dev/null +++ b/packages/camera-manager/src/media-mock/fakeDevices/iPhoneX.ts @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2025 Microblink Ltd. All rights reserved. + */ + +import { FakeDevice } from "../fake-devices"; + +export const MockiPhoneX: FakeDevice = { + name: "iPhone X", + cameras: [ + { + inputDeviceInfo: { + deviceId: "827A38BC29B5012BCB51D9A35AB0EF7729CC8897", + kind: "videoinput", + label: "Front Camera", + groupId: "", + }, + streamCapabilities: { + aspectRatio: { + max: 3088, + min: 0.0004310344827586207, + }, + deviceId: "827A38BC29B5012BCB51D9A35AB0EF7729CC8897", + facingMode: ["user"], + frameRate: { + max: 60, + min: 1, + }, + height: { + max: 2320, + min: 1, + }, + width: { + max: 3088, + min: 1, + }, + }, + mediaTrackSettings: { + deviceId: "827A38BC29B5012BCB51D9A35AB0EF7729CC8897", + facingMode: "user", + frameRate: 30, + height: 1080, + width: 1920, + }, + }, + { + inputDeviceInfo: { + deviceId: "794B89EFC336509B5944B7B404E16E026850CAAD", + kind: "videoinput", + label: "Back Camera", + groupId: "", + }, + streamCapabilities: { + aspectRatio: { + max: 4032, + min: 0.00033068783068783067, + }, + deviceId: "794B89EFC336509B5944B7B404E16E026850CAAD", + facingMode: ["environment"], + frameRate: { + max: 60, + min: 1, + }, + height: { + max: 3024, + min: 1, + }, + width: { + max: 4032, + min: 1, + }, + }, + mediaTrackSettings: { + deviceId: "794B89EFC336509B5944B7B404E16E026850CAAD", + facingMode: "environment", + frameRate: 30, + height: 1080, + width: 1920, + }, + }, + { + inputDeviceInfo: { + deviceId: "2DF80612385587FFDE6A6FDE1CD4EC5BD08A24CC", + kind: "videoinput", + label: "Back Telephoto Camera", + groupId: "", + }, + streamCapabilities: { + aspectRatio: { + max: 4032, + min: 0.00033068783068783067, + }, + deviceId: "2DF80612385587FFDE6A6FDE1CD4EC5BD08A24CC", + facingMode: ["environment"], + frameRate: { + max: 60, + min: 1, + }, + height: { + max: 3024, + min: 1, + }, + width: { + max: 4032, + min: 1, + }, + }, + mediaTrackSettings: { + deviceId: "2DF80612385587FFDE6A6FDE1CD4EC5BD08A24CC", + facingMode: "environment", + frameRate: 30, + height: 1080, + width: 1920, + }, + }, + ], +}; diff --git a/packages/camera-manager/src/tests/camera-picking.test.ts b/packages/camera-manager/src/tests/camera-picking.test.ts index d1cda8e..031becb 100644 --- a/packages/camera-manager/src/tests/camera-picking.test.ts +++ b/packages/camera-manager/src/tests/camera-picking.test.ts @@ -2,13 +2,13 @@ * Copyright (c) 2025 Microblink Ltd. All rights reserved. */ -import { expect, test, describe, beforeAll } from "vitest"; -import { mediaMocker } from "../media-mock/MediaMocker"; +import { beforeAll, describe, expect, test, vi } from "vitest"; import { createCameras, findIdealCamera, obtainVideoInputDevices, } from "../core/cameraUtils"; +import { mediaMocker } from "../media-mock/MediaMocker"; // Test constants for better maintainability const DEVICE_NAMES = { @@ -35,198 +35,202 @@ async function getCameraInstances() { return createCameras(cameraInfos); } -describe("Camera picking", () => { - describe("Camera picking on iPhone", () => { - beforeAll(() => { - mediaMocker.configure({ device: "iPhone 15" }); - mediaMocker.mock(); +describe("iPhones", () => { + beforeAll(() => { + const originalUA = navigator.userAgent; - return () => mediaMocker.unmock(); + // It's important to mock the user agent as we sort cameras differently on iOS inside findIdealCamera() + Object.defineProperty(window.navigator, "userAgent", { + value: + "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1", + writable: true, }); - test("iPhone 15 selects Back Dual Wide Camera by default ", async () => { - const cameraInstances = await getCameraInstances(); - - expect((await findIdealCamera(cameraInstances)).name).toBe( - DEVICE_NAMES.IPHONE_15.BACK, - ); - - mediaMocker.reverseCameraOrder(); + return () => { + Object.defineProperty(window.navigator, "userAgent", { + value: originalUA, + writable: true, + }); + }; + }); + describe("Camera picking on iPhone X", () => { + beforeAll(() => { + mediaMocker.configure({ device: "iPhone X" }); + mediaMocker.mock(); - expect((await findIdealCamera(cameraInstances)).name).toBe( - DEVICE_NAMES.IPHONE_15.BACK, - ); + return () => { + mediaMocker.unmock(); + }; }); - test("iPhone 15 selects Back Dual Wide Camera when requesting back facing ", async () => { - const cameraInstances = await getCameraInstances(); + test("iPhone X selects Back Camera when provided back facing", async () => { + let cameraInstances = await getCameraInstances(); expect( (await findIdealCamera(cameraInstances, "1080p", "back")).name, - ).toBe(DEVICE_NAMES.IPHONE_15.BACK); + ).toBe("Back Camera"); mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); + // This is expected expect( (await findIdealCamera(cameraInstances, "1080p", "back")).name, - ).toBe(DEVICE_NAMES.IPHONE_15.BACK); - }); - - test("iPhone 15 selects Front Camera when requesting front facing ", async () => { - const cameraInstances = await getCameraInstances(); - - expect( - (await findIdealCamera(cameraInstances, "1080p", "front")).name, - ).toBe(DEVICE_NAMES.IPHONE_15.FRONT); - - mediaMocker.reverseCameraOrder(); - - expect( - (await findIdealCamera(cameraInstances, "1080p", "front")).name, - ).toBe(DEVICE_NAMES.IPHONE_15.FRONT); + ).toBe("Back Telephoto Camera"); }); }); - describe("Camera picking on Samsung S21FE", () => { + describe("Camera picking on iPhone 15", () => { beforeAll(() => { - mediaMocker.configure({ device: "Samsung S21FE" }); + mediaMocker.configure({ device: "iPhone 15" }); mediaMocker.mock(); - return () => mediaMocker.unmock(); + return () => { + mediaMocker.unmock(); + }; }); - test("Samsung S21FE selects camera2 0, facing back by default ", async () => { - const cameraInstances = await getCameraInstances(); - - expect((await findIdealCamera(cameraInstances)).name).toBe( - DEVICE_NAMES.SAMSUNG_S21FE.BACK, - ); - - mediaMocker.reverseCameraOrder(); - - expect((await findIdealCamera(cameraInstances)).name).toBe( - DEVICE_NAMES.SAMSUNG_S21FE.BACK, - ); - }); - - test("Samsung S21FE selects camera2 0, facing back when requesting back facing ", async () => { - const cameraInstances = await getCameraInstances(); + test("iPhone 15 selects Back Dual Wide Camera when requesting back facing ", async () => { + let cameraInstances = await getCameraInstances(); expect( (await findIdealCamera(cameraInstances, "1080p", "back")).name, - ).toBe(DEVICE_NAMES.SAMSUNG_S21FE.BACK); + ).toBe(DEVICE_NAMES.IPHONE_15.BACK); mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); expect( (await findIdealCamera(cameraInstances, "1080p", "back")).name, - ).toBe(DEVICE_NAMES.SAMSUNG_S21FE.BACK); + ).toBe(DEVICE_NAMES.IPHONE_15.BACK); }); - test("Samsung S21FE selects camera2 3, facing front when requesting front facing ", async () => { - const cameraInstances = await getCameraInstances(); + test("iPhone 15 selects Front Camera when requesting front facing ", async () => { + let cameraInstances = await getCameraInstances(); expect( (await findIdealCamera(cameraInstances, "1080p", "front")).name, - ).toBe(DEVICE_NAMES.SAMSUNG_S21FE.FRONT); + ).toBe(DEVICE_NAMES.IPHONE_15.FRONT); mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); expect( (await findIdealCamera(cameraInstances, "1080p", "front")).name, - ).toBe(DEVICE_NAMES.SAMSUNG_S21FE.FRONT); + ).toBe(DEVICE_NAMES.IPHONE_15.FRONT); }); - }); - describe("Camera picking on iPhone SE", () => { - beforeAll(() => { - mediaMocker.configure({ device: "iPhone SE" }); - mediaMocker.mock(); + describe("Camera picking on iPhone SE", () => { + beforeAll(() => { + mediaMocker.configure({ device: "iPhone SE" }); + mediaMocker.mock(); - return () => mediaMocker.unmock(); - }); + return () => mediaMocker.unmock(); + }); - test("iPhone SE selects Back Camera by default ", async () => { - const cameraInstances = await getCameraInstances(); + test("iPhone SE selects Back Camera when requesting back facing ", async () => { + let cameraInstances = await getCameraInstances(); - expect((await findIdealCamera(cameraInstances)).name).toBe( - DEVICE_NAMES.IPHONE_SE.BACK, - ); + expect( + (await findIdealCamera(cameraInstances, "1080p", "back")).name, + ).toBe(DEVICE_NAMES.IPHONE_SE.BACK); - mediaMocker.reverseCameraOrder(); + mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); - expect((await findIdealCamera(cameraInstances)).name).toBe( - DEVICE_NAMES.IPHONE_SE.BACK, - ); - }); + expect( + (await findIdealCamera(cameraInstances, "1080p", "back")).name, + ).toBe(DEVICE_NAMES.IPHONE_SE.BACK); + }); - test("iPhone SE selects Back Camera when requesting back facing ", async () => { - const cameraInstances = await getCameraInstances(); + test("iPhone SE selects Front Camera when requesting front facing ", async () => { + let cameraInstances = await getCameraInstances(); - expect( - (await findIdealCamera(cameraInstances, "1080p", "back")).name, - ).toBe(DEVICE_NAMES.IPHONE_SE.BACK); + expect( + (await findIdealCamera(cameraInstances, "1080p", "front")).name, + ).toBe(DEVICE_NAMES.IPHONE_SE.FRONT); - mediaMocker.reverseCameraOrder(); + mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); - expect( - (await findIdealCamera(cameraInstances, "1080p", "back")).name, - ).toBe(DEVICE_NAMES.IPHONE_SE.BACK); + expect( + (await findIdealCamera(cameraInstances, "1080p", "front")).name, + ).toBe(DEVICE_NAMES.IPHONE_SE.FRONT); + }); }); + }); +}); - test("iPhone SE selects Front Camera when requesting front facing ", async () => { - const cameraInstances = await getCameraInstances(); +describe("Camera picking on Samsung S21FE", () => { + beforeAll(() => { + mediaMocker.configure({ device: "Samsung S21FE" }); + mediaMocker.mock(); - expect( - (await findIdealCamera(cameraInstances, "1080p", "front")).name, - ).toBe(DEVICE_NAMES.IPHONE_SE.FRONT); + return () => mediaMocker.unmock(); + }); - mediaMocker.reverseCameraOrder(); + test("Samsung S21FE selects camera2 0, facing back when requesting back facing ", async () => { + let cameraInstances = await getCameraInstances(); - expect( - (await findIdealCamera(cameraInstances, "1080p", "front")).name, - ).toBe(DEVICE_NAMES.IPHONE_SE.FRONT); - }); + expect((await findIdealCamera(cameraInstances, "1080p", "back")).name).toBe( + DEVICE_NAMES.SAMSUNG_S21FE.BACK, + ); + + mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); + + expect((await findIdealCamera(cameraInstances, "1080p", "back")).name).toBe( + DEVICE_NAMES.SAMSUNG_S21FE.BACK, + ); }); - describe("Camera picking on desktop with single front facing camera", () => { - beforeAll(() => { - mediaMocker.configure({ device: "Desktop Single Front Facing" }); - mediaMocker.mock(); + test("Samsung S21FE selects camera2 3, facing front when requesting front facing ", async () => { + let cameraInstances = await getCameraInstances(); - return () => mediaMocker.unmock(); - }); + // Ordering matters here + expect( + (await findIdealCamera(cameraInstances, "1080p", "front")).name, + ).toBe("camera2 1, facing front"); - test("Desktop with single front facing camera returns the front camera when no facing mode is requested", async () => { - const cameraInstances = await getCameraInstances(); + mediaMocker.reverseCameraOrder(); + cameraInstances = await getCameraInstances(); - const selectedCamera = await findIdealCamera(cameraInstances); - expect(selectedCamera.name).toBe(DEVICE_NAMES.DESKTOP.FRONT); - expect(selectedCamera.facingMode).toBe("front"); - }); + expect( + (await findIdealCamera(cameraInstances, "1080p", "front")).name, + ).toBe(DEVICE_NAMES.SAMSUNG_S21FE.FRONT); + }); +}); - test("Desktop with single front facing camera returns the front camera even when back facing is requested", async () => { - const cameraInstances = await getCameraInstances(); +describe("Camera picking on desktop with single front facing camera", () => { + beforeAll(() => { + mediaMocker.configure({ device: "Desktop Single Front Facing" }); + mediaMocker.mock(); - const selectedCamera = await findIdealCamera( - cameraInstances, - "1080p", - "back", - ); - expect(selectedCamera.name).toBe(DEVICE_NAMES.DESKTOP.FRONT); - expect(selectedCamera.facingMode).toBe("front"); - }); + return () => mediaMocker.unmock(); + }); + + // TODO: this should not be the desired behavior + test("Desktop with single front facing camera returns the front camera even when back facing is requested", async () => { + const cameraInstances = await getCameraInstances(); + + const selectedCamera = await findIdealCamera( + cameraInstances, + "1080p", + "back", + ); + expect(selectedCamera.name).toBe(DEVICE_NAMES.DESKTOP.FRONT); + expect(selectedCamera.facingMode).toBe("front"); + }); - test("Desktop with single front facing camera returns the front camera when front facing is requested", async () => { - const cameraInstances = await getCameraInstances(); + test("Desktop with single front facing camera returns the front camera when front facing is requested", async () => { + const cameraInstances = await getCameraInstances(); - const selectedCamera = await findIdealCamera( - cameraInstances, - "1080p", - "front", - ); - expect(selectedCamera.name).toBe(DEVICE_NAMES.DESKTOP.FRONT); - expect(selectedCamera.facingMode).toBe("front"); - }); + const selectedCamera = await findIdealCamera( + cameraInstances, + "1080p", + "front", + ); + expect(selectedCamera.name).toBe(DEVICE_NAMES.DESKTOP.FRONT); + expect(selectedCamera.facingMode).toBe("front"); }); });