secure-exec 0.0.1 → 0.1.0-rc.1

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.
Files changed (112) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +7 -0
  3. package/dist/bridge/active-handles.d.ts +21 -0
  4. package/dist/bridge/active-handles.js +60 -0
  5. package/dist/bridge/child-process.d.ts +87 -0
  6. package/dist/bridge/child-process.js +523 -0
  7. package/dist/bridge/fs.d.ts +227 -0
  8. package/dist/bridge/fs.js +1572 -0
  9. package/dist/bridge/index.d.ts +10 -0
  10. package/dist/bridge/index.js +41 -0
  11. package/dist/bridge/module.d.ts +73 -0
  12. package/dist/bridge/module.js +329 -0
  13. package/dist/bridge/network.d.ts +208 -0
  14. package/dist/bridge/network.js +1117 -0
  15. package/dist/bridge/os.d.ts +13 -0
  16. package/dist/bridge/os.js +257 -0
  17. package/dist/bridge/polyfills.d.ts +2 -0
  18. package/dist/bridge/polyfills.js +12 -0
  19. package/dist/bridge/process.d.ts +64 -0
  20. package/dist/bridge/process.js +916 -0
  21. package/dist/bridge-loader.d.ts +1 -0
  22. package/dist/bridge-loader.js +2 -0
  23. package/dist/bridge-setup.d.ts +1 -0
  24. package/dist/bridge-setup.js +2 -0
  25. package/dist/bridge.js +10586 -0
  26. package/dist/browser/driver.d.ts +42 -0
  27. package/dist/browser/driver.js +263 -0
  28. package/dist/browser/index.d.ts +5 -0
  29. package/dist/browser/index.js +4 -0
  30. package/dist/browser/worker.d.ts +1 -0
  31. package/dist/browser/worker.js +3 -0
  32. package/dist/browser-runtime.d.ts +6 -0
  33. package/dist/browser-runtime.js +4 -0
  34. package/dist/esm-compiler.d.ts +1 -0
  35. package/dist/esm-compiler.js +2 -0
  36. package/dist/execution.d.ts +1 -0
  37. package/dist/execution.js +2 -0
  38. package/dist/fs-helpers.d.ts +2 -0
  39. package/dist/fs-helpers.js +1 -0
  40. package/dist/generated/isolate-runtime.d.ts +19 -0
  41. package/dist/generated/isolate-runtime.js +21 -0
  42. package/dist/generated/polyfills.d.ts +82 -0
  43. package/dist/generated/polyfills.js +82 -0
  44. package/dist/index.d.ts +15 -0
  45. package/dist/index.js +11 -0
  46. package/dist/isolate-runtime/apply-custom-global-policy.js +54 -0
  47. package/dist/isolate-runtime/apply-timing-mitigation-freeze.js +44 -0
  48. package/dist/isolate-runtime/apply-timing-mitigation-off.js +14 -0
  49. package/dist/isolate-runtime/bridge-attach.js +29 -0
  50. package/dist/isolate-runtime/bridge-initial-globals.js +78 -0
  51. package/dist/isolate-runtime/eval-script-result.js +8 -0
  52. package/dist/isolate-runtime/global-exposure-helpers.js +36 -0
  53. package/dist/isolate-runtime/init-commonjs-module-globals.js +28 -0
  54. package/dist/isolate-runtime/override-process-cwd.js +8 -0
  55. package/dist/isolate-runtime/override-process-env.js +8 -0
  56. package/dist/isolate-runtime/require-setup.js +606 -0
  57. package/dist/isolate-runtime/set-commonjs-file-globals.js +36 -0
  58. package/dist/isolate-runtime/set-stdin-data.js +10 -0
  59. package/dist/isolate-runtime/setup-dynamic-import.js +64 -0
  60. package/dist/isolate-runtime/setup-fs-facade.js +40 -0
  61. package/dist/isolate.d.ts +1 -0
  62. package/dist/isolate.js +2 -0
  63. package/dist/module-resolver.d.ts +1 -0
  64. package/dist/module-resolver.js +2 -0
  65. package/dist/node/bridge-setup.d.ts +1 -0
  66. package/dist/node/bridge-setup.js +2 -0
  67. package/dist/node/driver.d.ts +2 -0
  68. package/dist/node/driver.js +2 -0
  69. package/dist/node/esm-compiler.d.ts +1 -0
  70. package/dist/node/esm-compiler.js +2 -0
  71. package/dist/node/execution-driver.d.ts +2 -0
  72. package/dist/node/execution-driver.js +2 -0
  73. package/dist/node/execution-lifecycle.d.ts +1 -0
  74. package/dist/node/execution-lifecycle.js +2 -0
  75. package/dist/node/isolate-bootstrap.d.ts +2 -0
  76. package/dist/node/isolate-bootstrap.js +1 -0
  77. package/dist/node/module-access.d.ts +2 -0
  78. package/dist/node/module-access.js +2 -0
  79. package/dist/node/module-resolver.d.ts +1 -0
  80. package/dist/node/module-resolver.js +2 -0
  81. package/dist/package-bundler.d.ts +2 -0
  82. package/dist/package-bundler.js +1 -0
  83. package/dist/polyfills.d.ts +1 -0
  84. package/dist/polyfills.js +2 -0
  85. package/dist/python-runtime.d.ts +2 -0
  86. package/dist/python-runtime.js +2 -0
  87. package/dist/runtime-driver.d.ts +1 -0
  88. package/dist/runtime-driver.js +1 -0
  89. package/dist/runtime.d.ts +2 -0
  90. package/dist/runtime.js +2 -0
  91. package/dist/shared/api-types.d.ts +1 -0
  92. package/dist/shared/api-types.js +1 -0
  93. package/dist/shared/bridge-contract.d.ts +2 -0
  94. package/dist/shared/bridge-contract.js +1 -0
  95. package/dist/shared/console-formatter.d.ts +2 -0
  96. package/dist/shared/console-formatter.js +1 -0
  97. package/dist/shared/errors.d.ts +2 -0
  98. package/dist/shared/errors.js +1 -0
  99. package/dist/shared/esm-utils.d.ts +1 -0
  100. package/dist/shared/esm-utils.js +2 -0
  101. package/dist/shared/global-exposure.d.ts +2 -0
  102. package/dist/shared/global-exposure.js +1 -0
  103. package/dist/shared/in-memory-fs.d.ts +1 -0
  104. package/dist/shared/in-memory-fs.js +2 -0
  105. package/dist/shared/permissions.d.ts +1 -0
  106. package/dist/shared/permissions.js +2 -0
  107. package/dist/shared/require-setup.d.ts +1 -0
  108. package/dist/shared/require-setup.js +2 -0
  109. package/dist/types.d.ts +2 -0
  110. package/dist/types.js +1 -0
  111. package/package.json +51 -4
  112. package/index.js +0 -1
