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),
    });
  }
};