ltmarx / web /src /workers /watermark.worker.ts
harelcain's picture
Upload 37 files
f2f99a3 verified
/**
* 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),
});
}
};