| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| "use strict"; |
| |
| if (process.argv.length < 3) { |
| console.error("usage: go_js_wasm_exec [wasm binary] [arguments]"); |
| process.exit(1); |
| } |
| |
| globalThis.require = require; |
| globalThis.fs = require("fs"); |
| globalThis.TextEncoder = require("util").TextEncoder; |
| globalThis.TextDecoder = require("util").TextDecoder; |
| |
| globalThis.performance = { |
| now() { |
| const [sec, nsec] = process.hrtime(); |
| return sec * 1000 + nsec / 1000000; |
| }, |
| }; |
| |
| const crypto = require("crypto"); |
| globalThis.crypto = { |
| getRandomValues(b) { |
| crypto.randomFillSync(b); |
| }, |
| }; |
| |
| require("./wasm_exec"); |
| |
| const go = new Go(); |
| go.argv = process.argv.slice(2); |
| go.env = Object.assign({ TMPDIR: require("os").tmpdir() }, process.env); |
| go.exit = process.exit; |
| WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { |
| process.on("exit", (code) => { // Node.js exits if no event handler is pending |
| if (code === 0 && !go.exited) { |
| // deadlock, make Go print error and stack traces |
| go._pendingEvent = { id: 0 }; |
| go._resume(); |
| } |
| }); |
| return go.run(result.instance); |
| }).catch((err) => { |
| console.error(err); |
| process.exit(1); |
| }); |