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