@zola_do/health 0.2.5
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/README.md +61 -0
- package/dist/health.module.d.ts +6 -0
- package/dist/health.module.js +65 -0
- package/dist/health.module.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/zola-health-fallback.controller.d.ts +10 -0
- package/dist/zola-health-fallback.controller.js +38 -0
- package/dist/zola-health-fallback.controller.js.map +1 -0
- package/dist/zola-health-options.d.ts +23 -0
- package/dist/zola-health-options.js +15 -0
- package/dist/zola-health-options.js.map +1 -0
- package/dist/zola-health-public.decorator.d.ts +2 -0
- package/dist/zola-health-public.decorator.js +8 -0
- package/dist/zola-health-public.decorator.js.map +1 -0
- package/dist/zola-health.constants.d.ts +1 -0
- package/dist/zola-health.constants.js +5 -0
- package/dist/zola-health.constants.js.map +1 -0
- package/dist/zola-terminus-health.controller.d.ts +12 -0
- package/dist/zola-terminus-health.controller.js +141 -0
- package/dist/zola-terminus-health.controller.js.map +1 -0
- package/package.json +88 -0
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# @zola_do/health
|
|
2
|
+
|
|
3
|
+
NestJS readiness/liveness helpers built on [`@nestjs/terminus`](https://docs.nestjs.com/recipes/terminus), aligned with `@zola_do` env conventions (TypeORM, RabbitMQ audit, MinIO, Seaweed/S3).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @zola_do/health @nestjs/terminus
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Optional peers (enable related checks only when installed and configured):
|
|
12
|
+
|
|
13
|
+
- `@nestjs/typeorm`, `typeorm` — database ping
|
|
14
|
+
- `@nestjs/microservices`, `amqplib` — RabbitMQ ping when `RMQ_URL` is set
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { ZolaHealthModule } from '@zola_do/health';
|
|
20
|
+
|
|
21
|
+
@Module({
|
|
22
|
+
imports: [
|
|
23
|
+
TypeOrmModule.forRoot(/* ... */),
|
|
24
|
+
ZolaHealthModule.forRoot({
|
|
25
|
+
path: 'health',
|
|
26
|
+
typeorm: true,
|
|
27
|
+
rabbitmq: true,
|
|
28
|
+
minio: true,
|
|
29
|
+
seaweed: true,
|
|
30
|
+
http: [{ name: 'docs', url: 'https://example.com/status' }],
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
})
|
|
34
|
+
export class AppModule {}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- **`path`**: controller route (default `health` → `GET /health`).
|
|
38
|
+
- **`typeorm`**: `true` (key `database`), a custom string key, or `false` to skip.
|
|
39
|
+
- **`rabbitmq`**: uses `RMQ_URL` and Terminus microservice ping (requires optional peers above).
|
|
40
|
+
- **`minio`**: GET `http(s)://MINIO_ENDPOINT:MINIO_PORT/minio/health/live` from `MINIO_*` env vars.
|
|
41
|
+
- **`seaweed`**: GET `AWS_ENDPOINT` (prefixes `https://` if missing); treats HTTP ≥ 500 as down.
|
|
42
|
+
- **`http`**: extra `{ name, url }` GET checks via `fetch`.
|
|
43
|
+
|
|
44
|
+
If `@nestjs/terminus` is **not** installed, the module registers a minimal `GET /health` JSON body (`mode: 'minimal'`) so imports stay safe.
|
|
45
|
+
|
|
46
|
+
### Global JWT guard
|
|
47
|
+
|
|
48
|
+
Use `@ZolaHealthPublic()` on custom health routes, or rely on the built-in controller: it sets the same `allowAnonymous` metadata key as `@AllowAnonymous()` from `@zola_do/authorization`.
|
|
49
|
+
|
|
50
|
+
## Environment variables
|
|
51
|
+
|
|
52
|
+
| Check | Variables |
|
|
53
|
+
|----------|-----------|
|
|
54
|
+
| TypeORM | Same as your app / `@zola_do/typeorm` (`DATABASE_*`) |
|
|
55
|
+
| RabbitMQ | `RMQ_URL` |
|
|
56
|
+
| MinIO | `MINIO_ENDPOINT`, `MINIO_PORT`, `MINIO_USESSL` |
|
|
57
|
+
| Seaweed | `AWS_ENDPOINT` |
|
|
58
|
+
|
|
59
|
+
## License
|
|
60
|
+
|
|
61
|
+
ISC
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { ZolaHealthModuleOptions } from './zola-health-options';
|
|
3
|
+
export declare class ZolaHealthModule {
|
|
4
|
+
static forRoot(options?: ZolaHealthModuleOptions): DynamicModule;
|
|
5
|
+
}
|
|
6
|
+
export { ZolaHealthModule as HealthModule };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var ZolaHealthModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.HealthModule = exports.ZolaHealthModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const zola_health_fallback_controller_1 = require("./zola-health-fallback.controller");
|
|
13
|
+
const zola_health_constants_1 = require("./zola-health.constants");
|
|
14
|
+
const zola_health_options_1 = require("./zola-health-options");
|
|
15
|
+
function isTerminusAvailable() {
|
|
16
|
+
try {
|
|
17
|
+
require.resolve('@nestjs/terminus');
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch (_a) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
let ZolaHealthModule = ZolaHealthModule_1 = class ZolaHealthModule {
|
|
25
|
+
static forRoot(options = {}) {
|
|
26
|
+
const merged = (0, zola_health_options_1.normalizeZolaHealthOptions)(options);
|
|
27
|
+
const path = merged.path;
|
|
28
|
+
if (!isTerminusAvailable()) {
|
|
29
|
+
return {
|
|
30
|
+
module: ZolaHealthModule_1,
|
|
31
|
+
controllers: [(0, zola_health_fallback_controller_1.createZolaHealthFallbackController)(path)],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const { TerminusModule } = require('@nestjs/terminus');
|
|
35
|
+
const { createZolaTerminusHealthController } = require('./zola-terminus-health.controller');
|
|
36
|
+
const ControllerClass = createZolaTerminusHealthController(path);
|
|
37
|
+
if (merged.rabbitmq &&
|
|
38
|
+
process.env.NODE_ENV !== 'production') {
|
|
39
|
+
let rmqOk = false;
|
|
40
|
+
try {
|
|
41
|
+
require.resolve('@nestjs/microservices');
|
|
42
|
+
require.resolve('amqplib');
|
|
43
|
+
rmqOk = Boolean(process.env.RMQ_URL);
|
|
44
|
+
}
|
|
45
|
+
catch (_a) {
|
|
46
|
+
rmqOk = false;
|
|
47
|
+
}
|
|
48
|
+
if (!rmqOk) {
|
|
49
|
+
console.warn('ZolaHealthModule: rabbitmq check enabled but RMQ_URL and/or @nestjs/microservices+amqplib are missing; RabbitMQ ping will be skipped.');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
module: ZolaHealthModule_1,
|
|
54
|
+
imports: [TerminusModule],
|
|
55
|
+
controllers: [ControllerClass],
|
|
56
|
+
providers: [{ provide: zola_health_constants_1.ZOLA_HEALTH_OPTIONS, useValue: merged }],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.ZolaHealthModule = ZolaHealthModule;
|
|
61
|
+
exports.HealthModule = ZolaHealthModule;
|
|
62
|
+
exports.HealthModule = exports.ZolaHealthModule = ZolaHealthModule = ZolaHealthModule_1 = __decorate([
|
|
63
|
+
(0, common_1.Module)({})
|
|
64
|
+
], ZolaHealthModule);
|
|
65
|
+
//# sourceMappingURL=health.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.module.js","sourceRoot":"","sources":["../src/health.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,uFAAuF;AACvF,mEAA8D;AAC9D,+DAG+B;AAE/B,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAGM,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAC3B,MAAM,CAAC,OAAO,CAAC,UAAmC,EAAE;QAClD,MAAM,MAAM,GAAG,IAAA,gDAA0B,EAAC,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAEzB,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC3B,OAAO;gBACL,MAAM,EAAE,kBAAgB;gBACxB,WAAW,EAAE,CAAC,IAAA,oEAAkC,EAAC,IAAI,CAAC,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,EAAE,kCAAkC,EAAE,GAAG,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC5F,MAAM,eAAe,GAAG,kCAAkC,CAAC,IAAI,CAAC,CAAC;QAEjE,IACE,MAAM,CAAC,QAAQ;YACf,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EACrC,CAAC;YACD,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gBACzC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC3B,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,WAAM,CAAC;gBACP,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CACV,uIAAuI,CACxI,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,kBAAgB;YACxB,OAAO,EAAE,CAAC,cAAc,CAAC;YACzB,WAAW,EAAE,CAAC,eAAe,CAAC;YAC9B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,2CAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;SAChE,CAAC;IACJ,CAAC;CACF,CAAA;AA1CY,4CAAgB;AA6CA,wCAAY;kDA7C5B,gBAAgB;IAD5B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CA0C5B"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./health.module"), exports);
|
|
18
|
+
__exportStar(require("./zola-health.constants"), exports);
|
|
19
|
+
__exportStar(require("./zola-health-options"), exports);
|
|
20
|
+
__exportStar(require("./zola-health-public.decorator"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,0DAAwC;AACxC,wDAAsC;AACtC,iEAA+C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createZolaHealthFallbackController = createZolaHealthFallbackController;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const zola_health_public_decorator_1 = require("./zola-health-public.decorator");
|
|
15
|
+
function createZolaHealthFallbackController(routePath) {
|
|
16
|
+
let ZolaHealthFallbackController = class ZolaHealthFallbackController {
|
|
17
|
+
health() {
|
|
18
|
+
return {
|
|
19
|
+
status: 'ok',
|
|
20
|
+
mode: 'minimal',
|
|
21
|
+
hint: 'Install @nestjs/terminus for database and integration health checks.',
|
|
22
|
+
timestamp: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, common_1.Get)(),
|
|
28
|
+
(0, zola_health_public_decorator_1.ZolaHealthPublic)(),
|
|
29
|
+
__metadata("design:type", Function),
|
|
30
|
+
__metadata("design:paramtypes", []),
|
|
31
|
+
__metadata("design:returntype", void 0)
|
|
32
|
+
], ZolaHealthFallbackController.prototype, "health", null);
|
|
33
|
+
ZolaHealthFallbackController = __decorate([
|
|
34
|
+
(0, common_1.Controller)(routePath)
|
|
35
|
+
], ZolaHealthFallbackController);
|
|
36
|
+
return ZolaHealthFallbackController;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=zola-health-fallback.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zola-health-fallback.controller.js","sourceRoot":"","sources":["../src/zola-health-fallback.controller.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,gFAeC;AAlBD,2CAAiD;AACjD,iFAAkE;AAElE,SAAgB,kCAAkC,CAAC,SAAiB;IAElE,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;QAGhC,MAAM;YACJ,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,sEAAsE;gBAC5E,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC;KACF,CAAA;IARC;QAFC,IAAA,YAAG,GAAE;QACL,IAAA,+CAAgB,GAAE;;;;8DAQlB;IAVG,4BAA4B;QADjC,IAAA,mBAAU,EAAC,SAAS,CAAC;OAChB,4BAA4B,CAWjC;IACD,OAAO,4BAA4B,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ZolaHealthModuleOptions {
|
|
2
|
+
path?: string;
|
|
3
|
+
typeorm?: boolean | string;
|
|
4
|
+
rabbitmq?: boolean;
|
|
5
|
+
minio?: boolean;
|
|
6
|
+
seaweed?: boolean;
|
|
7
|
+
http?: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
url: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export interface NormalizedZolaHealthModuleOptions {
|
|
13
|
+
path: string;
|
|
14
|
+
typeorm: boolean | string;
|
|
15
|
+
rabbitmq: boolean;
|
|
16
|
+
minio: boolean;
|
|
17
|
+
seaweed: boolean;
|
|
18
|
+
http: Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
url: string;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export declare function normalizeZolaHealthOptions(options?: ZolaHealthModuleOptions): NormalizedZolaHealthModuleOptions;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeZolaHealthOptions = normalizeZolaHealthOptions;
|
|
4
|
+
function normalizeZolaHealthOptions(options = {}) {
|
|
5
|
+
var _a, _b;
|
|
6
|
+
return {
|
|
7
|
+
path: (_a = options.path) !== null && _a !== void 0 ? _a : 'health',
|
|
8
|
+
typeorm: options.typeorm !== undefined ? options.typeorm : true,
|
|
9
|
+
rabbitmq: options.rabbitmq === true,
|
|
10
|
+
minio: options.minio === true,
|
|
11
|
+
seaweed: options.seaweed === true,
|
|
12
|
+
http: (_b = options.http) !== null && _b !== void 0 ? _b : [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=zola-health-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zola-health-options.js","sourceRoot":"","sources":["../src/zola-health-options.ts"],"names":[],"mappings":";;AA4BA,gEAWC;AAXD,SAAgB,0BAA0B,CACxC,UAAmC,EAAE;;IAErC,OAAO;QACL,IAAI,EAAE,MAAA,OAAO,CAAC,IAAI,mCAAI,QAAQ;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC/D,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,IAAI;QACnC,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;QACjC,IAAI,EAAE,MAAA,OAAO,CAAC,IAAI,mCAAI,EAAE;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZolaHealthPublic = exports.ZOLA_HEALTH_ALLOW_ANONYMOUS_KEY = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.ZOLA_HEALTH_ALLOW_ANONYMOUS_KEY = 'allowAnonymous';
|
|
6
|
+
const ZolaHealthPublic = () => (0, common_1.SetMetadata)(exports.ZOLA_HEALTH_ALLOW_ANONYMOUS_KEY, true);
|
|
7
|
+
exports.ZolaHealthPublic = ZolaHealthPublic;
|
|
8
|
+
//# sourceMappingURL=zola-health-public.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zola-health-public.decorator.js","sourceRoot":"","sources":["../src/zola-health-public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAGhC,QAAA,+BAA+B,GAAG,gBAAgB,CAAC;AAEzD,MAAM,gBAAgB,GAAG,GAAG,EAAE,CACnC,IAAA,oBAAW,EAAC,uCAA+B,EAAE,IAAI,CAAC,CAAC;AADxC,QAAA,gBAAgB,oBACwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ZOLA_HEALTH_OPTIONS: unique symbol;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zola-health.constants.js","sourceRoot":"","sources":["../src/zola-health.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HealthCheckService, MemoryHealthIndicator, MicroserviceHealthIndicator, TypeOrmHealthIndicator } from '@nestjs/terminus';
|
|
2
|
+
import type { NormalizedZolaHealthModuleOptions } from './zola-health-options';
|
|
3
|
+
export declare function createZolaTerminusHealthController(routePath: string): {
|
|
4
|
+
new (health: HealthCheckService, memory: MemoryHealthIndicator, opts: NormalizedZolaHealthModuleOptions, typeOrm?: TypeOrmHealthIndicator, microservice?: MicroserviceHealthIndicator): {
|
|
5
|
+
readonly health: HealthCheckService;
|
|
6
|
+
readonly memory: MemoryHealthIndicator;
|
|
7
|
+
readonly opts: NormalizedZolaHealthModuleOptions;
|
|
8
|
+
readonly typeOrm?: TypeOrmHealthIndicator;
|
|
9
|
+
readonly microservice?: MicroserviceHealthIndicator;
|
|
10
|
+
check(): Promise<import("@nestjs/terminus").HealthCheckResult<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>>, Partial<import("@nestjs/terminus").HealthIndicatorResult<string, import("@nestjs/terminus").HealthIndicatorStatus, Record<string, any>>>>>;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createZolaTerminusHealthController = createZolaTerminusHealthController;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const terminus_1 = require("@nestjs/terminus");
|
|
18
|
+
const microservices_1 = require("@nestjs/microservices");
|
|
19
|
+
const zola_health_constants_1 = require("./zola-health.constants");
|
|
20
|
+
const zola_health_public_decorator_1 = require("./zola-health-public.decorator");
|
|
21
|
+
function buildMinioHealthUrl() {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const host = process.env.MINIO_ENDPOINT;
|
|
24
|
+
if (!host) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const port = (_a = process.env.MINIO_PORT) !== null && _a !== void 0 ? _a : '9000';
|
|
28
|
+
const ssl = String((_b = process.env.MINIO_USESSL) !== null && _b !== void 0 ? _b : '').toLowerCase() === 'true';
|
|
29
|
+
const proto = ssl ? 'https' : 'http';
|
|
30
|
+
return `${proto}://${host}:${port}/minio/health/live`;
|
|
31
|
+
}
|
|
32
|
+
function buildSeaweedHealthUrl() {
|
|
33
|
+
let base = process.env.AWS_ENDPOINT;
|
|
34
|
+
if (!base) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (!/^https?:\/\//i.test(base)) {
|
|
38
|
+
base = `https://${base}`;
|
|
39
|
+
}
|
|
40
|
+
return base.replace(/\/$/, '') + '/';
|
|
41
|
+
}
|
|
42
|
+
async function zolaHttpPing(key, url, timeoutMs = 3000) {
|
|
43
|
+
const ac = new AbortController();
|
|
44
|
+
const timer = setTimeout(() => ac.abort(), timeoutMs);
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch(url, {
|
|
47
|
+
signal: ac.signal,
|
|
48
|
+
method: 'GET',
|
|
49
|
+
redirect: 'follow',
|
|
50
|
+
});
|
|
51
|
+
if (res.status >= 500) {
|
|
52
|
+
throw new terminus_1.HealthCheckError(`${key} responded with ${res.status}`, { [key]: { status: 'down', message: `HTTP ${res.status}` } });
|
|
53
|
+
}
|
|
54
|
+
return { [key]: { status: 'up' } };
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
58
|
+
throw new terminus_1.HealthCheckError(`${key} is not available`, {
|
|
59
|
+
[key]: { status: 'down', message },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function isRabbitMqPingAvailable() {
|
|
67
|
+
try {
|
|
68
|
+
require.resolve('@nestjs/microservices');
|
|
69
|
+
require.resolve('amqplib');
|
|
70
|
+
return Boolean(process.env.RMQ_URL);
|
|
71
|
+
}
|
|
72
|
+
catch (_a) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function createZolaTerminusHealthController(routePath) {
|
|
77
|
+
let ZolaTerminusHealthController = class ZolaTerminusHealthController {
|
|
78
|
+
constructor(health, memory, opts, typeOrm, microservice) {
|
|
79
|
+
this.health = health;
|
|
80
|
+
this.memory = memory;
|
|
81
|
+
this.opts = opts;
|
|
82
|
+
this.typeOrm = typeOrm;
|
|
83
|
+
this.microservice = microservice;
|
|
84
|
+
}
|
|
85
|
+
check() {
|
|
86
|
+
const checks = [];
|
|
87
|
+
const typeormOpt = this.opts.typeorm;
|
|
88
|
+
if (typeormOpt !== false && this.typeOrm) {
|
|
89
|
+
const key = typeof typeormOpt === 'string' ? typeormOpt : 'database';
|
|
90
|
+
checks.push(() => this.typeOrm.pingCheck(key, { timeout: 2000 }));
|
|
91
|
+
}
|
|
92
|
+
if (this.opts.rabbitmq && this.microservice && isRabbitMqPingAvailable()) {
|
|
93
|
+
checks.push(() => this.microservice.pingCheck('rabbitmq', {
|
|
94
|
+
transport: microservices_1.Transport.RMQ,
|
|
95
|
+
timeout: 3000,
|
|
96
|
+
options: {
|
|
97
|
+
urls: [process.env.RMQ_URL],
|
|
98
|
+
},
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
if (this.opts.minio) {
|
|
102
|
+
const minioUrl = buildMinioHealthUrl();
|
|
103
|
+
if (minioUrl) {
|
|
104
|
+
checks.push(() => zolaHttpPing('minio', minioUrl));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (this.opts.seaweed) {
|
|
108
|
+
const seaweedUrl = buildSeaweedHealthUrl();
|
|
109
|
+
if (seaweedUrl) {
|
|
110
|
+
checks.push(() => zolaHttpPing('seaweed', seaweedUrl));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const h of this.opts.http) {
|
|
114
|
+
checks.push(() => zolaHttpPing(h.name, h.url));
|
|
115
|
+
}
|
|
116
|
+
if (checks.length === 0) {
|
|
117
|
+
checks.push(() => this.memory.checkHeap('memory', 64 * 1024 * 1024 * 1024));
|
|
118
|
+
}
|
|
119
|
+
return this.health.check(checks);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
__decorate([
|
|
123
|
+
(0, common_1.Get)(),
|
|
124
|
+
(0, terminus_1.HealthCheck)(),
|
|
125
|
+
(0, zola_health_public_decorator_1.ZolaHealthPublic)(),
|
|
126
|
+
__metadata("design:type", Function),
|
|
127
|
+
__metadata("design:paramtypes", []),
|
|
128
|
+
__metadata("design:returntype", void 0)
|
|
129
|
+
], ZolaTerminusHealthController.prototype, "check", null);
|
|
130
|
+
ZolaTerminusHealthController = __decorate([
|
|
131
|
+
(0, common_1.Controller)(routePath),
|
|
132
|
+
__param(2, (0, common_1.Inject)(zola_health_constants_1.ZOLA_HEALTH_OPTIONS)),
|
|
133
|
+
__param(3, (0, common_1.Optional)()),
|
|
134
|
+
__param(4, (0, common_1.Optional)()),
|
|
135
|
+
__metadata("design:paramtypes", [terminus_1.HealthCheckService,
|
|
136
|
+
terminus_1.MemoryHealthIndicator, Object, terminus_1.TypeOrmHealthIndicator,
|
|
137
|
+
terminus_1.MicroserviceHealthIndicator])
|
|
138
|
+
], ZolaTerminusHealthController);
|
|
139
|
+
return ZolaTerminusHealthController;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=zola-terminus-health.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zola-terminus-health.controller.js","sourceRoot":"","sources":["../src/zola-terminus-health.controller.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zola_do/health",
|
|
3
|
+
"version": "0.2.5",
|
|
4
|
+
"description": "NestJS health checks (Terminus) aligned with @zola_do TypeORM, RabbitMQ, and storage env patterns",
|
|
5
|
+
"author": "zolaDO",
|
|
6
|
+
"license": "ISC",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=20.0.0"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"require": "./dist/index.js",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"README.md"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"clean": "rimraf dist",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"build": "npm run clean && tsc",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@nestjs/common": "^10.0.0 || ^11.0.0",
|
|
35
|
+
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
36
|
+
"@nestjs/microservices": "^10.0.0 || ^11.0.0",
|
|
37
|
+
"@nestjs/terminus": "^10.0.0 || ^11.0.0",
|
|
38
|
+
"@nestjs/typeorm": "^10.0.0 || ^11.0.0",
|
|
39
|
+
"amqplib": "^0.10.0",
|
|
40
|
+
"reflect-metadata": "^0.1.0 || ^0.2.0",
|
|
41
|
+
"rxjs": "^7.0.0 || ^8.0.0",
|
|
42
|
+
"typeorm": "^0.3.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependenciesMeta": {
|
|
45
|
+
"@nestjs/terminus": {
|
|
46
|
+
"optional": true
|
|
47
|
+
},
|
|
48
|
+
"@nestjs/microservices": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"@nestjs/typeorm": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"amqplib": {
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
"typeorm": {
|
|
58
|
+
"optional": true
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"rimraf": "^6.1.3",
|
|
63
|
+
"typescript": "^5.9.3"
|
|
64
|
+
},
|
|
65
|
+
"repository": {
|
|
66
|
+
"directory": "packages/health",
|
|
67
|
+
"type": "git",
|
|
68
|
+
"url": "https://github.com/zola0031/zola-nestjs-shared.git"
|
|
69
|
+
},
|
|
70
|
+
"homepage": "https://github.com/zola0031/zola-nestjs-shared#readme",
|
|
71
|
+
"bugs": {
|
|
72
|
+
"url": "https://github.com/zola0031/zola-nestjs-shared/issues"
|
|
73
|
+
},
|
|
74
|
+
"funding": {
|
|
75
|
+
"type": "github",
|
|
76
|
+
"url": "https://github.com/sponsors/zola0031"
|
|
77
|
+
},
|
|
78
|
+
"keywords": [
|
|
79
|
+
"nestjs",
|
|
80
|
+
"typescript",
|
|
81
|
+
"health",
|
|
82
|
+
"terminus",
|
|
83
|
+
"readiness",
|
|
84
|
+
"liveness",
|
|
85
|
+
"zola_do",
|
|
86
|
+
"nestjs-shared"
|
|
87
|
+
]
|
|
88
|
+
}
|