@autofleet/nitur 2.2.0-0 → 2.2.0-1

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.
@@ -1,2 +1,2 @@
1
- const e=require(`../_virtual/rolldown_runtime.cjs`),t=require(`../logger.cjs`),n=require(`./manager.cjs`);let r=require(`@godaddy/terminus`);r=e.__toESM(r);let i=require(`http-terminator`);i=e.__toESM(i);function a(e){let a=e.logger??t.logger,o=e.endpoints?.liveness||`/health/live`,s=e.endpoints?.readiness||`/health/ready`,c=new n.HealthCheckManager(e.liveness,e.readiness),l=(0,i.createHttpTerminator)({server:e.server}),u=e.gracefulShutdown?.shutdownHooks||[],d={signals:e.gracefulShutdown?.signals??[`SIGTERM`,`SIGINT`],timeout:e.gracefulShutdown?.timeout||3e4,healthChecks:{[o]:async()=>{let e=await c.checkLiveness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))},[s]:async()=>{let e=await c.checkReadiness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))}},beforeShutdown:async()=>{a.info(`Received shutdown signal`),await new Promise(e=>setTimeout(e,5e3))},onSignal:async()=>{a.info(`Executing shutdown hooks`),await Promise.all(u.map(async({name:e,hook:t})=>{try{a.info(`Running shutdown hook: ${e}`),await t()}catch(t){throw a.error(`Shutdown hook '${e}' failed`,{error:t}),t}}))},onShutdown:async()=>{a.info(`Graceful shutdown completed`)},logger:(e,t)=>{t?a.error(e,{error:t}):a.info(e)}};return(0,r.createTerminus)(e.server,d),a.info(`Health checks and graceful shutdown initialized`,{livenessPath:o,readinessPath:s}),{healthCheckManager:c,httpTerminator:l,addShutdownHook:(e,t)=>{u.push({name:e,hook:t})},checkLiveness:()=>c.checkLiveness(),checkReadiness:()=>c.checkReadiness(),shutdown:async()=>{a.info(`Manual shutdown initiated`),await l.terminate()}}}exports.setupHealthCheck=a;
1
+ const e=require(`../_virtual/rolldown_runtime.cjs`),t=require(`../logger.cjs`),n=require(`./manager.cjs`);let r=require(`@godaddy/terminus`);r=e.__toESM(r);let i=require(`http-terminator`);i=e.__toESM(i);function a(e){let a=e.logger??t.logger,o=e.endpoints?.liveness||`/health/live`,s=e.endpoints?.readiness||`/health/ready`,c=new n.HealthCheckManager(e.liveness,e.readiness),l=(0,i.createHttpTerminator)({server:e.server}),u=e.gracefulShutdown?.shutdownHooks||[],d={signals:e.gracefulShutdown?.signals??[`SIGTERM`,`SIGINT`],timeout:e.gracefulShutdown?.timeout??5e4,useExit0:e.gracefulShutdown?.useExit0??!0,healthChecks:{[o]:async()=>{let e=await c.checkLiveness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))},[s]:async()=>{let e=await c.checkReadiness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))}},beforeShutdown:async()=>{a.info(`Received shutdown signal`),await new Promise(e=>setTimeout(e,5e3))},onSignal:async()=>{a.info(`Executing shutdown hooks`),await Promise.all(u.map(async({name:e,hook:t})=>{try{a.info(`Running shutdown hook: ${e}`),await t()}catch(t){throw a.error(`Shutdown hook '${e}' failed`,{error:t}),t}}))},onShutdown:async()=>{a.info(`Graceful shutdown completed`)},logger:(e,t)=>{t?a.error(e,{error:t}):a.info(e)}};return(0,r.createTerminus)(e.server,d),a.info(`Health checks and graceful shutdown initialized`,{livenessPath:o,readinessPath:s}),{healthCheckManager:c,httpTerminator:l,addShutdownHook:(e,t)=>{u.push({name:e,hook:t})},checkLiveness:()=>c.checkLiveness(),checkReadiness:()=>c.checkReadiness(),shutdown:async()=>{a.info(`Manual shutdown initiated`),await l.terminate()}}}exports.setupHealthCheck=a;
2
2
  //# sourceMappingURL=setup.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.cjs","names":["logger","defaultLogger","HealthCheckManager","shutdownHooks: NamedShutdownHook[]","terminusOptions: TerminusOptions"],"sources":["../../src/health-check/setup.ts"],"sourcesContent":["import type { Server } from 'http';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport { createTerminus, type TerminusOptions } from '@godaddy/terminus';\nimport { createHttpTerminator, type HttpTerminator } from 'http-terminator';\nimport { logger as defaultLogger } from '../logger';\nimport { HealthCheckManager } from './manager';\nimport type {\n LivenessConfig,\n ReadinessConfig,\n GracefulShutdownConfig,\n NamedShutdownHook,\n} from './types';\n\n/**\n * Generic app interface - works for both Express and Fastify\n */\ninterface App {\n get(path: string, handler: (req: any, res: any) => void | Promise<any>): any;\n}\n\n/**\n * Configuration for health check setup\n */\nexport interface HealthCheckSetupConfig {\n /**\n * Application instance (Express or Fastify)\n */\n app: App;\n\n /**\n * HTTP server instance\n */\n server: Server;\n\n /**\n * Logger instance\n */\n logger?: LoggerInstanceManager;\n\n /**\n * Liveness probe configuration\n */\n liveness?: LivenessConfig;\n\n /**\n * Readiness probe configuration\n */\n readiness?: ReadinessConfig;\n\n /**\n * Graceful shutdown configuration\n */\n gracefulShutdown?: GracefulShutdownConfig;\n\n /**\n * Custom endpoint paths\n */\n endpoints?: {\n liveness?: string;\n readiness?: string;\n };\n}\n\n/**\n * Health Check Setup Result\n */\nexport interface HealthCheckSetup {\n healthCheckManager: HealthCheckManager;\n httpTerminator: HttpTerminator;\n addShutdownHook: (name: string, hook: () => Promise<void>) => void;\n checkLiveness: () => Promise<any>;\n checkReadiness: () => Promise<any>;\n shutdown: () => Promise<void>;\n}\n\n/**\n * Setup health checks and graceful shutdown\n * Works with both Express and Fastify\n */\nexport function setupHealthCheck(config: HealthCheckSetupConfig): HealthCheckSetup {\n const logger = config.logger ?? defaultLogger;\n const livenessPath = config.endpoints?.liveness || '/health/live';\n const readinessPath = config.endpoints?.readiness || '/health/ready';\n\n // Create health check manager\n const healthCheckManager = new HealthCheckManager(config.liveness, config.readiness);\n\n // Create http terminator\n const httpTerminator = createHttpTerminator({ server: config.server });\n\n // Shutdown hooks\n const shutdownHooks: NamedShutdownHook[] = config.gracefulShutdown?.shutdownHooks || [];\n\n // Setup terminus\n const terminusOptions: TerminusOptions = {\n signals: config.gracefulShutdown?.signals ?? ['SIGTERM', 'SIGINT'],\n timeout: config.gracefulShutdown?.timeout || 30000,\n\n healthChecks: {\n [livenessPath]: async () => {\n const status = await healthCheckManager.checkLiveness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n [readinessPath]: async () => {\n const status = await healthCheckManager.checkReadiness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n },\n\n beforeShutdown: async () => {\n logger.info('Received shutdown signal');\n // Give load balancers time to remove instance\n await new Promise(resolve => setTimeout(resolve, 5000));\n },\n\n onSignal: async () => {\n logger.info('Executing shutdown hooks');\n await Promise.all(shutdownHooks.map(async ({ name, hook }) => {\n try {\n logger.info(`Running shutdown hook: ${name}`);\n await hook();\n } catch (error) {\n logger.error(`Shutdown hook '${name}' failed`, { error });\n throw error;\n }\n }));\n },\n\n onShutdown: async () => {\n logger.info('Graceful shutdown completed');\n },\n\n logger: (msg, error) => {\n if (error) {\n logger.error(msg, { error });\n } else {\n logger.info(msg);\n }\n },\n };\n\n createTerminus(config.server, terminusOptions);\n\n logger.info('Health checks and graceful shutdown initialized', {\n livenessPath,\n readinessPath,\n });\n\n return {\n healthCheckManager,\n httpTerminator,\n addShutdownHook: (name: string, hook: () => Promise<void>) => {\n shutdownHooks.push({ name, hook });\n },\n checkLiveness: () => healthCheckManager.checkLiveness(),\n checkReadiness: () => healthCheckManager.checkReadiness(),\n shutdown: async () => {\n logger.info('Manual shutdown initiated');\n await httpTerminator.terminate();\n },\n };\n}\n"],"mappings":"4MA+EA,SAAgB,EAAiB,EAAkD,CACjF,IAAMA,EAAS,EAAO,QAAUC,EAAAA,OAC1B,EAAe,EAAO,WAAW,UAAY,eAC7C,EAAgB,EAAO,WAAW,WAAa,gBAG/C,EAAqB,IAAIC,EAAAA,mBAAmB,EAAO,SAAU,EAAO,UAAU,CAG9E,GAAA,EAAA,EAAA,sBAAsC,CAAE,OAAQ,EAAO,OAAQ,CAAC,CAGhEC,EAAqC,EAAO,kBAAkB,eAAiB,EAAE,CAGjFC,EAAmC,CACvC,QAAS,EAAO,kBAAkB,SAAW,CAAC,UAAW,SAAS,CAClE,QAAS,EAAO,kBAAkB,SAAW,IAE7C,aAAc,EACX,GAAe,SAAY,CAC1B,IAAM,EAAS,MAAM,EAAmB,eAAe,CACvD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,GAG/F,GAAgB,SAAY,CAC3B,IAAM,EAAS,MAAM,EAAmB,gBAAgB,CACxD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,EAGjG,CAED,eAAgB,SAAY,CAC1B,EAAO,KAAK,2BAA2B,CAEvC,MAAM,IAAI,QAAQ,GAAW,WAAW,EAAS,IAAK,CAAC,EAGzD,SAAU,SAAY,CACpB,EAAO,KAAK,2BAA2B,CACvC,MAAM,QAAQ,IAAI,EAAc,IAAI,MAAO,CAAE,OAAM,UAAW,CAC5D,GAAI,CACF,EAAO,KAAK,0BAA0B,IAAO,CAC7C,MAAM,GAAM,OACL,EAAO,CAEd,MADA,EAAO,MAAM,kBAAkB,EAAK,UAAW,CAAE,QAAO,CAAC,CACnD,IAER,CAAC,EAGL,WAAY,SAAY,CACtB,EAAO,KAAK,8BAA8B,EAG5C,QAAS,EAAK,IAAU,CAClB,EACF,EAAO,MAAM,EAAK,CAAE,QAAO,CAAC,CAE5B,EAAO,KAAK,EAAI,EAGrB,CASD,OAPA,EAAA,EAAA,gBAAe,EAAO,OAAQ,EAAgB,CAE9C,EAAO,KAAK,kDAAmD,CAC7D,eACA,gBACD,CAAC,CAEK,CACL,qBACA,iBACA,iBAAkB,EAAc,IAA8B,CAC5D,EAAc,KAAK,CAAE,OAAM,OAAM,CAAC,EAEpC,kBAAqB,EAAmB,eAAe,CACvD,mBAAsB,EAAmB,gBAAgB,CACzD,SAAU,SAAY,CACpB,EAAO,KAAK,4BAA4B,CACxC,MAAM,EAAe,WAAW,EAEnC"}
