@morojs/moro 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -74
- package/dist/core/auth/morojs-adapter.js +20 -20
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/file-loader.d.ts +6 -1
- package/dist/core/config/file-loader.js +249 -19
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +12 -41
- package/dist/core/config/index.js +54 -65
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +7 -0
- package/dist/core/config/loader.js +269 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +44 -52
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +3 -10
- package/dist/core/config/utils.js +58 -31
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/config/validation.d.ts +17 -0
- package/dist/core/config/validation.js +131 -0
- package/dist/core/config/validation.js.map +1 -0
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +11 -18
- 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 +29 -19
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -13
- package/dist/core/database/adapters/mongodb.js +10 -46
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -14
- package/dist/core/database/adapters/mysql.js +9 -19
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +2 -12
- package/dist/core/database/adapters/postgresql.js +9 -19
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -12
- package/dist/core/database/adapters/redis.js +13 -48
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -3
- package/dist/core/database/adapters/sqlite.js +8 -19
- 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 +18 -2
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.d.ts +9 -9
- package/dist/core/docs/index.js +35 -14
- 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 +16 -11
- 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 +11 -5
- 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 +9 -4
- 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 +29 -26
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +28 -31
- 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 +10 -6
- 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 +5 -1
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +12 -19
- package/dist/core/framework.js +100 -277
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +1 -13
- package/dist/core/http/http-server.js +85 -175
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -4
- package/dist/core/http/index.js +8 -3
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/router.d.ts +1 -13
- package/dist/core/http/router.js +43 -117
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +23 -20
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/index.js +24 -2
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +14 -30
- package/dist/core/logger/logger.js +223 -398
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +1 -1
- package/dist/core/logger/outputs.js +17 -8
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +47 -10
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +17 -10
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +7 -3
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -3
- package/dist/core/middleware/built-in/adapters/cache/redis.js +9 -11
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +7 -3
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +7 -3
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -3
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +10 -12
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +17 -10
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/index.js +23 -4
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth-helpers.js +22 -11
- package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
- package/dist/core/middleware/built-in/auth-providers.js +9 -4
- package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
- package/dist/core/middleware/built-in/auth.d.ts +2 -2
- package/dist/core/middleware/built-in/auth.js +26 -93
- package/dist/core/middleware/built-in/auth.js.map +1 -1
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +12 -11
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +9 -5
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie.js +7 -3
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +7 -3
- package/dist/core/middleware/built-in/cors.js.map +1 -1
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +8 -5
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +8 -5
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +7 -3
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +27 -28
- package/dist/core/middleware/built-in/index.js +78 -48
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor.js +7 -3
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +7 -3
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +8 -5
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +2 -2
- package/dist/core/middleware/built-in/session.js +15 -11
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +14 -12
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +7 -3
- package/dist/core/middleware/built-in/validation.js.map +1 -1
- package/dist/core/middleware/index.d.ts +4 -4
- package/dist/core/middleware/index.js +28 -8
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -19
- package/dist/core/modules/auto-discovery.js +74 -391
- 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 +9 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +54 -23
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +3 -4
- package/dist/core/networking/adapters/index.js +7 -3
- 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 +40 -5
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
- package/dist/core/networking/adapters/ws-adapter.js +43 -8
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -3
- package/dist/core/networking/index.js +7 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +12 -8
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.js +2 -1
- 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 +11 -9
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +12 -7
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +2 -22
- package/dist/core/routing/index.js +27 -185
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +6 -2
- 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 +7 -3
- 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 +6 -2
- 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 +35 -22
- 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 +49 -18
- 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 +6 -2
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +5 -1
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +22 -12
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +2 -2
- package/dist/core/utilities/hooks.js +12 -7
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -5
- package/dist/core/utilities/index.js +19 -5
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/validation/adapters.d.ts +1 -1
- package/dist/core/validation/adapters.js +26 -15
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/index.d.ts +4 -6
- package/dist/core/validation/index.js +28 -57
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js +9 -3
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/index.d.ts +52 -51
- package/dist/index.js +132 -23
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +10 -61
- package/dist/moro.js +237 -575
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.js +9 -3
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js +2 -1
- package/dist/types/cdn.js +2 -1
- package/dist/types/config.d.ts +2 -70
- package/dist/types/config.js +2 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +42 -36
- package/dist/types/core.js +2 -1
- package/dist/types/database.js +2 -1
- package/dist/types/discovery.js +2 -1
- package/dist/types/events.js +2 -1
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/hooks.js +2 -1
- package/dist/types/http.d.ts +1 -16
- package/dist/types/http.js +2 -1
- package/dist/types/logger.d.ts +0 -7
- package/dist/types/logger.js +2 -1
- package/dist/types/module.d.ts +0 -11
- package/dist/types/module.js +2 -1
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.js +2 -1
- package/dist/types/session.js +2 -1
- package/package.json +52 -19
- package/src/core/auth/morojs-adapter.ts +13 -18
- package/src/core/config/file-loader.ts +273 -13
- package/src/core/config/index.ts +34 -83
- package/src/core/config/loader.ts +633 -0
- package/src/core/config/schema.ts +33 -44
- package/src/core/config/utils.ts +31 -24
- package/src/core/config/validation.ts +140 -0
- package/src/core/database/README.md +16 -26
- package/src/core/database/adapters/drizzle.ts +6 -18
- package/src/core/database/adapters/index.ts +13 -13
- package/src/core/database/adapters/mongodb.ts +5 -53
- package/src/core/database/adapters/mysql.ts +4 -32
- package/src/core/database/adapters/postgresql.ts +5 -30
- package/src/core/database/adapters/redis.ts +8 -61
- package/src/core/database/adapters/sqlite.ts +3 -19
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +8 -8
- package/src/core/docs/openapi-generator.ts +4 -4
- package/src/core/docs/schema-to-openapi.ts +6 -3
- package/src/core/docs/simple-docs.ts +2 -2
- package/src/core/docs/swagger-ui.ts +16 -19
- package/src/core/docs/zod-to-openapi.ts +34 -34
- package/src/core/events/event-bus.ts +2 -2
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +67 -311
- package/src/core/http/http-server.ts +45 -190
- package/src/core/http/index.ts +3 -4
- package/src/core/http/router.ts +40 -129
- package/src/core/logger/filters.ts +5 -13
- package/src/core/logger/index.ts +3 -4
- package/src/core/logger/logger.ts +216 -435
- package/src/core/logger/outputs.ts +3 -1
- package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
- package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
- package/src/core/middleware/built-in/adapters/cache/redis.ts +4 -18
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +5 -16
- package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth-helpers.ts +1 -1
- package/src/core/middleware/built-in/auth-providers.ts +1 -1
- package/src/core/middleware/built-in/auth.ts +21 -102
- package/src/core/middleware/built-in/cache.ts +6 -8
- package/src/core/middleware/built-in/cdn.ts +4 -4
- package/src/core/middleware/built-in/cookie.ts +2 -2
- package/src/core/middleware/built-in/cors.ts +2 -2
- package/src/core/middleware/built-in/csp.ts +3 -3
- package/src/core/middleware/built-in/csrf.ts +3 -3
- package/src/core/middleware/built-in/error-tracker.ts +1 -1
- package/src/core/middleware/built-in/index.ts +30 -38
- package/src/core/middleware/built-in/performance-monitor.ts +1 -1
- package/src/core/middleware/built-in/rate-limit.ts +2 -2
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +8 -7
- package/src/core/middleware/built-in/sse.ts +9 -11
- package/src/core/middleware/built-in/validation.ts +2 -2
- package/src/core/middleware/index.ts +6 -6
- package/src/core/modules/auto-discovery.ts +15 -478
- package/src/core/modules/index.ts +2 -2
- package/src/core/modules/modules.ts +12 -23
- package/src/core/networking/adapters/index.ts +3 -4
- package/src/core/networking/adapters/socketio-adapter.ts +3 -5
- package/src/core/networking/adapters/ws-adapter.ts +9 -8
- package/src/core/networking/index.ts +2 -3
- package/src/core/networking/service-discovery.ts +7 -6
- package/src/core/networking/websocket-manager.ts +7 -7
- package/src/core/routing/app-integration.ts +3 -3
- package/src/core/routing/index.ts +17 -201
- package/src/core/runtime/aws-lambda-adapter.ts +3 -3
- package/src/core/runtime/base-adapter.ts +2 -2
- package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
- package/src/core/runtime/index.ts +13 -13
- package/src/core/runtime/node-adapter.ts +10 -16
- package/src/core/runtime/vercel-edge-adapter.ts +3 -3
- package/src/core/utilities/hooks.ts +3 -3
- package/src/core/utilities/index.ts +4 -5
- package/src/core/validation/adapters.ts +1 -1
- package/src/core/validation/index.ts +16 -68
- package/src/index.ts +66 -73
- package/src/moro.ts +204 -685
- package/src/types/config.ts +2 -71
- package/src/types/core.ts +47 -49
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +1 -23
- package/src/types/logger.ts +0 -9
- package/src/types/module.ts +0 -12
- package/src/types/runtime.ts +1 -1
- package/tsconfig.json +2 -4
- package/dist/core/config/config-manager.d.ts +0 -44
- package/dist/core/config/config-manager.js +0 -104
- package/dist/core/config/config-manager.js.map +0 -1
- package/dist/core/config/config-sources.d.ts +0 -21
- package/dist/core/config/config-sources.js +0 -499
- package/dist/core/config/config-sources.js.map +0 -1
- package/dist/core/config/config-validator.d.ts +0 -21
- package/dist/core/config/config-validator.js +0 -788
- package/dist/core/config/config-validator.js.map +0 -1
- package/dist/core/http/uws-http-server.d.ts +0 -64
- package/dist/core/http/uws-http-server.js +0 -688
- package/dist/core/http/uws-http-server.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +0 -118
- package/dist/core/middleware/built-in/jwt-helpers.js +0 -218
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/dist/core/networking/adapters/uws-adapter.d.ts +0 -44
- package/dist/core/networking/adapters/uws-adapter.js +0 -513
- package/dist/core/networking/adapters/uws-adapter.js.map +0 -1
- package/dist/core/utilities/package-utils.d.ts +0 -38
- package/dist/core/utilities/package-utils.js +0 -57
- package/dist/core/utilities/package-utils.js.map +0 -1
- package/jest.config.mjs +0 -41
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -596
- package/src/core/config/config-validator.ts +0 -1113
- package/src/core/http/uws-http-server.ts +0 -794
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
- package/src/core/networking/adapters/uws-adapter.ts +0 -619
- package/src/core/utilities/package-utils.ts +0 -59
package/src/core/framework.ts
CHANGED
|
@@ -5,29 +5,29 @@ import {
|
|
|
5
5
|
createServer as createHttp2Server,
|
|
6
6
|
} from 'http2';
|
|
7
7
|
import { EventEmitter } from 'events';
|
|
8
|
-
import { MoroHttpServer, HttpRequest, HttpResponse, middleware } from './http
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import { WebSocketAdapter, WebSocketAdapterOptions } from './networking/websocket-adapter.js';
|
|
22
|
-
|
|
23
|
-
// Extended MoroOptions that includes both core options and framework-specific options
|
|
24
|
-
export interface MoroOptions extends CoreMoroOptions {
|
|
8
|
+
import { MoroHttpServer, HttpRequest, HttpResponse, middleware } from './http';
|
|
9
|
+
import { Router } from './http';
|
|
10
|
+
import { Container } from './utilities';
|
|
11
|
+
import { ModuleLoader } from './modules';
|
|
12
|
+
import { WebSocketManager } from './networking';
|
|
13
|
+
import { CircuitBreaker } from './utilities';
|
|
14
|
+
import { MoroEventBus } from './events';
|
|
15
|
+
import { createFrameworkLogger, logger as globalLogger } from './logger';
|
|
16
|
+
import { ModuleConfig, InternalRouteDefinition } from '../types/module';
|
|
17
|
+
import { LogLevel, LoggerOptions } from '../types/logger';
|
|
18
|
+
import { WebSocketAdapter, WebSocketAdapterOptions } from './networking/websocket-adapter';
|
|
19
|
+
|
|
20
|
+
export interface MoroOptions {
|
|
25
21
|
http2?: boolean;
|
|
26
22
|
https?: {
|
|
27
23
|
key: string | Buffer;
|
|
28
24
|
cert: string | Buffer;
|
|
29
25
|
ca?: string | Buffer;
|
|
30
26
|
};
|
|
27
|
+
compression?: {
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
threshold?: number;
|
|
30
|
+
};
|
|
31
31
|
websocket?:
|
|
32
32
|
| {
|
|
33
33
|
enabled?: boolean;
|
|
@@ -37,12 +37,12 @@ export interface MoroOptions extends CoreMoroOptions {
|
|
|
37
37
|
options?: WebSocketAdapterOptions;
|
|
38
38
|
}
|
|
39
39
|
| false;
|
|
40
|
-
|
|
40
|
+
logger?: LoggerOptions | boolean;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export class Moro extends EventEmitter {
|
|
44
|
-
private httpServer: MoroHttpServer
|
|
45
|
-
private server: Server | any; // HTTP/2 server type
|
|
44
|
+
private httpServer: MoroHttpServer;
|
|
45
|
+
private server: Server | any; // HTTP/2 server type
|
|
46
46
|
private websocketAdapter?: WebSocketAdapter;
|
|
47
47
|
private container: Container;
|
|
48
48
|
private moduleLoader: ModuleLoader;
|
|
@@ -54,15 +54,10 @@ export class Moro extends EventEmitter {
|
|
|
54
54
|
// Framework logger
|
|
55
55
|
private logger: any;
|
|
56
56
|
private options: MoroOptions;
|
|
57
|
-
private config: any;
|
|
58
|
-
private usingUWebSockets = false;
|
|
59
|
-
// WebSocket initialization promise to handle async adapter detection
|
|
60
|
-
private websocketSetupPromise: Promise<void> | null = null;
|
|
61
57
|
|
|
62
58
|
constructor(options: MoroOptions = {}) {
|
|
63
59
|
super();
|
|
64
60
|
this.options = options;
|
|
65
|
-
this.config = options.config || {};
|
|
66
61
|
|
|
67
62
|
// Configure global logger based on options
|
|
68
63
|
if (options.logger !== undefined) {
|
|
@@ -82,33 +77,10 @@ export class Moro extends EventEmitter {
|
|
|
82
77
|
// Initialize framework logger after global configuration
|
|
83
78
|
this.logger = createFrameworkLogger('Core');
|
|
84
79
|
|
|
85
|
-
|
|
86
|
-
const useUWebSockets = this.config.server?.useUWebSockets || false;
|
|
87
|
-
|
|
88
|
-
if (useUWebSockets) {
|
|
89
|
-
try {
|
|
90
|
-
// Try to use uWebSockets for ultra-high performance HTTP and WebSocket
|
|
91
|
-
const sslOptions = this.config.server?.ssl || options.https;
|
|
92
|
-
this.httpServer = new UWebSocketsHttpServer({ ssl: sslOptions });
|
|
93
|
-
this.server = (this.httpServer as UWebSocketsHttpServer).getApp();
|
|
94
|
-
this.usingUWebSockets = true;
|
|
95
|
-
this.logger.info('uWebSockets HTTP+WebSocket server created', 'ServerInit');
|
|
96
|
-
} catch (error) {
|
|
97
|
-
// Fallback to standard HTTP/1.1 if uWebSockets fails to load
|
|
98
|
-
this.logger.warn(
|
|
99
|
-
'uWebSockets failed to initialize, falling back to Node.js http.Server. ' +
|
|
100
|
-
'Error: ' +
|
|
101
|
-
(error instanceof Error ? error.message : String(error)),
|
|
102
|
-
'ServerInit'
|
|
103
|
-
);
|
|
104
|
-
this.usingUWebSockets = false;
|
|
105
|
-
this.httpServer = new MoroHttpServer();
|
|
106
|
-
this.server = (this.httpServer as MoroHttpServer).getServer();
|
|
107
|
-
}
|
|
108
|
-
} else if (options.http2) {
|
|
109
|
-
// Use HTTP/2
|
|
110
|
-
this.httpServer = new MoroHttpServer();
|
|
80
|
+
this.httpServer = new MoroHttpServer();
|
|
111
81
|
|
|
82
|
+
// Create HTTP/2 or HTTP/1.1 server based on options
|
|
83
|
+
if (options.http2) {
|
|
112
84
|
if (options.https) {
|
|
113
85
|
this.server = createHttp2SecureServer(options.https);
|
|
114
86
|
} else {
|
|
@@ -123,26 +95,20 @@ export class Moro extends EventEmitter {
|
|
|
123
95
|
req.url = headers[':path'];
|
|
124
96
|
req.method = headers[':method'];
|
|
125
97
|
req.headers = headers;
|
|
126
|
-
|
|
98
|
+
this.httpServer['handleRequest'](req, res);
|
|
127
99
|
});
|
|
128
100
|
|
|
129
101
|
this.logger.info('HTTP/2 server created', 'ServerInit');
|
|
130
102
|
} else {
|
|
131
|
-
|
|
132
|
-
this.httpServer = new MoroHttpServer();
|
|
133
|
-
this.server = (this.httpServer as MoroHttpServer).getServer();
|
|
103
|
+
this.server = this.httpServer.getServer();
|
|
134
104
|
}
|
|
135
105
|
|
|
136
106
|
this.container = new Container();
|
|
137
107
|
this.moduleLoader = new ModuleLoader(this.container);
|
|
138
108
|
|
|
139
|
-
// Setup WebSocket adapter if enabled
|
|
140
|
-
if (
|
|
141
|
-
this.
|
|
142
|
-
(options.websocket && typeof options.websocket === 'object')
|
|
143
|
-
) {
|
|
144
|
-
// Store the promise so we can await it before using websockets
|
|
145
|
-
this.websocketSetupPromise = this.setupWebSockets(options.websocket || {});
|
|
109
|
+
// Setup WebSocket adapter if enabled
|
|
110
|
+
if (options.websocket !== false) {
|
|
111
|
+
this.setupWebSockets(options.websocket || {});
|
|
146
112
|
}
|
|
147
113
|
|
|
148
114
|
// Initialize enterprise event bus
|
|
@@ -165,49 +131,19 @@ export class Moro extends EventEmitter {
|
|
|
165
131
|
}
|
|
166
132
|
|
|
167
133
|
private setupCore() {
|
|
168
|
-
//
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
if (this.config.security.helmet.enabled || this.options.security?.helmet?.enabled === true) {
|
|
172
|
-
this.httpServer.use(middleware.helmet());
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (this.config.security.cors.enabled || this.options.security?.cors?.enabled === true) {
|
|
176
|
-
const corsOptions =
|
|
177
|
-
typeof this.options.cors === 'object'
|
|
178
|
-
? this.options.cors
|
|
179
|
-
: this.config.security.cors
|
|
180
|
-
? this.config.security.cors
|
|
181
|
-
: {};
|
|
182
|
-
this.httpServer.use(middleware.cors(corsOptions));
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Performance middleware - check config enabled property OR options.performance.*.enabled === true
|
|
186
|
-
if (
|
|
187
|
-
this.config.performance.compression.enabled ||
|
|
188
|
-
this.options.performance?.compression?.enabled === true
|
|
189
|
-
) {
|
|
190
|
-
const compressionOptions =
|
|
191
|
-
typeof this.options.compression === 'object'
|
|
192
|
-
? this.options.compression
|
|
193
|
-
: this.config.performance.compression
|
|
194
|
-
? this.config.performance.compression
|
|
195
|
-
: {};
|
|
196
|
-
this.httpServer.use(middleware.compression(compressionOptions));
|
|
197
|
-
}
|
|
134
|
+
// Security middleware
|
|
135
|
+
this.httpServer.use(middleware.helmet());
|
|
136
|
+
this.httpServer.use(middleware.cors());
|
|
198
137
|
|
|
199
|
-
//
|
|
200
|
-
this.httpServer.use(middleware.
|
|
138
|
+
// Performance middleware
|
|
139
|
+
this.httpServer.use(middleware.compression());
|
|
140
|
+
this.httpServer.use(middleware.bodySize({ limit: '10mb' }));
|
|
201
141
|
|
|
202
|
-
// Request tracking middleware
|
|
203
|
-
|
|
204
|
-
this.httpServer.use(this.requestTrackingMiddleware());
|
|
205
|
-
}
|
|
142
|
+
// Request tracking middleware
|
|
143
|
+
this.httpServer.use(this.requestTrackingMiddleware());
|
|
206
144
|
|
|
207
|
-
// Error boundary middleware
|
|
208
|
-
|
|
209
|
-
this.httpServer.use(this.errorBoundaryMiddleware());
|
|
210
|
-
}
|
|
145
|
+
// Error boundary middleware
|
|
146
|
+
this.httpServer.use(this.errorBoundaryMiddleware());
|
|
211
147
|
}
|
|
212
148
|
|
|
213
149
|
/**
|
|
@@ -215,47 +151,29 @@ export class Moro extends EventEmitter {
|
|
|
215
151
|
*/
|
|
216
152
|
private async setupWebSockets(wsConfig: any): Promise<void> {
|
|
217
153
|
try {
|
|
218
|
-
//
|
|
219
|
-
if (
|
|
220
|
-
|
|
221
|
-
this.websocketAdapter = new UWebSocketsAdapter();
|
|
222
|
-
|
|
223
|
-
// For uWebSockets, we need to integrate with the existing app
|
|
224
|
-
const uwsHttpServer = this.httpServer as UWebSocketsHttpServer;
|
|
225
|
-
await this.websocketAdapter.initialize(uwsHttpServer.getApp(), wsConfig.options);
|
|
226
|
-
|
|
227
|
-
this.logger.info(
|
|
228
|
-
'uWebSockets adapter initialized (integrated with HTTP server)',
|
|
229
|
-
'WebSocketSetup'
|
|
230
|
-
);
|
|
154
|
+
// Use provided adapter or try to auto-detect
|
|
155
|
+
if (wsConfig.adapter) {
|
|
156
|
+
this.websocketAdapter = wsConfig.adapter;
|
|
231
157
|
} else {
|
|
232
|
-
|
|
233
|
-
if (wsConfig.adapter) {
|
|
234
|
-
this.websocketAdapter = wsConfig.adapter;
|
|
235
|
-
} else {
|
|
236
|
-
this.websocketAdapter = (await this.detectWebSocketAdapter()) || undefined;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (this.websocketAdapter) {
|
|
240
|
-
await this.websocketAdapter.initialize(this.server, wsConfig.options);
|
|
241
|
-
|
|
242
|
-
this.logger.info(
|
|
243
|
-
`WebSocket adapter initialized: ${this.websocketAdapter.getAdapterName()}`,
|
|
244
|
-
'WebSocketSetup'
|
|
245
|
-
);
|
|
246
|
-
}
|
|
158
|
+
this.websocketAdapter = (await this.detectWebSocketAdapter()) || undefined;
|
|
247
159
|
}
|
|
248
160
|
|
|
249
|
-
// Configure adapter features (if adapter was created)
|
|
250
161
|
if (this.websocketAdapter) {
|
|
162
|
+
await this.websocketAdapter.initialize(this.server, wsConfig.options);
|
|
251
163
|
this.websocketManager = new WebSocketManager(this.websocketAdapter, this.container);
|
|
252
164
|
|
|
165
|
+
// Configure adapter features
|
|
253
166
|
if (wsConfig.compression) {
|
|
254
167
|
this.websocketAdapter.setCompression(true);
|
|
255
168
|
}
|
|
256
169
|
if (wsConfig.customIdGenerator) {
|
|
257
170
|
this.websocketAdapter.setCustomIdGenerator(wsConfig.customIdGenerator);
|
|
258
171
|
}
|
|
172
|
+
|
|
173
|
+
this.logger.info(
|
|
174
|
+
`WebSocket adapter initialized: ${this.websocketAdapter.getAdapterName()}`,
|
|
175
|
+
'WebSocketSetup'
|
|
176
|
+
);
|
|
259
177
|
}
|
|
260
178
|
} catch (error) {
|
|
261
179
|
this.logger.warn(
|
|
@@ -268,72 +186,26 @@ export class Moro extends EventEmitter {
|
|
|
268
186
|
|
|
269
187
|
/**
|
|
270
188
|
* Auto-detect available WebSocket adapter
|
|
271
|
-
* Tests if the library is actually installed by checking require.resolve
|
|
272
189
|
*/
|
|
273
190
|
private async detectWebSocketAdapter(): Promise<WebSocketAdapter | null> {
|
|
274
|
-
//
|
|
275
|
-
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
const { UWebSocketsAdapter } = await import('./networking/adapters/index.js');
|
|
281
|
-
return new UWebSocketsAdapter();
|
|
282
|
-
} catch {
|
|
283
|
-
this.logger.warn('uWebSockets.js specified but failed to load', 'AdapterDetection');
|
|
284
|
-
}
|
|
285
|
-
} else if (adapterType === 'socket.io' && isPackageAvailable('socket.io')) {
|
|
286
|
-
try {
|
|
287
|
-
const { SocketIOAdapter } = await import('./networking/adapters/index.js');
|
|
288
|
-
return new SocketIOAdapter();
|
|
289
|
-
} catch {
|
|
290
|
-
this.logger.warn('socket.io specified but failed to load', 'AdapterDetection');
|
|
291
|
-
}
|
|
292
|
-
} else if (adapterType === 'ws' && isPackageAvailable('ws')) {
|
|
293
|
-
try {
|
|
294
|
-
const { WSAdapter } = await import('./networking/adapters/index.js');
|
|
295
|
-
return new WSAdapter();
|
|
296
|
-
} catch {
|
|
297
|
-
this.logger.warn('ws specified but failed to load', 'AdapterDetection');
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Auto-detect: Try uWebSockets.js first (highest performance)
|
|
303
|
-
if (isPackageAvailable('uWebSockets.js')) {
|
|
304
|
-
try {
|
|
305
|
-
const { UWebSocketsAdapter } = await import('./networking/adapters/index.js');
|
|
306
|
-
this.logger.debug('uWebSockets.js detected and loaded', 'AdapterDetection');
|
|
307
|
-
return new UWebSocketsAdapter();
|
|
308
|
-
} catch {
|
|
309
|
-
// Failed to load adapter
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// Try socket.io second
|
|
314
|
-
if (isPackageAvailable('socket.io')) {
|
|
315
|
-
try {
|
|
316
|
-
const { SocketIOAdapter } = await import('./networking/adapters/index.js');
|
|
317
|
-
this.logger.debug('socket.io detected and loaded', 'AdapterDetection');
|
|
318
|
-
return new SocketIOAdapter();
|
|
319
|
-
} catch {
|
|
320
|
-
// Failed to load adapter
|
|
321
|
-
}
|
|
191
|
+
// Try socket.io first
|
|
192
|
+
try {
|
|
193
|
+
const { SocketIOAdapter } = await import('./networking/adapters');
|
|
194
|
+
return new SocketIOAdapter();
|
|
195
|
+
} catch {
|
|
196
|
+
// socket.io not available
|
|
322
197
|
}
|
|
323
198
|
|
|
324
|
-
// Try native ws library
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
} catch {
|
|
331
|
-
// Failed to load adapter
|
|
332
|
-
}
|
|
199
|
+
// Try native ws library
|
|
200
|
+
try {
|
|
201
|
+
const { WSAdapter } = await import('./networking/adapters');
|
|
202
|
+
return new WSAdapter();
|
|
203
|
+
} catch {
|
|
204
|
+
// ws not available
|
|
333
205
|
}
|
|
334
206
|
|
|
335
207
|
this.logger.warn(
|
|
336
|
-
'No WebSocket adapter found. Install
|
|
208
|
+
'No WebSocket adapter found. Install socket.io or ws for WebSocket support',
|
|
337
209
|
'AdapterDetection'
|
|
338
210
|
);
|
|
339
211
|
return null;
|
|
@@ -412,15 +284,6 @@ export class Moro extends EventEmitter {
|
|
|
412
284
|
return this.websocketAdapter;
|
|
413
285
|
}
|
|
414
286
|
|
|
415
|
-
/**
|
|
416
|
-
* Ensure WebSocket setup is complete (for async adapter detection)
|
|
417
|
-
*/
|
|
418
|
-
async ensureWebSocketReady(): Promise<void> {
|
|
419
|
-
if (this.websocketSetupPromise) {
|
|
420
|
-
await this.websocketSetupPromise;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
287
|
/**
|
|
425
288
|
* Get the WebSocket manager
|
|
426
289
|
*/
|
|
@@ -548,76 +411,6 @@ export class Moro extends EventEmitter {
|
|
|
548
411
|
throw new Error(`Handler ${route.handler} is not a function`);
|
|
549
412
|
}
|
|
550
413
|
|
|
551
|
-
// Check authentication if auth configuration is provided
|
|
552
|
-
if ((route as any).auth) {
|
|
553
|
-
const auth = (req as any).auth;
|
|
554
|
-
const authConfig = (route as any).auth;
|
|
555
|
-
|
|
556
|
-
if (!auth) {
|
|
557
|
-
res.status(401);
|
|
558
|
-
res.json({
|
|
559
|
-
success: false,
|
|
560
|
-
error: 'Authentication required',
|
|
561
|
-
message: 'You must be logged in to access this resource',
|
|
562
|
-
});
|
|
563
|
-
return;
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
// Check authentication requirement (default is required unless optional: true)
|
|
567
|
-
if (!authConfig.optional && !auth.isAuthenticated) {
|
|
568
|
-
res.status(401);
|
|
569
|
-
res.json({
|
|
570
|
-
success: false,
|
|
571
|
-
error: 'Authentication required',
|
|
572
|
-
message: 'You must be logged in to access this resource',
|
|
573
|
-
});
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
// Skip further checks if not authenticated but optional
|
|
578
|
-
if (!auth.isAuthenticated && authConfig.optional) {
|
|
579
|
-
// Continue to handler
|
|
580
|
-
} else if (auth.isAuthenticated) {
|
|
581
|
-
const user = auth.user;
|
|
582
|
-
|
|
583
|
-
// Check roles if specified
|
|
584
|
-
if (authConfig.roles && authConfig.roles.length > 0) {
|
|
585
|
-
const userRoles = user?.roles || [];
|
|
586
|
-
const hasRole = authConfig.roles.some((role: string) => userRoles.includes(role));
|
|
587
|
-
|
|
588
|
-
if (!hasRole) {
|
|
589
|
-
res.status(403);
|
|
590
|
-
res.json({
|
|
591
|
-
success: false,
|
|
592
|
-
error: 'Insufficient permissions',
|
|
593
|
-
message: `Required roles: ${authConfig.roles.join(', ')}`,
|
|
594
|
-
userRoles,
|
|
595
|
-
});
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// Check permissions if specified
|
|
601
|
-
if (authConfig.permissions && authConfig.permissions.length > 0) {
|
|
602
|
-
const userPermissions = user?.permissions || [];
|
|
603
|
-
const hasPermission = authConfig.permissions.every((permission: string) =>
|
|
604
|
-
userPermissions.includes(permission)
|
|
605
|
-
);
|
|
606
|
-
|
|
607
|
-
if (!hasPermission) {
|
|
608
|
-
res.status(403);
|
|
609
|
-
res.json({
|
|
610
|
-
success: false,
|
|
611
|
-
error: 'Insufficient permissions',
|
|
612
|
-
message: `Required permissions: ${authConfig.permissions.join(', ')}`,
|
|
613
|
-
userPermissions,
|
|
614
|
-
});
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
|
|
621
414
|
// Validate request if validation schema is provided
|
|
622
415
|
if (route.validation) {
|
|
623
416
|
try {
|
|
@@ -723,61 +516,22 @@ export class Moro extends EventEmitter {
|
|
|
723
516
|
this.logger.debug(`Mounting router for basePath: ${basePath}`, 'Router');
|
|
724
517
|
|
|
725
518
|
// Enterprise-grade middleware integration with performance optimization
|
|
726
|
-
// IMPORTANT: Module middleware runs AFTER user middleware (like auth) to ensure proper order
|
|
727
519
|
this.httpServer.use(async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
728
520
|
if (req.path.startsWith(basePath)) {
|
|
729
521
|
this.logger.debug(`Module middleware handling: ${req.method} ${req.path}`, 'Middleware', {
|
|
730
522
|
basePath,
|
|
731
523
|
});
|
|
732
524
|
|
|
733
|
-
// Mark this request as being handled by a module
|
|
734
|
-
(req as any).__moduleBasePath = basePath;
|
|
735
|
-
(req as any).__moduleRouter = router;
|
|
736
|
-
|
|
737
|
-
// Continue to next middleware (including auth) first
|
|
738
|
-
next();
|
|
739
|
-
} else {
|
|
740
|
-
next();
|
|
741
|
-
}
|
|
742
|
-
});
|
|
743
|
-
|
|
744
|
-
this.logger.info(`Router mounted for ${basePath}`, 'Router');
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
private finalModuleHandlerSetup = false;
|
|
748
|
-
|
|
749
|
-
// Setup final module handler that runs after all user middleware
|
|
750
|
-
setupFinalModuleHandler(): void {
|
|
751
|
-
// Prevent duplicate setup
|
|
752
|
-
if (this.finalModuleHandlerSetup) {
|
|
753
|
-
this.logger.debug('Final module handler already set up, skipping', 'ModuleSystem');
|
|
754
|
-
return;
|
|
755
|
-
}
|
|
756
|
-
this.finalModuleHandlerSetup = true;
|
|
757
|
-
|
|
758
|
-
this.logger.info(
|
|
759
|
-
'Setting up final module handler to run after user middleware',
|
|
760
|
-
'ModuleSystem'
|
|
761
|
-
);
|
|
762
|
-
|
|
763
|
-
this.httpServer.use(async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
764
|
-
// Check if this request was marked for module handling
|
|
765
|
-
const moduleBasePath = (req as any).__moduleBasePath;
|
|
766
|
-
const moduleRouter = (req as any).__moduleRouter;
|
|
767
|
-
|
|
768
|
-
if (moduleBasePath && moduleRouter && !res.headersSent) {
|
|
769
|
-
this.logger.debug(`Final module handler processing: ${req.method} ${req.path}`, 'Router');
|
|
770
|
-
|
|
771
525
|
try {
|
|
772
|
-
const handled = await
|
|
773
|
-
this.logger.debug(`Route handled
|
|
526
|
+
const handled = await router.handle(req, res, basePath);
|
|
527
|
+
this.logger.debug(`Route handled: ${handled}`, 'Router');
|
|
774
528
|
|
|
775
529
|
if (!handled) {
|
|
776
530
|
next(); // Let other middleware handle it
|
|
777
531
|
}
|
|
778
532
|
// If handled, the router already sent the response, so don't call next()
|
|
779
533
|
} catch (error) {
|
|
780
|
-
this.logger.error('
|
|
534
|
+
this.logger.error('Router error', 'Router', {
|
|
781
535
|
error: error instanceof Error ? error.message : String(error),
|
|
782
536
|
});
|
|
783
537
|
if (!res.headersSent) {
|
|
@@ -788,6 +542,8 @@ export class Moro extends EventEmitter {
|
|
|
788
542
|
next();
|
|
789
543
|
}
|
|
790
544
|
});
|
|
545
|
+
|
|
546
|
+
this.logger.info(`Router mounted for ${basePath}`, 'Router');
|
|
791
547
|
}
|
|
792
548
|
|
|
793
549
|
private async setupWebSocketHandlers(config: ModuleConfig): Promise<void> {
|