|
2 | 2 | // Use of this source code is governed by a BSD-style
|
3 | 3 | // license that can be found in the LICENSE file.
|
4 | 4 |
|
5 |
| -(() => { |
6 |
| - // Map multiple JavaScript environments to a single common API, |
7 |
| - // preferring web standards over Node.js API. |
8 |
| - // |
9 |
| - // Environments considered: |
10 |
| - // - Browsers |
11 |
| - // - Node.js |
12 |
| - // - Electron |
13 |
| - // - Parcel |
14 |
| - // - Webpack |
15 |
| - |
16 |
| - if (typeof global !== 'undefined') { |
17 |
| - // global already exists |
18 |
| - } else if (typeof window !== 'undefined') { |
19 |
| - window.global = window; |
20 |
| - } else if (typeof self !== 'undefined') { |
21 |
| - self.global = self; |
22 |
| - } else { |
23 |
| - throw new Error('cannot export Go (neither global, window nor self is defined)'); |
24 |
| - } |
25 |
| - |
26 |
| - if (!global.require && typeof require !== 'undefined') { |
27 |
| - global.require = require; |
28 |
| - } |
29 |
| - |
30 |
| - if (!global.fs && global.require) { |
31 |
| - const fs = require('fs'); |
32 |
| - if (typeof fs === 'object' && fs !== null && Object.keys(fs).length !== 0) { |
33 |
| - global.fs = fs; |
34 |
| - } |
35 |
| - } |
| 5 | +'use strict'; |
36 | 6 |
|
| 7 | +(() => { |
37 | 8 | const enosys = () => {
|
38 | 9 | const err = new Error('not implemented');
|
39 | 10 | err.code = 'ENOSYS';
|
40 | 11 | return err;
|
41 | 12 | };
|
42 | 13 |
|
43 |
| - if (!global.fs) { |
| 14 | + if (!globalThis.fs) { |
44 | 15 | let outputBuf = '';
|
45 |
| - global.fs = { |
| 16 | + globalThis.fs = { |
46 | 17 | constants: {
|
47 | 18 | O_WRONLY: -1,
|
48 | 19 | O_RDWR: -1,
|
|
140 | 111 | };
|
141 | 112 | }
|
142 | 113 |
|
143 |
| - if (!global.process) { |
144 |
| - global.process = { |
| 114 | + if (!globalThis.process) { |
| 115 | + globalThis.process = { |
145 | 116 | getuid() {
|
146 | 117 | return -1;
|
147 | 118 | },
|
|
171 | 142 | }
|
172 | 143 | }
|
173 | 144 |
|
174 |
| - if (!global.crypto && global.require) { |
175 |
| - const nodeCrypto = require('crypto'); |
176 |
| - global.crypto = { |
177 |
| - getRandomValues(b) { |
178 |
| - nodeCrypto.randomFillSync(b); |
179 |
| - }, |
180 |
| - }; |
181 |
| - } |
182 |
| - if (!global.crypto) { |
183 |
| - throw new Error('global.crypto is not available, polyfill required (getRandomValues only)'); |
| 145 | + if (!globalThis.crypto) { |
| 146 | + throw new Error('globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)'); |
184 | 147 | }
|
185 | 148 |
|
186 |
| - if (!global.performance) { |
187 |
| - global.performance = { |
188 |
| - now() { |
189 |
| - const [sec, nsec] = process.hrtime(); |
190 |
| - return sec * 1000 + nsec / 1000000; |
191 |
| - }, |
192 |
| - }; |
| 149 | + if (!globalThis.performance) { |
| 150 | + throw new Error('globalThis.performance is not available, polyfill required (performance.now only)'); |
193 | 151 | }
|
194 | 152 |
|
195 |
| - if (!global.TextEncoder && global.require) { |
196 |
| - global.TextEncoder = require('util').TextEncoder; |
197 |
| - } |
198 |
| - if (!global.TextEncoder) { |
199 |
| - throw new Error('global.TextEncoder is not available, polyfill required'); |
| 153 | + if (!globalThis.TextEncoder) { |
| 154 | + throw new Error('globalThis.TextEncoder is not available, polyfill required'); |
200 | 155 | }
|
201 | 156 |
|
202 |
| - if (!global.TextDecoder && global.require) { |
203 |
| - global.TextDecoder = require('util').TextDecoder; |
| 157 | + if (!globalThis.TextDecoder) { |
| 158 | + throw new Error('globalThis.TextDecoder is not available, polyfill required'); |
204 | 159 | }
|
205 |
| - if (!global.TextDecoder) { |
206 |
| - throw new Error('global.TextDecoder is not available, polyfill required'); |
207 |
| - } |
208 |
| - |
209 |
| - // End of polyfills for common API. |
210 | 160 |
|
211 | 161 | const encoder = new TextEncoder('utf-8');
|
212 | 162 | const decoder = new TextDecoder('utf-8');
|
213 | 163 |
|
214 |
| - global.Go = class { |
| 164 | + globalThis.Go = class { |
215 | 165 | constructor() {
|
216 | 166 | this.argv = ['js'];
|
217 | 167 | this.env = {};
|
|
586 | 536 | null,
|
587 | 537 | true,
|
588 | 538 | false,
|
589 |
| - global, |
| 539 | + globalThis, |
590 | 540 | this,
|
591 | 541 | ];
|
592 | 542 | this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id
|
|
595 | 545 | [null, 2],
|
596 | 546 | [true, 3],
|
597 | 547 | [false, 4],
|
598 |
| - [global, 5], |
| 548 | + [globalThis, 5], |
599 | 549 | [this, 6],
|
600 | 550 | ]);
|
601 | 551 | this._idPool = []; // unused ids that have been garbage collected
|
|
670 | 620 | };
|
671 | 621 | }
|
672 | 622 | }
|
673 |
| - |
674 |
| - if ( |
675 |
| - typeof module !== 'undefined' && |
676 |
| - global.require && |
677 |
| - global.require.main === module && |
678 |
| - global.process && |
679 |
| - global.process.versions && |
680 |
| - !global.process.versions.electron |
681 |
| - ) { |
682 |
| - if (process.argv.length < 3) { |
683 |
| - console.error('usage: go_js_wasm_exec [wasm binary] [arguments]'); |
684 |
| - process.exit(1); |
685 |
| - } |
686 |
| - |
687 |
| - const go = new Go(); |
688 |
| - go.argv = process.argv.slice(2); |
689 |
| - go.env = Object.assign({TMPDIR: require('os').tmpdir()}, process.env); |
690 |
| - go.exit = process.exit; |
691 |
| - WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { |
692 |
| - process.on('exit', (code) => { // Node.js exits if no event handler is pending |
693 |
| - if (code === 0 && !go.exited) { |
694 |
| - // deadlock, make Go print error and stack traces |
695 |
| - go._pendingEvent = {id: 0}; |
696 |
| - go._resume(); |
697 |
| - } |
698 |
| - }); |
699 |
| - return go.run(result.instance); |
700 |
| - }).catch((err) => { |
701 |
| - console.error(err); |
702 |
| - process.exit(1); |
703 |
| - }); |
704 |
| - } |
705 | 623 | })();
|
0 commit comments