latus/packages/repl/src/repl.js
2021-01-12 19:54:58 -06:00

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();
}