@meonode/canvas 1.5.6 → 1.6.0-beta.2
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/dist/cjs/canvas/canvas.type.d.ts +34 -1
- package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
- package/dist/cjs/canvas/chart.canvas.util.d.ts +2 -2
- package/dist/cjs/canvas/chart.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/chart.canvas.util.js +5 -2
- package/dist/cjs/canvas/chart.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/grid.canvas.util.d.ts +3 -3
- package/dist/cjs/canvas/grid.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/grid.canvas.util.js +34 -1
- package/dist/cjs/canvas/grid.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/image.canvas.util.d.ts +16 -8
- package/dist/cjs/canvas/image.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/image.canvas.util.js +82 -72
- package/dist/cjs/canvas/image.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/layout.canvas.util.d.ts +4 -4
- package/dist/cjs/canvas/layout.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/layout.canvas.util.js +24 -3
- package/dist/cjs/canvas/layout.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/root.canvas.util.d.ts +23 -4
- package/dist/cjs/canvas/root.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/root.canvas.util.js +228 -5
- package/dist/cjs/canvas/root.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/text.canvas.util.d.ts +2 -2
- package/dist/cjs/canvas/text.canvas.util.d.ts.map +1 -1
- package/dist/cjs/canvas/text.canvas.util.js +5 -1
- package/dist/cjs/canvas/text.canvas.util.js.map +1 -1
- package/dist/cjs/canvas/worker.types.d.ts +76 -0
- package/dist/cjs/canvas/worker.types.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/render.worker.d.ts +2 -0
- package/dist/cjs/render.worker.d.ts.map +1 -0
- package/dist/cjs/render.worker.js +73 -0
- package/dist/cjs/render.worker.js.map +1 -0
- package/dist/esm/canvas/canvas.type.d.ts +34 -1
- package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
- package/dist/esm/canvas/chart.canvas.util.d.ts +2 -2
- package/dist/esm/canvas/chart.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/chart.canvas.util.js +6 -3
- package/dist/esm/canvas/grid.canvas.util.d.ts +3 -3
- package/dist/esm/canvas/grid.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/grid.canvas.util.js +34 -3
- package/dist/esm/canvas/image.canvas.util.d.ts +16 -8
- package/dist/esm/canvas/image.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/image.canvas.util.js +82 -72
- package/dist/esm/canvas/layout.canvas.util.d.ts +4 -4
- package/dist/esm/canvas/layout.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/layout.canvas.util.js +24 -3
- package/dist/esm/canvas/root.canvas.util.d.ts +23 -4
- package/dist/esm/canvas/root.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/root.canvas.util.js +227 -7
- package/dist/esm/canvas/text.canvas.util.d.ts +2 -2
- package/dist/esm/canvas/text.canvas.util.d.ts.map +1 -1
- package/dist/esm/canvas/text.canvas.util.js +5 -1
- package/dist/esm/canvas/worker.types.d.ts +76 -0
- package/dist/esm/canvas/worker.types.d.ts.map +1 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/render.worker.d.ts +2 -0
- package/dist/esm/render.worker.d.ts.map +1 -0
- package/dist/esm/render.worker.js +70 -0
- package/package.json +1 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ExportFormat, ExportOptions, SaveOptions, RenderOptions } from 'skia-canvas';
|
|
2
|
+
import type { RootProps } from '../canvas/canvas.type.js';
|
|
3
|
+
export interface CanvasCallMap {
|
|
4
|
+
toBuffer: {
|
|
5
|
+
args: [ExportFormat, ExportOptions?];
|
|
6
|
+
result: Buffer;
|
|
7
|
+
};
|
|
8
|
+
toURL: {
|
|
9
|
+
args: [ExportFormat, ExportOptions?];
|
|
10
|
+
result: string;
|
|
11
|
+
};
|
|
12
|
+
toFile: {
|
|
13
|
+
args: [string, SaveOptions?];
|
|
14
|
+
result: void;
|
|
15
|
+
};
|
|
16
|
+
toSharp: {
|
|
17
|
+
args: [RenderOptions?];
|
|
18
|
+
result: Buffer;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export type CanvasCallMethod = keyof CanvasCallMap;
|
|
22
|
+
export type CallArgs<M extends CanvasCallMethod> = CanvasCallMap[M]['args'];
|
|
23
|
+
export type CallResult<M extends CanvasCallMethod> = CanvasCallMap[M]['result'];
|
|
24
|
+
export interface WorkerRenderRequest {
|
|
25
|
+
type: 'render';
|
|
26
|
+
taskId: number;
|
|
27
|
+
props: RootProps;
|
|
28
|
+
}
|
|
29
|
+
/** Discriminated union — narrows args alongside method in switch statements */
|
|
30
|
+
export type WorkerCallRequest = {
|
|
31
|
+
type: 'call';
|
|
32
|
+
taskId: number;
|
|
33
|
+
canvasId: number;
|
|
34
|
+
method: 'toBuffer';
|
|
35
|
+
args: CallArgs<'toBuffer'>;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'call';
|
|
38
|
+
taskId: number;
|
|
39
|
+
canvasId: number;
|
|
40
|
+
method: 'toURL';
|
|
41
|
+
args: CallArgs<'toURL'>;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'call';
|
|
44
|
+
taskId: number;
|
|
45
|
+
canvasId: number;
|
|
46
|
+
method: 'toFile';
|
|
47
|
+
args: CallArgs<'toFile'>;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'call';
|
|
50
|
+
taskId: number;
|
|
51
|
+
canvasId: number;
|
|
52
|
+
method: 'toSharp';
|
|
53
|
+
args: CallArgs<'toSharp'>;
|
|
54
|
+
};
|
|
55
|
+
export interface WorkerReleaseRequest {
|
|
56
|
+
type: 'release';
|
|
57
|
+
canvasId: number;
|
|
58
|
+
}
|
|
59
|
+
export type WorkerRequest = WorkerRenderRequest | WorkerCallRequest | WorkerReleaseRequest;
|
|
60
|
+
export interface WorkerRenderResponse {
|
|
61
|
+
taskId: number;
|
|
62
|
+
canvasId: number;
|
|
63
|
+
buffer: Buffer;
|
|
64
|
+
width: number;
|
|
65
|
+
height: number;
|
|
66
|
+
}
|
|
67
|
+
export interface WorkerCallResponse {
|
|
68
|
+
taskId: number;
|
|
69
|
+
result: Buffer | string | void;
|
|
70
|
+
}
|
|
71
|
+
export interface WorkerErrorResponse {
|
|
72
|
+
taskId: number;
|
|
73
|
+
error: string;
|
|
74
|
+
}
|
|
75
|
+
export type WorkerResponse = WorkerRenderResponse | WorkerCallResponse | WorkerErrorResponse;
|
|
76
|
+
//# sourceMappingURL=worker.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.types.d.ts","sourceRoot":"","sources":["../../../src/canvas/worker.types.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ export * from './canvas/canvas.type.js';
|
|
|
3
3
|
export { Box, Column, Row, type BoxNode } from './canvas/layout.canvas.util.js';
|
|
4
4
|
export { Image } from './canvas/image.canvas.util.js';
|
|
5
5
|
export { Text } from './canvas/text.canvas.util.js';
|
|
6
|
-
export { Root } from './canvas/root.canvas.util.js';
|
|
6
|
+
export { Root, configure } from './canvas/root.canvas.util.js';
|
|
7
|
+
export { GridItem } from './canvas/grid.canvas.util.js';
|
|
7
8
|
export { Grid } from './canvas/grid.canvas.util.js';
|
|
8
9
|
export { Chart } from './canvas/chart.canvas.util.js';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAA"}
|
package/dist/esm/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { Border, Style } from './constant/common.const.js';
|
|
|
2
2
|
export { Box, Column, Row } from './canvas/layout.canvas.util.js';
|
|
3
3
|
export { Image } from './canvas/image.canvas.util.js';
|
|
4
4
|
export { Text } from './canvas/text.canvas.util.js';
|
|
5
|
-
export { Root } from './canvas/root.canvas.util.js';
|
|
6
|
-
export { Grid } from './canvas/grid.canvas.util.js';
|
|
5
|
+
export { Root, configure } from './canvas/root.canvas.util.js';
|
|
6
|
+
export { Grid, GridItem } from './canvas/grid.canvas.util.js';
|
|
7
7
|
export { Chart } from './canvas/chart.canvas.util.js';
|
|
8
8
|
export * from 'yoga-layout';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.worker.d.ts","sourceRoot":"","sources":["../../src/render.worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { parentPort } from 'worker_threads';
|
|
2
|
+
import { RootNode } from './canvas/root.canvas.util.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Worker thread entry point for off-main-thread canvas rendering.
|
|
6
|
+
*
|
|
7
|
+
* Message protocol (main → worker):
|
|
8
|
+
* { type: 'render', taskId, props } — render and keep Canvas alive
|
|
9
|
+
* { type: 'call', taskId, canvasId, method, args } — call a method on a live Canvas
|
|
10
|
+
* { type: 'release', canvasId } — free Canvas from memory
|
|
11
|
+
*
|
|
12
|
+
* Responses (worker → main):
|
|
13
|
+
* WorkerRenderResponse — render complete (includes pre-encoded PNG buffer)
|
|
14
|
+
* WorkerCallResponse — method call result
|
|
15
|
+
* WorkerErrorResponse — any failure
|
|
16
|
+
*/
|
|
17
|
+
if (!parentPort) {
|
|
18
|
+
throw new Error('[render.worker] Must be run as a worker thread');
|
|
19
|
+
}
|
|
20
|
+
const canvases = new Map();
|
|
21
|
+
let nextCanvasId = 0;
|
|
22
|
+
function reply(msg) {
|
|
23
|
+
parentPort.postMessage(msg);
|
|
24
|
+
}
|
|
25
|
+
parentPort.on('message', async (msg) => {
|
|
26
|
+
if (msg.type === 'render') {
|
|
27
|
+
try {
|
|
28
|
+
const canvas = await new RootNode(msg.props).render();
|
|
29
|
+
const canvasId = nextCanvasId++;
|
|
30
|
+
canvases.set(canvasId, canvas);
|
|
31
|
+
reply({ taskId: msg.taskId, canvasId, buffer: canvas.toBufferSync('png'), width: canvas.width, height: canvas.height });
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
reply({ taskId: msg.taskId, error: String(err) });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (msg.type === 'call') {
|
|
38
|
+
const canvas = canvases.get(msg.canvasId);
|
|
39
|
+
if (!canvas) {
|
|
40
|
+
reply({ taskId: msg.taskId, error: `[render.worker] Canvas ${msg.canvasId} not found` });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
let result;
|
|
45
|
+
switch (msg.method) {
|
|
46
|
+
case 'toBuffer':
|
|
47
|
+
result = await canvas.toBuffer(...msg.args);
|
|
48
|
+
break;
|
|
49
|
+
case 'toURL':
|
|
50
|
+
result = await canvas.toURL(...msg.args);
|
|
51
|
+
break;
|
|
52
|
+
case 'toFile':
|
|
53
|
+
result = await canvas.toFile(...msg.args);
|
|
54
|
+
break;
|
|
55
|
+
case 'toSharp':
|
|
56
|
+
// Sharp instances can't be transferred across threads — serialize to buffer
|
|
57
|
+
result = await canvas.toSharp(...msg.args).toBuffer();
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
reply({ taskId: msg.taskId, result });
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
reply({ taskId: msg.taskId, error: String(err) });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// type === 'release'
|
|
68
|
+
canvases.delete(msg.canvasId);
|
|
69
|
+
}
|
|
70
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meonode/canvas",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0-beta.2",
|
|
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",
|