@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/dist/moro.js
CHANGED
|
@@ -1,59 +1,21 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.Moro = void 0;
|
|
37
|
-
exports.createApp = createApp;
|
|
38
|
-
exports.createAppNode = createAppNode;
|
|
39
|
-
exports.createAppEdge = createAppEdge;
|
|
40
|
-
exports.createAppLambda = createAppLambda;
|
|
41
|
-
exports.createAppWorker = createAppWorker;
|
|
42
1
|
// Moro Framework - Modern TypeScript API Framework
|
|
43
2
|
// Built for developers who demand performance, elegance, and zero compromises
|
|
44
3
|
// Event-driven • Modular • Enterprise-ready • Developer-first
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
4
|
+
import { Moro as MoroCore } from './core/framework.js';
|
|
5
|
+
import { middleware } from './core/http/index.js';
|
|
6
|
+
import { createFrameworkLogger, applyLoggingConfiguration } from './core/logger/index.js';
|
|
7
|
+
import { MiddlewareManager } from './core/middleware/index.js';
|
|
8
|
+
import { IntelligentRoutingManager } from './core/routing/app-integration.js';
|
|
9
|
+
import { AppDocumentationManager } from './core/docs/index.js';
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
import cluster from 'cluster';
|
|
12
|
+
import os from 'os';
|
|
13
|
+
import { normalizeValidationError } from './core/validation/schema-interface.js';
|
|
52
14
|
// Configuration System Integration
|
|
53
|
-
|
|
15
|
+
import { initializeConfig } from './core/config/index.js';
|
|
54
16
|
// Runtime System Integration
|
|
55
|
-
|
|
56
|
-
class Moro extends
|
|
17
|
+
import { createRuntimeAdapter } from './core/runtime/index.js';
|
|
18
|
+
export class Moro extends EventEmitter {
|
|
57
19
|
coreFramework;
|
|
58
20
|
routes = [];
|
|
59
21
|
moduleCounter = 0;
|
|
@@ -61,14 +23,17 @@ class Moro extends events_1.EventEmitter {
|
|
|
61
23
|
lazyModules = new Map();
|
|
62
24
|
routeHandlers = {};
|
|
63
25
|
moduleDiscovery; // Store for cleanup
|
|
26
|
+
autoDiscoveryOptions = null;
|
|
27
|
+
autoDiscoveryInitialized = false;
|
|
28
|
+
autoDiscoveryPromise = null;
|
|
64
29
|
// Enterprise event system integration
|
|
65
30
|
eventBus;
|
|
66
31
|
// Application logger
|
|
67
32
|
logger;
|
|
68
33
|
// Intelligent routing system
|
|
69
|
-
intelligentRouting = new
|
|
34
|
+
intelligentRouting = new IntelligentRoutingManager();
|
|
70
35
|
// Documentation system
|
|
71
|
-
documentation = new
|
|
36
|
+
documentation = new AppDocumentationManager();
|
|
72
37
|
// Configuration system
|
|
73
38
|
config;
|
|
74
39
|
// Runtime system
|
|
@@ -76,43 +41,48 @@ class Moro extends events_1.EventEmitter {
|
|
|
76
41
|
runtimeType;
|
|
77
42
|
// Middleware system
|
|
78
43
|
middlewareManager;
|
|
44
|
+
// Queued WebSocket registrations (for async adapter detection)
|
|
45
|
+
queuedWebSocketRegistrations = [];
|
|
79
46
|
constructor(options = {}) {
|
|
80
47
|
super(); // Call EventEmitter constructor
|
|
81
48
|
// Apply logging configuration BEFORE config loading to avoid DEBUG spam
|
|
82
49
|
// 1. Environment variables (base level)
|
|
83
50
|
const envLogLevel = process.env.LOG_LEVEL || process.env.MORO_LOG_LEVEL;
|
|
84
51
|
if (envLogLevel) {
|
|
85
|
-
|
|
52
|
+
applyLoggingConfiguration({ level: envLogLevel }, undefined);
|
|
86
53
|
}
|
|
87
54
|
// 2. createApp logger options (highest precedence)
|
|
88
55
|
if (options.logger !== undefined) {
|
|
89
|
-
|
|
56
|
+
applyLoggingConfiguration(undefined, options.logger);
|
|
90
57
|
}
|
|
91
58
|
// Create logger AFTER initial configuration
|
|
92
|
-
this.logger =
|
|
59
|
+
this.logger = createFrameworkLogger('App');
|
|
93
60
|
// Use simplified global configuration system
|
|
94
|
-
this.config =
|
|
61
|
+
this.config = initializeConfig(options);
|
|
95
62
|
// Apply config file logging if it exists (may override createApp options if needed)
|
|
96
63
|
if (this.config.logging && !options.logger) {
|
|
97
|
-
|
|
64
|
+
applyLoggingConfiguration(this.config.logging, undefined);
|
|
98
65
|
// Recreate logger with updated config
|
|
99
|
-
this.logger =
|
|
66
|
+
this.logger = createFrameworkLogger('App');
|
|
100
67
|
}
|
|
101
68
|
this.logger.info(`Configuration system initialized: ${process.env.NODE_ENV || 'development'}:${this.config.server.port}`);
|
|
102
69
|
// Initialize runtime system
|
|
103
70
|
this.runtimeType = options.runtime?.type || 'node';
|
|
104
|
-
this.runtimeAdapter = options.runtime?.adapter ||
|
|
71
|
+
this.runtimeAdapter = options.runtime?.adapter || createRuntimeAdapter(this.runtimeType);
|
|
105
72
|
this.logger.info(`Runtime system initialized: ${this.runtimeType}`, 'Runtime');
|
|
106
73
|
// Pass configuration from config to framework
|
|
107
74
|
const frameworkOptions = {
|
|
108
75
|
...options,
|
|
109
76
|
logger: this.config.logging,
|
|
110
|
-
|
|
77
|
+
// Enable websockets if either config has it enabled OR user passed websocket options
|
|
78
|
+
websocket: this.config.websocket.enabled || options.websocket
|
|
79
|
+
? options.websocket || this.config.websocket || {}
|
|
80
|
+
: false,
|
|
111
81
|
config: this.config,
|
|
112
82
|
};
|
|
113
|
-
this.coreFramework = new
|
|
83
|
+
this.coreFramework = new MoroCore(frameworkOptions);
|
|
114
84
|
// Initialize middleware system
|
|
115
|
-
this.middlewareManager = new
|
|
85
|
+
this.middlewareManager = new MiddlewareManager();
|
|
116
86
|
// Integrate hooks system with HTTP server
|
|
117
87
|
const httpServer = this.coreFramework.httpServer;
|
|
118
88
|
if (httpServer && httpServer.setHookManager) {
|
|
@@ -133,15 +103,10 @@ class Moro extends events_1.EventEmitter {
|
|
|
133
103
|
...this.getDefaultOptionsFromConfig(),
|
|
134
104
|
...options,
|
|
135
105
|
});
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
this.logger.error('Auto-discovery initialization failed', 'Framework', {
|
|
141
|
-
error: error instanceof Error ? error.message : String(error),
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
}
|
|
106
|
+
// Store auto-discovery options for later initialization
|
|
107
|
+
// IMPORTANT: Auto-discovery is deferred to ensure user middleware (like auth)
|
|
108
|
+
// is registered before module middleware that might bypass it
|
|
109
|
+
this.autoDiscoveryOptions = options.autoDiscover !== false ? options : null;
|
|
145
110
|
// Emit initialization event through enterprise event bus
|
|
146
111
|
this.eventBus.emit('framework:initialized', {
|
|
147
112
|
options,
|
|
@@ -307,6 +272,11 @@ class Moro extends events_1.EventEmitter {
|
|
|
307
272
|
version: moduleOrPath.version || '1.0.0',
|
|
308
273
|
});
|
|
309
274
|
}
|
|
275
|
+
// IMPORTANT: If modules are loaded manually after auto-discovery,
|
|
276
|
+
// ensure the final module handler is set up to maintain middleware order
|
|
277
|
+
if (this.autoDiscoveryInitialized) {
|
|
278
|
+
this.coreFramework.setupFinalModuleHandler();
|
|
279
|
+
}
|
|
310
280
|
return this;
|
|
311
281
|
}
|
|
312
282
|
// Database helper with events
|
|
@@ -320,29 +290,36 @@ class Moro extends events_1.EventEmitter {
|
|
|
320
290
|
}
|
|
321
291
|
// WebSocket helper with events
|
|
322
292
|
websocket(namespace, handlers) {
|
|
293
|
+
// Queue the registration to be processed after adapter initialization
|
|
294
|
+
const registration = { namespace, handlers, processed: false };
|
|
295
|
+
this.queuedWebSocketRegistrations.push(registration);
|
|
296
|
+
// Try to process immediately if adapter is already ready
|
|
323
297
|
const adapter = this.coreFramework.getWebSocketAdapter();
|
|
324
|
-
if (!
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
'new Moro({ websocket: { adapter: new SocketIOAdapter() } })');
|
|
298
|
+
if (adapter && !registration.processed) {
|
|
299
|
+
// Adapter is ready, process immediately
|
|
300
|
+
this.processWebSocketRegistration(namespace, handlers, adapter);
|
|
301
|
+
registration.processed = true;
|
|
329
302
|
}
|
|
303
|
+
// Otherwise, it will be processed when the server starts
|
|
304
|
+
return this;
|
|
305
|
+
}
|
|
306
|
+
processWebSocketRegistration(namespace, handlers, adapter) {
|
|
330
307
|
this.emit('websocket:registering', { namespace, handlers });
|
|
331
308
|
const ns = adapter.createNamespace(namespace);
|
|
332
309
|
Object.entries(handlers).forEach(([event, handler]) => {
|
|
333
|
-
ns.on('connection', socket => {
|
|
310
|
+
ns.on('connection', (socket) => {
|
|
334
311
|
this.emit('websocket:connection', { namespace, event, socket });
|
|
335
312
|
socket.on(event, (data, callback) => {
|
|
336
313
|
this.emit('websocket:event', { namespace, event, data });
|
|
337
314
|
Promise.resolve(handler(socket, data))
|
|
338
|
-
.then(result => {
|
|
315
|
+
.then((result) => {
|
|
339
316
|
this.emit('websocket:response', { namespace, event, result });
|
|
340
317
|
if (callback)
|
|
341
318
|
callback(result);
|
|
342
319
|
else if (result)
|
|
343
320
|
socket.emit(`${event}:response`, result);
|
|
344
321
|
})
|
|
345
|
-
.catch(error => {
|
|
322
|
+
.catch((error) => {
|
|
346
323
|
this.emit('websocket:error', { namespace, event, error });
|
|
347
324
|
const errorResponse = { success: false, error: error.message };
|
|
348
325
|
if (callback)
|
|
@@ -354,7 +331,33 @@ class Moro extends events_1.EventEmitter {
|
|
|
354
331
|
});
|
|
355
332
|
});
|
|
356
333
|
this.emit('websocket:registered', { namespace, handlers });
|
|
357
|
-
|
|
334
|
+
}
|
|
335
|
+
async processQueuedWebSocketRegistrations() {
|
|
336
|
+
// Wait for WebSocket adapter to be ready
|
|
337
|
+
await this.coreFramework.ensureWebSocketReady();
|
|
338
|
+
const adapter = this.coreFramework.getWebSocketAdapter();
|
|
339
|
+
// Check if any unprocessed registrations exist
|
|
340
|
+
const unprocessedRegistrations = this.queuedWebSocketRegistrations.filter(r => !r.processed);
|
|
341
|
+
if (!adapter && unprocessedRegistrations.length > 0) {
|
|
342
|
+
throw new Error('WebSocket features require a WebSocket adapter.\n\n' +
|
|
343
|
+
'Option 1: Install socket.io (auto-detected):\n' +
|
|
344
|
+
' npm install socket.io\n' +
|
|
345
|
+
' const app = new Moro({ websocket: {} });\n\n' +
|
|
346
|
+
'Option 2: Configure a specific adapter:\n' +
|
|
347
|
+
" import { SocketIOAdapter } from '@morojs/moro';\n" +
|
|
348
|
+
' const app = new Moro({ websocket: { adapter: new SocketIOAdapter() } });\n\n' +
|
|
349
|
+
'Option 3: Enable in config file (moro.config.js):\n' +
|
|
350
|
+
' export default { websocket: { enabled: true } };');
|
|
351
|
+
}
|
|
352
|
+
if (adapter) {
|
|
353
|
+
// Process all unprocessed registrations
|
|
354
|
+
for (const registration of this.queuedWebSocketRegistrations) {
|
|
355
|
+
if (!registration.processed) {
|
|
356
|
+
this.processWebSocketRegistration(registration.namespace, registration.handlers, adapter);
|
|
357
|
+
registration.processed = true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
358
361
|
}
|
|
359
362
|
listen(portOrCallback, hostOrCallback, callback) {
|
|
360
363
|
// Only available for Node.js runtime
|
|
@@ -396,9 +399,18 @@ class Moro extends events_1.EventEmitter {
|
|
|
396
399
|
throw new Error('Port not specified and not found in configuration. Please provide a port number or configure it in moro.config.js/ts');
|
|
397
400
|
}
|
|
398
401
|
// Check if clustering is enabled for massive performance gains
|
|
402
|
+
// NOTE: uWebSockets.js does NOT support Node.js clustering - it's single-threaded only
|
|
403
|
+
const usingUWebSockets = this.config.server?.useUWebSockets || false;
|
|
399
404
|
if (this.config.performance?.clustering?.enabled) {
|
|
400
|
-
|
|
401
|
-
|
|
405
|
+
if (usingUWebSockets) {
|
|
406
|
+
this.logger.warn('Clustering is not supported with uWebSockets.js - running in single-threaded mode. ' +
|
|
407
|
+
'uWebSockets is so fast that single-threaded performance often exceeds multi-threaded Node.js!', 'Cluster');
|
|
408
|
+
// Continue without clustering
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
this.startWithClustering(port, host, callback);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
402
414
|
}
|
|
403
415
|
this.eventBus.emit('server:starting', { port, runtime: this.runtimeType });
|
|
404
416
|
// Add documentation middleware first (if enabled)
|
|
@@ -423,33 +435,139 @@ class Moro extends events_1.EventEmitter {
|
|
|
423
435
|
if (this.routes.length > 0) {
|
|
424
436
|
this.registerDirectRoutes();
|
|
425
437
|
}
|
|
426
|
-
const
|
|
427
|
-
const
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
this.
|
|
438
|
+
const startServer = () => {
|
|
439
|
+
const actualCallback = () => {
|
|
440
|
+
const displayHost = host || 'localhost';
|
|
441
|
+
this.logger.info('Moro Server Started', 'Server');
|
|
442
|
+
this.logger.info(`Runtime: ${this.runtimeType}`, 'Server');
|
|
443
|
+
this.logger.info(`HTTP API: http://${displayHost}:${port}`, 'Server');
|
|
444
|
+
if (this.config.websocket.enabled) {
|
|
445
|
+
this.logger.info(`WebSocket: ws://${displayHost}:${port}`, 'Server');
|
|
446
|
+
}
|
|
447
|
+
this.logger.info('Learn more at https://morojs.com', 'Server');
|
|
448
|
+
// Log intelligent routes info
|
|
449
|
+
const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
|
|
450
|
+
if (intelligentRoutes.length > 0) {
|
|
451
|
+
this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
|
|
452
|
+
}
|
|
453
|
+
this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
|
|
454
|
+
if (callback)
|
|
455
|
+
callback();
|
|
456
|
+
};
|
|
457
|
+
if (host && typeof host === 'string') {
|
|
458
|
+
this.coreFramework.listen(port, host, actualCallback);
|
|
433
459
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
const intelligentRoutes = this.intelligentRouting.getIntelligentRoutes();
|
|
437
|
-
if (intelligentRoutes.length > 0) {
|
|
438
|
-
this.logger.info(`Intelligent Routes: ${intelligentRoutes.length} registered`, 'Server');
|
|
460
|
+
else {
|
|
461
|
+
this.coreFramework.listen(port, actualCallback);
|
|
439
462
|
}
|
|
440
|
-
this.eventBus.emit('server:started', { port, runtime: this.runtimeType });
|
|
441
|
-
if (callback)
|
|
442
|
-
callback();
|
|
443
463
|
};
|
|
444
|
-
|
|
445
|
-
|
|
464
|
+
// Ensure auto-discovery and WebSocket setup is complete before starting server
|
|
465
|
+
Promise.all([this.ensureAutoDiscoveryComplete(), this.processQueuedWebSocketRegistrations()])
|
|
466
|
+
.then(() => {
|
|
467
|
+
startServer();
|
|
468
|
+
})
|
|
469
|
+
.catch(error => {
|
|
470
|
+
this.logger.error('Initialization failed during server start', 'Framework', {
|
|
471
|
+
error: error instanceof Error ? error.message : String(error),
|
|
472
|
+
});
|
|
473
|
+
// For auto-discovery failures, start server anyway
|
|
474
|
+
// For WebSocket failures with queued registrations, error will propagate
|
|
475
|
+
if (error instanceof Error &&
|
|
476
|
+
error.message.includes('WebSocket features require a WebSocket adapter')) {
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
startServer();
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
// Public method to manually initialize auto-discovery
|
|
483
|
+
// Useful for ensuring auth middleware is registered before auto-discovery
|
|
484
|
+
async initializeAutoDiscoveryNow() {
|
|
485
|
+
return this.ensureAutoDiscoveryComplete();
|
|
486
|
+
}
|
|
487
|
+
// Public API: Initialize modules explicitly after middleware setup
|
|
488
|
+
// This provides users with explicit control over module loading timing
|
|
489
|
+
// IMPORTANT: This forces module loading even if autoDiscovery.enabled is false
|
|
490
|
+
// Usage: app.initModules() or app.initModules({ paths: ['./my-modules'] })
|
|
491
|
+
initModules(options) {
|
|
492
|
+
this.logger.info('User-requested module initialization', 'ModuleSystem');
|
|
493
|
+
// If already initialized, do nothing
|
|
494
|
+
if (this.autoDiscoveryInitialized) {
|
|
495
|
+
this.logger.debug('Auto-discovery already completed, skipping', 'ModuleSystem');
|
|
496
|
+
return;
|
|
446
497
|
}
|
|
447
|
-
|
|
448
|
-
|
|
498
|
+
// Store the options and mark that we want to force initialization
|
|
499
|
+
this.autoDiscoveryOptions = {
|
|
500
|
+
autoDiscover: {
|
|
501
|
+
enabled: true, // Force enabled regardless of original config
|
|
502
|
+
paths: options?.paths || ['./modules', './src/modules'],
|
|
503
|
+
patterns: options?.patterns || [
|
|
504
|
+
'**/*.module.{ts,js}',
|
|
505
|
+
'**/index.{ts,js}',
|
|
506
|
+
'**/*.config.{ts,js}',
|
|
507
|
+
],
|
|
508
|
+
recursive: options?.recursive ?? true,
|
|
509
|
+
loadingStrategy: options?.loadingStrategy || 'eager',
|
|
510
|
+
watchForChanges: options?.watchForChanges ?? false,
|
|
511
|
+
ignorePatterns: options?.ignorePatterns || [
|
|
512
|
+
'**/*.test.{ts,js}',
|
|
513
|
+
'**/*.spec.{ts,js}',
|
|
514
|
+
'**/node_modules/**',
|
|
515
|
+
],
|
|
516
|
+
loadOrder: options?.loadOrder || 'dependency',
|
|
517
|
+
failOnError: options?.failOnError ?? false,
|
|
518
|
+
maxDepth: options?.maxDepth ?? 5,
|
|
519
|
+
},
|
|
520
|
+
};
|
|
521
|
+
this.logger.debug('Module initialization options stored, will execute on next listen/getHandler call', 'ModuleSystem');
|
|
522
|
+
}
|
|
523
|
+
// Robust method to ensure auto-discovery is complete, handling race conditions
|
|
524
|
+
async ensureAutoDiscoveryComplete() {
|
|
525
|
+
// If already initialized, nothing to do
|
|
526
|
+
if (this.autoDiscoveryInitialized) {
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
// If auto-discovery is disabled, mark as initialized
|
|
530
|
+
if (!this.autoDiscoveryOptions) {
|
|
531
|
+
this.autoDiscoveryInitialized = true;
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
// If already in progress, wait for it to complete
|
|
535
|
+
if (this.autoDiscoveryPromise) {
|
|
536
|
+
return this.autoDiscoveryPromise;
|
|
537
|
+
}
|
|
538
|
+
// Start auto-discovery
|
|
539
|
+
this.autoDiscoveryPromise = this.performAutoDiscovery();
|
|
540
|
+
try {
|
|
541
|
+
await this.autoDiscoveryPromise;
|
|
542
|
+
this.autoDiscoveryInitialized = true;
|
|
543
|
+
}
|
|
544
|
+
catch (error) {
|
|
545
|
+
// Reset promise on error so it can be retried
|
|
546
|
+
this.autoDiscoveryPromise = null;
|
|
547
|
+
throw error;
|
|
548
|
+
}
|
|
549
|
+
finally {
|
|
550
|
+
this.autoDiscoveryOptions = null; // Clear after attempt
|
|
449
551
|
}
|
|
450
552
|
}
|
|
553
|
+
// Perform the actual auto-discovery work
|
|
554
|
+
async performAutoDiscovery(optionsOverride) {
|
|
555
|
+
const optionsToUse = optionsOverride || this.autoDiscoveryOptions;
|
|
556
|
+
if (!optionsToUse)
|
|
557
|
+
return;
|
|
558
|
+
this.logger.debug('Starting auto-discovery initialization', 'AutoDiscovery');
|
|
559
|
+
await this.initializeAutoDiscovery(optionsToUse);
|
|
560
|
+
this.logger.debug('Auto-discovery initialization completed', 'AutoDiscovery');
|
|
561
|
+
}
|
|
451
562
|
// Get handler for non-Node.js runtimes
|
|
452
563
|
getHandler() {
|
|
564
|
+
// Ensure auto-discovery is complete for non-Node.js runtimes
|
|
565
|
+
// This handles the case where users call getHandler() immediately after createApp()
|
|
566
|
+
this.ensureAutoDiscoveryComplete().catch(error => {
|
|
567
|
+
this.logger.error('Auto-discovery initialization failed for runtime handler', 'Framework', {
|
|
568
|
+
error: error instanceof Error ? error.message : String(error),
|
|
569
|
+
});
|
|
570
|
+
});
|
|
453
571
|
// Create a unified request handler that works with the runtime adapter
|
|
454
572
|
const handler = async (req, res) => {
|
|
455
573
|
// Add documentation middleware first (if enabled)
|
|
@@ -667,7 +785,6 @@ class Moro extends events_1.EventEmitter {
|
|
|
667
785
|
}
|
|
668
786
|
catch (error) {
|
|
669
787
|
// Handle universal validation errors
|
|
670
|
-
const { normalizeValidationError } = require('./core/validation/schema-interface');
|
|
671
788
|
const normalizedError = normalizeValidationError(error);
|
|
672
789
|
res.status(400).json({
|
|
673
790
|
success: false,
|
|
@@ -744,11 +861,11 @@ class Moro extends events_1.EventEmitter {
|
|
|
744
861
|
: this.config.security.cors
|
|
745
862
|
? this.config.security.cors
|
|
746
863
|
: {};
|
|
747
|
-
this.use(
|
|
864
|
+
this.use(middleware.cors(corsOptions));
|
|
748
865
|
}
|
|
749
866
|
// Helmet - check config enabled property OR options.security.helmet.enabled === true
|
|
750
867
|
if (this.config.security.helmet.enabled || options.security?.helmet?.enabled === true) {
|
|
751
|
-
this.use(
|
|
868
|
+
this.use(middleware.helmet());
|
|
752
869
|
}
|
|
753
870
|
// Compression - check config enabled property OR options.performance.compression.enabled === true
|
|
754
871
|
if (this.config.performance.compression.enabled ||
|
|
@@ -758,14 +875,14 @@ class Moro extends events_1.EventEmitter {
|
|
|
758
875
|
: this.config.performance.compression
|
|
759
876
|
? this.config.performance.compression
|
|
760
877
|
: {};
|
|
761
|
-
this.use(
|
|
878
|
+
this.use(middleware.compression(compressionOptions));
|
|
762
879
|
}
|
|
763
880
|
// Body size limiting
|
|
764
|
-
this.use(
|
|
881
|
+
this.use(middleware.bodySize({ limit: '10mb' }));
|
|
765
882
|
}
|
|
766
883
|
// Enhanced auto-discovery initialization
|
|
767
884
|
async initializeAutoDiscovery(options) {
|
|
768
|
-
const { ModuleDiscovery } = await
|
|
885
|
+
const { ModuleDiscovery } = await import('./core/modules/auto-discovery.js');
|
|
769
886
|
// Merge auto-discovery configuration
|
|
770
887
|
const autoDiscoveryConfig = this.mergeAutoDiscoveryConfig(options);
|
|
771
888
|
if (!autoDiscoveryConfig.enabled) {
|
|
@@ -777,6 +894,8 @@ class Moro extends events_1.EventEmitter {
|
|
|
777
894
|
const modules = await this.moduleDiscovery.discoverModulesAdvanced(autoDiscoveryConfig);
|
|
778
895
|
// Load modules based on strategy
|
|
779
896
|
await this.loadDiscoveredModules(modules, autoDiscoveryConfig);
|
|
897
|
+
// Setup final module handler to run after user middleware (like auth)
|
|
898
|
+
this.coreFramework.setupFinalModuleHandler();
|
|
780
899
|
// Setup file watching if enabled
|
|
781
900
|
if (autoDiscoveryConfig.watchForChanges) {
|
|
782
901
|
this.moduleDiscovery.watchModulesAdvanced(autoDiscoveryConfig, async (updatedModules) => {
|
|
@@ -930,7 +1049,7 @@ class Moro extends events_1.EventEmitter {
|
|
|
930
1049
|
});
|
|
931
1050
|
}
|
|
932
1051
|
async importModule(modulePath) {
|
|
933
|
-
const module = await
|
|
1052
|
+
const module = await import(modulePath);
|
|
934
1053
|
return module.default || module;
|
|
935
1054
|
}
|
|
936
1055
|
/**
|
|
@@ -952,8 +1071,6 @@ class Moro extends events_1.EventEmitter {
|
|
|
952
1071
|
*/
|
|
953
1072
|
clusterWorkers = new Map();
|
|
954
1073
|
startWithClustering(port, host, callback) {
|
|
955
|
-
const cluster = require('cluster');
|
|
956
|
-
const os = require('os');
|
|
957
1074
|
// Worker count calculation - respect user choice
|
|
958
1075
|
let workerCount = this.config.performance?.clustering?.workers || os.cpus().length;
|
|
959
1076
|
// Only auto-optimize if user hasn't specified a number or set it to 'auto'
|
|
@@ -1045,12 +1162,11 @@ class Moro extends events_1.EventEmitter {
|
|
|
1045
1162
|
// Multiple workers writing to same log files creates I/O contention
|
|
1046
1163
|
if (this.config.logging) {
|
|
1047
1164
|
// Workers log less frequently to reduce I/O contention
|
|
1048
|
-
|
|
1165
|
+
applyLoggingConfiguration(undefined, { level: 'warn' }); // Only warnings and errors
|
|
1049
1166
|
}
|
|
1050
1167
|
// Research-based memory optimization for workers
|
|
1051
|
-
const os = require('os');
|
|
1052
1168
|
const totalMemoryGB = os.totalmem() / (1024 * 1024 * 1024);
|
|
1053
|
-
const workerCount = Object.keys(
|
|
1169
|
+
const workerCount = Object.keys(cluster.workers || {}).length || 1;
|
|
1054
1170
|
// Conservative memory allocation
|
|
1055
1171
|
const heapSizePerWorkerMB = Math.min(Math.floor(((totalMemoryGB * 1024) / workerCount) * 0.8), // 80% of available memory
|
|
1056
1172
|
1536 // Cap at 1.5GB (GC efficiency threshold from research)
|
|
@@ -1132,12 +1248,33 @@ class Moro extends events_1.EventEmitter {
|
|
|
1132
1248
|
worker: process.pid,
|
|
1133
1249
|
});
|
|
1134
1250
|
};
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1251
|
+
// Ensure WebSocket setup is complete before starting worker
|
|
1252
|
+
this.processQueuedWebSocketRegistrations()
|
|
1253
|
+
.then(() => {
|
|
1254
|
+
if (host) {
|
|
1255
|
+
this.coreFramework.listen(port, host, workerCallback);
|
|
1256
|
+
}
|
|
1257
|
+
else {
|
|
1258
|
+
this.coreFramework.listen(port, workerCallback);
|
|
1259
|
+
}
|
|
1260
|
+
})
|
|
1261
|
+
.catch(error => {
|
|
1262
|
+
this.logger.error('WebSocket initialization failed in worker', 'Worker', {
|
|
1263
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1264
|
+
});
|
|
1265
|
+
// For WebSocket failures with queued registrations, error will propagate
|
|
1266
|
+
if (error instanceof Error &&
|
|
1267
|
+
error.message.includes('WebSocket features require a WebSocket adapter')) {
|
|
1268
|
+
throw error;
|
|
1269
|
+
}
|
|
1270
|
+
// Start anyway for other errors
|
|
1271
|
+
if (host) {
|
|
1272
|
+
this.coreFramework.listen(port, host, workerCallback);
|
|
1273
|
+
}
|
|
1274
|
+
else {
|
|
1275
|
+
this.coreFramework.listen(port, workerCallback);
|
|
1276
|
+
}
|
|
1277
|
+
});
|
|
1141
1278
|
}
|
|
1142
1279
|
}
|
|
1143
1280
|
// Simple worker message handler
|
|
@@ -1201,31 +1338,30 @@ class Moro extends events_1.EventEmitter {
|
|
|
1201
1338
|
this.logger.debug('Moro application closed successfully');
|
|
1202
1339
|
}
|
|
1203
1340
|
}
|
|
1204
|
-
exports.Moro = Moro;
|
|
1205
1341
|
// Export convenience function
|
|
1206
|
-
function createApp(options) {
|
|
1342
|
+
export function createApp(options) {
|
|
1207
1343
|
return new Moro(options);
|
|
1208
1344
|
}
|
|
1209
1345
|
// Runtime-specific convenience functions
|
|
1210
|
-
function createAppNode(options) {
|
|
1346
|
+
export function createAppNode(options) {
|
|
1211
1347
|
return new Moro({
|
|
1212
1348
|
...options,
|
|
1213
1349
|
runtime: { type: 'node' },
|
|
1214
1350
|
});
|
|
1215
1351
|
}
|
|
1216
|
-
function createAppEdge(options) {
|
|
1352
|
+
export function createAppEdge(options) {
|
|
1217
1353
|
return new Moro({
|
|
1218
1354
|
...options,
|
|
1219
1355
|
runtime: { type: 'vercel-edge' },
|
|
1220
1356
|
});
|
|
1221
1357
|
}
|
|
1222
|
-
function createAppLambda(options) {
|
|
1358
|
+
export function createAppLambda(options) {
|
|
1223
1359
|
return new Moro({
|
|
1224
1360
|
...options,
|
|
1225
1361
|
runtime: { type: 'aws-lambda' },
|
|
1226
1362
|
});
|
|
1227
1363
|
}
|
|
1228
|
-
function createAppWorker(options) {
|
|
1364
|
+
export function createAppWorker(options) {
|
|
1229
1365
|
return new Moro({
|
|
1230
1366
|
...options,
|
|
1231
1367
|
runtime: { type: 'cloudflare-workers' },
|