@meonode/canvas 2.0.5 → 3.0.1

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 (84) hide show
  1. package/CONTRIBUTING.md +11 -9
  2. package/README.md +9 -21
  3. package/dist/cjs/canvas/canvas.helper.d.ts +1 -1
  4. package/dist/cjs/canvas/canvas.type.d.ts +9 -4
  5. package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
  6. package/dist/cjs/canvas/chart.canvas.d.ts +7 -3
  7. package/dist/cjs/canvas/chart.canvas.d.ts.map +1 -1
  8. package/dist/cjs/canvas/chart.canvas.js +3 -4
  9. package/dist/cjs/canvas/chart.canvas.js.map +1 -1
  10. package/dist/cjs/canvas/grid.canvas.d.ts +2 -2
  11. package/dist/cjs/canvas/grid.canvas.d.ts.map +1 -1
  12. package/dist/cjs/canvas/grid.canvas.js +2 -10
  13. package/dist/cjs/canvas/grid.canvas.js.map +1 -1
  14. package/dist/cjs/canvas/image.canvas.d.ts +2 -2
  15. package/dist/cjs/canvas/image.canvas.js +2 -2
  16. package/dist/cjs/canvas/image.canvas.js.map +1 -1
  17. package/dist/cjs/canvas/layout.canvas.d.ts +5 -1
  18. package/dist/cjs/canvas/layout.canvas.d.ts.map +1 -1
  19. package/dist/cjs/canvas/layout.canvas.js +59 -68
  20. package/dist/cjs/canvas/layout.canvas.js.map +1 -1
  21. package/dist/cjs/canvas/root.canvas.d.ts +9 -16
  22. package/dist/cjs/canvas/root.canvas.d.ts.map +1 -1
  23. package/dist/cjs/canvas/root.canvas.js +56 -43
  24. package/dist/cjs/canvas/root.canvas.js.map +1 -1
  25. package/dist/cjs/canvas/text.canvas.d.ts +7 -3
  26. package/dist/cjs/canvas/text.canvas.d.ts.map +1 -1
  27. package/dist/cjs/canvas/text.canvas.js +25 -85
  28. package/dist/cjs/canvas/text.canvas.js.map +1 -1
  29. package/dist/cjs/index.d.ts +2 -2
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/index.js +1 -1
  32. package/dist/cjs/util/disk.cache.d.ts +5 -0
  33. package/dist/cjs/util/disk.cache.d.ts.map +1 -1
  34. package/dist/cjs/util/disk.cache.js +51 -24
  35. package/dist/cjs/util/disk.cache.js.map +1 -1
  36. package/dist/cjs/worker/canvas-handlers.d.ts +14 -0
  37. package/dist/cjs/worker/canvas-handlers.d.ts.map +1 -0
  38. package/dist/cjs/worker/canvas-handlers.js +42 -0
  39. package/dist/cjs/worker/canvas-handlers.js.map +1 -0
  40. package/dist/cjs/worker/comlink.pool.d.ts +1 -1
  41. package/dist/cjs/worker/comlink.pool.d.ts.map +1 -1
  42. package/dist/cjs/worker/comlink.pool.js +3 -0
  43. package/dist/cjs/worker/comlink.pool.js.map +1 -1
  44. package/dist/cjs/worker/comlink.setup.d.ts.map +1 -1
  45. package/dist/cjs/worker/comlink.setup.js +1 -1
  46. package/dist/cjs/worker/comlink.setup.js.map +1 -1
  47. package/dist/cjs/worker/render.worker.js +9 -32
  48. package/dist/cjs/worker/render.worker.js.map +1 -1
  49. package/dist/esm/canvas/canvas.helper.d.ts +1 -1
  50. package/dist/esm/canvas/canvas.type.d.ts +9 -4
  51. package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
  52. package/dist/esm/canvas/chart.canvas.d.ts +7 -3
  53. package/dist/esm/canvas/chart.canvas.d.ts.map +1 -1
  54. package/dist/esm/canvas/chart.canvas.js +3 -4
  55. package/dist/esm/canvas/grid.canvas.d.ts +2 -2
  56. package/dist/esm/canvas/grid.canvas.d.ts.map +1 -1
  57. package/dist/esm/canvas/grid.canvas.js +1 -9
  58. package/dist/esm/canvas/image.canvas.d.ts +2 -2
  59. package/dist/esm/canvas/image.canvas.js +2 -2
  60. package/dist/esm/canvas/layout.canvas.d.ts +5 -1
  61. package/dist/esm/canvas/layout.canvas.d.ts.map +1 -1
  62. package/dist/esm/canvas/layout.canvas.js +59 -69
  63. package/dist/esm/canvas/root.canvas.d.ts +9 -16
  64. package/dist/esm/canvas/root.canvas.d.ts.map +1 -1
  65. package/dist/esm/canvas/root.canvas.js +57 -43
  66. package/dist/esm/canvas/text.canvas.d.ts +7 -3
  67. package/dist/esm/canvas/text.canvas.d.ts.map +1 -1
  68. package/dist/esm/canvas/text.canvas.js +25 -85
  69. package/dist/esm/index.d.ts +2 -2
  70. package/dist/esm/index.d.ts.map +1 -1
  71. package/dist/esm/index.js +2 -2
  72. package/dist/esm/util/disk.cache.d.ts +5 -0
  73. package/dist/esm/util/disk.cache.d.ts.map +1 -1
  74. package/dist/esm/util/disk.cache.js +51 -25
  75. package/dist/esm/worker/canvas-handlers.d.ts +14 -0
  76. package/dist/esm/worker/canvas-handlers.d.ts.map +1 -0
  77. package/dist/esm/worker/canvas-handlers.js +39 -0
  78. package/dist/esm/worker/comlink.pool.d.ts +1 -1
  79. package/dist/esm/worker/comlink.pool.d.ts.map +1 -1
  80. package/dist/esm/worker/comlink.pool.js +3 -0
  81. package/dist/esm/worker/comlink.setup.d.ts.map +1 -1
  82. package/dist/esm/worker/comlink.setup.js +1 -1
  83. package/dist/esm/worker/render.worker.js +9 -32
  84. package/package.json +17 -21
