@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,410 +0,0 @@
|
|
|
1
|
-
// Auth.js Authentication Middleware
|
|
2
|
-
|
|
3
|
-
import crypto from 'crypto';
|
|
4
|
-
import { MiddlewareInterface, HookContext } from '../../../types/hooks.js';
|
|
5
|
-
import { createFrameworkLogger } from '../../logger/index.js';
|
|
6
|
-
import {
|
|
7
|
-
AuthOptions,
|
|
8
|
-
AuthProvider,
|
|
9
|
-
AuthUser,
|
|
10
|
-
AuthSession,
|
|
11
|
-
AuthRequest,
|
|
12
|
-
OAuthProvider,
|
|
13
|
-
CredentialsProvider,
|
|
14
|
-
EmailProvider,
|
|
15
|
-
} from '../../../types/auth.js';
|
|
16
|
-
import { safeVerifyJWT, createAuthErrorResponse } from './jwt-helpers.js';
|
|
17
|
-
|
|
18
|
-
const logger = createFrameworkLogger('AuthMiddleware');
|
|
19
|
-
|
|
20
|
-
// Auth.js provider factory functions
|
|
21
|
-
export const providers = {
|
|
22
|
-
google: (options: { clientId: string; clientSecret: string }): AuthProvider => ({
|
|
23
|
-
id: 'google',
|
|
24
|
-
name: 'Google',
|
|
25
|
-
type: 'oauth' as const,
|
|
26
|
-
authorization: 'https://accounts.google.com/oauth/authorize',
|
|
27
|
-
token: 'https://oauth2.googleapis.com/token',
|
|
28
|
-
userinfo: 'https://www.googleapis.com/oauth2/v2/userinfo',
|
|
29
|
-
...options,
|
|
30
|
-
}),
|
|
31
|
-
|
|
32
|
-
github: (options: { clientId: string; clientSecret: string }): AuthProvider => ({
|
|
33
|
-
id: 'github',
|
|
34
|
-
name: 'GitHub',
|
|
35
|
-
type: 'oauth' as const,
|
|
36
|
-
authorization: 'https://github.com/login/oauth/authorize',
|
|
37
|
-
token: 'https://github.com/login/oauth/access_token',
|
|
38
|
-
userinfo: 'https://api.github.com/user',
|
|
39
|
-
...options,
|
|
40
|
-
}),
|
|
41
|
-
|
|
42
|
-
discord: (options: { clientId: string; clientSecret: string }): AuthProvider => ({
|
|
43
|
-
id: 'discord',
|
|
44
|
-
name: 'Discord',
|
|
45
|
-
type: 'oauth' as const,
|
|
46
|
-
authorization: 'https://discord.com/api/oauth2/authorize',
|
|
47
|
-
token: 'https://discord.com/api/oauth2/token',
|
|
48
|
-
userinfo: 'https://discord.com/api/users/@me',
|
|
49
|
-
...options,
|
|
50
|
-
}),
|
|
51
|
-
|
|
52
|
-
credentials: (options: {
|
|
53
|
-
name?: string;
|
|
54
|
-
credentials: Record<string, any>;
|
|
55
|
-
authorize: (credentials: any) => Promise<any>;
|
|
56
|
-
}): AuthProvider => ({
|
|
57
|
-
id: 'credentials',
|
|
58
|
-
name: options.name || 'Credentials',
|
|
59
|
-
type: 'credentials' as const,
|
|
60
|
-
...options,
|
|
61
|
-
}),
|
|
62
|
-
|
|
63
|
-
email: (options: {
|
|
64
|
-
server: string | { host: string; port: number; auth: any };
|
|
65
|
-
from: string;
|
|
66
|
-
}): AuthProvider => ({
|
|
67
|
-
id: 'email',
|
|
68
|
-
name: 'Email',
|
|
69
|
-
type: 'email' as const,
|
|
70
|
-
...options,
|
|
71
|
-
}),
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// Auth.js middleware that integrates with MoroJS's hooks system
|
|
75
|
-
export const auth = (options: AuthOptions): MiddlewareInterface => ({
|
|
76
|
-
name: 'auth',
|
|
77
|
-
version: '2.0.0',
|
|
78
|
-
metadata: {
|
|
79
|
-
name: 'auth',
|
|
80
|
-
version: '2.0.0',
|
|
81
|
-
description: 'Auth.js authentication middleware with OAuth, JWT, and session support',
|
|
82
|
-
author: 'MoroJS Team',
|
|
83
|
-
dependencies: [], // No dependencies - auth middleware is self-contained
|
|
84
|
-
tags: ['authentication', 'oauth', 'jwt', 'security'],
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
install: async (hooks: any, middlewareOptions: Partial<AuthOptions> = {}) => {
|
|
88
|
-
logger.debug('Installing Auth.js middleware', 'Installation', { options: middlewareOptions });
|
|
89
|
-
|
|
90
|
-
// Merge configuration
|
|
91
|
-
const config: AuthOptions = {
|
|
92
|
-
secret: process.env.NEXTAUTH_SECRET || process.env.AUTH_SECRET || 'default-secret',
|
|
93
|
-
session: {
|
|
94
|
-
strategy: 'jwt',
|
|
95
|
-
maxAge: 30 * 24 * 60 * 60, // 30 days
|
|
96
|
-
updateAge: 24 * 60 * 60, // 24 hours
|
|
97
|
-
},
|
|
98
|
-
basePath: '/api/auth',
|
|
99
|
-
trustHost: true,
|
|
100
|
-
debug: process.env.NODE_ENV === 'development',
|
|
101
|
-
...options,
|
|
102
|
-
...middlewareOptions,
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
if (!config.providers || config.providers.length === 0) {
|
|
106
|
-
throw new Error('At least one authentication provider must be configured');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Initialize Auth.js
|
|
110
|
-
let authInstance: any;
|
|
111
|
-
try {
|
|
112
|
-
authInstance = await initializeAuthJS(config);
|
|
113
|
-
logger.info('Auth.js initialized successfully', 'Initialization');
|
|
114
|
-
} catch (error) {
|
|
115
|
-
logger.error('Failed to initialize Auth.js', 'InitializationError', { error });
|
|
116
|
-
throw error;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Register hooks for request processing
|
|
120
|
-
hooks.before('request', async (context: HookContext) => {
|
|
121
|
-
const req = context.request as any;
|
|
122
|
-
const res = context.response as any;
|
|
123
|
-
|
|
124
|
-
// Handle Auth.js API routes first
|
|
125
|
-
if (req.url?.startsWith(config.basePath!)) {
|
|
126
|
-
try {
|
|
127
|
-
const response = await authInstance.handler(req, res);
|
|
128
|
-
if (response) {
|
|
129
|
-
// Auth.js handled the request, don't call next()
|
|
130
|
-
return response;
|
|
131
|
-
}
|
|
132
|
-
} catch (error) {
|
|
133
|
-
logger.error('Auth.js handler error', 'HandlerError', { error });
|
|
134
|
-
throw error;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Add auth object to request for all other routes
|
|
139
|
-
|
|
140
|
-
// Extend request with auth methods
|
|
141
|
-
const authRequest: AuthRequest = {
|
|
142
|
-
user: undefined,
|
|
143
|
-
session: undefined,
|
|
144
|
-
token: undefined,
|
|
145
|
-
isAuthenticated: false,
|
|
146
|
-
signIn: async (provider?: string, options?: any) => {
|
|
147
|
-
return authInstance.signIn(provider, options);
|
|
148
|
-
},
|
|
149
|
-
signOut: async (options?: any) => {
|
|
150
|
-
return authInstance.signOut(options);
|
|
151
|
-
},
|
|
152
|
-
getSession: async () => {
|
|
153
|
-
return authInstance.getSession({ req });
|
|
154
|
-
},
|
|
155
|
-
getToken: async () => {
|
|
156
|
-
try {
|
|
157
|
-
return authInstance.verifyJWT(authRequest.token || '');
|
|
158
|
-
} catch (error: any) {
|
|
159
|
-
// Handle JWT errors gracefully in getToken method
|
|
160
|
-
logger.debug('Failed to verify token in getToken', 'TokenValidation', {
|
|
161
|
-
error: error.message,
|
|
162
|
-
});
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
getCsrfToken: async () => {
|
|
167
|
-
return authInstance.getCsrfToken();
|
|
168
|
-
},
|
|
169
|
-
getProviders: async () => {
|
|
170
|
-
return config.providers.reduce((acc: Record<string, AuthProvider>, provider) => {
|
|
171
|
-
acc[provider.id] = provider;
|
|
172
|
-
return acc;
|
|
173
|
-
}, {});
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// Get session/token from request
|
|
178
|
-
let session: AuthSession | null = null;
|
|
179
|
-
let token: string | null = null;
|
|
180
|
-
|
|
181
|
-
// Try JWT token first (Authorization header)
|
|
182
|
-
const authHeader = req.headers?.authorization;
|
|
183
|
-
if (authHeader?.startsWith('Bearer ')) {
|
|
184
|
-
token = authHeader.substring(7);
|
|
185
|
-
try {
|
|
186
|
-
const decoded = await authInstance.verifyJWT(token);
|
|
187
|
-
if (decoded) {
|
|
188
|
-
session = await authInstance.getSession({ req: { ...req, token } });
|
|
189
|
-
}
|
|
190
|
-
} catch (error: any) {
|
|
191
|
-
// Handle specific JWT errors gracefully and return proper HTTP responses
|
|
192
|
-
if (error.name === 'TokenExpiredError') {
|
|
193
|
-
logger.debug('JWT token expired', 'TokenValidation', {
|
|
194
|
-
message: error.message,
|
|
195
|
-
expiredAt: error.expiredAt,
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// If this is a protected route request, return a proper 401 response
|
|
199
|
-
if (req.headers.accept?.includes('application/json')) {
|
|
200
|
-
return res.status(401).json(
|
|
201
|
-
createAuthErrorResponse({
|
|
202
|
-
type: 'expired',
|
|
203
|
-
message: error.message,
|
|
204
|
-
expiredAt: error.expiredAt,
|
|
205
|
-
})
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
} else if (error.name === 'JsonWebTokenError') {
|
|
209
|
-
logger.debug('Invalid JWT token format', 'TokenValidation', {
|
|
210
|
-
message: error.message,
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
// If this is a protected route request, return a proper 401 response
|
|
214
|
-
if (req.headers.accept?.includes('application/json')) {
|
|
215
|
-
return res.status(401).json(
|
|
216
|
-
createAuthErrorResponse({
|
|
217
|
-
type: 'invalid',
|
|
218
|
-
message: error.message,
|
|
219
|
-
})
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
} else if (error.name === 'NotBeforeError') {
|
|
223
|
-
logger.debug('JWT token not active yet', 'TokenValidation', {
|
|
224
|
-
message: error.message,
|
|
225
|
-
date: error.date,
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
// If this is a protected route request, return a proper 401 response
|
|
229
|
-
if (req.headers.accept?.includes('application/json')) {
|
|
230
|
-
return res.status(401).json(
|
|
231
|
-
createAuthErrorResponse({
|
|
232
|
-
type: 'malformed',
|
|
233
|
-
message: error.message,
|
|
234
|
-
date: error.date,
|
|
235
|
-
})
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
} else {
|
|
239
|
-
logger.debug('JWT token validation failed', 'TokenValidation', {
|
|
240
|
-
error: error.message || error,
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
// Continue with unauthenticated state for non-API requests
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Try session cookie if no valid token
|
|
248
|
-
if (!session) {
|
|
249
|
-
try {
|
|
250
|
-
session = await authInstance.getSession({ req });
|
|
251
|
-
} catch (error) {
|
|
252
|
-
logger.debug('No valid session found', 'SessionValidation', { error });
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Populate auth request
|
|
257
|
-
if (session?.user) {
|
|
258
|
-
authRequest.user = session.user;
|
|
259
|
-
authRequest.session = session;
|
|
260
|
-
authRequest.token = token || undefined;
|
|
261
|
-
authRequest.isAuthenticated = true;
|
|
262
|
-
|
|
263
|
-
logger.debug('User authenticated', 'Authentication', {
|
|
264
|
-
userId: session.user.id,
|
|
265
|
-
provider: session.user.provider || 'unknown',
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Attach auth to request
|
|
270
|
-
req.auth = authRequest;
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
// Response processing hook
|
|
274
|
-
hooks.after('response', async (context: HookContext) => {
|
|
275
|
-
const req = context.request as any;
|
|
276
|
-
|
|
277
|
-
if (req.auth?.session) {
|
|
278
|
-
// Update session activity if needed
|
|
279
|
-
try {
|
|
280
|
-
await authInstance.updateSession(req.auth.session);
|
|
281
|
-
} catch (error) {
|
|
282
|
-
logger.warn('Failed to update session', 'SessionUpdate', { error });
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
logger.info(
|
|
288
|
-
`Auth.js middleware installed with ${config.providers.length} providers`,
|
|
289
|
-
'Installation'
|
|
290
|
-
);
|
|
291
|
-
},
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
// Auth.js implementation with proper JWT handling
|
|
295
|
-
async function initializeAuthJS(config: AuthOptions): Promise<any> {
|
|
296
|
-
return {
|
|
297
|
-
handler: async (req: any, res: any) => {
|
|
298
|
-
// Basic Auth.js request handler
|
|
299
|
-
const path = req.url.replace(config.basePath!, '');
|
|
300
|
-
|
|
301
|
-
if (path.startsWith('/signin')) {
|
|
302
|
-
// Handle sign in
|
|
303
|
-
return handleSignIn(req, res, config);
|
|
304
|
-
} else if (path.startsWith('/signout')) {
|
|
305
|
-
// Handle sign out
|
|
306
|
-
return handleSignOut(req, res, config);
|
|
307
|
-
} else if (path.startsWith('/callback')) {
|
|
308
|
-
// Handle OAuth callback
|
|
309
|
-
return handleCallback(req, res, config);
|
|
310
|
-
} else if (path.startsWith('/session')) {
|
|
311
|
-
// Handle session endpoint
|
|
312
|
-
return handleSession(req, res, config);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return null;
|
|
316
|
-
},
|
|
317
|
-
|
|
318
|
-
getSession: async ({ req }: { req: any }) => {
|
|
319
|
-
// Basic session retrieval
|
|
320
|
-
const sessionId =
|
|
321
|
-
req.cookies?.['next-auth.session-token'] ||
|
|
322
|
-
req.cookies?.['__Secure-next-auth.session-token'];
|
|
323
|
-
|
|
324
|
-
if (sessionId && req.session) {
|
|
325
|
-
return {
|
|
326
|
-
user: req.session.user || null,
|
|
327
|
-
expires: new Date(Date.now() + config.session!.maxAge! * 1000).toISOString(),
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return null;
|
|
332
|
-
},
|
|
333
|
-
|
|
334
|
-
verifyJWT: async (token: string) => {
|
|
335
|
-
const secret = process.env.JWT_SECRET || config.jwt?.secret || config.secret || '';
|
|
336
|
-
|
|
337
|
-
// Use the safe JWT verification function
|
|
338
|
-
const result = await safeVerifyJWT(token, secret);
|
|
339
|
-
|
|
340
|
-
if (!result.success) {
|
|
341
|
-
// Create a custom error that includes the structured error information
|
|
342
|
-
const customError = new Error(result.error?.message || 'JWT verification failed');
|
|
343
|
-
|
|
344
|
-
// Add the error type information for upstream handling
|
|
345
|
-
(customError as any).jwtErrorType = result.error?.type;
|
|
346
|
-
(customError as any).jwtErrorDetails = result.error;
|
|
347
|
-
|
|
348
|
-
// Map the safe error types back to standard JWT error names for compatibility
|
|
349
|
-
if (result.error?.type === 'expired') {
|
|
350
|
-
customError.name = 'TokenExpiredError';
|
|
351
|
-
(customError as any).expiredAt = result.error.expiredAt;
|
|
352
|
-
} else if (result.error?.type === 'invalid') {
|
|
353
|
-
customError.name = 'JsonWebTokenError';
|
|
354
|
-
} else if (result.error?.type === 'malformed') {
|
|
355
|
-
customError.name = 'NotBeforeError';
|
|
356
|
-
(customError as any).date = result.error.date;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
throw customError;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
return result.payload;
|
|
363
|
-
},
|
|
364
|
-
|
|
365
|
-
signIn: async (provider?: string, options?: any) => {
|
|
366
|
-
// Basic sign in redirect
|
|
367
|
-
return { url: `${config.basePath}/signin${provider ? `/${provider}` : ''}` };
|
|
368
|
-
},
|
|
369
|
-
|
|
370
|
-
signOut: async (options?: any) => {
|
|
371
|
-
// Basic sign out redirect
|
|
372
|
-
return { url: `${config.basePath}/signout` };
|
|
373
|
-
},
|
|
374
|
-
|
|
375
|
-
updateSession: async (session: any) => {
|
|
376
|
-
// Basic session update
|
|
377
|
-
return session;
|
|
378
|
-
},
|
|
379
|
-
|
|
380
|
-
getCsrfToken: async () => {
|
|
381
|
-
// Basic CSRF token generation
|
|
382
|
-
return crypto.randomBytes(32).toString('hex');
|
|
383
|
-
},
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Mock Auth.js handlers
|
|
388
|
-
async function handleSignIn(req: any, res: any, config: AuthOptions) {
|
|
389
|
-
// Implementation would depend on the provider
|
|
390
|
-
logger.debug('Handling sign in request', 'SignIn');
|
|
391
|
-
return null;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
async function handleSignOut(req: any, res: any, config: AuthOptions) {
|
|
395
|
-
// Clear session and redirect
|
|
396
|
-
logger.debug('Handling sign out request', 'SignOut');
|
|
397
|
-
return null;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
async function handleCallback(req: any, res: any, config: AuthOptions) {
|
|
401
|
-
// Handle OAuth callback
|
|
402
|
-
logger.debug('Handling OAuth callback', 'Callback');
|
|
403
|
-
return null;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
async function handleSession(req: any, res: any, config: AuthOptions) {
|
|
407
|
-
// Return current session
|
|
408
|
-
logger.debug('Handling session request', 'Session');
|
|
409
|
-
return null;
|
|
410
|
-
}
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
// Built-in Cache Middleware
|
|
2
|
-
import crypto from 'crypto';
|
|
3
|
-
import { MiddlewareInterface, HookContext } from '../../../types/hooks.js';
|
|
4
|
-
import { CacheAdapter, CacheOptions, CachedResponse } from '../../../types/cache.js';
|
|
5
|
-
import { createFrameworkLogger } from '../../logger/index.js';
|
|
6
|
-
import { createCacheAdapter } from './adapters/cache/index.js';
|
|
7
|
-
|
|
8
|
-
const logger = createFrameworkLogger('CacheMiddleware');
|
|
9
|
-
|
|
10
|
-
export const cache = (options: CacheOptions = {}): MiddlewareInterface => ({
|
|
11
|
-
name: 'cache',
|
|
12
|
-
version: '1.0.0',
|
|
13
|
-
metadata: {
|
|
14
|
-
name: 'cache',
|
|
15
|
-
version: '1.0.0',
|
|
16
|
-
description: 'Built-in cache middleware with pluggable storage adapters',
|
|
17
|
-
author: 'MoroJS Team',
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
install: async (hooks: any, middlewareOptions: any = {}) => {
|
|
21
|
-
logger.debug('Installing cache middleware', 'Installation');
|
|
22
|
-
|
|
23
|
-
// Initialize storage adapter
|
|
24
|
-
let storageAdapter: CacheAdapter;
|
|
25
|
-
|
|
26
|
-
if (options.adapter && typeof options.adapter === 'object' && 'get' in options.adapter) {
|
|
27
|
-
storageAdapter = options.adapter as CacheAdapter;
|
|
28
|
-
} else if (typeof options.adapter === 'string') {
|
|
29
|
-
storageAdapter = createCacheAdapter(options.adapter, options.adapterOptions);
|
|
30
|
-
} else {
|
|
31
|
-
// Default to memory cache
|
|
32
|
-
storageAdapter = createCacheAdapter('memory');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Cache key generation
|
|
36
|
-
const generateCacheKey = (req: any, strategy?: any): string => {
|
|
37
|
-
const prefix = options.keyPrefix || 'moro:cache:';
|
|
38
|
-
|
|
39
|
-
if (strategy?.key) {
|
|
40
|
-
return `${prefix}${strategy.key(req)}`;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Default key: method + path + query
|
|
44
|
-
const query = new URLSearchParams(req.query || {}).toString();
|
|
45
|
-
return `${prefix}${req.method}:${req.path}${query ? `?${query}` : ''}`;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// Find matching strategy
|
|
49
|
-
const findStrategy = (req: any): any | undefined => {
|
|
50
|
-
if (!options.strategies) return undefined;
|
|
51
|
-
|
|
52
|
-
for (const [pattern, strategy] of Object.entries(options.strategies)) {
|
|
53
|
-
const regex = new RegExp(pattern);
|
|
54
|
-
if (regex.test(req.path)) {
|
|
55
|
-
return strategy;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return undefined;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
hooks.before('request', async (context: HookContext) => {
|
|
63
|
-
const req = context.request as any;
|
|
64
|
-
const res = context.response as any;
|
|
65
|
-
|
|
66
|
-
// Only cache GET requests by default
|
|
67
|
-
if (req.method !== 'GET') {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const strategy = findStrategy(req);
|
|
72
|
-
const cacheKey = generateCacheKey(req, strategy);
|
|
73
|
-
|
|
74
|
-
// Check if caching is disabled for this request
|
|
75
|
-
if (strategy?.condition && !strategy.condition(req, res)) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
// Try to get from cache
|
|
81
|
-
const cachedResponse = await storageAdapter.get(cacheKey);
|
|
82
|
-
|
|
83
|
-
if (cachedResponse) {
|
|
84
|
-
logger.debug(`Cache hit: ${cacheKey}`, 'CacheHit');
|
|
85
|
-
|
|
86
|
-
// Set cache headers
|
|
87
|
-
res.setHeader('X-Cache', 'HIT');
|
|
88
|
-
res.setHeader('X-Cache-Key', cacheKey);
|
|
89
|
-
|
|
90
|
-
// Set HTTP cache headers
|
|
91
|
-
if (options.maxAge) {
|
|
92
|
-
res.setHeader('Cache-Control', `public, max-age=${options.maxAge}`);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (options.vary && options.vary.length > 0) {
|
|
96
|
-
res.setHeader('Vary', options.vary.join(', '));
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Send cached response
|
|
100
|
-
res.status(cachedResponse.status || 200);
|
|
101
|
-
|
|
102
|
-
// Set cached headers
|
|
103
|
-
if (cachedResponse.headers) {
|
|
104
|
-
Object.entries(cachedResponse.headers).forEach(([key, value]) => {
|
|
105
|
-
res.setHeader(key, value as string);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (cachedResponse.contentType) {
|
|
110
|
-
res.setHeader('Content-Type', cachedResponse.contentType);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
res.send(cachedResponse.body);
|
|
114
|
-
|
|
115
|
-
// Mark as handled
|
|
116
|
-
(context as any).handled = true;
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
logger.debug(`Cache miss: ${cacheKey}`, 'CacheMiss');
|
|
121
|
-
res.setHeader('X-Cache', 'MISS');
|
|
122
|
-
res.setHeader('X-Cache-Key', cacheKey);
|
|
123
|
-
} catch (error) {
|
|
124
|
-
logger.error('Cache retrieval error', 'CacheError', {
|
|
125
|
-
error,
|
|
126
|
-
key: cacheKey,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Store original response methods
|
|
131
|
-
const originalJson = res.json;
|
|
132
|
-
const originalSend = res.send;
|
|
133
|
-
const originalEnd = res.end;
|
|
134
|
-
|
|
135
|
-
// Wrap response methods to cache the response
|
|
136
|
-
const cacheResponse = async (body: any, contentType?: string) => {
|
|
137
|
-
try {
|
|
138
|
-
const ttl = strategy?.ttl || options.defaultTtl || 3600;
|
|
139
|
-
|
|
140
|
-
const cacheData: CachedResponse = {
|
|
141
|
-
body,
|
|
142
|
-
status: res.statusCode,
|
|
143
|
-
headers: res.getHeaders ? res.getHeaders() : {},
|
|
144
|
-
contentType: contentType || res.getHeader('Content-Type'),
|
|
145
|
-
timestamp: Date.now(),
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
await storageAdapter.set(cacheKey, cacheData, ttl);
|
|
149
|
-
logger.debug(`Response cached: ${cacheKey} (TTL: ${ttl}s)`, 'CacheSet');
|
|
150
|
-
} catch (error) {
|
|
151
|
-
logger.error('Cache storage error', 'CacheError', {
|
|
152
|
-
error,
|
|
153
|
-
key: cacheKey,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
// Override response methods
|
|
159
|
-
res.json = function (data: any) {
|
|
160
|
-
cacheResponse(data, 'application/json');
|
|
161
|
-
return originalJson.call(this, data);
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
res.send = function (data: any) {
|
|
165
|
-
cacheResponse(data);
|
|
166
|
-
return originalSend.call(this, data);
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
res.end = function (data?: any) {
|
|
170
|
-
if (data) {
|
|
171
|
-
cacheResponse(data);
|
|
172
|
-
}
|
|
173
|
-
return originalEnd.call(this, data);
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
// Add cache control methods
|
|
177
|
-
res.cacheControl = (directives: any) => {
|
|
178
|
-
const parts: string[] = [];
|
|
179
|
-
|
|
180
|
-
if (directives.public) parts.push('public');
|
|
181
|
-
if (directives.private) parts.push('private');
|
|
182
|
-
if (directives.noCache) parts.push('no-cache');
|
|
183
|
-
if (directives.noStore) parts.push('no-store');
|
|
184
|
-
if (directives.mustRevalidate) parts.push('must-revalidate');
|
|
185
|
-
if (directives.immutable) parts.push('immutable');
|
|
186
|
-
|
|
187
|
-
if (typeof directives.maxAge === 'number') parts.push(`max-age=${directives.maxAge}`);
|
|
188
|
-
if (typeof directives.staleWhileRevalidate === 'number') {
|
|
189
|
-
parts.push(`stale-while-revalidate=${directives.staleWhileRevalidate}`);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (!res.headersSent) {
|
|
193
|
-
res.setHeader('Cache-Control', parts.join(', '));
|
|
194
|
-
}
|
|
195
|
-
return res;
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
// Add ETag generation
|
|
199
|
-
if (options.etag !== false) {
|
|
200
|
-
res.generateETag = (content: string | Buffer) => {
|
|
201
|
-
const hash = crypto.createHash('md5').update(content).digest('hex');
|
|
202
|
-
const prefix = options.etag === 'weak' ? 'W/' : '';
|
|
203
|
-
return `${prefix}"${hash}"`;
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
logger.info('Cache middleware installed', 'Installation', {
|
|
209
|
-
adapter: typeof options.adapter === 'string' ? options.adapter : 'custom',
|
|
210
|
-
strategies: Object.keys(options.strategies || {}).length,
|
|
211
|
-
});
|
|
212
|
-
},
|
|
213
|
-
});
|