@morojs/moro 1.0.0 → 1.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/README.md +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +183 -165
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +104 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// Vercel Edge runtime adapter
|
|
2
|
-
import { BaseRuntimeAdapter } from
|
|
3
|
-
import { HttpRequest, HttpResponse } from
|
|
4
|
-
import { RuntimeHttpResponse } from
|
|
2
|
+
import { BaseRuntimeAdapter } from './base-adapter';
|
|
3
|
+
import { HttpRequest, HttpResponse } from '../../types/http';
|
|
4
|
+
import { RuntimeHttpResponse } from '../../types/runtime';
|
|
5
5
|
|
|
6
6
|
export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
7
|
-
readonly type =
|
|
7
|
+
readonly type = 'vercel-edge' as const;
|
|
8
8
|
|
|
9
9
|
async adaptRequest(request: Request): Promise<HttpRequest> {
|
|
10
10
|
const url = new URL(request.url);
|
|
@@ -12,9 +12,9 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
12
12
|
|
|
13
13
|
// Parse body for POST/PUT/PATCH requests
|
|
14
14
|
let body: any;
|
|
15
|
-
if ([
|
|
16
|
-
const contentType = request.headers.get(
|
|
17
|
-
if (contentType.includes(
|
|
15
|
+
if (['POST', 'PUT', 'PATCH'].includes(request.method)) {
|
|
16
|
+
const contentType = request.headers.get('content-type') || '';
|
|
17
|
+
if (contentType.includes('application/json')) {
|
|
18
18
|
try {
|
|
19
19
|
body = await request.json();
|
|
20
20
|
} catch {
|
|
@@ -40,7 +40,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
40
40
|
headers,
|
|
41
41
|
ip: this.getClientIP(headers),
|
|
42
42
|
params: {},
|
|
43
|
-
requestId:
|
|
43
|
+
requestId: '',
|
|
44
44
|
cookies: {},
|
|
45
45
|
files: {},
|
|
46
46
|
} as Partial<HttpRequest>;
|
|
@@ -48,9 +48,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
48
48
|
return this.enhanceRequest(baseRequest);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
async adaptResponse(
|
|
52
|
-
moroResponse: HttpResponse | RuntimeHttpResponse,
|
|
53
|
-
): Promise<Response> {
|
|
51
|
+
async adaptResponse(moroResponse: HttpResponse | RuntimeHttpResponse): Promise<Response> {
|
|
54
52
|
const runtimeResponse = moroResponse as RuntimeHttpResponse;
|
|
55
53
|
|
|
56
54
|
// Handle different response states
|
|
@@ -59,10 +57,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
59
57
|
const headers = runtimeResponse.headers || {};
|
|
60
58
|
|
|
61
59
|
// If it's a real HttpResponse, we need to extract the data differently
|
|
62
|
-
if (
|
|
63
|
-
"statusCode" in moroResponse &&
|
|
64
|
-
typeof moroResponse.statusCode === "number"
|
|
65
|
-
) {
|
|
60
|
+
if ('statusCode' in moroResponse && typeof moroResponse.statusCode === 'number') {
|
|
66
61
|
status = moroResponse.statusCode;
|
|
67
62
|
}
|
|
68
63
|
|
|
@@ -73,9 +68,9 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
73
68
|
});
|
|
74
69
|
|
|
75
70
|
// Handle different body types
|
|
76
|
-
if (typeof body ===
|
|
71
|
+
if (typeof body === 'object' && body !== null) {
|
|
77
72
|
body = JSON.stringify(body);
|
|
78
|
-
responseHeaders.set(
|
|
73
|
+
responseHeaders.set('Content-Type', 'application/json');
|
|
79
74
|
}
|
|
80
75
|
|
|
81
76
|
return new Response(body, {
|
|
@@ -84,9 +79,7 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
84
79
|
});
|
|
85
80
|
}
|
|
86
81
|
|
|
87
|
-
createServer(
|
|
88
|
-
handler: (req: HttpRequest, res: HttpResponse) => Promise<void>,
|
|
89
|
-
) {
|
|
82
|
+
createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>) {
|
|
90
83
|
// Return a Vercel Edge-compatible handler function
|
|
91
84
|
return async (request: Request) => {
|
|
92
85
|
try {
|
|
@@ -100,13 +93,13 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
100
93
|
return new Response(
|
|
101
94
|
JSON.stringify({
|
|
102
95
|
success: false,
|
|
103
|
-
error:
|
|
104
|
-
message: error instanceof Error ? error.message :
|
|
96
|
+
error: 'Internal server error',
|
|
97
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
105
98
|
}),
|
|
106
99
|
{
|
|
107
100
|
status: 500,
|
|
108
|
-
headers: {
|
|
109
|
-
}
|
|
101
|
+
headers: { 'Content-Type': 'application/json' },
|
|
102
|
+
}
|
|
110
103
|
);
|
|
111
104
|
}
|
|
112
105
|
};
|
|
@@ -116,10 +109,6 @@ export class VercelEdgeAdapter extends BaseRuntimeAdapter {
|
|
|
116
109
|
// listen method is optional in the interface
|
|
117
110
|
|
|
118
111
|
private getClientIP(headers: Record<string, string>): string {
|
|
119
|
-
return (
|
|
120
|
-
headers["x-forwarded-for"]?.split(",")[0]?.trim() ||
|
|
121
|
-
headers["x-real-ip"] ||
|
|
122
|
-
"unknown"
|
|
123
|
-
);
|
|
112
|
+
return headers['x-forwarded-for']?.split(',')[0]?.trim() || headers['x-real-ip'] || 'unknown';
|
|
124
113
|
}
|
|
125
114
|
}
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
export class CircuitBreaker {
|
|
3
3
|
private failures = 0;
|
|
4
4
|
private lastFailTime = 0;
|
|
5
|
-
private state:
|
|
5
|
+
private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
8
|
private options: {
|
|
9
9
|
failureThreshold: number;
|
|
10
10
|
resetTimeout: number;
|
|
11
11
|
monitoringPeriod: number;
|
|
12
|
-
}
|
|
12
|
+
}
|
|
13
13
|
) {}
|
|
14
14
|
|
|
15
15
|
async execute<T>(fn: () => Promise<T>): Promise<T> {
|
|
16
|
-
if (this.state ===
|
|
16
|
+
if (this.state === 'OPEN') {
|
|
17
17
|
if (Date.now() - this.lastFailTime < this.options.resetTimeout) {
|
|
18
|
-
throw new Error(
|
|
18
|
+
throw new Error('Circuit breaker is OPEN');
|
|
19
19
|
}
|
|
20
|
-
this.state =
|
|
20
|
+
this.state = 'HALF_OPEN';
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
try {
|
|
@@ -32,7 +32,7 @@ export class CircuitBreaker {
|
|
|
32
32
|
|
|
33
33
|
private onSuccess() {
|
|
34
34
|
this.failures = 0;
|
|
35
|
-
this.state =
|
|
35
|
+
this.state = 'CLOSED';
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
private onFailure() {
|
|
@@ -40,7 +40,7 @@ export class CircuitBreaker {
|
|
|
40
40
|
this.lastFailTime = Date.now();
|
|
41
41
|
|
|
42
42
|
if (this.failures >= this.options.failureThreshold) {
|
|
43
|
-
this.state =
|
|
43
|
+
this.state = 'OPEN';
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
// Enhanced Functional Dependency Injection Container
|
|
2
|
-
import { EventEmitter } from
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
3
|
|
|
4
4
|
// Service lifecycle states
|
|
5
5
|
export enum ServiceLifecycle {
|
|
6
|
-
UNINITIALIZED =
|
|
7
|
-
INITIALIZING =
|
|
8
|
-
INITIALIZED =
|
|
9
|
-
DISPOSING =
|
|
10
|
-
DISPOSED =
|
|
11
|
-
ERROR =
|
|
6
|
+
UNINITIALIZED = 'uninitialized',
|
|
7
|
+
INITIALIZING = 'initializing',
|
|
8
|
+
INITIALIZED = 'initialized',
|
|
9
|
+
DISPOSING = 'disposing',
|
|
10
|
+
DISPOSED = 'disposed',
|
|
11
|
+
ERROR = 'error',
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
// Service scopes
|
|
15
15
|
export enum ServiceScope {
|
|
16
|
-
SINGLETON =
|
|
17
|
-
TRANSIENT =
|
|
18
|
-
REQUEST =
|
|
19
|
-
MODULE =
|
|
16
|
+
SINGLETON = 'singleton', // One instance per container
|
|
17
|
+
TRANSIENT = 'transient', // New instance every time
|
|
18
|
+
REQUEST = 'request', // One instance per request context
|
|
19
|
+
MODULE = 'module', // One instance per module
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// Service metadata and configuration
|
|
@@ -46,7 +46,7 @@ export interface ServiceDefinition<T = any> {
|
|
|
46
46
|
// Functional factory type
|
|
47
47
|
export type ServiceFactory<T> = (
|
|
48
48
|
dependencies: Record<string, any>,
|
|
49
|
-
context?: ServiceContext
|
|
49
|
+
context?: ServiceContext
|
|
50
50
|
) => T | Promise<T>;
|
|
51
51
|
|
|
52
52
|
// Service interceptor for AOP patterns
|
|
@@ -54,14 +54,11 @@ export type ServiceInterceptor = (
|
|
|
54
54
|
serviceName: string,
|
|
55
55
|
dependencies: Record<string, any>,
|
|
56
56
|
context: ServiceContext,
|
|
57
|
-
next: () => any
|
|
57
|
+
next: () => any
|
|
58
58
|
) => any | Promise<any>;
|
|
59
59
|
|
|
60
60
|
// Service decorator for functional composition
|
|
61
|
-
export type ServiceDecorator<T> = (
|
|
62
|
-
instance: T,
|
|
63
|
-
context: ServiceContext,
|
|
64
|
-
) => T | Promise<T>;
|
|
61
|
+
export type ServiceDecorator<T> = (instance: T, context: ServiceContext) => T | Promise<T>;
|
|
65
62
|
|
|
66
63
|
// Service context for request-scoped services
|
|
67
64
|
export interface ServiceContext {
|
|
@@ -86,9 +83,7 @@ export const withLogging =
|
|
|
86
83
|
<T>(logger: any) =>
|
|
87
84
|
(factory: ServiceFactory<T>): ServiceFactory<T> =>
|
|
88
85
|
(deps, ctx) => {
|
|
89
|
-
logger.debug(
|
|
90
|
-
`Creating service with dependencies: ${Object.keys(deps).join(", ")}`,
|
|
91
|
-
);
|
|
86
|
+
logger.debug(`Creating service with dependencies: ${Object.keys(deps).join(', ')}`);
|
|
92
87
|
const start = Date.now();
|
|
93
88
|
const result = factory(deps, ctx);
|
|
94
89
|
logger.debug(`Service created in ${Date.now() - start}ms`);
|
|
@@ -100,7 +95,7 @@ export const withCaching =
|
|
|
100
95
|
(factory: ServiceFactory<T>): ServiceFactory<T> => {
|
|
101
96
|
const cache = new Map<string, { value: T; expires: number }>();
|
|
102
97
|
return async (deps, ctx) => {
|
|
103
|
-
const key = `${ctx?.requestId ||
|
|
98
|
+
const key = `${ctx?.requestId || 'global'}_${JSON.stringify(deps)}`;
|
|
104
99
|
const cached = cache.get(key);
|
|
105
100
|
if (cached && cached.expires > Date.now()) {
|
|
106
101
|
return cached.value;
|
|
@@ -122,9 +117,7 @@ export const withRetry =
|
|
|
122
117
|
} catch (error) {
|
|
123
118
|
lastError = error as Error;
|
|
124
119
|
if (i < maxRetries) {
|
|
125
|
-
await new Promise((resolve)
|
|
126
|
-
setTimeout(resolve, delay * Math.pow(2, i)),
|
|
127
|
-
);
|
|
120
|
+
await new Promise(resolve => setTimeout(resolve, delay * Math.pow(2, i)));
|
|
128
121
|
}
|
|
129
122
|
}
|
|
130
123
|
}
|
|
@@ -139,10 +132,9 @@ export const withTimeout =
|
|
|
139
132
|
factory(deps, ctx),
|
|
140
133
|
new Promise<never>((_, reject) =>
|
|
141
134
|
setTimeout(
|
|
142
|
-
() =>
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
),
|
|
135
|
+
() => reject(new Error(`Service creation timeout after ${timeoutMs}ms`)),
|
|
136
|
+
timeoutMs
|
|
137
|
+
)
|
|
146
138
|
),
|
|
147
139
|
]);
|
|
148
140
|
};
|
|
@@ -296,9 +288,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
296
288
|
tags: service.metadata.tags,
|
|
297
289
|
lifecycle: instance?.lifecycle || ServiceLifecycle.UNINITIALIZED,
|
|
298
290
|
accessCount: instance?.accessCount || 0,
|
|
299
|
-
lastAccessed: instance?.lastAccessed
|
|
300
|
-
? new Date(instance.lastAccessed).toISOString()
|
|
301
|
-
: null,
|
|
291
|
+
lastAccessed: instance?.lastAccessed ? new Date(instance.lastAccessed).toISOString() : null,
|
|
302
292
|
};
|
|
303
293
|
}
|
|
304
294
|
|
|
@@ -319,7 +309,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
319
309
|
instance.lifecycle = ServiceLifecycle.DISPOSED;
|
|
320
310
|
} catch (error) {
|
|
321
311
|
instance.lifecycle = ServiceLifecycle.ERROR;
|
|
322
|
-
this.emit(
|
|
312
|
+
this.emit('disposeError', { name, error });
|
|
323
313
|
}
|
|
324
314
|
}
|
|
325
315
|
}
|
|
@@ -333,7 +323,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
333
323
|
private async createInstance<T>(
|
|
334
324
|
name: string,
|
|
335
325
|
service: ServiceDefinition<T>,
|
|
336
|
-
context?: ServiceContext
|
|
326
|
+
context?: ServiceContext
|
|
337
327
|
): Promise<ServiceInstance<T>> {
|
|
338
328
|
const instance: ServiceInstance<T> = {
|
|
339
329
|
value: undefined as any,
|
|
@@ -346,28 +336,21 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
346
336
|
|
|
347
337
|
try {
|
|
348
338
|
// Resolve dependencies
|
|
349
|
-
const dependencies = await this.resolveDependencies(
|
|
350
|
-
service.metadata,
|
|
351
|
-
context,
|
|
352
|
-
);
|
|
339
|
+
const dependencies = await this.resolveDependencies(service.metadata, context);
|
|
353
340
|
|
|
354
341
|
// Apply interceptors
|
|
355
342
|
const interceptedFactory = this.applyInterceptors(
|
|
356
343
|
name,
|
|
357
344
|
service.factory,
|
|
358
345
|
dependencies,
|
|
359
|
-
context
|
|
346
|
+
context
|
|
360
347
|
);
|
|
361
348
|
|
|
362
349
|
// Create instance
|
|
363
350
|
instance.value = await interceptedFactory();
|
|
364
351
|
|
|
365
352
|
// Apply decorators
|
|
366
|
-
instance.value = await this.applyDecorators(
|
|
367
|
-
instance.value,
|
|
368
|
-
service.decorators,
|
|
369
|
-
context,
|
|
370
|
-
);
|
|
353
|
+
instance.value = await this.applyDecorators(instance.value, service.decorators, context);
|
|
371
354
|
|
|
372
355
|
// Run initialization lifecycle
|
|
373
356
|
if (service.metadata.lifecycle?.init) {
|
|
@@ -375,10 +358,10 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
375
358
|
}
|
|
376
359
|
|
|
377
360
|
instance.lifecycle = ServiceLifecycle.INITIALIZED;
|
|
378
|
-
this.emit(
|
|
361
|
+
this.emit('serviceCreated', { name, instance });
|
|
379
362
|
} catch (error) {
|
|
380
363
|
instance.lifecycle = ServiceLifecycle.ERROR;
|
|
381
|
-
this.emit(
|
|
364
|
+
this.emit('serviceError', { name, error });
|
|
382
365
|
|
|
383
366
|
// Try fallback if available
|
|
384
367
|
if (service.metadata.fallback) {
|
|
@@ -395,19 +378,16 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
395
378
|
private createInstanceSync<T>(
|
|
396
379
|
name: string,
|
|
397
380
|
service: ServiceDefinition<T>,
|
|
398
|
-
context?: ServiceContext
|
|
381
|
+
context?: ServiceContext
|
|
399
382
|
): T {
|
|
400
383
|
// Simplified sync version - no async dependencies or lifecycle
|
|
401
|
-
const dependencies = this.resolveDependenciesSync(
|
|
402
|
-
service.metadata,
|
|
403
|
-
context,
|
|
404
|
-
);
|
|
384
|
+
const dependencies = this.resolveDependenciesSync(service.metadata, context);
|
|
405
385
|
return service.factory(dependencies, context) as T;
|
|
406
386
|
}
|
|
407
387
|
|
|
408
388
|
private async resolveDependencies(
|
|
409
389
|
metadata: ServiceMetadata,
|
|
410
|
-
context?: ServiceContext
|
|
390
|
+
context?: ServiceContext
|
|
411
391
|
): Promise<Record<string, any>> {
|
|
412
392
|
const dependencies: Record<string, any> = {};
|
|
413
393
|
|
|
@@ -428,7 +408,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
428
408
|
|
|
429
409
|
private resolveDependenciesSync(
|
|
430
410
|
metadata: ServiceMetadata,
|
|
431
|
-
context?: ServiceContext
|
|
411
|
+
context?: ServiceContext
|
|
432
412
|
): Record<string, any> {
|
|
433
413
|
const dependencies: Record<string, any> = {};
|
|
434
414
|
|
|
@@ -451,24 +431,19 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
451
431
|
name: string,
|
|
452
432
|
factory: ServiceFactory<any>,
|
|
453
433
|
dependencies: Record<string, any>,
|
|
454
|
-
context?: ServiceContext
|
|
434
|
+
context?: ServiceContext
|
|
455
435
|
): () => any {
|
|
456
436
|
return [...this.globalInterceptors].reduceRight(
|
|
457
437
|
(next: () => any, interceptor: ServiceInterceptor) => () =>
|
|
458
|
-
interceptor(
|
|
459
|
-
|
|
460
|
-
dependencies,
|
|
461
|
-
context || this.createDefaultContext(),
|
|
462
|
-
next,
|
|
463
|
-
),
|
|
464
|
-
() => factory(dependencies, context),
|
|
438
|
+
interceptor(name, dependencies, context || this.createDefaultContext(), next),
|
|
439
|
+
() => factory(dependencies, context)
|
|
465
440
|
);
|
|
466
441
|
}
|
|
467
442
|
|
|
468
443
|
private async applyDecorators<T>(
|
|
469
444
|
instance: T,
|
|
470
445
|
decorators: ServiceDecorator<T>[],
|
|
471
|
-
context?: ServiceContext
|
|
446
|
+
context?: ServiceContext
|
|
472
447
|
): Promise<T> {
|
|
473
448
|
let result = instance;
|
|
474
449
|
for (const decorator of decorators) {
|
|
@@ -477,16 +452,12 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
477
452
|
return result;
|
|
478
453
|
}
|
|
479
454
|
|
|
480
|
-
private getScopeKey(
|
|
481
|
-
serviceName: string,
|
|
482
|
-
scope: ServiceScope,
|
|
483
|
-
context?: ServiceContext,
|
|
484
|
-
): string {
|
|
455
|
+
private getScopeKey(serviceName: string, scope: ServiceScope, context?: ServiceContext): string {
|
|
485
456
|
switch (scope) {
|
|
486
457
|
case ServiceScope.REQUEST:
|
|
487
|
-
return `${serviceName}:${context?.requestId ||
|
|
458
|
+
return `${serviceName}:${context?.requestId || 'default-request'}`;
|
|
488
459
|
case ServiceScope.MODULE:
|
|
489
|
-
return `${serviceName}:${context?.moduleId ||
|
|
460
|
+
return `${serviceName}:${context?.moduleId || 'default-module'}`;
|
|
490
461
|
default:
|
|
491
462
|
return serviceName; // Each singleton service gets its own key
|
|
492
463
|
}
|
|
@@ -494,11 +465,11 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
494
465
|
|
|
495
466
|
private getInstanceMap(
|
|
496
467
|
scope: ServiceScope,
|
|
497
|
-
context?: ServiceContext
|
|
468
|
+
context?: ServiceContext
|
|
498
469
|
): Map<string, ServiceInstance> {
|
|
499
470
|
switch (scope) {
|
|
500
471
|
case ServiceScope.REQUEST: {
|
|
501
|
-
const requestId = context?.requestId ||
|
|
472
|
+
const requestId = context?.requestId || 'default-request';
|
|
502
473
|
if (!this.requestScopes.has(requestId)) {
|
|
503
474
|
this.requestScopes.set(requestId, new Map());
|
|
504
475
|
}
|
|
@@ -506,7 +477,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
506
477
|
}
|
|
507
478
|
|
|
508
479
|
case ServiceScope.MODULE: {
|
|
509
|
-
const moduleId = context?.moduleId ||
|
|
480
|
+
const moduleId = context?.moduleId || 'default-module';
|
|
510
481
|
if (!this.moduleScopes.has(moduleId)) {
|
|
511
482
|
this.moduleScopes.set(moduleId, new Map());
|
|
512
483
|
}
|
|
@@ -518,10 +489,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
518
489
|
}
|
|
519
490
|
}
|
|
520
491
|
|
|
521
|
-
private shouldRecreate(
|
|
522
|
-
instance: ServiceInstance,
|
|
523
|
-
metadata: ServiceMetadata,
|
|
524
|
-
): boolean {
|
|
492
|
+
private shouldRecreate(instance: ServiceInstance, metadata: ServiceMetadata): boolean {
|
|
525
493
|
return (
|
|
526
494
|
metadata.scope === ServiceScope.TRANSIENT ||
|
|
527
495
|
instance.lifecycle === ServiceLifecycle.ERROR ||
|
|
@@ -545,7 +513,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
545
513
|
|
|
546
514
|
for (const [requestId, scope] of this.requestScopes) {
|
|
547
515
|
const hasRecentActivity = Array.from(scope.values()).some(
|
|
548
|
-
|
|
516
|
+
instance => now - instance.lastAccessed < timeout
|
|
549
517
|
);
|
|
550
518
|
|
|
551
519
|
if (!hasRecentActivity) {
|
|
@@ -553,7 +521,7 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
553
521
|
}
|
|
554
522
|
}
|
|
555
523
|
},
|
|
556
|
-
5 * 60 * 1000
|
|
524
|
+
5 * 60 * 1000
|
|
557
525
|
); // Check every 5 minutes
|
|
558
526
|
|
|
559
527
|
// Unref the interval so it doesn't keep the process alive during testing
|
|
@@ -573,13 +541,13 @@ export class FunctionalContainer extends EventEmitter {
|
|
|
573
541
|
this.instances.clear();
|
|
574
542
|
this.services.clear();
|
|
575
543
|
|
|
576
|
-
this.emit(
|
|
544
|
+
this.emit('containerDestroyed');
|
|
577
545
|
}
|
|
578
546
|
|
|
579
547
|
// Internal registration method
|
|
580
548
|
_registerService<T>(name: string, definition: ServiceDefinition<T>): this {
|
|
581
549
|
this.services.set(name, definition);
|
|
582
|
-
this.emit(
|
|
550
|
+
this.emit('serviceRegistered', { name, metadata: definition.metadata });
|
|
583
551
|
return this;
|
|
584
552
|
}
|
|
585
553
|
|
|
@@ -603,7 +571,7 @@ export class ServiceRegistrationBuilder<T> {
|
|
|
603
571
|
|
|
604
572
|
constructor(
|
|
605
573
|
private container: FunctionalContainer,
|
|
606
|
-
private name: string
|
|
574
|
+
private name: string
|
|
607
575
|
) {}
|
|
608
576
|
|
|
609
577
|
// Scope configuration
|
|
@@ -629,10 +597,7 @@ export class ServiceRegistrationBuilder<T> {
|
|
|
629
597
|
|
|
630
598
|
// Dependencies
|
|
631
599
|
dependsOn(...deps: string[]): this {
|
|
632
|
-
this.metadata.dependencies = [
|
|
633
|
-
...(this.metadata.dependencies || []),
|
|
634
|
-
...deps,
|
|
635
|
-
];
|
|
600
|
+
this.metadata.dependencies = [...(this.metadata.dependencies || []), ...deps];
|
|
636
601
|
return this;
|
|
637
602
|
}
|
|
638
603
|
|
|
@@ -685,11 +650,9 @@ export class ServiceRegistrationBuilder<T> {
|
|
|
685
650
|
return this;
|
|
686
651
|
}
|
|
687
652
|
|
|
688
|
-
compose(
|
|
689
|
-
...compositionFns: Array<(factory: ServiceFactory<T>) => ServiceFactory<T>>
|
|
690
|
-
): this {
|
|
653
|
+
compose(...compositionFns: Array<(factory: ServiceFactory<T>) => ServiceFactory<T>>): this {
|
|
691
654
|
if (!this._factory) {
|
|
692
|
-
throw new Error(
|
|
655
|
+
throw new Error('Factory must be set before composition');
|
|
693
656
|
}
|
|
694
657
|
|
|
695
658
|
this._factory = compositionFns.reduce((acc, fn) => fn(acc), this._factory);
|
|
@@ -741,7 +704,7 @@ export class Container {
|
|
|
741
704
|
this.functionalContainer
|
|
742
705
|
.register<T>(name)
|
|
743
706
|
.factory(() => factory())
|
|
744
|
-
[singleton ?
|
|
707
|
+
[singleton ? 'singleton' : 'transient']()
|
|
745
708
|
.build();
|
|
746
709
|
}
|
|
747
710
|
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
// Hook System for Moro
|
|
2
|
-
import { EventEmitter } from
|
|
3
|
-
import { HookFunction, HookContext, MoroMiddleware } from
|
|
4
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { HookFunction, HookContext, MoroMiddleware } from '../../types/hooks';
|
|
4
|
+
import { createFrameworkLogger } from '../logger';
|
|
5
5
|
|
|
6
6
|
export const HOOK_EVENTS = {
|
|
7
|
-
BEFORE_REQUEST:
|
|
8
|
-
AFTER_REQUEST:
|
|
9
|
-
BEFORE_RESPONSE:
|
|
10
|
-
AFTER_RESPONSE:
|
|
11
|
-
ERROR:
|
|
7
|
+
BEFORE_REQUEST: 'before:request',
|
|
8
|
+
AFTER_REQUEST: 'after:request',
|
|
9
|
+
BEFORE_RESPONSE: 'before:response',
|
|
10
|
+
AFTER_RESPONSE: 'after:response',
|
|
11
|
+
ERROR: 'error',
|
|
12
12
|
} as const;
|
|
13
13
|
|
|
14
14
|
export class HookManager extends EventEmitter {
|
|
15
15
|
private hooks = new Map<string, HookFunction[]>();
|
|
16
16
|
private beforeHooks = new Map<string, HookFunction[]>();
|
|
17
17
|
private afterHooks = new Map<string, HookFunction[]>();
|
|
18
|
-
private logger = createFrameworkLogger(
|
|
18
|
+
private logger = createFrameworkLogger('Hooks');
|
|
19
19
|
|
|
20
20
|
constructor() {
|
|
21
21
|
super();
|
|
22
22
|
// Initialize hook arrays
|
|
23
|
-
Object.values(HOOK_EVENTS).forEach(
|
|
23
|
+
Object.values(HOOK_EVENTS).forEach(event => {
|
|
24
24
|
this.hooks.set(event, []);
|
|
25
25
|
this.beforeHooks.set(event, []);
|
|
26
26
|
this.afterHooks.set(event, []);
|
|
@@ -55,10 +55,7 @@ export class HookManager extends EventEmitter {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// Execute hooks for an event
|
|
58
|
-
async execute(
|
|
59
|
-
event: string,
|
|
60
|
-
context: HookContext = {},
|
|
61
|
-
): Promise<HookContext> {
|
|
58
|
+
async execute(event: string, context: HookContext = {}): Promise<HookContext> {
|
|
62
59
|
// Execute before hooks
|
|
63
60
|
const beforeHooks = this.beforeHooks.get(event) || [];
|
|
64
61
|
for (const hook of beforeHooks) {
|
|
@@ -84,16 +81,13 @@ export class HookManager extends EventEmitter {
|
|
|
84
81
|
}
|
|
85
82
|
|
|
86
83
|
// Execute a single hook with error handling
|
|
87
|
-
private async executeHook(
|
|
88
|
-
hook: HookFunction,
|
|
89
|
-
context: HookContext,
|
|
90
|
-
): Promise<void> {
|
|
84
|
+
private async executeHook(hook: HookFunction, context: HookContext): Promise<void> {
|
|
91
85
|
try {
|
|
92
86
|
await hook(context);
|
|
93
87
|
} catch (error) {
|
|
94
|
-
this.logger.error(
|
|
88
|
+
this.logger.error('Hook execution error', 'HookExecution', {
|
|
95
89
|
error: error instanceof Error ? error.message : String(error),
|
|
96
|
-
context: context.request?.method ||
|
|
90
|
+
context: context.request?.method || 'unknown',
|
|
97
91
|
});
|
|
98
92
|
throw error;
|
|
99
93
|
}
|
|
@@ -106,7 +100,7 @@ export class HookManager extends EventEmitter {
|
|
|
106
100
|
this.beforeHooks.delete(event);
|
|
107
101
|
this.afterHooks.delete(event);
|
|
108
102
|
} else {
|
|
109
|
-
[this.hooks, this.beforeHooks, this.afterHooks].forEach(
|
|
103
|
+
[this.hooks, this.beforeHooks, this.afterHooks].forEach(map => {
|
|
110
104
|
const hooks = map.get(event);
|
|
111
105
|
if (hooks) {
|
|
112
106
|
const index = hooks.indexOf(fn);
|
|
@@ -136,7 +130,7 @@ export class HookManager extends EventEmitter {
|
|
|
136
130
|
...this.afterHooks.keys(),
|
|
137
131
|
]);
|
|
138
132
|
|
|
139
|
-
allEvents.forEach(
|
|
133
|
+
allEvents.forEach(event => {
|
|
140
134
|
allHooks[event] = this.getHooks(event);
|
|
141
135
|
});
|
|
142
136
|
|
|
@@ -145,4 +139,4 @@ export class HookManager extends EventEmitter {
|
|
|
145
139
|
}
|
|
146
140
|
|
|
147
141
|
// Built-in middleware - now organized in individual files
|
|
148
|
-
export { simpleMiddleware as middleware } from
|
|
142
|
+
export { simpleMiddleware as middleware } from '../middleware/index';
|
|
@@ -8,9 +8,9 @@ export {
|
|
|
8
8
|
withCaching,
|
|
9
9
|
withRetry,
|
|
10
10
|
withTimeout,
|
|
11
|
-
} from
|
|
12
|
-
export { CircuitBreaker } from
|
|
13
|
-
export { HookManager, HOOK_EVENTS } from
|
|
11
|
+
} from './container';
|
|
12
|
+
export { CircuitBreaker } from './circuit-breaker';
|
|
13
|
+
export { HookManager, HOOK_EVENTS } from './hooks';
|
|
14
14
|
|
|
15
15
|
// Re-export middleware from hooks
|
|
16
|
-
export { middleware } from
|
|
16
|
+
export { middleware } from './hooks';
|