@image-marker/web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +100 -0
  3. package/api-contract.json +224 -0
  4. package/lib/commonjs/core/batch.d.ts +32 -0
  5. package/lib/commonjs/core/batch.js +85 -0
  6. package/lib/commonjs/core/content-credentials.d.ts +53 -0
  7. package/lib/commonjs/core/content-credentials.js +96 -0
  8. package/lib/commonjs/core/image-info.d.ts +30 -0
  9. package/lib/commonjs/core/image-info.js +348 -0
  10. package/lib/commonjs/core/index.d.ts +1014 -0
  11. package/lib/commonjs/core/index.js +92 -0
  12. package/lib/commonjs/core/invisible-watermark.d.ts +102 -0
  13. package/lib/commonjs/core/invisible-watermark.js +913 -0
  14. package/lib/commonjs/core/job.d.ts +57 -0
  15. package/lib/commonjs/core/job.js +151 -0
  16. package/lib/commonjs/core/layout.d.ts +19 -0
  17. package/lib/commonjs/core/layout.js +75 -0
  18. package/lib/commonjs/core/marker.d.ts +1 -0
  19. package/lib/commonjs/core/marker.js +11 -0
  20. package/lib/commonjs/core/recipe.d.ts +44 -0
  21. package/lib/commonjs/core/recipe.js +175 -0
  22. package/lib/commonjs/core/result.d.ts +34 -0
  23. package/lib/commonjs/core/result.js +41 -0
  24. package/lib/commonjs/core/trace-runtime.d.ts +43 -0
  25. package/lib/commonjs/core/trace-runtime.js +92 -0
  26. package/lib/commonjs/core/validate.d.ts +4 -0
  27. package/lib/commonjs/core/validate.js +192 -0
  28. package/lib/commonjs/core/web/browser.d.ts +105 -0
  29. package/lib/commonjs/core/web/browser.js +434 -0
  30. package/lib/commonjs/core/web/helpers.d.ts +41 -0
  31. package/lib/commonjs/core/web/helpers.js +264 -0
  32. package/lib/commonjs/core/web/index.d.ts +59 -0
  33. package/lib/commonjs/core/web/index.js +724 -0
  34. package/lib/commonjs/core/web/invisible-worker-client.d.ts +13 -0
  35. package/lib/commonjs/core/web/invisible-worker-client.js +140 -0
  36. package/lib/commonjs/core/web/renderer.d.ts +20 -0
  37. package/lib/commonjs/core/web/renderer.js +665 -0
  38. package/lib/commonjs/core/web/runtime.d.ts +106 -0
  39. package/lib/commonjs/core/web/runtime.js +2 -0
  40. package/lib/commonjs/editor/adapter.d.ts +26 -0
  41. package/lib/commonjs/editor/adapter.js +102 -0
  42. package/lib/commonjs/editor/controller.d.ts +106 -0
  43. package/lib/commonjs/editor/controller.js +919 -0
  44. package/lib/commonjs/editor/core-contract.d.ts +2 -0
  45. package/lib/commonjs/editor/core-contract.js +23 -0
  46. package/lib/commonjs/editor/geometry.d.ts +8 -0
  47. package/lib/commonjs/editor/geometry.js +109 -0
  48. package/lib/commonjs/editor/headless.d.ts +5 -0
  49. package/lib/commonjs/editor/headless.js +22 -0
  50. package/lib/commonjs/editor/presets.d.ts +19 -0
  51. package/lib/commonjs/editor/presets.js +64 -0
  52. package/lib/commonjs/editor/projection.d.ts +12 -0
  53. package/lib/commonjs/editor/projection.js +195 -0
  54. package/lib/commonjs/editor/types.d.ts +166 -0
  55. package/lib/commonjs/editor/types.js +2 -0
  56. package/lib/commonjs/editor-adapter.d.ts +7 -0
  57. package/lib/commonjs/editor-adapter.js +17 -0
  58. package/lib/commonjs/headless.d.ts +2 -0
  59. package/lib/commonjs/headless.js +26 -0
  60. package/lib/commonjs/index.d.ts +5 -0
  61. package/lib/commonjs/index.js +27 -0
  62. package/lib/commonjs/package.json +1 -0
  63. package/lib/module/core/batch.d.ts +32 -0
  64. package/lib/module/core/batch.js +82 -0
  65. package/lib/module/core/content-credentials.d.ts +53 -0
  66. package/lib/module/core/content-credentials.js +92 -0
  67. package/lib/module/core/image-info.d.ts +30 -0
  68. package/lib/module/core/image-info.js +343 -0
  69. package/lib/module/core/index.d.ts +1014 -0
  70. package/lib/module/core/index.js +56 -0
  71. package/lib/module/core/invisible-watermark.d.ts +102 -0
  72. package/lib/module/core/invisible-watermark.js +897 -0
  73. package/lib/module/core/job.d.ts +57 -0
  74. package/lib/module/core/job.js +143 -0
  75. package/lib/module/core/layout.d.ts +19 -0
  76. package/lib/module/core/layout.js +70 -0
  77. package/lib/module/core/marker.d.ts +1 -0
  78. package/lib/module/core/marker.js +4 -0
  79. package/lib/module/core/recipe.d.ts +44 -0
  80. package/lib/module/core/recipe.js +169 -0
  81. package/lib/module/core/result.d.ts +34 -0
  82. package/lib/module/core/result.js +38 -0
  83. package/lib/module/core/trace-runtime.d.ts +43 -0
  84. package/lib/module/core/trace-runtime.js +89 -0
  85. package/lib/module/core/validate.d.ts +4 -0
  86. package/lib/module/core/validate.js +187 -0
  87. package/lib/module/core/web/browser.d.ts +105 -0
  88. package/lib/module/core/web/browser.js +427 -0
  89. package/lib/module/core/web/helpers.d.ts +41 -0
  90. package/lib/module/core/web/helpers.js +251 -0
  91. package/lib/module/core/web/index.d.ts +59 -0
  92. package/lib/module/core/web/index.js +709 -0
  93. package/lib/module/core/web/invisible-worker-client.d.ts +13 -0
  94. package/lib/module/core/web/invisible-worker-client.js +137 -0
  95. package/lib/module/core/web/renderer.d.ts +20 -0
  96. package/lib/module/core/web/renderer.js +661 -0
  97. package/lib/module/core/web/runtime.d.ts +106 -0
  98. package/lib/module/core/web/runtime.js +1 -0
  99. package/lib/module/editor/adapter.d.ts +26 -0
  100. package/lib/module/editor/adapter.js +99 -0
  101. package/lib/module/editor/controller.d.ts +106 -0
  102. package/lib/module/editor/controller.js +915 -0
  103. package/lib/module/editor/core-contract.d.ts +2 -0
  104. package/lib/module/editor/core-contract.js +2 -0
  105. package/lib/module/editor/geometry.d.ts +8 -0
  106. package/lib/module/editor/geometry.js +103 -0
  107. package/lib/module/editor/headless.d.ts +5 -0
  108. package/lib/module/editor/headless.js +4 -0
  109. package/lib/module/editor/presets.d.ts +19 -0
  110. package/lib/module/editor/presets.js +57 -0
  111. package/lib/module/editor/projection.d.ts +12 -0
  112. package/lib/module/editor/projection.js +188 -0
  113. package/lib/module/editor/types.d.ts +166 -0
  114. package/lib/module/editor/types.js +1 -0
  115. package/lib/module/editor-adapter.d.ts +7 -0
  116. package/lib/module/editor-adapter.js +10 -0
  117. package/lib/module/headless.d.ts +2 -0
  118. package/lib/module/headless.js +2 -0
  119. package/lib/module/index.d.ts +5 -0
  120. package/lib/module/index.js +3 -0
  121. package/lib/module/package.json +1 -0
  122. package/lib/source-manifest.json +34 -0
  123. package/lib/worker/invisible-watermark.js +1 -0
  124. package/package.json +85 -0
