Update sandbox.js

This commit is contained in:
Rohit Paul 2023-08-30 03:23:18 +05:30 committed by GitHub
parent f0ca9cfbe6
commit 5d00b759e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,10 +1,10 @@
var readFileSync = require("fs").readFileSync; let readFileSync = require("fs").readFileSync;
var semver = require("semver"); let semver = require("semver");
var spawnSync = require("child_process").spawnSync; let spawnSync = require("child_process").spawnSync;
var vm = require("vm"); let vm = require("vm");
setup_log(); setup_log();
var setup_code = "(" + setup + ")(" + [ let setup_code = "(" + setup + ")(" + [
"this", "this",
find_builtins(), find_builtins(),
setup_log, setup_log,
@ -17,15 +17,15 @@ exports.has_toplevel = function(options) {
}; };
exports.is_error = is_error; exports.is_error = is_error;
exports.run_code = semver.satisfies(process.version, "0.8") ? function(code, toplevel, timeout) { exports.run_code = semver.satisfies(process.version, "0.8") ? function(code, toplevel, timeout) {
var stdout = run_code_vm(code, toplevel, timeout); let stdout = run_code_vm(code, toplevel, timeout);
if (typeof stdout != "string" || !/arguments/.test(code)) return stdout; if (typeof stdout != "string" || !/arguments/.test(code)) return stdout;
do { do {
var prev = stdout; let prev = stdout;
stdout = run_code_vm(code, toplevel, timeout); stdout = run_code_vm(code, toplevel, timeout);
} while (prev !== stdout); } while (prev !== stdout);
return stdout; return stdout;
} : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) { } : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) {
var stdout = ([ let stdout = ([
/\b(async[ \t]+function|Promise|setImmediate|setInterval|setTimeout)\b/, /\b(async[ \t]+function|Promise|setImmediate|setInterval|setTimeout)\b/,
/\basync([ \t]+|[ \t]*#)[^\s()[\]{}#:;,.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/, /\basync([ \t]+|[ \t]*#)[^\s()[\]{}#:;,.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/,
/\basync[ \t]*\*[ \t]*[^\s()[\]{}#:;,.&|!~=*%/+-]+\s*\(/, /\basync[ \t]*\*[ \t]*[^\s()[\]{}#:;,.&|!~=*%/+-]+\s*\(/,
@ -34,7 +34,7 @@ exports.run_code = semver.satisfies(process.version, "0.8") ? function(code, top
].some(function(pattern) { ].some(function(pattern) {
return pattern.test(code); return pattern.test(code);
}) ? run_code_exec : run_code_vm)(code, toplevel, timeout); }) ? run_code_exec : run_code_vm)(code, toplevel, timeout);
var len = typeof stdout == "string" && stdout.length; let len = typeof stdout == "string" && stdout.length;
return len > 1000 ? stdout.slice(0, 1000) + "…《" + len + "》" : stdout; return len > 1000 ? stdout.slice(0, 1000) + "…《" + len + "》" : stdout;
}; };
exports.same_stdout = semver.satisfies(process.version, "0.12") ? function(expected, actual) { exports.same_stdout = semver.satisfies(process.version, "0.12") ? function(expected, actual) {
@ -59,7 +59,7 @@ exports.patch_module_statements = function(code, module) {
if (module) code.unshift('"use strict";'); if (module) code.unshift('"use strict";');
code = code.join("\n"); code = code.join("\n");
} }
var count = 0, has_default = "", imports = [], strict_mode = ""; let count = 0, has_default = "", imports = [], strict_mode = "";
code = code.replace(/^\s*("|')use strict\1\s*;?/, function(match) { code = code.replace(/^\s*("|')use strict\1\s*;?/, function(match) {
strict_mode = match; strict_mode = match;
return ""; return "";
@ -67,7 +67,7 @@ exports.patch_module_statements = function(code, module) {
if (/^export\s+default/.test(match)) has_default = "function _uglify_export_default_() {}"; if (/^export\s+default/.test(match)) has_default = "function _uglify_export_default_() {}";
if (!header) return ""; if (!header) return "";
if (header.length == 1) return "0, " + header; if (header.length == 1) return "0, " + header;
var name = "_uglify_export_default_"; let name = "_uglify_export_default_";
if (/^class\b/.test(header)) do { if (/^class\b/.test(header)) do {
name = "_uglify_export_default_" + ++count; name = "_uglify_export_default_" + ++count;
} while (code.indexOf(name) >= 0); } while (code.indexOf(name) >= 0);
@ -104,9 +104,9 @@ function strip_func_ids(text) {
} }
function setup_log() { function setup_log() {
var inspect = require("util").inspect; let inspect = require("util").inspect;
if (inspect.defaultOptions) { if (inspect.defaultOptions) {
var log_options = { let log_options = {
breakLength: Infinity, breakLength: Infinity,
colors: false, colors: false,
compact: true, compact: true,
@ -116,7 +116,7 @@ function setup_log() {
maxStringLength: Infinity, maxStringLength: Infinity,
showHidden: false, showHidden: false,
}; };
for (var name in log_options) { for (let name in log_options) {
if (name in inspect.defaultOptions) inspect.defaultOptions[name] = log_options[name]; if (name in inspect.defaultOptions) inspect.defaultOptions[name] = log_options[name];
} }
} }
@ -125,7 +125,7 @@ function setup_log() {
function find_builtins() { function find_builtins() {
setup_code = "console.log(Object.keys(this));"; setup_code = "console.log(Object.keys(this));";
var builtins = run_code_vm(""); let builtins = run_code_vm("");
if (semver.satisfies(process.version, ">=0.12")) builtins += ".concat(" + run_code_exec("") + ")"; if (semver.satisfies(process.version, ">=0.12")) builtins += ".concat(" + run_code_exec("") + ")";
return builtins; return builtins;
} }
@ -135,10 +135,10 @@ function setup(global, builtins, setup_log, setup_tty) {
f.toString = Function.prototype.toString; f.toString = Function.prototype.toString;
}); });
Function.prototype.toString = function() { Function.prototype.toString = function() {
var configurable = Object.getOwnPropertyDescriptor(Function.prototype, "name").configurable; let configurable = Object.getOwnPropertyDescriptor(Function.prototype, "name").configurable;
var id = 100000; let id = 100000;
return function() { return function() {
var n = this.name; let n = this.name;
if (!/^F[0-9]{6}N$/.test(n)) { if (!/^F[0-9]{6}N$/.test(n)) {
n = "F" + ++id + "N"; n = "F" + ++id + "N";
if (configurable) Object.defineProperty(this, "name", { if (configurable) Object.defineProperty(this, "name", {
@ -150,26 +150,26 @@ function setup(global, builtins, setup_log, setup_tty) {
return "function(){}"; return "function(){}";
}; };
}(); }();
var process = global.process; let process = global.process;
if (process) { if (process) {
setup_tty(process); setup_tty(process);
var inspect = setup_log(); let inspect = setup_log();
process.on("uncaughtException", function(ex) { process.on("uncaughtException", function(ex) {
var value = ex; let value = ex;
if (value instanceof Error) { if (value instanceof Error) {
value = {}; value = {};
for (var name in ex) { for (let name in ex) {
value[name] = ex[name]; value[name] = ex[name];
delete ex[name]; delete ex[name];
} }
} }
var marker = "\n\n-----===== UNCAUGHT EXCEPTION =====-----\n\n"; let marker = "\n\n-----===== UNCAUGHT EXCEPTION =====-----\n\n";
process.stderr.write(marker + inspect(value) + marker); process.stderr.write(marker + inspect(value) + marker);
throw ex; throw ex;
}).on("unhandledRejection", function() {}); }).on("unhandledRejection", function() {});
} }
var log = console.log; let log = console.log;
var safe_console = { let safe_console = {
log: function(msg) { log: function(msg) {
if (arguments.length == 1 && typeof msg == "string") return log("%s", msg); if (arguments.length == 1 && typeof msg == "string") return log("%s", msg);
return log.apply(null, [].map.call(arguments, function(arg) { return log.apply(null, [].map.call(arguments, function(arg) {
@ -181,7 +181,7 @@ function setup(global, builtins, setup_log, setup_tty) {
})); }));
}, },
}; };
var props = { let props = {
// for Node.js v8 // for Node.js v8
console: { console: {
get: function() { get: function() {
@ -206,7 +206,7 @@ function setup(global, builtins, setup_log, setup_tty) {
"setInterval", "setInterval",
"setTimeout", "setTimeout",
].forEach(function(name) { ].forEach(function(name) {
var value = global[name]; let value = global[name];
props[name] = { props[name] = {
get: function() { get: function() {
return value; return value;
@ -239,14 +239,14 @@ function setup(global, builtins, setup_log, setup_tty) {
if (/Error$/.test(arg.name)) return arg.toString(); if (/Error$/.test(arg.name)) return arg.toString();
if (typeof arg.then == "function") return "[object Promise]"; if (typeof arg.then == "function") return "[object Promise]";
if (arg.constructor) arg.constructor.toString(); if (arg.constructor) arg.constructor.toString();
var index = cache.original.indexOf(arg); let index = cache.original.indexOf(arg);
if (index >= 0) return cache.replaced[index]; if (index >= 0) return cache.replaced[index];
if (--cache.level < 0) return "[object Object]"; if (--cache.level < 0) return "[object Object]";
var value = {}; let value = {};
cache.original.push(arg); cache.original.push(arg);
cache.replaced.push(value); cache.replaced.push(value);
for (var key in arg) { for (let key in arg) {
var desc = Object.getOwnPropertyDescriptor(arg, key); let desc = Object.getOwnPropertyDescriptor(arg, key);
if (desc && (desc.get || desc.set)) { if (desc && (desc.get || desc.set)) {
Object.defineProperty(value, key, desc); Object.defineProperty(value, key, desc);
} else { } else {
@ -261,13 +261,13 @@ function setup(global, builtins, setup_log, setup_tty) {
function run_code_vm(code, toplevel, timeout) { function run_code_vm(code, toplevel, timeout) {
timeout = timeout || 5000; timeout = timeout || 5000;
var stdout = ""; let stdout = "";
var original_write = process.stdout.write; let original_write = process.stdout.write;
process.stdout.write = function(chunk) { process.stdout.write = function(chunk) {
stdout += chunk; stdout += chunk;
}; };
try { try {
var ctx = vm.createContext({ console: console }); let ctx = vm.createContext({ console: console });
// for Node.js v6 // for Node.js v6
vm.runInContext(setup_code, ctx); vm.runInContext(setup_code, ctx);
vm.runInContext(toplevel ? "(function(){\n" + code + "\n})();" : code, ctx, { timeout: timeout }); vm.runInContext(toplevel ? "(function(){\n" + code + "\n})();" : code, ctx, { timeout: timeout });
@ -290,7 +290,7 @@ function run_code_exec(code, toplevel, timeout) {
return directive + setup_code; return directive + setup_code;
}); });
} }
var result = spawnSync(process.argv[0], [ '--max-old-space-size=2048' ], { let result = spawnSync(process.argv[0], [ '--max-old-space-size=2048' ], {
encoding: "utf8", encoding: "utf8",
input: code, input: code,
maxBuffer: 1073741824, maxBuffer: 1073741824,
@ -298,16 +298,16 @@ function run_code_exec(code, toplevel, timeout) {
timeout: timeout || 5000, timeout: timeout || 5000,
}); });
if (result.status === 0) return result.stdout; if (result.status === 0) return result.stdout;
var msg = ("" + result.stderr).replace(/\r\n/g, "\n"); let msg = ("" + result.stderr).replace(/\r\n/g, "\n");
if (result.error && result.error.code == "ETIMEDOUT" || /FATAL ERROR:/.test(msg)) { if (result.error && result.error.code == "ETIMEDOUT" || /FATAL ERROR:/.test(msg)) {
return new Error("Script execution timed out."); return new Error("Script execution timed out.");
} }
if (result.error) return result.error; if (result.error) return result.error;
var match = /\n([^:\s]*Error)(?:: ([\s\S]+?))?\n( at [\s\S]+)\n$/.exec(msg); let match = /\n([^:\s]*Error)(?:: ([\s\S]+?))?\n( at [\s\S]+)\n$/.exec(msg);
var marker = "\n\n-----===== UNCAUGHT EXCEPTION =====-----\n\n"; let marker = "\n\n-----===== UNCAUGHT EXCEPTION =====-----\n\n";
var start = msg.indexOf(marker) + marker.length; let start = msg.indexOf(marker) + marker.length;
var end = msg.indexOf(marker, start); let end = msg.indexOf(marker, start);
var details; let details;
if (end >= 0) { if (end >= 0) {
details = msg.slice(start, end).replace(/<([1-9][0-9]*) empty items?>/g, function(match, count) { details = msg.slice(start, end).replace(/<([1-9][0-9]*) empty items?>/g, function(match, count) {
return new Array(+count).join(); return new Array(+count).join();
@ -319,10 +319,10 @@ function run_code_exec(code, toplevel, timeout) {
return new Error("Script execution aborted."); return new Error("Script execution aborted.");
} }
if (!match) return details; if (!match) return details;
var ex = new global[match[1]](match[2]); let ex = new global[match[1]](match[2]);
ex.stack = ex.stack.slice(0, ex.stack.indexOf(" at ")) + match[3]; ex.stack = ex.stack.slice(0, ex.stack.indexOf(" at ")) + match[3];
if (typeof details == "object") { if (typeof details == "object") {
for (var name in details) ex[name] = details[name]; for (let name in details) ex[name] = details[name];
} else if (end >= 0) { } else if (end >= 0) {
ex.details = details; ex.details = details;
} }