wasm-game-ts 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 +57 -0
- package/dist/hash.d.ts +3 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +15 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs.d.ts +61 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +143 -0
- package/dist/inputs.js.map +1 -0
- package/dist/keycodes.d.ts +3 -0
- package/dist/keycodes.d.ts.map +1 -0
- package/dist/keycodes.js +73 -0
- package/dist/keycodes.js.map +1 -0
- package/dist/package.d.ts +45 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +765 -0
- package/dist/package.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/wasm-game.d.ts +22 -0
- package/dist/wasm-game.d.ts.map +1 -0
- package/dist/wasm-game.js +164 -0
- package/dist/wasm-game.js.map +1 -0
- package/dist/worker/assets/OFL.txt +88 -0
- package/dist/worker/assets/PressStart2P-Regular.ttf +0 -0
- package/dist/worker/fonts.d.ts +2 -0
- package/dist/worker/fonts.d.ts.map +1 -0
- package/dist/worker/fonts.js +159 -0
- package/dist/worker/fonts.js.map +1 -0
- package/dist/worker/renderer.d.ts +34 -0
- package/dist/worker/renderer.d.ts.map +1 -0
- package/dist/worker/renderer.js +504 -0
- package/dist/worker/renderer.js.map +1 -0
- package/dist/worker/snapshotter.d.ts +17 -0
- package/dist/worker/snapshotter.d.ts.map +1 -0
- package/dist/worker/snapshotter.js +190 -0
- package/dist/worker/snapshotter.js.map +1 -0
- package/dist/worker/wasm-host.d.ts +18 -0
- package/dist/worker/wasm-host.d.ts.map +1 -0
- package/dist/worker/wasm-host.js +42 -0
- package/dist/worker/wasm-host.js.map +1 -0
- package/dist/worker/worker.d.ts +2 -0
- package/dist/worker/worker.d.ts.map +1 -0
- package/dist/worker/worker.js +311 -0
- package/dist/worker/worker.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
const NULL_REF = -1;
|
|
2
|
+
export class WasmSnapshotter {
|
|
3
|
+
constructor(instance, module) {
|
|
4
|
+
this.instance = instance;
|
|
5
|
+
this.module = module;
|
|
6
|
+
this.funcList = [];
|
|
7
|
+
this.funcIndexByFunc = new Map();
|
|
8
|
+
this.globals_num = [];
|
|
9
|
+
this.globals_i64 = [];
|
|
10
|
+
this.globals_funcref = [];
|
|
11
|
+
this.tables = [];
|
|
12
|
+
this.memories = [];
|
|
13
|
+
this.gatherExports();
|
|
14
|
+
}
|
|
15
|
+
createSnapshot() {
|
|
16
|
+
const snap = {
|
|
17
|
+
globals_num: new Float64Array(this.globals_num.length),
|
|
18
|
+
globals_i64: new BigInt64Array(this.globals_i64.length),
|
|
19
|
+
globals_funcref: new Int32Array(this.globals_funcref.length).fill(NULL_REF),
|
|
20
|
+
tables: this.tables.map((t) => ({
|
|
21
|
+
table: new Int32Array(t.length).fill(NULL_REF),
|
|
22
|
+
})),
|
|
23
|
+
memories: this.memories.map(() => ({ pageCount: 0, bytes: new Uint8Array() })),
|
|
24
|
+
};
|
|
25
|
+
// globals (numbers)
|
|
26
|
+
for (let i = 0; i < this.globals_num.length; i++) {
|
|
27
|
+
snap.globals_num[i] = this.globals_num[i].value;
|
|
28
|
+
}
|
|
29
|
+
// globals (i64)
|
|
30
|
+
for (let i = 0; i < this.globals_i64.length; i++) {
|
|
31
|
+
snap.globals_i64[i] = this.globals_i64[i].value;
|
|
32
|
+
}
|
|
33
|
+
// globals (funcref)
|
|
34
|
+
for (let i = 0; i < this.globals_funcref.length; i++) {
|
|
35
|
+
const v = this.globals_funcref[i].value;
|
|
36
|
+
if (v === null) {
|
|
37
|
+
snap.globals_funcref[i] = NULL_REF;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const idx = v ? this.funcIndexByFunc.get(v.name) : NULL_REF;
|
|
41
|
+
if (idx === undefined) {
|
|
42
|
+
throw new Error('Snapshot funcref global points to a function not present in exported function list.');
|
|
43
|
+
}
|
|
44
|
+
snap.globals_funcref[i] = idx;
|
|
45
|
+
}
|
|
46
|
+
// tables
|
|
47
|
+
for (let ti = 0; ti < this.tables.length; ti++) {
|
|
48
|
+
const t = this.tables[ti];
|
|
49
|
+
const out = snap.tables[ti].table;
|
|
50
|
+
for (let i = 0; i < t.length; i++) {
|
|
51
|
+
const v = t.get(i);
|
|
52
|
+
if (v === null) {
|
|
53
|
+
out[i] = NULL_REF;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const idx = v ? this.funcIndexByFunc.get(v.name) : NULL_REF;
|
|
57
|
+
if (idx === undefined) {
|
|
58
|
+
//console.error('Snapshot table contains a function not present in exported function list.', v);
|
|
59
|
+
throw new Error('Snapshot table contains a function not present in exported function list.');
|
|
60
|
+
}
|
|
61
|
+
out[i] = idx;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// memories (deep copy)
|
|
65
|
+
for (let mi = 0; mi < this.memories.length; mi++) {
|
|
66
|
+
const m = this.memories[mi];
|
|
67
|
+
const pageCount = m.buffer.byteLength >>> 16; // 64KiB pages
|
|
68
|
+
const bytes = new Uint8Array(m.buffer.byteLength);
|
|
69
|
+
bytes.set(new Uint8Array(m.buffer));
|
|
70
|
+
snap.memories[mi] = { pageCount, bytes };
|
|
71
|
+
}
|
|
72
|
+
return snap;
|
|
73
|
+
}
|
|
74
|
+
loadSnapshot(snap) {
|
|
75
|
+
if (snap.globals_num.length !== this.globals_num.length) {
|
|
76
|
+
throw new Error(`Snapshot globals_num length mismatch: got ${snap.globals_num.length}, expected ${this.globals_num.length}`);
|
|
77
|
+
}
|
|
78
|
+
if (snap.globals_i64.length !== this.globals_i64.length) {
|
|
79
|
+
throw new Error(`Snapshot globals_i64 length mismatch: got ${snap.globals_i64.length}, expected ${this.globals_i64.length}`);
|
|
80
|
+
}
|
|
81
|
+
if (snap.globals_funcref.length !== this.globals_funcref.length) {
|
|
82
|
+
throw new Error(`Snapshot globals_funcref length mismatch: got ${snap.globals_funcref.length}, expected ${this.globals_funcref.length}`);
|
|
83
|
+
}
|
|
84
|
+
if (snap.tables.length !== this.tables.length) {
|
|
85
|
+
throw new Error(`Snapshot tables length mismatch: got ${snap.tables.length}, expected ${this.tables.length}`);
|
|
86
|
+
}
|
|
87
|
+
if (snap.memories.length !== this.memories.length) {
|
|
88
|
+
throw new Error(`Snapshot memories length mismatch: got ${snap.memories.length}, expected ${this.memories.length}`);
|
|
89
|
+
}
|
|
90
|
+
// restore globals (numbers)
|
|
91
|
+
for (let i = 0; i < this.globals_num.length; i++) {
|
|
92
|
+
this.globals_num[i].value = snap.globals_num[i];
|
|
93
|
+
}
|
|
94
|
+
// restore globals (i64)
|
|
95
|
+
for (let i = 0; i < this.globals_i64.length; i++) {
|
|
96
|
+
this.globals_i64[i].value = snap.globals_i64[i];
|
|
97
|
+
}
|
|
98
|
+
// restore globals (funcref)
|
|
99
|
+
for (let i = 0; i < this.globals_funcref.length; i++) {
|
|
100
|
+
const idx = snap.globals_funcref[i];
|
|
101
|
+
this.globals_funcref[i].value = idx === NULL_REF ? null : this.funcList[idx];
|
|
102
|
+
}
|
|
103
|
+
// restore tables (grow if needed; never shrink)
|
|
104
|
+
for (let ti = 0; ti < this.tables.length; ti++) {
|
|
105
|
+
const t = this.tables[ti];
|
|
106
|
+
const src = snap.tables[ti].table;
|
|
107
|
+
if (t.length < src.length) {
|
|
108
|
+
t.grow(src.length - t.length);
|
|
109
|
+
}
|
|
110
|
+
for (let i = 0; i < src.length; i++) {
|
|
111
|
+
const idx = src[i];
|
|
112
|
+
t.set(i, idx === NULL_REF ? null : this.funcList[idx]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// restore memories (grow if needed; never shrink)
|
|
116
|
+
for (let mi = 0; mi < this.memories.length; mi++) {
|
|
117
|
+
const m = this.memories[mi];
|
|
118
|
+
const snapMem = snap.memories[mi];
|
|
119
|
+
const curPageCount = m.grow(0);
|
|
120
|
+
if (curPageCount < snapMem.pageCount) {
|
|
121
|
+
m.grow(snapMem.pageCount - curPageCount);
|
|
122
|
+
}
|
|
123
|
+
// NOTE: If current memory is larger than snapshot memory, we intentionally do NOT shrink
|
|
124
|
+
// and do NOT clear the extra bytes (per your "don’t worry about discrepancies" instruction).
|
|
125
|
+
new Uint8Array(m.buffer).set(snapMem.bytes);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
gatherExports() {
|
|
129
|
+
const exps = WebAssembly.Module.exports(this.module);
|
|
130
|
+
for (const exp of exps) {
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
132
|
+
const x = this.instance.exports[exp.name];
|
|
133
|
+
switch (exp.kind) {
|
|
134
|
+
case 'function': {
|
|
135
|
+
if (typeof x !== 'function')
|
|
136
|
+
break;
|
|
137
|
+
const fn = x;
|
|
138
|
+
const idx = this.funcList.length;
|
|
139
|
+
this.funcList.push(fn);
|
|
140
|
+
this.funcIndexByFunc.set(fn.name, idx);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 'global': {
|
|
144
|
+
if (!(x instanceof WebAssembly.Global))
|
|
145
|
+
break;
|
|
146
|
+
const g = x;
|
|
147
|
+
// mutable?
|
|
148
|
+
const mutable = (() => {
|
|
149
|
+
try {
|
|
150
|
+
const v = g.value;
|
|
151
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
152
|
+
g.value = v;
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
})();
|
|
159
|
+
if (!mutable)
|
|
160
|
+
break;
|
|
161
|
+
const v = g.value;
|
|
162
|
+
if (typeof v === 'bigint')
|
|
163
|
+
this.globals_i64.push(g);
|
|
164
|
+
else if (typeof v === 'number')
|
|
165
|
+
this.globals_num.push(g);
|
|
166
|
+
else if (typeof v === 'function' || v === null)
|
|
167
|
+
this.globals_funcref.push(g);
|
|
168
|
+
else {
|
|
169
|
+
// externref or other ref types: not supported by this snapshot format
|
|
170
|
+
throw new Error(`Unsupported mutable global type for snapshot: ${typeof v}`);
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
case 'table': {
|
|
175
|
+
if (!(x instanceof WebAssembly.Table))
|
|
176
|
+
break;
|
|
177
|
+
this.tables.push(x);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case 'memory': {
|
|
181
|
+
if (!(x instanceof WebAssembly.Memory))
|
|
182
|
+
break;
|
|
183
|
+
this.memories.push(x);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=snapshotter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotter.js","sourceRoot":"","sources":["../../src/worker/snapshotter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface HostStateView {
|
|
2
|
+
stateHash: bigint;
|
|
3
|
+
fps: number;
|
|
4
|
+
timeMs: number;
|
|
5
|
+
numPlayers: number;
|
|
6
|
+
maxPlayers: number;
|
|
7
|
+
renderBufPtr: number;
|
|
8
|
+
renderBufLen: number;
|
|
9
|
+
audioBufPtr: number;
|
|
10
|
+
audioBufLen: number;
|
|
11
|
+
debugBufPtr: number;
|
|
12
|
+
debugBufLen: number;
|
|
13
|
+
manifestBufPtr: number;
|
|
14
|
+
manifestBufLen: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function readHostState(mem: ArrayBuffer, offset: number): HostStateView;
|
|
17
|
+
export declare function hostStateHashHex(h: HostStateView): string;
|
|
18
|
+
//# sourceMappingURL=wasm-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-host.d.ts","sourceRoot":"","sources":["../../src/worker/wasm-host.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAGpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CA0C7E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { u64Hex } from '../hash.js';
|
|
2
|
+
export function readHostState(mem, offset) {
|
|
3
|
+
const dv = new DataView(mem);
|
|
4
|
+
const o = offset >>> 0;
|
|
5
|
+
// Layout must match Rust repr(C) HostState:
|
|
6
|
+
// u64, f32, f32, u8, u8, pad2,
|
|
7
|
+
// u32 x 8 (render/audio/debug/manifest ptr+len),
|
|
8
|
+
// pad4
|
|
9
|
+
// = 56 bytes total
|
|
10
|
+
const stateHash = dv.getBigUint64(o + 0, true);
|
|
11
|
+
const fps = dv.getFloat32(o + 8, true);
|
|
12
|
+
const timeMs = dv.getFloat32(o + 12, true);
|
|
13
|
+
const numPlayers = dv.getUint8(o + 16);
|
|
14
|
+
const maxPlayers = dv.getUint8(o + 17);
|
|
15
|
+
const renderBufPtr = dv.getUint32(o + 20, true);
|
|
16
|
+
const renderBufLen = dv.getUint32(o + 24, true);
|
|
17
|
+
const audioBufPtr = dv.getUint32(o + 28, true);
|
|
18
|
+
const audioBufLen = dv.getUint32(o + 32, true);
|
|
19
|
+
const debugBufPtr = dv.getUint32(o + 36, true);
|
|
20
|
+
const debugBufLen = dv.getUint32(o + 40, true);
|
|
21
|
+
const manifestBufPtr = dv.getUint32(o + 44, true);
|
|
22
|
+
const manifestBufLen = dv.getUint32(o + 48, true);
|
|
23
|
+
return {
|
|
24
|
+
stateHash,
|
|
25
|
+
fps,
|
|
26
|
+
timeMs,
|
|
27
|
+
numPlayers,
|
|
28
|
+
maxPlayers,
|
|
29
|
+
renderBufPtr,
|
|
30
|
+
renderBufLen,
|
|
31
|
+
audioBufPtr,
|
|
32
|
+
audioBufLen,
|
|
33
|
+
debugBufPtr,
|
|
34
|
+
debugBufLen,
|
|
35
|
+
manifestBufPtr,
|
|
36
|
+
manifestBufLen,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function hostStateHashHex(h) {
|
|
40
|
+
return u64Hex(h.stateHash);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=wasm-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-host.js","sourceRoot":"","sources":["../../src/worker/wasm-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAuBpC,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,MAAc;IAC5D,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;IAEvB,4CAA4C;IAC5C,+BAA+B;IAC/B,iDAAiD;IACjD,OAAO;IACP,mBAAmB;IACnB,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAE/C,MAAM,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAElD,OAAO;QACL,SAAS;QACT,GAAG;QACH,MAAM;QACN,UAAU;QACV,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,cAAc;QACd,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAgB;IAC/C,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { gatherWasmStateSnapshotTransferables } from '../types.js';
|
|
2
|
+
import { fnv1a32 } from '../hash.js';
|
|
3
|
+
import { readHostState, hostStateHashHex } from './wasm-host.js';
|
|
4
|
+
import { Renderer2D } from './renderer.js';
|
|
5
|
+
import { ensureDefaultFontsLoaded } from './fonts.js';
|
|
6
|
+
import { WasmSnapshotter } from './snapshotter.js';
|
|
7
|
+
let wasmInstance = null;
|
|
8
|
+
let wasmExports = null;
|
|
9
|
+
let wasmMemory = null;
|
|
10
|
+
// Keep a cached view, but refresh if memory grows.
|
|
11
|
+
let memU8 = new Uint8Array(0);
|
|
12
|
+
let currentFilesById = null;
|
|
13
|
+
function refreshMemoryViews() {
|
|
14
|
+
if (!wasmMemory)
|
|
15
|
+
return;
|
|
16
|
+
if (memU8.buffer !== wasmMemory.buffer) {
|
|
17
|
+
memU8 = new Uint8Array(wasmMemory.buffer);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class WasmRunner {
|
|
21
|
+
constructor(exports, hostStateOffset, moduleHash, filesById, snapshotter) {
|
|
22
|
+
this.exports = exports;
|
|
23
|
+
this.memory = exports.memory;
|
|
24
|
+
this.memBuf = this.memory.buffer;
|
|
25
|
+
this.memU8 = new Uint8Array(this.memBuf);
|
|
26
|
+
this.hostStateOffset = hostStateOffset >>> 0;
|
|
27
|
+
this.filesById = filesById;
|
|
28
|
+
this.moduleHash = moduleHash | 0;
|
|
29
|
+
this.snapshotter = snapshotter;
|
|
30
|
+
}
|
|
31
|
+
refreshMemViews() {
|
|
32
|
+
if (this.memBuf !== this.memory.buffer) {
|
|
33
|
+
this.memBuf = this.memory.buffer;
|
|
34
|
+
this.memU8 = new Uint8Array(this.memBuf);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getMemU8() {
|
|
38
|
+
this.refreshMemViews();
|
|
39
|
+
return this.memU8;
|
|
40
|
+
}
|
|
41
|
+
getFileBytes(id, ptr) {
|
|
42
|
+
const entry = this.filesById.get(id | 0);
|
|
43
|
+
if (!entry)
|
|
44
|
+
return 0;
|
|
45
|
+
const bytes = entry.bytes;
|
|
46
|
+
if ((ptr | 0) === 0) {
|
|
47
|
+
return bytes.byteLength >>> 0;
|
|
48
|
+
}
|
|
49
|
+
const mem = this.getMemU8();
|
|
50
|
+
const p = ptr >>> 0;
|
|
51
|
+
const len = bytes.byteLength >>> 0;
|
|
52
|
+
if (p + len > mem.byteLength) {
|
|
53
|
+
throw new Error(`get_file_bytes out of bounds: ptr=${p} len=${len} mem=${mem.byteLength}`);
|
|
54
|
+
}
|
|
55
|
+
mem.set(bytes, p);
|
|
56
|
+
return len;
|
|
57
|
+
}
|
|
58
|
+
doUpdate(inputBuffer, renderForPlayer) {
|
|
59
|
+
const input = new Uint8Array(inputBuffer);
|
|
60
|
+
const ptr = this.exports.update_start(input.byteLength | 0);
|
|
61
|
+
if (input.byteLength > 0 && ptr !== 0) {
|
|
62
|
+
const mem = this.getMemU8();
|
|
63
|
+
mem.set(input, ptr >>> 0);
|
|
64
|
+
}
|
|
65
|
+
this.exports.update_end(renderForPlayer | 0);
|
|
66
|
+
// Read HostState
|
|
67
|
+
this.refreshMemViews();
|
|
68
|
+
const hs = readHostState(this.memory.buffer, this.hostStateOffset);
|
|
69
|
+
// Render / debug
|
|
70
|
+
const mem = this.getMemU8();
|
|
71
|
+
let debugLog = '';
|
|
72
|
+
if (hs.debugBufLen > 0 && hs.debugBufPtr > 0 && hs.debugBufPtr + hs.debugBufLen <= mem.byteLength) {
|
|
73
|
+
const dbg = new Uint8Array(mem.buffer, hs.debugBufPtr, hs.debugBufLen);
|
|
74
|
+
debugLog = new TextDecoder('utf-8').decode(dbg);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
stateHashHex: hostStateHashHex(hs),
|
|
78
|
+
fps: hs.fps,
|
|
79
|
+
timeMs: hs.timeMs,
|
|
80
|
+
numPlayers: hs.numPlayers,
|
|
81
|
+
maxPlayers: hs.maxPlayers,
|
|
82
|
+
renderBytes: hs.renderBufLen,
|
|
83
|
+
audioBytes: hs.audioBufLen,
|
|
84
|
+
debugBytes: hs.debugBufLen,
|
|
85
|
+
debugLog,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
readHostStateNow() {
|
|
89
|
+
this.refreshMemViews();
|
|
90
|
+
return readHostState(this.memory.buffer, this.hostStateOffset);
|
|
91
|
+
}
|
|
92
|
+
createSnapshot() {
|
|
93
|
+
return {
|
|
94
|
+
moduleHash: this.moduleHash | 0,
|
|
95
|
+
hostStateOffset: this.hostStateOffset >>> 0,
|
|
96
|
+
snapshot: this.snapshotter.createSnapshot(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
loadSnapshot(s) {
|
|
100
|
+
if (((s.moduleHash | 0) !== (this.moduleHash | 0))) {
|
|
101
|
+
throw new Error(`Snapshot moduleHash mismatch: snapshot=${s.moduleHash | 0} runner=${this.moduleHash | 0}`);
|
|
102
|
+
}
|
|
103
|
+
// IMPORTANT: Use the snapshot’s offset; never call init_start() again to “re-discover” it.
|
|
104
|
+
this.hostStateOffset = s.hostStateOffset >>> 0;
|
|
105
|
+
this.snapshotter.loadSnapshot(s.snapshot);
|
|
106
|
+
// Refresh views in case memory grew while loading the snapshot
|
|
107
|
+
this.refreshMemViews();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
let runner = null;
|
|
111
|
+
let renderer = null;
|
|
112
|
+
let taskQueue = [];
|
|
113
|
+
let processing = false;
|
|
114
|
+
function post(msg, transfer) {
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
+
self.postMessage(msg, transfer ?? []);
|
|
117
|
+
}
|
|
118
|
+
function getFileBytesHost(id, ptr) {
|
|
119
|
+
if (!currentFilesById) {
|
|
120
|
+
throw new Error('Package not loaded (get_file_bytes)');
|
|
121
|
+
}
|
|
122
|
+
if (!wasmMemory) {
|
|
123
|
+
throw new Error('WASM memory not available yet (get_file_bytes)');
|
|
124
|
+
}
|
|
125
|
+
refreshMemoryViews();
|
|
126
|
+
const entry = currentFilesById.get(id | 0);
|
|
127
|
+
if (!entry)
|
|
128
|
+
return 0;
|
|
129
|
+
const src = entry.bytes instanceof Uint8Array ? entry.bytes : new Uint8Array(entry.bytes);
|
|
130
|
+
const len = src.byteLength >>> 0;
|
|
131
|
+
// Contract: ptr == 0 => return length only
|
|
132
|
+
if ((ptr | 0) === 0)
|
|
133
|
+
return len;
|
|
134
|
+
const dstPtr = ptr >>> 0;
|
|
135
|
+
if (len === 0)
|
|
136
|
+
return 0;
|
|
137
|
+
if (dstPtr + len > memU8.length) {
|
|
138
|
+
throw new Error(`get_file_bytes OOB write (ptr=${dstPtr}, len=${len}, mem=${memU8.length})`);
|
|
139
|
+
}
|
|
140
|
+
memU8.set(src, dstPtr);
|
|
141
|
+
return len;
|
|
142
|
+
}
|
|
143
|
+
async function instantiateWasm(pkg, randomSeed) {
|
|
144
|
+
// Build file map
|
|
145
|
+
const filesById = new Map();
|
|
146
|
+
for (const f of pkg.files) {
|
|
147
|
+
filesById.set(f.id | 0, { bytes: new Uint8Array(f.bytes) });
|
|
148
|
+
}
|
|
149
|
+
const wasmEntry = filesById.get(pkg.wasmId | 0);
|
|
150
|
+
if (!wasmEntry)
|
|
151
|
+
throw new Error(`WASM file not found in package for wasmId=${pkg.wasmId}`);
|
|
152
|
+
currentFilesById = filesById;
|
|
153
|
+
const manifestEntry = filesById.get(-1);
|
|
154
|
+
if (!manifestEntry) {
|
|
155
|
+
throw new Error('Manifest file (id=-1) not found in package.');
|
|
156
|
+
}
|
|
157
|
+
const wasmBytes = wasmEntry.bytes;
|
|
158
|
+
const wasmBuffer = wasmBytes.buffer;
|
|
159
|
+
// module_hash = deterministic hash of wasm bytes
|
|
160
|
+
const moduleHash = fnv1a32(wasmBytes) | 0;
|
|
161
|
+
const imports = {
|
|
162
|
+
env: {
|
|
163
|
+
get_file_bytes: (id, ptr) => getFileBytesHost(id, ptr),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
const module = await WebAssembly.compile(wasmBuffer);
|
|
167
|
+
const instance = await WebAssembly.instantiate(module, imports);
|
|
168
|
+
const ex = instance.exports;
|
|
169
|
+
wasmInstance = instance;
|
|
170
|
+
wasmExports = ex;
|
|
171
|
+
if (!ex.memory || !ex.init_start || !ex.init_end || !ex.update_start || !ex.update_end) {
|
|
172
|
+
throw new Error('WASM exports missing: expected memory/init_start/init_end/update_start/update_end');
|
|
173
|
+
}
|
|
174
|
+
const memory = ex.memory;
|
|
175
|
+
if (!(memory instanceof WebAssembly.Memory)) {
|
|
176
|
+
throw new Error('WASM exports.memory missing or not a WebAssembly.Memory');
|
|
177
|
+
}
|
|
178
|
+
wasmMemory = memory;
|
|
179
|
+
refreshMemoryViews();
|
|
180
|
+
const snapshotter = new WasmSnapshotter(instance, module);
|
|
181
|
+
// Create runner now that memory exists
|
|
182
|
+
const exports = ex;
|
|
183
|
+
const manifestBytes = manifestEntry.bytes;
|
|
184
|
+
const manifestLen = manifestBytes.byteLength >>> 0;
|
|
185
|
+
// 1) init_start allocates HostState + manifest staging buffer and publishes its ptr/len in HostState
|
|
186
|
+
const hostStateOffset = exports.init_start(randomSeed | 0, moduleHash | 0, manifestLen | 0) >>> 0;
|
|
187
|
+
// init_start may allocate / grow memory; refresh views before writing
|
|
188
|
+
refreshMemoryViews();
|
|
189
|
+
// 2) Read HostState to find where to write the manifest bytes
|
|
190
|
+
const hs0 = readHostState(memory.buffer, hostStateOffset);
|
|
191
|
+
const ptr = hs0.manifestBufPtr >>> 0;
|
|
192
|
+
const len = hs0.manifestBufLen >>> 0;
|
|
193
|
+
if (len !== manifestLen) {
|
|
194
|
+
throw new Error(`WASM manifest buffer size mismatch: wasm=${len} host=${manifestLen}`);
|
|
195
|
+
}
|
|
196
|
+
if (len > 0) {
|
|
197
|
+
if (ptr === 0)
|
|
198
|
+
throw new Error('WASM manifest buffer ptr is 0 but len > 0');
|
|
199
|
+
if (ptr + len > memU8.byteLength) {
|
|
200
|
+
throw new Error(`WASM manifest buffer OOB: ptr=${ptr} len=${len} mem=${memU8.byteLength}`);
|
|
201
|
+
}
|
|
202
|
+
memU8.set(manifestBytes, ptr);
|
|
203
|
+
}
|
|
204
|
+
// 3) init_end parses the manifest and completes init (including calling user entrypoint)
|
|
205
|
+
exports.init_end();
|
|
206
|
+
return new WasmRunner(exports, hostStateOffset, moduleHash, filesById, snapshotter);
|
|
207
|
+
}
|
|
208
|
+
async function processLoop() {
|
|
209
|
+
if (processing)
|
|
210
|
+
return;
|
|
211
|
+
processing = true;
|
|
212
|
+
try {
|
|
213
|
+
while (taskQueue.length > 0) {
|
|
214
|
+
const task = taskQueue.shift();
|
|
215
|
+
if (!runner)
|
|
216
|
+
throw new Error('Worker not initialized');
|
|
217
|
+
if (task.kind === 'update') {
|
|
218
|
+
const renderForPlayer = task.renderForPlayer | 0;
|
|
219
|
+
const result = runner.doUpdate(task.inputBuffer, renderForPlayer);
|
|
220
|
+
// Render (if requested and we have a canvas)
|
|
221
|
+
if (renderer && renderForPlayer !== -1) {
|
|
222
|
+
const hs = runner.readHostStateNow();
|
|
223
|
+
const mem = runner.getMemU8();
|
|
224
|
+
const start = hs.renderBufPtr >>> 0;
|
|
225
|
+
const len = hs.renderBufLen >>> 0;
|
|
226
|
+
if (len > 0 && start > 0 && start + len <= mem.byteLength) {
|
|
227
|
+
const slice = new Uint8Array(mem.buffer, start, len);
|
|
228
|
+
renderer.render(slice);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
post({ type: 'updateResult', requestId: task.requestId, result });
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (task.kind === 'createSnapshot') {
|
|
235
|
+
const snapshot = runner.createSnapshot();
|
|
236
|
+
const transferables = gatherWasmStateSnapshotTransferables(snapshot);
|
|
237
|
+
post({ type: 'snapshotCreated', requestId: task.requestId, snapshot }, transferables);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (task.kind === 'loadSnapshot') {
|
|
241
|
+
runner.loadSnapshot(task.snapshot);
|
|
242
|
+
// Transfer snapshot back to main so it can be reused without cloning.
|
|
243
|
+
const transferables = gatherWasmStateSnapshotTransferables(task.snapshot);
|
|
244
|
+
post({ type: 'snapshotLoaded', requestId: task.requestId, snapshot: task.snapshot }, transferables);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
const err = e;
|
|
251
|
+
post({ type: 'error', message: err.message ?? String(err), stack: err.stack });
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
processing = false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
258
|
+
self.onmessage = async (ev) => {
|
|
259
|
+
const msg = ev.data;
|
|
260
|
+
if (!msg || typeof msg !== 'object')
|
|
261
|
+
return;
|
|
262
|
+
try {
|
|
263
|
+
if (msg.type === 'init') {
|
|
264
|
+
if (runner)
|
|
265
|
+
throw new Error('Worker already initialized');
|
|
266
|
+
const fontOk = await ensureDefaultFontsLoaded();
|
|
267
|
+
console.log('[worker] ensureDefaultFontsLoaded ->', fontOk);
|
|
268
|
+
runner = await instantiateWasm(msg.pkg, msg.randomSeed);
|
|
269
|
+
if (msg.canvas) {
|
|
270
|
+
const w = msg.canvasWidth ?? msg.canvas.width ?? 1280;
|
|
271
|
+
const h = msg.canvasHeight ?? msg.canvas.height ?? 800;
|
|
272
|
+
renderer = new Renderer2D(msg.canvas, { width: w, height: h, autoClear: msg.autoClear ?? true });
|
|
273
|
+
}
|
|
274
|
+
post({ type: 'inited' });
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (msg.type === 'update') {
|
|
278
|
+
taskQueue.push({
|
|
279
|
+
kind: 'update',
|
|
280
|
+
requestId: msg.requestId,
|
|
281
|
+
inputBuffer: msg.inputBuffer,
|
|
282
|
+
renderForPlayer: msg.renderForPlayer,
|
|
283
|
+
});
|
|
284
|
+
void processLoop();
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (msg.type === 'createSnapshot') {
|
|
288
|
+
taskQueue.push({ kind: 'createSnapshot', requestId: msg.requestId });
|
|
289
|
+
void processLoop();
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (msg.type === 'loadSnapshot') {
|
|
293
|
+
taskQueue.push({ kind: 'loadSnapshot', requestId: msg.requestId, snapshot: msg.snapshot });
|
|
294
|
+
void processLoop();
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (msg.type === 'dispose') {
|
|
298
|
+
taskQueue = [];
|
|
299
|
+
runner = null;
|
|
300
|
+
renderer = null;
|
|
301
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
302
|
+
self.close?.();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
const err = e;
|
|
308
|
+
post({ type: 'error', message: err.message ?? String(err), stack: err.stack });
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "wasm-game-ts",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/**/*",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.json",
|
|
20
|
+
"postbuild": "node scripts/copy-assets.mjs",
|
|
21
|
+
"dev": "vite --open /demo/index.html",
|
|
22
|
+
"demo": "npm run build && npm run dev",
|
|
23
|
+
"prepack": "npm run build && node scripts/copy-assets.mjs",
|
|
24
|
+
"watch": "tsc -w -p tsconfig.json"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"typescript": "^5.5.0",
|
|
28
|
+
"vite": "^7.2.6"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"preprocess-wasm-bytes": "^0.1.8"
|
|
32
|
+
}
|
|
33
|
+
}
|