@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.
Files changed (65) hide show
  1. package/dist/cjs/canvas/canvas.type.d.ts +34 -1
  2. package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
  3. package/dist/cjs/canvas/chart.canvas.util.d.ts +2 -2
  4. package/dist/cjs/canvas/chart.canvas.util.d.ts.map +1 -1
  5. package/dist/cjs/canvas/chart.canvas.util.js +5 -2
  6. package/dist/cjs/canvas/chart.canvas.util.js.map +1 -1
  7. package/dist/cjs/canvas/grid.canvas.util.d.ts +3 -3
  8. package/dist/cjs/canvas/grid.canvas.util.d.ts.map +1 -1
  9. package/dist/cjs/canvas/grid.canvas.util.js +34 -1
  10. package/dist/cjs/canvas/grid.canvas.util.js.map +1 -1
  11. package/dist/cjs/canvas/image.canvas.util.d.ts +16 -8
  12. package/dist/cjs/canvas/image.canvas.util.d.ts.map +1 -1
  13. package/dist/cjs/canvas/image.canvas.util.js +82 -72
  14. package/dist/cjs/canvas/image.canvas.util.js.map +1 -1
  15. package/dist/cjs/canvas/layout.canvas.util.d.ts +4 -4
  16. package/dist/cjs/canvas/layout.canvas.util.d.ts.map +1 -1
  17. package/dist/cjs/canvas/layout.canvas.util.js +24 -3
  18. package/dist/cjs/canvas/layout.canvas.util.js.map +1 -1
  19. package/dist/cjs/canvas/root.canvas.util.d.ts +23 -4
  20. package/dist/cjs/canvas/root.canvas.util.d.ts.map +1 -1
  21. package/dist/cjs/canvas/root.canvas.util.js +228 -5
  22. package/dist/cjs/canvas/root.canvas.util.js.map +1 -1
  23. package/dist/cjs/canvas/text.canvas.util.d.ts +2 -2
  24. package/dist/cjs/canvas/text.canvas.util.d.ts.map +1 -1
  25. package/dist/cjs/canvas/text.canvas.util.js +5 -1
  26. package/dist/cjs/canvas/text.canvas.util.js.map +1 -1
  27. package/dist/cjs/canvas/worker.types.d.ts +76 -0
  28. package/dist/cjs/canvas/worker.types.d.ts.map +1 -0
  29. package/dist/cjs/index.d.ts +2 -1
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/index.js +2 -0
  32. package/dist/cjs/index.js.map +1 -1
  33. package/dist/cjs/render.worker.d.ts +2 -0
  34. package/dist/cjs/render.worker.d.ts.map +1 -0
  35. package/dist/cjs/render.worker.js +73 -0
  36. package/dist/cjs/render.worker.js.map +1 -0
  37. package/dist/esm/canvas/canvas.type.d.ts +34 -1
  38. package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
  39. package/dist/esm/canvas/chart.canvas.util.d.ts +2 -2
  40. package/dist/esm/canvas/chart.canvas.util.d.ts.map +1 -1
  41. package/dist/esm/canvas/chart.canvas.util.js +6 -3
  42. package/dist/esm/canvas/grid.canvas.util.d.ts +3 -3
  43. package/dist/esm/canvas/grid.canvas.util.d.ts.map +1 -1
  44. package/dist/esm/canvas/grid.canvas.util.js +34 -3
  45. package/dist/esm/canvas/image.canvas.util.d.ts +16 -8
  46. package/dist/esm/canvas/image.canvas.util.d.ts.map +1 -1
  47. package/dist/esm/canvas/image.canvas.util.js +82 -72
  48. package/dist/esm/canvas/layout.canvas.util.d.ts +4 -4
  49. package/dist/esm/canvas/layout.canvas.util.d.ts.map +1 -1
  50. package/dist/esm/canvas/layout.canvas.util.js +24 -3
  51. package/dist/esm/canvas/root.canvas.util.d.ts +23 -4
  52. package/dist/esm/canvas/root.canvas.util.d.ts.map +1 -1
  53. package/dist/esm/canvas/root.canvas.util.js +227 -7
  54. package/dist/esm/canvas/text.canvas.util.d.ts +2 -2
  55. package/dist/esm/canvas/text.canvas.util.d.ts.map +1 -1
  56. package/dist/esm/canvas/text.canvas.util.js +5 -1
  57. package/dist/esm/canvas/worker.types.d.ts +76 -0
  58. package/dist/esm/canvas/worker.types.d.ts.map +1 -0
  59. package/dist/esm/index.d.ts +2 -1
  60. package/dist/esm/index.d.ts.map +1 -1
  61. package/dist/esm/index.js +2 -2
  62. package/dist/esm/render.worker.d.ts +2 -0
  63. package/dist/esm/render.worker.d.ts.map +1 -0
  64. package/dist/esm/render.worker.js +70 -0
  65. 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":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAMxD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QAAE,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAClE,KAAK,EAAE;QAAE,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,CAAA;IACtD,OAAO,EAAE;QAAE,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACpD;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAA;AAClD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,gBAAgB,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AAC3E,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAM/E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,CAAA;CACjB;AAED,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;CAAE,GAClG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAAE,GAC5F;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;CAAE,GAC9F;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;CAAE,CAAA;AAEpG,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,oBAAoB,CAAA;AAM1F,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,mBAAmB,CAAA"}
@@ -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
@@ -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;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=render.worker.d.ts.map
@@ -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.5.6",
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",