facebetter 1.3.3 → 1.4.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/facebetter.esm.js +19 -0
- package/dist/facebetter.esm.js.map +1 -1
- package/dist/facebetter.js +19 -0
- package/dist/facebetter.js.map +1 -1
- package/package.json +2 -2
package/dist/facebetter.esm.js
CHANGED
|
@@ -1086,6 +1086,25 @@ class BeautyEffectEngine {
|
|
|
1086
1086
|
}
|
|
1087
1087
|
}
|
|
1088
1088
|
|
|
1089
|
+
/**
|
|
1090
|
+
* Sets whether to apply beauty effects only on skin regions.
|
|
1091
|
+
* When enabled, beauty effects will only be applied to detected skin areas.
|
|
1092
|
+
* @param {boolean} enabled - True to enable skin-only beauty, false to apply to entire image.
|
|
1093
|
+
*/
|
|
1094
|
+
setSkinOnlyBeauty(enabled) {
|
|
1095
|
+
this._ensureInitialized();
|
|
1096
|
+
const Module = this._getWasmModule();
|
|
1097
|
+
|
|
1098
|
+
const result = Module.ccall(
|
|
1099
|
+
'SetSkinOnlyBeauty',
|
|
1100
|
+
'number',
|
|
1101
|
+
['number', 'number'],
|
|
1102
|
+
[this.enginePtr, enabled ? 1 : 0]
|
|
1103
|
+
);
|
|
1104
|
+
|
|
1105
|
+
checkResult(result, 'Failed to set skin only beauty');
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1089
1108
|
|
|
1090
1109
|
/**
|
|
1091
1110
|
* Ensures buffers are allocated for the given dimensions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facebetter.esm.js","sources":["../src/core/errors.js","../src/core/config.js","../src/core/constants.js","../src/core/engine.js","../src/browser/image-utils.js","../src/esm/index.js"],"sourcesContent":["/**\n * Facebetter Error Classes\n * Platform-agnostic error handling\n */\n\n/**\n * Facebetter error class\n */\nexport class FacebetterError extends Error {\n constructor(message, code = -1) {\n super(message);\n this.name = 'FacebetterError';\n this.code = code;\n }\n}\n\n/**\n * Checks if a result code indicates success\n * @param {number} result - Result code from WASM function\n * @throws {FacebetterError} If result indicates failure\n */\nexport function checkResult(result, errorMessage = 'Operation failed') {\n if (result !== 0) {\n throw new FacebetterError(`${errorMessage} (error code: ${result})`, result);\n }\n}\n\n","/**\n * Engine Configuration\n * Platform-agnostic configuration class\n */\n\nimport { FacebetterError } from './errors.js';\n\n/**\n * Engine configuration class\n * Similar to EngineConfig struct in C++/Java/OC\n */\nexport class EngineConfig {\n /**\n * Creates a new EngineConfig instance\n * @param {Object} config - Configuration object\n * @param {string} [config.appId] - Application ID (required if licenseJson is not provided)\n * @param {string} [config.appKey] - Application key (required if licenseJson is not provided)\n * @param {string} [config.licenseJson] - License JSON string (optional, if provided, appId and appKey are not required)\n */\n constructor(config = {}) {\n this.appId = config.appId || null;\n this.appKey = config.appKey || null;\n this.licenseJson = config.licenseJson || null;\n this.resourcePath = '/resource.fbd';\n /**\n * Whether to use an external GL context (native platforms only).\n * In Web/WASM environments, this field is kept for configuration structure alignment,\n * but it does not take effect in the current implementation.\n */\n this.externalContext = !!config.externalContext;\n }\n\n /**\n * Validates the configuration\n * @returns {boolean} True if valid\n */\n isValid() {\n // If licenseJson is provided, use it for validation\n if (this.licenseJson) {\n return typeof this.licenseJson === 'string' && this.licenseJson.trim() !== '';\n }\n // Otherwise appId and appKey are required\n return this.appId && typeof this.appId === 'string' && this.appId.trim() !== '' &&\n this.appKey && typeof this.appKey === 'string' && this.appKey.trim() !== '';\n }\n\n /**\n * Returns a string representation of the config\n * @returns {string} String representation\n */\n toString() {\n return `EngineConfig{appId='${this.appId ? this.appId.substring(0, Math.min(this.appId.length, 8)) + '...' : 'null'}', appKey='${this.appKey ? '***' : 'null'}', licenseJson=${this.licenseJson ? 'provided' : 'null'}}`;\n }\n}\n\n","/**\n * Facebetter Constants and Enums\n * Platform-agnostic constants\n */\n\n/**\n * Beauty type enumeration\n */\nexport const BeautyType = {\n Basic: 0, // Basic beauty (smoothing, whitening, etc.)\n Reshape: 1, // Face reshaping (face thinning, big eyes, etc.)\n Makeup: 2, // Makeup effects (lipstick, blush, etc.)\n VirtualBackground: 3, // Virtual background (blur, image replacement)\n ChromaKey: 4, // Chroma key (green screen removal)\n Filter: 5, // LUT based filter\n Sticker: 6 // 2D/3D sticker\n};\n\n/**\n * Basic beauty parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const BasicParam = {\n Smoothing: 0, // Skin smoothing (0.0: none, 1.0: maximum)\n Sharpening: 1, // Image sharpening (0.0: none, 1.0: maximum)\n Whitening: 2, // Skin whitening (0.0: none, 1.0: maximum)\n Rosiness: 3 // Skin rosiness (0.0: none, 1.0: maximum)\n};\n\n/**\n * Face reshape parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const ReshapeParam = {\n FaceThinning: 0, // Face thinning (0.0: none, 1.0: maximum)\n FaceVShape: 1, // V-shape face (0.0: none, 1.0: maximum)\n FaceNarrowing: 2, // Face narrowing (0.0: none, 1.0: maximum)\n FaceShortening: 3,// Face shortening (0.0: none, 1.0: maximum)\n Cheekbone: 4, // Cheekbone slimming (0.0: none, 1.0: maximum)\n Jawbone: 5, // Jawbone slimming (0.0: none, 1.0: maximum)\n Chin: 6, // Chin length adjustment (0.0: none, 1.0: maximum)\n NoseSlimming: 7, // Nose slimming (0.0: none, 1.0: maximum)\n EyeSize: 8, // Eye size (0.0: normal, 1.0: maximum)\n EyeDistance: 9 // Eye distance (0.0: normal, 1.0: maximum)\n};\n\n/**\n * Makeup parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const MakeupParam = {\n Lipstick: 0, // Lipstick intensity (0.0: none, 1.0: maximum)\n Blush: 1 // Blush intensity (0.0: none, 1.0: maximum)\n};\n\n/**\n * Chroma Key parameter enumeration\n */\nexport const ChromaKeyParam = {\n KeyColor: 0, // Key color (0.0: Green, 1.0: Blue, 2.0: Red)\n Similarity: 1, // Color similarity (0.0 - 1.0)\n Smoothness: 2, // Edge smoothness (0.0 - 1.0)\n Desaturation: 3 // Spill desaturation (0.0 - 1.0)\n};\n\n/**\n * Background mode enumeration\n */\nexport const BackgroundMode = {\n None: 0, // No background processing\n Blur: 1, // Blurred background\n Image: 2 // Background image replacement\n};\n\n/**\n * Frame type enumeration\n */\nexport const FrameType = {\n Image: 0, // Image mode\n Video: 1 // Video mode\n};\n\n/**\n * Mirror mode enumeration (apply to input before processing)\n */\nexport const MirrorMode = {\n None: 0, // No mirror\n Horizontal: 1, // Mirror horizontally (e.g. front camera selfie)\n Vertical: 2, // Mirror vertically\n Both: 3 // Mirror both axes\n};\n\n/**\n * Virtual background options class\n * Matches the C++/Java/OC API design\n */\nexport class VirtualBackgroundOptions {\n /**\n * Creates a new VirtualBackgroundOptions instance\n * @param {Object} [options] - Options object\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n constructor(options = {}) {\n this.mode = options.mode !== undefined ? options.mode : BackgroundMode.None;\n this.backgroundImage = options.backgroundImage || null;\n }\n\n /**\n * Validates the options\n * @returns {boolean} True if valid\n */\n isValid() {\n if (this.mode === BackgroundMode.Image) {\n return this.backgroundImage !== null;\n }\n return true;\n }\n}\n\n","/**\n * Beauty Effect Engine Core\n * Platform-agnostic engine implementation with dependency injection\n */\n\nimport { EngineConfig } from './config.js';\nimport { FacebetterError, checkResult } from './errors.js';\nimport { FrameType, BackgroundMode, MirrorMode } from './constants.js';\n\n/**\n * Beauty effect engine class\n * Provides high-level API for face beauty effects processing\n * Uses dependency injection for platform-specific functionality\n */\nexport class BeautyEffectEngine {\n /**\n * Creates a new BeautyEffectEngine instance\n * @param {EngineConfig|Object} config - EngineConfig object or configuration object\n * @param {Object} platformAPI - Platform-specific API (injected)\n * @param {Function} platformAPI.loadWasmModule - WASM module loader\n * @param {Function} platformAPI.getWasmModule - Get WASM module instance\n * @param {Function} platformAPI.getWasmBuffer - Get WASM memory buffer\n * @param {Function} platformAPI.toImageData - Convert to ImageData\n * @param {Function} platformAPI.verifyAppKeyOnline - Verify app key online\n * @param {Function} [platformAPI.ensureGPUPixelCanvas] - Ensure GPU canvas exists (browser only)\n * @param {Function} [platformAPI.cleanupGPUPixelCanvas] - Cleanup GPU canvas (browser only)\n */\n constructor(config, platformAPI) {\n if (!config) {\n throw new FacebetterError('Config is required. Expected EngineConfig or configuration object');\n }\n\n if (!platformAPI) {\n throw new FacebetterError('Platform API is required');\n }\n\n // If an EngineConfig instance is passed, use it directly; otherwise create a new EngineConfig\n let engineConfig;\n if (config instanceof EngineConfig) {\n engineConfig = config;\n } else if (config && typeof config === 'object') {\n engineConfig = new EngineConfig(config);\n } else {\n throw new FacebetterError('Invalid configuration. Expected EngineConfig or configuration object');\n }\n\n if (!engineConfig.isValid()) {\n throw new FacebetterError('Invalid config: ' + engineConfig.toString());\n }\n\n this.config = engineConfig;\n this.appId = engineConfig.appId;\n this.appKey = engineConfig.appKey;\n this.licenseJson = engineConfig.licenseJson;\n this.resourcePath = '/resource.fbd';\n this.enginePtr = null;\n this.initialized = false;\n this.srcBufferPtr = null;\n this.dstBufferPtr = null;\n this.bufferSize = 0;\n \n // Callback related state\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n \n // Store platform API\n this._platformAPI = platformAPI;\n this._loadWasmModule = platformAPI.loadWasmModule;\n this._getWasmModule = platformAPI.getWasmModule;\n this._getWasmBuffer = platformAPI.getWasmBuffer;\n this._toImageData = platformAPI.toImageData;\n this._ensureGPUPixelCanvas = platformAPI.ensureGPUPixelCanvas;\n this._cleanupGPUPixelCanvas = platformAPI.cleanupGPUPixelCanvas;\n \n // Browser-specific state\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n \n // Automatically create gpupixel_canvas if it doesn't exist (browser only)\n if (this._ensureGPUPixelCanvas) {\n this._ensureGPUPixelCanvas();\n }\n \n // Start loading WASM module immediately in constructor\n this._wasmLoadPromise = this._loadWasmModule();\n this._initPromise = null;\n }\n\n /**\n * Creates a timeout promise\n * @private\n * @param {number} timeout - Timeout in milliseconds\n * @param {string} operation - Operation name for error message\n * @returns {Promise} Promise that rejects after timeout\n */\n _createTimeout(timeout, operation) {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new FacebetterError(\n `${operation} timed out after ${timeout}ms. Please check your network connection or try increasing the timeout.`,\n 'TIMEOUT'\n ));\n }, timeout);\n });\n }\n\n /**\n * Enhances error with context information\n * @private\n * @param {Error} error - Original error\n * @param {string} context - Context information\n * @returns {FacebetterError} Enhanced error\n */\n _enhanceError(error, context) {\n if (error instanceof FacebetterError) {\n return error;\n }\n\n let errorCode = 'UNKNOWN_ERROR';\n let message = error.message || 'Unknown error occurred';\n\n // Categorize errors\n if (error.message?.includes('timeout') || error.message?.includes('TIMEOUT')) {\n errorCode = 'TIMEOUT';\n } else if (error.message?.includes('network') || error.message?.includes('fetch')) {\n errorCode = 'NETWORK_ERROR';\n } else if (error.message?.includes('WASM') || error.message?.includes('wasm')) {\n errorCode = 'WASM_LOAD_ERROR';\n } else if (error.message?.includes('license') || error.message?.includes('auth')) {\n errorCode = 'LICENSE_ERROR';\n }\n\n return new FacebetterError(\n context ? `${context}: ${message}` : message,\n errorCode\n );\n }\n\n /**\n * Initializes the engine\n * @param {Object} [options] - Initialization options\n * @param {number} [options.timeout] - Timeout in milliseconds (default: 30000 for WASM, 10000 for auth)\n * @param {number} [options.authTimeout] - Timeout for online authentication in milliseconds (default: 10000)\n * @returns {Promise<void>} Promise that resolves when initialization is complete\n */\n async init(options = {}) {\n // Concurrency control: if already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // Concurrency control: if initialization is in progress, return the same Promise\n if (this._initPromise) {\n return this._initPromise;\n }\n\n // Create initialization Promise\n this._initPromise = (async () => {\n try {\n const wasmTimeout = options.timeout || 30000;\n\n // Wait for WASM module loading (with timeout)\n try {\n await Promise.race([\n this._wasmLoadPromise,\n this._createTimeout(wasmTimeout, 'WASM module loading')\n ]);\n } catch (error) {\n throw this._enhanceError(error, 'Failed to load WASM module');\n }\n\n const Module = this._getWasmModule();\n\n // Setup usage report proxy for WASM\n if (!Module.onReportUsage) {\n Module.onReportUsage = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/report';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n return response.ok;\n } catch (error) {\n return false;\n }\n };\n }\n\n // Setup online auth proxy for WASM\n if (!Module.onOnlineAuth) {\n Module.onOnlineAuth = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/auth';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n if (!response.ok) {\n console.warn('[JS Engine] Online auth fetch failed with status:', response.status);\n return \"\";\n }\n return await response.text();\n } catch (error) {\n console.error('[JS Engine] Online auth fetch exception:', error);\n return \"\";\n }\n };\n }\n\n // Create engine instance, auth (online/offline) is handled by WASM layer via onOnlineAuth\n const enginePtr = Module.ccall(\n 'CreateBeautyEffectEngineEx',\n 'number',\n ['string', 'string', 'string', 'string', 'number'],\n [\n this.resourcePath,\n this.licenseJson || '',\n this.appId || '',\n this.appKey || '',\n this.config.externalContext ? 1 : 0\n ]\n );\n\n if (!enginePtr) {\n throw new FacebetterError(\n 'Failed to create BeautyEffect engine. This may be due to invalid license or resource path issues.',\n 'ENGINE_CREATE_FAILED'\n );\n }\n\n this.enginePtr = enginePtr;\n this.initialized = true;\n this._initPromise = null; // Clear Promise cache, allow re-initialization (if needed)\n } catch (error) {\n this._initPromise = null; // Clear Promise cache, allow retry\n throw error;\n }\n })();\n\n return this._initPromise;\n }\n\n /**\n * Destroys the engine and releases resources\n */\n destroy() {\n if (!this.initialized || !this.enginePtr) {\n return;\n }\n\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n this.srcBufferPtr = null;\n }\n\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n this.dstBufferPtr = null;\n }\n\n // Clean up shared memory\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n\n Module.ccall('DestroyBeautyEffectEngine', null, ['number'], [this.enginePtr]);\n this.enginePtr = null;\n this.initialized = false;\n this.bufferSize = 0;\n this._initPromise = null; // Clear initialization Promise\n \n // Clean up offscreen canvas\n if (this._offscreenCanvas) {\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n }\n \n // Clean up gpupixel_canvas if we created it\n if (this._cleanupGPUPixelCanvas) {\n this._cleanupGPUPixelCanvas();\n }\n }\n\n /**\n * Sets log configuration\n * Can be called before init() since SetLogConfig is a global function\n * @param {Object} config - Log configuration\n * @param {boolean} config.consoleEnabled - Enable console logging\n * @param {boolean} config.fileEnabled - Enable file logging\n * @param {number} config.level - Log level\n * @param {string} config.fileName - Log file name\n * @returns {Promise<void>} Promise that resolves when log config is set\n */\n async setLogConfig(config) {\n // Wait for WASM module to be loaded (started in constructor)\n await this._wasmLoadPromise;\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetLogConfig',\n 'number',\n ['bool', 'bool', 'number', 'string'],\n [\n config.consoleEnabled || false,\n config.fileEnabled || false,\n config.level || 0,\n config.fileName || ''\n ]\n );\n\n checkResult(result, 'Failed to set log config');\n }\n\n /**\n * [Deprecated] No-op in parameter-driven mode. Use:\n * - setBasicParam/setReshapeParam/setMakeupParam\n * - setVirtualBackground\n * - setFilter/setSticker\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @param {boolean} enabled - Enable or disable\n */\n setBeautyTypeEnabled(beautyType, enabled) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetBeautyTypeEnabled',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, beautyType, enabled ? 1 : 0]\n );\n\n checkResult(result, `Failed to ${enabled ? 'enable' : 'disable'} beauty type`);\n }\n\n /**\n * [Deprecated] Always returns false in parameter-driven mode.\n * Query your own UI state or parameters instead.\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @returns {boolean} True if enabled\n */\n isBeautyTypeEnabled(beautyType) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'IsBeautyTypeEnabled',\n 'number',\n ['number', 'number'],\n [this.enginePtr, beautyType]\n );\n\n if (result === -1) {\n throw new FacebetterError('Failed to check beauty type status');\n }\n\n return result === 1;\n }\n\n /**\n * [Deprecated] No-op that returns success. To reset, explicitly zero parameters\n * and clear effects via parameter-driven APIs. Kept for compatibility and may\n * be removed in a future release.\n * @deprecated\n */\n disableAllBeautyTypes() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'DisableAllBeautyTypes',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n\n checkResult(result, 'Failed to disable all beauty types');\n }\n\n /**\n * Sets a basic beauty parameter\n * @param {number} param - Parameter (use BasicParam enum, e.g., BasicParam.Smoothing)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setBasicParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamBasic', param, value);\n }\n\n /**\n * Sets a reshape parameter\n * @param {number} param - Parameter (use ReshapeParam enum, e.g., ReshapeParam.FaceThinning)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setReshapeParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamReshape', param, value);\n }\n\n /**\n * Sets a makeup parameter\n * @param {number} param - Parameter (use MakeupParam enum, e.g., MakeupParam.Lipstick)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setMakeupParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamMakeup', param, value);\n }\n\n /**\n * Sets chroma key parameter\n * @param {number} param - Parameter (use ChromaKeyParam enum, e.g., ChromaKeyParam.Similarity)\n * @param {number} value - Parameter value (KeyColor: 0.0=Green, 1.0=Blue, 2.0=Red; others 0.0-1.0)\n */\n setChromaKeyParam(param, value) {\n this._ensureInitialized();\n // For KeyColor, values are 0, 1, 2, not 0.0-1.0\n if (param === 0) { // ChromaKeyParam.KeyColor\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetBeautyParamChromaKey',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n checkResult(result, `Failed to set chroma key parameter`);\n return;\n }\n this._setBeautyParam('SetBeautyParamChromaKey', param, value);\n }\n\n /**\n * Sets a LUT-based filter\n * @param {string} filterId - Unique identifier of the filter (e.g., \"chuxin\"). Pass \"\" to clear.\n */\n setFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId || '']\n );\n checkResult(result, 'Failed to set filter');\n }\n\n /**\n * Sets the intensity of the current filter\n * @param {number} intensity - Filter intensity (0.0 - 1.0)\n */\n setFilterIntensity(intensity) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilterIntensity',\n 'number',\n ['number', 'number'],\n [this.enginePtr, intensity]\n );\n checkResult(result, 'Failed to set filter intensity');\n }\n\n /**\n * Sets a 2D sticker\n * @param {string} stickerId - Unique identifier of the sticker (e.g., \"樱花\"). Pass \"\" to clear.\n */\n setSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId || '']\n );\n checkResult(result, 'Failed to set sticker');\n }\n\n /**\n * Registers a filter from a file path or data\n * @param {string} filterId - Unique identifier for the filter\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerFilter(filterId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterFilterPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, filterId, resource]\n );\n checkResult(result, `Failed to register filter path: ${filterId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterFilterData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, filterId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register filter data: ${filterId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Registers a sticker from a file path or data\n * @param {string} stickerId - Unique identifier for the sticker\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerSticker(stickerId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterStickerPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, stickerId, resource]\n );\n checkResult(result, `Failed to register sticker path: ${stickerId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterStickerData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, stickerId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register sticker data: ${stickerId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Unregisters a specific filter\n * @param {string} filterId - Filter ID to unregister\n */\n unregisterFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId]\n );\n checkResult(result, `Failed to unregister filter: ${filterId}`);\n }\n\n /**\n * Unregisters all filters\n */\n unregisterAllFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllFilters',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all filters');\n }\n\n /**\n * Unregisters a specific sticker\n * @param {string} stickerId - Sticker ID to unregister\n */\n unregisterSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId]\n );\n checkResult(result, `Failed to unregister sticker: ${stickerId}`);\n }\n\n /**\n * Unregisters all stickers\n */\n unregisterAllStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllStickers',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all stickers');\n }\n \n /**\n * Gets the list of registered filter IDs\n * @returns {string[]} Array of registered filter IDs\n */\n getRegisteredFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredFilters',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered filters JSON:', e);\n return [];\n }\n }\n \n /**\n * Gets the list of registered sticker IDs\n * @returns {string[]} Array of registered sticker IDs\n */\n getRegisteredStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredStickers',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered stickers JSON:', e);\n return [];\n }\n }\n \n /**\n * Internal method to set beauty parameters\n * @private\n */\n _setBeautyParam(functionName, param, value) {\n if (value < 0 || value > 1) {\n throw new FacebetterError('Parameter value must be between 0.0 and 1.0');\n }\n\n const Module = this._getWasmModule();\n const result = Module.ccall(\n functionName,\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n\n checkResult(result, `Failed to set beauty parameter`);\n }\n\n /**\n * Sets engine callbacks (face landmarks detection)\n * @param {Object} callbacks - Callback functions\n * @param {Function} callbacks.onFaceLandmarks - Callback for face landmarks detection\n * @param {number} [callbacks.maxFaces=10] - Maximum number of faces to support (affects shared buffer size)\n */\n setCallbacks(callbacks) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Initialize callback storage (if it doesn't exist)\n if (!Module._face_landmarks_callbacks) {\n Module._face_landmarks_callbacks = [];\n }\n \n let callbackId = 0;\n let sharedBufferPtr = null;\n let sharedBufferSize = 0;\n \n if (callbacks && callbacks.onFaceLandmarks) {\n // Get max faces (default 10)\n const maxFaces = callbacks.maxFaces || 10;\n \n // Pre-allocate shared memory\n // Metadata: 2 ints (frame_number, face_count) = 8 bytes\n // Face data: maxFaces * 343 floats * 4 bytes = maxFaces * 1372 bytes\n const metadataSize = 2 * 4; // 2 ints\n const faceDataSize = maxFaces * 343 * 4; // 343 floats per face\n sharedBufferSize = metadataSize + faceDataSize;\n sharedBufferPtr = Module._malloc(sharedBufferSize);\n \n if (!sharedBufferPtr) {\n throw new FacebetterError('Failed to allocate shared buffer for callbacks');\n }\n \n // Register callback function (internal wrapper, reads data from shared memory)\n // Push first, then get index as callbackId (allows callbackId to be 0)\n Module._face_landmarks_callbacks.push(\n (frameNumber, faceCount, dataPtr) => {\n // Read data from shared memory (zero-copy)\n const heap = Module.HEAPF32;\n const dataOffset = dataPtr / 4; // float is 4 bytes\n \n const results = [];\n const FLOATS_PER_FACE = 343;\n \n for (let i = 0; i < faceCount; i++) {\n const faceOffset = dataOffset + i * FLOATS_PER_FACE;\n let offset = faceOffset;\n \n // Read rect\n const rect = {\n x: heap[offset++],\n y: heap[offset++],\n width: heap[offset++],\n height: heap[offset++]\n };\n \n // Read basic fields\n const faceId = Math.round(heap[offset++]);\n const faceAction = Math.round(heap[offset++]);\n const score = heap[offset++];\n const pitch = heap[offset++];\n const roll = heap[offset++];\n const yaw = heap[offset++];\n \n // Read key_points (111 points)\n const keyPoints = [];\n for (let j = 0; j < 111; j++) {\n keyPoints.push({\n x: heap[offset++],\n y: heap[offset++]\n });\n }\n \n // Read visibility (111 points)\n const visibility = [];\n for (let j = 0; j < 111; j++) {\n visibility.push(heap[offset++]);\n }\n \n results.push({\n rect,\n key_points: keyPoints,\n visibility,\n face_id: faceId,\n face_action: faceAction,\n score,\n pitch,\n roll,\n yaw\n });\n }\n \n // Call user callback\n callbacks.onFaceLandmarks(results);\n }\n );\n \n // Get callback ID (index after push, can be 0)\n callbackId = Module._face_landmarks_callbacks.length - 1;\n }\n \n // Call C API\n const result = Module.ccall(\n 'SetCallbacks',\n 'number',\n ['number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n callbackId,\n sharedBufferPtr || 0,\n sharedBufferSize\n ]\n );\n \n checkResult(result, 'Failed to set callbacks');\n \n // Clean up old shared memory (if it exists)\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n }\n \n // Store new shared memory pointer for cleanup\n if (sharedBufferPtr) {\n this._callbackSharedBufferPtr = sharedBufferPtr;\n this._callbackSharedBufferSize = sharedBufferSize;\n } else {\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n }\n\n /**\n * Sets virtual background options (unified API, matches C++/Java/OC)\n * @param {VirtualBackgroundOptions|Object} options - Virtual background options\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n setVirtualBackground(options) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Support both VirtualBackgroundOptions object and plain object\n const opts = options.mode !== undefined ? options : { mode: BackgroundMode.None, backgroundImage: null };\n \n let imageData = null;\n let imageBufferPtr = null;\n \n try {\n // If a background image is provided, convert to ImageData and prepare buffer\n if (opts.backgroundImage) {\n imageData = this._toImageData(opts.backgroundImage);\n const bufferSize = imageData.width * imageData.height * 4;\n imageBufferPtr = Module._malloc(bufferSize);\n \n const buffer = this._getWasmBuffer();\n const view = new Uint8Array(buffer, imageBufferPtr, bufferSize);\n view.set(imageData.data);\n }\n \n // Use unified SetVirtualBackground C interface (consistent with other platforms)\n const result = Module.ccall(\n 'SetVirtualBackground',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n opts.mode,\n imageBufferPtr || 0, // If null, pass 0\n imageData ? imageData.width : 0,\n imageData ? imageData.height : 0,\n imageData ? imageData.width * 4 : 0\n ]\n );\n \n checkResult(result, 'Failed to set virtual background');\n } finally {\n // Free memory\n if (imageBufferPtr) {\n Module._free(imageBufferPtr);\n }\n }\n }\n\n\n /**\n * Ensures buffers are allocated for the given dimensions\n * @private\n */\n _ensureBuffers(width, height) {\n const requiredSize = width * height * 4;\n\n if (this.bufferSize < requiredSize) {\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n }\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n }\n\n this.srcBufferPtr = Module._malloc(requiredSize);\n this.dstBufferPtr = Module._malloc(requiredSize);\n this.bufferSize = requiredSize;\n\n if (!this.srcBufferPtr || !this.dstBufferPtr) {\n throw new FacebetterError('Failed to allocate memory buffers');\n }\n }\n }\n\n /**\n * Processes an image\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} input - Input image\n * @param {number} width - Image width (required if input is Uint8ClampedArray)\n * @param {number} height - Image height (required if input is Uint8ClampedArray)\n * @param {number} frameType - Frame type (use FrameType enum, default: FrameType.Video)\n * @param {number} mirrorMode - Mirror mode applied to input before processing (MirrorMode enum, default: MirrorMode.None)\n * @returns {ImageData} Processed image data\n */\n processImage(input, width, height, frameType = FrameType.Video, mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n const imageData = this._platformAPI.toImageData(input, width, height);\n const Module = this._getWasmModule();\n\n this._ensureBuffers(imageData.width, imageData.height);\n\n const bufferSize = imageData.width * imageData.height * 4;\n\n try {\n const buffer = this._getWasmBuffer();\n \n const srcView = new Uint8Array(buffer, this.srcBufferPtr, bufferSize);\n srcView.set(imageData.data);\n\n const result = Module.ccall(\n 'ProcessImageRGBA',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n this.srcBufferPtr,\n imageData.width,\n imageData.height,\n imageData.width * 4,\n this.dstBufferPtr,\n frameType,\n mirrorMode\n ]\n );\n\n checkResult(result, 'Failed to process image');\n\n const currentBuffer = this._getWasmBuffer();\n const dstView = new Uint8Array(currentBuffer, this.dstBufferPtr, bufferSize);\n const processedData = new Uint8ClampedArray(dstView);\n\n return new ImageData(processedData, imageData.width, imageData.height);\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Image processing error: ${error.message}`);\n }\n }\n\n /**\n * Processes an external GPU texture.\n *\n * Note:\n * - This interface is mainly used for integration with internal WASM or advanced scenarios.\n * - textureHandle must be a texture handle (uint32) compatible with the OpenGL/WebGL context used by WASM.\n * - For common web scenarios, it is recommended to use processImage with ImageData/Canvas etc.\n *\n * @param {number} textureHandle - External texture handle (GL_TEXTURE_2D)\n * @param {number} width - Texture width\n * @param {number} height - Texture height\n * @param {number} stride - Row stride (usually width * 4)\n * @param {number} [frameType] - Frame type (FrameType.Image / FrameType.Video)\n * @param {number} [mirrorMode] - Mirror mode (MirrorMode enum; texture path does not support mirror, param reserved)\n * @returns {number} Processed texture handle (GL_TEXTURE_2D, uint32)\n */\n processTexture(textureHandle,\n width,\n height,\n stride,\n frameType = FrameType.Video,\n mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n if (!textureHandle || width <= 0 || height <= 0 || stride <= 0) {\n throw new FacebetterError('Invalid textureHandle or dimensions for processTexture');\n }\n\n const Module = this._getWasmModule();\n\n try {\n const result = Module.ccall(\n 'ProcessImageTexture',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n textureHandle,\n width,\n height,\n stride,\n frameType,\n mirrorMode\n ]\n );\n\n if (!result || result === 0) {\n throw new FacebetterError('Failed to process external texture or got invalid output texture');\n }\n\n // Return processed texture handle for caller to continue using in same GL context\n return result;\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Texture processing error: ${error.message}`);\n }\n }\n\n /**\n * Ensures the engine is initialized\n * @private\n * @throws {FacebetterError} If engine is not initialized\n */\n _ensureInitialized() {\n if (!this.initialized || !this.enginePtr) {\n throw new FacebetterError('Engine not initialized. Call init() first.');\n }\n }\n\n /**\n * Ensures gpupixel_canvas exists in the DOM (browser only)\n * This canvas is required by GPUPixel for WebGL context creation\n * @private\n */\n _ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n document.body.appendChild(canvas);\n this._createdGPUPixelCanvas = true;\n }\n this._gpupixelCanvas = canvas;\n }\n\n /**\n * Cleans up gpupixel_canvas if it was created by this engine instance (browser only)\n * @private\n */\n _cleanupGPUPixelCanvas() {\n if (this._createdGPUPixelCanvas && this._gpupixelCanvas) {\n this._gpupixelCanvas.remove();\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n }\n }\n\n /**\n * Ensures offscreen canvas exists and matches the required dimensions (browser only)\n * This canvas is reused for video processing to avoid creating temporary canvases\n * @private\n * @param {number} width - Required canvas width\n * @param {number} height - Required canvas height\n */\n _ensureOffscreenCanvas(width, height) {\n if (typeof document === 'undefined') {\n return null;\n }\n \n if (!this._offscreenCanvas || \n this._offscreenCanvas.width !== width || \n this._offscreenCanvas.height !== height) {\n this._offscreenCanvas = document.createElement('canvas');\n this._offscreenCanvas.width = width;\n this._offscreenCanvas.height = height;\n this._offscreenCtx = this._offscreenCanvas.getContext('2d', { willReadFrequently: true });\n }\n return this._offscreenCanvas;\n }\n\n}\n","/**\n * Browser-specific Image Utilities\n * Uses DOM APIs (canvas, ImageData, etc.)\n */\n\nimport { FacebetterError } from '../core/errors.js';\n\n/**\n * Converts various image sources to ImageData (browser version)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} source - Image source\n * @param {number} width - Image width (required if source is Uint8ClampedArray)\n * @param {number} height - Image height (required if source is Uint8ClampedArray)\n * @returns {ImageData} ImageData object\n */\nexport function toImageData(source, width, height) {\n if (source instanceof ImageData) {\n return source;\n }\n\n if (source instanceof HTMLCanvasElement || source instanceof HTMLVideoElement) {\n const canvas = source instanceof HTMLCanvasElement ? source : document.createElement('canvas');\n if (source instanceof HTMLVideoElement) {\n canvas.width = source.videoWidth;\n canvas.height = source.videoHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n }\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = source.naturalWidth || source.width;\n canvas.height = source.naturalHeight || source.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof Uint8ClampedArray) {\n if (width === undefined || height === undefined) {\n throw new FacebetterError('Width and height are required when source is Uint8ClampedArray');\n }\n return new ImageData(source, width, height);\n }\n\n throw new FacebetterError('Unsupported image source type');\n}\n\n/**\n * Gets User-Agent string for web platform\n * @returns {string} User-Agent string\n */\nexport function getUserAgentString() {\n return 'FB/1.0 (web; wasm32)';\n}\n\n/**\n * Generates HMAC-SHA256 signature (browser version)\n * @param {string} key - HMAC key (app_key)\n * @param {string} data - Data to sign (timestamp string)\n * @returns {Promise<string>} Promise that resolves with hex-encoded signature\n */\nexport async function generateHMACSignature(key, data) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const messageData = encoder.encode(data);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData);\n\n // Convert to hex string\n const hashArray = Array.from(new Uint8Array(signature));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n}\n\n","/**\n * ESM Entry Point\n * For Vue/React/Vite/Webpack (ES Module)\n * Uses facebetter-core npm package for WASM module loading\n */\n\nimport { BeautyEffectEngine } from '../core/engine.js';\nimport { EngineConfig } from '../core/config.js';\nimport { FacebetterError } from '../core/errors.js';\nimport * as constants from '../core/constants.js';\n\n// ESM-specific WASM loader\nlet wasmModuleInstance = null;\nlet wasmModulePromise = null;\n\n/**\n * Loads the WebAssembly module (ESM version)\n * Supports ESM format WASM modules (generated with MODULARIZE and EXPORT_ES6)\n * With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n * @param {Object} [options] - Options\n * @param {string} [options.wasmUrl] - Custom WASM module URL (defaults to facebetter-core npm package)\n * @param {Function} [options.locateFile] - Custom locateFile function (usually not needed with SINGLE_FILE=1)\n * @returns {Promise<Object>} Promise that resolves with the WASM module\n */\nexport async function loadWasmModule(options = {}) {\n if (wasmModuleInstance) {\n return wasmModuleInstance;\n }\n\n if (wasmModulePromise) {\n return wasmModulePromise;\n }\n\n wasmModulePromise = (async () => {\n // Try to import the WASM module factory\n // facebetter-core.js is an Emscripten-generated ESM file (with MODULARIZE and EXPORT_ES6)\n // It's provided by the facebetter-core npm package\n let FaceBetterModuleFactory;\n \n try {\n // Get the WASM module\n if (options.wasmUrl) {\n // If custom URL is provided, use it (for backward compatibility or custom builds)\n const wasmModule = await import(options.wasmUrl);\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n } else {\n // Import from facebetter-core npm package\n const wasmModule = await import('facebetter-core');\n \n // Get the factory function (default export or named export)\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n }\n \n if (!FaceBetterModuleFactory) {\n throw new Error('WASM module does not export createFaceBetterModule function');\n }\n } catch (e) {\n throw new FacebetterError(`Failed to load WASM module: ${e.message}`);\n }\n\n // Configure module options\n // With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n // No need to handle .wasm and .data file paths separately\n const moduleOptions = {\n locateFile: options.locateFile || function(path, prefix) {\n // With SINGLE_FILE=1, Emscripten handles embedded files automatically\n // Custom locateFile is only needed if user provides one\n return prefix + path;\n },\n ...options\n };\n\n // Initialize the module (MODULARIZE returns a Promise)\n wasmModuleInstance = await FaceBetterModuleFactory(moduleOptions);\n \n if (!wasmModuleInstance) {\n throw new FacebetterError('Failed to initialize WASM module');\n }\n\n wasmModuleInstance.ready = true;\n return wasmModuleInstance;\n })();\n\n return wasmModulePromise;\n}\n\n/**\n * Gets the current WASM module instance\n * @returns {Object} WASM module instance\n * @throws {Error} If module is not loaded\n */\nexport function getWasmModule() {\n if (!wasmModuleInstance) {\n throw new Error('WASM module not loaded. Call loadWasmModule() first or use BeautyEffectEngine.init()');\n }\n return wasmModuleInstance;\n}\n\n/**\n * Gets the current WASM memory buffer\n * @returns {ArrayBuffer} Current WASM memory buffer\n */\nexport function getWasmBuffer() {\n const Module = getWasmModule();\n \n if (Module.buffer) {\n return Module.buffer;\n } else if (Module.HEAPU8 && Module.HEAPU8.buffer) {\n return Module.HEAPU8.buffer;\n } else if (Module.asm && Module.asm.memory) {\n return Module.asm.memory.buffer;\n }\n \n throw new Error('Unable to access WASM memory buffer');\n}\n\n// Browser-specific image utilities (ESM version can use browser APIs)\nimport * as imageUtils from '../browser/image-utils.js';\n\n// Browser-specific GPU canvas management\nfunction ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n if (document.body) {\n document.body.appendChild(canvas);\n }\n }\n}\n\nfunction cleanupGPUPixelCanvas() {\n // Cleanup is handled by engine instance\n}\n\n// Create platform API\nconst platformAPI = {\n loadWasmModule: () => loadWasmModule(),\n getWasmModule,\n getWasmBuffer,\n toImageData: imageUtils.toImageData,\n ensureGPUPixelCanvas,\n cleanupGPUPixelCanvas\n};\n\n// Export factory function\nexport function createBeautyEffectEngine(config) {\n return new BeautyEffectEngine(config, platformAPI);\n}\n\n// Create a wrapped BeautyEffectEngine class that automatically injects platformAPI\n// This allows users to use: new BeautyEffectEngine(config) without passing platformAPI\nclass ESMBeautyEffectEngine extends BeautyEffectEngine {\n constructor(config) {\n // Automatically inject platformAPI for ESM environment\n super(config, platformAPI);\n }\n}\n\n// Export all constants and classes\nexport {\n ESMBeautyEffectEngine as BeautyEffectEngine,\n EngineConfig,\n FacebetterError\n};\n\n// Export constants with proper names\nexport const BeautyType = constants.BeautyType;\nexport const BasicParam = constants.BasicParam;\nexport const ReshapeParam = constants.ReshapeParam;\nexport const MakeupParam = constants.MakeupParam;\nexport const ChromaKeyParam = constants.ChromaKeyParam;\nexport const BackgroundMode = constants.BackgroundMode;\nexport const FrameType = constants.FrameType;\nexport const MirrorMode = constants.MirrorMode;\nexport const VirtualBackgroundOptions = constants.VirtualBackgroundOptions;\n\n// Default export\nexport default {\n BeautyEffectEngine: ESMBeautyEffectEngine,\n EngineConfig,\n FacebetterError,\n ...constants,\n loadWasmModule\n};\n\n"],"names":["BeautyType","BasicParam","ReshapeParam","MakeupParam","ChromaKeyParam","BackgroundMode","FrameType","MirrorMode","imageUtils.toImageData","constants.BeautyType","constants.BasicParam","constants.ReshapeParam","constants.MakeupParam","constants.ChromaKeyParam","constants.BackgroundMode","constants.FrameType","constants.MirrorMode","constants.VirtualBackgroundOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"facebetter.esm.js","sources":["../src/core/errors.js","../src/core/config.js","../src/core/constants.js","../src/core/engine.js","../src/browser/image-utils.js","../src/esm/index.js"],"sourcesContent":["/**\n * Facebetter Error Classes\n * Platform-agnostic error handling\n */\n\n/**\n * Facebetter error class\n */\nexport class FacebetterError extends Error {\n constructor(message, code = -1) {\n super(message);\n this.name = 'FacebetterError';\n this.code = code;\n }\n}\n\n/**\n * Checks if a result code indicates success\n * @param {number} result - Result code from WASM function\n * @throws {FacebetterError} If result indicates failure\n */\nexport function checkResult(result, errorMessage = 'Operation failed') {\n if (result !== 0) {\n throw new FacebetterError(`${errorMessage} (error code: ${result})`, result);\n }\n}\n\n","/**\n * Engine Configuration\n * Platform-agnostic configuration class\n */\n\nimport { FacebetterError } from './errors.js';\n\n/**\n * Engine configuration class\n * Similar to EngineConfig struct in C++/Java/OC\n */\nexport class EngineConfig {\n /**\n * Creates a new EngineConfig instance\n * @param {Object} config - Configuration object\n * @param {string} [config.appId] - Application ID (required if licenseJson is not provided)\n * @param {string} [config.appKey] - Application key (required if licenseJson is not provided)\n * @param {string} [config.licenseJson] - License JSON string (optional, if provided, appId and appKey are not required)\n */\n constructor(config = {}) {\n this.appId = config.appId || null;\n this.appKey = config.appKey || null;\n this.licenseJson = config.licenseJson || null;\n this.resourcePath = '/resource.fbd';\n /**\n * Whether to use an external GL context (native platforms only).\n * In Web/WASM environments, this field is kept for configuration structure alignment,\n * but it does not take effect in the current implementation.\n */\n this.externalContext = !!config.externalContext;\n }\n\n /**\n * Validates the configuration\n * @returns {boolean} True if valid\n */\n isValid() {\n // If licenseJson is provided, use it for validation\n if (this.licenseJson) {\n return typeof this.licenseJson === 'string' && this.licenseJson.trim() !== '';\n }\n // Otherwise appId and appKey are required\n return this.appId && typeof this.appId === 'string' && this.appId.trim() !== '' &&\n this.appKey && typeof this.appKey === 'string' && this.appKey.trim() !== '';\n }\n\n /**\n * Returns a string representation of the config\n * @returns {string} String representation\n */\n toString() {\n return `EngineConfig{appId='${this.appId ? this.appId.substring(0, Math.min(this.appId.length, 8)) + '...' : 'null'}', appKey='${this.appKey ? '***' : 'null'}', licenseJson=${this.licenseJson ? 'provided' : 'null'}}`;\n }\n}\n\n","/**\n * Facebetter Constants and Enums\n * Platform-agnostic constants\n */\n\n/**\n * Beauty type enumeration\n */\nexport const BeautyType = {\n Basic: 0, // Basic beauty (smoothing, whitening, etc.)\n Reshape: 1, // Face reshaping (face thinning, big eyes, etc.)\n Makeup: 2, // Makeup effects (lipstick, blush, etc.)\n VirtualBackground: 3, // Virtual background (blur, image replacement)\n ChromaKey: 4, // Chroma key (green screen removal)\n Filter: 5, // LUT based filter\n Sticker: 6 // 2D/3D sticker\n};\n\n/**\n * Basic beauty parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const BasicParam = {\n Smoothing: 0, // Skin smoothing (0.0: none, 1.0: maximum)\n Sharpening: 1, // Image sharpening (0.0: none, 1.0: maximum)\n Whitening: 2, // Skin whitening (0.0: none, 1.0: maximum)\n Rosiness: 3 // Skin rosiness (0.0: none, 1.0: maximum)\n};\n\n/**\n * Face reshape parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const ReshapeParam = {\n FaceThinning: 0, // Face thinning (0.0: none, 1.0: maximum)\n FaceVShape: 1, // V-shape face (0.0: none, 1.0: maximum)\n FaceNarrowing: 2, // Face narrowing (0.0: none, 1.0: maximum)\n FaceShortening: 3,// Face shortening (0.0: none, 1.0: maximum)\n Cheekbone: 4, // Cheekbone slimming (0.0: none, 1.0: maximum)\n Jawbone: 5, // Jawbone slimming (0.0: none, 1.0: maximum)\n Chin: 6, // Chin length adjustment (0.0: none, 1.0: maximum)\n NoseSlimming: 7, // Nose slimming (0.0: none, 1.0: maximum)\n EyeSize: 8, // Eye size (0.0: normal, 1.0: maximum)\n EyeDistance: 9 // Eye distance (0.0: normal, 1.0: maximum)\n};\n\n/**\n * Makeup parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const MakeupParam = {\n Lipstick: 0, // Lipstick intensity (0.0: none, 1.0: maximum)\n Blush: 1 // Blush intensity (0.0: none, 1.0: maximum)\n};\n\n/**\n * Chroma Key parameter enumeration\n */\nexport const ChromaKeyParam = {\n KeyColor: 0, // Key color (0.0: Green, 1.0: Blue, 2.0: Red)\n Similarity: 1, // Color similarity (0.0 - 1.0)\n Smoothness: 2, // Edge smoothness (0.0 - 1.0)\n Desaturation: 3 // Spill desaturation (0.0 - 1.0)\n};\n\n/**\n * Background mode enumeration\n */\nexport const BackgroundMode = {\n None: 0, // No background processing\n Blur: 1, // Blurred background\n Image: 2 // Background image replacement\n};\n\n/**\n * Frame type enumeration\n */\nexport const FrameType = {\n Image: 0, // Image mode\n Video: 1 // Video mode\n};\n\n/**\n * Mirror mode enumeration (apply to input before processing)\n */\nexport const MirrorMode = {\n None: 0, // No mirror\n Horizontal: 1, // Mirror horizontally (e.g. front camera selfie)\n Vertical: 2, // Mirror vertically\n Both: 3 // Mirror both axes\n};\n\n/**\n * Virtual background options class\n * Matches the C++/Java/OC API design\n */\nexport class VirtualBackgroundOptions {\n /**\n * Creates a new VirtualBackgroundOptions instance\n * @param {Object} [options] - Options object\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n constructor(options = {}) {\n this.mode = options.mode !== undefined ? options.mode : BackgroundMode.None;\n this.backgroundImage = options.backgroundImage || null;\n }\n\n /**\n * Validates the options\n * @returns {boolean} True if valid\n */\n isValid() {\n if (this.mode === BackgroundMode.Image) {\n return this.backgroundImage !== null;\n }\n return true;\n }\n}\n\n","/**\n * Beauty Effect Engine Core\n * Platform-agnostic engine implementation with dependency injection\n */\n\nimport { EngineConfig } from './config.js';\nimport { FacebetterError, checkResult } from './errors.js';\nimport { FrameType, BackgroundMode, MirrorMode } from './constants.js';\n\n/**\n * Beauty effect engine class\n * Provides high-level API for face beauty effects processing\n * Uses dependency injection for platform-specific functionality\n */\nexport class BeautyEffectEngine {\n /**\n * Creates a new BeautyEffectEngine instance\n * @param {EngineConfig|Object} config - EngineConfig object or configuration object\n * @param {Object} platformAPI - Platform-specific API (injected)\n * @param {Function} platformAPI.loadWasmModule - WASM module loader\n * @param {Function} platformAPI.getWasmModule - Get WASM module instance\n * @param {Function} platformAPI.getWasmBuffer - Get WASM memory buffer\n * @param {Function} platformAPI.toImageData - Convert to ImageData\n * @param {Function} platformAPI.verifyAppKeyOnline - Verify app key online\n * @param {Function} [platformAPI.ensureGPUPixelCanvas] - Ensure GPU canvas exists (browser only)\n * @param {Function} [platformAPI.cleanupGPUPixelCanvas] - Cleanup GPU canvas (browser only)\n */\n constructor(config, platformAPI) {\n if (!config) {\n throw new FacebetterError('Config is required. Expected EngineConfig or configuration object');\n }\n\n if (!platformAPI) {\n throw new FacebetterError('Platform API is required');\n }\n\n // If an EngineConfig instance is passed, use it directly; otherwise create a new EngineConfig\n let engineConfig;\n if (config instanceof EngineConfig) {\n engineConfig = config;\n } else if (config && typeof config === 'object') {\n engineConfig = new EngineConfig(config);\n } else {\n throw new FacebetterError('Invalid configuration. Expected EngineConfig or configuration object');\n }\n\n if (!engineConfig.isValid()) {\n throw new FacebetterError('Invalid config: ' + engineConfig.toString());\n }\n\n this.config = engineConfig;\n this.appId = engineConfig.appId;\n this.appKey = engineConfig.appKey;\n this.licenseJson = engineConfig.licenseJson;\n this.resourcePath = '/resource.fbd';\n this.enginePtr = null;\n this.initialized = false;\n this.srcBufferPtr = null;\n this.dstBufferPtr = null;\n this.bufferSize = 0;\n \n // Callback related state\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n \n // Store platform API\n this._platformAPI = platformAPI;\n this._loadWasmModule = platformAPI.loadWasmModule;\n this._getWasmModule = platformAPI.getWasmModule;\n this._getWasmBuffer = platformAPI.getWasmBuffer;\n this._toImageData = platformAPI.toImageData;\n this._ensureGPUPixelCanvas = platformAPI.ensureGPUPixelCanvas;\n this._cleanupGPUPixelCanvas = platformAPI.cleanupGPUPixelCanvas;\n \n // Browser-specific state\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n \n // Automatically create gpupixel_canvas if it doesn't exist (browser only)\n if (this._ensureGPUPixelCanvas) {\n this._ensureGPUPixelCanvas();\n }\n \n // Start loading WASM module immediately in constructor\n this._wasmLoadPromise = this._loadWasmModule();\n this._initPromise = null;\n }\n\n /**\n * Creates a timeout promise\n * @private\n * @param {number} timeout - Timeout in milliseconds\n * @param {string} operation - Operation name for error message\n * @returns {Promise} Promise that rejects after timeout\n */\n _createTimeout(timeout, operation) {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new FacebetterError(\n `${operation} timed out after ${timeout}ms. Please check your network connection or try increasing the timeout.`,\n 'TIMEOUT'\n ));\n }, timeout);\n });\n }\n\n /**\n * Enhances error with context information\n * @private\n * @param {Error} error - Original error\n * @param {string} context - Context information\n * @returns {FacebetterError} Enhanced error\n */\n _enhanceError(error, context) {\n if (error instanceof FacebetterError) {\n return error;\n }\n\n let errorCode = 'UNKNOWN_ERROR';\n let message = error.message || 'Unknown error occurred';\n\n // Categorize errors\n if (error.message?.includes('timeout') || error.message?.includes('TIMEOUT')) {\n errorCode = 'TIMEOUT';\n } else if (error.message?.includes('network') || error.message?.includes('fetch')) {\n errorCode = 'NETWORK_ERROR';\n } else if (error.message?.includes('WASM') || error.message?.includes('wasm')) {\n errorCode = 'WASM_LOAD_ERROR';\n } else if (error.message?.includes('license') || error.message?.includes('auth')) {\n errorCode = 'LICENSE_ERROR';\n }\n\n return new FacebetterError(\n context ? `${context}: ${message}` : message,\n errorCode\n );\n }\n\n /**\n * Initializes the engine\n * @param {Object} [options] - Initialization options\n * @param {number} [options.timeout] - Timeout in milliseconds (default: 30000 for WASM, 10000 for auth)\n * @param {number} [options.authTimeout] - Timeout for online authentication in milliseconds (default: 10000)\n * @returns {Promise<void>} Promise that resolves when initialization is complete\n */\n async init(options = {}) {\n // Concurrency control: if already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // Concurrency control: if initialization is in progress, return the same Promise\n if (this._initPromise) {\n return this._initPromise;\n }\n\n // Create initialization Promise\n this._initPromise = (async () => {\n try {\n const wasmTimeout = options.timeout || 30000;\n\n // Wait for WASM module loading (with timeout)\n try {\n await Promise.race([\n this._wasmLoadPromise,\n this._createTimeout(wasmTimeout, 'WASM module loading')\n ]);\n } catch (error) {\n throw this._enhanceError(error, 'Failed to load WASM module');\n }\n\n const Module = this._getWasmModule();\n\n // Setup usage report proxy for WASM\n if (!Module.onReportUsage) {\n Module.onReportUsage = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/report';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n return response.ok;\n } catch (error) {\n return false;\n }\n };\n }\n\n // Setup online auth proxy for WASM\n if (!Module.onOnlineAuth) {\n Module.onOnlineAuth = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/auth';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n if (!response.ok) {\n console.warn('[JS Engine] Online auth fetch failed with status:', response.status);\n return \"\";\n }\n return await response.text();\n } catch (error) {\n console.error('[JS Engine] Online auth fetch exception:', error);\n return \"\";\n }\n };\n }\n\n // Create engine instance, auth (online/offline) is handled by WASM layer via onOnlineAuth\n const enginePtr = Module.ccall(\n 'CreateBeautyEffectEngineEx',\n 'number',\n ['string', 'string', 'string', 'string', 'number'],\n [\n this.resourcePath,\n this.licenseJson || '',\n this.appId || '',\n this.appKey || '',\n this.config.externalContext ? 1 : 0\n ]\n );\n\n if (!enginePtr) {\n throw new FacebetterError(\n 'Failed to create BeautyEffect engine. This may be due to invalid license or resource path issues.',\n 'ENGINE_CREATE_FAILED'\n );\n }\n\n this.enginePtr = enginePtr;\n this.initialized = true;\n this._initPromise = null; // Clear Promise cache, allow re-initialization (if needed)\n } catch (error) {\n this._initPromise = null; // Clear Promise cache, allow retry\n throw error;\n }\n })();\n\n return this._initPromise;\n }\n\n /**\n * Destroys the engine and releases resources\n */\n destroy() {\n if (!this.initialized || !this.enginePtr) {\n return;\n }\n\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n this.srcBufferPtr = null;\n }\n\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n this.dstBufferPtr = null;\n }\n\n // Clean up shared memory\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n\n Module.ccall('DestroyBeautyEffectEngine', null, ['number'], [this.enginePtr]);\n this.enginePtr = null;\n this.initialized = false;\n this.bufferSize = 0;\n this._initPromise = null; // Clear initialization Promise\n \n // Clean up offscreen canvas\n if (this._offscreenCanvas) {\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n }\n \n // Clean up gpupixel_canvas if we created it\n if (this._cleanupGPUPixelCanvas) {\n this._cleanupGPUPixelCanvas();\n }\n }\n\n /**\n * Sets log configuration\n * Can be called before init() since SetLogConfig is a global function\n * @param {Object} config - Log configuration\n * @param {boolean} config.consoleEnabled - Enable console logging\n * @param {boolean} config.fileEnabled - Enable file logging\n * @param {number} config.level - Log level\n * @param {string} config.fileName - Log file name\n * @returns {Promise<void>} Promise that resolves when log config is set\n */\n async setLogConfig(config) {\n // Wait for WASM module to be loaded (started in constructor)\n await this._wasmLoadPromise;\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetLogConfig',\n 'number',\n ['bool', 'bool', 'number', 'string'],\n [\n config.consoleEnabled || false,\n config.fileEnabled || false,\n config.level || 0,\n config.fileName || ''\n ]\n );\n\n checkResult(result, 'Failed to set log config');\n }\n\n /**\n * [Deprecated] No-op in parameter-driven mode. Use:\n * - setBasicParam/setReshapeParam/setMakeupParam\n * - setVirtualBackground\n * - setFilter/setSticker\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @param {boolean} enabled - Enable or disable\n */\n setBeautyTypeEnabled(beautyType, enabled) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetBeautyTypeEnabled',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, beautyType, enabled ? 1 : 0]\n );\n\n checkResult(result, `Failed to ${enabled ? 'enable' : 'disable'} beauty type`);\n }\n\n /**\n * [Deprecated] Always returns false in parameter-driven mode.\n * Query your own UI state or parameters instead.\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @returns {boolean} True if enabled\n */\n isBeautyTypeEnabled(beautyType) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'IsBeautyTypeEnabled',\n 'number',\n ['number', 'number'],\n [this.enginePtr, beautyType]\n );\n\n if (result === -1) {\n throw new FacebetterError('Failed to check beauty type status');\n }\n\n return result === 1;\n }\n\n /**\n * [Deprecated] No-op that returns success. To reset, explicitly zero parameters\n * and clear effects via parameter-driven APIs. Kept for compatibility and may\n * be removed in a future release.\n * @deprecated\n */\n disableAllBeautyTypes() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'DisableAllBeautyTypes',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n\n checkResult(result, 'Failed to disable all beauty types');\n }\n\n /**\n * Sets a basic beauty parameter\n * @param {number} param - Parameter (use BasicParam enum, e.g., BasicParam.Smoothing)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setBasicParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamBasic', param, value);\n }\n\n /**\n * Sets a reshape parameter\n * @param {number} param - Parameter (use ReshapeParam enum, e.g., ReshapeParam.FaceThinning)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setReshapeParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamReshape', param, value);\n }\n\n /**\n * Sets a makeup parameter\n * @param {number} param - Parameter (use MakeupParam enum, e.g., MakeupParam.Lipstick)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setMakeupParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamMakeup', param, value);\n }\n\n /**\n * Sets chroma key parameter\n * @param {number} param - Parameter (use ChromaKeyParam enum, e.g., ChromaKeyParam.Similarity)\n * @param {number} value - Parameter value (KeyColor: 0.0=Green, 1.0=Blue, 2.0=Red; others 0.0-1.0)\n */\n setChromaKeyParam(param, value) {\n this._ensureInitialized();\n // For KeyColor, values are 0, 1, 2, not 0.0-1.0\n if (param === 0) { // ChromaKeyParam.KeyColor\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetBeautyParamChromaKey',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n checkResult(result, `Failed to set chroma key parameter`);\n return;\n }\n this._setBeautyParam('SetBeautyParamChromaKey', param, value);\n }\n\n /**\n * Sets a LUT-based filter\n * @param {string} filterId - Unique identifier of the filter (e.g., \"chuxin\"). Pass \"\" to clear.\n */\n setFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId || '']\n );\n checkResult(result, 'Failed to set filter');\n }\n\n /**\n * Sets the intensity of the current filter\n * @param {number} intensity - Filter intensity (0.0 - 1.0)\n */\n setFilterIntensity(intensity) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilterIntensity',\n 'number',\n ['number', 'number'],\n [this.enginePtr, intensity]\n );\n checkResult(result, 'Failed to set filter intensity');\n }\n\n /**\n * Sets a 2D sticker\n * @param {string} stickerId - Unique identifier of the sticker (e.g., \"樱花\"). Pass \"\" to clear.\n */\n setSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId || '']\n );\n checkResult(result, 'Failed to set sticker');\n }\n\n /**\n * Registers a filter from a file path or data\n * @param {string} filterId - Unique identifier for the filter\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerFilter(filterId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterFilterPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, filterId, resource]\n );\n checkResult(result, `Failed to register filter path: ${filterId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterFilterData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, filterId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register filter data: ${filterId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Registers a sticker from a file path or data\n * @param {string} stickerId - Unique identifier for the sticker\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerSticker(stickerId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterStickerPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, stickerId, resource]\n );\n checkResult(result, `Failed to register sticker path: ${stickerId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterStickerData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, stickerId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register sticker data: ${stickerId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Unregisters a specific filter\n * @param {string} filterId - Filter ID to unregister\n */\n unregisterFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId]\n );\n checkResult(result, `Failed to unregister filter: ${filterId}`);\n }\n\n /**\n * Unregisters all filters\n */\n unregisterAllFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllFilters',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all filters');\n }\n\n /**\n * Unregisters a specific sticker\n * @param {string} stickerId - Sticker ID to unregister\n */\n unregisterSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId]\n );\n checkResult(result, `Failed to unregister sticker: ${stickerId}`);\n }\n\n /**\n * Unregisters all stickers\n */\n unregisterAllStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllStickers',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all stickers');\n }\n \n /**\n * Gets the list of registered filter IDs\n * @returns {string[]} Array of registered filter IDs\n */\n getRegisteredFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredFilters',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered filters JSON:', e);\n return [];\n }\n }\n \n /**\n * Gets the list of registered sticker IDs\n * @returns {string[]} Array of registered sticker IDs\n */\n getRegisteredStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredStickers',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered stickers JSON:', e);\n return [];\n }\n }\n \n /**\n * Internal method to set beauty parameters\n * @private\n */\n _setBeautyParam(functionName, param, value) {\n if (value < 0 || value > 1) {\n throw new FacebetterError('Parameter value must be between 0.0 and 1.0');\n }\n\n const Module = this._getWasmModule();\n const result = Module.ccall(\n functionName,\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n\n checkResult(result, `Failed to set beauty parameter`);\n }\n\n /**\n * Sets engine callbacks (face landmarks detection)\n * @param {Object} callbacks - Callback functions\n * @param {Function} callbacks.onFaceLandmarks - Callback for face landmarks detection\n * @param {number} [callbacks.maxFaces=10] - Maximum number of faces to support (affects shared buffer size)\n */\n setCallbacks(callbacks) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Initialize callback storage (if it doesn't exist)\n if (!Module._face_landmarks_callbacks) {\n Module._face_landmarks_callbacks = [];\n }\n \n let callbackId = 0;\n let sharedBufferPtr = null;\n let sharedBufferSize = 0;\n \n if (callbacks && callbacks.onFaceLandmarks) {\n // Get max faces (default 10)\n const maxFaces = callbacks.maxFaces || 10;\n \n // Pre-allocate shared memory\n // Metadata: 2 ints (frame_number, face_count) = 8 bytes\n // Face data: maxFaces * 343 floats * 4 bytes = maxFaces * 1372 bytes\n const metadataSize = 2 * 4; // 2 ints\n const faceDataSize = maxFaces * 343 * 4; // 343 floats per face\n sharedBufferSize = metadataSize + faceDataSize;\n sharedBufferPtr = Module._malloc(sharedBufferSize);\n \n if (!sharedBufferPtr) {\n throw new FacebetterError('Failed to allocate shared buffer for callbacks');\n }\n \n // Register callback function (internal wrapper, reads data from shared memory)\n // Push first, then get index as callbackId (allows callbackId to be 0)\n Module._face_landmarks_callbacks.push(\n (frameNumber, faceCount, dataPtr) => {\n // Read data from shared memory (zero-copy)\n const heap = Module.HEAPF32;\n const dataOffset = dataPtr / 4; // float is 4 bytes\n \n const results = [];\n const FLOATS_PER_FACE = 343;\n \n for (let i = 0; i < faceCount; i++) {\n const faceOffset = dataOffset + i * FLOATS_PER_FACE;\n let offset = faceOffset;\n \n // Read rect\n const rect = {\n x: heap[offset++],\n y: heap[offset++],\n width: heap[offset++],\n height: heap[offset++]\n };\n \n // Read basic fields\n const faceId = Math.round(heap[offset++]);\n const faceAction = Math.round(heap[offset++]);\n const score = heap[offset++];\n const pitch = heap[offset++];\n const roll = heap[offset++];\n const yaw = heap[offset++];\n \n // Read key_points (111 points)\n const keyPoints = [];\n for (let j = 0; j < 111; j++) {\n keyPoints.push({\n x: heap[offset++],\n y: heap[offset++]\n });\n }\n \n // Read visibility (111 points)\n const visibility = [];\n for (let j = 0; j < 111; j++) {\n visibility.push(heap[offset++]);\n }\n \n results.push({\n rect,\n key_points: keyPoints,\n visibility,\n face_id: faceId,\n face_action: faceAction,\n score,\n pitch,\n roll,\n yaw\n });\n }\n \n // Call user callback\n callbacks.onFaceLandmarks(results);\n }\n );\n \n // Get callback ID (index after push, can be 0)\n callbackId = Module._face_landmarks_callbacks.length - 1;\n }\n \n // Call C API\n const result = Module.ccall(\n 'SetCallbacks',\n 'number',\n ['number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n callbackId,\n sharedBufferPtr || 0,\n sharedBufferSize\n ]\n );\n \n checkResult(result, 'Failed to set callbacks');\n \n // Clean up old shared memory (if it exists)\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n }\n \n // Store new shared memory pointer for cleanup\n if (sharedBufferPtr) {\n this._callbackSharedBufferPtr = sharedBufferPtr;\n this._callbackSharedBufferSize = sharedBufferSize;\n } else {\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n }\n\n /**\n * Sets virtual background options (unified API, matches C++/Java/OC)\n * @param {VirtualBackgroundOptions|Object} options - Virtual background options\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n setVirtualBackground(options) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Support both VirtualBackgroundOptions object and plain object\n const opts = options.mode !== undefined ? options : { mode: BackgroundMode.None, backgroundImage: null };\n \n let imageData = null;\n let imageBufferPtr = null;\n \n try {\n // If a background image is provided, convert to ImageData and prepare buffer\n if (opts.backgroundImage) {\n imageData = this._toImageData(opts.backgroundImage);\n const bufferSize = imageData.width * imageData.height * 4;\n imageBufferPtr = Module._malloc(bufferSize);\n \n const buffer = this._getWasmBuffer();\n const view = new Uint8Array(buffer, imageBufferPtr, bufferSize);\n view.set(imageData.data);\n }\n \n // Use unified SetVirtualBackground C interface (consistent with other platforms)\n const result = Module.ccall(\n 'SetVirtualBackground',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n opts.mode,\n imageBufferPtr || 0, // If null, pass 0\n imageData ? imageData.width : 0,\n imageData ? imageData.height : 0,\n imageData ? imageData.width * 4 : 0\n ]\n );\n \n checkResult(result, 'Failed to set virtual background');\n } finally {\n // Free memory\n if (imageBufferPtr) {\n Module._free(imageBufferPtr);\n }\n }\n }\n\n /**\n * Sets whether to apply beauty effects only on skin regions.\n * When enabled, beauty effects will only be applied to detected skin areas.\n * @param {boolean} enabled - True to enable skin-only beauty, false to apply to entire image.\n */\n setSkinOnlyBeauty(enabled) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetSkinOnlyBeauty',\n 'number',\n ['number', 'number'],\n [this.enginePtr, enabled ? 1 : 0]\n );\n\n checkResult(result, 'Failed to set skin only beauty');\n }\n\n\n /**\n * Ensures buffers are allocated for the given dimensions\n * @private\n */\n _ensureBuffers(width, height) {\n const requiredSize = width * height * 4;\n\n if (this.bufferSize < requiredSize) {\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n }\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n }\n\n this.srcBufferPtr = Module._malloc(requiredSize);\n this.dstBufferPtr = Module._malloc(requiredSize);\n this.bufferSize = requiredSize;\n\n if (!this.srcBufferPtr || !this.dstBufferPtr) {\n throw new FacebetterError('Failed to allocate memory buffers');\n }\n }\n }\n\n /**\n * Processes an image\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} input - Input image\n * @param {number} width - Image width (required if input is Uint8ClampedArray)\n * @param {number} height - Image height (required if input is Uint8ClampedArray)\n * @param {number} frameType - Frame type (use FrameType enum, default: FrameType.Video)\n * @param {number} mirrorMode - Mirror mode applied to input before processing (MirrorMode enum, default: MirrorMode.None)\n * @returns {ImageData} Processed image data\n */\n processImage(input, width, height, frameType = FrameType.Video, mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n const imageData = this._platformAPI.toImageData(input, width, height);\n const Module = this._getWasmModule();\n\n this._ensureBuffers(imageData.width, imageData.height);\n\n const bufferSize = imageData.width * imageData.height * 4;\n\n try {\n const buffer = this._getWasmBuffer();\n \n const srcView = new Uint8Array(buffer, this.srcBufferPtr, bufferSize);\n srcView.set(imageData.data);\n\n const result = Module.ccall(\n 'ProcessImageRGBA',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n this.srcBufferPtr,\n imageData.width,\n imageData.height,\n imageData.width * 4,\n this.dstBufferPtr,\n frameType,\n mirrorMode\n ]\n );\n\n checkResult(result, 'Failed to process image');\n\n const currentBuffer = this._getWasmBuffer();\n const dstView = new Uint8Array(currentBuffer, this.dstBufferPtr, bufferSize);\n const processedData = new Uint8ClampedArray(dstView);\n\n return new ImageData(processedData, imageData.width, imageData.height);\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Image processing error: ${error.message}`);\n }\n }\n\n /**\n * Processes an external GPU texture.\n *\n * Note:\n * - This interface is mainly used for integration with internal WASM or advanced scenarios.\n * - textureHandle must be a texture handle (uint32) compatible with the OpenGL/WebGL context used by WASM.\n * - For common web scenarios, it is recommended to use processImage with ImageData/Canvas etc.\n *\n * @param {number} textureHandle - External texture handle (GL_TEXTURE_2D)\n * @param {number} width - Texture width\n * @param {number} height - Texture height\n * @param {number} stride - Row stride (usually width * 4)\n * @param {number} [frameType] - Frame type (FrameType.Image / FrameType.Video)\n * @param {number} [mirrorMode] - Mirror mode (MirrorMode enum; texture path does not support mirror, param reserved)\n * @returns {number} Processed texture handle (GL_TEXTURE_2D, uint32)\n */\n processTexture(textureHandle,\n width,\n height,\n stride,\n frameType = FrameType.Video,\n mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n if (!textureHandle || width <= 0 || height <= 0 || stride <= 0) {\n throw new FacebetterError('Invalid textureHandle or dimensions for processTexture');\n }\n\n const Module = this._getWasmModule();\n\n try {\n const result = Module.ccall(\n 'ProcessImageTexture',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n textureHandle,\n width,\n height,\n stride,\n frameType,\n mirrorMode\n ]\n );\n\n if (!result || result === 0) {\n throw new FacebetterError('Failed to process external texture or got invalid output texture');\n }\n\n // Return processed texture handle for caller to continue using in same GL context\n return result;\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Texture processing error: ${error.message}`);\n }\n }\n\n /**\n * Ensures the engine is initialized\n * @private\n * @throws {FacebetterError} If engine is not initialized\n */\n _ensureInitialized() {\n if (!this.initialized || !this.enginePtr) {\n throw new FacebetterError('Engine not initialized. Call init() first.');\n }\n }\n\n /**\n * Ensures gpupixel_canvas exists in the DOM (browser only)\n * This canvas is required by GPUPixel for WebGL context creation\n * @private\n */\n _ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n document.body.appendChild(canvas);\n this._createdGPUPixelCanvas = true;\n }\n this._gpupixelCanvas = canvas;\n }\n\n /**\n * Cleans up gpupixel_canvas if it was created by this engine instance (browser only)\n * @private\n */\n _cleanupGPUPixelCanvas() {\n if (this._createdGPUPixelCanvas && this._gpupixelCanvas) {\n this._gpupixelCanvas.remove();\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n }\n }\n\n /**\n * Ensures offscreen canvas exists and matches the required dimensions (browser only)\n * This canvas is reused for video processing to avoid creating temporary canvases\n * @private\n * @param {number} width - Required canvas width\n * @param {number} height - Required canvas height\n */\n _ensureOffscreenCanvas(width, height) {\n if (typeof document === 'undefined') {\n return null;\n }\n \n if (!this._offscreenCanvas || \n this._offscreenCanvas.width !== width || \n this._offscreenCanvas.height !== height) {\n this._offscreenCanvas = document.createElement('canvas');\n this._offscreenCanvas.width = width;\n this._offscreenCanvas.height = height;\n this._offscreenCtx = this._offscreenCanvas.getContext('2d', { willReadFrequently: true });\n }\n return this._offscreenCanvas;\n }\n\n}\n","/**\n * Browser-specific Image Utilities\n * Uses DOM APIs (canvas, ImageData, etc.)\n */\n\nimport { FacebetterError } from '../core/errors.js';\n\n/**\n * Converts various image sources to ImageData (browser version)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} source - Image source\n * @param {number} width - Image width (required if source is Uint8ClampedArray)\n * @param {number} height - Image height (required if source is Uint8ClampedArray)\n * @returns {ImageData} ImageData object\n */\nexport function toImageData(source, width, height) {\n if (source instanceof ImageData) {\n return source;\n }\n\n if (source instanceof HTMLCanvasElement || source instanceof HTMLVideoElement) {\n const canvas = source instanceof HTMLCanvasElement ? source : document.createElement('canvas');\n if (source instanceof HTMLVideoElement) {\n canvas.width = source.videoWidth;\n canvas.height = source.videoHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n }\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = source.naturalWidth || source.width;\n canvas.height = source.naturalHeight || source.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof Uint8ClampedArray) {\n if (width === undefined || height === undefined) {\n throw new FacebetterError('Width and height are required when source is Uint8ClampedArray');\n }\n return new ImageData(source, width, height);\n }\n\n throw new FacebetterError('Unsupported image source type');\n}\n\n/**\n * Gets User-Agent string for web platform\n * @returns {string} User-Agent string\n */\nexport function getUserAgentString() {\n return 'FB/1.0 (web; wasm32)';\n}\n\n/**\n * Generates HMAC-SHA256 signature (browser version)\n * @param {string} key - HMAC key (app_key)\n * @param {string} data - Data to sign (timestamp string)\n * @returns {Promise<string>} Promise that resolves with hex-encoded signature\n */\nexport async function generateHMACSignature(key, data) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const messageData = encoder.encode(data);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData);\n\n // Convert to hex string\n const hashArray = Array.from(new Uint8Array(signature));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n}\n\n","/**\n * ESM Entry Point\n * For Vue/React/Vite/Webpack (ES Module)\n * Uses facebetter-core npm package for WASM module loading\n */\n\nimport { BeautyEffectEngine } from '../core/engine.js';\nimport { EngineConfig } from '../core/config.js';\nimport { FacebetterError } from '../core/errors.js';\nimport * as constants from '../core/constants.js';\n\n// ESM-specific WASM loader\nlet wasmModuleInstance = null;\nlet wasmModulePromise = null;\n\n/**\n * Loads the WebAssembly module (ESM version)\n * Supports ESM format WASM modules (generated with MODULARIZE and EXPORT_ES6)\n * With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n * @param {Object} [options] - Options\n * @param {string} [options.wasmUrl] - Custom WASM module URL (defaults to facebetter-core npm package)\n * @param {Function} [options.locateFile] - Custom locateFile function (usually not needed with SINGLE_FILE=1)\n * @returns {Promise<Object>} Promise that resolves with the WASM module\n */\nexport async function loadWasmModule(options = {}) {\n if (wasmModuleInstance) {\n return wasmModuleInstance;\n }\n\n if (wasmModulePromise) {\n return wasmModulePromise;\n }\n\n wasmModulePromise = (async () => {\n // Try to import the WASM module factory\n // facebetter-core.js is an Emscripten-generated ESM file (with MODULARIZE and EXPORT_ES6)\n // It's provided by the facebetter-core npm package\n let FaceBetterModuleFactory;\n \n try {\n // Get the WASM module\n if (options.wasmUrl) {\n // If custom URL is provided, use it (for backward compatibility or custom builds)\n const wasmModule = await import(options.wasmUrl);\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n } else {\n // Import from facebetter-core npm package\n const wasmModule = await import('facebetter-core');\n \n // Get the factory function (default export or named export)\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n }\n \n if (!FaceBetterModuleFactory) {\n throw new Error('WASM module does not export createFaceBetterModule function');\n }\n } catch (e) {\n throw new FacebetterError(`Failed to load WASM module: ${e.message}`);\n }\n\n // Configure module options\n // With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n // No need to handle .wasm and .data file paths separately\n const moduleOptions = {\n locateFile: options.locateFile || function(path, prefix) {\n // With SINGLE_FILE=1, Emscripten handles embedded files automatically\n // Custom locateFile is only needed if user provides one\n return prefix + path;\n },\n ...options\n };\n\n // Initialize the module (MODULARIZE returns a Promise)\n wasmModuleInstance = await FaceBetterModuleFactory(moduleOptions);\n \n if (!wasmModuleInstance) {\n throw new FacebetterError('Failed to initialize WASM module');\n }\n\n wasmModuleInstance.ready = true;\n return wasmModuleInstance;\n })();\n\n return wasmModulePromise;\n}\n\n/**\n * Gets the current WASM module instance\n * @returns {Object} WASM module instance\n * @throws {Error} If module is not loaded\n */\nexport function getWasmModule() {\n if (!wasmModuleInstance) {\n throw new Error('WASM module not loaded. Call loadWasmModule() first or use BeautyEffectEngine.init()');\n }\n return wasmModuleInstance;\n}\n\n/**\n * Gets the current WASM memory buffer\n * @returns {ArrayBuffer} Current WASM memory buffer\n */\nexport function getWasmBuffer() {\n const Module = getWasmModule();\n \n if (Module.buffer) {\n return Module.buffer;\n } else if (Module.HEAPU8 && Module.HEAPU8.buffer) {\n return Module.HEAPU8.buffer;\n } else if (Module.asm && Module.asm.memory) {\n return Module.asm.memory.buffer;\n }\n \n throw new Error('Unable to access WASM memory buffer');\n}\n\n// Browser-specific image utilities (ESM version can use browser APIs)\nimport * as imageUtils from '../browser/image-utils.js';\n\n// Browser-specific GPU canvas management\nfunction ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n if (document.body) {\n document.body.appendChild(canvas);\n }\n }\n}\n\nfunction cleanupGPUPixelCanvas() {\n // Cleanup is handled by engine instance\n}\n\n// Create platform API\nconst platformAPI = {\n loadWasmModule: () => loadWasmModule(),\n getWasmModule,\n getWasmBuffer,\n toImageData: imageUtils.toImageData,\n ensureGPUPixelCanvas,\n cleanupGPUPixelCanvas\n};\n\n// Export factory function\nexport function createBeautyEffectEngine(config) {\n return new BeautyEffectEngine(config, platformAPI);\n}\n\n// Create a wrapped BeautyEffectEngine class that automatically injects platformAPI\n// This allows users to use: new BeautyEffectEngine(config) without passing platformAPI\nclass ESMBeautyEffectEngine extends BeautyEffectEngine {\n constructor(config) {\n // Automatically inject platformAPI for ESM environment\n super(config, platformAPI);\n }\n}\n\n// Export all constants and classes\nexport {\n ESMBeautyEffectEngine as BeautyEffectEngine,\n EngineConfig,\n FacebetterError\n};\n\n// Export constants with proper names\nexport const BeautyType = constants.BeautyType;\nexport const BasicParam = constants.BasicParam;\nexport const ReshapeParam = constants.ReshapeParam;\nexport const MakeupParam = constants.MakeupParam;\nexport const ChromaKeyParam = constants.ChromaKeyParam;\nexport const BackgroundMode = constants.BackgroundMode;\nexport const FrameType = constants.FrameType;\nexport const MirrorMode = constants.MirrorMode;\nexport const VirtualBackgroundOptions = constants.VirtualBackgroundOptions;\n\n// Default export\nexport default {\n BeautyEffectEngine: ESMBeautyEffectEngine,\n EngineConfig,\n FacebetterError,\n ...constants,\n loadWasmModule\n};\n\n"],"names":["BeautyType","BasicParam","ReshapeParam","MakeupParam","ChromaKeyParam","BackgroundMode","FrameType","MirrorMode","imageUtils.toImageData","constants.BeautyType","constants.BasicParam","constants.ReshapeParam","constants.MakeupParam","constants.ChromaKeyParam","constants.BackgroundMode","constants.FrameType","constants.MirrorMode","constants.VirtualBackgroundOptions"],"mappings":"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"}
|
package/dist/facebetter.js
CHANGED
|
@@ -1092,6 +1092,25 @@
|
|
|
1092
1092
|
}
|
|
1093
1093
|
}
|
|
1094
1094
|
|
|
1095
|
+
/**
|
|
1096
|
+
* Sets whether to apply beauty effects only on skin regions.
|
|
1097
|
+
* When enabled, beauty effects will only be applied to detected skin areas.
|
|
1098
|
+
* @param {boolean} enabled - True to enable skin-only beauty, false to apply to entire image.
|
|
1099
|
+
*/
|
|
1100
|
+
setSkinOnlyBeauty(enabled) {
|
|
1101
|
+
this._ensureInitialized();
|
|
1102
|
+
const Module = this._getWasmModule();
|
|
1103
|
+
|
|
1104
|
+
const result = Module.ccall(
|
|
1105
|
+
'SetSkinOnlyBeauty',
|
|
1106
|
+
'number',
|
|
1107
|
+
['number', 'number'],
|
|
1108
|
+
[this.enginePtr, enabled ? 1 : 0]
|
|
1109
|
+
);
|
|
1110
|
+
|
|
1111
|
+
checkResult(result, 'Failed to set skin only beauty');
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1095
1114
|
|
|
1096
1115
|
/**
|
|
1097
1116
|
* Ensures buffers are allocated for the given dimensions
|
package/dist/facebetter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facebetter.js","sources":["../src/core/errors.js","../src/core/config.js","../src/core/constants.js","../src/core/engine.js","../src/browser/wasm-loader.js","../src/browser/image-utils.js","../src/browser/index.js"],"sourcesContent":["/**\n * Facebetter Error Classes\n * Platform-agnostic error handling\n */\n\n/**\n * Facebetter error class\n */\nexport class FacebetterError extends Error {\n constructor(message, code = -1) {\n super(message);\n this.name = 'FacebetterError';\n this.code = code;\n }\n}\n\n/**\n * Checks if a result code indicates success\n * @param {number} result - Result code from WASM function\n * @throws {FacebetterError} If result indicates failure\n */\nexport function checkResult(result, errorMessage = 'Operation failed') {\n if (result !== 0) {\n throw new FacebetterError(`${errorMessage} (error code: ${result})`, result);\n }\n}\n\n","/**\n * Engine Configuration\n * Platform-agnostic configuration class\n */\n\nimport { FacebetterError } from './errors.js';\n\n/**\n * Engine configuration class\n * Similar to EngineConfig struct in C++/Java/OC\n */\nexport class EngineConfig {\n /**\n * Creates a new EngineConfig instance\n * @param {Object} config - Configuration object\n * @param {string} [config.appId] - Application ID (required if licenseJson is not provided)\n * @param {string} [config.appKey] - Application key (required if licenseJson is not provided)\n * @param {string} [config.licenseJson] - License JSON string (optional, if provided, appId and appKey are not required)\n */\n constructor(config = {}) {\n this.appId = config.appId || null;\n this.appKey = config.appKey || null;\n this.licenseJson = config.licenseJson || null;\n this.resourcePath = '/resource.fbd';\n /**\n * Whether to use an external GL context (native platforms only).\n * In Web/WASM environments, this field is kept for configuration structure alignment,\n * but it does not take effect in the current implementation.\n */\n this.externalContext = !!config.externalContext;\n }\n\n /**\n * Validates the configuration\n * @returns {boolean} True if valid\n */\n isValid() {\n // If licenseJson is provided, use it for validation\n if (this.licenseJson) {\n return typeof this.licenseJson === 'string' && this.licenseJson.trim() !== '';\n }\n // Otherwise appId and appKey are required\n return this.appId && typeof this.appId === 'string' && this.appId.trim() !== '' &&\n this.appKey && typeof this.appKey === 'string' && this.appKey.trim() !== '';\n }\n\n /**\n * Returns a string representation of the config\n * @returns {string} String representation\n */\n toString() {\n return `EngineConfig{appId='${this.appId ? this.appId.substring(0, Math.min(this.appId.length, 8)) + '...' : 'null'}', appKey='${this.appKey ? '***' : 'null'}', licenseJson=${this.licenseJson ? 'provided' : 'null'}}`;\n }\n}\n\n","/**\n * Facebetter Constants and Enums\n * Platform-agnostic constants\n */\n\n/**\n * Beauty type enumeration\n */\nexport const BeautyType = {\n Basic: 0, // Basic beauty (smoothing, whitening, etc.)\n Reshape: 1, // Face reshaping (face thinning, big eyes, etc.)\n Makeup: 2, // Makeup effects (lipstick, blush, etc.)\n VirtualBackground: 3, // Virtual background (blur, image replacement)\n ChromaKey: 4, // Chroma key (green screen removal)\n Filter: 5, // LUT based filter\n Sticker: 6 // 2D/3D sticker\n};\n\n/**\n * Basic beauty parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const BasicParam = {\n Smoothing: 0, // Skin smoothing (0.0: none, 1.0: maximum)\n Sharpening: 1, // Image sharpening (0.0: none, 1.0: maximum)\n Whitening: 2, // Skin whitening (0.0: none, 1.0: maximum)\n Rosiness: 3 // Skin rosiness (0.0: none, 1.0: maximum)\n};\n\n/**\n * Face reshape parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const ReshapeParam = {\n FaceThinning: 0, // Face thinning (0.0: none, 1.0: maximum)\n FaceVShape: 1, // V-shape face (0.0: none, 1.0: maximum)\n FaceNarrowing: 2, // Face narrowing (0.0: none, 1.0: maximum)\n FaceShortening: 3,// Face shortening (0.0: none, 1.0: maximum)\n Cheekbone: 4, // Cheekbone slimming (0.0: none, 1.0: maximum)\n Jawbone: 5, // Jawbone slimming (0.0: none, 1.0: maximum)\n Chin: 6, // Chin length adjustment (0.0: none, 1.0: maximum)\n NoseSlimming: 7, // Nose slimming (0.0: none, 1.0: maximum)\n EyeSize: 8, // Eye size (0.0: normal, 1.0: maximum)\n EyeDistance: 9 // Eye distance (0.0: normal, 1.0: maximum)\n};\n\n/**\n * Makeup parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const MakeupParam = {\n Lipstick: 0, // Lipstick intensity (0.0: none, 1.0: maximum)\n Blush: 1 // Blush intensity (0.0: none, 1.0: maximum)\n};\n\n/**\n * Chroma Key parameter enumeration\n */\nexport const ChromaKeyParam = {\n KeyColor: 0, // Key color (0.0: Green, 1.0: Blue, 2.0: Red)\n Similarity: 1, // Color similarity (0.0 - 1.0)\n Smoothness: 2, // Edge smoothness (0.0 - 1.0)\n Desaturation: 3 // Spill desaturation (0.0 - 1.0)\n};\n\n/**\n * Background mode enumeration\n */\nexport const BackgroundMode = {\n None: 0, // No background processing\n Blur: 1, // Blurred background\n Image: 2 // Background image replacement\n};\n\n/**\n * Frame type enumeration\n */\nexport const FrameType = {\n Image: 0, // Image mode\n Video: 1 // Video mode\n};\n\n/**\n * Mirror mode enumeration (apply to input before processing)\n */\nexport const MirrorMode = {\n None: 0, // No mirror\n Horizontal: 1, // Mirror horizontally (e.g. front camera selfie)\n Vertical: 2, // Mirror vertically\n Both: 3 // Mirror both axes\n};\n\n/**\n * Virtual background options class\n * Matches the C++/Java/OC API design\n */\nexport class VirtualBackgroundOptions {\n /**\n * Creates a new VirtualBackgroundOptions instance\n * @param {Object} [options] - Options object\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n constructor(options = {}) {\n this.mode = options.mode !== undefined ? options.mode : BackgroundMode.None;\n this.backgroundImage = options.backgroundImage || null;\n }\n\n /**\n * Validates the options\n * @returns {boolean} True if valid\n */\n isValid() {\n if (this.mode === BackgroundMode.Image) {\n return this.backgroundImage !== null;\n }\n return true;\n }\n}\n\n","/**\n * Beauty Effect Engine Core\n * Platform-agnostic engine implementation with dependency injection\n */\n\nimport { EngineConfig } from './config.js';\nimport { FacebetterError, checkResult } from './errors.js';\nimport { FrameType, BackgroundMode, MirrorMode } from './constants.js';\n\n/**\n * Beauty effect engine class\n * Provides high-level API for face beauty effects processing\n * Uses dependency injection for platform-specific functionality\n */\nexport class BeautyEffectEngine {\n /**\n * Creates a new BeautyEffectEngine instance\n * @param {EngineConfig|Object} config - EngineConfig object or configuration object\n * @param {Object} platformAPI - Platform-specific API (injected)\n * @param {Function} platformAPI.loadWasmModule - WASM module loader\n * @param {Function} platformAPI.getWasmModule - Get WASM module instance\n * @param {Function} platformAPI.getWasmBuffer - Get WASM memory buffer\n * @param {Function} platformAPI.toImageData - Convert to ImageData\n * @param {Function} platformAPI.verifyAppKeyOnline - Verify app key online\n * @param {Function} [platformAPI.ensureGPUPixelCanvas] - Ensure GPU canvas exists (browser only)\n * @param {Function} [platformAPI.cleanupGPUPixelCanvas] - Cleanup GPU canvas (browser only)\n */\n constructor(config, platformAPI) {\n if (!config) {\n throw new FacebetterError('Config is required. Expected EngineConfig or configuration object');\n }\n\n if (!platformAPI) {\n throw new FacebetterError('Platform API is required');\n }\n\n // If an EngineConfig instance is passed, use it directly; otherwise create a new EngineConfig\n let engineConfig;\n if (config instanceof EngineConfig) {\n engineConfig = config;\n } else if (config && typeof config === 'object') {\n engineConfig = new EngineConfig(config);\n } else {\n throw new FacebetterError('Invalid configuration. Expected EngineConfig or configuration object');\n }\n\n if (!engineConfig.isValid()) {\n throw new FacebetterError('Invalid config: ' + engineConfig.toString());\n }\n\n this.config = engineConfig;\n this.appId = engineConfig.appId;\n this.appKey = engineConfig.appKey;\n this.licenseJson = engineConfig.licenseJson;\n this.resourcePath = '/resource.fbd';\n this.enginePtr = null;\n this.initialized = false;\n this.srcBufferPtr = null;\n this.dstBufferPtr = null;\n this.bufferSize = 0;\n \n // Callback related state\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n \n // Store platform API\n this._platformAPI = platformAPI;\n this._loadWasmModule = platformAPI.loadWasmModule;\n this._getWasmModule = platformAPI.getWasmModule;\n this._getWasmBuffer = platformAPI.getWasmBuffer;\n this._toImageData = platformAPI.toImageData;\n this._ensureGPUPixelCanvas = platformAPI.ensureGPUPixelCanvas;\n this._cleanupGPUPixelCanvas = platformAPI.cleanupGPUPixelCanvas;\n \n // Browser-specific state\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n \n // Automatically create gpupixel_canvas if it doesn't exist (browser only)\n if (this._ensureGPUPixelCanvas) {\n this._ensureGPUPixelCanvas();\n }\n \n // Start loading WASM module immediately in constructor\n this._wasmLoadPromise = this._loadWasmModule();\n this._initPromise = null;\n }\n\n /**\n * Creates a timeout promise\n * @private\n * @param {number} timeout - Timeout in milliseconds\n * @param {string} operation - Operation name for error message\n * @returns {Promise} Promise that rejects after timeout\n */\n _createTimeout(timeout, operation) {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new FacebetterError(\n `${operation} timed out after ${timeout}ms. Please check your network connection or try increasing the timeout.`,\n 'TIMEOUT'\n ));\n }, timeout);\n });\n }\n\n /**\n * Enhances error with context information\n * @private\n * @param {Error} error - Original error\n * @param {string} context - Context information\n * @returns {FacebetterError} Enhanced error\n */\n _enhanceError(error, context) {\n if (error instanceof FacebetterError) {\n return error;\n }\n\n let errorCode = 'UNKNOWN_ERROR';\n let message = error.message || 'Unknown error occurred';\n\n // Categorize errors\n if (error.message?.includes('timeout') || error.message?.includes('TIMEOUT')) {\n errorCode = 'TIMEOUT';\n } else if (error.message?.includes('network') || error.message?.includes('fetch')) {\n errorCode = 'NETWORK_ERROR';\n } else if (error.message?.includes('WASM') || error.message?.includes('wasm')) {\n errorCode = 'WASM_LOAD_ERROR';\n } else if (error.message?.includes('license') || error.message?.includes('auth')) {\n errorCode = 'LICENSE_ERROR';\n }\n\n return new FacebetterError(\n context ? `${context}: ${message}` : message,\n errorCode\n );\n }\n\n /**\n * Initializes the engine\n * @param {Object} [options] - Initialization options\n * @param {number} [options.timeout] - Timeout in milliseconds (default: 30000 for WASM, 10000 for auth)\n * @param {number} [options.authTimeout] - Timeout for online authentication in milliseconds (default: 10000)\n * @returns {Promise<void>} Promise that resolves when initialization is complete\n */\n async init(options = {}) {\n // Concurrency control: if already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // Concurrency control: if initialization is in progress, return the same Promise\n if (this._initPromise) {\n return this._initPromise;\n }\n\n // Create initialization Promise\n this._initPromise = (async () => {\n try {\n const wasmTimeout = options.timeout || 30000;\n\n // Wait for WASM module loading (with timeout)\n try {\n await Promise.race([\n this._wasmLoadPromise,\n this._createTimeout(wasmTimeout, 'WASM module loading')\n ]);\n } catch (error) {\n throw this._enhanceError(error, 'Failed to load WASM module');\n }\n\n const Module = this._getWasmModule();\n\n // Setup usage report proxy for WASM\n if (!Module.onReportUsage) {\n Module.onReportUsage = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/report';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n return response.ok;\n } catch (error) {\n return false;\n }\n };\n }\n\n // Setup online auth proxy for WASM\n if (!Module.onOnlineAuth) {\n Module.onOnlineAuth = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/auth';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n if (!response.ok) {\n console.warn('[JS Engine] Online auth fetch failed with status:', response.status);\n return \"\";\n }\n return await response.text();\n } catch (error) {\n console.error('[JS Engine] Online auth fetch exception:', error);\n return \"\";\n }\n };\n }\n\n // Create engine instance, auth (online/offline) is handled by WASM layer via onOnlineAuth\n const enginePtr = Module.ccall(\n 'CreateBeautyEffectEngineEx',\n 'number',\n ['string', 'string', 'string', 'string', 'number'],\n [\n this.resourcePath,\n this.licenseJson || '',\n this.appId || '',\n this.appKey || '',\n this.config.externalContext ? 1 : 0\n ]\n );\n\n if (!enginePtr) {\n throw new FacebetterError(\n 'Failed to create BeautyEffect engine. This may be due to invalid license or resource path issues.',\n 'ENGINE_CREATE_FAILED'\n );\n }\n\n this.enginePtr = enginePtr;\n this.initialized = true;\n this._initPromise = null; // Clear Promise cache, allow re-initialization (if needed)\n } catch (error) {\n this._initPromise = null; // Clear Promise cache, allow retry\n throw error;\n }\n })();\n\n return this._initPromise;\n }\n\n /**\n * Destroys the engine and releases resources\n */\n destroy() {\n if (!this.initialized || !this.enginePtr) {\n return;\n }\n\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n this.srcBufferPtr = null;\n }\n\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n this.dstBufferPtr = null;\n }\n\n // Clean up shared memory\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n\n Module.ccall('DestroyBeautyEffectEngine', null, ['number'], [this.enginePtr]);\n this.enginePtr = null;\n this.initialized = false;\n this.bufferSize = 0;\n this._initPromise = null; // Clear initialization Promise\n \n // Clean up offscreen canvas\n if (this._offscreenCanvas) {\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n }\n \n // Clean up gpupixel_canvas if we created it\n if (this._cleanupGPUPixelCanvas) {\n this._cleanupGPUPixelCanvas();\n }\n }\n\n /**\n * Sets log configuration\n * Can be called before init() since SetLogConfig is a global function\n * @param {Object} config - Log configuration\n * @param {boolean} config.consoleEnabled - Enable console logging\n * @param {boolean} config.fileEnabled - Enable file logging\n * @param {number} config.level - Log level\n * @param {string} config.fileName - Log file name\n * @returns {Promise<void>} Promise that resolves when log config is set\n */\n async setLogConfig(config) {\n // Wait for WASM module to be loaded (started in constructor)\n await this._wasmLoadPromise;\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetLogConfig',\n 'number',\n ['bool', 'bool', 'number', 'string'],\n [\n config.consoleEnabled || false,\n config.fileEnabled || false,\n config.level || 0,\n config.fileName || ''\n ]\n );\n\n checkResult(result, 'Failed to set log config');\n }\n\n /**\n * [Deprecated] No-op in parameter-driven mode. Use:\n * - setBasicParam/setReshapeParam/setMakeupParam\n * - setVirtualBackground\n * - setFilter/setSticker\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @param {boolean} enabled - Enable or disable\n */\n setBeautyTypeEnabled(beautyType, enabled) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetBeautyTypeEnabled',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, beautyType, enabled ? 1 : 0]\n );\n\n checkResult(result, `Failed to ${enabled ? 'enable' : 'disable'} beauty type`);\n }\n\n /**\n * [Deprecated] Always returns false in parameter-driven mode.\n * Query your own UI state or parameters instead.\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @returns {boolean} True if enabled\n */\n isBeautyTypeEnabled(beautyType) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'IsBeautyTypeEnabled',\n 'number',\n ['number', 'number'],\n [this.enginePtr, beautyType]\n );\n\n if (result === -1) {\n throw new FacebetterError('Failed to check beauty type status');\n }\n\n return result === 1;\n }\n\n /**\n * [Deprecated] No-op that returns success. To reset, explicitly zero parameters\n * and clear effects via parameter-driven APIs. Kept for compatibility and may\n * be removed in a future release.\n * @deprecated\n */\n disableAllBeautyTypes() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'DisableAllBeautyTypes',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n\n checkResult(result, 'Failed to disable all beauty types');\n }\n\n /**\n * Sets a basic beauty parameter\n * @param {number} param - Parameter (use BasicParam enum, e.g., BasicParam.Smoothing)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setBasicParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamBasic', param, value);\n }\n\n /**\n * Sets a reshape parameter\n * @param {number} param - Parameter (use ReshapeParam enum, e.g., ReshapeParam.FaceThinning)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setReshapeParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamReshape', param, value);\n }\n\n /**\n * Sets a makeup parameter\n * @param {number} param - Parameter (use MakeupParam enum, e.g., MakeupParam.Lipstick)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setMakeupParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamMakeup', param, value);\n }\n\n /**\n * Sets chroma key parameter\n * @param {number} param - Parameter (use ChromaKeyParam enum, e.g., ChromaKeyParam.Similarity)\n * @param {number} value - Parameter value (KeyColor: 0.0=Green, 1.0=Blue, 2.0=Red; others 0.0-1.0)\n */\n setChromaKeyParam(param, value) {\n this._ensureInitialized();\n // For KeyColor, values are 0, 1, 2, not 0.0-1.0\n if (param === 0) { // ChromaKeyParam.KeyColor\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetBeautyParamChromaKey',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n checkResult(result, `Failed to set chroma key parameter`);\n return;\n }\n this._setBeautyParam('SetBeautyParamChromaKey', param, value);\n }\n\n /**\n * Sets a LUT-based filter\n * @param {string} filterId - Unique identifier of the filter (e.g., \"chuxin\"). Pass \"\" to clear.\n */\n setFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId || '']\n );\n checkResult(result, 'Failed to set filter');\n }\n\n /**\n * Sets the intensity of the current filter\n * @param {number} intensity - Filter intensity (0.0 - 1.0)\n */\n setFilterIntensity(intensity) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilterIntensity',\n 'number',\n ['number', 'number'],\n [this.enginePtr, intensity]\n );\n checkResult(result, 'Failed to set filter intensity');\n }\n\n /**\n * Sets a 2D sticker\n * @param {string} stickerId - Unique identifier of the sticker (e.g., \"樱花\"). Pass \"\" to clear.\n */\n setSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId || '']\n );\n checkResult(result, 'Failed to set sticker');\n }\n\n /**\n * Registers a filter from a file path or data\n * @param {string} filterId - Unique identifier for the filter\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerFilter(filterId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterFilterPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, filterId, resource]\n );\n checkResult(result, `Failed to register filter path: ${filterId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterFilterData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, filterId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register filter data: ${filterId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Registers a sticker from a file path or data\n * @param {string} stickerId - Unique identifier for the sticker\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerSticker(stickerId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterStickerPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, stickerId, resource]\n );\n checkResult(result, `Failed to register sticker path: ${stickerId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterStickerData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, stickerId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register sticker data: ${stickerId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Unregisters a specific filter\n * @param {string} filterId - Filter ID to unregister\n */\n unregisterFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId]\n );\n checkResult(result, `Failed to unregister filter: ${filterId}`);\n }\n\n /**\n * Unregisters all filters\n */\n unregisterAllFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllFilters',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all filters');\n }\n\n /**\n * Unregisters a specific sticker\n * @param {string} stickerId - Sticker ID to unregister\n */\n unregisterSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId]\n );\n checkResult(result, `Failed to unregister sticker: ${stickerId}`);\n }\n\n /**\n * Unregisters all stickers\n */\n unregisterAllStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllStickers',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all stickers');\n }\n \n /**\n * Gets the list of registered filter IDs\n * @returns {string[]} Array of registered filter IDs\n */\n getRegisteredFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredFilters',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered filters JSON:', e);\n return [];\n }\n }\n \n /**\n * Gets the list of registered sticker IDs\n * @returns {string[]} Array of registered sticker IDs\n */\n getRegisteredStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredStickers',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered stickers JSON:', e);\n return [];\n }\n }\n \n /**\n * Internal method to set beauty parameters\n * @private\n */\n _setBeautyParam(functionName, param, value) {\n if (value < 0 || value > 1) {\n throw new FacebetterError('Parameter value must be between 0.0 and 1.0');\n }\n\n const Module = this._getWasmModule();\n const result = Module.ccall(\n functionName,\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n\n checkResult(result, `Failed to set beauty parameter`);\n }\n\n /**\n * Sets engine callbacks (face landmarks detection)\n * @param {Object} callbacks - Callback functions\n * @param {Function} callbacks.onFaceLandmarks - Callback for face landmarks detection\n * @param {number} [callbacks.maxFaces=10] - Maximum number of faces to support (affects shared buffer size)\n */\n setCallbacks(callbacks) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Initialize callback storage (if it doesn't exist)\n if (!Module._face_landmarks_callbacks) {\n Module._face_landmarks_callbacks = [];\n }\n \n let callbackId = 0;\n let sharedBufferPtr = null;\n let sharedBufferSize = 0;\n \n if (callbacks && callbacks.onFaceLandmarks) {\n // Get max faces (default 10)\n const maxFaces = callbacks.maxFaces || 10;\n \n // Pre-allocate shared memory\n // Metadata: 2 ints (frame_number, face_count) = 8 bytes\n // Face data: maxFaces * 343 floats * 4 bytes = maxFaces * 1372 bytes\n const metadataSize = 2 * 4; // 2 ints\n const faceDataSize = maxFaces * 343 * 4; // 343 floats per face\n sharedBufferSize = metadataSize + faceDataSize;\n sharedBufferPtr = Module._malloc(sharedBufferSize);\n \n if (!sharedBufferPtr) {\n throw new FacebetterError('Failed to allocate shared buffer for callbacks');\n }\n \n // Register callback function (internal wrapper, reads data from shared memory)\n // Push first, then get index as callbackId (allows callbackId to be 0)\n Module._face_landmarks_callbacks.push(\n (frameNumber, faceCount, dataPtr) => {\n // Read data from shared memory (zero-copy)\n const heap = Module.HEAPF32;\n const dataOffset = dataPtr / 4; // float is 4 bytes\n \n const results = [];\n const FLOATS_PER_FACE = 343;\n \n for (let i = 0; i < faceCount; i++) {\n const faceOffset = dataOffset + i * FLOATS_PER_FACE;\n let offset = faceOffset;\n \n // Read rect\n const rect = {\n x: heap[offset++],\n y: heap[offset++],\n width: heap[offset++],\n height: heap[offset++]\n };\n \n // Read basic fields\n const faceId = Math.round(heap[offset++]);\n const faceAction = Math.round(heap[offset++]);\n const score = heap[offset++];\n const pitch = heap[offset++];\n const roll = heap[offset++];\n const yaw = heap[offset++];\n \n // Read key_points (111 points)\n const keyPoints = [];\n for (let j = 0; j < 111; j++) {\n keyPoints.push({\n x: heap[offset++],\n y: heap[offset++]\n });\n }\n \n // Read visibility (111 points)\n const visibility = [];\n for (let j = 0; j < 111; j++) {\n visibility.push(heap[offset++]);\n }\n \n results.push({\n rect,\n key_points: keyPoints,\n visibility,\n face_id: faceId,\n face_action: faceAction,\n score,\n pitch,\n roll,\n yaw\n });\n }\n \n // Call user callback\n callbacks.onFaceLandmarks(results);\n }\n );\n \n // Get callback ID (index after push, can be 0)\n callbackId = Module._face_landmarks_callbacks.length - 1;\n }\n \n // Call C API\n const result = Module.ccall(\n 'SetCallbacks',\n 'number',\n ['number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n callbackId,\n sharedBufferPtr || 0,\n sharedBufferSize\n ]\n );\n \n checkResult(result, 'Failed to set callbacks');\n \n // Clean up old shared memory (if it exists)\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n }\n \n // Store new shared memory pointer for cleanup\n if (sharedBufferPtr) {\n this._callbackSharedBufferPtr = sharedBufferPtr;\n this._callbackSharedBufferSize = sharedBufferSize;\n } else {\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n }\n\n /**\n * Sets virtual background options (unified API, matches C++/Java/OC)\n * @param {VirtualBackgroundOptions|Object} options - Virtual background options\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n setVirtualBackground(options) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Support both VirtualBackgroundOptions object and plain object\n const opts = options.mode !== undefined ? options : { mode: BackgroundMode.None, backgroundImage: null };\n \n let imageData = null;\n let imageBufferPtr = null;\n \n try {\n // If a background image is provided, convert to ImageData and prepare buffer\n if (opts.backgroundImage) {\n imageData = this._toImageData(opts.backgroundImage);\n const bufferSize = imageData.width * imageData.height * 4;\n imageBufferPtr = Module._malloc(bufferSize);\n \n const buffer = this._getWasmBuffer();\n const view = new Uint8Array(buffer, imageBufferPtr, bufferSize);\n view.set(imageData.data);\n }\n \n // Use unified SetVirtualBackground C interface (consistent with other platforms)\n const result = Module.ccall(\n 'SetVirtualBackground',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n opts.mode,\n imageBufferPtr || 0, // If null, pass 0\n imageData ? imageData.width : 0,\n imageData ? imageData.height : 0,\n imageData ? imageData.width * 4 : 0\n ]\n );\n \n checkResult(result, 'Failed to set virtual background');\n } finally {\n // Free memory\n if (imageBufferPtr) {\n Module._free(imageBufferPtr);\n }\n }\n }\n\n\n /**\n * Ensures buffers are allocated for the given dimensions\n * @private\n */\n _ensureBuffers(width, height) {\n const requiredSize = width * height * 4;\n\n if (this.bufferSize < requiredSize) {\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n }\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n }\n\n this.srcBufferPtr = Module._malloc(requiredSize);\n this.dstBufferPtr = Module._malloc(requiredSize);\n this.bufferSize = requiredSize;\n\n if (!this.srcBufferPtr || !this.dstBufferPtr) {\n throw new FacebetterError('Failed to allocate memory buffers');\n }\n }\n }\n\n /**\n * Processes an image\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} input - Input image\n * @param {number} width - Image width (required if input is Uint8ClampedArray)\n * @param {number} height - Image height (required if input is Uint8ClampedArray)\n * @param {number} frameType - Frame type (use FrameType enum, default: FrameType.Video)\n * @param {number} mirrorMode - Mirror mode applied to input before processing (MirrorMode enum, default: MirrorMode.None)\n * @returns {ImageData} Processed image data\n */\n processImage(input, width, height, frameType = FrameType.Video, mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n const imageData = this._platformAPI.toImageData(input, width, height);\n const Module = this._getWasmModule();\n\n this._ensureBuffers(imageData.width, imageData.height);\n\n const bufferSize = imageData.width * imageData.height * 4;\n\n try {\n const buffer = this._getWasmBuffer();\n \n const srcView = new Uint8Array(buffer, this.srcBufferPtr, bufferSize);\n srcView.set(imageData.data);\n\n const result = Module.ccall(\n 'ProcessImageRGBA',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n this.srcBufferPtr,\n imageData.width,\n imageData.height,\n imageData.width * 4,\n this.dstBufferPtr,\n frameType,\n mirrorMode\n ]\n );\n\n checkResult(result, 'Failed to process image');\n\n const currentBuffer = this._getWasmBuffer();\n const dstView = new Uint8Array(currentBuffer, this.dstBufferPtr, bufferSize);\n const processedData = new Uint8ClampedArray(dstView);\n\n return new ImageData(processedData, imageData.width, imageData.height);\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Image processing error: ${error.message}`);\n }\n }\n\n /**\n * Processes an external GPU texture.\n *\n * Note:\n * - This interface is mainly used for integration with internal WASM or advanced scenarios.\n * - textureHandle must be a texture handle (uint32) compatible with the OpenGL/WebGL context used by WASM.\n * - For common web scenarios, it is recommended to use processImage with ImageData/Canvas etc.\n *\n * @param {number} textureHandle - External texture handle (GL_TEXTURE_2D)\n * @param {number} width - Texture width\n * @param {number} height - Texture height\n * @param {number} stride - Row stride (usually width * 4)\n * @param {number} [frameType] - Frame type (FrameType.Image / FrameType.Video)\n * @param {number} [mirrorMode] - Mirror mode (MirrorMode enum; texture path does not support mirror, param reserved)\n * @returns {number} Processed texture handle (GL_TEXTURE_2D, uint32)\n */\n processTexture(textureHandle,\n width,\n height,\n stride,\n frameType = FrameType.Video,\n mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n if (!textureHandle || width <= 0 || height <= 0 || stride <= 0) {\n throw new FacebetterError('Invalid textureHandle or dimensions for processTexture');\n }\n\n const Module = this._getWasmModule();\n\n try {\n const result = Module.ccall(\n 'ProcessImageTexture',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n textureHandle,\n width,\n height,\n stride,\n frameType,\n mirrorMode\n ]\n );\n\n if (!result || result === 0) {\n throw new FacebetterError('Failed to process external texture or got invalid output texture');\n }\n\n // Return processed texture handle for caller to continue using in same GL context\n return result;\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Texture processing error: ${error.message}`);\n }\n }\n\n /**\n * Ensures the engine is initialized\n * @private\n * @throws {FacebetterError} If engine is not initialized\n */\n _ensureInitialized() {\n if (!this.initialized || !this.enginePtr) {\n throw new FacebetterError('Engine not initialized. Call init() first.');\n }\n }\n\n /**\n * Ensures gpupixel_canvas exists in the DOM (browser only)\n * This canvas is required by GPUPixel for WebGL context creation\n * @private\n */\n _ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n document.body.appendChild(canvas);\n this._createdGPUPixelCanvas = true;\n }\n this._gpupixelCanvas = canvas;\n }\n\n /**\n * Cleans up gpupixel_canvas if it was created by this engine instance (browser only)\n * @private\n */\n _cleanupGPUPixelCanvas() {\n if (this._createdGPUPixelCanvas && this._gpupixelCanvas) {\n this._gpupixelCanvas.remove();\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n }\n }\n\n /**\n * Ensures offscreen canvas exists and matches the required dimensions (browser only)\n * This canvas is reused for video processing to avoid creating temporary canvases\n * @private\n * @param {number} width - Required canvas width\n * @param {number} height - Required canvas height\n */\n _ensureOffscreenCanvas(width, height) {\n if (typeof document === 'undefined') {\n return null;\n }\n \n if (!this._offscreenCanvas || \n this._offscreenCanvas.width !== width || \n this._offscreenCanvas.height !== height) {\n this._offscreenCanvas = document.createElement('canvas');\n this._offscreenCanvas.width = width;\n this._offscreenCanvas.height = height;\n this._offscreenCtx = this._offscreenCanvas.getContext('2d', { willReadFrequently: true });\n }\n return this._offscreenCanvas;\n }\n\n}\n","/**\n * Browser-specific WASM Module Loader\n * Supports ESM format WASM modules (generated with MODULARIZE and EXPORT_ES6)\n * Uses document.currentScript for automatic path detection in UMD builds\n */\n\n/**\n * Gets the base path of the current script\n * Similar to Node.js __dirname\n * Handles various deployment scenarios: same directory, CDN, subdirectories\n * @returns {string} Base path of the current script (with trailing slash)\n */\nexport function getScriptBasePath() {\n let scriptUrl = null;\n \n // Method 1: document.currentScript (most reliable, works in sync execution)\n if (typeof document !== 'undefined' && document.currentScript?.src) {\n scriptUrl = document.currentScript.src;\n }\n \n // Method 2: Traverse script tags (fallback for async scripts)\n if (!scriptUrl && typeof document !== 'undefined') {\n const scripts = document.getElementsByTagName('script');\n // Check from end to start (most recent first)\n for (let i = scripts.length - 1; i >= 0; i--) {\n const src = scripts[i].src;\n if (src && (src.includes('facebetter.js') || src.includes('facebetter'))) {\n scriptUrl = src;\n break;\n }\n }\n }\n \n // Method 3: Try to find script by checking all scripts\n if (!scriptUrl && typeof document !== 'undefined') {\n const scripts = document.getElementsByTagName('script');\n for (let i = scripts.length - 1; i >= 0; i--) {\n const src = scripts[i].src;\n if (src) {\n // Use the last script tag as fallback\n scriptUrl = src;\n break;\n }\n }\n }\n \n // Extract base path from script URL\n if (scriptUrl) {\n try {\n const url = new URL(scriptUrl);\n return url.href.substring(0, url.href.lastIndexOf('/') + 1);\n } catch (e) {\n // If URL parsing fails, use string manipulation\n return scriptUrl.substring(0, scriptUrl.lastIndexOf('/') + 1);\n }\n }\n \n // Method 4: Fallback to current location (least reliable)\n if (typeof location !== 'undefined') {\n try {\n const url = new URL('.', location.href);\n return url.href;\n } catch (e) {\n return location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);\n }\n }\n \n // Last resort\n return './';\n}\n\n/**\n * Resolves a relative path to absolute URL\n * Handles various path formats and edge cases\n * @param {string} relativePath - Relative path (e.g., 'facebetter-core.js')\n * @param {string} basePath - Base path (with trailing slash)\n * @returns {string} Absolute URL\n */\nexport function resolvePath(relativePath, basePath) {\n // If relativePath is already absolute, return as-is\n if (relativePath.startsWith('http://') || relativePath.startsWith('https://') || relativePath.startsWith('//')) {\n return relativePath;\n }\n \n try {\n // Use URL API for proper resolution\n const base = basePath.endsWith('/') ? basePath : basePath + '/';\n return new URL(relativePath, base).href;\n } catch (e) {\n // Fallback: simple concatenation\n const base = basePath.endsWith('/') ? basePath : basePath + '/';\n // Remove leading ./ from relativePath if present\n const cleanPath = relativePath.replace(/^\\.\\//, '');\n return base + cleanPath;\n }\n}\n\nlet wasmModulePromise = null;\nlet wasmModuleInstance = null;\n\n/**\n * Loads the WebAssembly module (browser version)\n * Supports ESM format WASM modules generated by Emscripten with MODULARIZE and EXPORT_ES6\n * With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n * @param {Object} [options] - Options\n * @param {string} [options.wasmUrl] - Custom WASM module URL (defaults to facebetter-core npm package)\n * @param {Function} [options.locateFile] - Custom locateFile function (usually not needed with SINGLE_FILE=1)\n * @returns {Promise<Object>} Promise that resolves with the WASM module\n */\nexport async function loadWasmModule(options = {}) {\n if (wasmModuleInstance) {\n return wasmModuleInstance;\n }\n\n if (wasmModulePromise) {\n return wasmModulePromise;\n }\n\n wasmModulePromise = (async () => {\n try {\n let FaceBetterModuleFactory;\n \n if (options.wasmUrl) {\n // If custom URL is provided, use it (for backward compatibility or custom builds)\n const wasmModule = await import(options.wasmUrl);\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n } else {\n // Try to import from facebetter-core npm package\n // Note: In UMD builds, this may not work if facebetter-core is not available\n // In that case, fallback to relative path detection\n try {\n const wasmModule = await import('facebetter-core');\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n } catch (e) {\n // Fallback: try to find facebetter-core.js relative to current script\n // This handles UMD builds where npm packages may not be available\n const basePath = getScriptBasePath();\n const wasmPath = resolvePath('facebetter-core.js', basePath);\n const wasmModule = await import(wasmPath);\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n }\n }\n \n if (!FaceBetterModuleFactory) {\n throw new Error('WASM module does not export createFaceBetterModule function');\n }\n\n // Configure module options\n // With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n // No need to handle .wasm and .data file paths separately\n const moduleOptions = {\n locateFile: options.locateFile || function(path, prefix) {\n // With SINGLE_FILE=1, Emscripten handles embedded files automatically\n // Custom locateFile is only needed if user provides one\n return prefix + path;\n },\n ...options\n };\n\n // Initialize the module (MODULARIZE returns a Promise)\n wasmModuleInstance = await FaceBetterModuleFactory(moduleOptions);\n \n if (!wasmModuleInstance) {\n throw new Error('Failed to initialize WASM module');\n }\n\n wasmModuleInstance.ready = true;\n return wasmModuleInstance;\n } catch (e) {\n wasmModulePromise = null;\n throw new Error(`Failed to load WASM module: ${e.message}`);\n }\n })();\n\n return wasmModulePromise;\n}\n\n/**\n * Gets the current WASM module instance\n * @returns {Object} WASM module instance\n * @throws {Error} If module is not loaded\n */\nexport function getWasmModule() {\n if (!wasmModuleInstance) {\n throw new Error('WASM module not loaded. Call loadWasmModule() first or use BeautyEffectEngine.init()');\n }\n return wasmModuleInstance;\n}\n\n/**\n * Gets the current WASM memory buffer, handling potential reallocation\n * @returns {ArrayBuffer} Current WASM memory buffer\n */\nexport function getWasmBuffer() {\n const Module = getWasmModule();\n \n if (Module.buffer) {\n return Module.buffer;\n } else if (Module.HEAPU8 && Module.HEAPU8.buffer) {\n return Module.HEAPU8.buffer;\n } else if (Module.asm && Module.asm.memory) {\n return Module.asm.memory.buffer;\n }\n \n throw new Error('Unable to access WASM memory buffer');\n}\n\n","/**\n * Browser-specific Image Utilities\n * Uses DOM APIs (canvas, ImageData, etc.)\n */\n\nimport { FacebetterError } from '../core/errors.js';\n\n/**\n * Converts various image sources to ImageData (browser version)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} source - Image source\n * @param {number} width - Image width (required if source is Uint8ClampedArray)\n * @param {number} height - Image height (required if source is Uint8ClampedArray)\n * @returns {ImageData} ImageData object\n */\nexport function toImageData(source, width, height) {\n if (source instanceof ImageData) {\n return source;\n }\n\n if (source instanceof HTMLCanvasElement || source instanceof HTMLVideoElement) {\n const canvas = source instanceof HTMLCanvasElement ? source : document.createElement('canvas');\n if (source instanceof HTMLVideoElement) {\n canvas.width = source.videoWidth;\n canvas.height = source.videoHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n }\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = source.naturalWidth || source.width;\n canvas.height = source.naturalHeight || source.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof Uint8ClampedArray) {\n if (width === undefined || height === undefined) {\n throw new FacebetterError('Width and height are required when source is Uint8ClampedArray');\n }\n return new ImageData(source, width, height);\n }\n\n throw new FacebetterError('Unsupported image source type');\n}\n\n/**\n * Gets User-Agent string for web platform\n * @returns {string} User-Agent string\n */\nexport function getUserAgentString() {\n return 'FB/1.0 (web; wasm32)';\n}\n\n/**\n * Generates HMAC-SHA256 signature (browser version)\n * @param {string} key - HMAC key (app_key)\n * @param {string} data - Data to sign (timestamp string)\n * @returns {Promise<string>} Promise that resolves with hex-encoded signature\n */\nexport async function generateHMACSignature(key, data) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const messageData = encoder.encode(data);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData);\n\n // Convert to hex string\n const hashArray = Array.from(new Uint8Array(signature));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n}\n\n","/**\n * Browser Entry Point\n * For <script> tag usage (UMD format)\n * Note: WASM module is ESM format, loaded via dynamic import()\n */\n\nimport { BeautyEffectEngine } from '../core/engine.js';\nimport { EngineConfig } from '../core/config.js';\nimport { FacebetterError } from '../core/errors.js';\nimport * as constants from '../core/constants.js';\nimport * as wasmLoader from './wasm-loader.js';\nimport * as imageUtils from './image-utils.js';\n\n// Browser-specific GPU canvas management\nfunction ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n if (document.body) {\n document.body.appendChild(canvas);\n }\n }\n}\n\nfunction cleanupGPUPixelCanvas() {\n // Cleanup is handled by engine instance\n}\n\n// Create platform API\nconst platformAPI = {\n loadWasmModule: () => wasmLoader.loadWasmModule(),\n getWasmModule: wasmLoader.getWasmModule,\n getWasmBuffer: wasmLoader.getWasmBuffer,\n toImageData: imageUtils.toImageData,\n ensureGPUPixelCanvas,\n cleanupGPUPixelCanvas\n};\n\n// Export factory function for UMD\nexport function createBeautyEffectEngine(config) {\n return new BeautyEffectEngine(config, platformAPI);\n}\n\n// Create a wrapped BeautyEffectEngine class that automatically injects platformAPI\n// This allows users to use: new BeautyEffectEngine(config) without passing platformAPI\nclass BrowserBeautyEffectEngine extends BeautyEffectEngine {\n constructor(config) {\n // Automatically inject platformAPI for browser environment\n super(config, platformAPI);\n }\n}\n\n// Export all constants and classes\nexport {\n BrowserBeautyEffectEngine as BeautyEffectEngine,\n EngineConfig,\n FacebetterError\n};\n\n// Export constants with proper names\nexport const BeautyType = constants.BeautyType;\nexport const BasicParam = constants.BasicParam;\nexport const ReshapeParam = constants.ReshapeParam;\nexport const MakeupParam = constants.MakeupParam;\nexport const BackgroundMode = constants.BackgroundMode;\nexport const FrameType = constants.FrameType;\nexport const MirrorMode = constants.MirrorMode;\nexport const VirtualBackgroundOptions = constants.VirtualBackgroundOptions;\n\n// Export WASM loader\nexport { loadWasmModule } from './wasm-loader.js';\n\n// Default export\nexport default {\n BeautyEffectEngine: BrowserBeautyEffectEngine,\n EngineConfig,\n FacebetterError,\n ...constants,\n loadWasmModule: wasmLoader.loadWasmModule\n};\n\n"],"names":["BeautyType","BasicParam","ReshapeParam","MakeupParam","BackgroundMode","FrameType","MirrorMode","wasmLoader.loadWasmModule","wasmLoader.getWasmModule","wasmLoader.getWasmBuffer","imageUtils.toImageData","constants.BeautyType","constants.BasicParam","constants.ReshapeParam","constants.MakeupParam","constants.BackgroundMode","constants.FrameType","constants.MirrorMode","constants.VirtualBackgroundOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"facebetter.js","sources":["../src/core/errors.js","../src/core/config.js","../src/core/constants.js","../src/core/engine.js","../src/browser/wasm-loader.js","../src/browser/image-utils.js","../src/browser/index.js"],"sourcesContent":["/**\n * Facebetter Error Classes\n * Platform-agnostic error handling\n */\n\n/**\n * Facebetter error class\n */\nexport class FacebetterError extends Error {\n constructor(message, code = -1) {\n super(message);\n this.name = 'FacebetterError';\n this.code = code;\n }\n}\n\n/**\n * Checks if a result code indicates success\n * @param {number} result - Result code from WASM function\n * @throws {FacebetterError} If result indicates failure\n */\nexport function checkResult(result, errorMessage = 'Operation failed') {\n if (result !== 0) {\n throw new FacebetterError(`${errorMessage} (error code: ${result})`, result);\n }\n}\n\n","/**\n * Engine Configuration\n * Platform-agnostic configuration class\n */\n\nimport { FacebetterError } from './errors.js';\n\n/**\n * Engine configuration class\n * Similar to EngineConfig struct in C++/Java/OC\n */\nexport class EngineConfig {\n /**\n * Creates a new EngineConfig instance\n * @param {Object} config - Configuration object\n * @param {string} [config.appId] - Application ID (required if licenseJson is not provided)\n * @param {string} [config.appKey] - Application key (required if licenseJson is not provided)\n * @param {string} [config.licenseJson] - License JSON string (optional, if provided, appId and appKey are not required)\n */\n constructor(config = {}) {\n this.appId = config.appId || null;\n this.appKey = config.appKey || null;\n this.licenseJson = config.licenseJson || null;\n this.resourcePath = '/resource.fbd';\n /**\n * Whether to use an external GL context (native platforms only).\n * In Web/WASM environments, this field is kept for configuration structure alignment,\n * but it does not take effect in the current implementation.\n */\n this.externalContext = !!config.externalContext;\n }\n\n /**\n * Validates the configuration\n * @returns {boolean} True if valid\n */\n isValid() {\n // If licenseJson is provided, use it for validation\n if (this.licenseJson) {\n return typeof this.licenseJson === 'string' && this.licenseJson.trim() !== '';\n }\n // Otherwise appId and appKey are required\n return this.appId && typeof this.appId === 'string' && this.appId.trim() !== '' &&\n this.appKey && typeof this.appKey === 'string' && this.appKey.trim() !== '';\n }\n\n /**\n * Returns a string representation of the config\n * @returns {string} String representation\n */\n toString() {\n return `EngineConfig{appId='${this.appId ? this.appId.substring(0, Math.min(this.appId.length, 8)) + '...' : 'null'}', appKey='${this.appKey ? '***' : 'null'}', licenseJson=${this.licenseJson ? 'provided' : 'null'}}`;\n }\n}\n\n","/**\n * Facebetter Constants and Enums\n * Platform-agnostic constants\n */\n\n/**\n * Beauty type enumeration\n */\nexport const BeautyType = {\n Basic: 0, // Basic beauty (smoothing, whitening, etc.)\n Reshape: 1, // Face reshaping (face thinning, big eyes, etc.)\n Makeup: 2, // Makeup effects (lipstick, blush, etc.)\n VirtualBackground: 3, // Virtual background (blur, image replacement)\n ChromaKey: 4, // Chroma key (green screen removal)\n Filter: 5, // LUT based filter\n Sticker: 6 // 2D/3D sticker\n};\n\n/**\n * Basic beauty parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const BasicParam = {\n Smoothing: 0, // Skin smoothing (0.0: none, 1.0: maximum)\n Sharpening: 1, // Image sharpening (0.0: none, 1.0: maximum)\n Whitening: 2, // Skin whitening (0.0: none, 1.0: maximum)\n Rosiness: 3 // Skin rosiness (0.0: none, 1.0: maximum)\n};\n\n/**\n * Face reshape parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const ReshapeParam = {\n FaceThinning: 0, // Face thinning (0.0: none, 1.0: maximum)\n FaceVShape: 1, // V-shape face (0.0: none, 1.0: maximum)\n FaceNarrowing: 2, // Face narrowing (0.0: none, 1.0: maximum)\n FaceShortening: 3,// Face shortening (0.0: none, 1.0: maximum)\n Cheekbone: 4, // Cheekbone slimming (0.0: none, 1.0: maximum)\n Jawbone: 5, // Jawbone slimming (0.0: none, 1.0: maximum)\n Chin: 6, // Chin length adjustment (0.0: none, 1.0: maximum)\n NoseSlimming: 7, // Nose slimming (0.0: none, 1.0: maximum)\n EyeSize: 8, // Eye size (0.0: normal, 1.0: maximum)\n EyeDistance: 9 // Eye distance (0.0: normal, 1.0: maximum)\n};\n\n/**\n * Makeup parameter enumeration\n * All values should be in range [0.0, 1.0]\n */\nexport const MakeupParam = {\n Lipstick: 0, // Lipstick intensity (0.0: none, 1.0: maximum)\n Blush: 1 // Blush intensity (0.0: none, 1.0: maximum)\n};\n\n/**\n * Chroma Key parameter enumeration\n */\nexport const ChromaKeyParam = {\n KeyColor: 0, // Key color (0.0: Green, 1.0: Blue, 2.0: Red)\n Similarity: 1, // Color similarity (0.0 - 1.0)\n Smoothness: 2, // Edge smoothness (0.0 - 1.0)\n Desaturation: 3 // Spill desaturation (0.0 - 1.0)\n};\n\n/**\n * Background mode enumeration\n */\nexport const BackgroundMode = {\n None: 0, // No background processing\n Blur: 1, // Blurred background\n Image: 2 // Background image replacement\n};\n\n/**\n * Frame type enumeration\n */\nexport const FrameType = {\n Image: 0, // Image mode\n Video: 1 // Video mode\n};\n\n/**\n * Mirror mode enumeration (apply to input before processing)\n */\nexport const MirrorMode = {\n None: 0, // No mirror\n Horizontal: 1, // Mirror horizontally (e.g. front camera selfie)\n Vertical: 2, // Mirror vertically\n Both: 3 // Mirror both axes\n};\n\n/**\n * Virtual background options class\n * Matches the C++/Java/OC API design\n */\nexport class VirtualBackgroundOptions {\n /**\n * Creates a new VirtualBackgroundOptions instance\n * @param {Object} [options] - Options object\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n constructor(options = {}) {\n this.mode = options.mode !== undefined ? options.mode : BackgroundMode.None;\n this.backgroundImage = options.backgroundImage || null;\n }\n\n /**\n * Validates the options\n * @returns {boolean} True if valid\n */\n isValid() {\n if (this.mode === BackgroundMode.Image) {\n return this.backgroundImage !== null;\n }\n return true;\n }\n}\n\n","/**\n * Beauty Effect Engine Core\n * Platform-agnostic engine implementation with dependency injection\n */\n\nimport { EngineConfig } from './config.js';\nimport { FacebetterError, checkResult } from './errors.js';\nimport { FrameType, BackgroundMode, MirrorMode } from './constants.js';\n\n/**\n * Beauty effect engine class\n * Provides high-level API for face beauty effects processing\n * Uses dependency injection for platform-specific functionality\n */\nexport class BeautyEffectEngine {\n /**\n * Creates a new BeautyEffectEngine instance\n * @param {EngineConfig|Object} config - EngineConfig object or configuration object\n * @param {Object} platformAPI - Platform-specific API (injected)\n * @param {Function} platformAPI.loadWasmModule - WASM module loader\n * @param {Function} platformAPI.getWasmModule - Get WASM module instance\n * @param {Function} platformAPI.getWasmBuffer - Get WASM memory buffer\n * @param {Function} platformAPI.toImageData - Convert to ImageData\n * @param {Function} platformAPI.verifyAppKeyOnline - Verify app key online\n * @param {Function} [platformAPI.ensureGPUPixelCanvas] - Ensure GPU canvas exists (browser only)\n * @param {Function} [platformAPI.cleanupGPUPixelCanvas] - Cleanup GPU canvas (browser only)\n */\n constructor(config, platformAPI) {\n if (!config) {\n throw new FacebetterError('Config is required. Expected EngineConfig or configuration object');\n }\n\n if (!platformAPI) {\n throw new FacebetterError('Platform API is required');\n }\n\n // If an EngineConfig instance is passed, use it directly; otherwise create a new EngineConfig\n let engineConfig;\n if (config instanceof EngineConfig) {\n engineConfig = config;\n } else if (config && typeof config === 'object') {\n engineConfig = new EngineConfig(config);\n } else {\n throw new FacebetterError('Invalid configuration. Expected EngineConfig or configuration object');\n }\n\n if (!engineConfig.isValid()) {\n throw new FacebetterError('Invalid config: ' + engineConfig.toString());\n }\n\n this.config = engineConfig;\n this.appId = engineConfig.appId;\n this.appKey = engineConfig.appKey;\n this.licenseJson = engineConfig.licenseJson;\n this.resourcePath = '/resource.fbd';\n this.enginePtr = null;\n this.initialized = false;\n this.srcBufferPtr = null;\n this.dstBufferPtr = null;\n this.bufferSize = 0;\n \n // Callback related state\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n \n // Store platform API\n this._platformAPI = platformAPI;\n this._loadWasmModule = platformAPI.loadWasmModule;\n this._getWasmModule = platformAPI.getWasmModule;\n this._getWasmBuffer = platformAPI.getWasmBuffer;\n this._toImageData = platformAPI.toImageData;\n this._ensureGPUPixelCanvas = platformAPI.ensureGPUPixelCanvas;\n this._cleanupGPUPixelCanvas = platformAPI.cleanupGPUPixelCanvas;\n \n // Browser-specific state\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n \n // Automatically create gpupixel_canvas if it doesn't exist (browser only)\n if (this._ensureGPUPixelCanvas) {\n this._ensureGPUPixelCanvas();\n }\n \n // Start loading WASM module immediately in constructor\n this._wasmLoadPromise = this._loadWasmModule();\n this._initPromise = null;\n }\n\n /**\n * Creates a timeout promise\n * @private\n * @param {number} timeout - Timeout in milliseconds\n * @param {string} operation - Operation name for error message\n * @returns {Promise} Promise that rejects after timeout\n */\n _createTimeout(timeout, operation) {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new FacebetterError(\n `${operation} timed out after ${timeout}ms. Please check your network connection or try increasing the timeout.`,\n 'TIMEOUT'\n ));\n }, timeout);\n });\n }\n\n /**\n * Enhances error with context information\n * @private\n * @param {Error} error - Original error\n * @param {string} context - Context information\n * @returns {FacebetterError} Enhanced error\n */\n _enhanceError(error, context) {\n if (error instanceof FacebetterError) {\n return error;\n }\n\n let errorCode = 'UNKNOWN_ERROR';\n let message = error.message || 'Unknown error occurred';\n\n // Categorize errors\n if (error.message?.includes('timeout') || error.message?.includes('TIMEOUT')) {\n errorCode = 'TIMEOUT';\n } else if (error.message?.includes('network') || error.message?.includes('fetch')) {\n errorCode = 'NETWORK_ERROR';\n } else if (error.message?.includes('WASM') || error.message?.includes('wasm')) {\n errorCode = 'WASM_LOAD_ERROR';\n } else if (error.message?.includes('license') || error.message?.includes('auth')) {\n errorCode = 'LICENSE_ERROR';\n }\n\n return new FacebetterError(\n context ? `${context}: ${message}` : message,\n errorCode\n );\n }\n\n /**\n * Initializes the engine\n * @param {Object} [options] - Initialization options\n * @param {number} [options.timeout] - Timeout in milliseconds (default: 30000 for WASM, 10000 for auth)\n * @param {number} [options.authTimeout] - Timeout for online authentication in milliseconds (default: 10000)\n * @returns {Promise<void>} Promise that resolves when initialization is complete\n */\n async init(options = {}) {\n // Concurrency control: if already initialized, return immediately\n if (this.initialized) {\n return;\n }\n\n // Concurrency control: if initialization is in progress, return the same Promise\n if (this._initPromise) {\n return this._initPromise;\n }\n\n // Create initialization Promise\n this._initPromise = (async () => {\n try {\n const wasmTimeout = options.timeout || 30000;\n\n // Wait for WASM module loading (with timeout)\n try {\n await Promise.race([\n this._wasmLoadPromise,\n this._createTimeout(wasmTimeout, 'WASM module loading')\n ]);\n } catch (error) {\n throw this._enhanceError(error, 'Failed to load WASM module');\n }\n\n const Module = this._getWasmModule();\n\n // Setup usage report proxy for WASM\n if (!Module.onReportUsage) {\n Module.onReportUsage = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/report';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n return response.ok;\n } catch (error) {\n return false;\n }\n };\n }\n\n // Setup online auth proxy for WASM\n if (!Module.onOnlineAuth) {\n Module.onOnlineAuth = async (payloadJson) => {\n try {\n const url = 'https://facebetter.pixpark.net/facebetter/v1/auth';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: payloadJson\n });\n if (!response.ok) {\n console.warn('[JS Engine] Online auth fetch failed with status:', response.status);\n return \"\";\n }\n return await response.text();\n } catch (error) {\n console.error('[JS Engine] Online auth fetch exception:', error);\n return \"\";\n }\n };\n }\n\n // Create engine instance, auth (online/offline) is handled by WASM layer via onOnlineAuth\n const enginePtr = Module.ccall(\n 'CreateBeautyEffectEngineEx',\n 'number',\n ['string', 'string', 'string', 'string', 'number'],\n [\n this.resourcePath,\n this.licenseJson || '',\n this.appId || '',\n this.appKey || '',\n this.config.externalContext ? 1 : 0\n ]\n );\n\n if (!enginePtr) {\n throw new FacebetterError(\n 'Failed to create BeautyEffect engine. This may be due to invalid license or resource path issues.',\n 'ENGINE_CREATE_FAILED'\n );\n }\n\n this.enginePtr = enginePtr;\n this.initialized = true;\n this._initPromise = null; // Clear Promise cache, allow re-initialization (if needed)\n } catch (error) {\n this._initPromise = null; // Clear Promise cache, allow retry\n throw error;\n }\n })();\n\n return this._initPromise;\n }\n\n /**\n * Destroys the engine and releases resources\n */\n destroy() {\n if (!this.initialized || !this.enginePtr) {\n return;\n }\n\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n this.srcBufferPtr = null;\n }\n\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n this.dstBufferPtr = null;\n }\n\n // Clean up shared memory\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n\n Module.ccall('DestroyBeautyEffectEngine', null, ['number'], [this.enginePtr]);\n this.enginePtr = null;\n this.initialized = false;\n this.bufferSize = 0;\n this._initPromise = null; // Clear initialization Promise\n \n // Clean up offscreen canvas\n if (this._offscreenCanvas) {\n this._offscreenCanvas = null;\n this._offscreenCtx = null;\n }\n \n // Clean up gpupixel_canvas if we created it\n if (this._cleanupGPUPixelCanvas) {\n this._cleanupGPUPixelCanvas();\n }\n }\n\n /**\n * Sets log configuration\n * Can be called before init() since SetLogConfig is a global function\n * @param {Object} config - Log configuration\n * @param {boolean} config.consoleEnabled - Enable console logging\n * @param {boolean} config.fileEnabled - Enable file logging\n * @param {number} config.level - Log level\n * @param {string} config.fileName - Log file name\n * @returns {Promise<void>} Promise that resolves when log config is set\n */\n async setLogConfig(config) {\n // Wait for WASM module to be loaded (started in constructor)\n await this._wasmLoadPromise;\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetLogConfig',\n 'number',\n ['bool', 'bool', 'number', 'string'],\n [\n config.consoleEnabled || false,\n config.fileEnabled || false,\n config.level || 0,\n config.fileName || ''\n ]\n );\n\n checkResult(result, 'Failed to set log config');\n }\n\n /**\n * [Deprecated] No-op in parameter-driven mode. Use:\n * - setBasicParam/setReshapeParam/setMakeupParam\n * - setVirtualBackground\n * - setFilter/setSticker\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @param {boolean} enabled - Enable or disable\n */\n setBeautyTypeEnabled(beautyType, enabled) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetBeautyTypeEnabled',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, beautyType, enabled ? 1 : 0]\n );\n\n checkResult(result, `Failed to ${enabled ? 'enable' : 'disable'} beauty type`);\n }\n\n /**\n * [Deprecated] Always returns false in parameter-driven mode.\n * Query your own UI state or parameters instead.\n * Kept for compatibility and may be removed in a future release.\n * @deprecated\n * @param {number} beautyType - Beauty type (use BeautyType enum)\n * @returns {boolean} True if enabled\n */\n isBeautyTypeEnabled(beautyType) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'IsBeautyTypeEnabled',\n 'number',\n ['number', 'number'],\n [this.enginePtr, beautyType]\n );\n\n if (result === -1) {\n throw new FacebetterError('Failed to check beauty type status');\n }\n\n return result === 1;\n }\n\n /**\n * [Deprecated] No-op that returns success. To reset, explicitly zero parameters\n * and clear effects via parameter-driven APIs. Kept for compatibility and may\n * be removed in a future release.\n * @deprecated\n */\n disableAllBeautyTypes() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'DisableAllBeautyTypes',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n\n checkResult(result, 'Failed to disable all beauty types');\n }\n\n /**\n * Sets a basic beauty parameter\n * @param {number} param - Parameter (use BasicParam enum, e.g., BasicParam.Smoothing)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setBasicParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamBasic', param, value);\n }\n\n /**\n * Sets a reshape parameter\n * @param {number} param - Parameter (use ReshapeParam enum, e.g., ReshapeParam.FaceThinning)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setReshapeParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamReshape', param, value);\n }\n\n /**\n * Sets a makeup parameter\n * @param {number} param - Parameter (use MakeupParam enum, e.g., MakeupParam.Lipstick)\n * @param {number} value - Parameter value (0.0 - 1.0)\n */\n setMakeupParam(param, value) {\n this._ensureInitialized();\n this._setBeautyParam('SetBeautyParamMakeup', param, value);\n }\n\n /**\n * Sets chroma key parameter\n * @param {number} param - Parameter (use ChromaKeyParam enum, e.g., ChromaKeyParam.Similarity)\n * @param {number} value - Parameter value (KeyColor: 0.0=Green, 1.0=Blue, 2.0=Red; others 0.0-1.0)\n */\n setChromaKeyParam(param, value) {\n this._ensureInitialized();\n // For KeyColor, values are 0, 1, 2, not 0.0-1.0\n if (param === 0) { // ChromaKeyParam.KeyColor\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetBeautyParamChromaKey',\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n checkResult(result, `Failed to set chroma key parameter`);\n return;\n }\n this._setBeautyParam('SetBeautyParamChromaKey', param, value);\n }\n\n /**\n * Sets a LUT-based filter\n * @param {string} filterId - Unique identifier of the filter (e.g., \"chuxin\"). Pass \"\" to clear.\n */\n setFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId || '']\n );\n checkResult(result, 'Failed to set filter');\n }\n\n /**\n * Sets the intensity of the current filter\n * @param {number} intensity - Filter intensity (0.0 - 1.0)\n */\n setFilterIntensity(intensity) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetFilterIntensity',\n 'number',\n ['number', 'number'],\n [this.enginePtr, intensity]\n );\n checkResult(result, 'Failed to set filter intensity');\n }\n\n /**\n * Sets a 2D sticker\n * @param {string} stickerId - Unique identifier of the sticker (e.g., \"樱花\"). Pass \"\" to clear.\n */\n setSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'SetSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId || '']\n );\n checkResult(result, 'Failed to set sticker');\n }\n\n /**\n * Registers a filter from a file path or data\n * @param {string} filterId - Unique identifier for the filter\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerFilter(filterId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterFilterPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, filterId, resource]\n );\n checkResult(result, `Failed to register filter path: ${filterId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterFilterData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, filterId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register filter data: ${filterId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Registers a sticker from a file path or data\n * @param {string} stickerId - Unique identifier for the sticker\n * @param {string|Uint8Array} resource - Path to .fbd file or Uint8Array data\n */\n registerSticker(stickerId, resource) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n if (typeof resource === 'string') {\n const result = Module.ccall(\n 'RegisterStickerPath',\n 'number',\n ['number', 'string', 'string'],\n [this.enginePtr, stickerId, resource]\n );\n checkResult(result, `Failed to register sticker path: ${stickerId}`);\n } else if (resource instanceof Uint8Array) {\n const dataPtr = Module._malloc(resource.length);\n Module.HEAPU8.set(resource, dataPtr);\n try {\n const result = Module.ccall(\n 'RegisterStickerData',\n 'number',\n ['number', 'string', 'number', 'number'],\n [this.enginePtr, stickerId, dataPtr, resource.length]\n );\n checkResult(result, `Failed to register sticker data: ${stickerId}`);\n } finally {\n Module._free(dataPtr);\n }\n } else {\n throw new FacebetterError('Resource must be a string path or Uint8Array data');\n }\n }\n\n /**\n * Unregisters a specific filter\n * @param {string} filterId - Filter ID to unregister\n */\n unregisterFilter(filterId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterFilter',\n 'number',\n ['number', 'string'],\n [this.enginePtr, filterId]\n );\n checkResult(result, `Failed to unregister filter: ${filterId}`);\n }\n\n /**\n * Unregisters all filters\n */\n unregisterAllFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllFilters',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all filters');\n }\n\n /**\n * Unregisters a specific sticker\n * @param {string} stickerId - Sticker ID to unregister\n */\n unregisterSticker(stickerId) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterSticker',\n 'number',\n ['number', 'string'],\n [this.enginePtr, stickerId]\n );\n checkResult(result, `Failed to unregister sticker: ${stickerId}`);\n }\n\n /**\n * Unregisters all stickers\n */\n unregisterAllStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const result = Module.ccall(\n 'UnregisterAllStickers',\n 'number',\n ['number'],\n [this.enginePtr]\n );\n checkResult(result, 'Failed to unregister all stickers');\n }\n \n /**\n * Gets the list of registered filter IDs\n * @returns {string[]} Array of registered filter IDs\n */\n getRegisteredFilters() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredFilters',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered filters JSON:', e);\n return [];\n }\n }\n \n /**\n * Gets the list of registered sticker IDs\n * @returns {string[]} Array of registered sticker IDs\n */\n getRegisteredStickers() {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n const jsonStr = Module.ccall(\n 'GetRegisteredStickers',\n 'string',\n ['number'],\n [this.enginePtr]\n );\n try {\n return JSON.parse(jsonStr || '[]');\n } catch (e) {\n console.error('Failed to parse registered stickers JSON:', e);\n return [];\n }\n }\n \n /**\n * Internal method to set beauty parameters\n * @private\n */\n _setBeautyParam(functionName, param, value) {\n if (value < 0 || value > 1) {\n throw new FacebetterError('Parameter value must be between 0.0 and 1.0');\n }\n\n const Module = this._getWasmModule();\n const result = Module.ccall(\n functionName,\n 'number',\n ['number', 'number', 'number'],\n [this.enginePtr, param, value]\n );\n\n checkResult(result, `Failed to set beauty parameter`);\n }\n\n /**\n * Sets engine callbacks (face landmarks detection)\n * @param {Object} callbacks - Callback functions\n * @param {Function} callbacks.onFaceLandmarks - Callback for face landmarks detection\n * @param {number} [callbacks.maxFaces=10] - Maximum number of faces to support (affects shared buffer size)\n */\n setCallbacks(callbacks) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Initialize callback storage (if it doesn't exist)\n if (!Module._face_landmarks_callbacks) {\n Module._face_landmarks_callbacks = [];\n }\n \n let callbackId = 0;\n let sharedBufferPtr = null;\n let sharedBufferSize = 0;\n \n if (callbacks && callbacks.onFaceLandmarks) {\n // Get max faces (default 10)\n const maxFaces = callbacks.maxFaces || 10;\n \n // Pre-allocate shared memory\n // Metadata: 2 ints (frame_number, face_count) = 8 bytes\n // Face data: maxFaces * 343 floats * 4 bytes = maxFaces * 1372 bytes\n const metadataSize = 2 * 4; // 2 ints\n const faceDataSize = maxFaces * 343 * 4; // 343 floats per face\n sharedBufferSize = metadataSize + faceDataSize;\n sharedBufferPtr = Module._malloc(sharedBufferSize);\n \n if (!sharedBufferPtr) {\n throw new FacebetterError('Failed to allocate shared buffer for callbacks');\n }\n \n // Register callback function (internal wrapper, reads data from shared memory)\n // Push first, then get index as callbackId (allows callbackId to be 0)\n Module._face_landmarks_callbacks.push(\n (frameNumber, faceCount, dataPtr) => {\n // Read data from shared memory (zero-copy)\n const heap = Module.HEAPF32;\n const dataOffset = dataPtr / 4; // float is 4 bytes\n \n const results = [];\n const FLOATS_PER_FACE = 343;\n \n for (let i = 0; i < faceCount; i++) {\n const faceOffset = dataOffset + i * FLOATS_PER_FACE;\n let offset = faceOffset;\n \n // Read rect\n const rect = {\n x: heap[offset++],\n y: heap[offset++],\n width: heap[offset++],\n height: heap[offset++]\n };\n \n // Read basic fields\n const faceId = Math.round(heap[offset++]);\n const faceAction = Math.round(heap[offset++]);\n const score = heap[offset++];\n const pitch = heap[offset++];\n const roll = heap[offset++];\n const yaw = heap[offset++];\n \n // Read key_points (111 points)\n const keyPoints = [];\n for (let j = 0; j < 111; j++) {\n keyPoints.push({\n x: heap[offset++],\n y: heap[offset++]\n });\n }\n \n // Read visibility (111 points)\n const visibility = [];\n for (let j = 0; j < 111; j++) {\n visibility.push(heap[offset++]);\n }\n \n results.push({\n rect,\n key_points: keyPoints,\n visibility,\n face_id: faceId,\n face_action: faceAction,\n score,\n pitch,\n roll,\n yaw\n });\n }\n \n // Call user callback\n callbacks.onFaceLandmarks(results);\n }\n );\n \n // Get callback ID (index after push, can be 0)\n callbackId = Module._face_landmarks_callbacks.length - 1;\n }\n \n // Call C API\n const result = Module.ccall(\n 'SetCallbacks',\n 'number',\n ['number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n callbackId,\n sharedBufferPtr || 0,\n sharedBufferSize\n ]\n );\n \n checkResult(result, 'Failed to set callbacks');\n \n // Clean up old shared memory (if it exists)\n if (this._callbackSharedBufferPtr) {\n Module._free(this._callbackSharedBufferPtr);\n }\n \n // Store new shared memory pointer for cleanup\n if (sharedBufferPtr) {\n this._callbackSharedBufferPtr = sharedBufferPtr;\n this._callbackSharedBufferSize = sharedBufferSize;\n } else {\n this._callbackSharedBufferPtr = null;\n this._callbackSharedBufferSize = 0;\n }\n }\n\n /**\n * Sets virtual background options (unified API, matches C++/Java/OC)\n * @param {VirtualBackgroundOptions|Object} options - Virtual background options\n * @param {number} [options.mode] - Background mode (use BackgroundMode enum)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [options.backgroundImage] - Background image (required when mode is Image)\n */\n setVirtualBackground(options) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n \n // Support both VirtualBackgroundOptions object and plain object\n const opts = options.mode !== undefined ? options : { mode: BackgroundMode.None, backgroundImage: null };\n \n let imageData = null;\n let imageBufferPtr = null;\n \n try {\n // If a background image is provided, convert to ImageData and prepare buffer\n if (opts.backgroundImage) {\n imageData = this._toImageData(opts.backgroundImage);\n const bufferSize = imageData.width * imageData.height * 4;\n imageBufferPtr = Module._malloc(bufferSize);\n \n const buffer = this._getWasmBuffer();\n const view = new Uint8Array(buffer, imageBufferPtr, bufferSize);\n view.set(imageData.data);\n }\n \n // Use unified SetVirtualBackground C interface (consistent with other platforms)\n const result = Module.ccall(\n 'SetVirtualBackground',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n opts.mode,\n imageBufferPtr || 0, // If null, pass 0\n imageData ? imageData.width : 0,\n imageData ? imageData.height : 0,\n imageData ? imageData.width * 4 : 0\n ]\n );\n \n checkResult(result, 'Failed to set virtual background');\n } finally {\n // Free memory\n if (imageBufferPtr) {\n Module._free(imageBufferPtr);\n }\n }\n }\n\n /**\n * Sets whether to apply beauty effects only on skin regions.\n * When enabled, beauty effects will only be applied to detected skin areas.\n * @param {boolean} enabled - True to enable skin-only beauty, false to apply to entire image.\n */\n setSkinOnlyBeauty(enabled) {\n this._ensureInitialized();\n const Module = this._getWasmModule();\n\n const result = Module.ccall(\n 'SetSkinOnlyBeauty',\n 'number',\n ['number', 'number'],\n [this.enginePtr, enabled ? 1 : 0]\n );\n\n checkResult(result, 'Failed to set skin only beauty');\n }\n\n\n /**\n * Ensures buffers are allocated for the given dimensions\n * @private\n */\n _ensureBuffers(width, height) {\n const requiredSize = width * height * 4;\n\n if (this.bufferSize < requiredSize) {\n const Module = this._getWasmModule();\n\n if (this.srcBufferPtr) {\n Module._free(this.srcBufferPtr);\n }\n if (this.dstBufferPtr) {\n Module._free(this.dstBufferPtr);\n }\n\n this.srcBufferPtr = Module._malloc(requiredSize);\n this.dstBufferPtr = Module._malloc(requiredSize);\n this.bufferSize = requiredSize;\n\n if (!this.srcBufferPtr || !this.dstBufferPtr) {\n throw new FacebetterError('Failed to allocate memory buffers');\n }\n }\n }\n\n /**\n * Processes an image\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} input - Input image\n * @param {number} width - Image width (required if input is Uint8ClampedArray)\n * @param {number} height - Image height (required if input is Uint8ClampedArray)\n * @param {number} frameType - Frame type (use FrameType enum, default: FrameType.Video)\n * @param {number} mirrorMode - Mirror mode applied to input before processing (MirrorMode enum, default: MirrorMode.None)\n * @returns {ImageData} Processed image data\n */\n processImage(input, width, height, frameType = FrameType.Video, mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n const imageData = this._platformAPI.toImageData(input, width, height);\n const Module = this._getWasmModule();\n\n this._ensureBuffers(imageData.width, imageData.height);\n\n const bufferSize = imageData.width * imageData.height * 4;\n\n try {\n const buffer = this._getWasmBuffer();\n \n const srcView = new Uint8Array(buffer, this.srcBufferPtr, bufferSize);\n srcView.set(imageData.data);\n\n const result = Module.ccall(\n 'ProcessImageRGBA',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n this.srcBufferPtr,\n imageData.width,\n imageData.height,\n imageData.width * 4,\n this.dstBufferPtr,\n frameType,\n mirrorMode\n ]\n );\n\n checkResult(result, 'Failed to process image');\n\n const currentBuffer = this._getWasmBuffer();\n const dstView = new Uint8Array(currentBuffer, this.dstBufferPtr, bufferSize);\n const processedData = new Uint8ClampedArray(dstView);\n\n return new ImageData(processedData, imageData.width, imageData.height);\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Image processing error: ${error.message}`);\n }\n }\n\n /**\n * Processes an external GPU texture.\n *\n * Note:\n * - This interface is mainly used for integration with internal WASM or advanced scenarios.\n * - textureHandle must be a texture handle (uint32) compatible with the OpenGL/WebGL context used by WASM.\n * - For common web scenarios, it is recommended to use processImage with ImageData/Canvas etc.\n *\n * @param {number} textureHandle - External texture handle (GL_TEXTURE_2D)\n * @param {number} width - Texture width\n * @param {number} height - Texture height\n * @param {number} stride - Row stride (usually width * 4)\n * @param {number} [frameType] - Frame type (FrameType.Image / FrameType.Video)\n * @param {number} [mirrorMode] - Mirror mode (MirrorMode enum; texture path does not support mirror, param reserved)\n * @returns {number} Processed texture handle (GL_TEXTURE_2D, uint32)\n */\n processTexture(textureHandle,\n width,\n height,\n stride,\n frameType = FrameType.Video,\n mirrorMode = MirrorMode.None) {\n this._ensureInitialized();\n if (!textureHandle || width <= 0 || height <= 0 || stride <= 0) {\n throw new FacebetterError('Invalid textureHandle or dimensions for processTexture');\n }\n\n const Module = this._getWasmModule();\n\n try {\n const result = Module.ccall(\n 'ProcessImageTexture',\n 'number',\n ['number', 'number', 'number', 'number', 'number', 'number', 'number'],\n [\n this.enginePtr,\n textureHandle,\n width,\n height,\n stride,\n frameType,\n mirrorMode\n ]\n );\n\n if (!result || result === 0) {\n throw new FacebetterError('Failed to process external texture or got invalid output texture');\n }\n\n // Return processed texture handle for caller to continue using in same GL context\n return result;\n } catch (error) {\n if (error instanceof FacebetterError) {\n throw error;\n }\n throw new FacebetterError(`Texture processing error: ${error.message}`);\n }\n }\n\n /**\n * Ensures the engine is initialized\n * @private\n * @throws {FacebetterError} If engine is not initialized\n */\n _ensureInitialized() {\n if (!this.initialized || !this.enginePtr) {\n throw new FacebetterError('Engine not initialized. Call init() first.');\n }\n }\n\n /**\n * Ensures gpupixel_canvas exists in the DOM (browser only)\n * This canvas is required by GPUPixel for WebGL context creation\n * @private\n */\n _ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n document.body.appendChild(canvas);\n this._createdGPUPixelCanvas = true;\n }\n this._gpupixelCanvas = canvas;\n }\n\n /**\n * Cleans up gpupixel_canvas if it was created by this engine instance (browser only)\n * @private\n */\n _cleanupGPUPixelCanvas() {\n if (this._createdGPUPixelCanvas && this._gpupixelCanvas) {\n this._gpupixelCanvas.remove();\n this._gpupixelCanvas = null;\n this._createdGPUPixelCanvas = false;\n }\n }\n\n /**\n * Ensures offscreen canvas exists and matches the required dimensions (browser only)\n * This canvas is reused for video processing to avoid creating temporary canvases\n * @private\n * @param {number} width - Required canvas width\n * @param {number} height - Required canvas height\n */\n _ensureOffscreenCanvas(width, height) {\n if (typeof document === 'undefined') {\n return null;\n }\n \n if (!this._offscreenCanvas || \n this._offscreenCanvas.width !== width || \n this._offscreenCanvas.height !== height) {\n this._offscreenCanvas = document.createElement('canvas');\n this._offscreenCanvas.width = width;\n this._offscreenCanvas.height = height;\n this._offscreenCtx = this._offscreenCanvas.getContext('2d', { willReadFrequently: true });\n }\n return this._offscreenCanvas;\n }\n\n}\n","/**\n * Browser-specific WASM Module Loader\n * Supports ESM format WASM modules (generated with MODULARIZE and EXPORT_ES6)\n * Uses document.currentScript for automatic path detection in UMD builds\n */\n\n/**\n * Gets the base path of the current script\n * Similar to Node.js __dirname\n * Handles various deployment scenarios: same directory, CDN, subdirectories\n * @returns {string} Base path of the current script (with trailing slash)\n */\nexport function getScriptBasePath() {\n let scriptUrl = null;\n \n // Method 1: document.currentScript (most reliable, works in sync execution)\n if (typeof document !== 'undefined' && document.currentScript?.src) {\n scriptUrl = document.currentScript.src;\n }\n \n // Method 2: Traverse script tags (fallback for async scripts)\n if (!scriptUrl && typeof document !== 'undefined') {\n const scripts = document.getElementsByTagName('script');\n // Check from end to start (most recent first)\n for (let i = scripts.length - 1; i >= 0; i--) {\n const src = scripts[i].src;\n if (src && (src.includes('facebetter.js') || src.includes('facebetter'))) {\n scriptUrl = src;\n break;\n }\n }\n }\n \n // Method 3: Try to find script by checking all scripts\n if (!scriptUrl && typeof document !== 'undefined') {\n const scripts = document.getElementsByTagName('script');\n for (let i = scripts.length - 1; i >= 0; i--) {\n const src = scripts[i].src;\n if (src) {\n // Use the last script tag as fallback\n scriptUrl = src;\n break;\n }\n }\n }\n \n // Extract base path from script URL\n if (scriptUrl) {\n try {\n const url = new URL(scriptUrl);\n return url.href.substring(0, url.href.lastIndexOf('/') + 1);\n } catch (e) {\n // If URL parsing fails, use string manipulation\n return scriptUrl.substring(0, scriptUrl.lastIndexOf('/') + 1);\n }\n }\n \n // Method 4: Fallback to current location (least reliable)\n if (typeof location !== 'undefined') {\n try {\n const url = new URL('.', location.href);\n return url.href;\n } catch (e) {\n return location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);\n }\n }\n \n // Last resort\n return './';\n}\n\n/**\n * Resolves a relative path to absolute URL\n * Handles various path formats and edge cases\n * @param {string} relativePath - Relative path (e.g., 'facebetter-core.js')\n * @param {string} basePath - Base path (with trailing slash)\n * @returns {string} Absolute URL\n */\nexport function resolvePath(relativePath, basePath) {\n // If relativePath is already absolute, return as-is\n if (relativePath.startsWith('http://') || relativePath.startsWith('https://') || relativePath.startsWith('//')) {\n return relativePath;\n }\n \n try {\n // Use URL API for proper resolution\n const base = basePath.endsWith('/') ? basePath : basePath + '/';\n return new URL(relativePath, base).href;\n } catch (e) {\n // Fallback: simple concatenation\n const base = basePath.endsWith('/') ? basePath : basePath + '/';\n // Remove leading ./ from relativePath if present\n const cleanPath = relativePath.replace(/^\\.\\//, '');\n return base + cleanPath;\n }\n}\n\nlet wasmModulePromise = null;\nlet wasmModuleInstance = null;\n\n/**\n * Loads the WebAssembly module (browser version)\n * Supports ESM format WASM modules generated by Emscripten with MODULARIZE and EXPORT_ES6\n * With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n * @param {Object} [options] - Options\n * @param {string} [options.wasmUrl] - Custom WASM module URL (defaults to facebetter-core npm package)\n * @param {Function} [options.locateFile] - Custom locateFile function (usually not needed with SINGLE_FILE=1)\n * @returns {Promise<Object>} Promise that resolves with the WASM module\n */\nexport async function loadWasmModule(options = {}) {\n if (wasmModuleInstance) {\n return wasmModuleInstance;\n }\n\n if (wasmModulePromise) {\n return wasmModulePromise;\n }\n\n wasmModulePromise = (async () => {\n try {\n let FaceBetterModuleFactory;\n \n if (options.wasmUrl) {\n // If custom URL is provided, use it (for backward compatibility or custom builds)\n const wasmModule = await import(options.wasmUrl);\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n } else {\n // Try to import from facebetter-core npm package\n // Note: In UMD builds, this may not work if facebetter-core is not available\n // In that case, fallback to relative path detection\n try {\n const wasmModule = await import('facebetter-core');\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n } catch (e) {\n // Fallback: try to find facebetter-core.js relative to current script\n // This handles UMD builds where npm packages may not be available\n const basePath = getScriptBasePath();\n const wasmPath = resolvePath('facebetter-core.js', basePath);\n const wasmModule = await import(wasmPath);\n FaceBetterModuleFactory = wasmModule.default || wasmModule.createFaceBetterModule;\n }\n }\n \n if (!FaceBetterModuleFactory) {\n throw new Error('WASM module does not export createFaceBetterModule function');\n }\n\n // Configure module options\n // With SINGLE_FILE=1, WASM binary and data files are embedded in the JS file\n // No need to handle .wasm and .data file paths separately\n const moduleOptions = {\n locateFile: options.locateFile || function(path, prefix) {\n // With SINGLE_FILE=1, Emscripten handles embedded files automatically\n // Custom locateFile is only needed if user provides one\n return prefix + path;\n },\n ...options\n };\n\n // Initialize the module (MODULARIZE returns a Promise)\n wasmModuleInstance = await FaceBetterModuleFactory(moduleOptions);\n \n if (!wasmModuleInstance) {\n throw new Error('Failed to initialize WASM module');\n }\n\n wasmModuleInstance.ready = true;\n return wasmModuleInstance;\n } catch (e) {\n wasmModulePromise = null;\n throw new Error(`Failed to load WASM module: ${e.message}`);\n }\n })();\n\n return wasmModulePromise;\n}\n\n/**\n * Gets the current WASM module instance\n * @returns {Object} WASM module instance\n * @throws {Error} If module is not loaded\n */\nexport function getWasmModule() {\n if (!wasmModuleInstance) {\n throw new Error('WASM module not loaded. Call loadWasmModule() first or use BeautyEffectEngine.init()');\n }\n return wasmModuleInstance;\n}\n\n/**\n * Gets the current WASM memory buffer, handling potential reallocation\n * @returns {ArrayBuffer} Current WASM memory buffer\n */\nexport function getWasmBuffer() {\n const Module = getWasmModule();\n \n if (Module.buffer) {\n return Module.buffer;\n } else if (Module.HEAPU8 && Module.HEAPU8.buffer) {\n return Module.HEAPU8.buffer;\n } else if (Module.asm && Module.asm.memory) {\n return Module.asm.memory.buffer;\n }\n \n throw new Error('Unable to access WASM memory buffer');\n}\n\n","/**\n * Browser-specific Image Utilities\n * Uses DOM APIs (canvas, ImageData, etc.)\n */\n\nimport { FacebetterError } from '../core/errors.js';\n\n/**\n * Converts various image sources to ImageData (browser version)\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|Uint8ClampedArray} source - Image source\n * @param {number} width - Image width (required if source is Uint8ClampedArray)\n * @param {number} height - Image height (required if source is Uint8ClampedArray)\n * @returns {ImageData} ImageData object\n */\nexport function toImageData(source, width, height) {\n if (source instanceof ImageData) {\n return source;\n }\n\n if (source instanceof HTMLCanvasElement || source instanceof HTMLVideoElement) {\n const canvas = source instanceof HTMLCanvasElement ? source : document.createElement('canvas');\n if (source instanceof HTMLVideoElement) {\n canvas.width = source.videoWidth;\n canvas.height = source.videoHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n }\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = source.naturalWidth || source.width;\n canvas.height = source.naturalHeight || source.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(source, 0, 0);\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n if (source instanceof Uint8ClampedArray) {\n if (width === undefined || height === undefined) {\n throw new FacebetterError('Width and height are required when source is Uint8ClampedArray');\n }\n return new ImageData(source, width, height);\n }\n\n throw new FacebetterError('Unsupported image source type');\n}\n\n/**\n * Gets User-Agent string for web platform\n * @returns {string} User-Agent string\n */\nexport function getUserAgentString() {\n return 'FB/1.0 (web; wasm32)';\n}\n\n/**\n * Generates HMAC-SHA256 signature (browser version)\n * @param {string} key - HMAC key (app_key)\n * @param {string} data - Data to sign (timestamp string)\n * @returns {Promise<string>} Promise that resolves with hex-encoded signature\n */\nexport async function generateHMACSignature(key, data) {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(key);\n const messageData = encoder.encode(data);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData);\n\n // Convert to hex string\n const hashArray = Array.from(new Uint8Array(signature));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hashHex;\n}\n\n","/**\n * Browser Entry Point\n * For <script> tag usage (UMD format)\n * Note: WASM module is ESM format, loaded via dynamic import()\n */\n\nimport { BeautyEffectEngine } from '../core/engine.js';\nimport { EngineConfig } from '../core/config.js';\nimport { FacebetterError } from '../core/errors.js';\nimport * as constants from '../core/constants.js';\nimport * as wasmLoader from './wasm-loader.js';\nimport * as imageUtils from './image-utils.js';\n\n// Browser-specific GPU canvas management\nfunction ensureGPUPixelCanvas() {\n if (typeof document === 'undefined') {\n return;\n }\n \n let canvas = document.getElementById('gpupixel_canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'gpupixel_canvas';\n canvas.style.display = 'none';\n canvas.width = 1;\n canvas.height = 1;\n if (document.body) {\n document.body.appendChild(canvas);\n }\n }\n}\n\nfunction cleanupGPUPixelCanvas() {\n // Cleanup is handled by engine instance\n}\n\n// Create platform API\nconst platformAPI = {\n loadWasmModule: () => wasmLoader.loadWasmModule(),\n getWasmModule: wasmLoader.getWasmModule,\n getWasmBuffer: wasmLoader.getWasmBuffer,\n toImageData: imageUtils.toImageData,\n ensureGPUPixelCanvas,\n cleanupGPUPixelCanvas\n};\n\n// Export factory function for UMD\nexport function createBeautyEffectEngine(config) {\n return new BeautyEffectEngine(config, platformAPI);\n}\n\n// Create a wrapped BeautyEffectEngine class that automatically injects platformAPI\n// This allows users to use: new BeautyEffectEngine(config) without passing platformAPI\nclass BrowserBeautyEffectEngine extends BeautyEffectEngine {\n constructor(config) {\n // Automatically inject platformAPI for browser environment\n super(config, platformAPI);\n }\n}\n\n// Export all constants and classes\nexport {\n BrowserBeautyEffectEngine as BeautyEffectEngine,\n EngineConfig,\n FacebetterError\n};\n\n// Export constants with proper names\nexport const BeautyType = constants.BeautyType;\nexport const BasicParam = constants.BasicParam;\nexport const ReshapeParam = constants.ReshapeParam;\nexport const MakeupParam = constants.MakeupParam;\nexport const BackgroundMode = constants.BackgroundMode;\nexport const FrameType = constants.FrameType;\nexport const MirrorMode = constants.MirrorMode;\nexport const VirtualBackgroundOptions = constants.VirtualBackgroundOptions;\n\n// Export WASM loader\nexport { loadWasmModule } from './wasm-loader.js';\n\n// Default export\nexport default {\n BeautyEffectEngine: BrowserBeautyEffectEngine,\n EngineConfig,\n FacebetterError,\n ...constants,\n loadWasmModule: wasmLoader.loadWasmModule\n};\n\n"],"names":["BeautyType","BasicParam","ReshapeParam","MakeupParam","BackgroundMode","FrameType","MirrorMode","wasmLoader.loadWasmModule","wasmLoader.getWasmModule","wasmLoader.getWasmBuffer","imageUtils.toImageData","constants.BeautyType","constants.BasicParam","constants.ReshapeParam","constants.MakeupParam","constants.BackgroundMode","constants.FrameType","constants.MirrorMode","constants.VirtualBackgroundOptions"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "facebetter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Face beauty effects SDK with WebAssembly support",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -46,6 +46,6 @@
|
|
|
46
46
|
"rollup": "^3.0.0"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"facebetter-core": "^1.
|
|
49
|
+
"facebetter-core": "^1.4.0"
|
|
50
50
|
}
|
|
51
51
|
}
|