@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.
Files changed (50) hide show
  1. package/dist/application/modules/core/face/FaceService.js +10 -2
  2. package/dist/application/modules/core/face/FaceService.js.map +1 -1
  3. package/dist/application/modules/internal/feature-flag/feature-flag.domain.d.ts +1 -0
  4. package/dist/application/modules/internal/feature-flag/feature-flag.domain.js +1 -0
  5. package/dist/application/modules/internal/feature-flag/feature-flag.domain.js.map +1 -1
  6. package/dist/application/modules/internal/shared/shared.utils.js +3 -0
  7. package/dist/application/modules/internal/shared/shared.utils.js.map +1 -1
  8. package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.d.ts +11 -1
  9. package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.js +148 -2
  10. package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.js.map +1 -1
  11. package/dist/application/modules/internal/wasm-orchestrator/wasm-orchestrator.domain.d.ts +18 -2
  12. package/dist/application/modules/internal/wasm-orchestrator/wasm-orchestrator.types.d.ts +21 -0
  13. package/dist/application/modules/support/camera/services/DesktopCameraService.js +21 -3
  14. package/dist/application/modules/support/camera/services/DesktopCameraService.js.map +1 -1
  15. package/dist/application/modules/support/camera/services/FirefoxCameraService.js +97 -25
  16. package/dist/application/modules/support/camera/services/FirefoxCameraService.js.map +1 -1
  17. package/dist/application/modules/support/engine/EngineService.d.ts +5 -1
  18. package/dist/application/modules/support/engine/EngineService.js +48 -0
  19. package/dist/application/modules/support/engine/EngineService.js.map +1 -1
  20. package/dist/application/modules/support/engine/engine.domain.d.ts +17 -1
  21. package/dist/application/modules/support/engine/engine.types.d.ts +21 -0
  22. package/dist/application/modules/support/engine/index.d.ts +1 -1
  23. package/dist/application/workers/wasm/WasmWorkerService.d.ts +13 -2
  24. package/dist/application/workers/wasm/WasmWorkerService.js +126 -20
  25. package/dist/application/workers/wasm/WasmWorkerService.js.map +1 -1
  26. package/dist/application/workers/wasm/wasm-worker.domain.d.ts +5 -3
  27. package/dist/application/workers/wasm/wasm-worker.types.d.ts +27 -0
  28. package/dist/application/workers/wasm/wasm-worker.utils.d.ts +2 -1
  29. package/dist/application/workers/wasm/wasm-worker.utils.js +36 -11
  30. package/dist/application/workers/wasm/wasm-worker.utils.js.map +1 -1
  31. package/dist/main.d.ts +6 -1
  32. package/dist/main.js +12 -0
  33. package/dist/main.js.map +1 -1
  34. package/package.json +4 -2
  35. package/wasm/ultra/manifest.json +23 -0
  36. package/wasm/ultra/nosimd/26.02.13-24c4552-prod/privid_fhe_ultra.js +18 -0
  37. package/wasm/ultra/nosimd/26.02.13-24c4552-prod/privid_fhe_ultra.wasm +0 -0
  38. package/wasm/ultra/nosimd/version.json +1 -1
  39. package/wasm/ultra/simd/26.02.13-24c4552-prod/privid_fhe_ultra.js +18 -0
  40. package/wasm/ultra/simd/26.02.13-24c4552-prod/privid_fhe_ultra.wasm +0 -0
  41. package/wasm/ultra/simd/version.json +1 -1
  42. package/wasm/{ultra/nosimd/26.01.19-10e9421 → ultra-dev/nosimd/26.02.13-24c4552-dev}/privid_fhe_ultra.js +1 -1
  43. package/wasm/{ultra/nosimd/26.01.19-10e9421 → ultra-dev/nosimd/26.02.13-24c4552-dev}/privid_fhe_ultra.wasm +0 -0
  44. package/wasm/ultra-dev/nosimd/version.json +3 -0
  45. package/wasm/{ultra/simd/26.01.19-10e9421 → ultra-dev/simd/26.02.13-24c4552-dev}/privid_fhe_ultra.js +1 -1
  46. package/wasm/{ultra/simd/26.01.19-10e9421 → ultra-dev/simd/26.02.13-24c4552-dev}/privid_fhe_ultra.wasm +0 -0
  47. package/wasm/ultra-dev/simd/version.json +3 -0
  48. package/workers/wasm-new.worker.js +1 -1
  49. package/workers/wasm-new.worker.js.map +3 -3
  50. 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
