43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
import net from 'net';
|
|
import repl from 'repl';
|
|
|
|
export function createReplServer(latus) {
|
|
const {config: {'@latus/core': {id}}} = latus;
|
|
const netServer = net.createServer((socket) => {
|
|
const replServer = repl.start({
|
|
prompt: `${id}> `,
|
|
input: socket,
|
|
output: socket,
|
|
});
|
|
// eslint-disable-next-line no-param-reassign
|
|
latus.config['%replServer'] = replServer;
|
|
replServer.on('exit', () => socket.end());
|
|
Object.entries(
|
|
latus.invokeFlat('@latus/repl/context').reduce((r, vars) => ({...r, ...vars}), {latus}),
|
|
).forEach(([key, value]) => {
|
|
replServer.context[key] = value;
|
|
});
|
|
Object.entries(
|
|
latus.invokeFlat('@latus/repl/commands').reduce((r, commands) => ({...r, ...commands}), {}),
|
|
).forEach(([key, value]) => {
|
|
replServer.defineCommand(key, async (arg) => {
|
|
const result = await value(arg);
|
|
if (result) {
|
|
socket.write(result, () => replServer.displayPrompt());
|
|
}
|
|
else {
|
|
replServer.displayPrompt();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
return new Promise((resolve) => netServer.listen(`/tmp/${id}-${Date.now()}.sock`, resolve));
|
|
}
|
|
|
|
export function destroyReplServer(replServer) {
|
|
if (!replServer) {
|
|
return;
|
|
}
|
|
replServer.close();
|
|
}
|