@morojs/moro 1.5.17 → 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 +14 -6
- package/dist/core/framework.js +150 -88
- 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 +24 -62
- 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 +10 -14
- 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 +1 -1
- package/dist/core/middleware/built-in/jwt-helpers.js +6 -9
- 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 +13 -10
- package/dist/moro.js +132 -102
- 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 +148 -44
- package/src/core/http/http-server.ts +14 -9
- 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 +6 -6
- 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 +6 -3
- 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 +144 -51
- 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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// OpenAPI Specification Generator for Moro Framework
|
|
2
2
|
// Extracts route information from intelligent routing and generates OpenAPI 3.0 specs
|
|
3
3
|
|
|
4
|
-
import { CompiledRoute, RouteSchema } from '../routing';
|
|
5
|
-
import { OpenAPISchema } from './zod-to-openapi';
|
|
6
|
-
import { schemaToOpenAPI, generateExampleFromValidationSchema } from './schema-to-openapi';
|
|
7
|
-
import { createFrameworkLogger } from '../logger';
|
|
4
|
+
import { CompiledRoute, RouteSchema } from '../routing/index.js';
|
|
5
|
+
import { OpenAPISchema } from './zod-to-openapi.js';
|
|
6
|
+
import { schemaToOpenAPI, generateExampleFromValidationSchema } from './schema-to-openapi.js';
|
|
7
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
8
8
|
|
|
9
9
|
const logger = createFrameworkLogger('OpenAPIGenerator');
|
|
10
10
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Universal Schema to OpenAPI Converter
|
|
2
2
|
// Converts ValidationSchema (Zod, Joi, etc.) to OpenAPI 3.0 schema definitions
|
|
3
3
|
|
|
4
|
-
import { ValidationSchema } from '../validation/schema-interface';
|
|
5
|
-
import { OpenAPISchema } from './zod-to-openapi';
|
|
6
|
-
import { createFrameworkLogger } from '../logger';
|
|
4
|
+
import { ValidationSchema } from '../validation/schema-interface.js';
|
|
5
|
+
import { OpenAPISchema, zodToOpenAPI, generateExampleFromSchema } from './zod-to-openapi.js';
|
|
6
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
7
7
|
|
|
8
8
|
const logger = createFrameworkLogger('SchemaToOpenAPI');
|
|
9
9
|
|
|
@@ -32,8 +32,6 @@ export function schemaToOpenAPI(
|
|
|
32
32
|
// If it's a Zod schema, use the existing zod converter
|
|
33
33
|
if (isZodSchema(schema)) {
|
|
34
34
|
try {
|
|
35
|
-
// Import zod converter dynamically
|
|
36
|
-
const { zodToOpenAPI } = require('./zod-to-openapi');
|
|
37
35
|
return zodToOpenAPI(schema, options);
|
|
38
36
|
} catch (error) {
|
|
39
37
|
logger.warn('Zod converter not available, using fallback', String(error));
|
|
@@ -59,7 +57,6 @@ export function generateExampleFromValidationSchema(schema: ValidationSchema): a
|
|
|
59
57
|
// If it's a Zod schema, use existing example generator
|
|
60
58
|
if (isZodSchema(schema)) {
|
|
61
59
|
try {
|
|
62
|
-
const { generateExampleFromSchema } = require('./zod-to-openapi');
|
|
63
60
|
return generateExampleFromSchema(schema);
|
|
64
61
|
} catch (error) {
|
|
65
62
|
logger.warn('Zod example generator not available', String(error));
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Simple Documentation Generator - Fallback for when Swagger UI has issues
|
|
2
2
|
// Generates clean, readable API documentation from routes
|
|
3
3
|
|
|
4
|
-
import { CompiledRoute, RouteSchema } from '../routing';
|
|
5
|
-
import { createFrameworkLogger } from '../logger';
|
|
4
|
+
import { CompiledRoute, RouteSchema } from '../routing/index.js';
|
|
5
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
6
6
|
|
|
7
7
|
const logger = createFrameworkLogger('SimpleDocs');
|
|
8
8
|
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
|
|
4
4
|
import { readFileSync } from 'fs';
|
|
5
5
|
import { join } from 'path';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { createUserRequire } from '../utilities/package-utils.js';
|
|
7
|
+
import { HttpRequest, HttpResponse } from '../http/index.js';
|
|
8
|
+
import { OpenAPISpec } from './openapi-generator.js';
|
|
9
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
9
10
|
|
|
10
11
|
const logger = createFrameworkLogger('SwaggerUI');
|
|
11
12
|
|
|
@@ -44,7 +45,9 @@ export class SwaggerUIMiddleware {
|
|
|
44
45
|
};
|
|
45
46
|
|
|
46
47
|
try {
|
|
47
|
-
// Find swagger-ui-dist assets
|
|
48
|
+
// Find swagger-ui-dist assets using ESM-compatible resolution
|
|
49
|
+
// Create a require function from the user's working directory to find their installed packages
|
|
50
|
+
const require = createUserRequire();
|
|
48
51
|
this.swaggerUIAssetPath = require
|
|
49
52
|
.resolve('swagger-ui-dist/package.json')
|
|
50
53
|
.replace('/package.json', '');
|
|
@@ -119,37 +122,37 @@ export class SwaggerUIMiddleware {
|
|
|
119
122
|
<h3>Failed to Load Swagger UI</h3>
|
|
120
123
|
<div id="error-details"></div>
|
|
121
124
|
</div>
|
|
122
|
-
|
|
125
|
+
|
|
123
126
|
<script src="${basePath}/swagger-ui-bundle.js" charset="UTF-8"></script>
|
|
124
127
|
<script src="${basePath}/swagger-ui-standalone-preset.js" charset="UTF-8"></script>
|
|
125
128
|
<script>
|
|
126
129
|
console.log('Starting Swagger UI initialization...');
|
|
127
|
-
|
|
130
|
+
|
|
128
131
|
function showError(message, details) {
|
|
129
132
|
console.error('Swagger UI Error:', message, details);
|
|
130
133
|
document.getElementById('loading-message').style.display = 'none';
|
|
131
134
|
document.getElementById('error-display').style.display = 'block';
|
|
132
|
-
document.getElementById('error-details').innerHTML =
|
|
135
|
+
document.getElementById('error-details').innerHTML =
|
|
133
136
|
'<p><strong>Error:</strong> ' + message + '</p>' +
|
|
134
137
|
(details ? '<pre>' + JSON.stringify(details, null, 2) + '</pre>' : '');
|
|
135
138
|
}
|
|
136
|
-
|
|
139
|
+
|
|
137
140
|
function initializeSwaggerUI() {
|
|
138
141
|
console.log('Initializing Swagger UI...');
|
|
139
|
-
|
|
142
|
+
|
|
140
143
|
if (typeof SwaggerUIBundle === 'undefined') {
|
|
141
144
|
showError('SwaggerUIBundle not loaded', { SwaggerUIBundle: typeof SwaggerUIBundle });
|
|
142
145
|
return;
|
|
143
146
|
}
|
|
144
|
-
|
|
147
|
+
|
|
145
148
|
if (typeof SwaggerUIStandalonePreset === 'undefined') {
|
|
146
149
|
showError('SwaggerUIStandalonePreset not loaded', { SwaggerUIStandalonePreset: typeof SwaggerUIStandalonePreset });
|
|
147
150
|
return;
|
|
148
151
|
}
|
|
149
|
-
|
|
152
|
+
|
|
150
153
|
try {
|
|
151
154
|
console.log('Creating SwaggerUIBundle...');
|
|
152
|
-
|
|
155
|
+
|
|
153
156
|
const ui = SwaggerUIBundle({
|
|
154
157
|
url: '${basePath}/openapi.json',
|
|
155
158
|
dom_id: '#swagger-ui',
|
|
@@ -173,10 +176,10 @@ export class SwaggerUIMiddleware {
|
|
|
173
176
|
showError('Swagger UI initialization failed', error);
|
|
174
177
|
}
|
|
175
178
|
});
|
|
176
|
-
|
|
179
|
+
|
|
177
180
|
window.ui = ui;
|
|
178
181
|
console.log('SwaggerUIBundle created successfully');
|
|
179
|
-
|
|
182
|
+
|
|
180
183
|
// Hide loading message after timeout if onComplete doesn't fire
|
|
181
184
|
setTimeout(function() {
|
|
182
185
|
var loadingEl = document.getElementById('loading-message');
|
|
@@ -185,7 +188,7 @@ export class SwaggerUIMiddleware {
|
|
|
185
188
|
loadingEl.style.display = 'none';
|
|
186
189
|
}
|
|
187
190
|
}, 5000);
|
|
188
|
-
|
|
191
|
+
|
|
189
192
|
} catch (error) {
|
|
190
193
|
console.error('Error creating SwaggerUIBundle:', error);
|
|
191
194
|
showError('Failed to create SwaggerUIBundle', {
|
|
@@ -194,7 +197,7 @@ export class SwaggerUIMiddleware {
|
|
|
194
197
|
});
|
|
195
198
|
}
|
|
196
199
|
}
|
|
197
|
-
|
|
200
|
+
|
|
198
201
|
// Initialize when DOM is ready and scripts are loaded
|
|
199
202
|
if (document.readyState === 'loading') {
|
|
200
203
|
document.addEventListener('DOMContentLoaded', function() {
|
|
@@ -1,41 +1,39 @@
|
|
|
1
1
|
// Zod to OpenAPI Schema Converter
|
|
2
2
|
// Transforms Zod schemas into OpenAPI 3.0 schema definitions
|
|
3
3
|
|
|
4
|
-
import { createFrameworkLogger } from '../logger';
|
|
4
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
5
|
+
import { createUserRequire, isPackageAvailable } from '../utilities/package-utils.js';
|
|
6
|
+
|
|
7
|
+
const logger = createFrameworkLogger('ZodToOpenAPI');
|
|
5
8
|
|
|
6
9
|
// Dynamic Zod imports (optional dependency)
|
|
7
|
-
let
|
|
8
|
-
|
|
9
|
-
ZodObject: any,
|
|
10
|
-
ZodArray: any,
|
|
11
|
-
ZodString: any,
|
|
12
|
-
ZodNumber: any,
|
|
13
|
-
ZodBoolean: any,
|
|
14
|
-
ZodEnum: any,
|
|
15
|
-
ZodOptional: any,
|
|
16
|
-
ZodDefault: any,
|
|
17
|
-
ZodUnion: any,
|
|
18
|
-
ZodLiteral: any;
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
const zod = require('zod');
|
|
22
|
-
ZodSchema = zod.ZodSchema;
|
|
23
|
-
ZodType = zod.ZodType;
|
|
24
|
-
ZodObject = zod.ZodObject;
|
|
25
|
-
ZodArray = zod.ZodArray;
|
|
26
|
-
ZodString = zod.ZodString;
|
|
27
|
-
ZodNumber = zod.ZodNumber;
|
|
28
|
-
ZodBoolean = zod.ZodBoolean;
|
|
29
|
-
ZodEnum = zod.ZodEnum;
|
|
30
|
-
ZodOptional = zod.ZodOptional;
|
|
31
|
-
ZodDefault = zod.ZodDefault;
|
|
32
|
-
ZodUnion = zod.ZodUnion;
|
|
33
|
-
ZodLiteral = zod.ZodLiteral;
|
|
34
|
-
} catch {
|
|
35
|
-
// Zod not available - that's fine!
|
|
36
|
-
}
|
|
10
|
+
let zodModule: any = null;
|
|
11
|
+
let zodLoadAttempted = false;
|
|
37
12
|
|
|
38
|
-
|
|
13
|
+
// Lazy synchronous initialization for Zod
|
|
14
|
+
function loadZodSync() {
|
|
15
|
+
if (zodLoadAttempted) {
|
|
16
|
+
return zodModule;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
zodLoadAttempted = true;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
if (!isPackageAvailable('zod')) {
|
|
23
|
+
zodModule = null;
|
|
24
|
+
return zodModule;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Use synchronous require for immediate availability
|
|
28
|
+
const userRequire = createUserRequire();
|
|
29
|
+
zodModule = userRequire('zod');
|
|
30
|
+
} catch {
|
|
31
|
+
// Zod not available - that's fine!
|
|
32
|
+
zodModule = null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return zodModule;
|
|
36
|
+
}
|
|
39
37
|
|
|
40
38
|
// OpenAPI schema types
|
|
41
39
|
export interface OpenAPISchema {
|
|
@@ -72,7 +70,8 @@ export interface ConversionOptions {
|
|
|
72
70
|
// Main conversion function
|
|
73
71
|
export function zodToOpenAPI(schema: any, options: ConversionOptions = {}): OpenAPISchema {
|
|
74
72
|
// Check if Zod is available
|
|
75
|
-
|
|
73
|
+
const zod = loadZodSync();
|
|
74
|
+
if (!zod) {
|
|
76
75
|
throw new Error('Zod is not installed. Please install zod to use zodToOpenAPI function.');
|
|
77
76
|
}
|
|
78
77
|
|
|
@@ -420,7 +419,8 @@ function hasDefault(type: any): boolean {
|
|
|
420
419
|
// Generate example data from Zod schema
|
|
421
420
|
export function generateExampleFromSchema(schema: any): any {
|
|
422
421
|
// Check if Zod is available
|
|
423
|
-
|
|
422
|
+
const zod = loadZodSync();
|
|
423
|
+
if (!zod) {
|
|
424
424
|
throw new Error(
|
|
425
425
|
'Zod is not installed. Please install zod to use generateExampleFromSchema function.'
|
|
426
426
|
);
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
GlobalEventBus,
|
|
9
9
|
EventMetrics,
|
|
10
10
|
EventHandler,
|
|
11
|
-
} from '../../types/events';
|
|
12
|
-
import { createFrameworkLogger } from '../logger';
|
|
11
|
+
} from '../../types/events.js';
|
|
12
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
13
13
|
|
|
14
14
|
export class MoroEventBus implements GlobalEventBus {
|
|
15
15
|
private emitter = new EventEmitter();
|
package/src/core/events/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Event System - Centralized Exports
|
|
2
|
-
export { MoroEventBus } from './event-bus';
|
|
2
|
+
export { MoroEventBus } from './event-bus.js';
|
|
3
3
|
export type {
|
|
4
4
|
EventContext,
|
|
5
5
|
EventPayload,
|
|
@@ -9,4 +9,4 @@ export type {
|
|
|
9
9
|
EventMetrics,
|
|
10
10
|
SystemEvents,
|
|
11
11
|
EventHandler,
|
|
12
|
-
} from '../../types/events';
|
|
12
|
+
} from '../../types/events.js';
|
package/src/core/framework.ts
CHANGED
|
@@ -5,18 +5,20 @@ import {
|
|
|
5
5
|
createServer as createHttp2Server,
|
|
6
6
|
} from 'http2';
|
|
7
7
|
import { EventEmitter } from 'events';
|
|
8
|
-
import { MoroHttpServer, HttpRequest, HttpResponse, middleware } from './http';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
8
|
+
import { MoroHttpServer, HttpRequest, HttpResponse, middleware } from './http/index.js';
|
|
9
|
+
import { UWebSocketsHttpServer } from './http/uws-http-server.js';
|
|
10
|
+
import { Router } from './http/router.js';
|
|
11
|
+
import { Container } from './utilities/container.js';
|
|
12
|
+
import { ModuleLoader } from './modules/index.js';
|
|
13
|
+
import { WebSocketManager } from './networking/websocket-manager.js';
|
|
14
|
+
import { CircuitBreaker } from './utilities/circuit-breaker.js';
|
|
15
|
+
import { isPackageAvailable } from './utilities/package-utils.js';
|
|
16
|
+
import { MoroEventBus } from './events/index.js';
|
|
17
|
+
import { createFrameworkLogger, logger as globalLogger } from './logger/index.js';
|
|
18
|
+
import { ModuleConfig, InternalRouteDefinition } from '../types/module.js';
|
|
19
|
+
import { LogLevel, LoggerOptions } from '../types/logger.js';
|
|
20
|
+
import { MoroOptions as CoreMoroOptions } from '../types/core.js';
|
|
21
|
+
import { WebSocketAdapter, WebSocketAdapterOptions } from './networking/websocket-adapter.js';
|
|
20
22
|
|
|
21
23
|
// Extended MoroOptions that includes both core options and framework-specific options
|
|
22
24
|
export interface MoroOptions extends CoreMoroOptions {
|
|
@@ -39,8 +41,8 @@ export interface MoroOptions extends CoreMoroOptions {
|
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
export class Moro extends EventEmitter {
|
|
42
|
-
private httpServer: MoroHttpServer;
|
|
43
|
-
private server: Server | any; // HTTP/2 server type
|
|
44
|
+
private httpServer: MoroHttpServer | UWebSocketsHttpServer;
|
|
45
|
+
private server: Server | any; // HTTP/2 server type or uWebSockets app
|
|
44
46
|
private websocketAdapter?: WebSocketAdapter;
|
|
45
47
|
private container: Container;
|
|
46
48
|
private moduleLoader: ModuleLoader;
|
|
@@ -53,6 +55,9 @@ export class Moro extends EventEmitter {
|
|
|
53
55
|
private logger: any;
|
|
54
56
|
private options: MoroOptions;
|
|
55
57
|
private config: any;
|
|
58
|
+
private usingUWebSockets = false;
|
|
59
|
+
// WebSocket initialization promise to handle async adapter detection
|
|
60
|
+
private websocketSetupPromise: Promise<void> | null = null;
|
|
56
61
|
|
|
57
62
|
constructor(options: MoroOptions = {}) {
|
|
58
63
|
super();
|
|
@@ -77,10 +82,33 @@ export class Moro extends EventEmitter {
|
|
|
77
82
|
// Initialize framework logger after global configuration
|
|
78
83
|
this.logger = createFrameworkLogger('Core');
|
|
79
84
|
|
|
80
|
-
|
|
85
|
+
// Check if uWebSockets should be used for HTTP and WebSocket
|
|
86
|
+
const useUWebSockets = this.config.server?.useUWebSockets || false;
|
|
87
|
+
|
|
88
|
+
if (useUWebSockets) {
|
|
89
|
+
try {
|
|
90
|
+
// Try to use uWebSockets for ultra-high performance HTTP and WebSocket
|
|
91
|
+
const sslOptions = this.config.server?.ssl || options.https;
|
|
92
|
+
this.httpServer = new UWebSocketsHttpServer({ ssl: sslOptions });
|
|
93
|
+
this.server = (this.httpServer as UWebSocketsHttpServer).getApp();
|
|
94
|
+
this.usingUWebSockets = true;
|
|
95
|
+
this.logger.info('uWebSockets HTTP+WebSocket server created', 'ServerInit');
|
|
96
|
+
} catch (error) {
|
|
97
|
+
// Fallback to standard HTTP/1.1 if uWebSockets fails to load
|
|
98
|
+
this.logger.warn(
|
|
99
|
+
'uWebSockets failed to initialize, falling back to Node.js http.Server. ' +
|
|
100
|
+
'Error: ' +
|
|
101
|
+
(error instanceof Error ? error.message : String(error)),
|
|
102
|
+
'ServerInit'
|
|
103
|
+
);
|
|
104
|
+
this.usingUWebSockets = false;
|
|
105
|
+
this.httpServer = new MoroHttpServer();
|
|
106
|
+
this.server = (this.httpServer as MoroHttpServer).getServer();
|
|
107
|
+
}
|
|
108
|
+
} else if (options.http2) {
|
|
109
|
+
// Use HTTP/2
|
|
110
|
+
this.httpServer = new MoroHttpServer();
|
|
81
111
|
|
|
82
|
-
// Create HTTP/2 or HTTP/1.1 server based on options
|
|
83
|
-
if (options.http2) {
|
|
84
112
|
if (options.https) {
|
|
85
113
|
this.server = createHttp2SecureServer(options.https);
|
|
86
114
|
} else {
|
|
@@ -95,12 +123,14 @@ export class Moro extends EventEmitter {
|
|
|
95
123
|
req.url = headers[':path'];
|
|
96
124
|
req.method = headers[':method'];
|
|
97
125
|
req.headers = headers;
|
|
98
|
-
this.httpServer['handleRequest'](req, res);
|
|
126
|
+
(this.httpServer as MoroHttpServer)['handleRequest'](req, res);
|
|
99
127
|
});
|
|
100
128
|
|
|
101
129
|
this.logger.info('HTTP/2 server created', 'ServerInit');
|
|
102
130
|
} else {
|
|
103
|
-
|
|
131
|
+
// Use standard HTTP/1.1
|
|
132
|
+
this.httpServer = new MoroHttpServer();
|
|
133
|
+
this.server = (this.httpServer as MoroHttpServer).getServer();
|
|
104
134
|
}
|
|
105
135
|
|
|
106
136
|
this.container = new Container();
|
|
@@ -111,7 +141,8 @@ export class Moro extends EventEmitter {
|
|
|
111
141
|
this.config.websocket.enabled ||
|
|
112
142
|
(options.websocket && typeof options.websocket === 'object')
|
|
113
143
|
) {
|
|
114
|
-
|
|
144
|
+
// Store the promise so we can await it before using websockets
|
|
145
|
+
this.websocketSetupPromise = this.setupWebSockets(options.websocket || {});
|
|
115
146
|
}
|
|
116
147
|
|
|
117
148
|
// Initialize enterprise event bus
|
|
@@ -184,29 +215,47 @@ export class Moro extends EventEmitter {
|
|
|
184
215
|
*/
|
|
185
216
|
private async setupWebSockets(wsConfig: any): Promise<void> {
|
|
186
217
|
try {
|
|
187
|
-
//
|
|
188
|
-
if (
|
|
189
|
-
|
|
218
|
+
// If using uWebSockets HTTP server, automatically use uWebSockets for WebSocket too
|
|
219
|
+
if (this.usingUWebSockets) {
|
|
220
|
+
const { UWebSocketsAdapter } = await import('./networking/adapters/index.js');
|
|
221
|
+
this.websocketAdapter = new UWebSocketsAdapter();
|
|
222
|
+
|
|
223
|
+
// For uWebSockets, we need to integrate with the existing app
|
|
224
|
+
const uwsHttpServer = this.httpServer as UWebSocketsHttpServer;
|
|
225
|
+
await this.websocketAdapter.initialize(uwsHttpServer.getApp(), wsConfig.options);
|
|
226
|
+
|
|
227
|
+
this.logger.info(
|
|
228
|
+
'uWebSockets adapter initialized (integrated with HTTP server)',
|
|
229
|
+
'WebSocketSetup'
|
|
230
|
+
);
|
|
190
231
|
} else {
|
|
191
|
-
|
|
232
|
+
// Use provided adapter or try to auto-detect
|
|
233
|
+
if (wsConfig.adapter) {
|
|
234
|
+
this.websocketAdapter = wsConfig.adapter;
|
|
235
|
+
} else {
|
|
236
|
+
this.websocketAdapter = (await this.detectWebSocketAdapter()) || undefined;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (this.websocketAdapter) {
|
|
240
|
+
await this.websocketAdapter.initialize(this.server, wsConfig.options);
|
|
241
|
+
|
|
242
|
+
this.logger.info(
|
|
243
|
+
`WebSocket adapter initialized: ${this.websocketAdapter.getAdapterName()}`,
|
|
244
|
+
'WebSocketSetup'
|
|
245
|
+
);
|
|
246
|
+
}
|
|
192
247
|
}
|
|
193
248
|
|
|
249
|
+
// Configure adapter features (if adapter was created)
|
|
194
250
|
if (this.websocketAdapter) {
|
|
195
|
-
await this.websocketAdapter.initialize(this.server, wsConfig.options);
|
|
196
251
|
this.websocketManager = new WebSocketManager(this.websocketAdapter, this.container);
|
|
197
252
|
|
|
198
|
-
// Configure adapter features
|
|
199
253
|
if (wsConfig.compression) {
|
|
200
254
|
this.websocketAdapter.setCompression(true);
|
|
201
255
|
}
|
|
202
256
|
if (wsConfig.customIdGenerator) {
|
|
203
257
|
this.websocketAdapter.setCustomIdGenerator(wsConfig.customIdGenerator);
|
|
204
258
|
}
|
|
205
|
-
|
|
206
|
-
this.logger.info(
|
|
207
|
-
`WebSocket adapter initialized: ${this.websocketAdapter.getAdapterName()}`,
|
|
208
|
-
'WebSocketSetup'
|
|
209
|
-
);
|
|
210
259
|
}
|
|
211
260
|
} catch (error) {
|
|
212
261
|
this.logger.warn(
|
|
@@ -219,26 +268,72 @@ export class Moro extends EventEmitter {
|
|
|
219
268
|
|
|
220
269
|
/**
|
|
221
270
|
* Auto-detect available WebSocket adapter
|
|
271
|
+
* Tests if the library is actually installed by checking require.resolve
|
|
222
272
|
*/
|
|
223
273
|
private async detectWebSocketAdapter(): Promise<WebSocketAdapter | null> {
|
|
224
|
-
//
|
|
225
|
-
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
274
|
+
// Check if adapter is specified in config
|
|
275
|
+
if (this.config.websocket?.adapter) {
|
|
276
|
+
const adapterType = this.config.websocket.adapter;
|
|
277
|
+
|
|
278
|
+
if (adapterType === 'uws' && isPackageAvailable('uWebSockets.js')) {
|
|
279
|
+
try {
|
|
280
|
+
const { UWebSocketsAdapter } = await import('./networking/adapters/index.js');
|
|
281
|
+
return new UWebSocketsAdapter();
|
|
282
|
+
} catch {
|
|
283
|
+
this.logger.warn('uWebSockets.js specified but failed to load', 'AdapterDetection');
|
|
284
|
+
}
|
|
285
|
+
} else if (adapterType === 'socket.io' && isPackageAvailable('socket.io')) {
|
|
286
|
+
try {
|
|
287
|
+
const { SocketIOAdapter } = await import('./networking/adapters/index.js');
|
|
288
|
+
return new SocketIOAdapter();
|
|
289
|
+
} catch {
|
|
290
|
+
this.logger.warn('socket.io specified but failed to load', 'AdapterDetection');
|
|
291
|
+
}
|
|
292
|
+
} else if (adapterType === 'ws' && isPackageAvailable('ws')) {
|
|
293
|
+
try {
|
|
294
|
+
const { WSAdapter } = await import('./networking/adapters/index.js');
|
|
295
|
+
return new WSAdapter();
|
|
296
|
+
} catch {
|
|
297
|
+
this.logger.warn('ws specified but failed to load', 'AdapterDetection');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
230
300
|
}
|
|
231
301
|
|
|
232
|
-
// Try
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
302
|
+
// Auto-detect: Try uWebSockets.js first (highest performance)
|
|
303
|
+
if (isPackageAvailable('uWebSockets.js')) {
|
|
304
|
+
try {
|
|
305
|
+
const { UWebSocketsAdapter } = await import('./networking/adapters/index.js');
|
|
306
|
+
this.logger.debug('uWebSockets.js detected and loaded', 'AdapterDetection');
|
|
307
|
+
return new UWebSocketsAdapter();
|
|
308
|
+
} catch {
|
|
309
|
+
// Failed to load adapter
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Try socket.io second
|
|
314
|
+
if (isPackageAvailable('socket.io')) {
|
|
315
|
+
try {
|
|
316
|
+
const { SocketIOAdapter } = await import('./networking/adapters/index.js');
|
|
317
|
+
this.logger.debug('socket.io detected and loaded', 'AdapterDetection');
|
|
318
|
+
return new SocketIOAdapter();
|
|
319
|
+
} catch {
|
|
320
|
+
// Failed to load adapter
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Try native ws library last
|
|
325
|
+
if (isPackageAvailable('ws')) {
|
|
326
|
+
try {
|
|
327
|
+
const { WSAdapter } = await import('./networking/adapters/index.js');
|
|
328
|
+
this.logger.debug('ws detected and loaded', 'AdapterDetection');
|
|
329
|
+
return new WSAdapter();
|
|
330
|
+
} catch {
|
|
331
|
+
// Failed to load adapter
|
|
332
|
+
}
|
|
238
333
|
}
|
|
239
334
|
|
|
240
335
|
this.logger.warn(
|
|
241
|
-
'No WebSocket adapter found. Install socket.io or ws for WebSocket support',
|
|
336
|
+
'No WebSocket adapter found. Install uWebSockets.js, socket.io, or ws for WebSocket support',
|
|
242
337
|
'AdapterDetection'
|
|
243
338
|
);
|
|
244
339
|
return null;
|
|
@@ -317,6 +412,15 @@ export class Moro extends EventEmitter {
|
|
|
317
412
|
return this.websocketAdapter;
|
|
318
413
|
}
|
|
319
414
|
|
|
415
|
+
/**
|
|
416
|
+
* Ensure WebSocket setup is complete (for async adapter detection)
|
|
417
|
+
*/
|
|
418
|
+
async ensureWebSocketReady(): Promise<void> {
|
|
419
|
+
if (this.websocketSetupPromise) {
|
|
420
|
+
await this.websocketSetupPromise;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
320
424
|
/**
|
|
321
425
|
* Get the WebSocket manager
|
|
322
426
|
*/
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
// src/core/http-server.ts
|
|
2
2
|
import { IncomingMessage, ServerResponse, createServer, Server } from 'http';
|
|
3
3
|
import * as zlib from 'zlib';
|
|
4
|
+
import { createReadStream } from 'fs';
|
|
5
|
+
import * as crypto from 'crypto';
|
|
4
6
|
import { promisify } from 'util';
|
|
5
|
-
import { createFrameworkLogger } from '../logger';
|
|
6
|
-
import {
|
|
7
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
8
|
+
import {
|
|
9
|
+
HttpRequest,
|
|
10
|
+
HttpResponse,
|
|
11
|
+
HttpHandler,
|
|
12
|
+
Middleware,
|
|
13
|
+
RouteEntry,
|
|
14
|
+
} from '../../types/http.js';
|
|
7
15
|
|
|
8
16
|
const gzip = promisify(zlib.gzip);
|
|
9
17
|
const deflate = promisify(zlib.deflate);
|
|
@@ -1133,7 +1141,6 @@ export const middleware = {
|
|
|
1133
1141
|
},
|
|
1134
1142
|
|
|
1135
1143
|
compression: (options: { threshold?: number; level?: number } = {}): Middleware => {
|
|
1136
|
-
const zlib = require('zlib');
|
|
1137
1144
|
const threshold = options.threshold || 1024;
|
|
1138
1145
|
const level = options.level || 6;
|
|
1139
1146
|
|
|
@@ -1719,7 +1726,7 @@ export const middleware = {
|
|
|
1719
1726
|
res.setHeader('Content-Length', chunkSize);
|
|
1720
1727
|
|
|
1721
1728
|
// Stream the range
|
|
1722
|
-
const stream =
|
|
1729
|
+
const stream = createReadStream(filePath, {
|
|
1723
1730
|
start,
|
|
1724
1731
|
end,
|
|
1725
1732
|
});
|
|
@@ -1737,12 +1744,12 @@ export const middleware = {
|
|
|
1737
1744
|
res.write(`\r\n--${boundary}\r\n`);
|
|
1738
1745
|
res.write(`Content-Range: bytes ${start}-${end}/${fileSize}\r\n\r\n`);
|
|
1739
1746
|
|
|
1740
|
-
const stream =
|
|
1747
|
+
const stream = createReadStream(filePath, {
|
|
1741
1748
|
start,
|
|
1742
1749
|
end,
|
|
1743
1750
|
});
|
|
1744
|
-
await new Promise(resolve => {
|
|
1745
|
-
stream.on('end', resolve);
|
|
1751
|
+
await new Promise<void>(resolve => {
|
|
1752
|
+
stream.on('end', () => resolve());
|
|
1746
1753
|
stream.pipe(res, { end: false });
|
|
1747
1754
|
});
|
|
1748
1755
|
}
|
|
@@ -1776,7 +1783,6 @@ export const middleware = {
|
|
|
1776
1783
|
const ignoreMethods = options.ignoreMethods || ['GET', 'HEAD', 'OPTIONS'];
|
|
1777
1784
|
|
|
1778
1785
|
const generateToken = () => {
|
|
1779
|
-
const crypto = require('crypto');
|
|
1780
1786
|
return crypto.randomBytes(tokenLength).toString('hex');
|
|
1781
1787
|
};
|
|
1782
1788
|
|
|
@@ -1865,7 +1871,6 @@ export const middleware = {
|
|
|
1865
1871
|
// Generate nonce if requested
|
|
1866
1872
|
let nonce: string | undefined;
|
|
1867
1873
|
if (options.nonce) {
|
|
1868
|
-
const crypto = require('crypto');
|
|
1869
1874
|
nonce = crypto.randomBytes(16).toString('base64');
|
|
1870
1875
|
(req as any).cspNonce = nonce;
|
|
1871
1876
|
}
|
package/src/core/http/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// HTTP System - Centralized Exports
|
|
2
|
-
export { MoroHttpServer, middleware } from './http-server';
|
|
3
|
-
export {
|
|
2
|
+
export { MoroHttpServer, middleware } from './http-server.js';
|
|
3
|
+
export { UWebSocketsHttpServer } from './uws-http-server.js';
|
|
4
|
+
export { Router } from './router.js';
|
|
4
5
|
|
|
5
6
|
// Type exports
|
|
6
|
-
export type { HttpRequest, HttpResponse, HttpHandler, Middleware } from '../../types/http';
|
|
7
|
+
export type { HttpRequest, HttpResponse, HttpHandler, Middleware } from '../../types/http.js';
|
package/src/core/http/router.ts
CHANGED
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
HttpHandler,
|
|
6
6
|
Middleware,
|
|
7
7
|
RouteDefinition,
|
|
8
|
-
} from '../../types/http';
|
|
9
|
-
import { createFrameworkLogger } from '../logger';
|
|
8
|
+
} from '../../types/http.js';
|
|
9
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
10
10
|
|
|
11
11
|
export class Router {
|
|
12
12
|
private routes: RouteDefinition[] = [];
|