/** * 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; } | { type: 'detect'; id: number; yPlane: Uint8Array; width: number; height: number; key: string; preset: PresetName; customConfig?: Partial; }; self.onmessage = (e: MessageEvent) => { 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), }); } };