@morojs/moro 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +31 -30
- package/dist/index.js +28 -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 +180 -164
- 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 +58 -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,16 +1,16 @@
|
|
|
1
1
|
// Session Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
4
|
-
import { CacheAdapter } from
|
|
5
|
-
import { MemoryCacheAdapter } from
|
|
6
|
-
import { RedisCacheAdapter } from
|
|
7
|
-
import { FileCacheAdapter } from
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
|
+
import { CacheAdapter } from '../../../types/cache';
|
|
5
|
+
import { MemoryCacheAdapter } from './adapters/cache/memory';
|
|
6
|
+
import { RedisCacheAdapter } from './adapters/cache/redis';
|
|
7
|
+
import { FileCacheAdapter } from './adapters/cache/file';
|
|
8
8
|
|
|
9
|
-
const logger = createFrameworkLogger(
|
|
9
|
+
const logger = createFrameworkLogger('SessionMiddleware');
|
|
10
10
|
|
|
11
11
|
export interface SessionOptions {
|
|
12
12
|
// Session store configuration
|
|
13
|
-
store?:
|
|
13
|
+
store?: 'memory' | 'redis' | 'file' | CacheAdapter;
|
|
14
14
|
storeOptions?: {
|
|
15
15
|
// Redis options
|
|
16
16
|
host?: string;
|
|
@@ -37,14 +37,14 @@ export interface SessionOptions {
|
|
|
37
37
|
expires?: Date; // Absolute expiry
|
|
38
38
|
httpOnly?: boolean; // Prevent XSS access
|
|
39
39
|
secure?: boolean; // HTTPS only
|
|
40
|
-
sameSite?:
|
|
40
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
41
41
|
domain?: string;
|
|
42
42
|
path?: string;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
// Security
|
|
46
46
|
proxy?: boolean; // Trust proxy for secure cookies
|
|
47
|
-
unset?:
|
|
47
|
+
unset?: 'destroy' | 'keep'; // What to do when session is unset
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export interface SessionData {
|
|
@@ -66,12 +66,7 @@ class Session {
|
|
|
66
66
|
private isNew: boolean = false;
|
|
67
67
|
private isModified: boolean = false;
|
|
68
68
|
|
|
69
|
-
constructor(
|
|
70
|
-
id: string,
|
|
71
|
-
store: CacheAdapter,
|
|
72
|
-
options: SessionOptions,
|
|
73
|
-
isNew: boolean = false,
|
|
74
|
-
) {
|
|
69
|
+
constructor(id: string, store: CacheAdapter, options: SessionOptions, isNew: boolean = false) {
|
|
75
70
|
this.id = id;
|
|
76
71
|
this.store = store;
|
|
77
72
|
this.options = options;
|
|
@@ -84,7 +79,7 @@ class Session {
|
|
|
84
79
|
store: CacheAdapter,
|
|
85
80
|
options: SessionOptions,
|
|
86
81
|
data: SessionData = {},
|
|
87
|
-
isNew: boolean = false
|
|
82
|
+
isNew: boolean = false
|
|
88
83
|
): Session {
|
|
89
84
|
const session = new Session(id, store, options, isNew);
|
|
90
85
|
session.data = data;
|
|
@@ -130,7 +125,7 @@ class Session {
|
|
|
130
125
|
await this.store.set(this.id, this.data, ttl);
|
|
131
126
|
this.isModified = false;
|
|
132
127
|
this.isNew = false;
|
|
133
|
-
logger.debug(`Session saved: ${this.id}`,
|
|
128
|
+
logger.debug(`Session saved: ${this.id}`, 'SessionSave');
|
|
134
129
|
}
|
|
135
130
|
}
|
|
136
131
|
|
|
@@ -138,7 +133,7 @@ class Session {
|
|
|
138
133
|
await this.store.del(this.id);
|
|
139
134
|
this.data = {};
|
|
140
135
|
this.isModified = false;
|
|
141
|
-
logger.debug(`Session destroyed: ${this.id}`,
|
|
136
|
+
logger.debug(`Session destroyed: ${this.id}`, 'SessionDestroy');
|
|
142
137
|
}
|
|
143
138
|
|
|
144
139
|
async regenerate(): Promise<string> {
|
|
@@ -146,7 +141,7 @@ class Session {
|
|
|
146
141
|
this.id = this.generateId();
|
|
147
142
|
this.isNew = true;
|
|
148
143
|
this.isModified = true;
|
|
149
|
-
logger.debug(`Session regenerated: ${this.id}`,
|
|
144
|
+
logger.debug(`Session regenerated: ${this.id}`, 'SessionRegenerate');
|
|
150
145
|
return this.id;
|
|
151
146
|
}
|
|
152
147
|
|
|
@@ -162,8 +157,8 @@ class Session {
|
|
|
162
157
|
return this.options.genid();
|
|
163
158
|
}
|
|
164
159
|
|
|
165
|
-
const crypto = require(
|
|
166
|
-
return crypto.randomBytes(24).toString(
|
|
160
|
+
const crypto = require('crypto');
|
|
161
|
+
return crypto.randomBytes(24).toString('hex');
|
|
167
162
|
}
|
|
168
163
|
|
|
169
164
|
get sessionID(): string {
|
|
@@ -172,23 +167,23 @@ class Session {
|
|
|
172
167
|
}
|
|
173
168
|
|
|
174
169
|
export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
175
|
-
name:
|
|
176
|
-
version:
|
|
170
|
+
name: 'session',
|
|
171
|
+
version: '1.0.0',
|
|
177
172
|
metadata: {
|
|
178
|
-
name:
|
|
179
|
-
version:
|
|
180
|
-
description:
|
|
181
|
-
author:
|
|
173
|
+
name: 'session',
|
|
174
|
+
version: '1.0.0',
|
|
175
|
+
description: 'Session management middleware with multiple store adapters',
|
|
176
|
+
author: 'MoroJS Team',
|
|
182
177
|
},
|
|
183
178
|
|
|
184
179
|
install: async (hooks: any, middlewareOptions: any = {}) => {
|
|
185
|
-
logger.debug(
|
|
180
|
+
logger.debug('Installing session middleware', 'Installation');
|
|
186
181
|
|
|
187
182
|
// Merge options
|
|
188
183
|
const config: SessionOptions = {
|
|
189
|
-
store:
|
|
190
|
-
name:
|
|
191
|
-
secret:
|
|
184
|
+
store: 'memory',
|
|
185
|
+
name: 'connect.sid',
|
|
186
|
+
secret: 'moro-session-secret',
|
|
192
187
|
rolling: false,
|
|
193
188
|
resave: false,
|
|
194
189
|
saveUninitialized: false,
|
|
@@ -196,10 +191,10 @@ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
|
196
191
|
maxAge: 24 * 60 * 60 * 1000, // 24 hours
|
|
197
192
|
httpOnly: true,
|
|
198
193
|
secure: false,
|
|
199
|
-
sameSite:
|
|
200
|
-
path:
|
|
194
|
+
sameSite: 'lax',
|
|
195
|
+
path: '/',
|
|
201
196
|
},
|
|
202
|
-
unset:
|
|
197
|
+
unset: 'keep',
|
|
203
198
|
...options,
|
|
204
199
|
...middlewareOptions,
|
|
205
200
|
};
|
|
@@ -207,20 +202,20 @@ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
|
207
202
|
// Initialize store
|
|
208
203
|
let store: CacheAdapter;
|
|
209
204
|
|
|
210
|
-
if (typeof config.store ===
|
|
205
|
+
if (typeof config.store === 'string') {
|
|
211
206
|
switch (config.store) {
|
|
212
|
-
case
|
|
207
|
+
case 'redis':
|
|
213
208
|
store = new RedisCacheAdapter({
|
|
214
|
-
keyPrefix:
|
|
209
|
+
keyPrefix: 'sess:',
|
|
215
210
|
...config.storeOptions,
|
|
216
211
|
});
|
|
217
212
|
break;
|
|
218
|
-
case
|
|
213
|
+
case 'file':
|
|
219
214
|
store = new FileCacheAdapter({
|
|
220
|
-
cacheDir: config.storeOptions?.path ||
|
|
215
|
+
cacheDir: config.storeOptions?.path || './sessions',
|
|
221
216
|
});
|
|
222
217
|
break;
|
|
223
|
-
case
|
|
218
|
+
case 'memory':
|
|
224
219
|
default:
|
|
225
220
|
store = new MemoryCacheAdapter();
|
|
226
221
|
break;
|
|
@@ -234,11 +229,11 @@ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
|
234
229
|
if (config.genid) {
|
|
235
230
|
return config.genid();
|
|
236
231
|
}
|
|
237
|
-
const crypto = require(
|
|
238
|
-
return crypto.randomBytes(24).toString(
|
|
232
|
+
const crypto = require('crypto');
|
|
233
|
+
return crypto.randomBytes(24).toString('hex');
|
|
239
234
|
};
|
|
240
235
|
|
|
241
|
-
hooks.before(
|
|
236
|
+
hooks.before('request', async (context: HookContext) => {
|
|
242
237
|
const req = context.request as any;
|
|
243
238
|
const res = context.response as any;
|
|
244
239
|
|
|
@@ -250,13 +245,9 @@ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
|
250
245
|
if (sessionId) {
|
|
251
246
|
try {
|
|
252
247
|
sessionData = (await store.get(sessionId)) || {};
|
|
253
|
-
logger.debug(`Session loaded: ${sessionId}`,
|
|
248
|
+
logger.debug(`Session loaded: ${sessionId}`, 'SessionLoad');
|
|
254
249
|
} catch (error) {
|
|
255
|
-
logger.warn(
|
|
256
|
-
`Failed to load session: ${sessionId}`,
|
|
257
|
-
"SessionLoadError",
|
|
258
|
-
{ error },
|
|
259
|
-
);
|
|
250
|
+
logger.warn(`Failed to load session: ${sessionId}`, 'SessionLoadError', { error });
|
|
260
251
|
sessionId = generateSessionId();
|
|
261
252
|
isNew = true;
|
|
262
253
|
}
|
|
@@ -266,46 +257,32 @@ export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
|
266
257
|
}
|
|
267
258
|
|
|
268
259
|
// Create session object
|
|
269
|
-
req.session = Session.create(
|
|
270
|
-
sessionId,
|
|
271
|
-
store,
|
|
272
|
-
config,
|
|
273
|
-
sessionData,
|
|
274
|
-
isNew,
|
|
275
|
-
);
|
|
260
|
+
req.session = Session.create(sessionId, store, config, sessionData, isNew);
|
|
276
261
|
|
|
277
262
|
// Set session cookie
|
|
278
263
|
if (isNew || config.rolling) {
|
|
279
264
|
res.cookie(config.name!, sessionId, {
|
|
280
265
|
...config.cookie,
|
|
281
266
|
secure:
|
|
282
|
-
config.cookie?.secure ||
|
|
283
|
-
(config.proxy && req.headers["x-forwarded-proto"] === "https"),
|
|
267
|
+
config.cookie?.secure || (config.proxy && req.headers['x-forwarded-proto'] === 'https'),
|
|
284
268
|
});
|
|
285
269
|
}
|
|
286
270
|
});
|
|
287
271
|
|
|
288
|
-
hooks.after(
|
|
272
|
+
hooks.after('response', async (context: HookContext) => {
|
|
289
273
|
const req = context.request as any;
|
|
290
274
|
|
|
291
275
|
if (req.session) {
|
|
292
276
|
try {
|
|
293
|
-
if (
|
|
294
|
-
config.saveUninitialized ||
|
|
295
|
-
!req.session.isNew ||
|
|
296
|
-
req.session.isModified
|
|
297
|
-
) {
|
|
277
|
+
if (config.saveUninitialized || !req.session.isNew || req.session.isModified) {
|
|
298
278
|
await req.session.save();
|
|
299
279
|
}
|
|
300
280
|
} catch (error) {
|
|
301
|
-
logger.error(
|
|
281
|
+
logger.error('Failed to save session', 'SessionSaveError', { error });
|
|
302
282
|
}
|
|
303
283
|
}
|
|
304
284
|
});
|
|
305
285
|
|
|
306
|
-
logger.info(
|
|
307
|
-
`Session middleware installed with ${config.store} store`,
|
|
308
|
-
"Installation",
|
|
309
|
-
);
|
|
286
|
+
logger.info(`Session middleware installed with ${config.store} store`, 'Installation');
|
|
310
287
|
},
|
|
311
288
|
});
|
|
@@ -1,58 +1,53 @@
|
|
|
1
1
|
// Server-Sent Events Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('SSEMiddleware');
|
|
6
6
|
|
|
7
7
|
export const sse = (
|
|
8
8
|
options: {
|
|
9
9
|
heartbeat?: number;
|
|
10
10
|
retry?: number;
|
|
11
11
|
cors?: boolean;
|
|
12
|
-
} = {}
|
|
12
|
+
} = {}
|
|
13
13
|
): MiddlewareInterface => ({
|
|
14
|
-
name:
|
|
15
|
-
version:
|
|
14
|
+
name: 'sse',
|
|
15
|
+
version: '1.0.0',
|
|
16
16
|
metadata: {
|
|
17
|
-
name:
|
|
18
|
-
version:
|
|
19
|
-
description:
|
|
20
|
-
|
|
21
|
-
author: "MoroJS Team",
|
|
17
|
+
name: 'sse',
|
|
18
|
+
version: '1.0.0',
|
|
19
|
+
description: 'Server-Sent Events middleware with heartbeat and retry support',
|
|
20
|
+
author: 'MoroJS Team',
|
|
22
21
|
},
|
|
23
22
|
|
|
24
23
|
install: async (hooks: any, middlewareOptions: any = {}) => {
|
|
25
|
-
logger.debug(
|
|
24
|
+
logger.debug('Installing SSE middleware', 'Installation');
|
|
26
25
|
|
|
27
|
-
hooks.before(
|
|
26
|
+
hooks.before('request', async (context: HookContext) => {
|
|
28
27
|
const req = context.request as any;
|
|
29
28
|
const res = context.response as any;
|
|
30
29
|
|
|
31
30
|
// Only handle SSE requests
|
|
32
|
-
if (!req.headers.accept?.includes(
|
|
31
|
+
if (!req.headers.accept?.includes('text/event-stream')) {
|
|
33
32
|
return;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
logger.debug(
|
|
35
|
+
logger.debug('Setting up SSE connection', 'SSESetup');
|
|
37
36
|
|
|
38
37
|
// Set SSE headers
|
|
39
38
|
res.writeHead(200, {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
Connection:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
? "Cache-Control"
|
|
46
|
-
: undefined,
|
|
39
|
+
'Content-Type': 'text/event-stream',
|
|
40
|
+
'Cache-Control': 'no-cache',
|
|
41
|
+
Connection: 'keep-alive',
|
|
42
|
+
'Access-Control-Allow-Origin': options.cors ? '*' : undefined,
|
|
43
|
+
'Access-Control-Allow-Headers': options.cors ? 'Cache-Control' : undefined,
|
|
47
44
|
});
|
|
48
45
|
|
|
49
46
|
// Add SSE methods to response
|
|
50
47
|
res.sendEvent = (data: any, event?: string, id?: string) => {
|
|
51
48
|
if (id) res.write(`id: ${id}\n`);
|
|
52
49
|
if (event) res.write(`event: ${event}\n`);
|
|
53
|
-
res.write(
|
|
54
|
-
`data: ${typeof data === "string" ? data : JSON.stringify(data)}\n\n`,
|
|
55
|
-
);
|
|
50
|
+
res.write(`data: ${typeof data === 'string' ? data : JSON.stringify(data)}\n\n`);
|
|
56
51
|
};
|
|
57
52
|
|
|
58
53
|
res.sendComment = (comment: string) => {
|
|
@@ -67,7 +62,7 @@ export const sse = (
|
|
|
67
62
|
let heartbeatInterval: NodeJS.Timeout | null = null;
|
|
68
63
|
if (options.heartbeat) {
|
|
69
64
|
heartbeatInterval = setInterval(() => {
|
|
70
|
-
res.sendComment(
|
|
65
|
+
res.sendComment('heartbeat');
|
|
71
66
|
}, options.heartbeat);
|
|
72
67
|
}
|
|
73
68
|
|
|
@@ -77,11 +72,11 @@ export const sse = (
|
|
|
77
72
|
}
|
|
78
73
|
|
|
79
74
|
// Clean up on close
|
|
80
|
-
req.on(
|
|
75
|
+
req.on('close', () => {
|
|
81
76
|
if (heartbeatInterval) {
|
|
82
77
|
clearInterval(heartbeatInterval);
|
|
83
78
|
}
|
|
84
|
-
logger.debug(
|
|
79
|
+
logger.debug('SSE connection closed', 'SSECleanup');
|
|
85
80
|
});
|
|
86
81
|
|
|
87
82
|
// Mark that this middleware handled the request
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
// Validation Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { MiddlewareInterface, HookContext } from '../../../types/hooks';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
|
-
const logger = createFrameworkLogger(
|
|
5
|
+
const logger = createFrameworkLogger('ValidationMiddleware');
|
|
6
6
|
|
|
7
7
|
export const validation = (): MiddlewareInterface => ({
|
|
8
|
-
name:
|
|
9
|
-
version:
|
|
8
|
+
name: 'validation',
|
|
9
|
+
version: '1.0.0',
|
|
10
10
|
metadata: {
|
|
11
|
-
name:
|
|
12
|
-
version:
|
|
13
|
-
description:
|
|
14
|
-
author:
|
|
11
|
+
name: 'validation',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
description: 'Request validation middleware with content type checking',
|
|
14
|
+
author: 'MoroJS Team',
|
|
15
15
|
},
|
|
16
16
|
|
|
17
17
|
install: async (hooks: any, options: any = {}) => {
|
|
18
|
-
logger.debug(
|
|
18
|
+
logger.debug('Installing validation middleware', 'Installation');
|
|
19
19
|
|
|
20
|
-
hooks.before(
|
|
20
|
+
hooks.before('request', async (context: HookContext) => {
|
|
21
21
|
const request = context.request as any;
|
|
22
22
|
|
|
23
23
|
// Basic content type validation
|
|
24
|
-
if (request.method ===
|
|
25
|
-
const contentType = request.headers[
|
|
26
|
-
if (contentType && contentType.includes(
|
|
27
|
-
logger.debug(
|
|
24
|
+
if (request.method === 'POST' || request.method === 'PUT') {
|
|
25
|
+
const contentType = request.headers['content-type'];
|
|
26
|
+
if (contentType && contentType.includes('application/json')) {
|
|
27
|
+
logger.debug('Validation: JSON content type verified', 'ContentType');
|
|
28
28
|
// Additional validation logic would go here
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
// Middleware System for Moro
|
|
2
|
-
import { EventEmitter } from
|
|
3
|
-
import { HookManager } from
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { HookManager } from '../utilities';
|
|
4
4
|
import {
|
|
5
5
|
MiddlewareMetadata,
|
|
6
6
|
MiddlewareContext,
|
|
7
7
|
MiddlewareInterface,
|
|
8
8
|
SimpleMiddlewareFunction,
|
|
9
9
|
MoroMiddleware,
|
|
10
|
-
} from
|
|
11
|
-
import { createFrameworkLogger } from
|
|
10
|
+
} from '../../types/hooks';
|
|
11
|
+
import { createFrameworkLogger } from '../logger';
|
|
12
12
|
|
|
13
13
|
// Export types needed by built-in middleware
|
|
14
|
-
export type { MiddlewareInterface, MoroMiddleware } from
|
|
14
|
+
export type { MiddlewareInterface, MoroMiddleware } from '../../types/hooks';
|
|
15
15
|
|
|
16
16
|
export class MiddlewareManager extends EventEmitter {
|
|
17
17
|
private middleware = new Map<string, MiddlewareInterface>();
|
|
18
18
|
private simpleMiddleware = new Map<string, SimpleMiddlewareFunction>();
|
|
19
19
|
private hooks: HookManager;
|
|
20
|
-
private logger = createFrameworkLogger(
|
|
20
|
+
private logger = createFrameworkLogger('Middleware');
|
|
21
21
|
|
|
22
22
|
constructor() {
|
|
23
23
|
super();
|
|
@@ -31,34 +31,25 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
this.middleware.set(name, middleware);
|
|
34
|
-
this.logger.debug(`Registered middleware: ${name}`,
|
|
35
|
-
this.emit(
|
|
34
|
+
this.logger.debug(`Registered middleware: ${name}`, 'Registration');
|
|
35
|
+
this.emit('registered', { name, middleware });
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// Install simple function-style middleware
|
|
39
|
-
install(
|
|
40
|
-
middleware
|
|
41
|
-
options: any = {},
|
|
42
|
-
): void {
|
|
43
|
-
if (typeof middleware === "function") {
|
|
39
|
+
install(middleware: SimpleMiddlewareFunction | MiddlewareInterface, options: any = {}): void {
|
|
40
|
+
if (typeof middleware === 'function') {
|
|
44
41
|
// Simple function-style middleware
|
|
45
|
-
const simpleName = middleware.name ||
|
|
46
|
-
this.logger.debug(
|
|
47
|
-
`Installing simple middleware: ${simpleName}`,
|
|
48
|
-
"Installation",
|
|
49
|
-
);
|
|
42
|
+
const simpleName = middleware.name || 'anonymous';
|
|
43
|
+
this.logger.debug(`Installing simple middleware: ${simpleName}`, 'Installation');
|
|
50
44
|
|
|
51
45
|
this.simpleMiddleware.set(simpleName, middleware);
|
|
52
|
-
this.emit(
|
|
53
|
-
this.logger.info(
|
|
54
|
-
`Simple middleware installed: ${simpleName}`,
|
|
55
|
-
"Installation",
|
|
56
|
-
);
|
|
46
|
+
this.emit('installed', { name: simpleName, type: 'simple' });
|
|
47
|
+
this.logger.info(`Simple middleware installed: ${simpleName}`, 'Installation');
|
|
57
48
|
return;
|
|
58
49
|
}
|
|
59
50
|
|
|
60
51
|
// Advanced middleware with dependencies and lifecycle
|
|
61
|
-
const name = middleware.metadata?.name ||
|
|
52
|
+
const name = middleware.metadata?.name || 'unknown';
|
|
62
53
|
|
|
63
54
|
if (this.middleware.has(name)) {
|
|
64
55
|
throw new Error(`Middleware ${name} is already installed`);
|
|
@@ -76,15 +67,15 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
76
67
|
// Store middleware
|
|
77
68
|
this.middleware.set(name, middleware);
|
|
78
69
|
|
|
79
|
-
this.logger.debug(`Installing middleware: ${name}`,
|
|
70
|
+
this.logger.debug(`Installing middleware: ${name}`, 'Installation');
|
|
80
71
|
|
|
81
72
|
// Initialize middleware
|
|
82
73
|
if (middleware.install) {
|
|
83
74
|
middleware.install(this.hooks, options);
|
|
84
75
|
}
|
|
85
76
|
|
|
86
|
-
this.emit(
|
|
87
|
-
this.logger.info(`Middleware installed: ${name}`,
|
|
77
|
+
this.emit('installed', { name, middleware, options });
|
|
78
|
+
this.logger.info(`Middleware installed: ${name}`, 'Installation');
|
|
88
79
|
}
|
|
89
80
|
|
|
90
81
|
// Uninstall middleware and clean up
|
|
@@ -95,7 +86,7 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
95
86
|
|
|
96
87
|
const middleware = this.middleware.get(name)!;
|
|
97
88
|
|
|
98
|
-
this.logger.debug(`Uninstalling middleware: ${name}`,
|
|
89
|
+
this.logger.debug(`Uninstalling middleware: ${name}`, 'Uninstallation');
|
|
99
90
|
|
|
100
91
|
// Call cleanup if available
|
|
101
92
|
if (middleware.uninstall) {
|
|
@@ -103,8 +94,8 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
103
94
|
}
|
|
104
95
|
|
|
105
96
|
this.middleware.delete(name);
|
|
106
|
-
this.emit(
|
|
107
|
-
this.logger.info(`Middleware uninstalled: ${name}`,
|
|
97
|
+
this.emit('uninstalled', { name, middleware });
|
|
98
|
+
this.logger.info(`Middleware uninstalled: ${name}`, 'Uninstallation');
|
|
108
99
|
}
|
|
109
100
|
|
|
110
101
|
// Get installed middleware
|
|
@@ -130,7 +121,7 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
130
121
|
// Dependency resolution with topological sorting for optimal middleware loading
|
|
131
122
|
async installWithDependencies(
|
|
132
123
|
middleware: MiddlewareInterface[],
|
|
133
|
-
options?: Record<string, any
|
|
124
|
+
options?: Record<string, any>
|
|
134
125
|
): Promise<void> {
|
|
135
126
|
// Advanced topological sort for dependency resolution
|
|
136
127
|
const resolved = this.topologicalSort(middleware);
|
|
@@ -142,9 +133,7 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
142
133
|
}
|
|
143
134
|
|
|
144
135
|
// Optimized topological sort implementation for middleware dependencies
|
|
145
|
-
private topologicalSort(
|
|
146
|
-
middleware: MiddlewareInterface[],
|
|
147
|
-
): MiddlewareInterface[] {
|
|
136
|
+
private topologicalSort(middleware: MiddlewareInterface[]): MiddlewareInterface[] {
|
|
148
137
|
const visited = new Set<string>();
|
|
149
138
|
const temp = new Set<string>();
|
|
150
139
|
const result: MiddlewareInterface[] = [];
|
|
@@ -160,7 +149,7 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
160
149
|
// Visit dependencies first
|
|
161
150
|
if (middlewareItem.dependencies) {
|
|
162
151
|
for (const depName of middlewareItem.dependencies) {
|
|
163
|
-
const dependency = middleware.find(
|
|
152
|
+
const dependency = middleware.find(m => m.name === depName);
|
|
164
153
|
if (dependency) {
|
|
165
154
|
visit(dependency);
|
|
166
155
|
}
|
|
@@ -184,5 +173,5 @@ export class MiddlewareManager extends EventEmitter {
|
|
|
184
173
|
}
|
|
185
174
|
|
|
186
175
|
// Built-in middleware exports
|
|
187
|
-
export { builtInMiddleware, simpleMiddleware } from
|
|
188
|
-
export * from
|
|
176
|
+
export { builtInMiddleware, simpleMiddleware } from './built-in';
|
|
177
|
+
export * from './built-in';
|