116 lines
2.7 KiB
JavaScript
116 lines
2.7 KiB
JavaScript
let callbackCounter = 0;
|
|
function getUniqueCallbackName(prefix) {
|
|
return `${prefix}_callback_${Date.now()}_${callbackCounter++}`;
|
|
}
|
|
|
|
export function exec(command, options) {
|
|
if (typeof options === "undefined") {
|
|
options = {};
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
// Generate a unique callback function name
|
|
const callbackFuncName = getUniqueCallbackName("exec");
|
|
|
|
// Define the success callback function
|
|
window[callbackFuncName] = (errno, stdout, stderr) => {
|
|
resolve({ errno, stdout, stderr });
|
|
cleanup(callbackFuncName);
|
|
};
|
|
|
|
function cleanup(successName) {
|
|
delete window[successName];
|
|
}
|
|
|
|
try {
|
|
ksu.exec(command, JSON.stringify(options), callbackFuncName);
|
|
} catch (error) {
|
|
reject(error);
|
|
cleanup(callbackFuncName);
|
|
}
|
|
});
|
|
}
|
|
|
|
function Stdio() {
|
|
this.listeners = {};
|
|
}
|
|
|
|
Stdio.prototype.on = function (event, listener) {
|
|
if (!this.listeners[event]) {
|
|
this.listeners[event] = [];
|
|
}
|
|
this.listeners[event].push(listener);
|
|
};
|
|
|
|
Stdio.prototype.emit = function (event, ...args) {
|
|
if (this.listeners[event]) {
|
|
this.listeners[event].forEach((listener) => listener(...args));
|
|
}
|
|
};
|
|
|
|
function ChildProcess() {
|
|
this.listeners = {};
|
|
this.stdin = new Stdio();
|
|
this.stdout = new Stdio();
|
|
this.stderr = new Stdio();
|
|
}
|
|
|
|
ChildProcess.prototype.on = function (event, listener) {
|
|
if (!this.listeners[event]) {
|
|
this.listeners[event] = [];
|
|
}
|
|
this.listeners[event].push(listener);
|
|
};
|
|
|
|
ChildProcess.prototype.emit = function (event, ...args) {
|
|
if (this.listeners[event]) {
|
|
this.listeners[event].forEach((listener) => listener(...args));
|
|
}
|
|
};
|
|
|
|
export function spawn(command, args, options) {
|
|
if (typeof args === "undefined") {
|
|
args = [];
|
|
} else if (!(args instanceof Array)) {
|
|
// allow for (command, options) signature
|
|
options = args;
|
|
}
|
|
|
|
if (typeof options === "undefined") {
|
|
options = {};
|
|
}
|
|
|
|
const child = new ChildProcess();
|
|
const childCallbackName = getUniqueCallbackName("spawn");
|
|
window[childCallbackName] = child;
|
|
|
|
function cleanup(name) {
|
|
delete window[name];
|
|
}
|
|
|
|
child.on("exit", code => {
|
|
cleanup(childCallbackName);
|
|
});
|
|
|
|
try {
|
|
ksu.spawn(
|
|
command,
|
|
JSON.stringify(args),
|
|
JSON.stringify(options),
|
|
childCallbackName
|
|
);
|
|
} catch (error) {
|
|
child.emit("error", error);
|
|
cleanup(childCallbackName);
|
|
}
|
|
return child;
|
|
}
|
|
|
|
export function fullScreen(isFullScreen) {
|
|
ksu.fullScreen(isFullScreen);
|
|
}
|
|
|
|
export function toast(message) {
|
|
ksu.toast(message);
|
|
}
|