// license that can be found in the LICENSE file.
(() => {
+ // Map multiple JavaScript environments to a single common API,
+ // preferring web standards over Node.js API.
+ //
+ // Environments considered:
+ // - Browsers
+ // - Node.js
+ // - Electron
+ // - Parcel
+
if (typeof global !== "undefined") {
// global already exists
} else if (typeof window !== "undefined") {
throw new Error("cannot export Go (neither global, window nor self is defined)");
}
- // Map web browser API and Node.js API to a single common API (preferring web standards over Node.js API).
- const isNodeJS = global.process && global.process.title === "node";
- if (isNodeJS) {
+ if (!global.require && typeof require !== "undefined") {
global.require = require;
- global.fs = require("fs");
-
- const nodeCrypto = require("crypto");
- global.crypto = {
- getRandomValues(b) {
- nodeCrypto.randomFillSync(b);
- },
- };
+ }
- global.performance = {
- now() {
- const [sec, nsec] = process.hrtime();
- return sec * 1000 + nsec / 1000000;
- },
- };
+ if (!global.fs && global.require) {
+ global.fs = require("fs");
+ }
- const util = require("util");
- global.TextEncoder = util.TextEncoder;
- global.TextDecoder = util.TextDecoder;
- } else {
+ if (!global.fs) {
let outputBuf = "";
global.fs = {
constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused
};
}
+ if (!global.crypto) {
+ const nodeCrypto = require("crypto");
+ global.crypto = {
+ getRandomValues(b) {
+ nodeCrypto.randomFillSync(b);
+ },
+ };
+ }
+
+ if (!global.performance) {
+ global.performance = {
+ now() {
+ const [sec, nsec] = process.hrtime();
+ return sec * 1000 + nsec / 1000000;
+ },
+ };
+ }
+
+ if (!global.TextEncoder) {
+ global.TextEncoder = require("util").TextEncoder;
+ }
+
+ if (!global.TextDecoder) {
+ global.TextDecoder = require("util").TextDecoder;
+ }
+
+ // End of polyfills for common API.
+
const encoder = new TextEncoder("utf-8");
const decoder = new TextDecoder("utf-8");
}
}
- if (isNodeJS) {
+ if (
+ global.require &&
+ global.require.main === module &&
+ global.process &&
+ global.process.versions &&
+ !global.process.versions.electron
+ ) {
if (process.argv.length < 3) {
process.stderr.write("usage: go_js_wasm_exec [wasm binary] [arguments]\n");
process.exit(1);