UNPKG

function-exec-sync

Version:

Run a function in a node process

148 lines 6.23 kB
"use strict"; 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; }