Spaces:
Running
Running
| /** | |
| * Web Worker for non-blocking watermark embedding/detection | |
| */ | |
| import { embedWatermark } from '@core/embedder.js'; | |
| import { detectWatermark } from '@core/detector.js'; | |
| import { getPreset } from '@core/presets.js'; | |
| import type { PresetName, WatermarkConfig } from '@core/types.js'; | |
| export type WorkerMessage = | |
| | { | |
| type: 'embed'; | |
| id: number; | |
| yPlane: Uint8Array; | |
| width: number; | |
| height: number; | |
| payload: Uint8Array; | |
| key: string; | |
| preset: PresetName; | |
| customConfig?: Partial<WatermarkConfig>; | |
| } | |
| | { | |
| type: 'detect'; | |
| id: number; | |
| yPlane: Uint8Array; | |
| width: number; | |
| height: number; | |
| key: string; | |
| preset: PresetName; | |
| customConfig?: Partial<WatermarkConfig>; | |
| }; | |
| self.onmessage = (e: MessageEvent<WorkerMessage>) => { | |
| const msg = e.data; | |
| try { | |
| const config = getPreset(msg.preset); | |
| if (msg.type === 'embed') { | |
| const result = embedWatermark(msg.yPlane, msg.width, msg.height, msg.payload, msg.key, config); | |
| self.postMessage({ | |
| type: 'embed-result', | |
| id: msg.id, | |
| yPlane: result.yPlane, | |
| psnr: result.psnr, | |
| }); | |
| } else if (msg.type === 'detect') { | |
| const result = detectWatermark(msg.yPlane, msg.width, msg.height, msg.key, config); | |
| self.postMessage({ | |
| type: 'detect-result', | |
| id: msg.id, | |
| ...result, | |
| }); | |
| } | |
| } catch (err) { | |
| self.postMessage({ | |
| type: 'error', | |
| id: msg.id, | |
| error: String(err), | |
| }); | |
| } | |
| }; | |