@danielsimonjr/sciengjs 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +182 -3
- package/THIRD_PARTY_NOTICES.md +57 -0
- package/assets/fonts/LiberationSerif-Regular.LICENSE.txt +102 -0
- package/assets/fonts/LiberationSerif-Regular.ttf +0 -0
- package/assets/licenses/EPL-2.0.txt +278 -0
- package/assets/licenses/MPL-2.0.txt +374 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.js +186 -0
- package/dist/config.js.map +1 -0
- package/dist/core.d.ts +10 -0
- package/dist/core.js +85 -0
- package/dist/core.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph/backend-png.d.ts +5 -0
- package/dist/graph/backend-png.js +57 -0
- package/dist/graph/backend-png.js.map +1 -0
- package/dist/graph/backend-svg.d.ts +3 -0
- package/dist/graph/backend-svg.js +12 -0
- package/dist/graph/backend-svg.js.map +1 -0
- package/dist/graph/dot.d.ts +12 -0
- package/dist/graph/dot.js +48 -0
- package/dist/graph/dot.js.map +1 -0
- package/dist/graph/image.d.ts +23 -0
- package/dist/graph/image.js +292 -0
- package/dist/graph/image.js.map +1 -0
- package/dist/graph/index.d.ts +3 -0
- package/dist/graph/index.js +3 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/pairs.d.ts +11 -0
- package/dist/pairs.js +43 -0
- package/dist/pairs.js.map +1 -0
- package/dist/raster/index.d.ts +18 -0
- package/dist/raster/index.js +77 -0
- package/dist/raster/index.js.map +1 -0
- package/dist/raster/warnings.d.ts +12 -0
- package/dist/raster/warnings.js +175 -0
- package/dist/raster/warnings.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.js +17 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/worker/entry.d.ts +1 -0
- package/dist/worker/entry.js +38 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker/protocol.d.ts +37 -0
- package/dist/worker/protocol.js +2 -0
- package/dist/worker/protocol.js.map +1 -0
- package/dist/worker/run.d.ts +30 -0
- package/dist/worker/run.js +90 -0
- package/dist/worker/run.js.map +1 -0
- package/package.json +71 -6
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Worker } from "node:worker_threads";
|
|
2
|
+
import { extname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { RenderError } from "../errors.js";
|
|
5
|
+
/** The default longest wait for a worker to stop. It is the only place where this value is set. */
|
|
6
|
+
const DEFAULT_TERMINATE_WAIT_MS = 5000;
|
|
7
|
+
function createDefaultWorker(entry, data, maxMemoryMb) {
|
|
8
|
+
return new Worker(entry, {
|
|
9
|
+
workerData: data,
|
|
10
|
+
resourceLimits: { maxOldGenerationSizeMb: maxMemoryMb },
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/** Terminates the worker. It rejects when terminate throws, rejects or does not resolve within the wait. */
|
|
14
|
+
function stopWorker(worker, waitMs) {
|
|
15
|
+
let timer;
|
|
16
|
+
const bound = new Promise((_, reject) => {
|
|
17
|
+
timer = setTimeout(() => reject(new Error(`the worker did not stop within ${waitMs} ms`)), waitMs);
|
|
18
|
+
});
|
|
19
|
+
const stop = new Promise((resolve) => resolve(worker.terminate()));
|
|
20
|
+
return Promise.race([stop, bound]).finally(() => clearTimeout(timer));
|
|
21
|
+
}
|
|
22
|
+
function messageOf(err) {
|
|
23
|
+
return err instanceof Error ? err.message : String(err);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The entry file sits next to this module. Its extension follows this module:
|
|
27
|
+
* `.ts` under Bun tests, `.js` in the built package.
|
|
28
|
+
*/
|
|
29
|
+
function entryUrl() {
|
|
30
|
+
const here = fileURLToPath(import.meta.url);
|
|
31
|
+
return new URL(`./entry${extname(here)}`, import.meta.url);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Runs one render in a fresh worker. The worker ends at the first of: its message, its error,
|
|
35
|
+
* its exit, or the time limit. The promise settles only after the worker has exited.
|
|
36
|
+
*
|
|
37
|
+
* A heap exhaustion (`ERR_WORKER_OUT_OF_MEMORY`) maps to `E_LIMIT`. The design lists the heap
|
|
38
|
+
* limit as a resource limit of a source. A crash of any other kind maps to `E_INTERNAL`.
|
|
39
|
+
*/
|
|
40
|
+
export function runInWorker(job, limits) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const create = limits.createWorker ?? createDefaultWorker;
|
|
43
|
+
const worker = create(entryUrl(), job, limits.maxMemoryMb);
|
|
44
|
+
const terminateWaitMs = limits.terminateWaitMs ?? DEFAULT_TERMINATE_WAIT_MS;
|
|
45
|
+
let settled = false;
|
|
46
|
+
let timer;
|
|
47
|
+
const settle = (action) => {
|
|
48
|
+
if (settled)
|
|
49
|
+
return;
|
|
50
|
+
settled = true;
|
|
51
|
+
if (timer !== undefined)
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
stopWorker(worker, terminateWaitMs)
|
|
54
|
+
.then((exitCode) => {
|
|
55
|
+
limits.onWorkerExit?.({ exitCode });
|
|
56
|
+
})
|
|
57
|
+
.then(action, (err) => {
|
|
58
|
+
reject(new RenderError("E_INTERNAL", `render worker did not stop cleanly: ${messageOf(err)}`));
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
timer = setTimeout(() => {
|
|
62
|
+
settle(() => reject(new RenderError("E_TIMEOUT", `render did not finish within ${limits.timeoutMs} ms`)));
|
|
63
|
+
}, limits.timeoutMs);
|
|
64
|
+
worker.once("message", (msg) => {
|
|
65
|
+
settle(() => {
|
|
66
|
+
if (msg.ok) {
|
|
67
|
+
resolve({ bytes: msg.bytes, warnings: msg.warnings });
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const code = msg.code;
|
|
71
|
+
reject(new RenderError(code, msg.message, { line: msg.line, column: msg.column }));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
worker.once("error", (err) => {
|
|
76
|
+
settle(() => {
|
|
77
|
+
if (err.code === "ERR_WORKER_OUT_OF_MEMORY") {
|
|
78
|
+
reject(new RenderError("E_LIMIT", `render exceeded the heap limit of ${limits.maxMemoryMb} MB`));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
reject(new RenderError("E_INTERNAL", `render worker failed: ${err.message}`));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
worker.once("exit", (code) => {
|
|
86
|
+
settle(() => reject(new RenderError("E_INTERNAL", `render worker exited with code ${code} before it returned`)));
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/worker/run.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,71 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@danielsimonjr/sciengjs",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@danielsimonjr/sciengjs",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "A local rendering engine for science and engineering diagrams, documents and models",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./graph": {
|
|
17
|
+
"types": "./dist/graph/index.d.ts",
|
|
18
|
+
"default": "./dist/graph/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./raster": {
|
|
21
|
+
"types": "./dist/raster/index.d.ts",
|
|
22
|
+
"default": "./dist/raster/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./package.json": "./package.json"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"assets",
|
|
29
|
+
"THIRD_PARTY_NOTICES.md",
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
32
|
+
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc -p tsconfig.build.json",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"test": "bun test",
|
|
37
|
+
"smoke": "node test/smoke/smoke.mjs",
|
|
38
|
+
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
39
|
+
"test:node": "node --test test/node/worker.node.mjs"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"graphviz",
|
|
43
|
+
"mermaid",
|
|
44
|
+
"latex",
|
|
45
|
+
"tikz",
|
|
46
|
+
"svg",
|
|
47
|
+
"diagram",
|
|
48
|
+
"rendering"
|
|
49
|
+
],
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/danielsimonjr/sciengjs.git"
|
|
53
|
+
},
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/danielsimonjr/sciengjs/issues"
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://github.com/danielsimonjr/sciengjs#readme",
|
|
58
|
+
"engines": {
|
|
59
|
+
"node": ">=22"
|
|
60
|
+
},
|
|
61
|
+
"packageManager": "bun@1.4.4",
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/bun": "^1.4.4",
|
|
64
|
+
"@types/node": "^22",
|
|
65
|
+
"typescript": "^7.0.2"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"@resvg/resvg-wasm": "2.6.2",
|
|
69
|
+
"@viz-js/viz": "3.31.0"
|
|
70
|
+
}
|
|
71
|
+
}
|