@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,147 +0,0 @@
|
|
|
1
|
-
// AWS Lambda runtime adapter
|
|
2
|
-
import { BaseRuntimeAdapter } from './base-adapter.js';
|
|
3
|
-
import { HttpRequest, HttpResponse } from '../../types/http.js';
|
|
4
|
-
import { RuntimeHttpResponse } from '../../types/runtime.js';
|
|
5
|
-
|
|
6
|
-
export interface LambdaEvent {
|
|
7
|
-
httpMethod: string;
|
|
8
|
-
path: string;
|
|
9
|
-
pathParameters?: Record<string, string> | null;
|
|
10
|
-
queryStringParameters?: Record<string, string> | null;
|
|
11
|
-
headers?: Record<string, string> | null;
|
|
12
|
-
multiValueHeaders?: Record<string, string[]> | null;
|
|
13
|
-
body?: string | null;
|
|
14
|
-
isBase64Encoded?: boolean;
|
|
15
|
-
requestContext?: {
|
|
16
|
-
identity?: {
|
|
17
|
-
sourceIp?: string;
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface LambdaContext {
|
|
23
|
-
requestId: string;
|
|
24
|
-
functionName: string;
|
|
25
|
-
functionVersion: string;
|
|
26
|
-
invokedFunctionArn: string;
|
|
27
|
-
memoryLimitInMB: string;
|
|
28
|
-
awsRequestId: string;
|
|
29
|
-
logGroupName: string;
|
|
30
|
-
logStreamName: string;
|
|
31
|
-
getRemainingTimeInMillis(): number;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface LambdaResponse {
|
|
35
|
-
statusCode: number;
|
|
36
|
-
headers?: Record<string, string>;
|
|
37
|
-
multiValueHeaders?: Record<string, string[]>;
|
|
38
|
-
body: string;
|
|
39
|
-
isBase64Encoded?: boolean;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class AWSLambdaAdapter extends BaseRuntimeAdapter {
|
|
43
|
-
readonly type = 'aws-lambda' as const;
|
|
44
|
-
|
|
45
|
-
async adaptRequest(event: LambdaEvent, context: LambdaContext): Promise<HttpRequest> {
|
|
46
|
-
const { pathname, query } = this.parseUrl(event.path);
|
|
47
|
-
|
|
48
|
-
// Merge query parameters from event
|
|
49
|
-
const mergedQuery = {
|
|
50
|
-
...query,
|
|
51
|
-
...(event.queryStringParameters || {}),
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// Parse body
|
|
55
|
-
let body: any;
|
|
56
|
-
if (event.body) {
|
|
57
|
-
const contentType = event.headers?.['content-type'] || event.headers?.['Content-Type'] || '';
|
|
58
|
-
if (event.isBase64Encoded) {
|
|
59
|
-
body = Buffer.from(event.body, 'base64').toString();
|
|
60
|
-
} else {
|
|
61
|
-
body = event.body;
|
|
62
|
-
}
|
|
63
|
-
body = await this.parseBody(body, contentType);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const baseRequest = {
|
|
67
|
-
method: event.httpMethod,
|
|
68
|
-
url: event.path,
|
|
69
|
-
path: pathname,
|
|
70
|
-
query: mergedQuery,
|
|
71
|
-
body,
|
|
72
|
-
headers: event.headers || {},
|
|
73
|
-
ip: event.requestContext?.identity?.sourceIp || 'unknown',
|
|
74
|
-
params: event.pathParameters || {},
|
|
75
|
-
requestId: context.awsRequestId,
|
|
76
|
-
cookies: this.parseCookies(event.headers?.cookie || ''),
|
|
77
|
-
files: {},
|
|
78
|
-
} as Partial<HttpRequest>;
|
|
79
|
-
|
|
80
|
-
return this.enhanceRequest(baseRequest);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async adaptResponse(moroResponse: HttpResponse | RuntimeHttpResponse): Promise<LambdaResponse> {
|
|
84
|
-
const runtimeResponse = moroResponse as RuntimeHttpResponse;
|
|
85
|
-
|
|
86
|
-
let body = runtimeResponse.body;
|
|
87
|
-
const status = runtimeResponse.statusCode || 200;
|
|
88
|
-
const headers = runtimeResponse.headers || {};
|
|
89
|
-
|
|
90
|
-
// Convert body to string
|
|
91
|
-
if (typeof body === 'object' && body !== null) {
|
|
92
|
-
body = JSON.stringify(body);
|
|
93
|
-
headers['Content-Type'] = 'application/json';
|
|
94
|
-
} else if (body === null || body === undefined) {
|
|
95
|
-
body = '';
|
|
96
|
-
} else {
|
|
97
|
-
body = String(body);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return {
|
|
101
|
-
statusCode: status,
|
|
102
|
-
headers,
|
|
103
|
-
body,
|
|
104
|
-
isBase64Encoded: false,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>) {
|
|
109
|
-
// Return a Lambda-compatible handler function
|
|
110
|
-
return async (event: LambdaEvent, context: LambdaContext) => {
|
|
111
|
-
try {
|
|
112
|
-
const moroReq = await this.adaptRequest(event, context);
|
|
113
|
-
const moroRes = this.createMockResponse();
|
|
114
|
-
|
|
115
|
-
await handler(moroReq, moroRes as any);
|
|
116
|
-
|
|
117
|
-
return await this.adaptResponse(moroRes);
|
|
118
|
-
} catch (error) {
|
|
119
|
-
return {
|
|
120
|
-
statusCode: 500,
|
|
121
|
-
headers: { 'Content-Type': 'application/json' },
|
|
122
|
-
body: JSON.stringify({
|
|
123
|
-
success: false,
|
|
124
|
-
error: 'Internal server error',
|
|
125
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
126
|
-
}),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Lambda doesn't have a listen method - it's event-driven
|
|
133
|
-
// listen method is optional in the interface
|
|
134
|
-
|
|
135
|
-
private parseCookies(cookieHeader: string): Record<string, string> {
|
|
136
|
-
const cookies: Record<string, string> = {};
|
|
137
|
-
if (cookieHeader) {
|
|
138
|
-
cookieHeader.split(';').forEach(cookie => {
|
|
139
|
-
const [name, ...rest] = cookie.trim().split('=');
|
|
140
|
-
if (name && rest.length > 0) {
|
|
141
|
-
cookies[name] = rest.join('=');
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return cookies;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// Base runtime adapter with common functionality
|
|
2
|
-
import { RuntimeAdapter, RuntimeType, RuntimeHttpResponse } from '../../types/runtime.js';
|
|
3
|
-
import { HttpRequest, HttpResponse } from '../../types/http.js';
|
|
4
|
-
import { randomBytes } from 'crypto';
|
|
5
|
-
|
|
6
|
-
export abstract class BaseRuntimeAdapter implements RuntimeAdapter {
|
|
7
|
-
abstract readonly type: RuntimeType;
|
|
8
|
-
|
|
9
|
-
abstract adaptRequest(runtimeRequest: any, ...args: any[]): Promise<HttpRequest>;
|
|
10
|
-
abstract adaptResponse(
|
|
11
|
-
moroResponse: HttpResponse | RuntimeHttpResponse,
|
|
12
|
-
runtimeRequest: any
|
|
13
|
-
): Promise<any>;
|
|
14
|
-
abstract createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>): any;
|
|
15
|
-
|
|
16
|
-
// Generate UUID without external dependency
|
|
17
|
-
protected generateUUID(): string {
|
|
18
|
-
return randomBytes(16)
|
|
19
|
-
.toString('hex')
|
|
20
|
-
.replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '$1-$2-$3-$4-$5');
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Common request enhancement
|
|
24
|
-
protected enhanceRequest(baseRequest: Partial<HttpRequest>): HttpRequest {
|
|
25
|
-
const request = baseRequest as HttpRequest;
|
|
26
|
-
|
|
27
|
-
// Add common properties
|
|
28
|
-
request.requestId = request.requestId || this.generateUUID();
|
|
29
|
-
request.ip = request.ip || 'unknown';
|
|
30
|
-
request.params = request.params || {};
|
|
31
|
-
request.query = request.query || {};
|
|
32
|
-
request.cookies = request.cookies || {};
|
|
33
|
-
request.files = request.files || {};
|
|
34
|
-
|
|
35
|
-
return request;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Common response enhancement
|
|
39
|
-
protected createMockResponse(): RuntimeHttpResponse {
|
|
40
|
-
const response: RuntimeHttpResponse = {
|
|
41
|
-
statusCode: 200,
|
|
42
|
-
headers: {},
|
|
43
|
-
body: null,
|
|
44
|
-
headersSent: false,
|
|
45
|
-
|
|
46
|
-
status: function (code: number) {
|
|
47
|
-
this.statusCode = code;
|
|
48
|
-
return this;
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
json: function (data: any) {
|
|
52
|
-
this.headers['Content-Type'] = 'application/json';
|
|
53
|
-
this.body = JSON.stringify(data);
|
|
54
|
-
this.headersSent = true;
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
send: function (data: string | Buffer) {
|
|
58
|
-
this.body = data;
|
|
59
|
-
this.headersSent = true;
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
cookie: function (name: string, value: string, options?: any) {
|
|
63
|
-
// Simple cookie implementation
|
|
64
|
-
const cookieString = `${name}=${value}`;
|
|
65
|
-
this.headers['Set-Cookie'] = cookieString;
|
|
66
|
-
return this;
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
clearCookie: function (name: string, options?: any) {
|
|
70
|
-
this.headers['Set-Cookie'] = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
|
|
71
|
-
return this;
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
redirect: function (url: string, status?: number) {
|
|
75
|
-
this.statusCode = status || 302;
|
|
76
|
-
this.headers['Location'] = url;
|
|
77
|
-
this.headersSent = true;
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
sendFile: async function (filePath: string) {
|
|
81
|
-
throw new Error('sendFile not implemented in this runtime');
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
return response;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Parse URL and query parameters
|
|
89
|
-
protected parseUrl(url: string): {
|
|
90
|
-
pathname: string;
|
|
91
|
-
query: Record<string, string>;
|
|
92
|
-
} {
|
|
93
|
-
try {
|
|
94
|
-
const urlObj = new URL(url, 'http://localhost');
|
|
95
|
-
const query: Record<string, string> = {};
|
|
96
|
-
|
|
97
|
-
urlObj.searchParams.forEach((value, key) => {
|
|
98
|
-
query[key] = value;
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
pathname: urlObj.pathname,
|
|
103
|
-
query,
|
|
104
|
-
};
|
|
105
|
-
} catch {
|
|
106
|
-
return {
|
|
107
|
-
pathname: url,
|
|
108
|
-
query: {},
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Parse body based on content type
|
|
114
|
-
protected async parseBody(body: any, contentType?: string): Promise<any> {
|
|
115
|
-
if (!body) return undefined;
|
|
116
|
-
|
|
117
|
-
if (typeof body === 'string') {
|
|
118
|
-
if (contentType?.includes('application/json')) {
|
|
119
|
-
try {
|
|
120
|
-
return JSON.parse(body);
|
|
121
|
-
} catch {
|
|
122
|
-
return body;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return body;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return body;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
// Cloudflare Workers runtime adapter
|
|
2
|
-
import { BaseRuntimeAdapter } from './base-adapter.js';
|
|
3
|
-
import { HttpRequest, HttpResponse } from '../../types/http.js';
|
|
4
|
-
import { RuntimeHttpResponse } from '../../types/runtime.js';
|
|
5
|
-
|
|
6
|
-
export interface WorkersEnv {
|
|
7
|
-
[key: string]: any;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface WorkersContext {
|
|
11
|
-
waitUntil(promise: Promise<any>): void;
|
|
12
|
-
passThroughOnException(): void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class CloudflareWorkersAdapter extends BaseRuntimeAdapter {
|
|
16
|
-
readonly type = 'cloudflare-workers' as const;
|
|
17
|
-
|
|
18
|
-
async adaptRequest(request: Request, env: WorkersEnv, ctx: WorkersContext): Promise<HttpRequest> {
|
|
19
|
-
const { pathname, query } = this.parseUrl(request.url);
|
|
20
|
-
|
|
21
|
-
// Parse body for POST/PUT/PATCH requests
|
|
22
|
-
let body: any;
|
|
23
|
-
if (['POST', 'PUT', 'PATCH'].includes(request.method)) {
|
|
24
|
-
const contentType = request.headers.get('content-type') || '';
|
|
25
|
-
if (contentType.includes('application/json')) {
|
|
26
|
-
try {
|
|
27
|
-
body = await request.json();
|
|
28
|
-
} catch {
|
|
29
|
-
body = await request.text();
|
|
30
|
-
}
|
|
31
|
-
} else if (contentType.includes('application/x-www-form-urlencoded')) {
|
|
32
|
-
body = await request.formData();
|
|
33
|
-
// Convert FormData to object
|
|
34
|
-
const formObject: Record<string, any> = {};
|
|
35
|
-
body.forEach((value: any, key: string) => {
|
|
36
|
-
formObject[key] = value;
|
|
37
|
-
});
|
|
38
|
-
body = formObject;
|
|
39
|
-
} else {
|
|
40
|
-
body = await request.text();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Convert Headers to plain object
|
|
45
|
-
const headers: Record<string, string> = {};
|
|
46
|
-
request.headers.forEach((value, key) => {
|
|
47
|
-
headers[key] = value;
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const baseRequest = {
|
|
51
|
-
method: request.method,
|
|
52
|
-
url: request.url,
|
|
53
|
-
path: pathname,
|
|
54
|
-
query,
|
|
55
|
-
body,
|
|
56
|
-
headers,
|
|
57
|
-
ip: this.getClientIP(headers, request),
|
|
58
|
-
params: {},
|
|
59
|
-
requestId: '',
|
|
60
|
-
cookies: this.parseCookies(headers.cookie || ''),
|
|
61
|
-
files: {},
|
|
62
|
-
// Add Workers-specific context
|
|
63
|
-
env,
|
|
64
|
-
ctx,
|
|
65
|
-
} as Partial<HttpRequest>;
|
|
66
|
-
|
|
67
|
-
return this.enhanceRequest(baseRequest);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async adaptResponse(moroResponse: HttpResponse | RuntimeHttpResponse): Promise<Response> {
|
|
71
|
-
const runtimeResponse = moroResponse as RuntimeHttpResponse;
|
|
72
|
-
|
|
73
|
-
// Handle different response states
|
|
74
|
-
let body = runtimeResponse.body;
|
|
75
|
-
let status = runtimeResponse.statusCode || 200;
|
|
76
|
-
const headers = runtimeResponse.headers || {};
|
|
77
|
-
|
|
78
|
-
// If it's a real HttpResponse, we need to extract the data differently
|
|
79
|
-
if ('statusCode' in moroResponse && typeof moroResponse.statusCode === 'number') {
|
|
80
|
-
status = moroResponse.statusCode;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Convert headers to Headers object
|
|
84
|
-
const responseHeaders = new Headers();
|
|
85
|
-
Object.entries(headers).forEach(([key, value]) => {
|
|
86
|
-
responseHeaders.set(key, value);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// Handle different body types
|
|
90
|
-
if (typeof body === 'object' && body !== null) {
|
|
91
|
-
body = JSON.stringify(body);
|
|
92
|
-
responseHeaders.set('Content-Type', 'application/json');
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return new Response(body, {
|
|
96
|
-
status,
|
|
97
|
-
headers: responseHeaders,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>) {
|
|
102
|
-
// Return a Cloudflare Workers-compatible handler function
|
|
103
|
-
return async (request: Request, env: WorkersEnv, ctx: WorkersContext) => {
|
|
104
|
-
try {
|
|
105
|
-
const moroReq = await this.adaptRequest(request, env, ctx);
|
|
106
|
-
const moroRes = this.createMockResponse();
|
|
107
|
-
|
|
108
|
-
await handler(moroReq, moroRes as any);
|
|
109
|
-
|
|
110
|
-
return await this.adaptResponse(moroRes);
|
|
111
|
-
} catch (error) {
|
|
112
|
-
return new Response(
|
|
113
|
-
JSON.stringify({
|
|
114
|
-
success: false,
|
|
115
|
-
error: 'Internal server error',
|
|
116
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
117
|
-
}),
|
|
118
|
-
{
|
|
119
|
-
status: 500,
|
|
120
|
-
headers: { 'Content-Type': 'application/json' },
|
|
121
|
-
}
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Cloudflare Workers doesn't have a listen method - it's handled by the platform
|
|
128
|
-
// listen method is optional in the interface
|
|
129
|
-
|
|
130
|
-
private getClientIP(headers: Record<string, string>, request: Request): string {
|
|
131
|
-
// Cloudflare provides the real IP in CF-Connecting-IP header
|
|
132
|
-
return (
|
|
133
|
-
headers['cf-connecting-ip'] ||
|
|
134
|
-
headers['x-forwarded-for']?.split(',')[0]?.trim() ||
|
|
135
|
-
headers['x-real-ip'] ||
|
|
136
|
-
'unknown'
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
private parseCookies(cookieHeader: string): Record<string, string> {
|
|
141
|
-
const cookies: Record<string, string> = {};
|
|
142
|
-
if (cookieHeader) {
|
|
143
|
-
cookieHeader.split(';').forEach(cookie => {
|
|
144
|
-
const [name, ...rest] = cookie.trim().split('=');
|
|
145
|
-
if (name && rest.length > 0) {
|
|
146
|
-
cookies[name] = rest.join('=');
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
return cookies;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
// Runtime adapters export
|
|
2
|
-
export { BaseRuntimeAdapter } from './base-adapter.js';
|
|
3
|
-
export { NodeRuntimeAdapter } from './node-adapter.js';
|
|
4
|
-
export { VercelEdgeAdapter } from './vercel-edge-adapter.js';
|
|
5
|
-
export { AWSLambdaAdapter } from './aws-lambda-adapter.js';
|
|
6
|
-
export { CloudflareWorkersAdapter } from './cloudflare-workers-adapter.js';
|
|
7
|
-
|
|
8
|
-
// Re-export types
|
|
9
|
-
export type {
|
|
10
|
-
RuntimeType,
|
|
11
|
-
RuntimeAdapter,
|
|
12
|
-
RuntimeConfig,
|
|
13
|
-
RuntimeMoroOptions,
|
|
14
|
-
RuntimeHttpResponse,
|
|
15
|
-
} from '../../types/runtime.js';
|
|
16
|
-
|
|
17
|
-
// Re-export specific runtime types
|
|
18
|
-
export type { LambdaEvent, LambdaContext, LambdaResponse } from './aws-lambda-adapter.js';
|
|
19
|
-
export type { WorkersEnv, WorkersContext } from './cloudflare-workers-adapter.js';
|
|
20
|
-
|
|
21
|
-
// Runtime factory functions
|
|
22
|
-
import { NodeRuntimeAdapter } from './node-adapter.js';
|
|
23
|
-
import { VercelEdgeAdapter } from './vercel-edge-adapter.js';
|
|
24
|
-
import { AWSLambdaAdapter } from './aws-lambda-adapter.js';
|
|
25
|
-
import { CloudflareWorkersAdapter } from './cloudflare-workers-adapter.js';
|
|
26
|
-
import { RuntimeType, RuntimeAdapter } from '../../types/runtime.js';
|
|
27
|
-
|
|
28
|
-
export function createRuntimeAdapter(type: RuntimeType): RuntimeAdapter {
|
|
29
|
-
switch (type) {
|
|
30
|
-
case 'node':
|
|
31
|
-
return new NodeRuntimeAdapter();
|
|
32
|
-
case 'vercel-edge':
|
|
33
|
-
return new VercelEdgeAdapter();
|
|
34
|
-
case 'aws-lambda':
|
|
35
|
-
return new AWSLambdaAdapter();
|
|
36
|
-
case 'cloudflare-workers':
|
|
37
|
-
return new CloudflareWorkersAdapter();
|
|
38
|
-
default:
|
|
39
|
-
throw new Error(`Unsupported runtime type: ${type}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Convenience functions for creating runtime-specific handlers
|
|
44
|
-
export function createNodeHandler(handler: (req: any, res: any) => Promise<void>) {
|
|
45
|
-
const adapter = new NodeRuntimeAdapter();
|
|
46
|
-
return adapter.createServer(handler);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function createEdgeHandler(handler: (req: any, res: any) => Promise<void>) {
|
|
50
|
-
const adapter = new VercelEdgeAdapter();
|
|
51
|
-
return adapter.createServer(handler);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function createLambdaHandler(handler: (req: any, res: any) => Promise<void>) {
|
|
55
|
-
const adapter = new AWSLambdaAdapter();
|
|
56
|
-
return adapter.createServer(handler);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function createWorkerHandler(handler: (req: any, res: any) => Promise<void>) {
|
|
60
|
-
const adapter = new CloudflareWorkersAdapter();
|
|
61
|
-
return adapter.createServer(handler);
|
|
62
|
-
}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
// Node.js runtime adapter
|
|
2
|
-
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
|
-
import { BaseRuntimeAdapter } from './base-adapter.js';
|
|
4
|
-
import { HttpRequest, HttpResponse } from '../../types/http.js';
|
|
5
|
-
import { RuntimeHttpResponse } from '../../types/runtime.js';
|
|
6
|
-
import { MoroHttpServer } from '../http/http-server.js';
|
|
7
|
-
|
|
8
|
-
export class NodeRuntimeAdapter extends BaseRuntimeAdapter {
|
|
9
|
-
readonly type = 'node' as const;
|
|
10
|
-
|
|
11
|
-
async adaptRequest(req: IncomingMessage): Promise<HttpRequest> {
|
|
12
|
-
const { pathname, query } = this.parseUrl(req.url || '/');
|
|
13
|
-
|
|
14
|
-
// Parse body for POST/PUT/PATCH requests
|
|
15
|
-
let body: any;
|
|
16
|
-
if (['POST', 'PUT', 'PATCH'].includes(req.method!)) {
|
|
17
|
-
body = await this.parseRequestBody(req);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const baseRequest = {
|
|
21
|
-
// Copy IncomingMessage properties we need
|
|
22
|
-
method: req.method!,
|
|
23
|
-
url: req.url!,
|
|
24
|
-
headers: req.headers as Record<string, string>,
|
|
25
|
-
httpVersion: req.httpVersion,
|
|
26
|
-
httpVersionMajor: req.httpVersionMajor,
|
|
27
|
-
httpVersionMinor: req.httpVersionMinor,
|
|
28
|
-
socket: req.socket,
|
|
29
|
-
|
|
30
|
-
// Add MoroJS-specific properties
|
|
31
|
-
path: pathname,
|
|
32
|
-
query,
|
|
33
|
-
body,
|
|
34
|
-
ip: this.getClientIP(req),
|
|
35
|
-
params: {},
|
|
36
|
-
requestId: '',
|
|
37
|
-
cookies: {},
|
|
38
|
-
files: {},
|
|
39
|
-
} as Partial<HttpRequest>;
|
|
40
|
-
|
|
41
|
-
return this.enhanceRequest(baseRequest);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
async adaptResponse(
|
|
45
|
-
moroResponse: HttpResponse | RuntimeHttpResponse,
|
|
46
|
-
req: IncomingMessage
|
|
47
|
-
): Promise<ServerResponse> {
|
|
48
|
-
// For Node.js, we typically work with the actual ServerResponse
|
|
49
|
-
// This method is mainly for converting mock responses back to real ones
|
|
50
|
-
return moroResponse as any;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
createServer(handler: (req: HttpRequest, res: HttpResponse) => Promise<void>): MoroHttpServer {
|
|
54
|
-
const httpServer = new MoroHttpServer();
|
|
55
|
-
|
|
56
|
-
// Replace the default request handler with our runtime-aware handler
|
|
57
|
-
const originalServer = httpServer.getServer();
|
|
58
|
-
originalServer.removeAllListeners('request');
|
|
59
|
-
|
|
60
|
-
originalServer.on('request', async (req: IncomingMessage, res: ServerResponse) => {
|
|
61
|
-
try {
|
|
62
|
-
const moroReq = await this.adaptRequest(req);
|
|
63
|
-
const moroRes = this.enhanceResponse(res);
|
|
64
|
-
|
|
65
|
-
await handler(moroReq, moroRes);
|
|
66
|
-
} catch (error) {
|
|
67
|
-
if (!res.headersSent) {
|
|
68
|
-
res.statusCode = 500;
|
|
69
|
-
res.setHeader('Content-Type', 'application/json');
|
|
70
|
-
res.end(
|
|
71
|
-
JSON.stringify({
|
|
72
|
-
success: false,
|
|
73
|
-
error: 'Internal server error',
|
|
74
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
75
|
-
})
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
return httpServer;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
listen(server: MoroHttpServer, port: number, host?: string, callback?: () => void): void {
|
|
85
|
-
server.listen(port, host as any, callback);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Helper methods
|
|
89
|
-
private async parseRequestBody(req: IncomingMessage): Promise<any> {
|
|
90
|
-
return new Promise((resolve, reject) => {
|
|
91
|
-
let body = '';
|
|
92
|
-
req.on('data', chunk => {
|
|
93
|
-
body += chunk.toString();
|
|
94
|
-
});
|
|
95
|
-
req.on('end', () => {
|
|
96
|
-
try {
|
|
97
|
-
const contentType = req.headers['content-type'] || '';
|
|
98
|
-
resolve(this.parseBody(body, contentType));
|
|
99
|
-
} catch (error) {
|
|
100
|
-
reject(error);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
req.on('error', reject);
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
private getClientIP(req: IncomingMessage): string {
|
|
108
|
-
const forwarded = req.headers['x-forwarded-for'] as string;
|
|
109
|
-
if (forwarded) {
|
|
110
|
-
return forwarded.split(',')[0].trim();
|
|
111
|
-
}
|
|
112
|
-
return req.socket.remoteAddress || 'unknown';
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
private enhanceResponse(res: ServerResponse): HttpResponse {
|
|
116
|
-
const enhanced = res as any;
|
|
117
|
-
|
|
118
|
-
// Add MoroJS response methods if they don't exist
|
|
119
|
-
if (!enhanced.json) {
|
|
120
|
-
enhanced.json = function (data: any) {
|
|
121
|
-
this.setHeader('Content-Type', 'application/json');
|
|
122
|
-
this.end(JSON.stringify(data));
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (!enhanced.status) {
|
|
127
|
-
enhanced.status = function (code: number) {
|
|
128
|
-
this.statusCode = code;
|
|
129
|
-
return this;
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (!enhanced.send) {
|
|
134
|
-
enhanced.send = function (data: string | Buffer) {
|
|
135
|
-
this.end(data);
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (!enhanced.cookie) {
|
|
140
|
-
enhanced.cookie = function (name: string, value: string, options?: any) {
|
|
141
|
-
if (!this.headersSent) {
|
|
142
|
-
const cookieString = `${name}=${value}`;
|
|
143
|
-
this.setHeader('Set-Cookie', cookieString);
|
|
144
|
-
}
|
|
145
|
-
return this;
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (!enhanced.clearCookie) {
|
|
150
|
-
enhanced.clearCookie = function (name: string, options?: any) {
|
|
151
|
-
if (!this.headersSent) {
|
|
152
|
-
this.setHeader('Set-Cookie', `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`);
|
|
153
|
-
}
|
|
154
|
-
return this;
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (!enhanced.redirect) {
|
|
159
|
-
enhanced.redirect = function (url: string, status?: number) {
|
|
160
|
-
if (!this.headersSent) {
|
|
161
|
-
this.statusCode = status || 302;
|
|
162
|
-
this.setHeader('Location', url);
|
|
163
|
-
this.end();
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (!enhanced.sendFile) {
|
|
169
|
-
enhanced.sendFile = async function (filePath: string) {
|
|
170
|
-
const fs = await import('fs');
|
|
171
|
-
const path = await import('path');
|
|
172
|
-
|
|
173
|
-
try {
|
|
174
|
-
const data = await fs.promises.readFile(filePath);
|
|
175
|
-
const ext = path.extname(filePath);
|
|
176
|
-
|
|
177
|
-
// Basic content type detection
|
|
178
|
-
const contentTypes: Record<string, string> = {
|
|
179
|
-
'.html': 'text/html',
|
|
180
|
-
'.js': 'application/javascript',
|
|
181
|
-
'.css': 'text/css',
|
|
182
|
-
'.json': 'application/json',
|
|
183
|
-
'.png': 'image/png',
|
|
184
|
-
'.jpg': 'image/jpeg',
|
|
185
|
-
'.jpeg': 'image/jpeg',
|
|
186
|
-
'.gif': 'image/gif',
|
|
187
|
-
'.svg': 'image/svg+xml',
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const contentType = contentTypes[ext] || 'application/octet-stream';
|
|
191
|
-
this.setHeader('Content-Type', contentType);
|
|
192
|
-
this.end(data);
|
|
193
|
-
} catch (error) {
|
|
194
|
-
this.statusCode = 404;
|
|
195
|
-
this.end('File not found');
|
|
196
|
-
}
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return enhanced;
|
|
201
|
-
}
|
|
202
|
-
}
|