pidnap 0.0.0-dev.6 → 0.0.0-dev.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -744,6 +744,89 @@ var TaskList = class {
744
744
  }
745
745
  };
746
746
 
747
+ //#endregion
748
+ //#region src/logger.ts
749
+ const colors = {
750
+ reset: "\x1B[0m",
751
+ gray: "\x1B[90m",
752
+ white: "\x1B[37m",
753
+ green: "\x1B[32m",
754
+ yellow: "\x1B[33m",
755
+ red: "\x1B[31m",
756
+ bold: "\x1B[1m"
757
+ };
758
+ const levelColors = {
759
+ debug: colors.gray,
760
+ info: colors.green,
761
+ warn: colors.yellow,
762
+ error: colors.red
763
+ };
764
+ const formatTime = (date) => Intl.DateTimeFormat("en-US", {
765
+ hour: "2-digit",
766
+ minute: "2-digit",
767
+ second: "2-digit",
768
+ fractionalSecondDigits: 3,
769
+ hourCycle: "h23"
770
+ }).format(date);
771
+ const formatPrefixNoColor = (level, name, time) => {
772
+ const levelFormatted = level.toUpperCase().padStart(5);
773
+ return `[${formatTime(time)}] ${levelFormatted} (${name})`;
774
+ };
775
+ const formatPrefixWithColor = (level, name, time) => {
776
+ const levelFormatted = level.toUpperCase().padStart(5);
777
+ const timestamp = formatTime(time);
778
+ const levelTint = levelColors[level] ?? "";
779
+ return `${colors.gray}[${timestamp}]${colors.reset} ${levelTint}${levelFormatted}${colors.reset} (${name})`;
780
+ };
781
+ const formatMessagePrefix = (prefix, colored) => {
782
+ if (!prefix) return "";
783
+ if (colored) return `${colors.bold}${colors.white}[${prefix}]${colors.reset} `;
784
+ return `[${prefix}]`;
785
+ };
786
+ const logLine = (config, level, args) => {
787
+ const message = format(...args);
788
+ const time = /* @__PURE__ */ new Date();
789
+ if (config.logFile) {
790
+ const plainLine = [
791
+ formatPrefixNoColor(level, config.name, time),
792
+ formatMessagePrefix(config.prefix, false),
793
+ message
794
+ ].filter(Boolean).join(" ");
795
+ try {
796
+ appendFileSync(config.logFile, `${plainLine}\n`);
797
+ } catch {}
798
+ }
799
+ if (config.stdout) {
800
+ const coloredLine = [
801
+ formatPrefixWithColor(level, config.name, time),
802
+ formatMessagePrefix(config.prefix, true),
803
+ message
804
+ ].filter(Boolean).join(" ");
805
+ console[level](coloredLine);
806
+ }
807
+ };
808
+ const logger = (_config) => {
809
+ const config = {
810
+ stdout: true,
811
+ ..._config
812
+ };
813
+ return {
814
+ info: (...args) => logLine(config, "info", args),
815
+ error: (...args) => logLine(config, "error", args),
816
+ warn: (...args) => logLine(config, "warn", args),
817
+ debug: (...args) => logLine(config, "debug", args),
818
+ child: (suffix, overrides = {}) => logger({
819
+ ...config,
820
+ ...overrides,
821
+ name: `${config.name}:${suffix}`
822
+ }),
823
+ withPrefix: (prefix) => logger({
824
+ ...config,
825
+ prefix
826
+ })
827
+ };
828
+ };
829
+
747
830
  //#endregion
748
831
  //#region src/env-manager.ts
