@tsed/terminus 8.11.0 → 8.11.2-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -121,4 +121,3 @@ TerminusModule = __decorate([
121
121
  Module()
122
122
  ], TerminusModule);
123
123
  export { TerminusModule };
124
- //# sourceMappingURL=TerminusModule.js.map
@@ -25,4 +25,3 @@ export function Health(name) {
25
25
  });
26
26
  };
27
27
  }
28
- //# sourceMappingURL=health.js.map
package/lib/esm/index.js CHANGED
@@ -5,4 +5,3 @@ export * from "./decorators/health.js";
5
5
  export * from "./interfaces/interfaces.js";
6
6
  export * from "./interfaces/TerminusSettings.js";
7
7
  export * from "./TerminusModule.js";
8
- //# sourceMappingURL=index.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=TerminusSettings.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=interfaces.js.map
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tsed/terminus",
3
3
  "description": "Adds graceful shutdown and Kubernetes readiness / liveness checks for any HTTP applications.",
4
4
  "type": "module",
5
- "version": "8.11.0",
5
+ "version": "8.11.2-rc.1",
6
6
  "author": "Romain Lenzotti",
7
7
  "source": "./src/index.ts",
8
8
  "main": "./lib/esm/index.js",
@@ -29,12 +29,12 @@
29
29
  },
30
30
  "devDependencies": {
31
31
  "@godaddy/terminus": "^4.12.1",
32
- "@tsed/barrels": "8.11.0",
33
- "@tsed/core": "8.11.0",
34
- "@tsed/di": "8.11.0",
35
- "@tsed/platform-http": "8.11.0",
36
- "@tsed/schema": "8.11.0",
37
- "@tsed/typescript": "8.11.0",
32
+ "@tsed/barrels": "8.11.2-rc.1",
33
+ "@tsed/core": "8.11.2-rc.1",
34
+ "@tsed/di": "8.11.2-rc.1",
35
+ "@tsed/platform-http": "8.11.2-rc.1",
36
+ "@tsed/schema": "8.11.2-rc.1",
37
+ "@tsed/typescript": "8.11.2-rc.1",
38
38
  "eslint": "9.12.0",
39
39
  "typescript": "5.4.5",
40
40
  "vitest": "3.1.4"
@@ -65,5 +65,8 @@
65
65
  "url": "https://github.com/tsedio/tsed/issues"
66
66
  },
67
67
  "homepage": "https://github.com/tsedio/tsed/tree/production/packages/third-parties/terminus",
