@novolobos/nodevm 3.10.5

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.
@@ -0,0 +1,461 @@
1
+ /* global host, data, VMError */
2
+
3
+ 'use strict';
4
+
5
+ const LocalError = Error;
6
+ const LocalTypeError = TypeError;
7
+ const LocalWeakMap = WeakMap;
8
+
9
+ const {
10
+ apply: localReflectApply,
11
+ defineProperty: localReflectDefineProperty
12
+ } = Reflect;
13
+
14
+ const {
15
+ set: localWeakMapSet,
16
+ get: localWeakMapGet
17
+ } = LocalWeakMap.prototype;
18
+
19
+ const {
20
+ isArray: localArrayIsArray
21
+ } = Array;
22
+
23
+ function uncurryThis(func) {
24
+ return (thiz, ...args) => localReflectApply(func, thiz, args);
25
+ }
26
+
27
+ const localArrayPrototypeSlice = uncurryThis(Array.prototype.slice);
28
+ const localArrayPrototypeIncludes = uncurryThis(Array.prototype.includes);
29
+ const localArrayPrototypePush = uncurryThis(Array.prototype.push);
30
+ const localArrayPrototypeIndexOf = uncurryThis(Array.prototype.indexOf);
31
+ const localArrayPrototypeSplice = uncurryThis(Array.prototype.splice);
32
+ const localStringPrototypeStartsWith = uncurryThis(String.prototype.startsWith);
33
+ const localStringPrototypeSlice = uncurryThis(String.prototype.slice);
34
+ const localStringPrototypeIndexOf = uncurryThis(String.prototype.indexOf);
35
+
36
+ const {
37
+ argv: optionArgv,
38
+ env: optionEnv,
39
+ console: optionConsole,
40
+ extensions,
41
+ emitArgs,
42
+ globalPaths,
43
+ getLookupPathsFor,
44
+ resolve: resolve0,
45
+ lookupPaths,
46
+ loadBuiltinModule,
47
+ registerModule,
48
+ builtinModules,
49
+ dirname,
50
+ basename
51
+ } = data;
52
+
53
+ function ensureSandboxArray(a) {
54
+ return localArrayPrototypeSlice(a);
55
+ }
56
+
57
+ class Module {
58
+
59
+ constructor(id, path, parent) {
60
+ this.id = id;
61
+ this.filename = id;
62
+ this.path = path;
63
+ this.parent = parent;
64
+ this.loaded = false;
65
+ this.paths = path ? ensureSandboxArray(getLookupPathsFor(path)) : [];
66
+ this.children = [];
67
+ this.exports = {};
68
+ }
69
+
70
+ _updateChildren(child, isNew) {
71
+ const children = this.children;
72
+ if (children && (isNew || !localArrayPrototypeIncludes(children, child))) {
73
+ localArrayPrototypePush(children, child);
74
+ }
75
+ }
76
+
77
+ require(id) {
78
+ return requireImpl(this, id, false);
79
+ }
80
+
81
+ }
82
+
83
+ const originalRequire = Module.prototype.require;
84
+ const cacheBuiltins = {__proto__: null};
85
+
86
+ function requireImpl(mod, id, direct) {
87
+ if (direct && mod.require !== originalRequire) {
88
+ return mod.require(id);
89
+ }
90
+ const filename = resolve0(mod, id, undefined, Module._extensions, direct);
91
+ if (localStringPrototypeStartsWith(filename, 'node:')) {
92
+ id = localStringPrototypeSlice(filename, 5);
93
+ let nmod = cacheBuiltins[id];
94
+ if (!nmod) {
95
+ nmod = loadBuiltinModule(id);
96
+ if (!nmod) throw new VMError(`Cannot find module '${filename}'`, 'ENOTFOUND');
97
+ cacheBuiltins[id] = nmod;
98
+ }
99
+ return nmod;
100
+ }
101
+
102
+ const cachedModule = Module._cache[filename];
103
+ if (cachedModule !== undefined) {
104
+ mod._updateChildren(cachedModule, false);
105
+ return cachedModule.exports;
106
+ }
107
+
108
+ let nmod = cacheBuiltins[id];
109
+ if (nmod) return nmod;
110
+ nmod = loadBuiltinModule(id);
111
+ if (nmod) {
112
+ cacheBuiltins[id] = nmod;
113
+ return nmod;
114
+ }
115
+
116
+ const path = dirname(filename);
117
+ const module = new Module(filename, path, mod);
118
+ registerModule(module, filename, path, mod, direct);
119
+ mod._updateChildren(module, true);
120
+ try {
121
+ Module._cache[filename] = module;
122
+ const handler = findBestExtensionHandler(filename);
123
+ handler(module, filename);
124
+ module.loaded = true;
125
+ } catch (e) {
126
+ delete Module._cache[filename];
127
+ const children = mod.children;
128
+ if (localArrayIsArray(children)) {
129
+ const index = localArrayPrototypeIndexOf(children, module);
130
+ if (index !== -1) {
131
+ localArrayPrototypeSplice(children, index, 1);
132
+ }
133
+ }
134
+ throw e;
135
+ }
136
+
137
+ return module.exports;
138
+ }
139
+
140
+ Module.builtinModules = ensureSandboxArray(builtinModules);
141
+ Module.globalPaths = ensureSandboxArray(globalPaths);
142
+ Module._extensions = {__proto__: null};
143
+ Module._cache = {__proto__: null};
144
+
145
+ {
146
+ const keys = Object.getOwnPropertyNames(extensions);
147
+ for (let i = 0; i < keys.length; i++) {
148
+ const key = keys[i];
149
+ const handler = extensions[key];
150
+ Module._extensions[key] = (mod, filename) => handler(mod, filename);
151
+ }
152
+ }
153
+
154
+ function findBestExtensionHandler(filename) {
155
+ const name = basename(filename);
156
+ for (let i = 0; (i = localStringPrototypeIndexOf(name, '.', i + 1)) !== -1;) {
157
+ const ext = localStringPrototypeSlice(name, i);
158
+ const handler = Module._extensions[ext];
159
+ if (handler) return handler;
160
+ }
161
+ const js = Module._extensions['.js'];
162
+ if (js) return js;
163
+ const keys = Object.getOwnPropertyNames(Module._extensions);
164
+ if (keys.length === 0) throw new VMError(`Failed to load '${filename}': Unknown type.`, 'ELOADFAIL');
165
+ return Module._extensions[keys[0]];
166
+ }
167
+
168
+ function createRequireForModule(mod) {
169
+ // eslint-disable-next-line no-shadow
170
+ function require(id) {
171
+ return requireImpl(mod, id, true);
172
+ }
173
+ function resolve(id, options) {
174
+ return resolve0(mod, id, options, Module._extensions, true);
175
+ }
176
+ require.resolve = resolve;
177
+ function paths(id) {
178
+ return ensureSandboxArray(lookupPaths(mod, id));
179
+ }
180
+ resolve.paths = paths;
181
+
182
+ require.extensions = Module._extensions;
183
+
184
+ require.cache = Module._cache;
185
+
186
+ return require;
187
+ }
188
+
189
+ /**
190
+ * Prepare sandbox.
191
+ */
192
+
193
+ const TIMERS = new LocalWeakMap();
194
+
195
+ class Timeout {
196
+ }
197
+
198
+ class Interval {
199
+ }
200
+
201
+ class Immediate {
202
+ }
203
+
204
+ function clearTimer(timer) {
205
+ const obj = localReflectApply(localWeakMapGet, TIMERS, [timer]);
206
+ if (obj) {
207
+ obj.clear(obj.value);
208
+ }
209
+ }
210
+
211
+ // This is a function and not an arrow function, since the original is also a function
212
+ // eslint-disable-next-line no-shadow
213
+ global.setTimeout = function setTimeout(callback, delay, ...args) {
214
+ if (typeof callback !== 'function') throw new LocalTypeError('"callback" argument must be a function');
215
+ const obj = new Timeout(callback, args);
216
+ const cb = () => {
217
+ localReflectApply(callback, null, args);
218
+ };
219
+ const tmr = host.setTimeout(cb, delay);
220
+
221
+ const ref = {
222
+ __proto__: null,
223
+ clear: host.clearTimeout,
224
+ value: tmr
225
+ };
226
+
227
+ localReflectApply(localWeakMapSet, TIMERS, [obj, ref]);
228
+ return obj;
229
+ };
230
+
231
+ // eslint-disable-next-line no-shadow
232
+ global.setInterval = function setInterval(callback, interval, ...args) {
233
+ if (typeof callback !== 'function') throw new LocalTypeError('"callback" argument must be a function');
234
+ const obj = new Interval();
235
+ const cb = () => {
236
+ localReflectApply(callback, null, args);
237
+ };
238
+ const tmr = host.setInterval(cb, interval);
239
+
240
+ const ref = {
241
+ __proto__: null,
242
+ clear: host.clearInterval,
243
+ value: tmr
244
+ };
245
+
246
+ localReflectApply(localWeakMapSet, TIMERS, [obj, ref]);
247
+ return obj;
248
+ };
249
+
250
+ // eslint-disable-next-line no-shadow
251
+ global.setImmediate = function setImmediate(callback, ...args) {
252
+ if (typeof callback !== 'function') throw new LocalTypeError('"callback" argument must be a function');
253
+ const obj = new Immediate();
254
+ const cb = () => {
255
+ localReflectApply(callback, null, args);
256
+ };
257
+ const tmr = host.setImmediate(cb);
258
+
259
+ const ref = {
260
+ __proto__: null,
261
+ clear: host.clearImmediate,
262
+ value: tmr
263
+ };
264
+
265
+ localReflectApply(localWeakMapSet, TIMERS, [obj, ref]);
266
+ return obj;
267
+ };
268
+
269
+ // eslint-disable-next-line no-shadow
270
+ global.clearTimeout = function clearTimeout(timeout) {
271
+ clearTimer(timeout);
272
+ };
273
+
274
+ // eslint-disable-next-line no-shadow
275
+ global.clearInterval = function clearInterval(interval) {
276
+ clearTimer(interval);
277
+ };
278
+
279
+ // eslint-disable-next-line no-shadow
280
+ global.clearImmediate = function clearImmediate(immediate) {
281
+ clearTimer(immediate);
282
+ };
283
+
284
+ const localProcess = host.process;
285
+
286
+ const LISTENERS = new LocalWeakMap();
287
+ const LISTENER_HANDLER = new LocalWeakMap();
288
+
289
+ /**
290
+ *
291
+ * @param {*} name
292
+ * @param {*} handler
293
+ * @this process
294
+ * @return {this}
295
+ */
296
+ function addListener(name, handler) {
297
+ if (name !== 'beforeExit' && name !== 'exit') {
298
+ throw new LocalError(`Access denied to listen for '${name}' event.`);
299
+ }
300
+
301
+ let cb = localReflectApply(localWeakMapGet, LISTENERS, [handler]);
302
+ if (!cb) {
303
+ cb = () => {
304
+ handler();
305
+ };
306
+ localReflectApply(localWeakMapSet, LISTENER_HANDLER, [cb, handler]);
307
+ localReflectApply(localWeakMapSet, LISTENERS, [handler, cb]);
308
+ }
309
+
310
+ localProcess.on(name, cb);
311
+
312
+ return this;
313
+ }
314
+
315
+ /**
316
+ *
317
+ * @this process
318
+ * @return {this}
319
+ */
320
+ // eslint-disable-next-line no-shadow
321
+ function process() {
322
+ return this;
323
+ }
324
+
325
+ const baseUptime = localProcess.uptime();
326
+
327
+ // FIXME wrong class structure
328
+ global.process = {
329
+ __proto__: process.prototype,
330
+ argv: optionArgv !== undefined ? optionArgv : [],
331
+ title: localProcess.title,
332
+ version: localProcess.version,
333
+ versions: localProcess.versions,
334
+ arch: localProcess.arch,
335
+ platform: localProcess.platform,
336
+ env: optionEnv !== undefined ? optionEnv : {},
337
+ pid: localProcess.pid,
338
+ features: localProcess.features,
339
+ nextTick: function nextTick(callback, ...args) {
340
+ if (typeof callback !== 'function') {
341
+ throw new LocalError('Callback must be a function.');
342
+ }
343
+
344
+ localProcess.nextTick(()=>{
345
+ localReflectApply(callback, null, args);
346
+ });
347
+ },
348
+ hrtime: function hrtime(time) {
349
+ return localProcess.hrtime(time);
350
+ },
351
+ uptime: function uptime() {
352
+ return localProcess.uptime() - baseUptime;
353
+ },
354
+ cwd: function cwd() {
355
+ return localProcess.cwd();
356
+ },
357
+ addListener,
358
+ on: addListener,
359
+
360
+ once: function once(name, handler) {
361
+ if (name !== 'beforeExit' && name !== 'exit') {
362
+ throw new LocalError(`Access denied to listen for '${name}' event.`);
363
+ }
364
+
365
+ let triggered = false;
366
+ const cb = () => {
367
+ if (triggered) return;
368
+ triggered = true;
369
+ localProcess.removeListener(name, cb);
370
+ handler();
371
+ };
372
+ localReflectApply(localWeakMapSet, LISTENER_HANDLER, [cb, handler]);
373
+
374
+ localProcess.on(name, cb);
375
+
376
+ return this;
377
+ },
378
+
379
+ listeners: function listeners(name) {
380
+ if (name !== 'beforeExit' && name !== 'exit') {
381
+ // Maybe add ({__proto__:null})[name] to throw when name fails in https://tc39.es/ecma262/#sec-topropertykey.
382
+ return [];
383
+ }
384
+
385
+ // Filter out listeners, which were not created in this sandbox
386
+ const all = localProcess.listeners(name);
387
+ const filtered = [];
388
+ let j = 0;
389
+ for (let i = 0; i < all.length; i++) {
390
+ const h = localReflectApply(localWeakMapGet, LISTENER_HANDLER, [all[i]]);
391
+ if (h) {
392
+ if (!localReflectDefineProperty(filtered, j, {
393
+ __proto__: null,
394
+ value: h,
395
+ writable: true,
396
+ enumerable: true,
397
+ configurable: true
398
+ })) throw new LocalError('Unexpected');
399
+ j++;
400
+ }
401
+ }
402
+ return filtered;
403
+ },
404
+
405
+ removeListener: function removeListener(name, handler) {
406
+ if (name !== 'beforeExit' && name !== 'exit') {
407
+ return this;
408
+ }
409
+
410
+ const cb = localReflectApply(localWeakMapGet, LISTENERS, [handler]);
411
+ if (cb) localProcess.removeListener(name, cb);
412
+
413
+ return this;
414
+ },
415
+
416
+ umask: function umask() {
417
+ if (arguments.length) {
418
+ throw new LocalError('Access denied to set umask.');
419
+ }
420
+
421
+ return localProcess.umask();
422
+ }
423
+ };
424
+
425
+ if (optionConsole === 'inherit') {
426
+ global.console = host.console;
427
+ } else if (optionConsole === 'redirect') {
428
+ global.console = {
429
+ debug(...args) {
430
+ emitArgs('console.debug', args);
431
+ },
432
+ log(...args) {
433
+ emitArgs('console.log', args);
434
+ },
435
+ info(...args) {
436
+ emitArgs('console.info', args);
437
+ },
438
+ warn(...args) {
439
+ emitArgs('console.warn', args);
440
+ },
441
+ error(...args) {
442
+ emitArgs('console.error', args);
443
+ },
444
+ dir(...args) {
445
+ emitArgs('console.dir', args);
446
+ },
447
+ time() {},
448
+ timeEnd() {},
449
+ trace(...args) {
450
+ emitArgs('console.trace', args);
451
+ }
452
+ };
453
+ }
454
+
455
+ return {
456
+ __proto__: null,
457
+ Module,
458
+ jsonParse: JSON.parse,
459
+ createRequireForModule,
460
+ requireImpl
461
+ };