{"version":3,"file":"index-node18.mjs","sources":["../src/index.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport type { Readable as ReadableStream } from 'node:stream';\nimport { gracefulKill } from 'graceful-kill';\nimport { Logger, addConfig, Level } from 'nightingale';\nimport { ConsoleHandler } from 'nightingale-console';\nimport split from 'split';\n\naddConfig({\n  pattern: /^springbokjs-daemon/,\n  handler: new ConsoleHandler(Level.INFO),\n});\n\nexport interface Options<Messages = any> {\n  key?: string;\n  displayName?: string;\n  prefixStdout?: boolean;\n  outputKey?: string;\n  outputDisplayName?: string;\n  command?: string;\n  args?: (number | string)[];\n  cwd?: string;\n  env?: NodeJS.ProcessEnv;\n  autoRestart?: boolean;\n  SIGTERMTimeout?: number;\n  onMessage?: (message: Messages) => void;\n}\n\nexport interface Daemon {\n  hasExited: () => boolean;\n  start: () => Promise<void>;\n  stop: () => Promise<void>;\n  restart: () => Promise<void>;\n  sendSIGUSR2: () => void;\n}\n\nexport function createDaemon({\n  key,\n  displayName,\n  prefixStdout = false,\n  outputKey = key,\n  outputDisplayName = displayName,\n  command = global.process.argv[0],\n  args = [],\n  cwd,\n  env,\n  autoRestart = false,\n  SIGTERMTimeout = 4000,\n  onMessage,\n}: Options = {}): Daemon {\n  let process: ChildProcess | null = null;\n  let stopPromise: Promise<void> | void;\n  const logger = new Logger(\n    `springbokjs-daemon${key ? `:${key}` : ''}`,\n    displayName,\n  );\n  logger.info('created', { command, args });\n\n  const outputLogger = prefixStdout\n    ? new Logger(\n        `springbokjs-daemon${outputKey ? `:${outputKey}` : ''}`,\n        outputDisplayName,\n      )\n    : undefined;\n\n  const stop = (): Promise<void> => {\n    if (!process) return Promise.resolve(stopPromise);\n\n    const runningProcess = process;\n    process = null;\n\n    runningProcess.removeAllListeners();\n    stopPromise = gracefulKill(runningProcess, SIGTERMTimeout).then(() => {\n      stopPromise = undefined;\n    });\n\n    return stopPromise;\n  };\n\n  const start = (): Promise<void> => {\n    if (process) {\n      throw new Error('Process already started');\n    }\n\n    return new Promise((resolve, reject) => {\n      const stdoutOption = outputLogger ? 'pipe' : 'inherit';\n      process = spawn(command, args as string[], {\n        cwd,\n        env,\n        stdio: ['ignore', stdoutOption, stdoutOption, 'ipc'],\n      });\n\n      if (outputLogger) {\n        const logStreamInLogger = (\n          stream: ReadableStream | null,\n          loggerLevel: Level,\n        ): void => {\n          if (!stream) return;\n          stream.pipe(split()).on('data', (line: string) => {\n            if (line.length === 0) return;\n            if (line.startsWith('{') && line.endsWith('}')) {\n              try {\n                const json = JSON.parse(line) as Record<string, unknown>;\n                logger.log('', json, loggerLevel);\n                return;\n              } catch {}\n            }\n\n            outputLogger.log(line, undefined, loggerLevel);\n          });\n        };\n\n        logStreamInLogger(process.stdout, Level.NOTICE);\n        logStreamInLogger(process.stderr, Level.ERROR);\n      }\n\n      process.on('exit', (code, signal) => {\n        logger.warn('exited', { code, signal });\n        process = null;\n        if (autoRestart) {\n          logger.debug('autorestart');\n          start().then(resolve, reject);\n        } else {\n          reject();\n        }\n      });\n\n      process.on('message', (message) => {\n        if (message === 'ready') {\n          logger.success('ready');\n          if (onMessage) onMessage('ready');\n          resolve();\n        } else if (message === 'restart') {\n          logger.notice('restarting...');\n          stop().then(\n            () => start(),\n            () => {},\n          );\n        } else if (onMessage) {\n          onMessage(message);\n        } else {\n          logger.notice('message', { message });\n        }\n      });\n    });\n  };\n\n  return {\n    hasExited(): boolean {\n      return process === null;\n    },\n\n    start() {\n      logger.notice('starting...');\n      return start();\n    },\n\n    stop() {\n      if (!process) logger.notice('stopping...');\n      return stop();\n    },\n\n    restart() {\n      logger.notice('restarting...');\n      return stop().then(() => start());\n    },\n\n    sendSIGUSR2() {\n      if (process) {\n        process.kill('SIGUSR2');\n      }\n    },\n  };\n}\n\n/** @deprecated use named export instead */\nexport default createDaemon;\n"],"names":["addConfig","pattern","handler","ConsoleHandler","Level","INFO","createDaemon","key","displayName","prefixStdout","outputKey","outputDisplayName","command","global","process","argv","args","cwd","env","autoRestart","SIGTERMTimeout","onMessage","stopPromise","logger","Logger","info","outputLogger","undefined","stop","Promise","resolve","runningProcess","removeAllListeners","gracefulKill","then","start","Error","reject","stdoutOption","spawn","stdio","logStreamInLogger","stream","loggerLevel","pipe","split","on","line","length","startsWith","endsWith","json","JSON","parse","log","stdout","NOTICE","stderr","ERROR","code","signal","warn","debug","message","success","notice","hasExited","restart","sendSIGUSR2","kill"],"mappings":"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"}