diff options
author | EuAndreh <eu@euandre.org> | 2024-03-01 17:07:30 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-03-01 17:07:30 -0300 |
commit | 8cdab6f4184e332ca1fbb65562b98f2977a74d92 (patch) | |
tree | 071841ae385407eb2b9888ff57f975ce04347bf6 /src/hero.mjs | |
parent | Makefile: Let the application recreate its pipes and sockets (diff) | |
download | papod-8cdab6f4184e332ca1fbb65562b98f2977a74d92.tar.gz papod-8cdab6f4184e332ca1fbb65562b98f2977a74d92.tar.xz |
src/hero.mjs: Add actionsFn() and lineHandlerFn()
Diffstat (limited to 'src/hero.mjs')
-rw-r--r-- | src/hero.mjs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/hero.mjs b/src/hero.mjs index c249d4f..b623943 100644 --- a/src/hero.mjs +++ b/src/hero.mjs @@ -148,6 +148,7 @@ export const makeRequestListener = table => async (req, res) => { export const loggerDefaults = { pid: process.pid, ppid: process.ppid, + tool: "hero", }; export let loggerGlobals = {}; @@ -170,6 +171,7 @@ export const makeLogger = (writerFn = console.error) => ({ warn: u.partial(logit, writerFn, "WARN"), error: u.partial(logit, writerFn, "ERROR"), }); + export const log = makeLogger(); export const interceptorsFn = ({ @@ -250,6 +252,80 @@ export const wrapHandler = (fn, arr) => fn : chainInterceptors(arr.concat([ (req, _next) => fn(req) ])); +export const actionsFn = ({ + logger, +} = { + logger: log, +}) => ({ + "toggle-debug-env": action => { + const before = process.env.DEBUG; + if (process.env.DEBUG) { + delete process.env.DEBUG; + } else { + process.env.DEBUG = "1"; + } + const after = process.env.DEBUG; + + logger.info({ + type: "action-response", + action, + message: "toggle process.env.DEBUG", + before: u.undefinedAsNull(before), + after: u.undefinedAsNull(after), + }); + }, + "config-dump": action => logger.info({ + type: "action-response", + action, + data: { + ...loggerDefaults, + ...loggerGlobals, + }, + }), +}); + +export const actions = actionsFn(); + +export const lineHandlerFn = ({ + logger, + actionsMap, +} = { + logger: log, + actionsMap: actions, +}) => line => { + let cmd = null; + try { + cmd = JSON.parse(line); + } catch (e) { + logger.info({ + type: "invalid-cmd-input", + message: e.message, + }); + return; + } + + if (typeof cmd?.action !== "string") { + logger.info({ + type: "missing-key-action", + message: `missing the "action" key from the given object`, + }); + return; + } + + const fn = actionsMap[cmd.action]; + if (!fn) { + logger.info({ + type: "unsupported-action", + message: `can't run given action: ${cmd.action}`, + }); + return; + } + + return fn(cmd.action, ...(cmd?.args || [])); +}; + +export const lineHandler = lineHandlerFn(); + export const buildRoutes = (routes, globalInterceptors = []) => routes.reduce( (acc, [methods, path, handlerFn, interceptors = []]) => |