@autofleet/nitur 2.2.0-0 → 2.2.0-beta.0
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.
- package/lib/alive-endpoint/middleware.cjs +1 -1
- package/lib/alive-endpoint/middleware.js +1 -1
- package/lib/fastify.cjs +1 -1
- package/lib/fastify.d.cts +1 -6
- package/lib/fastify.d.ts +1 -6
- package/lib/fastify.js +1 -1
- package/lib/health-manager/health-check-handlers.cjs +2 -0
- package/lib/health-manager/health-check-handlers.cjs.map +1 -0
- package/lib/health-manager/health-check-handlers.js +2 -0
- package/lib/health-manager/health-check-handlers.js.map +1 -0
- package/lib/health-manager/health-manager.cjs +2 -0
- package/lib/health-manager/health-manager.cjs.map +1 -0
- package/lib/health-manager/health-manager.d.cts +80 -0
- package/lib/health-manager/health-manager.d.ts +80 -0
- package/lib/health-manager/health-manager.js +2 -0
- package/lib/health-manager/health-manager.js.map +1 -0
- package/lib/health-manager/shutdown-handlers.cjs +2 -0
- package/lib/health-manager/shutdown-handlers.cjs.map +1 -0
- package/lib/health-manager/shutdown-handlers.js +2 -0
- package/lib/health-manager/shutdown-handlers.js.map +1 -0
- package/lib/health-manager/types.cjs +2 -0
- package/lib/health-manager/types.cjs.map +1 -0
- package/lib/health-manager/types.d.cts +104 -0
- package/lib/health-manager/types.d.ts +104 -0
- package/lib/health-manager/types.js +2 -0
- package/lib/health-manager/types.js.map +1 -0
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +2 -6
- package/lib/index.d.ts +2 -6
- package/lib/index.js +1 -1
- package/lib/utils.cjs +2 -0
- package/lib/utils.cjs.map +1 -0
- package/lib/utils.js +2 -0
- package/lib/utils.js.map +1 -0
- package/package.json +11 -14
- package/lib/health-check/checkers.cjs +0 -2
- package/lib/health-check/checkers.cjs.map +0 -1
- package/lib/health-check/checkers.d.cts +0 -44
- package/lib/health-check/checkers.d.ts +0 -44
- package/lib/health-check/checkers.js +0 -2
- package/lib/health-check/checkers.js.map +0 -1
- package/lib/health-check/express-adapter.cjs +0 -2
- package/lib/health-check/express-adapter.cjs.map +0 -1
- package/lib/health-check/express-adapter.d.cts +0 -23
- package/lib/health-check/express-adapter.d.ts +0 -23
- package/lib/health-check/express-adapter.js +0 -2
- package/lib/health-check/express-adapter.js.map +0 -1
- package/lib/health-check/fastify-adapter.cjs +0 -2
- package/lib/health-check/fastify-adapter.cjs.map +0 -1
- package/lib/health-check/fastify-adapter.d.cts +0 -28
- package/lib/health-check/fastify-adapter.d.ts +0 -28
- package/lib/health-check/fastify-adapter.js +0 -2
- package/lib/health-check/fastify-adapter.js.map +0 -1
- package/lib/health-check/index.cjs +0 -1
- package/lib/health-check/index.js +0 -1
- package/lib/health-check/manager.cjs +0 -2
- package/lib/health-check/manager.cjs.map +0 -1
- package/lib/health-check/manager.d.cts +0 -53
- package/lib/health-check/manager.d.ts +0 -53
- package/lib/health-check/manager.js +0 -2
- package/lib/health-check/manager.js.map +0 -1
- package/lib/health-check/setup.cjs +0 -2
- package/lib/health-check/setup.cjs.map +0 -1
- package/lib/health-check/setup.d.cts +0 -69
- package/lib/health-check/setup.d.ts +0 -69
- package/lib/health-check/setup.js +0 -2
- package/lib/health-check/setup.js.map +0 -1
- package/lib/health-check/types.d.cts +0 -156
- package/lib/health-check/types.d.ts +0 -156
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { ElasticsearchClient, GracefulShutdownConfig, HealthCheck, HealthCheckResult, HealthStatus, LivenessConfig, NamedHealthCheck, NamedShutdownHook, RabbitMQClient, ReadinessConfig, RedisClient, ResourceCheckConfig, SequelizeClient, ShutdownHook } from "./health-check/types.js";
|
|
2
|
-
import { HealthCheckManager } from "./health-check/manager.js";
|
|
3
|
-
import { HealthCheckSetup, HealthCheckSetupConfig, setupHealthCheck } from "./health-check/setup.js";
|
|
4
|
-
import { ExpressHealthCheckConfig, setupExpressHealthCheck } from "./health-check/express-adapter.js";
|
|
5
|
-
import { createBasicHealthCheck, createElasticsearchHealthCheck, createRabbitMQHealthCheck, createRedisHealthChecks, createSequelizeHealthCheck, withTimeout } from "./health-check/checkers.js";
|
|
6
1
|
import { aliveEndpointMiddleware } from "./alive-endpoint/middleware.js";
|
|
7
|
-
|
|
2
|
+
import { HealthManager } from "./health-manager/health-manager.js";
|
|
3
|
+
export { HealthManager, aliveEndpointMiddleware as aliveEndpoint };
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{aliveEndpointMiddleware as e}from"./alive-endpoint/middleware.js";import{HealthManager as t}from"./health-manager/health-manager.js";export{t as HealthManager,e as aliveEndpoint};
|
package/lib/utils.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["\nimport { setTimeout } from 'node:timers/promises';\n\nexport const timeoutPromise = async (timeoutMs: number, errorMessage: string): Promise<never> => {\n await setTimeout(timeoutMs);\n throw new Error(errorMessage);\n};"],"mappings":"yFAGA,MAAa,EAAiB,MAAO,EAAmB,IAAyC,CAE/F,MADA,MAAA,EAAA,EAAA,YAAiB,EAAU,CACjB,MAAM,EAAa"}
|
package/lib/utils.js
ADDED
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["\nimport { setTimeout } from 'node:timers/promises';\n\nexport const timeoutPromise = async (timeoutMs: number, errorMessage: string): Promise<never> => {\n await setTimeout(timeoutMs);\n throw new Error(errorMessage);\n};"],"mappings":"kDAGA,MAAa,EAAiB,MAAO,EAAmB,IAAyC,CAE/F,MADA,MAAM,EAAW,EAAU,CACjB,MAAM,EAAa"}
|
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-beta.0",
|
|
4
4
|
"description": "A package for service monitoring",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -28,12 +28,6 @@
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
|
-
"scripts": {
|
|
32
|
-
"build": "tsdown",
|
|
33
|
-
"prepublish": "npm run build",
|
|
34
|
-
"test": "vitest",
|
|
35
|
-
"coverage": "vitest --coverage"
|
|
36
|
-
},
|
|
37
31
|
"repository": {
|
|
38
32
|
"type": "git",
|
|
39
33
|
"url": "git+https://github.com/Autofleet/autorepo.git"
|
|
@@ -44,20 +38,23 @@
|
|
|
44
38
|
"url": "https://github.com/Autofleet/autorepo/issues"
|
|
45
39
|
},
|
|
46
40
|
"devDependencies": {
|
|
47
|
-
"@types/express": "^4.17.
|
|
48
|
-
"@types/node": "^18"
|
|
49
|
-
"fastify": "^5.6.1"
|
|
41
|
+
"@types/express": "^4.17.21",
|
|
42
|
+
"@types/node": "^18"
|
|
50
43
|
},
|
|
51
44
|
"homepage": "https://github.com/Autofleet/autorepo/tree/master/packages/nitur#readme",
|
|
52
45
|
"files": [
|
|
53
46
|
"lib/**/*"
|
|
54
47
|
],
|
|
55
48
|
"dependencies": {
|
|
56
|
-
"
|
|
57
|
-
"@
|
|
58
|
-
"http-terminator": "^3.2.0"
|
|
49
|
+
"http-terminator": "^3.2.0",
|
|
50
|
+
"@autofleet/logger": "^4.2.35"
|
|
59
51
|
},
|
|
60
52
|
"engines": {
|
|
61
53
|
"node": "^18 || ^20 || >=22.0.0"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsdown",
|
|
57
|
+
"test": "vitest",
|
|
58
|
+
"coverage": "vitest --coverage"
|
|
62
59
|
}
|
|
63
|
-
}
|
|
60
|
+
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function e(e){return Object.entries(e).map(([e,t])=>({name:`redis:${e}`,check:async()=>{try{await t.ping()}catch(t){throw Error(`Redis instance '${e}' ping failed: ${t instanceof Error?t.message:String(t)}`)}}}))}function t(e){return{name:`database:sequelize`,check:async()=>{try{let[[t]]=await e.query(`SELECT 1 as status`);if(!t||t.status!==1)throw Error(`Unexpected query result`)}catch(e){throw Error(`Sequelize health check failed: ${e instanceof Error?e.message:String(e)}`)}}}}function n(e){return{name:`elasticsearch`,check:async()=>{try{if(!await e.ping())throw Error(`Elasticsearch ping returned false`)}catch(e){throw Error(`Elasticsearch health check failed: ${e instanceof Error?e.message:String(e)}`)}}}}function r(e){return{name:`rabbitmq`,check:async()=>{try{if(!await Promise.resolve(e.isConnected()))throw Error(`RabbitMQ is not connected`)}catch(e){throw Error(`RabbitMQ health check failed: ${e instanceof Error?e.message:String(e)}`)}}}}function i(){return{name:`basic`,check:async()=>Promise.resolve()}}function a(e,t){return async()=>{let n=new Promise((e,n)=>{setTimeout(()=>n(Error(`Health check timed out after ${t}ms`)),t)});await Promise.race([e(),n])}}exports.createBasicHealthCheck=i,exports.createElasticsearchHealthCheck=n,exports.createRabbitMQHealthCheck=r,exports.createRedisHealthChecks=e,exports.createSequelizeHealthCheck=t,exports.withTimeout=a;
|
|
2
|
-
//# sourceMappingURL=checkers.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkers.cjs","names":[],"sources":["../../src/health-check/checkers.ts"],"sourcesContent":["import type {\n RedisClient,\n SequelizeClient,\n ElasticsearchClient,\n RabbitMQClient,\n HealthCheck,\n NamedHealthCheck,\n} from './types';\n\n/**\n * Create health checks for multiple Redis instances\n * @param redisInstances Object with instance names as keys and Redis clients as values\n * @returns Array of named health checks\n */\nexport function createRedisHealthChecks(\n redisInstances: Record<string, RedisClient>,\n): NamedHealthCheck[] {\n return Object.entries(redisInstances).map(([name, client]) => ({\n name: `redis:${name}`,\n check: async () => {\n try {\n await client.ping();\n } catch (error) {\n throw new Error(`Redis instance '${name}' ping failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n }));\n}\n\n/**\n * Create health check for Sequelize database\n * @param sequelize Sequelize instance\n * @returns Named health check\n */\nexport function createSequelizeHealthCheck(\n sequelize: SequelizeClient,\n): NamedHealthCheck {\n return {\n name: 'database:sequelize',\n check: async () => {\n try {\n const [[result]] = await sequelize.query('SELECT 1 as status');\n if (!result || (result).status !== 1) {\n throw new Error('Unexpected query result');\n }\n } catch (error) {\n throw new Error(`Sequelize health check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\n/**\n * Create health check for Elasticsearch\n * @param elasticsearch Elasticsearch client\n * @returns Named health check\n */\nexport function createElasticsearchHealthCheck(\n elasticsearch: ElasticsearchClient,\n): NamedHealthCheck {\n return {\n name: 'elasticsearch',\n check: async () => {\n try {\n const isAlive = await elasticsearch.ping();\n if (!isAlive) {\n throw new Error('Elasticsearch ping returned false');\n }\n } catch (error) {\n throw new Error(`Elasticsearch health check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\n/**\n * Create health check for RabbitMQ\n * @param rabbitmq RabbitMQ client\n * @returns Named health check\n */\nexport function createRabbitMQHealthCheck(\n rabbitmq: RabbitMQClient,\n): NamedHealthCheck {\n return {\n name: 'rabbitmq',\n check: async () => {\n try {\n const isConnected = await Promise.resolve(rabbitmq.isConnected());\n if (!isConnected) {\n throw new Error('RabbitMQ is not connected');\n }\n } catch (error) {\n throw new Error(`RabbitMQ health check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\n/**\n * Create a simple health check that always passes\n * Useful for basic liveness probe that just checks if the process is responsive\n * @returns Named health check\n */\nexport function createBasicHealthCheck(): NamedHealthCheck {\n return {\n name: 'basic',\n check: async () =>\n // Simply check that the process is responsive\n Promise.resolve(),\n };\n}\n\n/**\n * Create a health check with timeout wrapper\n * @param check Health check function\n * @param timeoutMs Timeout in milliseconds\n * @returns Health check with timeout\n */\nexport function withTimeout(check: HealthCheck, timeoutMs: number): HealthCheck {\n return async () => {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Health check timed out after ${timeoutMs}ms`)), timeoutMs);\n });\n\n await Promise.race([check(), timeoutPromise]);\n };\n}\n"],"mappings":"AAcA,SAAgB,EACd,EACoB,CACpB,OAAO,OAAO,QAAQ,EAAe,CAAC,KAAK,CAAC,EAAM,MAAa,CAC7D,KAAM,SAAS,IACf,MAAO,SAAY,CACjB,GAAI,CACF,MAAM,EAAO,MAAM,OACZ,EAAO,CACd,MAAU,MAAM,mBAAmB,EAAK,iBAAiB,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAGvH,EAAE,CAQL,SAAgB,EACd,EACkB,CAClB,MAAO,CACL,KAAM,qBACN,MAAO,SAAY,CACjB,GAAI,CACF,GAAM,CAAC,CAAC,IAAW,MAAM,EAAU,MAAM,qBAAqB,CAC9D,GAAI,CAAC,GAAW,EAAQ,SAAW,EACjC,MAAU,MAAM,0BAA0B,OAErC,EAAO,CACd,MAAU,MAAM,kCAAkC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAGhH,CAQH,SAAgB,EACd,EACkB,CAClB,MAAO,CACL,KAAM,gBACN,MAAO,SAAY,CACjB,GAAI,CAEF,GAAI,CADY,MAAM,EAAc,MAAM,CAExC,MAAU,MAAM,oCAAoC,OAE/C,EAAO,CACd,MAAU,MAAM,sCAAsC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAGpH,CAQH,SAAgB,EACd,EACkB,CAClB,MAAO,CACL,KAAM,WACN,MAAO,SAAY,CACjB,GAAI,CAEF,GAAI,CADgB,MAAM,QAAQ,QAAQ,EAAS,aAAa,CAAC,CAE/D,MAAU,MAAM,4BAA4B,OAEvC,EAAO,CACd,MAAU,MAAM,iCAAiC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAG/G,CAQH,SAAgB,GAA2C,CACzD,MAAO,CACL,KAAM,QACN,MAAO,SAEL,QAAQ,SAAS,CACpB,CASH,SAAgB,EAAY,EAAoB,EAAgC,CAC9E,OAAO,SAAY,CACjB,IAAM,EAAiB,IAAI,SAAgB,EAAG,IAAW,CACvD,eAAiB,EAAW,MAAM,gCAAgC,EAAU,IAAI,CAAC,CAAE,EAAU,EAC7F,CAEF,MAAM,QAAQ,KAAK,CAAC,GAAO,CAAE,EAAe,CAAC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { ElasticsearchClient, HealthCheck, NamedHealthCheck, RabbitMQClient, RedisClient, SequelizeClient } from "./types.cjs";
|
|
2
|
-
|
|
3
|
-
//#region src/health-check/checkers.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Create health checks for multiple Redis instances
|
|
7
|
-
* @param redisInstances Object with instance names as keys and Redis clients as values
|
|
8
|
-
* @returns Array of named health checks
|
|
9
|
-
*/
|
|
10
|
-
declare function createRedisHealthChecks(redisInstances: Record<string, RedisClient>): NamedHealthCheck[];
|
|
11
|
-
/**
|
|
12
|
-
* Create health check for Sequelize database
|
|
13
|
-
* @param sequelize Sequelize instance
|
|
14
|
-
* @returns Named health check
|
|
15
|
-
*/
|
|
16
|
-
declare function createSequelizeHealthCheck(sequelize: SequelizeClient): NamedHealthCheck;
|
|
17
|
-
/**
|
|
18
|
-
* Create health check for Elasticsearch
|
|
19
|
-
* @param elasticsearch Elasticsearch client
|
|
20
|
-
* @returns Named health check
|
|
21
|
-
*/
|
|
22
|
-
declare function createElasticsearchHealthCheck(elasticsearch: ElasticsearchClient): NamedHealthCheck;
|
|
23
|
-
/**
|
|
24
|
-
* Create health check for RabbitMQ
|
|
25
|
-
* @param rabbitmq RabbitMQ client
|
|
26
|
-
* @returns Named health check
|
|
27
|
-
*/
|
|
28
|
-
declare function createRabbitMQHealthCheck(rabbitmq: RabbitMQClient): NamedHealthCheck;
|
|
29
|
-
/**
|
|
30
|
-
* Create a simple health check that always passes
|
|
31
|
-
* Useful for basic liveness probe that just checks if the process is responsive
|
|
32
|
-
* @returns Named health check
|
|
33
|
-
*/
|
|
34
|
-
declare function createBasicHealthCheck(): NamedHealthCheck;
|
|
35
|
-
/**
|
|
36
|
-
* Create a health check with timeout wrapper
|
|
37
|
-
* @param check Health check function
|
|
38
|
-
* @param timeoutMs Timeout in milliseconds
|
|
39
|
-
* @returns Health check with timeout
|
|
40
|
-
*/
|
|
41
|
-
declare function withTimeout(check: HealthCheck, timeoutMs: number): HealthCheck;
|
|
42
|
-
//#endregion
|
|
43
|
-
export { createBasicHealthCheck, createElasticsearchHealthCheck, createRabbitMQHealthCheck, createRedisHealthChecks, createSequelizeHealthCheck, withTimeout };
|
|
44
|
-
//# sourceMappingURL=checkers.d.cts.map
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { ElasticsearchClient, HealthCheck, NamedHealthCheck, RabbitMQClient, RedisClient, SequelizeClient } from "./types.js";
|
|
2
|
-
|
|
3
|
-
//#region src/health-check/checkers.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Create health checks for multiple Redis instances
|
|
7
|
-
* @param redisInstances Object with instance names as keys and Redis clients as values
|
|
8
|
-
* @returns Array of named health checks
|
|
9
|
-
*/
|
|
10
|
-
declare function createRedisHealthChecks(redisInstances: Record<string, RedisClient>): NamedHealthCheck[];
|
|
11
|
-
/**
|
|
12
|
-
* Create health check for Sequelize database
|
|
13
|
-
* @param sequelize Sequelize instance
|
|
14
|
-
* @returns Named health check
|
|
15
|
-
*/
|
|
16
|
-
declare function createSequelizeHealthCheck(sequelize: SequelizeClient): NamedHealthCheck;
|
|
17
|
-
/**
|
|
18
|
-
* Create health check for Elasticsearch
|
|
19
|
-
* @param elasticsearch Elasticsearch client
|
|
20
|
-
* @returns Named health check
|
|
21
|
-
*/
|
|
22
|
-
declare function createElasticsearchHealthCheck(elasticsearch: ElasticsearchClient): NamedHealthCheck;
|
|
23
|
-
/**
|
|
24
|
-
* Create health check for RabbitMQ
|
|
25
|
-
* @param rabbitmq RabbitMQ client
|
|
26
|
-
* @returns Named health check
|
|
27
|
-
*/
|
|
28
|
-
declare function createRabbitMQHealthCheck(rabbitmq: RabbitMQClient): NamedHealthCheck;
|
|
29
|
-
/**
|
|
30
|
-
* Create a simple health check that always passes
|
|
31
|
-
* Useful for basic liveness probe that just checks if the process is responsive
|
|
32
|
-
* @returns Named health check
|
|
33
|
-
*/
|
|
34
|
-
declare function createBasicHealthCheck(): NamedHealthCheck;
|
|
35
|
-
/**
|
|
36
|
-
* Create a health check with timeout wrapper
|
|
37
|
-
* @param check Health check function
|
|
38
|
-
* @param timeoutMs Timeout in milliseconds
|
|
39
|
-
* @returns Health check with timeout
|
|
40
|
-
*/
|
|
41
|
-
declare function withTimeout(check: HealthCheck, timeoutMs: number): HealthCheck;
|
|
42
|
-
//#endregion
|
|
43
|
-
export { createBasicHealthCheck, createElasticsearchHealthCheck, createRabbitMQHealthCheck, createRedisHealthChecks, createSequelizeHealthCheck, withTimeout };
|
|
44
|
-
//# sourceMappingURL=checkers.d.ts.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function e(e){return Object.entries(e).map(([e,t])=>({name:`redis:${e}`,check:async()=>{try{await t.ping()}catch(t){throw Error(`Redis instance '${e}' ping failed: ${t instanceof Error?t.message:String(t)}`)}}}))}function t(e){return{name:`database:sequelize`,check:async()=>{try{let[[t]]=await e.query(`SELECT 1 as status`);if(!t||t.status!==1)throw Error(`Unexpected query result`)}catch(e){throw Error(`Sequelize health check failed: ${e instanceof Error?e.message:String(e)}`)}}}}function n(e){return{name:`elasticsearch`,check:async()=>{try{if(!await e.ping())throw Error(`Elasticsearch ping returned false`)}catch(e){throw Error(`Elasticsearch health check failed: ${e instanceof Error?e.message:String(e)}`)}}}}function r(e){return{name:`rabbitmq`,check:async()=>{try{if(!await Promise.resolve(e.isConnected()))throw Error(`RabbitMQ is not connected`)}catch(e){throw Error(`RabbitMQ health check failed: ${e instanceof Error?e.message:String(e)}`)}}}}function i(){return{name:`basic`,check:async()=>Promise.resolve()}}function a(e,t){return async()=>{let n=new Promise((e,n)=>{setTimeout(()=>n(Error(`Health check timed out after ${t}ms`)),t)});await Promise.race([e(),n])}}export{i as createBasicHealthCheck,n as createElasticsearchHealthCheck,r as createRabbitMQHealthCheck,e as createRedisHealthChecks,t as createSequelizeHealthCheck,a as withTimeout};
|
|
2
|
-
//# sourceMappingURL=checkers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkers.js","names":[],"sources":["../../src/health-check/checkers.ts"],"sourcesContent":["import type {\n RedisClient,\n SequelizeClient,\n ElasticsearchClient,\n RabbitMQClient,\n HealthCheck,\n NamedHealthCheck,\n} from './types';\n\n/**\n * Create health checks for multiple Redis instances\n * @param redisInstances Object with instance names as keys and Redis clients as values\n * @returns Array of named health checks\n */\nexport function createRedisHealthChecks(\n redisInstances: Record<string, RedisClient>,\n): NamedHealthCheck[] {\n return Object.entries(redisInstances).map(([name, client]) => ({\n name: `redis:${name}`,\n check: async () => {\n try {\n await client.ping();\n } catch (error) {\n throw new Error(`Redis instance '${name}' ping failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n }));\n}\n\n/**\n * Create health check for Sequelize database\n * @param sequelize Sequelize instance\n * @returns Named health check\n */\nexport function createSequelizeHealthCheck(\n sequelize: SequelizeClient,\n): NamedHealthCheck {\n return {\n name: 'database:sequelize',\n check: async () => {\n try {\n const [[result]] = await sequelize.query('SELECT 1 as status');\n if (!result || (result).status !== 1) {\n throw new Error('Unexpected query result');\n }\n } catch (error) {\n throw new Error(`Sequelize health check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\n/**\n * Create health check for Elasticsearch\n * @param elasticsearch Elasticsearch client\n * @returns Named health check\n */\nexport function createElasticsearchHealthCheck(\n elasticsearch: ElasticsearchClient,\n): NamedHealthCheck {\n return {\n name: 'elasticsearch',\n check: async () => {\n try {\n const isAlive = await elasticsearch.ping();\n if (!isAlive) {\n throw new Error('Elasticsearch ping returned false');\n }\n } catch (error) {\n throw new Error(`Elasticsearch health check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\n/**\n * Create health check for RabbitMQ\n * @param rabbitmq RabbitMQ client\n * @returns Named health check\n */\nexport function createRabbitMQHealthCheck(\n rabbitmq: RabbitMQClient,\n): NamedHealthCheck {\n return {\n name: 'rabbitmq',\n check: async () => {\n try {\n const isConnected = await Promise.resolve(rabbitmq.isConnected());\n if (!isConnected) {\n throw new Error('RabbitMQ is not connected');\n }\n } catch (error) {\n throw new Error(`RabbitMQ health check failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\n/**\n * Create a simple health check that always passes\n * Useful for basic liveness probe that just checks if the process is responsive\n * @returns Named health check\n */\nexport function createBasicHealthCheck(): NamedHealthCheck {\n return {\n name: 'basic',\n check: async () =>\n // Simply check that the process is responsive\n Promise.resolve(),\n };\n}\n\n/**\n * Create a health check with timeout wrapper\n * @param check Health check function\n * @param timeoutMs Timeout in milliseconds\n * @returns Health check with timeout\n */\nexport function withTimeout(check: HealthCheck, timeoutMs: number): HealthCheck {\n return async () => {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Health check timed out after ${timeoutMs}ms`)), timeoutMs);\n });\n\n await Promise.race([check(), timeoutPromise]);\n };\n}\n"],"mappings":"AAcA,SAAgB,EACd,EACoB,CACpB,OAAO,OAAO,QAAQ,EAAe,CAAC,KAAK,CAAC,EAAM,MAAa,CAC7D,KAAM,SAAS,IACf,MAAO,SAAY,CACjB,GAAI,CACF,MAAM,EAAO,MAAM,OACZ,EAAO,CACd,MAAU,MAAM,mBAAmB,EAAK,iBAAiB,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAGvH,EAAE,CAQL,SAAgB,EACd,EACkB,CAClB,MAAO,CACL,KAAM,qBACN,MAAO,SAAY,CACjB,GAAI,CACF,GAAM,CAAC,CAAC,IAAW,MAAM,EAAU,MAAM,qBAAqB,CAC9D,GAAI,CAAC,GAAW,EAAQ,SAAW,EACjC,MAAU,MAAM,0BAA0B,OAErC,EAAO,CACd,MAAU,MAAM,kCAAkC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAGhH,CAQH,SAAgB,EACd,EACkB,CAClB,MAAO,CACL,KAAM,gBACN,MAAO,SAAY,CACjB,GAAI,CAEF,GAAI,CADY,MAAM,EAAc,MAAM,CAExC,MAAU,MAAM,oCAAoC,OAE/C,EAAO,CACd,MAAU,MAAM,sCAAsC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAGpH,CAQH,SAAgB,EACd,EACkB,CAClB,MAAO,CACL,KAAM,WACN,MAAO,SAAY,CACjB,GAAI,CAEF,GAAI,CADgB,MAAM,QAAQ,QAAQ,EAAS,aAAa,CAAC,CAE/D,MAAU,MAAM,4BAA4B,OAEvC,EAAO,CACd,MAAU,MAAM,iCAAiC,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,GAAG,GAG/G,CAQH,SAAgB,GAA2C,CACzD,MAAO,CACL,KAAM,QACN,MAAO,SAEL,QAAQ,SAAS,CACpB,CASH,SAAgB,EAAY,EAAoB,EAAgC,CAC9E,OAAO,SAAY,CACjB,IAAM,EAAiB,IAAI,SAAgB,EAAG,IAAW,CACvD,eAAiB,EAAW,MAAM,gCAAgC,EAAU,IAAI,CAAC,CAAE,EAAU,EAC7F,CAEF,MAAM,QAAQ,KAAK,CAAC,GAAO,CAAE,EAAe,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"express-adapter.cjs","names":["setupHealthCheck"],"sources":["../../src/health-check/express-adapter.ts"],"sourcesContent":["import type { Application } from 'express';\nimport { setupHealthCheck, type HealthCheckSetupConfig, type HealthCheckSetup } from './setup';\n\n/**\n * Configuration for Express health check setup\n */\nexport interface ExpressHealthCheckConfig extends Omit<HealthCheckSetupConfig, 'app'> {\n /**\n * Express application instance\n */\n app: Application;\n}\n\n/**\n * Setup health checks and graceful shutdown for Express\n * @param config Configuration options\n * @returns Health check setup utilities\n */\nexport function setupExpressHealthCheck(config: ExpressHealthCheckConfig): HealthCheckSetup {\n return setupHealthCheck(config as HealthCheckSetupConfig);\n}\n"],"mappings":"+BAkBA,SAAgB,EAAwB,EAAoD,CAC1F,OAAOA,EAAAA,iBAAiB,EAAiC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { HealthCheckSetup, HealthCheckSetupConfig } from "./setup.cjs";
|
|
2
|
-
import { Application } from "express";
|
|
3
|
-
|
|
4
|
-
//#region src/health-check/express-adapter.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Configuration for Express health check setup
|
|
8
|
-
*/
|
|
9
|
-
interface ExpressHealthCheckConfig extends Omit<HealthCheckSetupConfig, "app"> {
|
|
10
|
-
/**
|
|
11
|
-
* Express application instance
|
|
12
|
-
*/
|
|
13
|
-
app: Application;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Setup health checks and graceful shutdown for Express
|
|
17
|
-
* @param config Configuration options
|
|
18
|
-
* @returns Health check setup utilities
|
|
19
|
-
*/
|
|
20
|
-
declare function setupExpressHealthCheck(config: ExpressHealthCheckConfig): HealthCheckSetup;
|
|
21
|
-
//#endregion
|
|
22
|
-
export { ExpressHealthCheckConfig, setupExpressHealthCheck };
|
|
23
|
-
//# sourceMappingURL=express-adapter.d.cts.map
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { HealthCheckSetup, HealthCheckSetupConfig } from "./setup.js";
|
|
2
|
-
import { Application } from "express";
|
|
3
|
-
|
|
4
|
-
//#region src/health-check/express-adapter.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Configuration for Express health check setup
|
|
8
|
-
*/
|
|
9
|
-
interface ExpressHealthCheckConfig extends Omit<HealthCheckSetupConfig, "app"> {
|
|
10
|
-
/**
|
|
11
|
-
* Express application instance
|
|
12
|
-
*/
|
|
13
|
-
app: Application;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Setup health checks and graceful shutdown for Express
|
|
17
|
-
* @param config Configuration options
|
|
18
|
-
* @returns Health check setup utilities
|
|
19
|
-
*/
|
|
20
|
-
declare function setupExpressHealthCheck(config: ExpressHealthCheckConfig): HealthCheckSetup;
|
|
21
|
-
//#endregion
|
|
22
|
-
export { ExpressHealthCheckConfig, setupExpressHealthCheck };
|
|
23
|
-
//# sourceMappingURL=express-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"express-adapter.js","names":[],"sources":["../../src/health-check/express-adapter.ts"],"sourcesContent":["import type { Application } from 'express';\nimport { setupHealthCheck, type HealthCheckSetupConfig, type HealthCheckSetup } from './setup';\n\n/**\n * Configuration for Express health check setup\n */\nexport interface ExpressHealthCheckConfig extends Omit<HealthCheckSetupConfig, 'app'> {\n /**\n * Express application instance\n */\n app: Application;\n}\n\n/**\n * Setup health checks and graceful shutdown for Express\n * @param config Configuration options\n * @returns Health check setup utilities\n */\nexport function setupExpressHealthCheck(config: ExpressHealthCheckConfig): HealthCheckSetup {\n return setupHealthCheck(config as HealthCheckSetupConfig);\n}\n"],"mappings":"8CAkBA,SAAgB,EAAwB,EAAoD,CAC1F,OAAO,EAAiB,EAAiC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../logger.cjs`),t=require(`./setup.cjs`);function n(n){let r=n.logger??e.logger,i=n.server??n.app.server;if(!i)throw r.warn(`Could not extract server from Fastify instance`),Error(`Server instance required for health checks`);return t.setupHealthCheck({...n,server:i})}exports.setupFastifyHealthCheck=n;
|
|
2
|
-
//# sourceMappingURL=fastify-adapter.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastify-adapter.cjs","names":["logger","defaultLogger","setupHealthCheck"],"sources":["../../src/health-check/fastify-adapter.ts"],"sourcesContent":["import type { FastifyInstance } from 'fastify';\nimport type { Server } from 'http';\nimport { setupHealthCheck, type HealthCheckSetupConfig, type HealthCheckSetup } from './setup';\nimport { logger as defaultLogger } from '../logger';\n\n/**\n * Configuration for Fastify health check setup\n */\nexport interface FastifyHealthCheckConfig extends Omit<HealthCheckSetupConfig, 'app' | 'server'> {\n /**\n * Fastify application instance\n */\n app: FastifyInstance;\n\n /**\n * HTTP server instance (optional - extracted from Fastify if not provided)\n */\n server?: Server;\n}\n\n/**\n * Setup health checks and graceful shutdown for Fastify\n * @param config Configuration options\n * @returns Health check setup utilities\n */\nexport function setupFastifyHealthCheck(config: FastifyHealthCheckConfig): HealthCheckSetup {\n const logger = config.logger ?? defaultLogger;\n\n // Extract server from Fastify if not provided\n const server = config.server ?? (config.app.server as Server);\n\n if (!server) {\n logger.warn('Could not extract server from Fastify instance');\n throw new Error('Server instance required for health checks');\n }\n\n return setupHealthCheck({\n ...config,\n server,\n } as HealthCheckSetupConfig);\n}\n"],"mappings":"0DAyBA,SAAgB,EAAwB,EAAoD,CAC1F,IAAMA,EAAS,EAAO,QAAUC,EAAAA,OAG1B,EAAS,EAAO,QAAW,EAAO,IAAI,OAE5C,GAAI,CAAC,EAEH,MADA,EAAO,KAAK,iDAAiD,CACnD,MAAM,6CAA6C,CAG/D,OAAOC,EAAAA,iBAAiB,CACtB,GAAG,EACH,SACD,CAA2B"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { HealthCheckSetup, HealthCheckSetupConfig } from "./setup.cjs";
|
|
2
|
-
import { Server } from "http";
|
|
3
|
-
import { FastifyInstance } from "fastify";
|
|
4
|
-
|
|
5
|
-
//#region src/health-check/fastify-adapter.d.ts
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Configuration for Fastify health check setup
|
|
9
|
-
*/
|
|
10
|
-
interface FastifyHealthCheckConfig extends Omit<HealthCheckSetupConfig, "app" | "server"> {
|
|
11
|
-
/**
|
|
12
|
-
* Fastify application instance
|
|
13
|
-
*/
|
|
14
|
-
app: FastifyInstance;
|
|
15
|
-
/**
|
|
16
|
-
* HTTP server instance (optional - extracted from Fastify if not provided)
|
|
17
|
-
*/
|
|
18
|
-
server?: Server;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Setup health checks and graceful shutdown for Fastify
|
|
22
|
-
* @param config Configuration options
|
|
23
|
-
* @returns Health check setup utilities
|
|
24
|
-
*/
|
|
25
|
-
declare function setupFastifyHealthCheck(config: FastifyHealthCheckConfig): HealthCheckSetup;
|
|
26
|
-
//#endregion
|
|
27
|
-
export { FastifyHealthCheckConfig, setupFastifyHealthCheck };
|
|
28
|
-
//# sourceMappingURL=fastify-adapter.d.cts.map
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { HealthCheckSetup, HealthCheckSetupConfig } from "./setup.js";
|
|
2
|
-
import { Server } from "http";
|
|
3
|
-
import { FastifyInstance } from "fastify";
|
|
4
|
-
|
|
5
|
-
//#region src/health-check/fastify-adapter.d.ts
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Configuration for Fastify health check setup
|
|
9
|
-
*/
|
|
10
|
-
interface FastifyHealthCheckConfig extends Omit<HealthCheckSetupConfig, "app" | "server"> {
|
|
11
|
-
/**
|
|
12
|
-
* Fastify application instance
|
|
13
|
-
*/
|
|
14
|
-
app: FastifyInstance;
|
|
15
|
-
/**
|
|
16
|
-
* HTTP server instance (optional - extracted from Fastify if not provided)
|
|
17
|
-
*/
|
|
18
|
-
server?: Server;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Setup health checks and graceful shutdown for Fastify
|
|
22
|
-
* @param config Configuration options
|
|
23
|
-
* @returns Health check setup utilities
|
|
24
|
-
*/
|
|
25
|
-
declare function setupFastifyHealthCheck(config: FastifyHealthCheckConfig): HealthCheckSetup;
|
|
26
|
-
//#endregion
|
|
27
|
-
export { FastifyHealthCheckConfig, setupFastifyHealthCheck };
|
|
28
|
-
//# sourceMappingURL=fastify-adapter.d.ts.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{logger as e}from"../logger.js";import{setupHealthCheck as t}from"./setup.js";function n(n){let r=n.logger??e,i=n.server??n.app.server;if(!i)throw r.warn(`Could not extract server from Fastify instance`),Error(`Server instance required for health checks`);return t({...n,server:i})}export{n as setupFastifyHealthCheck};
|
|
2
|
-
//# sourceMappingURL=fastify-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastify-adapter.js","names":["logger","defaultLogger"],"sources":["../../src/health-check/fastify-adapter.ts"],"sourcesContent":["import type { FastifyInstance } from 'fastify';\nimport type { Server } from 'http';\nimport { setupHealthCheck, type HealthCheckSetupConfig, type HealthCheckSetup } from './setup';\nimport { logger as defaultLogger } from '../logger';\n\n/**\n * Configuration for Fastify health check setup\n */\nexport interface FastifyHealthCheckConfig extends Omit<HealthCheckSetupConfig, 'app' | 'server'> {\n /**\n * Fastify application instance\n */\n app: FastifyInstance;\n\n /**\n * HTTP server instance (optional - extracted from Fastify if not provided)\n */\n server?: Server;\n}\n\n/**\n * Setup health checks and graceful shutdown for Fastify\n * @param config Configuration options\n * @returns Health check setup utilities\n */\nexport function setupFastifyHealthCheck(config: FastifyHealthCheckConfig): HealthCheckSetup {\n const logger = config.logger ?? defaultLogger;\n\n // Extract server from Fastify if not provided\n const server = config.server ?? (config.app.server as Server);\n\n if (!server) {\n logger.warn('Could not extract server from Fastify instance');\n throw new Error('Server instance required for health checks');\n }\n\n return setupHealthCheck({\n ...config,\n server,\n } as HealthCheckSetupConfig);\n}\n"],"mappings":"oFAyBA,SAAgB,EAAwB,EAAoD,CAC1F,IAAMA,EAAS,EAAO,QAAUC,EAG1B,EAAS,EAAO,QAAW,EAAO,IAAI,OAE5C,GAAI,CAAC,EAEH,MADA,EAAO,KAAK,iDAAiD,CACnD,MAAM,6CAA6C,CAG/D,OAAO,EAAiB,CACtB,GAAG,EACH,SACD,CAA2B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./checkers.cjs`),t=require(`./manager.cjs`),n=require(`./setup.cjs`),r=require(`./express-adapter.cjs`),i=require(`./fastify-adapter.cjs`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createBasicHealthCheck as e,createElasticsearchHealthCheck as t,createRabbitMQHealthCheck as n,createRedisHealthChecks as r,createSequelizeHealthCheck as i,withTimeout as a}from"./checkers.js";import{HealthCheckManager as o}from"./manager.js";import{setupHealthCheck as s}from"./setup.js";import{setupExpressHealthCheck as c}from"./express-adapter.js";import{setupFastifyHealthCheck as l}from"./fastify-adapter.js";export{};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../logger.cjs`),t=require(`./checkers.cjs`);async function n(e,t,n){let r=Date.now();try{return await t(),{name:e,status:`pass`,duration:Date.now()-r}}catch(t){let i=Date.now()-r,a=t instanceof Error?t.message:String(t);return n?.warn(`Health check '${e}' failed`,{error:a,duration:i}),{name:e,status:`fail`,error:a,duration:i}}}function r(e){let n=[];return e.redis&&Object.keys(e.redis).length>0&&n.push(...t.createRedisHealthChecks(e.redis)),e.sequelize&&n.push(t.createSequelizeHealthCheck(e.sequelize)),e.elasticsearch&&n.push(t.createElasticsearchHealthCheck(e.elasticsearch)),e.rabbitmq&&n.push(t.createRabbitMQHealthCheck(e.rabbitmq)),e.customChecks&&n.push(...e.customChecks),n}var i=class{constructor(n,i){this.livenessChecks=[],this.readinessChecks=[],this.logger=n?.logger??i?.logger??e.logger,this.livenessTimeout=n?.timeout||5e3,this.readinessTimeout=i?.timeout||1e4,n&&(this.livenessChecks=r(n),this.livenessChecks.length===0&&this.livenessChecks.push(t.createBasicHealthCheck())),i&&(this.readinessChecks=r(i))}async checkLiveness(){let e=Date.now();this.logger.debug(`Executing liveness checks`,{count:this.livenessChecks.length});let r=await Promise.all(this.livenessChecks.map(({name:e,check:r})=>n(e,t.withTimeout(r,this.livenessTimeout),this.logger))),i=Date.now()-e,a=r.every(e=>e.status===`pass`),o={status:a?`pass`:`fail`,timestamp:new Date().toISOString(),checks:r,duration:i};return a||this.logger.warn(`Liveness check failed`,{status:o}),o}async checkReadiness(){let e=Date.now();if(this.logger.debug(`Executing readiness checks`,{count:this.readinessChecks.length}),this.readinessChecks.length===0)return{status:`pass`,timestamp:new Date().toISOString(),checks:[],duration:Date.now()-e};let r=await Promise.all(this.readinessChecks.map(({name:e,check:r})=>n(e,t.withTimeout(r,this.readinessTimeout),this.logger))),i=Date.now()-e,a=r.every(e=>e.status===`pass`),o={status:a?`pass`:`fail`,timestamp:new Date().toISOString(),checks:r,duration:i};return a||this.logger.warn(`Readiness check failed`,{status:o}),o}addLivenessCheck(e,t){this.livenessChecks.push({name:e,check:t}),this.logger.debug(`Added liveness check: ${e}`)}addReadinessCheck(e,t){this.readinessChecks.push({name:e,check:t}),this.logger.debug(`Added readiness check: ${e}`)}removeLivenessCheck(e){this.livenessChecks=this.livenessChecks.filter(t=>t.name!==e),this.logger.debug(`Removed liveness check: ${e}`)}removeReadinessCheck(e){this.readinessChecks=this.readinessChecks.filter(t=>t.name!==e),this.logger.debug(`Removed readiness check: ${e}`)}};exports.HealthCheckManager=i;
|
|
2
|
-
//# sourceMappingURL=manager.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.cjs","names":["checks: NamedHealthCheck[]","createRedisHealthChecks","createSequelizeHealthCheck","createElasticsearchHealthCheck","createRabbitMQHealthCheck","defaultLogger","createBasicHealthCheck","withTimeout","status: HealthStatus"],"sources":["../../src/health-check/manager.ts"],"sourcesContent":["import type { LoggerInstanceManager } from '@autofleet/logger';\nimport { logger as defaultLogger } from '../logger';\nimport type {\n HealthCheck,\n HealthCheckResult,\n HealthStatus,\n LivenessConfig,\n NamedHealthCheck,\n ReadinessConfig,\n ResourceCheckConfig,\n} from './types';\nimport {\n createBasicHealthCheck,\n createElasticsearchHealthCheck,\n createRabbitMQHealthCheck,\n createRedisHealthChecks,\n createSequelizeHealthCheck,\n withTimeout,\n} from './checkers';\n\n/**\n * Executes a single health check and returns the result\n */\nasync function executeHealthCheck(\n name: string,\n check: HealthCheck,\n logger?: LoggerInstanceManager,\n): Promise<HealthCheckResult> {\n const startTime = Date.now();\n\n try {\n await check();\n const duration = Date.now() - startTime;\n\n return {\n name,\n status: 'pass',\n duration,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n logger?.warn(`Health check '${name}' failed`, { error: errorMessage, duration });\n\n return {\n name,\n status: 'fail',\n error: errorMessage,\n duration,\n };\n }\n}\n\n/**\n * Builds health checks from resource configuration\n */\nfunction buildHealthChecks(config: ResourceCheckConfig): NamedHealthCheck[] {\n const checks: NamedHealthCheck[] = [];\n\n // Add Redis checks for all instances\n if (config.redis && Object.keys(config.redis).length > 0) {\n checks.push(...createRedisHealthChecks(config.redis));\n }\n\n // Add Sequelize check\n if (config.sequelize) {\n checks.push(createSequelizeHealthCheck(config.sequelize));\n }\n\n // Add Elasticsearch check\n if (config.elasticsearch) {\n checks.push(createElasticsearchHealthCheck(config.elasticsearch));\n }\n\n // Add RabbitMQ check\n if (config.rabbitmq) {\n checks.push(createRabbitMQHealthCheck(config.rabbitmq));\n }\n\n // Add custom checks\n if (config.customChecks) {\n checks.push(...config.customChecks);\n }\n\n return checks;\n}\n\n/**\n * Health Check Manager\n * Manages liveness and readiness health checks\n */\nexport class HealthCheckManager {\n private logger: LoggerInstanceManager;\n private livenessChecks: NamedHealthCheck[] = [];\n private readinessChecks: NamedHealthCheck[] = [];\n private livenessTimeout: number;\n private readinessTimeout: number;\n\n constructor(\n livenessConfig?: LivenessConfig,\n readinessConfig?: ReadinessConfig,\n ) {\n this.logger = livenessConfig?.logger ?? readinessConfig?.logger ?? defaultLogger;\n this.livenessTimeout = livenessConfig?.timeout || 5000;\n this.readinessTimeout = readinessConfig?.timeout || 10000;\n\n // Build liveness checks\n if (livenessConfig) {\n this.livenessChecks = buildHealthChecks(livenessConfig);\n\n // If no liveness checks configured, add a basic check\n if (this.livenessChecks.length === 0) {\n this.livenessChecks.push(createBasicHealthCheck());\n }\n }\n\n // Build readiness checks\n if (readinessConfig) {\n this.readinessChecks = buildHealthChecks(readinessConfig);\n }\n }\n\n /**\n * Execute liveness probe\n * Liveness checks determine if the application is alive and not deadlocked\n * @returns Promise that resolves with health status\n */\n async checkLiveness(): Promise<HealthStatus> {\n const startTime = Date.now();\n\n this.logger.debug('Executing liveness checks', {\n count: this.livenessChecks.length,\n });\n\n const results = await Promise.all(\n this.livenessChecks.map(({ name, check }) =>\n executeHealthCheck(\n name,\n withTimeout(check, this.livenessTimeout),\n this.logger,\n ),\n ),\n );\n\n const duration = Date.now() - startTime;\n const allPassed = results.every(r => r.status === 'pass');\n\n const status: HealthStatus = {\n status: allPassed ? 'pass' : 'fail',\n timestamp: new Date().toISOString(),\n checks: results,\n duration,\n };\n\n if (!allPassed) {\n this.logger.warn('Liveness check failed', { status });\n }\n\n return status;\n }\n\n /**\n * Execute readiness probe\n * Readiness checks determine if the application is ready to serve traffic\n * @returns Promise that resolves with health status\n */\n async checkReadiness(): Promise<HealthStatus> {\n const startTime = Date.now();\n\n this.logger.debug('Executing readiness checks', {\n count: this.readinessChecks.length,\n });\n\n // If no readiness checks configured, consider ready by default\n if (this.readinessChecks.length === 0) {\n return {\n status: 'pass',\n timestamp: new Date().toISOString(),\n checks: [],\n duration: Date.now() - startTime,\n };\n }\n\n const results = await Promise.all(\n this.readinessChecks.map(({ name, check }) =>\n executeHealthCheck(\n name,\n withTimeout(check, this.readinessTimeout),\n this.logger,\n ),\n ),\n );\n\n const duration = Date.now() - startTime;\n const allPassed = results.every(r => r.status === 'pass');\n\n const status: HealthStatus = {\n status: allPassed ? 'pass' : 'fail',\n timestamp: new Date().toISOString(),\n checks: results,\n duration,\n };\n\n if (!allPassed) {\n this.logger.warn('Readiness check failed', { status });\n }\n\n return status;\n }\n\n /**\n * Add a custom liveness check\n * @param name Check name\n * @param check Check function\n */\n addLivenessCheck(name: string, check: HealthCheck): void {\n this.livenessChecks.push({ name, check });\n this.logger.debug(`Added liveness check: ${name}`);\n }\n\n /**\n * Add a custom readiness check\n * @param name Check name\n * @param check Check function\n */\n addReadinessCheck(name: string, check: HealthCheck): void {\n this.readinessChecks.push({ name, check });\n this.logger.debug(`Added readiness check: ${name}`);\n }\n\n /**\n * Remove a liveness check by name\n * @param name Check name\n */\n removeLivenessCheck(name: string): void {\n this.livenessChecks = this.livenessChecks.filter(c => c.name !== name);\n this.logger.debug(`Removed liveness check: ${name}`);\n }\n\n /**\n * Remove a readiness check by name\n * @param name Check name\n */\n removeReadinessCheck(name: string): void {\n this.readinessChecks = this.readinessChecks.filter(c => c.name !== name);\n this.logger.debug(`Removed readiness check: ${name}`);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { HealthCheck, HealthStatus, LivenessConfig, ReadinessConfig } from "./types.cjs";
|
|
2
|
-
|
|
3
|
-
//#region src/health-check/manager.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Health Check Manager
|
|
7
|
-
* Manages liveness and readiness health checks
|
|
8
|
-
*/
|
|
9
|
-
declare class HealthCheckManager {
|
|
10
|
-
private logger;
|
|
11
|
-
private livenessChecks;
|
|
12
|
-
private readinessChecks;
|
|
13
|
-
private livenessTimeout;
|
|
14
|
-
private readinessTimeout;
|
|
15
|
-
constructor(livenessConfig?: LivenessConfig, readinessConfig?: ReadinessConfig);
|
|
16
|
-
/**
|
|
17
|
-
* Execute liveness probe
|
|
18
|
-
* Liveness checks determine if the application is alive and not deadlocked
|
|
19
|
-
* @returns Promise that resolves with health status
|
|
20
|
-
*/
|
|
21
|
-
checkLiveness(): Promise<HealthStatus>;
|
|
22
|
-
/**
|
|
23
|
-
* Execute readiness probe
|
|
24
|
-
* Readiness checks determine if the application is ready to serve traffic
|
|
25
|
-
* @returns Promise that resolves with health status
|
|
26
|
-
*/
|
|
27
|
-
checkReadiness(): Promise<HealthStatus>;
|
|
28
|
-
/**
|
|
29
|
-
* Add a custom liveness check
|
|
30
|
-
* @param name Check name
|
|
31
|
-
* @param check Check function
|
|
32
|
-
*/
|
|
33
|
-
addLivenessCheck(name: string, check: HealthCheck): void;
|
|
34
|
-
/**
|
|
35
|
-
* Add a custom readiness check
|
|
36
|
-
* @param name Check name
|
|
37
|
-
* @param check Check function
|
|
38
|
-
*/
|
|
39
|
-
addReadinessCheck(name: string, check: HealthCheck): void;
|
|
40
|
-
/**
|
|
41
|
-
* Remove a liveness check by name
|
|
42
|
-
* @param name Check name
|
|
43
|
-
*/
|
|
44
|
-
removeLivenessCheck(name: string): void;
|
|
45
|
-
/**
|
|
46
|
-
* Remove a readiness check by name
|
|
47
|
-
* @param name Check name
|
|
48
|
-
*/
|
|
49
|
-
removeReadinessCheck(name: string): void;
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
export { HealthCheckManager };
|
|
53
|
-
//# sourceMappingURL=manager.d.cts.map
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { HealthCheck, HealthStatus, LivenessConfig, ReadinessConfig } from "./types.js";
|
|
2
|
-
|
|
3
|
-
//#region src/health-check/manager.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Health Check Manager
|
|
7
|
-
* Manages liveness and readiness health checks
|
|
8
|
-
*/
|
|
9
|
-
declare class HealthCheckManager {
|
|
10
|
-
private logger;
|
|
11
|
-
private livenessChecks;
|
|
12
|
-
private readinessChecks;
|
|
13
|
-
private livenessTimeout;
|
|
14
|
-
private readinessTimeout;
|
|
15
|
-
constructor(livenessConfig?: LivenessConfig, readinessConfig?: ReadinessConfig);
|
|
16
|
-
/**
|
|
17
|
-
* Execute liveness probe
|
|
18
|
-
* Liveness checks determine if the application is alive and not deadlocked
|
|
19
|
-
* @returns Promise that resolves with health status
|
|
20
|
-
*/
|
|
21
|
-
checkLiveness(): Promise<HealthStatus>;
|
|
22
|
-
/**
|
|
23
|
-
* Execute readiness probe
|
|
24
|
-
* Readiness checks determine if the application is ready to serve traffic
|
|
25
|
-
* @returns Promise that resolves with health status
|
|
26
|
-
*/
|
|
27
|
-
checkReadiness(): Promise<HealthStatus>;
|
|
28
|
-
/**
|
|
29
|
-
* Add a custom liveness check
|
|
30
|
-
* @param name Check name
|
|
31
|
-
* @param check Check function
|
|
32
|
-
*/
|
|
33
|
-
addLivenessCheck(name: string, check: HealthCheck): void;
|
|
34
|
-
/**
|
|
35
|
-
* Add a custom readiness check
|
|
36
|
-
* @param name Check name
|
|
37
|
-
* @param check Check function
|
|
38
|
-
*/
|
|
39
|
-
addReadinessCheck(name: string, check: HealthCheck): void;
|
|
40
|
-
/**
|
|
41
|
-
* Remove a liveness check by name
|
|
42
|
-
* @param name Check name
|
|
43
|
-
*/
|
|
44
|
-
removeLivenessCheck(name: string): void;
|
|
45
|
-
/**
|
|
46
|
-
* Remove a readiness check by name
|
|
47
|
-
* @param name Check name
|
|
48
|
-
*/
|
|
49
|
-
removeReadinessCheck(name: string): void;
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
export { HealthCheckManager };
|
|
53
|
-
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{logger as e}from"../logger.js";import{createBasicHealthCheck as t,createElasticsearchHealthCheck as n,createRabbitMQHealthCheck as r,createRedisHealthChecks as i,createSequelizeHealthCheck as a,withTimeout as o}from"./checkers.js";async function s(e,t,n){let r=Date.now();try{return await t(),{name:e,status:`pass`,duration:Date.now()-r}}catch(t){let i=Date.now()-r,a=t instanceof Error?t.message:String(t);return n?.warn(`Health check '${e}' failed`,{error:a,duration:i}),{name:e,status:`fail`,error:a,duration:i}}}function c(e){let t=[];return e.redis&&Object.keys(e.redis).length>0&&t.push(...i(e.redis)),e.sequelize&&t.push(a(e.sequelize)),e.elasticsearch&&t.push(n(e.elasticsearch)),e.rabbitmq&&t.push(r(e.rabbitmq)),e.customChecks&&t.push(...e.customChecks),t}var l=class{constructor(n,r){this.livenessChecks=[],this.readinessChecks=[],this.logger=n?.logger??r?.logger??e,this.livenessTimeout=n?.timeout||5e3,this.readinessTimeout=r?.timeout||1e4,n&&(this.livenessChecks=c(n),this.livenessChecks.length===0&&this.livenessChecks.push(t())),r&&(this.readinessChecks=c(r))}async checkLiveness(){let e=Date.now();this.logger.debug(`Executing liveness checks`,{count:this.livenessChecks.length});let t=await Promise.all(this.livenessChecks.map(({name:e,check:t})=>s(e,o(t,this.livenessTimeout),this.logger))),n=Date.now()-e,r=t.every(e=>e.status===`pass`),i={status:r?`pass`:`fail`,timestamp:new Date().toISOString(),checks:t,duration:n};return r||this.logger.warn(`Liveness check failed`,{status:i}),i}async checkReadiness(){let e=Date.now();if(this.logger.debug(`Executing readiness checks`,{count:this.readinessChecks.length}),this.readinessChecks.length===0)return{status:`pass`,timestamp:new Date().toISOString(),checks:[],duration:Date.now()-e};let t=await Promise.all(this.readinessChecks.map(({name:e,check:t})=>s(e,o(t,this.readinessTimeout),this.logger))),n=Date.now()-e,r=t.every(e=>e.status===`pass`),i={status:r?`pass`:`fail`,timestamp:new Date().toISOString(),checks:t,duration:n};return r||this.logger.warn(`Readiness check failed`,{status:i}),i}addLivenessCheck(e,t){this.livenessChecks.push({name:e,check:t}),this.logger.debug(`Added liveness check: ${e}`)}addReadinessCheck(e,t){this.readinessChecks.push({name:e,check:t}),this.logger.debug(`Added readiness check: ${e}`)}removeLivenessCheck(e){this.livenessChecks=this.livenessChecks.filter(t=>t.name!==e),this.logger.debug(`Removed liveness check: ${e}`)}removeReadinessCheck(e){this.readinessChecks=this.readinessChecks.filter(t=>t.name!==e),this.logger.debug(`Removed readiness check: ${e}`)}};export{l as HealthCheckManager};
|
|
2
|
-
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":["checks: NamedHealthCheck[]","defaultLogger","status: HealthStatus"],"sources":["../../src/health-check/manager.ts"],"sourcesContent":["import type { LoggerInstanceManager } from '@autofleet/logger';\nimport { logger as defaultLogger } from '../logger';\nimport type {\n HealthCheck,\n HealthCheckResult,\n HealthStatus,\n LivenessConfig,\n NamedHealthCheck,\n ReadinessConfig,\n ResourceCheckConfig,\n} from './types';\nimport {\n createBasicHealthCheck,\n createElasticsearchHealthCheck,\n createRabbitMQHealthCheck,\n createRedisHealthChecks,\n createSequelizeHealthCheck,\n withTimeout,\n} from './checkers';\n\n/**\n * Executes a single health check and returns the result\n */\nasync function executeHealthCheck(\n name: string,\n check: HealthCheck,\n logger?: LoggerInstanceManager,\n): Promise<HealthCheckResult> {\n const startTime = Date.now();\n\n try {\n await check();\n const duration = Date.now() - startTime;\n\n return {\n name,\n status: 'pass',\n duration,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n logger?.warn(`Health check '${name}' failed`, { error: errorMessage, duration });\n\n return {\n name,\n status: 'fail',\n error: errorMessage,\n duration,\n };\n }\n}\n\n/**\n * Builds health checks from resource configuration\n */\nfunction buildHealthChecks(config: ResourceCheckConfig): NamedHealthCheck[] {\n const checks: NamedHealthCheck[] = [];\n\n // Add Redis checks for all instances\n if (config.redis && Object.keys(config.redis).length > 0) {\n checks.push(...createRedisHealthChecks(config.redis));\n }\n\n // Add Sequelize check\n if (config.sequelize) {\n checks.push(createSequelizeHealthCheck(config.sequelize));\n }\n\n // Add Elasticsearch check\n if (config.elasticsearch) {\n checks.push(createElasticsearchHealthCheck(config.elasticsearch));\n }\n\n // Add RabbitMQ check\n if (config.rabbitmq) {\n checks.push(createRabbitMQHealthCheck(config.rabbitmq));\n }\n\n // Add custom checks\n if (config.customChecks) {\n checks.push(...config.customChecks);\n }\n\n return checks;\n}\n\n/**\n * Health Check Manager\n * Manages liveness and readiness health checks\n */\nexport class HealthCheckManager {\n private logger: LoggerInstanceManager;\n private livenessChecks: NamedHealthCheck[] = [];\n private readinessChecks: NamedHealthCheck[] = [];\n private livenessTimeout: number;\n private readinessTimeout: number;\n\n constructor(\n livenessConfig?: LivenessConfig,\n readinessConfig?: ReadinessConfig,\n ) {\n this.logger = livenessConfig?.logger ?? readinessConfig?.logger ?? defaultLogger;\n this.livenessTimeout = livenessConfig?.timeout || 5000;\n this.readinessTimeout = readinessConfig?.timeout || 10000;\n\n // Build liveness checks\n if (livenessConfig) {\n this.livenessChecks = buildHealthChecks(livenessConfig);\n\n // If no liveness checks configured, add a basic check\n if (this.livenessChecks.length === 0) {\n this.livenessChecks.push(createBasicHealthCheck());\n }\n }\n\n // Build readiness checks\n if (readinessConfig) {\n this.readinessChecks = buildHealthChecks(readinessConfig);\n }\n }\n\n /**\n * Execute liveness probe\n * Liveness checks determine if the application is alive and not deadlocked\n * @returns Promise that resolves with health status\n */\n async checkLiveness(): Promise<HealthStatus> {\n const startTime = Date.now();\n\n this.logger.debug('Executing liveness checks', {\n count: this.livenessChecks.length,\n });\n\n const results = await Promise.all(\n this.livenessChecks.map(({ name, check }) =>\n executeHealthCheck(\n name,\n withTimeout(check, this.livenessTimeout),\n this.logger,\n ),\n ),\n );\n\n const duration = Date.now() - startTime;\n const allPassed = results.every(r => r.status === 'pass');\n\n const status: HealthStatus = {\n status: allPassed ? 'pass' : 'fail',\n timestamp: new Date().toISOString(),\n checks: results,\n duration,\n };\n\n if (!allPassed) {\n this.logger.warn('Liveness check failed', { status });\n }\n\n return status;\n }\n\n /**\n * Execute readiness probe\n * Readiness checks determine if the application is ready to serve traffic\n * @returns Promise that resolves with health status\n */\n async checkReadiness(): Promise<HealthStatus> {\n const startTime = Date.now();\n\n this.logger.debug('Executing readiness checks', {\n count: this.readinessChecks.length,\n });\n\n // If no readiness checks configured, consider ready by default\n if (this.readinessChecks.length === 0) {\n return {\n status: 'pass',\n timestamp: new Date().toISOString(),\n checks: [],\n duration: Date.now() - startTime,\n };\n }\n\n const results = await Promise.all(\n this.readinessChecks.map(({ name, check }) =>\n executeHealthCheck(\n name,\n withTimeout(check, this.readinessTimeout),\n this.logger,\n ),\n ),\n );\n\n const duration = Date.now() - startTime;\n const allPassed = results.every(r => r.status === 'pass');\n\n const status: HealthStatus = {\n status: allPassed ? 'pass' : 'fail',\n timestamp: new Date().toISOString(),\n checks: results,\n duration,\n };\n\n if (!allPassed) {\n this.logger.warn('Readiness check failed', { status });\n }\n\n return status;\n }\n\n /**\n * Add a custom liveness check\n * @param name Check name\n * @param check Check function\n */\n addLivenessCheck(name: string, check: HealthCheck): void {\n this.livenessChecks.push({ name, check });\n this.logger.debug(`Added liveness check: ${name}`);\n }\n\n /**\n * Add a custom readiness check\n * @param name Check name\n * @param check Check function\n */\n addReadinessCheck(name: string, check: HealthCheck): void {\n this.readinessChecks.push({ name, check });\n this.logger.debug(`Added readiness check: ${name}`);\n }\n\n /**\n * Remove a liveness check by name\n * @param name Check name\n */\n removeLivenessCheck(name: string): void {\n this.livenessChecks = this.livenessChecks.filter(c => c.name !== name);\n this.logger.debug(`Removed liveness check: ${name}`);\n }\n\n /**\n * Remove a readiness check by name\n * @param name Check name\n */\n removeReadinessCheck(name: string): void {\n this.readinessChecks = this.readinessChecks.filter(c => c.name !== name);\n this.logger.debug(`Removed readiness check: ${name}`);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
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;
|
|
2
|
-
//# sourceMappingURL=setup.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|