1
+ {"version":3,"file":"setup.cjs","names":["logger","defaultLogger","HealthCheckManager","shutdownHooks: NamedShutdownHook[]","terminusOptions: TerminusOptions"],"sources":["../../src/health-check/setup.ts"],"sourcesContent":["import type { Server } from 'http';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport { createTerminus, type TerminusOptions } from '@godaddy/terminus';\nimport { createHttpTerminator, type HttpTerminator } from 'http-terminator';\nimport { logger as defaultLogger } from '../logger';\nimport { HealthCheckManager } from './manager';\nimport type {\n LivenessConfig,\n ReadinessConfig,\n GracefulShutdownConfig,\n NamedShutdownHook,\n} from './types';\n\n/**\n * Generic app interface - works for both Express and Fastify\n */\ninterface App {\n get(path: string, handler: (req: any, res: any) => void | Promise<any>): any;\n}\n\n/**\n * Configuration for health check setup\n */\nexport interface HealthCheckSetupConfig {\n /**\n * Application instance (Express or Fastify)\n */\n app: App;\n\n /**\n * HTTP server instance\n */\n server: Server;\n\n /**\n * Logger instance\n */\n logger?: LoggerInstanceManager;\n\n /**\n * Liveness probe configuration\n */\n liveness?: LivenessConfig;\n\n /**\n * Readiness probe configuration\n */\n readiness?: ReadinessConfig;\n\n /**\n * Graceful shutdown configuration\n */\n gracefulShutdown?: GracefulShutdownConfig;\n\n /**\n * Custom endpoint paths\n */\n endpoints?: {\n liveness?: string;\n readiness?: string;\n };\n}\n\n/**\n * Health Check Setup Result\n */\nexport interface HealthCheckSetup {\n healthCheckManager: HealthCheckManager;\n httpTerminator: HttpTerminator;\n addShutdownHook: (name: string, hook: () => Promise<void>) => void;\n checkLiveness: () => Promise<any>;\n checkReadiness: () => Promise<any>;\n shutdown: () => Promise<void>;\n}\n\n/**\n * Setup health checks and graceful shutdown\n * Works with both Express and Fastify\n */\nexport function setupHealthCheck(config: HealthCheckSetupConfig): HealthCheckSetup {\n const logger = config.logger ?? defaultLogger;\n const livenessPath = config.endpoints?.liveness || '/health/live';\n const readinessPath = config.endpoints?.readiness || '/health/ready';\n\n // Create health check manager\n const healthCheckManager = new HealthCheckManager(config.liveness, config.readiness);\n\n // Create http terminator\n const httpTerminator = createHttpTerminator({ server: config.server });\n\n // Shutdown hooks\n const shutdownHooks: NamedShutdownHook[] = config.gracefulShutdown?.shutdownHooks || [];\n\n // Setup terminus\n const terminusOptions: TerminusOptions = {\n signals: config.gracefulShutdown?.signals ?? ['SIGTERM', 'SIGINT'],\n timeout: config.gracefulShutdown?.timeout ?? 50_000,\n useExit0: config.gracefulShutdown?.useExit0 ?? true,\n healthChecks: {\n [livenessPath]: async () => {\n const status = await healthCheckManager.checkLiveness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n [readinessPath]: async () => {\n const status = await healthCheckManager.checkReadiness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n },\n\n beforeShutdown: async () => {\n logger.info('Received shutdown signal');\n // Give load balancers time to remove instance\n await new Promise(resolve => setTimeout(resolve, 5000));\n },\n\n onSignal: async () => {\n logger.info('Executing shutdown hooks');\n await Promise.all(shutdownHooks.map(async ({ name, hook }) => {\n try {\n logger.info(`Running shutdown hook: ${name}`);\n await hook();\n } catch (error) {\n logger.error(`Shutdown hook '${name}' failed`, { error });\n throw error;\n }\n }));\n },\n\n onShutdown: async () => {\n logger.info('Graceful shutdown completed');\n },\n\n logger: (msg, error) => {\n if (error) {\n logger.error(msg, { error });\n } else {\n logger.info(msg);\n }\n },\n };\n\n createTerminus(config.server, terminusOptions);\n\n logger.info('Health checks and graceful shutdown initialized', {\n livenessPath,\n readinessPath,\n });\n\n return {\n healthCheckManager,\n httpTerminator,\n addShutdownHook: (name: string, hook: () => Promise<void>) => {\n shutdownHooks.push({ name, hook });\n },\n checkLiveness: () => healthCheckManager.checkLiveness(),\n checkReadiness: () => healthCheckManager.checkReadiness(),\n shutdown: async () => {\n logger.info('Manual shutdown initiated');\n await httpTerminator.terminate();\n },\n };\n}\n"],"mappings":"4MA+EA,SAAgB,EAAiB,EAAkD,CACjF,IAAMA,EAAS,EAAO,QAAUC,EAAAA,OAC1B,EAAe,EAAO,WAAW,UAAY,eAC7C,EAAgB,EAAO,WAAW,WAAa,gBAG/C,EAAqB,IAAIC,EAAAA,mBAAmB,EAAO,SAAU,EAAO,UAAU,CAG9E,GAAA,EAAA,EAAA,sBAAsC,CAAE,OAAQ,EAAO,OAAQ,CAAC,CAGhEC,EAAqC,EAAO,kBAAkB,eAAiB,EAAE,CAGjFC,EAAmC,CACvC,QAAS,EAAO,kBAAkB,SAAW,CAAC,UAAW,SAAS,CAClE,QAAS,EAAO,kBAAkB,SAAW,IAC7C,SAAU,EAAO,kBAAkB,UAAY,GAC/C,aAAc,EACX,GAAe,SAAY,CAC1B,IAAM,EAAS,MAAM,EAAmB,eAAe,CACvD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,GAG/F,GAAgB,SAAY,CAC3B,IAAM,EAAS,MAAM,EAAmB,gBAAgB,CACxD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,EAGjG,CAED,eAAgB,SAAY,CAC1B,EAAO,KAAK,2BAA2B,CAEvC,MAAM,IAAI,QAAQ,GAAW,WAAW,EAAS,IAAK,CAAC,EAGzD,SAAU,SAAY,CACpB,EAAO,KAAK,2BAA2B,CACvC,MAAM,QAAQ,IAAI,EAAc,IAAI,MAAO,CAAE,OAAM,UAAW,CAC5D,GAAI,CACF,EAAO,KAAK,0BAA0B,IAAO,CAC7C,MAAM,GAAM,OACL,EAAO,CAEd,MADA,EAAO,MAAM,kBAAkB,EAAK,UAAW,CAAE,QAAO,CAAC,CACnD,IAER,CAAC,EAGL,WAAY,SAAY,CACtB,EAAO,KAAK,8BAA8B,EAG5C,QAAS,EAAK,IAAU,CAClB,EACF,EAAO,MAAM,EAAK,CAAE,QAAO,CAAC,CAE5B,EAAO,KAAK,EAAI,EAGrB,CASD,OAPA,EAAA,EAAA,gBAAe,EAAO,OAAQ,EAAgB,CAE9C,EAAO,KAAK,kDAAmD,CAC7D,eACA,gBACD,CAAC,CAEK,CACL,qBACA,iBACA,iBAAkB,EAAc,IAA8B,CAC5D,EAAc,KAAK,CAAE,OAAM,OAAM,CAAC,EAEpC,kBAAqB,EAAmB,eAAe,CACvD,mBAAsB,EAAmB,gBAAgB,CACzD,SAAU,SAAY,CACpB,EAAO,KAAK,4BAA4B,CACxC,MAAM,EAAe,WAAW,EAEnC"}
@@ -1,2 +1,2 @@
1
- import{logger as e}from"../logger.js";import{HealthCheckManager as t}from"./manager.js";import{createTerminus as n}from"@godaddy/terminus";import{createHttpTerminator as r}from"http-terminator";function i(i){let a=i.logger??e,o=i.endpoints?.liveness||`/health/live`,s=i.endpoints?.readiness||`/health/ready`,c=new t(i.liveness,i.readiness),l=r({server:i.server}),u=i.gracefulShutdown?.shutdownHooks||[],d={signals:i.gracefulShutdown?.signals??[`SIGTERM`,`SIGINT`],timeout:i.gracefulShutdown?.timeout||3e4,healthChecks:{[o]:async()=>{let e=await c.checkLiveness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))},[s]:async()=>{let e=await c.checkReadiness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))}},beforeShutdown:async()=>{a.info(`Received shutdown signal`),await new Promise(e=>setTimeout(e,5e3))},onSignal:async()=>{a.info(`Executing shutdown hooks`),await Promise.all(u.map(async({name:e,hook:t})=>{try{a.info(`Running shutdown hook: ${e}`),await t()}catch(t){throw a.error(`Shutdown hook '${e}' failed`,{error:t}),t}}))},onShutdown:async()=>{a.info(`Graceful shutdown completed`)},logger:(e,t)=>{t?a.error(e,{error:t}):a.info(e)}};return n(i.server,d),a.info(`Health checks and graceful shutdown initialized`,{livenessPath:o,readinessPath:s}),{healthCheckManager:c,httpTerminator:l,addShutdownHook:(e,t)=>{u.push({name:e,hook:t})},checkLiveness:()=>c.checkLiveness(),checkReadiness:()=>c.checkReadiness(),shutdown:async()=>{a.info(`Manual shutdown initiated`),await l.terminate()}}}export{i as setupHealthCheck};
1
+ import{logger as e}from"../logger.js";import{HealthCheckManager as t}from"./manager.js";import{createTerminus as n}from"@godaddy/terminus";import{createHttpTerminator as r}from"http-terminator";function i(i){let a=i.logger??e,o=i.endpoints?.liveness||`/health/live`,s=i.endpoints?.readiness||`/health/ready`,c=new t(i.liveness,i.readiness),l=r({server:i.server}),u=i.gracefulShutdown?.shutdownHooks||[],d={signals:i.gracefulShutdown?.signals??[`SIGTERM`,`SIGINT`],timeout:i.gracefulShutdown?.timeout??5e4,useExit0:i.gracefulShutdown?.useExit0??!0,healthChecks:{[o]:async()=>{let e=await c.checkLiveness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))},[s]:async()=>{let e=await c.checkReadiness();if(e.status===`fail`)throw Error(e.checks.filter(e=>e.status===`fail`).map(e=>e.error).join(`, `))}},beforeShutdown:async()=>{a.info(`Received shutdown signal`),await new Promise(e=>setTimeout(e,5e3))},onSignal:async()=>{a.info(`Executing shutdown hooks`),await Promise.all(u.map(async({name:e,hook:t})=>{try{a.info(`Running shutdown hook: ${e}`),await t()}catch(t){throw a.error(`Shutdown hook '${e}' failed`,{error:t}),t}}))},onShutdown:async()=>{a.info(`Graceful shutdown completed`)},logger:(e,t)=>{t?a.error(e,{error:t}):a.info(e)}};return n(i.server,d),a.info(`Health checks and graceful shutdown initialized`,{livenessPath:o,readinessPath:s}),{healthCheckManager:c,httpTerminator:l,addShutdownHook:(e,t)=>{u.push({name:e,hook:t})},checkLiveness:()=>c.checkLiveness(),checkReadiness:()=>c.checkReadiness(),shutdown:async()=>{a.info(`Manual shutdown initiated`),await l.terminate()}}}export{i as setupHealthCheck};
2
2
  //# sourceMappingURL=setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","names":["logger","defaultLogger","shutdownHooks: NamedShutdownHook[]","terminusOptions: TerminusOptions"],"sources":["../../src/health-check/setup.ts"],"sourcesContent":["import type { Server } from 'http';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport { createTerminus, type TerminusOptions } from '@godaddy/terminus';\nimport { createHttpTerminator, type HttpTerminator } from 'http-terminator';\nimport { logger as defaultLogger } from '../logger';\nimport { HealthCheckManager } from './manager';\nimport type {\n LivenessConfig,\n ReadinessConfig,\n GracefulShutdownConfig,\n NamedShutdownHook,\n} from './types';\n\n/**\n * Generic app interface - works for both Express and Fastify\n */\ninterface App {\n get(path: string, handler: (req: any, res: any) => void | Promise<any>): any;\n}\n\n/**\n * Configuration for health check setup\n */\nexport interface HealthCheckSetupConfig {\n /**\n * Application instance (Express or Fastify)\n */\n app: App;\n\n /**\n * HTTP server instance\n */\n server: Server;\n\n /**\n * Logger instance\n */\n logger?: LoggerInstanceManager;\n\n /**\n * Liveness probe configuration\n */\n liveness?: LivenessConfig;\n\n /**\n * Readiness probe configuration\n */\n readiness?: ReadinessConfig;\n\n /**\n * Graceful shutdown configuration\n */\n gracefulShutdown?: GracefulShutdownConfig;\n\n /**\n * Custom endpoint paths\n */\n endpoints?: {\n liveness?: string;\n readiness?: string;\n };\n}\n\n/**\n * Health Check Setup Result\n */\nexport interface HealthCheckSetup {\n healthCheckManager: HealthCheckManager;\n httpTerminator: HttpTerminator;\n addShutdownHook: (name: string, hook: () => Promise<void>) => void;\n checkLiveness: () => Promise<any>;\n checkReadiness: () => Promise<any>;\n shutdown: () => Promise<void>;\n}\n\n/**\n * Setup health checks and graceful shutdown\n * Works with both Express and Fastify\n */\nexport function setupHealthCheck(config: HealthCheckSetupConfig): HealthCheckSetup {\n const logger = config.logger ?? defaultLogger;\n const livenessPath = config.endpoints?.liveness || '/health/live';\n const readinessPath = config.endpoints?.readiness || '/health/ready';\n\n // Create health check manager\n const healthCheckManager = new HealthCheckManager(config.liveness, config.readiness);\n\n // Create http terminator\n const httpTerminator = createHttpTerminator({ server: config.server });\n\n // Shutdown hooks\n const shutdownHooks: NamedShutdownHook[] = config.gracefulShutdown?.shutdownHooks || [];\n\n // Setup terminus\n const terminusOptions: TerminusOptions = {\n signals: config.gracefulShutdown?.signals ?? ['SIGTERM', 'SIGINT'],\n timeout: config.gracefulShutdown?.timeout || 30000,\n\n healthChecks: {\n [livenessPath]: async () => {\n const status = await healthCheckManager.checkLiveness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n [readinessPath]: async () => {\n const status = await healthCheckManager.checkReadiness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n },\n\n beforeShutdown: async () => {\n logger.info('Received shutdown signal');\n // Give load balancers time to remove instance\n await new Promise(resolve => setTimeout(resolve, 5000));\n },\n\n onSignal: async () => {\n logger.info('Executing shutdown hooks');\n await Promise.all(shutdownHooks.map(async ({ name, hook }) => {\n try {\n logger.info(`Running shutdown hook: ${name}`);\n await hook();\n } catch (error) {\n logger.error(`Shutdown hook '${name}' failed`, { error });\n throw error;\n }\n }));\n },\n\n onShutdown: async () => {\n logger.info('Graceful shutdown completed');\n },\n\n logger: (msg, error) => {\n if (error) {\n logger.error(msg, { error });\n } else {\n logger.info(msg);\n }\n },\n };\n\n createTerminus(config.server, terminusOptions);\n\n logger.info('Health checks and graceful shutdown initialized', {\n livenessPath,\n readinessPath,\n });\n\n return {\n healthCheckManager,\n httpTerminator,\n addShutdownHook: (name: string, hook: () => Promise<void>) => {\n shutdownHooks.push({ name, hook });\n },\n checkLiveness: () => healthCheckManager.checkLiveness(),\n checkReadiness: () => healthCheckManager.checkReadiness(),\n shutdown: async () => {\n logger.info('Manual shutdown initiated');\n await httpTerminator.terminate();\n },\n };\n}\n"],"mappings":"kMA+EA,SAAgB,EAAiB,EAAkD,CACjF,IAAMA,EAAS,EAAO,QAAUC,EAC1B,EAAe,EAAO,WAAW,UAAY,eAC7C,EAAgB,EAAO,WAAW,WAAa,gBAG/C,EAAqB,IAAI,EAAmB,EAAO,SAAU,EAAO,UAAU,CAG9E,EAAiB,EAAqB,CAAE,OAAQ,EAAO,OAAQ,CAAC,CAGhEC,EAAqC,EAAO,kBAAkB,eAAiB,EAAE,CAGjFC,EAAmC,CACvC,QAAS,EAAO,kBAAkB,SAAW,CAAC,UAAW,SAAS,CAClE,QAAS,EAAO,kBAAkB,SAAW,IAE7C,aAAc,EACX,GAAe,SAAY,CAC1B,IAAM,EAAS,MAAM,EAAmB,eAAe,CACvD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,GAG/F,GAAgB,SAAY,CAC3B,IAAM,EAAS,MAAM,EAAmB,gBAAgB,CACxD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,EAGjG,CAED,eAAgB,SAAY,CAC1B,EAAO,KAAK,2BAA2B,CAEvC,MAAM,IAAI,QAAQ,GAAW,WAAW,EAAS,IAAK,CAAC,EAGzD,SAAU,SAAY,CACpB,EAAO,KAAK,2BAA2B,CACvC,MAAM,QAAQ,IAAI,EAAc,IAAI,MAAO,CAAE,OAAM,UAAW,CAC5D,GAAI,CACF,EAAO,KAAK,0BAA0B,IAAO,CAC7C,MAAM,GAAM,OACL,EAAO,CAEd,MADA,EAAO,MAAM,kBAAkB,EAAK,UAAW,CAAE,QAAO,CAAC,CACnD,IAER,CAAC,EAGL,WAAY,SAAY,CACtB,EAAO,KAAK,8BAA8B,EAG5C,QAAS,EAAK,IAAU,CAClB,EACF,EAAO,MAAM,EAAK,CAAE,QAAO,CAAC,CAE5B,EAAO,KAAK,EAAI,EAGrB,CASD,OAPA,EAAe,EAAO,OAAQ,EAAgB,CAE9C,EAAO,KAAK,kDAAmD,CAC7D,eACA,gBACD,CAAC,CAEK,CACL,qBACA,iBACA,iBAAkB,EAAc,IAA8B,CAC5D,EAAc,KAAK,CAAE,OAAM,OAAM,CAAC,EAEpC,kBAAqB,EAAmB,eAAe,CACvD,mBAAsB,EAAmB,gBAAgB,CACzD,SAAU,SAAY,CACpB,EAAO,KAAK,4BAA4B,CACxC,MAAM,EAAe,WAAW,EAEnC"}
