@wasmedia/wenblend 0.1.0 → 0.1.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/README.md +4 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -2
- package/dist/cli.js.map +1 -1
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js +2 -7
- package/dist/handler.js.map +1 -1
- package/dist/staging.d.ts.map +1 -1
- package/dist/staging.js +39 -20
- package/dist/staging.js.map +1 -1
- package/dist/wenblend.wasm +0 -0
- package/dist/wenfuse.wasm +0 -0
- package/package.json +1 -1
- package/src/cli.ts +23 -1
- package/src/handler.ts +2 -7
- package/src/staging.ts +42 -20
package/README.md
CHANGED
|
@@ -35,7 +35,10 @@ places images by their TIFF position tags and aligns nothing. The wasm in the pa
|
|
|
35
35
|
`npm run build && npm run playground` serves a browser playground at `http://localhost:8000/` (set
|
|
36
36
|
`PORT=` to change it). On `main` it deploys to GitLab Pages at
|
|
37
37
|
[enblend.wasmedia.org](https://enblend.wasmedia.org/). It runs enblend and enfuse on built-in sample
|
|
38
|
-
sets or on your own positioned RGBA TIFFs, in a worker, and nothing leaves the browser.
|
|
38
|
+
sets or on your own positioned RGBA TIFFs, in a worker, and nothing leaves the browser. Each input's
|
|
39
|
+
position tags are shown before you run, 16-bit and predictor-compressed TIFFs (Hugin `nona` output)
|
|
40
|
+
included; previews are downsampled, and only 8-bit images get one. Where the browser has OPFS, runs
|
|
41
|
+
store their files there, and runs in several tabs of the page take turns rather than overlap.
|
|
39
42
|
|
|
40
43
|
## Artifacts
|
|
41
44
|
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAA0B,MAAM,YAAY,CAAC;AAE1I,OAAO,EAAkB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAA0B,MAAM,YAAY,CAAC;AAE1I,OAAO,EAAkB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,CAAC;AAoF1B;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AACxH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAuG3H,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAC5G,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAK/G,qDAAqD;AACrD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAC3G,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -62,6 +62,21 @@ function exitStatusOf(e) {
|
|
|
62
62
|
}
|
|
63
63
|
return undefined;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Record a release failure that could not be thrown, on the error that was.
|
|
67
|
+
* An existing cause is the more specific one and is left alone; a value
|
|
68
|
+
* that is not an object cannot carry a cause at all.
|
|
69
|
+
*/
|
|
70
|
+
function attachCause(error, cause) {
|
|
71
|
+
if (typeof error !== "object" || error === null || "cause" in error)
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
Object.defineProperty(error, "cause", { value: cause, writable: true, configurable: true, enumerable: false });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// A frozen error: nothing more can be recorded.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
65
80
|
export async function runTool(tool, argv, inputs = [], options) {
|
|
66
81
|
// File mode when every input is a FileInput; buffers otherwise (including
|
|
67
82
|
// no inputs). Decided before an instance exists, so a bad call costs nothing.
|
|
@@ -90,6 +105,7 @@ export async function runTool(tool, argv, inputs = [], options) {
|
|
|
90
105
|
let outOfMemory = false;
|
|
91
106
|
let outputs = new Map();
|
|
92
107
|
let inFlight;
|
|
108
|
+
let suppressed;
|
|
93
109
|
const host = hostProcess();
|
|
94
110
|
const hostExitCode = host?.exitCode;
|
|
95
111
|
try {
|
|
@@ -149,10 +165,18 @@ export async function runTool(tool, argv, inputs = [], options) {
|
|
|
149
165
|
catch (releaseError) {
|
|
150
166
|
if (!inFlight && !outOfMemory)
|
|
151
167
|
throw releaseError;
|
|
168
|
+
// Kept as the cause, so a run that failed twice still shows both.
|
|
169
|
+
suppressed = { error: releaseError };
|
|
170
|
+
if (inFlight)
|
|
171
|
+
attachCause(inFlight.error, releaseError);
|
|
152
172
|
}
|
|
153
173
|
}
|
|
154
|
-
if (outOfMemory)
|
|
155
|
-
|
|
174
|
+
if (outOfMemory) {
|
|
175
|
+
const error = new OutOfMemoryError(await staging.pixelCount(), stderr.trimEnd());
|
|
176
|
+
if (suppressed)
|
|
177
|
+
attachCause(error, suppressed.error);
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
156
180
|
const base = { exitCode, stdout: stdout.trimEnd(), stderr: stderr.trimEnd() };
|
|
157
181
|
return files
|
|
158
182
|
? { ...base, written: outputs }
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/handler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IACnE,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IAClC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAID;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAwCnF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAMvC"}
|
package/dist/handler.js
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
* `src/worker.ts`, the package's dedicated `./worker` entry.
|
|
12
12
|
*/
|
|
13
13
|
import { runOperation } from "./operations.js";
|
|
14
|
-
import { isFileInput } from "./staging.js";
|
|
15
14
|
const OPS = { blend: "enblend", fuse: "enfuse" };
|
|
16
15
|
/**
|
|
17
16
|
* Handle one request. Never throws and never rejects: worker.ts posts
|
|
@@ -40,12 +39,8 @@ export async function handleMessage(request) {
|
|
|
40
39
|
if (request.wopfsPath !== undefined && typeof request.wopfsPath !== "string") {
|
|
41
40
|
return { id, ok: false, error: { name: "Error", message: "wopfsPath must be a string" } };
|
|
42
41
|
}
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
const isFileMode = imagesArray.length > 0 && imagesArray.every(isFileInput);
|
|
46
|
-
if (isFileMode && !request.options?.outputDir) {
|
|
47
|
-
return { id, ok: false, error: { name: "Error", message: "file mode requires options.outputDir" } };
|
|
48
|
-
}
|
|
42
|
+
// File mode without outputDir is refused by runTool, whose error comes
|
|
43
|
+
// back through the catch below like any other.
|
|
49
44
|
const result = await runOperation(op, request.images, request.options, { wopfsPath: request.wopfsPath });
|
|
50
45
|
return { id, ok: true, result };
|
|
51
46
|
}
|
package/dist/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAmB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAmB,MAAM,iBAAiB,CAAC;AAkBhE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,EAAE,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,IAAI,CAAC;QACH,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC;QACjF,CAAC;QACD,wEAAwE;QACxE,oEAAoE;QACpE,sEAAsE;QACtE,cAAc;QACd,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC;YACzE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,EAAE,EAAE,EAAE,CAAC;QACrF,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,CAAC;QAC5F,CAAC;QACD,uEAAuE;QACvE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACzG,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAA6C,CAAC;QACnF,OAAO;YACL,EAAE;YACF,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;gBAC3C,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBACnD,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACvD,mEAAmE;gBACnE,gEAAgE;gBAChE,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aAC9D;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CACL,OAAO,iBAAiB,KAAK,WAAW;QACxC,OAAO,IAAI,KAAK,WAAW;QAC3B,IAAI,YAAY,iBAAiB,CAClC,CAAC;AACJ,CAAC"}
|
package/dist/staging.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../src/staging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK3G,MAAM,WAAW,OAAO;IACtB,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,kFAAkF;IAClF,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC;IAC1D,0EAA0E;IAC1E,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1C,+DAA+D;IAC/D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../src/staging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK3G,MAAM,WAAW,OAAO;IACtB,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,kFAAkF;IAClF,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC;IAC1D,0EAA0E;IAC1E,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1C,+DAA+D;IAC/D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAqC9E;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,SAAS,CAEtD;AASD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK9E;AA2DD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,SAAS,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,CAoClB"}
|
package/dist/staging.js
CHANGED
|
@@ -11,7 +11,16 @@ import { tiffPixelCount, tiffPixelCountAt } from "./tiff-header.js";
|
|
|
11
11
|
import { loadWopfs } from "./wopfs.js";
|
|
12
12
|
export function stageBuffers(module, inputs) {
|
|
13
13
|
const workDir = createWorkDir(module);
|
|
14
|
-
|
|
14
|
+
let inputNames;
|
|
15
|
+
try {
|
|
16
|
+
inputNames = stageInputs(module, workDir, inputs);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
// A write that fails partway (a bad name, a full heap) must not leave
|
|
20
|
+
// the directory and the inputs already written behind.
|
|
21
|
+
cleanWorkDir(module, workDir);
|
|
22
|
+
throw e;
|
|
23
|
+
}
|
|
15
24
|
let released = false;
|
|
16
25
|
return {
|
|
17
26
|
workDir,
|
|
@@ -65,25 +74,35 @@ export function scratchFor(argv, inputCount) {
|
|
|
65
74
|
n += 2 * inputCount;
|
|
66
75
|
return n;
|
|
67
76
|
}
|
|
68
|
-
/**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
77
|
+
/**
|
|
78
|
+
* The pixel count of one file, reading only the byte ranges the header walk
|
|
79
|
+
* needs. The file is opened once, on the first read, and closed after the
|
|
80
|
+
* walk, however many ranges it asks for.
|
|
81
|
+
*/
|
|
82
|
+
async function filePixelCount(file) {
|
|
83
|
+
if (typeof file !== "string") {
|
|
84
|
+
let blob;
|
|
85
|
+
return tiffPixelCountAt(async (offset, length) => {
|
|
86
|
+
blob ??= await file.getFile();
|
|
87
|
+
return new Uint8Array(await blob.slice(offset, offset + length).arrayBuffer());
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
let opened;
|
|
91
|
+
const readAt = async (offset, length) => {
|
|
92
|
+
// A variable specifier: the browser build never resolves node:fs.
|
|
93
|
+
const specifier = "node:fs/promises";
|
|
94
|
+
opened ??= import(/* @vite-ignore */ specifier).then(({ open }) => open(file, "r"));
|
|
95
|
+
const buffer = new Uint8Array(length);
|
|
96
|
+
const { bytesRead } = await (await opened).read(buffer, 0, length, offset);
|
|
97
|
+
return buffer.subarray(0, bytesRead);
|
|
98
|
+
};
|
|
99
|
+
try {
|
|
100
|
+
return await tiffPixelCountAt(readAt);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
// An open that failed has nothing to close; the walk already saw the error.
|
|
104
|
+
await opened?.then((h) => h.close(), () => { });
|
|
85
105
|
}
|
|
86
|
-
return async (offset, length) => new Uint8Array(await (await file.getFile()).slice(offset, offset + length).arrayBuffer());
|
|
87
106
|
}
|
|
88
107
|
/**
|
|
89
108
|
* Turn what wopfs committed into a WrittenFile. On the main thread wopfs
|
|
@@ -137,7 +156,7 @@ export async function stageFiles(module, inputs, outputDir, argv, options) {
|
|
|
137
156
|
return undefined;
|
|
138
157
|
let total = 0;
|
|
139
158
|
for (const input of inputs) {
|
|
140
|
-
const n = await
|
|
159
|
+
const n = await filePixelCount(input.file);
|
|
141
160
|
if (n === undefined)
|
|
142
161
|
return undefined;
|
|
143
162
|
total += n;
|
package/dist/staging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staging.js","sourceRoot":"","sources":["../src/staging.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACrH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,SAAS,EAA2B,MAAM,YAAY,CAAC;AAchE,MAAM,UAAU,YAAY,CAAC,MAAkB,EAAE,MAAoB;IACnE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,
|
|
1
|
+
{"version":3,"file":"staging.js","sourceRoot":"","sources":["../src/staging.ts"],"names":[],"mappings":"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"}
|
package/dist/wenblend.wasm
CHANGED
|
Binary file
|
package/dist/wenfuse.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -84,6 +84,20 @@ function exitStatusOf(e: unknown): number | undefined {
|
|
|
84
84
|
return undefined;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Record a release failure that could not be thrown, on the error that was.
|
|
89
|
+
* An existing cause is the more specific one and is left alone; a value
|
|
90
|
+
* that is not an object cannot carry a cause at all.
|
|
91
|
+
*/
|
|
92
|
+
function attachCause(error: unknown, cause: unknown): void {
|
|
93
|
+
if (typeof error !== "object" || error === null || "cause" in error) return;
|
|
94
|
+
try {
|
|
95
|
+
Object.defineProperty(error, "cause", { value: cause, writable: true, configurable: true, enumerable: false });
|
|
96
|
+
} catch {
|
|
97
|
+
// A frozen error: nothing more can be recorded.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
87
101
|
/**
|
|
88
102
|
* Run one tool once.
|
|
89
103
|
*
|
|
@@ -127,6 +141,7 @@ export async function runTool(
|
|
|
127
141
|
let outOfMemory = false;
|
|
128
142
|
let outputs = new Map<string, Uint8Array | WrittenFile>();
|
|
129
143
|
let inFlight: { error: unknown } | undefined;
|
|
144
|
+
let suppressed: { error: unknown } | undefined;
|
|
130
145
|
const host = hostProcess();
|
|
131
146
|
const hostExitCode = host?.exitCode;
|
|
132
147
|
try {
|
|
@@ -176,10 +191,17 @@ export async function runTool(
|
|
|
176
191
|
await staging.release();
|
|
177
192
|
} catch (releaseError) {
|
|
178
193
|
if (!inFlight && !outOfMemory) throw releaseError;
|
|
194
|
+
// Kept as the cause, so a run that failed twice still shows both.
|
|
195
|
+
suppressed = { error: releaseError };
|
|
196
|
+
if (inFlight) attachCause(inFlight.error, releaseError);
|
|
179
197
|
}
|
|
180
198
|
}
|
|
181
199
|
|
|
182
|
-
if (outOfMemory)
|
|
200
|
+
if (outOfMemory) {
|
|
201
|
+
const error = new OutOfMemoryError(await staging.pixelCount(), stderr.trimEnd());
|
|
202
|
+
if (suppressed) attachCause(error, suppressed.error);
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
183
205
|
const base = { exitCode, stdout: stdout.trimEnd(), stderr: stderr.trimEnd() };
|
|
184
206
|
return files
|
|
185
207
|
? { ...base, written: outputs as Map<string, WrittenFile> }
|
package/src/handler.ts
CHANGED
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
|
|
14
14
|
import type { BlendOptions, FuseOptions, FileInput, OutputDir, WrittenFile } from "./types.js";
|
|
15
15
|
import { runOperation, type ImageInput } from "./operations.js";
|
|
16
|
-
import { isFileInput } from "./staging.js";
|
|
17
16
|
|
|
18
17
|
export interface WorkerRequest {
|
|
19
18
|
id: string;
|
|
@@ -60,12 +59,8 @@ export async function handleMessage(request: WorkerRequest): Promise<WorkerRespo
|
|
|
60
59
|
if (request.wopfsPath !== undefined && typeof request.wopfsPath !== "string") {
|
|
61
60
|
return { id, ok: false, error: { name: "Error", message: "wopfsPath must be a string" } };
|
|
62
61
|
}
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
const isFileMode = imagesArray.length > 0 && imagesArray.every(isFileInput);
|
|
66
|
-
if (isFileMode && !request.options?.outputDir) {
|
|
67
|
-
return { id, ok: false, error: { name: "Error", message: "file mode requires options.outputDir" } };
|
|
68
|
-
}
|
|
62
|
+
// File mode without outputDir is refused by runTool, whose error comes
|
|
63
|
+
// back through the catch below like any other.
|
|
69
64
|
const result = await runOperation(op, request.images, request.options, { wopfsPath: request.wopfsPath });
|
|
70
65
|
return { id, ok: true, result };
|
|
71
66
|
} catch (e: unknown) {
|
package/src/staging.ts
CHANGED
|
@@ -26,7 +26,15 @@ export interface Staging {
|
|
|
26
26
|
|
|
27
27
|
export function stageBuffers(module: WasmModule, inputs: InputImage[]): Staging {
|
|
28
28
|
const workDir = createWorkDir(module);
|
|
29
|
-
|
|
29
|
+
let inputNames: Set<string>;
|
|
30
|
+
try {
|
|
31
|
+
inputNames = stageInputs(module, workDir, inputs);
|
|
32
|
+
} catch (e) {
|
|
33
|
+
// A write that fails partway (a bad name, a full heap) must not leave
|
|
34
|
+
// the directory and the inputs already written behind.
|
|
35
|
+
cleanWorkDir(module, workDir);
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
30
38
|
let released = false;
|
|
31
39
|
return {
|
|
32
40
|
workDir,
|
|
@@ -80,25 +88,39 @@ export function scratchFor(argv: readonly string[], inputCount: number): number
|
|
|
80
88
|
return n;
|
|
81
89
|
}
|
|
82
90
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
91
|
+
type NodeFileHandle = {
|
|
92
|
+
read(buffer: Uint8Array, offset: number, length: number, position: number): Promise<{ bytesRead: number }>;
|
|
93
|
+
close(): Promise<void>;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The pixel count of one file, reading only the byte ranges the header walk
|
|
98
|
+
* needs. The file is opened once, on the first read, and closed after the
|
|
99
|
+
* walk, however many ranges it asks for.
|
|
100
|
+
*/
|
|
101
|
+
async function filePixelCount(file: FileSystemFileHandle | string): Promise<number | undefined> {
|
|
102
|
+
if (typeof file !== "string") {
|
|
103
|
+
let blob: File | undefined;
|
|
104
|
+
return tiffPixelCountAt(async (offset, length) => {
|
|
105
|
+
blob ??= await file.getFile();
|
|
106
|
+
return new Uint8Array(await blob.slice(offset, offset + length).arrayBuffer());
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
let opened: Promise<NodeFileHandle> | undefined;
|
|
110
|
+
const readAt: ReadAt = async (offset, length) => {
|
|
111
|
+
// A variable specifier: the browser build never resolves node:fs.
|
|
112
|
+
const specifier = "node:fs/promises";
|
|
113
|
+
opened ??= import(/* @vite-ignore */ specifier).then(({ open }) => open(file, "r"));
|
|
114
|
+
const buffer = new Uint8Array(length);
|
|
115
|
+
const { bytesRead } = await (await opened).read(buffer, 0, length, offset);
|
|
116
|
+
return buffer.subarray(0, bytesRead);
|
|
117
|
+
};
|
|
118
|
+
try {
|
|
119
|
+
return await tiffPixelCountAt(readAt);
|
|
120
|
+
} finally {
|
|
121
|
+
// An open that failed has nothing to close; the walk already saw the error.
|
|
122
|
+
await opened?.then((h) => h.close(), () => {});
|
|
99
123
|
}
|
|
100
|
-
return async (offset, length) =>
|
|
101
|
-
new Uint8Array(await (await file.getFile()).slice(offset, offset + length).arrayBuffer());
|
|
102
124
|
}
|
|
103
125
|
|
|
104
126
|
/**
|
|
@@ -156,7 +178,7 @@ export async function stageFiles(
|
|
|
156
178
|
if (inputs.length === 0) return undefined;
|
|
157
179
|
let total = 0;
|
|
158
180
|
for (const input of inputs) {
|
|
159
|
-
const n = await
|
|
181
|
+
const n = await filePixelCount(input.file);
|
|
160
182
|
if (n === undefined) return undefined;
|
|
161
183
|
total += n;
|
|
162
184
|
}
|