preprocess-wasm-bytes 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/README.md +83 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/preprocess_wasm_bytes.d.ts +2 -0
- package/dist/preprocess_wasm_bytes.d.ts.map +1 -0
- package/dist/preprocess_wasm_bytes.js +596 -0
- package/dist/preprocess_wasm_bytes.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
License: UNLICENSED — Not licensed for use; all rights reserved.
|
|
2
|
+
|
|
3
|
+
# preprocess-wasm-bytes
|
|
4
|
+
|
|
5
|
+
Exports a single function: `preprocess_wasm_bytes(bytes: Uint8Array): Promise<Uint8Array>`
|
|
6
|
+
|
|
7
|
+
It scans the WASM binary (imports/exports/globals/memories/tables/element segments) and produces a new WASM binary with additional exports added for:
|
|
8
|
+
|
|
9
|
+
- functions referenced by element segments / `ref.func` in const-exprs
|
|
10
|
+
- mutable globals
|
|
11
|
+
- all memories
|
|
12
|
+
- all tables
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm i preprocess-wasm-bytes
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage (Node / ESM)
|
|
21
|
+
```js
|
|
22
|
+
import fs from "node:fs";
|
|
23
|
+
import { preprocess_wasm_bytes } from "preprocess-wasm-bytes";
|
|
24
|
+
|
|
25
|
+
const bytes = new Uint8Array(fs.readFileSync("input.wasm"));
|
|
26
|
+
const out = await preprocess_wasm_bytes(bytes);
|
|
27
|
+
|
|
28
|
+
fs.writeFileSync("output.wasm", out);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage (Browser bundlers)
|
|
32
|
+
```js
|
|
33
|
+
import { preprocess_wasm_bytes } from "preprocess-wasm-bytes";
|
|
34
|
+
|
|
35
|
+
const res = await fetch("/module.wasm");
|
|
36
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
37
|
+
const out = await preprocess_wasm_bytes(bytes);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Debug logging
|
|
41
|
+
```js
|
|
42
|
+
globalThis.__WASM_PREPROCESS_DEBUG__ = true;
|
|
43
|
+
```
|
|
44
|
+
Set that before calling preprocess_wasm_bytes(...).
|
|
45
|
+
|
|
46
|
+
## Build and publish
|
|
47
|
+
Verify the build output exists (your `npm run build:lib` showing no output is normal when there are no errors):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
ls -la dist
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
You should see at least: index.js, index.d.ts, and their sourcemaps, plus preprocess_wasm_bytes.js and preprocess_wasm_bytes.d.ts.
|
|
54
|
+
|
|
55
|
+
Run the smoke test against dist/:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run gen:sample-wasm
|
|
59
|
+
npm run build:lib
|
|
60
|
+
node --input-type=module -e "import fs from 'node:fs'; import { preprocess_wasm_bytes } from './dist/index.js'; const b=new Uint8Array(fs.readFileSync('public/sample.wasm')); const out=await preprocess_wasm_bytes(b); console.log('ok', {inBytes:b.length, outBytes:out.length});"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Confirm what npm will publish:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npm pack --dry-run
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This should include only dist/ and README.md (per the files field).
|
|
70
|
+
|
|
71
|
+
Fix npm auth and publish (publish failed due to token/auth; you must re-auth on your machine):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm whoami
|
|
75
|
+
# if not logged in:
|
|
76
|
+
npm login
|
|
77
|
+
# optionally confirm registry:
|
|
78
|
+
npm config get registry
|
|
79
|
+
# then:
|
|
80
|
+
npm publish
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
If npm publish ever reports “You cannot publish over the previously published versions”, bump version and re-run npm publish (but your attempt failed due to auth, so 0.1.0 should still be fine).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess_wasm_bytes.d.ts","sourceRoot":"","sources":["../src/preprocess_wasm_bytes.ts"],"names":[],"mappings":"AAonBA,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAmEtF"}
|
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
// Copyright (c) 2025 justing2k5. All rights reserved.
|
|
2
|
+
// src/preprocess_wasm_bytes.ts
|
|
3
|
+
//
|
|
4
|
+
// What changed vs your last version:
|
|
5
|
+
// - We now *directly parse the WASM binary* to find all function indices referenced by the **element section**
|
|
6
|
+
// (covers active/passive/declarative + elem expressions). This avoids any @webassemblyjs AST-shape quirks.
|
|
7
|
+
// - We also parse the binary export section to learn existing export names/indices (so we never collide).
|
|
8
|
+
// - We export **all tables** (0..totalTables-1) unconditionally.
|
|
9
|
+
// - Debug logging is OFF by default. Toggle it via:
|
|
10
|
+
// globalThis.__WASM_PREPROCESS_DEBUG__ = true/false
|
|
11
|
+
const DEFAULT_DEBUG = false;
|
|
12
|
+
function debugEnabled() {
|
|
13
|
+
const v = globalThis.__WASM_PREPROCESS_DEBUG__;
|
|
14
|
+
return typeof v === "boolean" ? v : DEFAULT_DEBUG;
|
|
15
|
+
}
|
|
16
|
+
function dbg(...args) {
|
|
17
|
+
if (debugEnabled())
|
|
18
|
+
console.log("[wasm-preprocess]", ...args);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Some dependencies (notably @webassemblyjs/* and their transitive deps) expect
|
|
22
|
+
* node-ish globals in browser bundles. We only install minimal shims if missing.
|
|
23
|
+
* This runs BEFORE loading @webassemblyjs/*.
|
|
24
|
+
*/
|
|
25
|
+
let _didEnsureNodeLikeGlobals = false;
|
|
26
|
+
async function ensureNodeLikeGlobals() {
|
|
27
|
+
if (_didEnsureNodeLikeGlobals)
|
|
28
|
+
return;
|
|
29
|
+
_didEnsureNodeLikeGlobals = true;
|
|
30
|
+
const g = globalThis;
|
|
31
|
+
g.global ??= g;
|
|
32
|
+
g.process ??= { env: {} };
|
|
33
|
+
if (!g.Buffer) {
|
|
34
|
+
const mod = await import("buffer");
|
|
35
|
+
g.Buffer = mod.Buffer;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function toExactArrayBuffer(bytes) {
|
|
39
|
+
const { buffer, byteOffset, byteLength } = bytes;
|
|
40
|
+
if (buffer instanceof ArrayBuffer) {
|
|
41
|
+
if (byteOffset === 0 && byteLength === buffer.byteLength)
|
|
42
|
+
return buffer;
|
|
43
|
+
return buffer.slice(byteOffset, byteOffset + byteLength);
|
|
44
|
+
}
|
|
45
|
+
// SharedArrayBuffer case: copy into a new ArrayBuffer
|
|
46
|
+
const out = new ArrayBuffer(byteLength);
|
|
47
|
+
new Uint8Array(out).set(bytes);
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
function uniqueName(base, used, fallback) {
|
|
51
|
+
const cleanBase = base && typeof base === "string" ? base : fallback;
|
|
52
|
+
if (!used.has(cleanBase)) {
|
|
53
|
+
used.add(cleanBase);
|
|
54
|
+
return cleanBase;
|
|
55
|
+
}
|
|
56
|
+
let i = 1;
|
|
57
|
+
while (used.has(`${cleanBase}__${i}`))
|
|
58
|
+
i++;
|
|
59
|
+
const out = `${cleanBase}__${i}`;
|
|
60
|
+
used.add(out);
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
/* =======================================================================================
|
|
64
|
+
* Minimal WASM binary reader (just enough for exports/imports/tables/mems/globals/elems)
|
|
65
|
+
* ======================================================================================= */
|
|
66
|
+
const utf8 = new TextDecoder("utf-8");
|
|
67
|
+
function fail(msg) {
|
|
68
|
+
throw new Error(`[wasm-preprocess] ${msg}`);
|
|
69
|
+
}
|
|
70
|
+
function readU32Leb(bytes, pos, end) {
|
|
71
|
+
let result = 0;
|
|
72
|
+
let shift = 0;
|
|
73
|
+
for (let i = 0; i < 5; i++) {
|
|
74
|
+
if (pos >= end)
|
|
75
|
+
fail("unexpected EOF while reading u32 leb");
|
|
76
|
+
const b = bytes[pos++];
|
|
77
|
+
result |= (b & 0x7f) << shift;
|
|
78
|
+
if ((b & 0x80) === 0)
|
|
79
|
+
return { value: result >>> 0, pos };
|
|
80
|
+
shift += 7;
|
|
81
|
+
}
|
|
82
|
+
fail("u32 leb too long");
|
|
83
|
+
}
|
|
84
|
+
function skipLeb(bytes, pos, end, maxBytes) {
|
|
85
|
+
for (let i = 0; i < maxBytes; i++) {
|
|
86
|
+
if (pos >= end)
|
|
87
|
+
fail("unexpected EOF while skipping leb");
|
|
88
|
+
const b = bytes[pos++];
|
|
89
|
+
if ((b & 0x80) === 0)
|
|
90
|
+
return pos;
|
|
91
|
+
}
|
|
92
|
+
fail("leb too long");
|
|
93
|
+
}
|
|
94
|
+
function readName(bytes, pos, end) {
|
|
95
|
+
const r = readU32Leb(bytes, pos, end);
|
|
96
|
+
const len = r.value;
|
|
97
|
+
pos = r.pos;
|
|
98
|
+
const next = pos + len;
|
|
99
|
+
if (next > end)
|
|
100
|
+
fail("unexpected EOF while reading name");
|
|
101
|
+
const s = utf8.decode(bytes.subarray(pos, next));
|
|
102
|
+
return { value: s, pos: next };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parse a const expr and collect any ref.func immediates.
|
|
106
|
+
* NOTE: For our purposes we only fully support the common const-expr opcodes.
|
|
107
|
+
* For unknown opcodes we fail fast (with a useful error).
|
|
108
|
+
*/
|
|
109
|
+
function parseConstExprCollectRefFuncs(bytes, pos, end, outFuncs, ctx) {
|
|
110
|
+
while (true) {
|
|
111
|
+
if (pos >= end)
|
|
112
|
+
fail(`unexpected EOF in const expr (${ctx})`);
|
|
113
|
+
const op = bytes[pos++];
|
|
114
|
+
switch (op) {
|
|
115
|
+
case 0x0b: // end
|
|
116
|
+
return pos;
|
|
117
|
+
case 0xd2: {
|
|
118
|
+
// ref.func <funcidx:u32>
|
|
119
|
+
const r = readU32Leb(bytes, pos, end);
|
|
120
|
+
outFuncs.add(r.value);
|
|
121
|
+
pos = r.pos;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case 0xd0:
|
|
125
|
+
// ref.null <reftype>
|
|
126
|
+
if (pos >= end)
|
|
127
|
+
fail(`unexpected EOF after ref.null (${ctx})`);
|
|
128
|
+
pos += 1;
|
|
129
|
+
break;
|
|
130
|
+
case 0x23:
|
|
131
|
+
// global.get <globalidx:u32>
|
|
132
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
133
|
+
break;
|
|
134
|
+
case 0x41:
|
|
135
|
+
// i32.const <varint32>
|
|
136
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
137
|
+
break;
|
|
138
|
+
case 0x42:
|
|
139
|
+
// i64.const <varint64>
|
|
140
|
+
pos = skipLeb(bytes, pos, end, 10);
|
|
141
|
+
break;
|
|
142
|
+
case 0x43:
|
|
143
|
+
// f32.const <4 bytes>
|
|
144
|
+
if (pos + 4 > end)
|
|
145
|
+
fail(`unexpected EOF after f32.const (${ctx})`);
|
|
146
|
+
pos += 4;
|
|
147
|
+
break;
|
|
148
|
+
case 0x44:
|
|
149
|
+
// f64.const <8 bytes>
|
|
150
|
+
if (pos + 8 > end)
|
|
151
|
+
fail(`unexpected EOF after f64.const (${ctx})`);
|
|
152
|
+
pos += 8;
|
|
153
|
+
break;
|
|
154
|
+
// Accept a few ref ops that have no immediates (rare in const exprs, but safe to skip)
|
|
155
|
+
case 0xd1: // ref.is_null
|
|
156
|
+
case 0xd3: // ref.eq
|
|
157
|
+
case 0xd4: // ref.as_non_null
|
|
158
|
+
break;
|
|
159
|
+
default:
|
|
160
|
+
fail(`unsupported opcode 0x${op.toString(16)} in const expr (${ctx}). ` +
|
|
161
|
+
`If your modules use extended-const-exprs, we can add more opcode support.`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function parseLimitsU32(bytes, pos, end, ctx) {
|
|
166
|
+
if (pos >= end)
|
|
167
|
+
fail(`unexpected EOF in limits (${ctx})`);
|
|
168
|
+
const flags = bytes[pos++];
|
|
169
|
+
// Core variants:
|
|
170
|
+
// 0x00: min
|
|
171
|
+
// 0x01: min, max
|
|
172
|
+
// Additional variants exist in newer proposals (shared/memory64), but we just skip in a tolerant way.
|
|
173
|
+
if (flags === 0x00) {
|
|
174
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
175
|
+
return pos;
|
|
176
|
+
}
|
|
177
|
+
if (flags === 0x01 || flags === 0x03) {
|
|
178
|
+
// treat 0x03 (shared) same shape for skipping: min + max
|
|
179
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
180
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
181
|
+
return pos;
|
|
182
|
+
}
|
|
183
|
+
// Some proposals introduce more flags; best-effort: read min + max.
|
|
184
|
+
dbg(`limits(${ctx}) uses uncommon flags 0x${flags.toString(16)}; best-effort skipping min+max`);
|
|
185
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
186
|
+
pos = skipLeb(bytes, pos, end, 5);
|
|
187
|
+
return pos;
|
|
188
|
+
}
|
|
189
|
+
function parseTableType(bytes, pos, end) {
|
|
190
|
+
if (pos >= end)
|
|
191
|
+
fail("unexpected EOF in tabletype");
|
|
192
|
+
// reftype byte
|
|
193
|
+
pos += 1;
|
|
194
|
+
pos = parseLimitsU32(bytes, pos, end, "tabletype.limits");
|
|
195
|
+
return pos;
|
|
196
|
+
}
|
|
197
|
+
function parseMemType(bytes, pos, end) {
|
|
198
|
+
// memtype is limits
|
|
199
|
+
pos = parseLimitsU32(bytes, pos, end, "memtype.limits");
|
|
200
|
+
return pos;
|
|
201
|
+
}
|
|
202
|
+
function parseGlobalType(bytes, pos, end) {
|
|
203
|
+
if (pos + 2 > end)
|
|
204
|
+
fail("unexpected EOF in globaltype");
|
|
205
|
+
// valtype byte
|
|
206
|
+
pos += 1;
|
|
207
|
+
// mutability byte: 0 const, 1 var
|
|
208
|
+
const mut = bytes[pos++];
|
|
209
|
+
return { pos, mutable: mut === 1 };
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Element section parsing based on the spec forms 0..7:
|
|
213
|
+
* https://webassembly.github.io/spec/core/binary/modules.html#element-section
|
|
214
|
+
*/
|
|
215
|
+
function parseElementSectionCollectFuncIdxs(bytes, start, end, outFuncs) {
|
|
216
|
+
let pos = start;
|
|
217
|
+
const rCount = readU32Leb(bytes, pos, end);
|
|
218
|
+
const count = rCount.value;
|
|
219
|
+
pos = rCount.pos;
|
|
220
|
+
dbg(`element section: ${count} segment(s)`);
|
|
221
|
+
for (let i = 0; i < count; i++) {
|
|
222
|
+
const rForm = readU32Leb(bytes, pos, end);
|
|
223
|
+
const form = rForm.value;
|
|
224
|
+
pos = rForm.pos;
|
|
225
|
+
const segCollected = [];
|
|
226
|
+
const addFunc = (idx) => {
|
|
227
|
+
outFuncs.add(idx);
|
|
228
|
+
segCollected.push(idx);
|
|
229
|
+
};
|
|
230
|
+
const readFuncIdxVec = () => {
|
|
231
|
+
const rN = readU32Leb(bytes, pos, end);
|
|
232
|
+
const n = rN.value;
|
|
233
|
+
pos = rN.pos;
|
|
234
|
+
for (let k = 0; k < n; k++) {
|
|
235
|
+
const rF = readU32Leb(bytes, pos, end);
|
|
236
|
+
pos = rF.pos;
|
|
237
|
+
addFunc(rF.value);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
const readExprVec = (ctx) => {
|
|
241
|
+
const rN = readU32Leb(bytes, pos, end);
|
|
242
|
+
const n = rN.value;
|
|
243
|
+
pos = rN.pos;
|
|
244
|
+
for (let k = 0; k < n; k++) {
|
|
245
|
+
pos = parseConstExprCollectRefFuncs(bytes, pos, end, outFuncs, ctx);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
switch (form) {
|
|
249
|
+
case 0: {
|
|
250
|
+
// 0: u32, offset expr, vec(funcidx) (active, table 0, funcref implicit)
|
|
251
|
+
pos = parseConstExprCollectRefFuncs(bytes, pos, end, outFuncs, `elem[${i}].offset(form0)`);
|
|
252
|
+
readFuncIdxVec();
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
case 1: {
|
|
256
|
+
// 1: u32, elemkind, vec(funcidx) (passive)
|
|
257
|
+
if (pos >= end)
|
|
258
|
+
fail("unexpected EOF reading elemkind (form1)");
|
|
259
|
+
pos += 1; // elemkind
|
|
260
|
+
readFuncIdxVec();
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
case 2: {
|
|
264
|
+
// 2: u32, tableidx, offset expr, elemkind, vec(funcidx) (active, explicit table)
|
|
265
|
+
pos = readU32Leb(bytes, pos, end).pos; // tableidx
|
|
266
|
+
pos = parseConstExprCollectRefFuncs(bytes, pos, end, outFuncs, `elem[${i}].offset(form2)`);
|
|
267
|
+
if (pos >= end)
|
|
268
|
+
fail("unexpected EOF reading elemkind (form2)");
|
|
269
|
+
pos += 1; // elemkind
|
|
270
|
+
readFuncIdxVec();
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case 3: {
|
|
274
|
+
// 3: u32, elemkind, vec(funcidx) (declarative)
|
|
275
|
+
if (pos >= end)
|
|
276
|
+
fail("unexpected EOF reading elemkind (form3)");
|
|
277
|
+
pos += 1; // elemkind
|
|
278
|
+
readFuncIdxVec();
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case 4: {
|
|
282
|
+
// 4: u32, offset expr, vec(expr) (active, table 0, funcref implicit)
|
|
283
|
+
pos = parseConstExprCollectRefFuncs(bytes, pos, end, outFuncs, `elem[${i}].offset(form4)`);
|
|
284
|
+
readExprVec(`elem[${i}].init(form4)`);
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
case 5: {
|
|
288
|
+
// 5: u32, reftype, vec(expr) (passive)
|
|
289
|
+
if (pos >= end)
|
|
290
|
+
fail("unexpected EOF reading reftype (form5)");
|
|
291
|
+
pos += 1; // reftype
|
|
292
|
+
readExprVec(`elem[${i}].init(form5)`);
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
case 6: {
|
|
296
|
+
// 6: u32, tableidx, offset expr, vec(expr) (active, funcref implicit)
|
|
297
|
+
pos = readU32Leb(bytes, pos, end).pos; // tableidx
|
|
298
|
+
pos = parseConstExprCollectRefFuncs(bytes, pos, end, outFuncs, `elem[${i}].offset(form6)`);
|
|
299
|
+
readExprVec(`elem[${i}].init(form6)`);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case 7: {
|
|
303
|
+
// 7: u32, reftype, vec(expr) (declarative)
|
|
304
|
+
if (pos >= end)
|
|
305
|
+
fail("unexpected EOF reading reftype (form7)");
|
|
306
|
+
pos += 1; // reftype
|
|
307
|
+
readExprVec(`elem[${i}].init(form7)`);
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
default:
|
|
311
|
+
fail(`unknown element segment form ${form} (expected 0..7)`);
|
|
312
|
+
}
|
|
313
|
+
if (debugEnabled()) {
|
|
314
|
+
const uniq = Array.from(new Set(segCollected)).sort((a, b) => a - b);
|
|
315
|
+
dbg(` elem[${i}] form=${form} collected funcidx:`, uniq);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (pos !== end) {
|
|
319
|
+
// Not necessarily fatal, but useful signal.
|
|
320
|
+
dbg(`element section: parsed ${pos - start} bytes, expected ${end - start} bytes (diff=${end - pos})`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function parseExportSection(bytes, start, end, exportNames, alreadyExported) {
|
|
324
|
+
let pos = start;
|
|
325
|
+
const rCount = readU32Leb(bytes, pos, end);
|
|
326
|
+
const count = rCount.value;
|
|
327
|
+
pos = rCount.pos;
|
|
328
|
+
for (let i = 0; i < count; i++) {
|
|
329
|
+
const nm = readName(bytes, pos, end);
|
|
330
|
+
const name = nm.value;
|
|
331
|
+
pos = nm.pos;
|
|
332
|
+
if (pos >= end)
|
|
333
|
+
fail("unexpected EOF in export entry kind");
|
|
334
|
+
const kind = bytes[pos++];
|
|
335
|
+
const rIdx = readU32Leb(bytes, pos, end);
|
|
336
|
+
const idx = rIdx.value;
|
|
337
|
+
pos = rIdx.pos;
|
|
338
|
+
exportNames.add(name);
|
|
339
|
+
switch (kind) {
|
|
340
|
+
case 0: // func
|
|
341
|
+
alreadyExported.Func.add(idx);
|
|
342
|
+
break;
|
|
343
|
+
case 1: // table
|
|
344
|
+
alreadyExported.Table.add(idx);
|
|
345
|
+
break;
|
|
346
|
+
case 2: // mem
|
|
347
|
+
alreadyExported.Memory.add(idx);
|
|
348
|
+
break;
|
|
349
|
+
case 3: // global
|
|
350
|
+
alreadyExported.Global.add(idx);
|
|
351
|
+
break;
|
|
352
|
+
default:
|
|
353
|
+
// ignore unknown kinds (future-proof)
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
dbg("existing export names:", Array.from(exportNames).sort());
|
|
358
|
+
dbg("existing exported indices:", {
|
|
359
|
+
Func: Array.from(alreadyExported.Func).sort((a, b) => a - b),
|
|
360
|
+
Table: Array.from(alreadyExported.Table).sort((a, b) => a - b),
|
|
361
|
+
Memory: Array.from(alreadyExported.Memory).sort((a, b) => a - b),
|
|
362
|
+
Global: Array.from(alreadyExported.Global).sort((a, b) => a - b),
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
function scanWasmBinary(wasmBytes) {
|
|
366
|
+
const bytes = wasmBytes;
|
|
367
|
+
const endAll = bytes.length;
|
|
368
|
+
if (endAll < 8)
|
|
369
|
+
fail("WASM too small");
|
|
370
|
+
if (bytes[0] !== 0x00 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {
|
|
371
|
+
fail("bad WASM magic");
|
|
372
|
+
}
|
|
373
|
+
// version bytes[4..8) (ignored)
|
|
374
|
+
let pos = 8;
|
|
375
|
+
const exportNames = new Set();
|
|
376
|
+
const alreadyExported = {
|
|
377
|
+
Func: new Set(),
|
|
378
|
+
Table: new Set(),
|
|
379
|
+
Memory: new Set(),
|
|
380
|
+
Global: new Set(),
|
|
381
|
+
};
|
|
382
|
+
const funcsToExport = new Set();
|
|
383
|
+
let importTables = 0, localTables = 0;
|
|
384
|
+
let importMemories = 0, localMemories = 0;
|
|
385
|
+
let importGlobals = 0, localGlobals = 0;
|
|
386
|
+
const mutableGlobalsToExport = new Set();
|
|
387
|
+
const noteSection = (id) => {
|
|
388
|
+
switch (id) {
|
|
389
|
+
case 2:
|
|
390
|
+
return "import";
|
|
391
|
+
case 4:
|
|
392
|
+
return "table";
|
|
393
|
+
case 5:
|
|
394
|
+
return "memory";
|
|
395
|
+
case 6:
|
|
396
|
+
return "global";
|
|
397
|
+
case 7:
|
|
398
|
+
return "export";
|
|
399
|
+
case 9:
|
|
400
|
+
return "element";
|
|
401
|
+
default:
|
|
402
|
+
return `section(${id})`;
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
while (pos < endAll) {
|
|
406
|
+
const id = bytes[pos++];
|
|
407
|
+
const rSize = readU32Leb(bytes, pos, endAll);
|
|
408
|
+
const size = rSize.value;
|
|
409
|
+
pos = rSize.pos;
|
|
410
|
+
const start = pos;
|
|
411
|
+
const end = start + size;
|
|
412
|
+
if (end > endAll)
|
|
413
|
+
fail(`section ${id} size out of bounds`);
|
|
414
|
+
try {
|
|
415
|
+
if (id === 2) {
|
|
416
|
+
// import section
|
|
417
|
+
let p = start;
|
|
418
|
+
const rCount = readU32Leb(bytes, p, end);
|
|
419
|
+
const n = rCount.value;
|
|
420
|
+
p = rCount.pos;
|
|
421
|
+
for (let i = 0; i < n; i++) {
|
|
422
|
+
// module/name
|
|
423
|
+
p = readName(bytes, p, end).pos;
|
|
424
|
+
p = readName(bytes, p, end).pos;
|
|
425
|
+
if (p >= end)
|
|
426
|
+
fail("unexpected EOF in import kind");
|
|
427
|
+
const kind = bytes[p++];
|
|
428
|
+
switch (kind) {
|
|
429
|
+
case 0: // func
|
|
430
|
+
p = readU32Leb(bytes, p, end).pos; // typeidx
|
|
431
|
+
break;
|
|
432
|
+
case 1: // table
|
|
433
|
+
p = parseTableType(bytes, p, end);
|
|
434
|
+
importTables++;
|
|
435
|
+
break;
|
|
436
|
+
case 2: // mem
|
|
437
|
+
p = parseMemType(bytes, p, end);
|
|
438
|
+
importMemories++;
|
|
439
|
+
break;
|
|
440
|
+
case 3: {
|
|
441
|
+
// global
|
|
442
|
+
const gt = parseGlobalType(bytes, p, end);
|
|
443
|
+
p = gt.pos;
|
|
444
|
+
if (gt.mutable)
|
|
445
|
+
mutableGlobalsToExport.add(importGlobals);
|
|
446
|
+
importGlobals++;
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
case 4: // tag (future-proof)
|
|
450
|
+
p = readU32Leb(bytes, p, end).pos;
|
|
451
|
+
break;
|
|
452
|
+
default:
|
|
453
|
+
dbg(`unknown import kind ${kind}; cannot safely skip (bailing import parse)`);
|
|
454
|
+
// safest: bail parsing this section
|
|
455
|
+
i = n;
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
dbg("imports:", { importTables, importMemories, importGlobals });
|
|
460
|
+
}
|
|
461
|
+
else if (id === 4) {
|
|
462
|
+
// table section
|
|
463
|
+
let p = start;
|
|
464
|
+
const rCount = readU32Leb(bytes, p, end);
|
|
465
|
+
const n = rCount.value;
|
|
466
|
+
p = rCount.pos;
|
|
467
|
+
for (let i = 0; i < n; i++)
|
|
468
|
+
p = parseTableType(bytes, p, end);
|
|
469
|
+
localTables += n;
|
|
470
|
+
dbg("tables:", { localTables, totalTables: importTables + localTables });
|
|
471
|
+
}
|
|
472
|
+
else if (id === 5) {
|
|
473
|
+
// memory section
|
|
474
|
+
let p = start;
|
|
475
|
+
const rCount = readU32Leb(bytes, p, end);
|
|
476
|
+
const n = rCount.value;
|
|
477
|
+
p = rCount.pos;
|
|
478
|
+
for (let i = 0; i < n; i++)
|
|
479
|
+
p = parseMemType(bytes, p, end);
|
|
480
|
+
localMemories += n;
|
|
481
|
+
dbg("memories:", { localMemories, totalMemories: importMemories + localMemories });
|
|
482
|
+
}
|
|
483
|
+
else if (id === 6) {
|
|
484
|
+
// global section
|
|
485
|
+
let p = start;
|
|
486
|
+
const rCount = readU32Leb(bytes, p, end);
|
|
487
|
+
const n = rCount.value;
|
|
488
|
+
p = rCount.pos;
|
|
489
|
+
let globalIndex = importGlobals;
|
|
490
|
+
for (let i = 0; i < n; i++) {
|
|
491
|
+
const gt = parseGlobalType(bytes, p, end);
|
|
492
|
+
p = gt.pos;
|
|
493
|
+
if (gt.mutable)
|
|
494
|
+
mutableGlobalsToExport.add(globalIndex);
|
|
495
|
+
// init expr (also collect ref.func if present)
|
|
496
|
+
p = parseConstExprCollectRefFuncs(bytes, p, end, funcsToExport, `global[${globalIndex}].init`);
|
|
497
|
+
globalIndex++;
|
|
498
|
+
}
|
|
499
|
+
localGlobals += n;
|
|
500
|
+
dbg("globals:", {
|
|
501
|
+
localGlobals,
|
|
502
|
+
totalGlobals: importGlobals + localGlobals,
|
|
503
|
+
mutableGlobals: Array.from(mutableGlobalsToExport).sort((a, b) => a - b),
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
else if (id === 7) {
|
|
507
|
+
// export section
|
|
508
|
+
parseExportSection(bytes, start, end, exportNames, alreadyExported);
|
|
509
|
+
}
|
|
510
|
+
else if (id === 9) {
|
|
511
|
+
// element section (the big one we care about for function refs)
|
|
512
|
+
parseElementSectionCollectFuncIdxs(bytes, start, end, funcsToExport);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
catch (e) {
|
|
516
|
+
dbg(`parse error in ${noteSection(id)}:`, e);
|
|
517
|
+
// keep going; we'll still try to add exports using whatever we found
|
|
518
|
+
}
|
|
519
|
+
pos = end;
|
|
520
|
+
}
|
|
521
|
+
const totalTables = importTables + localTables;
|
|
522
|
+
const totalMemories = importMemories + localMemories;
|
|
523
|
+
dbg("binary scan summary:", {
|
|
524
|
+
funcsToExport: Array.from(funcsToExport).sort((a, b) => a - b),
|
|
525
|
+
mutableGlobalsToExport: Array.from(mutableGlobalsToExport).sort((a, b) => a - b),
|
|
526
|
+
totalTables,
|
|
527
|
+
totalMemories,
|
|
528
|
+
});
|
|
529
|
+
return {
|
|
530
|
+
exportNames,
|
|
531
|
+
alreadyExported,
|
|
532
|
+
funcsToExport,
|
|
533
|
+
mutableGlobalsToExport,
|
|
534
|
+
totalMemories,
|
|
535
|
+
totalTables,
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
/* =======================================================================================
|
|
539
|
+
* Main entry
|
|
540
|
+
* ======================================================================================= */
|
|
541
|
+
export async function preprocess_wasm_bytes(wasmBytes) {
|
|
542
|
+
await ensureNodeLikeGlobals();
|
|
543
|
+
const [{ decode }, astMod, { addWithAST }] = await Promise.all([
|
|
544
|
+
import("@webassemblyjs/wasm-parser"),
|
|
545
|
+
import("@webassemblyjs/ast"),
|
|
546
|
+
import("@webassemblyjs/wasm-edit"),
|
|
547
|
+
]);
|
|
548
|
+
const t = astMod;
|
|
549
|
+
// Binary scan is authoritative for "what should be exported"
|
|
550
|
+
const { exportNames, alreadyExported, funcsToExport, mutableGlobalsToExport, totalMemories, totalTables, } = scanWasmBinary(wasmBytes);
|
|
551
|
+
// Decode AST for editing
|
|
552
|
+
const ast = decode(wasmBytes, {
|
|
553
|
+
ignoreCodeSection: false,
|
|
554
|
+
ignoreDataSection: true,
|
|
555
|
+
});
|
|
556
|
+
const newNodes = [];
|
|
557
|
+
// 1) Export functions found via element section / ref.func const-exprs
|
|
558
|
+
const funcList = Array.from(funcsToExport).sort((a, b) => a - b);
|
|
559
|
+
for (const idx of funcList) {
|
|
560
|
+
if (alreadyExported.Func.has(idx))
|
|
561
|
+
continue;
|
|
562
|
+
const name = uniqueName(`__f${idx}`, exportNames, `__f${idx}`);
|
|
563
|
+
newNodes.push(t.moduleExport(name, t.moduleExportDescr("Func", t.indexLiteral(idx))));
|
|
564
|
+
alreadyExported.Func.add(idx);
|
|
565
|
+
}
|
|
566
|
+
// 2) Export mutable globals
|
|
567
|
+
const globList = Array.from(mutableGlobalsToExport).sort((a, b) => a - b);
|
|
568
|
+
for (const idx of globList) {
|
|
569
|
+
if (alreadyExported.Global.has(idx))
|
|
570
|
+
continue;
|
|
571
|
+
const name = uniqueName(`__global_${idx}`, exportNames, `__global_${idx}`);
|
|
572
|
+
newNodes.push(t.moduleExport(name, t.moduleExportDescr("Global", t.indexLiteral(idx))));
|
|
573
|
+
alreadyExported.Global.add(idx);
|
|
574
|
+
}
|
|
575
|
+
// 3) Export all memories
|
|
576
|
+
for (let idx = 0; idx < totalMemories; idx++) {
|
|
577
|
+
if (alreadyExported.Memory.has(idx))
|
|
578
|
+
continue;
|
|
579
|
+
const name = uniqueName(`__memory_${idx}`, exportNames, `__memory_${idx}`);
|
|
580
|
+
newNodes.push(t.moduleExport(name, t.moduleExportDescr("Memory", t.indexLiteral(idx))));
|
|
581
|
+
alreadyExported.Memory.add(idx);
|
|
582
|
+
}
|
|
583
|
+
// 4) Export all tables (unconditional)
|
|
584
|
+
for (let idx = 0; idx < totalTables; idx++) {
|
|
585
|
+
if (alreadyExported.Table.has(idx))
|
|
586
|
+
continue;
|
|
587
|
+
const name = uniqueName(`__table_${idx}`, exportNames, `__table_${idx}`);
|
|
588
|
+
newNodes.push(t.moduleExport(name, t.moduleExportDescr("Table", t.indexLiteral(idx))));
|
|
589
|
+
alreadyExported.Table.add(idx);
|
|
590
|
+
}
|
|
591
|
+
if (newNodes.length === 0)
|
|
592
|
+
return wasmBytes;
|
|
593
|
+
const out = addWithAST(ast, toExactArrayBuffer(wasmBytes), newNodes);
|
|
594
|
+
return new Uint8Array(out);
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=preprocess_wasm_bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess_wasm_bytes.js","sourceRoot":"","sources":["../src/preprocess_wasm_bytes.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "preprocess-wasm-bytes",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Preprocess a WebAssembly binary by adding exports for table-referenced functions, mutable globals, memories, and tables.",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"scripts": {
|
|
21
|
+
"gen:sample-wasm": "node scripts/gen-sample-wasm.mjs",
|
|
22
|
+
"dev": "npm run gen:sample-wasm && vite",
|
|
23
|
+
"build": "npm run gen:sample-wasm && vite build",
|
|
24
|
+
"preview": "vite preview",
|
|
25
|
+
|
|
26
|
+
"clean": "node -e \"import('node:fs').then(fs=>fs.rmSync('dist',{recursive:true,force:true}))\"",
|
|
27
|
+
"build:lib": "npm run clean && tsc -p tsconfig.lib.json",
|
|
28
|
+
"prepublishOnly": "npm run build:lib"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@webassemblyjs/ast": "^1.14.1",
|
|
32
|
+
"@webassemblyjs/wasm-edit": "^1.14.1",
|
|
33
|
+
"@webassemblyjs/wasm-parser": "^1.14.1",
|
|
34
|
+
"buffer": "^6.0.3"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"typescript": "^5.9.3",
|
|
38
|
+
"vite": "^7.2.6",
|
|
39
|
+
"wabt": "^1.0.39"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20.19.0"
|
|
43
|
+
}
|
|
44
|
+
}
|