@@ -0,0 +1,13 @@
1
+ import type { DetectInvisibleWatermarkOptions, InvisibleWatermarkDetectionData, InvisibleWatermarkPixelBuffer, InvisibleWatermarkWorkerOptions } from '../invisible-watermark.js';
2
+ interface DedicatedWorkerClient {
3
+ onmessage: ((event: {
4
+ data: unknown;
5
+ }) => void) | null;
6
+ onerror: (() => void) | null;
7
+ postMessage(message: unknown, transfer?: ArrayBuffer[]): void;
8
+ terminate(): void;
9
+ }
10
+ type WorkerConstructor = new (scriptURL: string | URL) => DedicatedWorkerClient;
11
+ /** Run detection in a one-time dedicated Worker and transfer a private RGBA copy. */
12
+ export declare function detectInvisibleWatermarkInWorker(pixels: InvisibleWatermarkPixelBuffer, detection: Pick<DetectInvisibleWatermarkOptions, 'key' | 'strength' | 'search'>, options: InvisibleWatermarkWorkerOptions, WorkerClass?: WorkerConstructor | undefined): Promise<InvisibleWatermarkDetectionData>;
13
+ export {};
@@ -0,0 +1,137 @@
1
+ import { INVISIBLE_WATERMARK_ALGORITHM } from '../invisible-watermark.js';
2
+ const WORKER_PROTOCOL = 1;
3
+ let requestSequence = 0;
4
+ const defaultWorkerConstructor = globalThis.Worker;
5
+ function abortError() {
6
+ const error = new Error('Invisible watermark worker detection was aborted.');
7
+ error.name = 'AbortError';
8
+ return error;
9
+ }
10
+ function report(options, phase) {
11
+ try {
12
+ options.onProgress?.({ phase });
13
+ }
14
+ catch {
15
+ // Observers cannot change detection results or Worker cleanup.
16
+ }
17
+ }
18
+ function isDetectionResult(value) {
19
+ if (!value || typeof value !== 'object')
20
+ return false;
21
+ const result = value;
22
+ const validPayload = result.payload === undefined || typeof result.payload === 'string';
23
+ const validBitErrorRate = result.bitErrorRate === undefined ||
24
+ (typeof result.bitErrorRate === 'number' &&
25
+ Number.isFinite(result.bitErrorRate) &&
26
+ result.bitErrorRate >= 0 &&
27
+ result.bitErrorRate <= 1);
28
+ const validScale = result.scale === undefined ||
29
+ (typeof result.scale === 'number' &&
30
+ Number.isFinite(result.scale) &&
31
+ result.scale > 0);
32
+ return (typeof result.detected === 'boolean' &&
33
+ typeof result.confidence === 'number' &&
34
+ Number.isFinite(result.confidence) &&
35
+ result.confidence >= 0 &&
36
+ result.confidence <= 1 &&
37
+ result.algorithm === INVISIBLE_WATERMARK_ALGORITHM &&
38
+ validPayload &&
39
+ validBitErrorRate &&
40
+ validScale &&
41
+ (!result.detected || typeof result.payload === 'string'));
42
+ }
43
+ /** Run detection in a one-time dedicated Worker and transfer a private RGBA copy. */
44
+ export function detectInvisibleWatermarkInWorker(pixels, detection, options, WorkerClass = defaultWorkerConstructor) {
45
+ report(options, 'queued');
46
+ if (options.signal?.aborted)
47
+ return Promise.reject(abortError());
48
+ if (typeof WorkerClass !== 'function') {
49
+ return Promise.reject(new Error('This browser does not support dedicated Web Workers.'));
50
+ }
51
+ return new Promise((resolve, reject) => {
52
+ let worker;
53
+ try {
54
+ worker = new WorkerClass(options.scriptUrl);
55
+ }
56
+ catch (error) {
57
+ reject(error);
58
+ return;
59
+ }
60
+ const id = `${Date.now().toString(36)}-${(requestSequence += 1).toString(36)}`;
61
+ let posted = false;
62
+ let settled = false;
63
+ const cleanup = () => {
64
+ worker.onmessage = null;
65
+ worker.onerror = null;
66
+ options.signal?.removeEventListener('abort', handleAbort);
67
+ worker.terminate();
68
+ };
69
+ const fail = (error) => {
70
+ if (settled)
71
+ return;
72
+ settled = true;
73
+ cleanup();
74
+ reject(error);
75
+ };
76
+ const handleAbort = () => fail(abortError());
77
+ worker.onerror = () => {
78
+ fail(new Error('Invisible watermark Worker script failed to load or run.'));
79
+ };
80
+ worker.onmessage = (event) => {
81
+ const message = event.data;
82
+ if (message?.protocol !== WORKER_PROTOCOL) {
83
+ fail(new Error('Invisible watermark Worker protocol mismatch.'));
84
+ return;
85
+ }
86
+ if (message.type === 'ready') {
87
+ if (posted)
88
+ return;
89
+ posted = true;
90
+ report(options, 'detecting');
91
+ const copiedPixels = new Uint8ClampedArray(pixels.data);
92
+ try {
93
+ worker.postMessage({
94
+ protocol: WORKER_PROTOCOL,
95
+ id,
96
+ type: 'detect',
97
+ pixels: copiedPixels.buffer,
98
+ width: pixels.width,
99
+ height: pixels.height,
100
+ options: {
101
+ key: detection.key,
102
+ strength: detection.strength,
103
+ search: detection.search,
104
+ },
105
+ }, [copiedPixels.buffer]);
106
+ }
107
+ catch (error) {
108
+ fail(error);
109
+ }
110
+ return;
111
+ }
112
+ if (message.id !== id)
113
+ return;
114
+ if (message.type === 'error') {
115
+ const code = typeof message.code === 'string' ? message.code : 'ERROR';
116
+ const detail = typeof message.message === 'string'
117
+ ? message.message
118
+ : 'Worker detection failed.';
119
+ fail(new Error(`Invisible watermark Worker ${code}: ${detail}`));
120
+ return;
121
+ }
122
+ if (message.type !== 'result' || !isDetectionResult(message.result)) {
123
+ fail(new Error('Invisible watermark Worker returned invalid data.'));
124
+ return;
125
+ }
126
+ if (settled)
127
+ return;
128
+ settled = true;
129
+ report(options, 'complete');
130
+ cleanup();
131
+ resolve(message.result);
132
+ };
133
+ options.signal?.addEventListener('abort', handleAbort, { once: true });
134
+ if (options.signal?.aborted)
135
+ handleAbort();
136
+ });
137
+ }
@@ -0,0 +1,20 @@
1
+ import type { ImageOptions, MarkOptions, TextOptions, WatermarkImageOptions } from '../index.js';
2
+ import type { WebCanvas, WebResourceAdapter } from './browser.js';
3
+ export type WebRenderLayer = {
4
+ type: 'text';
5
+ options: TextOptions;
6
+ } | {
7
+ type: 'image';
8
+ options: WatermarkImageOptions;
9
+ };
10
+ /** Per-instance DOM resources and cooperative boundaries for Web rendering. */
11
+ export interface WebRenderRuntime {
12
+ resources?: WebResourceAdapter;
13
+ signal?: AbortSignal;
14
+ }
15
+ type OutputOptions = Pick<MarkOptions, 'quality' | 'saveFormat' | 'matteColor' | 'rotationCanvasMode' | 'maxSize'>;
16
+ /** Render a complete composition into a browser canvas. */
17
+ export declare function renderWebCompositionToCanvas(backgroundImage: ImageOptions, layers: WebRenderLayer[], output: OutputOptions, runtime?: WebRenderRuntime): Promise<WebCanvas>;
18
+ /** Render a complete composition into a data URL. */
19
+ export declare function renderWebComposition(backgroundImage: ImageOptions, layers: WebRenderLayer[], output: OutputOptions, runtime?: WebRenderRuntime): Promise<string>;
20
+ export {};