@@ -1 +1 @@
1
- {"version":3,"file":"disk.cache.js","sources":["../../../../src/util/disk.cache.ts"],"sourcesContent":["import { createHash } from 'crypto'\nimport { promises as fs } from 'fs'\nimport { join } from 'path'\n\nconst CACHE_DIR = join(process.cwd(), '.cache', 'files')\nlet _dirEnsured = false\n\nasync function ensureDir(): Promise<void> {\n if (_dirEnsured) return\n await fs.mkdir(CACHE_DIR, { recursive: true })\n _dirEnsured = true\n}\n\nexport function hashBuffer(buf: Buffer): string {\n return createHash('sha256').update(buf).digest('hex')\n}\n\nexport async function readDiskCache(key: string): Promise<Buffer | null> {\n try {\n await ensureDir()\n return await fs.readFile(join(CACHE_DIR, key))\n } catch {\n return null\n }\n}\n\nexport async function writeDiskCache(key: string, data: Buffer): Promise<void> {\n try {\n await ensureDir()\n await fs.writeFile(join(CACHE_DIR, key), data)\n } catch {\n // best-effort — cache write failures are non-fatal\n }\n}\n\nexport async function deleteDiskCache(key: string): Promise<void> {\n try {\n await fs.unlink(join(CACHE_DIR, key))\n } catch {\n // non-fatal — file may not exist if write failed earlier\n }\n}\n\n/**\n * Delete the entire disk cache directory.\n * Called on process exit to clean up any orphaned cache files.\n */\nexport async function clearDiskCache(): Promise<void> {\n _dirEnsured = false\n try {\n await fs.rm(CACHE_DIR, { recursive: true, force: true })\n } catch {\n // non-fatal — directory may not exist\n }\n}\n\n// Clean up disk cache on process exit to handle crashes mid-render.\n// Guard prevents re-entry: clearDiskCache() is async, so without this the\n// beforeExit schedule I/O idle beforeExit cycle loops forever.\nlet _exitCleanupStarted = false\nprocess.on('beforeExit', () => {\n if (_exitCleanupStarted) return\n _exitCleanupStarted = true\n void clearDiskCache()\n})\n\n// Also clean up on SIGINT/SIGTERM for graceful shutdowns\nconst cleanupOnExit = () => {\n clearDiskCache().finally(() => process.exit(0))\n}\nprocess.on('SIGINT', cleanupOnExit)\nprocess.on('SIGTERM', cleanupOnExit)\n"],"names":["join","fs","createHash"],"mappings":";;;;;;AAIA,MAAM,SAAS,GAAGA,SAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC;AACxD,IAAI,WAAW,GAAG,KAAK;AAEvB,eAAe,SAAS,GAAA;AACtB,IAAA,IAAI,WAAW;QAAE;AACjB,IAAA,MAAMC,WAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9C,WAAW,GAAG,IAAI;AACpB;AAEM,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,OAAOC,iBAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACvD;AAEO,eAAe,aAAa,CAAC,GAAW,EAAA;AAC7C,IAAA,IAAI;QACF,MAAM,SAAS,EAAE;AACjB,QAAA,OAAO,MAAMD,WAAE,CAAC,QAAQ,CAACD,SAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAChD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEO,eAAe,cAAc,CAAC,GAAW,EAAE,IAAY,EAAA;AAC5D,IAAA,IAAI;QACF,MAAM,SAAS,EAAE;AACjB,QAAA,MAAMC,WAAE,CAAC,SAAS,CAACD,SAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAChD;AAAE,IAAA,MAAM;;IAER;AACF;AAEO,eAAe,eAAe,CAAC,GAAW,EAAA;AAC/C,IAAA,IAAI;QACF,MAAMC,WAAE,CAAC,MAAM,CAACD,SAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACvC;AAAE,IAAA,MAAM;;IAER;AACF;AAEA;;;AAGG;AACI,eAAe,cAAc,GAAA;IAClC,WAAW,GAAG,KAAK;AACnB,IAAA,IAAI;AACF,QAAA,MAAMC,WAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D;AAAE,IAAA,MAAM;;IAER;AACF;AAEA;AACA;AACA;AACA,IAAI,mBAAmB,GAAG,KAAK;AAC/B,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,MAAK;AAC5B,IAAA,IAAI,mBAAmB;QAAE;IACzB,mBAAmB,GAAG,IAAI;IAC1B,KAAK,cAAc,EAAE;AACvB,CAAC,CAAC;AAEF;AACA,MAAM,aAAa,GAAG,MAAK;AACzB,IAAA,cAAc,EAAE,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;AACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;;;;;;;;"}
1
+ {"version":3,"file":"disk.cache.js","sources":["../../../../src/util/disk.cache.ts"],"sourcesContent":["import { createHash } from 'crypto'\nimport { promises as fs } from 'fs'\nimport { join } from 'path'\n\nlet _cacheDir = join(process.cwd(), '.cache', 'files')\nlet _dirEnsured = false\n\n/**\n * Override the default disk cache directory.\n * Must be called before any cache read/write operations.\n */\nexport function setDiskCacheDir(dir: string): void {\n _cacheDir = dir\n _dirEnsured = false\n}\n\nasync function ensureDir(): Promise<void> {\n if (_dirEnsured) return\n await fs.mkdir(_cacheDir, { recursive: true })\n _dirEnsured = true\n}\n\nexport function hashBuffer(buf: Buffer): string {\n return createHash('sha256').update(buf).digest('hex')\n}\n\nexport async function readDiskCache(key: string): Promise<Buffer | null> {\n try {\n await ensureDir()\n return await fs.readFile(join(_cacheDir, key))\n } catch {\n return null\n }\n}\n\nexport async function writeDiskCache(key: string, data: Buffer): Promise<void> {\n try {\n await ensureDir()\n await fs.writeFile(join(_cacheDir, key), data)\n } catch {\n // best-effort — cache write failures are non-fatal\n }\n}\n\nexport async function deleteDiskCache(key: string): Promise<void> {\n try {\n await fs.unlink(join(_cacheDir, key))\n } catch (err) {\n // non-fatal — file may not exist if write failed earlier\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[disk.cache] Failed to delete cache entry \"${key}\":`, (err as Error).message)\n }\n }\n}\n\n/**\n * Delete the entire disk cache directory.\n * Called on process exit to clean up any orphaned cache files.\n */\nexport async function clearDiskCache(): Promise<void> {\n _dirEnsured = false\n try {\n await fs.rm(_cacheDir, { recursive: true, force: true })\n } catch (err) {\n // non-fatal — directory may not exist\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn('[disk.cache] Failed to clear cache directory:', (err as Error).message)\n }\n }\n}\n\n// Clean up disk cache on process exit to handle crashes mid-render.\n// Handlers live on globalThis so re-evaluations (e.g. vitest.resetModules +\n// dynamic import) can detach the previous closures and attach fresh ones —\n// avoids stale clearDiskCache / duplicate listener buildup.\ninterface DiskCacheExitGlobal {\n /** One-shot guard for async beforeExit re-entry storms */\n lifecycle: { cleanupStarted: boolean }\n onBeforeExit: () => void\n onSignals: () => void\n}\n\nconst globalForExit = globalThis as typeof globalThis & {\n __diskCacheExit?: DiskCacheExitGlobal\n}\n\nfunction registerExitListeners(): void {\n const prev = globalForExit.__diskCacheExit\n\n const lifecycle = prev?.lifecycle ?? { cleanupStarted: false }\n\n if (prev) {\n process.removeListener('beforeExit', prev.onBeforeExit)\n process.removeListener('SIGINT', prev.onSignals)\n process.removeListener('SIGTERM', prev.onSignals)\n }\n\n const onBeforeExit = () => {\n if (lifecycle.cleanupStarted) return\n lifecycle.cleanupStarted = true\n void clearDiskCache()\n }\n\n const onSignals = () => {\n clearDiskCache().finally(() => process.exit(0))\n }\n\n globalForExit.__diskCacheExit = {\n lifecycle,\n onBeforeExit,\n onSignals,\n }\n\n process.on('beforeExit', onBeforeExit)\n process.on('SIGINT', onSignals)\n process.on('SIGTERM', onSignals)\n}\n\nregisterExitListeners()\n"],"names":["join","fs","createHash"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { RootProps } from '../canvas/canvas.type.js';
2
+ import type { Canvas } from 'skia-canvas';
3
+ import type { RenderResult } from './worker.types.js';
4
+ export interface CanvasHandlerDeps {
5
+ canvases: Map<number, Canvas>;
6
+ getNextCanvasId: () => number;
7
+ renderRoot: (props: RootProps) => Promise<Canvas>;
8
+ }
9
+ export declare function createCanvasHandlers(deps: CanvasHandlerDeps): {
10
+ render(props: RootProps): Promise<RenderResult>;
11
+ callOnCanvas(canvasId: number, method: string, args: unknown[]): Promise<Buffer | string | void>;
12
+ releaseCanvas(canvasId: number): void;
13
+ };
14
+ //# sourceMappingURL=canvas-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-handlers.d.ts","sourceRoot":"","sources":["../../../src/worker/canvas-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,eAAe,EAAE,MAAM,MAAM,CAAA;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAClD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB;kBAEpC,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;2BAYxB,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;4BAoB9E,MAAM,GAAG,IAAI;EAIxC"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ function createCanvasHandlers(deps) {
4
+ return {
5
+ async render(props) {
6
+ const canvas = await deps.renderRoot(props);
7
+ const canvasId = deps.getNextCanvasId();
8
+ deps.canvases.set(canvasId, canvas);
9
+ return {
10
+ canvasId,
11
+ buffer: canvas.toBufferSync('png'),
12
+ width: canvas.width,
13
+ height: canvas.height,
14
+ };
15
+ },
16
+ async callOnCanvas(canvasId, method, args) {
17
+ const canvas = deps.canvases.get(canvasId);
18
+ if (!canvas) {
19
+ throw new Error(`[render.worker] Canvas ${canvasId} not found`);
20
+ }
21
+ switch (method) {
22
+ case 'toBuffer':
23
+ return canvas.toBuffer(...args);
24
+ case 'toURL':
25
+ return canvas.toURL(...args);
26
+ case 'toFile':
27
+ await canvas.toFile(...args);
28
+ return;
29
+ case 'toSharp':
30
+ return await canvas.toSharp(...args).toBuffer();
31
+ default:
32
+ throw new Error(`[render.worker] Unknown method: ${method}`);
33
+ }
34
+ },
35
+ releaseCanvas(canvasId) {
36
+ deps.canvases.delete(canvasId);
37
+ },
38
+ };
39
+ }
40
+
41
+ exports.createCanvasHandlers = createCanvasHandlers;
42
+ //# sourceMappingURL=canvas-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-handlers.js","sources":["../../../../src/worker/canvas-handlers.ts"],"sourcesContent":["import type { RootProps } from '@/canvas/canvas.type.js'\nimport type { Canvas } from 'skia-canvas'\nimport type { RenderResult } from '@/worker/worker.types.js'\n\nexport interface CanvasHandlerDeps {\n canvases: Map<number, Canvas>\n getNextCanvasId: () => number\n renderRoot: (props: RootProps) => Promise<Canvas>\n}\n\nexport function createCanvasHandlers(deps: CanvasHandlerDeps) {\n return {\n async render(props: RootProps): Promise<RenderResult> {\n const canvas = await deps.renderRoot(props)\n const canvasId = deps.getNextCanvasId()\n deps.canvases.set(canvasId, canvas)\n return {\n canvasId,\n buffer: canvas.toBufferSync('png'),\n width: canvas.width,\n height: canvas.height,\n }\n },\n\n async callOnCanvas(canvasId: number, method: string, args: unknown[]): Promise<Buffer | string | void> {\n const canvas = deps.canvases.get(canvasId)\n if (!canvas) {\n throw new Error(`[render.worker] Canvas ${canvasId} not found`)\n }\n switch (method) {\n case 'toBuffer':\n return canvas.toBuffer(...(args as [any, any?]))\n case 'toURL':\n return canvas.toURL(...(args as [any, any?]))\n case 'toFile':\n await canvas.toFile(...(args as [string, any?]))\n return\n case 'toSharp':\n return await canvas.toSharp(...(args as [any?])).toBuffer()\n default:\n throw new Error(`[render.worker] Unknown method: ${method}`)\n }\n },\n\n releaseCanvas(canvasId: number): void {\n deps.canvases.delete(canvasId)\n },\n }\n}\n"],"names":[],"mappings":";;AAUM,SAAU,oBAAoB,CAAC,IAAuB,EAAA;IAC1D,OAAO;QACL,MAAM,MAAM,CAAC,KAAgB,EAAA;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAC3C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;YACnC,OAAO;gBACL,QAAQ;AACR,gBAAA,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB;QACH,CAAC;AAED,QAAA,MAAM,YAAY,CAAC,QAAgB,EAAE,MAAc,EAAE,IAAe,EAAA;YAClE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAA,UAAA,CAAY,CAAC;YACjE;YACA,QAAQ,MAAM;AACZ,gBAAA,KAAK,UAAU;AACb,oBAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAI,IAAoB,CAAC;AAClD,gBAAA,KAAK,OAAO;AACV,oBAAA,OAAO,MAAM,CAAC,KAAK,CAAC,GAAI,IAAoB,CAAC;AAC/C,gBAAA,KAAK,QAAQ;AACX,oBAAA,MAAM,MAAM,CAAC,MAAM,CAAC,GAAI,IAAuB,CAAC;oBAChD;AACF,gBAAA,KAAK,SAAS;oBACZ,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,GAAI,IAAe,CAAC,CAAC,QAAQ,EAAE;AAC7D,gBAAA;AACE,oBAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAA,CAAE,CAAC;;QAElE,CAAC;AAED,QAAA,aAAa,CAAC,QAAgB,EAAA;AAC5B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChC,CAAC;KACF;AACH;;;;"}
@@ -1,4 +1,4 @@
1
- import type { RenderResult } from '../worker/worker.types.js';
1
+ import type { RenderResult } from './worker.types.js';
2
2
  import type { RootProps } from '../canvas/canvas.type.js';
3
3
  export interface PoolRenderResult extends RenderResult {
4
4
  workerIdx: number;
@@ -1 +1 @@
1
- {"version":3,"file":"comlink.pool.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.pool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,YAAY,EAAU,MAAM,0BAA0B,CAAA;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,SAAS,EAAE,MAAM,CAAA;CAClB;AASD,oFAAoF;AACpF,eAAO,MAAM,SAAS,kBAAkB,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,CAuB7H;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAuB3G;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,IAAI,EAAE,MAAM;IAYxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;YAQC,aAAa;IAiBrB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuDzD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAInH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxD,SAAS;CAOV"}
1
+ {"version":3,"file":"comlink.pool.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.pool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,YAAY,EAAU,MAAM,0BAA0B,CAAA;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,SAAS,EAAE,MAAM,CAAA;CAClB;AASD,oFAAoF;AACpF,eAAO,MAAM,SAAS,kBAAkB,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,CAuB7H;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAuB3G;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,IAAI,EAAE,MAAM;IAYxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;YAQC,aAAa;IAiBrB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2DzD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAInH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxD,SAAS;CAOV"}
@@ -137,6 +137,9 @@ class ComlinkPool {
137
137
  }
138
138
  }
139
139
  async render(props) {
140
+ if (this.endpoints.length === 0) {
141
+ throw new Error('[ComlinkPool] Pool has been terminated');
142
+ }
140
143
  // Extract functions from props, replacing them with serializable sentinels.
141
144
  // A single Comlink.proxy() callback is created at the top level so Comlink
142
145
  // can correctly transfer it via its proxy transfer handler.
@@ -1 +1 @@
1
- {"version":3,"file":"comlink.pool.js","sources":["../../../../src/worker/comlink.pool.ts"],"sourcesContent":["import { Worker } from 'node:worker_threads'\nimport { fileURLToPath } from 'node:url'\nimport * as path from 'node:path'\nimport { Comlink, nodeEndpoint } from '@/worker/comlink.setup.js'\nimport type { Remote } from 'comlink'\nimport type { WorkerAPI, RenderResult, CallFn } from '@/worker/worker.types.js'\nimport type { RootProps } from '@/canvas/canvas.type.js'\n\nexport interface PoolRenderResult extends RenderResult {\n workerIdx: number\n}\n\ninterface QueuedTask {\n props: RootProps\n callFn: CallFn | undefined\n resolve: (result: PoolRenderResult) => void\n reject: (err: Error) => void\n}\n\n/** Sentinel embedded in serialized props to mark where a function was extracted. */\nexport const FN_MARKER = '__comlinkFnId'\n\n/**\n * Deeply walks an object tree, replaces function values with `{ [FN_MARKER]: id }` sentinels,\n * and collects the original functions in a Map keyed by their assigned id.\n * Returns the cleaned (function-free) tree that is safe for structured clone.\n */\nexport function extractFunctions<T>(obj: T, fnMap: Map<number, (...args: unknown[]) => unknown>, nextId: { value: number }): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj === 'function') {\n const id = nextId.value++\n fnMap.set(id, obj as (...args: unknown[]) => unknown)\n return { [FN_MARKER]: id } as unknown as T\n }\n if (typeof obj !== 'object') return obj\n\n // Preserve binary data types — don't walk into them\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(item => extractFunctions(item, fnMap, nextId)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n result[key] = extractFunctions((obj as Record<string, unknown>)[key], fnMap, nextId)\n }\n return result as T\n}\n\n/**\n * Deeply walks an object tree received on the worker side, replaces\n * `{ [FN_MARKER]: id }` sentinels with async functions that delegate\n * to the main-thread callback proxy.\n */\nexport function restoreFunctions<T>(obj: T, callFn: (id: number, ...args: unknown[]) => Promise<unknown>): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj !== 'object') return obj\n\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n // Check for sentinel\n if (FN_MARKER in (obj as Record<string, unknown>)) {\n const id = (obj as Record<string, unknown>)[FN_MARKER] as number\n return ((...args: unknown[]) => callFn(id, ...args)) as unknown as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => restoreFunctions(item, callFn)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n result[key] = restoreFunctions((obj as Record<string, unknown>)[key], callFn)\n }\n return result as T\n}\n\n/**\n * Pool of Comlink-wrapped worker threads.\n * Manages idle/queue scheduling and proxy lifecycle.\n */\nexport class ComlinkPool {\n private workers: Worker[] = []\n private endpoints: Remote<WorkerAPI>[] = []\n private idle: number[] = []\n private queue: QueuedTask[] = []\n\n constructor(size: number) {\n const workerFile = path.join(path.dirname(fileURLToPath(import.meta.url)), '../worker/render.worker.js')\n\n for (let i = 0; i < size; i++) {\n const worker = new Worker(workerFile)\n const endpoint = Comlink.wrap<WorkerAPI>(nodeEndpoint(worker))\n this.workers.push(worker)\n this.endpoints.push(endpoint)\n this.idle.push(i)\n }\n }\n\n private acquire(): number | null {\n return this.idle.pop() ?? null\n }\n\n private release(idx: number) {\n this.idle.push(idx)\n this.drain()\n }\n\n private drain() {\n while (this.queue.length > 0 && this.idle.length > 0) {\n const task = this.queue.shift()!\n const idx = this.idle.pop()!\n void this.executeRender(idx, task.props, task.callFn, task.resolve, task.reject)\n }\n }\n\n private async executeRender(\n idx: number,\n props: RootProps,\n callFn: CallFn | undefined,\n resolve: (result: PoolRenderResult) => void,\n reject: (err: Error) => void,\n ) {\n try {\n const result = await this.endpoints[idx].render(props, callFn)\n resolve({ ...result, workerIdx: idx })\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n } finally {\n this.release(idx)\n }\n }\n\n async render(props: RootProps): Promise<PoolRenderResult> {\n // Extract functions from props, replacing them with serializable sentinels.\n // A single Comlink.proxy() callback is created at the top level so Comlink\n // can correctly transfer it via its proxy transfer handler.\n const fnMap = new Map<number, (...args: unknown[]) => unknown>()\n const cleaned = extractFunctions(props, fnMap, { value: 0 })\n\n let callFnProxy: CallFn | undefined\n if (fnMap.size > 0) {\n callFnProxy = Comlink.proxy(async (id: number, ...args: unknown[]) => {\n const fn = fnMap.get(id)\n if (!fn) throw new Error(`[ComlinkPool] Function #${id} not found`)\n return fn(...args)\n })\n }\n\n const cleanup = () => {\n if (callFnProxy) {\n try {\n ;(callFnProxy as any)[Comlink.releaseProxy]?.()\n } catch {\n // Proxy may already be released\n }\n }\n }\n\n // Direct path — idle worker available\n const idx = this.acquire()\n if (idx !== null) {\n try {\n const result = await this.endpoints[idx].render(cleaned, callFnProxy)\n return { ...result, workerIdx: idx }\n } finally {\n this.release(idx)\n cleanup()\n }\n }\n\n // Queued path — cleanup AFTER the queued task completes, not before\n return new Promise<PoolRenderResult>((resolve, reject) => {\n this.queue.push({\n props: cleaned,\n callFn: callFnProxy,\n resolve: result => {\n cleanup()\n resolve(result)\n },\n reject: err => {\n cleanup()\n reject(err)\n },\n })\n })\n }\n\n callOnCanvas(workerIdx: number, canvasId: number, method: string, args: unknown[]): Promise<Buffer | string | void> {\n return this.endpoints[workerIdx].callOnCanvas(canvasId, method, args) as Promise<Buffer | string | void>\n }\n\n releaseCanvas(workerIdx: number, canvasId: number): void {\n this.endpoints[workerIdx].releaseCanvas(canvasId)\n }\n\n terminate() {\n this.workers.forEach(w => w.terminate())\n this.workers = []\n this.endpoints = []\n this.idle = []\n this.queue = []\n }\n}\n"],"names":["path","fileURLToPath","Worker","Comlink"],"mappings":"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"}
1
+ {"version":3,"file":"comlink.pool.js","sources":["../../../../src/worker/comlink.pool.ts"],"sourcesContent":["import { Worker } from 'node:worker_threads'\nimport { fileURLToPath } from 'node:url'\nimport * as path from 'node:path'\nimport { Comlink, nodeEndpoint } from '@/worker/comlink.setup.js'\nimport type { Remote } from 'comlink'\nimport type { WorkerAPI, RenderResult, CallFn } from '@/worker/worker.types.js'\nimport type { RootProps } from '@/canvas/canvas.type.js'\n\nexport interface PoolRenderResult extends RenderResult {\n workerIdx: number\n}\n\ninterface QueuedTask {\n props: RootProps\n callFn: CallFn | undefined\n resolve: (result: PoolRenderResult) => void\n reject: (err: Error) => void\n}\n\n/** Sentinel embedded in serialized props to mark where a function was extracted. */\nexport const FN_MARKER = '__comlinkFnId'\n\n/**\n * Deeply walks an object tree, replaces function values with `{ [FN_MARKER]: id }` sentinels,\n * and collects the original functions in a Map keyed by their assigned id.\n * Returns the cleaned (function-free) tree that is safe for structured clone.\n */\nexport function extractFunctions<T>(obj: T, fnMap: Map<number, (...args: unknown[]) => unknown>, nextId: { value: number }): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj === 'function') {\n const id = nextId.value++\n fnMap.set(id, obj as (...args: unknown[]) => unknown)\n return { [FN_MARKER]: id } as unknown as T\n }\n if (typeof obj !== 'object') return obj\n\n // Preserve binary data types — don't walk into them\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(item => extractFunctions(item, fnMap, nextId)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n result[key] = extractFunctions((obj as Record<string, unknown>)[key], fnMap, nextId)\n }\n return result as T\n}\n\n/**\n * Deeply walks an object tree received on the worker side, replaces\n * `{ [FN_MARKER]: id }` sentinels with async functions that delegate\n * to the main-thread callback proxy.\n */\nexport function restoreFunctions<T>(obj: T, callFn: (id: number, ...args: unknown[]) => Promise<unknown>): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj !== 'object') return obj\n\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n // Check for sentinel\n if (FN_MARKER in (obj as Record<string, unknown>)) {\n const id = (obj as Record<string, unknown>)[FN_MARKER] as number\n return ((...args: unknown[]) => callFn(id, ...args)) as unknown as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => restoreFunctions(item, callFn)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n result[key] = restoreFunctions((obj as Record<string, unknown>)[key], callFn)\n }\n return result as T\n}\n\n/**\n * Pool of Comlink-wrapped worker threads.\n * Manages idle/queue scheduling and proxy lifecycle.\n */\nexport class ComlinkPool {\n private workers: Worker[] = []\n private endpoints: Remote<WorkerAPI>[] = []\n private idle: number[] = []\n private queue: QueuedTask[] = []\n\n constructor(size: number) {\n const workerFile = path.join(path.dirname(fileURLToPath(import.meta.url)), '../worker/render.worker.js')\n\n for (let i = 0; i < size; i++) {\n const worker = new Worker(workerFile)\n const endpoint = Comlink.wrap<WorkerAPI>(nodeEndpoint(worker))\n this.workers.push(worker)\n this.endpoints.push(endpoint)\n this.idle.push(i)\n }\n }\n\n private acquire(): number | null {\n return this.idle.pop() ?? null\n }\n\n private release(idx: number) {\n this.idle.push(idx)\n this.drain()\n }\n\n private drain() {\n while (this.queue.length > 0 && this.idle.length > 0) {\n const task = this.queue.shift()!\n const idx = this.idle.pop()!\n void this.executeRender(idx, task.props, task.callFn, task.resolve, task.reject)\n }\n }\n\n private async executeRender(\n idx: number,\n props: RootProps,\n callFn: CallFn | undefined,\n resolve: (result: PoolRenderResult) => void,\n reject: (err: Error) => void,\n ) {\n try {\n const result = await this.endpoints[idx].render(props, callFn)\n resolve({ ...result, workerIdx: idx })\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n } finally {\n this.release(idx)\n }\n }\n\n async render(props: RootProps): Promise<PoolRenderResult> {\n if (this.endpoints.length === 0) {\n throw new Error('[ComlinkPool] Pool has been terminated')\n }\n\n // Extract functions from props, replacing them with serializable sentinels.\n // A single Comlink.proxy() callback is created at the top level so Comlink\n // can correctly transfer it via its proxy transfer handler.\n const fnMap = new Map<number, (...args: unknown[]) => unknown>()\n const cleaned = extractFunctions(props, fnMap, { value: 0 })\n\n let callFnProxy: CallFn | undefined\n if (fnMap.size > 0) {\n callFnProxy = Comlink.proxy(async (id: number, ...args: unknown[]) => {\n const fn = fnMap.get(id)\n if (!fn) throw new Error(`[ComlinkPool] Function #${id} not found`)\n return fn(...args)\n })\n }\n\n const cleanup = () => {\n if (callFnProxy) {\n try {\n ;(callFnProxy as any)[Comlink.releaseProxy]?.()\n } catch {\n // Proxy may already be released\n }\n }\n }\n\n // Direct path — idle worker available\n const idx = this.acquire()\n if (idx !== null) {\n try {\n const result = await this.endpoints[idx].render(cleaned, callFnProxy)\n return { ...result, workerIdx: idx }\n } finally {\n this.release(idx)\n cleanup()\n }\n }\n\n // Queued path — cleanup AFTER the queued task completes, not before\n return new Promise<PoolRenderResult>((resolve, reject) => {\n this.queue.push({\n props: cleaned,\n callFn: callFnProxy,\n resolve: result => {\n cleanup()\n resolve(result)\n },\n reject: err => {\n cleanup()\n reject(err)\n },\n })\n })\n }\n\n callOnCanvas(workerIdx: number, canvasId: number, method: string, args: unknown[]): Promise<Buffer | string | void> {\n return this.endpoints[workerIdx].callOnCanvas(canvasId, method, args) as Promise<Buffer | string | void>\n }\n\n releaseCanvas(workerIdx: number, canvasId: number): void {\n this.endpoints[workerIdx].releaseCanvas(canvasId)\n }\n\n terminate() {\n this.workers.forEach(w => w.terminate())\n this.workers = []\n this.endpoints = []\n this.idle = []\n this.queue = []\n }\n}\n"],"names":["path","fileURLToPath","Worker","Comlink"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"comlink.setup.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAKlC,OAAO,YAAY,MAAM,mCAAmC,CAAA;AA4B5D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"comlink.setup.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAIlC,OAAO,YAAY,MAAM,mCAAmC,CAAA;AA4B5D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -40,7 +40,7 @@ function installNodeProxyHandler() {
40
40
  return [port2, [port2]];
41
41
  },
42
42
  deserialize: (port) => {
43
- port.start?.();
43
+ port.start();
44
44
  return Comlink__namespace.wrap(nodeEndpoint(port));
45
45
  },
46
46
  });
@@ -1 +1 @@
1
- {"version":3,"file":"comlink.setup.js","sources":["../../../../src/worker/comlink.setup.ts"],"sourcesContent":["// src/worker/comlink.setup.ts\nimport * as Comlink from 'comlink'\nimport { MessageChannel } from 'node:worker_threads'\n\n// Use deep import path — Comlink has no `exports` field (issue #508)\n// @ts-expect-error Comlink's node-adapter has no type declarations at this path\nimport nodeEndpoint from 'comlink/dist/esm/node-adapter.mjs'\n\n/**\n * Fix Comlink.proxy() for Node.js worker_threads (issue #313).\n * The built-in proxy transfer handler uses browser MessageChannel.\n * This override uses Node's MessageChannel instead.\n *\n * Must be called on BOTH main thread and worker before any Comlink usage.\n */\nfunction installNodeProxyHandler() {\n Comlink.transferHandlers.set('proxy', {\n canHandle: (obj: unknown): obj is { [Comlink.proxyMarker]: true } =>\n (typeof obj === 'object' || typeof obj === 'function') && obj !== null && Comlink.proxyMarker in obj,\n serialize: (obj: unknown) => {\n const { port1, port2 } = new MessageChannel()\n Comlink.expose(obj, nodeEndpoint(port1))\n return [port2, [port2]]\n },\n deserialize: (port: MessagePort) => {\n ;(port as any).start?.()\n return Comlink.wrap(nodeEndpoint(port))\n },\n })\n}\n\n// Install immediately on import\ninstallNodeProxyHandler()\n\nexport { Comlink, nodeEndpoint }\n"],"names":["Comlink","MessageChannel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAQA;;;;;;AAMG;AACH,SAAS,uBAAuB,GAAA;AAC9B,IAAAA,kBAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE;QACpC,SAAS,EAAE,CAAC,GAAY,KACtB,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,KAAK,GAAG,KAAK,IAAI,IAAIA,kBAAO,CAAC,WAAW,IAAI,GAAG;AACtG,QAAA,SAAS,EAAE,CAAC,GAAY,KAAI;YAC1B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAIC,kCAAc,EAAE;YAC7CD,kBAAO,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;AACxC,YAAA,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;AACD,QAAA,WAAW,EAAE,CAAC,IAAiB,KAAI;AAC/B,YAAA,IAAY,CAAC,KAAK,IAAI;YACxB,OAAOA,kBAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;AACF,KAAA,CAAC;AACJ;AAEA;AACA,uBAAuB,EAAE;;;;;"}
1
+ {"version":3,"file":"comlink.setup.js","sources":["../../../../src/worker/comlink.setup.ts"],"sourcesContent":["// src/worker/comlink.setup.ts\nimport * as Comlink from 'comlink'\nimport { MessageChannel, type MessagePort } from 'node:worker_threads'\n\n// Deep import — Comlink has no `exports` field (issue #508); types in src/types/comlink-node-adapter.d.ts\nimport nodeEndpoint from 'comlink/dist/esm/node-adapter.mjs'\n\n/**\n * Fix Comlink.proxy() for Node.js worker_threads (issue #313).\n * The built-in proxy transfer handler uses browser MessageChannel.\n * This override uses Node's MessageChannel instead.\n *\n * Must be called on BOTH main thread and worker before any Comlink usage.\n */\nfunction installNodeProxyHandler() {\n Comlink.transferHandlers.set('proxy', {\n canHandle: (obj: unknown): obj is { [Comlink.proxyMarker]: true } =>\n (typeof obj === 'object' || typeof obj === 'function') && obj !== null && Comlink.proxyMarker in obj,\n serialize: (obj: unknown) => {\n const { port1, port2 } = new MessageChannel()\n Comlink.expose(obj, nodeEndpoint(port1))\n return [port2, [port2]]\n },\n deserialize: (port: MessagePort) => {\n port.start()\n return Comlink.wrap(nodeEndpoint(port))\n },\n })\n}\n\n// Install immediately on import\ninstallNodeProxyHandler()\n\nexport { Comlink, nodeEndpoint }\n"],"names":["Comlink","MessageChannel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAOA;;;;;;AAMG;AACH,SAAS,uBAAuB,GAAA;AAC9B,IAAAA,kBAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE;QACpC,SAAS,EAAE,CAAC,GAAY,KACtB,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,KAAK,GAAG,KAAK,IAAI,IAAIA,kBAAO,CAAC,WAAW,IAAI,GAAG;AACtG,QAAA,SAAS,EAAE,CAAC,GAAY,KAAI;YAC1B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAIC,kCAAc,EAAE;YAC7CD,kBAAO,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;AACxC,YAAA,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;AACD,QAAA,WAAW,EAAE,CAAC,IAAiB,KAAI;YACjC,IAAI,CAAC,KAAK,EAAE;YACZ,OAAOA,kBAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;AACF,KAAA,CAAC;AACJ;AAEA;AACA,uBAAuB,EAAE;;;;;"}
@@ -3,6 +3,7 @@
3
3
  var node_worker_threads = require('node:worker_threads');
4
4
  require('./comlink.setup.js');
5
5
  var comlink_pool = require('./comlink.pool.js');
6
+ var canvasHandlers = require('./canvas-handlers.js');
6
7
  var root_canvas = require('../canvas/root.canvas.js');
7
8
  var Comlink = require('comlink');
8
9
  var nodeEndpoint = require('comlink/dist/esm/node-adapter.mjs');
@@ -31,42 +32,18 @@ if (!node_worker_threads.parentPort) {
31
32
  }
32
33
  const canvases = new Map();
33
34
  let nextCanvasId = 0;
35
+ const handlers = canvasHandlers.createCanvasHandlers({
36
+ canvases,
37
+ getNextCanvasId: () => nextCanvasId++,
38
+ renderRoot: async (props) => new root_canvas.RootNode(props).render(),
39
+ });
34
40
  const api = {
35
41
  async render(props, callFn) {
36
42
  const resolved = callFn ? comlink_pool.restoreFunctions(props, callFn) : props;
37
- const canvas = await new root_canvas.RootNode(resolved).render();
38
- const canvasId = nextCanvasId++;
39
- canvases.set(canvasId, canvas);
40
- const result = {
41
- canvasId,
42
- buffer: canvas.toBufferSync('png'),
43
- width: canvas.width,
44
- height: canvas.height,
45
- };
46
- return result;
47
- },
48
- async callOnCanvas(canvasId, method, args) {
49
- const canvas = canvases.get(canvasId);
50
- if (!canvas) {
51
- throw new Error(`[render.worker] Canvas ${canvasId} not found`);
52
- }
53
- switch (method) {
54
- case 'toBuffer':
55
- return canvas.toBuffer(...args);
56
- case 'toURL':
57
- return canvas.toURL(...args);
58
- case 'toFile':
59
- await canvas.toFile(...args);
60
- return;
61
- case 'toSharp':
62
- return await canvas.toSharp(...args).toBuffer();
63
- default:
64
- throw new Error(`[render.worker] Unknown method: ${method}`);
65
- }
66
- },
67
- releaseCanvas(canvasId) {
68
- canvases.delete(canvasId);
43
+ return handlers.render(resolved);
69
44
  },
45
+ callOnCanvas: handlers.callOnCanvas.bind(handlers),
46
+ releaseCanvas: handlers.releaseCanvas.bind(handlers),
70
47
  };
71
48
  Comlink__namespace.expose(api, nodeEndpoint(node_worker_threads.parentPort));
72
49
  //# sourceMappingURL=render.worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.worker.js","sources":["../../../../src/worker/render.worker.ts"],"sourcesContent":["import { parentPort } from 'node:worker_threads'\nimport { Comlink, nodeEndpoint } from '@/worker/comlink.setup.js'\nimport { restoreFunctions } from '@/worker/comlink.pool.js'\nimport { RootNode } from '@/canvas/root.canvas.js'\nimport type { Canvas } from 'skia-canvas'\nimport type { WorkerAPI, RenderResult, CallFn } from '@/worker/worker.types.js'\n\nif (!parentPort) {\n throw new Error('[render.worker] Must be run as a worker thread')\n}\n\nconst canvases = new Map<number, Canvas>()\nlet nextCanvasId = 0\n\nconst api: WorkerAPI = {\n async render(props, callFn?: CallFn) {\n const resolved = callFn ? restoreFunctions(props, callFn) : props\n const canvas = await new RootNode(resolved).render()\n const canvasId = nextCanvasId++\n canvases.set(canvasId, canvas)\n const result: RenderResult = {\n canvasId,\n buffer: canvas.toBufferSync('png'),\n width: canvas.width,\n height: canvas.height,\n }\n return result\n },\n\n async callOnCanvas(canvasId, method, args) {\n const canvas = canvases.get(canvasId)\n if (!canvas) {\n throw new Error(`[render.worker] Canvas ${canvasId} not found`)\n }\n switch (method) {\n case 'toBuffer':\n return canvas.toBuffer(...(args as [any, any?]))\n case 'toURL':\n return canvas.toURL(...(args as [any, any?]))\n case 'toFile':\n await canvas.toFile(...(args as [string, any?]))\n return\n case 'toSharp':\n return await canvas.toSharp(...(args as [any?])).toBuffer()\n default:\n throw new Error(`[render.worker] Unknown method: ${method}`)\n }\n },\n\n releaseCanvas(canvasId) {\n canvases.delete(canvasId)\n },\n}\n\nComlink.expose(api, nodeEndpoint(parentPort))\n"],"names":["parentPort","restoreFunctions","RootNode","Comlink"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAI,CAACA,8BAAU,EAAE;AACf,IAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;AACnE;AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAC1C,IAAI,YAAY,GAAG,CAAC;AAEpB,MAAM,GAAG,GAAc;AACrB,IAAA,MAAM,MAAM,CAAC,KAAK,EAAE,MAAe,EAAA;AACjC,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAGC,6BAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK;QACjE,MAAM,MAAM,GAAG,MAAM,IAAIC,oBAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;AACpD,QAAA,MAAM,QAAQ,GAAG,YAAY,EAAE;AAC/B,QAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC9B,QAAA,MAAM,MAAM,GAAiB;YAC3B,QAAQ;AACR,YAAA,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;AACD,QAAA,OAAO,MAAM;IACf,CAAC;AAED,IAAA,MAAM,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAA;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAA,UAAA,CAAY,CAAC;QACjE;QACA,QAAQ,MAAM;AACZ,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAI,IAAoB,CAAC;AAClD,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,MAAM,CAAC,KAAK,CAAC,GAAI,IAAoB,CAAC;AAC/C,YAAA,KAAK,QAAQ;AACX,gBAAA,MAAM,MAAM,CAAC,MAAM,CAAC,GAAI,IAAuB,CAAC;gBAChD;AACF,YAAA,KAAK,SAAS;gBACZ,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,GAAI,IAAe,CAAC,CAAC,QAAQ,EAAE;AAC7D,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAA,CAAE,CAAC;;IAElE,CAAC;AAED,IAAA,aAAa,CAAC,QAAQ,EAAA;AACpB,QAAA,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC3B,CAAC;CACF;AAEDC,kBAAO,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAACH,8BAAU,CAAC,CAAC;;"}
1
+ {"version":3,"file":"render.worker.js","sources":["../../../../src/worker/render.worker.ts"],"sourcesContent":["import { parentPort } from 'node:worker_threads'\nimport { Comlink, nodeEndpoint } from '@/worker/comlink.setup.js'\nimport { restoreFunctions } from '@/worker/comlink.pool.js'\nimport { createCanvasHandlers } from '@/worker/canvas-handlers.js'\nimport { RootNode } from '@/canvas/root.canvas.js'\nimport type { Canvas } from 'skia-canvas'\nimport type { WorkerAPI, CallFn } from '@/worker/worker.types.js'\n\nif (!parentPort) {\n throw new Error('[render.worker] Must be run as a worker thread')\n}\n\nconst canvases = new Map<number, Canvas>()\nlet nextCanvasId = 0\n\nconst handlers = createCanvasHandlers({\n canvases,\n getNextCanvasId: () => nextCanvasId++,\n renderRoot: async props => new RootNode(props).render(),\n})\n\nconst api: WorkerAPI = {\n async render(props, callFn?: CallFn) {\n const resolved = callFn ? restoreFunctions(props, callFn) : props\n return handlers.render(resolved)\n },\n\n callOnCanvas: handlers.callOnCanvas.bind(handlers),\n releaseCanvas: handlers.releaseCanvas.bind(handlers),\n}\n\nComlink.expose(api, nodeEndpoint(parentPort))\n"],"names":["parentPort","createCanvasHandlers","RootNode","restoreFunctions","Comlink"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAI,CAACA,8BAAU,EAAE;AACf,IAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;AACnE;AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAC1C,IAAI,YAAY,GAAG,CAAC;AAEpB,MAAM,QAAQ,GAAGC,mCAAoB,CAAC;IACpC,QAAQ;AACR,IAAA,eAAe,EAAE,MAAM,YAAY,EAAE;AACrC,IAAA,UAAU,EAAE,OAAM,KAAK,KAAI,IAAIC,oBAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AACxD,CAAA,CAAC;AAEF,MAAM,GAAG,GAAc;AACrB,IAAA,MAAM,MAAM,CAAC,KAAK,EAAE,MAAe,EAAA;AACjC,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAGC,6BAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK;AACjE,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClD,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;CACrD;AAEDC,kBAAO,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAACJ,8BAAU,CAAC,CAAC;;"}
@@ -1,6 +1,6 @@
1
1
  import type { CanvasRenderingContext2D } from 'skia-canvas';
2
2
  import * as YogaTypes from 'yoga-layout';
3
- import type { BoxProps } from '../canvas/canvas.type.js';
3
+ import type { BoxProps } from './canvas.type.js';
4
4
  export declare const drawBorders: ({ ctx, node, x, y, width, height, radii, borderColor, borderStyle, }: {
5
5
  ctx: CanvasRenderingContext2D;
6
6
  node: YogaTypes.Node;
@@ -1,7 +1,7 @@
1
- import { BoxNode } from '../canvas/layout.canvas.js';
2
- import type { TextNode } from '../canvas/text.canvas.js';
3
- import type { ImageNode } from '../canvas/image.canvas.js';
4
- import type { GridNode } from '../canvas/grid.canvas.js';
1
+ import { BoxNode } from './layout.canvas.js';
2
+ import type { TextNode } from './text.canvas.js';
3
+ import type { ImageNode } from './image.canvas.js';
4
+ import type { GridNode } from './grid.canvas.js';
5
5
  import type { FontVariantSetting } from 'skia-canvas';
6
6
  import * as Style from '../constant/common.const.js';
7
7
  export interface BaseProps {
@@ -546,6 +546,11 @@ export interface RootProps extends BoxProps {
546
546
  * @default false
547
547
  */
548
548
  useDiskCache?: boolean;
549
+ /**
550
+ * Maximum number of images to fetch concurrently during render.
551
+ * @default 5
552
+ */
553
+ imageConcurrency?: number;
549
554
  /**
550
555
  * Enable worker thread rendering for non-blocking operation.
551
556
  * Worker mode renders in a separate thread to avoid blocking the event loop.
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.type.d.ts","sourceRoot":"","sources":["../../../src/canvas/canvas.type.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas.type.d.ts","sourceRoot":"","sources":["../../../src/canvas/canvas.type.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { BoxNode } from '../canvas/layout.canvas.js';
2
- import type { BaseProps, ChartProps, ChartType, CanvasElement } from '../canvas/canvas.type.js';
1
+ import { BoxNode } from './layout.canvas.js';
2
+ import type { BaseProps, ChartProps, ChartType, CanvasElement } from './canvas.type.js';
3
3
  import type { CanvasRenderingContext2D } from 'skia-canvas';
4
4
  export declare class ChartNode<T extends ChartType> extends BoxNode {
5
5
  private chartData;
@@ -17,5 +17,9 @@ export declare class ChartNode<T extends ChartType> extends BoxNode {
17
17
  private renderLegend;
18
18
  private generateColor;
19
19
  }
20
- export declare const Chart: <T extends ChartType>(props: ChartProps<T> & BaseProps) => CanvasElement;
20
+ type ChartElement = Extract<CanvasElement, {
21
+ __type: 'Chart';
22
+ }>;
23
+ export declare const Chart: <T extends ChartType>(props: ChartProps<T> & BaseProps) => ChartElement;
24
+ export {};
21
25
  //# sourceMappingURL=chart.canvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart.canvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/chart.canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,MAAM,2BAA2B,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAoC,UAAU,EAAE,SAAS,EAAqB,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAI3D,qBAAa,SAAS,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,OAAO;IACzD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA0B;gBAElC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS;IAyB5C,OAAO,CAAC,aAAa;cAqBL,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA8BjH,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,eAAe;YAqGT,cAAc;YA+Id,eAAe;YAiIf,cAAc;YAsEd,mBAAmB;YAsEnB,YAAY;IAmI1B,OAAO,CAAC,aAAa;CAItB;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,SAAS,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAG,aAG5E,CAAA"}
1
+ {"version":3,"file":"chart.canvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/chart.canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,MAAM,2BAA2B,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAoC,UAAU,EAAE,SAAS,EAAqB,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAI3D,qBAAa,SAAS,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,OAAO;IACzD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA0B;gBAElC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS;IAyB5C,OAAO,CAAC,aAAa;cAqBL,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA8BjH,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,eAAe;YAqGT,cAAc;YA+Id,eAAe;YAiIf,cAAc;YAsEd,mBAAmB;YAsEnB,YAAY;IAiI1B,OAAO,CAAC,aAAa;CAItB;AAED,KAAK,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAE/D,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,SAAS,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,KAAG,YAG5E,CAAA"}
@@ -595,7 +595,7 @@ class ChartNode extends BoxNode {
595
595
  if (!this.chartData)
596
596
  return;
597
597
  const legendItems = 'datasets' in this.chartData
598
- ? this.chartData.datasets.map(d => ({ label: d.label, value: d.data.reduce((a, b) => a + b, 0) }))
598
+ ? this.chartData.datasets.map(d => ({ label: d.label, value: d.data.reduce((a, b) => a + b, 0), color: d.color }))
599
599
  : this.chartData;
600
600
  const fontSize = this.chartOptions?.labelFontSize || 12;
601
601
  ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`;
@@ -609,7 +609,7 @@ class ChartNode extends BoxNode {
609
609
  const rows = [];
610
610
  let currentRow = { items: [], width: 0 };
611
611
  legendItems.forEach((point, index) => {
612
- const color = ('datasets' in this.chartData ? this.chartData.datasets[index].color : point.color) || this.generateColor(index);
612
+ const color = point.color || this.generateColor(index);
613
613
  const label = 'datasets' in this.chartData ? point.label : `${point.label} (${point.value})`;
614
614
  const labelWidth = ctx.measureText(label).width;
615
615
  const itemWidth = boxSize + 5 + labelWidth;
@@ -648,8 +648,7 @@ class ChartNode extends BoxNode {
648
648
  const itemX = x + 10;
649
649
  const itemY = startY + index * itemHeight;
650
650
  const boxY = itemY + (itemHeight - boxSize) / 2;
651
- ctx.fillStyle =
652
- ('datasets' in this.chartData ? this.chartData.datasets[index].color : point.color) || this.generateColor(index);
651
+ ctx.fillStyle = point.color || this.generateColor(index);
653
652
  ctx.fillRect(itemX, boxY, boxSize, boxSize);
654
653
  const label = 'datasets' in this.chartData ? point.label : `${point.label} (${point.value})`;
655
654
  TextNode.renderSimpleText(ctx, label, itemX + boxSize + 5, itemY + itemHeight / 2, {
@@ -1,5 +1,5 @@
1
- import type { GridProps, GridItemProps, CanvasElement } from '../canvas/canvas.type.js';
2
- import { BoxNode, RowNode } from '../canvas/layout.canvas.js';
1
+ import type { GridProps, GridItemProps, CanvasElement } from './canvas.type.js';
2
+ import { BoxNode, RowNode } from './layout.canvas.js';
3
3
  /**
4
4
  * GridItem Node. Theoretically just a BoxNode but typed differently in factory.
5
5
  * In runtime, it behaves almost like a BoxNode, but we can detect it if needed,
@@ -1 +1 @@
1
- {"version":3,"file":"grid.canvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/grid.canvas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAErG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAU5D;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,OAAO;gBAC3B,KAAK,EAAE,aAAa;CAMjC;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,uBAAuB,aAAa,KAAG,aAI9D,CAAA;AAEF;;;GAGG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC;;;OAGG;gBACS,KAAK,EAAE,SAAS;IAQ5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;cACgB,+BAA+B;IAoTlD;;OAEG;IACH,OAAO,CAAC,aAAa;CAkCtB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,GAAI,uBAAuB,SAAS,KAAG,aAItD,CAAA"}
1
+ {"version":3,"file":"grid.canvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/grid.canvas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACrG,OAAO,EAAE,OAAO,EAA+B,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAIzF;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,OAAO;gBAC3B,KAAK,EAAE,aAAa;CAMjC;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,uBAAuB,aAAa,KAAG,aAI9D,CAAA;AAEF;;;GAGG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC;;;OAGG;gBACS,KAAK,EAAE,SAAS;IAQ5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;cACgB,+BAA+B;IAkTlD;;OAEG;IACH,OAAO,CAAC,aAAa;CAkCtB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,GAAI,uBAAuB,SAAS,KAAG,aAItD,CAAA"}
@@ -1,13 +1,7 @@
1
- import { BoxNode, RowNode } from './layout.canvas.js';
1
+ import { normalizeDescriptorChildren, BoxNode, RowNode } from './layout.canvas.js';
2
2
  import { Style } from '../constant/common.const.js';
3
3
  import { parsePercentage } from './canvas.helper.js';
4
4
 
5
- function normalizeDescriptorChildren(children) {
6
- if (children === undefined || children === null || children === false)
7
- return undefined;
8
- const arr = (Array.isArray(children) ? children : [children]).filter(Boolean);
9
- return arr.length > 0 ? arr : undefined;
10
- }
11
5
  /**
12
6
  * GridItem Node. Theoretically just a BoxNode but typed differently in factory.
13
7
  * In runtime, it behaves almost like a BoxNode, but we can detect it if needed,
@@ -186,7 +180,6 @@ class GridNode extends RowNode {
186
180
  if (parts[1].startsWith('span')) {
187
181
  const span = parseInt(parts[1].replace('span', '')) || 1;
188
182
  if (colStart !== undefined) {
189
- colEnd = colStart + span;
190
183
  colSpan = span;
191
184
  }
192
185
  else {
@@ -216,7 +209,6 @@ class GridNode extends RowNode {
216
209
  if (parts[1].startsWith('span')) {
217
210
  const span = parseInt(parts[1].replace('span', '')) || 1;
218
211
  if (rowStart !== undefined) {
219
- rowEnd = rowStart + span;
220
212
  rowSpan = span;
221
213
  }
222
214
  else {
@@ -1,6 +1,6 @@
1
- import type { BaseProps, ImageProps, CanvasElement } from '../canvas/canvas.type.js';
1
+ import type { BaseProps, ImageProps, CanvasElement } from './canvas.type.js';
2
2
  import { type CanvasRenderingContext2D, Image as CanvasImage } from 'skia-canvas';
3
- import { BoxNode } from '../canvas/layout.canvas.js';
3
+ import { BoxNode } from './layout.canvas.js';
4
4
  /**
5
5
  * Per-render image cache — keyed by `src|color` for string sources.
6
6
  * Scoped to a single RootNode.render() call; discarded after rendering.
@@ -55,8 +55,8 @@ class ImageNode extends BoxNode {
55
55
  */
56
56
  async _fetchCanvasImage(diskCacheKey, diskCacheKeys) {
57
57
  const { fileTypeFromBuffer, fileTypeFromFile } = await import('file-type');
58
- let finalSource = this.props.src;
59
- let isSvg = false;
58
+ let finalSource;
59
+ let isSvg;
60
60
  let contentBuffer = null;
61
61
  let detectedMime;
62
62
  if (typeof this.props.src === 'string') {
@@ -1,5 +1,5 @@
1
1
  import { type CanvasRenderingContext2D } from 'skia-canvas';
2
- import type { BaseProps, BoxProps, CanvasElement } from '../canvas/canvas.type.js';
2
+ import type { BaseProps, BoxProps, CanvasElement } from './canvas.type.js';
3
3
  import { Node } from '../constant/common.const.js';
4
4
  /**
5
5
  * @class BoxNode
@@ -87,6 +87,10 @@ export declare class BoxNode {
87
87
  */
88
88
  protected _renderContent(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number): Promise<void>;
89
89
  }
90
+ /**
91
+ * Normalizes children into a flat CanvasElement array, filtering falsy values.
92
+ */
93
+ export declare function normalizeDescriptorChildren(children: BoxProps['children']): CanvasElement[] | undefined;
90
94
  /**
91
95
  * Creates a new BoxNode instance.
92
96
  * @param {BoxProps} props Box properties and configuration.
@@ -1 +1 @@
1
- {"version":3,"file":"layout.canvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/layout.canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAkB,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAGjG,OAAa,EAAS,IAAI,EAAE,MAAM,4BAA4B,CAAA;AAE9D;;;;GAIG;AACH,qBAAa,OAAO;IAClB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE/B;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAA;IAEnB;;OAEG;IACH,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;IAE3B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IAEtB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;OAGG;gBACS,KAAK,GAAE,QAAQ,GAAG,SAAc;IAqB5C;;OAEG;IACI,sBAAsB;IAW7B;;;OAGG;IACH,SAAS,CAAC,sBAAsB,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS;IAqClE;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,IAAI;IAI/B;;;;OAIG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IAanD;;;OAGG;IACI,cAAc,IAAI,OAAO;IAiBhC;;OAEG;IACH,SAAS,CAAC,+BAA+B;IAIzC;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ;IAyInC;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,OAAO,GAAE,MAAU,EAAE,OAAO,GAAE,MAAU;IA+JpF;;;;;;;;OAQG;cACa,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAoRlH;AAWD;;;;GAIG;AACH,eAAO,MAAM,GAAG,GAAI,uBAAuB,QAAQ,KAAG,aAIpD,CAAA;AAEF;;;GAGG;AACH,qBAAa,UAAW,SAAQ,OAAO;gBACzB,KAAK,GAAE,QAAQ,GAAG,SAAc;CAS7C;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,uBAAuB,QAAQ,KAAG,aAIvD,CAAA;AAEF;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,OAAO;gBACtB,KAAK,GAAE,QAAQ,GAAG,SAAc;CAS7C;AAED;;;;GAIG;AACH,eAAO,MAAM,GAAG,GAAI,uBAAuB,QAAQ,KAAG,aAIpD,CAAA"}
1
+ {"version":3,"file":"layout.canvas.d.ts","sourceRoot":"","sources":["../../../src/canvas/layout.canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAkB,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACjG,OAAa,EAAS,IAAI,EAAE,MAAM,4BAA4B,CAAA;AAI9D;;;;GAIG;AACH,qBAAa,OAAO;IAClB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE/B;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAA;IAEnB;;OAEG;IACH,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;IAE3B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IAEtB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;OAGG;gBACS,KAAK,GAAE,QAAQ,GAAG,SAAc;IAqB5C;;OAEG;IACI,sBAAsB;IAW7B;;;OAGG;IACH,SAAS,CAAC,sBAAsB,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS;IAqClE;;OAEG;IACH,SAAS,CAAC,aAAa,IAAI,IAAI;IAI/B;;;;OAIG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IAcnD;;;OAGG;IACI,cAAc,IAAI,OAAO;IAiBhC;;OAEG;IACH,SAAS,CAAC,+BAA+B;IAIzC;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ;IAyGnC;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,OAAO,GAAE,MAAU,EAAE,OAAO,GAAE,MAAU;IA+JpF;;;;;;;;OAQG;cACa,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAmRlH;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,aAAa,EAAE,GAAG,SAAS,CAIvG;AAwDD;;;;GAIG;AACH,eAAO,MAAM,GAAG,GAAI,uBAAuB,QAAQ,KAAG,aAIpD,CAAA;AAEF;;;GAGG;AACH,qBAAa,UAAW,SAAQ,OAAO;gBACzB,KAAK,GAAE,QAAQ,GAAG,SAAc;CAS7C;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,uBAAuB,QAAQ,KAAG,aAIvD,CAAA;AAEF;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,OAAO;gBACtB,KAAK,GAAE,QAAQ,GAAG,SAAc;CAS7C;AAED;;;;GAIG;AACH,eAAO,MAAM,GAAG,GAAI,uBAAuB,QAAQ,KAAG,aAIpD,CAAA"}