Spaces:
Running
Running
File size: 1,539 Bytes
f2f99a3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /**
* 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),
});
}
};
|