@dangao/bun-server 1.0.1 → 1.1.2
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/dist/controller/controller.d.ts +1 -1
- package/dist/controller/controller.d.ts.map +1 -1
- package/dist/core/application.d.ts.map +1 -1
- package/dist/database/database-extension.d.ts.map +1 -1
- package/dist/database/database-module.d.ts.map +1 -1
- package/dist/database/orm/transaction-decorator.d.ts +1 -0
- package/dist/database/orm/transaction-decorator.d.ts.map +1 -1
- package/dist/database/orm/transaction-interceptor.d.ts +12 -3
- package/dist/database/orm/transaction-interceptor.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +678 -310
- package/dist/interceptor/base-interceptor.d.ts +94 -0
- package/dist/interceptor/base-interceptor.d.ts.map +1 -0
- package/dist/interceptor/builtin/cache-interceptor.d.ts +69 -0
- package/dist/interceptor/builtin/cache-interceptor.d.ts.map +1 -0
- package/dist/interceptor/builtin/index.d.ts +4 -0
- package/dist/interceptor/builtin/index.d.ts.map +1 -0
- package/dist/interceptor/builtin/log-interceptor.d.ts +56 -0
- package/dist/interceptor/builtin/log-interceptor.d.ts.map +1 -0
- package/dist/interceptor/builtin/permission-interceptor.d.ts +70 -0
- package/dist/interceptor/builtin/permission-interceptor.d.ts.map +1 -0
- package/dist/interceptor/index.d.ts +7 -0
- package/dist/interceptor/index.d.ts.map +1 -0
- package/dist/interceptor/interceptor-chain.d.ts +22 -0
- package/dist/interceptor/interceptor-chain.d.ts.map +1 -0
- package/dist/interceptor/interceptor-registry.d.ts +59 -0
- package/dist/interceptor/interceptor-registry.d.ts.map +1 -0
- package/dist/interceptor/metadata.d.ts +12 -0
- package/dist/interceptor/metadata.d.ts.map +1 -0
- package/dist/interceptor/types.d.ts +42 -0
- package/dist/interceptor/types.d.ts.map +1 -0
- package/dist/middleware/decorators.d.ts +2 -1
- package/dist/middleware/decorators.d.ts.map +1 -1
- package/dist/router/decorators.d.ts.map +1 -1
- package/dist/router/registry.d.ts +2 -1
- package/dist/router/registry.d.ts.map +1 -1
- package/dist/router/route.d.ts +3 -2
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/router.d.ts +2 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/websocket/decorators.d.ts +2 -1
- package/dist/websocket/decorators.d.ts.map +1 -1
- package/package.json +5 -3
- package/readme.md +163 -2
- package/src/auth/controller.ts +148 -0
- package/src/auth/decorators.ts +81 -0
- package/src/auth/index.ts +12 -0
- package/src/auth/jwt.ts +169 -0
- package/src/auth/oauth2.ts +244 -0
- package/src/auth/types.ts +248 -0
- package/src/cache/cache-module.ts +67 -0
- package/src/cache/decorators.ts +202 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/service.ts +151 -0
- package/src/cache/types.ts +420 -0
- package/src/config/config-module.ts +76 -0
- package/src/config/index.ts +8 -0
- package/src/config/service.ts +93 -0
- package/src/config/types.ts +27 -0
- package/src/controller/controller.ts +278 -0
- package/src/controller/decorators.ts +84 -0
- package/src/controller/index.ts +7 -0
- package/src/controller/metadata.ts +27 -0
- package/src/controller/param-binder.ts +157 -0
- package/src/core/application.ts +239 -0
- package/src/core/context.ts +228 -0
- package/src/core/index.ts +4 -0
- package/src/core/server.ts +128 -0
- package/src/core/types.ts +2 -0
- package/src/database/connection-manager.ts +239 -0
- package/src/database/connection-pool.ts +322 -0
- package/src/database/database-extension.ts +83 -0
- package/src/database/database-module.ts +121 -0
- package/src/database/health-indicator.ts +51 -0
- package/src/database/index.ts +47 -0
- package/src/database/orm/decorators.ts +155 -0
- package/src/database/orm/drizzle-repository.ts +39 -0
- package/src/database/orm/index.ts +23 -0
- package/src/database/orm/repository-decorator.ts +39 -0
- package/src/database/orm/repository.ts +103 -0
- package/src/database/orm/service.ts +49 -0
- package/src/database/orm/transaction-decorator.ts +76 -0
- package/src/database/orm/transaction-interceptor.ts +263 -0
- package/src/database/orm/transaction-manager.ts +276 -0
- package/src/database/orm/transaction-types.ts +140 -0
- package/src/database/orm/types.ts +99 -0
- package/src/database/service.ts +221 -0
- package/src/database/types.ts +171 -0
- package/src/di/container.ts +398 -0
- package/src/di/decorators.ts +228 -0
- package/src/di/index.ts +4 -0
- package/src/di/module-registry.ts +188 -0
- package/src/di/module.ts +65 -0
- package/src/di/types.ts +67 -0
- package/src/error/error-codes.ts +222 -0
- package/src/error/filter.ts +43 -0
- package/src/error/handler.ts +66 -0
- package/src/error/http-exception.ts +115 -0
- package/src/error/i18n.ts +217 -0
- package/src/error/index.ts +16 -0
- package/src/extensions/index.ts +5 -0
- package/src/extensions/logger-extension.ts +31 -0
- package/src/extensions/logger-module.ts +69 -0
- package/src/extensions/types.ts +14 -0
- package/src/files/index.ts +5 -0
- package/src/files/static-middleware.ts +53 -0
- package/src/files/storage.ts +67 -0
- package/src/files/types.ts +33 -0
- package/src/files/upload-middleware.ts +45 -0
- package/src/health/controller.ts +76 -0
- package/src/health/health-module.ts +51 -0
- package/src/health/index.ts +12 -0
- package/src/health/types.ts +28 -0
- package/src/index.ts +292 -0
- package/src/interceptor/base-interceptor.ts +203 -0
- package/src/interceptor/builtin/cache-interceptor.ts +169 -0
- package/src/interceptor/builtin/index.ts +28 -0
- package/src/interceptor/builtin/log-interceptor.ts +178 -0
- package/src/interceptor/builtin/permission-interceptor.ts +173 -0
- package/src/interceptor/index.ts +26 -0
- package/src/interceptor/interceptor-chain.ts +79 -0
- package/src/interceptor/interceptor-registry.ts +132 -0
- package/src/interceptor/metadata.ts +40 -0
- package/src/interceptor/types.ts +52 -0
- package/src/metrics/collector.ts +209 -0
- package/src/metrics/controller.ts +40 -0
- package/src/metrics/index.ts +15 -0
- package/src/metrics/metrics-module.ts +58 -0
- package/src/metrics/middleware.ts +46 -0
- package/src/metrics/prometheus.ts +79 -0
- package/src/metrics/types.ts +103 -0
- package/src/middleware/builtin/cors.ts +60 -0
- package/src/middleware/builtin/error-handler.ts +90 -0
- package/src/middleware/builtin/file-upload.ts +42 -0
- package/src/middleware/builtin/index.ts +14 -0
- package/src/middleware/builtin/logger.ts +91 -0
- package/src/middleware/builtin/rate-limit.ts +252 -0
- package/src/middleware/builtin/static-file.ts +88 -0
- package/src/middleware/decorators.ts +92 -0
- package/src/middleware/index.ts +11 -0
- package/src/middleware/middleware.ts +13 -0
- package/src/middleware/pipeline.ts +93 -0
- package/src/queue/decorators.ts +110 -0
- package/src/queue/index.ts +26 -0
- package/src/queue/queue-module.ts +64 -0
- package/src/queue/service.ts +302 -0
- package/src/queue/types.ts +341 -0
- package/src/request/body-parser.ts +133 -0
- package/src/request/file-handler.ts +46 -0
- package/src/request/index.ts +5 -0
- package/src/request/request.ts +107 -0
- package/src/request/response.ts +150 -0
- package/src/router/decorators.ts +123 -0
- package/src/router/index.ts +6 -0
- package/src/router/registry.ts +99 -0
- package/src/router/route.ts +141 -0
- package/src/router/router.ts +242 -0
- package/src/router/types.ts +27 -0
- package/src/security/access-decision-manager.ts +34 -0
- package/src/security/authentication-manager.ts +47 -0
- package/src/security/context.ts +92 -0
- package/src/security/filter.ts +162 -0
- package/src/security/index.ts +8 -0
- package/src/security/providers/index.ts +3 -0
- package/src/security/providers/jwt-provider.ts +60 -0
- package/src/security/providers/oauth2-provider.ts +70 -0
- package/src/security/security-module.ts +145 -0
- package/src/security/types.ts +165 -0
- package/src/session/decorators.ts +45 -0
- package/src/session/index.ts +19 -0
- package/src/session/middleware.ts +143 -0
- package/src/session/service.ts +218 -0
- package/src/session/session-module.ts +69 -0
- package/src/session/types.ts +373 -0
- package/src/swagger/decorators.ts +133 -0
- package/src/swagger/generator.ts +234 -0
- package/src/swagger/index.ts +7 -0
- package/src/swagger/swagger-extension.ts +41 -0
- package/src/swagger/swagger-module.ts +83 -0
- package/src/swagger/types.ts +188 -0
- package/src/swagger/ui.ts +98 -0
- package/src/testing/harness.ts +96 -0
- package/src/validation/decorators.ts +95 -0
- package/src/validation/errors.ts +28 -0
- package/src/validation/index.ts +14 -0
- package/src/validation/types.ts +35 -0
- package/src/validation/validator.ts +63 -0
- package/src/websocket/decorators.ts +53 -0
- package/src/websocket/index.ts +12 -0
- package/src/websocket/registry.ts +133 -0
- package/tests/cache/cache-module.test.ts +212 -0
- package/tests/config/config-module.test.ts +151 -0
- package/tests/controller/controller.test.ts +189 -0
- package/tests/controller/path-combination.test.ts +207 -0
- package/tests/core/application.test.ts +57 -0
- package/tests/core/context-body.test.ts +44 -0
- package/tests/core/context.test.ts +86 -0
- package/tests/core/edge-cases.test.ts +432 -0
- package/tests/database/database-module.test.ts +385 -0
- package/tests/database/orm.test.ts +164 -0
- package/tests/database/postgres-mysql-integration.test.ts +395 -0
- package/tests/database/transaction.test.ts +238 -0
- package/tests/di/container.test.ts +264 -0
- package/tests/di/module.test.ts +128 -0
- package/tests/error/error-codes.test.ts +121 -0
- package/tests/error/error-handler.test.ts +68 -0
- package/tests/error/error-handling.test.ts +254 -0
- package/tests/error/http-exception.test.ts +37 -0
- package/tests/error/i18n-integration.test.ts +175 -0
- package/tests/extensions/logger-extension.test.ts +40 -0
- package/tests/files/static-middleware.test.ts +67 -0
- package/tests/files/upload-middleware.test.ts +43 -0
- package/tests/health/health-module.test.ts +116 -0
- package/tests/integration/application-router.test.ts +85 -0
- package/tests/integration/body-parsing.test.ts +88 -0
- package/tests/integration/cache-e2e.test.ts +114 -0
- package/tests/integration/oauth2-e2e.test.ts +615 -0
- package/tests/integration/session-e2e.test.ts +207 -0
- package/tests/interceptor/builtin/cache-interceptor.test.ts +137 -0
- package/tests/interceptor/builtin/permission-interceptor.test.ts +182 -0
- package/tests/interceptor/interceptor-advanced-integration.test.ts +592 -0
- package/tests/interceptor/interceptor-arg-modification.test.ts +76 -0
- package/tests/interceptor/interceptor-chain.test.ts +199 -0
- package/tests/interceptor/interceptor-integration.test.ts +230 -0
- package/tests/interceptor/interceptor-registry.test.ts +200 -0
- package/tests/interceptor/perf/interceptor-performance.test.ts +341 -0
- package/tests/metrics/metrics-module.test.ts +178 -0
- package/tests/middleware/builtin.test.ts +206 -0
- package/tests/middleware/file-upload.test.ts +41 -0
- package/tests/middleware/middleware.test.ts +120 -0
- package/tests/middleware/pipeline.test.ts +72 -0
- package/tests/middleware/rate-limit.test.ts +314 -0
- package/tests/middleware/static-file.test.ts +62 -0
- package/tests/perf/harness.test.ts +48 -0
- package/tests/perf/optimization.test.ts +183 -0
- package/tests/perf/regression.test.ts +120 -0
- package/tests/queue/queue-module.test.ts +217 -0
- package/tests/request/body-parser.test.ts +96 -0
- package/tests/request/response.test.ts +99 -0
- package/tests/router/decorators.test.ts +46 -0
- package/tests/router/registry.test.ts +51 -0
- package/tests/router/route.test.ts +71 -0
- package/tests/router/router-normalization.test.ts +106 -0
- package/tests/router/router.test.ts +133 -0
- package/tests/security/access-decision-manager.test.ts +84 -0
- package/tests/security/authentication-manager.test.ts +81 -0
- package/tests/security/context.test.ts +302 -0
- package/tests/security/filter.test.ts +225 -0
- package/tests/security/jwt-provider.test.ts +106 -0
- package/tests/security/oauth2-provider.test.ts +269 -0
- package/tests/security/security-module.test.ts +143 -0
- package/tests/session/session-module.test.ts +307 -0
- package/tests/stress/di-stress.test.ts +30 -0
- package/tests/swagger/decorators.test.ts +153 -0
- package/tests/swagger/generator.test.ts +202 -0
- package/tests/swagger/swagger-extension.test.ts +72 -0
- package/tests/swagger/swagger-module.test.ts +79 -0
- package/tests/utils/test-port.ts +10 -0
- package/tests/validation/controller-validation.test.ts +64 -0
- package/tests/validation/validation.test.ts +42 -0
- package/tests/websocket/gateway.test.ts +68 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Controller } from '../controller';
|
|
2
|
+
import { GET } from '../router/decorators';
|
|
3
|
+
import { Inject } from '../di/decorators';
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
HealthIndicator,
|
|
7
|
+
HealthIndicatorResult,
|
|
8
|
+
HealthStatus,
|
|
9
|
+
} from './types';
|
|
10
|
+
import type { HealthModuleOptions } from './types';
|
|
11
|
+
import { HEALTH_INDICATORS_TOKEN, HEALTH_OPTIONS_TOKEN } from './types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 健康检查控制器
|
|
15
|
+
*
|
|
16
|
+
* 提供 `/health` 和 `/ready` 两个端点:
|
|
17
|
+
* - /health:存活检查(liveness)
|
|
18
|
+
* - /ready:就绪检查(readiness)
|
|
19
|
+
*/
|
|
20
|
+
@Controller('/')
|
|
21
|
+
export class HealthController {
|
|
22
|
+
public constructor(
|
|
23
|
+
@Inject(HEALTH_INDICATORS_TOKEN)
|
|
24
|
+
private readonly indicators: HealthIndicator[] = [],
|
|
25
|
+
@Inject(HEALTH_OPTIONS_TOKEN)
|
|
26
|
+
private readonly options?: HealthModuleOptions,
|
|
27
|
+
) {}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 存活检查
|
|
31
|
+
*/
|
|
32
|
+
@GET('/health')
|
|
33
|
+
public async health(): Promise<HealthStatus> {
|
|
34
|
+
return await this.checkIndicators();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 就绪检查
|
|
39
|
+
*/
|
|
40
|
+
@GET('/ready')
|
|
41
|
+
public async ready(): Promise<HealthStatus> {
|
|
42
|
+
return await this.checkIndicators();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 执行所有健康检查指示器
|
|
47
|
+
*/
|
|
48
|
+
private async checkIndicators(): Promise<HealthStatus> {
|
|
49
|
+
const details: Record<string, HealthIndicatorResult> = {};
|
|
50
|
+
|
|
51
|
+
for (const indicator of this.indicators || []) {
|
|
52
|
+
try {
|
|
53
|
+
const result = await indicator.check();
|
|
54
|
+
details[indicator.name] = result;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
details[indicator.name] = {
|
|
57
|
+
status: 'down',
|
|
58
|
+
details: {
|
|
59
|
+
error: (error as Error).message,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const allUp =
|
|
66
|
+
Object.keys(details).length === 0 ||
|
|
67
|
+
Object.values(details).every((result) => result.status === 'up');
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
status: allUp ? 'up' : 'down',
|
|
71
|
+
details,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Module, MODULE_METADATA_KEY, type ModuleProvider } from '../di/module';
|
|
2
|
+
|
|
3
|
+
import { HealthController } from './controller';
|
|
4
|
+
import type { HealthIndicator, HealthModuleOptions } from './types';
|
|
5
|
+
import { HEALTH_INDICATORS_TOKEN, HEALTH_OPTIONS_TOKEN } from './types';
|
|
6
|
+
|
|
7
|
+
@Module({
|
|
8
|
+
controllers: [HealthController],
|
|
9
|
+
providers: [],
|
|
10
|
+
})
|
|
11
|
+
export class HealthModule {
|
|
12
|
+
/**
|
|
13
|
+
* 创建健康检查模块
|
|
14
|
+
* @param options - 模块配置
|
|
15
|
+
*/
|
|
16
|
+
public static forRoot(options: HealthModuleOptions = {}): typeof HealthModule {
|
|
17
|
+
const providers: ModuleProvider[] = [];
|
|
18
|
+
|
|
19
|
+
const indicators: HealthIndicator[] = options.indicators ?? [];
|
|
20
|
+
|
|
21
|
+
providers.push(
|
|
22
|
+
{
|
|
23
|
+
provide: HEALTH_INDICATORS_TOKEN,
|
|
24
|
+
useValue: indicators,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
provide: HEALTH_OPTIONS_TOKEN,
|
|
28
|
+
useValue: options,
|
|
29
|
+
},
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
// 动态更新模块元数据
|
|
33
|
+
const existingMetadata =
|
|
34
|
+
Reflect.getMetadata(MODULE_METADATA_KEY, HealthModule) || {};
|
|
35
|
+
const metadata = {
|
|
36
|
+
...existingMetadata,
|
|
37
|
+
controllers: [...(existingMetadata.controllers || []), HealthController],
|
|
38
|
+
providers: [...(existingMetadata.providers || []), ...providers],
|
|
39
|
+
exports: [
|
|
40
|
+
...(existingMetadata.exports || []),
|
|
41
|
+
HEALTH_INDICATORS_TOKEN,
|
|
42
|
+
HEALTH_OPTIONS_TOKEN,
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
Reflect.defineMetadata(MODULE_METADATA_KEY, metadata, HealthModule);
|
|
46
|
+
|
|
47
|
+
return HealthModule;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { HealthModule } from './health-module';
|
|
2
|
+
export { HealthController } from './controller';
|
|
3
|
+
export {
|
|
4
|
+
HEALTH_INDICATORS_TOKEN,
|
|
5
|
+
HEALTH_OPTIONS_TOKEN,
|
|
6
|
+
type HealthIndicator,
|
|
7
|
+
type HealthIndicatorResult,
|
|
8
|
+
type HealthStatus,
|
|
9
|
+
type HealthModuleOptions,
|
|
10
|
+
} from './types';
|
|
11
|
+
|
|
12
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const HEALTH_INDICATORS_TOKEN = Symbol('@dangao/bun-server:health:indicators');
|
|
2
|
+
export const HEALTH_OPTIONS_TOKEN = Symbol('@dangao/bun-server:health:options');
|
|
3
|
+
|
|
4
|
+
export type HealthStatusValue = 'up' | 'down';
|
|
5
|
+
|
|
6
|
+
export interface HealthIndicatorResult {
|
|
7
|
+
status: HealthStatusValue;
|
|
8
|
+
details?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface HealthIndicator {
|
|
12
|
+
name: string;
|
|
13
|
+
check(): Promise<HealthIndicatorResult> | HealthIndicatorResult;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface HealthStatus {
|
|
17
|
+
status: HealthStatusValue;
|
|
18
|
+
details: Record<string, HealthIndicatorResult>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface HealthModuleOptions {
|
|
22
|
+
/**
|
|
23
|
+
* 健康检查指示器列表
|
|
24
|
+
*/
|
|
25
|
+
indicators?: HealthIndicator[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
export { Application, type ApplicationOptions } from './core/application';
|
|
2
|
+
export { BunServer, type ServerOptions } from './core/server';
|
|
3
|
+
export { Context } from './core/context';
|
|
4
|
+
export { Route, Router, RouteRegistry } from './router';
|
|
5
|
+
export { GET, POST, PUT, DELETE, PATCH } from './router/decorators';
|
|
6
|
+
export type { HttpMethod, RouteHandler, RouteMatch } from './router/types';
|
|
7
|
+
export { BodyParser, RequestWrapper, ResponseBuilder } from './request';
|
|
8
|
+
export { Body, Query, Param, Header, ParamBinder, Controller, ControllerRegistry } from './controller';
|
|
9
|
+
export type { ParamMetadata, ControllerMetadata } from './controller';
|
|
10
|
+
export { Container } from './di/container';
|
|
11
|
+
export { Injectable, Inject } from './di/decorators';
|
|
12
|
+
export { Lifecycle, type ProviderConfig, type DependencyMetadata } from './di/types';
|
|
13
|
+
export {
|
|
14
|
+
Module,
|
|
15
|
+
type ModuleMetadata,
|
|
16
|
+
type ModuleProvider,
|
|
17
|
+
type ModuleClass,
|
|
18
|
+
} from './di/module';
|
|
19
|
+
export { ModuleRegistry } from './di/module-registry';
|
|
20
|
+
export {
|
|
21
|
+
InterceptorRegistry,
|
|
22
|
+
InterceptorChain,
|
|
23
|
+
scanInterceptorMetadata,
|
|
24
|
+
BaseInterceptor,
|
|
25
|
+
Cache,
|
|
26
|
+
CacheInterceptor,
|
|
27
|
+
Permission,
|
|
28
|
+
PermissionInterceptor,
|
|
29
|
+
Log,
|
|
30
|
+
LogInterceptor,
|
|
31
|
+
INTERCEPTOR_REGISTRY_TOKEN,
|
|
32
|
+
CACHE_METADATA_KEY,
|
|
33
|
+
PERMISSION_METADATA_KEY,
|
|
34
|
+
LOG_METADATA_KEY,
|
|
35
|
+
type Interceptor,
|
|
36
|
+
type InterceptorMetadata,
|
|
37
|
+
type CacheOptions,
|
|
38
|
+
type PermissionOptions,
|
|
39
|
+
type PermissionService,
|
|
40
|
+
type LogOptions,
|
|
41
|
+
} from './interceptor';
|
|
42
|
+
export { UseMiddleware, RateLimit, MiddlewarePipeline } from './middleware';
|
|
43
|
+
export type { Middleware, NextFunction } from './middleware';
|
|
44
|
+
export {
|
|
45
|
+
createLoggerMiddleware,
|
|
46
|
+
createRequestLoggingMiddleware,
|
|
47
|
+
createErrorHandlingMiddleware,
|
|
48
|
+
createCorsMiddleware,
|
|
49
|
+
createFileUploadMiddleware,
|
|
50
|
+
createStaticFileMiddleware,
|
|
51
|
+
createRateLimitMiddleware,
|
|
52
|
+
createTokenKeyGenerator,
|
|
53
|
+
createUserKeyGenerator,
|
|
54
|
+
type RateLimitOptions,
|
|
55
|
+
type RateLimitStore,
|
|
56
|
+
} from './middleware/builtin';
|
|
57
|
+
export {
|
|
58
|
+
Validate,
|
|
59
|
+
IsString,
|
|
60
|
+
IsNumber,
|
|
61
|
+
IsEmail,
|
|
62
|
+
IsOptional,
|
|
63
|
+
MinLength,
|
|
64
|
+
ValidationError,
|
|
65
|
+
type ValidationIssue,
|
|
66
|
+
} from './validation';
|
|
67
|
+
export {
|
|
68
|
+
HttpException,
|
|
69
|
+
BadRequestException,
|
|
70
|
+
UnauthorizedException,
|
|
71
|
+
ForbiddenException,
|
|
72
|
+
NotFoundException,
|
|
73
|
+
InternalServerErrorException,
|
|
74
|
+
ExceptionFilterRegistry,
|
|
75
|
+
type ExceptionFilter,
|
|
76
|
+
} from './error';
|
|
77
|
+
export {
|
|
78
|
+
WebSocketGateway,
|
|
79
|
+
OnOpen,
|
|
80
|
+
OnMessage,
|
|
81
|
+
OnClose,
|
|
82
|
+
WebSocketGatewayRegistry,
|
|
83
|
+
type WebSocketConnectionData,
|
|
84
|
+
} from './websocket';
|
|
85
|
+
export {
|
|
86
|
+
LoggerExtension,
|
|
87
|
+
LoggerModule,
|
|
88
|
+
LogLevel,
|
|
89
|
+
LOGGER_TOKEN,
|
|
90
|
+
type Logger,
|
|
91
|
+
type LoggerOptions,
|
|
92
|
+
type LoggerModuleOptions,
|
|
93
|
+
type LogEntry,
|
|
94
|
+
} from './extensions';
|
|
95
|
+
export {
|
|
96
|
+
SwaggerExtension,
|
|
97
|
+
SwaggerModule,
|
|
98
|
+
SwaggerGenerator,
|
|
99
|
+
createSwaggerUIMiddleware,
|
|
100
|
+
ApiTags,
|
|
101
|
+
ApiOperation,
|
|
102
|
+
ApiParam,
|
|
103
|
+
ApiBody,
|
|
104
|
+
ApiResponse,
|
|
105
|
+
type SwaggerOptions,
|
|
106
|
+
type SwaggerModuleOptions,
|
|
107
|
+
type SwaggerDocument,
|
|
108
|
+
type ApiOperationMetadata,
|
|
109
|
+
type ApiParamMetadata,
|
|
110
|
+
type ApiBodyMetadata,
|
|
111
|
+
type ApiResponseMetadata,
|
|
112
|
+
} from './swagger';
|
|
113
|
+
// Security 模块(推荐使用)
|
|
114
|
+
export {
|
|
115
|
+
SecurityModule,
|
|
116
|
+
SecurityContextHolder,
|
|
117
|
+
AuthenticationManager,
|
|
118
|
+
RoleBasedAccessDecisionManager,
|
|
119
|
+
JwtAuthenticationProvider,
|
|
120
|
+
OAuth2AuthenticationProvider,
|
|
121
|
+
createSecurityFilter,
|
|
122
|
+
type SecurityModuleConfig,
|
|
123
|
+
type SecurityConfig,
|
|
124
|
+
type SecurityContext,
|
|
125
|
+
type Authentication,
|
|
126
|
+
type AuthenticationProvider,
|
|
127
|
+
type AuthenticationRequest,
|
|
128
|
+
type Principal,
|
|
129
|
+
type Credentials,
|
|
130
|
+
type AccessDecisionManager,
|
|
131
|
+
} from './security';
|
|
132
|
+
export {
|
|
133
|
+
ConfigModule,
|
|
134
|
+
ConfigService,
|
|
135
|
+
CONFIG_SERVICE_TOKEN,
|
|
136
|
+
type ConfigModuleOptions,
|
|
137
|
+
} from './config';
|
|
138
|
+
export {
|
|
139
|
+
HealthModule,
|
|
140
|
+
type HealthIndicator,
|
|
141
|
+
type HealthIndicatorResult,
|
|
142
|
+
type HealthStatus,
|
|
143
|
+
type HealthModuleOptions,
|
|
144
|
+
HEALTH_INDICATORS_TOKEN,
|
|
145
|
+
HEALTH_OPTIONS_TOKEN,
|
|
146
|
+
} from './health';
|
|
147
|
+
export {
|
|
148
|
+
MetricsModule,
|
|
149
|
+
MetricsCollector,
|
|
150
|
+
PrometheusFormatter,
|
|
151
|
+
createHttpMetricsMiddleware,
|
|
152
|
+
METRICS_SERVICE_TOKEN,
|
|
153
|
+
METRICS_OPTIONS_TOKEN,
|
|
154
|
+
type MetricsModuleOptions,
|
|
155
|
+
type MetricType,
|
|
156
|
+
type MetricLabels,
|
|
157
|
+
type MetricValue,
|
|
158
|
+
type MetricDataPoint,
|
|
159
|
+
type CustomMetric,
|
|
160
|
+
} from './metrics';
|
|
161
|
+
export {
|
|
162
|
+
DatabaseModule,
|
|
163
|
+
DatabaseService,
|
|
164
|
+
DatabaseConnectionManager,
|
|
165
|
+
ConnectionPool,
|
|
166
|
+
DatabaseHealthIndicator,
|
|
167
|
+
DatabaseExtension,
|
|
168
|
+
DATABASE_SERVICE_TOKEN,
|
|
169
|
+
DATABASE_OPTIONS_TOKEN,
|
|
170
|
+
type DatabaseModuleOptions,
|
|
171
|
+
type DatabaseConfig,
|
|
172
|
+
type DatabaseType,
|
|
173
|
+
type ConnectionInfo,
|
|
174
|
+
type ConnectionPoolOptions,
|
|
175
|
+
type SqliteConfig,
|
|
176
|
+
type PostgresConfig,
|
|
177
|
+
type MysqlConfig,
|
|
178
|
+
// ORM exports
|
|
179
|
+
Entity,
|
|
180
|
+
Column,
|
|
181
|
+
PrimaryKey,
|
|
182
|
+
Repository,
|
|
183
|
+
BaseRepository,
|
|
184
|
+
DrizzleBaseRepository,
|
|
185
|
+
OrmService,
|
|
186
|
+
ORM_SERVICE_TOKEN,
|
|
187
|
+
getEntityMetadata,
|
|
188
|
+
getColumnMetadata,
|
|
189
|
+
getRepositoryMetadata,
|
|
190
|
+
type OrmModuleOptions,
|
|
191
|
+
type BaseRepository as BaseRepositoryInterface,
|
|
192
|
+
type EntityMetadata,
|
|
193
|
+
type ColumnMetadata,
|
|
194
|
+
// Transaction exports
|
|
195
|
+
Transactional,
|
|
196
|
+
TransactionManager,
|
|
197
|
+
TransactionInterceptor,
|
|
198
|
+
Propagation,
|
|
199
|
+
IsolationLevel,
|
|
200
|
+
TransactionStatus,
|
|
201
|
+
TRANSACTION_SERVICE_TOKEN,
|
|
202
|
+
getTransactionMetadata,
|
|
203
|
+
type TransactionOptions,
|
|
204
|
+
type TransactionContext,
|
|
205
|
+
} from './database';
|
|
206
|
+
// Auth 模块(底层实现,供 Security 模块使用)
|
|
207
|
+
export {
|
|
208
|
+
JWTUtil,
|
|
209
|
+
OAuth2Service,
|
|
210
|
+
OAuth2Controller,
|
|
211
|
+
Auth,
|
|
212
|
+
getAuthMetadata,
|
|
213
|
+
requiresAuth,
|
|
214
|
+
checkRoles,
|
|
215
|
+
OAUTH2_SERVICE_TOKEN,
|
|
216
|
+
JWT_UTIL_TOKEN,
|
|
217
|
+
type JWTConfig,
|
|
218
|
+
type JWTPayload,
|
|
219
|
+
type OAuth2Client,
|
|
220
|
+
type OAuth2AuthorizationRequest,
|
|
221
|
+
type OAuth2TokenRequest,
|
|
222
|
+
type OAuth2TokenResponse,
|
|
223
|
+
type UserInfo,
|
|
224
|
+
type AuthContext,
|
|
225
|
+
type AuthConfig,
|
|
226
|
+
} from './auth';
|
|
227
|
+
export {
|
|
228
|
+
PerformanceHarness,
|
|
229
|
+
StressTester,
|
|
230
|
+
type BenchmarkResult,
|
|
231
|
+
type StressResult,
|
|
232
|
+
} from './testing/harness';
|
|
233
|
+
// Cache 模块
|
|
234
|
+
export {
|
|
235
|
+
CacheModule,
|
|
236
|
+
CacheService,
|
|
237
|
+
Cacheable,
|
|
238
|
+
CacheEvict,
|
|
239
|
+
CachePut,
|
|
240
|
+
MemoryCacheStore,
|
|
241
|
+
RedisCacheStore,
|
|
242
|
+
CACHE_SERVICE_TOKEN,
|
|
243
|
+
CACHE_OPTIONS_TOKEN,
|
|
244
|
+
} from './cache';
|
|
245
|
+
export type {
|
|
246
|
+
CacheModuleOptions,
|
|
247
|
+
CacheStore,
|
|
248
|
+
RedisCacheStoreOptions,
|
|
249
|
+
CacheableOptions,
|
|
250
|
+
CacheEvictOptions,
|
|
251
|
+
CachePutOptions,
|
|
252
|
+
} from './cache';
|
|
253
|
+
// Queue 模块
|
|
254
|
+
export {
|
|
255
|
+
QueueModule,
|
|
256
|
+
QueueService,
|
|
257
|
+
Queue,
|
|
258
|
+
Cron,
|
|
259
|
+
MemoryQueueStore,
|
|
260
|
+
QUEUE_SERVICE_TOKEN,
|
|
261
|
+
QUEUE_OPTIONS_TOKEN,
|
|
262
|
+
} from './queue';
|
|
263
|
+
export type {
|
|
264
|
+
QueueModuleOptions,
|
|
265
|
+
QueueStore,
|
|
266
|
+
Job,
|
|
267
|
+
JobData,
|
|
268
|
+
JobHandler,
|
|
269
|
+
JobOptions,
|
|
270
|
+
CronOptions,
|
|
271
|
+
QueueOptions,
|
|
272
|
+
CronDecoratorOptions,
|
|
273
|
+
} from './queue';
|
|
274
|
+
// Session 模块
|
|
275
|
+
export {
|
|
276
|
+
SessionModule,
|
|
277
|
+
SessionService,
|
|
278
|
+
createSessionMiddleware,
|
|
279
|
+
SessionDecorator as Session,
|
|
280
|
+
MemorySessionStore,
|
|
281
|
+
RedisSessionStore,
|
|
282
|
+
SESSION_SERVICE_TOKEN,
|
|
283
|
+
SESSION_OPTIONS_TOKEN,
|
|
284
|
+
} from './session';
|
|
285
|
+
export type {
|
|
286
|
+
SessionModuleOptions,
|
|
287
|
+
SessionStore,
|
|
288
|
+
Session as SessionType,
|
|
289
|
+
SessionData,
|
|
290
|
+
RedisSessionStoreOptions,
|
|
291
|
+
} from './session';
|
|
292
|
+
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { Interceptor } from './types';
|
|
2
|
+
import type { Container } from '../di/container';
|
|
3
|
+
import type { Context } from '../core/context';
|
|
4
|
+
import 'reflect-metadata';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 拦截器基类
|
|
8
|
+
* 提供便捷的前置处理、后置处理和错误处理方法
|
|
9
|
+
*/
|
|
10
|
+
export abstract class BaseInterceptor implements Interceptor {
|
|
11
|
+
/**
|
|
12
|
+
* 执行拦截器逻辑
|
|
13
|
+
* 子类必须实现此方法
|
|
14
|
+
*/
|
|
15
|
+
public abstract execute<T>(
|
|
16
|
+
target: unknown,
|
|
17
|
+
propertyKey: string | symbol,
|
|
18
|
+
originalMethod: (...args: unknown[]) => T | Promise<T>,
|
|
19
|
+
args: unknown[],
|
|
20
|
+
container: Container,
|
|
21
|
+
context?: Context,
|
|
22
|
+
): Promise<T>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 前置处理(可选)
|
|
26
|
+
* 在方法执行前调用,子类可以覆盖此方法
|
|
27
|
+
* @param target - 目标对象
|
|
28
|
+
* @param propertyKey - 方法名
|
|
29
|
+
* @param args - 方法参数
|
|
30
|
+
* @param container - DI 容器
|
|
31
|
+
* @param context - 请求上下文(可选)
|
|
32
|
+
*/
|
|
33
|
+
protected async before(
|
|
34
|
+
target: unknown,
|
|
35
|
+
propertyKey: string | symbol,
|
|
36
|
+
args: unknown[],
|
|
37
|
+
container: Container,
|
|
38
|
+
context?: Context,
|
|
39
|
+
): Promise<void> {
|
|
40
|
+
// 默认空实现,子类可覆盖
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 后置处理(可选)
|
|
45
|
+
* 在方法执行后调用,子类可以覆盖此方法
|
|
46
|
+
* @param target - 目标对象
|
|
47
|
+
* @param propertyKey - 方法名
|
|
48
|
+
* @param result - 方法执行结果
|
|
49
|
+
* @param container - DI 容器
|
|
50
|
+
* @param context - 请求上下文(可选)
|
|
51
|
+
* @returns 处理后的结果(默认返回原结果)
|
|
52
|
+
*/
|
|
53
|
+
protected async after<T>(
|
|
54
|
+
target: unknown,
|
|
55
|
+
propertyKey: string | symbol,
|
|
56
|
+
result: T,
|
|
57
|
+
container: Container,
|
|
58
|
+
context?: Context,
|
|
59
|
+
): Promise<T> {
|
|
60
|
+
// 默认返回原结果,子类可覆盖
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 错误处理(可选)
|
|
66
|
+
* 在方法执行出错时调用,子类可以覆盖此方法
|
|
67
|
+
* @param target - 目标对象
|
|
68
|
+
* @param propertyKey - 方法名
|
|
69
|
+
* @param error - 错误对象
|
|
70
|
+
* @param container - DI 容器
|
|
71
|
+
* @param context - 请求上下文(可选)
|
|
72
|
+
* @returns 永远不会返回(总是抛出错误)
|
|
73
|
+
* @throws 重新抛出错误或抛出新的错误
|
|
74
|
+
*/
|
|
75
|
+
protected async onError(
|
|
76
|
+
target: unknown,
|
|
77
|
+
propertyKey: string | symbol,
|
|
78
|
+
error: unknown,
|
|
79
|
+
container: Container,
|
|
80
|
+
context?: Context,
|
|
81
|
+
): Promise<never> {
|
|
82
|
+
// 默认重新抛出错误,子类可覆盖
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 获取元数据
|
|
88
|
+
* 从目标对象的方法上获取指定元数据键的元数据
|
|
89
|
+
* 支持从实例或原型上获取元数据(元数据通常存储在原型上)
|
|
90
|
+
* @param target - 目标对象(可能是实例或原型)
|
|
91
|
+
* @param propertyKey - 方法名
|
|
92
|
+
* @param metadataKey - 元数据键
|
|
93
|
+
* @returns 元数据值,如果不存在则返回 undefined
|
|
94
|
+
*/
|
|
95
|
+
protected getMetadata<T = unknown>(
|
|
96
|
+
target: unknown,
|
|
97
|
+
propertyKey: string | symbol,
|
|
98
|
+
metadataKey: symbol,
|
|
99
|
+
): T | undefined {
|
|
100
|
+
if (typeof target !== 'object' || target === null) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 首先尝试直接从 target 获取(如果 target 是原型)
|
|
105
|
+
let metadata = Reflect.getMetadata(metadataKey, target, propertyKey) as T | undefined;
|
|
106
|
+
if (metadata !== undefined) {
|
|
107
|
+
return metadata;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 如果 target 是实例,尝试从原型获取
|
|
111
|
+
// 装饰器元数据通常存储在原型上,而不是实例上
|
|
112
|
+
const prototype = Object.getPrototypeOf(target);
|
|
113
|
+
if (prototype && prototype !== Object.prototype) {
|
|
114
|
+
metadata = Reflect.getMetadata(metadataKey, prototype, propertyKey) as T | undefined;
|
|
115
|
+
if (metadata !== undefined) {
|
|
116
|
+
return metadata;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 如果仍然找不到,尝试从构造函数原型获取
|
|
121
|
+
// 这处理了 target 是实例但原型链查找失败的情况
|
|
122
|
+
const constructor = (target as any).constructor;
|
|
123
|
+
if (constructor && typeof constructor === 'function') {
|
|
124
|
+
// 如果 target 本身不是构造函数原型,尝试从构造函数原型获取
|
|
125
|
+
if (target !== constructor.prototype) {
|
|
126
|
+
metadata = Reflect.getMetadata(metadataKey, constructor.prototype, propertyKey) as T | undefined;
|
|
127
|
+
if (metadata !== undefined) {
|
|
128
|
+
return metadata;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 从容器解析服务
|
|
138
|
+
* @param container - DI 容器
|
|
139
|
+
* @param token - 服务标识符
|
|
140
|
+
* @returns 服务实例
|
|
141
|
+
*/
|
|
142
|
+
protected resolveService<T>(
|
|
143
|
+
container: Container,
|
|
144
|
+
token: (new (...args: unknown[]) => T) | string | symbol,
|
|
145
|
+
): T {
|
|
146
|
+
return container.resolve<T>(token);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 从上下文获取值
|
|
151
|
+
* @param context - 请求上下文
|
|
152
|
+
* @param key - 键名
|
|
153
|
+
* @returns 值,如果不存在则返回 undefined
|
|
154
|
+
*/
|
|
155
|
+
protected getContextValue<T = unknown>(context: Context | undefined, key: string): T | undefined {
|
|
156
|
+
if (!context) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
// Context 没有直接的存储机制,可以通过 headers 或其他方式获取
|
|
160
|
+
// 这里提供一个基础实现,子类可以根据需要扩展
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 从上下文获取请求头
|
|
166
|
+
* @param context - 请求上下文
|
|
167
|
+
* @param headerName - 请求头名称
|
|
168
|
+
* @returns 请求头值,如果不存在则返回 null
|
|
169
|
+
*/
|
|
170
|
+
protected getHeader(context: Context | undefined, headerName: string): string | null {
|
|
171
|
+
if (!context) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
return context.getHeader(headerName);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* 从上下文获取查询参数
|
|
179
|
+
* @param context - 请求上下文
|
|
180
|
+
* @param paramName - 参数名称
|
|
181
|
+
* @returns 参数值,如果不存在则返回 null
|
|
182
|
+
*/
|
|
183
|
+
protected getQuery(context: Context | undefined, paramName: string): string | null {
|
|
184
|
+
if (!context) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
return context.getQuery(paramName);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* 从上下文获取路径参数
|
|
192
|
+
* @param context - 请求上下文
|
|
193
|
+
* @param paramName - 参数名称
|
|
194
|
+
* @returns 参数值,如果不存在则返回 undefined
|
|
195
|
+
*/
|
|
196
|
+
protected getParam(context: Context | undefined, paramName: string): string | undefined {
|
|
197
|
+
if (!context) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
return context.getParam(paramName);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|