@morojs/moro 1.6.2 → 1.6.3
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/core/http/http-server.js +12 -9
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/uws-http-server.js +1 -1
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/middleware/built-in/auth/core.d.ts +78 -0
- package/dist/core/middleware/built-in/auth/core.js +358 -0
- package/dist/core/middleware/built-in/auth/core.js.map +1 -0
- package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +1 -1
- package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
- package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
- package/dist/core/middleware/built-in/auth/hook.js +99 -0
- package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
- package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
- package/dist/core/middleware/built-in/auth/index.js +15 -0
- package/dist/core/middleware/built-in/auth/index.js.map +1 -0
- package/dist/core/middleware/built-in/{jwt-helpers.js → auth/jwt-helpers.js} +1 -1
- package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
- package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
- package/dist/core/middleware/built-in/auth/middleware.js +71 -0
- package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
- package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +1 -1
- package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +2 -2
- package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/index.d.ts +0 -2
- package/{src/core/middleware/built-in/adapters/index.ts → dist/core/middleware/built-in/cache/adapters/index.js} +1 -3
- package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
- package/dist/core/middleware/built-in/cache/core.js +87 -0
- package/dist/core/middleware/built-in/cache/core.js.map +1 -0
- package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +22 -5
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cache/index.js +9 -0
- package/dist/core/middleware/built-in/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/cache/middleware.js +44 -0
- package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +2 -2
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/index.js +0 -2
- package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
- package/dist/core/middleware/built-in/cdn/core.js +144 -0
- package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
- package/dist/core/middleware/built-in/cdn/hook.js +70 -0
- package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/cdn/index.js +11 -0
- package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
- package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
- package/dist/core/middleware/built-in/cookie/core.js +83 -0
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/cookie/hook.js +47 -0
- package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cookie/index.js +9 -0
- package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
- package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
- package/dist/core/middleware/built-in/cors/core.js +51 -0
- package/dist/core/middleware/built-in/cors/core.js.map +1 -0
- package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/cors/hook.js +37 -0
- package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cors/index.js +9 -0
- package/dist/core/middleware/built-in/cors/index.js.map +1 -0
- package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/cors/middleware.js +22 -0
- package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
- package/dist/core/middleware/built-in/csp/core.js +88 -0
- package/dist/core/middleware/built-in/csp/core.js.map +1 -0
- package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
- package/dist/core/middleware/built-in/csp/hook.js +47 -0
- package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
- package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
- package/dist/core/middleware/built-in/csp/index.js +9 -0
- package/dist/core/middleware/built-in/csp/index.js.map +1 -0
- package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
- package/dist/core/middleware/built-in/csp/middleware.js +29 -0
- package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
- package/dist/core/middleware/built-in/csrf/core.js +69 -0
- package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/csrf/hook.js +45 -0
- package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
- package/dist/core/middleware/built-in/csrf/index.js +9 -0
- package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
- package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{error-tracker.js → error-tracker/middleware.js} +14 -3
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +25 -59
- package/dist/core/middleware/built-in/index.js +31 -31
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
- package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{performance-monitor.js → performance-monitor/middleware.js} +14 -3
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
- package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
- package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +22 -16
- package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
- package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
- package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
- package/dist/core/middleware/built-in/request-logger/index.js +4 -0
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{request-logger.js → request-logger/middleware.js} +14 -3
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/session/core.d.ts +73 -0
- package/dist/core/middleware/built-in/session/core.js +227 -0
- package/dist/core/middleware/built-in/session/core.js.map +1 -0
- package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/session/hook.js +53 -0
- package/dist/core/middleware/built-in/session/hook.js.map +1 -0
- package/dist/core/middleware/built-in/session/index.d.ts +3 -0
- package/dist/core/middleware/built-in/session/index.js +9 -0
- package/dist/core/middleware/built-in/session/index.js.map +1 -0
- package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/session/middleware.js +38 -0
- package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
- package/dist/core/middleware/built-in/sse/core.js +117 -0
- package/dist/core/middleware/built-in/sse/core.js.map +1 -0
- package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
- package/dist/core/middleware/built-in/sse/hook.js +60 -0
- package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
- package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
- package/dist/core/middleware/built-in/sse/index.js +9 -0
- package/dist/core/middleware/built-in/sse/index.js.map +1 -0
- package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/sse/middleware.js +43 -0
- package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
- package/dist/core/middleware/built-in/validation/core.js +93 -0
- package/dist/core/middleware/built-in/validation/core.js.map +1 -0
- package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
- package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +14 -3
- package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
- package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
- package/dist/core/middleware/built-in/validation/index.js +9 -0
- package/dist/core/middleware/built-in/validation/index.js.map +1 -0
- package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/validation/middleware.js +27 -0
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
- package/dist/core/middleware/index.js +6 -0
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +4 -20
- package/dist/core/routing/unified-router.js +61 -106
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.js +12 -18
- package/dist/moro.js.map +1 -1
- package/dist/types/hooks.d.ts +3 -0
- package/package.json +2 -6
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
- package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
- package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
- package/dist/core/middleware/built-in/auth.d.ts +0 -30
- package/dist/core/middleware/built-in/auth.js +0 -348
- package/dist/core/middleware/built-in/auth.js.map +0 -1
- package/dist/core/middleware/built-in/cache.d.ts +0 -3
- package/dist/core/middleware/built-in/cache.js.map +0 -1
- package/dist/core/middleware/built-in/cdn.d.ts +0 -3
- package/dist/core/middleware/built-in/cdn.js +0 -109
- package/dist/core/middleware/built-in/cdn.js.map +0 -1
- package/dist/core/middleware/built-in/cookie.d.ts +0 -14
- package/dist/core/middleware/built-in/cookie.js +0 -64
- package/dist/core/middleware/built-in/cookie.js.map +0 -1
- package/dist/core/middleware/built-in/cors.d.ts +0 -2
- package/dist/core/middleware/built-in/cors.js +0 -25
- package/dist/core/middleware/built-in/cors.js.map +0 -1
- package/dist/core/middleware/built-in/csp.d.ts +0 -22
- package/dist/core/middleware/built-in/csp.js +0 -68
- package/dist/core/middleware/built-in/csp.js.map +0 -1
- package/dist/core/middleware/built-in/csrf.d.ts +0 -9
- package/dist/core/middleware/built-in/csrf.js +0 -60
- package/dist/core/middleware/built-in/csrf.js.map +0 -1
- package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
- package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
- package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
- package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
- package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
- package/dist/core/middleware/built-in/request-logger.js.map +0 -1
- package/dist/core/middleware/built-in/session.d.ts +0 -41
- package/dist/core/middleware/built-in/session.js +0 -205
- package/dist/core/middleware/built-in/session.js.map +0 -1
- package/dist/core/middleware/built-in/sse.d.ts +0 -6
- package/dist/core/middleware/built-in/sse.js +0 -69
- package/dist/core/middleware/built-in/sse.js.map +0 -1
- package/dist/core/middleware/built-in/validation.d.ts +0 -2
- package/dist/core/middleware/built-in/validation.js.map +0 -1
- package/jest.config.mjs +0 -41
- package/src/core/auth/README.md +0 -339
- package/src/core/auth/morojs-adapter.ts +0 -415
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -600
- package/src/core/config/config-validator.ts +0 -1116
- package/src/core/config/file-loader.ts +0 -150
- package/src/core/config/index.ts +0 -109
- package/src/core/config/schema.ts +0 -164
- package/src/core/config/utils.ts +0 -244
- package/src/core/database/README.md +0 -238
- package/src/core/database/adapters/drizzle.ts +0 -415
- package/src/core/database/adapters/index.ts +0 -42
- package/src/core/database/adapters/mongodb.ts +0 -317
- package/src/core/database/adapters/mysql.ts +0 -235
- package/src/core/database/adapters/postgresql.ts +0 -226
- package/src/core/database/adapters/redis.ts +0 -379
- package/src/core/database/adapters/sqlite.ts +0 -263
- package/src/core/database/index.ts +0 -3
- package/src/core/docs/index.ts +0 -231
- package/src/core/docs/openapi-generator.ts +0 -576
- package/src/core/docs/schema-to-openapi.ts +0 -145
- package/src/core/docs/simple-docs.ts +0 -295
- package/src/core/docs/swagger-ui.ts +0 -354
- package/src/core/docs/zod-to-openapi.ts +0 -532
- package/src/core/events/event-bus.ts +0 -231
- package/src/core/events/index.ts +0 -12
- package/src/core/framework.ts +0 -885
- package/src/core/http/http-server.ts +0 -1847
- package/src/core/http/index.ts +0 -7
- package/src/core/http/uws-http-server.ts +0 -591
- package/src/core/logger/filters.ts +0 -153
- package/src/core/logger/index.ts +0 -21
- package/src/core/logger/logger.ts +0 -1033
- package/src/core/logger/outputs.ts +0 -132
- package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
- package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
- package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
- package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -114
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -94
- package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
- package/src/core/middleware/built-in/auth-helpers.ts +0 -401
- package/src/core/middleware/built-in/auth-providers.ts +0 -480
- package/src/core/middleware/built-in/auth.ts +0 -410
- package/src/core/middleware/built-in/cache.ts +0 -213
- package/src/core/middleware/built-in/cdn.ts +0 -124
- package/src/core/middleware/built-in/cookie.ts +0 -85
- package/src/core/middleware/built-in/cors.ts +0 -38
- package/src/core/middleware/built-in/csp.ts +0 -101
- package/src/core/middleware/built-in/csrf.ts +0 -82
- package/src/core/middleware/built-in/error-tracker.ts +0 -16
- package/src/core/middleware/built-in/index.ts +0 -87
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
- package/src/core/middleware/built-in/performance-monitor.ts +0 -25
- package/src/core/middleware/built-in/rate-limit.ts +0 -60
- package/src/core/middleware/built-in/request-logger.ts +0 -16
- package/src/core/middleware/built-in/session.ts +0 -287
- package/src/core/middleware/built-in/sse.ts +0 -88
- package/src/core/middleware/built-in/validation.ts +0 -33
- package/src/core/middleware/index.ts +0 -177
- package/src/core/modules/auto-discovery.ts +0 -726
- package/src/core/modules/index.ts +0 -3
- package/src/core/modules/modules.ts +0 -135
- package/src/core/networking/adapters/index.ts +0 -17
- package/src/core/networking/adapters/socketio-adapter.ts +0 -254
- package/src/core/networking/adapters/uws-adapter.ts +0 -619
- package/src/core/networking/adapters/ws-adapter.ts +0 -429
- package/src/core/networking/index.ts +0 -4
- package/src/core/networking/service-discovery.ts +0 -303
- package/src/core/networking/websocket-adapter.ts +0 -217
- package/src/core/networking/websocket-manager.ts +0 -308
- package/src/core/pooling/object-pool-manager.ts +0 -630
- package/src/core/routing/app-integration.ts +0 -164
- package/src/core/routing/index.ts +0 -261
- package/src/core/routing/path-matcher.ts +0 -222
- package/src/core/routing/router.ts +0 -97
- package/src/core/routing/unified-router.ts +0 -870
- package/src/core/runtime/aws-lambda-adapter.ts +0 -147
- package/src/core/runtime/base-adapter.ts +0 -130
- package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
- package/src/core/runtime/index.ts +0 -62
- package/src/core/runtime/node-adapter.ts +0 -202
- package/src/core/runtime/vercel-edge-adapter.ts +0 -114
- package/src/core/utilities/circuit-breaker.ts +0 -46
- package/src/core/utilities/container.ts +0 -736
- package/src/core/utilities/hooks.ts +0 -142
- package/src/core/utilities/index.ts +0 -17
- package/src/core/utilities/package-utils.ts +0 -59
- package/src/core/validation/adapters.ts +0 -147
- package/src/core/validation/index.ts +0 -258
- package/src/core/validation/schema-interface.ts +0 -100
- package/src/index.ts +0 -233
- package/src/moro.ts +0 -1728
- package/src/types/auth.ts +0 -440
- package/src/types/cache.ts +0 -38
- package/src/types/cdn.ts +0 -22
- package/src/types/config.ts +0 -229
- package/src/types/core.ts +0 -58
- package/src/types/database.ts +0 -32
- package/src/types/discovery.ts +0 -7
- package/src/types/events.ts +0 -82
- package/src/types/hooks.ts +0 -47
- package/src/types/http.ts +0 -89
- package/src/types/logger.ts +0 -102
- package/src/types/module.ts +0 -99
- package/src/types/runtime.ts +0 -76
- package/src/types/session.ts +0 -89
- package/tsconfig.json +0 -23
- /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
- /package/dist/core/middleware/built-in/{jwt-helpers.d.ts → auth/jwt-helpers.d.ts} +0 -0
- /package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.js +0 -0
- /package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.js +0 -0
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JWT Error Handling Utilities for Custom Middleware
|
|
3
|
-
*
|
|
4
|
-
* This module provides utilities to help users handle JWT errors gracefully
|
|
5
|
-
* in their custom authentication middleware.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { resolveUserPackage } from '../../utilities/package-utils.js';
|
|
9
|
-
|
|
10
|
-
export interface JWTVerificationResult {
|
|
11
|
-
success: boolean;
|
|
12
|
-
payload?: any;
|
|
13
|
-
error?: {
|
|
14
|
-
type: 'expired' | 'invalid' | 'malformed' | 'missing_secret' | 'unknown';
|
|
15
|
-
message: string;
|
|
16
|
-
expiredAt?: Date;
|
|
17
|
-
date?: Date;
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Safely verify a JWT token with proper error handling
|
|
23
|
-
*
|
|
24
|
-
* @param token - The JWT token to verify
|
|
25
|
-
* @param secret - The secret key for verification
|
|
26
|
-
* @param options - Additional JWT verification options
|
|
27
|
-
* @returns JWTVerificationResult with success status and payload or error details
|
|
28
|
-
*/
|
|
29
|
-
export async function safeVerifyJWT(
|
|
30
|
-
token: string,
|
|
31
|
-
secret: string,
|
|
32
|
-
options: any = {}
|
|
33
|
-
): Promise<JWTVerificationResult> {
|
|
34
|
-
// Check if jsonwebtoken is available
|
|
35
|
-
let jwt: any;
|
|
36
|
-
try {
|
|
37
|
-
const jwtPath = resolveUserPackage('jsonwebtoken');
|
|
38
|
-
jwt = await import(jwtPath);
|
|
39
|
-
} catch (error) {
|
|
40
|
-
return {
|
|
41
|
-
success: false,
|
|
42
|
-
error: {
|
|
43
|
-
type: 'missing_secret',
|
|
44
|
-
message:
|
|
45
|
-
'JWT verification requires the "jsonwebtoken" package. ' +
|
|
46
|
-
'Please install it with: npm install jsonwebtoken @types/jsonwebtoken',
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (!secret) {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
error: {
|
|
55
|
-
type: 'missing_secret',
|
|
56
|
-
message:
|
|
57
|
-
'JWT verification requires a secret. ' +
|
|
58
|
-
'Please provide a secret for token verification.',
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
try {
|
|
64
|
-
const payload = jwt.verify(token, secret, options);
|
|
65
|
-
return {
|
|
66
|
-
success: true,
|
|
67
|
-
payload,
|
|
68
|
-
};
|
|
69
|
-
} catch (error: any) {
|
|
70
|
-
// Handle specific JWT errors gracefully
|
|
71
|
-
if (error.name === 'TokenExpiredError') {
|
|
72
|
-
return {
|
|
73
|
-
success: false,
|
|
74
|
-
error: {
|
|
75
|
-
type: 'expired',
|
|
76
|
-
message: 'JWT token has expired',
|
|
77
|
-
expiredAt: error.expiredAt,
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
} else if (error.name === 'JsonWebTokenError') {
|
|
81
|
-
return {
|
|
82
|
-
success: false,
|
|
83
|
-
error: {
|
|
84
|
-
type: 'invalid',
|
|
85
|
-
message: 'Invalid JWT token format or signature',
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
} else if (error.name === 'NotBeforeError') {
|
|
89
|
-
return {
|
|
90
|
-
success: false,
|
|
91
|
-
error: {
|
|
92
|
-
type: 'malformed',
|
|
93
|
-
message: 'JWT token is not active yet',
|
|
94
|
-
date: error.date,
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
} else {
|
|
98
|
-
return {
|
|
99
|
-
success: false,
|
|
100
|
-
error: {
|
|
101
|
-
type: 'unknown',
|
|
102
|
-
message: `JWT verification failed: ${error.message}`,
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Extract JWT token from Authorization header
|
|
111
|
-
*
|
|
112
|
-
* @param authHeader - The Authorization header value
|
|
113
|
-
* @returns The JWT token or null if not found/invalid format
|
|
114
|
-
*/
|
|
115
|
-
export function extractJWTFromHeader(authHeader: string | undefined): string | null {
|
|
116
|
-
if (!authHeader) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (!authHeader.startsWith('Bearer ')) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const token = authHeader.substring(7);
|
|
125
|
-
return token.trim() || null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Create a standardized auth middleware error response
|
|
130
|
-
*
|
|
131
|
-
* @param error - The JWT verification error
|
|
132
|
-
* @returns Standardized error response object
|
|
133
|
-
*/
|
|
134
|
-
export function createAuthErrorResponse(error: JWTVerificationResult['error']) {
|
|
135
|
-
if (!error) {
|
|
136
|
-
return {
|
|
137
|
-
success: false,
|
|
138
|
-
error: 'Authentication failed',
|
|
139
|
-
message: 'Unknown authentication error',
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
switch (error.type) {
|
|
144
|
-
case 'expired':
|
|
145
|
-
return {
|
|
146
|
-
success: false,
|
|
147
|
-
error: 'Token expired',
|
|
148
|
-
message: 'Your session has expired. Please sign in again.',
|
|
149
|
-
expiredAt: error.expiredAt,
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
case 'invalid':
|
|
153
|
-
return {
|
|
154
|
-
success: false,
|
|
155
|
-
error: 'Invalid token',
|
|
156
|
-
message: 'The provided authentication token is invalid.',
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
case 'malformed':
|
|
160
|
-
return {
|
|
161
|
-
success: false,
|
|
162
|
-
error: 'Token not ready',
|
|
163
|
-
message: 'The authentication token is not yet valid.',
|
|
164
|
-
availableAt: error.date,
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
case 'missing_secret':
|
|
168
|
-
return {
|
|
169
|
-
success: false,
|
|
170
|
-
error: 'Configuration error',
|
|
171
|
-
message: 'Authentication service is not properly configured.',
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
default:
|
|
175
|
-
return {
|
|
176
|
-
success: false,
|
|
177
|
-
error: 'Authentication failed',
|
|
178
|
-
message: error.message || 'Authentication verification failed.',
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Example usage for custom middleware with elegant error handling:
|
|
185
|
-
*
|
|
186
|
-
* ```typescript
|
|
187
|
-
* import { safeVerifyJWT, extractJWTFromHeader, createAuthErrorResponse } from '@morojs/moro';
|
|
188
|
-
*
|
|
189
|
-
* const authMiddleware = async (req: any, res: any, next: any) => {
|
|
190
|
-
* const token = extractJWTFromHeader(req.headers.authorization);
|
|
191
|
-
*
|
|
192
|
-
* if (!token) {
|
|
193
|
-
* return res.status(401).json({
|
|
194
|
-
* success: false,
|
|
195
|
-
* error: 'Missing token',
|
|
196
|
-
* message: 'Authorization header with Bearer token is required'
|
|
197
|
-
* });
|
|
198
|
-
* }
|
|
199
|
-
*
|
|
200
|
-
* const result = safeVerifyJWT(token, process.env.JWT_SECRET!);
|
|
201
|
-
*
|
|
202
|
-
* if (!result.success) {
|
|
203
|
-
* // This provides elegant, user-friendly error messages instead of stack traces
|
|
204
|
-
* const errorResponse = createAuthErrorResponse(result.error);
|
|
205
|
-
* return res.status(401).json(errorResponse);
|
|
206
|
-
* }
|
|
207
|
-
*
|
|
208
|
-
* // Token is valid - attach user info to request
|
|
209
|
-
* req.user = result.payload;
|
|
210
|
-
* req.auth = {
|
|
211
|
-
* user: result.payload,
|
|
212
|
-
* isAuthenticated: true,
|
|
213
|
-
* token
|
|
214
|
-
* };
|
|
215
|
-
*
|
|
216
|
-
* next();
|
|
217
|
-
* };
|
|
218
|
-
* ```
|
|
219
|
-
*
|
|
220
|
-
* Benefits of using safeVerifyJWT vs raw jsonwebtoken.verify():
|
|
221
|
-
*
|
|
222
|
-
* ❌ Raw approach (shows ugly error messages to users):
|
|
223
|
-
* ```typescript
|
|
224
|
-
* try {
|
|
225
|
-
* const decoded = jwt.verify(token, secret);
|
|
226
|
-
* req.user = decoded;
|
|
227
|
-
* } catch (error) {
|
|
228
|
-
* // This exposes technical details and stack traces to users:
|
|
229
|
-
* // "Invalid token: TokenExpiredError: jwt expired at /node_modules/jsonwebtoken/verify.js:190:21..."
|
|
230
|
-
* throw error; // BAD - exposes internal details
|
|
231
|
-
* }
|
|
232
|
-
* ```
|
|
233
|
-
*
|
|
234
|
-
* ✅ Safe approach (shows clean, user-friendly messages):
|
|
235
|
-
* ```typescript
|
|
236
|
-
* const result = safeVerifyJWT(token, secret);
|
|
237
|
-
* if (!result.success) {
|
|
238
|
-
* // This returns clean messages like:
|
|
239
|
-
* // { "error": "Token expired", "message": "Your session has expired. Please sign in again." }
|
|
240
|
-
* return res.status(401).json(createAuthErrorResponse(result.error));
|
|
241
|
-
* }
|
|
242
|
-
* ```
|
|
243
|
-
*/
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// Performance monitoring middleware
|
|
2
|
-
import { createFrameworkLogger } from '../../logger/index.js';
|
|
3
|
-
|
|
4
|
-
const logger = createFrameworkLogger('PerformanceMonitor');
|
|
5
|
-
|
|
6
|
-
export const performanceMonitor = async (context: any): Promise<void> => {
|
|
7
|
-
const startTime = Date.now();
|
|
8
|
-
|
|
9
|
-
context.onComplete = () => {
|
|
10
|
-
const duration = Date.now() - startTime;
|
|
11
|
-
|
|
12
|
-
// Log slow requests
|
|
13
|
-
if (duration > 1000) {
|
|
14
|
-
logger.warn(
|
|
15
|
-
`Slow request detected: ${context.request?.path} took ${duration}ms`,
|
|
16
|
-
'SlowRequest',
|
|
17
|
-
{
|
|
18
|
-
path: context.request?.path,
|
|
19
|
-
method: context.request?.method,
|
|
20
|
-
duration,
|
|
21
|
-
}
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
};
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// Rate Limiting Middleware
|
|
2
|
-
import { MiddlewareInterface, HookContext } from '../../../types/hooks.js';
|
|
3
|
-
import { createFrameworkLogger } from '../../logger/index.js';
|
|
4
|
-
|
|
5
|
-
const logger = createFrameworkLogger('RateLimitMiddleware');
|
|
6
|
-
|
|
7
|
-
export const rateLimit = (
|
|
8
|
-
options: {
|
|
9
|
-
windowMs?: number;
|
|
10
|
-
max?: number;
|
|
11
|
-
message?: string;
|
|
12
|
-
} = {}
|
|
13
|
-
): MiddlewareInterface => ({
|
|
14
|
-
name: 'rate-limit',
|
|
15
|
-
version: '1.0.0',
|
|
16
|
-
metadata: {
|
|
17
|
-
name: 'rate-limit',
|
|
18
|
-
version: '1.0.0',
|
|
19
|
-
description: 'Rate limiting middleware with configurable windows',
|
|
20
|
-
author: 'MoroJS Team',
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
install: async (hooks: any, options: any = {}) => {
|
|
24
|
-
logger.debug('Installing rate limit middleware', 'Installation', {
|
|
25
|
-
options,
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const windowMs = options.windowMs || 60000; // 1 minute default
|
|
29
|
-
const max = options.max || 100; // 100 requests per window
|
|
30
|
-
const clientCounts = new Map();
|
|
31
|
-
|
|
32
|
-
hooks.before('request', async (context: HookContext) => {
|
|
33
|
-
const req = context.request as any;
|
|
34
|
-
const clientId = req.connection?.remoteAddress || 'unknown';
|
|
35
|
-
const now = Date.now();
|
|
36
|
-
|
|
37
|
-
if (!clientCounts.has(clientId)) {
|
|
38
|
-
clientCounts.set(clientId, { count: 0, resetTime: now + windowMs });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const client = clientCounts.get(clientId);
|
|
42
|
-
|
|
43
|
-
if (now > client.resetTime) {
|
|
44
|
-
client.count = 0;
|
|
45
|
-
client.resetTime = now + windowMs;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
client.count++;
|
|
49
|
-
|
|
50
|
-
if (client.count > max) {
|
|
51
|
-
logger.warn(`Rate limit exceeded for ${clientId}`, 'RateLimit', {
|
|
52
|
-
clientId,
|
|
53
|
-
count: client.count,
|
|
54
|
-
max,
|
|
55
|
-
});
|
|
56
|
-
throw new Error(options.message || 'Too many requests');
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
},
|
|
60
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// Simple request logging middleware
|
|
2
|
-
import { createFrameworkLogger } from '../../logger/index.js';
|
|
3
|
-
|
|
4
|
-
const logger = createFrameworkLogger('RequestLogger');
|
|
5
|
-
|
|
6
|
-
export const requestLogger = async (context: any): Promise<void> => {
|
|
7
|
-
const startTime = Date.now();
|
|
8
|
-
|
|
9
|
-
logger.info(`${context.request?.method} ${context.request?.path}`, 'RequestLogger');
|
|
10
|
-
|
|
11
|
-
// Log completion after response
|
|
12
|
-
context.onComplete = () => {
|
|
13
|
-
const duration = Date.now() - startTime;
|
|
14
|
-
logger.info(`Request completed in ${duration}ms`, 'RequestLogger');
|
|
15
|
-
};
|
|
16
|
-
};
|
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
// Session Middleware
|
|
2
|
-
import crypto from 'crypto';
|
|
3
|
-
import { MiddlewareInterface, HookContext } from '../../../types/hooks.js';
|
|
4
|
-
import { createFrameworkLogger } from '../../logger/index.js';
|
|
5
|
-
import { CacheAdapter } from '../../../types/cache.js';
|
|
6
|
-
import { MemoryCacheAdapter } from './adapters/cache/memory.js';
|
|
7
|
-
import { RedisCacheAdapter } from './adapters/cache/redis.js';
|
|
8
|
-
import { FileCacheAdapter } from './adapters/cache/file.js';
|
|
9
|
-
|
|
10
|
-
const logger = createFrameworkLogger('SessionMiddleware');
|
|
11
|
-
|
|
12
|
-
export interface SessionOptions {
|
|
13
|
-
// Session store configuration
|
|
14
|
-
store?: 'memory' | 'redis' | 'file' | CacheAdapter;
|
|
15
|
-
storeOptions?: {
|
|
16
|
-
// Redis options
|
|
17
|
-
host?: string;
|
|
18
|
-
port?: number;
|
|
19
|
-
password?: string;
|
|
20
|
-
keyPrefix?: string;
|
|
21
|
-
// File options
|
|
22
|
-
path?: string;
|
|
23
|
-
// Memory options
|
|
24
|
-
max?: number;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// Session configuration
|
|
28
|
-
secret?: string;
|
|
29
|
-
name?: string; // Session cookie name
|
|
30
|
-
genid?: () => string; // Session ID generator
|
|
31
|
-
rolling?: boolean; // Reset expiry on each request
|
|
32
|
-
resave?: boolean; // Save session even if not modified
|
|
33
|
-
saveUninitialized?: boolean; // Save new but not modified sessions
|
|
34
|
-
|
|
35
|
-
// Cookie configuration
|
|
36
|
-
cookie?: {
|
|
37
|
-
maxAge?: number; // Session timeout in ms
|
|
38
|
-
expires?: Date; // Absolute expiry
|
|
39
|
-
httpOnly?: boolean; // Prevent XSS access
|
|
40
|
-
secure?: boolean; // HTTPS only
|
|
41
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
42
|
-
domain?: string;
|
|
43
|
-
path?: string;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// Security
|
|
47
|
-
proxy?: boolean; // Trust proxy for secure cookies
|
|
48
|
-
unset?: 'destroy' | 'keep'; // What to do when session is unset
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface SessionData {
|
|
52
|
-
[key: string]: any;
|
|
53
|
-
cookie?: {
|
|
54
|
-
originalMaxAge?: number;
|
|
55
|
-
expires?: Date;
|
|
56
|
-
secure?: boolean;
|
|
57
|
-
httpOnly?: boolean;
|
|
58
|
-
sameSite?: string;
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
class Session {
|
|
63
|
-
private data: SessionData = {};
|
|
64
|
-
private id: string;
|
|
65
|
-
private store: CacheAdapter;
|
|
66
|
-
private options: SessionOptions;
|
|
67
|
-
private isNew: boolean = false;
|
|
68
|
-
private isModified: boolean = false;
|
|
69
|
-
|
|
70
|
-
constructor(id: string, store: CacheAdapter, options: SessionOptions, isNew: boolean = false) {
|
|
71
|
-
this.id = id;
|
|
72
|
-
this.store = store;
|
|
73
|
-
this.options = options;
|
|
74
|
-
this.isNew = isNew;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Proxy to make session.prop = value work
|
|
78
|
-
static create(
|
|
79
|
-
id: string,
|
|
80
|
-
store: CacheAdapter,
|
|
81
|
-
options: SessionOptions,
|
|
82
|
-
data: SessionData = {},
|
|
83
|
-
isNew: boolean = false
|
|
84
|
-
): Session {
|
|
85
|
-
const session = new Session(id, store, options, isNew);
|
|
86
|
-
session.data = data;
|
|
87
|
-
|
|
88
|
-
return new Proxy(session, {
|
|
89
|
-
get(target, prop) {
|
|
90
|
-
if (prop in target) {
|
|
91
|
-
return target[prop as keyof Session];
|
|
92
|
-
}
|
|
93
|
-
return target.data[prop as string];
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
set(target, prop, value) {
|
|
97
|
-
if (prop in target) {
|
|
98
|
-
(target as any)[prop] = value;
|
|
99
|
-
} else {
|
|
100
|
-
target.data[prop as string] = value;
|
|
101
|
-
target.isModified = true;
|
|
102
|
-
}
|
|
103
|
-
return true;
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
has(target, prop) {
|
|
107
|
-
return prop in target || prop in target.data;
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
deleteProperty(target, prop) {
|
|
111
|
-
if (prop in target.data) {
|
|
112
|
-
delete target.data[prop as string];
|
|
113
|
-
target.isModified = true;
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
return false;
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async save(): Promise<void> {
|
|
122
|
-
if (this.isModified || this.isNew || this.options.resave) {
|
|
123
|
-
const ttl = this.options.cookie?.maxAge
|
|
124
|
-
? Math.floor(this.options.cookie.maxAge / 1000)
|
|
125
|
-
: 86400; // 24h default
|
|
126
|
-
await this.store.set(this.id, this.data, ttl);
|
|
127
|
-
this.isModified = false;
|
|
128
|
-
this.isNew = false;
|
|
129
|
-
logger.debug(`Session saved: ${this.id}`, 'SessionSave');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async destroy(): Promise<void> {
|
|
134
|
-
await this.store.del(this.id);
|
|
135
|
-
this.data = {};
|
|
136
|
-
this.isModified = false;
|
|
137
|
-
logger.debug(`Session destroyed: ${this.id}`, 'SessionDestroy');
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async regenerate(): Promise<string> {
|
|
141
|
-
await this.destroy();
|
|
142
|
-
this.id = this.generateId();
|
|
143
|
-
this.isNew = true;
|
|
144
|
-
this.isModified = true;
|
|
145
|
-
logger.debug(`Session regenerated: ${this.id}`, 'SessionRegenerate');
|
|
146
|
-
return this.id;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async touch(): Promise<void> {
|
|
150
|
-
if (this.options.rolling) {
|
|
151
|
-
this.isModified = true;
|
|
152
|
-
await this.save();
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
private generateId(): string {
|
|
157
|
-
if (this.options.genid) {
|
|
158
|
-
return this.options.genid();
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return crypto.randomBytes(24).toString('hex');
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
get sessionID(): string {
|
|
165
|
-
return this.id;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export const session = (options: SessionOptions = {}): MiddlewareInterface => ({
|
|
170
|
-
name: 'session',
|
|
171
|
-
version: '1.0.0',
|
|
172
|
-
metadata: {
|
|
173
|
-
name: 'session',
|
|
174
|
-
version: '1.0.0',
|
|
175
|
-
description: 'Session management middleware with multiple store adapters',
|
|
176
|
-
author: 'MoroJS Team',
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
install: async (hooks: any, middlewareOptions: any = {}) => {
|
|
180
|
-
logger.debug('Installing session middleware', 'Installation');
|
|
181
|
-
|
|
182
|
-
// Merge options
|
|
183
|
-
const config: SessionOptions = {
|
|
184
|
-
store: 'memory',
|
|
185
|
-
name: 'connect.sid',
|
|
186
|
-
secret: 'moro-session-secret',
|
|
187
|
-
rolling: false,
|
|
188
|
-
resave: false,
|
|
189
|
-
saveUninitialized: false,
|
|
190
|
-
cookie: {
|
|
191
|
-
maxAge: 24 * 60 * 60 * 1000, // 24 hours
|
|
192
|
-
httpOnly: true,
|
|
193
|
-
secure: false,
|
|
194
|
-
sameSite: 'lax',
|
|
195
|
-
path: '/',
|
|
196
|
-
},
|
|
197
|
-
unset: 'keep',
|
|
198
|
-
...options,
|
|
199
|
-
...middlewareOptions,
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
// Initialize store
|
|
203
|
-
let store: CacheAdapter;
|
|
204
|
-
|
|
205
|
-
if (typeof config.store === 'string') {
|
|
206
|
-
switch (config.store) {
|
|
207
|
-
case 'redis':
|
|
208
|
-
store = new RedisCacheAdapter({
|
|
209
|
-
keyPrefix: 'sess:',
|
|
210
|
-
...config.storeOptions,
|
|
211
|
-
});
|
|
212
|
-
break;
|
|
213
|
-
case 'file':
|
|
214
|
-
store = new FileCacheAdapter({
|
|
215
|
-
cacheDir: config.storeOptions?.path || './sessions',
|
|
216
|
-
});
|
|
217
|
-
break;
|
|
218
|
-
case 'memory':
|
|
219
|
-
default:
|
|
220
|
-
store = new MemoryCacheAdapter();
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
} else {
|
|
224
|
-
store = config.store as CacheAdapter;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Generate session ID
|
|
228
|
-
const generateSessionId = (): string => {
|
|
229
|
-
if (config.genid) {
|
|
230
|
-
return config.genid();
|
|
231
|
-
}
|
|
232
|
-
return crypto.randomBytes(24).toString('hex');
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
hooks.before('request', async (context: HookContext) => {
|
|
236
|
-
const req = context.request as any;
|
|
237
|
-
const res = context.response as any;
|
|
238
|
-
|
|
239
|
-
// Get session ID from cookie
|
|
240
|
-
let sessionId = req.cookies?.[config.name!];
|
|
241
|
-
let sessionData: SessionData = {};
|
|
242
|
-
let isNew = false;
|
|
243
|
-
|
|
244
|
-
if (sessionId) {
|
|
245
|
-
try {
|
|
246
|
-
sessionData = (await store.get(sessionId)) || {};
|
|
247
|
-
logger.debug(`Session loaded: ${sessionId}`, 'SessionLoad');
|
|
248
|
-
} catch (error) {
|
|
249
|
-
logger.warn(`Failed to load session: ${sessionId}`, 'SessionLoadError', { error });
|
|
250
|
-
sessionId = generateSessionId();
|
|
251
|
-
isNew = true;
|
|
252
|
-
}
|
|
253
|
-
} else {
|
|
254
|
-
sessionId = generateSessionId();
|
|
255
|
-
isNew = true;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Create session object
|
|
259
|
-
req.session = Session.create(sessionId, store, config, sessionData, isNew);
|
|
260
|
-
|
|
261
|
-
// Set session cookie
|
|
262
|
-
if (isNew || config.rolling) {
|
|
263
|
-
res.cookie(config.name!, sessionId, {
|
|
264
|
-
...config.cookie,
|
|
265
|
-
secure:
|
|
266
|
-
config.cookie?.secure || (config.proxy && req.headers['x-forwarded-proto'] === 'https'),
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
hooks.after('response', async (context: HookContext) => {
|
|
272
|
-
const req = context.request as any;
|
|
273
|
-
|
|
274
|
-
if (req.session) {
|
|
275
|
-
try {
|
|
276
|
-
if (config.saveUninitialized || !req.session.isNew || req.session.isModified) {
|
|
277
|
-
await req.session.save();
|
|
278
|
-
}
|
|
279
|
-
} catch (error) {
|
|
280
|
-
logger.error('Failed to save session', 'SessionSaveError', { error });
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
logger.info(`Session middleware installed with ${config.store} store`, 'Installation');
|
|
286
|
-
},
|
|
287
|
-
});
|