- printLogs('[FirefoxCameraService] openCamera props', props);
19
- try {
20
- this.setVideoElementId(props.videoElementId);
21
- this.setFaceMode(props.requestFaceMode || CameraFaceMode.front);
22
- const { isGranted } = yield this.permissionsService.requestCameraPermissions();
23
- const devices = isGranted ? yield getFilteredVideoDevices() : [];
24
- devices.forEach((device, index) => {
25
- printLogs(`[FirefoxCameraService] openCamera device ${index}: `, device);
26
- });
27
- if (devices.length === 0) {
28
- throw new Error('NO_CAMERA');
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,EAAE,uBAAuB,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEpH,MAAM,OAAO,oBAAqB,SAAQ,iBAAiB;IAC5C,UAAU,CAAC,KAAuB;;YAC7C,SAAS,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAE5D,IAAI;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC7C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;gBAEhE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;gBAC/E,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEjE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAChC,SAAS,CAAC,4CAA4C,KAAK,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC3E,CAAC,CAAC,CAAC;gBAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;oBACxB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;iBAC9B;gBAED,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAClC,SAAS,CAAC,8CAA8C,EAAE,QAAQ,CAAC,CAAC;gBAEpE,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACpE,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE;oBAC7E,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;iBACzC,CAAC,CAAC;gBACH,SAAS,CAAC,4CAA4C,EAAE,MAAM,CAAC,CAAC;gBAEhE,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;aAC5F;YAAC,OAAO,KAAK,EAAE;gBACd,SAAS,CAAC,2CAA2C,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACvE,OAAO,IAAI,CAAC;aACb;QACH,CAAC;KAAA;CACF"}
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;AAI/D,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,MAAM,OAAO,aAAa;IAMxB,YAAY,uBAAyC;QACnD,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;QACvD,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAEK,UAAU,CAAC,MAAwB;;YACvC,SAAS,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;YAEvD,MAAM,aAAa,GAAG,yBAAyB,EAAE,CAAC;YAClD,SAAS,CAAC,0CAA0C,EAAE,aAAa,CAAC,CAAC;YACrE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;gBAC1B,OAAO,aAAa,CAAC;aACtB;YAED,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAChD,IAAI;gBACF,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,iCAC/C,MAAM,KACT,YAAY,IACZ,CAAC;aACJ;YAAC,OAAO,KAAK,EAAE;gBACd,SAAS,CAAC,kCAAkC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;aACnD;QACH,CAAC;KAAA;IAEK,oBAAoB;;YACxB,IAAI;gBACF,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,CAAC;aACjE;YAAC,OAAO,KAAK,EAAE;gBACd,SAAS,CAAC,4CAA4C,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACxE,OAAO,KAAK,CAAC;aACd;QACH,CAAC;KAAA;IAEK,UAAU;;YACd,SAAS,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;YAE5C,IAAI;gBACF,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC;aAC5D;YAAC,OAAO,KAAK,EAAE;gBACd,SAAS,CAAC,kCAAkC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC9D,OAAO,KAAK,CAAC;aACd;QACH,CAAC;KAAA;IAEK,WAAW,CAAC,OAAgB;;;YAChC,SAAS,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;YAE1D,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACtE,SAAS,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC;gBACxD,OAAO,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,0CAAE,OAAO,CAAC;aAC1C;YAAC,OAAO,KAAK,EAAE;gBACd,SAAS,CAAC,mCAAmC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;aACb;;KACF;IAED,mBAAmB;QACjB,SAAS,CAAC,qCAAqC,EAAE;YAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG;YACX,WAAW,EAAE,KAAK;SACnB,CAAC;QAEF,QAAQ,IAAI,CAAC,SAAS,EAAE;YACtB,KAAK,QAAQ;gBACX,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAClE,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAChE,MAAM;YACR,KAAK,YAAY,CAAC;YAClB,KAAK,SAAS;gBACZ,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACpE,MAAM;YACR;gBACE,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;SAC3E;QAED,SAAS,CAAC,4CAA4C,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
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
- loadModules(params: LoadParams, errorCallback: ProxiedCallback, progressCallback?: ProxiedCallback): Promise<string>;
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
- printLogs('[WasmWorkerService] loadModules called with params:', params);
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
- printLogs('[WasmWorkerService] Previous initialization failed, retrying...', error, 'WARN');
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 during initialization:', error, '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
- return 'Loaded from cache (wasm and script)';
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
- return 'Cache Loaded';
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
- return 'Loaded';
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: `../wasm/${WASM_ULTRA_FOLDER_NAME}/${modulePath}/${version}/${moduleName}.wasm`,
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: `../wasm/${WASM_ULTRA_FOLDER_NAME}/${modulePath}/${version}/${moduleName}.js`,
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
  }