749
832
  var EnvManager = class {
@@ -755,8 +838,10 @@ var EnvManager = class {
755
838
  changeCallbacks = /* @__PURE__ */ new Set();
756
839
  cwdWatcher = null;
757
840
  customKeys = /* @__PURE__ */ new Set();
758
- constructor(config) {
841
+ logger;
842
+ constructor(config, logger) {
759
843
  this.config = config;
844
+ this.logger = logger;
760
845
  this.globalEnvPath = config.globalEnvFile ? isAbsolute(config.globalEnvFile) ? config.globalEnvFile : resolve(config.cwd, config.globalEnvFile) : resolve(config.cwd, ".env");
761
846
  this.loadCustomEnvFiles();
762
847
  this.loadEnvFilesFromCwd();
@@ -768,6 +853,7 @@ var EnvManager = class {
768
853
  */
769
854
  registerFile(key, filePath) {
770
855
  const absolutePath = isAbsolute(filePath) ? filePath : resolve(this.config.cwd, filePath);
856
+ this.logger.debug(`Registering custom env file for "${key}": ${absolutePath}`);
771
857
  this.customKeys.add(key);
772
858
  this.loadEnvFile(key, absolutePath);
773
859
  }
@@ -792,22 +878,28 @@ var EnvManager = class {
792
878
  };
793
879
  }
794
880
  loadEnvFilesFromCwd() {
881
+ this.logger.debug(`Scanning for env files in: ${this.config.cwd}`);
795
882
  if (existsSync(this.globalEnvPath)) this.loadGlobalEnv(this.globalEnvPath);
796
883
  try {
797
884
  const envFiles = globSync(".env.*", { cwd: this.config.cwd });
885
+ this.logger.debug(`Found ${envFiles.length} env file(s): ${envFiles.join(", ") || "(none)"}`);
798
886
  for (const filePath of envFiles) {
799
887
  const key = this.getEnvKeySuffix(basename(filePath));
800
888
  if (key && !this.customKeys.has(key)) this.loadEnvFile(key, resolve(this.config.cwd, filePath));
889
+ else if (key && this.customKeys.has(key)) this.logger.debug(`Skipping auto-discovered "${filePath}" (custom file registered for "${key}")`);
801
890
  }
802
891
  } catch (err) {
803
- console.warn("Failed to scan env files:", err);
892
+ this.logger.warn("Failed to scan env files:", err);
804
893
  }
805
894
  }
806
895
  parseEnvFile(absolutePath) {
807
896
  try {
808
- return parse(readFileSync(absolutePath, "utf-8")) ?? {};
897
+ const parsed = parse(readFileSync(absolutePath, "utf-8")) ?? {};
898
+ const keys = Object.keys(parsed);
899
+ this.logger.debug(`Parsed env file "${absolutePath}": ${keys.length} variable(s) [${keys.join(", ")}]`);
900
+ return parsed;
809
901
  } catch (err) {
810
- console.warn(`Failed to parse env file: ${absolutePath}`, err);
902
+ this.logger.warn(`Failed to parse env file: ${absolutePath}`, err);
811
903
  return null;
812
904
  }
813
905
  }
@@ -816,7 +908,11 @@ var EnvManager = class {
816
908
  return match ? match[1] : null;
817
909
  }
818
910
  loadGlobalEnv(absolutePath) {
819
- if (!existsSync(absolutePath)) return;
911
+ if (!existsSync(absolutePath)) {
912
+ this.logger.debug(`Global env file not found: ${absolutePath}`);
913
+ return;
914
+ }
915
+ this.logger.debug(`Loading global env file: ${absolutePath}`);
820
916
  const parsed = this.parseEnvFile(absolutePath);
821
917
  if (parsed) {
822
918
  this.globalEnv = parsed;
@@ -824,6 +920,7 @@ var EnvManager = class {
824
920
  }
825
921
  }
826
922
  loadEnvFile(key, absolutePath) {
923
+ this.logger.debug(`Loading env file for "${key}": ${absolutePath}`);
827
924
  const parsed = this.parseEnvFile(absolutePath);
828
925
  if (!parsed) return;
829
926
  this.env.set(key, parsed);
@@ -840,7 +937,7 @@ var EnvManager = class {
840
937
  });
841
938
  this.watchers.set(absolutePath, watcher);
842
939
  } catch (err) {
843
- console.warn(`Failed to watch env file: ${absolutePath}`, err);
940
+ this.logger.warn(`Failed to watch env file: ${absolutePath}`, err);
844
941
  }
845
942
  }
846
943
  /**
@@ -855,17 +952,20 @@ var EnvManager = class {
855
952
  this.handleNewFile(filePath);
856
953
  });
857
954
  } catch (err) {
858
- console.warn(`Failed to watch cwd for new env files:`, err);
955
+ this.logger.warn(`Failed to watch cwd for new env files:`, err);
859
956
  }
860
957
  }
861
958
  handleFileChange(absolutePath) {
959
+ this.logger.debug(`File changed: ${absolutePath}`);
862
960
  if (absolutePath === this.globalEnvPath) {
961
+ this.logger.debug(`Global env file changed, reloading`);
863
962
  this.loadGlobalEnv(absolutePath);
864
963
  this.notifyCallbacks({ type: "global" });
865
964
  return;
866
965
  }
867
966
  const key = this.fileToKey.get(absolutePath);
868
967
  if (!key) return;
968
+ this.logger.debug(`Env file changed for "${key}", reloading`);
869
969
  const parsed = this.parseEnvFile(absolutePath);
870
970
  if (!parsed) return;
871
971
  this.env.set(key, parsed);
@@ -875,18 +975,21 @@ var EnvManager = class {
875
975
  });
876
976
  }
877
977
  handleFileDelete(absolutePath) {
978
+ this.logger.debug(`File deleted: ${absolutePath}`);
878
979
  const watcher = this.watchers.get(absolutePath);
879
980
  if (watcher) {
880
981
  watcher.close();
881
982
  this.watchers.delete(absolutePath);
882
983
  }
883
984
  if (absolutePath === this.globalEnvPath) {
985
+ this.logger.debug(`Global env file deleted, clearing global env`);
884
986
  this.globalEnv = {};
885
987
  this.notifyCallbacks({ type: "global" });
886
988
  return;
887
989
  }
888
990
  const key = this.fileToKey.get(absolutePath);
889
991
  if (key) {
992
+ this.logger.debug(`Env file deleted for "${key}", removing from registry`);
890
993
  this.env.delete(key);
891
994
  this.fileToKey.delete(absolutePath);
892
995
  this.notifyCallbacks({
@@ -897,19 +1000,23 @@ var EnvManager = class {
897
1000
  }
898
1001
  handleNewFile(filePath) {
899
1002
  const absolutePath = isAbsolute(filePath) ? filePath : resolve(this.config.cwd, filePath);
1003
+ this.logger.debug(`New file detected: ${absolutePath}`);
900
1004
  if (absolutePath === this.globalEnvPath) {
1005
+ this.logger.debug(`New global env file detected, loading`);
901
1006
  this.loadGlobalEnv(absolutePath);
902
1007
  this.notifyCallbacks({ type: "global" });
903
1008
  return;
904
1009
  }
905
1010
  const key = this.getEnvKeySuffix(basename(filePath));
906
1011
  if (key && !this.customKeys.has(key) && !this.env.has(key)) {
1012
+ this.logger.debug(`New env file detected for "${key}", loading`);
907
1013
  this.loadEnvFile(key, absolutePath);
908
1014
  this.notifyCallbacks({
909
1015
  type: "process",
910
1016
  key
911
1017
  });
912
- }
1018
+ } else if (key && this.customKeys.has(key)) this.logger.debug(`Ignoring new file "${filePath}" (custom file registered for "${key}")`);
1019
+ else if (key && this.env.has(key)) this.logger.debug(`Ignoring new file "${filePath}" (env for "${key}" already loaded)`);
913
1020
  }
914
1021
  notifyCallbacks(event) {
915
1022
  for (const callback of this.changeCallbacks) callback(event);
@@ -932,88 +1039,5 @@ var EnvManager = class {
932
1039
  };
933
1040
 
934
1041
  //#endregion
935
- //#region src/logger.ts
936
- const colors = {
937
- reset: "\x1B[0m",
938
- gray: "\x1B[90m",
939
- white: "\x1B[37m",
940
- green: "\x1B[32m",
941
- yellow: "\x1B[33m",
942
- red: "\x1B[31m",
943
- bold: "\x1B[1m"
944
- };
945
- const levelColors = {
946
- debug: colors.gray,
947
- info: colors.green,
948
- warn: colors.yellow,
949
- error: colors.red
950
- };
951
- const formatTime = (date) => Intl.DateTimeFormat("en-US", {
952
- hour: "2-digit",
953
- minute: "2-digit",
954
- second: "2-digit",
955
- fractionalSecondDigits: 3,
956
- hourCycle: "h23"
957
- }).format(date);
958
- const formatPrefixNoColor = (level, name, time) => {
959
- const levelFormatted = level.toUpperCase().padStart(5);
960
- return `[${formatTime(time)}] ${levelFormatted} (${name})`;
961
- };
962
- const formatPrefixWithColor = (level, name, time) => {
963
- const levelFormatted = level.toUpperCase().padStart(5);
964
- const timestamp = formatTime(time);
965
- const levelTint = levelColors[level] ?? "";
966
- return `${colors.gray}[${timestamp}]${colors.reset} ${levelTint}${levelFormatted}${colors.reset} (${name})`;
967
- };
968
- const formatMessagePrefix = (prefix, colored) => {
969
- if (!prefix) return "";
970
- if (colored) return `${colors.bold}${colors.white}[${prefix}]${colors.reset} `;
971
- return `[${prefix}]`;
972
- };
973
- const logLine = (config, level, args) => {
974
- const message = format(...args);
975
- const time = /* @__PURE__ */ new Date();
976
- if (config.logFile) {
977
- const plainLine = [
978
- formatPrefixNoColor(level, config.name, time),
979
- formatMessagePrefix(config.prefix, false),
980
- message
981
- ].filter(Boolean).join(" ");
982
- try {
983
- appendFileSync(config.logFile, `${plainLine}\n`);
984
- } catch {}
985
- }
986
- if (config.stdout) {
987
- const coloredLine = [
988
- formatPrefixWithColor(level, config.name, time),
989
- formatMessagePrefix(config.prefix, true),
990
- message
991
- ].filter(Boolean).join(" ");
992
- console[level](coloredLine);
993
- }
994
- };
995
- const logger = (_config) => {
996
- const config = {
997
- stdout: true,
998
- ..._config
999
- };
1000
- return {
1001
- info: (...args) => logLine(config, "info", args),
1002
- error: (...args) => logLine(config, "error", args),
1003
- warn: (...args) => logLine(config, "warn", args),
1004
- debug: (...args) => logLine(config, "debug", args),
1005
- child: (suffix, overrides = {}) => logger({
1006
- ...config,
1007
- ...overrides,
1008
- name: `${config.name}:${suffix}`
1009
- }),
1010
- withPrefix: (prefix) => logger({
1011
- ...config,
1012
- prefix
1013
- })
1014
- };
1015
- };
1016
-
1017
- //#endregion
1018
- export { ProcessDefinition as _, TaskStateSchema as a, CronProcessState as c, CrashLoopConfig as d, RestartPolicy as f, LazyProcess as g, RestartingProcessState as h, TaskList as i, RetryConfig as l, RestartingProcessOptions as m, EnvManager as n, CronProcess as o, RestartingProcess as p, NamedProcessDefinitionSchema as r, CronProcessOptions as s, logger as t, BackoffStrategy as u, ProcessState as v };
1019
- //# sourceMappingURL=logger-BU2RmetS.mjs.map
1042
+ export { ProcessDefinition as _, TaskStateSchema as a, CronProcessState as c, CrashLoopConfig as d, RestartPolicy as f, LazyProcess as g, RestartingProcessState as h, TaskList as i, RetryConfig as l, RestartingProcessOptions as m, logger as n, CronProcess as o, RestartingProcess as p, NamedProcessDefinitionSchema as r, CronProcessOptions as s, EnvManager as t, BackoffStrategy as u, ProcessState as v };
1043
+ //# sourceMappingURL=env-manager-FKhvfwIR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-manager-FKhvfwIR.mjs","names":["setTimeout"],"sources":["../src/lazy-process.ts","../src/restarting-process.ts","../src/cron-process.ts","../src/task-list.ts","../src/logger.ts","../src/env-manager.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport type { Logger } from \"./logger.ts\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { createInterface } from \"node:readline/promises\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\n\nexport const ProcessDefinition = v.object({\n command: v.string(),\n args: v.optional(v.array(v.string())),\n cwd: v.optional(v.string()),\n env: v.optional(v.record(v.string(), v.string())),\n});\nexport type ProcessDefinition = v.InferOutput<typeof ProcessDefinition>;\n\nexport const ProcessState = v.picklist([\n \"idle\",\n \"starting\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"error\",\n]);\nexport type ProcessState = v.InferOutput<typeof ProcessState>;\n\n/**\n * Kill a process group (the process and all its descendants).\n * Uses negative PID to target the entire process group.\n */\nfunction killProcessGroup(pid: number, signal: NodeJS.Signals): boolean {\n try {\n // Negative PID kills the entire process group\n process.kill(-pid, signal);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ESRCH = No such process (already dead)\n // EPERM = Permission denied (might happen if some children already exited)\n if (code === \"ESRCH\" || code === \"EPERM\") {\n return true;\n }\n return false;\n }\n}\n\nexport class LazyProcess {\n readonly name: string;\n definition: ProcessDefinition;\n private logger: Logger;\n private childProcess: ChildProcess | null = null;\n private _state: ProcessState = \"idle\";\n private processExit = Promise.withResolvers<void>();\n public exitCode: number | null = null;\n\n constructor(name: string, definition: ProcessDefinition, logger: Logger) {\n this.name = name;\n this.definition = definition;\n this.logger = logger.withPrefix(\"SYS\");\n }\n\n get state(): ProcessState {\n return this._state;\n }\n\n async start() {\n if (this._state === \"running\" || this._state === \"starting\") {\n throw new Error(`Process \"${this.name}\" is already ${this._state}`);\n }\n\n if (this._state === \"stopping\") {\n throw new Error(`Process \"${this.name}\" is currently stopping`);\n }\n\n this._state = \"starting\";\n this.processExit = Promise.withResolvers<void>();\n this.logger.debug(`Starting process: ${this.definition.command}`);\n\n try {\n const env = this.definition.env ? { ...process.env, ...this.definition.env } : process.env;\n\n this.childProcess = spawn(this.definition.command, this.definition.args ?? [], {\n cwd: this.definition.cwd,\n env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n });\n\n this._state = \"running\";\n\n if (this.childProcess.stdout) {\n const rl = createInterface({ input: this.childProcess.stdout });\n rl.on(\"line\", (line) => this.logger.withPrefix(\"OUT\").info(line));\n this.processExit.promise.then(() => rl.close());\n }\n\n if (this.childProcess.stderr) {\n const rl = createInterface({ input: this.childProcess.stderr });\n rl.on(\"line\", (line) => this.logger.withPrefix(\"ERR\").info(line));\n this.processExit.promise.then(() => rl.close());\n }\n\n this.childProcess.on(\"exit\", (code, signal) => {\n this.exitCode = code;\n\n if (this._state === \"running\") {\n if (code === 0) {\n this._state = \"stopped\";\n this.logger.info(`Process exited with code ${code}`);\n } else if (signal) {\n this._state = \"stopped\";\n this.logger.info(`Process killed with signal ${signal}`);\n } else {\n this._state = \"error\";\n this.logger.error(`Process exited with code ${code}`);\n }\n }\n\n this.processExit.resolve();\n });\n\n this.childProcess.on(\"error\", (err) => {\n if (this._state !== \"stopping\" && this._state !== \"stopped\") {\n this._state = \"error\";\n this.logger.error(`Process error:`, err);\n }\n this.processExit.resolve();\n });\n } catch (err) {\n this._state = \"error\";\n this.logger.error(`Failed to start process:`, err);\n throw err;\n }\n }\n\n async stop(timeout?: number): Promise<void> {\n if (this._state === \"idle\" || this._state === \"stopped\" || this._state === \"error\") {\n return;\n }\n\n if (this._state === \"stopping\") {\n // Already stopping, wait for completion\n await this.processExit.promise;\n return;\n }\n\n if (!this.childProcess) {\n this._state = \"stopped\";\n return;\n }\n\n this._state = \"stopping\";\n const pid = this.childProcess.pid;\n\n if (pid === undefined) {\n this._state = \"stopped\";\n this.cleanup();\n return;\n }\n\n this.logger.debug(`Stopping process group (pid: ${pid}) with SIGTERM`);\n\n const timeoutMs = timeout ?? 5000;\n const resultRace = Promise.race([\n this.processExit.promise.then(() => \"exited\" as const),\n setTimeout(timeoutMs, \"timeout\"),\n ]);\n\n killProcessGroup(pid, \"SIGTERM\");\n\n this.logger.debug(`Waiting for process exit (timeout: ${timeoutMs}ms)`);\n const result = await resultRace;\n this.logger.debug(`process exit result: ${result}`);\n\n if (result === \"timeout\") {\n this.logger.warn(`Process did not exit within ${timeoutMs}ms, sending SIGKILL (pid: ${pid})`);\n const killed = killProcessGroup(pid, \"SIGKILL\");\n this.logger.info(`SIGKILL sent to process group: ${killed ? \"success\" : \"failed\"}`);\n\n const killTimeout = setTimeout(1000, \"timeout\");\n await Promise.race([this.processExit.promise, killTimeout]);\n\n if (this.childProcess && !this.childProcess.killed) {\n this.logger.error(`Process still alive after SIGKILL (pid: ${pid})`);\n }\n }\n\n this._state = \"stopped\";\n this.cleanup();\n this.logger.info(`Process stopped`);\n }\n\n async reset(): Promise<void> {\n if (this.childProcess?.pid !== undefined) {\n // Kill the entire process group\n killProcessGroup(this.childProcess.pid, \"SIGKILL\");\n await this.processExit.promise;\n this.cleanup();\n }\n\n this._state = \"idle\";\n // Create a fresh promise for the next process lifecycle\n this.processExit = Promise.withResolvers<void>();\n this.logger.info(`Process reset to idle`);\n }\n\n updateDefinition(definition: ProcessDefinition): void {\n this.definition = definition;\n }\n\n async waitForExit(): Promise<ProcessState> {\n if (!this.childProcess) return this._state;\n await this.processExit.promise;\n return this._state;\n }\n\n private cleanup(): void {\n if (this.childProcess) {\n this.childProcess.removeAllListeners();\n this.childProcess = null;\n }\n\n this.exitCode = null;\n }\n}\n","import * as v from \"valibot\";\nimport { LazyProcess, type ProcessDefinition, type ProcessState } from \"./lazy-process.ts\";\nimport type { Logger } from \"./logger.ts\";\n\nexport const RestartPolicy = v.picklist([\n \"always\",\n \"on-failure\",\n \"never\",\n \"unless-stopped\",\n \"on-success\",\n]);\nexport type RestartPolicy = v.InferOutput<typeof RestartPolicy>;\n\nexport const BackoffStrategy = v.union([\n v.object({\n type: v.literal(\"fixed\"),\n delayMs: v.number(),\n }),\n v.object({\n type: v.literal(\"exponential\"),\n initialDelayMs: v.number(),\n maxDelayMs: v.number(),\n multiplier: v.optional(v.number()),\n }),\n]);\nexport type BackoffStrategy = v.InferOutput<typeof BackoffStrategy>;\n\nexport const CrashLoopConfig = v.object({\n maxRestarts: v.number(),\n windowMs: v.number(),\n backoffMs: v.number(),\n});\nexport type CrashLoopConfig = v.InferOutput<typeof CrashLoopConfig>;\n\nexport const RestartingProcessOptions = v.object({\n restartPolicy: RestartPolicy,\n backoff: v.optional(BackoffStrategy),\n crashLoop: v.optional(CrashLoopConfig),\n minUptimeMs: v.optional(v.number()),\n maxTotalRestarts: v.optional(v.number()),\n});\nexport type RestartingProcessOptions = v.InferOutput<typeof RestartingProcessOptions>;\n\nexport const RestartingProcessState = v.picklist([\n \"idle\",\n \"running\",\n \"restarting\",\n \"stopping\",\n \"stopped\",\n \"crash-loop-backoff\",\n \"max-restarts-reached\",\n]);\nexport type RestartingProcessState = v.InferOutput<typeof RestartingProcessState>;\n\nconst DEFAULT_BACKOFF: BackoffStrategy = { type: \"fixed\", delayMs: 1000 };\nconst DEFAULT_CRASH_LOOP: CrashLoopConfig = { maxRestarts: 5, windowMs: 60000, backoffMs: 60000 };\n\nexport class RestartingProcess {\n readonly name: string;\n readonly lazyProcess: LazyProcess;\n private options: Required<Omit<RestartingProcessOptions, \"maxTotalRestarts\">> & {\n maxTotalRestarts?: number;\n };\n private logger: Logger;\n\n // State tracking\n private _state: RestartingProcessState = \"idle\";\n private _restartCount: number = 0;\n private restartTimestamps: number[] = []; // For crash loop detection\n private consecutiveFailures: number = 0; // For exponential backoff\n private lastStartTime: number | null = null;\n private stopRequested: boolean = false;\n private pendingDelayTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n name: string,\n definition: ProcessDefinition,\n options: RestartingProcessOptions,\n logger: Logger,\n ) {\n this.name = name;\n this.logger = logger;\n this.options = {\n restartPolicy: options.restartPolicy,\n backoff: options.backoff ?? DEFAULT_BACKOFF,\n crashLoop: options.crashLoop ?? DEFAULT_CRASH_LOOP,\n minUptimeMs: options.minUptimeMs ?? 0,\n maxTotalRestarts: options.maxTotalRestarts,\n };\n this.lazyProcess = new LazyProcess(name, definition, logger);\n }\n\n get state(): RestartingProcessState {\n return this._state;\n }\n\n get restarts(): number {\n return this._restartCount;\n }\n\n start(): void {\n if (this._state === \"running\" || this._state === \"restarting\") {\n throw new Error(`Process \"${this.name}\" is already ${this._state}`);\n }\n\n if (this._state === \"stopping\") {\n throw new Error(`Process \"${this.name}\" is currently stopping`);\n }\n\n // Fresh start from terminal states - reset counters\n if (\n this._state === \"stopped\" ||\n this._state === \"idle\" ||\n this._state === \"max-restarts-reached\"\n ) {\n this.resetCounters();\n }\n\n this.stopRequested = false;\n this.startProcess();\n }\n\n async stop(timeout?: number): Promise<void> {\n this.stopRequested = true;\n\n // Clear any pending delays\n if (this.pendingDelayTimeout) {\n clearTimeout(this.pendingDelayTimeout);\n this.pendingDelayTimeout = null;\n }\n\n if (\n this._state === \"idle\" ||\n this._state === \"stopped\" ||\n this._state === \"max-restarts-reached\"\n ) {\n this._state = \"stopped\";\n return;\n }\n\n this._state = \"stopping\";\n await this.lazyProcess.stop(timeout);\n this._state = \"stopped\";\n this.logger.info(`RestartingProcess stopped`);\n }\n\n async restart(force: boolean = false): Promise<void> {\n // Fresh start from terminal states - reset counters and no delay\n if (\n this._state === \"stopped\" ||\n this._state === \"idle\" ||\n this._state === \"max-restarts-reached\"\n ) {\n this.resetCounters();\n this.stopRequested = false;\n this.startProcess();\n return;\n }\n\n // Stop the current process first\n await this.stop();\n\n this.stopRequested = false;\n\n if (force) {\n // Force restart - no delay\n this.startProcess();\n } else {\n // Follow normal delay strategy\n const delay = this.calculateDelay();\n if (delay > 0) {\n this._state = \"restarting\";\n this.logger.info(`Restarting in ${delay}ms`);\n await this.delay(delay);\n if (this.stopRequested) return;\n }\n this.startProcess();\n }\n }\n\n /**\n * Update process definition and optionally restart with new config\n */\n async reload(\n newDefinition: ProcessDefinition,\n restartImmediately: boolean = true,\n ): Promise<void> {\n this.logger.info(`Reloading process with new definition`);\n this.lazyProcess.updateDefinition(newDefinition);\n\n if (restartImmediately) {\n // Restart with force=true to apply changes immediately\n await this.restart(true);\n }\n }\n\n /**\n * Update restart options\n */\n updateOptions(newOptions: Partial<RestartingProcessOptions>): void {\n this.logger.info(`Updating restart options`);\n this.options = {\n ...this.options,\n restartPolicy: newOptions.restartPolicy ?? this.options.restartPolicy,\n backoff: newOptions.backoff ?? this.options.backoff,\n crashLoop: newOptions.crashLoop ?? this.options.crashLoop,\n minUptimeMs: newOptions.minUptimeMs ?? this.options.minUptimeMs,\n maxTotalRestarts: newOptions.maxTotalRestarts ?? this.options.maxTotalRestarts,\n };\n }\n\n private resetCounters(): void {\n this._restartCount = 0;\n this.consecutiveFailures = 0;\n this.restartTimestamps = [];\n }\n\n private startProcess(): void {\n this.lastStartTime = Date.now();\n this._state = \"running\";\n\n this.lazyProcess\n .reset()\n .then(async () => {\n if (this.stopRequested) return;\n await this.lazyProcess.start();\n return this.lazyProcess.waitForExit();\n })\n .then((exitState) => {\n if (!exitState) return;\n if (this.stopRequested && exitState === \"error\") {\n this._state = \"stopped\";\n return;\n }\n if (exitState === \"stopped\" || exitState === \"error\") {\n this.handleProcessExit(exitState);\n }\n })\n .catch((err) => {\n if (this.stopRequested) return;\n this._state = \"stopped\";\n this.logger.error(`Failed to start process:`, err);\n });\n }\n\n private handleProcessExit(exitState: ProcessState): void {\n if (this.stopRequested) {\n this._state = \"stopped\";\n return;\n }\n\n const uptime = this.lastStartTime ? Date.now() - this.lastStartTime : 0;\n const wasHealthy = uptime >= this.options.minUptimeMs;\n const exitedWithError = exitState === \"error\";\n\n // Reset consecutive failures if the process ran long enough\n if (wasHealthy) {\n this.consecutiveFailures = 0;\n } else {\n this.consecutiveFailures++;\n }\n\n // Check if policy allows restart\n if (!this.shouldRestart(exitedWithError)) {\n this._state = \"stopped\";\n this.logger.info(\n `Process exited, policy \"${this.options.restartPolicy}\" does not allow restart`,\n );\n return;\n }\n\n // Check max total restarts\n if (\n this.options.maxTotalRestarts !== undefined &&\n this._restartCount >= this.options.maxTotalRestarts\n ) {\n this._state = \"max-restarts-reached\";\n this.logger.warn(`Max total restarts (${this.options.maxTotalRestarts}) reached`);\n return;\n }\n\n // Record restart timestamp for crash loop detection\n const now = Date.now();\n this.restartTimestamps.push(now);\n\n // Check for crash loop\n if (this.isInCrashLoop()) {\n this._state = \"crash-loop-backoff\";\n this.logger.warn(\n `Crash loop detected (${this.options.crashLoop.maxRestarts} restarts in ${this.options.crashLoop.windowMs}ms), backing off for ${this.options.crashLoop.backoffMs}ms`,\n );\n this.scheduleCrashLoopRecovery();\n return;\n }\n\n // Schedule restart with delay\n this._restartCount++;\n this.scheduleRestart();\n }\n\n private shouldRestart(exitedWithError: boolean): boolean {\n switch (this.options.restartPolicy) {\n case \"always\":\n return true;\n case \"never\":\n return false;\n case \"on-failure\":\n return exitedWithError;\n case \"on-success\":\n return !exitedWithError;\n case \"unless-stopped\":\n return !this.stopRequested;\n default:\n return false;\n }\n }\n\n private isInCrashLoop(): boolean {\n const { maxRestarts, windowMs } = this.options.crashLoop;\n const now = Date.now();\n const cutoff = now - windowMs;\n\n // Clean up old timestamps\n this.restartTimestamps = this.restartTimestamps.filter((ts) => ts > cutoff);\n\n return this.restartTimestamps.length >= maxRestarts;\n }\n\n private calculateDelay(): number {\n const { backoff } = this.options;\n\n if (backoff.type === \"fixed\") {\n return backoff.delayMs;\n }\n\n // Exponential backoff\n const multiplier = backoff.multiplier ?? 2;\n const delay = backoff.initialDelayMs * Math.pow(multiplier, this.consecutiveFailures);\n return Math.min(delay, backoff.maxDelayMs);\n }\n\n private scheduleRestart(): void {\n this._state = \"restarting\";\n const delay = this.calculateDelay();\n\n this.logger.info(`Restarting in ${delay}ms (restart #${this._restartCount})`);\n\n this.pendingDelayTimeout = setTimeout(() => {\n this.pendingDelayTimeout = null;\n if (this.stopRequested) {\n this._state = \"stopped\";\n return;\n }\n this.startProcess();\n }, delay);\n }\n\n private scheduleCrashLoopRecovery(): void {\n const { backoffMs } = this.options.crashLoop;\n\n this.pendingDelayTimeout = setTimeout(() => {\n this.pendingDelayTimeout = null;\n if (this.stopRequested) {\n this._state = \"stopped\";\n return;\n }\n\n // Reset crash loop timestamps after backoff\n this.restartTimestamps = [];\n this._restartCount++;\n this.logger.info(`Crash loop backoff complete, restarting (restart #${this._restartCount})`);\n this.startProcess();\n }, backoffMs);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n this.pendingDelayTimeout = setTimeout(() => {\n this.pendingDelayTimeout = null;\n resolve();\n }, ms);\n });\n }\n}\n","import { Cron } from \"croner\";\nimport * as v from \"valibot\";\nimport { LazyProcess, type ProcessDefinition } from \"./lazy-process.ts\";\nimport type { Logger } from \"./logger.ts\";\n\nexport const RetryConfig = v.object({\n maxRetries: v.number(),\n delayMs: v.optional(v.number()),\n});\nexport type RetryConfig = v.InferOutput<typeof RetryConfig>;\n\nexport const CronProcessOptions = v.object({\n schedule: v.string(),\n retry: v.optional(RetryConfig),\n runOnStart: v.optional(v.boolean()),\n});\nexport type CronProcessOptions = v.InferOutput<typeof CronProcessOptions>;\n\nexport const CronProcessState = v.picklist([\n \"idle\",\n \"scheduled\",\n \"running\",\n \"retrying\",\n \"queued\",\n \"stopping\",\n \"stopped\",\n]);\nexport type CronProcessState = v.InferOutput<typeof CronProcessState>;\n\nconst DEFAULT_RETRY_DELAY = 1000;\n\nexport class CronProcess {\n readonly name: string;\n readonly lazyProcess: LazyProcess;\n private options: CronProcessOptions;\n private logger: Logger;\n private cronJob: Cron | null = null;\n\n private _state: CronProcessState = \"idle\";\n private _runCount: number = 0;\n private _failCount: number = 0;\n private currentRetryAttempt: number = 0;\n private queuedRun: boolean = false;\n private stopRequested: boolean = false;\n private retryTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n name: string,\n definition: ProcessDefinition,\n options: CronProcessOptions,\n logger: Logger,\n ) {\n this.name = name;\n this.options = options;\n this.logger = logger;\n this.lazyProcess = new LazyProcess(name, definition, logger);\n }\n\n get state(): CronProcessState {\n return this._state;\n }\n\n get runCount(): number {\n return this._runCount;\n }\n\n get failCount(): number {\n return this._failCount;\n }\n\n get nextRun(): Date | null {\n if (!this.cronJob) return null;\n const next = this.cronJob.nextRun();\n return next ?? null;\n }\n\n start(): void {\n if (this._state === \"scheduled\" || this._state === \"running\" || this._state === \"queued\") {\n throw new Error(`CronProcess \"${this.name}\" is already ${this._state}`);\n }\n\n if (this._state === \"stopping\") {\n throw new Error(`CronProcess \"${this.name}\" is currently stopping`);\n }\n\n this.stopRequested = false;\n this.logger.info(`Starting cron schedule: ${this.options.schedule}`);\n\n this.cronJob = new Cron(this.options.schedule, { timezone: \"UTC\" }, () => {\n this.onCronTick();\n });\n\n this._state = \"scheduled\";\n\n if (this.options.runOnStart) {\n this.executeJob();\n }\n }\n\n async stop(timeout?: number): Promise<void> {\n this.stopRequested = true;\n\n // Stop the cron job\n if (this.cronJob) {\n this.cronJob.stop();\n this.cronJob = null;\n }\n\n // Clear any pending retry timeout\n if (this.retryTimeout) {\n clearTimeout(this.retryTimeout);\n this.retryTimeout = null;\n }\n\n if (this._state === \"idle\" || this._state === \"stopped\") {\n this._state = \"stopped\";\n return;\n }\n\n // If running, stop the current job\n if (this._state === \"running\" || this._state === \"retrying\" || this._state === \"queued\") {\n this._state = \"stopping\";\n await this.lazyProcess.stop(timeout);\n }\n\n this._state = \"stopped\";\n this.queuedRun = false;\n this.logger.info(`CronProcess stopped`);\n }\n\n async trigger(): Promise<void> {\n if (this.stopRequested) {\n throw new Error(`CronProcess \"${this.name}\" is stopped`);\n }\n\n // If already queued, just return (already have a run pending)\n if (this._state === \"queued\") {\n return;\n }\n\n // If already running, queue this trigger\n if (this._state === \"running\" || this._state === \"retrying\") {\n this.queuedRun = true;\n this._state = \"queued\";\n this.logger.info(`Run queued (current job still running)`);\n return;\n }\n\n await this.executeJob();\n }\n\n private onCronTick(): void {\n if (this.stopRequested) return;\n\n // If already running, queue the next run\n if (this._state === \"running\" || this._state === \"retrying\" || this._state === \"queued\") {\n this.queuedRun = true;\n if (this._state !== \"queued\") {\n this._state = \"queued\";\n }\n this.logger.info(`Cron tick: run queued (current job still running)`);\n return;\n }\n\n this.executeJob();\n }\n\n private async executeJob(): Promise<void> {\n if (this.stopRequested) return;\n\n this._state = \"running\";\n this.currentRetryAttempt = 0;\n this.logger.info(`Executing job`);\n\n await this.runJobWithRetry();\n }\n\n private async runJobWithRetry(): Promise<void> {\n if (this.stopRequested) return;\n\n // Reset and start the process\n await this.lazyProcess.reset();\n await this.lazyProcess.start();\n\n const exitState = await this.lazyProcess.waitForExit();\n if (this.stopRequested && exitState === \"error\") {\n this._state = \"stopped\";\n return;\n }\n this.handleJobComplete(exitState === \"error\");\n }\n\n private handleJobComplete(failed: boolean): void {\n if (this.stopRequested) {\n this._state = \"stopped\";\n return;\n }\n\n if (failed) {\n const maxRetries = this.options.retry?.maxRetries ?? 0;\n\n if (this.currentRetryAttempt < maxRetries) {\n // Retry\n this.currentRetryAttempt++;\n this._state = \"retrying\";\n const delayMs = this.options.retry?.delayMs ?? DEFAULT_RETRY_DELAY;\n\n this.logger.warn(\n `Job failed, retrying in ${delayMs}ms (attempt ${this.currentRetryAttempt}/${maxRetries})`,\n );\n\n this.retryTimeout = setTimeout(() => {\n this.retryTimeout = null;\n if (this.stopRequested) {\n this._state = \"stopped\";\n return;\n }\n this.runJobWithRetry();\n }, delayMs);\n return;\n }\n\n // All retries exhausted\n this._failCount++;\n this.logger.error(`Job failed after ${this.currentRetryAttempt} retries`);\n } else {\n this._runCount++;\n this.logger.info(`Job completed successfully`);\n }\n\n // Check for queued run\n if (this.queuedRun) {\n this.queuedRun = false;\n this.logger.info(`Starting queued run`);\n this.executeJob();\n return;\n }\n\n // Back to scheduled state\n if (this.cronJob) {\n this._state = \"scheduled\";\n } else {\n this._state = \"stopped\";\n }\n }\n}\n","import * as v from \"valibot\";\nimport { LazyProcess, ProcessDefinition } from \"./lazy-process.ts\";\nimport type { Logger } from \"./logger.ts\";\n\n// Per-task state\nexport const TaskStateSchema = v.picklist([\"pending\", \"running\", \"completed\", \"failed\", \"skipped\"]);\n\nexport type TaskState = v.InferOutput<typeof TaskStateSchema>;\n\n// Schema for named process definition\nexport const NamedProcessDefinitionSchema = v.object({\n name: v.string(),\n process: ProcessDefinition,\n});\n\nexport type NamedProcessDefinition = v.InferOutput<typeof NamedProcessDefinitionSchema>;\n\n// A task entry (single or parallel processes) with its state\nexport interface TaskEntry {\n id: string; // Unique task ID\n processes: NamedProcessDefinition[]; // Array (length 1 = sequential, >1 = parallel)\n state: TaskState;\n}\n\n// Simple TaskList state (just running or not)\nexport type TaskListState = \"idle\" | \"running\" | \"stopped\";\n\nexport class TaskList {\n readonly name: string;\n private _tasks: TaskEntry[] = [];\n private _state: TaskListState = \"idle\";\n private logger: Logger;\n private logFileResolver?: (processName: string) => string | undefined;\n private taskIdCounter: number = 0;\n private runningProcesses: LazyProcess[] = [];\n private stopRequested: boolean = false;\n private runLoopPromise: Promise<void> | null = null;\n\n constructor(\n name: string,\n logger: Logger,\n initialTasks?: (NamedProcessDefinition | NamedProcessDefinition[])[],\n logFileResolver?: (processName: string) => string | undefined,\n ) {\n this.name = name;\n this.logger = logger;\n this.logFileResolver = logFileResolver;\n\n // Add initial tasks if provided\n if (initialTasks) {\n for (const task of initialTasks) {\n this.addTask(task);\n }\n }\n }\n\n get state(): TaskListState {\n return this._state;\n }\n\n get tasks(): ReadonlyArray<TaskEntry> {\n return this._tasks;\n }\n\n removeTaskByTarget(target: string | number): TaskEntry {\n const index =\n typeof target === \"number\" ? target : this._tasks.findIndex((t) => t.id === target);\n if (index < 0 || index >= this._tasks.length) {\n throw new Error(`Task not found: ${target}`);\n }\n\n const task = this._tasks[index];\n if (task.state === \"running\") {\n throw new Error(`Cannot remove running task: ${task.id}`);\n }\n\n this._tasks.splice(index, 1);\n this.logger.info(`Task \"${task.id}\" removed`);\n return task;\n }\n\n /**\n * Add a single process or parallel processes as a new task\n * @returns The unique task ID\n */\n addTask(task: NamedProcessDefinition | NamedProcessDefinition[]): string {\n const id = `task-${++this.taskIdCounter}`;\n const processes = Array.isArray(task) ? task : [task];\n\n const entry: TaskEntry = {\n id,\n processes,\n state: \"pending\",\n };\n\n this._tasks.push(entry);\n this.logger.info(`Task \"${id}\" added with ${processes.length} process(es)`);\n\n return id;\n }\n\n /**\n * Begin executing pending tasks\n */\n start(): void {\n if (this._state === \"running\") {\n throw new Error(`TaskList \"${this.name}\" is already running`);\n }\n\n this.stopRequested = false;\n this._state = \"running\";\n this.logger.info(`TaskList started`);\n\n // Start the run loop (non-blocking)\n this.runLoopPromise = this.runLoop();\n }\n\n /**\n * Wait until the TaskList becomes idle (all pending tasks completed)\n */\n async waitUntilIdle(): Promise<void> {\n if (this._state === \"idle\" || this._state === \"stopped\") {\n return;\n }\n\n // Wait for the run loop to complete\n if (this.runLoopPromise) {\n await this.runLoopPromise;\n }\n }\n\n /**\n * Stop execution and mark remaining tasks as skipped\n */\n async stop(timeout?: number): Promise<void> {\n if (this._state === \"idle\" || this._state === \"stopped\") {\n this._state = \"stopped\";\n return;\n }\n\n this.stopRequested = true;\n this.logger.info(`Stopping TaskList...`);\n\n // Stop all currently running processes\n const stopPromises = this.runningProcesses.map((p) => p.stop(timeout));\n await Promise.all(stopPromises);\n this.runningProcesses = [];\n\n // Mark all pending tasks as skipped\n for (const task of this._tasks) {\n if (task.state === \"pending\") {\n task.state = \"skipped\";\n }\n }\n\n // Wait for run loop to finish\n if (this.runLoopPromise) {\n await this.runLoopPromise;\n this.runLoopPromise = null;\n }\n\n this._state = \"stopped\";\n this.logger.info(`TaskList stopped`);\n }\n\n private async runLoop(): Promise<void> {\n while (this._state === \"running\" && !this.stopRequested) {\n // Find the next pending task\n const nextTask = this._tasks.find((t) => t.state === \"pending\");\n\n if (!nextTask) {\n // No more pending tasks, go back to idle\n this._state = \"idle\";\n this.logger.info(`All tasks completed, TaskList is idle`);\n break;\n }\n\n await this.executeTask(nextTask);\n }\n }\n\n private async executeTask(task: TaskEntry): Promise<void> {\n if (this.stopRequested) {\n task.state = \"skipped\";\n return;\n }\n\n task.state = \"running\";\n const taskNames = task.processes.map((p) => p.name).join(\", \");\n this.logger.info(`Executing task \"${task.id}\": [${taskNames}]`);\n\n // Create LazyProcess instances for each process in the task\n const lazyProcesses: LazyProcess[] = task.processes.map((p) => {\n const logFile = this.logFileResolver?.(p.name);\n const childLogger = logFile\n ? this.logger.child(p.name, { logFile })\n : this.logger.child(p.name);\n return new LazyProcess(p.name, p.process, childLogger);\n });\n\n this.runningProcesses = lazyProcesses;\n\n try {\n // Start all processes (parallel if multiple)\n await Promise.all(lazyProcesses.map((lp) => lp.start()));\n\n // Wait for all processes to complete\n const results = await Promise.all(lazyProcesses.map((lp) => this.waitForProcess(lp)));\n\n // Check if any failed\n const anyFailed = results.some((r) => r === \"error\");\n\n if (this.stopRequested) {\n task.state = \"skipped\";\n } else if (anyFailed) {\n task.state = \"failed\";\n this.logger.warn(`Task \"${task.id}\" failed`);\n } else {\n task.state = \"completed\";\n this.logger.info(`Task \"${task.id}\" completed`);\n }\n } catch (err) {\n task.state = \"failed\";\n this.logger.error(`Task \"${task.id}\" error:`, err);\n } finally {\n this.runningProcesses = [];\n }\n }\n\n private async waitForProcess(lp: LazyProcess): Promise<\"stopped\" | \"error\"> {\n const state = await lp.waitForExit();\n return state === \"error\" ? \"error\" : \"stopped\";\n }\n}\n","import { appendFileSync } from \"node:fs\";\nimport { format } from \"node:util\";\n\nconst colors = {\n reset: \"\\x1b[0m\",\n gray: \"\\x1b[90m\",\n white: \"\\x1b[37m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n bold: \"\\x1b[1m\",\n} as const;\n\nconst levelColors = {\n debug: colors.gray,\n info: colors.green,\n warn: colors.yellow,\n error: colors.red,\n} as const;\n\nconst formatTime = (date: Date) =>\n Intl.DateTimeFormat(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n fractionalSecondDigits: 3,\n hourCycle: \"h23\",\n }).format(date);\n\nconst formatPrefixNoColor = (level: string, name: string, time: Date) => {\n const levelFormatted = level.toUpperCase().padStart(5);\n const timestamp = formatTime(time);\n return `[${timestamp}] ${levelFormatted} (${name})`;\n};\n\nconst formatPrefixWithColor = (level: string, name: string, time: Date) => {\n const levelFormatted = level.toUpperCase().padStart(5);\n const timestamp = formatTime(time);\n const levelTint = levelColors[level as keyof typeof levelColors] ?? \"\";\n return `${colors.gray}[${timestamp}]${colors.reset} ${levelTint}${levelFormatted}${colors.reset} (${name})`;\n};\n\ntype LoggerConfig = {\n name: string;\n stdout?: boolean;\n logFile?: string;\n prefix?: string;\n};\n\nconst formatMessagePrefix = (prefix: string | undefined, colored: boolean) => {\n if (!prefix) return \"\";\n if (colored) return `${colors.bold}${colors.white}[${prefix}]${colors.reset} `;\n return `[${prefix}]`;\n};\n\nconst logLine = (config: LoggerConfig, level: \"debug\" | \"info\" | \"warn\" | \"error\", args: any[]) => {\n const message = format(...args);\n const time = new Date();\n\n if (config.logFile) {\n const plainPrefix = formatPrefixNoColor(level, config.name, time);\n const plainMessagePrefix = formatMessagePrefix(config.prefix, false);\n const plainLine = [plainPrefix, plainMessagePrefix, message].filter(Boolean).join(\" \");\n try {\n appendFileSync(config.logFile, `${plainLine}\\n`);\n } catch {\n // Ignore errors\n }\n }\n\n if (config.stdout) {\n const coloredPrefix = formatPrefixWithColor(level, config.name, time);\n const coloredMessagePrefix = formatMessagePrefix(config.prefix, true);\n const coloredLine = [coloredPrefix, coloredMessagePrefix, message].filter(Boolean).join(\" \");\n console[level](coloredLine);\n }\n};\n\nexport const logger = (_config: LoggerConfig) => {\n const config = { stdout: true, ..._config };\n return {\n info: (...args: any[]) => logLine(config, \"info\", args),\n error: (...args: any[]) => logLine(config, \"error\", args),\n warn: (...args: any[]) => logLine(config, \"warn\", args),\n debug: (...args: any[]) => logLine(config, \"debug\", args),\n child: (suffix: string, overrides: Partial<Omit<LoggerConfig, \"name\">> = {}) =>\n logger({\n ...config,\n ...overrides,\n name: `${config.name}:${suffix}`,\n }),\n withPrefix: (prefix: string) =>\n logger({\n ...config,\n prefix,\n }),\n };\n};\n\nexport type Logger = ReturnType<typeof logger>;\n","import { parse } from \"dotenv\";\nimport { existsSync, globSync, readFileSync } from \"node:fs\";\nimport { resolve, basename, isAbsolute } from \"node:path\";\nimport { watch } from \"chokidar\";\nimport { type Logger } from \"./logger\";\n\nexport type EnvChangeEvent =\n | {\n type: \"global\";\n }\n | {\n type: \"process\";\n key: string;\n };\n\nexport type EnvChangeCallback = (event: EnvChangeEvent) => void;\n\nexport interface EnvManagerConfig {\n cwd: string;\n globalEnvFile?: string;\n customEnvFiles?: Record<string, string>;\n}\n\nexport class EnvManager {\n private globalEnv: Record<string, string> = {};\n private globalEnvPath: string;\n private env: Map<string, Record<string, string>> = new Map();\n private watchers: Map<string, ReturnType<typeof watch>> = new Map();\n private fileToKey: Map<string, string> = new Map();\n private changeCallbacks: Set<EnvChangeCallback> = new Set();\n private cwdWatcher: ReturnType<typeof watch> | null = null;\n private customKeys: Set<string> = new Set();\n private logger: Logger;\n\n constructor(\n private config: EnvManagerConfig,\n logger: Logger,\n ) {\n this.logger = logger;\n this.globalEnvPath = config.globalEnvFile\n ? isAbsolute(config.globalEnvFile)\n ? config.globalEnvFile\n : resolve(config.cwd, config.globalEnvFile)\n : resolve(config.cwd, \".env\");\n\n // Load custom env files first (before auto-discovery)\n this.loadCustomEnvFiles();\n this.loadEnvFilesFromCwd();\n this.watchCwdForNewFiles();\n }\n\n /**\n * Register a custom env file for a key.\n * Once registered, auto-discovered .env.{key} files will be ignored for this key.\n */\n public registerFile(key: string, filePath: string): void {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(this.config.cwd, filePath);\n this.logger.debug(`Registering custom env file for \"${key}\": ${absolutePath}`);\n this.customKeys.add(key);\n this.loadEnvFile(key, absolutePath);\n }\n\n /**\n * Check if a key has a custom env file registered\n */\n public hasCustomFile(key: string): boolean {\n return this.customKeys.has(key);\n }\n\n /**\n * Load custom env files from config\n */\n private loadCustomEnvFiles(): void {\n if (!this.config.customEnvFiles) return;\n\n for (const [key, filePath] of Object.entries(this.config.customEnvFiles)) {\n this.registerFile(key, filePath);\n }\n }\n\n public getEnvVars(key: string): Record<string, string> {\n const specificEnv = this.env.get(key);\n return {\n ...this.globalEnv,\n ...specificEnv,\n };\n }\n\n private loadEnvFilesFromCwd(): void {\n this.logger.debug(`Scanning for env files in: ${this.config.cwd}`);\n if (existsSync(this.globalEnvPath)) this.loadGlobalEnv(this.globalEnvPath);\n\n try {\n const envFiles = globSync(\".env.*\", { cwd: this.config.cwd });\n this.logger.debug(`Found ${envFiles.length} env file(s): ${envFiles.join(\", \") || \"(none)\"}`);\n for (const filePath of envFiles) {\n const key = this.getEnvKeySuffix(basename(filePath));\n // Skip if key has a custom file registered\n if (key && !this.customKeys.has(key)) {\n this.loadEnvFile(key, resolve(this.config.cwd, filePath));\n } else if (key && this.customKeys.has(key)) {\n this.logger.debug(\n `Skipping auto-discovered \"${filePath}\" (custom file registered for \"${key}\")`,\n );\n }\n }\n } catch (err) {\n this.logger.warn(\"Failed to scan env files:\", err);\n }\n }\n\n private parseEnvFile(absolutePath: string): Record<string, string> | null {\n try {\n const content = readFileSync(absolutePath, \"utf-8\");\n const parsed = parse(content) ?? {};\n const keys = Object.keys(parsed);\n this.logger.debug(\n `Parsed env file \"${absolutePath}\": ${keys.length} variable(s) [${keys.join(\", \")}]`,\n );\n return parsed;\n } catch (err) {\n this.logger.warn(`Failed to parse env file: ${absolutePath}`, err);\n return null;\n }\n }\n\n private getEnvKeySuffix(fileName: string): string | null {\n const match = fileName.match(/^\\.env\\.(.+)$/);\n return match ? match[1] : null;\n }\n\n private loadGlobalEnv(absolutePath: string) {\n if (!existsSync(absolutePath)) {\n this.logger.debug(`Global env file not found: ${absolutePath}`);\n return;\n }\n this.logger.debug(`Loading global env file: ${absolutePath}`);\n const parsed = this.parseEnvFile(absolutePath);\n if (parsed) {\n this.globalEnv = parsed;\n this.watchFile(absolutePath);\n }\n }\n\n private loadEnvFile(key: string, absolutePath: string) {\n this.logger.debug(`Loading env file for \"${key}\": ${absolutePath}`);\n const parsed = this.parseEnvFile(absolutePath);\n if (!parsed) return;\n\n this.env.set(key, parsed);\n this.fileToKey.set(absolutePath, key);\n this.watchFile(absolutePath);\n }\n\n private watchFile(absolutePath: string): void {\n if (this.watchers.has(absolutePath)) return;\n try {\n const watcher = watch(absolutePath, { ignoreInitial: true })\n .on(\"change\", () => {\n this.handleFileChange(absolutePath);\n })\n .on(\"unlink\", () => {\n this.handleFileDelete(absolutePath);\n });\n\n this.watchers.set(absolutePath, watcher);\n } catch (err) {\n this.logger.warn(`Failed to watch env file: ${absolutePath}`, err);\n }\n }\n\n /**\n * Watch cwd for new .env.* files\n */\n private watchCwdForNewFiles(): void {\n try {\n this.cwdWatcher = watch(this.config.cwd, {\n ignoreInitial: true,\n depth: 0,\n }).on(\"add\", (filePath) => {\n this.handleNewFile(filePath);\n });\n } catch (err) {\n this.logger.warn(`Failed to watch cwd for new env files:`, err);\n }\n }\n\n private handleFileChange(absolutePath: string): void {\n this.logger.debug(`File changed: ${absolutePath}`);\n if (absolutePath === this.globalEnvPath) {\n this.logger.debug(`Global env file changed, reloading`);\n this.loadGlobalEnv(absolutePath);\n this.notifyCallbacks({ type: \"global\" });\n return;\n }\n\n const key = this.fileToKey.get(absolutePath);\n if (!key) return;\n\n this.logger.debug(`Env file changed for \"${key}\", reloading`);\n const parsed = this.parseEnvFile(absolutePath);\n if (!parsed) return;\n\n this.env.set(key, parsed);\n this.notifyCallbacks({ type: \"process\", key });\n }\n\n private handleFileDelete(absolutePath: string): void {\n this.logger.debug(`File deleted: ${absolutePath}`);\n const watcher = this.watchers.get(absolutePath);\n if (watcher) {\n watcher.close();\n this.watchers.delete(absolutePath);\n }\n\n if (absolutePath === this.globalEnvPath) {\n this.logger.debug(`Global env file deleted, clearing global env`);\n this.globalEnv = {};\n this.notifyCallbacks({ type: \"global\" });\n return;\n }\n\n const key = this.fileToKey.get(absolutePath);\n if (key) {\n this.logger.debug(`Env file deleted for \"${key}\", removing from registry`);\n this.env.delete(key);\n this.fileToKey.delete(absolutePath);\n this.notifyCallbacks({ type: \"process\", key });\n }\n }\n\n private handleNewFile(filePath: string): void {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(this.config.cwd, filePath);\n this.logger.debug(`New file detected: ${absolutePath}`);\n\n if (absolutePath === this.globalEnvPath) {\n this.logger.debug(`New global env file detected, loading`);\n this.loadGlobalEnv(absolutePath);\n this.notifyCallbacks({ type: \"global\" });\n return;\n }\n\n const key = this.getEnvKeySuffix(basename(filePath));\n // Skip if key has a custom file registered or already loaded\n if (key && !this.customKeys.has(key) && !this.env.has(key)) {\n this.logger.debug(`New env file detected for \"${key}\", loading`);\n this.loadEnvFile(key, absolutePath);\n this.notifyCallbacks({ type: \"process\", key });\n } else if (key && this.customKeys.has(key)) {\n this.logger.debug(`Ignoring new file \"${filePath}\" (custom file registered for \"${key}\")`);\n } else if (key && this.env.has(key)) {\n this.logger.debug(`Ignoring new file \"${filePath}\" (env for \"${key}\" already loaded)`);\n }\n }\n\n private notifyCallbacks(event: EnvChangeEvent): void {\n for (const callback of this.changeCallbacks) callback(event);\n }\n\n onChange(callback: EnvChangeCallback): () => void {\n this.changeCallbacks.add(callback);\n return () => {\n this.changeCallbacks.delete(callback);\n };\n }\n\n close(): void {\n for (const watcher of this.watchers.values()) {\n watcher.close();\n }\n this.watchers.clear();\n\n if (this.cwdWatcher) {\n this.cwdWatcher.close();\n this.cwdWatcher = null;\n }\n\n this.changeCallbacks.clear();\n }\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -317,7 +317,8 @@ declare class EnvManager {
317
317
  private changeCallbacks;
318
318
  private cwdWatcher;
319
319
  private customKeys;
320
- constructor(config: EnvManagerConfig);
320
+ private logger;
321
+ constructor(config: EnvManagerConfig, logger: Logger);
321
322
  /**
322
323
  * Register a custom env file for a key.
323
324
  * Once registered, auto-discovered .env.{key} files will be ignored for this key.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/logger.ts","../src/lazy-process.ts","../src/task-list.ts","../src/cron-process.ts","../src/restarting-process.ts","../src/manager.ts","../src/env-manager.ts","../src/index.ts"],"mappings":";;;KA0CK,YAAA;EACH,IAAA;EACA,MAAA;EACA,OAAA;EACA,MAAA;AAAA;AAAA,cAgCW,MAAA,GAAU,OAAA,EAAS,YAAA;;;;;0BAON,SAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,YAAA,eAvC5C;kCAAA;AAAA;AAAA,KAqDI,MAAA,GAAS,UAAA,QAAkB,MAAA;;;cC7F1B,iBAAA,EAAiB,CAAA,CAAA,YAAA;EAAA;;;;;KAMlB,iBAAA,GAAoB,CAAA,CAAE,WAAA,QAAmB,iBAAA;AAAA,cAExC,YAAA,EAAY,CAAA,CAAA,cAAA;AAAA,KAQb,YAAA,GAAe,CAAA,CAAE,WAAA,QAAmB,YAAA;AAAA,cAsBnC,WAAA;EAAA,SACF,IAAA;EACT,UAAA,EAAY,iBAAA;EAAA,QACJ,MAAA;EAAA,QACA,YAAA;EAAA,QACA,MAAA;EAAA,QACA,WAAA;EACD,QAAA;cAEK,IAAA,UAAc,UAAA,EAAY,iBAAA,EAAmB,MAAA,EAAQ,MAAA;EAAA,IAM7D,KAAA,CAAA,GAAS,YAAA;EAIP,KAAA,CAAA,GAAK,OAAA;EAsEL,IAAA,CAAK,OAAA,YAAmB,OAAA;EAyDxB,KAAA,CAAA,GAAS,OAAA;EAcf,gBAAA,CAAiB,UAAA,EAAY,iBAAA;EAIvB,WAAA,CAAA,GAAe,OAAA,CAAQ,YAAA;EAAA,QAMrB,OAAA;AAAA;;;cCjNG,eAAA,EAAe,CAAA,CAAA,cAAA;AAAA,KAEhB,SAAA,GAAY,CAAA,CAAE,WAAA,QAAmB,eAAA;AAAA,cAGhC,4BAAA,EAA4B,CAAA,CAAA,YAAA;EAAA;;;;;;;;KAK7B,sBAAA,GAAyB,CAAA,CAAE,WAAA,QAAmB,4BAAA;AAAA,UAGzC,SAAA;EACf,EAAA;EACA,SAAA,EAAW,sBAAA;EACX,KAAA,EAAO,SAAA;AAAA;AAAA,KAIG,aAAA;AAAA,cAEC,QAAA;EAAA,SACF,IAAA;EAAA,QACD,MAAA;EAAA,QACA,MAAA;EAAA,QACA,MAAA;EAAA,QACA,eAAA;EAAA,QACA,aAAA;EAAA,QACA,gBAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;cAGN,IAAA,UACA,MAAA,EAAQ,MAAA,EACR,YAAA,IAAgB,sBAAA,GAAyB,sBAAA,OACzC,eAAA,IAAmB,WAAA;EAAA,IAcjB,KAAA,CAAA,GAAS,aAAA;EAAA,IAIT,KAAA,CAAA,GAAS,aAAA,CAAc,SAAA;EAI3B,kBAAA,CAAmB,MAAA,oBAA0B,SAAA;EFqBR;;;;EEArC,OAAA,CAAQ,IAAA,EAAM,sBAAA,GAAyB,sBAAA;;;;EAmBvC,KAAA,CAAA;EFLgB;;;EEqBV,aAAA,CAAA,GAAiB,OAAA;;;;EAcjB,IAAA,CAAK,OAAA,YAAmB,OAAA;EAAA,QA+BhB,OAAA;EAAA,QAgBA,WAAA;EAAA,QAgDA,cAAA;AAAA;;;cChOH,WAAA,EAAW,CAAA,CAAA,YAAA;EAAA;;;KAIZ,WAAA,GAAc,CAAA,CAAE,WAAA,QAAmB,WAAA;AAAA,cAElC,kBAAA,EAAkB,CAAA,CAAA,YAAA;EAAA;;;;;;;KAKnB,kBAAA,GAAqB,CAAA,CAAE,WAAA,QAAmB,kBAAA;AAAA,cAEzC,gBAAA,EAAgB,CAAA,CAAA,cAAA;AAAA,KASjB,gBAAA,GAAmB,CAAA,CAAE,WAAA,QAAmB,gBAAA;AAAA,cAIvC,WAAA;EAAA,SACF,IAAA;EAAA,SACA,WAAA,EAAa,WAAA;EAAA,QACd,OAAA;EAAA,QACA,MAAA;EAAA,QACA,OAAA;EAAA,QAEA,MAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,mBAAA;EAAA,QACA,SAAA;EAAA,QACA,aAAA;EAAA,QACA,YAAA;cAGN,IAAA,UACA,UAAA,EAAY,iBAAA,EACZ,OAAA,EAAS,kBAAA,EACT,MAAA,EAAQ,MAAA;EAAA,IAQN,KAAA,CAAA,GAAS,gBAAA;EAAA,IAIT,QAAA,CAAA;EAAA,IAIA,SAAA,CAAA;EAAA,IAIA,OAAA,CAAA,GAAW,IAAA;EAMf,KAAA,CAAA;EAuBM,IAAA,CAAK,OAAA,YAAmB,OAAA;EA+BxB,OAAA,CAAA,GAAW,OAAA;EAAA,QAqBT,UAAA;EAAA,QAgBM,UAAA;EAAA,QAUA,eAAA;EAAA,QAeN,iBAAA;AAAA;;;cC5LG,aAAA,EAAa,CAAA,CAAA,cAAA;AAAA,KAOd,aAAA,GAAgB,CAAA,CAAE,WAAA,QAAmB,aAAA;AAAA,cAEpC,eAAA,EAAe,CAAA,CAAA,WAAA,EAAA,CAAA,CAAA,YAAA;EAAA;;;;;;;;KAYhB,eAAA,GAAkB,CAAA,CAAE,WAAA,QAAmB,eAAA;AAAA,cAEtC,eAAA,EAAe,CAAA,CAAA,YAAA;EAAA;;;;KAKhB,eAAA,GAAkB,CAAA,CAAE,WAAA,QAAmB,eAAA;AAAA,cAEtC,wBAAA,EAAwB,CAAA,CAAA,YAAA;EAAA;;;;;;;;;;;;;;;;;;KAOzB,wBAAA,GAA2B,CAAA,CAAE,WAAA,QAAmB,wBAAA;AAAA,cAE/C,sBAAA,EAAsB,CAAA,CAAA,cAAA;AAAA,KASvB,sBAAA,GAAyB,CAAA,CAAE,WAAA,QAAmB,sBAAA;AAAA,cAK7C,iBAAA;EAAA,SACF,IAAA;EAAA,SACA,WAAA,EAAa,WAAA;EAAA,QACd,OAAA;EAAA,QAGA,MAAA;EAAA,QAGA,MAAA;EAAA,QACA,aAAA;EAAA,QACA,iBAAA;EAAA,QACA,mBAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;EAAA,QACA,mBAAA;cAGN,IAAA,UACA,UAAA,EAAY,iBAAA,EACZ,OAAA,EAAS,wBAAA,EACT,MAAA,EAAQ,MAAA;EAAA,IAcN,KAAA,CAAA,GAAS,sBAAA;EAAA,IAIT,QAAA,CAAA;EAIJ,KAAA,CAAA;EAsBM,IAAA,CAAK,OAAA,YAAmB,OAAA;EAwBxB,OAAA,CAAQ,KAAA,aAAyB,OAAA;;;;EAqCjC,MAAA,CACJ,aAAA,EAAe,iBAAA,EACf,kBAAA,aACC,OAAA;EHpLyB;;;EGiM5B,aAAA,CAAc,UAAA,EAAY,OAAA,CAAQ,wBAAA;EAAA,QAY1B,aAAA;EAAA,QAMA,YAAA;EAAA,QA4BA,iBAAA;EAAA,QAuDA,aAAA;EAAA,QAiBA,aAAA;EAAA,QAWA,cAAA;EAAA,QAaA,eAAA;EAAA,QAgBA,yBAAA;EAAA,QAkBA,KAAA;AAAA;;;cC1UG,aAAA,EAAa,CAAA,CAAA,YAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAUd,aAAA,GAAgB,CAAA,CAAE,WAAA,QAAmB,aAAA;;;KClDrC,cAAA;EAEN,IAAA;AAAA;EAGA,IAAA;EACA,GAAA;AAAA;AAAA,KAGM,iBAAA,IAAqB,KAAA,EAAO,cAAA;AAAA,UAEvB,gBAAA;EACf,GAAA;EACA,aAAA;EACA,cAAA,GAAiB,MAAA;AAAA;AAAA,cAGN,UAAA;EAAA,QAUS,MAAA;EAAA,QATZ,SAAA;EAAA,QACA,aAAA;EAAA,QACA,GAAA;EAAA,QACA,QAAA;EAAA,QACA,SAAA;EAAA,QACA,eAAA;EAAA,QACA,UAAA;EAAA,QACA,UAAA;cAEY,MAAA,EAAQ,gBAAA;EN8CP;;;;EM7Bd,YAAA,CAAa,GAAA,UAAa,QAAA;;;;EAS1B,aAAA,CAAc,GAAA;;;;UAOb,kBAAA;EAQD,UAAA,CAAW,GAAA,WAAc,MAAA;EAAA,QAQxB,mBAAA;EAAA,QAiBA,YAAA;EAAA,QAUA,eAAA;EAAA,QAKA,aAAA;EAAA,QASA,WAAA;EAAA,QASA,SAAA;ENhCQ;;;EAAA,QMoDR,mBAAA;EAAA,QAaA,gBAAA;EAAA,QAiBA,gBAAA;EAAA,QAqBA,aAAA;EAAA,QAiBA,eAAA;EAIR,QAAA,CAAS,QAAA,EAAU,iBAAA;EAOnB,KAAA,CAAA;AAAA;;;iBCpOc,YAAA,CAAa,MAAA,EAAQ,aAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/logger.ts","../src/lazy-process.ts","../src/task-list.ts","../src/cron-process.ts","../src/restarting-process.ts","../src/manager.ts","../src/env-manager.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as ProcessDefinition, a as TaskStateSchema, c as CronProcessState, d as CrashLoopConfig, f as RestartPolicy, g as LazyProcess, h as RestartingProcessState, i as TaskList, l as RetryConfig, m as RestartingProcessOptions, n as EnvManager, o as CronProcess, p as RestartingProcess, r as NamedProcessDefinitionSchema, s as CronProcessOptions, t as logger, u as BackoffStrategy, v as ProcessState } from "./logger-BU2RmetS.mjs";
1
+ import { _ as ProcessDefinition, a as TaskStateSchema, c as CronProcessState, d as CrashLoopConfig, f as RestartPolicy, g as LazyProcess, h as RestartingProcessState, i as TaskList, l as RetryConfig, m as RestartingProcessOptions, n as logger, o as CronProcess, p as RestartingProcess, r as NamedProcessDefinitionSchema, s as CronProcessOptions, t as EnvManager, u as BackoffStrategy, v as ProcessState } from "./env-manager-FKhvfwIR.mjs";
2
2
 
3
3
  //#region src/index.ts
4
4
  function defineConfig(config) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pidnap",
3
- "version": "0.0.0-dev.6",
3
+ "version": "0.0.0-dev.7",
4
4
  "bin": {
5
5
  "pidnap": "./dist/cli.mjs"
6
6
  },