function-exec-sync
Version:
Run a function in a node process
148 lines • 6.23 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return functionExecSync;
}
});
require("./polyfills.cjs");
var _child_process = /*#__PURE__*/ _interop_require_default(require("child_process"));
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
var _mkdirpclassic = /*#__PURE__*/ _interop_require_default(require("mkdirp-classic"));
var _os = /*#__PURE__*/ _interop_require_default(require("os"));
var _osshim = /*#__PURE__*/ _interop_require_default(require("os-shim"));
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
var _serializejavascript = /*#__PURE__*/ _interop_require_default(require("serialize-javascript"));
var _shorthash = /*#__PURE__*/ _interop_require_default(require("short-hash"));
var _tempsuffix = /*#__PURE__*/ _interop_require_default(require("temp-suffix"));
var _threadsleepcompat = /*#__PURE__*/ _interop_require_default(require("thread-sleep-compat"));
var _url = /*#__PURE__*/ _interop_require_default(require("url"));
var _unlinkSafets = /*#__PURE__*/ _interop_require_default(require("./unlinkSafe.js"));
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _object_spread(target) {
for(var i = 1; i < arguments.length; i++){
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === "function") {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function(key) {
_define_property(target, key, source[key]);
});
}
return target;
}
var tmpdir = _os.default.tmpdir || _osshim.default.tmpdir;
var DEFAULT_SLEEP_MS = 100;
var NODES = [
'node',
'node.exe',
'node.cmd'
];
var isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
var __dirname = _path.default.dirname(typeof __filename === 'undefined' ? _url.default.fileURLToPath(require("url").pathToFileURL(__filename).toString()) : __filename);
var worker = _path.default.join(__dirname, 'workers', 'runFunction.cjs');
var existsSync = function(test) {
try {
(_fs.default.accessSync || _fs.default.statSync)(test);
return true;
} catch (_) {
return false;
}
};
function functionExecSync(options, filePath) {
for(var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
args[_key - 2] = arguments[_key];
}
if (typeof options === 'string') {
args.unshift(filePath);
filePath = options;
options = null;
}
if (!filePath) throw new Error('function-exec-sync missing file');
options = options || {};
var env = _object_spread({}, options.env || process.env);
delete env.NODE_OPTIONS;
var workerData = {
filePath: filePath,
args: args,
callbacks: options.callbacks === undefined ? false : options.callbacks,
env: env,
cwd: options.cwd === undefined ? process.cwd() : options.cwd
};
var name = options.name === undefined ? 'function-exec-sync' : options.name;
var temp = _path.default.join(tmpdir(), name, (0, _shorthash.default)(workerData.cwd));
var input = _path.default.join(temp, (0, _tempsuffix.default)('input'));
var output = _path.default.join(temp, (0, _tempsuffix.default)('output'));
var done = _path.default.join(temp, (0, _tempsuffix.default)('done'));
// store data to a file
_mkdirpclassic.default.sync(_path.default.dirname(input));
_fs.default.writeFileSync(input, (0, _serializejavascript.default)(workerData), 'utf8');
(0, _unlinkSafets.default)(output);
// call the function
var execPath = options.execPath || process.execPath;
// only node
if (NODES.indexOf(_path.default.basename(execPath).toLowerCase()) < 0) throw new Error("Expecting node executable. Received: ".concat(_path.default.basename(execPath)));
// exec and start polling
if (!_child_process.default.execFileSync) {
var sleepMS = options.sleep === undefined ? DEFAULT_SLEEP_MS : options.sleep;
var cmd = '"'.concat(execPath, '" "').concat(worker, '" "').concat(input, '" "').concat(output, '"');
cmd += "".concat(isWindows ? '&' : ';', ' echo "done" > ').concat(done);
_child_process.default.exec(cmd, {
env: env
});
while(!existsSync(done)){
(0, _threadsleepcompat.default)(sleepMS);
}
} else {
_child_process.default.execFileSync(execPath, [
worker,
input,
output
], {
env: env
});
}
(0, _unlinkSafets.default)(input);
(0, _unlinkSafets.default)(done);
// get data and clean up
var res;
try {
// biome-ignore lint/security/noGlobalEval: Serialize
res = eval("(".concat(_fs.default.readFileSync(output, 'utf8'), ")"));
(0, _unlinkSafets.default)(output);
} catch (err) {
throw new Error("function-exec-sync: Error: ".concat(err.message, ". Function: ").concat(filePath, ". Exec path: ").concat(execPath));
}
// throw error from the worker
if (res.error) {
var error = new Error(res.error.message);
for(var key in res.error)error[key] = res.error[key];
throw error;
}
// return the result
return res.value;
}
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
;