@morojs/moro 1.5.16 → 1.6.0
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 +70 -269
- package/dist/core/auth/morojs-adapter.js +5 -9
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-manager.d.ts +1 -1
- package/dist/core/config/config-manager.js +10 -20
- package/dist/core/config/config-manager.js.map +1 -1
- package/dist/core/config/config-sources.d.ts +2 -2
- package/dist/core/config/config-sources.js +17 -20
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.d.ts +1 -1
- package/dist/core/config/config-validator.js +33 -10
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/config/file-loader.d.ts +1 -1
- package/dist/core/config/file-loader.js +19 -78
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +8 -8
- package/dist/core/config/index.js +25 -51
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +11 -13
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +1 -1
- package/dist/core/config/utils.js +18 -32
- 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 +3 -1
- package/dist/core/database/adapters/mongodb.js +23 -8
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +3 -1
- package/dist/core/database/adapters/mysql.js +18 -9
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +3 -1
- package/dist/core/database/adapters/postgresql.js +18 -8
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +3 -1
- package/dist/core/database/adapters/redis.js +34 -9
- 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 +6 -10
- 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 +16 -6
- package/dist/core/framework.js +182 -92
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +1 -1
- package/dist/core/http/http-server.js +26 -209
- 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/router.d.ts +1 -1
- package/dist/core/http/router.js +3 -7
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +64 -0
- package/dist/core/http/uws-http-server.js +688 -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 +8 -19
- 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 -25
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +21 -23
- 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 -15
- 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 +10 -47
- 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 +10 -17
- 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 +3 -7
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
- 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 +3 -7
- 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 +3 -7
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
- 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 +10 -17
- 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 +4 -23
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth-helpers.js +11 -22
- 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 +4 -9
- 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 +51 -44
- 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 +8 -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 +5 -9
- 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 +3 -7
- 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 +3 -7
- 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 +5 -8
- 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 +5 -8
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +3 -7
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +28 -28
- package/dist/core/middleware/built-in/index.js +47 -82
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +27 -2
- package/dist/core/middleware/built-in/jwt-helpers.js +32 -10
- package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor.js +3 -7
- 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 +3 -7
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +3 -7
- 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 +11 -15
- 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 +3 -7
- 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 +3 -7
- 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 +8 -28
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +3 -3
- package/dist/core/modules/auto-discovery.js +43 -81
- 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 +11 -52
- 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 +1 -1
- package/dist/core/networking/adapters/ws-adapter.js +7 -42
- 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 +3 -7
- 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/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +7 -12
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +2 -2
- package/dist/core/routing/index.js +7 -14
- 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 +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 +6 -43
- 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 +51 -52
- package/dist/index.js +23 -132
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +30 -10
- package/dist/moro.js +262 -126
- 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 +13 -1
- package/dist/types/config.js +1 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +3 -3
- 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 +1 -1
- package/dist/types/hooks.js +1 -2
- package/dist/types/http.js +1 -2
- package/dist/types/logger.js +1 -2
- 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/jest.config.mjs +41 -0
- package/package.json +18 -51
- package/src/core/auth/morojs-adapter.ts +1 -1
- package/src/core/config/config-manager.ts +2 -2
- package/src/core/config/config-sources.ts +6 -6
- package/src/core/config/config-validator.ts +38 -3
- package/src/core/config/file-loader.ts +13 -40
- package/src/core/config/index.ts +15 -11
- package/src/core/config/schema.ts +3 -2
- package/src/core/config/utils.ts +3 -3
- package/src/core/database/adapters/drizzle.ts +18 -6
- package/src/core/database/adapters/index.ts +13 -13
- package/src/core/database/adapters/mongodb.ts +23 -3
- package/src/core/database/adapters/mysql.ts +18 -4
- package/src/core/database/adapters/postgresql.ts +18 -3
- package/src/core/database/adapters/redis.ts +34 -4
- package/src/core/database/adapters/sqlite.ts +19 -3
- 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 +3 -6
- package/src/core/docs/simple-docs.ts +2 -2
- package/src/core/docs/swagger-ui.ts +19 -16
- 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 +190 -49
- package/src/core/http/http-server.ts +16 -159
- package/src/core/http/index.ts +4 -3
- package/src/core/http/router.ts +2 -2
- package/src/core/http/uws-http-server.ts +794 -0
- package/src/core/logger/filters.ts +1 -1
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +9 -1
- package/src/core/logger/outputs.ts +1 -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 +18 -4
- 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 +16 -5
- 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 +64 -41
- package/src/core/middleware/built-in/cache.ts +5 -5
- 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 +31 -31
- package/src/core/middleware/built-in/jwt-helpers.ts +32 -4
- 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 -1
- package/src/core/middleware/built-in/session.ts +7 -8
- package/src/core/middleware/built-in/sse.ts +2 -2
- 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 +4 -4
- package/src/core/modules/index.ts +2 -2
- package/src/core/modules/modules.ts +4 -4
- package/src/core/networking/adapters/index.ts +4 -3
- package/src/core/networking/adapters/socketio-adapter.ts +5 -3
- package/src/core/networking/adapters/uws-adapter.ts +619 -0
- package/src/core/networking/adapters/ws-adapter.ts +6 -4
- package/src/core/networking/index.ts +3 -2
- package/src/core/networking/service-discovery.ts +1 -1
- package/src/core/networking/websocket-manager.ts +7 -7
- package/src/core/routing/app-integration.ts +3 -3
- package/src/core/routing/index.ts +3 -3
- 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 +4 -4
- package/src/core/runtime/vercel-edge-adapter.ts +3 -3
- package/src/core/utilities/hooks.ts +3 -3
- package/src/core/utilities/index.ts +5 -4
- package/src/core/utilities/package-utils.ts +59 -0
- package/src/core/validation/adapters.ts +1 -1
- package/src/core/validation/index.ts +68 -16
- package/src/index.ts +73 -66
- package/src/moro.ts +303 -75
- package/src/types/config.ts +13 -1
- package/src/types/core.ts +3 -3
- package/src/types/hooks.ts +1 -1
- package/src/types/runtime.ts +1 -1
- package/tsconfig.json +4 -2
package/src/moro.ts
CHANGED
|
@@ -1,34 +1,40 @@
|
|
|
1
1
|
// Moro Framework - Modern TypeScript API Framework
|
|
2
2
|
// Built for developers who demand performance, elegance, and zero compromises
|
|
3
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 { ModuleDefaultsConfig } from './types/config';
|
|
9
|
-
import { MoroEventBus } from './core/events';
|
|
10
|
-
import { createFrameworkLogger, applyLoggingConfiguration } from './core/logger';
|
|
11
|
-
import { Logger } from './types/logger';
|
|
12
|
-
import { MiddlewareManager } from './core/middleware';
|
|
13
|
-
import { IntelligentRoutingManager } from './core/routing/app-integration';
|
|
14
|
-
import { RouteBuilder, RouteSchema, CompiledRoute } from './core/routing';
|
|
15
|
-
import { AppDocumentationManager, DocsConfig } from './core/docs';
|
|
4
|
+
import { Moro as MoroCore } from './core/framework.js';
|
|
5
|
+
import { HttpRequest, HttpResponse, middleware } from './core/http/index.js';
|
|
6
|
+
import { ModuleConfig, InternalRouteDefinition } from './types/module.js';
|
|
7
|
+
import { MoroOptions } from './types/core.js';
|
|
8
|
+
import { ModuleDefaultsConfig } from './types/config.js';
|
|
9
|
+
import { MoroEventBus } from './core/events/index.js';
|
|
10
|
+
import { createFrameworkLogger, applyLoggingConfiguration } from './core/logger/index.js';
|
|
11
|
+
import { Logger } from './types/logger.js';
|
|
12
|
+
import { MiddlewareManager } from './core/middleware/index.js';
|
|
13
|
+
import { IntelligentRoutingManager } from './core/routing/app-integration.js';
|
|
14
|
+
import { RouteBuilder, RouteSchema, CompiledRoute } from './core/routing/index.js';
|
|
15
|
+
import { AppDocumentationManager, DocsConfig } from './core/docs/index.js';
|
|
16
16
|
import { EventEmitter } from 'events';
|
|
17
|
+
import cluster from 'cluster';
|
|
18
|
+
import os from 'os';
|
|
19
|
+
import { normalizeValidationError } from './core/validation/schema-interface.js';
|
|
17
20
|
// Configuration System Integration
|
|
18
|
-
import { initializeConfig, type AppConfig } from './core/config';
|
|
21
|
+
import { initializeConfig, type AppConfig } from './core/config/index.js';
|
|
19
22
|
// Runtime System Integration
|
|
20
|
-
import { RuntimeAdapter, RuntimeType, createRuntimeAdapter } from './core/runtime';
|
|
23
|
+
import { RuntimeAdapter, RuntimeType, createRuntimeAdapter } from './core/runtime/index.js';
|
|
21
24
|
|
|
22
25
|
export class Moro extends EventEmitter {
|
|
23
|
-
private coreFramework
|
|
26
|
+
private coreFramework!: MoroCore;
|
|
24
27
|
private routes: InternalRouteDefinition[] = [];
|
|
25
28
|
private moduleCounter = 0;
|
|
26
29
|
private loadedModules = new Set<string>();
|
|
27
30
|
private lazyModules = new Map<string, ModuleConfig>();
|
|
28
31
|
private routeHandlers: Record<string, Function> = {};
|
|
29
32
|
private moduleDiscovery?: any; // Store for cleanup
|
|
33
|
+
private autoDiscoveryOptions: MoroOptions | null = null;
|
|
34
|
+
private autoDiscoveryInitialized = false;
|
|
35
|
+
private autoDiscoveryPromise: Promise<void> | null = null;
|
|
30
36
|
// Enterprise event system integration
|
|
31
|
-
private eventBus
|
|
37
|
+
private eventBus!: MoroEventBus;
|
|
32
38
|
// Application logger
|
|
33
39
|
private logger!: Logger;
|
|
34
40
|
// Intelligent routing system
|
|
@@ -36,12 +42,18 @@ export class Moro extends EventEmitter {
|
|
|
36
42
|
// Documentation system
|
|
37
43
|
private documentation = new AppDocumentationManager();
|
|
38
44
|
// Configuration system
|
|
39
|
-
private config
|
|
45
|
+
private config!: AppConfig;
|
|
40
46
|
// Runtime system
|
|
41
|
-
private runtimeAdapter
|
|
42
|
-
private runtimeType
|
|
47
|
+
private runtimeAdapter!: RuntimeAdapter;
|
|
48
|
+
private runtimeType!: RuntimeType;
|
|
43
49
|
// Middleware system
|
|
44
|
-
private middlewareManager
|
|
50
|
+
private middlewareManager!: MiddlewareManager;
|
|
51
|
+
// Queued WebSocket registrations (for async adapter detection)
|
|
52
|
+
private queuedWebSocketRegistrations: Array<{
|
|
53
|
+
namespace: string;
|
|
54
|
+
handlers: Record<string, Function>;
|
|
55
|
+
processed: boolean;
|
|
56
|
+
}> = [];
|
|
45
57
|
|
|
46
58
|
constructor(options: MoroOptions = {}) {
|
|
47
59
|
super(); // Call EventEmitter constructor
|
|
@@ -85,7 +97,11 @@ export class Moro extends EventEmitter {
|
|
|
85
97
|
const frameworkOptions: any = {
|
|
86
98
|
...options,
|
|
87
99
|
logger: this.config.logging,
|
|
88
|
-
|
|
100
|
+
// Enable websockets if either config has it enabled OR user passed websocket options
|
|
101
|
+
websocket:
|
|
102
|
+
this.config.websocket.enabled || options.websocket
|
|
103
|
+
? options.websocket || this.config.websocket || {}
|
|
104
|
+
: false,
|
|
89
105
|
config: this.config,
|
|
90
106
|
};
|
|
91
107
|
|
|
@@ -118,15 +134,10 @@ export class Moro extends EventEmitter {
|
|
|
118
134
|
...options,
|
|
119
135
|
});
|
|
120
136
|
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
this.logger.error('Auto-discovery initialization failed', 'Framework', {
|
|
126
|
-
error: error instanceof Error ? error.message : String(error),
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
}
|
|
137
|
+
// Store auto-discovery options for later initialization
|
|
138
|
+
// IMPORTANT: Auto-discovery is deferred to ensure user middleware (like auth)
|
|
139
|
+
// is registered before module middleware that might bypass it
|
|
140
|
+
this.autoDiscoveryOptions = options.autoDiscover !== false ? options : null;
|
|
130
141
|
|
|
131
142
|
// Emit initialization event through enterprise event bus
|
|
132
143
|
this.eventBus.emit('framework:initialized', {
|
|
@@ -355,6 +366,13 @@ export class Moro extends EventEmitter {
|
|
|
355
366
|
version: moduleOrPath.version || '1.0.0',
|
|
356
367
|
});
|
|
357
368
|
}
|
|
369
|
+
|
|
370
|
+
// IMPORTANT: If modules are loaded manually after auto-discovery,
|
|
371
|
+
// ensure the final module handler is set up to maintain middleware order
|
|
372
|
+
if (this.autoDiscoveryInitialized) {
|
|
373
|
+
this.coreFramework.setupFinalModuleHandler();
|
|
374
|
+
}
|
|
375
|
+
|
|
358
376
|
return this;
|
|
359
377
|
}
|
|
360
378
|
|
|
@@ -370,34 +388,45 @@ export class Moro extends EventEmitter {
|
|
|
370
388
|
|
|
371
389
|
// WebSocket helper with events
|
|
372
390
|
websocket(namespace: string, handlers: Record<string, Function>) {
|
|
391
|
+
// Queue the registration to be processed after adapter initialization
|
|
392
|
+
const registration = { namespace, handlers, processed: false };
|
|
393
|
+
this.queuedWebSocketRegistrations.push(registration);
|
|
394
|
+
|
|
395
|
+
// Try to process immediately if adapter is already ready
|
|
373
396
|
const adapter = this.coreFramework.getWebSocketAdapter();
|
|
374
|
-
if (!
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
'or\n' +
|
|
379
|
-
'new Moro({ websocket: { adapter: new SocketIOAdapter() } })'
|
|
380
|
-
);
|
|
397
|
+
if (adapter && !registration.processed) {
|
|
398
|
+
// Adapter is ready, process immediately
|
|
399
|
+
this.processWebSocketRegistration(namespace, handlers, adapter);
|
|
400
|
+
registration.processed = true;
|
|
381
401
|
}
|
|
402
|
+
// Otherwise, it will be processed when the server starts
|
|
382
403
|
|
|
404
|
+
return this;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private processWebSocketRegistration(
|
|
408
|
+
namespace: string,
|
|
409
|
+
handlers: Record<string, Function>,
|
|
410
|
+
adapter: any
|
|
411
|
+
) {
|
|
383
412
|
this.emit('websocket:registering', { namespace, handlers });
|
|
384
413
|
|
|
385
414
|
const ns = adapter.createNamespace(namespace);
|
|
386
415
|
|
|
387
416
|
Object.entries(handlers).forEach(([event, handler]) => {
|
|
388
|
-
ns.on('connection', socket => {
|
|
417
|
+
ns.on('connection', (socket: any) => {
|
|
389
418
|
this.emit('websocket:connection', { namespace, event, socket });
|
|
390
419
|
|
|
391
|
-
socket.on(event, (data, callback) => {
|
|
420
|
+
socket.on(event, (data: any, callback: any) => {
|
|
392
421
|
this.emit('websocket:event', { namespace, event, data });
|
|
393
422
|
|
|
394
423
|
Promise.resolve(handler(socket, data))
|
|
395
|
-
.then(result => {
|
|
424
|
+
.then((result: any) => {
|
|
396
425
|
this.emit('websocket:response', { namespace, event, result });
|
|
397
426
|
if (callback) callback(result);
|
|
398
427
|
else if (result) socket.emit(`${event}:response`, result);
|
|
399
428
|
})
|
|
400
|
-
.catch(error => {
|
|
429
|
+
.catch((error: any) => {
|
|
401
430
|
this.emit('websocket:error', { namespace, event, error });
|
|
402
431
|
const errorResponse = { success: false, error: error.message };
|
|
403
432
|
if (callback) callback(errorResponse);
|
|
@@ -408,7 +437,40 @@ export class Moro extends EventEmitter {
|
|
|
408
437
|
});
|
|
409
438
|
|
|
410
439
|
this.emit('websocket:registered', { namespace, handlers });
|
|
411
|
-
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
private async processQueuedWebSocketRegistrations() {
|
|
443
|
+
// Wait for WebSocket adapter to be ready
|
|
444
|
+
await this.coreFramework.ensureWebSocketReady();
|
|
445
|
+
|
|
446
|
+
const adapter = this.coreFramework.getWebSocketAdapter();
|
|
447
|
+
|
|
448
|
+
// Check if any unprocessed registrations exist
|
|
449
|
+
const unprocessedRegistrations = this.queuedWebSocketRegistrations.filter(r => !r.processed);
|
|
450
|
+
|
|
451
|
+
if (!adapter && unprocessedRegistrations.length > 0) {
|
|
452
|
+
throw new Error(
|
|
453
|
+
'WebSocket features require a WebSocket adapter.\n\n' +
|
|
454
|
+
'Option 1: Install socket.io (auto-detected):\n' +
|
|
455
|
+
' npm install socket.io\n' +
|
|
456
|
+
' const app = new Moro({ websocket: {} });\n\n' +
|
|
457
|
+
'Option 2: Configure a specific adapter:\n' +
|
|
458
|
+
" import { SocketIOAdapter } from '@morojs/moro';\n" +
|
|
459
|
+
' const app = new Moro({ websocket: { adapter: new SocketIOAdapter() } });\n\n' +
|
|
460
|
+
'Option 3: Enable in config file (moro.config.js):\n' +
|
|
461
|
+
' export default { websocket: { enabled: true } };'
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
if (adapter) {
|
|
466
|
+
// Process all unprocessed registrations
|
|
467
|
+
for (const registration of this.queuedWebSocketRegistrations) {
|
|
468
|
+
if (!registration.processed) {
|
|
469
|
+
this.processWebSocketRegistration(registration.namespace, registration.handlers, adapter);
|
|
470
|
+
registration.processed = true;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
412
474
|
}
|
|
413
475
|
|
|
414
476
|
// Start server with events (Node.js only)
|
|
@@ -464,9 +526,21 @@ export class Moro extends EventEmitter {
|
|
|
464
526
|
}
|
|
465
527
|
|
|
466
528
|
// Check if clustering is enabled for massive performance gains
|
|
529
|
+
// NOTE: uWebSockets.js does NOT support Node.js clustering - it's single-threaded only
|
|
530
|
+
const usingUWebSockets = this.config.server?.useUWebSockets || false;
|
|
531
|
+
|
|
467
532
|
if (this.config.performance?.clustering?.enabled) {
|
|
468
|
-
|
|
469
|
-
|
|
533
|
+
if (usingUWebSockets) {
|
|
534
|
+
this.logger.warn(
|
|
535
|
+
'Clustering is not supported with uWebSockets.js - running in single-threaded mode. ' +
|
|
536
|
+
'uWebSockets is so fast that single-threaded performance often exceeds multi-threaded Node.js!',
|
|
537
|
+
'Cluster'
|
|
538
|
+
);
|
|
539
|
+
// Continue without clustering
|
|
540
|
+
} else {
|
|
541
|
+
this.startWithClustering(port, host as string, callback);
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
470
544
|
}
|
|
471
545
|
this.eventBus.emit('server:starting', { port, runtime: this.runtimeType });
|
|
472
546
|
|
|
@@ -496,35 +570,169 @@ export class Moro extends EventEmitter {
|
|
|
496
570
|
this.registerDirectRoutes();
|
|
497
571
|
}
|
|
498
572
|
|
|
499
|
-
const
|
|
500
|
-
const
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
this.
|
|
506
|
-
|
|
507
|
-
|
|
573
|
+
const startServer = () => {
|
|
574
|
+
const actualCallback = () => {
|
|
575
|
+
const displayHost = host || 'localhost';
|
|
576
|
+
this.logger.info('Moro Server Started', 'Server');
|
|
577
|
+
this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
|
|
578
|
+
this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
|
|
579
|
+
if (this.config.websocket.enabled) {
|
|
580
|
+
this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
|
|
581
|
+
}
|
|
582
|
+
this.logger.info('Learn more at https://morojs.com', 'Server');
|
|
583
|
+
|
|
584
|
+
// Log intelligent routes info
|
|
585
|
+
const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
|
|
586
|
+
if (intelligentRoutes.length > 0) {
|
|
587
|
+
this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
|
|
591
|
+
if (callback) callback();
|
|
592
|
+
};
|
|
508
593
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
this.
|
|
594
|
+
if (host && typeof host === 'string') {
|
|
595
|
+
this.coreFramework.listen(port, host, actualCallback);
|
|
596
|
+
} else {
|
|
597
|
+
this.coreFramework.listen(port, actualCallback);
|
|
513
598
|
}
|
|
599
|
+
};
|
|
514
600
|
|
|
515
|
-
|
|
516
|
-
|
|
601
|
+
// Ensure auto-discovery and WebSocket setup is complete before starting server
|
|
602
|
+
Promise.all([this.ensureAutoDiscoveryComplete(), this.processQueuedWebSocketRegistrations()])
|
|
603
|
+
.then(() => {
|
|
604
|
+
startServer();
|
|
605
|
+
})
|
|
606
|
+
.catch(error => {
|
|
607
|
+
this.logger.error('Initialization failed during server start', 'Framework', {
|
|
608
|
+
error: error instanceof Error ? error.message : String(error),
|
|
609
|
+
});
|
|
610
|
+
// For auto-discovery failures, start server anyway
|
|
611
|
+
// For WebSocket failures with queued registrations, error will propagate
|
|
612
|
+
if (
|
|
613
|
+
error instanceof Error &&
|
|
614
|
+
error.message.includes('WebSocket features require a WebSocket adapter')
|
|
615
|
+
) {
|
|
616
|
+
throw error;
|
|
617
|
+
}
|
|
618
|
+
startServer();
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Public method to manually initialize auto-discovery
|
|
623
|
+
// Useful for ensuring auth middleware is registered before auto-discovery
|
|
624
|
+
async initializeAutoDiscoveryNow(): Promise<void> {
|
|
625
|
+
return this.ensureAutoDiscoveryComplete();
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Public API: Initialize modules explicitly after middleware setup
|
|
629
|
+
// This provides users with explicit control over module loading timing
|
|
630
|
+
// IMPORTANT: This forces module loading even if autoDiscovery.enabled is false
|
|
631
|
+
// Usage: app.initModules() or app.initModules({ paths: ['./my-modules'] })
|
|
632
|
+
initModules(options?: {
|
|
633
|
+
paths?: string[];
|
|
634
|
+
patterns?: string[];
|
|
635
|
+
recursive?: boolean;
|
|
636
|
+
loadingStrategy?: 'eager' | 'lazy' | 'conditional';
|
|
637
|
+
watchForChanges?: boolean;
|
|
638
|
+
ignorePatterns?: string[];
|
|
639
|
+
loadOrder?: 'alphabetical' | 'dependency' | 'custom';
|
|
640
|
+
failOnError?: boolean;
|
|
641
|
+
maxDepth?: number;
|
|
642
|
+
}): void {
|
|
643
|
+
this.logger.info('User-requested module initialization', 'ModuleSystem');
|
|
644
|
+
|
|
645
|
+
// If already initialized, do nothing
|
|
646
|
+
if (this.autoDiscoveryInitialized) {
|
|
647
|
+
this.logger.debug('Auto-discovery already completed, skipping', 'ModuleSystem');
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
// Store the options and mark that we want to force initialization
|
|
652
|
+
this.autoDiscoveryOptions = {
|
|
653
|
+
autoDiscover: {
|
|
654
|
+
enabled: true, // Force enabled regardless of original config
|
|
655
|
+
paths: options?.paths || ['./modules', './src/modules'],
|
|
656
|
+
patterns: options?.patterns || [
|
|
657
|
+
'**/*.module.{ts,js}',
|
|
658
|
+
'**/index.{ts,js}',
|
|
659
|
+
'**/*.config.{ts,js}',
|
|
660
|
+
],
|
|
661
|
+
recursive: options?.recursive ?? true,
|
|
662
|
+
loadingStrategy: options?.loadingStrategy || ('eager' as const),
|
|
663
|
+
watchForChanges: options?.watchForChanges ?? false,
|
|
664
|
+
ignorePatterns: options?.ignorePatterns || [
|
|
665
|
+
'**/*.test.{ts,js}',
|
|
666
|
+
'**/*.spec.{ts,js}',
|
|
667
|
+
'**/node_modules/**',
|
|
668
|
+
],
|
|
669
|
+
loadOrder: options?.loadOrder || ('dependency' as const),
|
|
670
|
+
failOnError: options?.failOnError ?? false,
|
|
671
|
+
maxDepth: options?.maxDepth ?? 5,
|
|
672
|
+
},
|
|
517
673
|
};
|
|
518
674
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
675
|
+
this.logger.debug(
|
|
676
|
+
'Module initialization options stored, will execute on next listen/getHandler call',
|
|
677
|
+
'ModuleSystem'
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// Robust method to ensure auto-discovery is complete, handling race conditions
|
|
682
|
+
private async ensureAutoDiscoveryComplete(): Promise<void> {
|
|
683
|
+
// If already initialized, nothing to do
|
|
684
|
+
if (this.autoDiscoveryInitialized) {
|
|
685
|
+
return;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// If auto-discovery is disabled, mark as initialized
|
|
689
|
+
if (!this.autoDiscoveryOptions) {
|
|
690
|
+
this.autoDiscoveryInitialized = true;
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// If already in progress, wait for it to complete
|
|
695
|
+
if (this.autoDiscoveryPromise) {
|
|
696
|
+
return this.autoDiscoveryPromise;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Start auto-discovery
|
|
700
|
+
this.autoDiscoveryPromise = this.performAutoDiscovery();
|
|
701
|
+
|
|
702
|
+
try {
|
|
703
|
+
await this.autoDiscoveryPromise;
|
|
704
|
+
this.autoDiscoveryInitialized = true;
|
|
705
|
+
} catch (error) {
|
|
706
|
+
// Reset promise on error so it can be retried
|
|
707
|
+
this.autoDiscoveryPromise = null;
|
|
708
|
+
throw error;
|
|
709
|
+
} finally {
|
|
710
|
+
this.autoDiscoveryOptions = null; // Clear after attempt
|
|
523
711
|
}
|
|
524
712
|
}
|
|
525
713
|
|
|
714
|
+
// Perform the actual auto-discovery work
|
|
715
|
+
private async performAutoDiscovery(optionsOverride?: MoroOptions): Promise<void> {
|
|
716
|
+
const optionsToUse = optionsOverride || this.autoDiscoveryOptions;
|
|
717
|
+
if (!optionsToUse) return;
|
|
718
|
+
|
|
719
|
+
this.logger.debug('Starting auto-discovery initialization', 'AutoDiscovery');
|
|
720
|
+
|
|
721
|
+
await this.initializeAutoDiscovery(optionsToUse);
|
|
722
|
+
|
|
723
|
+
this.logger.debug('Auto-discovery initialization completed', 'AutoDiscovery');
|
|
724
|
+
}
|
|
725
|
+
|
|
526
726
|
// Get handler for non-Node.js runtimes
|
|
527
727
|
getHandler() {
|
|
728
|
+
// Ensure auto-discovery is complete for non-Node.js runtimes
|
|
729
|
+
// This handles the case where users call getHandler() immediately after createApp()
|
|
730
|
+
this.ensureAutoDiscoveryComplete().catch(error => {
|
|
731
|
+
this.logger.error('Auto-discovery initialization failed for runtime handler', 'Framework', {
|
|
732
|
+
error: error instanceof Error ? error.message : String(error),
|
|
733
|
+
});
|
|
734
|
+
});
|
|
735
|
+
|
|
528
736
|
// Create a unified request handler that works with the runtime adapter
|
|
529
737
|
const handler = async (req: HttpRequest, res: HttpResponse) => {
|
|
530
738
|
// Add documentation middleware first (if enabled)
|
|
@@ -769,7 +977,6 @@ export class Moro extends EventEmitter {
|
|
|
769
977
|
req.body = validated;
|
|
770
978
|
} catch (error: any) {
|
|
771
979
|
// Handle universal validation errors
|
|
772
|
-
const { normalizeValidationError } = require('./core/validation/schema-interface');
|
|
773
980
|
const normalizedError = normalizeValidationError(error);
|
|
774
981
|
res.status(400).json({
|
|
775
982
|
success: false,
|
|
@@ -884,7 +1091,7 @@ export class Moro extends EventEmitter {
|
|
|
884
1091
|
|
|
885
1092
|
// Enhanced auto-discovery initialization
|
|
886
1093
|
private async initializeAutoDiscovery(options: MoroOptions): Promise<void> {
|
|
887
|
-
const { ModuleDiscovery } = await import('./core/modules/auto-discovery');
|
|
1094
|
+
const { ModuleDiscovery } = await import('./core/modules/auto-discovery.js');
|
|
888
1095
|
|
|
889
1096
|
// Merge auto-discovery configuration
|
|
890
1097
|
const autoDiscoveryConfig = this.mergeAutoDiscoveryConfig(options);
|
|
@@ -902,6 +1109,9 @@ export class Moro extends EventEmitter {
|
|
|
902
1109
|
// Load modules based on strategy
|
|
903
1110
|
await this.loadDiscoveredModules(modules, autoDiscoveryConfig);
|
|
904
1111
|
|
|
1112
|
+
// Setup final module handler to run after user middleware (like auth)
|
|
1113
|
+
this.coreFramework.setupFinalModuleHandler();
|
|
1114
|
+
|
|
905
1115
|
// Setup file watching if enabled
|
|
906
1116
|
if (autoDiscoveryConfig.watchForChanges) {
|
|
907
1117
|
this.moduleDiscovery.watchModulesAdvanced(
|
|
@@ -1116,9 +1326,6 @@ export class Moro extends EventEmitter {
|
|
|
1116
1326
|
private clusterWorkers = new Map<number, any>();
|
|
1117
1327
|
|
|
1118
1328
|
private startWithClustering(port: number, host?: string, callback?: () => void): void {
|
|
1119
|
-
const cluster = require('cluster');
|
|
1120
|
-
const os = require('os');
|
|
1121
|
-
|
|
1122
1329
|
// Worker count calculation - respect user choice
|
|
1123
1330
|
let workerCount = this.config.performance?.clustering?.workers || os.cpus().length;
|
|
1124
1331
|
|
|
@@ -1239,9 +1446,8 @@ export class Moro extends EventEmitter {
|
|
|
1239
1446
|
}
|
|
1240
1447
|
|
|
1241
1448
|
// Research-based memory optimization for workers
|
|
1242
|
-
const os = require('os');
|
|
1243
1449
|
const totalMemoryGB = os.totalmem() / (1024 * 1024 * 1024);
|
|
1244
|
-
const workerCount = Object.keys(
|
|
1450
|
+
const workerCount = Object.keys(cluster.workers || {}).length || 1;
|
|
1245
1451
|
|
|
1246
1452
|
// Conservative memory allocation
|
|
1247
1453
|
const heapSizePerWorkerMB = Math.min(
|
|
@@ -1342,11 +1548,33 @@ export class Moro extends EventEmitter {
|
|
|
1342
1548
|
});
|
|
1343
1549
|
};
|
|
1344
1550
|
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1551
|
+
// Ensure WebSocket setup is complete before starting worker
|
|
1552
|
+
this.processQueuedWebSocketRegistrations()
|
|
1553
|
+
.then(() => {
|
|
1554
|
+
if (host) {
|
|
1555
|
+
this.coreFramework.listen(port, host, workerCallback);
|
|
1556
|
+
} else {
|
|
1557
|
+
this.coreFramework.listen(port, workerCallback);
|
|
1558
|
+
}
|
|
1559
|
+
})
|
|
1560
|
+
.catch(error => {
|
|
1561
|
+
this.logger.error('WebSocket initialization failed in worker', 'Worker', {
|
|
1562
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1563
|
+
});
|
|
1564
|
+
// For WebSocket failures with queued registrations, error will propagate
|
|
1565
|
+
if (
|
|
1566
|
+
error instanceof Error &&
|
|
1567
|
+
error.message.includes('WebSocket features require a WebSocket adapter')
|
|
1568
|
+
) {
|
|
1569
|
+
throw error;
|
|
1570
|
+
}
|
|
1571
|
+
// Start anyway for other errors
|
|
1572
|
+
if (host) {
|
|
1573
|
+
this.coreFramework.listen(port, host, workerCallback);
|
|
1574
|
+
} else {
|
|
1575
|
+
this.coreFramework.listen(port, workerCallback);
|
|
1576
|
+
}
|
|
1577
|
+
});
|
|
1350
1578
|
}
|
|
1351
1579
|
}
|
|
1352
1580
|
|
package/src/types/config.ts
CHANGED
|
@@ -12,6 +12,12 @@ export interface ServerConfig {
|
|
|
12
12
|
errorBoundary: {
|
|
13
13
|
enabled: boolean;
|
|
14
14
|
};
|
|
15
|
+
useUWebSockets?: boolean; // Enable uWebSockets for both HTTP and WebSocket
|
|
16
|
+
ssl?: {
|
|
17
|
+
key_file_name?: string;
|
|
18
|
+
cert_file_name?: string;
|
|
19
|
+
passphrase?: string;
|
|
20
|
+
};
|
|
15
21
|
}
|
|
16
22
|
|
|
17
23
|
export interface ServiceDiscoveryConfig {
|
|
@@ -187,7 +193,7 @@ export interface PerformanceConfig {
|
|
|
187
193
|
|
|
188
194
|
export interface WebSocketConfig {
|
|
189
195
|
enabled: boolean;
|
|
190
|
-
adapter?: string | 'socket.io' | 'ws';
|
|
196
|
+
adapter?: string | 'socket.io' | 'ws' | 'uws';
|
|
191
197
|
compression?: boolean;
|
|
192
198
|
customIdGenerator?: () => string;
|
|
193
199
|
options?: {
|
|
@@ -197,6 +203,12 @@ export interface WebSocketConfig {
|
|
|
197
203
|
};
|
|
198
204
|
path?: string;
|
|
199
205
|
maxPayloadLength?: number;
|
|
206
|
+
idleTimeout?: number;
|
|
207
|
+
ssl?: {
|
|
208
|
+
key_file_name?: string;
|
|
209
|
+
cert_file_name?: string;
|
|
210
|
+
passphrase?: string;
|
|
211
|
+
};
|
|
200
212
|
};
|
|
201
213
|
}
|
|
202
214
|
|
package/src/types/core.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Core Framework Types
|
|
2
|
-
import { RuntimeConfig } from './runtime';
|
|
3
|
-
import { LogLevel, LoggerOptions } from './logger';
|
|
4
|
-
import { AppConfig } from './config';
|
|
2
|
+
import { RuntimeConfig } from './runtime.js';
|
|
3
|
+
import { LogLevel, LoggerOptions } from './logger.js';
|
|
4
|
+
import { AppConfig } from './config.js';
|
|
5
5
|
|
|
6
6
|
export interface MoroOptions {
|
|
7
7
|
autoDiscover?:
|
package/src/types/hooks.ts
CHANGED
package/src/types/runtime.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Runtime abstraction types for multi-environment support
|
|
2
|
-
import { HttpRequest, HttpResponse } from '
|
|
2
|
+
import { HttpRequest, HttpResponse } from '../core/http/index.js';
|
|
3
3
|
|
|
4
4
|
export type RuntimeType = 'node' | 'vercel-edge' | 'aws-lambda' | 'cloudflare-workers';
|
|
5
5
|
|
package/tsconfig.json
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
{
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"target": "ES2022",
|
|
5
|
-
"module": "
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
6
7
|
"lib": ["ES2022"],
|
|
7
8
|
"outDir": "./dist",
|
|
8
9
|
"rootDir": "./src",
|
|
@@ -14,7 +15,8 @@
|
|
|
14
15
|
"emitDecoratorMetadata": true,
|
|
15
16
|
"resolveJsonModule": true,
|
|
16
17
|
"declaration": true,
|
|
17
|
-
"sourceMap": true
|
|
18
|
+
"sourceMap": true,
|
|
19
|
+
"isolatedModules": true
|
|
18
20
|
},
|
|
19
21
|
"include": ["src/**/*"],
|
|
20
22
|
"exclude": ["node_modules", "dist"]
|