@morojs/moro 1.5.16 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -269
- package/dist/core/auth/morojs-adapter.js +5 -9
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-manager.d.ts +1 -1
- package/dist/core/config/config-manager.js +10 -20
- package/dist/core/config/config-manager.js.map +1 -1
- package/dist/core/config/config-sources.d.ts +2 -2
- package/dist/core/config/config-sources.js +17 -20
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.d.ts +1 -1
- package/dist/core/config/config-validator.js +33 -10
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/config/file-loader.d.ts +1 -1
- package/dist/core/config/file-loader.js +19 -78
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +8 -8
- package/dist/core/config/index.js +25 -51
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +11 -13
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +1 -1
- package/dist/core/config/utils.js +18 -32
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +18 -11
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +19 -29
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +3 -1
- package/dist/core/database/adapters/mongodb.js +23 -8
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +3 -1
- package/dist/core/database/adapters/mysql.js +18 -9
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +3 -1
- package/dist/core/database/adapters/postgresql.js +18 -8
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +3 -1
- package/dist/core/database/adapters/redis.js +34 -9
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +3 -1
- package/dist/core/database/adapters/sqlite.js +19 -8
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/database/index.js +2 -18
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.d.ts +9 -9
- package/dist/core/docs/index.js +14 -35
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +2 -2
- package/dist/core/docs/openapi-generator.js +11 -16
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +2 -2
- package/dist/core/docs/schema-to-openapi.js +5 -11
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +4 -9
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +26 -29
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +31 -28
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +6 -10
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/events/index.js +1 -5
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +16 -6
- package/dist/core/framework.js +182 -92
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +1 -1
- package/dist/core/http/http-server.js +26 -209
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +4 -3
- package/dist/core/http/index.js +3 -8
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +3 -7
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/http/uws-http-server.d.ts +64 -0
- package/dist/core/http/uws-http-server.js +688 -0
- package/dist/core/http/uws-http-server.js.map +1 -0
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +8 -19
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/index.js +2 -25
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +21 -23
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +1 -1
- package/dist/core/logger/outputs.js +8 -15
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +10 -47
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +10 -17
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +3 -7
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +3 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +11 -9
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +3 -7
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +3 -7
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +3 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +12 -10
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +10 -17
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/index.js +4 -23
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth-helpers.js +11 -22
- package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
- package/dist/core/middleware/built-in/auth-providers.js +4 -9
- package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
- package/dist/core/middleware/built-in/auth.d.ts +2 -2
- package/dist/core/middleware/built-in/auth.js +51 -44
- package/dist/core/middleware/built-in/auth.js.map +1 -1
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +8 -11
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +5 -9
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie.js +3 -7
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +3 -7
- package/dist/core/middleware/built-in/cors.js.map +1 -1
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +5 -8
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +5 -8
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +3 -7
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +28 -28
- package/dist/core/middleware/built-in/index.js +47 -82
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +27 -2
- package/dist/core/middleware/built-in/jwt-helpers.js +32 -10
- package/dist/core/middleware/built-in/jwt-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor.js +3 -7
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +3 -7
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +3 -7
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +2 -2
- package/dist/core/middleware/built-in/session.js +11 -15
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +3 -7
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +3 -7
- package/dist/core/middleware/built-in/validation.js.map +1 -1
- package/dist/core/middleware/index.d.ts +4 -4
- package/dist/core/middleware/index.js +8 -28
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +3 -3
- package/dist/core/modules/auto-discovery.js +43 -81
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js +2 -9
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +11 -52
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +4 -3
- package/dist/core/networking/adapters/index.js +3 -7
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/socketio-adapter.js +5 -40
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.d.ts +44 -0
- package/dist/core/networking/adapters/uws-adapter.js +513 -0
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -0
- package/dist/core/networking/adapters/ws-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/ws-adapter.js +7 -42
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.d.ts +3 -2
- package/dist/core/networking/index.js +2 -7
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +3 -7
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.js +1 -2
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +9 -11
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +7 -12
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +2 -2
- package/dist/core/routing/index.js +7 -14
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +2 -6
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +3 -7
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +2 -6
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +12 -12
- package/dist/core/runtime/index.js +22 -35
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +4 -4
- package/dist/core/runtime/node-adapter.js +6 -43
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +2 -6
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +1 -5
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +12 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +2 -2
- package/dist/core/utilities/hooks.js +7 -12
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +5 -4
- package/dist/core/utilities/index.js +5 -19
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/package-utils.d.ts +38 -0
- package/dist/core/utilities/package-utils.js +57 -0
- package/dist/core/utilities/package-utils.js.map +1 -0
- package/dist/core/validation/adapters.d.ts +1 -1
- package/dist/core/validation/adapters.js +15 -26
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/index.d.ts +6 -4
- package/dist/core/validation/index.js +57 -28
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js +3 -9
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/index.d.ts +51 -52
- package/dist/index.js +23 -132
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +30 -10
- package/dist/moro.js +262 -126
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.js +3 -9
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js +1 -2
- package/dist/types/cdn.js +1 -2
- package/dist/types/config.d.ts +13 -1
- package/dist/types/config.js +1 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +3 -3
- package/dist/types/core.js +1 -2
- package/dist/types/database.js +1 -2
- package/dist/types/discovery.js +1 -2
- package/dist/types/events.js +1 -2
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/hooks.js +1 -2
- package/dist/types/http.js +1 -2
- package/dist/types/logger.js +1 -2
- package/dist/types/module.js +1 -2
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.js +1 -2
- package/dist/types/session.js +1 -2
- package/jest.config.mjs +41 -0
- package/package.json +18 -51
- package/src/core/auth/morojs-adapter.ts +1 -1
- package/src/core/config/config-manager.ts +2 -2
- package/src/core/config/config-sources.ts +6 -6
- package/src/core/config/config-validator.ts +38 -3
- package/src/core/config/file-loader.ts +13 -40
- package/src/core/config/index.ts +15 -11
- package/src/core/config/schema.ts +3 -2
- package/src/core/config/utils.ts +3 -3
- package/src/core/database/adapters/drizzle.ts +18 -6
- package/src/core/database/adapters/index.ts +13 -13
- package/src/core/database/adapters/mongodb.ts +23 -3
- package/src/core/database/adapters/mysql.ts +18 -4
- package/src/core/database/adapters/postgresql.ts +18 -3
- package/src/core/database/adapters/redis.ts +34 -4
- package/src/core/database/adapters/sqlite.ts +19 -3
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +8 -8
- package/src/core/docs/openapi-generator.ts +4 -4
- package/src/core/docs/schema-to-openapi.ts +3 -6
- package/src/core/docs/simple-docs.ts +2 -2
- package/src/core/docs/swagger-ui.ts +19 -16
- package/src/core/docs/zod-to-openapi.ts +34 -34
- package/src/core/events/event-bus.ts +2 -2
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +190 -49
- package/src/core/http/http-server.ts +16 -159
- package/src/core/http/index.ts +4 -3
- package/src/core/http/router.ts +2 -2
- package/src/core/http/uws-http-server.ts +794 -0
- package/src/core/logger/filters.ts +1 -1
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +9 -1
- package/src/core/logger/outputs.ts +1 -1
- package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
- package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
- package/src/core/middleware/built-in/adapters/cache/redis.ts +18 -4
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +16 -5
- package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth-helpers.ts +1 -1
- package/src/core/middleware/built-in/auth-providers.ts +1 -1
- package/src/core/middleware/built-in/auth.ts +64 -41
- package/src/core/middleware/built-in/cache.ts +5 -5
- package/src/core/middleware/built-in/cdn.ts +4 -4
- package/src/core/middleware/built-in/cookie.ts +2 -2
- package/src/core/middleware/built-in/cors.ts +2 -2
- package/src/core/middleware/built-in/csp.ts +3 -3
- package/src/core/middleware/built-in/csrf.ts +3 -3
- package/src/core/middleware/built-in/error-tracker.ts +1 -1
- package/src/core/middleware/built-in/index.ts +31 -31
- package/src/core/middleware/built-in/jwt-helpers.ts +32 -4
- package/src/core/middleware/built-in/performance-monitor.ts +1 -1
- package/src/core/middleware/built-in/rate-limit.ts +2 -2
- package/src/core/middleware/built-in/request-logger.ts +1 -1
- package/src/core/middleware/built-in/session.ts +7 -8
- package/src/core/middleware/built-in/sse.ts +2 -2
- package/src/core/middleware/built-in/validation.ts +2 -2
- package/src/core/middleware/index.ts +6 -6
- package/src/core/modules/auto-discovery.ts +4 -4
- package/src/core/modules/index.ts +2 -2
- package/src/core/modules/modules.ts +4 -4
- package/src/core/networking/adapters/index.ts +4 -3
- package/src/core/networking/adapters/socketio-adapter.ts +5 -3
- package/src/core/networking/adapters/uws-adapter.ts +619 -0
- package/src/core/networking/adapters/ws-adapter.ts +6 -4
- package/src/core/networking/index.ts +3 -2
- package/src/core/networking/service-discovery.ts +1 -1
- package/src/core/networking/websocket-manager.ts +7 -7
- package/src/core/routing/app-integration.ts +3 -3
- package/src/core/routing/index.ts +3 -3
- package/src/core/runtime/aws-lambda-adapter.ts +3 -3
- package/src/core/runtime/base-adapter.ts +2 -2
- package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
- package/src/core/runtime/index.ts +13 -13
- package/src/core/runtime/node-adapter.ts +4 -4
- package/src/core/runtime/vercel-edge-adapter.ts +3 -3
- package/src/core/utilities/hooks.ts +3 -3
- package/src/core/utilities/index.ts +5 -4
- package/src/core/utilities/package-utils.ts +59 -0
- package/src/core/validation/adapters.ts +1 -1
- package/src/core/validation/index.ts +68 -16
- package/src/index.ts +73 -66
- package/src/moro.ts +303 -75
- package/src/types/config.ts +13 -1
- package/src/types/core.ts +3 -3
- package/src/types/hooks.ts +1 -1
- package/src/types/runtime.ts +1 -1
- package/tsconfig.json +4 -2
package/src/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
|
*/
|
|
@@ -619,22 +723,61 @@ export class Moro extends EventEmitter {
|
|
|
619
723
|
this.logger.debug(`Mounting router for basePath: ${basePath}`, 'Router');
|
|
620
724
|
|
|
621
725
|
// Enterprise-grade middleware integration with performance optimization
|
|
726
|
+
// IMPORTANT: Module middleware runs AFTER user middleware (like auth) to ensure proper order
|
|
622
727
|
this.httpServer.use(async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
623
728
|
if (req.path.startsWith(basePath)) {
|
|
624
729
|
this.logger.debug(`Module middleware handling: ${req.method} ${req.path}`, 'Middleware', {
|
|
625
730
|
basePath,
|
|
626
731
|
});
|
|
627
732
|
|
|
733
|
+
// Mark this request as being handled by a module
|
|
734
|
+
(req as any).__moduleBasePath = basePath;
|
|
735
|
+
(req as any).__moduleRouter = router;
|
|
736
|
+
|
|
737
|
+
// Continue to next middleware (including auth) first
|
|
738
|
+
next();
|
|
739
|
+
} else {
|
|
740
|
+
next();
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
this.logger.info(`Router mounted for ${basePath}`, 'Router');
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
private finalModuleHandlerSetup = false;
|
|
748
|
+
|
|
749
|
+
// Setup final module handler that runs after all user middleware
|
|
750
|
+
setupFinalModuleHandler(): void {
|
|
751
|
+
// Prevent duplicate setup
|
|
752
|
+
if (this.finalModuleHandlerSetup) {
|
|
753
|
+
this.logger.debug('Final module handler already set up, skipping', 'ModuleSystem');
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
this.finalModuleHandlerSetup = true;
|
|
757
|
+
|
|
758
|
+
this.logger.info(
|
|
759
|
+
'Setting up final module handler to run after user middleware',
|
|
760
|
+
'ModuleSystem'
|
|
761
|
+
);
|
|
762
|
+
|
|
763
|
+
this.httpServer.use(async (req: HttpRequest, res: HttpResponse, next: () => void) => {
|
|
764
|
+
// Check if this request was marked for module handling
|
|
765
|
+
const moduleBasePath = (req as any).__moduleBasePath;
|
|
766
|
+
const moduleRouter = (req as any).__moduleRouter;
|
|
767
|
+
|
|
768
|
+
if (moduleBasePath && moduleRouter && !res.headersSent) {
|
|
769
|
+
this.logger.debug(`Final module handler processing: ${req.method} ${req.path}`, 'Router');
|
|
770
|
+
|
|
628
771
|
try {
|
|
629
|
-
const handled = await
|
|
630
|
-
this.logger.debug(`Route handled: ${handled}`, 'Router');
|
|
772
|
+
const handled = await moduleRouter.handle(req, res, moduleBasePath);
|
|
773
|
+
this.logger.debug(`Route handled by module: ${handled}`, 'Router');
|
|
631
774
|
|
|
632
775
|
if (!handled) {
|
|
633
776
|
next(); // Let other middleware handle it
|
|
634
777
|
}
|
|
635
778
|
// If handled, the router already sent the response, so don't call next()
|
|
636
779
|
} catch (error) {
|
|
637
|
-
this.logger.error('
|
|
780
|
+
this.logger.error('Module router error', 'Router', {
|
|
638
781
|
error: error instanceof Error ? error.message : String(error),
|
|
639
782
|
});
|
|
640
783
|
if (!res.headersSent) {
|
|
@@ -645,8 +788,6 @@ export class Moro extends EventEmitter {
|
|
|
645
788
|
next();
|
|
646
789
|
}
|
|
647
790
|
});
|
|
648
|
-
|
|
649
|
-
this.logger.info(`Router mounted for ${basePath}`, 'Router');
|
|
650
791
|
}
|
|
651
792
|
|
|
652
793
|
private async setupWebSocketHandlers(config: ModuleConfig): Promise<void> {
|
|
@@ -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);
|
|
@@ -285,64 +293,6 @@ export class MoroHttpServer {
|
|
|
285
293
|
// Execute handler
|
|
286
294
|
await route.handler(httpReq, httpRes);
|
|
287
295
|
} catch (error) {
|
|
288
|
-
// Handle JWT-specific errors gracefully
|
|
289
|
-
if (
|
|
290
|
-
error instanceof Error &&
|
|
291
|
-
(error.name === 'TokenExpiredError' ||
|
|
292
|
-
error.name === 'JsonWebTokenError' ||
|
|
293
|
-
error.name === 'NotBeforeError')
|
|
294
|
-
) {
|
|
295
|
-
this.logger.debug('JWT authentication error', 'RequestHandler', {
|
|
296
|
-
errorType: error.name,
|
|
297
|
-
errorMessage: error.message,
|
|
298
|
-
requestPath: req.url,
|
|
299
|
-
requestMethod: req.method,
|
|
300
|
-
requestId: httpReq.requestId,
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
if (!httpRes.headersSent) {
|
|
304
|
-
if (typeof httpRes.status === 'function' && typeof httpRes.json === 'function') {
|
|
305
|
-
if (error.name === 'TokenExpiredError') {
|
|
306
|
-
httpRes.status(401).json({
|
|
307
|
-
success: false,
|
|
308
|
-
error: 'Token expired',
|
|
309
|
-
message: 'Your session has expired. Please sign in again.',
|
|
310
|
-
requestId: httpReq.requestId,
|
|
311
|
-
expiredAt: (error as any).expiredAt,
|
|
312
|
-
});
|
|
313
|
-
} else if (error.name === 'JsonWebTokenError') {
|
|
314
|
-
httpRes.status(401).json({
|
|
315
|
-
success: false,
|
|
316
|
-
error: 'Invalid token',
|
|
317
|
-
message: 'The provided authentication token is invalid.',
|
|
318
|
-
requestId: httpReq.requestId,
|
|
319
|
-
});
|
|
320
|
-
} else if (error.name === 'NotBeforeError') {
|
|
321
|
-
httpRes.status(401).json({
|
|
322
|
-
success: false,
|
|
323
|
-
error: 'Token not ready',
|
|
324
|
-
message: 'The authentication token is not yet valid.',
|
|
325
|
-
requestId: httpReq.requestId,
|
|
326
|
-
availableAt: (error as any).date,
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
} else {
|
|
330
|
-
// Fallback for non-enhanced response objects
|
|
331
|
-
httpRes.statusCode = 401;
|
|
332
|
-
httpRes.setHeader('Content-Type', 'application/json');
|
|
333
|
-
httpRes.end(
|
|
334
|
-
JSON.stringify({
|
|
335
|
-
success: false,
|
|
336
|
-
error: 'Authentication failed',
|
|
337
|
-
message: 'JWT authentication error occurred.',
|
|
338
|
-
requestId: httpReq.requestId,
|
|
339
|
-
})
|
|
340
|
-
);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
296
|
// Debug: Log the actual error and where it came from
|
|
347
297
|
this.logger.debug('Request error details', 'RequestHandler', {
|
|
348
298
|
errorType: typeof error,
|
|
@@ -1074,101 +1024,11 @@ export class MoroHttpServer {
|
|
|
1074
1024
|
if (!nextCalled) next();
|
|
1075
1025
|
})
|
|
1076
1026
|
.catch(error => {
|
|
1077
|
-
|
|
1078
|
-
if (
|
|
1079
|
-
error instanceof Error &&
|
|
1080
|
-
(error.name === 'TokenExpiredError' ||
|
|
1081
|
-
error.name === 'JsonWebTokenError' ||
|
|
1082
|
-
error.name === 'NotBeforeError')
|
|
1083
|
-
) {
|
|
1084
|
-
if (!res.headersSent) {
|
|
1085
|
-
if (typeof res.status === 'function' && typeof res.json === 'function') {
|
|
1086
|
-
if (error.name === 'TokenExpiredError') {
|
|
1087
|
-
res.status(401).json({
|
|
1088
|
-
success: false,
|
|
1089
|
-
error: 'Token expired',
|
|
1090
|
-
message: 'Your session has expired. Please sign in again.',
|
|
1091
|
-
expiredAt: (error as any).expiredAt,
|
|
1092
|
-
});
|
|
1093
|
-
} else if (error.name === 'JsonWebTokenError') {
|
|
1094
|
-
res.status(401).json({
|
|
1095
|
-
success: false,
|
|
1096
|
-
error: 'Invalid token',
|
|
1097
|
-
message: 'The provided authentication token is invalid.',
|
|
1098
|
-
});
|
|
1099
|
-
} else if (error.name === 'NotBeforeError') {
|
|
1100
|
-
res.status(401).json({
|
|
1101
|
-
success: false,
|
|
1102
|
-
error: 'Token not ready',
|
|
1103
|
-
message: 'The authentication token is not yet valid.',
|
|
1104
|
-
availableAt: (error as any).date,
|
|
1105
|
-
});
|
|
1106
|
-
}
|
|
1107
|
-
} else {
|
|
1108
|
-
res.statusCode = 401;
|
|
1109
|
-
res.setHeader('Content-Type', 'application/json');
|
|
1110
|
-
res.end(
|
|
1111
|
-
JSON.stringify({
|
|
1112
|
-
success: false,
|
|
1113
|
-
error: 'Authentication failed',
|
|
1114
|
-
message: 'JWT authentication error occurred.',
|
|
1115
|
-
})
|
|
1116
|
-
);
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
resolve(); // Continue middleware chain
|
|
1120
|
-
} else {
|
|
1121
|
-
reject(error);
|
|
1122
|
-
}
|
|
1027
|
+
reject(error);
|
|
1123
1028
|
});
|
|
1124
1029
|
}
|
|
1125
1030
|
} catch (error) {
|
|
1126
|
-
|
|
1127
|
-
if (
|
|
1128
|
-
error instanceof Error &&
|
|
1129
|
-
(error.name === 'TokenExpiredError' ||
|
|
1130
|
-
error.name === 'JsonWebTokenError' ||
|
|
1131
|
-
error.name === 'NotBeforeError')
|
|
1132
|
-
) {
|
|
1133
|
-
if (!res.headersSent) {
|
|
1134
|
-
if (typeof res.status === 'function' && typeof res.json === 'function') {
|
|
1135
|
-
if (error.name === 'TokenExpiredError') {
|
|
1136
|
-
res.status(401).json({
|
|
1137
|
-
success: false,
|
|
1138
|
-
error: 'Token expired',
|
|
1139
|
-
message: 'Your session has expired. Please sign in again.',
|
|
1140
|
-
expiredAt: (error as any).expiredAt,
|
|
1141
|
-
});
|
|
1142
|
-
} else if (error.name === 'JsonWebTokenError') {
|
|
1143
|
-
res.status(401).json({
|
|
1144
|
-
success: false,
|
|
1145
|
-
error: 'Invalid token',
|
|
1146
|
-
message: 'The provided authentication token is invalid.',
|
|
1147
|
-
});
|
|
1148
|
-
} else if (error.name === 'NotBeforeError') {
|
|
1149
|
-
res.status(401).json({
|
|
1150
|
-
success: false,
|
|
1151
|
-
error: 'Token not ready',
|
|
1152
|
-
message: 'The authentication token is not yet valid.',
|
|
1153
|
-
availableAt: (error as any).date,
|
|
1154
|
-
});
|
|
1155
|
-
}
|
|
1156
|
-
} else {
|
|
1157
|
-
res.statusCode = 401;
|
|
1158
|
-
res.setHeader('Content-Type', 'application/json');
|
|
1159
|
-
res.end(
|
|
1160
|
-
JSON.stringify({
|
|
1161
|
-
success: false,
|
|
1162
|
-
error: 'Authentication failed',
|
|
1163
|
-
message: 'JWT authentication error occurred.',
|
|
1164
|
-
})
|
|
1165
|
-
);
|
|
1166
|
-
}
|
|
1167
|
-
}
|
|
1168
|
-
resolve(); // Continue middleware chain
|
|
1169
|
-
} else {
|
|
1170
|
-
reject(error);
|
|
1171
|
-
}
|
|
1031
|
+
reject(error);
|
|
1172
1032
|
}
|
|
1173
1033
|
});
|
|
1174
1034
|
}
|
|
@@ -1281,7 +1141,6 @@ export const middleware = {
|
|
|
1281
1141
|
},
|
|
1282
1142
|
|
|
1283
1143
|
compression: (options: { threshold?: number; level?: number } = {}): Middleware => {
|
|
1284
|
-
const zlib = require('zlib');
|
|
1285
1144
|
const threshold = options.threshold || 1024;
|
|
1286
1145
|
const level = options.level || 6;
|
|
1287
1146
|
|
|
@@ -1867,7 +1726,7 @@ export const middleware = {
|
|
|
1867
1726
|
res.setHeader('Content-Length', chunkSize);
|
|
1868
1727
|
|
|
1869
1728
|
// Stream the range
|
|
1870
|
-
const stream =
|
|
1729
|
+
const stream = createReadStream(filePath, {
|
|
1871
1730
|
start,
|
|
1872
1731
|
end,
|
|
1873
1732
|
});
|
|
@@ -1885,12 +1744,12 @@ export const middleware = {
|
|
|
1885
1744
|
res.write(`\r\n--${boundary}\r\n`);
|
|
1886
1745
|
res.write(`Content-Range: bytes ${start}-${end}/${fileSize}\r\n\r\n`);
|
|
1887
1746
|
|
|
1888
|
-
const stream =
|
|
1747
|
+
const stream = createReadStream(filePath, {
|
|
1889
1748
|
start,
|
|
1890
1749
|
end,
|
|
1891
1750
|
});
|
|
1892
|
-
await new Promise(resolve => {
|
|
1893
|
-
stream.on('end', resolve);
|
|
1751
|
+
await new Promise<void>(resolve => {
|
|
1752
|
+
stream.on('end', () => resolve());
|
|
1894
1753
|
stream.pipe(res, { end: false });
|
|
1895
1754
|
});
|
|
1896
1755
|
}
|
|
@@ -1924,7 +1783,6 @@ export const middleware = {
|
|
|
1924
1783
|
const ignoreMethods = options.ignoreMethods || ['GET', 'HEAD', 'OPTIONS'];
|
|
1925
1784
|
|
|
1926
1785
|
const generateToken = () => {
|
|
1927
|
-
const crypto = require('crypto');
|
|
1928
1786
|
return crypto.randomBytes(tokenLength).toString('hex');
|
|
1929
1787
|
};
|
|
1930
1788
|
|
|
@@ -2013,7 +1871,6 @@ export const middleware = {
|
|
|
2013
1871
|
// Generate nonce if requested
|
|
2014
1872
|
let nonce: string | undefined;
|
|
2015
1873
|
if (options.nonce) {
|
|
2016
|
-
const crypto = require('crypto');
|
|
2017
1874
|
nonce = crypto.randomBytes(16).toString('base64');
|
|
2018
1875
|
(req as any).cspNonce = nonce;
|
|
2019
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[] = [];
|