@@ -0,0 +1,916 @@
1
+ // @ts-nocheck
2
+ // Process module polyfill for isolated-vm
3
+ // Provides Node.js process object and global polyfills for sandbox compatibility
4
+ // Re-export TextEncoder/TextDecoder from polyfills (polyfills.ts is imported first in index.ts)
5
+ import { TextEncoder, TextDecoder } from "./polyfills";
6
+ // Use whatwg-url for spec-compliant URL implementation
7
+ import { URL as WhatwgURL, URLSearchParams as WhatwgURLSearchParams } from "whatwg-url";
8
+ // Use buffer package for spec-compliant Buffer implementation
9
+ import { Buffer as BufferPolyfill } from "buffer";
10
+ import { exposeCustomGlobal, exposeMutableRuntimeStateGlobal, } from "../shared/global-exposure.js";
11
+ // Get config with defaults
12
+ const config = {
13
+ platform: (typeof _processConfig !== "undefined" && _processConfig.platform) ||
14
+ "linux",
15
+ arch: (typeof _processConfig !== "undefined" && _processConfig.arch) || "x64",
16
+ version: (typeof _processConfig !== "undefined" && _processConfig.version) ||
17
+ "v22.0.0",
18
+ cwd: (typeof _processConfig !== "undefined" && _processConfig.cwd) || "/",
19
+ env: (typeof _processConfig !== "undefined" && _processConfig.env) || {},
20
+ argv: (typeof _processConfig !== "undefined" && _processConfig.argv) || [
21
+ "node",
22
+ "script.js",
23
+ ],
24
+ execPath: (typeof _processConfig !== "undefined" && _processConfig.execPath) ||
25
+ "/usr/bin/node",
26
+ pid: (typeof _processConfig !== "undefined" && _processConfig.pid) || 1,
27
+ ppid: (typeof _processConfig !== "undefined" && _processConfig.ppid) || 0,
28
+ uid: (typeof _processConfig !== "undefined" && _processConfig.uid) || 0,
29
+ gid: (typeof _processConfig !== "undefined" && _processConfig.gid) || 0,
30
+ timingMitigation: (typeof _processConfig !== "undefined" && _processConfig.timingMitigation) ||
31
+ "off",
32
+ frozenTimeMs: typeof _processConfig !== "undefined" ? _processConfig.frozenTimeMs : undefined,
33
+ };
34
+ function getNowMs() {
35
+ if (config.timingMitigation === "freeze" &&
36
+ typeof config.frozenTimeMs === "number") {
37
+ return config.frozenTimeMs;
38
+ }
39
+ return typeof performance !== "undefined" && performance.now
40
+ ? performance.now()
41
+ : Date.now();
42
+ }
43
+ // Start time for uptime calculation
44
+ const _processStartTime = getNowMs();
45
+ const BUFFER_MAX_LENGTH = typeof BufferPolyfill.kMaxLength ===
46
+ "number"
47
+ ? BufferPolyfill.kMaxLength
48
+ : 2147483647;
49
+ const BUFFER_MAX_STRING_LENGTH = typeof BufferPolyfill.kStringMaxLength ===
50
+ "number"
51
+ ? BufferPolyfill.kStringMaxLength
52
+ : 536870888;
53
+ const BUFFER_CONSTANTS = Object.freeze({
54
+ MAX_LENGTH: BUFFER_MAX_LENGTH,
55
+ MAX_STRING_LENGTH: BUFFER_MAX_STRING_LENGTH,
56
+ });
57
+ const bufferPolyfillMutable = BufferPolyfill;
58
+ if (typeof bufferPolyfillMutable.kMaxLength !== "number") {
59
+ bufferPolyfillMutable.kMaxLength = BUFFER_MAX_LENGTH;
60
+ }
61
+ if (typeof bufferPolyfillMutable.kStringMaxLength !== "number") {
62
+ bufferPolyfillMutable.kStringMaxLength = BUFFER_MAX_STRING_LENGTH;
63
+ }
64
+ if (typeof bufferPolyfillMutable.constants !== "object" ||
65
+ bufferPolyfillMutable.constants === null) {
66
+ bufferPolyfillMutable.constants = {
67
+ MAX_LENGTH: BUFFER_MAX_LENGTH,
68
+ MAX_STRING_LENGTH: BUFFER_MAX_STRING_LENGTH,
69
+ };
70
+ }
71
+ // Exit code tracking
72
+ let _exitCode = 0;
73
+ let _exited = false;
74
+ // ProcessExitError class for controlled exits
75
+ export class ProcessExitError extends Error {
76
+ code;
77
+ constructor(code) {
78
+ super("process.exit(" + code + ")");
79
+ this.name = "ProcessExitError";
80
+ this.code = code;
81
+ }
82
+ }
83
+ // Make available globally
84
+ exposeCustomGlobal("ProcessExitError", ProcessExitError);
85
+ const _processListeners = {};
86
+ const _processOnceListeners = {};
87
+ function _addListener(event, listener, once = false) {
88
+ const target = once ? _processOnceListeners : _processListeners;
89
+ if (!target[event]) {
90
+ target[event] = [];
91
+ }
92
+ target[event].push(listener);
93
+ return process;
94
+ }
95
+ function _removeListener(event, listener) {
96
+ if (_processListeners[event]) {
97
+ const idx = _processListeners[event].indexOf(listener);
98
+ if (idx !== -1)
99
+ _processListeners[event].splice(idx, 1);
100
+ }
101
+ if (_processOnceListeners[event]) {
102
+ const idx = _processOnceListeners[event].indexOf(listener);
103
+ if (idx !== -1)
104
+ _processOnceListeners[event].splice(idx, 1);
105
+ }
106
+ return process;
107
+ }
108
+ function _emit(event, ...args) {
109
+ let handled = false;
110
+ // Regular listeners
111
+ if (_processListeners[event]) {
112
+ for (const listener of _processListeners[event]) {
113
+ listener(...args);
114
+ handled = true;
115
+ }
116
+ }
117
+ // Once listeners (remove after calling)
118
+ if (_processOnceListeners[event]) {
119
+ const listeners = _processOnceListeners[event].slice();
120
+ _processOnceListeners[event] = [];
121
+ for (const listener of listeners) {
122
+ listener(...args);
123
+ handled = true;
124
+ }
125
+ }
126
+ return handled;
127
+ }
128
+ // Stdout stream
129
+ const _stdout = {
130
+ write(data) {
131
+ if (typeof _log !== "undefined") {
132
+ _log.applySync(undefined, [String(data).replace(/\n$/, "")]);
133
+ }
134
+ return true;
135
+ },
136
+ end() {
137
+ return this;
138
+ },
139
+ on() {
140
+ return this;
141
+ },
142
+ once() {
143
+ return this;
144
+ },
145
+ emit() {
146
+ return false;
147
+ },
148
+ writable: true,
149
+ isTTY: false,
150
+ columns: 80,
151
+ rows: 24,
152
+ };
153
+ // Stderr stream
154
+ const _stderr = {
155
+ write(data) {
156
+ if (typeof _error !== "undefined") {
157
+ _error.applySync(undefined, [String(data).replace(/\n$/, "")]);
158
+ }
159
+ return true;
160
+ },
161
+ end() {
162
+ return this;
163
+ },
164
+ on() {
165
+ return this;
166
+ },
167
+ once() {
168
+ return this;
169
+ },
170
+ emit() {
171
+ return false;
172
+ },
173
+ writable: true,
174
+ isTTY: false,
175
+ columns: 80,
176
+ rows: 24,
177
+ };
178
+ const _stdinListeners = {};
179
+ const _stdinOnceListeners = {};
180
+ // Initialize stdin state as globals for external access
181
+ exposeMutableRuntimeStateGlobal("_stdinData", (typeof _processConfig !== "undefined" && _processConfig.stdin) || "");
182
+ exposeMutableRuntimeStateGlobal("_stdinPosition", 0);
183
+ exposeMutableRuntimeStateGlobal("_stdinEnded", false);
184
+ exposeMutableRuntimeStateGlobal("_stdinFlowMode", false);
185
+ // Getters for the globals
186
+ function getStdinData() { return globalThis._stdinData; }
187
+ function setStdinDataValue(v) { globalThis._stdinData = v; }
188
+ function getStdinPosition() { return globalThis._stdinPosition; }
189
+ function setStdinPosition(v) { globalThis._stdinPosition = v; }
190
+ function getStdinEnded() { return globalThis._stdinEnded; }
191
+ function setStdinEnded(v) { globalThis._stdinEnded = v; }
192
+ function getStdinFlowMode() { return globalThis._stdinFlowMode; }
193
+ function setStdinFlowMode(v) { globalThis._stdinFlowMode = v; }
194
+ function _emitStdinData() {
195
+ if (getStdinEnded() || !getStdinData())
196
+ return;
197
+ // In flowing mode, emit all remaining data
198
+ if (getStdinFlowMode() && getStdinPosition() < getStdinData().length) {
199
+ const chunk = getStdinData().slice(getStdinPosition());
200
+ setStdinPosition(getStdinData().length);
201
+ // Emit data event
202
+ const dataListeners = [...(_stdinListeners["data"] || []), ...(_stdinOnceListeners["data"] || [])];
203
+ _stdinOnceListeners["data"] = [];
204
+ for (const listener of dataListeners) {
205
+ listener(chunk);
206
+ }
207
+ // Emit end after all data
208
+ setStdinEnded(true);
209
+ const endListeners = [...(_stdinListeners["end"] || []), ...(_stdinOnceListeners["end"] || [])];
210
+ _stdinOnceListeners["end"] = [];
211
+ for (const listener of endListeners) {
212
+ listener();
213
+ }
214
+ // Emit close
215
+ const closeListeners = [...(_stdinListeners["close"] || []), ...(_stdinOnceListeners["close"] || [])];
216
+ _stdinOnceListeners["close"] = [];
217
+ for (const listener of closeListeners) {
218
+ listener();
219
+ }
220
+ }
221
+ }
222
+ const _stdin = {
223
+ readable: true,
224
+ paused: true,
225
+ encoding: null,
226
+ read(size) {
227
+ if (getStdinPosition() >= getStdinData().length)
228
+ return null;
229
+ const chunk = size ? getStdinData().slice(getStdinPosition(), getStdinPosition() + size) : getStdinData().slice(getStdinPosition());
230
+ setStdinPosition(getStdinPosition() + chunk.length);
231
+ return chunk;
232
+ },
233
+ on(event, listener) {
234
+ if (!_stdinListeners[event])
235
+ _stdinListeners[event] = [];
236
+ _stdinListeners[event].push(listener);
237
+ // When 'end' listener is added and we have data, emit everything synchronously
238
+ // This works because typical patterns register 'data' then 'end' listeners
239
+ if (event === "end" && getStdinData() && !getStdinEnded()) {
240
+ setStdinFlowMode(true);
241
+ // Emit synchronously - all listeners should be registered by now
242
+ _emitStdinData();
243
+ }
244
+ return this;
245
+ },
246
+ once(event, listener) {
247
+ if (!_stdinOnceListeners[event])
248
+ _stdinOnceListeners[event] = [];
249
+ _stdinOnceListeners[event].push(listener);
250
+ return this;
251
+ },
252
+ off(event, listener) {
253
+ if (_stdinListeners[event]) {
254
+ const idx = _stdinListeners[event].indexOf(listener);
255
+ if (idx !== -1)
256
+ _stdinListeners[event].splice(idx, 1);
257
+ }
258
+ return this;
259
+ },
260
+ removeListener(event, listener) {
261
+ return this.off(event, listener);
262
+ },
263
+ emit(event, ...args) {
264
+ const listeners = [...(_stdinListeners[event] || []), ...(_stdinOnceListeners[event] || [])];
265
+ _stdinOnceListeners[event] = [];
266
+ for (const listener of listeners) {
267
+ listener(args[0]);
268
+ }
269
+ return listeners.length > 0;
270
+ },
271
+ pause() {
272
+ this.paused = true;
273
+ setStdinFlowMode(false);
274
+ return this;
275
+ },
276
+ resume() {
277
+ this.paused = false;
278
+ setStdinFlowMode(true);
279
+ _emitStdinData();
280
+ return this;
281
+ },
282
+ setEncoding(enc) {
283
+ this.encoding = enc;
284
+ return this;
285
+ },
286
+ isTTY: false,
287
+ // For readline compatibility
288
+ [Symbol.asyncIterator]: async function* () {
289
+ const lines = getStdinData().split("\n");
290
+ for (const line of lines) {
291
+ if (line)
292
+ yield line;
293
+ }
294
+ },
295
+ };
296
+ // hrtime function with bigint method
297
+ function hrtime(prev) {
298
+ const now = getNowMs();
299
+ const seconds = Math.floor(now / 1000);
300
+ const nanoseconds = Math.floor((now % 1000) * 1e6);
301
+ if (prev) {
302
+ let diffSec = seconds - prev[0];
303
+ let diffNano = nanoseconds - prev[1];
304
+ if (diffNano < 0) {
305
+ diffSec -= 1;
306
+ diffNano += 1e9;
307
+ }
308
+ return [diffSec, diffNano];
309
+ }
310
+ return [seconds, nanoseconds];
311
+ }
312
+ hrtime.bigint = function () {
313
+ const now = getNowMs();
314
+ return BigInt(Math.floor(now * 1e6));
315
+ };
316
+ // Internal state
317
+ let _cwd = config.cwd;
318
+ let _umask = 0o022;
319
+ // The process object
320
+ const process = {
321
+ // Static properties
322
+ platform: config.platform,
323
+ arch: config.arch,
324
+ version: config.version,
325
+ versions: {
326
+ node: config.version.replace(/^v/, ""),
327
+ v8: "11.3.244.8",
328
+ uv: "1.44.2",
329
+ zlib: "1.2.13",
330
+ brotli: "1.0.9",
331
+ ares: "1.19.0",
332
+ modules: "108",
333
+ nghttp2: "1.52.0",
334
+ napi: "8",
335
+ llhttp: "8.1.0",
336
+ openssl: "3.0.8",
337
+ cldr: "42.0",
338
+ icu: "72.1",
339
+ tz: "2022g",
340
+ unicode: "15.0",
341
+ },
342
+ pid: config.pid,
343
+ ppid: config.ppid,
344
+ execPath: config.execPath,
345
+ execArgv: [],
346
+ argv: config.argv,
347
+ argv0: config.argv[0] || "node",
348
+ title: "node",
349
+ env: config.env,
350
+ // Config stubs
351
+ config: {
352
+ target_defaults: {
353
+ cflags: [],
354
+ default_configuration: "Release",
355
+ defines: [],
356
+ include_dirs: [],
357
+ libraries: [],
358
+ },
359
+ variables: {
360
+ node_prefix: "/usr",
361
+ node_shared_libuv: false,
362
+ },
363
+ },
364
+ release: {
365
+ name: "node",
366
+ sourceUrl: "https://nodejs.org/download/release/v20.0.0/node-v20.0.0.tar.gz",
367
+ headersUrl: "https://nodejs.org/download/release/v20.0.0/node-v20.0.0-headers.tar.gz",
368
+ },
369
+ // Feature flags
370
+ features: {
371
+ inspector: false,
372
+ debug: false,
373
+ uv: true,
374
+ ipv6: true,
375
+ tls_alpn: true,
376
+ tls_sni: true,
377
+ tls_ocsp: true,
378
+ tls: true,
379
+ },
380
+ // Methods
381
+ cwd() {
382
+ return _cwd;
383
+ },
384
+ chdir(dir) {
385
+ _cwd = dir;
386
+ },
387
+ get exitCode() {
388
+ return _exitCode;
389
+ },
390
+ set exitCode(code) {
391
+ _exitCode = code ?? 0;
392
+ },
393
+ exit(code) {
394
+ const exitCode = code !== undefined ? code : _exitCode;
395
+ _exitCode = exitCode;
396
+ _exited = true;
397
+ // Fire exit event
398
+ try {
399
+ _emit("exit", exitCode);
400
+ }
401
+ catch (_e) {
402
+ // Ignore errors in exit handlers
403
+ }
404
+ // Throw to stop execution
405
+ throw new ProcessExitError(exitCode);
406
+ },
407
+ abort() {
408
+ return process.exit(1);
409
+ },
410
+ nextTick(callback, ...args) {
411
+ if (typeof queueMicrotask === "function") {
412
+ queueMicrotask(() => callback(...args));
413
+ }
414
+ else {
415
+ Promise.resolve().then(() => callback(...args));
416
+ }
417
+ },
418
+ hrtime: hrtime,
419
+ getuid() {
420
+ return config.uid;
421
+ },
422
+ getgid() {
423
+ return config.gid;
424
+ },
425
+ geteuid() {
426
+ return config.uid;
427
+ },
428
+ getegid() {
429
+ return config.gid;
430
+ },
431
+ getgroups() {
432
+ return [config.gid];
433
+ },
434
+ setuid() { },
435
+ setgid() { },
436
+ seteuid() { },
437
+ setegid() { },
438
+ setgroups() { },
439
+ umask(mask) {
440
+ const oldMask = _umask;
441
+ if (mask !== undefined) {
442
+ _umask = mask;
443
+ }
444
+ return oldMask;
445
+ },
446
+ uptime() {
447
+ return (getNowMs() - _processStartTime) / 1000;
448
+ },
449
+ memoryUsage() {
450
+ return {
451
+ rss: 50 * 1024 * 1024,
452
+ heapTotal: 20 * 1024 * 1024,
453
+ heapUsed: 10 * 1024 * 1024,
454
+ external: 1 * 1024 * 1024,
455
+ arrayBuffers: 500 * 1024,
456
+ };
457
+ },
458
+ cpuUsage(prev) {
459
+ const usage = {
460
+ user: 1000000,
461
+ system: 500000,
462
+ };
463
+ if (prev) {
464
+ return {
465
+ user: usage.user - prev.user,
466
+ system: usage.system - prev.system,
467
+ };
468
+ }
469
+ return usage;
470
+ },
471
+ resourceUsage() {
472
+ return {
473
+ userCPUTime: 1000000,
474
+ systemCPUTime: 500000,
475
+ maxRSS: 50 * 1024,
476
+ sharedMemorySize: 0,
477
+ unsharedDataSize: 0,
478
+ unsharedStackSize: 0,
479
+ minorPageFault: 0,
480
+ majorPageFault: 0,
481
+ swappedOut: 0,
482
+ fsRead: 0,
483
+ fsWrite: 0,
484
+ ipcSent: 0,
485
+ ipcReceived: 0,
486
+ signalsCount: 0,
487
+ voluntaryContextSwitches: 0,
488
+ involuntaryContextSwitches: 0,
489
+ };
490
+ },
491
+ kill(pid, signal) {
492
+ if (pid !== process.pid) {
493
+ const err = new Error("Operation not permitted");
494
+ err.code = "EPERM";
495
+ err.errno = -1;
496
+ err.syscall = "kill";
497
+ throw err;
498
+ }
499
+ // Self-kill - treat as exit
500
+ if (!signal || signal === "SIGTERM" || signal === 15) {
501
+ process.exit(143);
502
+ }
503
+ return true;
504
+ },
505
+ // EventEmitter methods
506
+ on(event, listener) {
507
+ return _addListener(event, listener);
508
+ },
509
+ once(event, listener) {
510
+ return _addListener(event, listener, true);
511
+ },
512
+ removeListener(event, listener) {
513
+ return _removeListener(event, listener);
514
+ },
515
+ // off is an alias for removeListener (assigned below to be same reference)
516
+ off: null,
517
+ removeAllListeners(event) {
518
+ if (event) {
519
+ delete _processListeners[event];
520
+ delete _processOnceListeners[event];
521
+ }
522
+ else {
523
+ Object.keys(_processListeners).forEach((k) => delete _processListeners[k]);
524
+ Object.keys(_processOnceListeners).forEach((k) => delete _processOnceListeners[k]);
525
+ }
526
+ return process;
527
+ },
528
+ addListener(event, listener) {
529
+ return _addListener(event, listener);
530
+ },
531
+ emit(event, ...args) {
532
+ return _emit(event, ...args);
533
+ },
534
+ listeners(event) {
535
+ return [
536
+ ...(_processListeners[event] || []),
537
+ ...(_processOnceListeners[event] || []),
538
+ ];
539
+ },
540
+ listenerCount(event) {
541
+ return ((_processListeners[event] || []).length +
542
+ (_processOnceListeners[event] || []).length);
543
+ },
544
+ prependListener(event, listener) {
545
+ if (!_processListeners[event]) {
546
+ _processListeners[event] = [];
547
+ }
548
+ _processListeners[event].unshift(listener);
549
+ return process;
550
+ },
551
+ prependOnceListener(event, listener) {
552
+ if (!_processOnceListeners[event]) {
553
+ _processOnceListeners[event] = [];
554
+ }
555
+ _processOnceListeners[event].unshift(listener);
556
+ return process;
557
+ },
558
+ eventNames() {
559
+ return [
560
+ ...new Set([
561
+ ...Object.keys(_processListeners),
562
+ ...Object.keys(_processOnceListeners),
563
+ ]),
564
+ ];
565
+ },
566
+ setMaxListeners() {
567
+ return process;
568
+ },
569
+ getMaxListeners() {
570
+ return 10;
571
+ },
572
+ rawListeners(event) {
573
+ return process.listeners(event);
574
+ },
575
+ // Stdio streams
576
+ stdout: _stdout,
577
+ stderr: _stderr,
578
+ stdin: _stdin,
579
+ // Process state
580
+ connected: false,
581
+ // Module info (will be set by createRequire)
582
+ mainModule: undefined,
583
+ // No-op methods for compatibility
584
+ emitWarning(warning) {
585
+ const msg = typeof warning === "string" ? warning : warning.message;
586
+ _emit("warning", { message: msg, name: "Warning" });
587
+ },
588
+ binding(name) {
589
+ // Return stub implementations for common bindings
590
+ const stubs = {
591
+ fs: {},
592
+ buffer: {
593
+ Buffer: globalThis.Buffer,
594
+ constants: BUFFER_CONSTANTS,
595
+ kMaxLength: BUFFER_MAX_LENGTH,
596
+ kStringMaxLength: BUFFER_MAX_STRING_LENGTH,
597
+ },
598
+ process_wrap: {},
599
+ natives: {},
600
+ config: {},
601
+ uv: { UV_UDP_REUSEADDR: 4 },
602
+ constants: {
603
+ MAX_LENGTH: BUFFER_MAX_LENGTH,
604
+ MAX_STRING_LENGTH: BUFFER_MAX_STRING_LENGTH,
605
+ buffer: BUFFER_CONSTANTS,
606
+ },
607
+ crypto: {},
608
+ string_decoder: {},
609
+ os: {},
610
+ };
611
+ return stubs[name] || {};
612
+ },
613
+ _linkedBinding(name) {
614
+ return process.binding(name);
615
+ },
616
+ dlopen() {
617
+ throw new Error("process.dlopen is not supported");
618
+ },
619
+ hasUncaughtExceptionCaptureCallback() {
620
+ return false;
621
+ },
622
+ setUncaughtExceptionCaptureCallback() { },
623
+ // Send for IPC (no-op)
624
+ send() {
625
+ return false;
626
+ },
627
+ disconnect() { },
628
+ // Report
629
+ report: {
630
+ directory: "",
631
+ filename: "",
632
+ compact: false,
633
+ signal: "SIGUSR2",
634
+ reportOnFatalError: false,
635
+ reportOnSignal: false,
636
+ reportOnUncaughtException: false,
637
+ getReport() {
638
+ return {};
639
+ },
640
+ writeReport() {
641
+ return "";
642
+ },
643
+ },
644
+ // Debug port
645
+ debugPort: 9229,
646
+ // Internal state
647
+ _cwd: config.cwd,
648
+ _umask: 0o022,
649
+ };
650
+ // Make process.off === process.removeListener (same function reference)
651
+ process.off = process.removeListener;
652
+ // Add memoryUsage.rss
653
+ process.memoryUsage.rss =
654
+ function () {
655
+ return 50 * 1024 * 1024;
656
+ };
657
+ export default process;
658
+ // ============================================================================
659
+ // Global polyfills
660
+ // ============================================================================
661
+ // Timer implementation
662
+ let _timerId = 0;
663
+ const _timers = new Map();
664
+ const _intervals = new Map();
665
+ // queueMicrotask fallback
666
+ const _queueMicrotask = typeof queueMicrotask === "function"
667
+ ? queueMicrotask
668
+ : function (fn) {
669
+ Promise.resolve().then(fn);
670
+ };
671
+ // Timer handle class that mimics Node.js Timeout object
672
+ class TimerHandle {
673
+ _id;
674
+ _destroyed;
675
+ constructor(id) {
676
+ this._id = id;
677
+ this._destroyed = false;
678
+ }
679
+ ref() {
680
+ return this;
681
+ }
682
+ unref() {
683
+ return this;
684
+ }
685
+ hasRef() {
686
+ return true;
687
+ }
688
+ refresh() {
689
+ return this;
690
+ }
691
+ [Symbol.toPrimitive]() {
692
+ return this._id;
693
+ }
694
+ }
695
+ export function setTimeout(callback, delay, ...args) {
696
+ const id = ++_timerId;
697
+ const handle = new TimerHandle(id);
698
+ _timers.set(id, handle);
699
+ const actualDelay = delay ?? 0;
700
+ // Use host timer for actual delays if available and delay > 0
701
+ if (typeof _scheduleTimer !== "undefined" && actualDelay > 0) {
702
+ // _scheduleTimer.apply() returns a Promise that resolves after the delay
703
+ // Using { result: { promise: true } } tells isolated-vm to wait for the
704
+ // host Promise to resolve before resolving the apply() Promise
705
+ _scheduleTimer
706
+ .apply(undefined, [actualDelay], { result: { promise: true } })
707
+ .then(() => {
708
+ if (_timers.has(id)) {
709
+ _timers.delete(id);
710
+ try {
711
+ callback(...args);
712
+ }
713
+ catch (_e) {
714
+ // Ignore timer callback errors
715
+ }
716
+ }
717
+ });
718
+ }
719
+ else {
720
+ // Use microtask for zero delay or when host timer is unavailable
721
+ _queueMicrotask(() => {
722
+ if (_timers.has(id)) {
723
+ _timers.delete(id);
724
+ try {
725
+ callback(...args);
726
+ }
727
+ catch (_e) {
728
+ // Ignore timer callback errors
729
+ }
730
+ }
731
+ });
732
+ }
733
+ return handle;
734
+ }
735
+ export function clearTimeout(timer) {
736
+ const id = timer && typeof timer === "object" && timer._id !== undefined
737
+ ? timer._id
738
+ : timer;
739
+ _timers.delete(id);
740
+ }
741
+ export function setInterval(callback, delay, ...args) {
742
+ const id = ++_timerId;
743
+ const handle = new TimerHandle(id);
744
+ _intervals.set(id, handle);
745
+ const actualDelay = delay ?? 0;
746
+ // Schedule interval execution
747
+ const scheduleNext = () => {
748
+ if (!_intervals.has(id))
749
+ return; // Interval was cleared
750
+ if (typeof _scheduleTimer !== "undefined" && actualDelay > 0) {
751
+ // Use host timer for actual delays
752
+ _scheduleTimer
753
+ .apply(undefined, [actualDelay], { result: { promise: true } })
754
+ .then(() => {
755
+ if (_intervals.has(id)) {
756
+ try {
757
+ callback(...args);
758
+ }
759
+ catch (_e) {
760
+ // Ignore timer callback errors
761
+ }
762
+ // Schedule next iteration
763
+ scheduleNext();
764
+ }
765
+ });
766
+ }
767
+ else {
768
+ // Use microtask for zero delay or when host timer unavailable
769
+ _queueMicrotask(() => {
770
+ if (_intervals.has(id)) {
771
+ try {
772
+ callback(...args);
773
+ }
774
+ catch (_e) {
775
+ // Ignore timer callback errors
776
+ }
777
+ // Schedule next iteration
778
+ scheduleNext();
779
+ }
780
+ });
781
+ }
782
+ };
783
+ // Start the interval
784
+ scheduleNext();
785
+ return handle;
786
+ }
787
+ export function clearInterval(timer) {
788
+ const id = timer && typeof timer === "object" && timer._id !== undefined
789
+ ? timer._id
790
+ : timer;
791
+ _intervals.delete(id);
792
+ }
793
+ export function setImmediate(callback, ...args) {
794
+ return setTimeout(callback, 0, ...args);
795
+ }
796
+ export function clearImmediate(id) {
797
+ clearTimeout(id);
798
+ }
799
+ // URL and URLSearchParams - use whatwg-url for spec-compliant implementation
800
+ export const URL = WhatwgURL;
801
+ export const URLSearchParams = WhatwgURLSearchParams;
802
+ // TextEncoder and TextDecoder - re-export from polyfills
803
+ export { TextEncoder, TextDecoder };
804
+ // Buffer - use buffer package polyfill
805
+ export const Buffer = BufferPolyfill;
806
+ function throwUnsupportedCryptoApi(api) {
807
+ throw new Error(`crypto.${api} is not supported in sandbox`);
808
+ }
809
+ // Crypto polyfill
810
+ export const cryptoPolyfill = {
811
+ getRandomValues(array) {
812
+ if (typeof _cryptoRandomFill === "undefined") {
813
+ throwUnsupportedCryptoApi("getRandomValues");
814
+ }
815
+ const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
816
+ try {
817
+ const base64 = _cryptoRandomFill.applySync(undefined, [bytes.byteLength]);
818
+ const hostBytes = BufferPolyfill.from(base64, "base64");
819
+ if (hostBytes.byteLength !== bytes.byteLength) {
820
+ throw new Error("invalid host entropy size");
821
+ }
822
+ bytes.set(hostBytes);
823
+ return array;
824
+ }
825
+ catch {
826
+ throwUnsupportedCryptoApi("getRandomValues");
827
+ }
828
+ },
829
+ randomUUID() {
830
+ if (typeof _cryptoRandomUUID === "undefined") {
831
+ throwUnsupportedCryptoApi("randomUUID");
832
+ }
833
+ try {
834
+ const uuid = _cryptoRandomUUID.applySync(undefined, []);
835
+ if (typeof uuid !== "string") {
836
+ throw new Error("invalid host uuid");
837
+ }
838
+ return uuid;
839
+ }
840
+ catch {
841
+ throwUnsupportedCryptoApi("randomUUID");
842
+ }
843
+ },
844
+ subtle: {
845
+ digest() {
846
+ throw new Error("crypto.subtle.digest is not supported in sandbox");
847
+ },
848
+ encrypt() {
849
+ throw new Error("crypto.subtle.encrypt is not supported in sandbox");
850
+ },
851
+ decrypt() {
852
+ throw new Error("crypto.subtle.decrypt is not supported in sandbox");
853
+ },
854
+ },
855
+ };
856
+ // Setup globals function - call this to install polyfills on globalThis
857
+ export function setupGlobals() {
858
+ const g = globalThis;
859
+ // Process - simple assignment is sufficient since we use external: ["process"]
860
+ // in polyfills.ts, which prevents node-stdlib-browser's process shim from being
861
+ // bundled and overwriting our process object.
862
+ g.process = process;
863
+ // Timers
864
+ g.setTimeout = setTimeout;
865
+ g.clearTimeout = clearTimeout;
866
+ g.setInterval = setInterval;
867
+ g.clearInterval = clearInterval;
868
+ g.setImmediate = setImmediate;
869
+ g.clearImmediate = clearImmediate;
870
+ // queueMicrotask
871
+ if (typeof g.queueMicrotask === "undefined") {
872
+ g.queueMicrotask = _queueMicrotask;
873
+ }
874
+ // URL
875
+ if (typeof g.URL === "undefined") {
876
+ g.URL = URL;
877
+ }
878
+ if (typeof g.URLSearchParams === "undefined") {
879
+ g.URLSearchParams = URLSearchParams;
880
+ }
881
+ // TextEncoder/TextDecoder
882
+ if (typeof g.TextEncoder === "undefined") {
883
+ g.TextEncoder = TextEncoder;
884
+ }
885
+ if (typeof g.TextDecoder === "undefined") {
886
+ g.TextDecoder = TextDecoder;
887
+ }
888
+ // Buffer
889
+ if (typeof g.Buffer === "undefined") {
890
+ g.Buffer = Buffer;
891
+ }
892
+ const globalBuffer = g.Buffer;
893
+ if (typeof globalBuffer.kMaxLength !== "number") {
894
+ globalBuffer.kMaxLength = BUFFER_MAX_LENGTH;
895
+ }
896
+ if (typeof globalBuffer.kStringMaxLength !== "number") {
897
+ globalBuffer.kStringMaxLength = BUFFER_MAX_STRING_LENGTH;
898
+ }
899
+ if (typeof globalBuffer.constants !== "object" ||
900
+ globalBuffer.constants === null) {
901
+ globalBuffer.constants = BUFFER_CONSTANTS;
902
+ }
903
+ // Crypto
904
+ if (typeof g.crypto === "undefined") {
905
+ g.crypto = cryptoPolyfill;
906
+ }
907
+ else {
908
+ const cryptoObj = g.crypto;
909
+ if (typeof cryptoObj.getRandomValues === "undefined") {
910
+ cryptoObj.getRandomValues = cryptoPolyfill.getRandomValues;
911
+ }
912
+ if (typeof cryptoObj.randomUUID === "undefined") {
913
+ cryptoObj.randomUUID = cryptoPolyfill.randomUUID;
914
+ }
915
+ }
916
+ }