@privateid/ultrapass-web-sdk 2.0.0 → 2.1.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/index.js +6 -1
- package/dist/application/index.js.map +1 -1
- package/dist/application/modules/core/document/DocumentService.d.ts +1 -0
- package/dist/application/modules/core/document/DocumentService.js +46 -12
- package/dist/application/modules/core/document/DocumentService.js.map +1 -1
- package/dist/application/modules/core/face/FaceService.d.ts +1 -0
- package/dist/application/modules/core/face/FaceService.js +39 -2
- package/dist/application/modules/core/face/FaceService.js.map +1 -1
- package/dist/application/modules/core/face/face.types.d.ts +1 -0
- package/dist/application/modules/internal/shared/shared.utils.d.ts +1 -0
- package/dist/application/modules/internal/shared/shared.utils.js +12 -2
- package/dist/application/modules/internal/shared/shared.utils.js.map +1 -1
- package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.d.ts +1 -1
- package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.js +3 -3
- package/dist/application/modules/internal/wasm-orchestrator/WasmOrchestratorService.js.map +1 -1
- package/dist/application/modules/internal/wasm-orchestrator/wasm-orchestrator.utils.js +5 -1
- package/dist/application/modules/internal/wasm-orchestrator/wasm-orchestrator.utils.js.map +1 -1
- package/dist/application/modules/support/camera/camera.domain.d.ts +2 -1
- package/dist/application/modules/support/camera/camera.types.d.ts +10 -0
- package/dist/application/modules/support/camera/camera.utils.d.ts +1 -2
- package/dist/application/modules/support/camera/camera.utils.js +1 -10
- package/dist/application/modules/support/camera/camera.utils.js.map +1 -1
- package/dist/application/modules/support/camera/index.d.ts +2 -1
- package/dist/application/modules/support/camera/index.js +2 -0
- package/dist/application/modules/support/camera/index.js.map +1 -1
- package/dist/application/modules/support/camera/services/BaseCameraService.d.ts +5 -5
- package/dist/application/modules/support/camera/services/BaseCameraService.js +15 -13
- package/dist/application/modules/support/camera/services/BaseCameraService.js.map +1 -1
- package/dist/application/modules/support/camera/services/VideoIntegrityMonitor.d.ts +51 -0
- package/dist/application/modules/support/camera/services/VideoIntegrityMonitor.js +246 -0
- package/dist/application/modules/support/camera/services/VideoIntegrityMonitor.js.map +1 -0
- package/dist/application/modules/support/engine/EngineService.js +5 -4
- package/dist/application/modules/support/engine/EngineService.js.map +1 -1
- package/dist/application/modules/support/engine/engine.constants.d.ts +1 -0
- package/dist/application/modules/support/engine/engine.constants.js +1 -0
- package/dist/application/modules/support/engine/engine.constants.js.map +1 -1
- package/dist/application/modules/support/engine/engine.utils.js +13 -2
- package/dist/application/modules/support/engine/engine.utils.js.map +1 -1
- package/dist/application/workers/wasm/WasmWorkerService.d.ts +2 -2
- package/dist/application/workers/wasm/WasmWorkerService.js +15 -7
- package/dist/application/workers/wasm/WasmWorkerService.js.map +1 -1
- package/dist/application/workers/wasm/wasm-worker.domain.d.ts +2 -2
- package/dist/application/workers/wasm/wasm-worker.utils.js +7 -3
- package/dist/application/workers/wasm/wasm-worker.utils.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/wasm/ultra/manifest.json +15 -15
- package/wasm/ultra/nosimd/26.03.17-71cdf0e-prod/privid_fhe_ultra.js +18 -0
- package/wasm/{ultra-dev/nosimd/26.02.13-24c4552-dev → ultra/nosimd/26.03.17-71cdf0e-prod}/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra/nosimd/version.json +1 -1
- package/wasm/ultra/simd/26.03.17-71cdf0e-prod/privid_fhe_ultra.js +18 -0
- package/wasm/{ultra-dev/simd/26.02.13-24c4552-dev → ultra/simd/26.03.17-71cdf0e-prod}/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra/simd/version.json +1 -1
- package/wasm/ultra-dev/nosimd/26.03.17-71cdf0e-dev/privid_fhe_ultra.js +18 -0
- package/wasm/{ultra/nosimd/26.02.13-24c4552-prod → ultra-dev/nosimd/26.03.17-71cdf0e-dev}/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra-dev/nosimd/version.json +1 -1
- package/wasm/ultra-dev/simd/26.03.17-71cdf0e-dev/privid_fhe_ultra.js +18 -0
- package/wasm/{ultra/simd/26.02.13-24c4552-prod → ultra-dev/simd/26.03.17-71cdf0e-dev}/privid_fhe_ultra.wasm +0 -0
- package/wasm/ultra-dev/simd/version.json +1 -1
- package/workers/wasm-new.worker.js +1 -1
- package/workers/wasm-new.worker.js.map +3 -3
- package/wasm/ultra/nosimd/26.02.13-24c4552-prod/privid_fhe_ultra.js +0 -18
- package/wasm/ultra/simd/26.02.13-24c4552-prod/privid_fhe_ultra.js +0 -18
- package/wasm/ultra-dev/nosimd/26.02.13-24c4552-dev/privid_fhe_ultra.js +0 -18
- package/wasm/ultra-dev/simd/26.02.13-24c4552-dev/privid_fhe_ultra.js +0 -18
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/comlink/src/comlink.ts", "../src/application/modules/internal/feature-flag/feature-flag.domain.ts", "../src/application/modules/internal/shared/shared.utils.ts", "../src/application/workers/wasm/wasm-worker.constants.ts", "../src/application/workers/wasm/wasm-worker.utils.ts", "../src/application/workers/wasm/WasmWorkerService.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType,\n} from \"./protocol\";\nexport type { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nexport const finalizer = Symbol(\"Comlink.finalizer\");\n\nconst throwMarker = Symbol(\"Comlink.thrown\");\n\n/**\n * Interface of values that were marked to be proxied with `comlink.proxy()`.\n * Can also be implemented by classes.\n */\nexport interface ProxyMarked {\n [proxyMarker]: true;\n}\n\n/**\n * Takes a type and wraps it in a Promise, if it not already is one.\n * This is to avoid `Promise<Promise<T>>`.\n *\n * This is the inverse of `Unpromisify<T>`.\n */\ntype Promisify<T> = T extends Promise<unknown> ? T : Promise<T>;\n/**\n * Takes a type that may be Promise and unwraps the Promise type.\n * If `P` is not a Promise, it returns `P`.\n *\n * This is the inverse of `Promisify<T>`.\n */\ntype Unpromisify<P> = P extends Promise<infer T> ? T : P;\n\n/**\n * Takes the raw type of a remote property and returns the type that is visible to the local thread on the proxy.\n *\n * Note: This needs to be its own type alias, otherwise it will not distribute over unions.\n * See https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types\n */\ntype RemoteProperty<T> =\n // If the value is a method, comlink will proxy it automatically.\n // Objects are only proxied if they are marked to be proxied.\n // Otherwise, the property is converted to a Promise that resolves the cloned value.\n T extends Function | ProxyMarked ? Remote<T> : Promisify<T>;\n\n/**\n * Takes the raw type of a property as a remote thread would see it through a proxy (e.g. when passed in as a function\n * argument) and returns the type that the local thread has to supply.\n *\n * This is the inverse of `RemoteProperty<T>`.\n *\n * Note: This needs to be its own type alias, otherwise it will not distribute over unions. See\n * https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types\n */\ntype LocalProperty<T> = T extends Function | ProxyMarked\n ? Local<T>\n : Unpromisify<T>;\n\n/**\n * Proxies `T` if it is a `ProxyMarked`, clones it otherwise (as handled by structured cloning and transfer handlers).\n */\nexport type ProxyOrClone<T> = T extends ProxyMarked ? Remote<T> : T;\n/**\n * Inverse of `ProxyOrClone<T>`.\n */\nexport type UnproxyOrClone<T> = T extends RemoteObject<ProxyMarked>\n ? Local<T>\n : T;\n\n/**\n * Takes the raw type of a remote object in the other thread and returns the type as it is visible to the local thread\n * when proxied with `Comlink.proxy()`.\n *\n * This does not handle call signatures, which is handled by the more general `Remote<T>` type.\n *\n * @template T The raw type of a remote object as seen in the other thread.\n */\nexport type RemoteObject<T> = { [P in keyof T]: RemoteProperty<T[P]> };\n/**\n * Takes the type of an object as a remote thread would see it through a proxy (e.g. when passed in as a function\n * argument) and returns the type that the local thread has to supply.\n *\n * This does not handle call signatures, which is handled by the more general `Local<T>` type.\n *\n * This is the inverse of `RemoteObject<T>`.\n *\n * @template T The type of a proxied object.\n */\nexport type LocalObject<T> = { [P in keyof T]: LocalProperty<T[P]> };\n\n/**\n * Additional special comlink methods available on each proxy returned by `Comlink.wrap()`.\n */\nexport interface ProxyMethods {\n [createEndpoint]: () => Promise<MessagePort>;\n [releaseProxy]: () => void;\n}\n\n/**\n * Takes the raw type of a remote object, function or class in the other thread and returns the type as it is visible to\n * the local thread from the proxy return value of `Comlink.wrap()` or `Comlink.proxy()`.\n */\nexport type Remote<T> =\n // Handle properties\n RemoteObject<T> &\n // Handle call signature (if present)\n (T extends (...args: infer TArguments) => infer TReturn\n ? (\n ...args: { [I in keyof TArguments]: UnproxyOrClone<TArguments[I]> }\n ) => Promisify<ProxyOrClone<Unpromisify<TReturn>>>\n : unknown) &\n // Handle construct signature (if present)\n // The return of construct signatures is always proxied (whether marked or not)\n (T extends { new (...args: infer TArguments): infer TInstance }\n ? {\n new (\n ...args: {\n [I in keyof TArguments]: UnproxyOrClone<TArguments[I]>;\n }\n ): Promisify<Remote<TInstance>>;\n }\n : unknown) &\n // Include additional special comlink methods available on the proxy.\n ProxyMethods;\n\n/**\n * Expresses that a type can be either a sync or async.\n */\ntype MaybePromise<T> = Promise<T> | T;\n\n/**\n * Takes the raw type of a remote object, function or class as a remote thread would see it through a proxy (e.g. when\n * passed in as a function argument) and returns the type the local thread has to supply.\n *\n * This is the inverse of `Remote<T>`. It takes a `Remote<T>` and returns its original input `T`.\n */\nexport type Local<T> =\n // Omit the special proxy methods (they don't need to be supplied, comlink adds them)\n Omit<LocalObject<T>, keyof ProxyMethods> &\n // Handle call signatures (if present)\n (T extends (...args: infer TArguments) => infer TReturn\n ? (\n ...args: { [I in keyof TArguments]: ProxyOrClone<TArguments[I]> }\n ) => // The raw function could either be sync or async, but is always proxied automatically\n MaybePromise<UnproxyOrClone<Unpromisify<TReturn>>>\n : unknown) &\n // Handle construct signature (if present)\n // The return of construct signatures is always proxied (whether marked or not)\n (T extends { new (...args: infer TArguments): infer TInstance }\n ? {\n new (\n ...args: {\n [I in keyof TArguments]: ProxyOrClone<TArguments[I]>;\n }\n ): // The raw constructor could either be sync or async, but is always proxied automatically\n MaybePromise<Local<Unpromisify<TInstance>>>;\n }\n : unknown);\n\nconst isObject = (val: unknown): val is object =>\n (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n\n/**\n * Customizes the serialization of certain values as determined by `canHandle()`.\n *\n * @template T The input type being handled by this transfer handler.\n * @template S The serialized type sent over the wire.\n */\nexport interface TransferHandler<T, S> {\n /**\n * Gets called for every value to determine whether this transfer handler\n * should serialize the value, which includes checking that it is of the right\n * type (but can perform checks beyond that as well).\n */\n canHandle(value: unknown): value is T;\n\n /**\n * Gets called with the value if `canHandle()` returned `true` to produce a\n * value that can be sent in a message, consisting of structured-cloneable\n * values and/or transferrable objects.\n */\n serialize(value: T): [S, Transferable[]];\n\n /**\n * Gets called to deserialize an incoming value that was serialized in the\n * other thread with this transfer handler (known through the name it was\n * registered under).\n */\n deserialize(value: S): T;\n}\n\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler: TransferHandler<object, MessagePort> = {\n canHandle: (val): val is ProxyMarked =>\n isObject(val) && (val as ProxyMarked)[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n\ninterface ThrownValue {\n [throwMarker]: unknown; // just needs to be present\n value: unknown;\n}\ntype SerializedThrownValue =\n | { isError: true; value: Error }\n | { isError: false; value: unknown };\ntype PendingListenersMap = Map<\n string,\n (value: WireValue | PromiseLike<WireValue>) => void\n>;\n\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler: TransferHandler<\n ThrownValue,\n SerializedThrownValue\n> = {\n canHandle: (value): value is ThrownValue =>\n isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized: SerializedThrownValue;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n } else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(\n new Error(serialized.value.message),\n serialized.value\n );\n }\n throw serialized.value;\n },\n};\n\n/**\n * Allows customizing the serialization of certain values.\n */\nexport const transferHandlers = new Map<\n string,\n TransferHandler<unknown, unknown>\n>([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\n\nfunction isAllowedOrigin(\n allowedOrigins: (string | RegExp)[],\n origin: string\n): boolean {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\n\nexport function expose(\n obj: any,\n ep: Endpoint = globalThis as any,\n allowedOrigins: (string | RegExp)[] = [\"*\"]\n) {\n ep.addEventListener(\"message\", function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message),\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n } catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback as any);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage({ ...wireValue, id }, transferables);\n });\n } as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nfunction isMessagePort(endpoint: Endpoint): endpoint is MessagePort {\n return endpoint.constructor.name === \"MessagePort\";\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n if (isMessagePort(endpoint)) endpoint.close();\n}\n\nexport function wrap<T>(ep: Endpoint, target?: any): Remote<T> {\n const pendingListeners : PendingListenersMap = new Map();\n\n ep.addEventListener(\"message\", function handleMessage(ev: Event) {\n const { data } = ev as MessageEvent;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n\n try {\n resolver(data);\n } finally {\n pendingListeners.delete(data.id);\n }\n });\n\n return createProxy<T>(ep, pendingListeners, [], target) as any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction releaseEndpoint(ep: Endpoint) {\n return requestResponseMessage(ep, new Map(), {\n type: MessageType.RELEASE,\n }).then(() => {\n closeEndPoint(ep);\n });\n}\n\ninterface FinalizationRegistry<T> {\n new (cb: (heldValue: T) => void): FinalizationRegistry<T>;\n register(\n weakItem: object,\n heldValue: T,\n unregisterToken?: object | undefined\n ): void;\n unregister(unregisterToken: object): void;\n}\ndeclare var FinalizationRegistry: FinalizationRegistry<Endpoint>;\n\nconst proxyCounter = new WeakMap<Endpoint, number>();\nconst proxyFinalizers =\n \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep: Endpoint) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n\nfunction registerProxy(proxy: object, ep: Endpoint) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n}\n\nfunction unregisterProxy(proxy: object) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n pendingListeners: PendingListenersMap,\n path: (string | number | symbol)[] = [],\n target: object = function () {}\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: MessageType.GET,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n pendingListeners,\n {\n type: MessageType.SET,\n path: [...path, prop].map((p) => p.toString()),\n value,\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: MessageType.ENDPOINT,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n pendingListeners,\n {\n type: MessageType.APPLY,\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n pendingListeners,\n {\n type: MessageType.CONSTRUCT,\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables\n ).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer<T>(obj: T, transfers: Transferable[]): T {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T extends {}>(obj: T): T & ProxyMarked {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = globalThis,\n targetOrigin = \"*\"\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n pendingListeners: PendingListenersMap,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n});\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n", "export interface FeatureFlagProvider {\n evaluateFlag<T = boolean>(flagKey: string, defaultValue?: T): T;\n}\n\nexport const FeatureFlagKey = {\n FaceServiceWebWorker: 'face-service-web-worker',\n DocumentServiceWebWorker: 'document-service-web-worker',\n EngineServiceWebWorker: 'engine-service-web-worker',\n DebugType: 'debug-type',\n WasmBuildType: 'sdk-wasm-build',\n} as const;\n\nexport type FeatureFlagKeyType = (typeof FeatureFlagKey)[keyof typeof FeatureFlagKey];\n", "import { detect } from 'detect-browser';\nimport { simd } from 'wasm-feature-detect';\nimport { DEBUG_TYPES_WITH_IMAGES } from '../../core/document/document.constants';\nimport { FeatureFlagKey, LDFeatureFlagService } from '../feature-flag';\n\n// Singleton instance for feature flag service\nlet featureFlagServiceInstance: LDFeatureFlagService | null = null;\n\n// Cached debug type for worker contexts where window is not available\nlet cachedDebugType: string | null = null;\n\n/**\n Saving the feature flag service instance for shared utilities\n */\nexport function setFeatureFlagService(service: LDFeatureFlagService): void {\n featureFlagServiceInstance = service;\n}\n\n/**\n * Set debug type for contexts where window.location is not available (e.g., Web Workers)\n */\nexport function setDebugType(debugType: string): void {\n cachedDebugType = debugType;\n}\n\nexport function iOS(): boolean {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform,\n );\n}\n\nexport function getDebugType(): string {\n // If debug type is cached (worker context), use it\n if (cachedDebugType !== null) {\n return cachedDebugType;\n }\n\n // Main thread logic with window access protection\n try {\n const queryParams = new URLSearchParams(window.location.search);\n const searchedParameterResult = queryParams.get('debug_type');\n\n if (searchedParameterResult) {\n return searchedParameterResult;\n }\n\n const environment = getEnvironment();\n if (environment !== 'prod') {\n return '3';\n }\n\n const debugTypeFromFlag = featureFlagServiceInstance?.evaluateFlag(FeatureFlagKey.DebugType);\n return debugTypeFromFlag?.toString() || '0';\n } catch (error) {\n // Worker context or other error - return safe default\n printLogs('[shared.utils] getDebugType error', error);\n return '0';\n }\n}\n/**\n * Parses a WASM response string and logs the operation details.\n * Returns the parsed object, or null if the response string is empty or malformed.\n */\nexport function parseWasmResponse<T = any>(\n responseStr: string,\n operation: string,\n id: string,\n logPrefix?: string,\n): T | null {\n const isResponse = responseStr.length > 0;\n\n let parsed: T | null = null;\n if (isResponse) {\n try {\n parsed = JSON.parse(responseStr);\n } catch (error) {\n printLogs(`[shared.utils][JS RESPONSE]: Failed to parse WASM response JSON: `, error);\n return null;\n }\n }\n\n printLogs(`[shared.utils][JS RESPONSE]:${logPrefix ? ` ${logPrefix}` : ''} response_str': `, parsed ?? '');\n printLogs(`[shared.utils][JS RESPONSE]: operation': `, operation || 'null');\n printLogs(`[shared.utils][JS RESPONSE]: id: `, id || 'null');\n return parsed as T | null;\n}\n\nexport function printLogs(message: string, data: any, type = 'LOG') {\n const errorLogs = ['1', '2', '3', '901', '902', '903'];\n const warningLogs = ['2', '3', '902', '903'];\n const allLogs = ['3', '903', '904'];\n\n const debugType = getDebugType();\n\n if (type === 'ERROR' && errorLogs.includes(debugType)) {\n console.error('DEBUG_SDK', message, data);\n } else if (type === 'WARN' && warningLogs.includes(debugType)) {\n console.warn('DEBUG_SDK', message, data);\n } else if (type === 'DEBUG' && allLogs.includes(debugType)) {\n console.log('DEBUG_SDK', message, data);\n } else if (type === 'LOG' && allLogs.includes(debugType)) {\n console.log('DEBUG_SDK', message, data);\n }\n}\n\nexport function getDefaultCameraDeviceId() {\n return localStorage.getItem('defaultDeviceId');\n}\n\n/**\n * Set default camera device ID in localStorage\n */\nexport function setDefaultCameraDeviceId(deviceId: string) {\n localStorage.setItem('defaultDeviceId', deviceId);\n}\n\n/**\n * Check if current platform is mobile using detect-browser\n */\nexport function isMobilePlatform(): boolean {\n const { os } = detect();\n return iOS() || ['iOS', 'android', 'Android OS'].includes(os);\n}\n\n/**\n * Check if current device is mobile using user agent detection\n * More comprehensive than isMobilePlatform but uses UA sniffing\n */\nexport function isMobileDevice(): boolean {\n const { os } = detect();\n return ['iOS', 'Android OS', 'Windows Mobile'].includes(os);\n}\n\n// TODO: remove this from shared and leave only in wasm.utils\n/**\n * Get SIMD support status\n */\nexport async function getIsSIMD(): Promise<boolean> {\n try {\n return await simd();\n } catch (error) {\n printLogs('[shared.utils] getIsSIMD error:', error);\n return false;\n }\n}\n/**\n * Check if debug mode should create images\n */\nexport function shouldCreateDebugImages(): boolean {\n const debugType = getDebugType();\n return DEBUG_TYPES_WITH_IMAGES.includes(debugType);\n}\n\n/**\n * Create and download images for debugging purposes\n */\nexport async function createDebugImages(images: ImageData[], title: string, isEnrollFlow: boolean): Promise<void> {\n if (!shouldCreateDebugImages()) {\n return;\n }\n\n try {\n const promises = images.map(async (imageData) => {\n const canvas = document.createElement('canvas');\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n const context = canvas.getContext('2d');\n context.putImageData(imageData, 0, 0);\n\n const blob = await new Promise<Blob>((resolve) => canvas.toBlob(resolve, 'image/jpeg'));\n const url = URL.createObjectURL(blob);\n return { url, blob };\n });\n\n const data = await Promise.all(promises);\n const a = document.createElement('a');\n\n for (let i = 0; i < data.length; i++) {\n await new Promise<void>((resolve) => {\n a.href = data[i].url;\n a.type = 'image/png';\n a.download = `${title}_${isEnrollFlow ? 'enroll' : 'predict'}.png`;\n document.body.appendChild(a);\n\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n URL.revokeObjectURL(data[i].url);\n resolve();\n }, 1000);\n });\n }\n\n printLogs('[face.utils] Debug images created and downloaded', { title, count: images.length });\n } catch (error) {\n printLogs('[face.utils] Error creating debug images', error, 'ERROR');\n }\n}\n\n/**\n * Convert canvas/image data to base64\n */\nexport function imageDataToBase64(imageData: ImageData): Promise<string> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n const context = canvas.getContext('2d');\n context.putImageData(imageData, 0, 0);\n\n canvas.toBlob((blob) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n });\n}\n\n/**\n * Wrapper for callback that creates debug images before calling the original callback\n */\nexport function wrapCallbackWithImageCreation<T>(\n callback: (result: T) => void,\n imageData: ImageData,\n isEnrollFlow: boolean,\n): (result: T) => void {\n return async (result: any) => {\n if (shouldCreateDebugImages()) {\n const title = `original_${result?.face_validation_status ?? 'unknown'}_${result?.antispoof_status ?? 'unknown'}`;\n await createDebugImages([imageData], title, isEnrollFlow);\n }\n callback(result);\n };\n}\n\nexport function downloadImageFromBase64(base64Data: string, filename: string): boolean {\n const debugType = getDebugType();\n if (!(debugType === '903' || debugType === '904')) {\n return false;\n }\n\n try {\n // Check if base64Data already has the data URL prefix\n const dataUrl = base64Data.startsWith('data:') ? base64Data : `data:image/jpeg;base64,${base64Data}`;\n\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename}.jpg`;\n document.body.appendChild(a);\n\n a.click();\n document.body.removeChild(a);\n\n printLogs('[shared.utils] Debug cropped image downloaded', filename);\n return true;\n } catch (error) {\n printLogs('[shared.utils] Error downloading debug image', error, 'ERROR');\n return false;\n }\n}\n\nlet environment: string | null;\n\nexport const setEnvVariables = (env: string) => {\n environment = env;\n};\n\nexport const getEnvironment = () => {\n if (environment) {\n return environment;\n }\n return null;\n};\n", "export const WASM_ULTRA_FOLDER_NAME = 'ultra';\nexport const WASM_MODULE_NAME = 'privid_fhe_ultra';\n\nexport const INDEXED_DB_NAME = '/privid-wasm';\nexport const INDEXED_STORE_NAME = '/privid-wasm';\nexport const INDEXED_DB_VERSION = 21;\n", "import { printLogs } from '../../modules/internal/shared/shared.utils';\nimport {\n INDEXED_DB_NAME,\n INDEXED_DB_VERSION,\n INDEXED_STORE_NAME,\n WASM_ULTRA_FOLDER_NAME,\n} from './wasm-worker.constants';\nimport { WasmPrividModules } from './wasm-worker.domain';\nimport { FetchResourceURLs, WasmCacheData, WasmLoadFallbackReason } from './wasm-worker.types';\n\n/**\n * Strips the trailing environment suffix (-prod or -dev) from a WASM version string.\n *\n * The WASM binary reports its version via _privid_get_version() as the base version\n * (e.g., \"26.02.13-24c4552\"), while version.json includes an environment suffix\n * (e.g., \"26.02.13-24c4552-prod\" or \"26.02.13-24c4552-dev\").\n *\n * This normalizes both forms to the base version so they can be compared.\n */\nexport function stripVersionSuffix(version: string): string {\n return version.replace(/-(prod|dev)$/, '');\n}\n\n// Helper to promisify IndexedDB requests\nfunction promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n// Simplified version using the helper\nexport async function readFromIndexedDB(key: string): Promise<any> {\n if (!indexedDB) {\n throw new Error('IndexedDB not available');\n }\n\n const openRequest = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result;\n if (!db.objectStoreNames.contains(INDEXED_STORE_NAME)) {\n db.createObjectStore(INDEXED_STORE_NAME);\n }\n };\n\n const db = await promisifyRequest(openRequest);\n\n try {\n const transaction = db.transaction(INDEXED_STORE_NAME, 'readonly');\n const store = transaction.objectStore(INDEXED_STORE_NAME);\n const result = await promisifyRequest(store.get(key));\n return result;\n } catch (error) {\n printLogs('[WasmWorkerService] Error reading from IndexedDB:', error);\n throw error;\n } finally {\n db.close();\n }\n}\n\n// Refactored function\nexport async function writeToIndexedDB(\n key: string,\n cachedWasm: any,\n cachedScript: any,\n version: string | number,\n): Promise<string> {\n if (!indexedDB) {\n throw new Error('IndexedDB not available');\n }\n\n const openRequest = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result;\n if (!db.objectStoreNames.contains(INDEXED_STORE_NAME)) {\n db.createObjectStore(INDEXED_STORE_NAME);\n }\n };\n\n const db = await promisifyRequest(openRequest);\n\n try {\n const transaction = db.transaction(INDEXED_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(INDEXED_STORE_NAME);\n\n const data: WasmCacheData = { cachedWasm, cachedScript, version };\n await promisifyRequest(store.put(data, key));\n\n return 'saved';\n } finally {\n db.close();\n }\n}\n\nexport async function fetchResource(urls: FetchResourceURLs, useCdnLink?: boolean) {\n let localError: unknown;\n // Try local first\n try {\n printLogs(`[WasmWorkerService] fetchResource from localUrl`, urls.local);\n const response = await fetch(urls.local);\n if (!response.ok) {\n throw new Error(`Local response not ok: ${response.status}`);\n }\n printLogs(`[WasmWorkerService] fetchResource local response: `, response);\n return response;\n } catch (error) {\n localError = error;\n printLogs(`[WasmWorkerService] Local fetch failed, trying CDN. Error: ${localError}`, '', 'WARN');\n }\n\n // CDN fallback (only if enabled)\n if (useCdnLink) {\n printLogs(`[WasmWorkerService] fetchResource from cdnUrl`, urls.cdn);\n const response = await fetch(urls.cdn);\n if (!response.ok) {\n throw new Error(`CDN fetch failed: ${response.status} for ${urls.cdn}`);\n }\n return response;\n }\n\n throw new Error(`Local fetch failed and CDN is disabled for ${urls.local}: ${localError}`);\n}\n\n/**\n *\n * This function Verifies the cached WASM version from IndexDB and the local WASM version.\n * The function strip version suffix because the DEV and Prod WASMs are saved using different IndexDB key.\n * Also, the WASM itself strips the suffix when using the `WasmModule._privid_get_version()`\n * @returns boolean that represents if the version matches.\n */\nexport function checkCacheAndCurrentAreSameVersion(\n cachedModule: WasmCacheData | null,\n currentVersionJSON: { version: string | number } | null,\n): boolean {\n try {\n const cachedVersion = cachedModule?.version;\n const currentVersion = currentVersionJSON?.version;\n\n printLogs(\n `[WasmWorkerService] checkCacheAndCurrentAreSameVersion cachedVersion vs currentVersion: `,\n `${cachedVersion} vs ${currentVersion}`,\n );\n\n const cachedVersionString = typeof cachedVersion === 'string' ? cachedVersion : cachedVersion.toString();\n const currentVersionString = typeof currentVersion === 'string' ? currentVersion : currentVersion.toString();\n\n return stripVersionSuffix(cachedVersionString) === stripVersionSuffix(currentVersionString);\n } catch (error) {\n printLogs(`[WasmWorkerService] Error comparing versions:`, error, 'ERROR');\n return false;\n }\n}\n\nexport async function readCurrentWasmVersion(\n modulePath: string,\n wasmBaseUrl?: string | null,\n wasmFolderName: string = WASM_ULTRA_FOLDER_NAME,\n) {\n const versionUrl = wasmBaseUrl\n ? `${wasmBaseUrl}/wasm/${wasmFolderName}/${modulePath}/version.json`\n : `../wasm/${wasmFolderName}/${modulePath}/version.json`;\n\n const versionData = await fetch(versionUrl);\n return versionData.json();\n}\n\nexport function flatImageDataArraysIntoUint8Array(imageDataArray: ImageData[]): Uint8Array {\n const totalLength = imageDataArray.reduce((sum, imgData) => sum + imgData.data.length, 0);\n const flatArray = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const imgData of imageDataArray) {\n flatArray.set(imgData.data, offset);\n offset += imgData.data.length;\n }\n\n return flatArray;\n}\n\nexport function removeNullBytesFromDecodedString(string: string): string {\n return string\n .split('')\n .filter((char) => char.codePointAt(0))\n .join('');\n}\n\nexport function validateWasmBinary(buffer: ArrayBuffer): { valid: boolean; reason?: string } {\n if (!buffer || buffer.byteLength < 8) {\n return { valid: false, reason: 'wasm_empty_or_truncated' };\n }\n\n const header = new Uint8Array(buffer, 0, 4);\n const WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];\n if (!WASM_MAGIC.every((byte, i) => header[i] === byte)) {\n return { valid: false, reason: 'wasm_invalid_magic_number' };\n }\n\n if (typeof WebAssembly.validate === 'function' && !WebAssembly.validate(buffer)) {\n return { valid: false, reason: 'wasm_structural_validation_failed' };\n }\n\n return { valid: true };\n}\n\nexport async function readFromIndexedDBWithTimeout(\n key: string,\n timeoutMs = 5000,\n readFn: (key: string) => Promise<any> = readFromIndexedDB,\n): Promise<any> {\n return Promise.race([\n readFn(key),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error(`IndexedDB read timed out after ${timeoutMs}ms`)), timeoutMs),\n ),\n ]);\n}\n\nexport async function clearCacheEntry(key: string): Promise<void> {\n if (!indexedDB) {\n throw new Error('IndexedDB not available');\n }\n\n const openRequest = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result;\n if (!db.objectStoreNames.contains(INDEXED_STORE_NAME)) {\n db.createObjectStore(INDEXED_STORE_NAME);\n }\n };\n\n const db = await promisifyRequest(openRequest);\n\n try {\n const transaction = db.transaction(INDEXED_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(INDEXED_STORE_NAME);\n await promisifyRequest(store.delete(key));\n } finally {\n db.close();\n }\n}\n\nexport function isCacheCorruptionFailure(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const msg = error.message.toLowerCase();\n return (\n msg.includes('validation failed') ||\n msg.includes('wasm_invalid_magic_number') ||\n msg.includes('wasm_structural_validation_failed') ||\n msg.includes('wasm_empty_or_truncated')\n );\n}\n\nexport async function validateCustomWasmUrl(url: string): Promise<boolean> {\n try {\n printLogs('[wasm-worker.utils] Validating custom WASM URL:', url);\n const response = await fetch(url, { method: 'HEAD' });\n const isValid = response.ok;\n printLogs('[wasm-worker.utils] Custom WASM URL validation result:', isValid);\n return isValid;\n } catch (error) {\n printLogs('[wasm-worker.utils] Custom WASM URL validation failed:', error, 'ERROR');\n return false;\n }\n}\n\nexport async function writeToCacheQuietly(\n buffer: ArrayBuffer,\n module: WasmPrividModules,\n cacheKey: string = WASM_ULTRA_FOLDER_NAME,\n): Promise<void> {\n try {\n \n const moduleVersion = module.UTF8ToString(module._privid_get_version());\n await writeToIndexedDB(cacheKey, buffer, '', moduleVersion);\n } catch (error) {\n printLogs('[WasmWorkerService] Cache write failed (non-fatal)', error, 'WARN');\n }\n}\n\nexport function classifyFailureReason(error: unknown): WasmLoadFallbackReason {\n if (!(error instanceof Error)) return 'unknown';\n\n const msg = error.message.toLowerCase();\n\n if (msg.includes('timed out')) return 'cache_read_timeout';\n if (msg.includes('cache miss')) return 'cache_miss';\n if (msg.includes('cache version mismatch')) return 'cache_version_mismatch';\n if (msg.includes('validation failed')) return 'wasm_validation_failed';\n if (msg.includes('indexeddb')) return 'cache_read_error';\n if (msg.includes('fetch failed') || msg.includes('networkerror')) return 'fetch_failed';\n if (msg.includes('custom url validation failed')) return 'custom_url_invalid';\n if (msg.includes('custom url version mismatch')) return 'custom_url_version_mismatch';\n if (error instanceof WebAssembly.CompileError) return 'wasm_compile_error';\n\n return 'unknown';\n}\n", " \n \nimport { expose } from 'comlink';\nimport { WasmPrividModules, WasmWorker } from './wasm-worker.domain';\nimport {\n LoadParams,\n EnrollParams,\n PredictParams,\n AgeEstimateParams,\n CompareEmbeddingsParams,\n PkiEncryptParams,\n ScanBackDocumentParams,\n ScanFrontDocumentParams,\n DocumentOcrParams,\n WasmSessionPointer,\n ApiUrl,\n ProxiedCallback,\n RegularCallback,\n WasmLoadStatus,\n WasmLoadFallback,\n WasmResolveContext,\n TierAttempt,\n LoadModulesResult,\n CustomWasmConfig,\n FetchResourceURLs,\n} from './wasm-worker.types';\nimport { printLogs, setDebugType } from '../../modules/internal/shared/shared.utils';\nimport {\n checkCacheAndCurrentAreSameVersion,\n classifyFailureReason,\n clearCacheEntry,\n flatImageDataArraysIntoUint8Array,\n isCacheCorruptionFailure,\n readCurrentWasmVersion,\n readFromIndexedDBWithTimeout,\n removeNullBytesFromDecodedString,\n validateCustomWasmUrl,\n validateWasmBinary,\n writeToCacheQuietly,\n} from './wasm-worker.utils';\nimport { WASM_ULTRA_FOLDER_NAME } from './wasm-worker.constants';\n\ntype ResolveResult = {\n module: WasmPrividModules;\n status: WasmLoadStatus;\n attempts: TierAttempt[];\n};\n\n// Declare the global function created by eval'd WASM script\ndeclare global {\n function createTFLiteModule(config: { wasmBinary: ArrayBuffer }): Promise<WasmPrividModules>;\n function privid_wasm_result(operation: string, id: string, response_str: string): void;\n function privid_wasm_error(operation: string, id: string, error_str: string): void;\n function privid_wasm_progress(progress_type: number, message: string, progress_value: number): void;\n function privid_wasm_cropping(base64Image: string): void;\n}\n\nconst callbackRegistry = {\n result: null as ((...args: any[]) => void) | null,\n error: null as ((operation: string, id: string, error_str: string) => void) | null,\n progress: null as ((progress_type: number, message: string, progress_value: number) => void) | null,\n wasmCropping: null as ((base64Image: string) => void) | null,\n};\n\n// Set up the global WASM callbacks once at module level\n// These MUST be on globalThis for WASM to find them (due to IIFE build format)\n// In WasmWorkerService.ts, update the globalThis.privid_wasm_result function (around line 43)\nglobalThis.privid_wasm_result = (operation: string, id: string, response_str: string) => {\n if (callbackRegistry.result) {\n try {\n printLogs('[WasmWorkerService] privid_wasm_result called with operation:', operation);\n printLogs('[WasmWorkerService] privid_wasm_result called with id:', id);\n printLogs('[WasmWorkerService] privid_wasm_result called with response_str:', response_str);\n callbackRegistry.result(operation, id, response_str);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in result callback:', error, 'ERROR');\n }\n } else {\n printLogs('[WasmWorkerService] No result callback registered', '', 'WARN');\n }\n};\n\nglobalThis.privid_wasm_error = (operation: string, id: string, error_str: string) => {\n printLogs('[WasmWorkerService] privid_wasm_error called:', { operation, id, error_str }, 'ERROR');\n if (callbackRegistry.error) {\n try {\n callbackRegistry.error(operation, id, error_str);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in error callback:', error, 'ERROR');\n }\n } else {\n printLogs('[WasmWorkerService] No error callback registered', '', 'WARN');\n }\n};\n\nglobalThis.privid_wasm_progress = (progress_type: number, message: string, progress_value: number) => {\n printLogs('[WasmWorkerService] privid_wasm_progress called:', { progress_type, message, progress_value });\n if (callbackRegistry.progress) {\n try {\n callbackRegistry.progress(progress_type, message, progress_value);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in progress callback:', error, 'ERROR');\n }\n }\n};\n\nglobalThis.privid_wasm_cropping = (base64Image: string) => {\n printLogs('[WasmWorkerService] privid_wasm_cropping called', base64Image);\n if (callbackRegistry.wasmCropping) {\n try {\n callbackRegistry.wasmCropping(base64Image);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in wasmCropping callback:', error, 'ERROR');\n }\n }\n};\n\nexport class WasmWorkerService implements WasmWorker {\n private wasmPrividModules: WasmPrividModules | null = null;\n private apiUrl: ApiUrl | null = null;\n private sessionToken: string | null = null;\n private publicKey: string | null = null;\n private debugType: string | null = null;\n private proxiedResultCallback: ProxiedCallback | null = null;\n private proxiedErrorCallback: ProxiedCallback | null = null;\n private proxiedProgressCallback: ProxiedCallback | null = null;\n private wasmSession: number | null = null;\n private setCache = true;\n private checkWasmLoaded = false;\n private cdnUrl = 'https://ultra-wasm.devel.privateid.com';\n private useCdnLink = true;\n private isSimd: boolean | null = null;\n private moduleInitializationLock: Promise<LoadModulesResult> | null = null;\n private isModuleInitializing = false;\n private customWasm: CustomWasmConfig | null = null;\n private wasmBaseUrl: string | null = null;\n private lastLoadStatus: WasmLoadStatus | null = null;\n private currentWasmVersion: string | null = null;\n private wasmFolderName: string = WASM_ULTRA_FOLDER_NAME;\n\n private getWasmFolderName(): string {\n return this.wasmFolderName;\n }\n\n async loadModules(\n params: LoadParams,\n errorCallback: ProxiedCallback,\n progressCallback?: ProxiedCallback,\n ): Promise<LoadModulesResult> {\n try {\n // Handle session regeneration without re-downloading modules.\n // This path is used when credentials change (e.g., token refresh) but modules are already loaded.\n if (this.wasmPrividModules && this.wasmSession && params.shouldRegenerateSession) {\n return this.regenerateSession(params, errorCallback, progressCallback);\n }\n\n // If modules are already loaded and session exists, don't re-initialize!\n // Re-initialization corrupts the WASM state causing _privid_check_models() to return 0\n if (this.wasmPrividModules && this.wasmSession) {\n return { message: 'Already initialized', status: this.lastLoadStatus };\n }\n\n if (this.moduleInitializationLock) {\n try {\n await this.moduleInitializationLock;\n return { message: 'Already loaded', status: this.lastLoadStatus };\n } catch (error) {\n printLogs('[WasmWorkerService] loadModules error', error);\n return { message: 'Retrying initialization', status: null };\n }\n }\n\n this.isModuleInitializing = true;\n this.moduleInitializationLock = this.loadModulesInternal(params, errorCallback, progressCallback);\n const result = await this.moduleInitializationLock;\n\n return result;\n } catch (error) {\n printLogs('[WasmWorkerService] loadModules error', error, 'ERROR');\n throw error;\n } finally {\n this.isModuleInitializing = false;\n this.moduleInitializationLock = null;\n }\n }\n\n private async regenerateSession(\n params: LoadParams,\n errorCallback: ProxiedCallback,\n progressCallback?: ProxiedCallback,\n ): Promise<LoadModulesResult> {\n printLogs('[WasmWorkerService] Regenerating session as requested', '');\n\n // Update callbacks and credentials for the new session\n this.proxiedErrorCallback = errorCallback;\n callbackRegistry.error = errorCallback;\n this.proxiedProgressCallback = progressCallback;\n callbackRegistry.progress = progressCallback;\n this.apiUrl = params.apiUrl;\n this.sessionToken = params.sessionToken;\n this.publicKey = params.publicKey;\n\n // Deinitialize the old session to free C++ heap memory.\n // Wrapped in try-catch: if deinit throws (e.g., due to the C++ layer's internal state),\n // we log and proceed -- a leaked session is better than a blocked regeneration.\n try {\n this.wasmPrividModules._privid_deinitialize_session(this.wasmSession);\n } catch (error) {\n printLogs(\n '[WasmWorkerService] _privid_deinitialize_session failed (non-fatal, proceeding with regeneration)',\n error,\n 'WARN',\n );\n }\n\n // Null the existing session so initializeWasmSession creates a new one\n // (initializeWasmSession returns early if this.wasmSession is already set)\n this.wasmSession = null;\n\n const newSession = await this.initializeWasmSession(params.usageScenario, params.cacheContent);\n if (!newSession) {\n printLogs('[WasmWorkerService] ERROR: Failed to regenerate session', '', 'ERROR');\n throw new Error('Session regeneration failed');\n }\n this.wasmSession = newSession;\n\n return { message: 'Session regenerated', status: this.lastLoadStatus };\n }\n\n private async loadModulesInternal(\n params: LoadParams,\n errorCallback: ProxiedCallback,\n progressCallback?: ProxiedCallback,\n ): Promise<LoadModulesResult> {\n this.proxiedErrorCallback = errorCallback;\n callbackRegistry.error = errorCallback;\n this.proxiedProgressCallback = progressCallback;\n callbackRegistry.progress = progressCallback;\n this.apiUrl = params.apiUrl;\n this.sessionToken = params.sessionToken;\n this.publicKey = params.publicKey;\n this.useCdnLink = params.useCdn ?? true;\n this.setCache = params.cacheConfig;\n this.isSimd = params.simd;\n this.customWasm = params.customWasm || null;\n this.wasmBaseUrl = params.wasmBaseUrl || null;\n\n if (params.debugType) {\n this.debugType = params.debugType;\n setDebugType(params.debugType);\n }\n\n if (params.wasmFolderName) {\n this.wasmFolderName = params.wasmFolderName;\n }\n\n if (params.cdnBaseUrl) {\n this.cdnUrl = params.cdnBaseUrl;\n }\n\n printLogs('[WasmWorkerService] isLoad params: ', params);\n\n // --- Resolve version ---\n const modulePath = params.simd ? 'simd' : 'nosimd';\n const moduleName = 'privid_fhe_ultra';\n const currentModuleVersionJSON = await readCurrentWasmVersion(\n modulePath,\n this.wasmBaseUrl,\n this.getWasmFolderName(),\n );\n this.currentWasmVersion = currentModuleVersionJSON.version;\n\n // --- Resolve WASM module through tier pipeline ---\n // Note: this.setCache may be undefined when cacheConfig is not passed in LoadParams.\n // Default to true to match WasmOrchestratorService behavior (hardcodes cacheConfig: true).\n const ctx: WasmResolveContext = {\n modulePath,\n moduleName,\n version: currentModuleVersionJSON.version,\n saveCache: this.setCache ?? true,\n };\n\n const result = await this.resolveWasmModule(ctx);\n\n this.wasmPrividModules = result.module;\n this.lastLoadStatus = result.status;\n\n // --- Initialize WASM session ---\n if (!this.checkWasmLoaded) {\n await this.initializeWasmSession(params.usageScenario, params.cacheContent);\n this.checkWasmLoaded = true;\n }\n\n // --- Final verification ---\n if (!this.wasmPrividModules || !this.wasmSession) {\n throw new Error('WASM modules loaded but session not initialized');\n }\n\n printLogs(\n `[WasmWorkerService] Load complete. Source: ${result.status.source}, Attempts: ${result.attempts.length}`,\n result.attempts,\n );\n\n return {\n message: `Loaded from ${result.status.source}`,\n status: this.lastLoadStatus,\n };\n }\n\n /**\n * Constructs a local URL for WASM resources.\n * Uses wasmBaseUrl if available (passed from main thread), otherwise falls back to relative path.\n */\n private getLocalWasmUrl(relativePath: string): string {\n if (this.wasmBaseUrl) {\n return `${this.wasmBaseUrl}/wasm/${relativePath}`;\n }\n return `../wasm/${relativePath}`;\n }\n\n /**\n * Loads a script via direct URL importScripts with CDN/local fallback.\n * Avoids blob: URLs which are blocked by strict Content-Security-Policy.\n */\n private importScriptFromUrl(scriptUrls: FetchResourceURLs): void {\n let localError: unknown;\n try {\n importScripts(scriptUrls.local);\n return;\n } catch (error) {\n localError = error;\n printLogs('[WasmWorkerService] Local importScripts failed, trying CDN', localError, 'WARN');\n }\n\n if (this.useCdnLink) {\n try {\n importScripts(scriptUrls.cdn);\n } catch (cdnError) {\n throw new Error(`Both local and CDN importScripts failed. Local error: ${localError}; CDN error: ${cdnError}`);\n }\n } else {\n throw new Error(`Local importScripts failed and CDN is disabled: ${localError}`);\n }\n }\n\n private async initializeWasmSession(usageScenario = '', cache_content = ''): Promise<WasmSessionPointer | null> {\n if (this.wasmSession) {\n return this.wasmSession;\n }\n const settings = {\n ...this.apiUrl,\n session_token: this.sessionToken,\n public_key: this.publicKey,\n debug_level: this.debugType,\n custom_settings: { usage_scenario: usageScenario, cache_content },\n };\n printLogs(`[WasmWorkerService] initializeWasmSession settings:`, settings);\n\n const resultPointers = this.createWasmResultPointers();\n const stringBuffer = this.createStringBuffer(JSON.stringify(settings));\n\n const isSessionInitialized = this.wasmPrividModules._privid_initialize_session(\n ...stringBuffer.getArgs(),\n resultPointers.getOuterPointer(),\n );\n printLogs(`[WasmWorkerService] initializeWasmSession isSessionInitialized: `, isSessionInitialized);\n\n stringBuffer.free();\n\n if (!isSessionInitialized) {\n printLogs('[WasmWorkerService] ERROR: privid_initialize_session failed', '', 'ERROR');\n printLogs('[WasmWorkerService] Settings were:', settings, 'ERROR');\n return null;\n }\n\n const wasmSessionPointer = resultPointers.getInnerPointer();\n this.wasmSession = wasmSessionPointer;\n printLogs(`[WasmWorkerService] initializeWasmSession wasmSessionPointer: `, wasmSessionPointer);\n\n return wasmSessionPointer;\n }\n\n private async resolveWasmModule(ctx: WasmResolveContext): Promise<ResolveResult> {\n const attempts: TierAttempt[] = [];\n const tiers: Array<{\n source: WasmLoadStatus['source'];\n obtain: () => Promise<ArrayBuffer>;\n shouldCache: boolean;\n }> = [];\n console.log('[WasmWorkerService] resolveWasmModule ctx:', ctx);\n\n // Build tier list based on configuration\n if (this.customWasm) {\n tiers.push({\n source: 'custom',\n obtain: () => this.obtainFromCustomUrl(this.customWasm, ctx.version),\n shouldCache: false,\n });\n }\n\n tiers.push({\n source: 'cache',\n obtain: () => this.obtainFromCache(ctx.version),\n shouldCache: false,\n });\n\n tiers.push({\n source: 'local',\n obtain: () => this.obtainFromNetwork(ctx, 'local'),\n shouldCache: ctx.saveCache,\n });\n\n if (this.useCdnLink) {\n tiers.push({\n source: 'cdn',\n obtain: () => this.obtainFromNetwork(ctx, 'cdn'),\n shouldCache: ctx.saveCache,\n });\n }\n\n // Load the Emscripten JS runtime once for ctx.modulePath (SIMD or noSIMD).\n // If SIMD compilation fails later, compileWasmBinary -> obtainFromNetworkWithFallback\n // reloads the noSIMD JS runtime separately (it's a different Emscripten build).\n // Wrapped in try-catch to add context: if this fails, no tier can succeed because\n // createTFLiteModule won't be defined. The error is rethrown with the original message\n // preserved so callers see both the context and the root cause.\n try {\n this.loadWasmRuntime(ctx);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`WASM JS runtime failed to load for ${ctx.modulePath}/${ctx.version}: ${msg}`);\n }\n\n let fallback: WasmLoadFallback | undefined;\n\n for (const tier of tiers) {\n try {\n const buffer = await tier.obtain();\n\n const validation = validateWasmBinary(buffer);\n if (!validation.valid) {\n throw new Error(`Validation failed: ${validation.reason}`);\n }\n\n const module = await this.compileWasmBinary(buffer, ctx);\n\n if (tier.shouldCache) {\n await writeToCacheQuietly(buffer, module, this.getWasmFolderName());\n }\n\n attempts.push({ source: tier.source, success: true });\n\n // Determine the reported source. When the custom URL tier failed and we fell\n // back to cache/CDN, the source is the successful tier but we also record the\n // custom-fallback status for backward compatibility with existing consumers.\n const reportedSource = fallback?.originalSource === 'custom' ? 'custom-fallback' : tier.source;\n const versionMatch = reportedSource !== 'custom-fallback';\n\n return {\n module,\n status: {\n source: reportedSource,\n versionMatch,\n ...(fallback && { fallback }),\n },\n attempts,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n attempts.push({ source: tier.source, success: false, error: errorMessage });\n\n printLogs(`[WasmWorkerService] Tier '${tier.source}' failed: ${errorMessage}`, error, 'WARN');\n\n // Record the first failure as the fallback reason (skip both 'local' and 'cdn' since both are network tiers)\n if (!fallback && tier.source !== 'cdn' && tier.source !== 'local') {\n fallback = {\n originalSource: tier.source as WasmLoadFallback['originalSource'],\n reason: classifyFailureReason(error),\n };\n }\n\n // Only evict cache on corruption-related failures (validation failed, corrupted data).\n // Do NOT evict on cache miss or version mismatch -- those are normal operational states.\n if (tier.source === 'cache' && isCacheCorruptionFailure(error)) {\n await clearCacheEntry(this.getWasmFolderName()).catch(() => { /* empty */ });\n }\n }\n }\n\n throw new Error(`All WASM loading tiers failed. Attempts: ${JSON.stringify(attempts)}`);\n }\n\n private loadWasmRuntime(ctx: WasmResolveContext): void {\n const scriptUrls: FetchResourceURLs = {\n cdn: `${this.cdnUrl}/${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.js`,\n local: this.getLocalWasmUrl(`${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.js`),\n };\n\n this.importScriptFromUrl(scriptUrls);\n\n if (typeof createTFLiteModule === 'undefined') {\n throw new Error('createTFLiteModule not defined after loading WASM runtime');\n }\n }\n\n private async obtainFromCache(expectedVersion: string): Promise<ArrayBuffer> {\n const cached = await readFromIndexedDBWithTimeout(this.getWasmFolderName());\n\n if (!cached || !cached.cachedWasm) {\n throw new Error('Cache miss: no cached WASM found');\n }\n\n if (!checkCacheAndCurrentAreSameVersion(cached, { version: expectedVersion })) {\n throw new Error(`Cache version mismatch: cached=${cached.version}, expected=${expectedVersion}`);\n }\n\n return cached.cachedWasm;\n }\n\n \n private async obtainFromCustomUrl(customWasm: CustomWasmConfig, expectedVersion: string): Promise<ArrayBuffer> {\n // Step 1: Validate the URL is accessible (HEAD request, matches existing behavior)\n const isValid = await validateCustomWasmUrl(customWasm.url);\n if (!isValid) {\n throw new Error(`Custom URL validation failed for ${customWasm.url}`);\n }\n\n // Step 2: Version check -- prevent loading a WASM binary with the wrong version,\n // which could cause silent failures or crashes in the C++ layer.\n if (customWasm.version !== expectedVersion) {\n printLogs(\n '[WasmWorkerService] Custom WASM version mismatch',\n { expected: expectedVersion, provided: customWasm.version },\n 'WARN',\n );\n throw new Error(`Custom URL version mismatch: provided=${customWasm.version}, expected=${expectedVersion}`);\n }\n\n // Step 3: Fetch the binary\n const response = await fetch(customWasm.url);\n if (!response.ok) {\n throw new Error(`Custom URL fetch failed: ${response.status} for ${customWasm.url}`);\n }\n return response.arrayBuffer();\n }\n\n private async obtainFromNetwork(ctx: WasmResolveContext, source: 'cdn' | 'local'): Promise<ArrayBuffer> {\n const wasmUrl =\n source === 'cdn'\n ? `${this.cdnUrl}/${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.wasm`\n : this.getLocalWasmUrl(`${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.wasm`);\n\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Fetch failed: ${response.status} for ${wasmUrl}`);\n }\n return response.arrayBuffer();\n }\n\n private async compileWasmBinary(wasmBinary: ArrayBuffer, ctx: WasmResolveContext): Promise<WasmPrividModules> {\n try {\n return await createTFLiteModule({ wasmBinary });\n } catch (error) {\n if (error instanceof WebAssembly.CompileError && ctx.modulePath === 'simd') {\n printLogs('[WasmWorkerService] SIMD CompileError -- retrying with noSIMD', error, 'WARN');\n return this.obtainFromNetworkWithFallback(ctx);\n }\n throw error;\n }\n }\n\n private async obtainFromNetworkWithFallback(ctx: WasmResolveContext): Promise<WasmPrividModules> {\n const noSimdCtx: WasmResolveContext = {\n ...ctx,\n modulePath: 'nosimd',\n };\n\n // Fetch noSIMD binary from network (local first, CDN fallback)\n let buffer: ArrayBuffer;\n try {\n buffer = await this.obtainFromNetwork(noSimdCtx, 'local');\n } catch (localError) {\n if (this.useCdnLink) {\n buffer = await this.obtainFromNetwork(noSimdCtx, 'cdn');\n } else {\n throw new Error(`Local noSIMD fetch failed and CDN is disabled: ${localError}`);\n }\n }\n\n // Load the noSIMD JS runtime (overwrites the global createTFLiteModule)\n this.loadWasmRuntime(noSimdCtx);\n\n return createTFLiteModule({ wasmBinary: buffer });\n }\n\n async ultraEnroll(params: EnrollParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const imageInputSize = params.imageData.data.length * params.imageData.data.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n // TODO: @pahferreira - what does this line do?\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(params.imageData.data), imageInputPtr);\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const encoder = new TextEncoder();\n const config_bytes = encoder.encode(`${params.config}`);\n const configInputSize = config_bytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n // TODO: @pahferreira - what does this line do?\n this.wasmPrividModules.HEAP8.set(config_bytes, configInputPtr / config_bytes.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraEnroll config: ', params.config);\n\n try {\n this.wasmPrividModules._privid_user_enroll(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.imageData.width /* width of one image */,\n params.imageData.height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs(`[WasmWorkerService] ultraEnroll error: `, error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraPredict(\n params: PredictParams,\n resultCallback: RegularCallback,\n onAntiSpoofProgress?: RegularCallback,\n ): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (onAntiSpoofProgress) {\n callbackRegistry.progress = onAntiSpoofProgress;\n }\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const imageInput = flatImageDataArraysIntoUint8Array(params.originalImages);\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const imageInputSize = imageInput.length * imageInput.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(imageInput), imageInputPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraPredict config: ', params.config);\n try {\n this.wasmPrividModules._privid_user_predict(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.originalImages[0].width /* width of one image */,\n params.originalImages[0].height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraPredict error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraAgeEstimate(\n params: AgeEstimateParams,\n resultCallback: (...args: unknown[]) => void,\n onAntiSpoofProgress?: (...args: unknown[]) => void,\n onWasmCroppingCallback?: (base64Image: string) => void,\n ): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (onAntiSpoofProgress) {\n callbackRegistry.progress = onAntiSpoofProgress;\n }\n\n if (onWasmCroppingCallback) {\n callbackRegistry.wasmCropping = onWasmCroppingCallback;\n }\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const imageInput = flatImageDataArraysIntoUint8Array(params.originalImages);\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n const imageInputSize = imageInput.length * imageInput.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(imageInput), imageInputPtr);\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraAgeEstimate config: ', params.config);\n\n try {\n this.wasmPrividModules._privid_estimate_age(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.originalImages[0].width /* width of one image */,\n params.originalImages[0].height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs(`[WasmWorkerService] ultraAgeEstimate error: `, error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraCompareEmbeddings(params: CompareEmbeddingsParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const embeddingsABytes = encoder.encode(`${params.encryptedEmbeddingsA}`);\n const embeddingsASize = embeddingsABytes.length;\n const embeddingsAPtr = this.allocatePointer(embeddingsASize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(embeddingsABytes), embeddingsAPtr);\n\n const embeddingsBBytes = encoder.encode(`${params.encryptedEmbeddingsB}`);\n const embeddingsBSize = embeddingsBBytes.length;\n const embeddingsBPtr = this.allocatePointer(embeddingsBSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(embeddingsBBytes), embeddingsBPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraCompareEmbeddings config: ', params.config);\n try {\n this.wasmPrividModules._privid_compare_embeddings(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n embeddingsAPtr,\n embeddingsASize,\n embeddingsBPtr,\n embeddingsBSize,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraCompareEmbeddings error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(embeddingsAPtr, embeddingsBPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n pkiEncrypt(params: PkiEncryptParams): string | { error: boolean } {\n if (!this.wasmPrividModules || !this.wasmSession) {\n return { error: true };\n }\n\n const encoder = new TextEncoder();\n const payloadBytes = encoder.encode(params.payload);\n const payloadSize = payloadBytes.length;\n const payloadPtr = this.allocatePointer(payloadSize);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n this.wasmPrividModules.HEAP8.set(payloadBytes, payloadPtr / payloadBytes.BYTES_PER_ELEMENT);\n\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] pkiEncrypt params: ', params);\n try {\n this.wasmPrividModules._privid_encrypt_payload(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n payloadPtr,\n payloadSize,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n const [outputBufferSizes] = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, resultLenPtr, 1);\n\n if (outputBufferSizes > 0) {\n const outputBufferSize = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, resultLenPtr, 1)[0];\n const outputBufferSecPtr = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, resultFirstPtr, 1)[0];\n const outputBufferPtr = new Uint8Array(\n this.wasmPrividModules.HEAPU8.buffer,\n outputBufferSecPtr,\n outputBufferSize,\n );\n\n const decoder = new TextDecoder('utf-8');\n const decode = decoder.decode(outputBufferPtr);\n decode.replace(/\\0/g, ''); // Remove null terminators if any\n decode.replace(' ', '');\n const result = removeNullBytesFromDecodedString(decode);\n printLogs('[WasmWorkerService] pkiEncrypt result: ', result);\n\n return result;\n }\n\n return {\n error: true,\n };\n } catch (error) {\n printLogs('[WasmWorkerService] pkiEncrypt error:', error, 'ERROR');\n return {\n error: true,\n };\n } finally {\n this.releasePointers(payloadPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraScanBackDocument(params: ScanBackDocumentParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const imageInputSize = params.imageInput.data.length * params.imageInput.data.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(params.imageInput.data), imageInputPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraScanBackDocument config: ', params.config);\n try {\n this.wasmPrividModules._privid_doc_scan_back(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.imageInput.width /* width of one image */,\n params.imageInput.height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraScanBackDocument error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraScanFrontDocument(params: ScanFrontDocumentParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n const imageInputSize = params.imageInput.data.length * params.imageInput.data.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(params.imageInput.data), imageInputPtr);\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraScanFrontDocument config: ', params.config);\n try {\n this.wasmPrividModules._privid_doc_scan_front(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.imageInput.width /* width of one image */,\n params.imageInput.height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraScanFrontDocument error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraDocumentOcr(params: DocumentOcrParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const inputImageBytes = encoder.encode(`${params.imageInput}`);\n\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const imageInputSize = inputImageBytes.length;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(inputImageBytes), imageInputPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraDocumentOcr config: ', params.config);\n try {\n this.wasmPrividModules._privid_doc_ocr_front_enc(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n imageInputSize,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraDocumentOcr error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async checkModelsAreLoaded(): Promise<boolean> {\n try {\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const isLoaded = this.wasmPrividModules._privid_check_models();\n return isLoaded;\n } catch (error) {\n printLogs(`[WasmWorkerService] checkModelsAreLoaded error`, error, 'ERROR');\n return false;\n }\n }\n\n async freeMemory(): Promise<boolean> {\n try {\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const freeMemoryResult = this.wasmPrividModules._privid_free_memory();\n return freeMemoryResult;\n } catch (error) {\n printLogs(`[WasmWorkerService] freeMemory error: `, error, 'ERROR');\n return false;\n }\n }\n\n /**\n * Creates pointers for WASM function results.\n * This helper manages outer and inner pointers for functions that return results via pointer arguments.\n *\n * @returns Object with methods to get outer and inner pointers\n */\n private createWasmResultPointers() {\n // TODO: Should we manipulate multiple pointers in Javascript?\n let out_ptr: number = null;\n let in_ptr: number = null;\n\n return {\n /**\n * @brief Allocates a pointer to contain the result and return it,\n * if the container is already created it will be returned\n */\n getOuterPointer: () => {\n // TODO: may be used SharedArrayBuffer() instead\n // allocate memory the expected pointer (outer pointer or container)\n if (!out_ptr) out_ptr = this.wasmPrividModules._malloc(Int32Array.BYTES_PER_ELEMENT);\n return out_ptr;\n },\n /**\n * @brief Creates a javascript Uint32Array pointer to contain the result pointed by outer_ptr and return it,\n * It is the responsability of the caller to free the pointer returned by this function\n */\n getInnerPointer: () => {\n // If we did not allocate yet the output buffer return null\n if (!out_ptr) return null;\n // if we already have our inner pointer for this closure return it\n if (in_ptr) return in_ptr;\n // Access the outer pointer as an arry of uint32 which conatin a single cell\n // whose value is the pointer allocated in the wasm module (inner pointer of the output param)\n // and return it\n [in_ptr] = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, out_ptr, 1);\n return in_ptr;\n },\n };\n }\n /**\n * Creates a managed string buffer for WASM function calls.\n * This helper allocates WASM memory for string arguments and provides automatic cleanup.\n * It converts JavaScript strings to UTF-8 encoded bytes that can be passed to WASM functions.\n *\n * @param text - The string value to encode (null/undefined will result in [0, 0] args)\n * @returns Object with methods to get pointer arguments and free memory\n \n */\n private createStringBuffer(text: string | null | undefined | number) {\n let memoryPointer: number | null = null;\n let bufferSize = 0;\n let cachedArgs: [number, number] | null = null;\n\n return {\n /**\n * Gets the [pointer, size] tuple for WASM function arguments.\n * Results are cached - subsequent calls return the same values.\n * @returns [pointer, size] tuple or [0, 0] for null/undefined input\n */\n getArgs: (): [number, number] => {\n // Return cached result if already computed\n if (cachedArgs !== null) {\n return cachedArgs;\n }\n\n // Handle null, undefined, or NaN cases\n if (text == null || (typeof text === 'number' && Number.isNaN(text))) {\n cachedArgs = [0, 0];\n return cachedArgs;\n }\n\n try {\n // Convert to string and encode to UTF-8\n const stringValue = String(text);\n const encoder = new TextEncoder();\n const bytes = encoder.encode(stringValue);\n\n // Calculate buffer size and allocate WASM memory\n bufferSize = bytes.length * bytes.BYTES_PER_ELEMENT;\n memoryPointer = this.wasmPrividModules._malloc(bufferSize);\n\n if (memoryPointer === 0) {\n throw new Error('WASM memory allocation failed');\n }\n\n // Copy bytes to WASM heap\n this.wasmPrividModules.HEAP8.set(bytes, memoryPointer / bytes.BYTES_PER_ELEMENT);\n\n cachedArgs = [memoryPointer, bufferSize];\n return cachedArgs;\n } catch (error) {\n printLogs('[WasmWorkerService] createStringBuffer error:', error, 'ERROR');\n // Return safe defaults on error\n cachedArgs = [0, 0];\n return cachedArgs;\n }\n },\n\n /**\n * Frees the allocated WASM memory.\n * IMPORTANT: Always call this after using the buffer to prevent memory leaks.\n * After calling free(), the buffer can be reused for the same text.\n */\n free: () => {\n if (memoryPointer !== null && memoryPointer !== 0) {\n try {\n this.wasmPrividModules._free(memoryPointer);\n } catch (error) {\n printLogs('[WasmWorkerService] free buffer error:', error, 'ERROR');\n }\n memoryPointer = null;\n bufferSize = 0;\n cachedArgs = null;\n }\n },\n\n /**\n * Check if memory has been allocated\n */\n isAllocated: (): boolean => memoryPointer !== null && memoryPointer !== 0,\n };\n }\n\n private releasePointers(...pointers: (number | null)[]) {\n pointers.forEach((ptr) => {\n if (ptr !== null && ptr !== 0) {\n try {\n this.wasmPrividModules._free(ptr);\n } catch (error) {\n printLogs('[WasmWorkerService] releasePointers error:', error, 'ERROR');\n }\n }\n });\n }\n\n private allocatePointer(size: number): number {\n try {\n const ptr = this.wasmPrividModules._malloc(size);\n return ptr;\n } catch (error) {\n printLogs('[WasmWorkerService] allocatePointer error:', error, 'ERROR');\n return 0;\n }\n }\n\n /**\n * Ensures WASM modules are fully initialized before operations execute.\n *\n * @returns true if modules and session are ready, false otherwise\n */\n private async ensureModulesAreReady(): Promise<boolean> {\n // Wait if initialization is already in progress\n if (this.isModuleInitializing && this.moduleInitializationLock) {\n try {\n await this.moduleInitializationLock;\n } catch (error) {\n printLogs('[WasmWorkerService] ensureModulesInitialized: Initialization failed during wait', error, 'ERROR');\n return false;\n }\n }\n\n // Check if modules need to be loaded\n if (!this.wasmPrividModules) {\n // Validate we have required parameters before attempting load\n if (!this.apiUrl || !this.sessionToken || !this.publicKey) {\n printLogs(\n '[WasmWorkerService] ensureModulesInitialized: Missing required initialization parameters',\n { apiUrl: !!this.apiUrl, sessionToken: !!this.sessionToken, publicKey: !!this.publicKey },\n 'ERROR',\n );\n return false;\n }\n\n // Attempt to load modules\n try {\n await this.loadModules(\n {\n simd: this.isSimd,\n apiUrl: this.apiUrl,\n sessionToken: this.sessionToken,\n publicKey: this.publicKey,\n debugType: this.debugType || '',\n cacheConfig: this.setCache,\n },\n this.proxiedErrorCallback,\n );\n } catch (error) {\n printLogs('[WasmWorkerService] ensureModulesInitialized: Failed to load WASM modules', error, 'ERROR');\n return false;\n }\n }\n\n // Final validation - ensure both modules AND session are ready\n if (!this.wasmPrividModules || !this.wasmSession) {\n printLogs(\n '[WasmWorkerService] ensureModulesInitialized: WASM not fully initialized',\n { hasModules: !!this.wasmPrividModules, hasSession: !!this.wasmSession },\n 'ERROR',\n );\n return false;\n }\n\n return true;\n }\n}\n\nconst wasmWorkerServiceInstance = new WasmWorkerService();\n// Expose the Class Instance using Comlink\nexpose(wasmWorkerServiceInstance);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["proxyMarker", "createEndpoint", "releaseProxy", "finalizer", "throwMarker", "isObject", "val", "proxyTransferHandler", "obj", "port1", "port2", "expose", "port", "wrap", "throwTransferHandler", "value", "serialized", "transferHandlers", "isAllowedOrigin", "allowedOrigins", "origin", "allowedOrigin", "ep", "callback", "ev", "id", "type", "path", "argumentList", "fromWireValue", "returnValue", "parent", "prop", "rawValue", "proxy", "transfer", "wireValue", "transferables", "toWireValue", "closeEndPoint", "error", "isMessagePort", "endpoint", "target", "pendingListeners", "data", "resolver", "createProxy", "throwIfProxyReleased", "isReleased", "releaseEndpoint", "requestResponseMessage", "proxyCounter", "proxyFinalizers", "newCount", "registerProxy", "unregisterProxy", "isProxyReleased", "_target", "r", "p", "_thisArg", "rawArgumentList", "last", "processArguments", "myFlat", "arr", "processed", "v", "transferCache", "transfers", "toWireValue", "value", "name", "handler", "transferHandlers", "serializedValue", "transferables", "transferCache", "fromWireValue", "requestResponseMessage", "ep", "pendingListeners", "msg", "transfers", "resolve", "id", "generateUUID", "FeatureFlagKey", "featureFlagServiceInstance", "cachedDebugType", "setDebugType", "debugType", "cachedDebugType", "getDebugType", "cachedDebugType", "searchedParameterResult", "getEnvironment", "featureFlagServiceInstance", "FeatureFlagKey", "error", "printLogs", "printLogs", "message", "data", "type", "errorLogs", "warningLogs", "allLogs", "debugType", "getDebugType", "environment", "getEnvironment", "environment", "WASM_ULTRA_FOLDER_NAME", "INDEXED_DB_NAME", "INDEXED_STORE_NAME", "stripVersionSuffix", "version", "promisifyRequest", "request", "resolve", "reject", "readFromIndexedDB", "key", "openRequest", "INDEXED_DB_NAME", "db", "INDEXED_STORE_NAME", "store", "error", "printLogs", "writeToIndexedDB", "cachedWasm", "cachedScript", "data", "checkCacheAndCurrentAreSameVersion", "cachedModule", "currentVersionJSON", "cachedVersion", "currentVersion", "printLogs", "cachedVersionString", "currentVersionString", "stripVersionSuffix", "error", "readCurrentWasmVersion", "modulePath", "wasmBaseUrl", "wasmFolderName", "WASM_ULTRA_FOLDER_NAME", "versionUrl", "flatImageDataArraysIntoUint8Array", "imageDataArray", "totalLength", "sum", "imgData", "flatArray", "offset", "removeNullBytesFromDecodedString", "string", "char", "validateWasmBinary", "buffer", "header", "byte", "readFromIndexedDBWithTimeout", "key", "timeoutMs", "readFn", "readFromIndexedDB", "_", "reject", "clearCacheEntry", "openRequest", "INDEXED_DB_NAME", "db", "INDEXED_STORE_NAME", "promisifyRequest", "store", "isCacheCorruptionFailure", "msg", "validateCustomWasmUrl", "url", "isValid", "writeToCacheQuietly", "module", "cacheKey", "moduleVersion", "writeToIndexedDB", "classifyFailureReason", "callbackRegistry", "operation", "id", "response_str", "printLogs", "error", "error_str", "progress_type", "message", "progress_value", "base64Image", "WasmWorkerService", "WASM_ULTRA_FOLDER_NAME", "params", "errorCallback", "progressCallback", "newSession", "setDebugType", "modulePath", "moduleName", "currentModuleVersionJSON", "readCurrentWasmVersion", "ctx", "result", "relativePath", "scriptUrls", "localError", "cdnError", "usageScenario", "cache_content", "settings", "resultPointers", "stringBuffer", "isSessionInitialized", "wasmSessionPointer", "attempts", "tiers", "msg", "fallback", "tier", "buffer", "validation", "validateWasmBinary", "module", "writeToCacheQuietly", "reportedSource", "errorMessage", "classifyFailureReason", "isCacheCorruptionFailure", "clearCacheEntry", "expectedVersion", "cached", "readFromIndexedDBWithTimeout", "checkCacheAndCurrentAreSameVersion", "customWasm", "validateCustomWasmUrl", "response", "source", "wasmUrl", "wasmBinary", "noSimdCtx", "resultCallback", "imageInputSize", "imageInputPtr", "resultFirstPtr", "resultLenPtr", "config_bytes", "configInputSize", "configInputPtr", "
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType,\n} from \"./protocol\";\nexport type { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nexport const finalizer = Symbol(\"Comlink.finalizer\");\n\nconst throwMarker = Symbol(\"Comlink.thrown\");\n\n/**\n * Interface of values that were marked to be proxied with `comlink.proxy()`.\n * Can also be implemented by classes.\n */\nexport interface ProxyMarked {\n [proxyMarker]: true;\n}\n\n/**\n * Takes a type and wraps it in a Promise, if it not already is one.\n * This is to avoid `Promise<Promise<T>>`.\n *\n * This is the inverse of `Unpromisify<T>`.\n */\ntype Promisify<T> = T extends Promise<unknown> ? T : Promise<T>;\n/**\n * Takes a type that may be Promise and unwraps the Promise type.\n * If `P` is not a Promise, it returns `P`.\n *\n * This is the inverse of `Promisify<T>`.\n */\ntype Unpromisify<P> = P extends Promise<infer T> ? T : P;\n\n/**\n * Takes the raw type of a remote property and returns the type that is visible to the local thread on the proxy.\n *\n * Note: This needs to be its own type alias, otherwise it will not distribute over unions.\n * See https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types\n */\ntype RemoteProperty<T> =\n // If the value is a method, comlink will proxy it automatically.\n // Objects are only proxied if they are marked to be proxied.\n // Otherwise, the property is converted to a Promise that resolves the cloned value.\n T extends Function | ProxyMarked ? Remote<T> : Promisify<T>;\n\n/**\n * Takes the raw type of a property as a remote thread would see it through a proxy (e.g. when passed in as a function\n * argument) and returns the type that the local thread has to supply.\n *\n * This is the inverse of `RemoteProperty<T>`.\n *\n * Note: This needs to be its own type alias, otherwise it will not distribute over unions. See\n * https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types\n */\ntype LocalProperty<T> = T extends Function | ProxyMarked\n ? Local<T>\n : Unpromisify<T>;\n\n/**\n * Proxies `T` if it is a `ProxyMarked`, clones it otherwise (as handled by structured cloning and transfer handlers).\n */\nexport type ProxyOrClone<T> = T extends ProxyMarked ? Remote<T> : T;\n/**\n * Inverse of `ProxyOrClone<T>`.\n */\nexport type UnproxyOrClone<T> = T extends RemoteObject<ProxyMarked>\n ? Local<T>\n : T;\n\n/**\n * Takes the raw type of a remote object in the other thread and returns the type as it is visible to the local thread\n * when proxied with `Comlink.proxy()`.\n *\n * This does not handle call signatures, which is handled by the more general `Remote<T>` type.\n *\n * @template T The raw type of a remote object as seen in the other thread.\n */\nexport type RemoteObject<T> = { [P in keyof T]: RemoteProperty<T[P]> };\n/**\n * Takes the type of an object as a remote thread would see it through a proxy (e.g. when passed in as a function\n * argument) and returns the type that the local thread has to supply.\n *\n * This does not handle call signatures, which is handled by the more general `Local<T>` type.\n *\n * This is the inverse of `RemoteObject<T>`.\n *\n * @template T The type of a proxied object.\n */\nexport type LocalObject<T> = { [P in keyof T]: LocalProperty<T[P]> };\n\n/**\n * Additional special comlink methods available on each proxy returned by `Comlink.wrap()`.\n */\nexport interface ProxyMethods {\n [createEndpoint]: () => Promise<MessagePort>;\n [releaseProxy]: () => void;\n}\n\n/**\n * Takes the raw type of a remote object, function or class in the other thread and returns the type as it is visible to\n * the local thread from the proxy return value of `Comlink.wrap()` or `Comlink.proxy()`.\n */\nexport type Remote<T> =\n // Handle properties\n RemoteObject<T> &\n // Handle call signature (if present)\n (T extends (...args: infer TArguments) => infer TReturn\n ? (\n ...args: { [I in keyof TArguments]: UnproxyOrClone<TArguments[I]> }\n ) => Promisify<ProxyOrClone<Unpromisify<TReturn>>>\n : unknown) &\n // Handle construct signature (if present)\n // The return of construct signatures is always proxied (whether marked or not)\n (T extends { new (...args: infer TArguments): infer TInstance }\n ? {\n new (\n ...args: {\n [I in keyof TArguments]: UnproxyOrClone<TArguments[I]>;\n }\n ): Promisify<Remote<TInstance>>;\n }\n : unknown) &\n // Include additional special comlink methods available on the proxy.\n ProxyMethods;\n\n/**\n * Expresses that a type can be either a sync or async.\n */\ntype MaybePromise<T> = Promise<T> | T;\n\n/**\n * Takes the raw type of a remote object, function or class as a remote thread would see it through a proxy (e.g. when\n * passed in as a function argument) and returns the type the local thread has to supply.\n *\n * This is the inverse of `Remote<T>`. It takes a `Remote<T>` and returns its original input `T`.\n */\nexport type Local<T> =\n // Omit the special proxy methods (they don't need to be supplied, comlink adds them)\n Omit<LocalObject<T>, keyof ProxyMethods> &\n // Handle call signatures (if present)\n (T extends (...args: infer TArguments) => infer TReturn\n ? (\n ...args: { [I in keyof TArguments]: ProxyOrClone<TArguments[I]> }\n ) => // The raw function could either be sync or async, but is always proxied automatically\n MaybePromise<UnproxyOrClone<Unpromisify<TReturn>>>\n : unknown) &\n // Handle construct signature (if present)\n // The return of construct signatures is always proxied (whether marked or not)\n (T extends { new (...args: infer TArguments): infer TInstance }\n ? {\n new (\n ...args: {\n [I in keyof TArguments]: ProxyOrClone<TArguments[I]>;\n }\n ): // The raw constructor could either be sync or async, but is always proxied automatically\n MaybePromise<Local<Unpromisify<TInstance>>>;\n }\n : unknown);\n\nconst isObject = (val: unknown): val is object =>\n (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n\n/**\n * Customizes the serialization of certain values as determined by `canHandle()`.\n *\n * @template T The input type being handled by this transfer handler.\n * @template S The serialized type sent over the wire.\n */\nexport interface TransferHandler<T, S> {\n /**\n * Gets called for every value to determine whether this transfer handler\n * should serialize the value, which includes checking that it is of the right\n * type (but can perform checks beyond that as well).\n */\n canHandle(value: unknown): value is T;\n\n /**\n * Gets called with the value if `canHandle()` returned `true` to produce a\n * value that can be sent in a message, consisting of structured-cloneable\n * values and/or transferrable objects.\n */\n serialize(value: T): [S, Transferable[]];\n\n /**\n * Gets called to deserialize an incoming value that was serialized in the\n * other thread with this transfer handler (known through the name it was\n * registered under).\n */\n deserialize(value: S): T;\n}\n\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler: TransferHandler<object, MessagePort> = {\n canHandle: (val): val is ProxyMarked =>\n isObject(val) && (val as ProxyMarked)[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n\ninterface ThrownValue {\n [throwMarker]: unknown; // just needs to be present\n value: unknown;\n}\ntype SerializedThrownValue =\n | { isError: true; value: Error }\n | { isError: false; value: unknown };\ntype PendingListenersMap = Map<\n string,\n (value: WireValue | PromiseLike<WireValue>) => void\n>;\n\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler: TransferHandler<\n ThrownValue,\n SerializedThrownValue\n> = {\n canHandle: (value): value is ThrownValue =>\n isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized: SerializedThrownValue;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n } else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(\n new Error(serialized.value.message),\n serialized.value\n );\n }\n throw serialized.value;\n },\n};\n\n/**\n * Allows customizing the serialization of certain values.\n */\nexport const transferHandlers = new Map<\n string,\n TransferHandler<unknown, unknown>\n>([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\n\nfunction isAllowedOrigin(\n allowedOrigins: (string | RegExp)[],\n origin: string\n): boolean {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\n\nexport function expose(\n obj: any,\n ep: Endpoint = globalThis as any,\n allowedOrigins: (string | RegExp)[] = [\"*\"]\n) {\n ep.addEventListener(\"message\", function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message),\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n } catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback as any);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage({ ...wireValue, id }, transferables);\n });\n } as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nfunction isMessagePort(endpoint: Endpoint): endpoint is MessagePort {\n return endpoint.constructor.name === \"MessagePort\";\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n if (isMessagePort(endpoint)) endpoint.close();\n}\n\nexport function wrap<T>(ep: Endpoint, target?: any): Remote<T> {\n const pendingListeners : PendingListenersMap = new Map();\n\n ep.addEventListener(\"message\", function handleMessage(ev: Event) {\n const { data } = ev as MessageEvent;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n\n try {\n resolver(data);\n } finally {\n pendingListeners.delete(data.id);\n }\n });\n\n return createProxy<T>(ep, pendingListeners, [], target) as any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction releaseEndpoint(ep: Endpoint) {\n return requestResponseMessage(ep, new Map(), {\n type: MessageType.RELEASE,\n }).then(() => {\n closeEndPoint(ep);\n });\n}\n\ninterface FinalizationRegistry<T> {\n new (cb: (heldValue: T) => void): FinalizationRegistry<T>;\n register(\n weakItem: object,\n heldValue: T,\n unregisterToken?: object | undefined\n ): void;\n unregister(unregisterToken: object): void;\n}\ndeclare var FinalizationRegistry: FinalizationRegistry<Endpoint>;\n\nconst proxyCounter = new WeakMap<Endpoint, number>();\nconst proxyFinalizers =\n \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep: Endpoint) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n\nfunction registerProxy(proxy: object, ep: Endpoint) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n}\n\nfunction unregisterProxy(proxy: object) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n pendingListeners: PendingListenersMap,\n path: (string | number | symbol)[] = [],\n target: object = function () {}\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: MessageType.GET,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n pendingListeners,\n {\n type: MessageType.SET,\n path: [...path, prop].map((p) => p.toString()),\n value,\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: MessageType.ENDPOINT,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n pendingListeners,\n {\n type: MessageType.APPLY,\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n pendingListeners,\n {\n type: MessageType.CONSTRUCT,\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables\n ).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer<T>(obj: T, transfers: Transferable[]): T {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T extends {}>(obj: T): T & ProxyMarked {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = globalThis,\n targetOrigin = \"*\"\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n pendingListeners: PendingListenersMap,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n});\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n", "export interface FeatureFlagProvider {\n evaluateFlag<T = boolean>(flagKey: string, defaultValue?: T): T;\n}\n\nexport const FeatureFlagKey = {\n FaceServiceWebWorker: 'face-service-web-worker',\n DocumentServiceWebWorker: 'document-service-web-worker',\n EngineServiceWebWorker: 'engine-service-web-worker',\n DebugType: 'debug-type',\n WasmBuildType: 'sdk-wasm-build',\n} as const;\n\nexport type FeatureFlagKeyType = (typeof FeatureFlagKey)[keyof typeof FeatureFlagKey];\n", "import { detect } from 'detect-browser';\nimport { simd } from 'wasm-feature-detect';\nimport { DEBUG_TYPES_WITH_IMAGES } from '../../core/document/document.constants';\nimport { FeatureFlagKey, LDFeatureFlagService } from '../feature-flag';\n\nexport function isWebAssemblyAvailable(): boolean {\n return typeof WebAssembly !== 'undefined';\n}\n\n// Singleton instance for feature flag service\nlet featureFlagServiceInstance: LDFeatureFlagService | null = null;\n\n// Cached debug type for worker contexts where window is not available\nlet cachedDebugType: string | null = null;\n\n/**\n Saving the feature flag service instance for shared utilities\n */\nexport function setFeatureFlagService(service: LDFeatureFlagService): void {\n featureFlagServiceInstance = service;\n}\n\n/**\n * Set debug type for contexts where window.location is not available (e.g., Web Workers)\n */\nexport function setDebugType(debugType: string): void {\n cachedDebugType = debugType;\n}\n\nexport function iOS(): boolean {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform,\n );\n}\n\nexport function getDebugType(): string {\n // If debug type is cached (worker context), use it\n if (cachedDebugType !== null) {\n return cachedDebugType;\n }\n\n // Main thread logic with window access protection\n try {\n const queryParams = new URLSearchParams(window.location.search);\n const searchedParameterResult = queryParams.get('debug_type');\n\n if (searchedParameterResult) {\n return searchedParameterResult;\n }\n\n const environment = getEnvironment();\n if (environment !== 'prod') {\n return '3';\n }\n\n const debugTypeFromFlag = featureFlagServiceInstance?.evaluateFlag(FeatureFlagKey.DebugType);\n return debugTypeFromFlag?.toString() || '0';\n } catch (error) {\n // Worker context or other error - return safe default\n printLogs('[shared.utils] getDebugType error', error);\n return '0';\n }\n}\n/**\n * Parses a WASM response string and logs the operation details.\n * Returns the parsed object, or null if the response string is empty or malformed.\n */\nexport function parseWasmResponse<T = any>(\n responseStr: string,\n operation: string,\n id: string,\n logPrefix?: string,\n): T | null {\n const isResponse = responseStr.length > 0;\n\n let parsed: T | null = null;\n if (isResponse) {\n try {\n parsed = JSON.parse(responseStr);\n } catch (error) {\n printLogs(`[shared.utils][JS RESPONSE]: Failed to parse WASM response JSON: `, error);\n return null;\n }\n }\n\n printLogs(`[shared.utils][JS RESPONSE]:${logPrefix ? ` ${logPrefix}` : ''} response_str': `, parsed ?? '');\n printLogs(`[shared.utils][JS RESPONSE]: operation': `, operation || 'null');\n printLogs(`[shared.utils][JS RESPONSE]: id: `, id || 'null');\n return parsed as T | null;\n}\n\nexport function printLogs(message: string, data: any, type = 'LOG') {\n const errorLogs = ['1', '2', '3', '901', '902', '903'];\n const warningLogs = ['2', '3', '902', '903'];\n const allLogs = ['3', '903', '904'];\n\n const debugType = getDebugType();\n\n if (type === 'ERROR' && errorLogs.includes(debugType)) {\n console.error('DEBUG_SDK', message, data);\n } else if (type === 'WARN' && warningLogs.includes(debugType)) {\n console.warn('DEBUG_SDK', message, data);\n } else if (type === 'DEBUG' && allLogs.includes(debugType)) {\n console.log('DEBUG_SDK', message, data);\n } else if (type === 'LOG' && allLogs.includes(debugType)) {\n console.log('DEBUG_SDK', message, data);\n }\n}\n\nexport function getDefaultCameraDeviceId() {\n return localStorage.getItem('defaultDeviceId');\n}\n\n/**\n * Set default camera device ID in localStorage\n */\nexport function setDefaultCameraDeviceId(deviceId: string) {\n localStorage.setItem('defaultDeviceId', deviceId);\n}\n\n/**\n * Check if current platform is mobile using detect-browser\n */\nexport function isMobilePlatform(): boolean {\n const browser = detect();\n const os = browser?.os ?? '';\n return iOS() || ['iOS', 'android', 'Android OS'].includes(os);\n}\n\n/**\n * Check if current device is mobile using user agent detection\n * More comprehensive than isMobilePlatform but uses UA sniffing\n */\nexport function isMobileDevice(): boolean {\n const browser = detect();\n const os = browser?.os ?? '';\n return ['iOS', 'Android OS', 'Windows Mobile'].includes(os);\n}\n\n// TODO: remove this from shared and leave only in wasm.utils\n/**\n * Get SIMD support status\n */\nexport async function getIsSIMD(): Promise<boolean> {\n if (!isWebAssemblyAvailable()) {\n return false;\n }\n try {\n return await simd();\n } catch (error) {\n printLogs('[shared.utils] getIsSIMD error:', error);\n return false;\n }\n}\n/**\n * Check if debug mode should create images\n */\nexport function shouldCreateDebugImages(): boolean {\n const debugType = getDebugType();\n return DEBUG_TYPES_WITH_IMAGES.includes(debugType);\n}\n\n/**\n * Create and download images for debugging purposes\n */\nexport async function createDebugImages(images: ImageData[], title: string, isEnrollFlow: boolean): Promise<void> {\n if (!shouldCreateDebugImages()) {\n return;\n }\n\n try {\n const promises = images.map(async (imageData) => {\n const canvas = document.createElement('canvas');\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n const context = canvas.getContext('2d');\n context.putImageData(imageData, 0, 0);\n\n const blob = await new Promise<Blob>((resolve) => canvas.toBlob(resolve, 'image/jpeg'));\n const url = URL.createObjectURL(blob);\n return { url, blob };\n });\n\n const data = await Promise.all(promises);\n const a = document.createElement('a');\n\n for (let i = 0; i < data.length; i++) {\n await new Promise<void>((resolve) => {\n a.href = data[i].url;\n a.type = 'image/png';\n a.download = `${title}_${isEnrollFlow ? 'enroll' : 'predict'}.png`;\n document.body.appendChild(a);\n\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n URL.revokeObjectURL(data[i].url);\n resolve();\n }, 1000);\n });\n }\n\n printLogs('[face.utils] Debug images created and downloaded', { title, count: images.length });\n } catch (error) {\n printLogs('[face.utils] Error creating debug images', error, 'ERROR');\n }\n}\n\n/**\n * Convert canvas/image data to base64\n */\nexport function imageDataToBase64(imageData: ImageData): Promise<string> {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n const context = canvas.getContext('2d');\n context.putImageData(imageData, 0, 0);\n\n canvas.toBlob((blob) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n });\n}\n\n/**\n * Wrapper for callback that creates debug images before calling the original callback\n */\nexport function wrapCallbackWithImageCreation<T>(\n callback: (result: T) => void,\n imageData: ImageData,\n isEnrollFlow: boolean,\n): (result: T) => void {\n return async (result: any) => {\n if (shouldCreateDebugImages()) {\n const title = `original_${result?.face_validation_status ?? 'unknown'}_${result?.antispoof_status ?? 'unknown'}`;\n await createDebugImages([imageData], title, isEnrollFlow);\n }\n callback(result);\n };\n}\n\nexport function downloadImageFromBase64(base64Data: string, filename: string): boolean {\n const debugType = getDebugType();\n if (!(debugType === '903' || debugType === '904')) {\n return false;\n }\n\n try {\n // Check if base64Data already has the data URL prefix\n const dataUrl = base64Data.startsWith('data:') ? base64Data : `data:image/jpeg;base64,${base64Data}`;\n\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename}.jpg`;\n document.body.appendChild(a);\n\n a.click();\n document.body.removeChild(a);\n\n printLogs('[shared.utils] Debug cropped image downloaded', filename);\n return true;\n } catch (error) {\n printLogs('[shared.utils] Error downloading debug image', error, 'ERROR');\n return false;\n }\n}\n\nlet environment: string | null;\n\nexport const setEnvVariables = (env: string) => {\n environment = env;\n};\n\nexport const getEnvironment = () => {\n if (environment) {\n return environment;\n }\n return null;\n};\n", "export const WASM_ULTRA_FOLDER_NAME = 'ultra';\nexport const WASM_MODULE_NAME = 'privid_fhe_ultra';\n\nexport const INDEXED_DB_NAME = '/privid-wasm';\nexport const INDEXED_STORE_NAME = '/privid-wasm';\nexport const INDEXED_DB_VERSION = 21;\n", "import { isWebAssemblyAvailable, printLogs } from '../../modules/internal/shared/shared.utils';\nimport {\n INDEXED_DB_NAME,\n INDEXED_DB_VERSION,\n INDEXED_STORE_NAME,\n WASM_ULTRA_FOLDER_NAME,\n} from './wasm-worker.constants';\nimport { WasmPrividModules } from './wasm-worker.domain';\nimport { FetchResourceURLs, WasmCacheData, WasmLoadFallbackReason } from './wasm-worker.types';\n\n/**\n * Strips the trailing environment suffix (-prod or -dev) from a WASM version string.\n *\n * The WASM binary reports its version via _privid_get_version() as the base version\n * (e.g., \"26.02.13-24c4552\"), while version.json includes an environment suffix\n * (e.g., \"26.02.13-24c4552-prod\" or \"26.02.13-24c4552-dev\").\n *\n * This normalizes both forms to the base version so they can be compared.\n */\nexport function stripVersionSuffix(version: string): string {\n return version.replace(/-(prod|dev)$/, '');\n}\n\n// Helper to promisify IndexedDB requests\nfunction promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n// Simplified version using the helper\nexport async function readFromIndexedDB(key: string): Promise<any> {\n if (!indexedDB) {\n throw new Error('IndexedDB not available');\n }\n\n const openRequest = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result;\n if (!db.objectStoreNames.contains(INDEXED_STORE_NAME)) {\n db.createObjectStore(INDEXED_STORE_NAME);\n }\n };\n\n const db = await promisifyRequest(openRequest);\n\n try {\n const transaction = db.transaction(INDEXED_STORE_NAME, 'readonly');\n const store = transaction.objectStore(INDEXED_STORE_NAME);\n const result = await promisifyRequest(store.get(key));\n return result;\n } catch (error) {\n printLogs('[WasmWorkerService] Error reading from IndexedDB:', error);\n throw error;\n } finally {\n db.close();\n }\n}\n\n// Refactored function\nexport async function writeToIndexedDB(\n key: string,\n cachedWasm: any,\n cachedScript: any,\n version: string | number,\n): Promise<string> {\n if (!indexedDB) {\n throw new Error('IndexedDB not available');\n }\n\n const openRequest = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result;\n if (!db.objectStoreNames.contains(INDEXED_STORE_NAME)) {\n db.createObjectStore(INDEXED_STORE_NAME);\n }\n };\n\n const db = await promisifyRequest(openRequest);\n\n try {\n const transaction = db.transaction(INDEXED_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(INDEXED_STORE_NAME);\n\n const data: WasmCacheData = { cachedWasm, cachedScript, version };\n await promisifyRequest(store.put(data, key));\n\n return 'saved';\n } finally {\n db.close();\n }\n}\n\nexport async function fetchResource(urls: FetchResourceURLs, useCdnLink?: boolean) {\n let localError: unknown;\n // Try local first\n try {\n printLogs(`[WasmWorkerService] fetchResource from localUrl`, urls.local);\n const response = await fetch(urls.local);\n if (!response.ok) {\n throw new Error(`Local response not ok: ${response.status}`);\n }\n printLogs(`[WasmWorkerService] fetchResource local response: `, response);\n return response;\n } catch (error) {\n localError = error;\n printLogs(`[WasmWorkerService] Local fetch failed, trying CDN. Error: ${localError}`, '', 'WARN');\n }\n\n // CDN fallback (only if enabled)\n if (useCdnLink) {\n printLogs(`[WasmWorkerService] fetchResource from cdnUrl`, urls.cdn);\n const response = await fetch(urls.cdn);\n if (!response.ok) {\n throw new Error(`CDN fetch failed: ${response.status} for ${urls.cdn}`);\n }\n return response;\n }\n\n throw new Error(`Local fetch failed and CDN is disabled for ${urls.local}: ${localError}`);\n}\n\n/**\n *\n * This function Verifies the cached WASM version from IndexDB and the local WASM version.\n * The function strip version suffix because the DEV and Prod WASMs are saved using different IndexDB key.\n * Also, the WASM itself strips the suffix when using the `WasmModule._privid_get_version()`\n * @returns boolean that represents if the version matches.\n */\nexport function checkCacheAndCurrentAreSameVersion(\n cachedModule: WasmCacheData | null,\n currentVersionJSON: { version: string | number } | null,\n): boolean {\n try {\n const cachedVersion = cachedModule?.version;\n const currentVersion = currentVersionJSON?.version;\n\n printLogs(\n `[WasmWorkerService] checkCacheAndCurrentAreSameVersion cachedVersion vs currentVersion: `,\n `${cachedVersion} vs ${currentVersion}`,\n );\n\n const cachedVersionString = typeof cachedVersion === 'string' ? cachedVersion : cachedVersion.toString();\n const currentVersionString = typeof currentVersion === 'string' ? currentVersion : currentVersion.toString();\n\n return stripVersionSuffix(cachedVersionString) === stripVersionSuffix(currentVersionString);\n } catch (error) {\n printLogs(`[WasmWorkerService] Error comparing versions:`, error, 'ERROR');\n return false;\n }\n}\n\nexport async function readCurrentWasmVersion(\n modulePath: string,\n wasmBaseUrl?: string | null,\n wasmFolderName: string = WASM_ULTRA_FOLDER_NAME,\n) {\n const versionUrl = wasmBaseUrl\n ? `${wasmBaseUrl}/wasm/${wasmFolderName}/${modulePath}/version.json`\n : `../wasm/${wasmFolderName}/${modulePath}/version.json`;\n\n const versionData = await fetch(versionUrl);\n return versionData.json();\n}\n\nexport function flatImageDataArraysIntoUint8Array(imageDataArray: ImageData[]): Uint8Array {\n const totalLength = imageDataArray.reduce((sum, imgData) => sum + imgData.data.length, 0);\n const flatArray = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const imgData of imageDataArray) {\n flatArray.set(imgData.data, offset);\n offset += imgData.data.length;\n }\n\n return flatArray;\n}\n\nexport function removeNullBytesFromDecodedString(string: string): string {\n return string\n .split('')\n .filter((char) => char.codePointAt(0))\n .join('');\n}\n\nexport function validateWasmBinary(buffer: ArrayBuffer): { valid: boolean; reason?: string } {\n if (!buffer || buffer.byteLength < 8) {\n return { valid: false, reason: 'wasm_empty_or_truncated' };\n }\n\n const header = new Uint8Array(buffer, 0, 4);\n const WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];\n if (!WASM_MAGIC.every((byte, i) => header[i] === byte)) {\n return { valid: false, reason: 'wasm_invalid_magic_number' };\n }\n\n if (isWebAssemblyAvailable() && typeof WebAssembly.validate === 'function' && !WebAssembly.validate(buffer)) {\n return { valid: false, reason: 'wasm_structural_validation_failed' };\n }\n\n return { valid: true };\n}\n\nexport async function readFromIndexedDBWithTimeout(\n key: string,\n timeoutMs = 5000,\n readFn: (key: string) => Promise<any> = readFromIndexedDB,\n): Promise<any> {\n return Promise.race([\n readFn(key),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error(`IndexedDB read timed out after ${timeoutMs}ms`)), timeoutMs),\n ),\n ]);\n}\n\nexport async function clearCacheEntry(key: string): Promise<void> {\n if (!indexedDB) {\n throw new Error('IndexedDB not available');\n }\n\n const openRequest = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const db = openRequest.result;\n if (!db.objectStoreNames.contains(INDEXED_STORE_NAME)) {\n db.createObjectStore(INDEXED_STORE_NAME);\n }\n };\n\n const db = await promisifyRequest(openRequest);\n\n try {\n const transaction = db.transaction(INDEXED_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(INDEXED_STORE_NAME);\n await promisifyRequest(store.delete(key));\n } finally {\n db.close();\n }\n}\n\nexport function isCacheCorruptionFailure(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const msg = error.message.toLowerCase();\n return (\n msg.includes('validation failed') ||\n msg.includes('wasm_invalid_magic_number') ||\n msg.includes('wasm_structural_validation_failed') ||\n msg.includes('wasm_empty_or_truncated')\n );\n}\n\nexport async function validateCustomWasmUrl(url: string): Promise<boolean> {\n try {\n printLogs('[wasm-worker.utils] Validating custom WASM URL:', url);\n const response = await fetch(url, { method: 'HEAD' });\n const isValid = response.ok;\n printLogs('[wasm-worker.utils] Custom WASM URL validation result:', isValid);\n return isValid;\n } catch (error) {\n printLogs('[wasm-worker.utils] Custom WASM URL validation failed:', error, 'ERROR');\n return false;\n }\n}\n\nexport async function writeToCacheQuietly(\n buffer: ArrayBuffer,\n module: WasmPrividModules,\n cacheKey: string = WASM_ULTRA_FOLDER_NAME,\n): Promise<void> {\n try {\n \n const moduleVersion = module.UTF8ToString(module._privid_get_version());\n await writeToIndexedDB(cacheKey, buffer, '', moduleVersion);\n } catch (error) {\n printLogs('[WasmWorkerService] Cache write failed (non-fatal)', error, 'WARN');\n }\n}\n\nexport function classifyFailureReason(error: unknown): WasmLoadFallbackReason {\n if (!(error instanceof Error)) return 'unknown';\n\n const msg = error.message.toLowerCase();\n\n if (msg.includes('timed out')) return 'cache_read_timeout';\n if (msg.includes('cache miss')) return 'cache_miss';\n if (msg.includes('cache version mismatch')) return 'cache_version_mismatch';\n if (msg.includes('validation failed')) return 'wasm_validation_failed';\n if (msg.includes('indexeddb')) return 'cache_read_error';\n if (msg.includes('fetch failed') || msg.includes('networkerror')) return 'fetch_failed';\n if (msg.includes('custom url validation failed')) return 'custom_url_invalid';\n if (msg.includes('custom url version mismatch')) return 'custom_url_version_mismatch';\n // The isWebAssemblyAvailable() guard must be evaluated first: short-circuit evaluation\n // prevents ReferenceError from accessing WebAssembly.CompileError when WebAssembly\n // is undefined. Without this ordering, the `error instanceof WebAssembly.CompileError`\n // expression would throw before the right-hand side is ever checked.\n if (isWebAssemblyAvailable() && error instanceof WebAssembly.CompileError) return 'wasm_compile_error';\n\n return 'unknown';\n}\n", " \n \nimport { expose } from 'comlink';\nimport { WasmPrividModules, WasmWorker } from './wasm-worker.domain';\nimport {\n LoadParams,\n EnrollParams,\n PredictParams,\n AgeEstimateParams,\n CompareEmbeddingsParams,\n PkiEncryptParams,\n ScanBackDocumentParams,\n ScanFrontDocumentParams,\n DocumentOcrParams,\n WasmSessionPointer,\n ApiUrl,\n ProxiedCallback,\n RegularCallback,\n WasmLoadStatus,\n WasmLoadFallback,\n WasmResolveContext,\n TierAttempt,\n LoadModulesResult,\n CustomWasmConfig,\n FetchResourceURLs,\n} from './wasm-worker.types';\nimport { isWebAssemblyAvailable, printLogs, setDebugType } from '../../modules/internal/shared/shared.utils';\nimport {\n checkCacheAndCurrentAreSameVersion,\n classifyFailureReason,\n clearCacheEntry,\n flatImageDataArraysIntoUint8Array,\n isCacheCorruptionFailure,\n readCurrentWasmVersion,\n readFromIndexedDBWithTimeout,\n removeNullBytesFromDecodedString,\n validateCustomWasmUrl,\n validateWasmBinary,\n writeToCacheQuietly,\n} from './wasm-worker.utils';\nimport { WASM_ULTRA_FOLDER_NAME } from './wasm-worker.constants';\n\ntype ResolveResult = {\n module: WasmPrividModules;\n status: WasmLoadStatus;\n attempts: TierAttempt[];\n};\n\n// Declare the global function created by eval'd WASM script\ndeclare global {\n function createTFLiteModule(config: { wasmBinary: ArrayBuffer }): Promise<WasmPrividModules>;\n function privid_wasm_result(operation: string, id: string, response_str: string): void;\n function privid_wasm_error(operation: string, id: string, error_str: string): void;\n function privid_wasm_progress(progress_type: number, message: string, progress_value: number): void;\n function privid_wasm_cropping(base64Image: string): void;\n}\n\nconst callbackRegistry = {\n result: null as ((...args: any[]) => void) | null,\n error: null as ((operation: string, id: string, error_str: string) => void) | null,\n progress: null as ((progress_type: number, message: string, progress_value: number) => void) | null,\n wasmCropping: null as ((base64Image: string) => void) | null,\n};\n\n// Set up the global WASM callbacks once at module level\n// These MUST be on globalThis for WASM to find them (due to IIFE build format)\n// In WasmWorkerService.ts, update the globalThis.privid_wasm_result function (around line 43)\nglobalThis.privid_wasm_result = (operation: string, id: string, response_str: string) => {\n if (callbackRegistry.result) {\n try {\n printLogs('[WasmWorkerService] privid_wasm_result called with operation:', operation);\n printLogs('[WasmWorkerService] privid_wasm_result called with id:', id);\n printLogs('[WasmWorkerService] privid_wasm_result called with response_str:', response_str);\n callbackRegistry.result(operation, id, response_str);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in result callback:', error, 'ERROR');\n }\n } else {\n printLogs('[WasmWorkerService] No result callback registered', '', 'WARN');\n }\n};\n\nglobalThis.privid_wasm_error = (operation: string, id: string, error_str: string) => {\n printLogs('[WasmWorkerService] privid_wasm_error called:', { operation, id, error_str }, 'ERROR');\n if (callbackRegistry.error) {\n try {\n callbackRegistry.error(operation, id, error_str);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in error callback:', error, 'ERROR');\n }\n } else {\n printLogs('[WasmWorkerService] No error callback registered', '', 'WARN');\n }\n};\n\nglobalThis.privid_wasm_progress = (progress_type: number, message: string, progress_value: number) => {\n printLogs('[WasmWorkerService] privid_wasm_progress called:', { progress_type, message, progress_value });\n if (callbackRegistry.progress) {\n try {\n callbackRegistry.progress(progress_type, message, progress_value);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in progress callback:', error, 'ERROR');\n }\n }\n};\n\nglobalThis.privid_wasm_cropping = (base64Image: string) => {\n printLogs('[WasmWorkerService] privid_wasm_cropping called', base64Image);\n if (callbackRegistry.wasmCropping) {\n try {\n callbackRegistry.wasmCropping(base64Image);\n } catch (error) {\n printLogs('[WasmWorkerService] Error in wasmCropping callback:', error, 'ERROR');\n }\n }\n};\n\nexport class WasmWorkerService implements WasmWorker {\n private wasmPrividModules: WasmPrividModules | null = null;\n private apiUrl: ApiUrl | null = null;\n private sessionToken: string | null = null;\n private publicKey: string | null = null;\n private debugType: string | null = null;\n private proxiedResultCallback: ProxiedCallback | null = null;\n private proxiedErrorCallback: ProxiedCallback | null = null;\n private proxiedProgressCallback: ProxiedCallback | null = null;\n private wasmSession: number | null = null;\n private setCache = true;\n private checkWasmLoaded = false;\n private cdnUrl = 'https://ultra-wasm.devel.privateid.com';\n private useCdnLink = true;\n private isSimd: boolean | null = null;\n private moduleInitializationLock: Promise<LoadModulesResult> | null = null;\n private isModuleInitializing = false;\n private customWasm: CustomWasmConfig | null = null;\n private wasmBaseUrl: string | null = null;\n private lastLoadStatus: WasmLoadStatus | null = null;\n private currentWasmVersion: string | null = null;\n private wasmFolderName: string = WASM_ULTRA_FOLDER_NAME;\n\n private getWasmFolderName(): string {\n return this.wasmFolderName;\n }\n\n async loadModules(\n params: LoadParams,\n errorCallback: ProxiedCallback,\n progressCallback?: ProxiedCallback,\n ): Promise<LoadModulesResult> {\n try {\n // Handle session regeneration without re-downloading modules.\n // This path is used when credentials change (e.g., token refresh) but modules are already loaded.\n if (this.wasmPrividModules && this.wasmSession && params.shouldRegenerateSession) {\n return this.regenerateSession(params, errorCallback, progressCallback);\n }\n\n // If modules are already loaded and session exists, don't re-initialize!\n // Re-initialization corrupts the WASM state causing _privid_check_models() to return 0\n if (this.wasmPrividModules && this.wasmSession) {\n return { message: 'Already initialized', status: this.lastLoadStatus };\n }\n\n if (this.moduleInitializationLock) {\n try {\n await this.moduleInitializationLock;\n return { message: 'Already loaded', status: this.lastLoadStatus };\n } catch (error) {\n printLogs('[WasmWorkerService] loadModules error', error);\n return { message: 'Retrying initialization', status: null };\n }\n }\n\n this.isModuleInitializing = true;\n this.moduleInitializationLock = this.loadModulesInternal(params, errorCallback, progressCallback);\n const result = await this.moduleInitializationLock;\n\n return result;\n } catch (error) {\n printLogs('[WasmWorkerService] loadModules error', error, 'ERROR');\n throw error;\n } finally {\n this.isModuleInitializing = false;\n this.moduleInitializationLock = null;\n }\n }\n\n private async regenerateSession(\n params: LoadParams,\n errorCallback: ProxiedCallback,\n progressCallback?: ProxiedCallback,\n ): Promise<LoadModulesResult> {\n printLogs('[WasmWorkerService] Regenerating session as requested', '');\n\n // Update callbacks and credentials for the new session\n this.proxiedErrorCallback = errorCallback;\n callbackRegistry.error = errorCallback;\n this.proxiedProgressCallback = progressCallback;\n callbackRegistry.progress = progressCallback;\n this.apiUrl = params.apiUrl;\n this.sessionToken = params.sessionToken;\n this.publicKey = params.publicKey;\n\n // Deinitialize the old session to free C++ heap memory.\n // Wrapped in try-catch: if deinit throws (e.g., due to the C++ layer's internal state),\n // we log and proceed -- a leaked session is better than a blocked regeneration.\n try {\n this.wasmPrividModules._privid_deinitialize_session(this.wasmSession);\n } catch (error) {\n printLogs(\n '[WasmWorkerService] _privid_deinitialize_session failed (non-fatal, proceeding with regeneration)',\n error,\n 'WARN',\n );\n }\n\n // Null the existing session so initializeWasmSession creates a new one\n // (initializeWasmSession returns early if this.wasmSession is already set)\n this.wasmSession = null;\n\n const newSession = await this.initializeWasmSession(params.usageScenario, params.cacheContent);\n if (!newSession) {\n printLogs('[WasmWorkerService] ERROR: Failed to regenerate session', '', 'ERROR');\n throw new Error('Session regeneration failed');\n }\n this.wasmSession = newSession;\n\n return { message: 'Session regenerated', status: this.lastLoadStatus };\n }\n\n private async loadModulesInternal(\n params: LoadParams,\n errorCallback: ProxiedCallback,\n progressCallback?: ProxiedCallback,\n ): Promise<LoadModulesResult> {\n if (!isWebAssemblyAvailable()) {\n throw new Error('WebAssembly is not available in this worker context.');\n }\n this.proxiedErrorCallback = errorCallback;\n callbackRegistry.error = errorCallback;\n this.proxiedProgressCallback = progressCallback;\n callbackRegistry.progress = progressCallback;\n this.apiUrl = params.apiUrl;\n this.sessionToken = params.sessionToken;\n this.publicKey = params.publicKey;\n this.useCdnLink = params.useCdn ?? true;\n this.setCache = params.cacheConfig;\n this.isSimd = params.simd;\n this.customWasm = params.customWasm || null;\n this.wasmBaseUrl = params.wasmBaseUrl || null;\n\n if (params.debugType) {\n this.debugType = params.debugType;\n setDebugType(params.debugType);\n }\n\n if (params.wasmFolderName) {\n this.wasmFolderName = params.wasmFolderName;\n }\n\n if (params.cdnBaseUrl) {\n this.cdnUrl = params.cdnBaseUrl;\n }\n\n printLogs('[WasmWorkerService] isLoad params: ', params);\n\n // --- Resolve version ---\n const modulePath = params.simd ? 'simd' : 'nosimd';\n const moduleName = 'privid_fhe_ultra';\n const currentModuleVersionJSON = await readCurrentWasmVersion(\n modulePath,\n this.wasmBaseUrl,\n this.getWasmFolderName(),\n );\n this.currentWasmVersion = currentModuleVersionJSON.version;\n\n // --- Resolve WASM module through tier pipeline ---\n // Note: this.setCache may be undefined when cacheConfig is not passed in LoadParams.\n // Default to true to match WasmOrchestratorService behavior (hardcodes cacheConfig: true).\n const ctx: WasmResolveContext = {\n modulePath,\n moduleName,\n version: currentModuleVersionJSON.version,\n saveCache: this.setCache ?? true,\n };\n\n const result = await this.resolveWasmModule(ctx);\n\n this.wasmPrividModules = result.module;\n this.lastLoadStatus = result.status;\n\n // --- Initialize WASM session ---\n if (!this.checkWasmLoaded) {\n await this.initializeWasmSession(params.usageScenario, params.cacheContent);\n this.checkWasmLoaded = true;\n }\n\n // --- Final verification ---\n if (!this.wasmPrividModules || !this.wasmSession) {\n throw new Error('WASM modules loaded but session not initialized');\n }\n\n printLogs(\n `[WasmWorkerService] Load complete. Source: ${result.status.source}, Attempts: ${result.attempts.length}`,\n result.attempts,\n );\n\n return {\n message: `Loaded from ${result.status.source}`,\n status: this.lastLoadStatus,\n };\n }\n\n /**\n * Constructs a local URL for WASM resources.\n * Uses wasmBaseUrl if available (passed from main thread), otherwise falls back to relative path.\n */\n private getLocalWasmUrl(relativePath: string): string {\n if (this.wasmBaseUrl) {\n return `${this.wasmBaseUrl}/wasm/${relativePath}`;\n }\n return `../wasm/${relativePath}`;\n }\n\n /**\n * Loads a script via direct URL importScripts with CDN/local fallback.\n * Avoids blob: URLs which are blocked by strict Content-Security-Policy.\n */\n private importScriptFromUrl(scriptUrls: FetchResourceURLs): void {\n let localError: unknown;\n try {\n importScripts(scriptUrls.local);\n return;\n } catch (error) {\n localError = error;\n printLogs('[WasmWorkerService] Local importScripts failed, trying CDN', localError, 'WARN');\n }\n\n if (this.useCdnLink) {\n try {\n importScripts(scriptUrls.cdn);\n } catch (cdnError) {\n throw new Error(`Both local and CDN importScripts failed. Local error: ${localError}; CDN error: ${cdnError}`);\n }\n } else {\n throw new Error(`Local importScripts failed and CDN is disabled: ${localError}`);\n }\n }\n\n private async initializeWasmSession(usageScenario = '', cache_content = ''): Promise<WasmSessionPointer | null> {\n if (this.wasmSession) {\n return this.wasmSession;\n }\n const settings = {\n ...this.apiUrl,\n session_token: this.sessionToken,\n public_key: this.publicKey,\n debug_level: this.debugType,\n custom_settings: { usage_scenario: usageScenario, cache_content },\n };\n printLogs(`[WasmWorkerService] initializeWasmSession settings:`, settings);\n\n const resultPointers = this.createWasmResultPointers();\n const stringBuffer = this.createStringBuffer(JSON.stringify(settings));\n\n const isSessionInitialized = this.wasmPrividModules._privid_initialize_session(\n ...stringBuffer.getArgs(),\n resultPointers.getOuterPointer(),\n );\n printLogs(`[WasmWorkerService] initializeWasmSession isSessionInitialized: `, isSessionInitialized);\n\n stringBuffer.free();\n\n if (!isSessionInitialized) {\n printLogs('[WasmWorkerService] ERROR: privid_initialize_session failed', '', 'ERROR');\n printLogs('[WasmWorkerService] Settings were:', settings, 'ERROR');\n return null;\n }\n\n const wasmSessionPointer = resultPointers.getInnerPointer();\n this.wasmSession = wasmSessionPointer;\n printLogs(`[WasmWorkerService] initializeWasmSession wasmSessionPointer: `, wasmSessionPointer);\n\n return wasmSessionPointer;\n }\n\n private async resolveWasmModule(ctx: WasmResolveContext): Promise<ResolveResult> {\n const attempts: TierAttempt[] = [];\n const tiers: Array<{\n source: WasmLoadStatus['source'];\n obtain: () => Promise<ArrayBuffer>;\n shouldCache: boolean;\n }> = [];\n console.log('[WasmWorkerService] resolveWasmModule ctx:', ctx);\n\n // Build tier list based on configuration\n if (this.customWasm) {\n tiers.push({\n source: 'custom',\n obtain: () => this.obtainFromCustomUrl(this.customWasm, ctx.version),\n shouldCache: false,\n });\n }\n\n tiers.push({\n source: 'cache',\n obtain: () => this.obtainFromCache(ctx.version),\n shouldCache: false,\n });\n\n tiers.push({\n source: 'local',\n obtain: () => this.obtainFromNetwork(ctx, 'local'),\n shouldCache: ctx.saveCache,\n });\n\n if (this.useCdnLink) {\n tiers.push({\n source: 'cdn',\n obtain: () => this.obtainFromNetwork(ctx, 'cdn'),\n shouldCache: ctx.saveCache,\n });\n }\n\n // Load the Emscripten JS runtime once for ctx.modulePath (SIMD or noSIMD).\n // If SIMD compilation fails later, compileWasmBinary -> obtainFromNetworkWithFallback\n // reloads the noSIMD JS runtime separately (it's a different Emscripten build).\n // Wrapped in try-catch to add context: if this fails, no tier can succeed because\n // createTFLiteModule won't be defined. The error is rethrown with the original message\n // preserved so callers see both the context and the root cause.\n try {\n this.loadWasmRuntime(ctx);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`WASM JS runtime failed to load for ${ctx.modulePath}/${ctx.version}: ${msg}`);\n }\n\n let fallback: WasmLoadFallback | undefined;\n\n for (const tier of tiers) {\n try {\n const buffer = await tier.obtain();\n\n const validation = validateWasmBinary(buffer);\n if (!validation.valid) {\n throw new Error(`Validation failed: ${validation.reason}`);\n }\n\n const module = await this.compileWasmBinary(buffer, ctx);\n\n if (tier.shouldCache) {\n await writeToCacheQuietly(buffer, module, this.getWasmFolderName());\n }\n\n attempts.push({ source: tier.source, success: true });\n\n // Determine the reported source. When the custom URL tier failed and we fell\n // back to cache/CDN, the source is the successful tier but we also record the\n // custom-fallback status for backward compatibility with existing consumers.\n const reportedSource = fallback?.originalSource === 'custom' ? 'custom-fallback' : tier.source;\n const versionMatch = reportedSource !== 'custom-fallback';\n\n return {\n module,\n status: {\n source: reportedSource,\n versionMatch,\n ...(fallback && { fallback }),\n },\n attempts,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n attempts.push({ source: tier.source, success: false, error: errorMessage });\n\n printLogs(`[WasmWorkerService] Tier '${tier.source}' failed: ${errorMessage}`, error, 'WARN');\n\n // Record the first failure as the fallback reason (skip both 'local' and 'cdn' since both are network tiers)\n if (!fallback && tier.source !== 'cdn' && tier.source !== 'local') {\n fallback = {\n originalSource: tier.source as WasmLoadFallback['originalSource'],\n reason: classifyFailureReason(error),\n };\n }\n\n // Only evict cache on corruption-related failures (validation failed, corrupted data).\n // Do NOT evict on cache miss or version mismatch -- those are normal operational states.\n if (tier.source === 'cache' && isCacheCorruptionFailure(error)) {\n await clearCacheEntry(this.getWasmFolderName()).catch(() => { /* empty */ });\n }\n }\n }\n\n throw new Error(`All WASM loading tiers failed. Attempts: ${JSON.stringify(attempts)}`);\n }\n\n private loadWasmRuntime(ctx: WasmResolveContext): void {\n const scriptUrls: FetchResourceURLs = {\n cdn: `${this.cdnUrl}/${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.js`,\n local: this.getLocalWasmUrl(`${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.js`),\n };\n\n this.importScriptFromUrl(scriptUrls);\n\n if (typeof createTFLiteModule === 'undefined') {\n throw new Error('createTFLiteModule not defined after loading WASM runtime');\n }\n }\n\n private async obtainFromCache(expectedVersion: string): Promise<ArrayBuffer> {\n const cached = await readFromIndexedDBWithTimeout(this.getWasmFolderName());\n\n if (!cached || !cached.cachedWasm) {\n throw new Error('Cache miss: no cached WASM found');\n }\n\n if (!checkCacheAndCurrentAreSameVersion(cached, { version: expectedVersion })) {\n throw new Error(`Cache version mismatch: cached=${cached.version}, expected=${expectedVersion}`);\n }\n\n return cached.cachedWasm;\n }\n\n \n private async obtainFromCustomUrl(customWasm: CustomWasmConfig, expectedVersion: string): Promise<ArrayBuffer> {\n // Step 1: Validate the URL is accessible (HEAD request, matches existing behavior)\n const isValid = await validateCustomWasmUrl(customWasm.url);\n if (!isValid) {\n throw new Error(`Custom URL validation failed for ${customWasm.url}`);\n }\n\n // Step 2: Version check -- prevent loading a WASM binary with the wrong version,\n // which could cause silent failures or crashes in the C++ layer.\n if (customWasm.version !== expectedVersion) {\n printLogs(\n '[WasmWorkerService] Custom WASM version mismatch',\n { expected: expectedVersion, provided: customWasm.version },\n 'WARN',\n );\n throw new Error(`Custom URL version mismatch: provided=${customWasm.version}, expected=${expectedVersion}`);\n }\n\n // Step 3: Fetch the binary\n const response = await fetch(customWasm.url);\n if (!response.ok) {\n throw new Error(`Custom URL fetch failed: ${response.status} for ${customWasm.url}`);\n }\n return response.arrayBuffer();\n }\n\n private async obtainFromNetwork(ctx: WasmResolveContext, source: 'cdn' | 'local'): Promise<ArrayBuffer> {\n const wasmUrl =\n source === 'cdn'\n ? `${this.cdnUrl}/${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.wasm`\n : this.getLocalWasmUrl(`${this.getWasmFolderName()}/${ctx.modulePath}/${ctx.version}/${ctx.moduleName}.wasm`);\n\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Fetch failed: ${response.status} for ${wasmUrl}`);\n }\n return response.arrayBuffer();\n }\n\n private async compileWasmBinary(wasmBinary: ArrayBuffer, ctx: WasmResolveContext): Promise<WasmPrividModules> {\n try {\n return await createTFLiteModule({ wasmBinary });\n } catch (error) {\n // typeof guard must come first: short-circuit evaluation prevents ReferenceError\n // from accessing WebAssembly.CompileError when WebAssembly is undefined.\n if (isWebAssemblyAvailable() && error instanceof WebAssembly.CompileError && ctx.modulePath === 'simd') {\n printLogs('[WasmWorkerService] SIMD CompileError -- retrying with noSIMD', error, 'WARN');\n return this.obtainFromNetworkWithFallback(ctx);\n }\n throw error;\n }\n }\n\n private async obtainFromNetworkWithFallback(ctx: WasmResolveContext): Promise<WasmPrividModules> {\n const noSimdCtx: WasmResolveContext = {\n ...ctx,\n modulePath: 'nosimd',\n };\n\n // Fetch noSIMD binary from network (local first, CDN fallback)\n let buffer: ArrayBuffer;\n try {\n buffer = await this.obtainFromNetwork(noSimdCtx, 'local');\n } catch (localError) {\n if (this.useCdnLink) {\n buffer = await this.obtainFromNetwork(noSimdCtx, 'cdn');\n } else {\n throw new Error(`Local noSIMD fetch failed and CDN is disabled: ${localError}`);\n }\n }\n\n // Load the noSIMD JS runtime (overwrites the global createTFLiteModule)\n this.loadWasmRuntime(noSimdCtx);\n\n return createTFLiteModule({ wasmBinary: buffer });\n }\n\n async ultraEnroll(\n params: EnrollParams,\n resultCallback: RegularCallback,\n onAntiSpoofProgress?: RegularCallback,\n onWasmCroppingCallback?: (base64Image: string) => void,\n ): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n callbackRegistry.wasmCropping = onWasmCroppingCallback ?? null;\n\n if (onAntiSpoofProgress) {\n callbackRegistry.progress = onAntiSpoofProgress;\n }\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const imageInputSize = params.imageData.data.length * params.imageData.data.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n // TODO: @pahferreira - what does this line do?\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(params.imageData.data), imageInputPtr);\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const encoder = new TextEncoder();\n const config_bytes = encoder.encode(`${params.config}`);\n const configInputSize = config_bytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n // TODO: @pahferreira - what does this line do?\n this.wasmPrividModules.HEAP8.set(config_bytes, configInputPtr / config_bytes.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraEnroll config: ', params.config);\n\n try {\n this.wasmPrividModules._privid_user_enroll(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.imageData.width /* width of one image */,\n params.imageData.height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs(`[WasmWorkerService] ultraEnroll error: `, error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraPredict(\n params: PredictParams,\n resultCallback: RegularCallback,\n onAntiSpoofProgress?: RegularCallback,\n onWasmCroppingCallback?: (base64Image: string) => void,\n ): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n callbackRegistry.wasmCropping = onWasmCroppingCallback ?? null;\n\n if (onAntiSpoofProgress) {\n callbackRegistry.progress = onAntiSpoofProgress;\n }\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const imageInput = flatImageDataArraysIntoUint8Array(params.originalImages);\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const imageInputSize = imageInput.length * imageInput.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(imageInput), imageInputPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraPredict config: ', params.config);\n try {\n this.wasmPrividModules._privid_user_predict(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.originalImages[0].width /* width of one image */,\n params.originalImages[0].height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraPredict error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraAgeEstimate(\n params: AgeEstimateParams,\n resultCallback: (...args: unknown[]) => void,\n onAntiSpoofProgress?: (...args: unknown[]) => void,\n onWasmCroppingCallback?: (base64Image: string) => void,\n ): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n callbackRegistry.wasmCropping = onWasmCroppingCallback ?? null;\n\n if (onAntiSpoofProgress) {\n callbackRegistry.progress = onAntiSpoofProgress;\n }\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const imageInput = flatImageDataArraysIntoUint8Array(params.originalImages);\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n const imageInputSize = imageInput.length * imageInput.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(imageInput), imageInputPtr);\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraAgeEstimate config: ', params.config);\n\n try {\n this.wasmPrividModules._privid_estimate_age(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.originalImages[0].width /* width of one image */,\n params.originalImages[0].height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs(`[WasmWorkerService] ultraAgeEstimate error: `, error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraCompareEmbeddings(params: CompareEmbeddingsParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const embeddingsABytes = encoder.encode(`${params.encryptedEmbeddingsA}`);\n const embeddingsASize = embeddingsABytes.length;\n const embeddingsAPtr = this.allocatePointer(embeddingsASize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(embeddingsABytes), embeddingsAPtr);\n\n const embeddingsBBytes = encoder.encode(`${params.encryptedEmbeddingsB}`);\n const embeddingsBSize = embeddingsBBytes.length;\n const embeddingsBPtr = this.allocatePointer(embeddingsBSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(embeddingsBBytes), embeddingsBPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraCompareEmbeddings config: ', params.config);\n try {\n this.wasmPrividModules._privid_compare_embeddings(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n embeddingsAPtr,\n embeddingsASize,\n embeddingsBPtr,\n embeddingsBSize,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraCompareEmbeddings error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(embeddingsAPtr, embeddingsBPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n pkiEncrypt(params: PkiEncryptParams): string | { error: boolean } {\n if (!this.wasmPrividModules || !this.wasmSession) {\n return { error: true };\n }\n\n const encoder = new TextEncoder();\n const payloadBytes = encoder.encode(params.payload);\n const payloadSize = payloadBytes.length;\n const payloadPtr = this.allocatePointer(payloadSize);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n this.wasmPrividModules.HEAP8.set(payloadBytes, payloadPtr / payloadBytes.BYTES_PER_ELEMENT);\n\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] pkiEncrypt params: ', params);\n try {\n this.wasmPrividModules._privid_encrypt_payload(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n payloadPtr,\n payloadSize,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n const [outputBufferSizes] = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, resultLenPtr, 1);\n\n if (outputBufferSizes > 0) {\n const outputBufferSize = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, resultLenPtr, 1)[0];\n const outputBufferSecPtr = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, resultFirstPtr, 1)[0];\n const outputBufferPtr = new Uint8Array(\n this.wasmPrividModules.HEAPU8.buffer,\n outputBufferSecPtr,\n outputBufferSize,\n );\n\n const decoder = new TextDecoder('utf-8');\n const decode = decoder.decode(outputBufferPtr);\n decode.replace(/\\0/g, ''); // Remove null terminators if any\n decode.replace(' ', '');\n const result = removeNullBytesFromDecodedString(decode);\n printLogs('[WasmWorkerService] pkiEncrypt result: ', result);\n\n return result;\n }\n\n return {\n error: true,\n };\n } catch (error) {\n printLogs('[WasmWorkerService] pkiEncrypt error:', error, 'ERROR');\n return {\n error: true,\n };\n } finally {\n this.releasePointers(payloadPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraScanBackDocument(params: ScanBackDocumentParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const imageInputSize = params.imageInput.data.length * params.imageInput.data.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(params.imageInput.data), imageInputPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraScanBackDocument config: ', params.config);\n try {\n this.wasmPrividModules._privid_doc_scan_back(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.imageInput.width /* width of one image */,\n params.imageInput.height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraScanBackDocument error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraScanFrontDocument(params: ScanFrontDocumentParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const configInputSize = configBytes.length;\n\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n const imageInputSize = params.imageInput.data.length * params.imageInput.data.BYTES_PER_ELEMENT;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(params.imageInput.data), imageInputPtr);\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraScanFrontDocument config: ', params.config);\n try {\n this.wasmPrividModules._privid_doc_scan_front(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n params.imageInput.width /* width of one image */,\n params.imageInput.height /* height of one image */,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraScanFrontDocument error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async ultraDocumentOcr(params: DocumentOcrParams, resultCallback: RegularCallback): Promise<boolean> {\n callbackRegistry.result = resultCallback;\n\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const encoder = new TextEncoder();\n const configBytes = encoder.encode(params.config);\n const inputImageBytes = encoder.encode(`${params.imageInput}`);\n\n const configInputSize = configBytes.length;\n const configInputPtr = this.allocatePointer(configInputSize);\n this.wasmPrividModules.HEAP8.set(configBytes, configInputPtr / configBytes.BYTES_PER_ELEMENT);\n\n const imageInputSize = inputImageBytes.length;\n const imageInputPtr = this.allocatePointer(imageInputSize);\n this.wasmPrividModules.HEAPU8.set(new Uint8Array(inputImageBytes), imageInputPtr);\n\n const resultFirstPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n const resultLenPtr = this.allocatePointer(Int32Array.BYTES_PER_ELEMENT);\n\n printLogs('[WasmWorkerService] ultraDocumentOcr config: ', params.config);\n try {\n this.wasmPrividModules._privid_doc_ocr_front_enc(\n this.wasmSession /* session pointer */,\n configInputPtr,\n configInputSize,\n imageInputPtr /* input images */,\n imageInputSize,\n resultFirstPtr /* operation result output buffer */,\n resultLenPtr /* operation result buffer length */,\n );\n\n return true;\n } catch (error) {\n printLogs('[WasmWorkerService] ultraDocumentOcr error:', error, 'ERROR');\n return false;\n } finally {\n this.releasePointers(imageInputPtr, resultFirstPtr, resultLenPtr, configInputPtr);\n }\n }\n\n async checkModelsAreLoaded(): Promise<boolean> {\n try {\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const isLoaded = this.wasmPrividModules._privid_check_models();\n return isLoaded;\n } catch (error) {\n printLogs(`[WasmWorkerService] checkModelsAreLoaded error`, error, 'ERROR');\n return false;\n }\n }\n\n async freeMemory(): Promise<boolean> {\n try {\n if (!(await this.ensureModulesAreReady())) {\n return false;\n }\n\n const freeMemoryResult = this.wasmPrividModules._privid_free_memory();\n return freeMemoryResult;\n } catch (error) {\n printLogs(`[WasmWorkerService] freeMemory error: `, error, 'ERROR');\n return false;\n }\n }\n\n /**\n * Creates pointers for WASM function results.\n * This helper manages outer and inner pointers for functions that return results via pointer arguments.\n *\n * @returns Object with methods to get outer and inner pointers\n */\n private createWasmResultPointers() {\n // TODO: Should we manipulate multiple pointers in Javascript?\n let out_ptr: number = null;\n let in_ptr: number = null;\n\n return {\n /**\n * @brief Allocates a pointer to contain the result and return it,\n * if the container is already created it will be returned\n */\n getOuterPointer: () => {\n // TODO: may be used SharedArrayBuffer() instead\n // allocate memory the expected pointer (outer pointer or container)\n if (!out_ptr) out_ptr = this.wasmPrividModules._malloc(Int32Array.BYTES_PER_ELEMENT);\n return out_ptr;\n },\n /**\n * @brief Creates a javascript Uint32Array pointer to contain the result pointed by outer_ptr and return it,\n * It is the responsability of the caller to free the pointer returned by this function\n */\n getInnerPointer: () => {\n // If we did not allocate yet the output buffer return null\n if (!out_ptr) return null;\n // if we already have our inner pointer for this closure return it\n if (in_ptr) return in_ptr;\n // Access the outer pointer as an arry of uint32 which conatin a single cell\n // whose value is the pointer allocated in the wasm module (inner pointer of the output param)\n // and return it\n [in_ptr] = new Uint32Array(this.wasmPrividModules.HEAPU8.buffer, out_ptr, 1);\n return in_ptr;\n },\n };\n }\n /**\n * Creates a managed string buffer for WASM function calls.\n * This helper allocates WASM memory for string arguments and provides automatic cleanup.\n * It converts JavaScript strings to UTF-8 encoded bytes that can be passed to WASM functions.\n *\n * @param text - The string value to encode (null/undefined will result in [0, 0] args)\n * @returns Object with methods to get pointer arguments and free memory\n \n */\n private createStringBuffer(text: string | null | undefined | number) {\n let memoryPointer: number | null = null;\n let bufferSize = 0;\n let cachedArgs: [number, number] | null = null;\n\n return {\n /**\n * Gets the [pointer, size] tuple for WASM function arguments.\n * Results are cached - subsequent calls return the same values.\n * @returns [pointer, size] tuple or [0, 0] for null/undefined input\n */\n getArgs: (): [number, number] => {\n // Return cached result if already computed\n if (cachedArgs !== null) {\n return cachedArgs;\n }\n\n // Handle null, undefined, or NaN cases\n if (text == null || (typeof text === 'number' && Number.isNaN(text))) {\n cachedArgs = [0, 0];\n return cachedArgs;\n }\n\n try {\n // Convert to string and encode to UTF-8\n const stringValue = String(text);\n const encoder = new TextEncoder();\n const bytes = encoder.encode(stringValue);\n\n // Calculate buffer size and allocate WASM memory\n bufferSize = bytes.length * bytes.BYTES_PER_ELEMENT;\n memoryPointer = this.wasmPrividModules._malloc(bufferSize);\n\n if (memoryPointer === 0) {\n throw new Error('WASM memory allocation failed');\n }\n\n // Copy bytes to WASM heap\n this.wasmPrividModules.HEAP8.set(bytes, memoryPointer / bytes.BYTES_PER_ELEMENT);\n\n cachedArgs = [memoryPointer, bufferSize];\n return cachedArgs;\n } catch (error) {\n printLogs('[WasmWorkerService] createStringBuffer error:', error, 'ERROR');\n // Return safe defaults on error\n cachedArgs = [0, 0];\n return cachedArgs;\n }\n },\n\n /**\n * Frees the allocated WASM memory.\n * IMPORTANT: Always call this after using the buffer to prevent memory leaks.\n * After calling free(), the buffer can be reused for the same text.\n */\n free: () => {\n if (memoryPointer !== null && memoryPointer !== 0) {\n try {\n this.wasmPrividModules._free(memoryPointer);\n } catch (error) {\n printLogs('[WasmWorkerService] free buffer error:', error, 'ERROR');\n }\n memoryPointer = null;\n bufferSize = 0;\n cachedArgs = null;\n }\n },\n\n /**\n * Check if memory has been allocated\n */\n isAllocated: (): boolean => memoryPointer !== null && memoryPointer !== 0,\n };\n }\n\n private releasePointers(...pointers: (number | null)[]) {\n pointers.forEach((ptr) => {\n if (ptr !== null && ptr !== 0) {\n try {\n this.wasmPrividModules._free(ptr);\n } catch (error) {\n printLogs('[WasmWorkerService] releasePointers error:', error, 'ERROR');\n }\n }\n });\n }\n\n private allocatePointer(size: number): number {\n try {\n const ptr = this.wasmPrividModules._malloc(size);\n return ptr;\n } catch (error) {\n printLogs('[WasmWorkerService] allocatePointer error:', error, 'ERROR');\n return 0;\n }\n }\n\n /**\n * Ensures WASM modules are fully initialized before operations execute.\n *\n * @returns true if modules and session are ready, false otherwise\n */\n private async ensureModulesAreReady(): Promise<boolean> {\n // Wait if initialization is already in progress\n if (this.isModuleInitializing && this.moduleInitializationLock) {\n try {\n await this.moduleInitializationLock;\n } catch (error) {\n printLogs('[WasmWorkerService] ensureModulesInitialized: Initialization failed during wait', error, 'ERROR');\n return false;\n }\n }\n\n // Check if modules need to be loaded\n if (!this.wasmPrividModules) {\n // Validate we have required parameters before attempting load\n if (!this.apiUrl || !this.sessionToken || !this.publicKey) {\n printLogs(\n '[WasmWorkerService] ensureModulesInitialized: Missing required initialization parameters',\n { apiUrl: !!this.apiUrl, sessionToken: !!this.sessionToken, publicKey: !!this.publicKey },\n 'ERROR',\n );\n return false;\n }\n\n // Attempt to load modules\n try {\n await this.loadModules(\n {\n simd: this.isSimd,\n apiUrl: this.apiUrl,\n sessionToken: this.sessionToken,\n publicKey: this.publicKey,\n debugType: this.debugType || '',\n cacheConfig: this.setCache,\n },\n this.proxiedErrorCallback,\n );\n } catch (error) {\n printLogs('[WasmWorkerService] ensureModulesInitialized: Failed to load WASM modules', error, 'ERROR');\n return false;\n }\n }\n\n // Final validation - ensure both modules AND session are ready\n if (!this.wasmPrividModules || !this.wasmSession) {\n printLogs(\n '[WasmWorkerService] ensureModulesInitialized: WASM not fully initialized',\n { hasModules: !!this.wasmPrividModules, hasSession: !!this.wasmSession },\n 'ERROR',\n );\n return false;\n }\n\n return true;\n }\n}\n\nconst wasmWorkerServiceInstance = new WasmWorkerService();\n// Expose the Class Instance using Comlink\nexpose(wasmWorkerServiceInstance);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["proxyMarker", "createEndpoint", "releaseProxy", "finalizer", "throwMarker", "isObject", "val", "proxyTransferHandler", "obj", "port1", "port2", "expose", "port", "wrap", "throwTransferHandler", "value", "serialized", "transferHandlers", "isAllowedOrigin", "allowedOrigins", "origin", "allowedOrigin", "ep", "callback", "ev", "id", "type", "path", "argumentList", "fromWireValue", "returnValue", "parent", "prop", "rawValue", "proxy", "transfer", "wireValue", "transferables", "toWireValue", "closeEndPoint", "error", "isMessagePort", "endpoint", "target", "pendingListeners", "data", "resolver", "createProxy", "throwIfProxyReleased", "isReleased", "releaseEndpoint", "requestResponseMessage", "proxyCounter", "proxyFinalizers", "newCount", "registerProxy", "unregisterProxy", "isProxyReleased", "_target", "r", "p", "_thisArg", "rawArgumentList", "last", "processArguments", "myFlat", "arr", "processed", "v", "transferCache", "transfers", "toWireValue", "value", "name", "handler", "transferHandlers", "serializedValue", "transferables", "transferCache", "fromWireValue", "requestResponseMessage", "ep", "pendingListeners", "msg", "transfers", "resolve", "id", "generateUUID", "FeatureFlagKey", "isWebAssemblyAvailable", "featureFlagServiceInstance", "cachedDebugType", "setDebugType", "debugType", "cachedDebugType", "getDebugType", "cachedDebugType", "searchedParameterResult", "getEnvironment", "featureFlagServiceInstance", "FeatureFlagKey", "error", "printLogs", "printLogs", "message", "data", "type", "errorLogs", "warningLogs", "allLogs", "debugType", "getDebugType", "environment", "getEnvironment", "environment", "WASM_ULTRA_FOLDER_NAME", "INDEXED_DB_NAME", "INDEXED_STORE_NAME", "stripVersionSuffix", "version", "promisifyRequest", "request", "resolve", "reject", "readFromIndexedDB", "key", "openRequest", "INDEXED_DB_NAME", "db", "INDEXED_STORE_NAME", "store", "error", "printLogs", "writeToIndexedDB", "cachedWasm", "cachedScript", "data", "checkCacheAndCurrentAreSameVersion", "cachedModule", "currentVersionJSON", "cachedVersion", "currentVersion", "printLogs", "cachedVersionString", "currentVersionString", "stripVersionSuffix", "error", "readCurrentWasmVersion", "modulePath", "wasmBaseUrl", "wasmFolderName", "WASM_ULTRA_FOLDER_NAME", "versionUrl", "flatImageDataArraysIntoUint8Array", "imageDataArray", "totalLength", "sum", "imgData", "flatArray", "offset", "removeNullBytesFromDecodedString", "string", "char", "validateWasmBinary", "buffer", "header", "byte", "isWebAssemblyAvailable", "readFromIndexedDBWithTimeout", "key", "timeoutMs", "readFn", "readFromIndexedDB", "_", "reject", "clearCacheEntry", "openRequest", "INDEXED_DB_NAME", "db", "INDEXED_STORE_NAME", "promisifyRequest", "store", "isCacheCorruptionFailure", "msg", "validateCustomWasmUrl", "url", "isValid", "writeToCacheQuietly", "module", "cacheKey", "moduleVersion", "writeToIndexedDB", "classifyFailureReason", "callbackRegistry", "operation", "id", "response_str", "printLogs", "error", "error_str", "progress_type", "message", "progress_value", "base64Image", "WasmWorkerService", "WASM_ULTRA_FOLDER_NAME", "params", "errorCallback", "progressCallback", "newSession", "isWebAssemblyAvailable", "setDebugType", "modulePath", "moduleName", "currentModuleVersionJSON", "readCurrentWasmVersion", "ctx", "result", "relativePath", "scriptUrls", "localError", "cdnError", "usageScenario", "cache_content", "settings", "resultPointers", "stringBuffer", "isSessionInitialized", "wasmSessionPointer", "attempts", "tiers", "msg", "fallback", "tier", "buffer", "validation", "validateWasmBinary", "module", "writeToCacheQuietly", "reportedSource", "errorMessage", "classifyFailureReason", "isCacheCorruptionFailure", "clearCacheEntry", "expectedVersion", "cached", "readFromIndexedDBWithTimeout", "checkCacheAndCurrentAreSameVersion", "customWasm", "validateCustomWasmUrl", "response", "source", "wasmUrl", "wasmBinary", "noSimdCtx", "resultCallback", "onAntiSpoofProgress", "onWasmCroppingCallback", "imageInputSize", "imageInputPtr", "resultFirstPtr", "resultLenPtr", "config_bytes", "configInputSize", "configInputPtr", "imageInput", "flatImageDataArraysIntoUint8Array", "configBytes", "encoder", "embeddingsABytes", "embeddingsASize", "embeddingsAPtr", "embeddingsBBytes", "embeddingsBSize", "embeddingsBPtr", "payloadBytes", "payloadSize", "payloadPtr", "outputBufferSizes", "outputBufferSize", "outputBufferSecPtr", "outputBufferPtr", "decode", "removeNullBytesFromDecodedString", "inputImageBytes", "out_ptr", "in_ptr", "text", "memoryPointer", "bufferSize", "cachedArgs", "stringValue", "bytes", "pointers", "ptr", "size", "wasmWorkerServiceInstance", "expose"]
|
|
7
7
|
}
|