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.
Files changed (52) hide show
  1. package/README.md +57 -0
  2. package/dist/hash.d.ts +3 -0
  3. package/dist/hash.d.ts.map +1 -0
  4. package/dist/hash.js +15 -0
  5. package/dist/hash.js.map +1 -0
  6. package/dist/index.d.ts +7 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +7 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/inputs.d.ts +61 -0
  11. package/dist/inputs.d.ts.map +1 -0
  12. package/dist/inputs.js +143 -0
  13. package/dist/inputs.js.map +1 -0
  14. package/dist/keycodes.d.ts +3 -0
  15. package/dist/keycodes.d.ts.map +1 -0
  16. package/dist/keycodes.js +73 -0
  17. package/dist/keycodes.js.map +1 -0
  18. package/dist/package.d.ts +45 -0
  19. package/dist/package.d.ts.map +1 -0
  20. package/dist/package.js +765 -0
  21. package/dist/package.js.map +1 -0
  22. package/dist/types.d.ts +104 -0
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js +13 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist/wasm-game.d.ts +22 -0
  27. package/dist/wasm-game.d.ts.map +1 -0
  28. package/dist/wasm-game.js +164 -0
  29. package/dist/wasm-game.js.map +1 -0
  30. package/dist/worker/assets/OFL.txt +88 -0
  31. package/dist/worker/assets/PressStart2P-Regular.ttf +0 -0
  32. package/dist/worker/fonts.d.ts +2 -0
  33. package/dist/worker/fonts.d.ts.map +1 -0
  34. package/dist/worker/fonts.js +159 -0
  35. package/dist/worker/fonts.js.map +1 -0
  36. package/dist/worker/renderer.d.ts +34 -0
  37. package/dist/worker/renderer.d.ts.map +1 -0
  38. package/dist/worker/renderer.js +504 -0
  39. package/dist/worker/renderer.js.map +1 -0
  40. package/dist/worker/snapshotter.d.ts +17 -0
  41. package/dist/worker/snapshotter.d.ts.map +1 -0
  42. package/dist/worker/snapshotter.js +190 -0
  43. package/dist/worker/snapshotter.js.map +1 -0
  44. package/dist/worker/wasm-host.d.ts +18 -0
  45. package/dist/worker/wasm-host.d.ts.map +1 -0
  46. package/dist/worker/wasm-host.js +42 -0
  47. package/dist/worker/wasm-host.js.map +1 -0
  48. package/dist/worker/worker.d.ts +2 -0
  49. package/dist/worker/worker.d.ts.map +1 -0
  50. package/dist/worker/worker.js +311 -0
  51. package/dist/worker/worker.js.map +1 -0
  52. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -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
+ }