1
+ {"version":3,"file":"setup.js","names":["logger","defaultLogger","shutdownHooks: NamedShutdownHook[]","terminusOptions: TerminusOptions"],"sources":["../../src/health-check/setup.ts"],"sourcesContent":["import type { Server } from 'http';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport { createTerminus, type TerminusOptions } from '@godaddy/terminus';\nimport { createHttpTerminator, type HttpTerminator } from 'http-terminator';\nimport { logger as defaultLogger } from '../logger';\nimport { HealthCheckManager } from './manager';\nimport type {\n LivenessConfig,\n ReadinessConfig,\n GracefulShutdownConfig,\n NamedShutdownHook,\n} from './types';\n\n/**\n * Generic app interface - works for both Express and Fastify\n */\ninterface App {\n get(path: string, handler: (req: any, res: any) => void | Promise<any>): any;\n}\n\n/**\n * Configuration for health check setup\n */\nexport interface HealthCheckSetupConfig {\n /**\n * Application instance (Express or Fastify)\n */\n app: App;\n\n /**\n * HTTP server instance\n */\n server: Server;\n\n /**\n * Logger instance\n */\n logger?: LoggerInstanceManager;\n\n /**\n * Liveness probe configuration\n */\n liveness?: LivenessConfig;\n\n /**\n * Readiness probe configuration\n */\n readiness?: ReadinessConfig;\n\n /**\n * Graceful shutdown configuration\n */\n gracefulShutdown?: GracefulShutdownConfig;\n\n /**\n * Custom endpoint paths\n */\n endpoints?: {\n liveness?: string;\n readiness?: string;\n };\n}\n\n/**\n * Health Check Setup Result\n */\nexport interface HealthCheckSetup {\n healthCheckManager: HealthCheckManager;\n httpTerminator: HttpTerminator;\n addShutdownHook: (name: string, hook: () => Promise<void>) => void;\n checkLiveness: () => Promise<any>;\n checkReadiness: () => Promise<any>;\n shutdown: () => Promise<void>;\n}\n\n/**\n * Setup health checks and graceful shutdown\n * Works with both Express and Fastify\n */\nexport function setupHealthCheck(config: HealthCheckSetupConfig): HealthCheckSetup {\n const logger = config.logger ?? defaultLogger;\n const livenessPath = config.endpoints?.liveness || '/health/live';\n const readinessPath = config.endpoints?.readiness || '/health/ready';\n\n // Create health check manager\n const healthCheckManager = new HealthCheckManager(config.liveness, config.readiness);\n\n // Create http terminator\n const httpTerminator = createHttpTerminator({ server: config.server });\n\n // Shutdown hooks\n const shutdownHooks: NamedShutdownHook[] = config.gracefulShutdown?.shutdownHooks || [];\n\n // Setup terminus\n const terminusOptions: TerminusOptions = {\n signals: config.gracefulShutdown?.signals ?? ['SIGTERM', 'SIGINT'],\n timeout: config.gracefulShutdown?.timeout ?? 50_000,\n useExit0: config.gracefulShutdown?.useExit0 ?? true,\n healthChecks: {\n [livenessPath]: async () => {\n const status = await healthCheckManager.checkLiveness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n [readinessPath]: async () => {\n const status = await healthCheckManager.checkReadiness();\n if (status.status === 'fail') {\n throw new Error(status.checks.filter(c => c.status === 'fail').map(c => c.error).join(', '));\n }\n },\n },\n\n beforeShutdown: async () => {\n logger.info('Received shutdown signal');\n // Give load balancers time to remove instance\n await new Promise(resolve => setTimeout(resolve, 5000));\n },\n\n onSignal: async () => {\n logger.info('Executing shutdown hooks');\n await Promise.all(shutdownHooks.map(async ({ name, hook }) => {\n try {\n logger.info(`Running shutdown hook: ${name}`);\n await hook();\n } catch (error) {\n logger.error(`Shutdown hook '${name}' failed`, { error });\n throw error;\n }\n }));\n },\n\n onShutdown: async () => {\n logger.info('Graceful shutdown completed');\n },\n\n logger: (msg, error) => {\n if (error) {\n logger.error(msg, { error });\n } else {\n logger.info(msg);\n }\n },\n };\n\n createTerminus(config.server, terminusOptions);\n\n logger.info('Health checks and graceful shutdown initialized', {\n livenessPath,\n readinessPath,\n });\n\n return {\n healthCheckManager,\n httpTerminator,\n addShutdownHook: (name: string, hook: () => Promise<void>) => {\n shutdownHooks.push({ name, hook });\n },\n checkLiveness: () => healthCheckManager.checkLiveness(),\n checkReadiness: () => healthCheckManager.checkReadiness(),\n shutdown: async () => {\n logger.info('Manual shutdown initiated');\n await httpTerminator.terminate();\n },\n };\n}\n"],"mappings":"kMA+EA,SAAgB,EAAiB,EAAkD,CACjF,IAAMA,EAAS,EAAO,QAAUC,EAC1B,EAAe,EAAO,WAAW,UAAY,eAC7C,EAAgB,EAAO,WAAW,WAAa,gBAG/C,EAAqB,IAAI,EAAmB,EAAO,SAAU,EAAO,UAAU,CAG9E,EAAiB,EAAqB,CAAE,OAAQ,EAAO,OAAQ,CAAC,CAGhEC,EAAqC,EAAO,kBAAkB,eAAiB,EAAE,CAGjFC,EAAmC,CACvC,QAAS,EAAO,kBAAkB,SAAW,CAAC,UAAW,SAAS,CAClE,QAAS,EAAO,kBAAkB,SAAW,IAC7C,SAAU,EAAO,kBAAkB,UAAY,GAC/C,aAAc,EACX,GAAe,SAAY,CAC1B,IAAM,EAAS,MAAM,EAAmB,eAAe,CACvD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,GAG/F,GAAgB,SAAY,CAC3B,IAAM,EAAS,MAAM,EAAmB,gBAAgB,CACxD,GAAI,EAAO,SAAW,OACpB,MAAU,MAAM,EAAO,OAAO,OAAO,GAAK,EAAE,SAAW,OAAO,CAAC,IAAI,GAAK,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,EAGjG,CAED,eAAgB,SAAY,CAC1B,EAAO,KAAK,2BAA2B,CAEvC,MAAM,IAAI,QAAQ,GAAW,WAAW,EAAS,IAAK,CAAC,EAGzD,SAAU,SAAY,CACpB,EAAO,KAAK,2BAA2B,CACvC,MAAM,QAAQ,IAAI,EAAc,IAAI,MAAO,CAAE,OAAM,UAAW,CAC5D,GAAI,CACF,EAAO,KAAK,0BAA0B,IAAO,CAC7C,MAAM,GAAM,OACL,EAAO,CAEd,MADA,EAAO,MAAM,kBAAkB,EAAK,UAAW,CAAE,QAAO,CAAC,CACnD,IAER,CAAC,EAGL,WAAY,SAAY,CACtB,EAAO,KAAK,8BAA8B,EAG5C,QAAS,EAAK,IAAU,CAClB,EACF,EAAO,MAAM,EAAK,CAAE,QAAO,CAAC,CAE5B,EAAO,KAAK,EAAI,EAGrB,CASD,OAPA,EAAe,EAAO,OAAQ,EAAgB,CAE9C,EAAO,KAAK,kDAAmD,CAC7D,eACA,gBACD,CAAC,CAEK,CACL,qBACA,iBACA,iBAAkB,EAAc,IAA8B,CAC5D,EAAc,KAAK,CAAE,OAAM,OAAM,CAAC,EAEpC,kBAAqB,EAAmB,eAAe,CACvD,mBAAsB,EAAmB,gBAAgB,CACzD,SAAU,SAAY,CACpB,EAAO,KAAK,4BAA4B,CACxC,MAAM,EAAe,WAAW,EAEnC"}
@@ -150,6 +150,7 @@ interface GracefulShutdownConfig {
150
150
  * @default true
151
151
  */
152
152
  sendFailuresDuringShutdown?: boolean;
153
+ useExit0?: boolean;
153
154
  }
154
155
  //#endregion
155
156
  export { ElasticsearchClient, GracefulShutdownConfig, HealthCheck, HealthCheckResult, HealthStatus, LivenessConfig, NamedHealthCheck, NamedShutdownHook, RabbitMQClient, ReadinessConfig, RedisClient, ResourceCheckConfig, SequelizeClient, ShutdownHook };
@@ -150,6 +150,7 @@ interface GracefulShutdownConfig {
150
150
  * @default true
151
151
  */
152
152
  sendFailuresDuringShutdown?: boolean;
153
+ useExit0?: boolean;
153
154
  }
154
155
  //#endregion
155
156
  export { ElasticsearchClient, GracefulShutdownConfig, HealthCheck, HealthCheckResult, HealthStatus, LivenessConfig, NamedHealthCheck, NamedShutdownHook, RabbitMQClient, ReadinessConfig, RedisClient, ResourceCheckConfig, SequelizeClient, ShutdownHook };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/nitur",
3
- "version": "2.2.0-0",
3
+ "version": "2.2.0-1",
4
4
  "description": "A package for service monitoring",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",