68
- "license": "MIT"
68
+ "license": "MIT",
69
+ "publishConfig": {
70
+ "tag": "rc"
71
+ }
69
72
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"TerminusModule.js","sourceRoot":"","sources":["../../src/TerminusModule.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/decorators/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,CAAW,MAAc,EAAE,WAAmB,EAAE,EAAE;QACvD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC1C,CAAC,WAAW,CAAC,EAAE,EAAC,IAAI,EAAC;SACtB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TerminusSettings.js","sourceRoot":"","sources":["../../../src/interfaces/TerminusSettings.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/interfaces/interfaces.ts"],"names":[],"mappings":""}
@@ -1,91 +0,0 @@
1
- import {Injectable} from "@tsed/di";
2
- import {PlatformTest} from "@tsed/platform-http/testing";
3
-
4
- import {Health} from "./decorators/health.js";
5
- import {TerminusModule} from "./TerminusModule.js";
6
-
7
- @Injectable()
8
- class MyService {
9
- @Health("mongo")
10
- mongo() {
11
- return Promise.resolve("OK");
12
- }
13
-
14
- @Health("/redis/health")
15
- redis() {
16
- return Promise.resolve("OK");
17
- }
18
-
19
- $beforeShutdown() {}
20
- }
21
-
22
- describe("TerminusModule", () => {
23
- beforeEach(() =>
24
- PlatformTest.create({
25
- terminus: {
26
- path: "/health"
27
- }
28
- })
29
- );
30
- afterEach(() => PlatformTest.reset());
31
-
32
- it("should load health providers", async () => {
33
- const terminusModule = PlatformTest.get<TerminusModule>(TerminusModule);
34
-
35
- const {logger, ...props} = terminusModule.getConfiguration();
36
-
37
- expect(props).toEqual({
38
- beforeShutdown: expect.any(Function),
39
- healthChecks: {
40
- "/mongo/health": expect.any(Function),
41
- "/redis/health": expect.any(Function),
42
- "/health": expect.any(Function)
43
- },
44
- onSendFailureDuringShutdown: expect.any(Function),
45
- onShutdown: expect.any(Function),
46
- onSignal: expect.any(Function)
47
- });
48
-
49
- const result = await props.healthChecks["/health"]({});
50
-
51
- expect(result).toEqual([
52
- {mongo: "OK"},
53
- {"/redis/health": "OK"} // legacy
54
- ]);
55
-
56
- logger("event", {message: "message"});
57
-
58
- expect(await terminusModule.$logRoutes([])).toEqual([
59
- {
60
- method: "GET",
61
- name: "TerminusModule.dispatch()",
62
- url: "/health"
63
- },
64
- {
65
- method: "GET",
66
- name: "MyService.mongo()",
67
- url: "/mongo/health"
68
- },
69
- {
70
- method: "GET",
71
- name: "MyService.redis()",
72
- url: "/redis/health"
73
- }
74
- ]);
75
-
76
- await props.onSignal();
77
- });
78
-
79
- it("should emit event", async () => {
80
- const terminusModule = PlatformTest.get<TerminusModule>(TerminusModule);
81
- const service = PlatformTest.get<MyService>(MyService);
82
-
83
- vi.spyOn(service, "$beforeShutdown");
84
-
85
- const {beforeShutdown} = terminusModule.getConfiguration();
86
-
87
- await beforeShutdown();
88
-
89
- expect(service.$beforeShutdown).toHaveBeenCalledWith();
90
- });
91
- });
@@ -1,147 +0,0 @@
1
- import Http from "node:http";
2
- import Https from "node:https";
3
-
4
- import {createTerminus} from "@godaddy/terminus";
5
- import {Constant, Inject, InjectorService, Module, OnInit, Provider} from "@tsed/di";
6
- import type {PlatformRouteDetails} from "@tsed/platform-http";
7
- import {concatPath} from "@tsed/schema";
8
-
9
- import {TerminusSettings} from "./interfaces/TerminusSettings.js";
10
-
11
- @Module()
12
- export class TerminusModule implements OnInit {
13
- @Constant("terminus", {})
14
- private settings: TerminusSettings;
15
-
16
- @Constant("terminus.path", "/health")
17
- private basePath: string;
18
-
19
- @Inject()
20
- private injector: InjectorService;
21
-
22
- @Inject(Http.Server)
23
- private httpServer: Http.Server | null;
24
-
25
- @Inject(Https.Server)
26
- private httpsServer: Https.Server | null;
27
-
28
- public $onInit() {
29
- this.mount();
30
- }
31
-
32
- getConfiguration() {
33
- const {path, ...props} = this.settings;
34
-
35
- return {
36
- logger: (event: string, error: any) =>
37
- this.injector.logger.info({
38
- event: event.toUpperCase(),
39
- error_message: error.message
40
- }),
41
- healthChecks: this.getHealths(),
42
- onSignal: this.createEmitter("$onSignal"),
43
- onShutdown: this.createEmitter("$onShutdown"),
44
- beforeShutdown: this.createEmitter("$beforeShutdown"),
45
- onSendFailureDuringShutdown: this.createEmitter("$onSendFailureDuringShutdown"),
46
- ...props
47
- };
48
- }
49
-
50
- $logRoutes(routes: PlatformRouteDetails[]): Promise<PlatformRouteDetails[]> {
51
- return Promise.resolve([
52
- ...routes,
53
- {
54
- url: this.basePath,
55
- method: "GET",
56
- name: `TerminusModule.dispatch()`
57
- },
58
- ...this.getAll<{name: string}>("health").map(({provider, propertyKey, options}) => {
59
- const path = this.getPath(provider, options.name);
60
-
61
- return {
62
- method: "GET",
63
- name: `${provider.className}.${propertyKey}()`,
64
- url: path
65
- } as any;
66
- })
67
- ]);
68
- }
69
-
70
- private mount() {
71
- const terminusConfig = this.getConfiguration();
72
-
73
- if (this.httpServer) {
74
- createTerminus(this.httpServer, terminusConfig);
75
- }
76
-
77
- if (this.httpsServer) {
78
- createTerminus(this.httpsServer, terminusConfig);
79
- }
80
- }
81
-
82
- private getAll<Opts = any>(
83
- name: string
84
- ): {
85
- provider: Provider;
86
- propertyKey: string;
87
- options: Opts;
88
- }[] {
89
- return this.injector.getProviders().flatMap((provider) => {
90
- const metadata = provider.store.get(`terminus:${name}`);
91
-
92
- if (metadata) {
93
- return Object.entries(metadata).map(([propertyKey, options]: [string, Opts]) => {
94
- return {
95
- provider,
96
- propertyKey,
97
- options
98
- };
99
- });
100
- }
101
- return [];
102
- });
103
- }
104
-
105
- private getHealths() {
106
- const subHealths = this.getAll<{name: string}>("health").reduce(
107
- (healths, {provider, propertyKey, options: {name}}) => {
108
- const instance = this.injector.get<any>(provider.token)!;
109
- const callback = async (...args: any[]) => {
110
- const result = await instance[propertyKey](...args);
111
-
112
- return {[name]: result};
113
- };
114
-
115
- let path = this.getPath(provider, name);
116
-
117
- return {
118
- ...healths,
119
- [path]: callback
120
- };
121
- },
122
- {} as Record<string, (state: any) => Promise<any>>
123
- );
124
-
125
- const healths: Record<string, any> = {
126
- ...subHealths,
127
- [this.basePath]: (state: any) => {
128
- const promises = Object.entries(subHealths).map(([path, callback]) => callback(state));
129
-
130
- return Promise.all(promises);
131
- }
132
- };
133
-
134
- return healths;
135
- }
136
-
137
- private getPath(provider: Provider<any>, name: string) {
138
- let path = concatPath(provider.path, name);
139
- return path.includes("health") ? path : concatPath(path, this.basePath);
140
- }
141
-
142
- private createEmitter(name: string) {
143
- return (...args: any[]) => {
144
- return this.injector.emit(name, ...args);
145
- };
146
- }
147
- }
@@ -1,28 +0,0 @@
1
- import {Store} from "@tsed/core";
2
-
3
- /**
4
- * Create a readiness / liveness checks.
5
- *
6
- * ```ts
7
- * import { Health } from "@tsed/terminus";
8
- *
9
- * @Controller("/mongo")
10
- * class MongoCtrl {
11
- * @Health("/health")
12
- * health() {
13
- * // Here check the mongo health
14
- * return Promise.resolve();
15
- * }
16
- * }
17
- *
18
- * @param name
19
- * @decorator
20
- * @terminus
21
- */
22
- export function Health(name: string): MethodDecorator {
23
- return <Function>(target: Object, propertyKey: string) => {
24
- Store.from(target).merge(`terminus:health`, {
25
- [propertyKey]: {name}
26
- });
27
- };
28
- }
package/src/index.ts DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * @file Automatically generated by @tsed/barrels.
3
- */
4
- export * from "./decorators/health.js";
5
- export * from "./interfaces/interfaces.js";
6
- export * from "./interfaces/TerminusSettings.js";
7
- export * from "./TerminusModule.js";
@@ -1,6 +0,0 @@
1
- import {TerminusOptions} from "@godaddy/terminus";
2
-
3
- export type TerminusSettings = Omit<
4
- TerminusOptions,
5
- "healthChecks" | "onSignal" | "onSendFailureDuringShutdown" | "onShutdown" | "beforeShutdown" | "onSigterm"
6
- > & {path?: string};
@@ -1,9 +0,0 @@
1
- import {TerminusSettings} from "./TerminusSettings.js";
2
-
3
- declare global {
4
- namespace TsED {
5
- interface Configuration {
6
- terminus: TerminusSettings;
7
- }
8
- }
9
- }
package/vitest.config.mts DELETED
@@ -1,21 +0,0 @@
1
- // @ts-ignore
2
- import {presets} from "@tsed/vitest/presets";
3
- import {defineConfig} from "vitest/config";
4
-
5
- export default defineConfig(
6
- {
7
- ...presets,
8
- test: {
9
- ...presets.test,
10
- coverage: {
11
- ...presets.test.coverage,
12
- thresholds: {
13
- statements: 0,
14
- branches: 0,
15
- functions: 0,
16
- lines: 0
17
- }
18
- }
19
- }
20
- }
21
- );