@cinnabun/core 0.0.1 → 0.0.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/__tests__/autowired.test.d.ts +1 -0
- package/dist/__tests__/autowired.test.js +109 -0
- package/dist/__tests__/autowired.test.js.map +1 -0
- package/dist/__tests__/cinnabun-application.test.d.ts +1 -0
- package/dist/__tests__/cinnabun-application.test.js +96 -0
- package/dist/__tests__/cinnabun-application.test.js.map +1 -0
- package/dist/__tests__/cinnabun-factory.test.d.ts +1 -0
- package/dist/__tests__/cinnabun-factory.test.js +269 -0
- package/dist/__tests__/cinnabun-factory.test.js.map +1 -0
- package/dist/__tests__/circular-dependency.test.d.ts +1 -0
- package/dist/__tests__/circular-dependency.test.js +318 -0
- package/dist/__tests__/circular-dependency.test.js.map +1 -0
- package/dist/__tests__/compression.test.d.ts +1 -0
- package/dist/__tests__/compression.test.js +459 -0
- package/dist/__tests__/compression.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +86 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/cors.test.d.ts +1 -0
- package/dist/__tests__/cors.test.js +575 -0
- package/dist/__tests__/cors.test.js.map +1 -0
- package/dist/__tests__/env-config.test.d.ts +1 -0
- package/dist/__tests__/env-config.test.js +367 -0
- package/dist/__tests__/env-config.test.js.map +1 -0
- package/dist/__tests__/exception.test.d.ts +1 -0
- package/dist/__tests__/exception.test.js +207 -0
- package/dist/__tests__/exception.test.js.map +1 -0
- package/dist/__tests__/guards-interceptors.test.d.ts +1 -0
- package/dist/__tests__/guards-interceptors.test.js +660 -0
- package/dist/__tests__/guards-interceptors.test.js.map +1 -0
- package/dist/__tests__/health-check.test.d.ts +1 -0
- package/dist/__tests__/health-check.test.js +240 -0
- package/dist/__tests__/health-check.test.js.map +1 -0
- package/dist/__tests__/http.test.d.ts +1 -0
- package/dist/__tests__/http.test.js +629 -0
- package/dist/__tests__/http.test.js.map +1 -0
- package/dist/__tests__/integration/e2e.test.d.ts +1 -0
- package/dist/__tests__/integration/e2e.test.js +192 -0
- package/dist/__tests__/integration/e2e.test.js.map +1 -0
- package/dist/__tests__/integration/performance.bench.d.ts +1 -0
- package/dist/__tests__/integration/performance.bench.js +129 -0
- package/dist/__tests__/integration/performance.bench.js.map +1 -0
- package/dist/__tests__/integration/validation.test.d.ts +1 -0
- package/dist/__tests__/integration/validation.test.js +133 -0
- package/dist/__tests__/integration/validation.test.js.map +1 -0
- package/dist/__tests__/lifecycle-management.test.d.ts +1 -0
- package/dist/__tests__/lifecycle-management.test.js +688 -0
- package/dist/__tests__/lifecycle-management.test.js.map +1 -0
- package/dist/__tests__/lifecycle.test.d.ts +1 -0
- package/dist/__tests__/lifecycle.test.js +196 -0
- package/dist/__tests__/lifecycle.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +1 -0
- package/dist/__tests__/logger.test.js +109 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/middleware.test.d.ts +1 -0
- package/dist/__tests__/middleware.test.js +329 -0
- package/dist/__tests__/middleware.test.js.map +1 -0
- package/dist/__tests__/module.test.d.ts +1 -0
- package/dist/__tests__/module.test.js +280 -0
- package/dist/__tests__/module.test.js.map +1 -0
- package/dist/__tests__/plugin.test.d.ts +1 -0
- package/dist/__tests__/plugin.test.js +283 -0
- package/dist/__tests__/plugin.test.js.map +1 -0
- package/dist/__tests__/request-logger.test.d.ts +1 -0
- package/dist/__tests__/request-logger.test.js +342 -0
- package/dist/__tests__/request-logger.test.js.map +1 -0
- package/dist/__tests__/request-mapping.test.d.ts +1 -0
- package/dist/__tests__/request-mapping.test.js +201 -0
- package/dist/__tests__/request-mapping.test.js.map +1 -0
- package/dist/__tests__/routes.test.d.ts +1 -0
- package/dist/__tests__/routes.test.js +119 -0
- package/dist/__tests__/routes.test.js.map +1 -0
- package/dist/__tests__/scan-fixtures/controllers/hello.controller.d.ts +4 -0
- package/dist/__tests__/scan-fixtures/controllers/hello.controller.js +28 -0
- package/dist/__tests__/scan-fixtures/controllers/hello.controller.js.map +1 -0
- package/dist/__tests__/scan-fixtures/modules/feature.module.d.ts +6 -0
- package/dist/__tests__/scan-fixtures/modules/feature.module.js +28 -0
- package/dist/__tests__/scan-fixtures/modules/feature.module.js.map +1 -0
- package/dist/__tests__/scan-fixtures/services/greeting.service.d.ts +4 -0
- package/dist/__tests__/scan-fixtures/services/greeting.service.js +18 -0
- package/dist/__tests__/scan-fixtures/services/greeting.service.js.map +1 -0
- package/dist/__tests__/scanner.test.d.ts +1 -0
- package/dist/__tests__/scanner.test.js +49 -0
- package/dist/__tests__/scanner.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +1 -0
- package/dist/__tests__/validation.test.js +561 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/__tests__/websocket-auth.test.d.ts +1 -0
- package/dist/__tests__/websocket-auth.test.js +431 -0
- package/dist/__tests__/websocket-auth.test.js.map +1 -0
- package/dist/__tests__/websocket-decorators.test.d.ts +1 -0
- package/dist/__tests__/websocket-decorators.test.js +173 -0
- package/dist/__tests__/websocket-decorators.test.js.map +1 -0
- package/dist/__tests__/websocket-validation.test.d.ts +1 -0
- package/dist/__tests__/websocket-validation.test.js +827 -0
- package/dist/__tests__/websocket-validation.test.js.map +1 -0
- package/dist/__tests__/websocket.test.d.ts +1 -0
- package/dist/__tests__/websocket.test.js +415 -0
- package/dist/__tests__/websocket.test.js.map +1 -0
- package/dist/config/config.module.d.ts +2 -0
- package/dist/config/config.module.js +18 -0
- package/dist/config/config.module.js.map +1 -0
- package/dist/config/config.service.d.ts +15 -0
- package/dist/config/config.service.js +58 -0
- package/dist/config/config.service.js.map +1 -0
- package/dist/config/schemas.d.ts +107 -0
- package/dist/config/schemas.js +87 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/core/app.d.ts +44 -0
- package/dist/core/app.js +178 -0
- package/dist/core/app.js.map +1 -0
- package/dist/core/cinnabun-factory.d.ts +5 -0
- package/dist/core/cinnabun-factory.js +130 -0
- package/dist/core/cinnabun-factory.js.map +1 -0
- package/dist/core/config-loader.d.ts +2 -0
- package/dist/core/config-loader.js +76 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/config.d.ts +12 -0
- package/dist/core/config.js +27 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/container.d.ts +10 -0
- package/dist/core/container.js +82 -0
- package/dist/core/container.js.map +1 -0
- package/dist/core/dependency-validator.d.ts +12 -0
- package/dist/core/dependency-validator.js +76 -0
- package/dist/core/dependency-validator.js.map +1 -0
- package/dist/core/guard.d.ts +3 -0
- package/dist/core/guard.js +2 -0
- package/dist/core/guard.js.map +1 -0
- package/dist/core/interceptor.d.ts +4 -0
- package/dist/core/interceptor.js +2 -0
- package/dist/core/interceptor.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.js +71 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/module-resolver.d.ts +6 -0
- package/dist/core/module-resolver.js +67 -0
- package/dist/core/module-resolver.js.map +1 -0
- package/dist/core/plugin.d.ts +12 -0
- package/dist/core/plugin.js +2 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/router.d.ts +38 -0
- package/dist/core/router.js +406 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/scanner.d.ts +7 -0
- package/dist/core/scanner.js +83 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/shutdown-manager.d.ts +15 -0
- package/dist/core/shutdown-manager.js +68 -0
- package/dist/core/shutdown-manager.js.map +1 -0
- package/dist/core/websocket-handler.d.ts +41 -0
- package/dist/core/websocket-handler.js +242 -0
- package/dist/core/websocket-handler.js.map +1 -0
- package/dist/decorators/autowired.d.ts +3 -0
- package/dist/decorators/autowired.js +11 -0
- package/dist/decorators/autowired.js.map +1 -0
- package/dist/decorators/cinnabun-application.d.ts +14 -0
- package/dist/decorators/cinnabun-application.js +17 -0
- package/dist/decorators/cinnabun-application.js.map +1 -0
- package/dist/decorators/lifecycle.d.ts +2 -0
- package/dist/decorators/lifecycle.js +12 -0
- package/dist/decorators/lifecycle.js.map +1 -0
- package/dist/decorators/middleware.d.ts +2 -0
- package/dist/decorators/middleware.js +12 -0
- package/dist/decorators/middleware.js.map +1 -0
- package/dist/decorators/module.d.ts +10 -0
- package/dist/decorators/module.js +13 -0
- package/dist/decorators/module.js.map +1 -0
- package/dist/decorators/on-shutdown.d.ts +1 -0
- package/dist/decorators/on-shutdown.js +10 -0
- package/dist/decorators/on-shutdown.js.map +1 -0
- package/dist/decorators/params.d.ts +6 -0
- package/dist/decorators/params.js +31 -0
- package/dist/decorators/params.js.map +1 -0
- package/dist/decorators/request-mapping.d.ts +7 -0
- package/dist/decorators/request-mapping.js +34 -0
- package/dist/decorators/request-mapping.js.map +1 -0
- package/dist/decorators/response.d.ts +2 -0
- package/dist/decorators/response.js +17 -0
- package/dist/decorators/response.js.map +1 -0
- package/dist/decorators/rest-controller.d.ts +1 -0
- package/dist/decorators/rest-controller.js +19 -0
- package/dist/decorators/rest-controller.js.map +1 -0
- package/dist/decorators/routes.d.ts +5 -0
- package/dist/decorators/routes.js +19 -0
- package/dist/decorators/routes.js.map +1 -0
- package/dist/decorators/service.d.ts +1 -0
- package/dist/decorators/service.js +7 -0
- package/dist/decorators/service.js.map +1 -0
- package/dist/decorators/use-guard.d.ts +2 -0
- package/dist/decorators/use-guard.js +12 -0
- package/dist/decorators/use-guard.js.map +1 -0
- package/dist/decorators/use-interceptor.d.ts +2 -0
- package/dist/decorators/use-interceptor.js +12 -0
- package/dist/decorators/use-interceptor.js.map +1 -0
- package/dist/decorators/validate.d.ts +12 -0
- package/dist/decorators/validate.js +7 -0
- package/dist/decorators/validate.js.map +1 -0
- package/dist/decorators/websocket.d.ts +9 -0
- package/dist/decorators/websocket.js +38 -0
- package/dist/decorators/websocket.js.map +1 -0
- package/dist/decorators/ws-event.d.ts +28 -0
- package/dist/decorators/ws-event.js +37 -0
- package/dist/decorators/ws-event.js.map +1 -0
- package/dist/decorators/ws-gateway.d.ts +18 -0
- package/dist/decorators/ws-gateway.js +24 -0
- package/dist/decorators/ws-gateway.js.map +1 -0
- package/dist/dev/index.d.ts +6 -0
- package/dist/dev/index.js +28 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/exceptions/circular-dependency-error.d.ts +5 -0
- package/dist/exceptions/circular-dependency-error.js +16 -0
- package/dist/exceptions/circular-dependency-error.js.map +1 -0
- package/dist/exceptions/http-exception.d.ts +41 -0
- package/dist/exceptions/http-exception.js +96 -0
- package/dist/exceptions/http-exception.js.map +1 -0
- package/dist/guards/jwt-websocket.guard.d.ts +11 -0
- package/dist/guards/jwt-websocket.guard.js +37 -0
- package/dist/guards/jwt-websocket.guard.js.map +1 -0
- package/dist/guards/websocket-auth.guard.d.ts +16 -0
- package/dist/guards/websocket-auth.guard.js +43 -0
- package/dist/guards/websocket-auth.guard.js.map +1 -0
- package/dist/health/health-check.service.d.ts +45 -0
- package/dist/health/health-check.service.js +95 -0
- package/dist/health/health-check.service.js.map +1 -0
- package/dist/health/health.controller.d.ts +15 -0
- package/dist/health/health.controller.js +63 -0
- package/dist/health/health.controller.js.map +1 -0
- package/dist/health/health.module.d.ts +2 -0
- package/dist/health/health.module.js +20 -0
- package/dist/health/health.module.js.map +1 -0
- package/dist/index.d.ts +74 -11
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/storage.d.ts +171 -0
- package/dist/metadata/storage.js +257 -0
- package/dist/metadata/storage.js.map +1 -0
- package/dist/middleware/compression.middleware.d.ts +32 -0
- package/dist/middleware/compression.middleware.js +113 -0
- package/dist/middleware/compression.middleware.js.map +1 -0
- package/dist/middleware/cors.middleware.d.ts +18 -0
- package/dist/middleware/cors.middleware.js +79 -0
- package/dist/middleware/cors.middleware.js.map +1 -0
- package/dist/middleware/performance-tracker.middleware.d.ts +35 -0
- package/dist/middleware/performance-tracker.middleware.js +79 -0
- package/dist/middleware/performance-tracker.middleware.js.map +1 -0
- package/dist/middleware/request-logger.middleware.d.ts +32 -0
- package/dist/middleware/request-logger.middleware.js +125 -0
- package/dist/middleware/request-logger.middleware.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation/helpers.d.ts +36 -0
- package/dist/validation/helpers.js +27 -0
- package/dist/validation/helpers.js.map +1 -0
- package/dist/websocket/error.d.ts +27 -0
- package/dist/websocket/error.js +38 -0
- package/dist/websocket/error.js.map +1 -0
- package/package.json +38 -5
- package/LICENSE +0 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/decorators/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
export function UseGuard(...guards) {
|
|
3
|
+
return (target, propertyKey) => {
|
|
4
|
+
if (propertyKey !== undefined) {
|
|
5
|
+
metadataStorage.addGuard(target.constructor, guards, propertyKey);
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
metadataStorage.addGuard(target, guards);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=use-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-guard.js","sourceRoot":"","sources":["../../src/decorators/use-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoB,MAAM,wBAAwB,CAAC;AAE3E,MAAM,UAAU,QAAQ,CAAC,GAAG,MAAqB;IAC/C,OAAO,CAAC,MAAW,EAAE,WAA6B,EAAE,EAAE;QACpD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,WAAqB,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
export function UseInterceptor(...interceptors) {
|
|
3
|
+
return (target, propertyKey) => {
|
|
4
|
+
if (propertyKey !== undefined) {
|
|
5
|
+
metadataStorage.addInterceptor(target.constructor, interceptors, propertyKey);
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
metadataStorage.addInterceptor(target, interceptors);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=use-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-interceptor.js","sourceRoot":"","sources":["../../src/decorators/use-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoB,MAAM,wBAAwB,CAAC;AAE3E,MAAM,UAAU,cAAc,CAAC,GAAG,YAA2B;IAC3D,OAAO,CAAC,MAAW,EAAE,WAA6B,EAAE,EAAE;QACpD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,WAAqB,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ValidateOptions {
|
|
2
|
+
body?: {
|
|
3
|
+
parse: (data: unknown) => any;
|
|
4
|
+
};
|
|
5
|
+
query?: {
|
|
6
|
+
parse: (data: unknown) => any;
|
|
7
|
+
};
|
|
8
|
+
params?: {
|
|
9
|
+
parse: (data: unknown) => any;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare function Validate(schema: ValidateOptions): MethodDecorator;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/decorators/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,MAAM,UAAU,QAAQ,CAAC,MAAuB;IAC9C,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,eAAe,CAAC,mBAAmB,CACjC,MAAM,CAAC,WAAW,EAClB,WAAqB,EACrB,MAAM,CACP,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface WebSocketBrokerOptions {
|
|
2
|
+
broker: string[];
|
|
3
|
+
appDestinationPrefixes: string[];
|
|
4
|
+
endpoints: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function EnableWebSocketMessageBroker(options: WebSocketBrokerOptions): ClassDecorator;
|
|
7
|
+
export declare function MessageMapping(destination: string): MethodDecorator;
|
|
8
|
+
export declare function SendTo(topic: string): MethodDecorator;
|
|
9
|
+
export declare function SubscribeMapping(destination: string): MethodDecorator;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
export function EnableWebSocketMessageBroker(options) {
|
|
3
|
+
return (target) => {
|
|
4
|
+
metadataStorage.setWsBrokerMetadata(target, {
|
|
5
|
+
brokerPrefixes: options.broker,
|
|
6
|
+
appDestinationPrefixes: options.appDestinationPrefixes,
|
|
7
|
+
endpoints: options.endpoints,
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function MessageMapping(destination) {
|
|
12
|
+
return (target, propertyKey) => {
|
|
13
|
+
metadataStorage.addMessageMapping({
|
|
14
|
+
target: target.constructor,
|
|
15
|
+
methodKey: propertyKey,
|
|
16
|
+
destination,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function SendTo(topic) {
|
|
21
|
+
return (target, propertyKey) => {
|
|
22
|
+
metadataStorage.addSendTo({
|
|
23
|
+
target: target.constructor,
|
|
24
|
+
methodKey: propertyKey,
|
|
25
|
+
topic,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function SubscribeMapping(destination) {
|
|
30
|
+
return (target, propertyKey) => {
|
|
31
|
+
metadataStorage.addSubscribeMapping({
|
|
32
|
+
target: target.constructor,
|
|
33
|
+
methodKey: propertyKey,
|
|
34
|
+
destination,
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/decorators/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,MAAM,UAAU,4BAA4B,CAC1C,OAA+B;IAE/B,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,eAAe,CAAC,mBAAmB,CAAC,MAAM,EAAE;YAC1C,cAAc,EAAE,OAAO,CAAC,MAAM;YAC9B,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;YACtD,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,eAAe,CAAC,iBAAiB,CAAC;YAChC,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,SAAS,EAAE,WAAqB;YAChC,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,eAAe,CAAC,SAAS,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,SAAS,EAAE,WAAqB;YAChC,KAAK;SACN,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,eAAe,CAAC,mBAAmB,CAAC;YAClC,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,SAAS,EAAE,WAAqB;YAChC,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ZodSchema } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Marks a method as a WebSocket event handler.
|
|
4
|
+
* Can optionally validate incoming data with a Zod schema.
|
|
5
|
+
*
|
|
6
|
+
* @param event - The event name to handle
|
|
7
|
+
* @param schema - Optional Zod schema to validate event data
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { z } from "zod";
|
|
12
|
+
*
|
|
13
|
+
* const MessageSchema = z.object({
|
|
14
|
+
* text: z.string().min(1).max(500),
|
|
15
|
+
* room: z.string(),
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* @WsGateway("/chat")
|
|
19
|
+
* class ChatGateway {
|
|
20
|
+
* @WsEvent("message:send", MessageSchema)
|
|
21
|
+
* async handleMessage(data: z.infer<typeof MessageSchema>, ws: ServerWebSocket) {
|
|
22
|
+
* // data is validated and typed
|
|
23
|
+
* console.log(data.text, data.room);
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function WsEvent(event: string, schema?: ZodSchema): MethodDecorator;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
/**
|
|
3
|
+
* Marks a method as a WebSocket event handler.
|
|
4
|
+
* Can optionally validate incoming data with a Zod schema.
|
|
5
|
+
*
|
|
6
|
+
* @param event - The event name to handle
|
|
7
|
+
* @param schema - Optional Zod schema to validate event data
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { z } from "zod";
|
|
12
|
+
*
|
|
13
|
+
* const MessageSchema = z.object({
|
|
14
|
+
* text: z.string().min(1).max(500),
|
|
15
|
+
* room: z.string(),
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* @WsGateway("/chat")
|
|
19
|
+
* class ChatGateway {
|
|
20
|
+
* @WsEvent("message:send", MessageSchema)
|
|
21
|
+
* async handleMessage(data: z.infer<typeof MessageSchema>, ws: ServerWebSocket) {
|
|
22
|
+
* // data is validated and typed
|
|
23
|
+
* console.log(data.text, data.room);
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function WsEvent(event, schema) {
|
|
29
|
+
return (target, propertyKey) => {
|
|
30
|
+
metadataStorage.addWsEvent(target.constructor, {
|
|
31
|
+
event,
|
|
32
|
+
methodKey: propertyKey,
|
|
33
|
+
schema,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ws-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-event.js","sourceRoot":"","sources":["../../src/decorators/ws-event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,MAAkB;IACvD,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,EAAE;QACnD,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE;YAC7C,KAAK;YACL,SAAS,EAAE,WAAqB;YAChC,MAAM;SACP,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marks a class as a WebSocket gateway.
|
|
3
|
+
* Gateway classes contain event handlers marked with @WsEvent.
|
|
4
|
+
*
|
|
5
|
+
* @param path - Optional WebSocket endpoint path (default: "/")
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* @WsGateway("/chat")
|
|
10
|
+
* class ChatGateway {
|
|
11
|
+
* @WsEvent("message:send")
|
|
12
|
+
* handleMessage(data: any, ws: ServerWebSocket) {
|
|
13
|
+
* // Handle message
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function WsGateway(path?: string): ClassDecorator;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { metadataStorage } from "../metadata/storage.js";
|
|
2
|
+
/**
|
|
3
|
+
* Marks a class as a WebSocket gateway.
|
|
4
|
+
* Gateway classes contain event handlers marked with @WsEvent.
|
|
5
|
+
*
|
|
6
|
+
* @param path - Optional WebSocket endpoint path (default: "/")
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* @WsGateway("/chat")
|
|
11
|
+
* class ChatGateway {
|
|
12
|
+
* @WsEvent("message:send")
|
|
13
|
+
* handleMessage(data: any, ws: ServerWebSocket) {
|
|
14
|
+
* // Handle message
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function WsGateway(path = "/") {
|
|
20
|
+
return (target) => {
|
|
21
|
+
metadataStorage.addWsGateway(target, path);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ws-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-gateway.js","sourceRoot":"","sources":["../../src/decorators/ws-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,GAAG;IAC1C,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,eAAe,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CinnabunApplication } from "../core/app.js";
|
|
2
|
+
/**
|
|
3
|
+
* Development helpers (only available in NODE_ENV=development)
|
|
4
|
+
*/
|
|
5
|
+
export declare function printRoutes(app: CinnabunApplication): void;
|
|
6
|
+
export declare function printProviders(app: CinnabunApplication): void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Development helpers (only available in NODE_ENV=development)
|
|
3
|
+
*/
|
|
4
|
+
export function printRoutes(app) {
|
|
5
|
+
if (process.env.NODE_ENV !== "development") {
|
|
6
|
+
console.warn("printRoutes() is only available in development mode");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const routes = app.getRoutes();
|
|
10
|
+
console.log("\n📍 Registered Routes:\n");
|
|
11
|
+
routes.forEach((route) => {
|
|
12
|
+
console.log(` ${route.method.padEnd(7)} ${route.path}`);
|
|
13
|
+
});
|
|
14
|
+
console.log("");
|
|
15
|
+
}
|
|
16
|
+
export function printProviders(app) {
|
|
17
|
+
if (process.env.NODE_ENV !== "development") {
|
|
18
|
+
console.warn("printProviders() is only available in development mode");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const providers = app.getProviders();
|
|
22
|
+
console.log("\n💉 Registered Providers:\n");
|
|
23
|
+
providers.forEach((provider) => {
|
|
24
|
+
console.log(` • ${provider.name}`);
|
|
25
|
+
});
|
|
26
|
+
console.log("");
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,MAAM,UAAU,WAAW,CAAC,GAAwB;IAClD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAwB;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class CircularDependencyError extends Error {
|
|
2
|
+
cycle;
|
|
3
|
+
constructor(cycle) {
|
|
4
|
+
const names = cycle.map(t => t.name).join(" → ");
|
|
5
|
+
super(`❌ Circular dependency detected:\n\n` +
|
|
6
|
+
` ${names}\n\n` +
|
|
7
|
+
`💡 Possible fixes:\n` +
|
|
8
|
+
` 1. Use @Autowired() for field injection instead of constructor\n` +
|
|
9
|
+
` 2. Extract shared logic into a third service\n` +
|
|
10
|
+
` 3. Use an interface/provider pattern\n` +
|
|
11
|
+
` 4. Review your dependency graph\n`);
|
|
12
|
+
this.cycle = cycle;
|
|
13
|
+
this.name = "CircularDependencyError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=circular-dependency-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circular-dependency-error.js","sourceRoot":"","sources":["../../src/exceptions/circular-dependency-error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAE9B;IADlB,YACkB,KAAoB;QAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,KAAK,CACH,qCAAqC;YACrC,MAAM,KAAK,MAAM;YACjB,sBAAsB;YACtB,qEAAqE;YACrE,mDAAmD;YACnD,2CAA2C;YAC3C,sCAAsC,CACvC,CAAC;QAXc,UAAK,GAAL,KAAK,CAAe;QAYpC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare class HttpException extends Error {
|
|
2
|
+
readonly statusCode: number;
|
|
3
|
+
constructor(statusCode: number, message: string);
|
|
4
|
+
toJSON(): {
|
|
5
|
+
statusCode: number;
|
|
6
|
+
message: string;
|
|
7
|
+
error: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare class BadRequestException extends HttpException {
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
13
|
+
export interface ValidationError {
|
|
14
|
+
field: string;
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class ValidationException extends BadRequestException {
|
|
18
|
+
readonly errors: ValidationError[];
|
|
19
|
+
readonly suggestions?: string[];
|
|
20
|
+
constructor(errors: ValidationError[], suggestions?: string[]);
|
|
21
|
+
/**
|
|
22
|
+
* Create ValidationException from Zod error
|
|
23
|
+
*/
|
|
24
|
+
static fromZodError(error: any): ValidationException;
|
|
25
|
+
toJSON(): any;
|
|
26
|
+
}
|
|
27
|
+
export declare class UnauthorizedException extends HttpException {
|
|
28
|
+
constructor(message?: string);
|
|
29
|
+
}
|
|
30
|
+
export declare class ForbiddenException extends HttpException {
|
|
31
|
+
constructor(message?: string);
|
|
32
|
+
}
|
|
33
|
+
export declare class NotFoundException extends HttpException {
|
|
34
|
+
constructor(resource?: string);
|
|
35
|
+
}
|
|
36
|
+
export declare class ConflictException extends HttpException {
|
|
37
|
+
constructor(message?: string);
|
|
38
|
+
}
|
|
39
|
+
export declare class InternalServerErrorException extends HttpException {
|
|
40
|
+
constructor(message?: string);
|
|
41
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export class HttpException extends Error {
|
|
2
|
+
statusCode;
|
|
3
|
+
constructor(statusCode, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.statusCode = statusCode;
|
|
6
|
+
this.name = "HttpException";
|
|
7
|
+
}
|
|
8
|
+
toJSON() {
|
|
9
|
+
return {
|
|
10
|
+
statusCode: this.statusCode,
|
|
11
|
+
message: this.message,
|
|
12
|
+
error: getHttpStatusText(this.statusCode),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class BadRequestException extends HttpException {
|
|
17
|
+
constructor(message = "Bad Request") {
|
|
18
|
+
super(400, message);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class ValidationException extends BadRequestException {
|
|
22
|
+
errors;
|
|
23
|
+
suggestions;
|
|
24
|
+
constructor(errors, suggestions) {
|
|
25
|
+
super("Validation failed");
|
|
26
|
+
this.errors = errors;
|
|
27
|
+
this.suggestions = suggestions;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create ValidationException from Zod error
|
|
31
|
+
*/
|
|
32
|
+
static fromZodError(error) {
|
|
33
|
+
const errors = [];
|
|
34
|
+
for (const issue of error.issues) {
|
|
35
|
+
const field = issue.path.join(".") || "body";
|
|
36
|
+
errors.push({
|
|
37
|
+
field,
|
|
38
|
+
message: issue.message,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return new ValidationException(errors);
|
|
42
|
+
}
|
|
43
|
+
toJSON() {
|
|
44
|
+
const json = {
|
|
45
|
+
statusCode: this.statusCode,
|
|
46
|
+
message: this.message,
|
|
47
|
+
error: "Bad Request",
|
|
48
|
+
errors: this.errors,
|
|
49
|
+
};
|
|
50
|
+
if (this.suggestions && this.suggestions.length > 0) {
|
|
51
|
+
json.suggestions = this.suggestions;
|
|
52
|
+
}
|
|
53
|
+
return json;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class UnauthorizedException extends HttpException {
|
|
57
|
+
constructor(message = "Unauthorized") {
|
|
58
|
+
super(401, message);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class ForbiddenException extends HttpException {
|
|
62
|
+
constructor(message = "Forbidden") {
|
|
63
|
+
super(403, message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export class NotFoundException extends HttpException {
|
|
67
|
+
constructor(resource) {
|
|
68
|
+
const message = resource
|
|
69
|
+
? `${resource} not found`
|
|
70
|
+
: "The requested resource was not found";
|
|
71
|
+
super(404, message);
|
|
72
|
+
this.name = "NotFoundException";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class ConflictException extends HttpException {
|
|
76
|
+
constructor(message = "Conflict") {
|
|
77
|
+
super(409, message);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export class InternalServerErrorException extends HttpException {
|
|
81
|
+
constructor(message = "Internal Server Error") {
|
|
82
|
+
super(500, message);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function getHttpStatusText(code) {
|
|
86
|
+
const map = {
|
|
87
|
+
400: "Bad Request",
|
|
88
|
+
401: "Unauthorized",
|
|
89
|
+
403: "Forbidden",
|
|
90
|
+
404: "Not Found",
|
|
91
|
+
409: "Conflict",
|
|
92
|
+
500: "Internal Server Error",
|
|
93
|
+
};
|
|
94
|
+
return map[code] ?? "Error";
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=http-exception.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-exception.js","sourceRoot":"","sources":["../../src/exceptions/http-exception.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WebSocketAuthGuard } from "./websocket-auth.guard.js";
|
|
2
|
+
export interface JwtPayload {
|
|
3
|
+
sub: string;
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}
|
|
6
|
+
export declare class JwtWebSocketGuard extends WebSocketAuthGuard {
|
|
7
|
+
private secret;
|
|
8
|
+
private verify;
|
|
9
|
+
constructor(secret: string, verify?: (payload: JwtPayload) => Promise<any>);
|
|
10
|
+
protected verifyToken(token: string): Promise<any>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { WebSocketAuthGuard } from "./websocket-auth.guard.js";
|
|
2
|
+
export class JwtWebSocketGuard extends WebSocketAuthGuard {
|
|
3
|
+
secret;
|
|
4
|
+
verify;
|
|
5
|
+
constructor(secret, verify = async (p) => p) {
|
|
6
|
+
super();
|
|
7
|
+
this.secret = secret;
|
|
8
|
+
this.verify = verify;
|
|
9
|
+
}
|
|
10
|
+
async verifyToken(token) {
|
|
11
|
+
// Simple JWT verification (use a library like jsonwebtoken in production)
|
|
12
|
+
try {
|
|
13
|
+
const [header, payload, signature] = token.split(".");
|
|
14
|
+
if (!header || !payload || !signature) {
|
|
15
|
+
throw new Error("Invalid JWT format");
|
|
16
|
+
}
|
|
17
|
+
// Decode payload
|
|
18
|
+
const decodedPayload = JSON.parse(atob(payload.replace(/-/g, "+").replace(/_/g, "/")));
|
|
19
|
+
// Verify signature (simplified - use proper crypto in production)
|
|
20
|
+
const encoder = new TextEncoder();
|
|
21
|
+
const data = encoder.encode(`${header}.${payload}`);
|
|
22
|
+
const secretKey = encoder.encode(this.secret);
|
|
23
|
+
// In production, use crypto.subtle.verify()
|
|
24
|
+
// For now, just check if signature exists
|
|
25
|
+
if (!signature) {
|
|
26
|
+
throw new Error("Missing signature");
|
|
27
|
+
}
|
|
28
|
+
// Call custom verify function
|
|
29
|
+
const user = await this.verify(decodedPayload);
|
|
30
|
+
return user;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
throw new Error("Invalid token");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=jwt-websocket.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-websocket.guard.js","sourceRoot":"","sources":["../../src/guards/jwt-websocket.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAO/D,MAAM,OAAO,iBAAkB,SAAQ,kBAAkB;IAE7C;IACA;IAFV,YACU,MAAc,EACd,SAAgD,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtE,KAAK,EAAE,CAAC;QAHA,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAwD;IAGxE,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,KAAa;QACvC,0EAA0E;QAC1E,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEtD,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YAED,iBAAiB;YACjB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CACtC,CAAC;YAEhB,kEAAkE;YAClE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE9C,4CAA4C;YAC5C,0CAA0C;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAE/C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Guard } from "../core/guard.js";
|
|
2
|
+
export interface WebSocketAuthContext {
|
|
3
|
+
token?: string;
|
|
4
|
+
user?: any;
|
|
5
|
+
}
|
|
6
|
+
export declare abstract class WebSocketAuthGuard implements Guard {
|
|
7
|
+
/**
|
|
8
|
+
* Extract token from WebSocket upgrade request
|
|
9
|
+
*/
|
|
10
|
+
protected extractToken(req: Request): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Verify the token and return user data
|
|
13
|
+
*/
|
|
14
|
+
protected abstract verifyToken(token: string): Promise<any>;
|
|
15
|
+
canActivate(req: Request): Promise<boolean>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export class WebSocketAuthGuard {
|
|
2
|
+
/**
|
|
3
|
+
* Extract token from WebSocket upgrade request
|
|
4
|
+
*/
|
|
5
|
+
extractToken(req) {
|
|
6
|
+
// Check query params: /ws?token=xxx
|
|
7
|
+
const url = new URL(req.url);
|
|
8
|
+
const queryToken = url.searchParams.get("token");
|
|
9
|
+
if (queryToken)
|
|
10
|
+
return queryToken;
|
|
11
|
+
// Check Authorization header
|
|
12
|
+
const authHeader = req.headers.get("authorization");
|
|
13
|
+
if (authHeader?.startsWith("Bearer ")) {
|
|
14
|
+
return authHeader.substring(7);
|
|
15
|
+
}
|
|
16
|
+
// Check Sec-WebSocket-Protocol header (some clients use this)
|
|
17
|
+
const protocol = req.headers.get("sec-websocket-protocol");
|
|
18
|
+
if (protocol) {
|
|
19
|
+
// Format: "token, <actual-token>"
|
|
20
|
+
const parts = protocol.split(",").map((p) => p.trim());
|
|
21
|
+
if (parts[0] === "token" && parts[1]) {
|
|
22
|
+
return parts[1];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
async canActivate(req) {
|
|
28
|
+
const token = this.extractToken(req);
|
|
29
|
+
if (!token) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const user = await this.verifyToken(token);
|
|
34
|
+
// Attach to request for downstream use
|
|
35
|
+
req.wsAuth = { token, user };
|
|
36
|
+
return !!user;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=websocket-auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-auth.guard.js","sourceRoot":"","sources":["../../src/guards/websocket-auth.guard.ts"],"names":[],"mappings":"AAOA,MAAM,OAAgB,kBAAkB;IACtC;;OAEG;IACO,YAAY,CAAC,GAAY;QACjC,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAElC,6BAA6B;QAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAC3D,IAAI,QAAQ,EAAE,CAAC;YACb,kCAAkC;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,KAAK,CAAC,WAAW,CAAC,GAAY;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAE3C,uCAAuC;YACtC,GAAW,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAEtC,OAAO,CAAC,CAAC,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface HealthCheckResult {
|
|
2
|
+
status: "healthy" | "unhealthy" | "degraded";
|
|
3
|
+
uptime: number;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
version?: string;
|
|
6
|
+
checks: Record<string, {
|
|
7
|
+
status: "pass" | "fail";
|
|
8
|
+
message?: string;
|
|
9
|
+
responseTime?: number;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export type HealthCheck = () => Promise<boolean>;
|
|
13
|
+
export declare class HealthCheckService {
|
|
14
|
+
private startTime;
|
|
15
|
+
private checks;
|
|
16
|
+
private version?;
|
|
17
|
+
constructor();
|
|
18
|
+
setVersion(version: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Register a custom health check
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* healthCheck.register("database", async () => {
|
|
24
|
+
* try {
|
|
25
|
+
* await db.ping();
|
|
26
|
+
* return true;
|
|
27
|
+
* } catch {
|
|
28
|
+
* return false;
|
|
29
|
+
* }
|
|
30
|
+
* });
|
|
31
|
+
*/
|
|
32
|
+
register(name: string, check: HealthCheck): void;
|
|
33
|
+
/**
|
|
34
|
+
* Execute all health checks
|
|
35
|
+
*/
|
|
36
|
+
getHealth(): Promise<HealthCheckResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Get uptime in seconds
|
|
39
|
+
*/
|
|
40
|
+
getUptime(): number;
|
|
41
|
+
/**
|
|
42
|
+
* Clear all registered health checks (useful for testing)
|
|
43
|
+
*/
|
|
44
|
+
clear(): void;
|
|
45
|
+
}
|