@privateid/ultrapass-web-sdk 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/modules/core/face/FaceService.js +10 -2
- package/dist/application/modules/core/face/FaceService.js.map +1 -1
- package/dist/application/modules/internal/feature-flag/feature-flag.domain.d.ts +1 -0
- package/dist/application/modules/internal/feature-flag/feature-flag.domain.js +1 -0
- package/dist/application/modules/internal/feature-flag/feature-flag.domain.js.map +1 -1
- package/dist/application/modules/internal/shared/shared.utils.js +3 -0
- package/dist/application/modules/internal/shared/shared.utils.js.map +1 -1
- package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.d.ts +11 -1
- package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.js +148 -2
- package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.js.map +1 -1
- package/dist/application/modules/internal/wasm-orchestrator/wasm-orchestrator.domain.d.ts +18 -2
- package/dist/application/modules/internal/wasm-orchestrator/wasm-orchestrator.types.d.ts +21 -0
- package/dist/application/modules/support/camera/services/DesktopCameraService.js +21 -3
- package/dist/application/modules/support/camera/services/DesktopCameraService.js.map +1 -1
- package/dist/application/modules/support/camera/services/FirefoxCameraService.js +97 -25
- package/dist/application/modules/support/camera/services/FirefoxCameraService.js.map +1 -1
- package/dist/application/modules/support/engine/EngineService.d.ts +5 -1
- package/dist/application/modules/support/engine/EngineService.js +48 -0
- package/dist/application/modules/support/engine/EngineService.js.map +1 -1
- package/dist/application/modules/support/engine/engine.domain.d.ts +17 -1
- package/dist/application/modules/support/engine/engine.types.d.ts +21 -0
- package/dist/application/modules/support/engine/index.d.ts +1 -1
- package/dist/application/workers/wasm/WasmWorkerService.d.ts +13 -2
- package/dist/application/workers/wasm/WasmWorkerService.js +126 -20
- package/dist/application/workers/wasm/WasmWorkerService.js.map +1 -1
- package/dist/application/workers/wasm/wasm-worker.domain.d.ts +5 -3
- package/dist/application/workers/wasm/wasm-worker.types.d.ts +27 -0
- package/dist/application/workers/wasm/wasm-worker.utils.d.ts +2 -1
- package/dist/application/workers/wasm/wasm-worker.utils.js +36 -11
- package/dist/application/workers/wasm/wasm-worker.utils.js.map +1 -1
- package/dist/main.d.ts +6 -1
- package/dist/main.js +12 -0
- package/dist/main.js.map +1 -1
- package/package.json +4 -2
- package/wasm/ultra/manifest.json +23 -0
- package/wasm/ultra/nosimd/26.02.13-24c4552-prod/privid_fhe_ultra.js +18 -0
- package/wasm/ultra/nosimd/26.02.13-24c4552-prod/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra/nosimd/version.json +1 -1
- package/wasm/ultra/simd/26.02.13-24c4552-prod/privid_fhe_ultra.js +18 -0
- package/wasm/ultra/simd/26.02.13-24c4552-prod/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra/simd/version.json +1 -1
- package/wasm/{ultra/nosimd/26.01.19-10e9421 → ultra-dev/nosimd/26.02.13-24c4552-dev}/privid_fhe_ultra.js +1 -1
- package/wasm/{ultra/nosimd/26.01.19-10e9421 → ultra-dev/nosimd/26.02.13-24c4552-dev}/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra-dev/nosimd/version.json +3 -0
- package/wasm/{ultra/simd/26.01.19-10e9421 → ultra-dev/simd/26.02.13-24c4552-dev}/privid_fhe_ultra.js +1 -1
- package/wasm/{ultra/simd/26.01.19-10e9421 → ultra-dev/simd/26.02.13-24c4552-dev}/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra-dev/simd/version.json +3 -0
- package/workers/wasm-new.worker.js +1 -1
- package/workers/wasm-new.worker.js.map +3 -3
- package/workers/wasm.worker.js +10 -2
|
@@ -11,36 +11,108 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
import { BaseCameraService } from './BaseCameraService';
|
|
12
12
|
import { CameraFaceMode } from '../camera.types';
|
|
13
13
|
import { printLogs } from '../../../internal/shared/shared.utils';
|
|
14
|
-
import { getFilteredVideoDevices, handleDeviceId, getMediaDeviceInfo, getDeviceMediaStream } from '../camera.utils';
|
|
14
|
+
import { getFilteredVideoDevices, handleDeviceId, getMediaDeviceInfo, getDeviceMediaStream, isBackCameraLabel, } from '../camera.utils';
|
|
15
15
|
export class FirefoxCameraService extends BaseCameraService {
|
|
16
16
|
openCamera(props) {
|
|
17
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
const maxAttempts = 3;
|
|
19
|
+
let lastError = null;
|
|
20
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
21
|
+
try {
|
|
22
|
+
printLogs(`[FirefoxCameraService] openCamera attempt ${attempt}/${maxAttempts}`, '', 'DEBUG');
|
|
23
|
+
printLogs('[FirefoxCameraService] openCamera props', props, 'DEBUG');
|
|
24
|
+
localStorage.removeItem('defaultDeviceId');
|
|
25
|
+
if (this.isActive()) {
|
|
26
|
+
printLogs('[FirefoxCameraService] Camera is active, closing before reopening', '', 'DEBUG');
|
|
27
|
+
yield this.closeCamera(props.videoElementId);
|
|
28
|
+
}
|
|
29
|
+
this.setVideoElementId(props.videoElementId);
|
|
30
|
+
this.setFaceMode(props.requestFaceMode || CameraFaceMode.front);
|
|
31
|
+
printLogs('[FirefoxCameraService] Requesting camera permission...', '', 'DEBUG');
|
|
32
|
+
const { isGranted } = yield this.permissionsService.requestCameraPermissions();
|
|
33
|
+
printLogs('[FirefoxCameraService] Getting filtered video devices...', '', 'DEBUG');
|
|
34
|
+
let devices = isGranted ? yield getFilteredVideoDevices() : [];
|
|
35
|
+
printLogs(`[FirefoxCameraService] Found ${devices.length} devices`, '', 'DEBUG');
|
|
36
|
+
// Sort devices based on requestFaceMode to bring appropriate cameras first
|
|
37
|
+
// This ensures back cameras appear first for document scan and front cameras for face scan
|
|
38
|
+
if (props.requestFaceMode === CameraFaceMode.back) {
|
|
39
|
+
devices = devices.sort((a, b) => {
|
|
40
|
+
const aIsBack = isBackCameraLabel(a.label) ? 0 : 1;
|
|
41
|
+
const bIsBack = isBackCameraLabel(b.label) ? 0 : 1;
|
|
42
|
+
return aIsBack - bIsBack;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else if (props.requestFaceMode === CameraFaceMode.front) {
|
|
46
|
+
devices = devices.sort((a, b) => {
|
|
47
|
+
const aIsFront = isBackCameraLabel(a.label) ? 1 : 0;
|
|
48
|
+
const bIsFront = isBackCameraLabel(b.label) ? 1 : 0;
|
|
49
|
+
return aIsFront - bIsFront;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
devices.forEach((device, index) => {
|
|
53
|
+
printLogs(`[FirefoxCameraService] Device ${index}: `, device, 'DEBUG');
|
|
54
|
+
});
|
|
55
|
+
if (devices.length === 0) {
|
|
56
|
+
throw new Error('NO_CAMERA');
|
|
57
|
+
}
|
|
58
|
+
printLogs('[FirefoxCameraService] Waiting for camera availability...', '', 'DEBUG');
|
|
59
|
+
const deviceId = handleDeviceId(devices, props.deviceId, false);
|
|
60
|
+
yield BaseCameraService.waitForCameraRelease(deviceId, this.faceMode);
|
|
61
|
+
// Pass faceMode to handleDeviceId to retrieve the correct scoped device ID
|
|
62
|
+
this.setCurrentDeviceId(deviceId);
|
|
63
|
+
printLogs(`[FirefoxCameraService] Using deviceId: `, deviceId, 'DEBUG');
|
|
64
|
+
printLogs('[FirefoxCameraService] Getting media device info...', '', 'DEBUG');
|
|
65
|
+
const mediaDeviceInfo = yield getMediaDeviceInfo(devices, deviceId);
|
|
66
|
+
printLogs('[FirefoxCameraService] Requesting media stream...', '', 'DEBUG');
|
|
67
|
+
const stream = yield getDeviceMediaStream(mediaDeviceInfo.deviceId, 'firefox', {
|
|
68
|
+
canvasResolution: props.canvasResolution,
|
|
69
|
+
});
|
|
70
|
+
printLogs('[FirefoxCameraService] Media stream obtained successfully', '', 'DEBUG');
|
|
71
|
+
printLogs(`[FirefoxCameraService] Stream has ${stream.getVideoTracks().length} video tracks`, '', 'DEBUG');
|
|
72
|
+
printLogs('[FirefoxCameraService] Preparing camera result...', '', 'DEBUG');
|
|
73
|
+
const result = yield this.prepareCameraResult(stream, devices, this.getFaceMode(), props.videoElementId);
|
|
74
|
+
printLogs('[FirefoxCameraService] Camera opened successfully', '', 'DEBUG');
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
lastError = e;
|
|
79
|
+
printLogs(`[FirefoxCameraService] Attempt ${attempt}/${maxAttempts} failed`, '', 'ERROR');
|
|
80
|
+
printLogs(`[FirefoxCameraService] Error name: `, (e === null || e === void 0 ? void 0 : e.name) || 'unknown', 'DEBUG');
|
|
81
|
+
printLogs(`[FirefoxCameraService] Error message: `, (e === null || e === void 0 ? void 0 : e.message) || 'unknown', 'DEBUG');
|
|
82
|
+
const permissionState = yield this.permissionsService.checkCameraPermissions();
|
|
83
|
+
printLogs(`[FirefoxCameraService] Camera permission state`, permissionState, 'ERROR');
|
|
84
|
+
// Enhanced error reporting for common issues
|
|
85
|
+
if ((e === null || e === void 0 ? void 0 : e.name) === 'NotAllowedError') {
|
|
86
|
+
printLogs(`[FirefoxCameraService] Camera permission denied by user`, '', 'ERROR');
|
|
87
|
+
}
|
|
88
|
+
else if ((e === null || e === void 0 ? void 0 : e.name) === 'NotFoundError') {
|
|
89
|
+
printLogs(`[FirefoxCameraService] No camera device found`, '', 'ERROR');
|
|
90
|
+
}
|
|
91
|
+
else if ((e === null || e === void 0 ? void 0 : e.name) === 'NotReadableError') {
|
|
92
|
+
printLogs(`[FirefoxCameraService] Camera is already in use by another app/tab`, '', 'ERROR');
|
|
93
|
+
}
|
|
94
|
+
else if ((e === null || e === void 0 ? void 0 : e.name) === 'OverconstrainedError') {
|
|
95
|
+
printLogs(`[FirefoxCameraService] Camera constraints cannot be satisfied`, '', 'ERROR');
|
|
96
|
+
}
|
|
97
|
+
else if ((e === null || e === void 0 ? void 0 : e.message) === 'NO_TRACK_SETTINGS') {
|
|
98
|
+
printLogs(`[FirefoxCameraService] Failed to get track settings from camera`, '', 'ERROR');
|
|
99
|
+
}
|
|
100
|
+
else if ((e === null || e === void 0 ? void 0 : e.message) === 'NO_VIDEO_TRACKS') {
|
|
101
|
+
printLogs(`[FirefoxCameraService] Stream has no video tracks`, '', 'ERROR');
|
|
102
|
+
}
|
|
103
|
+
printLogs(`[FirefoxCameraService] Error stack: `, (e === null || e === void 0 ? void 0 : e.stack) || 'no stack trace', 'DEBUG');
|
|
104
|
+
// If this is not the last attempt, wait before retrying
|
|
105
|
+
if (attempt < maxAttempts) {
|
|
106
|
+
const retryDelay = attempt * 500; // Progressive delay: 500ms, 1000ms
|
|
107
|
+
printLogs(`[FirefoxCameraService] Retrying in ${retryDelay}ms...`, '', 'DEBUG');
|
|
108
|
+
yield new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
109
|
+
}
|
|
29
110
|
}
|
|
30
|
-
const deviceId = handleDeviceId(devices, props.deviceId);
|
|
31
|
-
this.setCurrentDeviceId(deviceId);
|
|
32
|
-
printLogs(`[FirefoxCameraService] openCamera deviceId: `, deviceId);
|
|
33
|
-
const mediaDeviceInfo = yield getMediaDeviceInfo(devices, deviceId);
|
|
34
|
-
const stream = yield getDeviceMediaStream(mediaDeviceInfo.deviceId, 'firefox', {
|
|
35
|
-
canvasResolution: props.canvasResolution,
|
|
36
|
-
});
|
|
37
|
-
printLogs(`[FirefoxCameraService] openCamera stream: `, stream);
|
|
38
|
-
return this.prepareCameraResult(stream, devices, this.getFaceMode(), props.videoElementId);
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
printLogs(`[FirefoxCameraService] openCamera error: `, error, 'ERROR');
|
|
42
|
-
return null;
|
|
43
111
|
}
|
|
112
|
+
// All attempts failed
|
|
113
|
+
printLogs(`[FirefoxCameraService] All ${maxAttempts} attempts failed`, '', 'ERROR');
|
|
114
|
+
printLogs(`[FirefoxCameraService] Final error: `, lastError, 'ERROR');
|
|
115
|
+
return null;
|
|
44
116
|
});
|
|
45
117
|
}
|
|
46
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirefoxCameraService.js","sourceRoot":"","sources":["../../../../../../src/application/modules/support/camera/services/FirefoxCameraService.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAsC,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"FirefoxCameraService.js","sourceRoot":"","sources":["../../../../../../src/application/modules/support/camera/services/FirefoxCameraService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WasmOrchestrator } from '../../internal/wasm-orchestrator';
|
|
2
2
|
import { Engine } from './engine.domain';
|
|
3
|
-
import { LoadModuleParams, LoadModuleResult, PackageSupportResult } from './engine.types';
|
|
3
|
+
import { LoadModuleParams, LoadModuleResult, PackageSupportResult, WasmInfo, WasmLoadStatus, WasmVersionManifest } from './engine.types';
|
|
4
4
|
export declare class EngineService implements Engine {
|
|
5
5
|
private wasmOrchestratorService;
|
|
6
6
|
private browserOS;
|
|
@@ -12,4 +12,8 @@ export declare class EngineService implements Engine {
|
|
|
12
12
|
freeMemory(): Promise<boolean>;
|
|
13
13
|
encryptData(payload: unknown): Promise<(string | null)[]>;
|
|
14
14
|
checkPackageSupport(): PackageSupportResult;
|
|
15
|
+
getWasmInfo(): Promise<WasmInfo>;
|
|
16
|
+
getLoadStatus(): Promise<WasmLoadStatus | null>;
|
|
17
|
+
getVersionManifest(): Promise<WasmVersionManifest>;
|
|
18
|
+
checkVersionMatch(version: string): Promise<boolean>;
|
|
15
19
|
}
|
|
@@ -102,5 +102,53 @@ export class EngineService {
|
|
|
102
102
|
printLogs('[EngineService] checkPackageSupport result', result);
|
|
103
103
|
return result;
|
|
104
104
|
}
|
|
105
|
+
getWasmInfo() {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
printLogs('[EngineService] getWasmInfo', '');
|
|
108
|
+
try {
|
|
109
|
+
return yield this.wasmOrchestratorService.getWasmInfo();
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
printLogs('[EngineService] getWasmInfo error', error, 'ERROR');
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
getLoadStatus() {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
printLogs('[EngineService] getLoadStatus', '');
|
|
120
|
+
try {
|
|
121
|
+
return yield this.wasmOrchestratorService.getLoadStatus();
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
printLogs('[EngineService] getLoadStatus error', error, 'ERROR');
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
getVersionManifest() {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
printLogs('[EngineService] getVersionManifest', '');
|
|
132
|
+
try {
|
|
133
|
+
return yield this.wasmOrchestratorService.getVersionManifest();
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
printLogs('[EngineService] getVersionManifest error', error, 'ERROR');
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
checkVersionMatch(version) {
|
|
142
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
+
printLogs('[EngineService] checkVersionMatch', version);
|
|
144
|
+
try {
|
|
145
|
+
return yield this.wasmOrchestratorService.checkVersionMatch(version);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
printLogs('[EngineService] checkVersionMatch error', error, 'ERROR');
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
105
153
|
}
|
|
106
154
|
//# sourceMappingURL=EngineService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EngineService.js","sourceRoot":"","sources":["../../../../../src/application/modules/support/engine/EngineService.ts"],"names":[],"mappings":";;;;;;;;;AAAA,gDAAgD;AAChD,iDAAiD;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"EngineService.js","sourceRoot":"","sources":["../../../../../src/application/modules/support/engine/EngineService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LoadModuleParams, LoadModuleResult, PackageSupportResult } from './engine.types';
|
|
1
|
+
import { LoadModuleParams, LoadModuleResult, PackageSupportResult, WasmInfo, WasmLoadStatus, WasmVersionManifest } from './engine.types';
|
|
2
2
|
export interface Engine {
|
|
3
3
|
/**
|
|
4
4
|
* Load the WASM modules with the given options
|
|
@@ -20,4 +20,20 @@ export interface Engine {
|
|
|
20
20
|
* Check if the current browser supports the package
|
|
21
21
|
*/
|
|
22
22
|
checkPackageSupport(): PackageSupportResult;
|
|
23
|
+
/**
|
|
24
|
+
* Get WASM information (version, intercept path, CDN URL)
|
|
25
|
+
*/
|
|
26
|
+
getWasmInfo(): Promise<WasmInfo>;
|
|
27
|
+
/**
|
|
28
|
+
* Get WASM load status
|
|
29
|
+
*/
|
|
30
|
+
getLoadStatus(): Promise<WasmLoadStatus | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Get WASM version manifest with download URLs and checksums for all platforms
|
|
33
|
+
*/
|
|
34
|
+
getVersionManifest(): Promise<WasmVersionManifest>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if provided version matches current WASM version
|
|
37
|
+
*/
|
|
38
|
+
checkVersionMatch(version: string): Promise<boolean>;
|
|
23
39
|
}
|
|
@@ -10,6 +10,10 @@ type ApiUrl = {
|
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
|
+
export type CustomWasmConfig = {
|
|
14
|
+
url: string;
|
|
15
|
+
version: string;
|
|
16
|
+
};
|
|
13
17
|
export type LoadModuleParams = {
|
|
14
18
|
apiUrl: ApiUrl;
|
|
15
19
|
sessionToken: string;
|
|
@@ -20,6 +24,7 @@ export type LoadModuleParams = {
|
|
|
20
24
|
shouldRegenerateSession?: boolean;
|
|
21
25
|
wasmFailureCallback?: (result: any) => void;
|
|
22
26
|
skipSimdCheck?: boolean;
|
|
27
|
+
customWasm?: CustomWasmConfig;
|
|
23
28
|
};
|
|
24
29
|
export type LoadModuleResult = {
|
|
25
30
|
support: boolean;
|
|
@@ -29,4 +34,20 @@ export type PackageSupportResult = {
|
|
|
29
34
|
isSupported: boolean;
|
|
30
35
|
message?: string;
|
|
31
36
|
};
|
|
37
|
+
export type WasmInfo = {
|
|
38
|
+
version: string;
|
|
39
|
+
interceptPath: string;
|
|
40
|
+
cdnUrl: string;
|
|
41
|
+
};
|
|
42
|
+
export type WasmLoadStatus = {
|
|
43
|
+
source: 'custom' | 'custom-fallback' | 'cdn' | 'cache';
|
|
44
|
+
versionMatch: boolean;
|
|
45
|
+
};
|
|
46
|
+
export type WasmVersionManifest = {
|
|
47
|
+
version: string;
|
|
48
|
+
releaseDate: string;
|
|
49
|
+
downloadUrl: string;
|
|
50
|
+
interceptPath: string;
|
|
51
|
+
sha256: string;
|
|
52
|
+
};
|
|
32
53
|
export {};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { EngineService } from './EngineService';
|
|
2
2
|
export { Engine } from './engine.domain';
|
|
3
|
-
export { LoadModuleParams, LoadModuleResult } from './engine.types';
|
|
3
|
+
export { CustomWasmConfig, LoadModuleParams, LoadModuleResult, WasmInfo, WasmLoadStatus, WasmVersionManifest, } from './engine.types';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WasmPrividModules, WasmWorker } from './wasm-worker.domain';
|
|
2
|
-
import { LoadParams, EnrollParams, PredictParams, AgeEstimateParams, CompareEmbeddingsParams, PkiEncryptParams, ScanBackDocumentParams, ScanFrontDocumentParams, DocumentOcrParams, ProxiedCallback, RegularCallback } from './wasm-worker.types';
|
|
2
|
+
import { LoadParams, EnrollParams, PredictParams, AgeEstimateParams, CompareEmbeddingsParams, PkiEncryptParams, ScanBackDocumentParams, ScanFrontDocumentParams, DocumentOcrParams, ProxiedCallback, RegularCallback, LoadModulesResult } from './wasm-worker.types';
|
|
3
3
|
declare global {
|
|
4
4
|
function createTFLiteModule(config: {
|
|
5
5
|
wasmBinary: ArrayBuffer;
|
|
@@ -26,9 +26,20 @@ export declare class WasmWorkerService implements WasmWorker {
|
|
|
26
26
|
private isSimd;
|
|
27
27
|
private moduleInitializationLock;
|
|
28
28
|
private isModuleInitializing;
|
|
29
|
-
|
|
29
|
+
private customWasm;
|
|
30
|
+
private wasmBaseUrl;
|
|
31
|
+
private lastLoadStatus;
|
|
32
|
+
private currentWasmVersion;
|
|
33
|
+
private wasmFolderName;
|
|
34
|
+
private getWasmFolderName;
|
|
35
|
+
loadModules(params: LoadParams, errorCallback: ProxiedCallback, progressCallback?: ProxiedCallback): Promise<LoadModulesResult>;
|
|
30
36
|
private loadModulesInternal;
|
|
31
37
|
private loadFromPackage;
|
|
38
|
+
/**
|
|
39
|
+
* Constructs a local URL for WASM resources.
|
|
40
|
+
* Uses wasmBaseUrl if available (passed from main thread), otherwise falls back to relative path.
|
|
41
|
+
*/
|
|
42
|
+
private getLocalWasmUrl;
|
|
32
43
|
private loadWasmModule;
|
|
33
44
|
private initializeWasmSession;
|
|
34
45
|
ultraEnroll(params: EnrollParams, resultCallback: RegularCallback): Promise<boolean>;
|
|
@@ -12,7 +12,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
12
12
|
/* eslint-disable import/prefer-default-export */
|
|
13
13
|
import { expose } from 'comlink';
|
|
14
14
|
import { printLogs, setDebugType } from '../../modules/internal/shared/shared.utils';
|
|
15
|
-
import { checkCacheAndCurrentAreSameVersion, fetchResource, flatImageDataArraysIntoUint8Array, readCurrentWasmVersion, readFromIndexedDB, removeNullBytesFromDecodedString, writeToIndexedDB, } from './wasm-worker.utils';
|
|
15
|
+
import { checkCacheAndCurrentAreSameVersion, fetchResource, flatImageDataArraysIntoUint8Array, readCurrentWasmVersion, readFromIndexedDB, removeNullBytesFromDecodedString, writeToIndexedDB, validateCustomWasmUrl, } from './wasm-worker.utils';
|
|
16
16
|
import { WASM_ULTRA_FOLDER_NAME } from './wasm-worker.constants';
|
|
17
17
|
const callbackRegistry = {
|
|
18
18
|
result: null,
|
|
@@ -93,30 +93,39 @@ export class WasmWorkerService {
|
|
|
93
93
|
this.isSimd = null;
|
|
94
94
|
this.moduleInitializationLock = null;
|
|
95
95
|
this.isModuleInitializing = false;
|
|
96
|
+
this.customWasm = null;
|
|
97
|
+
this.wasmBaseUrl = null;
|
|
98
|
+
this.lastLoadStatus = null;
|
|
99
|
+
this.currentWasmVersion = null;
|
|
100
|
+
this.wasmFolderName = WASM_ULTRA_FOLDER_NAME;
|
|
101
|
+
}
|
|
102
|
+
getWasmFolderName() {
|
|
103
|
+
return this.wasmFolderName;
|
|
96
104
|
}
|
|
97
105
|
loadModules(params, errorCallback, progressCallback) {
|
|
98
106
|
return __awaiter(this, void 0, void 0, function* () {
|
|
99
107
|
try {
|
|
100
|
-
|
|
108
|
+
// If modules are already loaded and session exists, don't re-initialize!
|
|
109
|
+
// Re-initialization corrupts the WASM state causing _privid_check_models() to return 0
|
|
110
|
+
if (this.wasmPrividModules && this.wasmSession) {
|
|
111
|
+
return { message: 'Already initialized', status: this.lastLoadStatus };
|
|
112
|
+
}
|
|
101
113
|
if (this.moduleInitializationLock) {
|
|
102
114
|
try {
|
|
103
|
-
printLogs('[WasmWorkerService] loadModules waiting for existing initialization to complete', '');
|
|
104
115
|
yield this.moduleInitializationLock;
|
|
105
|
-
return 'Already loaded';
|
|
116
|
+
return { message: 'Already loaded', status: this.lastLoadStatus };
|
|
106
117
|
}
|
|
107
118
|
catch (error) {
|
|
108
|
-
|
|
109
|
-
return 'Retrying initialization';
|
|
119
|
+
return { message: 'Retrying initialization', status: null };
|
|
110
120
|
}
|
|
111
121
|
}
|
|
112
|
-
printLogs('[WasmWorkerService] loadModules starting new initialization', '');
|
|
113
122
|
this.isModuleInitializing = true;
|
|
114
123
|
this.moduleInitializationLock = this.loadModulesInternal(params, errorCallback, progressCallback);
|
|
115
124
|
const result = yield this.moduleInitializationLock;
|
|
116
125
|
return result;
|
|
117
126
|
}
|
|
118
127
|
catch (error) {
|
|
119
|
-
printLogs('[WasmWorkerService] loadModules error
|
|
128
|
+
printLogs('[WasmWorkerService] loadModules error', error, 'ERROR');
|
|
120
129
|
throw error;
|
|
121
130
|
}
|
|
122
131
|
finally {
|
|
@@ -137,6 +146,8 @@ export class WasmWorkerService {
|
|
|
137
146
|
this.useCdnLink = params.useCdn;
|
|
138
147
|
this.setCache = params.cacheConfig;
|
|
139
148
|
this.isSimd = params.simd;
|
|
149
|
+
this.customWasm = params.customWasm || null;
|
|
150
|
+
this.wasmBaseUrl = params.wasmBaseUrl || null;
|
|
140
151
|
// Only set debugType if explicitly provided (legacy support)
|
|
141
152
|
// Note: Debug type is already cached globally from WasmOrchestratorService.initialize()
|
|
142
153
|
if (params.debugType) {
|
|
@@ -144,11 +155,53 @@ export class WasmWorkerService {
|
|
|
144
155
|
// Set debug type onto Web Worker Context
|
|
145
156
|
setDebugType(params.debugType);
|
|
146
157
|
}
|
|
158
|
+
// Store WASM folder name from orchestrator (feature flag resolved on main thread)
|
|
159
|
+
if (params.wasmFolderName) {
|
|
160
|
+
this.wasmFolderName = params.wasmFolderName;
|
|
161
|
+
}
|
|
147
162
|
printLogs('[WasmWorkerService] isLoad params: ', params);
|
|
148
163
|
const modulePath = params.simd ? 'simd' : 'nosimd';
|
|
149
164
|
const moduleName = 'privid_fhe_ultra';
|
|
150
165
|
const cachedModule = yield readFromIndexedDB(WASM_ULTRA_FOLDER_NAME);
|
|
151
|
-
const currentModuleVersionJSON = yield readCurrentWasmVersion(modulePath);
|
|
166
|
+
const currentModuleVersionJSON = yield readCurrentWasmVersion(modulePath, this.wasmBaseUrl, this.getWasmFolderName());
|
|
167
|
+
this.currentWasmVersion = currentModuleVersionJSON.version;
|
|
168
|
+
printLogs('[WasmWorkerService] currentModuleVersionJSON: ', currentModuleVersionJSON.version);
|
|
169
|
+
// If custom WASM config is provided, validate and load with fallback
|
|
170
|
+
if (this.customWasm) {
|
|
171
|
+
printLogs('[WasmWorkerService] Custom WASM detected, validating...', this.customWasm);
|
|
172
|
+
const isValid = yield validateCustomWasmUrl(this.customWasm.url);
|
|
173
|
+
if (isValid) {
|
|
174
|
+
const expectedVersion = currentModuleVersionJSON.version;
|
|
175
|
+
const providedVersion = this.customWasm.version;
|
|
176
|
+
// Check version equality
|
|
177
|
+
if (providedVersion !== expectedVersion) {
|
|
178
|
+
printLogs('[WasmWorkerService] Version mismatch detected, falling back to CDN', { expected: expectedVersion, provided: providedVersion }, 'WARN');
|
|
179
|
+
this.customWasm = null;
|
|
180
|
+
this.lastLoadStatus = { source: 'custom-fallback', versionMatch: false };
|
|
181
|
+
// Continue with normal cache/CDN flow
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
printLogs('[WasmWorkerService] Version match confirmed', { version: providedVersion });
|
|
185
|
+
// Proceed with loading
|
|
186
|
+
printLogs('[WasmWorkerService] Custom WASM URL is valid, loading...', this.customWasm.url);
|
|
187
|
+
yield this.loadFromPackage(currentModuleVersionJSON.version, modulePath, moduleName, params.usageScenario, params.cacheContent);
|
|
188
|
+
// Final verification that WASM is fully initialized
|
|
189
|
+
if (!this.wasmPrividModules || !this.wasmSession) {
|
|
190
|
+
const error = 'WASM modules loaded but session not initialized';
|
|
191
|
+
printLogs(`[WasmWorkerService] ERROR: ${error}`, '', 'ERROR');
|
|
192
|
+
throw new Error(error);
|
|
193
|
+
}
|
|
194
|
+
this.lastLoadStatus = { source: 'custom', versionMatch: true };
|
|
195
|
+
return { message: 'Loaded from custom URL', status: this.lastLoadStatus };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
printLogs('[WasmWorkerService] Custom WASM URL validation failed, falling back to CDN', '', 'WARN');
|
|
200
|
+
this.customWasm = null;
|
|
201
|
+
this.lastLoadStatus = { source: 'custom-fallback', versionMatch: false };
|
|
202
|
+
// Continue with normal cache/CDN flow
|
|
203
|
+
}
|
|
204
|
+
}
|
|
152
205
|
if (checkCacheAndCurrentAreSameVersion(cachedModule, currentModuleVersionJSON)) {
|
|
153
206
|
printLogs('[WasmWorkerService] same version confirmed', '');
|
|
154
207
|
printLogs('[WasmWorkerService] PRIVMODULES LOADED?: ', this.wasmPrividModules);
|
|
@@ -164,7 +217,7 @@ export class WasmWorkerService {
|
|
|
164
217
|
if (typeof createTFLiteModule === 'undefined') {
|
|
165
218
|
printLogs('[WasmWorkerService] createTFLiteModule not defined, falling back to package', '', 'WARN');
|
|
166
219
|
yield this.loadFromPackage(currentModuleVersionJSON.version, modulePath, moduleName, params.usageScenario, params.cacheContent);
|
|
167
|
-
return 'Loaded from package (cache invalid)';
|
|
220
|
+
return { message: 'Loaded from package (cache invalid)', status: this.lastLoadStatus };
|
|
168
221
|
}
|
|
169
222
|
this.wasmPrividModules = yield createTFLiteModule({ wasmBinary: cachedWasm });
|
|
170
223
|
printLogs('[WasmWorkerService] ULTRA MODULES ', this.wasmPrividModules);
|
|
@@ -173,12 +226,15 @@ export class WasmWorkerService {
|
|
|
173
226
|
this.checkWasmLoaded = true;
|
|
174
227
|
}
|
|
175
228
|
printLogs('[WasmWorkerService] WASM MODULES: ', this.wasmPrividModules);
|
|
176
|
-
|
|
229
|
+
if (!this.lastLoadStatus) {
|
|
230
|
+
this.lastLoadStatus = { source: 'cache', versionMatch: true };
|
|
231
|
+
}
|
|
232
|
+
return { message: 'Loaded from cache (wasm and script)', status: this.lastLoadStatus };
|
|
177
233
|
}
|
|
178
234
|
catch (error) {
|
|
179
235
|
printLogs('[WasmWorkerService] Error loading from cache:', error, 'ERROR');
|
|
180
236
|
yield this.loadFromPackage(currentModuleVersionJSON.version, modulePath, moduleName, params.usageScenario, params.cacheContent);
|
|
181
|
-
return 'Loaded from package (cache error)';
|
|
237
|
+
return { message: 'Loaded from package (cache error)', status: this.lastLoadStatus };
|
|
182
238
|
}
|
|
183
239
|
finally {
|
|
184
240
|
// Clean up the blob URL
|
|
@@ -197,7 +253,7 @@ export class WasmWorkerService {
|
|
|
197
253
|
}
|
|
198
254
|
else {
|
|
199
255
|
yield this.loadFromPackage(currentModuleVersionJSON.version, modulePath, moduleName, params.usageScenario, params.cacheContent);
|
|
200
|
-
return 'Loaded';
|
|
256
|
+
return { message: 'Loaded', status: this.lastLoadStatus };
|
|
201
257
|
}
|
|
202
258
|
// Final verification that WASM is fully initialized
|
|
203
259
|
if (!this.wasmPrividModules || !this.wasmSession) {
|
|
@@ -205,7 +261,10 @@ export class WasmWorkerService {
|
|
|
205
261
|
printLogs(`[WasmWorkerService] ERROR: ${error}`, '', 'ERROR');
|
|
206
262
|
throw new Error(error);
|
|
207
263
|
}
|
|
208
|
-
|
|
264
|
+
if (!this.lastLoadStatus) {
|
|
265
|
+
this.lastLoadStatus = { source: 'cache', versionMatch: true };
|
|
266
|
+
}
|
|
267
|
+
return { message: 'Cache Loaded', status: this.lastLoadStatus };
|
|
209
268
|
}
|
|
210
269
|
yield this.loadFromPackage(currentModuleVersionJSON.version, modulePath, moduleName, params.usageScenario, params.cacheContent);
|
|
211
270
|
// Final verification that WASM is fully initialized
|
|
@@ -214,7 +273,10 @@ export class WasmWorkerService {
|
|
|
214
273
|
printLogs(`[WasmWorkerService] ERROR: ${error}`, '', 'ERROR');
|
|
215
274
|
throw new Error(error);
|
|
216
275
|
}
|
|
217
|
-
|
|
276
|
+
if (!this.lastLoadStatus) {
|
|
277
|
+
this.lastLoadStatus = { source: 'cdn', versionMatch: true };
|
|
278
|
+
}
|
|
279
|
+
return { message: 'Loaded', status: this.lastLoadStatus };
|
|
218
280
|
});
|
|
219
281
|
}
|
|
220
282
|
loadFromPackage(wasmVersion, modulePath, moduleName, usageScenario, cache_content) {
|
|
@@ -228,15 +290,62 @@ export class WasmWorkerService {
|
|
|
228
290
|
return true;
|
|
229
291
|
});
|
|
230
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* Constructs a local URL for WASM resources.
|
|
295
|
+
* Uses wasmBaseUrl if available (passed from main thread), otherwise falls back to relative path.
|
|
296
|
+
*/
|
|
297
|
+
getLocalWasmUrl(relativePath) {
|
|
298
|
+
if (this.wasmBaseUrl) {
|
|
299
|
+
return `${this.wasmBaseUrl}/wasm/${relativePath}`;
|
|
300
|
+
}
|
|
301
|
+
return `../wasm/${relativePath}`;
|
|
302
|
+
}
|
|
231
303
|
loadWasmModule(modulePath, moduleName, saveCache, version) {
|
|
232
304
|
return __awaiter(this, void 0, void 0, function* () {
|
|
305
|
+
// If custom WASM config is provided (e.g., from iOS WebView), use it directly
|
|
306
|
+
if (this.customWasm) {
|
|
307
|
+
printLogs('[WasmWorkerService] Using custom WASM URL:', this.customWasm.url);
|
|
308
|
+
// For custom URLs, we still need the JS file from the normal location
|
|
309
|
+
const scriptUrls = {
|
|
310
|
+
cdn: `${this.cdnUrl}/${WASM_ULTRA_FOLDER_NAME}/${modulePath}/${version}/${moduleName}.js`,
|
|
311
|
+
local: this.getLocalWasmUrl(`${this.getWasmFolderName()}/${modulePath}/${version}/${moduleName}.js`),
|
|
312
|
+
};
|
|
313
|
+
const wasm = yield fetch(this.customWasm.url);
|
|
314
|
+
if (!wasm.ok) {
|
|
315
|
+
throw new Error(`Failed to fetch custom WASM from ${this.customWasm.url}: ${wasm.status}`);
|
|
316
|
+
}
|
|
317
|
+
const script = yield fetchResource(scriptUrls, this.useCdnLink);
|
|
318
|
+
const scriptBuffer = yield script.text();
|
|
319
|
+
const buffer = yield wasm.arrayBuffer();
|
|
320
|
+
printLogs(`[WasmWorkerService] loadWasmModule script and buffer from custom URL': `, { scriptBuffer, buffer });
|
|
321
|
+
const blob = new Blob([scriptBuffer], { type: 'application/javascript' });
|
|
322
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
323
|
+
try {
|
|
324
|
+
importScripts(blobUrl);
|
|
325
|
+
if (typeof createTFLiteModule === 'undefined') {
|
|
326
|
+
throw new Error('createTFLiteModule not defined after loading script');
|
|
327
|
+
}
|
|
328
|
+
const module = yield createTFLiteModule({ wasmBinary: buffer });
|
|
329
|
+
printLogs('[WasmWorkerService] loadWasmModule module from custom URL: ', module);
|
|
330
|
+
// Note: We don't cache when using custom URLs as they're iOS-specific
|
|
331
|
+
return module;
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
printLogs('[WasmWorkerService] Error loading WASM module from custom URL:', error, 'ERROR');
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
URL.revokeObjectURL(blobUrl);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Standard loading path (CDN or local)
|
|
233
342
|
const wasmUrls = {
|
|
234
343
|
cdn: `${this.cdnUrl}/${WASM_ULTRA_FOLDER_NAME}/${modulePath}/${version}/${moduleName}.wasm`,
|
|
235
|
-
local:
|
|
344
|
+
local: this.getLocalWasmUrl(`${this.getWasmFolderName()}/${modulePath}/${version}/${moduleName}.wasm`),
|
|
236
345
|
};
|
|
237
346
|
const scriptUrls = {
|
|
238
347
|
cdn: `${this.cdnUrl}/${WASM_ULTRA_FOLDER_NAME}/${modulePath}/${version}/${moduleName}.js`,
|
|
239
|
-
local:
|
|
348
|
+
local: this.getLocalWasmUrl(`${this.getWasmFolderName()}/${modulePath}/${version}/${moduleName}.js`),
|
|
240
349
|
};
|
|
241
350
|
const wasm = yield fetchResource(wasmUrls, this.useCdnLink);
|
|
242
351
|
const script = yield fetchResource(scriptUrls, this.useCdnLink);
|
|
@@ -746,12 +855,10 @@ export class WasmWorkerService {
|
|
|
746
855
|
return __awaiter(this, void 0, void 0, function* () {
|
|
747
856
|
// Wait if initialization is already in progress
|
|
748
857
|
if (this.isModuleInitializing && this.moduleInitializationLock) {
|
|
749
|
-
printLogs('[WasmWorkerService] Waiting for ongoing module initialization...', '', 'INFO');
|
|
750
858
|
try {
|
|
751
859
|
yield this.moduleInitializationLock;
|
|
752
860
|
}
|
|
753
861
|
catch (error) {
|
|
754
|
-
printLogs('[WasmWorkerService] Module initialization failed', error, 'ERROR');
|
|
755
862
|
return false;
|
|
756
863
|
}
|
|
757
864
|
}
|
|
@@ -774,7 +881,6 @@ export class WasmWorkerService {
|
|
|
774
881
|
}, this.proxiedErrorCallback);
|
|
775
882
|
}
|
|
776
883
|
catch (error) {
|
|
777
|
-
printLogs('[WasmWorkerService] ensureModulesInitialized: loadModules failed', error, 'ERROR');
|
|
778
884
|
return false;
|
|
779
885
|
}
|
|
780
886
|
}
|