mn-video-player-v2 1.4.9
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/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/mn-common-c.js +112 -0
- package/dist/mn-media.js +4041 -0
- package/dist/mn-media.wasm +0 -0
- package/dist/mn-video-player-v2.es.js +5290 -0
- package/dist/mn-video-player-v2.es.js.map +1 -0
- package/dist/mn-video-player-v2.umd.js +104 -0
- package/dist/mn-video-player-v2.umd.js.map +1 -0
- package/dist/mn-worker-CLBlI2q_.js +1120 -0
- package/dist/mn-worker-CW3JpGn0.js +2 -0
- package/dist/mn-worker-CW3JpGn0.js.map +1 -0
- package/dist/svg/ball-triangle.svg +47 -0
- package/dist/svg/calling.svg +1 -0
- package/dist/svg/empty.svg +9 -0
- package/dist/svg/loading-spin.svg +6 -0
- package/dist/svg/noData.svg +22 -0
- package/package.json +47 -0
- package/readme.md +403 -0
package/dist/mn-media.js
ADDED
|
@@ -0,0 +1,4041 @@
|
|
|
1
|
+
var Module = typeof Module != "undefined" ? Module : {};
|
|
2
|
+
var ENVIRONMENT_IS_WEB = !!globalThis.window;
|
|
3
|
+
var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope;
|
|
4
|
+
var ENVIRONMENT_IS_NODE =
|
|
5
|
+
globalThis.process?.versions?.node && globalThis.process?.type != "renderer";
|
|
6
|
+
var ENVIRONMENT_IS_PTHREAD =
|
|
7
|
+
ENVIRONMENT_IS_WORKER && globalThis.name == "em-pthread";
|
|
8
|
+
if (ENVIRONMENT_IS_NODE) {
|
|
9
|
+
var worker_threads = require("node:worker_threads");
|
|
10
|
+
globalThis.Worker = worker_threads.Worker;
|
|
11
|
+
ENVIRONMENT_IS_WORKER = !worker_threads.isMainThread;
|
|
12
|
+
ENVIRONMENT_IS_PTHREAD =
|
|
13
|
+
ENVIRONMENT_IS_WORKER && worker_threads.workerData == "em-pthread";
|
|
14
|
+
}
|
|
15
|
+
var programArgs = [];
|
|
16
|
+
var thisProgram = "./this.program";
|
|
17
|
+
var quit_ = (status, toThrow) => {
|
|
18
|
+
throw toThrow;
|
|
19
|
+
};
|
|
20
|
+
var _scriptName = globalThis.document?.currentScript?.src;
|
|
21
|
+
if (typeof __filename != "undefined") {
|
|
22
|
+
_scriptName = __filename;
|
|
23
|
+
} else if (ENVIRONMENT_IS_WORKER) {
|
|
24
|
+
_scriptName = self.location.href;
|
|
25
|
+
}
|
|
26
|
+
var scriptDirectory = "";
|
|
27
|
+
function locateFile(path) {
|
|
28
|
+
if (Module["locateFile"]) {
|
|
29
|
+
return Module["locateFile"](path, scriptDirectory);
|
|
30
|
+
}
|
|
31
|
+
return scriptDirectory + path;
|
|
32
|
+
}
|
|
33
|
+
var readAsync, readBinary;
|
|
34
|
+
if (ENVIRONMENT_IS_NODE) {
|
|
35
|
+
var fs = require("node:fs");
|
|
36
|
+
scriptDirectory = __dirname + "/";
|
|
37
|
+
readBinary = (filename) => {
|
|
38
|
+
filename = isFileURI(filename) ? new URL(filename) : filename;
|
|
39
|
+
var ret = fs.readFileSync(filename);
|
|
40
|
+
return ret;
|
|
41
|
+
};
|
|
42
|
+
readAsync = async (filename, binary = true) => {
|
|
43
|
+
filename = isFileURI(filename) ? new URL(filename) : filename;
|
|
44
|
+
var ret = fs.readFileSync(filename, binary ? undefined : "utf8");
|
|
45
|
+
return ret;
|
|
46
|
+
};
|
|
47
|
+
if (process.argv.length > 1) {
|
|
48
|
+
thisProgram = process.argv[1].replace(/\\/g, "/");
|
|
49
|
+
}
|
|
50
|
+
programArgs = process.argv.slice(2);
|
|
51
|
+
if (typeof module != "undefined") {
|
|
52
|
+
module["exports"] = Module;
|
|
53
|
+
}
|
|
54
|
+
quit_ = (status, toThrow) => {
|
|
55
|
+
process.exitCode = status;
|
|
56
|
+
throw toThrow;
|
|
57
|
+
};
|
|
58
|
+
} else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
|
|
59
|
+
try {
|
|
60
|
+
scriptDirectory = new URL(".", _scriptName).href;
|
|
61
|
+
} catch {}
|
|
62
|
+
if (!ENVIRONMENT_IS_NODE) {
|
|
63
|
+
if (ENVIRONMENT_IS_WORKER) {
|
|
64
|
+
readBinary = (url) => {
|
|
65
|
+
var xhr = new XMLHttpRequest();
|
|
66
|
+
xhr.open("GET", url, false);
|
|
67
|
+
xhr.responseType = "arraybuffer";
|
|
68
|
+
xhr.send(null);
|
|
69
|
+
return new Uint8Array(xhr.response);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
readAsync = async (url) => {
|
|
73
|
+
if (isFileURI(url)) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
var xhr = new XMLHttpRequest();
|
|
76
|
+
xhr.open("GET", url, true);
|
|
77
|
+
xhr.responseType = "arraybuffer";
|
|
78
|
+
xhr.onload = () => {
|
|
79
|
+
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
|
|
80
|
+
resolve(xhr.response);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
reject(xhr.status);
|
|
84
|
+
};
|
|
85
|
+
xhr.onerror = reject;
|
|
86
|
+
xhr.send(null);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
var response = await fetch(url, { credentials: "same-origin" });
|
|
90
|
+
if (response.ok) {
|
|
91
|
+
return response.arrayBuffer();
|
|
92
|
+
}
|
|
93
|
+
throw new Error(response.status + " : " + response.url);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
}
|
|
98
|
+
var defaultPrint = console.log.bind(console);
|
|
99
|
+
var defaultPrintErr = console.error.bind(console);
|
|
100
|
+
if (ENVIRONMENT_IS_NODE) {
|
|
101
|
+
var utils = require("node:util");
|
|
102
|
+
var stringify = (a) => (typeof a == "object" ? utils.inspect(a) : a);
|
|
103
|
+
defaultPrint = (...args) =>
|
|
104
|
+
fs.writeSync(1, args.map(stringify).join(" ") + "\n");
|
|
105
|
+
defaultPrintErr = (...args) =>
|
|
106
|
+
fs.writeSync(2, args.map(stringify).join(" ") + "\n");
|
|
107
|
+
}
|
|
108
|
+
var out = defaultPrint;
|
|
109
|
+
var err = defaultPrintErr;
|
|
110
|
+
var wasmBinary;
|
|
111
|
+
var wasmModule;
|
|
112
|
+
var ABORT = false;
|
|
113
|
+
var EXITSTATUS;
|
|
114
|
+
var isFileURI = (filename) => filename.startsWith("file://");
|
|
115
|
+
class EmscriptenEH {}
|
|
116
|
+
class EmscriptenSjLj extends EmscriptenEH {}
|
|
117
|
+
function growMemViews() {
|
|
118
|
+
if (wasmMemory.buffer != HEAP8.buffer) {
|
|
119
|
+
updateMemoryViews();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (ENVIRONMENT_IS_NODE && ENVIRONMENT_IS_PTHREAD) {
|
|
123
|
+
globalThis.self = globalThis;
|
|
124
|
+
var parentPort = worker_threads.parentPort;
|
|
125
|
+
if (!globalThis.postMessage) {
|
|
126
|
+
parentPort.on("message", (msg) => globalThis.onmessage?.({ data: msg }));
|
|
127
|
+
globalThis.postMessage = (msg) => parentPort.postMessage(msg);
|
|
128
|
+
}
|
|
129
|
+
process.on("uncaughtException", (err) => {
|
|
130
|
+
postMessage({ cmd: 8, error: err });
|
|
131
|
+
process.exit(1);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
var startWorker;
|
|
135
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
136
|
+
var initializedJS = false;
|
|
137
|
+
self.onunhandledrejection = (e) => {
|
|
138
|
+
throw e.reason || e;
|
|
139
|
+
};
|
|
140
|
+
function handleMessage(e) {
|
|
141
|
+
try {
|
|
142
|
+
var msgData = e.data;
|
|
143
|
+
var cmd = msgData.cmd;
|
|
144
|
+
if (cmd == 1) {
|
|
145
|
+
let messageQueue = [];
|
|
146
|
+
self.onmessage = (e) => messageQueue.push(e);
|
|
147
|
+
startWorker = () => {
|
|
148
|
+
postMessage({ cmd: 3 });
|
|
149
|
+
for (let msg of messageQueue) {
|
|
150
|
+
handleMessage(msg);
|
|
151
|
+
}
|
|
152
|
+
self.onmessage = handleMessage;
|
|
153
|
+
};
|
|
154
|
+
for (const handler of msgData.handlers) {
|
|
155
|
+
if (!Module[handler] || Module[handler].proxy) {
|
|
156
|
+
Module[handler] = (...args) => {
|
|
157
|
+
postMessage({ cmd: 9, handler, args });
|
|
158
|
+
};
|
|
159
|
+
if (handler == "print") out = Module[handler];
|
|
160
|
+
if (handler == "printErr") err = Module[handler];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
wasmMemory = msgData.wasmMemory;
|
|
164
|
+
updateMemoryViews();
|
|
165
|
+
wasmModule = msgData.wasmModule;
|
|
166
|
+
createWasm();
|
|
167
|
+
run();
|
|
168
|
+
startWorker();
|
|
169
|
+
} else if (cmd == 2) {
|
|
170
|
+
establishStackSpace(msgData.pthread_ptr);
|
|
171
|
+
__emscripten_thread_init(msgData.pthread_ptr, 0, 0, 1, 0, 0);
|
|
172
|
+
PThread.threadInitTLS();
|
|
173
|
+
__emscripten_thread_mailbox_await(msgData.pthread_ptr);
|
|
174
|
+
if (!initializedJS) {
|
|
175
|
+
initializedJS = true;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
invokeEntryPoint(msgData.start_routine, msgData.arg);
|
|
179
|
+
} catch (ex) {
|
|
180
|
+
if (ex != "unwind") {
|
|
181
|
+
throw ex;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
} else if (cmd == 4) {
|
|
185
|
+
if (initializedJS) {
|
|
186
|
+
checkMailbox();
|
|
187
|
+
}
|
|
188
|
+
} else if (cmd) {
|
|
189
|
+
err(`worker: received unknown command ${cmd}`);
|
|
190
|
+
err(msgData);
|
|
191
|
+
}
|
|
192
|
+
} catch (ex) {
|
|
193
|
+
if (runtimeInitialized) __emscripten_thread_crashed();
|
|
194
|
+
throw ex;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
self.onmessage = handleMessage;
|
|
198
|
+
}
|
|
199
|
+
var runtimeInitialized = false;
|
|
200
|
+
function getMemoryBuffer() {
|
|
201
|
+
return wasmMemory.buffer;
|
|
202
|
+
}
|
|
203
|
+
function updateMemoryViews() {
|
|
204
|
+
if (HEAP8?.buffer?.growable) return;
|
|
205
|
+
var b = getMemoryBuffer();
|
|
206
|
+
HEAP8 = new Int8Array(b);
|
|
207
|
+
HEAP16 = new Int16Array(b);
|
|
208
|
+
HEAPU8 = new Uint8Array(b);
|
|
209
|
+
HEAP32 = new Int32Array(b);
|
|
210
|
+
HEAPU32 = new Uint32Array(b);
|
|
211
|
+
HEAPF32 = new Float32Array(b);
|
|
212
|
+
HEAPF64 = new Float64Array(b);
|
|
213
|
+
HEAP64 = new BigInt64Array(b);
|
|
214
|
+
HEAPU64 = new BigUint64Array(b);
|
|
215
|
+
}
|
|
216
|
+
function initMemory() {
|
|
217
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
{
|
|
221
|
+
var INITIAL_MEMORY = 67108864;
|
|
222
|
+
wasmMemory = new WebAssembly.Memory({
|
|
223
|
+
initial: BigInt(INITIAL_MEMORY / 65536),
|
|
224
|
+
maximum: 131072n,
|
|
225
|
+
shared: true,
|
|
226
|
+
address: "i64",
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
updateMemoryViews();
|
|
230
|
+
}
|
|
231
|
+
function preRun() {
|
|
232
|
+
var preRun = Module["preRun"];
|
|
233
|
+
if (preRun) {
|
|
234
|
+
if (typeof preRun == "function") preRun = [preRun];
|
|
235
|
+
onPreRuns.push(...preRun);
|
|
236
|
+
}
|
|
237
|
+
callRuntimeCallbacks(onPreRuns);
|
|
238
|
+
}
|
|
239
|
+
function initRuntime() {
|
|
240
|
+
runtimeInitialized = true;
|
|
241
|
+
if (ENVIRONMENT_IS_PTHREAD) return;
|
|
242
|
+
if (!Module["noFSInit"] && !FS.initialized) FS.init();
|
|
243
|
+
TTY.init();
|
|
244
|
+
wasmExports["E"]();
|
|
245
|
+
FS.ignorePermissions = false;
|
|
246
|
+
}
|
|
247
|
+
function postRun() {
|
|
248
|
+
var postRun = Module["postRun"];
|
|
249
|
+
if (postRun) {
|
|
250
|
+
if (typeof postRun == "function") postRun = [postRun];
|
|
251
|
+
onPostRuns.push(...postRun);
|
|
252
|
+
}
|
|
253
|
+
callRuntimeCallbacks(onPostRuns);
|
|
254
|
+
}
|
|
255
|
+
function abort(what) {
|
|
256
|
+
Module["onAbort"]?.(what);
|
|
257
|
+
what = `Aborted(${what})`;
|
|
258
|
+
err(what);
|
|
259
|
+
ABORT = true;
|
|
260
|
+
what += ". Build with -sASSERTIONS for more info.";
|
|
261
|
+
var e = new WebAssembly.RuntimeError(what);
|
|
262
|
+
throw e;
|
|
263
|
+
}
|
|
264
|
+
var wasmBinaryFile;
|
|
265
|
+
function findWasmBinary() {
|
|
266
|
+
return locateFile("mn-media.wasm");
|
|
267
|
+
}
|
|
268
|
+
function getBinarySync(file) {
|
|
269
|
+
if (readBinary) {
|
|
270
|
+
return readBinary(file);
|
|
271
|
+
}
|
|
272
|
+
throw "both async and sync fetching of the wasm failed";
|
|
273
|
+
}
|
|
274
|
+
async function getWasmBinary(binaryFile) {
|
|
275
|
+
if (!wasmBinary) {
|
|
276
|
+
try {
|
|
277
|
+
var response = await readAsync(binaryFile);
|
|
278
|
+
return new Uint8Array(response);
|
|
279
|
+
} catch {}
|
|
280
|
+
}
|
|
281
|
+
return getBinarySync(binaryFile);
|
|
282
|
+
}
|
|
283
|
+
async function instantiateArrayBuffer(binaryFile, imports) {
|
|
284
|
+
try {
|
|
285
|
+
var binary = await getWasmBinary(binaryFile);
|
|
286
|
+
var instance = await WebAssembly.instantiate(binary, imports);
|
|
287
|
+
return instance;
|
|
288
|
+
} catch (reason) {
|
|
289
|
+
err(`failed to asynchronously prepare wasm: ${reason}`);
|
|
290
|
+
abort(reason);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
async function instantiateAsync(binary, binaryFile, imports) {
|
|
294
|
+
if (!binary && !isFileURI(binaryFile) && !ENVIRONMENT_IS_NODE) {
|
|
295
|
+
try {
|
|
296
|
+
var response = fetch(binaryFile, { credentials: "same-origin" });
|
|
297
|
+
var instantiationResult = await WebAssembly.instantiateStreaming(
|
|
298
|
+
response,
|
|
299
|
+
imports,
|
|
300
|
+
);
|
|
301
|
+
return instantiationResult;
|
|
302
|
+
} catch (reason) {
|
|
303
|
+
err(`wasm streaming compile failed: ${reason}`);
|
|
304
|
+
err("falling back to ArrayBuffer instantiation");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return instantiateArrayBuffer(binaryFile, imports);
|
|
308
|
+
}
|
|
309
|
+
function getWasmImports() {
|
|
310
|
+
assignWasmImports();
|
|
311
|
+
var imports = { a: wasmImports };
|
|
312
|
+
return imports;
|
|
313
|
+
}
|
|
314
|
+
async function createWasm() {
|
|
315
|
+
function receiveInstance(instance, module) {
|
|
316
|
+
wasmExports = instance.exports;
|
|
317
|
+
wasmExports = applySignatureConversions(wasmExports);
|
|
318
|
+
registerTLSInit(wasmExports["P"]);
|
|
319
|
+
assignWasmExports(wasmExports);
|
|
320
|
+
wasmModule = module;
|
|
321
|
+
return wasmExports;
|
|
322
|
+
}
|
|
323
|
+
function receiveInstantiationResult(result) {
|
|
324
|
+
return receiveInstance(result["instance"], result["module"]);
|
|
325
|
+
}
|
|
326
|
+
var info = getWasmImports();
|
|
327
|
+
var instantiateWasm = Module["instantiateWasm"];
|
|
328
|
+
if (instantiateWasm) {
|
|
329
|
+
return new Promise((resolve) => {
|
|
330
|
+
instantiateWasm(info, (inst, mod) => resolve(receiveInstance(inst, mod)));
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
334
|
+
var instance = new WebAssembly.Instance(wasmModule, getWasmImports());
|
|
335
|
+
return receiveInstance(instance, wasmModule);
|
|
336
|
+
}
|
|
337
|
+
wasmBinaryFile ??= findWasmBinary();
|
|
338
|
+
var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
|
|
339
|
+
var exports = receiveInstantiationResult(result);
|
|
340
|
+
return exports;
|
|
341
|
+
}
|
|
342
|
+
class ExitStatus {
|
|
343
|
+
name = "ExitStatus";
|
|
344
|
+
constructor(status) {
|
|
345
|
+
this.message = `Program terminated with exit(${status})`;
|
|
346
|
+
this.status = status;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
var HEAP8;
|
|
350
|
+
var terminateWorker = (worker) => {
|
|
351
|
+
worker.terminate();
|
|
352
|
+
worker.onmessage = (e) => {};
|
|
353
|
+
};
|
|
354
|
+
var cleanupThread = (pthread_ptr) => {
|
|
355
|
+
var worker = PThread.pthreads[pthread_ptr];
|
|
356
|
+
PThread.returnWorkerToPool(worker);
|
|
357
|
+
};
|
|
358
|
+
var callRuntimeCallbacks = (callbacks) => {
|
|
359
|
+
while (callbacks.length > 0) {
|
|
360
|
+
callbacks.shift()(Module);
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
var onPreRuns = [];
|
|
364
|
+
var addOnPreRun = (cb) => onPreRuns.push(cb);
|
|
365
|
+
var dependenciesPromise = null;
|
|
366
|
+
var resolveRunDependencies = async () => dependenciesPromise;
|
|
367
|
+
var runDependencies = 0;
|
|
368
|
+
var dependenciesPromiseResolve = null;
|
|
369
|
+
var removeRunDependency = (id) => {
|
|
370
|
+
runDependencies--;
|
|
371
|
+
Module["monitorRunDependencies"]?.(runDependencies);
|
|
372
|
+
if (!runDependencies) {
|
|
373
|
+
dependenciesPromiseResolve();
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
var addRunDependency = (id) => {
|
|
377
|
+
if (!runDependencies) {
|
|
378
|
+
dependenciesPromise = new Promise(
|
|
379
|
+
(resolve) => (dependenciesPromiseResolve = resolve),
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
runDependencies++;
|
|
383
|
+
Module["monitorRunDependencies"]?.(runDependencies);
|
|
384
|
+
};
|
|
385
|
+
var spawnThread = (threadParams) => {
|
|
386
|
+
var worker = PThread.getNewWorker();
|
|
387
|
+
if (!worker) {
|
|
388
|
+
return 6;
|
|
389
|
+
}
|
|
390
|
+
PThread.pthreads[threadParams.pthread_ptr] = worker;
|
|
391
|
+
worker.pthread_ptr = threadParams.pthread_ptr;
|
|
392
|
+
var msg = {
|
|
393
|
+
cmd: 2,
|
|
394
|
+
start_routine: threadParams.startRoutine,
|
|
395
|
+
arg: threadParams.arg,
|
|
396
|
+
pthread_ptr: threadParams.pthread_ptr,
|
|
397
|
+
};
|
|
398
|
+
worker.postMessage(msg, threadParams.transferList);
|
|
399
|
+
return 0;
|
|
400
|
+
};
|
|
401
|
+
var runtimeKeepaliveCounter = 0;
|
|
402
|
+
var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
|
|
403
|
+
var stackSave = () => _emscripten_stack_get_current();
|
|
404
|
+
var stackRestore = (val) => __emscripten_stack_restore(val);
|
|
405
|
+
var stackAlloc = (sz) => __emscripten_stack_alloc(sz);
|
|
406
|
+
var HEAPF64;
|
|
407
|
+
var HEAP64;
|
|
408
|
+
var proxyToMainThread = (funcIndex, emAsmAddr, proxyMode, ...callArgs) => {
|
|
409
|
+
var bufSize = 8 * callArgs.length * 2;
|
|
410
|
+
var sp = stackSave();
|
|
411
|
+
var args = stackAlloc(bufSize);
|
|
412
|
+
var b = args / 8;
|
|
413
|
+
for (var arg of callArgs) {
|
|
414
|
+
if (typeof arg == "bigint") {
|
|
415
|
+
(growMemViews(), HEAP64)[b++] = 1n;
|
|
416
|
+
(growMemViews(), HEAP64)[b++] = arg;
|
|
417
|
+
} else {
|
|
418
|
+
(growMemViews(), HEAP64)[b++] = 0n;
|
|
419
|
+
(growMemViews(), HEAPF64)[b++] = arg;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
var rtn = __emscripten_run_js_on_main_thread(
|
|
423
|
+
funcIndex,
|
|
424
|
+
emAsmAddr,
|
|
425
|
+
bufSize,
|
|
426
|
+
args,
|
|
427
|
+
proxyMode,
|
|
428
|
+
);
|
|
429
|
+
stackRestore(sp);
|
|
430
|
+
return rtn;
|
|
431
|
+
};
|
|
432
|
+
function _proc_exit(code) {
|
|
433
|
+
if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(0, 0, 1, code);
|
|
434
|
+
EXITSTATUS = code;
|
|
435
|
+
if (!keepRuntimeAlive()) {
|
|
436
|
+
PThread.terminateAllThreads();
|
|
437
|
+
Module["onExit"]?.(code);
|
|
438
|
+
ABORT = true;
|
|
439
|
+
}
|
|
440
|
+
quit_(code, new ExitStatus(code));
|
|
441
|
+
}
|
|
442
|
+
function exitOnMainThread(returnCode) {
|
|
443
|
+
if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(1, 0, 0, returnCode);
|
|
444
|
+
_exit(returnCode);
|
|
445
|
+
}
|
|
446
|
+
var exitJS = (status, implicit) => {
|
|
447
|
+
EXITSTATUS = status;
|
|
448
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
449
|
+
exitOnMainThread(status);
|
|
450
|
+
throw "unwind";
|
|
451
|
+
}
|
|
452
|
+
_proc_exit(status);
|
|
453
|
+
};
|
|
454
|
+
var _exit = exitJS;
|
|
455
|
+
var waitAsyncPolyfilled =
|
|
456
|
+
!Atomics.waitAsync ||
|
|
457
|
+
(globalThis.navigator?.userAgent &&
|
|
458
|
+
Number((navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./) || [])[2]) <
|
|
459
|
+
91);
|
|
460
|
+
var HEAP32;
|
|
461
|
+
var PThread = {
|
|
462
|
+
unusedWorkers: [],
|
|
463
|
+
tlsInitFunctions: [],
|
|
464
|
+
pthreads: {},
|
|
465
|
+
init() {
|
|
466
|
+
if (!ENVIRONMENT_IS_PTHREAD) {
|
|
467
|
+
PThread.initMainThread();
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
initMainThread() {
|
|
471
|
+
var pthreadPoolSize = 4;
|
|
472
|
+
while (pthreadPoolSize--) {
|
|
473
|
+
PThread.allocateUnusedWorker();
|
|
474
|
+
}
|
|
475
|
+
addOnPreRun(async () => {
|
|
476
|
+
var pthreadPoolReady = PThread.loadWasmModuleToAllWorkers();
|
|
477
|
+
addRunDependency("loading-workers");
|
|
478
|
+
await pthreadPoolReady;
|
|
479
|
+
removeRunDependency("loading-workers");
|
|
480
|
+
});
|
|
481
|
+
},
|
|
482
|
+
terminateAllThreads: () => {
|
|
483
|
+
for (var worker of Object.values(PThread.pthreads)) {
|
|
484
|
+
terminateWorker(worker);
|
|
485
|
+
}
|
|
486
|
+
for (var worker of PThread.unusedWorkers) {
|
|
487
|
+
terminateWorker(worker);
|
|
488
|
+
}
|
|
489
|
+
PThread.unusedWorkers = [];
|
|
490
|
+
PThread.pthreads = {};
|
|
491
|
+
},
|
|
492
|
+
terminateRuntime: () => {
|
|
493
|
+
PThread.terminateAllThreads();
|
|
494
|
+
var pthread_ptr = _pthread_self();
|
|
495
|
+
___set_thread_state(0, 0, 0, 1);
|
|
496
|
+
if (!waitAsyncPolyfilled) {
|
|
497
|
+
Atomics.notify((growMemViews(), HEAP32), pthread_ptr / 4);
|
|
498
|
+
}
|
|
499
|
+
},
|
|
500
|
+
returnWorkerToPool: (worker) => {
|
|
501
|
+
var pthread_ptr = worker.pthread_ptr;
|
|
502
|
+
delete PThread.pthreads[pthread_ptr];
|
|
503
|
+
PThread.unusedWorkers.push(worker);
|
|
504
|
+
worker.pthread_ptr = 0;
|
|
505
|
+
__emscripten_thread_free_data(pthread_ptr);
|
|
506
|
+
},
|
|
507
|
+
threadInitTLS() {
|
|
508
|
+
PThread.tlsInitFunctions.forEach((f) => f());
|
|
509
|
+
},
|
|
510
|
+
loadWasmModuleToWorker: (worker) =>
|
|
511
|
+
new Promise((onFinishedLoading) => {
|
|
512
|
+
worker.onmessage = (e) => {
|
|
513
|
+
var d = e.data;
|
|
514
|
+
var cmd = d.cmd;
|
|
515
|
+
if (d.targetThread && d.targetThread != _pthread_self()) {
|
|
516
|
+
var targetWorker = PThread.pthreads[d.targetThread];
|
|
517
|
+
targetWorker?.postMessage(d);
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
if (d === "setimmediate" || d === "_si") {
|
|
521
|
+
worker.postMessage(d);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
switch (cmd) {
|
|
525
|
+
case 4:
|
|
526
|
+
checkMailbox();
|
|
527
|
+
break;
|
|
528
|
+
case 5:
|
|
529
|
+
spawnThread(d);
|
|
530
|
+
break;
|
|
531
|
+
case 6:
|
|
532
|
+
callUserCallback(() => cleanupThread(d.thread));
|
|
533
|
+
break;
|
|
534
|
+
case 3:
|
|
535
|
+
if (ENVIRONMENT_IS_NODE && !worker.strongref) {
|
|
536
|
+
worker.unref();
|
|
537
|
+
}
|
|
538
|
+
onFinishedLoading(worker);
|
|
539
|
+
break;
|
|
540
|
+
case 8:
|
|
541
|
+
worker.onerror(d.error);
|
|
542
|
+
break;
|
|
543
|
+
case 9:
|
|
544
|
+
Module[d.handler](...d.args);
|
|
545
|
+
break;
|
|
546
|
+
default:
|
|
547
|
+
if (cmd) err(`worker sent an unknown command ${cmd}`);
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
worker.onerror = (e) => {
|
|
551
|
+
var message = "worker sent an error!";
|
|
552
|
+
err(`${message} ${e.filename}:${e.lineno}: ${e.message}`);
|
|
553
|
+
throw e;
|
|
554
|
+
};
|
|
555
|
+
if (ENVIRONMENT_IS_NODE) {
|
|
556
|
+
worker.on("message", (data) => worker.onmessage({ data }));
|
|
557
|
+
worker.on("error", (e) => worker.onerror(e));
|
|
558
|
+
}
|
|
559
|
+
var handlers = [];
|
|
560
|
+
var knownHandlers = ["onExit", "onAbort", "print", "printErr"];
|
|
561
|
+
for (var handler of knownHandlers) {
|
|
562
|
+
if (Module.propertyIsEnumerable(handler)) {
|
|
563
|
+
handlers.push(handler);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
worker.postMessage({ cmd: 1, handlers, wasmMemory, wasmModule });
|
|
567
|
+
}),
|
|
568
|
+
async loadWasmModuleToAllWorkers() {
|
|
569
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
let pthreadPoolReady = Promise.all(
|
|
573
|
+
PThread.unusedWorkers.map(PThread.loadWasmModuleToWorker),
|
|
574
|
+
);
|
|
575
|
+
return pthreadPoolReady;
|
|
576
|
+
},
|
|
577
|
+
allocateUnusedWorker() {
|
|
578
|
+
var worker;
|
|
579
|
+
var pthreadMainJs = _scriptName;
|
|
580
|
+
worker = new Worker(pthreadMainJs, {
|
|
581
|
+
workerData: "em-pthread",
|
|
582
|
+
name: "em-pthread",
|
|
583
|
+
});
|
|
584
|
+
PThread.unusedWorkers.push(worker);
|
|
585
|
+
return worker;
|
|
586
|
+
},
|
|
587
|
+
getNewWorker() {
|
|
588
|
+
if (PThread.unusedWorkers.length == 0) {
|
|
589
|
+
var newWorker = PThread.allocateUnusedWorker();
|
|
590
|
+
PThread.loadWasmModuleToWorker(newWorker);
|
|
591
|
+
}
|
|
592
|
+
return PThread.unusedWorkers.pop();
|
|
593
|
+
},
|
|
594
|
+
};
|
|
595
|
+
var onPostRuns = [];
|
|
596
|
+
var HEAPU64;
|
|
597
|
+
function establishStackSpace(pthread_ptr) {
|
|
598
|
+
var stackHigh = Number((growMemViews(), HEAPU64)[(pthread_ptr + 80) / 8]);
|
|
599
|
+
var stackSize = Number((growMemViews(), HEAPU64)[(pthread_ptr + 88) / 8]);
|
|
600
|
+
var stackLow = stackHigh - stackSize;
|
|
601
|
+
_emscripten_stack_set_limits(stackHigh, stackLow);
|
|
602
|
+
stackRestore(stackHigh);
|
|
603
|
+
}
|
|
604
|
+
var wasmTableMirror = [];
|
|
605
|
+
var getWasmTableEntry = (funcPtr) => {
|
|
606
|
+
funcPtr = Number(funcPtr);
|
|
607
|
+
var func = wasmTableMirror[funcPtr];
|
|
608
|
+
if (!func) {
|
|
609
|
+
wasmTableMirror[funcPtr] = func = wasmTable.get(BigInt(funcPtr));
|
|
610
|
+
}
|
|
611
|
+
return func;
|
|
612
|
+
};
|
|
613
|
+
var invokeEntryPoint = (ptr, arg) => {
|
|
614
|
+
runtimeKeepaliveCounter = 0;
|
|
615
|
+
noExitRuntime = 0;
|
|
616
|
+
var result = ((a1) => Number(getWasmTableEntry(ptr).call(null, BigInt(a1))))(
|
|
617
|
+
arg,
|
|
618
|
+
);
|
|
619
|
+
function finish(result) {
|
|
620
|
+
if (keepRuntimeAlive()) {
|
|
621
|
+
EXITSTATUS = result;
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
__emscripten_thread_exit(result);
|
|
625
|
+
}
|
|
626
|
+
finish(result);
|
|
627
|
+
};
|
|
628
|
+
var noExitRuntime = true;
|
|
629
|
+
var registerTLSInit = (tlsInitFunc) =>
|
|
630
|
+
PThread.tlsInitFunctions.push(tlsInitFunc);
|
|
631
|
+
var wasmMemory;
|
|
632
|
+
function pthreadCreateProxied(pthread_ptr, attr, startRoutine, arg) {
|
|
633
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
634
|
+
return proxyToMainThread(2, 0, 1, pthread_ptr, attr, startRoutine, arg);
|
|
635
|
+
return ___pthread_create_js(pthread_ptr, attr, startRoutine, arg);
|
|
636
|
+
}
|
|
637
|
+
var _emscripten_has_threading_support = () => !!globalThis.SharedArrayBuffer;
|
|
638
|
+
var INT53_MAX = 9007199254740992;
|
|
639
|
+
var INT53_MIN = -9007199254740992;
|
|
640
|
+
var bigintToI53Checked = (num) =>
|
|
641
|
+
num < INT53_MIN || num > INT53_MAX ? NaN : Number(num);
|
|
642
|
+
function ___pthread_create_js(pthread_ptr, attr, startRoutine, arg) {
|
|
643
|
+
pthread_ptr = bigintToI53Checked(pthread_ptr);
|
|
644
|
+
attr = bigintToI53Checked(attr);
|
|
645
|
+
startRoutine = bigintToI53Checked(startRoutine);
|
|
646
|
+
arg = bigintToI53Checked(arg);
|
|
647
|
+
if (!_emscripten_has_threading_support()) {
|
|
648
|
+
return 6;
|
|
649
|
+
}
|
|
650
|
+
var transferList = [];
|
|
651
|
+
var error = 0;
|
|
652
|
+
if (ENVIRONMENT_IS_PTHREAD && (!transferList.length || error)) {
|
|
653
|
+
return pthreadCreateProxied(pthread_ptr, attr, startRoutine, arg);
|
|
654
|
+
}
|
|
655
|
+
if (error) return error;
|
|
656
|
+
var threadParams = { startRoutine, pthread_ptr, arg, transferList };
|
|
657
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
658
|
+
threadParams.cmd = 5;
|
|
659
|
+
postMessage(threadParams, transferList);
|
|
660
|
+
return 0;
|
|
661
|
+
}
|
|
662
|
+
return spawnThread(threadParams);
|
|
663
|
+
}
|
|
664
|
+
var syscallGetVarargP = () => {
|
|
665
|
+
var ret = Number((growMemViews(), HEAPU64)[SYSCALLS.varargs / 8]);
|
|
666
|
+
SYSCALLS.varargs += 8;
|
|
667
|
+
return ret;
|
|
668
|
+
};
|
|
669
|
+
var syscallGetVarargI = () => {
|
|
670
|
+
var ret = (growMemViews(), HEAP32)[+SYSCALLS.varargs / 4];
|
|
671
|
+
SYSCALLS.varargs += 4;
|
|
672
|
+
return ret;
|
|
673
|
+
};
|
|
674
|
+
var PATH = {
|
|
675
|
+
isAbs: (path) => path.charAt(0) === "/",
|
|
676
|
+
splitPath: (filename) => {
|
|
677
|
+
var splitPathRe =
|
|
678
|
+
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
|
|
679
|
+
return splitPathRe.exec(filename).slice(1);
|
|
680
|
+
},
|
|
681
|
+
normalizeArray: (parts, allowAboveRoot) => {
|
|
682
|
+
var up = 0;
|
|
683
|
+
for (var i = parts.length - 1; i >= 0; i--) {
|
|
684
|
+
var last = parts[i];
|
|
685
|
+
if (last === ".") {
|
|
686
|
+
parts.splice(i, 1);
|
|
687
|
+
} else if (last === "..") {
|
|
688
|
+
parts.splice(i, 1);
|
|
689
|
+
up++;
|
|
690
|
+
} else if (up) {
|
|
691
|
+
parts.splice(i, 1);
|
|
692
|
+
up--;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
if (allowAboveRoot) {
|
|
696
|
+
for (; up; up--) {
|
|
697
|
+
parts.unshift("..");
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
return parts;
|
|
701
|
+
},
|
|
702
|
+
normalize: (path) => {
|
|
703
|
+
var isAbsolute = PATH.isAbs(path),
|
|
704
|
+
trailingSlash = path.slice(-1) === "/";
|
|
705
|
+
path = PATH.normalizeArray(
|
|
706
|
+
path.split("/").filter((p) => !!p),
|
|
707
|
+
!isAbsolute,
|
|
708
|
+
).join("/");
|
|
709
|
+
if (!path && !isAbsolute) {
|
|
710
|
+
path = ".";
|
|
711
|
+
}
|
|
712
|
+
if (path && trailingSlash) {
|
|
713
|
+
path += "/";
|
|
714
|
+
}
|
|
715
|
+
return (isAbsolute ? "/" : "") + path;
|
|
716
|
+
},
|
|
717
|
+
dirname: (path) => {
|
|
718
|
+
var result = PATH.splitPath(path),
|
|
719
|
+
root = result[0],
|
|
720
|
+
dir = result[1];
|
|
721
|
+
if (!root && !dir) {
|
|
722
|
+
return ".";
|
|
723
|
+
}
|
|
724
|
+
if (dir) {
|
|
725
|
+
dir = dir.slice(0, -1);
|
|
726
|
+
}
|
|
727
|
+
return root + dir;
|
|
728
|
+
},
|
|
729
|
+
basename: (path) => path && path.match(/([^\/]+|\/)\/*$/)[1],
|
|
730
|
+
join: (...paths) => PATH.normalize(paths.join("/")),
|
|
731
|
+
join2: (l, r) => PATH.normalize(l + "/" + r),
|
|
732
|
+
};
|
|
733
|
+
var initRandomFill = () => (view) => (
|
|
734
|
+
view.set(crypto.getRandomValues(new Uint8Array(view.byteLength))),
|
|
735
|
+
0
|
|
736
|
+
);
|
|
737
|
+
var randomFill = (view) => (randomFill = initRandomFill())(view);
|
|
738
|
+
var PATH_FS = {
|
|
739
|
+
resolve: (...args) => {
|
|
740
|
+
var resolvedPath = "",
|
|
741
|
+
resolvedAbsolute = false;
|
|
742
|
+
for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
743
|
+
var path = i >= 0 ? args[i] : FS.cwd();
|
|
744
|
+
if (typeof path != "string") {
|
|
745
|
+
throw new TypeError("Arguments to path.resolve must be strings");
|
|
746
|
+
} else if (!path) {
|
|
747
|
+
return "";
|
|
748
|
+
}
|
|
749
|
+
resolvedPath = path + "/" + resolvedPath;
|
|
750
|
+
resolvedAbsolute = PATH.isAbs(path);
|
|
751
|
+
}
|
|
752
|
+
resolvedPath = PATH.normalizeArray(
|
|
753
|
+
resolvedPath.split("/").filter((p) => !!p),
|
|
754
|
+
!resolvedAbsolute,
|
|
755
|
+
).join("/");
|
|
756
|
+
return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
|
|
757
|
+
},
|
|
758
|
+
relative: (from, to) => {
|
|
759
|
+
from = PATH_FS.resolve(from).slice(1);
|
|
760
|
+
to = PATH_FS.resolve(to).slice(1);
|
|
761
|
+
function trim(arr) {
|
|
762
|
+
var start = 0;
|
|
763
|
+
for (; start < arr.length; start++) {
|
|
764
|
+
if (arr[start] !== "") break;
|
|
765
|
+
}
|
|
766
|
+
var end = arr.length - 1;
|
|
767
|
+
for (; end >= 0; end--) {
|
|
768
|
+
if (arr[end] !== "") break;
|
|
769
|
+
}
|
|
770
|
+
if (start > end) return [];
|
|
771
|
+
return arr.slice(start, end - start + 1);
|
|
772
|
+
}
|
|
773
|
+
var fromParts = trim(from.split("/"));
|
|
774
|
+
var toParts = trim(to.split("/"));
|
|
775
|
+
var length = Math.min(fromParts.length, toParts.length);
|
|
776
|
+
var samePartsLength = length;
|
|
777
|
+
for (var i = 0; i < length; i++) {
|
|
778
|
+
if (fromParts[i] !== toParts[i]) {
|
|
779
|
+
samePartsLength = i;
|
|
780
|
+
break;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
var outputParts = [];
|
|
784
|
+
for (var i = samePartsLength; i < fromParts.length; i++) {
|
|
785
|
+
outputParts.push("..");
|
|
786
|
+
}
|
|
787
|
+
outputParts = outputParts.concat(toParts.slice(samePartsLength));
|
|
788
|
+
return outputParts.join("/");
|
|
789
|
+
},
|
|
790
|
+
};
|
|
791
|
+
var UTF8Decoder = globalThis.TextDecoder && new TextDecoder();
|
|
792
|
+
var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => {
|
|
793
|
+
var maxIdx = idx + maxBytesToRead;
|
|
794
|
+
if (ignoreNul) return maxIdx;
|
|
795
|
+
while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx;
|
|
796
|
+
return idx;
|
|
797
|
+
};
|
|
798
|
+
var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => {
|
|
799
|
+
var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul);
|
|
800
|
+
if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
|
|
801
|
+
return UTF8Decoder.decode(
|
|
802
|
+
heapOrArray.buffer instanceof ArrayBuffer
|
|
803
|
+
? heapOrArray.subarray(idx, endPtr)
|
|
804
|
+
: heapOrArray.slice(idx, endPtr),
|
|
805
|
+
);
|
|
806
|
+
}
|
|
807
|
+
var str = "";
|
|
808
|
+
while (idx < endPtr) {
|
|
809
|
+
var u0 = heapOrArray[idx++];
|
|
810
|
+
if (!(u0 & 128)) {
|
|
811
|
+
str += String.fromCharCode(u0);
|
|
812
|
+
continue;
|
|
813
|
+
}
|
|
814
|
+
var u1 = heapOrArray[idx++] & 63;
|
|
815
|
+
if ((u0 & 224) == 192) {
|
|
816
|
+
str += String.fromCharCode(((u0 & 31) << 6) | u1);
|
|
817
|
+
continue;
|
|
818
|
+
}
|
|
819
|
+
var u2 = heapOrArray[idx++] & 63;
|
|
820
|
+
if ((u0 & 240) == 224) {
|
|
821
|
+
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
|
|
822
|
+
} else {
|
|
823
|
+
u0 =
|
|
824
|
+
((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);
|
|
825
|
+
}
|
|
826
|
+
if (u0 < 65536) {
|
|
827
|
+
str += String.fromCharCode(u0);
|
|
828
|
+
} else {
|
|
829
|
+
var ch = u0 - 65536;
|
|
830
|
+
str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
return str;
|
|
834
|
+
};
|
|
835
|
+
var FS_stdin_getChar_buffer = [];
|
|
836
|
+
var lengthBytesUTF8 = (str) => {
|
|
837
|
+
var len = 0;
|
|
838
|
+
for (var i = 0; i < str.length; ++i) {
|
|
839
|
+
var c = str.charCodeAt(i);
|
|
840
|
+
if (c <= 127) {
|
|
841
|
+
len++;
|
|
842
|
+
} else if (c <= 2047) {
|
|
843
|
+
len += 2;
|
|
844
|
+
} else if (c >= 55296 && c <= 57343) {
|
|
845
|
+
len += 4;
|
|
846
|
+
++i;
|
|
847
|
+
} else {
|
|
848
|
+
len += 3;
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
return len;
|
|
852
|
+
};
|
|
853
|
+
var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
|
|
854
|
+
if (!(maxBytesToWrite > 0)) return 0;
|
|
855
|
+
var startIdx = outIdx;
|
|
856
|
+
var endIdx = outIdx + maxBytesToWrite - 1;
|
|
857
|
+
for (var i = 0; i < str.length; ++i) {
|
|
858
|
+
var u = str.codePointAt(i);
|
|
859
|
+
if (u <= 127) {
|
|
860
|
+
if (outIdx >= endIdx) break;
|
|
861
|
+
heap[outIdx++] = u;
|
|
862
|
+
} else if (u <= 2047) {
|
|
863
|
+
if (outIdx + 1 >= endIdx) break;
|
|
864
|
+
heap[outIdx++] = 192 | (u >> 6);
|
|
865
|
+
heap[outIdx++] = 128 | (u & 63);
|
|
866
|
+
} else if (u <= 65535) {
|
|
867
|
+
if (outIdx + 2 >= endIdx) break;
|
|
868
|
+
heap[outIdx++] = 224 | (u >> 12);
|
|
869
|
+
heap[outIdx++] = 128 | ((u >> 6) & 63);
|
|
870
|
+
heap[outIdx++] = 128 | (u & 63);
|
|
871
|
+
} else {
|
|
872
|
+
if (outIdx + 3 >= endIdx) break;
|
|
873
|
+
heap[outIdx++] = 240 | (u >> 18);
|
|
874
|
+
heap[outIdx++] = 128 | ((u >> 12) & 63);
|
|
875
|
+
heap[outIdx++] = 128 | ((u >> 6) & 63);
|
|
876
|
+
heap[outIdx++] = 128 | (u & 63);
|
|
877
|
+
i++;
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
heap[outIdx] = 0;
|
|
881
|
+
return outIdx - startIdx;
|
|
882
|
+
};
|
|
883
|
+
var intArrayFromString = (stringy, dontAddNull, length) => {
|
|
884
|
+
var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
|
|
885
|
+
var u8array = new Array(len);
|
|
886
|
+
var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
|
|
887
|
+
if (dontAddNull) u8array.length = numBytesWritten;
|
|
888
|
+
return u8array;
|
|
889
|
+
};
|
|
890
|
+
var FS_stdin_getChar = () => {
|
|
891
|
+
if (!FS_stdin_getChar_buffer.length) {
|
|
892
|
+
var result = null;
|
|
893
|
+
if (ENVIRONMENT_IS_NODE) {
|
|
894
|
+
var BUFSIZE = 256;
|
|
895
|
+
var buf = Buffer.alloc(BUFSIZE);
|
|
896
|
+
var bytesRead = 0;
|
|
897
|
+
var fd = process.stdin.fd;
|
|
898
|
+
try {
|
|
899
|
+
bytesRead = fs.readSync(fd, buf, 0, BUFSIZE);
|
|
900
|
+
} catch (e) {
|
|
901
|
+
if (e.toString().includes("EOF")) bytesRead = 0;
|
|
902
|
+
else throw e;
|
|
903
|
+
}
|
|
904
|
+
if (bytesRead > 0) {
|
|
905
|
+
result = buf.slice(0, bytesRead).toString("utf-8");
|
|
906
|
+
}
|
|
907
|
+
} else if (globalThis.window?.prompt) {
|
|
908
|
+
result = window.prompt("Input: ");
|
|
909
|
+
if (result !== null) {
|
|
910
|
+
result += "\n";
|
|
911
|
+
}
|
|
912
|
+
} else {
|
|
913
|
+
}
|
|
914
|
+
if (!result) {
|
|
915
|
+
return null;
|
|
916
|
+
}
|
|
917
|
+
FS_stdin_getChar_buffer = intArrayFromString(result, true);
|
|
918
|
+
}
|
|
919
|
+
return FS_stdin_getChar_buffer.shift();
|
|
920
|
+
};
|
|
921
|
+
var TTY = {
|
|
922
|
+
ttys: [],
|
|
923
|
+
init() {},
|
|
924
|
+
shutdown() {},
|
|
925
|
+
register(dev, ops) {
|
|
926
|
+
TTY.ttys[dev] = { input: [], output: [], ops };
|
|
927
|
+
FS.registerDevice(dev, TTY.stream_ops);
|
|
928
|
+
},
|
|
929
|
+
stream_ops: {
|
|
930
|
+
open(stream) {
|
|
931
|
+
var tty = TTY.ttys[stream.node.rdev];
|
|
932
|
+
if (!tty) {
|
|
933
|
+
throw new FS.ErrnoError(43);
|
|
934
|
+
}
|
|
935
|
+
stream.tty = tty;
|
|
936
|
+
stream.seekable = false;
|
|
937
|
+
},
|
|
938
|
+
close(stream) {
|
|
939
|
+
stream.tty.ops.fsync(stream.tty);
|
|
940
|
+
},
|
|
941
|
+
fsync(stream) {
|
|
942
|
+
stream.tty.ops.fsync(stream.tty);
|
|
943
|
+
},
|
|
944
|
+
read(stream, buffer, offset, length, pos) {
|
|
945
|
+
if (!stream.tty || !stream.tty.ops.get_char) {
|
|
946
|
+
throw new FS.ErrnoError(60);
|
|
947
|
+
}
|
|
948
|
+
var bytesRead = 0;
|
|
949
|
+
for (var i = 0; i < length; i++) {
|
|
950
|
+
var result;
|
|
951
|
+
try {
|
|
952
|
+
result = stream.tty.ops.get_char(stream.tty);
|
|
953
|
+
} catch (e) {
|
|
954
|
+
throw new FS.ErrnoError(29);
|
|
955
|
+
}
|
|
956
|
+
if (result === undefined && !bytesRead) {
|
|
957
|
+
throw new FS.ErrnoError(6);
|
|
958
|
+
}
|
|
959
|
+
if (result === null || result === undefined) break;
|
|
960
|
+
bytesRead++;
|
|
961
|
+
buffer[offset + i] = result;
|
|
962
|
+
}
|
|
963
|
+
if (bytesRead) {
|
|
964
|
+
stream.node.atime = Date.now();
|
|
965
|
+
}
|
|
966
|
+
return bytesRead;
|
|
967
|
+
},
|
|
968
|
+
write(stream, buffer, offset, length, pos) {
|
|
969
|
+
if (!stream.tty || !stream.tty.ops.put_char) {
|
|
970
|
+
throw new FS.ErrnoError(60);
|
|
971
|
+
}
|
|
972
|
+
try {
|
|
973
|
+
for (var i = 0; i < length; i++) {
|
|
974
|
+
stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
|
|
975
|
+
}
|
|
976
|
+
} catch (e) {
|
|
977
|
+
throw new FS.ErrnoError(29);
|
|
978
|
+
}
|
|
979
|
+
if (length) {
|
|
980
|
+
stream.node.mtime = stream.node.ctime = Date.now();
|
|
981
|
+
}
|
|
982
|
+
return i;
|
|
983
|
+
},
|
|
984
|
+
},
|
|
985
|
+
default_tty_ops: {
|
|
986
|
+
get_char(tty) {
|
|
987
|
+
return FS_stdin_getChar();
|
|
988
|
+
},
|
|
989
|
+
put_char(tty, val) {
|
|
990
|
+
if (val === null || val === 10) {
|
|
991
|
+
out(UTF8ArrayToString(tty.output));
|
|
992
|
+
tty.output = [];
|
|
993
|
+
} else {
|
|
994
|
+
if (val != 0) tty.output.push(val);
|
|
995
|
+
}
|
|
996
|
+
},
|
|
997
|
+
fsync(tty) {
|
|
998
|
+
if (tty.output?.length > 0) {
|
|
999
|
+
out(UTF8ArrayToString(tty.output));
|
|
1000
|
+
tty.output = [];
|
|
1001
|
+
}
|
|
1002
|
+
},
|
|
1003
|
+
ioctl_tcgets(tty) {
|
|
1004
|
+
return {
|
|
1005
|
+
c_iflag: 25856,
|
|
1006
|
+
c_oflag: 5,
|
|
1007
|
+
c_cflag: 191,
|
|
1008
|
+
c_lflag: 35387,
|
|
1009
|
+
c_cc: [
|
|
1010
|
+
3, 28, 127, 21, 4, 0, 1, 0, 17, 19, 26, 0, 18, 15, 23, 22, 0, 0, 0, 0,
|
|
1011
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
1012
|
+
],
|
|
1013
|
+
};
|
|
1014
|
+
},
|
|
1015
|
+
ioctl_tcsets(tty, optional_actions, data) {
|
|
1016
|
+
return 0;
|
|
1017
|
+
},
|
|
1018
|
+
ioctl_tiocgwinsz(tty) {
|
|
1019
|
+
return [24, 80];
|
|
1020
|
+
},
|
|
1021
|
+
},
|
|
1022
|
+
default_tty1_ops: {
|
|
1023
|
+
put_char(tty, val) {
|
|
1024
|
+
if (val === null || val === 10) {
|
|
1025
|
+
err(UTF8ArrayToString(tty.output));
|
|
1026
|
+
tty.output = [];
|
|
1027
|
+
} else {
|
|
1028
|
+
if (val != 0) tty.output.push(val);
|
|
1029
|
+
}
|
|
1030
|
+
},
|
|
1031
|
+
fsync(tty) {
|
|
1032
|
+
if (tty.output?.length > 0) {
|
|
1033
|
+
err(UTF8ArrayToString(tty.output));
|
|
1034
|
+
tty.output = [];
|
|
1035
|
+
}
|
|
1036
|
+
},
|
|
1037
|
+
},
|
|
1038
|
+
};
|
|
1039
|
+
var mmapAlloc = (size) => {
|
|
1040
|
+
abort();
|
|
1041
|
+
};
|
|
1042
|
+
var MEMFS = {
|
|
1043
|
+
ops_table: null,
|
|
1044
|
+
mount(mount) {
|
|
1045
|
+
return MEMFS.createNode(null, "/", 16895, 0);
|
|
1046
|
+
},
|
|
1047
|
+
createNode(parent, name, mode, dev) {
|
|
1048
|
+
if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
|
|
1049
|
+
throw new FS.ErrnoError(63);
|
|
1050
|
+
}
|
|
1051
|
+
MEMFS.ops_table ||= {
|
|
1052
|
+
dir: {
|
|
1053
|
+
node: {
|
|
1054
|
+
getattr: MEMFS.node_ops.getattr,
|
|
1055
|
+
setattr: MEMFS.node_ops.setattr,
|
|
1056
|
+
lookup: MEMFS.node_ops.lookup,
|
|
1057
|
+
mknod: MEMFS.node_ops.mknod,
|
|
1058
|
+
rename: MEMFS.node_ops.rename,
|
|
1059
|
+
unlink: MEMFS.node_ops.unlink,
|
|
1060
|
+
rmdir: MEMFS.node_ops.rmdir,
|
|
1061
|
+
readdir: MEMFS.node_ops.readdir,
|
|
1062
|
+
symlink: MEMFS.node_ops.symlink,
|
|
1063
|
+
},
|
|
1064
|
+
stream: { llseek: MEMFS.stream_ops.llseek },
|
|
1065
|
+
},
|
|
1066
|
+
file: {
|
|
1067
|
+
node: {
|
|
1068
|
+
getattr: MEMFS.node_ops.getattr,
|
|
1069
|
+
setattr: MEMFS.node_ops.setattr,
|
|
1070
|
+
},
|
|
1071
|
+
stream: {
|
|
1072
|
+
llseek: MEMFS.stream_ops.llseek,
|
|
1073
|
+
read: MEMFS.stream_ops.read,
|
|
1074
|
+
write: MEMFS.stream_ops.write,
|
|
1075
|
+
mmap: MEMFS.stream_ops.mmap,
|
|
1076
|
+
msync: MEMFS.stream_ops.msync,
|
|
1077
|
+
},
|
|
1078
|
+
},
|
|
1079
|
+
link: {
|
|
1080
|
+
node: {
|
|
1081
|
+
getattr: MEMFS.node_ops.getattr,
|
|
1082
|
+
setattr: MEMFS.node_ops.setattr,
|
|
1083
|
+
readlink: MEMFS.node_ops.readlink,
|
|
1084
|
+
},
|
|
1085
|
+
stream: {},
|
|
1086
|
+
},
|
|
1087
|
+
chrdev: {
|
|
1088
|
+
node: {
|
|
1089
|
+
getattr: MEMFS.node_ops.getattr,
|
|
1090
|
+
setattr: MEMFS.node_ops.setattr,
|
|
1091
|
+
},
|
|
1092
|
+
stream: FS.chrdev_stream_ops,
|
|
1093
|
+
},
|
|
1094
|
+
};
|
|
1095
|
+
var node = FS.createNode(parent, name, mode, dev);
|
|
1096
|
+
if (FS.isDir(node.mode)) {
|
|
1097
|
+
node.node_ops = MEMFS.ops_table.dir.node;
|
|
1098
|
+
node.stream_ops = MEMFS.ops_table.dir.stream;
|
|
1099
|
+
node.contents = {};
|
|
1100
|
+
} else if (FS.isFile(node.mode)) {
|
|
1101
|
+
node.node_ops = MEMFS.ops_table.file.node;
|
|
1102
|
+
node.stream_ops = MEMFS.ops_table.file.stream;
|
|
1103
|
+
node.usedBytes = 0;
|
|
1104
|
+
node.contents = MEMFS.emptyFileContents ??= new Uint8Array(0);
|
|
1105
|
+
} else if (FS.isLink(node.mode)) {
|
|
1106
|
+
node.node_ops = MEMFS.ops_table.link.node;
|
|
1107
|
+
node.stream_ops = MEMFS.ops_table.link.stream;
|
|
1108
|
+
} else if (FS.isChrdev(node.mode)) {
|
|
1109
|
+
node.node_ops = MEMFS.ops_table.chrdev.node;
|
|
1110
|
+
node.stream_ops = MEMFS.ops_table.chrdev.stream;
|
|
1111
|
+
}
|
|
1112
|
+
node.atime = node.mtime = node.ctime = Date.now();
|
|
1113
|
+
if (parent) {
|
|
1114
|
+
parent.contents[name] = node;
|
|
1115
|
+
parent.atime = parent.mtime = parent.ctime = node.atime;
|
|
1116
|
+
}
|
|
1117
|
+
return node;
|
|
1118
|
+
},
|
|
1119
|
+
getFileDataAsTypedArray(node) {
|
|
1120
|
+
return node.contents.subarray(0, node.usedBytes);
|
|
1121
|
+
},
|
|
1122
|
+
expandFileStorage(node, newCapacity) {
|
|
1123
|
+
var prevCapacity = node.contents.length;
|
|
1124
|
+
if (prevCapacity >= newCapacity) return;
|
|
1125
|
+
var CAPACITY_DOUBLING_MAX = 1024 * 1024;
|
|
1126
|
+
newCapacity = Math.max(
|
|
1127
|
+
newCapacity,
|
|
1128
|
+
(prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0,
|
|
1129
|
+
);
|
|
1130
|
+
if (prevCapacity) newCapacity = Math.max(newCapacity, 256);
|
|
1131
|
+
var oldContents = MEMFS.getFileDataAsTypedArray(node);
|
|
1132
|
+
node.contents = new Uint8Array(newCapacity);
|
|
1133
|
+
node.contents.set(oldContents);
|
|
1134
|
+
},
|
|
1135
|
+
resizeFileStorage(node, newSize) {
|
|
1136
|
+
if (node.usedBytes == newSize) return;
|
|
1137
|
+
var oldContents = node.contents;
|
|
1138
|
+
node.contents = new Uint8Array(newSize);
|
|
1139
|
+
node.contents.set(
|
|
1140
|
+
oldContents.subarray(0, Math.min(newSize, node.usedBytes)),
|
|
1141
|
+
);
|
|
1142
|
+
node.usedBytes = newSize;
|
|
1143
|
+
},
|
|
1144
|
+
node_ops: {
|
|
1145
|
+
getattr(node) {
|
|
1146
|
+
var attr = {};
|
|
1147
|
+
attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
|
|
1148
|
+
attr.ino = node.id;
|
|
1149
|
+
attr.mode = node.mode;
|
|
1150
|
+
attr.nlink = 1;
|
|
1151
|
+
attr.uid = 0;
|
|
1152
|
+
attr.gid = 0;
|
|
1153
|
+
attr.rdev = node.rdev;
|
|
1154
|
+
if (FS.isDir(node.mode)) {
|
|
1155
|
+
attr.size = 4096;
|
|
1156
|
+
} else if (FS.isFile(node.mode)) {
|
|
1157
|
+
attr.size = node.usedBytes;
|
|
1158
|
+
} else if (FS.isLink(node.mode)) {
|
|
1159
|
+
attr.size = node.link.length;
|
|
1160
|
+
} else {
|
|
1161
|
+
attr.size = 0;
|
|
1162
|
+
}
|
|
1163
|
+
attr.atime = new Date(node.atime);
|
|
1164
|
+
attr.mtime = new Date(node.mtime);
|
|
1165
|
+
attr.ctime = new Date(node.ctime);
|
|
1166
|
+
attr.blksize = 4096;
|
|
1167
|
+
attr.blocks = Math.ceil(attr.size / attr.blksize);
|
|
1168
|
+
return attr;
|
|
1169
|
+
},
|
|
1170
|
+
setattr(node, attr) {
|
|
1171
|
+
for (const key of ["mode", "atime", "mtime", "ctime"]) {
|
|
1172
|
+
if (attr[key] != null) {
|
|
1173
|
+
node[key] = attr[key];
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
if (attr.size !== undefined) {
|
|
1177
|
+
MEMFS.resizeFileStorage(node, attr.size);
|
|
1178
|
+
}
|
|
1179
|
+
},
|
|
1180
|
+
lookup(parent, name) {
|
|
1181
|
+
if (!MEMFS.doesNotExistError) {
|
|
1182
|
+
MEMFS.doesNotExistError = new FS.ErrnoError(44);
|
|
1183
|
+
MEMFS.doesNotExistError.stack = "<generic error, no stack>";
|
|
1184
|
+
}
|
|
1185
|
+
throw MEMFS.doesNotExistError;
|
|
1186
|
+
},
|
|
1187
|
+
mknod(parent, name, mode, dev) {
|
|
1188
|
+
return MEMFS.createNode(parent, name, mode, dev);
|
|
1189
|
+
},
|
|
1190
|
+
rename(old_node, new_dir, new_name) {
|
|
1191
|
+
var new_node;
|
|
1192
|
+
try {
|
|
1193
|
+
new_node = FS.lookupNode(new_dir, new_name);
|
|
1194
|
+
} catch (e) {}
|
|
1195
|
+
if (new_node) {
|
|
1196
|
+
if (FS.isDir(old_node.mode)) {
|
|
1197
|
+
for (var i in new_node.contents) {
|
|
1198
|
+
throw new FS.ErrnoError(55);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
FS.hashRemoveNode(new_node);
|
|
1202
|
+
}
|
|
1203
|
+
delete old_node.parent.contents[old_node.name];
|
|
1204
|
+
new_dir.contents[new_name] = old_node;
|
|
1205
|
+
old_node.name = new_name;
|
|
1206
|
+
new_dir.ctime =
|
|
1207
|
+
new_dir.mtime =
|
|
1208
|
+
old_node.parent.ctime =
|
|
1209
|
+
old_node.parent.mtime =
|
|
1210
|
+
Date.now();
|
|
1211
|
+
},
|
|
1212
|
+
unlink(parent, name) {
|
|
1213
|
+
delete parent.contents[name];
|
|
1214
|
+
parent.ctime = parent.mtime = Date.now();
|
|
1215
|
+
},
|
|
1216
|
+
rmdir(parent, name) {
|
|
1217
|
+
var node = FS.lookupNode(parent, name);
|
|
1218
|
+
for (var i in node.contents) {
|
|
1219
|
+
throw new FS.ErrnoError(55);
|
|
1220
|
+
}
|
|
1221
|
+
delete parent.contents[name];
|
|
1222
|
+
parent.ctime = parent.mtime = Date.now();
|
|
1223
|
+
},
|
|
1224
|
+
readdir(node) {
|
|
1225
|
+
return [".", "..", ...Object.keys(node.contents)];
|
|
1226
|
+
},
|
|
1227
|
+
symlink(parent, newname, oldpath) {
|
|
1228
|
+
var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
|
|
1229
|
+
node.link = oldpath;
|
|
1230
|
+
return node;
|
|
1231
|
+
},
|
|
1232
|
+
readlink(node) {
|
|
1233
|
+
if (!FS.isLink(node.mode)) {
|
|
1234
|
+
throw new FS.ErrnoError(28);
|
|
1235
|
+
}
|
|
1236
|
+
return node.link;
|
|
1237
|
+
},
|
|
1238
|
+
},
|
|
1239
|
+
stream_ops: {
|
|
1240
|
+
read(stream, buffer, offset, length, position) {
|
|
1241
|
+
var contents = stream.node.contents;
|
|
1242
|
+
if (position >= stream.node.usedBytes) return 0;
|
|
1243
|
+
var size = Math.min(stream.node.usedBytes - position, length);
|
|
1244
|
+
buffer.set(contents.subarray(position, position + size), offset);
|
|
1245
|
+
return size;
|
|
1246
|
+
},
|
|
1247
|
+
write(stream, buffer, offset, length, position, canOwn) {
|
|
1248
|
+
if (buffer.buffer === (growMemViews(), HEAP8).buffer) {
|
|
1249
|
+
canOwn = false;
|
|
1250
|
+
}
|
|
1251
|
+
if (!length) return 0;
|
|
1252
|
+
var node = stream.node;
|
|
1253
|
+
node.mtime = node.ctime = Date.now();
|
|
1254
|
+
if (canOwn) {
|
|
1255
|
+
node.contents = buffer.subarray(offset, offset + length);
|
|
1256
|
+
node.usedBytes = length;
|
|
1257
|
+
} else if (!node.usedBytes && !position) {
|
|
1258
|
+
node.contents = buffer.slice(offset, offset + length);
|
|
1259
|
+
node.usedBytes = length;
|
|
1260
|
+
} else {
|
|
1261
|
+
MEMFS.expandFileStorage(node, position + length);
|
|
1262
|
+
node.contents.set(buffer.subarray(offset, offset + length), position);
|
|
1263
|
+
node.usedBytes = Math.max(node.usedBytes, position + length);
|
|
1264
|
+
}
|
|
1265
|
+
return length;
|
|
1266
|
+
},
|
|
1267
|
+
llseek(stream, offset, whence) {
|
|
1268
|
+
var position = offset;
|
|
1269
|
+
if (whence === 1) {
|
|
1270
|
+
position += stream.position;
|
|
1271
|
+
} else if (whence === 2) {
|
|
1272
|
+
if (FS.isFile(stream.node.mode)) {
|
|
1273
|
+
position += stream.node.usedBytes;
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
if (position < 0) {
|
|
1277
|
+
throw new FS.ErrnoError(28);
|
|
1278
|
+
}
|
|
1279
|
+
return position;
|
|
1280
|
+
},
|
|
1281
|
+
mmap(stream, length, position, prot, flags) {
|
|
1282
|
+
if (!FS.isFile(stream.node.mode)) {
|
|
1283
|
+
throw new FS.ErrnoError(43);
|
|
1284
|
+
}
|
|
1285
|
+
var ptr;
|
|
1286
|
+
var allocated;
|
|
1287
|
+
var contents = stream.node.contents;
|
|
1288
|
+
if (!(flags & 2) && contents.buffer === (growMemViews(), HEAP8).buffer) {
|
|
1289
|
+
allocated = false;
|
|
1290
|
+
ptr = contents.byteOffset;
|
|
1291
|
+
} else {
|
|
1292
|
+
allocated = true;
|
|
1293
|
+
ptr = mmapAlloc(length);
|
|
1294
|
+
if (!ptr) {
|
|
1295
|
+
throw new FS.ErrnoError(48);
|
|
1296
|
+
}
|
|
1297
|
+
if (contents) {
|
|
1298
|
+
if (position > 0 || position + length < contents.length) {
|
|
1299
|
+
if (contents.subarray) {
|
|
1300
|
+
contents = contents.subarray(position, position + length);
|
|
1301
|
+
} else {
|
|
1302
|
+
contents = Array.prototype.slice.call(
|
|
1303
|
+
contents,
|
|
1304
|
+
position,
|
|
1305
|
+
position + length,
|
|
1306
|
+
);
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
(growMemViews(), HEAP8).set(contents, ptr);
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
return { ptr, allocated };
|
|
1313
|
+
},
|
|
1314
|
+
msync(stream, buffer, offset, length, mmapFlags) {
|
|
1315
|
+
MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
|
|
1316
|
+
return 0;
|
|
1317
|
+
},
|
|
1318
|
+
},
|
|
1319
|
+
};
|
|
1320
|
+
var FS_modeStringToFlags = (str) => {
|
|
1321
|
+
if (typeof str != "string") return str;
|
|
1322
|
+
var flagModes = {
|
|
1323
|
+
r: 0,
|
|
1324
|
+
"r+": 2,
|
|
1325
|
+
w: 512 | 64 | 1,
|
|
1326
|
+
"w+": 512 | 64 | 2,
|
|
1327
|
+
a: 1024 | 64 | 1,
|
|
1328
|
+
"a+": 1024 | 64 | 2,
|
|
1329
|
+
};
|
|
1330
|
+
var flags = flagModes[str];
|
|
1331
|
+
if (typeof flags == "undefined") {
|
|
1332
|
+
throw new Error(`Unknown file open mode: ${str}`);
|
|
1333
|
+
}
|
|
1334
|
+
return flags;
|
|
1335
|
+
};
|
|
1336
|
+
var FS_fileDataToTypedArray = (data) => {
|
|
1337
|
+
if (typeof data == "string") {
|
|
1338
|
+
data = intArrayFromString(data, true);
|
|
1339
|
+
}
|
|
1340
|
+
if (!data.subarray) {
|
|
1341
|
+
data = new Uint8Array(data);
|
|
1342
|
+
}
|
|
1343
|
+
return data;
|
|
1344
|
+
};
|
|
1345
|
+
var FS_getMode = (canRead, canWrite) => {
|
|
1346
|
+
var mode = 0;
|
|
1347
|
+
if (canRead) mode |= 292 | 73;
|
|
1348
|
+
if (canWrite) mode |= 146;
|
|
1349
|
+
return mode;
|
|
1350
|
+
};
|
|
1351
|
+
var asyncLoad = async (url) => {
|
|
1352
|
+
var arrayBuffer = await readAsync(url);
|
|
1353
|
+
return new Uint8Array(arrayBuffer);
|
|
1354
|
+
};
|
|
1355
|
+
var FS_createDataFile = (...args) => FS.createDataFile(...args);
|
|
1356
|
+
var getUniqueRunDependency = (id) => id;
|
|
1357
|
+
var preloadPlugins = [];
|
|
1358
|
+
var FS_handledByPreloadPlugin = async (byteArray, fullname) => {
|
|
1359
|
+
if (typeof Browser != "undefined") Browser.init();
|
|
1360
|
+
for (var plugin of preloadPlugins) {
|
|
1361
|
+
if (plugin["canHandle"](fullname)) {
|
|
1362
|
+
return plugin["handle"](byteArray, fullname);
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
return byteArray;
|
|
1366
|
+
};
|
|
1367
|
+
var FS_preloadFile = async (
|
|
1368
|
+
parent,
|
|
1369
|
+
name,
|
|
1370
|
+
url,
|
|
1371
|
+
canRead,
|
|
1372
|
+
canWrite,
|
|
1373
|
+
dontCreateFile,
|
|
1374
|
+
canOwn,
|
|
1375
|
+
preFinish,
|
|
1376
|
+
) => {
|
|
1377
|
+
var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
|
|
1378
|
+
var dep = getUniqueRunDependency(`cp ${fullname}`);
|
|
1379
|
+
addRunDependency(dep);
|
|
1380
|
+
try {
|
|
1381
|
+
var byteArray = url;
|
|
1382
|
+
if (typeof url == "string") {
|
|
1383
|
+
byteArray = await asyncLoad(url);
|
|
1384
|
+
}
|
|
1385
|
+
byteArray = await FS_handledByPreloadPlugin(byteArray, fullname);
|
|
1386
|
+
preFinish?.();
|
|
1387
|
+
if (!dontCreateFile) {
|
|
1388
|
+
FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
|
|
1389
|
+
}
|
|
1390
|
+
} finally {
|
|
1391
|
+
removeRunDependency(dep);
|
|
1392
|
+
}
|
|
1393
|
+
};
|
|
1394
|
+
var FS_createPreloadedFile = (
|
|
1395
|
+
parent,
|
|
1396
|
+
name,
|
|
1397
|
+
url,
|
|
1398
|
+
canRead,
|
|
1399
|
+
canWrite,
|
|
1400
|
+
onload,
|
|
1401
|
+
onerror,
|
|
1402
|
+
dontCreateFile,
|
|
1403
|
+
canOwn,
|
|
1404
|
+
preFinish,
|
|
1405
|
+
) => {
|
|
1406
|
+
FS_preloadFile(
|
|
1407
|
+
parent,
|
|
1408
|
+
name,
|
|
1409
|
+
url,
|
|
1410
|
+
canRead,
|
|
1411
|
+
canWrite,
|
|
1412
|
+
dontCreateFile,
|
|
1413
|
+
canOwn,
|
|
1414
|
+
preFinish,
|
|
1415
|
+
)
|
|
1416
|
+
.then(onload)
|
|
1417
|
+
.catch(onerror);
|
|
1418
|
+
};
|
|
1419
|
+
var FS = {
|
|
1420
|
+
root: null,
|
|
1421
|
+
mounts: [],
|
|
1422
|
+
devices: {},
|
|
1423
|
+
streams: [],
|
|
1424
|
+
nextInode: 1,
|
|
1425
|
+
nameTable: null,
|
|
1426
|
+
currentPath: "/",
|
|
1427
|
+
initialized: false,
|
|
1428
|
+
ignorePermissions: true,
|
|
1429
|
+
filesystems: null,
|
|
1430
|
+
syncFSRequests: 0,
|
|
1431
|
+
ErrnoError: class {
|
|
1432
|
+
name = "ErrnoError";
|
|
1433
|
+
constructor(errno) {
|
|
1434
|
+
this.errno = errno;
|
|
1435
|
+
}
|
|
1436
|
+
},
|
|
1437
|
+
FSStream: class {
|
|
1438
|
+
shared = {};
|
|
1439
|
+
get object() {
|
|
1440
|
+
return this.node;
|
|
1441
|
+
}
|
|
1442
|
+
set object(val) {
|
|
1443
|
+
this.node = val;
|
|
1444
|
+
}
|
|
1445
|
+
get isRead() {
|
|
1446
|
+
return (this.flags & 2097155) !== 1;
|
|
1447
|
+
}
|
|
1448
|
+
get isWrite() {
|
|
1449
|
+
return (this.flags & 2097155) !== 0;
|
|
1450
|
+
}
|
|
1451
|
+
get isAppend() {
|
|
1452
|
+
return this.flags & 1024;
|
|
1453
|
+
}
|
|
1454
|
+
get flags() {
|
|
1455
|
+
return this.shared.flags;
|
|
1456
|
+
}
|
|
1457
|
+
set flags(val) {
|
|
1458
|
+
this.shared.flags = val;
|
|
1459
|
+
}
|
|
1460
|
+
get position() {
|
|
1461
|
+
return this.shared.position;
|
|
1462
|
+
}
|
|
1463
|
+
set position(val) {
|
|
1464
|
+
this.shared.position = val;
|
|
1465
|
+
}
|
|
1466
|
+
},
|
|
1467
|
+
FSNode: class {
|
|
1468
|
+
node_ops = {};
|
|
1469
|
+
stream_ops = {};
|
|
1470
|
+
readMode = 292 | 73;
|
|
1471
|
+
writeMode = 146;
|
|
1472
|
+
mounted = null;
|
|
1473
|
+
constructor(parent, name, mode, rdev) {
|
|
1474
|
+
if (!parent) {
|
|
1475
|
+
parent = this;
|
|
1476
|
+
}
|
|
1477
|
+
this.parent = parent;
|
|
1478
|
+
this.mount = parent.mount;
|
|
1479
|
+
this.id = FS.nextInode++;
|
|
1480
|
+
this.name = name;
|
|
1481
|
+
this.mode = mode;
|
|
1482
|
+
this.rdev = rdev;
|
|
1483
|
+
this.atime = this.mtime = this.ctime = Date.now();
|
|
1484
|
+
}
|
|
1485
|
+
get read() {
|
|
1486
|
+
return (this.mode & this.readMode) === this.readMode;
|
|
1487
|
+
}
|
|
1488
|
+
set read(val) {
|
|
1489
|
+
val ? (this.mode |= this.readMode) : (this.mode &= ~this.readMode);
|
|
1490
|
+
}
|
|
1491
|
+
get write() {
|
|
1492
|
+
return (this.mode & this.writeMode) === this.writeMode;
|
|
1493
|
+
}
|
|
1494
|
+
set write(val) {
|
|
1495
|
+
val ? (this.mode |= this.writeMode) : (this.mode &= ~this.writeMode);
|
|
1496
|
+
}
|
|
1497
|
+
get isFolder() {
|
|
1498
|
+
return FS.isDir(this.mode);
|
|
1499
|
+
}
|
|
1500
|
+
get isDevice() {
|
|
1501
|
+
return FS.isChrdev(this.mode);
|
|
1502
|
+
}
|
|
1503
|
+
addListener(cb, exclusive = false) {
|
|
1504
|
+
var entry = { cb, exclusive };
|
|
1505
|
+
var listeners = (this.listeners ??= new Set());
|
|
1506
|
+
listeners.add(entry);
|
|
1507
|
+
return { listeners, entry };
|
|
1508
|
+
}
|
|
1509
|
+
notifyListeners(flags) {
|
|
1510
|
+
if (!this.listeners) return;
|
|
1511
|
+
var excl;
|
|
1512
|
+
for (var entry of this.listeners) {
|
|
1513
|
+
if (entry.exclusive) (excl ||= []).push(entry);
|
|
1514
|
+
else entry.cb(flags);
|
|
1515
|
+
}
|
|
1516
|
+
if (excl) {
|
|
1517
|
+
var i = (this.exclTurn || 0) % excl.length;
|
|
1518
|
+
this.exclTurn = i + 1;
|
|
1519
|
+
excl[i].cb(flags);
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
},
|
|
1523
|
+
lookupPath(path, opts = {}) {
|
|
1524
|
+
if (!path) {
|
|
1525
|
+
throw new FS.ErrnoError(44);
|
|
1526
|
+
}
|
|
1527
|
+
opts.follow_mount ??= true;
|
|
1528
|
+
if (!PATH.isAbs(path)) {
|
|
1529
|
+
path = FS.cwd() + "/" + path;
|
|
1530
|
+
}
|
|
1531
|
+
linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) {
|
|
1532
|
+
var parts = path.split("/").filter((p) => !!p);
|
|
1533
|
+
var current = FS.root;
|
|
1534
|
+
var current_path = "/";
|
|
1535
|
+
for (var i = 0; i < parts.length; i++) {
|
|
1536
|
+
var islast = i === parts.length - 1;
|
|
1537
|
+
if (islast && opts.parent) {
|
|
1538
|
+
break;
|
|
1539
|
+
}
|
|
1540
|
+
if (parts[i] === ".") {
|
|
1541
|
+
continue;
|
|
1542
|
+
}
|
|
1543
|
+
if (parts[i] === "..") {
|
|
1544
|
+
current_path = PATH.dirname(current_path);
|
|
1545
|
+
if (FS.isRoot(current)) {
|
|
1546
|
+
path = current_path + "/" + parts.slice(i + 1).join("/");
|
|
1547
|
+
nlinks--;
|
|
1548
|
+
continue linkloop;
|
|
1549
|
+
} else {
|
|
1550
|
+
current = current.parent;
|
|
1551
|
+
}
|
|
1552
|
+
continue;
|
|
1553
|
+
}
|
|
1554
|
+
current_path = PATH.join2(current_path, parts[i]);
|
|
1555
|
+
try {
|
|
1556
|
+
current = FS.lookupNode(current, parts[i]);
|
|
1557
|
+
} catch (e) {
|
|
1558
|
+
if (e?.errno === 44 && islast && opts.noent_okay) {
|
|
1559
|
+
return { path: current_path };
|
|
1560
|
+
}
|
|
1561
|
+
throw e;
|
|
1562
|
+
}
|
|
1563
|
+
if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) {
|
|
1564
|
+
current = current.mounted.root;
|
|
1565
|
+
}
|
|
1566
|
+
if (FS.isLink(current.mode) && (!islast || opts.follow)) {
|
|
1567
|
+
if (!current.node_ops.readlink) {
|
|
1568
|
+
throw new FS.ErrnoError(52);
|
|
1569
|
+
}
|
|
1570
|
+
var link = current.node_ops.readlink(current);
|
|
1571
|
+
if (!PATH.isAbs(link)) {
|
|
1572
|
+
link = PATH.dirname(current_path) + "/" + link;
|
|
1573
|
+
}
|
|
1574
|
+
path = link + "/" + parts.slice(i + 1).join("/");
|
|
1575
|
+
continue linkloop;
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
return { path: current_path, node: current };
|
|
1579
|
+
}
|
|
1580
|
+
throw new FS.ErrnoError(32);
|
|
1581
|
+
},
|
|
1582
|
+
getPath(node) {
|
|
1583
|
+
var path;
|
|
1584
|
+
while (true) {
|
|
1585
|
+
if (FS.isRoot(node)) {
|
|
1586
|
+
var mount = node.mount.mountpoint;
|
|
1587
|
+
if (!path) return mount;
|
|
1588
|
+
return mount[mount.length - 1] !== "/"
|
|
1589
|
+
? `${mount}/${path}`
|
|
1590
|
+
: mount + path;
|
|
1591
|
+
}
|
|
1592
|
+
path = path ? `${node.name}/${path}` : node.name;
|
|
1593
|
+
node = node.parent;
|
|
1594
|
+
}
|
|
1595
|
+
},
|
|
1596
|
+
hashName(parentid, name) {
|
|
1597
|
+
var hash = 0;
|
|
1598
|
+
for (var i = 0; i < name.length; i++) {
|
|
1599
|
+
hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
|
|
1600
|
+
}
|
|
1601
|
+
return ((parentid + hash) >>> 0) % FS.nameTable.length;
|
|
1602
|
+
},
|
|
1603
|
+
hashAddNode(node) {
|
|
1604
|
+
var hash = FS.hashName(node.parent.id, node.name);
|
|
1605
|
+
node.name_next = FS.nameTable[hash];
|
|
1606
|
+
FS.nameTable[hash] = node;
|
|
1607
|
+
},
|
|
1608
|
+
hashRemoveNode(node) {
|
|
1609
|
+
var hash = FS.hashName(node.parent.id, node.name);
|
|
1610
|
+
if (FS.nameTable[hash] === node) {
|
|
1611
|
+
FS.nameTable[hash] = node.name_next;
|
|
1612
|
+
} else {
|
|
1613
|
+
var current = FS.nameTable[hash];
|
|
1614
|
+
while (current) {
|
|
1615
|
+
if (current.name_next === node) {
|
|
1616
|
+
current.name_next = node.name_next;
|
|
1617
|
+
break;
|
|
1618
|
+
}
|
|
1619
|
+
current = current.name_next;
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
lookupNode(parent, name) {
|
|
1624
|
+
var errCode = FS.mayLookup(parent);
|
|
1625
|
+
if (errCode) {
|
|
1626
|
+
throw new FS.ErrnoError(errCode);
|
|
1627
|
+
}
|
|
1628
|
+
var hash = FS.hashName(parent.id, name);
|
|
1629
|
+
for (var node = FS.nameTable[hash]; node; node = node.name_next) {
|
|
1630
|
+
var nodeName = node.name;
|
|
1631
|
+
if (node.parent.id === parent.id && nodeName === name) {
|
|
1632
|
+
return node;
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
return FS.lookup(parent, name);
|
|
1636
|
+
},
|
|
1637
|
+
createNode(parent, name, mode, rdev) {
|
|
1638
|
+
var node = new FS.FSNode(parent, name, mode, rdev);
|
|
1639
|
+
FS.hashAddNode(node);
|
|
1640
|
+
return node;
|
|
1641
|
+
},
|
|
1642
|
+
destroyNode(node) {
|
|
1643
|
+
FS.hashRemoveNode(node);
|
|
1644
|
+
},
|
|
1645
|
+
isRoot(node) {
|
|
1646
|
+
return node === node.parent;
|
|
1647
|
+
},
|
|
1648
|
+
isMountpoint(node) {
|
|
1649
|
+
return !!node.mounted;
|
|
1650
|
+
},
|
|
1651
|
+
isFile(mode) {
|
|
1652
|
+
return (mode & 61440) === 32768;
|
|
1653
|
+
},
|
|
1654
|
+
isDir(mode) {
|
|
1655
|
+
return (mode & 61440) === 16384;
|
|
1656
|
+
},
|
|
1657
|
+
isLink(mode) {
|
|
1658
|
+
return (mode & 61440) === 40960;
|
|
1659
|
+
},
|
|
1660
|
+
isChrdev(mode) {
|
|
1661
|
+
return (mode & 61440) === 8192;
|
|
1662
|
+
},
|
|
1663
|
+
isBlkdev(mode) {
|
|
1664
|
+
return (mode & 61440) === 24576;
|
|
1665
|
+
},
|
|
1666
|
+
isFIFO(mode) {
|
|
1667
|
+
return (mode & 61440) === 4096;
|
|
1668
|
+
},
|
|
1669
|
+
isSocket(mode) {
|
|
1670
|
+
return (mode & 49152) === 49152;
|
|
1671
|
+
},
|
|
1672
|
+
flagsToPermissionString(flag) {
|
|
1673
|
+
var perms = ["r", "w", "rw"][flag & 3];
|
|
1674
|
+
if (flag & 512) {
|
|
1675
|
+
perms += "w";
|
|
1676
|
+
}
|
|
1677
|
+
return perms;
|
|
1678
|
+
},
|
|
1679
|
+
nodePermissions(node, perms) {
|
|
1680
|
+
if (FS.ignorePermissions) {
|
|
1681
|
+
return 0;
|
|
1682
|
+
}
|
|
1683
|
+
if (perms.includes("r") && !(node.mode & 292)) {
|
|
1684
|
+
return 2;
|
|
1685
|
+
}
|
|
1686
|
+
if (perms.includes("w") && !(node.mode & 146)) {
|
|
1687
|
+
return 2;
|
|
1688
|
+
}
|
|
1689
|
+
if (perms.includes("x") && !(node.mode & 73)) {
|
|
1690
|
+
return 2;
|
|
1691
|
+
}
|
|
1692
|
+
return 0;
|
|
1693
|
+
},
|
|
1694
|
+
mayLookup(dir) {
|
|
1695
|
+
if (!FS.isDir(dir.mode)) return 54;
|
|
1696
|
+
var errCode = FS.nodePermissions(dir, "x");
|
|
1697
|
+
if (errCode) return errCode;
|
|
1698
|
+
if (!dir.node_ops.lookup) return 2;
|
|
1699
|
+
return 0;
|
|
1700
|
+
},
|
|
1701
|
+
mayCreate(dir, name) {
|
|
1702
|
+
if (!FS.isDir(dir.mode)) {
|
|
1703
|
+
return 54;
|
|
1704
|
+
}
|
|
1705
|
+
try {
|
|
1706
|
+
var node = FS.lookupNode(dir, name);
|
|
1707
|
+
return 20;
|
|
1708
|
+
} catch (e) {}
|
|
1709
|
+
return FS.nodePermissions(dir, "wx");
|
|
1710
|
+
},
|
|
1711
|
+
mayDelete(dir, name, isdir) {
|
|
1712
|
+
var node;
|
|
1713
|
+
try {
|
|
1714
|
+
node = FS.lookupNode(dir, name);
|
|
1715
|
+
} catch (e) {
|
|
1716
|
+
return e.errno;
|
|
1717
|
+
}
|
|
1718
|
+
var errCode = FS.nodePermissions(dir, "wx");
|
|
1719
|
+
if (errCode) {
|
|
1720
|
+
return errCode;
|
|
1721
|
+
}
|
|
1722
|
+
if (isdir) {
|
|
1723
|
+
if (!FS.isDir(node.mode)) {
|
|
1724
|
+
return 54;
|
|
1725
|
+
}
|
|
1726
|
+
if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
|
|
1727
|
+
return 10;
|
|
1728
|
+
}
|
|
1729
|
+
} else if (FS.isDir(node.mode)) {
|
|
1730
|
+
return 31;
|
|
1731
|
+
}
|
|
1732
|
+
return 0;
|
|
1733
|
+
},
|
|
1734
|
+
mayOpen(node, flags) {
|
|
1735
|
+
if (!node) {
|
|
1736
|
+
return 44;
|
|
1737
|
+
}
|
|
1738
|
+
if (FS.isLink(node.mode)) {
|
|
1739
|
+
return 32;
|
|
1740
|
+
}
|
|
1741
|
+
var mode = FS.flagsToPermissionString(flags);
|
|
1742
|
+
if (FS.isDir(node.mode)) {
|
|
1743
|
+
if (mode !== "r" || flags & (512 | 64)) {
|
|
1744
|
+
return 31;
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
return FS.nodePermissions(node, mode);
|
|
1748
|
+
},
|
|
1749
|
+
checkOpExists(op, err) {
|
|
1750
|
+
if (!op) {
|
|
1751
|
+
throw new FS.ErrnoError(err);
|
|
1752
|
+
}
|
|
1753
|
+
return op;
|
|
1754
|
+
},
|
|
1755
|
+
MAX_OPEN_FDS: 4096,
|
|
1756
|
+
nextfd() {
|
|
1757
|
+
for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) {
|
|
1758
|
+
if (!FS.streams[fd]) {
|
|
1759
|
+
return fd;
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
throw new FS.ErrnoError(33);
|
|
1763
|
+
},
|
|
1764
|
+
getStreamChecked(fd) {
|
|
1765
|
+
var stream = FS.getStream(fd);
|
|
1766
|
+
if (!stream) {
|
|
1767
|
+
throw new FS.ErrnoError(8);
|
|
1768
|
+
}
|
|
1769
|
+
return stream;
|
|
1770
|
+
},
|
|
1771
|
+
getStream: (fd) => FS.streams[fd],
|
|
1772
|
+
createStream(stream, fd = -1) {
|
|
1773
|
+
stream = Object.assign(new FS.FSStream(), stream);
|
|
1774
|
+
if (fd == -1) {
|
|
1775
|
+
fd = FS.nextfd();
|
|
1776
|
+
}
|
|
1777
|
+
stream.fd = fd;
|
|
1778
|
+
FS.streams[fd] = stream;
|
|
1779
|
+
return stream;
|
|
1780
|
+
},
|
|
1781
|
+
closeStream(fd) {
|
|
1782
|
+
FS.streams[fd] = null;
|
|
1783
|
+
},
|
|
1784
|
+
dupStream(origStream, fd = -1) {
|
|
1785
|
+
var stream = FS.createStream(origStream, fd);
|
|
1786
|
+
stream.stream_ops?.dup?.(stream);
|
|
1787
|
+
return stream;
|
|
1788
|
+
},
|
|
1789
|
+
doSetAttr(stream, node, attr) {
|
|
1790
|
+
var setattr = stream?.stream_ops.setattr;
|
|
1791
|
+
var arg = setattr ? stream : node;
|
|
1792
|
+
setattr ??= node.node_ops.setattr;
|
|
1793
|
+
FS.checkOpExists(setattr, 63);
|
|
1794
|
+
try {
|
|
1795
|
+
setattr(arg, attr);
|
|
1796
|
+
} catch (e) {
|
|
1797
|
+
if (e instanceof RangeError) {
|
|
1798
|
+
throw new FS.ErrnoError(22);
|
|
1799
|
+
}
|
|
1800
|
+
throw e;
|
|
1801
|
+
}
|
|
1802
|
+
},
|
|
1803
|
+
chrdev_stream_ops: {
|
|
1804
|
+
open(stream) {
|
|
1805
|
+
var device = FS.getDevice(stream.node.rdev);
|
|
1806
|
+
stream.stream_ops = device.stream_ops;
|
|
1807
|
+
stream.stream_ops.open?.(stream);
|
|
1808
|
+
},
|
|
1809
|
+
llseek() {
|
|
1810
|
+
throw new FS.ErrnoError(70);
|
|
1811
|
+
},
|
|
1812
|
+
},
|
|
1813
|
+
major: (dev) => dev >> 8,
|
|
1814
|
+
minor: (dev) => dev & 255,
|
|
1815
|
+
makedev: (ma, mi) => (ma << 8) | mi,
|
|
1816
|
+
registerDevice(dev, ops) {
|
|
1817
|
+
FS.devices[dev] = { stream_ops: ops };
|
|
1818
|
+
},
|
|
1819
|
+
getDevice: (dev) => FS.devices[dev],
|
|
1820
|
+
getMounts(mount) {
|
|
1821
|
+
var mounts = [];
|
|
1822
|
+
var check = [mount];
|
|
1823
|
+
while (check.length) {
|
|
1824
|
+
var m = check.pop();
|
|
1825
|
+
mounts.push(m);
|
|
1826
|
+
check.push(...m.mounts);
|
|
1827
|
+
}
|
|
1828
|
+
return mounts;
|
|
1829
|
+
},
|
|
1830
|
+
syncfs(populate, callback) {
|
|
1831
|
+
if (typeof populate == "function") {
|
|
1832
|
+
callback = populate;
|
|
1833
|
+
populate = false;
|
|
1834
|
+
}
|
|
1835
|
+
FS.syncFSRequests++;
|
|
1836
|
+
if (FS.syncFSRequests > 1) {
|
|
1837
|
+
err(
|
|
1838
|
+
`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`,
|
|
1839
|
+
);
|
|
1840
|
+
}
|
|
1841
|
+
var mounts = FS.getMounts(FS.root.mount);
|
|
1842
|
+
var completed = 0;
|
|
1843
|
+
function doCallback(errCode) {
|
|
1844
|
+
FS.syncFSRequests--;
|
|
1845
|
+
return callback(errCode);
|
|
1846
|
+
}
|
|
1847
|
+
function done(errCode) {
|
|
1848
|
+
if (errCode) {
|
|
1849
|
+
if (!done.errored) {
|
|
1850
|
+
done.errored = true;
|
|
1851
|
+
return doCallback(errCode);
|
|
1852
|
+
}
|
|
1853
|
+
return;
|
|
1854
|
+
}
|
|
1855
|
+
if (++completed >= mounts.length) {
|
|
1856
|
+
doCallback(null);
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
for (var mount of mounts) {
|
|
1860
|
+
if (mount.type.syncfs) {
|
|
1861
|
+
mount.type.syncfs(mount, populate, done);
|
|
1862
|
+
} else {
|
|
1863
|
+
done(null);
|
|
1864
|
+
}
|
|
1865
|
+
}
|
|
1866
|
+
},
|
|
1867
|
+
mount(type, opts, mountpoint) {
|
|
1868
|
+
var root = mountpoint === "/";
|
|
1869
|
+
var pseudo = !mountpoint;
|
|
1870
|
+
var node;
|
|
1871
|
+
if (root && FS.root) {
|
|
1872
|
+
throw new FS.ErrnoError(10);
|
|
1873
|
+
} else if (!root && !pseudo) {
|
|
1874
|
+
var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
|
|
1875
|
+
mountpoint = lookup.path;
|
|
1876
|
+
node = lookup.node;
|
|
1877
|
+
if (FS.isMountpoint(node)) {
|
|
1878
|
+
throw new FS.ErrnoError(10);
|
|
1879
|
+
}
|
|
1880
|
+
if (!FS.isDir(node.mode)) {
|
|
1881
|
+
throw new FS.ErrnoError(54);
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
var mount = { type, opts, mountpoint, mounts: [] };
|
|
1885
|
+
var mountRoot = type.mount(mount);
|
|
1886
|
+
mountRoot.mount = mount;
|
|
1887
|
+
mount.root = mountRoot;
|
|
1888
|
+
if (root) {
|
|
1889
|
+
FS.root = mountRoot;
|
|
1890
|
+
} else if (node) {
|
|
1891
|
+
node.mounted = mount;
|
|
1892
|
+
if (node.mount) {
|
|
1893
|
+
node.mount.mounts.push(mount);
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
return mountRoot;
|
|
1897
|
+
},
|
|
1898
|
+
unmount(mountpoint) {
|
|
1899
|
+
var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
|
|
1900
|
+
if (!FS.isMountpoint(lookup.node)) {
|
|
1901
|
+
throw new FS.ErrnoError(28);
|
|
1902
|
+
}
|
|
1903
|
+
var node = lookup.node;
|
|
1904
|
+
var mount = node.mounted;
|
|
1905
|
+
var mounts = FS.getMounts(mount);
|
|
1906
|
+
for (var [hash, current] of Object.entries(FS.nameTable)) {
|
|
1907
|
+
while (current) {
|
|
1908
|
+
var next = current.name_next;
|
|
1909
|
+
if (mounts.includes(current.mount)) {
|
|
1910
|
+
FS.destroyNode(current);
|
|
1911
|
+
}
|
|
1912
|
+
current = next;
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
node.mounted = null;
|
|
1916
|
+
var idx = node.mount.mounts.indexOf(mount);
|
|
1917
|
+
node.mount.mounts.splice(idx, 1);
|
|
1918
|
+
},
|
|
1919
|
+
lookup(parent, name) {
|
|
1920
|
+
return parent.node_ops.lookup(parent, name);
|
|
1921
|
+
},
|
|
1922
|
+
mknod(path, mode, dev) {
|
|
1923
|
+
var lookup = FS.lookupPath(path, { parent: true });
|
|
1924
|
+
var parent = lookup.node;
|
|
1925
|
+
var name = PATH.basename(path);
|
|
1926
|
+
if (!name) {
|
|
1927
|
+
throw new FS.ErrnoError(28);
|
|
1928
|
+
}
|
|
1929
|
+
if (name === "." || name === "..") {
|
|
1930
|
+
throw new FS.ErrnoError(20);
|
|
1931
|
+
}
|
|
1932
|
+
var errCode = FS.mayCreate(parent, name);
|
|
1933
|
+
if (errCode) {
|
|
1934
|
+
throw new FS.ErrnoError(errCode);
|
|
1935
|
+
}
|
|
1936
|
+
if (!parent.node_ops.mknod) {
|
|
1937
|
+
throw new FS.ErrnoError(63);
|
|
1938
|
+
}
|
|
1939
|
+
return parent.node_ops.mknod(parent, name, mode, dev);
|
|
1940
|
+
},
|
|
1941
|
+
statfs(path) {
|
|
1942
|
+
return FS.statfsNode(FS.lookupPath(path, { follow: true }).node);
|
|
1943
|
+
},
|
|
1944
|
+
statfsStream(stream) {
|
|
1945
|
+
return FS.statfsNode(stream.node);
|
|
1946
|
+
},
|
|
1947
|
+
statfsNode(node) {
|
|
1948
|
+
var rtn = {
|
|
1949
|
+
bsize: 4096,
|
|
1950
|
+
frsize: 4096,
|
|
1951
|
+
blocks: 1e6,
|
|
1952
|
+
bfree: 5e5,
|
|
1953
|
+
bavail: 5e5,
|
|
1954
|
+
files: FS.nextInode,
|
|
1955
|
+
ffree: FS.nextInode - 1,
|
|
1956
|
+
fsid: 42,
|
|
1957
|
+
flags: 2,
|
|
1958
|
+
namelen: 255,
|
|
1959
|
+
};
|
|
1960
|
+
if (node.node_ops.statfs) {
|
|
1961
|
+
Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root));
|
|
1962
|
+
}
|
|
1963
|
+
return rtn;
|
|
1964
|
+
},
|
|
1965
|
+
create(path, mode = 438) {
|
|
1966
|
+
mode &= 4095;
|
|
1967
|
+
mode |= 32768;
|
|
1968
|
+
return FS.mknod(path, mode, 0);
|
|
1969
|
+
},
|
|
1970
|
+
mkdir(path, mode = 511) {
|
|
1971
|
+
mode &= 511 | 512;
|
|
1972
|
+
mode |= 16384;
|
|
1973
|
+
return FS.mknod(path, mode, 0);
|
|
1974
|
+
},
|
|
1975
|
+
mkdirTree(path, mode) {
|
|
1976
|
+
var dirs = path.split("/");
|
|
1977
|
+
var d = "";
|
|
1978
|
+
for (var dir of dirs) {
|
|
1979
|
+
if (!dir) continue;
|
|
1980
|
+
if (d || PATH.isAbs(path)) d += "/";
|
|
1981
|
+
d += dir;
|
|
1982
|
+
try {
|
|
1983
|
+
FS.mkdir(d, mode);
|
|
1984
|
+
} catch (e) {
|
|
1985
|
+
if (e.errno != 20) throw e;
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
},
|
|
1989
|
+
mkdev(path, mode, dev) {
|
|
1990
|
+
if (typeof dev == "undefined") {
|
|
1991
|
+
dev = mode;
|
|
1992
|
+
mode = 438;
|
|
1993
|
+
}
|
|
1994
|
+
mode |= 8192;
|
|
1995
|
+
return FS.mknod(path, mode, dev);
|
|
1996
|
+
},
|
|
1997
|
+
symlink(oldpath, newpath) {
|
|
1998
|
+
if (!PATH_FS.resolve(oldpath)) {
|
|
1999
|
+
throw new FS.ErrnoError(44);
|
|
2000
|
+
}
|
|
2001
|
+
var lookup = FS.lookupPath(newpath, { parent: true });
|
|
2002
|
+
var parent = lookup.node;
|
|
2003
|
+
if (!parent) {
|
|
2004
|
+
throw new FS.ErrnoError(44);
|
|
2005
|
+
}
|
|
2006
|
+
var newname = PATH.basename(newpath);
|
|
2007
|
+
var errCode = FS.mayCreate(parent, newname);
|
|
2008
|
+
if (errCode) {
|
|
2009
|
+
throw new FS.ErrnoError(errCode);
|
|
2010
|
+
}
|
|
2011
|
+
if (!parent.node_ops.symlink) {
|
|
2012
|
+
throw new FS.ErrnoError(63);
|
|
2013
|
+
}
|
|
2014
|
+
return parent.node_ops.symlink(parent, newname, oldpath);
|
|
2015
|
+
},
|
|
2016
|
+
link(oldpath, newpath, flags) {
|
|
2017
|
+
var lookup = FS.lookupPath(newpath, { parent: true });
|
|
2018
|
+
var parent = lookup.node;
|
|
2019
|
+
if (!parent) {
|
|
2020
|
+
throw new FS.ErrnoError(44);
|
|
2021
|
+
}
|
|
2022
|
+
var newname = PATH.basename(newpath);
|
|
2023
|
+
var errCode = FS.mayCreate(parent, newname);
|
|
2024
|
+
if (errCode) {
|
|
2025
|
+
throw new FS.ErrnoError(errCode);
|
|
2026
|
+
}
|
|
2027
|
+
if (!parent.node_ops.link) {
|
|
2028
|
+
throw new FS.ErrnoError(34);
|
|
2029
|
+
}
|
|
2030
|
+
return parent.node_ops.link(parent, newname, oldpath, flags);
|
|
2031
|
+
},
|
|
2032
|
+
rename(old_path, new_path) {
|
|
2033
|
+
var old_dirname = PATH.dirname(old_path);
|
|
2034
|
+
var new_dirname = PATH.dirname(new_path);
|
|
2035
|
+
var old_name = PATH.basename(old_path);
|
|
2036
|
+
var new_name = PATH.basename(new_path);
|
|
2037
|
+
var lookup, old_dir, new_dir;
|
|
2038
|
+
lookup = FS.lookupPath(old_path, { parent: true });
|
|
2039
|
+
old_dir = lookup.node;
|
|
2040
|
+
lookup = FS.lookupPath(new_path, { parent: true });
|
|
2041
|
+
new_dir = lookup.node;
|
|
2042
|
+
if (!old_dir || !new_dir) throw new FS.ErrnoError(44);
|
|
2043
|
+
if (old_dir.mount !== new_dir.mount) {
|
|
2044
|
+
throw new FS.ErrnoError(75);
|
|
2045
|
+
}
|
|
2046
|
+
var old_node = FS.lookupNode(old_dir, old_name);
|
|
2047
|
+
var relative = PATH_FS.relative(old_path, new_dirname);
|
|
2048
|
+
if (relative.charAt(0) !== ".") {
|
|
2049
|
+
throw new FS.ErrnoError(28);
|
|
2050
|
+
}
|
|
2051
|
+
relative = PATH_FS.relative(new_path, old_dirname);
|
|
2052
|
+
if (relative.charAt(0) !== ".") {
|
|
2053
|
+
throw new FS.ErrnoError(55);
|
|
2054
|
+
}
|
|
2055
|
+
var new_node;
|
|
2056
|
+
try {
|
|
2057
|
+
new_node = FS.lookupNode(new_dir, new_name);
|
|
2058
|
+
} catch (e) {}
|
|
2059
|
+
if (old_node === new_node) {
|
|
2060
|
+
return;
|
|
2061
|
+
}
|
|
2062
|
+
var isdir = FS.isDir(old_node.mode);
|
|
2063
|
+
var errCode = FS.mayDelete(old_dir, old_name, isdir);
|
|
2064
|
+
if (errCode) {
|
|
2065
|
+
throw new FS.ErrnoError(errCode);
|
|
2066
|
+
}
|
|
2067
|
+
errCode = new_node
|
|
2068
|
+
? FS.mayDelete(new_dir, new_name, isdir)
|
|
2069
|
+
: FS.mayCreate(new_dir, new_name);
|
|
2070
|
+
if (errCode) {
|
|
2071
|
+
throw new FS.ErrnoError(errCode);
|
|
2072
|
+
}
|
|
2073
|
+
if (!old_dir.node_ops.rename) {
|
|
2074
|
+
throw new FS.ErrnoError(63);
|
|
2075
|
+
}
|
|
2076
|
+
if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
|
|
2077
|
+
throw new FS.ErrnoError(10);
|
|
2078
|
+
}
|
|
2079
|
+
if (new_dir !== old_dir) {
|
|
2080
|
+
errCode = FS.nodePermissions(old_dir, "w");
|
|
2081
|
+
if (errCode) {
|
|
2082
|
+
throw new FS.ErrnoError(errCode);
|
|
2083
|
+
}
|
|
2084
|
+
}
|
|
2085
|
+
FS.hashRemoveNode(old_node);
|
|
2086
|
+
try {
|
|
2087
|
+
old_dir.node_ops.rename(old_node, new_dir, new_name);
|
|
2088
|
+
old_node.parent = new_dir;
|
|
2089
|
+
} catch (e) {
|
|
2090
|
+
throw e;
|
|
2091
|
+
} finally {
|
|
2092
|
+
FS.hashAddNode(old_node);
|
|
2093
|
+
}
|
|
2094
|
+
},
|
|
2095
|
+
rmdir(path) {
|
|
2096
|
+
var lookup = FS.lookupPath(path, { parent: true });
|
|
2097
|
+
var parent = lookup.node;
|
|
2098
|
+
var name = PATH.basename(path);
|
|
2099
|
+
var node = FS.lookupNode(parent, name);
|
|
2100
|
+
var errCode = FS.mayDelete(parent, name, true);
|
|
2101
|
+
if (errCode) {
|
|
2102
|
+
throw new FS.ErrnoError(errCode);
|
|
2103
|
+
}
|
|
2104
|
+
if (!parent.node_ops.rmdir) {
|
|
2105
|
+
throw new FS.ErrnoError(63);
|
|
2106
|
+
}
|
|
2107
|
+
if (FS.isMountpoint(node)) {
|
|
2108
|
+
throw new FS.ErrnoError(10);
|
|
2109
|
+
}
|
|
2110
|
+
parent.node_ops.rmdir(parent, name);
|
|
2111
|
+
FS.destroyNode(node);
|
|
2112
|
+
},
|
|
2113
|
+
readdir(path) {
|
|
2114
|
+
var lookup = FS.lookupPath(path, { follow: true });
|
|
2115
|
+
var node = lookup.node;
|
|
2116
|
+
var readdir = FS.checkOpExists(node.node_ops.readdir, 54);
|
|
2117
|
+
return readdir(node);
|
|
2118
|
+
},
|
|
2119
|
+
unlink(path) {
|
|
2120
|
+
var lookup = FS.lookupPath(path, { parent: true });
|
|
2121
|
+
var parent = lookup.node;
|
|
2122
|
+
if (!parent) {
|
|
2123
|
+
throw new FS.ErrnoError(44);
|
|
2124
|
+
}
|
|
2125
|
+
var name = PATH.basename(path);
|
|
2126
|
+
var node = FS.lookupNode(parent, name);
|
|
2127
|
+
var errCode = FS.mayDelete(parent, name, false);
|
|
2128
|
+
if (errCode) {
|
|
2129
|
+
throw new FS.ErrnoError(errCode);
|
|
2130
|
+
}
|
|
2131
|
+
if (!parent.node_ops.unlink) {
|
|
2132
|
+
throw new FS.ErrnoError(63);
|
|
2133
|
+
}
|
|
2134
|
+
if (FS.isMountpoint(node)) {
|
|
2135
|
+
throw new FS.ErrnoError(10);
|
|
2136
|
+
}
|
|
2137
|
+
parent.node_ops.unlink(parent, name);
|
|
2138
|
+
FS.destroyNode(node);
|
|
2139
|
+
},
|
|
2140
|
+
readlink(path) {
|
|
2141
|
+
var lookup = FS.lookupPath(path);
|
|
2142
|
+
var link = lookup.node;
|
|
2143
|
+
if (!link) {
|
|
2144
|
+
throw new FS.ErrnoError(44);
|
|
2145
|
+
}
|
|
2146
|
+
if (!link.node_ops.readlink) {
|
|
2147
|
+
throw new FS.ErrnoError(28);
|
|
2148
|
+
}
|
|
2149
|
+
return link.node_ops.readlink(link);
|
|
2150
|
+
},
|
|
2151
|
+
stat(path, dontFollow) {
|
|
2152
|
+
var lookup = FS.lookupPath(path, { follow: !dontFollow });
|
|
2153
|
+
var node = lookup.node;
|
|
2154
|
+
var getattr = FS.checkOpExists(node.node_ops.getattr, 63);
|
|
2155
|
+
return getattr(node);
|
|
2156
|
+
},
|
|
2157
|
+
fstat(fd) {
|
|
2158
|
+
var stream = FS.getStreamChecked(fd);
|
|
2159
|
+
var node = stream.node;
|
|
2160
|
+
var getattr = stream.stream_ops.getattr;
|
|
2161
|
+
var arg = getattr ? stream : node;
|
|
2162
|
+
getattr ??= node.node_ops.getattr;
|
|
2163
|
+
FS.checkOpExists(getattr, 63);
|
|
2164
|
+
return getattr(arg);
|
|
2165
|
+
},
|
|
2166
|
+
lstat(path) {
|
|
2167
|
+
return FS.stat(path, true);
|
|
2168
|
+
},
|
|
2169
|
+
doChmod(stream, node, mode, dontFollow) {
|
|
2170
|
+
FS.doSetAttr(stream, node, {
|
|
2171
|
+
mode: (mode & 4095) | (node.mode & ~4095),
|
|
2172
|
+
ctime: Date.now(),
|
|
2173
|
+
dontFollow,
|
|
2174
|
+
});
|
|
2175
|
+
},
|
|
2176
|
+
chmod(path, mode, dontFollow) {
|
|
2177
|
+
var node;
|
|
2178
|
+
if (typeof path == "string") {
|
|
2179
|
+
var lookup = FS.lookupPath(path, { follow: !dontFollow });
|
|
2180
|
+
node = lookup.node;
|
|
2181
|
+
} else {
|
|
2182
|
+
node = path;
|
|
2183
|
+
}
|
|
2184
|
+
FS.doChmod(null, node, mode, dontFollow);
|
|
2185
|
+
},
|
|
2186
|
+
lchmod(path, mode) {
|
|
2187
|
+
FS.chmod(path, mode, true);
|
|
2188
|
+
},
|
|
2189
|
+
fchmod(fd, mode) {
|
|
2190
|
+
var stream = FS.getStreamChecked(fd);
|
|
2191
|
+
FS.doChmod(stream, stream.node, mode, false);
|
|
2192
|
+
},
|
|
2193
|
+
doChown(stream, node, dontFollow) {
|
|
2194
|
+
FS.doSetAttr(stream, node, { timestamp: Date.now(), dontFollow });
|
|
2195
|
+
},
|
|
2196
|
+
chown(path, uid, gid, dontFollow) {
|
|
2197
|
+
var node;
|
|
2198
|
+
if (typeof path == "string") {
|
|
2199
|
+
var lookup = FS.lookupPath(path, { follow: !dontFollow });
|
|
2200
|
+
node = lookup.node;
|
|
2201
|
+
} else {
|
|
2202
|
+
node = path;
|
|
2203
|
+
}
|
|
2204
|
+
FS.doChown(null, node, dontFollow);
|
|
2205
|
+
},
|
|
2206
|
+
lchown(path, uid, gid) {
|
|
2207
|
+
FS.chown(path, uid, gid, true);
|
|
2208
|
+
},
|
|
2209
|
+
fchown(fd, uid, gid) {
|
|
2210
|
+
var stream = FS.getStreamChecked(fd);
|
|
2211
|
+
FS.doChown(stream, stream.node, false);
|
|
2212
|
+
},
|
|
2213
|
+
doTruncate(stream, node, len) {
|
|
2214
|
+
if (FS.isDir(node.mode)) {
|
|
2215
|
+
throw new FS.ErrnoError(31);
|
|
2216
|
+
}
|
|
2217
|
+
if (!FS.isFile(node.mode)) {
|
|
2218
|
+
throw new FS.ErrnoError(28);
|
|
2219
|
+
}
|
|
2220
|
+
var errCode = FS.nodePermissions(node, "w");
|
|
2221
|
+
if (errCode) {
|
|
2222
|
+
throw new FS.ErrnoError(errCode);
|
|
2223
|
+
}
|
|
2224
|
+
FS.doSetAttr(stream, node, { size: len, timestamp: Date.now() });
|
|
2225
|
+
},
|
|
2226
|
+
truncate(path, len) {
|
|
2227
|
+
if (len < 0) {
|
|
2228
|
+
throw new FS.ErrnoError(28);
|
|
2229
|
+
}
|
|
2230
|
+
var node;
|
|
2231
|
+
if (typeof path == "string") {
|
|
2232
|
+
var lookup = FS.lookupPath(path, { follow: true });
|
|
2233
|
+
node = lookup.node;
|
|
2234
|
+
} else {
|
|
2235
|
+
node = path;
|
|
2236
|
+
}
|
|
2237
|
+
FS.doTruncate(null, node, len);
|
|
2238
|
+
},
|
|
2239
|
+
ftruncate(fd, len) {
|
|
2240
|
+
var stream = FS.getStreamChecked(fd);
|
|
2241
|
+
if (len < 0 || (stream.flags & 2097155) === 0) {
|
|
2242
|
+
throw new FS.ErrnoError(28);
|
|
2243
|
+
}
|
|
2244
|
+
FS.doTruncate(stream, stream.node, len);
|
|
2245
|
+
},
|
|
2246
|
+
utime(path, atime, mtime, dontFollow) {
|
|
2247
|
+
var lookup = FS.lookupPath(path, { follow: !dontFollow });
|
|
2248
|
+
FS.doSetAttr(null, lookup.node, { atime, mtime, dontFollow });
|
|
2249
|
+
},
|
|
2250
|
+
open(path, flags, mode = 438) {
|
|
2251
|
+
if (path === "") {
|
|
2252
|
+
throw new FS.ErrnoError(44);
|
|
2253
|
+
}
|
|
2254
|
+
flags = FS_modeStringToFlags(flags);
|
|
2255
|
+
if (flags & 64) {
|
|
2256
|
+
mode = (mode & 4095) | 32768;
|
|
2257
|
+
} else {
|
|
2258
|
+
mode = 0;
|
|
2259
|
+
}
|
|
2260
|
+
var node;
|
|
2261
|
+
var isDirPath;
|
|
2262
|
+
if (typeof path == "object") {
|
|
2263
|
+
node = path;
|
|
2264
|
+
} else {
|
|
2265
|
+
isDirPath = path.endsWith("/");
|
|
2266
|
+
var lookup = FS.lookupPath(path, {
|
|
2267
|
+
follow: !(flags & 131072),
|
|
2268
|
+
noent_okay: true,
|
|
2269
|
+
});
|
|
2270
|
+
node = lookup.node;
|
|
2271
|
+
path = lookup.path;
|
|
2272
|
+
}
|
|
2273
|
+
var created = false;
|
|
2274
|
+
if (flags & 64) {
|
|
2275
|
+
if (node) {
|
|
2276
|
+
if (flags & 128) {
|
|
2277
|
+
throw new FS.ErrnoError(20);
|
|
2278
|
+
}
|
|
2279
|
+
} else if (isDirPath) {
|
|
2280
|
+
throw new FS.ErrnoError(31);
|
|
2281
|
+
} else {
|
|
2282
|
+
node = FS.mknod(path, mode | 511, 0);
|
|
2283
|
+
created = true;
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
if (!node) {
|
|
2287
|
+
throw new FS.ErrnoError(44);
|
|
2288
|
+
}
|
|
2289
|
+
if (FS.isChrdev(node.mode)) {
|
|
2290
|
+
flags &= ~512;
|
|
2291
|
+
}
|
|
2292
|
+
if (flags & 65536 && !FS.isDir(node.mode)) {
|
|
2293
|
+
throw new FS.ErrnoError(54);
|
|
2294
|
+
}
|
|
2295
|
+
if (!created) {
|
|
2296
|
+
var errCode = FS.mayOpen(node, flags);
|
|
2297
|
+
if (errCode) {
|
|
2298
|
+
throw new FS.ErrnoError(errCode);
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
if (flags & 512 && !created) {
|
|
2302
|
+
FS.truncate(node, 0);
|
|
2303
|
+
}
|
|
2304
|
+
flags &= ~(128 | 512 | 131072);
|
|
2305
|
+
var stream = FS.createStream({
|
|
2306
|
+
node,
|
|
2307
|
+
path: FS.getPath(node),
|
|
2308
|
+
flags,
|
|
2309
|
+
seekable: true,
|
|
2310
|
+
position: 0,
|
|
2311
|
+
stream_ops: node.stream_ops,
|
|
2312
|
+
ungotten: [],
|
|
2313
|
+
error: false,
|
|
2314
|
+
});
|
|
2315
|
+
if (stream.stream_ops.open) {
|
|
2316
|
+
stream.stream_ops.open(stream);
|
|
2317
|
+
}
|
|
2318
|
+
if (created) {
|
|
2319
|
+
FS.chmod(node, mode & 511);
|
|
2320
|
+
}
|
|
2321
|
+
return stream;
|
|
2322
|
+
},
|
|
2323
|
+
close(stream) {
|
|
2324
|
+
if (FS.isClosed(stream)) {
|
|
2325
|
+
throw new FS.ErrnoError(8);
|
|
2326
|
+
}
|
|
2327
|
+
if (stream.getdents) stream.getdents = null;
|
|
2328
|
+
stream.node?.notifyListeners(32);
|
|
2329
|
+
try {
|
|
2330
|
+
if (stream.stream_ops.close) {
|
|
2331
|
+
stream.stream_ops.close(stream);
|
|
2332
|
+
}
|
|
2333
|
+
} catch (e) {
|
|
2334
|
+
throw e;
|
|
2335
|
+
} finally {
|
|
2336
|
+
FS.closeStream(stream.fd);
|
|
2337
|
+
}
|
|
2338
|
+
stream.fd = null;
|
|
2339
|
+
},
|
|
2340
|
+
isClosed(stream) {
|
|
2341
|
+
return stream.fd === null;
|
|
2342
|
+
},
|
|
2343
|
+
llseek(stream, offset, whence) {
|
|
2344
|
+
if (FS.isClosed(stream)) {
|
|
2345
|
+
throw new FS.ErrnoError(8);
|
|
2346
|
+
}
|
|
2347
|
+
if (!stream.seekable || !stream.stream_ops.llseek) {
|
|
2348
|
+
throw new FS.ErrnoError(70);
|
|
2349
|
+
}
|
|
2350
|
+
if (whence != 0 && whence != 1 && whence != 2) {
|
|
2351
|
+
throw new FS.ErrnoError(28);
|
|
2352
|
+
}
|
|
2353
|
+
stream.position = stream.stream_ops.llseek(stream, offset, whence);
|
|
2354
|
+
stream.ungotten = [];
|
|
2355
|
+
return stream.position;
|
|
2356
|
+
},
|
|
2357
|
+
read(stream, buffer, offset, length, position) {
|
|
2358
|
+
if (length < 0 || position < 0) {
|
|
2359
|
+
throw new FS.ErrnoError(28);
|
|
2360
|
+
}
|
|
2361
|
+
if (FS.isClosed(stream)) {
|
|
2362
|
+
throw new FS.ErrnoError(8);
|
|
2363
|
+
}
|
|
2364
|
+
if ((stream.flags & 2097155) === 1) {
|
|
2365
|
+
throw new FS.ErrnoError(8);
|
|
2366
|
+
}
|
|
2367
|
+
if (FS.isDir(stream.node.mode)) {
|
|
2368
|
+
throw new FS.ErrnoError(31);
|
|
2369
|
+
}
|
|
2370
|
+
if (!stream.stream_ops.read) {
|
|
2371
|
+
throw new FS.ErrnoError(28);
|
|
2372
|
+
}
|
|
2373
|
+
var seeking = typeof position != "undefined";
|
|
2374
|
+
if (!seeking) {
|
|
2375
|
+
position = stream.position;
|
|
2376
|
+
} else if (!stream.seekable) {
|
|
2377
|
+
throw new FS.ErrnoError(70);
|
|
2378
|
+
}
|
|
2379
|
+
var bytesRead = stream.stream_ops.read(
|
|
2380
|
+
stream,
|
|
2381
|
+
buffer,
|
|
2382
|
+
offset,
|
|
2383
|
+
length,
|
|
2384
|
+
position,
|
|
2385
|
+
);
|
|
2386
|
+
if (!seeking) stream.position += bytesRead;
|
|
2387
|
+
return bytesRead;
|
|
2388
|
+
},
|
|
2389
|
+
write(stream, buffer, offset, length, position, canOwn) {
|
|
2390
|
+
if (length < 0 || position < 0) {
|
|
2391
|
+
throw new FS.ErrnoError(28);
|
|
2392
|
+
}
|
|
2393
|
+
if (FS.isClosed(stream)) {
|
|
2394
|
+
throw new FS.ErrnoError(8);
|
|
2395
|
+
}
|
|
2396
|
+
if ((stream.flags & 2097155) === 0) {
|
|
2397
|
+
throw new FS.ErrnoError(8);
|
|
2398
|
+
}
|
|
2399
|
+
if (FS.isDir(stream.node.mode)) {
|
|
2400
|
+
throw new FS.ErrnoError(31);
|
|
2401
|
+
}
|
|
2402
|
+
if (!stream.stream_ops.write) {
|
|
2403
|
+
throw new FS.ErrnoError(28);
|
|
2404
|
+
}
|
|
2405
|
+
if (stream.seekable && stream.flags & 1024) {
|
|
2406
|
+
FS.llseek(stream, 0, 2);
|
|
2407
|
+
}
|
|
2408
|
+
var seeking = typeof position != "undefined";
|
|
2409
|
+
if (!seeking) {
|
|
2410
|
+
position = stream.position;
|
|
2411
|
+
} else if (!stream.seekable) {
|
|
2412
|
+
throw new FS.ErrnoError(70);
|
|
2413
|
+
}
|
|
2414
|
+
var bytesWritten = stream.stream_ops.write(
|
|
2415
|
+
stream,
|
|
2416
|
+
buffer,
|
|
2417
|
+
offset,
|
|
2418
|
+
length,
|
|
2419
|
+
position,
|
|
2420
|
+
canOwn,
|
|
2421
|
+
);
|
|
2422
|
+
if (!seeking) stream.position += bytesWritten;
|
|
2423
|
+
return bytesWritten;
|
|
2424
|
+
},
|
|
2425
|
+
mmap(stream, length, position, prot, flags) {
|
|
2426
|
+
if (prot & 2 && !(flags & 2) && (stream.flags & 2097155) !== 2) {
|
|
2427
|
+
throw new FS.ErrnoError(2);
|
|
2428
|
+
}
|
|
2429
|
+
if ((stream.flags & 2097155) === 1) {
|
|
2430
|
+
throw new FS.ErrnoError(2);
|
|
2431
|
+
}
|
|
2432
|
+
if (!stream.stream_ops.mmap) {
|
|
2433
|
+
throw new FS.ErrnoError(43);
|
|
2434
|
+
}
|
|
2435
|
+
if (!length) {
|
|
2436
|
+
throw new FS.ErrnoError(28);
|
|
2437
|
+
}
|
|
2438
|
+
return stream.stream_ops.mmap(stream, length, position, prot, flags);
|
|
2439
|
+
},
|
|
2440
|
+
msync(stream, buffer, offset, length, mmapFlags) {
|
|
2441
|
+
if (!stream.stream_ops.msync) {
|
|
2442
|
+
return 0;
|
|
2443
|
+
}
|
|
2444
|
+
return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags);
|
|
2445
|
+
},
|
|
2446
|
+
ioctl(stream, cmd, arg) {
|
|
2447
|
+
if (!stream.stream_ops.ioctl) {
|
|
2448
|
+
throw new FS.ErrnoError(59);
|
|
2449
|
+
}
|
|
2450
|
+
return stream.stream_ops.ioctl(stream, cmd, arg);
|
|
2451
|
+
},
|
|
2452
|
+
readFile(path, opts = {}) {
|
|
2453
|
+
opts.flags = opts.flags ?? 0;
|
|
2454
|
+
opts.encoding = opts.encoding ?? "binary";
|
|
2455
|
+
if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
|
|
2456
|
+
abort(`Invalid encoding type "${opts.encoding}"`);
|
|
2457
|
+
}
|
|
2458
|
+
var stream = FS.open(path, opts.flags);
|
|
2459
|
+
var stat = FS.stat(path);
|
|
2460
|
+
var length = stat.size;
|
|
2461
|
+
var buf = new Uint8Array(length);
|
|
2462
|
+
FS.read(stream, buf, 0, length, 0);
|
|
2463
|
+
if (opts.encoding === "utf8") {
|
|
2464
|
+
buf = UTF8ArrayToString(buf);
|
|
2465
|
+
}
|
|
2466
|
+
FS.close(stream);
|
|
2467
|
+
return buf;
|
|
2468
|
+
},
|
|
2469
|
+
writeFile(path, data, opts = {}) {
|
|
2470
|
+
opts.flags = opts.flags ?? 577;
|
|
2471
|
+
var stream = FS.open(path, opts.flags, opts.mode);
|
|
2472
|
+
data = FS_fileDataToTypedArray(data);
|
|
2473
|
+
FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
|
|
2474
|
+
FS.close(stream);
|
|
2475
|
+
},
|
|
2476
|
+
cwd: () => FS.currentPath,
|
|
2477
|
+
chdir(path) {
|
|
2478
|
+
var lookup = FS.lookupPath(path, { follow: true });
|
|
2479
|
+
if (lookup.node === null) {
|
|
2480
|
+
throw new FS.ErrnoError(44);
|
|
2481
|
+
}
|
|
2482
|
+
if (!FS.isDir(lookup.node.mode)) {
|
|
2483
|
+
throw new FS.ErrnoError(54);
|
|
2484
|
+
}
|
|
2485
|
+
var errCode = FS.nodePermissions(lookup.node, "x");
|
|
2486
|
+
if (errCode) {
|
|
2487
|
+
throw new FS.ErrnoError(errCode);
|
|
2488
|
+
}
|
|
2489
|
+
FS.currentPath = lookup.path;
|
|
2490
|
+
},
|
|
2491
|
+
createDefaultDirectories() {
|
|
2492
|
+
FS.mkdir("/tmp");
|
|
2493
|
+
FS.mkdir("/home");
|
|
2494
|
+
FS.mkdir("/home/web_user");
|
|
2495
|
+
},
|
|
2496
|
+
createDefaultDevices() {
|
|
2497
|
+
FS.mkdir("/dev");
|
|
2498
|
+
FS.registerDevice(FS.makedev(1, 3), {
|
|
2499
|
+
read: () => 0,
|
|
2500
|
+
write: (stream, buffer, offset, length, pos) => length,
|
|
2501
|
+
llseek: () => 0,
|
|
2502
|
+
});
|
|
2503
|
+
FS.mkdev("/dev/null", FS.makedev(1, 3));
|
|
2504
|
+
TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
|
|
2505
|
+
TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
|
|
2506
|
+
FS.mkdev("/dev/tty", FS.makedev(5, 0));
|
|
2507
|
+
FS.mkdev("/dev/tty1", FS.makedev(6, 0));
|
|
2508
|
+
var randomBuffer = new Uint8Array(1024),
|
|
2509
|
+
randomLeft = 0;
|
|
2510
|
+
var randomByte = () => {
|
|
2511
|
+
if (!randomLeft) {
|
|
2512
|
+
randomFill(randomBuffer);
|
|
2513
|
+
randomLeft = randomBuffer.byteLength;
|
|
2514
|
+
}
|
|
2515
|
+
return randomBuffer[--randomLeft];
|
|
2516
|
+
};
|
|
2517
|
+
FS.createDevice("/dev", "random", randomByte);
|
|
2518
|
+
FS.createDevice("/dev", "urandom", randomByte);
|
|
2519
|
+
FS.mkdir("/dev/shm");
|
|
2520
|
+
FS.mkdir("/dev/shm/tmp");
|
|
2521
|
+
},
|
|
2522
|
+
createSpecialDirectories() {
|
|
2523
|
+
FS.mkdir("/proc");
|
|
2524
|
+
var proc_self = FS.mkdir("/proc/self");
|
|
2525
|
+
FS.mkdir("/proc/self/fd");
|
|
2526
|
+
FS.mount(
|
|
2527
|
+
{
|
|
2528
|
+
mount() {
|
|
2529
|
+
var node = FS.createNode(proc_self, "fd", 16895, 73);
|
|
2530
|
+
node.stream_ops = { llseek: MEMFS.stream_ops.llseek };
|
|
2531
|
+
node.node_ops = {
|
|
2532
|
+
lookup(parent, name) {
|
|
2533
|
+
var fd = +name;
|
|
2534
|
+
var stream = FS.getStreamChecked(fd);
|
|
2535
|
+
var ret = {
|
|
2536
|
+
parent: null,
|
|
2537
|
+
mount: { mountpoint: "fake" },
|
|
2538
|
+
node_ops: { readlink: () => stream.path },
|
|
2539
|
+
id: fd + 1,
|
|
2540
|
+
};
|
|
2541
|
+
ret.parent = ret;
|
|
2542
|
+
return ret;
|
|
2543
|
+
},
|
|
2544
|
+
readdir() {
|
|
2545
|
+
return Array.from(FS.streams.entries())
|
|
2546
|
+
.filter(([k, v]) => v)
|
|
2547
|
+
.map(([k, v]) => k.toString());
|
|
2548
|
+
},
|
|
2549
|
+
};
|
|
2550
|
+
return node;
|
|
2551
|
+
},
|
|
2552
|
+
},
|
|
2553
|
+
{},
|
|
2554
|
+
"/proc/self/fd",
|
|
2555
|
+
);
|
|
2556
|
+
},
|
|
2557
|
+
createStandardStreams(input, output, error) {
|
|
2558
|
+
if (input) {
|
|
2559
|
+
FS.createDevice("/dev", "stdin", input);
|
|
2560
|
+
} else {
|
|
2561
|
+
FS.symlink("/dev/tty", "/dev/stdin");
|
|
2562
|
+
}
|
|
2563
|
+
if (output) {
|
|
2564
|
+
FS.createDevice("/dev", "stdout", null, output);
|
|
2565
|
+
} else {
|
|
2566
|
+
FS.symlink("/dev/tty", "/dev/stdout");
|
|
2567
|
+
}
|
|
2568
|
+
if (error) {
|
|
2569
|
+
FS.createDevice("/dev", "stderr", null, error);
|
|
2570
|
+
} else {
|
|
2571
|
+
FS.symlink("/dev/tty1", "/dev/stderr");
|
|
2572
|
+
}
|
|
2573
|
+
var stdin = FS.open("/dev/stdin", 0);
|
|
2574
|
+
var stdout = FS.open("/dev/stdout", 1);
|
|
2575
|
+
var stderr = FS.open("/dev/stderr", 1);
|
|
2576
|
+
},
|
|
2577
|
+
staticInit() {
|
|
2578
|
+
FS.nameTable = new Array(4096);
|
|
2579
|
+
FS.mount(MEMFS, {}, "/");
|
|
2580
|
+
FS.createDefaultDirectories();
|
|
2581
|
+
FS.createDefaultDevices();
|
|
2582
|
+
FS.createSpecialDirectories();
|
|
2583
|
+
FS.filesystems = { MEMFS };
|
|
2584
|
+
},
|
|
2585
|
+
init(input, output, error) {
|
|
2586
|
+
FS.initialized = true;
|
|
2587
|
+
input ??= Module["stdin"];
|
|
2588
|
+
output ??= Module["stdout"];
|
|
2589
|
+
error ??= Module["stderr"];
|
|
2590
|
+
FS.createStandardStreams(input, output, error);
|
|
2591
|
+
},
|
|
2592
|
+
quit() {
|
|
2593
|
+
FS.initialized = false;
|
|
2594
|
+
for (var stream of FS.streams) {
|
|
2595
|
+
if (stream) {
|
|
2596
|
+
FS.close(stream);
|
|
2597
|
+
}
|
|
2598
|
+
}
|
|
2599
|
+
},
|
|
2600
|
+
findObject(path, dontResolveLastLink) {
|
|
2601
|
+
var ret = FS.analyzePath(path, dontResolveLastLink);
|
|
2602
|
+
if (!ret.exists) {
|
|
2603
|
+
return null;
|
|
2604
|
+
}
|
|
2605
|
+
return ret.object;
|
|
2606
|
+
},
|
|
2607
|
+
analyzePath(path, dontResolveLastLink) {
|
|
2608
|
+
try {
|
|
2609
|
+
var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
|
|
2610
|
+
path = lookup.path;
|
|
2611
|
+
} catch (e) {}
|
|
2612
|
+
var ret = {
|
|
2613
|
+
isRoot: false,
|
|
2614
|
+
exists: false,
|
|
2615
|
+
error: 0,
|
|
2616
|
+
name: null,
|
|
2617
|
+
path: null,
|
|
2618
|
+
object: null,
|
|
2619
|
+
parentExists: false,
|
|
2620
|
+
parentPath: null,
|
|
2621
|
+
parentObject: null,
|
|
2622
|
+
};
|
|
2623
|
+
try {
|
|
2624
|
+
var lookup = FS.lookupPath(path, { parent: true });
|
|
2625
|
+
ret.parentExists = true;
|
|
2626
|
+
ret.parentPath = lookup.path;
|
|
2627
|
+
ret.parentObject = lookup.node;
|
|
2628
|
+
ret.name = PATH.basename(path);
|
|
2629
|
+
lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
|
|
2630
|
+
ret.exists = true;
|
|
2631
|
+
ret.path = lookup.path;
|
|
2632
|
+
ret.object = lookup.node;
|
|
2633
|
+
ret.name = lookup.node.name;
|
|
2634
|
+
ret.isRoot = lookup.path === "/";
|
|
2635
|
+
} catch (e) {
|
|
2636
|
+
ret.error = e.errno;
|
|
2637
|
+
}
|
|
2638
|
+
return ret;
|
|
2639
|
+
},
|
|
2640
|
+
createPath(parent, path, canRead, canWrite) {
|
|
2641
|
+
parent = typeof parent == "string" ? parent : FS.getPath(parent);
|
|
2642
|
+
var parts = path.split("/").reverse();
|
|
2643
|
+
while (parts.length) {
|
|
2644
|
+
var part = parts.pop();
|
|
2645
|
+
if (!part) continue;
|
|
2646
|
+
var current = PATH.join2(parent, part);
|
|
2647
|
+
try {
|
|
2648
|
+
FS.mkdir(current);
|
|
2649
|
+
} catch (e) {
|
|
2650
|
+
if (e.errno != 20) throw e;
|
|
2651
|
+
}
|
|
2652
|
+
parent = current;
|
|
2653
|
+
}
|
|
2654
|
+
return current;
|
|
2655
|
+
},
|
|
2656
|
+
createFile(parent, name, properties, canRead, canWrite) {
|
|
2657
|
+
var path = PATH.join2(
|
|
2658
|
+
typeof parent == "string" ? parent : FS.getPath(parent),
|
|
2659
|
+
name,
|
|
2660
|
+
);
|
|
2661
|
+
var mode = FS_getMode(canRead, canWrite);
|
|
2662
|
+
return FS.create(path, mode);
|
|
2663
|
+
},
|
|
2664
|
+
createDataFile(parent, name, data, canRead, canWrite, canOwn) {
|
|
2665
|
+
var path = name;
|
|
2666
|
+
if (parent) {
|
|
2667
|
+
parent = typeof parent == "string" ? parent : FS.getPath(parent);
|
|
2668
|
+
path = name ? PATH.join2(parent, name) : parent;
|
|
2669
|
+
}
|
|
2670
|
+
var mode = FS_getMode(canRead, canWrite);
|
|
2671
|
+
var node = FS.create(path, mode);
|
|
2672
|
+
if (data) {
|
|
2673
|
+
data = FS_fileDataToTypedArray(data);
|
|
2674
|
+
FS.chmod(node, mode | 146);
|
|
2675
|
+
var stream = FS.open(node, 577);
|
|
2676
|
+
FS.write(stream, data, 0, data.length, 0, canOwn);
|
|
2677
|
+
FS.close(stream);
|
|
2678
|
+
FS.chmod(node, mode);
|
|
2679
|
+
}
|
|
2680
|
+
},
|
|
2681
|
+
createDevice(parent, name, input, output) {
|
|
2682
|
+
var path = PATH.join2(
|
|
2683
|
+
typeof parent == "string" ? parent : FS.getPath(parent),
|
|
2684
|
+
name,
|
|
2685
|
+
);
|
|
2686
|
+
var mode = FS_getMode(!!input, !!output);
|
|
2687
|
+
FS.createDevice.major ??= 64;
|
|
2688
|
+
var dev = FS.makedev(FS.createDevice.major++, 0);
|
|
2689
|
+
FS.registerDevice(dev, {
|
|
2690
|
+
open(stream) {
|
|
2691
|
+
stream.seekable = false;
|
|
2692
|
+
},
|
|
2693
|
+
close(stream) {
|
|
2694
|
+
if (output?.buffer?.length) {
|
|
2695
|
+
output(10);
|
|
2696
|
+
}
|
|
2697
|
+
},
|
|
2698
|
+
read(stream, buffer, offset, length, pos) {
|
|
2699
|
+
var bytesRead = 0;
|
|
2700
|
+
for (var i = 0; i < length; i++) {
|
|
2701
|
+
var result;
|
|
2702
|
+
try {
|
|
2703
|
+
result = input();
|
|
2704
|
+
} catch (e) {
|
|
2705
|
+
throw new FS.ErrnoError(29);
|
|
2706
|
+
}
|
|
2707
|
+
if (result === undefined && !bytesRead) {
|
|
2708
|
+
throw new FS.ErrnoError(6);
|
|
2709
|
+
}
|
|
2710
|
+
if (result === null || result === undefined) break;
|
|
2711
|
+
bytesRead++;
|
|
2712
|
+
buffer[offset + i] = result;
|
|
2713
|
+
}
|
|
2714
|
+
if (bytesRead) {
|
|
2715
|
+
stream.node.atime = Date.now();
|
|
2716
|
+
}
|
|
2717
|
+
return bytesRead;
|
|
2718
|
+
},
|
|
2719
|
+
write(stream, buffer, offset, length, pos) {
|
|
2720
|
+
for (var i = 0; i < length; i++) {
|
|
2721
|
+
try {
|
|
2722
|
+
output(buffer[offset + i]);
|
|
2723
|
+
} catch (e) {
|
|
2724
|
+
throw new FS.ErrnoError(29);
|
|
2725
|
+
}
|
|
2726
|
+
}
|
|
2727
|
+
if (length) {
|
|
2728
|
+
stream.node.mtime = stream.node.ctime = Date.now();
|
|
2729
|
+
}
|
|
2730
|
+
return i;
|
|
2731
|
+
},
|
|
2732
|
+
});
|
|
2733
|
+
return FS.mkdev(path, mode, dev);
|
|
2734
|
+
},
|
|
2735
|
+
forceLoadFile(obj) {
|
|
2736
|
+
if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
|
|
2737
|
+
if (globalThis.XMLHttpRequest) {
|
|
2738
|
+
abort(
|
|
2739
|
+
"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.",
|
|
2740
|
+
);
|
|
2741
|
+
} else {
|
|
2742
|
+
try {
|
|
2743
|
+
obj.contents = readBinary(obj.url);
|
|
2744
|
+
} catch (e) {
|
|
2745
|
+
throw new FS.ErrnoError(29);
|
|
2746
|
+
}
|
|
2747
|
+
}
|
|
2748
|
+
},
|
|
2749
|
+
createLazyFile(parent, name, url, canRead, canWrite) {
|
|
2750
|
+
class LazyUint8Array {
|
|
2751
|
+
lengthKnown = false;
|
|
2752
|
+
chunks = [];
|
|
2753
|
+
get(idx) {
|
|
2754
|
+
if (idx > this.length - 1 || idx < 0) {
|
|
2755
|
+
return undefined;
|
|
2756
|
+
}
|
|
2757
|
+
var chunkOffset = idx % this.chunkSize;
|
|
2758
|
+
var chunkNum = (idx / this.chunkSize) | 0;
|
|
2759
|
+
return this.getter(chunkNum)[chunkOffset];
|
|
2760
|
+
}
|
|
2761
|
+
setDataGetter(getter) {
|
|
2762
|
+
this.getter = getter;
|
|
2763
|
+
}
|
|
2764
|
+
cacheLength() {
|
|
2765
|
+
var xhr = new XMLHttpRequest();
|
|
2766
|
+
xhr.open("HEAD", url, false);
|
|
2767
|
+
xhr.send(null);
|
|
2768
|
+
if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))
|
|
2769
|
+
abort(`Couldn't load ${url}. Status: ${xhr.status}`);
|
|
2770
|
+
var datalength = Number(xhr.getResponseHeader("Content-length"));
|
|
2771
|
+
var header;
|
|
2772
|
+
var hasByteServing =
|
|
2773
|
+
(header = xhr.getResponseHeader("Accept-Ranges")) &&
|
|
2774
|
+
header === "bytes";
|
|
2775
|
+
var usesGzip =
|
|
2776
|
+
(header = xhr.getResponseHeader("Content-Encoding")) &&
|
|
2777
|
+
header === "gzip";
|
|
2778
|
+
var chunkSize = 1024 * 1024;
|
|
2779
|
+
if (!hasByteServing) chunkSize = datalength;
|
|
2780
|
+
var doXHR = (from, to) => {
|
|
2781
|
+
if (from > to)
|
|
2782
|
+
abort(`invalid range (${from}, ${to}) or no bytes requested!`);
|
|
2783
|
+
if (to > datalength - 1)
|
|
2784
|
+
abort(`only ${datalength} bytes available! programmer error!`);
|
|
2785
|
+
var xhr = new XMLHttpRequest();
|
|
2786
|
+
xhr.open("GET", url, false);
|
|
2787
|
+
if (datalength !== chunkSize)
|
|
2788
|
+
xhr.setRequestHeader("Range", `bytes=${from}-${to}`);
|
|
2789
|
+
xhr.responseType = "arraybuffer";
|
|
2790
|
+
if (xhr.overrideMimeType) {
|
|
2791
|
+
xhr.overrideMimeType("text/plain; charset=x-user-defined");
|
|
2792
|
+
}
|
|
2793
|
+
xhr.send(null);
|
|
2794
|
+
if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))
|
|
2795
|
+
abort(`Couldn't load ${url}. Status: ${xhr.status}`);
|
|
2796
|
+
if (xhr.response !== undefined) {
|
|
2797
|
+
return new Uint8Array(xhr.response || []);
|
|
2798
|
+
}
|
|
2799
|
+
return intArrayFromString(xhr.responseText ?? "", true);
|
|
2800
|
+
};
|
|
2801
|
+
var lazyArray = this;
|
|
2802
|
+
lazyArray.setDataGetter((chunkNum) => {
|
|
2803
|
+
var start = chunkNum * chunkSize;
|
|
2804
|
+
var end = (chunkNum + 1) * chunkSize - 1;
|
|
2805
|
+
end = Math.min(end, datalength - 1);
|
|
2806
|
+
if (typeof lazyArray.chunks[chunkNum] == "undefined") {
|
|
2807
|
+
lazyArray.chunks[chunkNum] = doXHR(start, end);
|
|
2808
|
+
}
|
|
2809
|
+
if (typeof lazyArray.chunks[chunkNum] == "undefined")
|
|
2810
|
+
abort("doXHR failed!");
|
|
2811
|
+
return lazyArray.chunks[chunkNum];
|
|
2812
|
+
});
|
|
2813
|
+
if (usesGzip || !datalength) {
|
|
2814
|
+
chunkSize = datalength = 1;
|
|
2815
|
+
datalength = this.getter(0).length;
|
|
2816
|
+
chunkSize = datalength;
|
|
2817
|
+
out(
|
|
2818
|
+
"LazyFiles on gzip forces download of the whole file when length is accessed",
|
|
2819
|
+
);
|
|
2820
|
+
}
|
|
2821
|
+
this._length = datalength;
|
|
2822
|
+
this._chunkSize = chunkSize;
|
|
2823
|
+
this.lengthKnown = true;
|
|
2824
|
+
}
|
|
2825
|
+
get length() {
|
|
2826
|
+
if (!this.lengthKnown) {
|
|
2827
|
+
this.cacheLength();
|
|
2828
|
+
}
|
|
2829
|
+
return this._length;
|
|
2830
|
+
}
|
|
2831
|
+
get chunkSize() {
|
|
2832
|
+
if (!this.lengthKnown) {
|
|
2833
|
+
this.cacheLength();
|
|
2834
|
+
}
|
|
2835
|
+
return this._chunkSize;
|
|
2836
|
+
}
|
|
2837
|
+
}
|
|
2838
|
+
if (globalThis.XMLHttpRequest) {
|
|
2839
|
+
if (!ENVIRONMENT_IS_WORKER)
|
|
2840
|
+
abort(
|
|
2841
|
+
"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc",
|
|
2842
|
+
);
|
|
2843
|
+
var lazyArray = new LazyUint8Array();
|
|
2844
|
+
var properties = { isDevice: false, contents: lazyArray };
|
|
2845
|
+
} else {
|
|
2846
|
+
var properties = { isDevice: false, url };
|
|
2847
|
+
}
|
|
2848
|
+
var node = FS.createFile(parent, name, properties, canRead, canWrite);
|
|
2849
|
+
if (properties.contents) {
|
|
2850
|
+
node.contents = properties.contents;
|
|
2851
|
+
} else if (properties.url) {
|
|
2852
|
+
node.contents = null;
|
|
2853
|
+
node.url = properties.url;
|
|
2854
|
+
}
|
|
2855
|
+
Object.defineProperties(node, {
|
|
2856
|
+
usedBytes: {
|
|
2857
|
+
get: function () {
|
|
2858
|
+
return this.contents.length;
|
|
2859
|
+
},
|
|
2860
|
+
},
|
|
2861
|
+
});
|
|
2862
|
+
var stream_ops = {};
|
|
2863
|
+
for (const [key, fn] of Object.entries(node.stream_ops)) {
|
|
2864
|
+
stream_ops[key] = (...args) => {
|
|
2865
|
+
FS.forceLoadFile(node);
|
|
2866
|
+
return fn(...args);
|
|
2867
|
+
};
|
|
2868
|
+
}
|
|
2869
|
+
function writeChunks(stream, buffer, offset, length, position) {
|
|
2870
|
+
var contents = stream.node.contents;
|
|
2871
|
+
if (position >= contents.length) return 0;
|
|
2872
|
+
var size = Math.min(contents.length - position, length);
|
|
2873
|
+
if (contents.slice) {
|
|
2874
|
+
for (var i = 0; i < size; i++) {
|
|
2875
|
+
buffer[offset + i] = contents[position + i];
|
|
2876
|
+
}
|
|
2877
|
+
} else {
|
|
2878
|
+
for (var i = 0; i < size; i++) {
|
|
2879
|
+
buffer[offset + i] = contents.get(position + i);
|
|
2880
|
+
}
|
|
2881
|
+
}
|
|
2882
|
+
return size;
|
|
2883
|
+
}
|
|
2884
|
+
stream_ops.read = (stream, buffer, offset, length, position) => {
|
|
2885
|
+
FS.forceLoadFile(node);
|
|
2886
|
+
return writeChunks(stream, buffer, offset, length, position);
|
|
2887
|
+
};
|
|
2888
|
+
stream_ops.mmap = (stream, length, position, prot, flags) => {
|
|
2889
|
+
FS.forceLoadFile(node);
|
|
2890
|
+
var ptr = mmapAlloc(length);
|
|
2891
|
+
if (!ptr) {
|
|
2892
|
+
throw new FS.ErrnoError(48);
|
|
2893
|
+
}
|
|
2894
|
+
writeChunks(stream, (growMemViews(), HEAP8), ptr, length, position);
|
|
2895
|
+
return { ptr, allocated: true };
|
|
2896
|
+
};
|
|
2897
|
+
node.stream_ops = stream_ops;
|
|
2898
|
+
return node;
|
|
2899
|
+
},
|
|
2900
|
+
};
|
|
2901
|
+
var HEAPU8;
|
|
2902
|
+
var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) =>
|
|
2903
|
+
ptr
|
|
2904
|
+
? UTF8ArrayToString(
|
|
2905
|
+
(growMemViews(), HEAPU8),
|
|
2906
|
+
ptr,
|
|
2907
|
+
maxBytesToRead,
|
|
2908
|
+
ignoreNul,
|
|
2909
|
+
)
|
|
2910
|
+
: "";
|
|
2911
|
+
var HEAPU32;
|
|
2912
|
+
var SYSCALLS = {
|
|
2913
|
+
currentUmask: 18,
|
|
2914
|
+
calculateAt(dirfd, path, allowEmpty) {
|
|
2915
|
+
if (PATH.isAbs(path)) {
|
|
2916
|
+
return path;
|
|
2917
|
+
}
|
|
2918
|
+
var dir;
|
|
2919
|
+
if (dirfd === -100) {
|
|
2920
|
+
dir = FS.cwd();
|
|
2921
|
+
} else {
|
|
2922
|
+
var dirstream = SYSCALLS.getStreamFromFD(dirfd);
|
|
2923
|
+
dir = dirstream.path;
|
|
2924
|
+
}
|
|
2925
|
+
if (path.length == 0) {
|
|
2926
|
+
if (!allowEmpty) {
|
|
2927
|
+
throw new FS.ErrnoError(44);
|
|
2928
|
+
}
|
|
2929
|
+
return dir;
|
|
2930
|
+
}
|
|
2931
|
+
return dir + "/" + path;
|
|
2932
|
+
},
|
|
2933
|
+
writeStat(buf, stat) {
|
|
2934
|
+
(growMemViews(), HEAPU32)[buf / 4] = stat.dev;
|
|
2935
|
+
(growMemViews(), HEAPU32)[(buf + 4) / 4] = stat.mode;
|
|
2936
|
+
(growMemViews(), HEAPU64)[(buf + 8) / 8] = BigInt(stat.nlink);
|
|
2937
|
+
(growMemViews(), HEAPU32)[(buf + 16) / 4] = stat.uid;
|
|
2938
|
+
(growMemViews(), HEAPU32)[(buf + 20) / 4] = stat.gid;
|
|
2939
|
+
(growMemViews(), HEAPU32)[(buf + 24) / 4] = stat.rdev;
|
|
2940
|
+
(growMemViews(), HEAP64)[(buf + 32) / 8] = BigInt(stat.size);
|
|
2941
|
+
(growMemViews(), HEAP32)[(buf + 40) / 4] = 4096;
|
|
2942
|
+
(growMemViews(), HEAP32)[(buf + 44) / 4] = stat.blocks;
|
|
2943
|
+
var atime = stat.atime.getTime();
|
|
2944
|
+
var mtime = stat.mtime.getTime();
|
|
2945
|
+
var ctime = stat.ctime.getTime();
|
|
2946
|
+
(growMemViews(), HEAP64)[(buf + 48) / 8] = BigInt(Math.floor(atime / 1e3));
|
|
2947
|
+
(growMemViews(), HEAPU64)[(buf + 56) / 8] = BigInt(
|
|
2948
|
+
(atime % 1e3) * 1e3 * 1e3,
|
|
2949
|
+
);
|
|
2950
|
+
(growMemViews(), HEAP64)[(buf + 64) / 8] = BigInt(Math.floor(mtime / 1e3));
|
|
2951
|
+
(growMemViews(), HEAPU64)[(buf + 72) / 8] = BigInt(
|
|
2952
|
+
(mtime % 1e3) * 1e3 * 1e3,
|
|
2953
|
+
);
|
|
2954
|
+
(growMemViews(), HEAP64)[(buf + 80) / 8] = BigInt(Math.floor(ctime / 1e3));
|
|
2955
|
+
(growMemViews(), HEAPU64)[(buf + 88) / 8] = BigInt(
|
|
2956
|
+
(ctime % 1e3) * 1e3 * 1e3,
|
|
2957
|
+
);
|
|
2958
|
+
(growMemViews(), HEAP64)[(buf + 96) / 8] = BigInt(stat.ino);
|
|
2959
|
+
return 0;
|
|
2960
|
+
},
|
|
2961
|
+
writeStatFs(buf, stats) {
|
|
2962
|
+
(growMemViews(), HEAPU32)[(buf + 8) / 4] = stats.bsize;
|
|
2963
|
+
(growMemViews(), HEAPU32)[(buf + 72) / 4] = stats.bsize;
|
|
2964
|
+
(growMemViews(), HEAP64)[(buf + 16) / 8] = BigInt(stats.blocks);
|
|
2965
|
+
(growMemViews(), HEAP64)[(buf + 24) / 8] = BigInt(stats.bfree);
|
|
2966
|
+
(growMemViews(), HEAP64)[(buf + 32) / 8] = BigInt(stats.bavail);
|
|
2967
|
+
(growMemViews(), HEAP64)[(buf + 40) / 8] = BigInt(stats.files);
|
|
2968
|
+
(growMemViews(), HEAP64)[(buf + 48) / 8] = BigInt(stats.ffree);
|
|
2969
|
+
(growMemViews(), HEAPU32)[(buf + 56) / 4] = stats.fsid;
|
|
2970
|
+
(growMemViews(), HEAPU32)[(buf + 80) / 4] = stats.flags;
|
|
2971
|
+
(growMemViews(), HEAPU32)[(buf + 64) / 4] = stats.namelen;
|
|
2972
|
+
},
|
|
2973
|
+
doMsync(addr, stream, len, flags, offset) {
|
|
2974
|
+
if (!FS.isFile(stream.node.mode)) {
|
|
2975
|
+
throw new FS.ErrnoError(43);
|
|
2976
|
+
}
|
|
2977
|
+
if (flags & 2) {
|
|
2978
|
+
return 0;
|
|
2979
|
+
}
|
|
2980
|
+
var buffer = (growMemViews(), HEAPU8).subarray(addr, addr + len);
|
|
2981
|
+
FS.msync(stream, buffer, offset, len, flags);
|
|
2982
|
+
},
|
|
2983
|
+
getStreamFromFD(fd) {
|
|
2984
|
+
var stream = FS.getStreamChecked(fd);
|
|
2985
|
+
return stream;
|
|
2986
|
+
},
|
|
2987
|
+
varargs: undefined,
|
|
2988
|
+
getStr(ptr) {
|
|
2989
|
+
var ret = UTF8ToString(ptr);
|
|
2990
|
+
return ret;
|
|
2991
|
+
},
|
|
2992
|
+
};
|
|
2993
|
+
var HEAP16;
|
|
2994
|
+
function ___syscall_fcntl64(fd, cmd, varargs) {
|
|
2995
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
2996
|
+
return proxyToMainThread(3, 0, 1, fd, cmd, varargs);
|
|
2997
|
+
varargs = bigintToI53Checked(varargs);
|
|
2998
|
+
SYSCALLS.varargs = varargs;
|
|
2999
|
+
try {
|
|
3000
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3001
|
+
switch (cmd) {
|
|
3002
|
+
case 0: {
|
|
3003
|
+
var arg = syscallGetVarargI();
|
|
3004
|
+
if (arg < 0) {
|
|
3005
|
+
return -28;
|
|
3006
|
+
}
|
|
3007
|
+
while (FS.streams[arg]) {
|
|
3008
|
+
arg++;
|
|
3009
|
+
}
|
|
3010
|
+
var newStream;
|
|
3011
|
+
newStream = FS.dupStream(stream, arg);
|
|
3012
|
+
return newStream.fd;
|
|
3013
|
+
}
|
|
3014
|
+
case 1:
|
|
3015
|
+
case 2:
|
|
3016
|
+
return 0;
|
|
3017
|
+
case 3:
|
|
3018
|
+
return stream.flags;
|
|
3019
|
+
case 4: {
|
|
3020
|
+
var arg = syscallGetVarargI();
|
|
3021
|
+
var mask = 289792;
|
|
3022
|
+
stream.flags = (stream.flags & ~mask) | (arg & mask);
|
|
3023
|
+
return 0;
|
|
3024
|
+
}
|
|
3025
|
+
case 5: {
|
|
3026
|
+
var arg = syscallGetVarargP();
|
|
3027
|
+
var offset = 0;
|
|
3028
|
+
(growMemViews(), HEAP16)[(arg + offset) / 2] = 2;
|
|
3029
|
+
return 0;
|
|
3030
|
+
}
|
|
3031
|
+
case 6:
|
|
3032
|
+
case 7:
|
|
3033
|
+
return 0;
|
|
3034
|
+
}
|
|
3035
|
+
return -28;
|
|
3036
|
+
} catch (e) {
|
|
3037
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3038
|
+
return -e.errno;
|
|
3039
|
+
}
|
|
3040
|
+
}
|
|
3041
|
+
function ___syscall_ioctl(fd, op, varargs) {
|
|
3042
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3043
|
+
return proxyToMainThread(4, 0, 1, fd, op, varargs);
|
|
3044
|
+
varargs = bigintToI53Checked(varargs);
|
|
3045
|
+
SYSCALLS.varargs = varargs;
|
|
3046
|
+
try {
|
|
3047
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3048
|
+
switch (op) {
|
|
3049
|
+
case 21509: {
|
|
3050
|
+
if (!stream.tty) return -59;
|
|
3051
|
+
return 0;
|
|
3052
|
+
}
|
|
3053
|
+
case 21505: {
|
|
3054
|
+
if (!stream.tty) return -59;
|
|
3055
|
+
if (stream.tty.ops.ioctl_tcgets) {
|
|
3056
|
+
var termios = stream.tty.ops.ioctl_tcgets(stream);
|
|
3057
|
+
var argp = syscallGetVarargP();
|
|
3058
|
+
(growMemViews(), HEAP32)[argp / 4] = termios.c_iflag || 0;
|
|
3059
|
+
(growMemViews(), HEAP32)[(argp + 4) / 4] = termios.c_oflag || 0;
|
|
3060
|
+
(growMemViews(), HEAP32)[(argp + 8) / 4] = termios.c_cflag || 0;
|
|
3061
|
+
(growMemViews(), HEAP32)[(argp + 12) / 4] = termios.c_lflag || 0;
|
|
3062
|
+
for (var i = 0; i < 32; i++) {
|
|
3063
|
+
(growMemViews(), HEAP8)[argp + i + 17] = termios.c_cc[i] || 0;
|
|
3064
|
+
}
|
|
3065
|
+
return 0;
|
|
3066
|
+
}
|
|
3067
|
+
return 0;
|
|
3068
|
+
}
|
|
3069
|
+
case 21510:
|
|
3070
|
+
case 21511:
|
|
3071
|
+
case 21512: {
|
|
3072
|
+
if (!stream.tty) return -59;
|
|
3073
|
+
return 0;
|
|
3074
|
+
}
|
|
3075
|
+
case 21506:
|
|
3076
|
+
case 21507:
|
|
3077
|
+
case 21508: {
|
|
3078
|
+
if (!stream.tty) return -59;
|
|
3079
|
+
if (stream.tty.ops.ioctl_tcsets) {
|
|
3080
|
+
var argp = syscallGetVarargP();
|
|
3081
|
+
var c_iflag = (growMemViews(), HEAP32)[argp / 4];
|
|
3082
|
+
var c_oflag = (growMemViews(), HEAP32)[(argp + 4) / 4];
|
|
3083
|
+
var c_cflag = (growMemViews(), HEAP32)[(argp + 8) / 4];
|
|
3084
|
+
var c_lflag = (growMemViews(), HEAP32)[(argp + 12) / 4];
|
|
3085
|
+
var c_cc = [];
|
|
3086
|
+
for (var i = 0; i < 32; i++) {
|
|
3087
|
+
c_cc.push((growMemViews(), HEAP8)[argp + i + 17]);
|
|
3088
|
+
}
|
|
3089
|
+
return stream.tty.ops.ioctl_tcsets(stream.tty, op, {
|
|
3090
|
+
c_iflag,
|
|
3091
|
+
c_oflag,
|
|
3092
|
+
c_cflag,
|
|
3093
|
+
c_lflag,
|
|
3094
|
+
c_cc,
|
|
3095
|
+
});
|
|
3096
|
+
}
|
|
3097
|
+
return 0;
|
|
3098
|
+
}
|
|
3099
|
+
case 21519: {
|
|
3100
|
+
if (!stream.tty) return -59;
|
|
3101
|
+
var argp = syscallGetVarargP();
|
|
3102
|
+
(growMemViews(), HEAP32)[argp / 4] = 0;
|
|
3103
|
+
return 0;
|
|
3104
|
+
}
|
|
3105
|
+
case 21520: {
|
|
3106
|
+
if (!stream.tty) return -59;
|
|
3107
|
+
return -28;
|
|
3108
|
+
}
|
|
3109
|
+
case 21537:
|
|
3110
|
+
case 21531: {
|
|
3111
|
+
var argp = syscallGetVarargP();
|
|
3112
|
+
return FS.ioctl(stream, op, argp);
|
|
3113
|
+
}
|
|
3114
|
+
case 21523: {
|
|
3115
|
+
if (!stream.tty) return -59;
|
|
3116
|
+
if (stream.tty.ops.ioctl_tiocgwinsz) {
|
|
3117
|
+
var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty);
|
|
3118
|
+
var argp = syscallGetVarargP();
|
|
3119
|
+
(growMemViews(), HEAP16)[argp / 2] = winsize[0];
|
|
3120
|
+
(growMemViews(), HEAP16)[(argp + 2) / 2] = winsize[1];
|
|
3121
|
+
}
|
|
3122
|
+
return 0;
|
|
3123
|
+
}
|
|
3124
|
+
case 21524: {
|
|
3125
|
+
if (!stream.tty) return -59;
|
|
3126
|
+
return 0;
|
|
3127
|
+
}
|
|
3128
|
+
case 21515: {
|
|
3129
|
+
if (!stream.tty) return -59;
|
|
3130
|
+
return 0;
|
|
3131
|
+
}
|
|
3132
|
+
default:
|
|
3133
|
+
return -28;
|
|
3134
|
+
}
|
|
3135
|
+
} catch (e) {
|
|
3136
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3137
|
+
return -e.errno;
|
|
3138
|
+
}
|
|
3139
|
+
}
|
|
3140
|
+
function ___syscall_openat(dirfd, path, flags, varargs) {
|
|
3141
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3142
|
+
return proxyToMainThread(5, 0, 1, dirfd, path, flags, varargs);
|
|
3143
|
+
path = bigintToI53Checked(path);
|
|
3144
|
+
varargs = bigintToI53Checked(varargs);
|
|
3145
|
+
SYSCALLS.varargs = varargs;
|
|
3146
|
+
try {
|
|
3147
|
+
path = SYSCALLS.getStr(path);
|
|
3148
|
+
path = SYSCALLS.calculateAt(dirfd, path);
|
|
3149
|
+
var mode = varargs ? syscallGetVarargI() : 0;
|
|
3150
|
+
if (flags & 64) {
|
|
3151
|
+
mode &= ~SYSCALLS.currentUmask;
|
|
3152
|
+
}
|
|
3153
|
+
return FS.open(path, flags, mode).fd;
|
|
3154
|
+
} catch (e) {
|
|
3155
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3156
|
+
return -e.errno;
|
|
3157
|
+
}
|
|
3158
|
+
}
|
|
3159
|
+
var __abort_js = () => abort("");
|
|
3160
|
+
function __emscripten_init_main_thread_js(tb) {
|
|
3161
|
+
tb = bigintToI53Checked(tb);
|
|
3162
|
+
var can_block = !ENVIRONMENT_IS_WEB;
|
|
3163
|
+
try {
|
|
3164
|
+
Atomics.wait((growMemViews(), HEAP32), 0, 0, 0);
|
|
3165
|
+
can_block = true;
|
|
3166
|
+
} catch (e) {}
|
|
3167
|
+
__emscripten_thread_init(
|
|
3168
|
+
tb,
|
|
3169
|
+
!ENVIRONMENT_IS_WORKER,
|
|
3170
|
+
1,
|
|
3171
|
+
can_block,
|
|
3172
|
+
65536,
|
|
3173
|
+
false,
|
|
3174
|
+
);
|
|
3175
|
+
PThread.threadInitTLS();
|
|
3176
|
+
}
|
|
3177
|
+
var handleException = (e) => {
|
|
3178
|
+
if (e instanceof ExitStatus || e == "unwind") {
|
|
3179
|
+
return EXITSTATUS;
|
|
3180
|
+
}
|
|
3181
|
+
quit_(1, e);
|
|
3182
|
+
};
|
|
3183
|
+
var maybeExit = () => {
|
|
3184
|
+
if (!keepRuntimeAlive()) {
|
|
3185
|
+
try {
|
|
3186
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
3187
|
+
if (_pthread_self()) __emscripten_thread_exit(EXITSTATUS);
|
|
3188
|
+
return;
|
|
3189
|
+
}
|
|
3190
|
+
_exit(EXITSTATUS);
|
|
3191
|
+
} catch (e) {
|
|
3192
|
+
handleException(e);
|
|
3193
|
+
}
|
|
3194
|
+
}
|
|
3195
|
+
};
|
|
3196
|
+
var callUserCallback = (func) => {
|
|
3197
|
+
if (ABORT) {
|
|
3198
|
+
return;
|
|
3199
|
+
}
|
|
3200
|
+
try {
|
|
3201
|
+
return func();
|
|
3202
|
+
} catch (e) {
|
|
3203
|
+
handleException(e);
|
|
3204
|
+
} finally {
|
|
3205
|
+
maybeExit();
|
|
3206
|
+
}
|
|
3207
|
+
};
|
|
3208
|
+
function __emscripten_thread_mailbox_await(pthread_ptr) {
|
|
3209
|
+
pthread_ptr = bigintToI53Checked(pthread_ptr);
|
|
3210
|
+
if (!waitAsyncPolyfilled) {
|
|
3211
|
+
var wait = Atomics.waitAsync(
|
|
3212
|
+
(growMemViews(), HEAP32),
|
|
3213
|
+
pthread_ptr / 4,
|
|
3214
|
+
pthread_ptr,
|
|
3215
|
+
);
|
|
3216
|
+
wait.value.then(checkMailbox);
|
|
3217
|
+
var waitingAsync = pthread_ptr + 204;
|
|
3218
|
+
Atomics.store((growMemViews(), HEAP32), waitingAsync / 4, 1);
|
|
3219
|
+
}
|
|
3220
|
+
}
|
|
3221
|
+
var checkMailbox = () => {
|
|
3222
|
+
var pthread_ptr = _pthread_self();
|
|
3223
|
+
if (!pthread_ptr) return;
|
|
3224
|
+
callUserCallback(() => {
|
|
3225
|
+
__emscripten_thread_mailbox_await(pthread_ptr);
|
|
3226
|
+
__emscripten_check_mailbox();
|
|
3227
|
+
});
|
|
3228
|
+
};
|
|
3229
|
+
function __emscripten_notify_mailbox_postmessage(targetThread, currThreadId) {
|
|
3230
|
+
targetThread = bigintToI53Checked(targetThread);
|
|
3231
|
+
currThreadId = bigintToI53Checked(currThreadId);
|
|
3232
|
+
if (targetThread == currThreadId) {
|
|
3233
|
+
setTimeout(checkMailbox);
|
|
3234
|
+
} else if (ENVIRONMENT_IS_PTHREAD) {
|
|
3235
|
+
postMessage({ targetThread, cmd: 4 });
|
|
3236
|
+
} else {
|
|
3237
|
+
var worker = PThread.pthreads[targetThread];
|
|
3238
|
+
if (!worker) {
|
|
3239
|
+
return;
|
|
3240
|
+
}
|
|
3241
|
+
worker.postMessage({ cmd: 4 });
|
|
3242
|
+
}
|
|
3243
|
+
}
|
|
3244
|
+
var proxiedJSCallArgs = [];
|
|
3245
|
+
function __emscripten_receive_on_main_thread_js(
|
|
3246
|
+
funcIndex,
|
|
3247
|
+
emAsmAddr,
|
|
3248
|
+
callingThread,
|
|
3249
|
+
bufSize,
|
|
3250
|
+
args,
|
|
3251
|
+
ctx,
|
|
3252
|
+
ctxArgs,
|
|
3253
|
+
) {
|
|
3254
|
+
emAsmAddr = bigintToI53Checked(emAsmAddr);
|
|
3255
|
+
callingThread = bigintToI53Checked(callingThread);
|
|
3256
|
+
args = bigintToI53Checked(args);
|
|
3257
|
+
ctx = bigintToI53Checked(ctx);
|
|
3258
|
+
ctxArgs = bigintToI53Checked(ctxArgs);
|
|
3259
|
+
proxiedJSCallArgs.length = 0;
|
|
3260
|
+
var b = args / 8;
|
|
3261
|
+
var end = (args + bufSize) / 8;
|
|
3262
|
+
while (b < end) {
|
|
3263
|
+
var arg;
|
|
3264
|
+
if ((growMemViews(), HEAP64)[b++]) {
|
|
3265
|
+
arg = (growMemViews(), HEAP64)[b++];
|
|
3266
|
+
} else {
|
|
3267
|
+
arg = (growMemViews(), HEAPF64)[b++];
|
|
3268
|
+
}
|
|
3269
|
+
proxiedJSCallArgs.push(arg);
|
|
3270
|
+
}
|
|
3271
|
+
var func = proxiedFunctionTable[funcIndex];
|
|
3272
|
+
PThread.currentProxiedOperationCallerThread = callingThread;
|
|
3273
|
+
var rtn = func(...proxiedJSCallArgs);
|
|
3274
|
+
PThread.currentProxiedOperationCallerThread = 0;
|
|
3275
|
+
if (ctx) {
|
|
3276
|
+
rtn.then((rtn) =>
|
|
3277
|
+
__emscripten_run_js_on_main_thread_done(ctx, ctxArgs, rtn),
|
|
3278
|
+
);
|
|
3279
|
+
return;
|
|
3280
|
+
}
|
|
3281
|
+
if (typeof rtn == "bigint") {
|
|
3282
|
+
rtn = bigintToI53Checked(rtn);
|
|
3283
|
+
}
|
|
3284
|
+
return rtn;
|
|
3285
|
+
}
|
|
3286
|
+
function __emscripten_thread_cleanup(thread) {
|
|
3287
|
+
thread = bigintToI53Checked(thread);
|
|
3288
|
+
if (!ENVIRONMENT_IS_PTHREAD) cleanupThread(thread);
|
|
3289
|
+
else postMessage({ cmd: 6, thread });
|
|
3290
|
+
}
|
|
3291
|
+
function __emscripten_thread_set_strongref(thread) {
|
|
3292
|
+
thread = bigintToI53Checked(thread);
|
|
3293
|
+
if (ENVIRONMENT_IS_NODE) {
|
|
3294
|
+
var worker = PThread.pthreads[thread];
|
|
3295
|
+
worker.ref();
|
|
3296
|
+
worker.strongref = 1;
|
|
3297
|
+
}
|
|
3298
|
+
}
|
|
3299
|
+
var isLeapYear = (year) =>
|
|
3300
|
+
year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
3301
|
+
var MONTH_DAYS_LEAP_CUMULATIVE = [
|
|
3302
|
+
0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
|
|
3303
|
+
];
|
|
3304
|
+
var MONTH_DAYS_REGULAR_CUMULATIVE = [
|
|
3305
|
+
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
|
|
3306
|
+
];
|
|
3307
|
+
var ydayFromDate = (date) => {
|
|
3308
|
+
var leap = isLeapYear(date.getFullYear());
|
|
3309
|
+
var monthDaysCumulative = leap
|
|
3310
|
+
? MONTH_DAYS_LEAP_CUMULATIVE
|
|
3311
|
+
: MONTH_DAYS_REGULAR_CUMULATIVE;
|
|
3312
|
+
var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1;
|
|
3313
|
+
return yday;
|
|
3314
|
+
};
|
|
3315
|
+
function __localtime_js(time, tmPtr) {
|
|
3316
|
+
time = bigintToI53Checked(time);
|
|
3317
|
+
tmPtr = bigintToI53Checked(tmPtr);
|
|
3318
|
+
var date = new Date(time * 1e3);
|
|
3319
|
+
if (isNaN(date.getTime())) {
|
|
3320
|
+
return 1;
|
|
3321
|
+
}
|
|
3322
|
+
(growMemViews(), HEAP32)[tmPtr / 4] = date.getSeconds();
|
|
3323
|
+
(growMemViews(), HEAP32)[(tmPtr + 4) / 4] = date.getMinutes();
|
|
3324
|
+
(growMemViews(), HEAP32)[(tmPtr + 8) / 4] = date.getHours();
|
|
3325
|
+
(growMemViews(), HEAP32)[(tmPtr + 12) / 4] = date.getDate();
|
|
3326
|
+
(growMemViews(), HEAP32)[(tmPtr + 16) / 4] = date.getMonth();
|
|
3327
|
+
(growMemViews(), HEAP32)[(tmPtr + 20) / 4] = date.getFullYear() - 1900;
|
|
3328
|
+
(growMemViews(), HEAP32)[(tmPtr + 24) / 4] = date.getDay();
|
|
3329
|
+
var yday = ydayFromDate(date) | 0;
|
|
3330
|
+
(growMemViews(), HEAP32)[(tmPtr + 28) / 4] = yday;
|
|
3331
|
+
(growMemViews(), HEAP64)[(tmPtr + 40) / 8] = BigInt(
|
|
3332
|
+
-(date.getTimezoneOffset() * 60),
|
|
3333
|
+
);
|
|
3334
|
+
var start = new Date(date.getFullYear(), 0, 1);
|
|
3335
|
+
var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset();
|
|
3336
|
+
var winterOffset = start.getTimezoneOffset();
|
|
3337
|
+
var dst =
|
|
3338
|
+
(summerOffset != winterOffset &&
|
|
3339
|
+
date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0;
|
|
3340
|
+
(growMemViews(), HEAP32)[(tmPtr + 32) / 4] = dst;
|
|
3341
|
+
return 0;
|
|
3342
|
+
}
|
|
3343
|
+
var stringToUTF8 = (str, outPtr, maxBytesToWrite) =>
|
|
3344
|
+
stringToUTF8Array(str, (growMemViews(), HEAPU8), outPtr, maxBytesToWrite);
|
|
3345
|
+
var __tzset_js = function (timezone, daylight, std_name, dst_name) {
|
|
3346
|
+
timezone = bigintToI53Checked(timezone);
|
|
3347
|
+
daylight = bigintToI53Checked(daylight);
|
|
3348
|
+
std_name = bigintToI53Checked(std_name);
|
|
3349
|
+
dst_name = bigintToI53Checked(dst_name);
|
|
3350
|
+
var currentYear = new Date().getFullYear();
|
|
3351
|
+
var winter = new Date(currentYear, 0, 1);
|
|
3352
|
+
var summer = new Date(currentYear, 6, 1);
|
|
3353
|
+
var winterOffset = winter.getTimezoneOffset();
|
|
3354
|
+
var summerOffset = summer.getTimezoneOffset();
|
|
3355
|
+
var stdTimezoneOffset = Math.max(winterOffset, summerOffset);
|
|
3356
|
+
(growMemViews(), HEAPU64)[timezone / 8] = BigInt(stdTimezoneOffset * 60);
|
|
3357
|
+
(growMemViews(), HEAP32)[daylight / 4] = Number(winterOffset != summerOffset);
|
|
3358
|
+
var extractZone = (timezoneOffset) => {
|
|
3359
|
+
var sign = timezoneOffset >= 0 ? "-" : "+";
|
|
3360
|
+
var absOffset = Math.abs(timezoneOffset);
|
|
3361
|
+
var hours = String(Math.floor(absOffset / 60)).padStart(2, "0");
|
|
3362
|
+
var minutes = String(absOffset % 60).padStart(2, "0");
|
|
3363
|
+
return `UTC${sign}${hours}${minutes}`;
|
|
3364
|
+
};
|
|
3365
|
+
var winterName = extractZone(winterOffset);
|
|
3366
|
+
var summerName = extractZone(summerOffset);
|
|
3367
|
+
if (summerOffset < winterOffset) {
|
|
3368
|
+
stringToUTF8(winterName, std_name, 17);
|
|
3369
|
+
stringToUTF8(summerName, dst_name, 17);
|
|
3370
|
+
} else {
|
|
3371
|
+
stringToUTF8(winterName, dst_name, 17);
|
|
3372
|
+
stringToUTF8(summerName, std_name, 17);
|
|
3373
|
+
}
|
|
3374
|
+
};
|
|
3375
|
+
var _emscripten_get_now = () => performance.timeOrigin + performance.now();
|
|
3376
|
+
var _emscripten_date_now = () => Date.now();
|
|
3377
|
+
var nowIsMonotonic = 1;
|
|
3378
|
+
var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3;
|
|
3379
|
+
function _clock_time_get(clk_id, ignored_precision, ptime) {
|
|
3380
|
+
ignored_precision = bigintToI53Checked(ignored_precision);
|
|
3381
|
+
ptime = bigintToI53Checked(ptime);
|
|
3382
|
+
if (!checkWasiClock(clk_id)) {
|
|
3383
|
+
return 28;
|
|
3384
|
+
}
|
|
3385
|
+
var now;
|
|
3386
|
+
if (clk_id === 0) {
|
|
3387
|
+
now = _emscripten_date_now();
|
|
3388
|
+
} else if (nowIsMonotonic) {
|
|
3389
|
+
now = _emscripten_get_now();
|
|
3390
|
+
} else {
|
|
3391
|
+
return 52;
|
|
3392
|
+
}
|
|
3393
|
+
var nsec = Math.round(now * 1e3 * 1e3);
|
|
3394
|
+
(growMemViews(), HEAP64)[ptime / 8] = BigInt(nsec);
|
|
3395
|
+
return 0;
|
|
3396
|
+
}
|
|
3397
|
+
var _emscripten_check_blocking_allowed = () => {};
|
|
3398
|
+
var runtimeKeepalivePush = () => {
|
|
3399
|
+
runtimeKeepaliveCounter += 1;
|
|
3400
|
+
};
|
|
3401
|
+
var _emscripten_exit_with_live_runtime = () => {
|
|
3402
|
+
runtimeKeepalivePush();
|
|
3403
|
+
throw "unwind";
|
|
3404
|
+
};
|
|
3405
|
+
var getHeapMax = () => 8589934592;
|
|
3406
|
+
var _emscripten_get_heap_max = () => BigInt(getHeapMax());
|
|
3407
|
+
var _emscripten_num_logical_cores = () =>
|
|
3408
|
+
ENVIRONMENT_IS_NODE
|
|
3409
|
+
? require("node:os").cpus().length
|
|
3410
|
+
: navigator["hardwareConcurrency"];
|
|
3411
|
+
var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment;
|
|
3412
|
+
var growMemory = (size) => {
|
|
3413
|
+
var oldHeapSize = wasmMemory.buffer.byteLength;
|
|
3414
|
+
var pages = ((size - oldHeapSize + 65535) / 65536) | 0;
|
|
3415
|
+
try {
|
|
3416
|
+
wasmMemory.grow(BigInt(pages));
|
|
3417
|
+
updateMemoryViews();
|
|
3418
|
+
return 1;
|
|
3419
|
+
} catch (e) {}
|
|
3420
|
+
};
|
|
3421
|
+
function _emscripten_resize_heap(requestedSize) {
|
|
3422
|
+
requestedSize = bigintToI53Checked(requestedSize);
|
|
3423
|
+
var oldSize = (growMemViews(), HEAPU8).length;
|
|
3424
|
+
if (requestedSize <= oldSize) {
|
|
3425
|
+
return false;
|
|
3426
|
+
}
|
|
3427
|
+
var maxHeapSize = getHeapMax();
|
|
3428
|
+
if (requestedSize > maxHeapSize) {
|
|
3429
|
+
return false;
|
|
3430
|
+
}
|
|
3431
|
+
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
|
|
3432
|
+
var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
|
|
3433
|
+
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);
|
|
3434
|
+
var newSize = Math.min(
|
|
3435
|
+
maxHeapSize,
|
|
3436
|
+
alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536),
|
|
3437
|
+
);
|
|
3438
|
+
var replacement = growMemory(newSize);
|
|
3439
|
+
if (replacement) {
|
|
3440
|
+
return true;
|
|
3441
|
+
}
|
|
3442
|
+
}
|
|
3443
|
+
return false;
|
|
3444
|
+
}
|
|
3445
|
+
var ENV = {};
|
|
3446
|
+
var getExecutableName = () => thisProgram;
|
|
3447
|
+
var getEnvStrings = () => {
|
|
3448
|
+
if (!getEnvStrings.strings) {
|
|
3449
|
+
var lang =
|
|
3450
|
+
(globalThis.navigator?.language ?? "C").replace("-", "_") + ".UTF-8";
|
|
3451
|
+
var env = {
|
|
3452
|
+
USER: "web_user",
|
|
3453
|
+
LOGNAME: "web_user",
|
|
3454
|
+
PATH: "/",
|
|
3455
|
+
PWD: "/",
|
|
3456
|
+
HOME: "/home/web_user",
|
|
3457
|
+
LANG: lang,
|
|
3458
|
+
_: getExecutableName(),
|
|
3459
|
+
};
|
|
3460
|
+
for (var x in ENV) {
|
|
3461
|
+
if (ENV[x] === undefined) delete env[x];
|
|
3462
|
+
else env[x] = ENV[x];
|
|
3463
|
+
}
|
|
3464
|
+
var strings = [];
|
|
3465
|
+
for (var x in env) {
|
|
3466
|
+
strings.push(`${x}=${env[x]}`);
|
|
3467
|
+
}
|
|
3468
|
+
getEnvStrings.strings = strings;
|
|
3469
|
+
}
|
|
3470
|
+
return getEnvStrings.strings;
|
|
3471
|
+
};
|
|
3472
|
+
function _environ_get(__environ, environ_buf) {
|
|
3473
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3474
|
+
return proxyToMainThread(6, 0, 1, __environ, environ_buf);
|
|
3475
|
+
__environ = bigintToI53Checked(__environ);
|
|
3476
|
+
environ_buf = bigintToI53Checked(environ_buf);
|
|
3477
|
+
var bufSize = 0;
|
|
3478
|
+
var envp = 0;
|
|
3479
|
+
for (var string of getEnvStrings()) {
|
|
3480
|
+
var ptr = environ_buf + bufSize;
|
|
3481
|
+
(growMemViews(), HEAPU64)[(__environ + envp) / 8] = BigInt(ptr);
|
|
3482
|
+
bufSize += stringToUTF8(string, ptr, Infinity) + 1;
|
|
3483
|
+
envp += 8;
|
|
3484
|
+
}
|
|
3485
|
+
return 0;
|
|
3486
|
+
}
|
|
3487
|
+
function _environ_sizes_get(penviron_count, penviron_buf_size) {
|
|
3488
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3489
|
+
return proxyToMainThread(7, 0, 1, penviron_count, penviron_buf_size);
|
|
3490
|
+
penviron_count = bigintToI53Checked(penviron_count);
|
|
3491
|
+
penviron_buf_size = bigintToI53Checked(penviron_buf_size);
|
|
3492
|
+
var strings = getEnvStrings();
|
|
3493
|
+
(growMemViews(), HEAPU64)[penviron_count / 8] = BigInt(strings.length);
|
|
3494
|
+
var bufSize = 0;
|
|
3495
|
+
for (var string of strings) {
|
|
3496
|
+
bufSize += lengthBytesUTF8(string) + 1;
|
|
3497
|
+
}
|
|
3498
|
+
(growMemViews(), HEAPU64)[penviron_buf_size / 8] = BigInt(bufSize);
|
|
3499
|
+
return 0;
|
|
3500
|
+
}
|
|
3501
|
+
function _fd_close(fd) {
|
|
3502
|
+
if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(8, 0, 1, fd);
|
|
3503
|
+
try {
|
|
3504
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3505
|
+
FS.close(stream);
|
|
3506
|
+
return 0;
|
|
3507
|
+
} catch (e) {
|
|
3508
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3509
|
+
return e.errno;
|
|
3510
|
+
}
|
|
3511
|
+
}
|
|
3512
|
+
function _fd_fdstat_get(fd, pbuf) {
|
|
3513
|
+
if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(9, 0, 1, fd, pbuf);
|
|
3514
|
+
pbuf = bigintToI53Checked(pbuf);
|
|
3515
|
+
try {
|
|
3516
|
+
var rightsBase = 0;
|
|
3517
|
+
var rightsInheriting = 0;
|
|
3518
|
+
var flags = 0;
|
|
3519
|
+
{
|
|
3520
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3521
|
+
var type = stream.tty
|
|
3522
|
+
? 2
|
|
3523
|
+
: FS.isDir(stream.mode)
|
|
3524
|
+
? 3
|
|
3525
|
+
: FS.isLink(stream.mode)
|
|
3526
|
+
? 7
|
|
3527
|
+
: 4;
|
|
3528
|
+
}
|
|
3529
|
+
(growMemViews(), HEAP8)[pbuf] = type;
|
|
3530
|
+
(growMemViews(), HEAP16)[(pbuf + 2) / 2] = flags;
|
|
3531
|
+
(growMemViews(), HEAP64)[(pbuf + 8) / 8] = BigInt(rightsBase);
|
|
3532
|
+
(growMemViews(), HEAP64)[(pbuf + 16) / 8] = BigInt(rightsInheriting);
|
|
3533
|
+
return 0;
|
|
3534
|
+
} catch (e) {
|
|
3535
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3536
|
+
return e.errno;
|
|
3537
|
+
}
|
|
3538
|
+
}
|
|
3539
|
+
var doReadv = (stream, iov, iovcnt, offset) => {
|
|
3540
|
+
var ret = 0;
|
|
3541
|
+
for (var i = 0; i < iovcnt; i++) {
|
|
3542
|
+
var ptr = Number((growMemViews(), HEAPU64)[iov / 8]);
|
|
3543
|
+
var len = Number((growMemViews(), HEAPU64)[(iov + 8) / 8]);
|
|
3544
|
+
iov += 16;
|
|
3545
|
+
try {
|
|
3546
|
+
var curr = FS.read(stream, (growMemViews(), HEAP8), ptr, len, offset);
|
|
3547
|
+
} catch (e) {
|
|
3548
|
+
if (
|
|
3549
|
+
ret > 0 &&
|
|
3550
|
+
e instanceof FS.ErrnoError &&
|
|
3551
|
+
(e.errno == 6 || e.errno == 6)
|
|
3552
|
+
) {
|
|
3553
|
+
break;
|
|
3554
|
+
}
|
|
3555
|
+
throw e;
|
|
3556
|
+
}
|
|
3557
|
+
if (curr < 0) return -1;
|
|
3558
|
+
ret += curr;
|
|
3559
|
+
if (curr < len) break;
|
|
3560
|
+
if (typeof offset != "undefined") {
|
|
3561
|
+
offset += curr;
|
|
3562
|
+
}
|
|
3563
|
+
}
|
|
3564
|
+
return ret;
|
|
3565
|
+
};
|
|
3566
|
+
function _fd_read(fd, iov, iovcnt, pnum) {
|
|
3567
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3568
|
+
return proxyToMainThread(10, 0, 1, fd, iov, iovcnt, pnum);
|
|
3569
|
+
iov = bigintToI53Checked(iov);
|
|
3570
|
+
iovcnt = bigintToI53Checked(iovcnt);
|
|
3571
|
+
pnum = bigintToI53Checked(pnum);
|
|
3572
|
+
try {
|
|
3573
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3574
|
+
var num = doReadv(stream, iov, iovcnt);
|
|
3575
|
+
(growMemViews(), HEAPU64)[pnum / 8] = BigInt(num);
|
|
3576
|
+
return 0;
|
|
3577
|
+
} catch (e) {
|
|
3578
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3579
|
+
return e.errno;
|
|
3580
|
+
}
|
|
3581
|
+
}
|
|
3582
|
+
function _fd_seek(fd, offset, whence, newOffset) {
|
|
3583
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3584
|
+
return proxyToMainThread(11, 0, 1, fd, offset, whence, newOffset);
|
|
3585
|
+
offset = bigintToI53Checked(offset);
|
|
3586
|
+
newOffset = bigintToI53Checked(newOffset);
|
|
3587
|
+
try {
|
|
3588
|
+
if (isNaN(offset)) return 22;
|
|
3589
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3590
|
+
FS.llseek(stream, offset, whence);
|
|
3591
|
+
(growMemViews(), HEAP64)[newOffset / 8] = BigInt(stream.position);
|
|
3592
|
+
if (stream.getdents && !offset && whence === 0) stream.getdents = null;
|
|
3593
|
+
return 0;
|
|
3594
|
+
} catch (e) {
|
|
3595
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3596
|
+
return e.errno;
|
|
3597
|
+
}
|
|
3598
|
+
}
|
|
3599
|
+
var doWritev = (stream, iov, iovcnt, offset) => {
|
|
3600
|
+
if (iovcnt == 1) {
|
|
3601
|
+
return FS.write(
|
|
3602
|
+
stream,
|
|
3603
|
+
(growMemViews(), HEAP8),
|
|
3604
|
+
Number((growMemViews(), HEAPU64)[iov / 8]),
|
|
3605
|
+
Number((growMemViews(), HEAPU64)[(iov + 8) / 8]),
|
|
3606
|
+
offset,
|
|
3607
|
+
);
|
|
3608
|
+
}
|
|
3609
|
+
var total = 0;
|
|
3610
|
+
for (var i = 0, p = iov; i < iovcnt; i++, p += 16) {
|
|
3611
|
+
total += Number((growMemViews(), HEAPU64)[(p + 8) / 8]);
|
|
3612
|
+
}
|
|
3613
|
+
var view = new Uint8Array(total);
|
|
3614
|
+
var voff = 0;
|
|
3615
|
+
for (var i = 0; i < iovcnt; i++, iov += 16) {
|
|
3616
|
+
var ptr = Number((growMemViews(), HEAPU64)[iov / 8]);
|
|
3617
|
+
var len = Number((growMemViews(), HEAPU64)[(iov + 8) / 8]);
|
|
3618
|
+
view.set((growMemViews(), HEAPU8).subarray(ptr, ptr + len), voff);
|
|
3619
|
+
voff += len;
|
|
3620
|
+
}
|
|
3621
|
+
return FS.write(stream, view, 0, total, offset);
|
|
3622
|
+
};
|
|
3623
|
+
function _fd_write(fd, iov, iovcnt, pnum) {
|
|
3624
|
+
if (ENVIRONMENT_IS_PTHREAD)
|
|
3625
|
+
return proxyToMainThread(12, 0, 1, fd, iov, iovcnt, pnum);
|
|
3626
|
+
iov = bigintToI53Checked(iov);
|
|
3627
|
+
iovcnt = bigintToI53Checked(iovcnt);
|
|
3628
|
+
pnum = bigintToI53Checked(pnum);
|
|
3629
|
+
try {
|
|
3630
|
+
var stream = SYSCALLS.getStreamFromFD(fd);
|
|
3631
|
+
var num = doWritev(stream, iov, iovcnt);
|
|
3632
|
+
(growMemViews(), HEAPU64)[pnum / 8] = BigInt(num);
|
|
3633
|
+
return 0;
|
|
3634
|
+
} catch (e) {
|
|
3635
|
+
if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
|
|
3636
|
+
return e.errno;
|
|
3637
|
+
}
|
|
3638
|
+
}
|
|
3639
|
+
var getCFunc = (ident) => {
|
|
3640
|
+
var func = Module["_" + ident];
|
|
3641
|
+
return func;
|
|
3642
|
+
};
|
|
3643
|
+
var writeArrayToMemory = (array, buffer) => {
|
|
3644
|
+
(growMemViews(), HEAP8).set(array, buffer);
|
|
3645
|
+
};
|
|
3646
|
+
var stringToUTF8OnStack = (str) => {
|
|
3647
|
+
var size = lengthBytesUTF8(str) + 1;
|
|
3648
|
+
var ret = stackAlloc(size);
|
|
3649
|
+
stringToUTF8(str, ret, size);
|
|
3650
|
+
return ret;
|
|
3651
|
+
};
|
|
3652
|
+
var ccall = (ident, returnType, argTypes, args, opts) => {
|
|
3653
|
+
var toC = {
|
|
3654
|
+
pointer: (p) => BigInt(p),
|
|
3655
|
+
string: (str) => {
|
|
3656
|
+
var ret = 0;
|
|
3657
|
+
if (str !== null && str !== undefined && str !== 0) {
|
|
3658
|
+
ret = stringToUTF8OnStack(str);
|
|
3659
|
+
}
|
|
3660
|
+
return BigInt(ret);
|
|
3661
|
+
},
|
|
3662
|
+
array: (arr) => {
|
|
3663
|
+
var ret = stackAlloc(arr.length);
|
|
3664
|
+
writeArrayToMemory(arr, ret);
|
|
3665
|
+
return BigInt(ret);
|
|
3666
|
+
},
|
|
3667
|
+
};
|
|
3668
|
+
function convertReturnValue(ret) {
|
|
3669
|
+
if (returnType === "string") {
|
|
3670
|
+
return UTF8ToString(Number(ret));
|
|
3671
|
+
}
|
|
3672
|
+
if (returnType === "pointer") return Number(ret);
|
|
3673
|
+
if (returnType === "boolean") return Boolean(ret);
|
|
3674
|
+
return ret;
|
|
3675
|
+
}
|
|
3676
|
+
var func = getCFunc(ident);
|
|
3677
|
+
var cArgs = [];
|
|
3678
|
+
var stack = 0;
|
|
3679
|
+
if (args) {
|
|
3680
|
+
for (var i = 0; i < args.length; i++) {
|
|
3681
|
+
var converter = toC[argTypes[i]];
|
|
3682
|
+
if (converter) {
|
|
3683
|
+
if (!stack) stack = stackSave();
|
|
3684
|
+
cArgs[i] = converter(args[i]);
|
|
3685
|
+
} else {
|
|
3686
|
+
cArgs[i] = args[i];
|
|
3687
|
+
}
|
|
3688
|
+
}
|
|
3689
|
+
}
|
|
3690
|
+
var ret = func(...cArgs);
|
|
3691
|
+
function onDone(ret) {
|
|
3692
|
+
if (stack) stackRestore(stack);
|
|
3693
|
+
return convertReturnValue(ret);
|
|
3694
|
+
}
|
|
3695
|
+
ret = onDone(ret);
|
|
3696
|
+
return ret;
|
|
3697
|
+
};
|
|
3698
|
+
var cwrap = (ident, returnType, argTypes, opts) => {
|
|
3699
|
+
var numericArgs =
|
|
3700
|
+
!argTypes ||
|
|
3701
|
+
argTypes.every((type) => type === "number" || type === "boolean");
|
|
3702
|
+
var numericRet = returnType !== "string";
|
|
3703
|
+
if (numericRet && numericArgs && !opts) {
|
|
3704
|
+
return getCFunc(ident);
|
|
3705
|
+
}
|
|
3706
|
+
return (...args) => ccall(ident, returnType, argTypes, args, opts);
|
|
3707
|
+
};
|
|
3708
|
+
var updateTableMap = (offset, count) => {
|
|
3709
|
+
if (functionsInTableMap) {
|
|
3710
|
+
for (var i = offset; i < offset + count; i++) {
|
|
3711
|
+
var item = getWasmTableEntry(i);
|
|
3712
|
+
if (item) {
|
|
3713
|
+
functionsInTableMap.set(item, i);
|
|
3714
|
+
}
|
|
3715
|
+
}
|
|
3716
|
+
}
|
|
3717
|
+
};
|
|
3718
|
+
var functionsInTableMap;
|
|
3719
|
+
var getFunctionAddress = (func) => {
|
|
3720
|
+
if (!functionsInTableMap) {
|
|
3721
|
+
functionsInTableMap = new WeakMap();
|
|
3722
|
+
updateTableMap(0, Number(wasmTable.length));
|
|
3723
|
+
}
|
|
3724
|
+
return functionsInTableMap.get(func) || 0;
|
|
3725
|
+
};
|
|
3726
|
+
var freeTableIndexes = [];
|
|
3727
|
+
var getEmptyTableSlot = () => {
|
|
3728
|
+
if (freeTableIndexes.length) {
|
|
3729
|
+
return freeTableIndexes.pop();
|
|
3730
|
+
}
|
|
3731
|
+
return wasmTable["grow"](1n);
|
|
3732
|
+
};
|
|
3733
|
+
var setWasmTableEntry = (idx, func) => {
|
|
3734
|
+
wasmTable.set(BigInt(idx), func);
|
|
3735
|
+
wasmTableMirror[idx] = wasmTable.get(BigInt(idx));
|
|
3736
|
+
};
|
|
3737
|
+
var uleb128EncodeWithLen = (arr) => {
|
|
3738
|
+
const n = arr.length;
|
|
3739
|
+
return [(n % 128) | 128, n >> 7, ...arr];
|
|
3740
|
+
};
|
|
3741
|
+
var wasmTypeCodes = { i: 127, p: 126, j: 126, f: 125, d: 124, e: 111 };
|
|
3742
|
+
var generateTypePack = (types) =>
|
|
3743
|
+
uleb128EncodeWithLen(
|
|
3744
|
+
Array.from(types, (type) => {
|
|
3745
|
+
var code = wasmTypeCodes[type];
|
|
3746
|
+
return code;
|
|
3747
|
+
}),
|
|
3748
|
+
);
|
|
3749
|
+
var convertJsFunctionToWasm = (func, sig) => {
|
|
3750
|
+
var bytes = Uint8Array.of(
|
|
3751
|
+
0,
|
|
3752
|
+
97,
|
|
3753
|
+
115,
|
|
3754
|
+
109,
|
|
3755
|
+
1,
|
|
3756
|
+
0,
|
|
3757
|
+
0,
|
|
3758
|
+
0,
|
|
3759
|
+
1,
|
|
3760
|
+
...uleb128EncodeWithLen([
|
|
3761
|
+
1,
|
|
3762
|
+
96,
|
|
3763
|
+
...generateTypePack(sig.slice(1)),
|
|
3764
|
+
...generateTypePack(sig[0] === "v" ? "" : sig[0]),
|
|
3765
|
+
]),
|
|
3766
|
+
2,
|
|
3767
|
+
7,
|
|
3768
|
+
1,
|
|
3769
|
+
1,
|
|
3770
|
+
101,
|
|
3771
|
+
1,
|
|
3772
|
+
102,
|
|
3773
|
+
0,
|
|
3774
|
+
0,
|
|
3775
|
+
7,
|
|
3776
|
+
5,
|
|
3777
|
+
1,
|
|
3778
|
+
1,
|
|
3779
|
+
102,
|
|
3780
|
+
0,
|
|
3781
|
+
0,
|
|
3782
|
+
);
|
|
3783
|
+
var module = new WebAssembly.Module(bytes);
|
|
3784
|
+
var instance = new WebAssembly.Instance(module, { e: { f: func } });
|
|
3785
|
+
var wrappedFunc = instance.exports["f"];
|
|
3786
|
+
return wrappedFunc;
|
|
3787
|
+
};
|
|
3788
|
+
var addFunction = (func, sig) => {
|
|
3789
|
+
var rtn = getFunctionAddress(func);
|
|
3790
|
+
if (rtn) {
|
|
3791
|
+
return rtn;
|
|
3792
|
+
}
|
|
3793
|
+
var ret = getEmptyTableSlot();
|
|
3794
|
+
try {
|
|
3795
|
+
setWasmTableEntry(ret, func);
|
|
3796
|
+
} catch (err) {
|
|
3797
|
+
if (!(err instanceof TypeError)) {
|
|
3798
|
+
throw err;
|
|
3799
|
+
}
|
|
3800
|
+
var wrapped = convertJsFunctionToWasm(func, sig);
|
|
3801
|
+
setWasmTableEntry(ret, wrapped);
|
|
3802
|
+
}
|
|
3803
|
+
functionsInTableMap.set(func, ret);
|
|
3804
|
+
return ret;
|
|
3805
|
+
};
|
|
3806
|
+
var HEAPF32;
|
|
3807
|
+
function getValue(ptr, type = "i8") {
|
|
3808
|
+
if (type.endsWith("*")) type = "*";
|
|
3809
|
+
switch (type) {
|
|
3810
|
+
case "i1":
|
|
3811
|
+
return (growMemViews(), HEAP8)[ptr];
|
|
3812
|
+
case "i8":
|
|
3813
|
+
return (growMemViews(), HEAP8)[ptr];
|
|
3814
|
+
case "i16":
|
|
3815
|
+
return (growMemViews(), HEAP16)[ptr / 2];
|
|
3816
|
+
case "i32":
|
|
3817
|
+
return (growMemViews(), HEAP32)[ptr / 4];
|
|
3818
|
+
case "i64":
|
|
3819
|
+
return (growMemViews(), HEAP64)[ptr / 8];
|
|
3820
|
+
case "float":
|
|
3821
|
+
return (growMemViews(), HEAPF32)[ptr / 4];
|
|
3822
|
+
case "double":
|
|
3823
|
+
return (growMemViews(), HEAPF64)[ptr / 8];
|
|
3824
|
+
case "*":
|
|
3825
|
+
return Number((growMemViews(), HEAPU64)[ptr / 8]);
|
|
3826
|
+
default:
|
|
3827
|
+
abort(`invalid type for getValue: ${type}`);
|
|
3828
|
+
}
|
|
3829
|
+
}
|
|
3830
|
+
function setValue(ptr, value, type = "i8") {
|
|
3831
|
+
if (type.endsWith("*")) type = "*";
|
|
3832
|
+
switch (type) {
|
|
3833
|
+
case "i1":
|
|
3834
|
+
(growMemViews(), HEAP8)[ptr] = value;
|
|
3835
|
+
break;
|
|
3836
|
+
case "i8":
|
|
3837
|
+
(growMemViews(), HEAP8)[ptr] = value;
|
|
3838
|
+
break;
|
|
3839
|
+
case "i16":
|
|
3840
|
+
(growMemViews(), HEAP16)[ptr / 2] = value;
|
|
3841
|
+
break;
|
|
3842
|
+
case "i32":
|
|
3843
|
+
(growMemViews(), HEAP32)[ptr / 4] = value;
|
|
3844
|
+
break;
|
|
3845
|
+
case "i64":
|
|
3846
|
+
(growMemViews(), HEAP64)[ptr / 8] = BigInt(value);
|
|
3847
|
+
break;
|
|
3848
|
+
case "float":
|
|
3849
|
+
(growMemViews(), HEAPF32)[ptr / 4] = value;
|
|
3850
|
+
break;
|
|
3851
|
+
case "double":
|
|
3852
|
+
(growMemViews(), HEAPF64)[ptr / 8] = value;
|
|
3853
|
+
break;
|
|
3854
|
+
case "*":
|
|
3855
|
+
(growMemViews(), HEAPU64)[ptr / 8] = BigInt(value);
|
|
3856
|
+
break;
|
|
3857
|
+
default:
|
|
3858
|
+
abort(`invalid type for setValue: ${type}`);
|
|
3859
|
+
}
|
|
3860
|
+
}
|
|
3861
|
+
PThread.init();
|
|
3862
|
+
FS.createPreloadedFile = FS_createPreloadedFile;
|
|
3863
|
+
FS.preloadFile = FS_preloadFile;
|
|
3864
|
+
FS.staticInit();
|
|
3865
|
+
{
|
|
3866
|
+
initMemory();
|
|
3867
|
+
if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"];
|
|
3868
|
+
if (Module["print"]) out = Module["print"];
|
|
3869
|
+
if (Module["printErr"]) err = Module["printErr"];
|
|
3870
|
+
if (Module["arguments"]) programArgs = Module["arguments"];
|
|
3871
|
+
if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
|
|
3872
|
+
var preInit = Module["preInit"];
|
|
3873
|
+
if (preInit) {
|
|
3874
|
+
if (typeof preInit == "function") Module["preInit"] = preInit = [preInit];
|
|
3875
|
+
while (preInit.length > 0) {
|
|
3876
|
+
preInit.shift()();
|
|
3877
|
+
}
|
|
3878
|
+
}
|
|
3879
|
+
}
|
|
3880
|
+
Module["ccall"] = ccall;
|
|
3881
|
+
Module["cwrap"] = cwrap;
|
|
3882
|
+
Module["addFunction"] = addFunction;
|
|
3883
|
+
Module["setValue"] = setValue;
|
|
3884
|
+
Module["getValue"] = getValue;
|
|
3885
|
+
var proxiedFunctionTable = [
|
|
3886
|
+
_proc_exit,
|
|
3887
|
+
exitOnMainThread,
|
|
3888
|
+
pthreadCreateProxied,
|
|
3889
|
+
___syscall_fcntl64,
|
|
3890
|
+
___syscall_ioctl,
|
|
3891
|
+
___syscall_openat,
|
|
3892
|
+
_environ_get,
|
|
3893
|
+
_environ_sizes_get,
|
|
3894
|
+
_fd_close,
|
|
3895
|
+
_fd_fdstat_get,
|
|
3896
|
+
_fd_read,
|
|
3897
|
+
_fd_seek,
|
|
3898
|
+
_fd_write,
|
|
3899
|
+
];
|
|
3900
|
+
var _baseInit,
|
|
3901
|
+
_videoInit,
|
|
3902
|
+
_videoUnInit,
|
|
3903
|
+
_baseUnInit,
|
|
3904
|
+
_decodeVideo,
|
|
3905
|
+
_decodeAudio,
|
|
3906
|
+
_encodeAudio,
|
|
3907
|
+
_free,
|
|
3908
|
+
__emscripten_tls_init,
|
|
3909
|
+
_pthread_self,
|
|
3910
|
+
_malloc,
|
|
3911
|
+
__emscripten_thread_init,
|
|
3912
|
+
___set_thread_state,
|
|
3913
|
+
__emscripten_thread_crashed,
|
|
3914
|
+
__emscripten_run_js_on_main_thread_done,
|
|
3915
|
+
__emscripten_run_js_on_main_thread,
|
|
3916
|
+
__emscripten_thread_free_data,
|
|
3917
|
+
__emscripten_thread_exit,
|
|
3918
|
+
__emscripten_check_mailbox,
|
|
3919
|
+
_emscripten_stack_set_limits,
|
|
3920
|
+
__emscripten_stack_restore,
|
|
3921
|
+
__emscripten_stack_alloc,
|
|
3922
|
+
_emscripten_stack_get_current,
|
|
3923
|
+
__indirect_function_table,
|
|
3924
|
+
_ff_h264_cabac_tables,
|
|
3925
|
+
wasmTable;
|
|
3926
|
+
function assignWasmExports(wasmExports) {
|
|
3927
|
+
_baseInit = Module["_baseInit"] = wasmExports["G"];
|
|
3928
|
+
_videoInit = Module["_videoInit"] = wasmExports["H"];
|
|
3929
|
+
_videoUnInit = Module["_videoUnInit"] = wasmExports["I"];
|
|
3930
|
+
_baseUnInit = Module["_baseUnInit"] = wasmExports["J"];
|
|
3931
|
+
_decodeVideo = Module["_decodeVideo"] = wasmExports["K"];
|
|
3932
|
+
_decodeAudio = Module["_decodeAudio"] = wasmExports["L"];
|
|
3933
|
+
_encodeAudio = Module["_encodeAudio"] = wasmExports["M"];
|
|
3934
|
+
_free = Module["_free"] = wasmExports["O"];
|
|
3935
|
+
__emscripten_tls_init = wasmExports["P"];
|
|
3936
|
+
_pthread_self = wasmExports["Q"];
|
|
3937
|
+
_malloc = Module["_malloc"] = wasmExports["R"];
|
|
3938
|
+
__emscripten_thread_init = wasmExports["S"];
|
|
3939
|
+
___set_thread_state = wasmExports["T"];
|
|
3940
|
+
__emscripten_thread_crashed = wasmExports["U"];
|
|
3941
|
+
__emscripten_run_js_on_main_thread_done = wasmExports["V"];
|
|
3942
|
+
__emscripten_run_js_on_main_thread = wasmExports["W"];
|
|
3943
|
+
__emscripten_thread_free_data = wasmExports["X"];
|
|
3944
|
+
__emscripten_thread_exit = wasmExports["Y"];
|
|
3945
|
+
__emscripten_check_mailbox = wasmExports["Z"];
|
|
3946
|
+
_emscripten_stack_set_limits = wasmExports["_"];
|
|
3947
|
+
__emscripten_stack_restore = wasmExports["$"];
|
|
3948
|
+
__emscripten_stack_alloc = wasmExports["aa"];
|
|
3949
|
+
_emscripten_stack_get_current = wasmExports["ba"];
|
|
3950
|
+
__indirect_function_table = wasmTable = wasmExports["F"];
|
|
3951
|
+
_ff_h264_cabac_tables = Module["_ff_h264_cabac_tables"] = Number(
|
|
3952
|
+
wasmExports["N"].value,
|
|
3953
|
+
);
|
|
3954
|
+
}
|
|
3955
|
+
var wasmImports;
|
|
3956
|
+
function assignWasmImports() {
|
|
3957
|
+
wasmImports = {
|
|
3958
|
+
s: ___pthread_create_js,
|
|
3959
|
+
b: ___syscall_fcntl64,
|
|
3960
|
+
D: ___syscall_ioctl,
|
|
3961
|
+
u: ___syscall_openat,
|
|
3962
|
+
l: __abort_js,
|
|
3963
|
+
z: __emscripten_init_main_thread_js,
|
|
3964
|
+
o: __emscripten_notify_mailbox_postmessage,
|
|
3965
|
+
f: __emscripten_receive_on_main_thread_js,
|
|
3966
|
+
d: __emscripten_thread_cleanup,
|
|
3967
|
+
y: __emscripten_thread_mailbox_await,
|
|
3968
|
+
i: __emscripten_thread_set_strongref,
|
|
3969
|
+
v: __localtime_js,
|
|
3970
|
+
w: __tzset_js,
|
|
3971
|
+
k: _clock_time_get,
|
|
3972
|
+
e: _emscripten_check_blocking_allowed,
|
|
3973
|
+
j: _emscripten_date_now,
|
|
3974
|
+
h: _emscripten_exit_with_live_runtime,
|
|
3975
|
+
p: _emscripten_get_heap_max,
|
|
3976
|
+
g: _emscripten_get_now,
|
|
3977
|
+
q: _emscripten_num_logical_cores,
|
|
3978
|
+
n: _emscripten_resize_heap,
|
|
3979
|
+
B: _environ_get,
|
|
3980
|
+
C: _environ_sizes_get,
|
|
3981
|
+
r: _exit,
|
|
3982
|
+
t: _fd_close,
|
|
3983
|
+
A: _fd_fdstat_get,
|
|
3984
|
+
m: _fd_read,
|
|
3985
|
+
x: _fd_seek,
|
|
3986
|
+
c: _fd_write,
|
|
3987
|
+
a: wasmMemory,
|
|
3988
|
+
};
|
|
3989
|
+
}
|
|
3990
|
+
function applySignatureConversions(wasmExports) {
|
|
3991
|
+
wasmExports = Object.assign({}, wasmExports);
|
|
3992
|
+
var makeWrapper__p = (f) => (a0) => f(BigInt(a0));
|
|
3993
|
+
var makeWrapper_p = (f) => () => Number(f());
|
|
3994
|
+
var makeWrapper_pp = (f) => (a0) => Number(f(BigInt(a0)));
|
|
3995
|
+
var makeWrapper__p_____ = (f) => (a0, a1, a2, a3, a4, a5) =>
|
|
3996
|
+
f(BigInt(a0), a1, a2, a3, a4, a5);
|
|
3997
|
+
var makeWrapper__p___ = (f) => (a0, a1, a2, a3) => f(BigInt(a0), a1, a2, a3);
|
|
3998
|
+
var makeWrapper__pp_ = (f) => (a0, a1, a2) => f(BigInt(a0), BigInt(a1), a2);
|
|
3999
|
+
var makeWrapper___p_p_ = (f) => (a0, a1, a2, a3, a4) =>
|
|
4000
|
+
f(a0, BigInt(a1), a2, BigInt(a3), a4);
|
|
4001
|
+
var makeWrapper__pp = (f) => (a0, a1) => f(BigInt(a0), BigInt(a1));
|
|
4002
|
+
wasmExports["O"] = makeWrapper__p(wasmExports["O"]);
|
|
4003
|
+
wasmExports["P"] = makeWrapper_p(wasmExports["P"]);
|
|
4004
|
+
wasmExports["Q"] = makeWrapper_p(wasmExports["Q"]);
|
|
4005
|
+
wasmExports["R"] = makeWrapper_pp(wasmExports["R"]);
|
|
4006
|
+
wasmExports["S"] = makeWrapper__p_____(wasmExports["S"]);
|
|
4007
|
+
wasmExports["T"] = makeWrapper__p___(wasmExports["T"]);
|
|
4008
|
+
wasmExports["V"] = makeWrapper__pp_(wasmExports["V"]);
|
|
4009
|
+
wasmExports["W"] = makeWrapper___p_p_(wasmExports["W"]);
|
|
4010
|
+
wasmExports["X"] = makeWrapper__p(wasmExports["X"]);
|
|
4011
|
+
wasmExports["Y"] = makeWrapper__p(wasmExports["Y"]);
|
|
4012
|
+
wasmExports["_"] = makeWrapper__pp(wasmExports["_"]);
|
|
4013
|
+
wasmExports["$"] = makeWrapper__p(wasmExports["$"]);
|
|
4014
|
+
wasmExports["aa"] = makeWrapper_pp(wasmExports["aa"]);
|
|
4015
|
+
wasmExports["ba"] = makeWrapper_p(wasmExports["ba"]);
|
|
4016
|
+
return wasmExports;
|
|
4017
|
+
}
|
|
4018
|
+
async function run() {
|
|
4019
|
+
if (ENVIRONMENT_IS_PTHREAD) {
|
|
4020
|
+
initRuntime();
|
|
4021
|
+
return;
|
|
4022
|
+
}
|
|
4023
|
+
preRun();
|
|
4024
|
+
if (runDependencies) {
|
|
4025
|
+
await resolveRunDependencies();
|
|
4026
|
+
}
|
|
4027
|
+
var setStatus = Module["setStatus"];
|
|
4028
|
+
if (setStatus) {
|
|
4029
|
+
setStatus("Running...");
|
|
4030
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
4031
|
+
setTimeout(setStatus, 1, "");
|
|
4032
|
+
}
|
|
4033
|
+
if (ABORT) return;
|
|
4034
|
+
initRuntime();
|
|
4035
|
+
Module["onRuntimeInitialized"]?.();
|
|
4036
|
+
postRun();
|
|
4037
|
+
}
|
|
4038
|
+
var wasmExports;
|
|
4039
|
+
if (!ENVIRONMENT_IS_PTHREAD) {
|
|
4040
|
+
createWasm().then(() => run());
|
|
4041
|
+
}
|