@morojs/moro 1.6.1 → 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/README.md +74 -256
- package/dist/core/auth/morojs-adapter.js +20 -20
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-manager.d.ts +44 -0
- package/dist/core/config/config-manager.js +104 -0
- package/dist/core/config/config-manager.js.map +1 -0
- package/dist/core/config/config-sources.d.ts +21 -0
- package/dist/core/config/config-sources.js +503 -0
- package/dist/core/config/config-sources.js.map +1 -0
- package/dist/core/config/config-validator.d.ts +21 -0
- package/dist/core/config/config-validator.js +791 -0
- package/dist/core/config/config-validator.js.map +1 -0
- package/dist/core/config/file-loader.d.ts +1 -6
- package/dist/core/config/file-loader.js +21 -249
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +41 -12
- package/dist/core/config/index.js +65 -54
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +55 -44
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +10 -3
- package/dist/core/config/utils.js +31 -58
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +18 -11
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +19 -29
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +13 -1
- package/dist/core/database/adapters/mongodb.js +46 -10
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +14 -1
- package/dist/core/database/adapters/mysql.js +19 -9
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +12 -2
- package/dist/core/database/adapters/postgresql.js +19 -9
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +12 -1
- package/dist/core/database/adapters/redis.js +48 -13
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +3 -1
- package/dist/core/database/adapters/sqlite.js +19 -8
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/database/index.js +2 -18
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.d.ts +9 -9
- package/dist/core/docs/index.js +14 -35
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +2 -2
- package/dist/core/docs/openapi-generator.js +11 -16
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +2 -2
- package/dist/core/docs/schema-to-openapi.js +5 -11
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +4 -9
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +26 -29
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +31 -28
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +7 -11
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/events/index.js +1 -5
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +20 -13
- package/dist/core/framework.js +285 -102
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +59 -7
- package/dist/core/http/http-server.js +202 -185
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +4 -3
- package/dist/core/http/index.js +3 -8
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +46 -0
- package/dist/core/http/uws-http-server.js +523 -0
- package/dist/core/http/uws-http-server.js.map +1 -0
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +20 -23
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/index.js +2 -24
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +30 -14
- package/dist/core/logger/logger.js +398 -223
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +1 -1
- package/dist/core/logger/outputs.js +8 -17
- package/dist/core/logger/outputs.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} +12 -23
- 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/auth/jwt-helpers.d.ts +118 -0
- package/dist/core/middleware/built-in/auth/jwt-helpers.js +218 -0
- 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} +5 -10
- 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 +10 -47
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/cache/adapters/cache/index.d.ts +5 -0
- package/dist/core/middleware/built-in/cache/adapters/cache/index.js +21 -0
- 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 +3 -7
- 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 +3 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +11 -9
- package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/cache/adapters/index.d.ts +2 -0
- package/dist/core/middleware/built-in/cache/adapters/index.js +5 -0
- 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} +30 -14
- 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 +3 -7
- 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 +3 -7
- 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 +3 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +12 -10
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js +21 -0
- 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/cdn/adapters/index.js +5 -0
- 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/middleware.js +26 -0
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +28 -61
- package/dist/core/middleware/built-in/index.js +48 -78
- 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/middleware.js +29 -0
- 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} +24 -22
- 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/middleware.js +24 -0
- 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} +16 -9
- 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.d.ts +4 -4
- package/dist/core/middleware/index.js +14 -28
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +19 -2
- package/dist/core/modules/auto-discovery.js +391 -74
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js +2 -9
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +23 -54
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +4 -3
- package/dist/core/networking/adapters/index.js +3 -7
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/socketio-adapter.js +5 -40
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
- package/dist/core/networking/adapters/uws-adapter.js +513 -0
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
- package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
- package/dist/core/networking/adapters/ws-adapter.js +8 -43
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.d.ts +3 -2
- package/dist/core/networking/index.js +2 -7
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +8 -12
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.js +1 -2
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +9 -11
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.d.ts +140 -0
- package/dist/core/pooling/object-pool-manager.js +502 -0
- package/dist/core/pooling/object-pool-manager.js.map +1 -0
- package/dist/core/routing/app-integration.d.ts +14 -12
- package/dist/core/routing/app-integration.js +49 -85
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +17 -11
- package/dist/core/routing/index.js +48 -237
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/path-matcher.d.ts +67 -0
- package/dist/core/routing/path-matcher.js +182 -0
- package/dist/core/routing/path-matcher.js.map +1 -0
- package/dist/core/routing/router.d.ts +38 -0
- package/dist/core/routing/router.js +68 -0
- package/dist/core/routing/router.js.map +1 -0
- package/dist/core/routing/unified-router.d.ts +132 -0
- package/dist/core/routing/unified-router.js +639 -0
- package/dist/core/routing/unified-router.js.map +1 -0
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +2 -6
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +3 -7
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +12 -12
- package/dist/core/runtime/index.js +22 -35
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +4 -4
- package/dist/core/runtime/node-adapter.js +18 -49
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +2 -6
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +1 -5
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +12 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +2 -2
- package/dist/core/utilities/hooks.js +7 -12
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +5 -4
- package/dist/core/utilities/index.js +5 -19
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/package-utils.d.ts +38 -0
- package/dist/core/utilities/package-utils.js +57 -0
- package/dist/core/utilities/package-utils.js.map +1 -0
- package/dist/core/validation/adapters.d.ts +1 -1
- package/dist/core/validation/adapters.js +15 -26
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/index.d.ts +6 -4
- package/dist/core/validation/index.js +57 -28
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js +3 -9
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/index.d.ts +52 -52
- package/dist/index.js +24 -132
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +70 -16
- package/dist/moro.js +650 -269
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.js +3 -9
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js +1 -2
- package/dist/types/cdn.js +1 -2
- package/dist/types/config.d.ts +73 -2
- package/dist/types/config.js +1 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +36 -42
- package/dist/types/core.js +1 -2
- package/dist/types/database.js +1 -2
- package/dist/types/discovery.js +1 -2
- package/dist/types/events.js +1 -2
- package/dist/types/hooks.d.ts +4 -1
- package/dist/types/hooks.js +1 -2
- package/dist/types/http.d.ts +16 -1
- package/dist/types/http.js +1 -2
- package/dist/types/logger.d.ts +7 -0
- package/dist/types/logger.js +1 -2
- package/dist/types/module.d.ts +11 -0
- package/dist/types/module.js +1 -2
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.js +1 -2
- package/dist/types/session.js +1 -2
- package/package.json +18 -55
- package/dist/core/config/loader.d.ts +0 -7
- package/dist/core/config/loader.js +0 -269
- package/dist/core/config/loader.js.map +0 -1
- package/dist/core/config/validation.d.ts +0 -17
- package/dist/core/config/validation.js +0 -131
- package/dist/core/config/validation.js.map +0 -1
- package/dist/core/http/router.d.ts +0 -14
- package/dist/core/http/router.js +0 -109
- package/dist/core/http/router.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +0 -5
- package/dist/core/middleware/built-in/adapters/cache/index.js +0 -28
- 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.d.ts +0 -5
- package/dist/core/middleware/built-in/adapters/cdn/index.js +0 -28
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/index.d.ts +0 -4
- package/dist/core/middleware/built-in/adapters/index.js +0 -26
- 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 -281
- 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 -113
- 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 -68
- 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 -29
- 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 -71
- 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 -63
- 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 +0 -19
- package/dist/core/middleware/built-in/error-tracker.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 +0 -22
- 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 +0 -16
- 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 -209
- 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 -71
- 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/src/core/auth/README.md +0 -339
- package/src/core/auth/morojs-adapter.ts +0 -410
- package/src/core/config/file-loader.ts +0 -407
- package/src/core/config/index.ts +0 -60
- package/src/core/config/loader.ts +0 -633
- package/src/core/config/schema.ts +0 -150
- package/src/core/config/utils.ts +0 -251
- package/src/core/config/validation.ts +0 -140
- package/src/core/database/README.md +0 -228
- package/src/core/database/adapters/drizzle.ts +0 -403
- package/src/core/database/adapters/index.ts +0 -42
- package/src/core/database/adapters/mongodb.ts +0 -269
- package/src/core/database/adapters/mysql.ts +0 -207
- package/src/core/database/adapters/postgresql.ts +0 -201
- package/src/core/database/adapters/redis.ts +0 -326
- package/src/core/database/adapters/sqlite.ts +0 -247
- 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 -148
- package/src/core/docs/simple-docs.ts +0 -295
- package/src/core/docs/swagger-ui.ts +0 -351
- 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 -636
- package/src/core/http/http-server.ts +0 -1787
- package/src/core/http/index.ts +0 -6
- package/src/core/http/router.ts +0 -141
- package/src/core/logger/filters.ts +0 -145
- package/src/core/logger/index.ts +0 -20
- package/src/core/logger/logger.ts +0 -814
- package/src/core/logger/outputs.ts +0 -134
- 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 -100
- 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 -83
- package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
- package/src/core/middleware/built-in/adapters/index.ts +0 -7
- 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 -329
- package/src/core/middleware/built-in/cache.ts +0 -211
- 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 -79
- 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 -14
- package/src/core/middleware/built-in/session.ts +0 -288
- package/src/core/middleware/built-in/sse.ts +0 -86
- 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 -263
- package/src/core/modules/index.ts +0 -3
- package/src/core/modules/modules.ts +0 -124
- package/src/core/networking/adapters/index.ts +0 -16
- package/src/core/networking/adapters/socketio-adapter.ts +0 -252
- package/src/core/networking/adapters/ws-adapter.ts +0 -430
- package/src/core/networking/index.ts +0 -3
- package/src/core/networking/service-discovery.ts +0 -304
- package/src/core/networking/websocket-adapter.ts +0 -217
- package/src/core/networking/websocket-manager.ts +0 -308
- package/src/core/routing/app-integration.ts +0 -216
- package/src/core/routing/index.ts +0 -488
- 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 -196
- 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 -16
- package/src/core/validation/adapters.ts +0 -147
- package/src/core/validation/index.ts +0 -206
- package/src/core/validation/schema-interface.ts +0 -100
- package/src/index.ts +0 -226
- package/src/moro.ts +0 -1197
- 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 -157
- package/src/types/core.ts +0 -56
- 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 -67
- package/src/types/logger.ts +0 -93
- package/src/types/module.ts +0 -87
- package/src/types/runtime.ts +0 -76
- package/src/types/session.ts +0 -89
- package/tsconfig.json +0 -21
- /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
package/src/moro.ts
DELETED
|
@@ -1,1197 +0,0 @@
|
|
|
1
|
-
// Moro Framework - Modern TypeScript API Framework
|
|
2
|
-
// Built for developers who demand performance, elegance, and zero compromises
|
|
3
|
-
// Event-driven • Modular • Enterprise-ready • Developer-first
|
|
4
|
-
import { Moro as MoroCore } from './core/framework';
|
|
5
|
-
import { HttpRequest, HttpResponse, middleware } from './core/http';
|
|
6
|
-
import { ModuleConfig, InternalRouteDefinition } from './types/module';
|
|
7
|
-
import { MoroOptions } from './types/core';
|
|
8
|
-
import { MoroEventBus } from './core/events';
|
|
9
|
-
import {
|
|
10
|
-
createFrameworkLogger,
|
|
11
|
-
logger as globalLogger,
|
|
12
|
-
applyLoggingConfiguration,
|
|
13
|
-
} from './core/logger';
|
|
14
|
-
import { MiddlewareManager } from './core/middleware';
|
|
15
|
-
import { IntelligentRoutingManager } from './core/routing/app-integration';
|
|
16
|
-
import { RouteBuilder, RouteSchema, CompiledRoute } from './core/routing';
|
|
17
|
-
import { AppDocumentationManager, DocsConfig } from './core/docs';
|
|
18
|
-
import { readdirSync, statSync } from 'fs';
|
|
19
|
-
import { join } from 'path';
|
|
20
|
-
import { EventEmitter } from 'events';
|
|
21
|
-
// Configuration System Integration
|
|
22
|
-
import { initializeConfig, getGlobalConfig, type AppConfig } from './core/config';
|
|
23
|
-
// Runtime System Integration
|
|
24
|
-
import {
|
|
25
|
-
RuntimeAdapter,
|
|
26
|
-
RuntimeType,
|
|
27
|
-
createRuntimeAdapter,
|
|
28
|
-
NodeRuntimeAdapter,
|
|
29
|
-
} from './core/runtime';
|
|
30
|
-
|
|
31
|
-
export class Moro extends EventEmitter {
|
|
32
|
-
private coreFramework: MoroCore;
|
|
33
|
-
private routes: InternalRouteDefinition[] = [];
|
|
34
|
-
private moduleCounter = 0;
|
|
35
|
-
private loadedModules = new Set<string>();
|
|
36
|
-
private routeHandlers: Record<string, Function> = {};
|
|
37
|
-
// Enterprise event system integration
|
|
38
|
-
private eventBus: MoroEventBus;
|
|
39
|
-
// Application logger
|
|
40
|
-
private logger = createFrameworkLogger('App');
|
|
41
|
-
// Intelligent routing system
|
|
42
|
-
private intelligentRouting = new IntelligentRoutingManager();
|
|
43
|
-
// Documentation system
|
|
44
|
-
private documentation = new AppDocumentationManager();
|
|
45
|
-
// Configuration system
|
|
46
|
-
private config: AppConfig;
|
|
47
|
-
// Runtime system
|
|
48
|
-
private runtimeAdapter: RuntimeAdapter;
|
|
49
|
-
private runtimeType: RuntimeType;
|
|
50
|
-
// Middleware system
|
|
51
|
-
private middlewareManager: MiddlewareManager;
|
|
52
|
-
|
|
53
|
-
constructor(options: MoroOptions = {}) {
|
|
54
|
-
super(); // Call EventEmitter constructor
|
|
55
|
-
|
|
56
|
-
// Configure logger from environment variables BEFORE config system initialization
|
|
57
|
-
// This ensures the config loading process respects the log level
|
|
58
|
-
const envLogLevel = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;
|
|
59
|
-
if (envLogLevel) {
|
|
60
|
-
applyLoggingConfiguration({ level: envLogLevel }, undefined);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Initialize configuration system - create a deep copy for this instance
|
|
64
|
-
this.config = JSON.parse(JSON.stringify(initializeConfig()));
|
|
65
|
-
|
|
66
|
-
// Apply logging configuration from the loaded config (this happens after config file processing)
|
|
67
|
-
if (this.config.logging) {
|
|
68
|
-
applyLoggingConfiguration(this.config.logging, undefined);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Apply additional logging configuration from createApp options (takes precedence)
|
|
72
|
-
if (options.logger !== undefined) {
|
|
73
|
-
applyLoggingConfiguration(undefined, options.logger);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Apply performance configuration from createApp options (takes precedence)
|
|
77
|
-
if (options.performance) {
|
|
78
|
-
if (options.performance.clustering) {
|
|
79
|
-
this.config.performance.clustering = {
|
|
80
|
-
...this.config.performance.clustering,
|
|
81
|
-
...options.performance.clustering,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
if (options.performance.compression) {
|
|
85
|
-
this.config.performance.compression = {
|
|
86
|
-
...this.config.performance.compression,
|
|
87
|
-
...options.performance.compression,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
if (options.performance.circuitBreaker) {
|
|
91
|
-
this.config.performance.circuitBreaker = {
|
|
92
|
-
...this.config.performance.circuitBreaker,
|
|
93
|
-
...options.performance.circuitBreaker,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Apply modules configuration from createApp options (takes precedence)
|
|
99
|
-
if (options.modules) {
|
|
100
|
-
if (options.modules.cache) {
|
|
101
|
-
this.config.modules.cache = {
|
|
102
|
-
...this.config.modules.cache,
|
|
103
|
-
...options.modules.cache,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
if (options.modules.rateLimit) {
|
|
107
|
-
this.config.modules.rateLimit = {
|
|
108
|
-
...this.config.modules.rateLimit,
|
|
109
|
-
...options.modules.rateLimit,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
if (options.modules.validation) {
|
|
113
|
-
this.config.modules.validation = {
|
|
114
|
-
...this.config.modules.validation,
|
|
115
|
-
...options.modules.validation,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
this.logger.info(
|
|
121
|
-
`Configuration system initialized: ${this.config.server.environment}:${this.config.server.port}`
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
// Initialize runtime system
|
|
125
|
-
this.runtimeType = options.runtime?.type || 'node';
|
|
126
|
-
this.runtimeAdapter = options.runtime?.adapter || createRuntimeAdapter(this.runtimeType);
|
|
127
|
-
|
|
128
|
-
this.logger.info(`Runtime system initialized: ${this.runtimeType}`, 'Runtime');
|
|
129
|
-
|
|
130
|
-
// Pass logging configuration from config to framework
|
|
131
|
-
const frameworkOptions: any = {
|
|
132
|
-
...options,
|
|
133
|
-
logger: this.config.logging,
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
this.coreFramework = new MoroCore(frameworkOptions);
|
|
137
|
-
|
|
138
|
-
// Initialize middleware system
|
|
139
|
-
this.middlewareManager = new MiddlewareManager();
|
|
140
|
-
|
|
141
|
-
// Integrate hooks system with HTTP server
|
|
142
|
-
const httpServer = (this.coreFramework as any).httpServer;
|
|
143
|
-
if (httpServer && httpServer.setHookManager) {
|
|
144
|
-
httpServer.setHookManager((this.middlewareManager as any).hooks);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Configure HTTP server performance based on config
|
|
148
|
-
if (httpServer && httpServer.configurePerformance) {
|
|
149
|
-
const performanceConfig = this.config.performance;
|
|
150
|
-
httpServer.configurePerformance({
|
|
151
|
-
compression: performanceConfig?.compression || { enabled: true },
|
|
152
|
-
minimal: performanceConfig?.compression?.enabled === false, // Enable minimal mode if compression disabled
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Access enterprise event bus from core framework
|
|
157
|
-
this.eventBus = (this.coreFramework as any).eventBus;
|
|
158
|
-
|
|
159
|
-
// Setup default middleware if enabled - use config defaults with options override
|
|
160
|
-
this.setupDefaultMiddleware({
|
|
161
|
-
...this.getDefaultOptionsFromConfig(),
|
|
162
|
-
...options,
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// Auto-discover modules if enabled
|
|
166
|
-
if (options.autoDiscover !== false) {
|
|
167
|
-
this.autoDiscoverModules(options.modulesPath || './modules');
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Emit initialization event through enterprise event bus
|
|
171
|
-
this.eventBus.emit('framework:initialized', {
|
|
172
|
-
options,
|
|
173
|
-
config: this.config,
|
|
174
|
-
runtime: this.runtimeType,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Get configuration object
|
|
180
|
-
*/
|
|
181
|
-
getConfig(): AppConfig {
|
|
182
|
-
return this.config;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Get runtime adapter
|
|
187
|
-
*/
|
|
188
|
-
getRuntime(): RuntimeAdapter {
|
|
189
|
-
return this.runtimeAdapter;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Get runtime type
|
|
194
|
-
*/
|
|
195
|
-
getRuntimeType(): RuntimeType {
|
|
196
|
-
return this.runtimeType;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Extract default options from configuration
|
|
201
|
-
*/
|
|
202
|
-
private getDefaultOptionsFromConfig(): Partial<MoroOptions> {
|
|
203
|
-
return {
|
|
204
|
-
cors: this.config.security.cors.enabled,
|
|
205
|
-
compression: this.config.performance.compression.enabled,
|
|
206
|
-
helmet: this.config.security.helmet.enabled,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Intelligent route methods - chainable with automatic middleware ordering
|
|
211
|
-
// Overloads for better TypeScript inference
|
|
212
|
-
get(path: string): RouteBuilder;
|
|
213
|
-
get(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
214
|
-
get(
|
|
215
|
-
path: string,
|
|
216
|
-
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
217
|
-
options?: any
|
|
218
|
-
): RouteBuilder | this {
|
|
219
|
-
if (handler) {
|
|
220
|
-
// Direct route registration
|
|
221
|
-
return this.addRoute('GET', path, handler, options);
|
|
222
|
-
}
|
|
223
|
-
// Chainable route builder
|
|
224
|
-
return this.intelligentRouting.get(path);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
post(path: string): RouteBuilder;
|
|
228
|
-
post(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
229
|
-
post(
|
|
230
|
-
path: string,
|
|
231
|
-
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
232
|
-
options?: any
|
|
233
|
-
): RouteBuilder | this {
|
|
234
|
-
if (handler) {
|
|
235
|
-
// Direct route registration
|
|
236
|
-
return this.addRoute('POST', path, handler, options);
|
|
237
|
-
}
|
|
238
|
-
// Chainable route builder
|
|
239
|
-
return this.intelligentRouting.post(path);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
put(path: string): RouteBuilder;
|
|
243
|
-
put(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
244
|
-
put(
|
|
245
|
-
path: string,
|
|
246
|
-
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
247
|
-
options?: any
|
|
248
|
-
): RouteBuilder | this {
|
|
249
|
-
if (handler) {
|
|
250
|
-
// Direct route registration
|
|
251
|
-
return this.addRoute('PUT', path, handler, options);
|
|
252
|
-
}
|
|
253
|
-
// Chainable route builder
|
|
254
|
-
return this.intelligentRouting.put(path);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
delete(path: string): RouteBuilder;
|
|
258
|
-
delete(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
259
|
-
delete(
|
|
260
|
-
path: string,
|
|
261
|
-
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
262
|
-
options?: any
|
|
263
|
-
): RouteBuilder | this {
|
|
264
|
-
if (handler) {
|
|
265
|
-
// Direct route registration
|
|
266
|
-
return this.addRoute('DELETE', path, handler, options);
|
|
267
|
-
}
|
|
268
|
-
// Chainable route builder
|
|
269
|
-
return this.intelligentRouting.delete(path);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
patch(path: string): RouteBuilder;
|
|
273
|
-
patch(path: string, handler: (req: HttpRequest, res: HttpResponse) => any, options?: any): this;
|
|
274
|
-
patch(
|
|
275
|
-
path: string,
|
|
276
|
-
handler?: (req: HttpRequest, res: HttpResponse) => any,
|
|
277
|
-
options?: any
|
|
278
|
-
): RouteBuilder | this {
|
|
279
|
-
if (handler) {
|
|
280
|
-
// Direct route registration
|
|
281
|
-
return this.addRoute('PATCH', path, handler, options);
|
|
282
|
-
}
|
|
283
|
-
// Chainable route builder
|
|
284
|
-
return this.intelligentRouting.patch(path);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Schema-first route method
|
|
288
|
-
route(schema: RouteSchema): CompiledRoute {
|
|
289
|
-
return this.intelligentRouting.route(schema);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Enable automatic API documentation
|
|
293
|
-
enableDocs(config: DocsConfig): void {
|
|
294
|
-
this.documentation.enableDocs(config, this.intelligentRouting);
|
|
295
|
-
|
|
296
|
-
this.logger.info(`API Documentation enabled at ${config.basePath || '/docs'}`, 'Documentation');
|
|
297
|
-
this.eventBus.emit('docs:enabled', { config });
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// Get OpenAPI specification
|
|
301
|
-
getOpenAPISpec() {
|
|
302
|
-
return this.documentation.getOpenAPISpec();
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// Get documentation as JSON
|
|
306
|
-
getDocsJSON(): string {
|
|
307
|
-
return this.documentation.getDocsJSON();
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// Get documentation as YAML
|
|
311
|
-
getDocsYAML(): string {
|
|
312
|
-
return this.documentation.getDocsYAML();
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Refresh documentation (useful after adding routes dynamically)
|
|
316
|
-
refreshDocs(): void {
|
|
317
|
-
this.documentation.refreshDocs();
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Universal middleware system - seamlessly handles standard and advanced middleware
|
|
321
|
-
async use(middlewareOrFunction: any, config?: any) {
|
|
322
|
-
// Standard middleware integration (req, res, next pattern)
|
|
323
|
-
if (typeof middlewareOrFunction === 'function' && middlewareOrFunction.length >= 3) {
|
|
324
|
-
this.coreFramework.addMiddleware(middlewareOrFunction);
|
|
325
|
-
this.eventBus.emit('middleware:registered', {
|
|
326
|
-
type: 'standard',
|
|
327
|
-
middleware: middlewareOrFunction,
|
|
328
|
-
});
|
|
329
|
-
return this;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Function-style middleware execution
|
|
333
|
-
if (typeof middlewareOrFunction === 'function' && middlewareOrFunction.length <= 1) {
|
|
334
|
-
await middlewareOrFunction(this);
|
|
335
|
-
this.eventBus.emit('middleware:executed', {
|
|
336
|
-
type: 'function',
|
|
337
|
-
middleware: middlewareOrFunction,
|
|
338
|
-
});
|
|
339
|
-
return this;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Advanced middleware pipeline integration - check if it's a MiddlewareInterface
|
|
343
|
-
if (
|
|
344
|
-
middlewareOrFunction &&
|
|
345
|
-
typeof middlewareOrFunction === 'object' &&
|
|
346
|
-
middlewareOrFunction.install &&
|
|
347
|
-
middlewareOrFunction.metadata
|
|
348
|
-
) {
|
|
349
|
-
// This is a MiddlewareInterface object - install it with the MiddlewareManager
|
|
350
|
-
this.logger.debug(
|
|
351
|
-
`Installing MiddlewareInterface: ${middlewareOrFunction.metadata.name}`,
|
|
352
|
-
'Middleware'
|
|
353
|
-
);
|
|
354
|
-
this.middlewareManager.install(middlewareOrFunction, config);
|
|
355
|
-
return this;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Fallback: emit event for unknown middleware types
|
|
359
|
-
this.eventBus.emit('middleware:advanced', {
|
|
360
|
-
middleware: middlewareOrFunction,
|
|
361
|
-
config,
|
|
362
|
-
});
|
|
363
|
-
this.logger.debug(
|
|
364
|
-
'Advanced middleware integration - enhanced capabilities loading...',
|
|
365
|
-
'Middleware'
|
|
366
|
-
);
|
|
367
|
-
return this;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// Plugin compatibility layer - unified middleware interface
|
|
371
|
-
async plugin(middleware: any, options?: any): Promise<this> {
|
|
372
|
-
return this.use(middleware, options);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Module loading with events
|
|
376
|
-
async loadModule(moduleOrPath: ModuleConfig | string) {
|
|
377
|
-
this.eventBus.emit('module:loading', {
|
|
378
|
-
moduleId: typeof moduleOrPath === 'string' ? moduleOrPath : moduleOrPath.name,
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
if (typeof moduleOrPath === 'string') {
|
|
382
|
-
const module = await this.importModule(moduleOrPath);
|
|
383
|
-
await this.coreFramework.loadModule(module);
|
|
384
|
-
this.loadedModules.add(moduleOrPath);
|
|
385
|
-
this.eventBus.emit('module:loaded', {
|
|
386
|
-
moduleId: module.name,
|
|
387
|
-
version: module.version || '1.0.0',
|
|
388
|
-
});
|
|
389
|
-
} else {
|
|
390
|
-
await this.coreFramework.loadModule(moduleOrPath);
|
|
391
|
-
this.loadedModules.add(moduleOrPath.name);
|
|
392
|
-
this.eventBus.emit('module:loaded', {
|
|
393
|
-
moduleId: moduleOrPath.name,
|
|
394
|
-
version: moduleOrPath.version || '1.0.0',
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
return this;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// Database helper with events
|
|
401
|
-
database(adapter: any) {
|
|
402
|
-
this.eventBus.emit('database:connected', {
|
|
403
|
-
adapter: adapter.constructor.name,
|
|
404
|
-
config: 'hidden',
|
|
405
|
-
});
|
|
406
|
-
this.coreFramework.registerDatabase(adapter);
|
|
407
|
-
return this;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
// WebSocket helper with events
|
|
411
|
-
websocket(namespace: string, handlers: Record<string, Function>) {
|
|
412
|
-
const adapter = this.coreFramework.getWebSocketAdapter();
|
|
413
|
-
if (!adapter) {
|
|
414
|
-
throw new Error(
|
|
415
|
-
'WebSocket features require a WebSocket adapter. Install socket.io or configure an adapter:\n' +
|
|
416
|
-
'npm install socket.io\n' +
|
|
417
|
-
'or\n' +
|
|
418
|
-
'new Moro({ websocket: { adapter: new SocketIOAdapter() } })'
|
|
419
|
-
);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
this.emit('websocket:registering', { namespace, handlers });
|
|
423
|
-
|
|
424
|
-
const ns = adapter.createNamespace(namespace);
|
|
425
|
-
|
|
426
|
-
Object.entries(handlers).forEach(([event, handler]) => {
|
|
427
|
-
ns.on('connection', socket => {
|
|
428
|
-
this.emit('websocket:connection', { namespace, event, socket });
|
|
429
|
-
|
|
430
|
-
socket.on(event, (data, callback) => {
|
|
431
|
-
this.emit('websocket:event', { namespace, event, data });
|
|
432
|
-
|
|
433
|
-
Promise.resolve(handler(socket, data))
|
|
434
|
-
.then(result => {
|
|
435
|
-
this.emit('websocket:response', { namespace, event, result });
|
|
436
|
-
if (callback) callback(result);
|
|
437
|
-
else if (result) socket.emit(`${event}:response`, result);
|
|
438
|
-
})
|
|
439
|
-
.catch(error => {
|
|
440
|
-
this.emit('websocket:error', { namespace, event, error });
|
|
441
|
-
const errorResponse = { success: false, error: error.message };
|
|
442
|
-
if (callback) callback(errorResponse);
|
|
443
|
-
else socket.emit('error', errorResponse);
|
|
444
|
-
});
|
|
445
|
-
});
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
this.emit('websocket:registered', { namespace, handlers });
|
|
450
|
-
return this;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// Start server with events (Node.js only)
|
|
454
|
-
listen(callback?: () => void): void;
|
|
455
|
-
listen(port: number, callback?: () => void): void;
|
|
456
|
-
listen(port: number, host: string, callback?: () => void): void;
|
|
457
|
-
listen(
|
|
458
|
-
portOrCallback?: number | (() => void),
|
|
459
|
-
hostOrCallback?: string | (() => void),
|
|
460
|
-
callback?: () => void
|
|
461
|
-
) {
|
|
462
|
-
// Only available for Node.js runtime
|
|
463
|
-
if (this.runtimeType !== 'node') {
|
|
464
|
-
throw new Error(
|
|
465
|
-
`listen() is only available for Node.js runtime. Current runtime: ${this.runtimeType}. Use getHandler() for other runtimes.`
|
|
466
|
-
);
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// Handle overloaded parameters - supports:
|
|
470
|
-
// listen(callback)
|
|
471
|
-
// listen(port, callback)
|
|
472
|
-
// listen(port, host, callback)
|
|
473
|
-
let port: number;
|
|
474
|
-
let host: string | undefined;
|
|
475
|
-
|
|
476
|
-
if (typeof portOrCallback === 'function') {
|
|
477
|
-
// listen(callback) - use port from config
|
|
478
|
-
callback = portOrCallback;
|
|
479
|
-
port = this.config.server.port;
|
|
480
|
-
host = this.config.server.host;
|
|
481
|
-
} else if (typeof portOrCallback === 'number') {
|
|
482
|
-
// listen(port, ...) variants
|
|
483
|
-
port = portOrCallback;
|
|
484
|
-
if (typeof hostOrCallback === 'function') {
|
|
485
|
-
// listen(port, callback)
|
|
486
|
-
callback = hostOrCallback;
|
|
487
|
-
host = undefined;
|
|
488
|
-
} else {
|
|
489
|
-
// listen(port, host, callback)
|
|
490
|
-
host = hostOrCallback;
|
|
491
|
-
}
|
|
492
|
-
} else {
|
|
493
|
-
// listen() - use config defaults
|
|
494
|
-
port = this.config.server.port;
|
|
495
|
-
host = this.config.server.host;
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
// Validate that we have a valid port
|
|
499
|
-
if (!port || typeof port !== 'number') {
|
|
500
|
-
throw new Error(
|
|
501
|
-
'Port not specified and not found in configuration. Please provide a port number or configure it in moro.config.js/ts'
|
|
502
|
-
);
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
// Check if clustering is enabled for massive performance gains
|
|
506
|
-
if (this.config.performance?.clustering?.enabled) {
|
|
507
|
-
this.startWithClustering(port, host as string, callback);
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
this.eventBus.emit('server:starting', { port, runtime: this.runtimeType });
|
|
511
|
-
|
|
512
|
-
// Add documentation middleware first (if enabled)
|
|
513
|
-
try {
|
|
514
|
-
const docsMiddleware = this.documentation.getDocsMiddleware();
|
|
515
|
-
this.coreFramework.addMiddleware(docsMiddleware);
|
|
516
|
-
this.logger.debug('Documentation middleware added', 'Documentation');
|
|
517
|
-
} catch (error) {
|
|
518
|
-
// Documentation not enabled, that's fine
|
|
519
|
-
this.logger.debug('Documentation not enabled', 'Documentation');
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
// Add intelligent routing middleware to handle chainable routes
|
|
523
|
-
this.coreFramework.addMiddleware(
|
|
524
|
-
async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
525
|
-
// Try intelligent routing first
|
|
526
|
-
const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
|
|
527
|
-
if (!handled) {
|
|
528
|
-
next(); // Fall back to direct routes
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
);
|
|
532
|
-
|
|
533
|
-
// Register direct routes with the HTTP server
|
|
534
|
-
if (this.routes.length > 0) {
|
|
535
|
-
this.registerDirectRoutes();
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
const actualCallback = () => {
|
|
539
|
-
const displayHost = host || 'localhost';
|
|
540
|
-
this.logger.info('Moro Server Started', 'Server');
|
|
541
|
-
this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
|
|
542
|
-
this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
|
|
543
|
-
this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
|
|
544
|
-
this.logger.info('Native Node.js HTTP • Zero Dependencies • Maximum Performance', 'Server');
|
|
545
|
-
this.logger.info('Learn more at https://morojs.com', 'Server');
|
|
546
|
-
|
|
547
|
-
// Log intelligent routes info
|
|
548
|
-
const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
|
|
549
|
-
if (intelligentRoutes.length > 0) {
|
|
550
|
-
this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
|
|
554
|
-
if (callback) callback();
|
|
555
|
-
};
|
|
556
|
-
|
|
557
|
-
if (host && typeof host === 'string') {
|
|
558
|
-
this.coreFramework.listen(port, host, actualCallback);
|
|
559
|
-
} else {
|
|
560
|
-
this.coreFramework.listen(port, actualCallback);
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
// Get handler for non-Node.js runtimes
|
|
565
|
-
getHandler() {
|
|
566
|
-
// Create a unified request handler that works with the runtime adapter
|
|
567
|
-
const handler = async (req: HttpRequest, res: HttpResponse) => {
|
|
568
|
-
// Add documentation middleware first (if enabled)
|
|
569
|
-
try {
|
|
570
|
-
const docsMiddleware = this.documentation.getDocsMiddleware();
|
|
571
|
-
await docsMiddleware(req, res, () => {});
|
|
572
|
-
if (res.headersSent) return;
|
|
573
|
-
} catch (error) {
|
|
574
|
-
// Documentation not enabled, that's fine
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
// Try intelligent routing first
|
|
578
|
-
const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
|
|
579
|
-
if (handled) return;
|
|
580
|
-
|
|
581
|
-
// Handle direct routes
|
|
582
|
-
if (this.routes.length > 0) {
|
|
583
|
-
await this.handleDirectRoutes(req, res);
|
|
584
|
-
}
|
|
585
|
-
};
|
|
586
|
-
|
|
587
|
-
// Use the runtime adapter to create the appropriate handler
|
|
588
|
-
return this.runtimeAdapter.createServer(handler);
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
// Handle direct routes for runtime adapters
|
|
592
|
-
private async handleDirectRoutes(req: HttpRequest, res: HttpResponse) {
|
|
593
|
-
// Find matching route
|
|
594
|
-
const route = this.findMatchingRoute(req.method!, req.path);
|
|
595
|
-
if (!route) {
|
|
596
|
-
(res as any).status(404).json({ success: false, error: 'Not found' });
|
|
597
|
-
return;
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
try {
|
|
601
|
-
// Extract path parameters
|
|
602
|
-
const matches = req.path.match(route.pattern);
|
|
603
|
-
if (matches) {
|
|
604
|
-
req.params = {};
|
|
605
|
-
route.paramNames.forEach((name: string, index: number) => {
|
|
606
|
-
req.params[name] = matches[index + 1];
|
|
607
|
-
});
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
// Get handler function
|
|
611
|
-
const handler = this.routeHandlers[route.handler];
|
|
612
|
-
if (!handler) {
|
|
613
|
-
(res as any).status(500).json({ success: false, error: 'Handler not found' });
|
|
614
|
-
return;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
// Execute validation if present
|
|
618
|
-
if (route.validation) {
|
|
619
|
-
try {
|
|
620
|
-
const validated = route.validation.parse(req.body);
|
|
621
|
-
req.body = validated;
|
|
622
|
-
} catch (error: any) {
|
|
623
|
-
if (error.issues) {
|
|
624
|
-
(res as any).status(400).json({
|
|
625
|
-
success: false,
|
|
626
|
-
error: 'Validation failed',
|
|
627
|
-
details: error.issues.map((issue: any) => ({
|
|
628
|
-
field: issue.path.length > 0 ? issue.path.join('.') : 'body',
|
|
629
|
-
message: issue.message,
|
|
630
|
-
code: issue.code,
|
|
631
|
-
})),
|
|
632
|
-
});
|
|
633
|
-
return;
|
|
634
|
-
}
|
|
635
|
-
throw error;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
// Execute rate limiting if present
|
|
640
|
-
if (route.rateLimit) {
|
|
641
|
-
const clientId = req.ip || 'unknown';
|
|
642
|
-
const key = `${route.method}:${route.path}:${clientId}`;
|
|
643
|
-
|
|
644
|
-
if (!this.checkRateLimit(key, route.rateLimit)) {
|
|
645
|
-
(res as any).status(429).json({
|
|
646
|
-
success: false,
|
|
647
|
-
error: 'Rate limit exceeded',
|
|
648
|
-
retryAfter: Math.ceil(route.rateLimit.window / 1000),
|
|
649
|
-
});
|
|
650
|
-
return;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
// Execute the handler
|
|
655
|
-
const result = await handler(req, res);
|
|
656
|
-
if (result && !(res as any).headersSent) {
|
|
657
|
-
(res as any).json(result);
|
|
658
|
-
}
|
|
659
|
-
} catch (error) {
|
|
660
|
-
if (!(res as any).headersSent) {
|
|
661
|
-
(res as any).status(500).json({
|
|
662
|
-
success: false,
|
|
663
|
-
error: error instanceof Error ? error.message : 'Internal server error',
|
|
664
|
-
});
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
// Advanced route matching with caching and optimization
|
|
670
|
-
private routeCache = new Map<string, { pattern: RegExp; paramNames: string[] }>();
|
|
671
|
-
private staticRouteMap = new Map<string, any>();
|
|
672
|
-
private dynamicRoutesBySegments = new Map<number, any[]>();
|
|
673
|
-
|
|
674
|
-
private findMatchingRoute(method: string, path: string) {
|
|
675
|
-
// Phase 1: O(1) static route lookup
|
|
676
|
-
const staticKey = `${method}:${path}`;
|
|
677
|
-
const staticRoute = this.staticRouteMap.get(staticKey);
|
|
678
|
-
if (staticRoute) {
|
|
679
|
-
return {
|
|
680
|
-
...staticRoute,
|
|
681
|
-
pattern: /^.*$/, // Dummy pattern for static routes
|
|
682
|
-
paramNames: [],
|
|
683
|
-
};
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
// Phase 2: Optimized dynamic route matching by segment count
|
|
687
|
-
const segments = path.split('/').filter(s => s.length > 0);
|
|
688
|
-
const segmentCount = segments.length;
|
|
689
|
-
const candidateRoutes = this.dynamicRoutesBySegments.get(segmentCount) || [];
|
|
690
|
-
|
|
691
|
-
for (const route of candidateRoutes) {
|
|
692
|
-
if (route.method === method) {
|
|
693
|
-
const cacheKey = `${method}:${route.path}`;
|
|
694
|
-
let pattern = this.routeCache.get(cacheKey);
|
|
695
|
-
|
|
696
|
-
if (!pattern) {
|
|
697
|
-
pattern = this.pathToRegex(route.path);
|
|
698
|
-
this.routeCache.set(cacheKey, pattern);
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
if (pattern.pattern.test(path)) {
|
|
702
|
-
return {
|
|
703
|
-
...route,
|
|
704
|
-
pattern: pattern.pattern,
|
|
705
|
-
paramNames: pattern.paramNames,
|
|
706
|
-
};
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
return null;
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
// Convert path to regex (simplified version)
|
|
715
|
-
private pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {
|
|
716
|
-
const paramNames: string[] = [];
|
|
717
|
-
const regexPath = path.replace(/\//g, '\\/').replace(/:([^/]+)/g, (match, paramName) => {
|
|
718
|
-
paramNames.push(paramName);
|
|
719
|
-
return '([^/]+)';
|
|
720
|
-
});
|
|
721
|
-
|
|
722
|
-
return {
|
|
723
|
-
pattern: new RegExp(`^${regexPath}$`),
|
|
724
|
-
paramNames,
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
// Access enterprise event system for advanced integrations
|
|
729
|
-
get events() {
|
|
730
|
-
return this.eventBus;
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
// Access to core framework for advanced usage
|
|
734
|
-
get core() {
|
|
735
|
-
return this.coreFramework;
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
// Force cleanup of pooled objects
|
|
739
|
-
forceCleanup(): void {
|
|
740
|
-
const httpServer = (this.coreFramework as any).httpServer;
|
|
741
|
-
if (httpServer && httpServer.forceCleanup) {
|
|
742
|
-
httpServer.forceCleanup();
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
// Private methods
|
|
747
|
-
private addRoute(method: string, path: string, handler: Function, options: any = {}) {
|
|
748
|
-
const handlerName = `handler_${this.routes.length}`;
|
|
749
|
-
|
|
750
|
-
const route = {
|
|
751
|
-
method: method as any,
|
|
752
|
-
path,
|
|
753
|
-
handler: handlerName,
|
|
754
|
-
validation: options.validation,
|
|
755
|
-
rateLimit: options.rateLimit,
|
|
756
|
-
cache: options.cache,
|
|
757
|
-
middleware: options.middleware,
|
|
758
|
-
};
|
|
759
|
-
|
|
760
|
-
this.routes.push(route);
|
|
761
|
-
|
|
762
|
-
// Organize routes for optimal lookup
|
|
763
|
-
this.organizeRouteForLookup(route);
|
|
764
|
-
|
|
765
|
-
// Store handler for later module creation
|
|
766
|
-
this.routeHandlers[handlerName] = handler;
|
|
767
|
-
|
|
768
|
-
return this;
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
private organizeRouteForLookup(route: any): void {
|
|
772
|
-
if (!route.path.includes(':')) {
|
|
773
|
-
// Static route - add to static map for O(1) lookup
|
|
774
|
-
const staticKey = `${route.method}:${route.path}`;
|
|
775
|
-
this.staticRouteMap.set(staticKey, route);
|
|
776
|
-
} else {
|
|
777
|
-
// Dynamic route - organize by segment count
|
|
778
|
-
const segments = route.path.split('/').filter((s: string) => s.length > 0);
|
|
779
|
-
const segmentCount = segments.length;
|
|
780
|
-
|
|
781
|
-
if (!this.dynamicRoutesBySegments.has(segmentCount)) {
|
|
782
|
-
this.dynamicRoutesBySegments.set(segmentCount, []);
|
|
783
|
-
}
|
|
784
|
-
this.dynamicRoutesBySegments.get(segmentCount)!.push(route);
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
private registerDirectRoutes() {
|
|
789
|
-
// Register routes directly with the HTTP server for optimal performance
|
|
790
|
-
// This provides the intuitive developer experience users expect
|
|
791
|
-
for (const route of this.routes) {
|
|
792
|
-
const handler = this.routeHandlers[route.handler];
|
|
793
|
-
|
|
794
|
-
// Get direct access to the HTTP server through the core framework
|
|
795
|
-
const httpServer = (this.coreFramework as any).httpServer;
|
|
796
|
-
|
|
797
|
-
// Create a wrapper handler that handles validation, rate limiting, and return values
|
|
798
|
-
const wrappedHandler = async (req: any, res: any) => {
|
|
799
|
-
try {
|
|
800
|
-
// Enhance request with events property for direct routes
|
|
801
|
-
req.events = this.eventBus;
|
|
802
|
-
|
|
803
|
-
// Universal validation middleware (works with any ValidationSchema)
|
|
804
|
-
if (route.validation) {
|
|
805
|
-
try {
|
|
806
|
-
const validated = await route.validation.parseAsync(req.body);
|
|
807
|
-
req.body = validated;
|
|
808
|
-
} catch (error: any) {
|
|
809
|
-
// Handle universal validation errors
|
|
810
|
-
const { normalizeValidationError } = require('./core/validation/schema-interface');
|
|
811
|
-
const normalizedError = normalizeValidationError(error);
|
|
812
|
-
res.status(400).json({
|
|
813
|
-
success: false,
|
|
814
|
-
error: 'Validation failed',
|
|
815
|
-
details: normalizedError.issues.map((issue: any) => ({
|
|
816
|
-
field: issue.path.length > 0 ? issue.path.join('.') : 'body',
|
|
817
|
-
message: issue.message,
|
|
818
|
-
code: issue.code,
|
|
819
|
-
})),
|
|
820
|
-
requestId: req.requestId,
|
|
821
|
-
});
|
|
822
|
-
return;
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
// Rate limiting middleware
|
|
827
|
-
if (route.rateLimit) {
|
|
828
|
-
const clientId = req.ip || req.connection.remoteAddress || 'unknown';
|
|
829
|
-
const key = `${route.method}:${route.path}:${clientId}`;
|
|
830
|
-
|
|
831
|
-
if (!this.checkRateLimit(key, route.rateLimit)) {
|
|
832
|
-
res.status(429).json({
|
|
833
|
-
success: false,
|
|
834
|
-
error: 'Rate limit exceeded',
|
|
835
|
-
retryAfter: Math.ceil(route.rateLimit.window / 1000),
|
|
836
|
-
});
|
|
837
|
-
return;
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
// Execute the actual handler
|
|
842
|
-
const result = await handler(req, res);
|
|
843
|
-
if (result && !res.headersSent) {
|
|
844
|
-
res.json(result);
|
|
845
|
-
}
|
|
846
|
-
} catch (error) {
|
|
847
|
-
if (!res.headersSent) {
|
|
848
|
-
res.status(500).json({
|
|
849
|
-
success: false,
|
|
850
|
-
error: error instanceof Error ? error.message : 'Internal server error',
|
|
851
|
-
});
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
};
|
|
855
|
-
|
|
856
|
-
// Register with the appropriate HTTP method
|
|
857
|
-
const method = route.method.toLowerCase();
|
|
858
|
-
if (httpServer && httpServer[method]) {
|
|
859
|
-
httpServer[method](route.path, wrappedHandler);
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
// Simple rate limiting for direct routes
|
|
865
|
-
private rateLimitStore = new Map<string, { count: number; resetTime: number }>();
|
|
866
|
-
|
|
867
|
-
private checkRateLimit(key: string, config: { requests: number; window: number }): boolean {
|
|
868
|
-
const now = Date.now();
|
|
869
|
-
const bucket = this.rateLimitStore.get(key);
|
|
870
|
-
|
|
871
|
-
if (!bucket || now > bucket.resetTime) {
|
|
872
|
-
// Create new bucket or reset expired bucket
|
|
873
|
-
this.rateLimitStore.set(key, {
|
|
874
|
-
count: 1,
|
|
875
|
-
resetTime: now + config.window,
|
|
876
|
-
});
|
|
877
|
-
return true;
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
if (bucket.count >= config.requests) {
|
|
881
|
-
return false; // Rate limit exceeded
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
bucket.count++;
|
|
885
|
-
return true;
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
private setupDefaultMiddleware(options: MoroOptions) {
|
|
889
|
-
// CORS
|
|
890
|
-
if (options.cors !== false) {
|
|
891
|
-
const corsOptions = typeof options.cors === 'object' ? options.cors : {};
|
|
892
|
-
this.use(middleware.cors(corsOptions));
|
|
893
|
-
}
|
|
894
|
-
|
|
895
|
-
// Helmet
|
|
896
|
-
if (options.helmet !== false) {
|
|
897
|
-
this.use(middleware.helmet());
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
// Compression
|
|
901
|
-
if (options.compression !== false) {
|
|
902
|
-
const compressionOptions = typeof options.compression === 'object' ? options.compression : {};
|
|
903
|
-
this.use(middleware.compression(compressionOptions));
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
// Body size limiting
|
|
907
|
-
this.use(middleware.bodySize({ limit: '10mb' }));
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
private autoDiscoverModules(modulesPath: string) {
|
|
911
|
-
try {
|
|
912
|
-
if (!statSync(modulesPath).isDirectory()) return;
|
|
913
|
-
|
|
914
|
-
const items = readdirSync(modulesPath);
|
|
915
|
-
items.forEach(item => {
|
|
916
|
-
const fullPath = join(modulesPath, item);
|
|
917
|
-
if (statSync(fullPath).isDirectory()) {
|
|
918
|
-
const indexPath = join(fullPath, 'index.ts');
|
|
919
|
-
try {
|
|
920
|
-
statSync(indexPath);
|
|
921
|
-
// Module directory found, will be loaded later
|
|
922
|
-
this.logger.debug(`Discovered module: ${item}`, 'ModuleDiscovery');
|
|
923
|
-
} catch {
|
|
924
|
-
// No index.ts, skip
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
});
|
|
928
|
-
} catch {
|
|
929
|
-
// Modules directory doesn't exist, that's fine
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
|
|
933
|
-
private async importModule(modulePath: string): Promise<ModuleConfig> {
|
|
934
|
-
const module = await import(modulePath);
|
|
935
|
-
return module.default || module;
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
// Clustering support for massive performance gains with proper cleanup
|
|
939
|
-
private clusterWorkers = new Map<number, any>();
|
|
940
|
-
private startWithClustering(port: number, host?: string, callback?: () => void): void {
|
|
941
|
-
const cluster = require('cluster');
|
|
942
|
-
const os = require('os');
|
|
943
|
-
|
|
944
|
-
// Smart worker count calculation based on actual bottlenecks
|
|
945
|
-
let workerCount = this.config.performance?.clustering?.workers || os.cpus().length;
|
|
946
|
-
|
|
947
|
-
// Auto-optimize worker count based on system characteristics
|
|
948
|
-
if (workerCount === 'auto' || workerCount > 8) {
|
|
949
|
-
// For high-core machines, limit workers to prevent IPC/memory bottlenecks
|
|
950
|
-
const cpuCount = os.cpus().length;
|
|
951
|
-
const totalMemoryGB = os.totalmem() / (1024 * 1024 * 1024);
|
|
952
|
-
|
|
953
|
-
// Optimal worker count formula based on research
|
|
954
|
-
if (cpuCount >= 16) {
|
|
955
|
-
// High-core machines: focus on memory/IPC efficiency
|
|
956
|
-
workerCount = Math.min(Math.ceil(totalMemoryGB / 2), 4); // 2GB per worker max, cap at 4
|
|
957
|
-
} else if (cpuCount >= 8) {
|
|
958
|
-
// Mid-range machines: balanced approach
|
|
959
|
-
workerCount = Math.min(cpuCount / 2, 4);
|
|
960
|
-
} else {
|
|
961
|
-
// Low-core machines: use all cores
|
|
962
|
-
workerCount = cpuCount;
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
this.logger.info(
|
|
966
|
-
`Auto-optimized workers: ${workerCount} (CPU: ${cpuCount}, RAM: ${totalMemoryGB.toFixed(1)}GB)`,
|
|
967
|
-
'Cluster'
|
|
968
|
-
);
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
if (cluster.isPrimary) {
|
|
972
|
-
this.logger.info(`🚀 Starting ${workerCount} workers for maximum performance`, 'Cluster');
|
|
973
|
-
|
|
974
|
-
// Optimize cluster scheduling for high concurrency
|
|
975
|
-
cluster.schedulingPolicy = cluster.SCHED_RR; // Round-robin scheduling
|
|
976
|
-
|
|
977
|
-
// Set cluster settings for better performance
|
|
978
|
-
cluster.setupMaster({
|
|
979
|
-
exec: process.argv[1],
|
|
980
|
-
args: process.argv.slice(2),
|
|
981
|
-
silent: false,
|
|
982
|
-
});
|
|
983
|
-
|
|
984
|
-
// Optimize IPC to reduce communication overhead
|
|
985
|
-
process.env.NODE_CLUSTER_SCHED_POLICY = 'rr'; // Ensure round-robin
|
|
986
|
-
process.env.NODE_DISABLE_COLORS = '1'; // Reduce IPC message size
|
|
987
|
-
|
|
988
|
-
// Graceful shutdown handler
|
|
989
|
-
const gracefulShutdown = () => {
|
|
990
|
-
this.logger.info('Gracefully shutting down cluster...', 'Cluster');
|
|
991
|
-
|
|
992
|
-
// Clean up all workers
|
|
993
|
-
for (const [pid, worker] of this.clusterWorkers) {
|
|
994
|
-
worker.removeAllListeners();
|
|
995
|
-
worker.kill('SIGTERM');
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
// Clean up cluster listeners
|
|
999
|
-
cluster.removeAllListeners();
|
|
1000
|
-
process.exit(0);
|
|
1001
|
-
};
|
|
1002
|
-
|
|
1003
|
-
// Handle process signals for graceful shutdown
|
|
1004
|
-
process.on('SIGINT', gracefulShutdown);
|
|
1005
|
-
process.on('SIGTERM', gracefulShutdown);
|
|
1006
|
-
|
|
1007
|
-
// Fork workers with proper tracking and CPU affinity
|
|
1008
|
-
for (let i = 0; i < workerCount; i++) {
|
|
1009
|
-
const worker = cluster.fork({
|
|
1010
|
-
WORKER_ID: i,
|
|
1011
|
-
WORKER_CPU_AFFINITY: i % os.cpus().length, // Distribute workers across CPUs
|
|
1012
|
-
});
|
|
1013
|
-
this.clusterWorkers.set(worker.process.pid!, worker);
|
|
1014
|
-
this.logger.info(
|
|
1015
|
-
`Worker ${worker.process.pid} started (CPU ${i % os.cpus().length})`,
|
|
1016
|
-
'Cluster'
|
|
1017
|
-
);
|
|
1018
|
-
|
|
1019
|
-
// Handle individual worker messages (reuse handler)
|
|
1020
|
-
worker.on('message', this.handleWorkerMessage.bind(this));
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
// Handle worker exits with cleanup
|
|
1024
|
-
cluster.on('exit', (worker: any, code: number, signal: string) => {
|
|
1025
|
-
// Clean up worker tracking
|
|
1026
|
-
this.clusterWorkers.delete(worker.process.pid);
|
|
1027
|
-
|
|
1028
|
-
this.logger.warn(
|
|
1029
|
-
`Worker ${worker.process.pid} died (${signal || code}). Restarting...`,
|
|
1030
|
-
'Cluster'
|
|
1031
|
-
);
|
|
1032
|
-
|
|
1033
|
-
// Restart worker with proper tracking
|
|
1034
|
-
const newWorker = cluster.fork();
|
|
1035
|
-
this.clusterWorkers.set(newWorker.process.pid!, newWorker);
|
|
1036
|
-
newWorker.on('message', this.handleWorkerMessage.bind(this));
|
|
1037
|
-
this.logger.info(`Worker ${newWorker.process.pid} started`, 'Cluster');
|
|
1038
|
-
});
|
|
1039
|
-
|
|
1040
|
-
// Master process callback
|
|
1041
|
-
if (callback) callback();
|
|
1042
|
-
} else {
|
|
1043
|
-
// Worker process - start the actual server with proper cleanup
|
|
1044
|
-
this.logger.info(`Worker ${process.pid} initializing`, 'Worker');
|
|
1045
|
-
|
|
1046
|
-
// Worker-specific optimizations for high concurrency
|
|
1047
|
-
process.env.UV_THREADPOOL_SIZE = '64';
|
|
1048
|
-
|
|
1049
|
-
// Reduce logging contention in workers (major bottleneck)
|
|
1050
|
-
if (this.config.logging) {
|
|
1051
|
-
// Workers log less frequently to reduce I/O contention
|
|
1052
|
-
this.config.logging.level = 'warn'; // Only warnings and errors
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
// Memory optimization for workers
|
|
1056
|
-
process.env.NODE_OPTIONS = '--max-old-space-size=1024'; // Limit memory per worker
|
|
1057
|
-
|
|
1058
|
-
// Optimize V8 flags for better performance (Rust-level optimizations)
|
|
1059
|
-
if (process.env.NODE_ENV === 'production') {
|
|
1060
|
-
// Ultra-aggressive V8 optimizations for maximum performance
|
|
1061
|
-
const v8Flags = [
|
|
1062
|
-
'--optimize-for-size', // Trade memory for speed
|
|
1063
|
-
'--always-opt', // Always optimize functions
|
|
1064
|
-
'--turbo-fast-api-calls', // Optimize API calls
|
|
1065
|
-
'--turbo-escape-analysis', // Escape analysis optimization
|
|
1066
|
-
'--turbo-inline-api-calls', // Inline API calls
|
|
1067
|
-
'--max-old-space-size=1024', // Limit memory to prevent GC pressure
|
|
1068
|
-
];
|
|
1069
|
-
process.env.NODE_OPTIONS = (process.env.NODE_OPTIONS || '') + ' ' + v8Flags.join(' ');
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
// Optimize garbage collection for workers
|
|
1073
|
-
// eslint-disable-next-line no-undef
|
|
1074
|
-
if ((global as any).gc) {
|
|
1075
|
-
setInterval(() => {
|
|
1076
|
-
// eslint-disable-next-line no-undef
|
|
1077
|
-
if ((global as any).gc) (global as any).gc();
|
|
1078
|
-
}, 60000); // GC every 60 seconds (less frequent)
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
// Graceful shutdown for worker
|
|
1082
|
-
const workerShutdown = () => {
|
|
1083
|
-
this.logger.info(`Worker ${process.pid} shutting down gracefully...`, 'Worker');
|
|
1084
|
-
|
|
1085
|
-
// Clean up event listeners
|
|
1086
|
-
this.eventBus.removeAllListeners();
|
|
1087
|
-
this.removeAllListeners();
|
|
1088
|
-
|
|
1089
|
-
// Close server gracefully
|
|
1090
|
-
if (this.coreFramework) {
|
|
1091
|
-
const server = (this.coreFramework as any).server;
|
|
1092
|
-
if (server) {
|
|
1093
|
-
server.close(() => {
|
|
1094
|
-
process.exit(0);
|
|
1095
|
-
});
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
};
|
|
1099
|
-
|
|
1100
|
-
// Handle worker shutdown signals
|
|
1101
|
-
process.on('SIGTERM', workerShutdown);
|
|
1102
|
-
process.on('SIGINT', workerShutdown);
|
|
1103
|
-
|
|
1104
|
-
// Continue with normal server startup for this worker
|
|
1105
|
-
this.eventBus.emit('server:starting', {
|
|
1106
|
-
port,
|
|
1107
|
-
runtime: this.runtimeType,
|
|
1108
|
-
worker: process.pid,
|
|
1109
|
-
});
|
|
1110
|
-
|
|
1111
|
-
// Add documentation middleware first (if enabled)
|
|
1112
|
-
try {
|
|
1113
|
-
const docsMiddleware = this.documentation.getDocsMiddleware();
|
|
1114
|
-
this.coreFramework.addMiddleware(docsMiddleware);
|
|
1115
|
-
} catch (error) {
|
|
1116
|
-
// Documentation not enabled, that's fine
|
|
1117
|
-
}
|
|
1118
|
-
|
|
1119
|
-
// Add intelligent routing middleware
|
|
1120
|
-
this.coreFramework.addMiddleware(
|
|
1121
|
-
async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
1122
|
-
const handled = await this.intelligentRouting.handleIntelligentRoute(req, res);
|
|
1123
|
-
if (!handled) {
|
|
1124
|
-
next();
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
);
|
|
1128
|
-
|
|
1129
|
-
// Register direct routes
|
|
1130
|
-
if (this.routes.length > 0) {
|
|
1131
|
-
this.registerDirectRoutes();
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
const workerCallback = () => {
|
|
1135
|
-
const displayHost = host || 'localhost';
|
|
1136
|
-
this.logger.info(`Worker ${process.pid} ready on ${displayHost}:${port}`, 'Worker');
|
|
1137
|
-
this.eventBus.emit('server:started', {
|
|
1138
|
-
port,
|
|
1139
|
-
runtime: this.runtimeType,
|
|
1140
|
-
worker: process.pid,
|
|
1141
|
-
});
|
|
1142
|
-
};
|
|
1143
|
-
|
|
1144
|
-
if (host) {
|
|
1145
|
-
this.coreFramework.listen(port, host, workerCallback);
|
|
1146
|
-
} else {
|
|
1147
|
-
this.coreFramework.listen(port, workerCallback);
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
}
|
|
1151
|
-
|
|
1152
|
-
// Reusable worker message handler (avoids creating new functions)
|
|
1153
|
-
private handleWorkerMessage(message: any): void {
|
|
1154
|
-
// Handle inter-worker communication if needed
|
|
1155
|
-
if (message.type === 'health-check') {
|
|
1156
|
-
// Worker health check response
|
|
1157
|
-
return;
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
// Log other worker messages
|
|
1161
|
-
this.logger.debug(`Worker message: ${JSON.stringify(message)}`, 'Cluster');
|
|
1162
|
-
}
|
|
1163
|
-
}
|
|
1164
|
-
|
|
1165
|
-
// Export convenience function
|
|
1166
|
-
export function createApp(options?: MoroOptions): Moro {
|
|
1167
|
-
return new Moro(options);
|
|
1168
|
-
}
|
|
1169
|
-
|
|
1170
|
-
// Runtime-specific convenience functions
|
|
1171
|
-
export function createAppNode(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
1172
|
-
return new Moro({
|
|
1173
|
-
...options,
|
|
1174
|
-
runtime: { type: 'node' },
|
|
1175
|
-
});
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
export function createAppEdge(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
1179
|
-
return new Moro({
|
|
1180
|
-
...options,
|
|
1181
|
-
runtime: { type: 'vercel-edge' },
|
|
1182
|
-
});
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
|
-
export function createAppLambda(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
1186
|
-
return new Moro({
|
|
1187
|
-
...options,
|
|
1188
|
-
runtime: { type: 'aws-lambda' },
|
|
1189
|
-
});
|
|
1190
|
-
}
|
|
1191
|
-
|
|
1192
|
-
export function createAppWorker(options?: Omit<MoroOptions, 'runtime'>): Moro {
|
|
1193
|
-
return new Moro({
|
|
1194
|
-
...options,
|
|
1195
|
-
runtime: { type: 'cloudflare-workers' },
|
|
1196
|
-
});
|
|
1197
|
-
}
|