@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.
- package/CONTRIBUTING.md +11 -9
- package/README.md +9 -21
- package/dist/cjs/canvas/canvas.helper.d.ts +1 -1
- package/dist/cjs/canvas/canvas.type.d.ts +9 -4
- package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
- package/dist/cjs/canvas/chart.canvas.d.ts +7 -3
- package/dist/cjs/canvas/chart.canvas.d.ts.map +1 -1
- package/dist/cjs/canvas/chart.canvas.js +3 -4
- package/dist/cjs/canvas/chart.canvas.js.map +1 -1
- package/dist/cjs/canvas/grid.canvas.d.ts +2 -2
- package/dist/cjs/canvas/grid.canvas.d.ts.map +1 -1
- package/dist/cjs/canvas/grid.canvas.js +2 -10
- package/dist/cjs/canvas/grid.canvas.js.map +1 -1
- package/dist/cjs/canvas/image.canvas.d.ts +2 -2
- package/dist/cjs/canvas/image.canvas.js +2 -2
- package/dist/cjs/canvas/image.canvas.js.map +1 -1
- package/dist/cjs/canvas/layout.canvas.d.ts +5 -1
- package/dist/cjs/canvas/layout.canvas.d.ts.map +1 -1
- package/dist/cjs/canvas/layout.canvas.js +59 -68
- package/dist/cjs/canvas/layout.canvas.js.map +1 -1
- package/dist/cjs/canvas/root.canvas.d.ts +9 -16
- package/dist/cjs/canvas/root.canvas.d.ts.map +1 -1
- package/dist/cjs/canvas/root.canvas.js +56 -43
- package/dist/cjs/canvas/root.canvas.js.map +1 -1
- package/dist/cjs/canvas/text.canvas.d.ts +7 -3
- package/dist/cjs/canvas/text.canvas.d.ts.map +1 -1
- package/dist/cjs/canvas/text.canvas.js +25 -85
- package/dist/cjs/canvas/text.canvas.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/util/disk.cache.d.ts +5 -0
- package/dist/cjs/util/disk.cache.d.ts.map +1 -1
- package/dist/cjs/util/disk.cache.js +51 -24
- package/dist/cjs/util/disk.cache.js.map +1 -1
- package/dist/cjs/worker/canvas-handlers.d.ts +14 -0
- package/dist/cjs/worker/canvas-handlers.d.ts.map +1 -0
- package/dist/cjs/worker/canvas-handlers.js +42 -0
- package/dist/cjs/worker/canvas-handlers.js.map +1 -0
- package/dist/cjs/worker/comlink.pool.d.ts +1 -1
- package/dist/cjs/worker/comlink.pool.d.ts.map +1 -1
- package/dist/cjs/worker/comlink.pool.js +3 -0
- package/dist/cjs/worker/comlink.pool.js.map +1 -1
- package/dist/cjs/worker/comlink.setup.d.ts.map +1 -1
- package/dist/cjs/worker/comlink.setup.js +1 -1
- package/dist/cjs/worker/comlink.setup.js.map +1 -1
- package/dist/cjs/worker/render.worker.js +9 -32
- package/dist/cjs/worker/render.worker.js.map +1 -1
- package/dist/esm/canvas/canvas.helper.d.ts +1 -1
- package/dist/esm/canvas/canvas.type.d.ts +9 -4
- package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
- package/dist/esm/canvas/chart.canvas.d.ts +7 -3
- package/dist/esm/canvas/chart.canvas.d.ts.map +1 -1
- package/dist/esm/canvas/chart.canvas.js +3 -4
- package/dist/esm/canvas/grid.canvas.d.ts +2 -2
- package/dist/esm/canvas/grid.canvas.d.ts.map +1 -1
- package/dist/esm/canvas/grid.canvas.js +1 -9
- package/dist/esm/canvas/image.canvas.d.ts +2 -2
- package/dist/esm/canvas/image.canvas.js +2 -2
- package/dist/esm/canvas/layout.canvas.d.ts +5 -1
- package/dist/esm/canvas/layout.canvas.d.ts.map +1 -1
- package/dist/esm/canvas/layout.canvas.js +59 -69
- package/dist/esm/canvas/root.canvas.d.ts +9 -16
- package/dist/esm/canvas/root.canvas.d.ts.map +1 -1
- package/dist/esm/canvas/root.canvas.js +57 -43
- package/dist/esm/canvas/text.canvas.d.ts +7 -3
- package/dist/esm/canvas/text.canvas.d.ts.map +1 -1
- package/dist/esm/canvas/text.canvas.js +25 -85
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/util/disk.cache.d.ts +5 -0
- package/dist/esm/util/disk.cache.d.ts.map +1 -1
- package/dist/esm/util/disk.cache.js +51 -25
- package/dist/esm/worker/canvas-handlers.d.ts +14 -0
- package/dist/esm/worker/canvas-handlers.d.ts.map +1 -0
- package/dist/esm/worker/canvas-handlers.js +39 -0
- package/dist/esm/worker/comlink.pool.d.ts +1 -1
- package/dist/esm/worker/comlink.pool.d.ts.map +1 -1
- package/dist/esm/worker/comlink.pool.js +3 -0
- package/dist/esm/worker/comlink.setup.d.ts.map +1 -1
- package/dist/esm/worker/comlink.setup.js +1 -1
- package/dist/esm/worker/render.worker.js +9 -32
- package/package.json +17 -21
|
@@ -2,12 +2,20 @@ import { createHash } from 'crypto';
|
|
|
2
2
|
import { promises } from 'fs';
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
let _cacheDir = join(process.cwd(), '.cache', 'files');
|
|
6
6
|
let _dirEnsured = false;
|
|
7
|
+
/**
|
|
8
|
+
* Override the default disk cache directory.
|
|
9
|
+
* Must be called before any cache read/write operations.
|
|
10
|
+
*/
|
|
11
|
+
function setDiskCacheDir(dir) {
|
|
12
|
+
_cacheDir = dir;
|
|
13
|
+
_dirEnsured = false;
|
|
14
|
+
}
|
|
7
15
|
async function ensureDir() {
|
|
8
16
|
if (_dirEnsured)
|
|
9
17
|
return;
|
|
10
|
-
await promises.mkdir(
|
|
18
|
+
await promises.mkdir(_cacheDir, { recursive: true });
|
|
11
19
|
_dirEnsured = true;
|
|
12
20
|
}
|
|
13
21
|
function hashBuffer(buf) {
|
|
@@ -16,7 +24,7 @@ function hashBuffer(buf) {
|
|
|
16
24
|
async function readDiskCache(key) {
|
|
17
25
|
try {
|
|
18
26
|
await ensureDir();
|
|
19
|
-
return await promises.readFile(join(
|
|
27
|
+
return await promises.readFile(join(_cacheDir, key));
|
|
20
28
|
}
|
|
21
29
|
catch {
|
|
22
30
|
return null;
|
|
@@ -25,7 +33,7 @@ async function readDiskCache(key) {
|
|
|
25
33
|
async function writeDiskCache(key, data) {
|
|
26
34
|
try {
|
|
27
35
|
await ensureDir();
|
|
28
|
-
await promises.writeFile(join(
|
|
36
|
+
await promises.writeFile(join(_cacheDir, key), data);
|
|
29
37
|
}
|
|
30
38
|
catch {
|
|
31
39
|
// best-effort — cache write failures are non-fatal
|
|
@@ -33,10 +41,13 @@ async function writeDiskCache(key, data) {
|
|
|
33
41
|
}
|
|
34
42
|
async function deleteDiskCache(key) {
|
|
35
43
|
try {
|
|
36
|
-
await promises.unlink(join(
|
|
44
|
+
await promises.unlink(join(_cacheDir, key));
|
|
37
45
|
}
|
|
38
|
-
catch {
|
|
46
|
+
catch (err) {
|
|
39
47
|
// non-fatal — file may not exist if write failed earlier
|
|
48
|
+
if (err.code !== 'ENOENT') {
|
|
49
|
+
console.warn(`[disk.cache] Failed to delete cache entry "${key}":`, err.message);
|
|
50
|
+
}
|
|
40
51
|
}
|
|
41
52
|
}
|
|
42
53
|
/**
|
|
@@ -46,27 +57,42 @@ async function deleteDiskCache(key) {
|
|
|
46
57
|
async function clearDiskCache() {
|
|
47
58
|
_dirEnsured = false;
|
|
48
59
|
try {
|
|
49
|
-
await promises.rm(
|
|
60
|
+
await promises.rm(_cacheDir, { recursive: true, force: true });
|
|
50
61
|
}
|
|
51
|
-
catch {
|
|
62
|
+
catch (err) {
|
|
52
63
|
// non-fatal — directory may not exist
|
|
64
|
+
if (err.code !== 'ENOENT') {
|
|
65
|
+
console.warn('[disk.cache] Failed to clear cache directory:', err.message);
|
|
66
|
+
}
|
|
53
67
|
}
|
|
54
68
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
const globalForExit = globalThis;
|
|
70
|
+
function registerExitListeners() {
|
|
71
|
+
const prev = globalForExit.__diskCacheExit;
|
|
72
|
+
const lifecycle = prev?.lifecycle ?? { cleanupStarted: false };
|
|
73
|
+
if (prev) {
|
|
74
|
+
process.removeListener('beforeExit', prev.onBeforeExit);
|
|
75
|
+
process.removeListener('SIGINT', prev.onSignals);
|
|
76
|
+
process.removeListener('SIGTERM', prev.onSignals);
|
|
77
|
+
}
|
|
78
|
+
const onBeforeExit = () => {
|
|
79
|
+
if (lifecycle.cleanupStarted)
|
|
80
|
+
return;
|
|
81
|
+
lifecycle.cleanupStarted = true;
|
|
82
|
+
void clearDiskCache();
|
|
83
|
+
};
|
|
84
|
+
const onSignals = () => {
|
|
85
|
+
clearDiskCache().finally(() => process.exit(0));
|
|
86
|
+
};
|
|
87
|
+
globalForExit.__diskCacheExit = {
|
|
88
|
+
lifecycle,
|
|
89
|
+
onBeforeExit,
|
|
90
|
+
onSignals,
|
|
91
|
+
};
|
|
92
|
+
process.on('beforeExit', onBeforeExit);
|
|
93
|
+
process.on('SIGINT', onSignals);
|
|
94
|
+
process.on('SIGTERM', onSignals);
|
|
95
|
+
}
|
|
96
|
+
registerExitListeners();
|
|
71
97
|
|
|
72
|
-
export { clearDiskCache, deleteDiskCache, hashBuffer, readDiskCache, writeDiskCache };
|
|
98
|
+
export { clearDiskCache, deleteDiskCache, hashBuffer, readDiskCache, setDiskCacheDir, writeDiskCache };
|
|
@@ -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,39 @@
|
|
|
1
|
+
function createCanvasHandlers(deps) {
|
|
2
|
+
return {
|
|
3
|
+
async render(props) {
|
|
4
|
+
const canvas = await deps.renderRoot(props);
|
|
5
|
+
const canvasId = deps.getNextCanvasId();
|
|
6
|
+
deps.canvases.set(canvasId, canvas);
|
|
7
|
+
return {
|
|
8
|
+
canvasId,
|
|
9
|
+
buffer: canvas.toBufferSync('png'),
|
|
10
|
+
width: canvas.width,
|
|
11
|
+
height: canvas.height,
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
async callOnCanvas(canvasId, method, args) {
|
|
15
|
+
const canvas = deps.canvases.get(canvasId);
|
|
16
|
+
if (!canvas) {
|
|
17
|
+
throw new Error(`[render.worker] Canvas ${canvasId} not found`);
|
|
18
|
+
}
|
|
19
|
+
switch (method) {
|
|
20
|
+
case 'toBuffer':
|
|
21
|
+
return canvas.toBuffer(...args);
|
|
22
|
+
case 'toURL':
|
|
23
|
+
return canvas.toURL(...args);
|
|
24
|
+
case 'toFile':
|
|
25
|
+
await canvas.toFile(...args);
|
|
26
|
+
return;
|
|
27
|
+
case 'toSharp':
|
|
28
|
+
return await canvas.toSharp(...args).toBuffer();
|
|
29
|
+
default:
|
|
30
|
+
throw new Error(`[render.worker] Unknown method: ${method}`);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
releaseCanvas(canvasId) {
|
|
34
|
+
deps.canvases.delete(canvasId);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { createCanvasHandlers };
|
|
@@ -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;
|
|
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"}
|
|
@@ -114,6 +114,9 @@ class ComlinkPool {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
async render(props) {
|
|
117
|
+
if (this.endpoints.length === 0) {
|
|
118
|
+
throw new Error('[ComlinkPool] Pool has been terminated');
|
|
119
|
+
}
|
|
117
120
|
// Extract functions from props, replacing them with serializable sentinels.
|
|
118
121
|
// A single Comlink.proxy() callback is created at the top level so Comlink
|
|
119
122
|
// can correctly transfer it via its proxy transfer handler.
|
|
@@ -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;
|
|
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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parentPort } from 'node:worker_threads';
|
|
2
2
|
import './comlink.setup.js';
|
|
3
3
|
import { restoreFunctions } from './comlink.pool.js';
|
|
4
|
+
import { createCanvasHandlers } from './canvas-handlers.js';
|
|
4
5
|
import { RootNode } from '../canvas/root.canvas.js';
|
|
5
6
|
import * as Comlink from 'comlink';
|
|
6
7
|
import nodeEndpoint from 'comlink/dist/esm/node-adapter.mjs';
|
|
@@ -10,41 +11,17 @@ if (!parentPort) {
|
|
|
10
11
|
}
|
|
11
12
|
const canvases = new Map();
|
|
12
13
|
let nextCanvasId = 0;
|
|
14
|
+
const handlers = createCanvasHandlers({
|
|
15
|
+
canvases,
|
|
16
|
+
getNextCanvasId: () => nextCanvasId++,
|
|
17
|
+
renderRoot: async (props) => new RootNode(props).render(),
|
|
18
|
+
});
|
|
13
19
|
const api = {
|
|
14
20
|
async render(props, callFn) {
|
|
15
21
|
const resolved = callFn ? restoreFunctions(props, callFn) : props;
|
|
16
|
-
|
|
17
|
-
const canvasId = nextCanvasId++;
|
|
18
|
-
canvases.set(canvasId, canvas);
|
|
19
|
-
const result = {
|
|
20
|
-
canvasId,
|
|
21
|
-
buffer: canvas.toBufferSync('png'),
|
|
22
|
-
width: canvas.width,
|
|
23
|
-
height: canvas.height,
|
|
24
|
-
};
|
|
25
|
-
return result;
|
|
26
|
-
},
|
|
27
|
-
async callOnCanvas(canvasId, method, args) {
|
|
28
|
-
const canvas = canvases.get(canvasId);
|
|
29
|
-
if (!canvas) {
|
|
30
|
-
throw new Error(`[render.worker] Canvas ${canvasId} not found`);
|
|
31
|
-
}
|
|
32
|
-
switch (method) {
|
|
33
|
-
case 'toBuffer':
|
|
34
|
-
return canvas.toBuffer(...args);
|
|
35
|
-
case 'toURL':
|
|
36
|
-
return canvas.toURL(...args);
|
|
37
|
-
case 'toFile':
|
|
38
|
-
await canvas.toFile(...args);
|
|
39
|
-
return;
|
|
40
|
-
case 'toSharp':
|
|
41
|
-
return await canvas.toSharp(...args).toBuffer();
|
|
42
|
-
default:
|
|
43
|
-
throw new Error(`[render.worker] Unknown method: ${method}`);
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
releaseCanvas(canvasId) {
|
|
47
|
-
canvases.delete(canvasId);
|
|
22
|
+
return handlers.render(resolved);
|
|
48
23
|
},
|
|
24
|
+
callOnCanvas: handlers.callOnCanvas.bind(handlers),
|
|
25
|
+
releaseCanvas: handlers.releaseCanvas.bind(handlers),
|
|
49
26
|
};
|
|
50
27
|
Comlink.expose(api, nodeEndpoint(parentPort));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meonode/canvas",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "A declarative, component-based library for server-side canvas image generation. Write complex visuals with simple functions, similar to the composition style of @meonode/ui.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"canvas",
|
|
@@ -37,17 +37,19 @@
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
|
-
"build": "
|
|
41
|
-
"test": "
|
|
42
|
-
"
|
|
40
|
+
"build": "bun -e \"fs.rmSync('./dist', {recursive:true, force:true})\" && rollup -c --bundleConfigAsCjs && bun scripts/rewrite-dts-aliases.ts",
|
|
41
|
+
"test": "vitest run --coverage",
|
|
42
|
+
"test:ci": "node ./node_modules/vitest/vitest.mjs run --coverage",
|
|
43
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"lint": "eslint . --ext .ts,.tsx,.js,.jsx,.mjs --fix && bun run typecheck",
|
|
43
46
|
"format": "prettier --write .",
|
|
44
47
|
"generate:samples": "npx tsx scripts/generate_sample_charts.ts && npx tsx scripts/generate_sample_grids.ts && npx tsx scripts/generate_sample_nested_grids.ts",
|
|
45
48
|
"check:memory": "npx tsx --expose-gc scripts/check_memory.ts",
|
|
46
49
|
"prepare": "husky"
|
|
47
50
|
},
|
|
48
51
|
"devDependencies": {
|
|
49
|
-
"@eslint/js": "^
|
|
50
|
-
"@jest/globals": "^30.3.0",
|
|
52
|
+
"@eslint/js": "^10.0.1",
|
|
51
53
|
"@rollup/plugin-commonjs": "^29.0.2",
|
|
52
54
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
53
55
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
@@ -56,37 +58,31 @@
|
|
|
56
58
|
"@semantic-release/gitlab": "^13.3.2",
|
|
57
59
|
"@semantic-release/npm": "^13.1.5",
|
|
58
60
|
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
59
|
-
"@types/jest": "^30.0.0",
|
|
60
|
-
"@types/lodash-es": "^4.17.12",
|
|
61
61
|
"@types/node": "^25.5.0",
|
|
62
|
-
"@types/
|
|
63
|
-
"@types/tinycolor2": "^1.4.6",
|
|
62
|
+
"@types/pngjs": "^6.0.5",
|
|
64
63
|
"@typescript-eslint/eslint-plugin": "^8.57.2",
|
|
65
64
|
"@typescript-eslint/parser": "^8.57.2",
|
|
66
|
-
"
|
|
65
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
66
|
+
"eslint": "^10.4.0",
|
|
67
67
|
"eslint-config-prettier": "^10.1.8",
|
|
68
|
-
"eslint-plugin-jsdoc": "^
|
|
68
|
+
"eslint-plugin-jsdoc": "^63.0.0",
|
|
69
69
|
"eslint-plugin-prettier": "^5.5.5",
|
|
70
70
|
"eslint-plugin-unused-imports": "^4.4.1",
|
|
71
71
|
"husky": "^9.1.7",
|
|
72
|
-
"
|
|
72
|
+
"pixelmatch": "^7.2.0",
|
|
73
|
+
"pngjs": "^7.0.0",
|
|
73
74
|
"prettier": "^3.8.1",
|
|
74
75
|
"rollup": "^4.60.0",
|
|
75
76
|
"rollup-plugin-tsconfig-paths": "^1.5.2",
|
|
76
|
-
"semantic-release": "
|
|
77
|
-
"ts-jest": "^29.4.6",
|
|
78
|
-
"tsc-alias": "^1.8.16",
|
|
77
|
+
"semantic-release": "25.0.3",
|
|
79
78
|
"typescript": "^6.0.2",
|
|
80
|
-
"typescript-eslint": "^8.57.2"
|
|
79
|
+
"typescript-eslint": "^8.57.2",
|
|
80
|
+
"vitest": "^4.1.7"
|
|
81
81
|
},
|
|
82
|
-
"packageManager": "yarn@4.11.0",
|
|
83
82
|
"dependencies": {
|
|
84
83
|
"comlink": "^4.4.2",
|
|
85
84
|
"file-type": "^22.0.0",
|
|
86
|
-
"lodash-es": "^4.17.23",
|
|
87
|
-
"sharp": "^0.34.5",
|
|
88
85
|
"skia-canvas": "^3.0.8",
|
|
89
|
-
"tinycolor2": "^1.6.0",
|
|
90
86
|
"tslib": "^2.8.1",
|
|
91
87
|
"yoga-layout": "^3.2.1"
|
|
92
88
|
},
|