@morojs/moro 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -74
- package/dist/core/auth/morojs-adapter.js +20 -20
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/file-loader.d.ts +6 -1
- package/dist/core/config/file-loader.js +249 -19
- package/dist/core/config/file-loader.js.map +1 -1
- package/dist/core/config/index.d.ts +12 -41
- package/dist/core/config/index.js +54 -65
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +7 -0
- package/dist/core/config/loader.js +269 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.d.ts +2 -2
- package/dist/core/config/schema.js +44 -52
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +3 -10
- package/dist/core/config/utils.js +58 -31
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/config/validation.d.ts +17 -0
- package/dist/core/config/validation.js +131 -0
- package/dist/core/config/validation.js.map +1 -0
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +11 -18
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +29 -19
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -13
- package/dist/core/database/adapters/mongodb.js +10 -46
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -14
- package/dist/core/database/adapters/mysql.js +9 -19
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +2 -12
- package/dist/core/database/adapters/postgresql.js +9 -19
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -12
- package/dist/core/database/adapters/redis.js +13 -48
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -3
- package/dist/core/database/adapters/sqlite.js +8 -19
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/database/index.js +18 -2
- package/dist/core/database/index.js.map +1 -1
- package/dist/core/docs/index.d.ts +9 -9
- package/dist/core/docs/index.js +35 -14
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +2 -2
- package/dist/core/docs/openapi-generator.js +16 -11
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +2 -2
- package/dist/core/docs/schema-to-openapi.js +11 -5
- package/dist/core/docs/schema-to-openapi.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +9 -4
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +29 -26
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.js +28 -31
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +10 -6
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/events/index.js +5 -1
- package/dist/core/events/index.js.map +1 -1
- package/dist/core/framework.d.ts +12 -19
- package/dist/core/framework.js +100 -277
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +1 -13
- package/dist/core/http/http-server.js +85 -175
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -4
- package/dist/core/http/index.js +8 -3
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/router.d.ts +1 -13
- package/dist/core/http/router.js +43 -117
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +23 -20
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/index.js +24 -2
- package/dist/core/logger/index.js.map +1 -1
- package/dist/core/logger/logger.d.ts +14 -30
- package/dist/core/logger/logger.js +223 -398
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +1 -1
- package/dist/core/logger/outputs.js +17 -8
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +47 -10
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +17 -10
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +7 -3
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -3
- package/dist/core/middleware/built-in/adapters/cache/redis.js +9 -11
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +7 -3
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +7 -3
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -3
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +10 -12
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +17 -10
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/index.js +23 -4
- package/dist/core/middleware/built-in/adapters/index.js.map +1 -1
- package/dist/core/middleware/built-in/auth-helpers.js +22 -11
- package/dist/core/middleware/built-in/auth-helpers.js.map +1 -1
- package/dist/core/middleware/built-in/auth-providers.d.ts +1 -1
- package/dist/core/middleware/built-in/auth-providers.js +9 -4
- package/dist/core/middleware/built-in/auth-providers.js.map +1 -1
- package/dist/core/middleware/built-in/auth.d.ts +2 -2
- package/dist/core/middleware/built-in/auth.js +26 -93
- package/dist/core/middleware/built-in/auth.js.map +1 -1
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +12 -11
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +9 -5
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +1 -1
- package/dist/core/middleware/built-in/cookie.js +7 -3
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +7 -3
- package/dist/core/middleware/built-in/cors.js.map +1 -1
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +8 -5
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +8 -5
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +7 -3
- package/dist/core/middleware/built-in/error-tracker.js.map +1 -1
- package/dist/core/middleware/built-in/index.d.ts +27 -28
- package/dist/core/middleware/built-in/index.js +78 -48
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor.js +7 -3
- package/dist/core/middleware/built-in/performance-monitor.js.map +1 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +7 -3
- package/dist/core/middleware/built-in/rate-limit.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +8 -5
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +2 -2
- package/dist/core/middleware/built-in/session.js +15 -11
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +14 -12
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +7 -3
- package/dist/core/middleware/built-in/validation.js.map +1 -1
- package/dist/core/middleware/index.d.ts +4 -4
- package/dist/core/middleware/index.js +28 -8
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -19
- package/dist/core/modules/auto-discovery.js +74 -391
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js +9 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +54 -23
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +3 -4
- package/dist/core/networking/adapters/index.js +7 -3
- package/dist/core/networking/adapters/index.js.map +1 -1
- package/dist/core/networking/adapters/socketio-adapter.d.ts +1 -1
- package/dist/core/networking/adapters/socketio-adapter.js +40 -5
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +2 -2
- package/dist/core/networking/adapters/ws-adapter.js +43 -8
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -3
- package/dist/core/networking/index.js +7 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.js +12 -8
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-adapter.js +2 -1
- package/dist/core/networking/websocket-adapter.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +11 -9
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +12 -7
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +2 -22
- package/dist/core/routing/index.js +27 -185
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +6 -2
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +7 -3
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +6 -2
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +12 -12
- package/dist/core/runtime/index.js +35 -22
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +4 -4
- package/dist/core/runtime/node-adapter.js +49 -18
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +6 -2
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +5 -1
- package/dist/core/utilities/circuit-breaker.js.map +1 -1
- package/dist/core/utilities/container.js +22 -12
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +2 -2
- package/dist/core/utilities/hooks.js +12 -7
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -5
- package/dist/core/utilities/index.js +19 -5
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/validation/adapters.d.ts +1 -1
- package/dist/core/validation/adapters.js +26 -15
- package/dist/core/validation/adapters.js.map +1 -1
- package/dist/core/validation/index.d.ts +4 -6
- package/dist/core/validation/index.js +28 -57
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.js +9 -3
- package/dist/core/validation/schema-interface.js.map +1 -1
- package/dist/index.d.ts +52 -51
- package/dist/index.js +132 -23
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +10 -61
- package/dist/moro.js +237 -575
- package/dist/moro.js.map +1 -1
- package/dist/types/auth.js +9 -3
- package/dist/types/auth.js.map +1 -1
- package/dist/types/cache.js +2 -1
- package/dist/types/cdn.js +2 -1
- package/dist/types/config.d.ts +2 -70
- package/dist/types/config.js +2 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/core.d.ts +42 -36
- package/dist/types/core.js +2 -1
- package/dist/types/database.js +2 -1
- package/dist/types/discovery.js +2 -1
- package/dist/types/events.js +2 -1
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/hooks.js +2 -1
- package/dist/types/http.d.ts +1 -16
- package/dist/types/http.js +2 -1
- package/dist/types/logger.d.ts +0 -7
- package/dist/types/logger.js +2 -1
- package/dist/types/module.d.ts +0 -11
- package/dist/types/module.js +2 -1
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.js +2 -1
- package/dist/types/session.js +2 -1
- package/package.json +52 -19
- package/src/core/auth/morojs-adapter.ts +13 -18
- package/src/core/config/file-loader.ts +273 -13
- package/src/core/config/index.ts +34 -83
- package/src/core/config/loader.ts +633 -0
- package/src/core/config/schema.ts +33 -44
- package/src/core/config/utils.ts +31 -24
- package/src/core/config/validation.ts +140 -0
- package/src/core/database/README.md +16 -26
- package/src/core/database/adapters/drizzle.ts +6 -18
- package/src/core/database/adapters/index.ts +13 -13
- package/src/core/database/adapters/mongodb.ts +5 -53
- package/src/core/database/adapters/mysql.ts +4 -32
- package/src/core/database/adapters/postgresql.ts +5 -30
- package/src/core/database/adapters/redis.ts +8 -61
- package/src/core/database/adapters/sqlite.ts +3 -19
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +8 -8
- package/src/core/docs/openapi-generator.ts +4 -4
- package/src/core/docs/schema-to-openapi.ts +6 -3
- package/src/core/docs/simple-docs.ts +2 -2
- package/src/core/docs/swagger-ui.ts +16 -19
- package/src/core/docs/zod-to-openapi.ts +34 -34
- package/src/core/events/event-bus.ts +2 -2
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +67 -311
- package/src/core/http/http-server.ts +45 -190
- package/src/core/http/index.ts +3 -4
- package/src/core/http/router.ts +40 -129
- package/src/core/logger/filters.ts +5 -13
- package/src/core/logger/index.ts +3 -4
- package/src/core/logger/logger.ts +216 -435
- package/src/core/logger/outputs.ts +3 -1
- package/src/core/middleware/built-in/adapters/cache/file.ts +3 -3
- package/src/core/middleware/built-in/adapters/cache/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/memory.ts +2 -2
- package/src/core/middleware/built-in/adapters/cache/redis.ts +4 -18
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +2 -2
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +5 -16
- package/src/core/middleware/built-in/adapters/cdn/index.ts +7 -7
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth-helpers.ts +1 -1
- package/src/core/middleware/built-in/auth-providers.ts +1 -1
- package/src/core/middleware/built-in/auth.ts +21 -102
- package/src/core/middleware/built-in/cache.ts +6 -8
- package/src/core/middleware/built-in/cdn.ts +4 -4
- package/src/core/middleware/built-in/cookie.ts +2 -2
- package/src/core/middleware/built-in/cors.ts +2 -2
- package/src/core/middleware/built-in/csp.ts +3 -3
- package/src/core/middleware/built-in/csrf.ts +3 -3
- package/src/core/middleware/built-in/error-tracker.ts +1 -1
- package/src/core/middleware/built-in/index.ts +30 -38
- package/src/core/middleware/built-in/performance-monitor.ts +1 -1
- package/src/core/middleware/built-in/rate-limit.ts +2 -2
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +8 -7
- package/src/core/middleware/built-in/sse.ts +9 -11
- package/src/core/middleware/built-in/validation.ts +2 -2
- package/src/core/middleware/index.ts +6 -6
- package/src/core/modules/auto-discovery.ts +15 -478
- package/src/core/modules/index.ts +2 -2
- package/src/core/modules/modules.ts +12 -23
- package/src/core/networking/adapters/index.ts +3 -4
- package/src/core/networking/adapters/socketio-adapter.ts +3 -5
- package/src/core/networking/adapters/ws-adapter.ts +9 -8
- package/src/core/networking/index.ts +2 -3
- package/src/core/networking/service-discovery.ts +7 -6
- package/src/core/networking/websocket-manager.ts +7 -7
- package/src/core/routing/app-integration.ts +3 -3
- package/src/core/routing/index.ts +17 -201
- package/src/core/runtime/aws-lambda-adapter.ts +3 -3
- package/src/core/runtime/base-adapter.ts +2 -2
- package/src/core/runtime/cloudflare-workers-adapter.ts +3 -3
- package/src/core/runtime/index.ts +13 -13
- package/src/core/runtime/node-adapter.ts +10 -16
- package/src/core/runtime/vercel-edge-adapter.ts +3 -3
- package/src/core/utilities/hooks.ts +3 -3
- package/src/core/utilities/index.ts +4 -5
- package/src/core/validation/adapters.ts +1 -1
- package/src/core/validation/index.ts +16 -68
- package/src/index.ts +66 -73
- package/src/moro.ts +204 -685
- package/src/types/config.ts +2 -71
- package/src/types/core.ts +47 -49
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +1 -23
- package/src/types/logger.ts +0 -9
- package/src/types/module.ts +0 -12
- package/src/types/runtime.ts +1 -1
- package/tsconfig.json +2 -4
- package/dist/core/config/config-manager.d.ts +0 -44
- package/dist/core/config/config-manager.js +0 -104
- package/dist/core/config/config-manager.js.map +0 -1
- package/dist/core/config/config-sources.d.ts +0 -21
- package/dist/core/config/config-sources.js +0 -499
- package/dist/core/config/config-sources.js.map +0 -1
- package/dist/core/config/config-validator.d.ts +0 -21
- package/dist/core/config/config-validator.js +0 -788
- package/dist/core/config/config-validator.js.map +0 -1
- package/dist/core/http/uws-http-server.d.ts +0 -64
- package/dist/core/http/uws-http-server.js +0 -688
- package/dist/core/http/uws-http-server.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.d.ts +0 -118
- package/dist/core/middleware/built-in/jwt-helpers.js +0 -218
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/dist/core/networking/adapters/uws-adapter.d.ts +0 -44
- package/dist/core/networking/adapters/uws-adapter.js +0 -513
- package/dist/core/networking/adapters/uws-adapter.js.map +0 -1
- package/dist/core/utilities/package-utils.d.ts +0 -38
- package/dist/core/utilities/package-utils.js +0 -57
- package/dist/core/utilities/package-utils.js.map +0 -1
- package/jest.config.mjs +0 -41
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -596
- package/src/core/config/config-validator.ts +0 -1113
- package/src/core/http/uws-http-server.ts +0 -794
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
- package/src/core/networking/adapters/uws-adapter.ts +0 -619
- package/src/core/utilities/package-utils.ts +0 -59
|
@@ -1,17 +1,9 @@
|
|
|
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';
|
|
6
4
|
import { promisify } from 'util';
|
|
7
|
-
import { createFrameworkLogger } from '../logger
|
|
8
|
-
import {
|
|
9
|
-
HttpRequest,
|
|
10
|
-
HttpResponse,
|
|
11
|
-
HttpHandler,
|
|
12
|
-
Middleware,
|
|
13
|
-
RouteEntry,
|
|
14
|
-
} from '../../types/http.js';
|
|
5
|
+
import { createFrameworkLogger } from '../logger';
|
|
6
|
+
import { HttpRequest, HttpResponse, HttpHandler, Middleware, RouteEntry } from '../../types/http';
|
|
15
7
|
|
|
16
8
|
const gzip = promisify(zlib.gzip);
|
|
17
9
|
const deflate = promisify(zlib.deflate);
|
|
@@ -34,11 +26,6 @@ export class MoroHttpServer {
|
|
|
34
26
|
// Request handler pooling to avoid function creation overhead
|
|
35
27
|
private middlewareExecutionCache = new Map<string, Function>();
|
|
36
28
|
|
|
37
|
-
// Response caching for ultra-fast common responses
|
|
38
|
-
private responseCache = new Map<string, Buffer>();
|
|
39
|
-
private responseCacheHits = 0;
|
|
40
|
-
private responseCacheMisses = 0;
|
|
41
|
-
|
|
42
29
|
// String interning for common values (massive memory savings)
|
|
43
30
|
private static readonly INTERNED_METHODS = new Map([
|
|
44
31
|
['GET', 'GET'],
|
|
@@ -294,13 +281,18 @@ export class MoroHttpServer {
|
|
|
294
281
|
await route.handler(httpReq, httpRes);
|
|
295
282
|
} catch (error) {
|
|
296
283
|
// Debug: Log the actual error and where it came from
|
|
297
|
-
this.logger.debug('Request
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
284
|
+
this.logger.debug('🚨 MoroJS Request Error Details:', 'RequestHandler');
|
|
285
|
+
this.logger.debug(`📍 Error type: ${typeof error}`, 'RequestHandler');
|
|
286
|
+
this.logger.debug(
|
|
287
|
+
`📍 Error message: ${error instanceof Error ? error.message : String(error)}`,
|
|
288
|
+
'RequestHandler'
|
|
289
|
+
);
|
|
290
|
+
this.logger.debug(
|
|
291
|
+
`📍 Error stack: ${error instanceof Error ? error.stack : 'No stack trace'}`,
|
|
292
|
+
'RequestHandler'
|
|
293
|
+
);
|
|
294
|
+
this.logger.debug(`📍 Request path: ${req.url}`, 'RequestHandler');
|
|
295
|
+
this.logger.debug(`📍 Request method: ${req.method}`, 'RequestHandler');
|
|
304
296
|
|
|
305
297
|
this.logger.error('Request error', 'RequestHandler', {
|
|
306
298
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -324,10 +316,14 @@ export class MoroHttpServer {
|
|
|
324
316
|
httpRes.setHeader('Content-Type', 'application/json');
|
|
325
317
|
} else {
|
|
326
318
|
// Even setHeader doesn't exist - object is completely wrong
|
|
327
|
-
this.logger.error(
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
319
|
+
this.logger.error(
|
|
320
|
+
'❌ Response object is not a proper ServerResponse:',
|
|
321
|
+
'RequestHandler',
|
|
322
|
+
{
|
|
323
|
+
responseType: typeof httpRes,
|
|
324
|
+
responseKeys: Object.keys(httpRes),
|
|
325
|
+
}
|
|
326
|
+
);
|
|
331
327
|
}
|
|
332
328
|
|
|
333
329
|
if (typeof httpRes.end === 'function') {
|
|
@@ -340,7 +336,7 @@ export class MoroHttpServer {
|
|
|
340
336
|
);
|
|
341
337
|
} else {
|
|
342
338
|
this.logger.error(
|
|
343
|
-
'Cannot send error response - end() method missing',
|
|
339
|
+
'❌ Cannot send error response - end() method missing',
|
|
344
340
|
'RequestHandler'
|
|
345
341
|
);
|
|
346
342
|
}
|
|
@@ -505,20 +501,6 @@ export class MoroHttpServer {
|
|
|
505
501
|
httpRes.json = async (data: any) => {
|
|
506
502
|
if (httpRes.headersSent) return;
|
|
507
503
|
|
|
508
|
-
// PERFORMANCE OPTIMIZATION: Check response cache for common patterns
|
|
509
|
-
const cacheKey = this.getResponseCacheKey(data);
|
|
510
|
-
if (cacheKey) {
|
|
511
|
-
const cachedBuffer = this.responseCache.get(cacheKey);
|
|
512
|
-
if (cachedBuffer) {
|
|
513
|
-
this.responseCacheHits++;
|
|
514
|
-
httpRes.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
515
|
-
httpRes.setHeader('Content-Length', cachedBuffer.length);
|
|
516
|
-
httpRes.end(cachedBuffer);
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
this.responseCacheMisses++;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
504
|
// Ultra-fast JSON serialization with zero-copy buffers
|
|
523
505
|
let jsonString: string;
|
|
524
506
|
|
|
@@ -605,12 +587,6 @@ export class MoroHttpServer {
|
|
|
605
587
|
});
|
|
606
588
|
|
|
607
589
|
httpRes.end(finalBuffer);
|
|
608
|
-
|
|
609
|
-
// PERFORMANCE OPTIMIZATION: Cache small, common responses
|
|
610
|
-
if (cacheKey && finalBuffer.length < 1024 && this.responseCache.size < 100) {
|
|
611
|
-
this.responseCache.set(cacheKey, Buffer.from(finalBuffer));
|
|
612
|
-
}
|
|
613
|
-
|
|
614
590
|
// Return buffer to pool after response (zero-copy achievement!)
|
|
615
591
|
process.nextTick(() => MoroHttpServer.returnBuffer(buffer));
|
|
616
592
|
};
|
|
@@ -639,26 +615,6 @@ export class MoroHttpServer {
|
|
|
639
615
|
};
|
|
640
616
|
|
|
641
617
|
httpRes.cookie = (name: string, value: string, options: any = {}) => {
|
|
642
|
-
if (httpRes.headersSent) {
|
|
643
|
-
const isCritical =
|
|
644
|
-
options.critical ||
|
|
645
|
-
name.includes('session') ||
|
|
646
|
-
name.includes('auth') ||
|
|
647
|
-
name.includes('csrf');
|
|
648
|
-
const message = `Cookie '${name}' could not be set - headers already sent`;
|
|
649
|
-
|
|
650
|
-
if (isCritical || options.throwOnLateSet) {
|
|
651
|
-
throw new Error(`${message}. This may cause authentication or security issues.`);
|
|
652
|
-
} else {
|
|
653
|
-
this.logger.warn(message, 'CookieWarning', {
|
|
654
|
-
cookieName: name,
|
|
655
|
-
critical: isCritical,
|
|
656
|
-
stackTrace: new Error().stack,
|
|
657
|
-
});
|
|
658
|
-
}
|
|
659
|
-
return httpRes;
|
|
660
|
-
}
|
|
661
|
-
|
|
662
618
|
const cookieValue = encodeURIComponent(value);
|
|
663
619
|
let cookieString = `${name}=${cookieValue}`;
|
|
664
620
|
|
|
@@ -722,62 +678,6 @@ export class MoroHttpServer {
|
|
|
722
678
|
}
|
|
723
679
|
};
|
|
724
680
|
|
|
725
|
-
// Header management utilities
|
|
726
|
-
httpRes.hasHeader = (name: string): boolean => {
|
|
727
|
-
return httpRes.getHeader(name) !== undefined;
|
|
728
|
-
};
|
|
729
|
-
|
|
730
|
-
// Note: removeHeader is inherited from ServerResponse, we don't override it
|
|
731
|
-
|
|
732
|
-
httpRes.setBulkHeaders = (headers: Record<string, string | number>) => {
|
|
733
|
-
if (httpRes.headersSent) {
|
|
734
|
-
this.logger.warn('Cannot set headers - headers already sent', 'HeaderWarning', {
|
|
735
|
-
attemptedHeaders: Object.keys(headers),
|
|
736
|
-
});
|
|
737
|
-
return httpRes;
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
Object.entries(headers).forEach(([key, value]) => {
|
|
741
|
-
httpRes.setHeader(key, value);
|
|
742
|
-
});
|
|
743
|
-
return httpRes;
|
|
744
|
-
};
|
|
745
|
-
|
|
746
|
-
httpRes.appendHeader = (name: string, value: string | string[]) => {
|
|
747
|
-
if (httpRes.headersSent) {
|
|
748
|
-
this.logger.warn(
|
|
749
|
-
`Cannot append to header '${name}' - headers already sent`,
|
|
750
|
-
'HeaderWarning'
|
|
751
|
-
);
|
|
752
|
-
return httpRes;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
const existing = httpRes.getHeader(name);
|
|
756
|
-
if (existing) {
|
|
757
|
-
const values = Array.isArray(existing) ? existing : [existing.toString()];
|
|
758
|
-
const newValues = Array.isArray(value) ? value : [value];
|
|
759
|
-
httpRes.setHeader(name, [...values, ...newValues]);
|
|
760
|
-
} else {
|
|
761
|
-
httpRes.setHeader(name, value);
|
|
762
|
-
}
|
|
763
|
-
return httpRes;
|
|
764
|
-
};
|
|
765
|
-
|
|
766
|
-
// Response state utilities
|
|
767
|
-
httpRes.canSetHeaders = (): boolean => {
|
|
768
|
-
return !httpRes.headersSent;
|
|
769
|
-
};
|
|
770
|
-
|
|
771
|
-
httpRes.getResponseState = () => {
|
|
772
|
-
return {
|
|
773
|
-
headersSent: httpRes.headersSent,
|
|
774
|
-
statusCode: httpRes.statusCode,
|
|
775
|
-
headers: httpRes.getHeaders ? httpRes.getHeaders() : {},
|
|
776
|
-
finished: httpRes.finished || false,
|
|
777
|
-
writable: httpRes.writable,
|
|
778
|
-
};
|
|
779
|
-
};
|
|
780
|
-
|
|
781
681
|
return httpRes;
|
|
782
682
|
}
|
|
783
683
|
|
|
@@ -1023,9 +923,7 @@ export class MoroHttpServer {
|
|
|
1023
923
|
.then(() => {
|
|
1024
924
|
if (!nextCalled) next();
|
|
1025
925
|
})
|
|
1026
|
-
.catch(
|
|
1027
|
-
reject(error);
|
|
1028
|
-
});
|
|
926
|
+
.catch(reject);
|
|
1029
927
|
}
|
|
1030
928
|
} catch (error) {
|
|
1031
929
|
reject(error);
|
|
@@ -1064,47 +962,6 @@ export class MoroHttpServer {
|
|
|
1064
962
|
getServer(): Server {
|
|
1065
963
|
return this.server;
|
|
1066
964
|
}
|
|
1067
|
-
|
|
1068
|
-
// PERFORMANCE OPTIMIZATION: Generate cache key for common response patterns
|
|
1069
|
-
private getResponseCacheKey(data: any): string | null {
|
|
1070
|
-
// Only cache simple, common responses
|
|
1071
|
-
if (!data || typeof data !== 'object') {
|
|
1072
|
-
// Simple primitives or strings - generate key
|
|
1073
|
-
const key = JSON.stringify(data);
|
|
1074
|
-
return key.length < 100 ? key : null;
|
|
1075
|
-
}
|
|
1076
|
-
|
|
1077
|
-
// Common API response patterns
|
|
1078
|
-
if ('hello' in data && Object.keys(data).length <= 2) {
|
|
1079
|
-
// Hello world type responses
|
|
1080
|
-
return `hello:${JSON.stringify(data)}`;
|
|
1081
|
-
}
|
|
1082
|
-
|
|
1083
|
-
if ('status' in data && Object.keys(data).length <= 3) {
|
|
1084
|
-
// Status responses like {status: "ok", version: "1.0.0"}
|
|
1085
|
-
return `status:${JSON.stringify(data)}`;
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
if ('success' in data && 'message' in data && Object.keys(data).length <= 3) {
|
|
1089
|
-
// Simple success/error responses
|
|
1090
|
-
return `msg:${data.success}:${data.message}`;
|
|
1091
|
-
}
|
|
1092
|
-
|
|
1093
|
-
// Don't cache complex objects
|
|
1094
|
-
return null;
|
|
1095
|
-
}
|
|
1096
|
-
|
|
1097
|
-
// Performance statistics
|
|
1098
|
-
getPerformanceStats() {
|
|
1099
|
-
return {
|
|
1100
|
-
responseCacheHits: this.responseCacheHits,
|
|
1101
|
-
responseCacheMisses: this.responseCacheMisses,
|
|
1102
|
-
responseCacheSize: this.responseCache.size,
|
|
1103
|
-
paramObjectPoolSize: this.paramObjectPool.length,
|
|
1104
|
-
bufferPoolSize: this.bufferPool.length,
|
|
1105
|
-
middlewareExecutionCacheSize: this.middlewareExecutionCache.size,
|
|
1106
|
-
};
|
|
1107
|
-
}
|
|
1108
965
|
}
|
|
1109
966
|
|
|
1110
967
|
// Built-in middleware
|
|
@@ -1141,6 +998,7 @@ export const middleware = {
|
|
|
1141
998
|
},
|
|
1142
999
|
|
|
1143
1000
|
compression: (options: { threshold?: number; level?: number } = {}): Middleware => {
|
|
1001
|
+
const zlib = require('zlib');
|
|
1144
1002
|
const threshold = options.threshold || 1024;
|
|
1145
1003
|
const level = options.level || 6;
|
|
1146
1004
|
|
|
@@ -1160,25 +1018,23 @@ export const middleware = {
|
|
|
1160
1018
|
}
|
|
1161
1019
|
|
|
1162
1020
|
if (acceptEncoding.includes('gzip')) {
|
|
1021
|
+
res.setHeader('Content-Encoding', 'gzip');
|
|
1163
1022
|
zlib.gzip(buffer, { level }, (err: any, compressed: Buffer) => {
|
|
1164
1023
|
if (err) {
|
|
1165
1024
|
return isJson ? originalJson.call(res, data) : originalSend.call(res, data);
|
|
1166
1025
|
}
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
res.setHeader('Content-Length', compressed.length);
|
|
1170
|
-
}
|
|
1026
|
+
res.setHeader('Content-Length', compressed.length);
|
|
1027
|
+
res.writeHead(res.statusCode || 200, res.getHeaders());
|
|
1171
1028
|
res.end(compressed);
|
|
1172
1029
|
});
|
|
1173
1030
|
} else if (acceptEncoding.includes('deflate')) {
|
|
1031
|
+
res.setHeader('Content-Encoding', 'deflate');
|
|
1174
1032
|
zlib.deflate(buffer, { level }, (err: any, compressed: Buffer) => {
|
|
1175
1033
|
if (err) {
|
|
1176
1034
|
return isJson ? originalJson.call(res, data) : originalSend.call(res, data);
|
|
1177
1035
|
}
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
res.setHeader('Content-Length', compressed.length);
|
|
1181
|
-
}
|
|
1036
|
+
res.setHeader('Content-Length', compressed.length);
|
|
1037
|
+
res.writeHead(res.statusCode || 200, res.getHeaders());
|
|
1182
1038
|
res.end(compressed);
|
|
1183
1039
|
});
|
|
1184
1040
|
} else {
|
|
@@ -1606,15 +1462,13 @@ export const middleware = {
|
|
|
1606
1462
|
// Only handle SSE requests
|
|
1607
1463
|
if (req.headers.accept?.includes('text/event-stream')) {
|
|
1608
1464
|
// Set SSE headers
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
});
|
|
1617
|
-
}
|
|
1465
|
+
res.writeHead(200, {
|
|
1466
|
+
'Content-Type': 'text/event-stream',
|
|
1467
|
+
'Cache-Control': 'no-cache',
|
|
1468
|
+
Connection: 'keep-alive',
|
|
1469
|
+
'Access-Control-Allow-Origin': options.cors ? '*' : undefined,
|
|
1470
|
+
'Access-Control-Allow-Headers': options.cors ? 'Cache-Control' : undefined,
|
|
1471
|
+
});
|
|
1618
1472
|
|
|
1619
1473
|
// Add SSE methods to response
|
|
1620
1474
|
(res as any).sendEvent = (data: any, event?: string, id?: string) => {
|
|
@@ -1715,8 +1569,7 @@ export const middleware = {
|
|
|
1715
1569
|
const chunkSize = end - start + 1;
|
|
1716
1570
|
|
|
1717
1571
|
if (start >= fileSize || end >= fileSize) {
|
|
1718
|
-
res.status(416);
|
|
1719
|
-
res.setHeader('Content-Range', `bytes */${fileSize}`);
|
|
1572
|
+
res.status(416).setHeader('Content-Range', `bytes */${fileSize}`);
|
|
1720
1573
|
res.json({ success: false, error: 'Range not satisfiable' });
|
|
1721
1574
|
return;
|
|
1722
1575
|
}
|
|
@@ -1726,7 +1579,7 @@ export const middleware = {
|
|
|
1726
1579
|
res.setHeader('Content-Length', chunkSize);
|
|
1727
1580
|
|
|
1728
1581
|
// Stream the range
|
|
1729
|
-
const stream = createReadStream(filePath, {
|
|
1582
|
+
const stream = require('fs').createReadStream(filePath, {
|
|
1730
1583
|
start,
|
|
1731
1584
|
end,
|
|
1732
1585
|
});
|
|
@@ -1744,12 +1597,12 @@ export const middleware = {
|
|
|
1744
1597
|
res.write(`\r\n--${boundary}\r\n`);
|
|
1745
1598
|
res.write(`Content-Range: bytes ${start}-${end}/${fileSize}\r\n\r\n`);
|
|
1746
1599
|
|
|
1747
|
-
const stream = createReadStream(filePath, {
|
|
1600
|
+
const stream = require('fs').createReadStream(filePath, {
|
|
1748
1601
|
start,
|
|
1749
1602
|
end,
|
|
1750
1603
|
});
|
|
1751
|
-
await new Promise
|
|
1752
|
-
stream.on('end',
|
|
1604
|
+
await new Promise(resolve => {
|
|
1605
|
+
stream.on('end', resolve);
|
|
1753
1606
|
stream.pipe(res, { end: false });
|
|
1754
1607
|
});
|
|
1755
1608
|
}
|
|
@@ -1783,6 +1636,7 @@ export const middleware = {
|
|
|
1783
1636
|
const ignoreMethods = options.ignoreMethods || ['GET', 'HEAD', 'OPTIONS'];
|
|
1784
1637
|
|
|
1785
1638
|
const generateToken = () => {
|
|
1639
|
+
const crypto = require('crypto');
|
|
1786
1640
|
return crypto.randomBytes(tokenLength).toString('hex');
|
|
1787
1641
|
};
|
|
1788
1642
|
|
|
@@ -1871,6 +1725,7 @@ export const middleware = {
|
|
|
1871
1725
|
// Generate nonce if requested
|
|
1872
1726
|
let nonce: string | undefined;
|
|
1873
1727
|
if (options.nonce) {
|
|
1728
|
+
const crypto = require('crypto');
|
|
1874
1729
|
nonce = crypto.randomBytes(16).toString('base64');
|
|
1875
1730
|
(req as any).cspNonce = nonce;
|
|
1876
1731
|
}
|
package/src/core/http/index.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// HTTP System - Centralized Exports
|
|
2
|
-
export { MoroHttpServer, middleware } from './http-server
|
|
3
|
-
export {
|
|
4
|
-
export { Router } from './router.js';
|
|
2
|
+
export { MoroHttpServer, middleware } from './http-server';
|
|
3
|
+
export { Router } from './router';
|
|
5
4
|
|
|
6
5
|
// Type exports
|
|
7
|
-
export type { HttpRequest, HttpResponse, HttpHandler, Middleware } from '../../types/http
|
|
6
|
+
export type { HttpRequest, HttpResponse, HttpHandler, Middleware } from '../../types/http';
|
package/src/core/http/router.ts
CHANGED
|
@@ -5,21 +5,13 @@ import {
|
|
|
5
5
|
HttpHandler,
|
|
6
6
|
Middleware,
|
|
7
7
|
RouteDefinition,
|
|
8
|
-
} from '../../types/http
|
|
9
|
-
import { createFrameworkLogger } from '../logger
|
|
8
|
+
} from '../../types/http';
|
|
9
|
+
import { createFrameworkLogger } from '../logger';
|
|
10
10
|
|
|
11
11
|
export class Router {
|
|
12
12
|
private routes: RouteDefinition[] = [];
|
|
13
13
|
private logger = createFrameworkLogger('Router');
|
|
14
14
|
|
|
15
|
-
// Performance optimizations - O(1) static route lookup
|
|
16
|
-
private staticRoutes = new Map<string, RouteDefinition>(); // "GET:/api/users" -> route
|
|
17
|
-
private dynamicRoutes: RouteDefinition[] = []; // Routes with parameters
|
|
18
|
-
|
|
19
|
-
// Object pooling for parameters to reduce GC pressure
|
|
20
|
-
private paramObjectPool: Record<string, string>[] = [];
|
|
21
|
-
private readonly maxPoolSize = 50;
|
|
22
|
-
|
|
23
15
|
get(path: string, ...handlers: (Middleware | HttpHandler)[]): void {
|
|
24
16
|
this.addRoute('GET', path, handlers);
|
|
25
17
|
}
|
|
@@ -45,37 +37,14 @@ export class Router {
|
|
|
45
37
|
const handler = handlers.pop() as HttpHandler;
|
|
46
38
|
const middleware = handlers as Middleware[];
|
|
47
39
|
|
|
48
|
-
|
|
40
|
+
this.routes.push({
|
|
49
41
|
method,
|
|
50
42
|
path,
|
|
51
43
|
pattern,
|
|
52
44
|
paramNames,
|
|
53
45
|
handler,
|
|
54
46
|
middleware,
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// Add to routes array (maintain compatibility)
|
|
58
|
-
this.routes.push(route);
|
|
59
|
-
|
|
60
|
-
// Performance optimization: separate static and dynamic routes
|
|
61
|
-
const isStatic = !path.includes(':') && !path.includes('*');
|
|
62
|
-
if (isStatic && middleware.length === 0) {
|
|
63
|
-
// Static route with no middleware - use O(1) lookup
|
|
64
|
-
const routeKey = `${method}:${path}`;
|
|
65
|
-
this.staticRoutes.set(routeKey, route);
|
|
66
|
-
this.logger.debug(`Added static route: ${routeKey}`, 'FastRoute');
|
|
67
|
-
} else {
|
|
68
|
-
// Dynamic route or has middleware - needs regex matching
|
|
69
|
-
this.dynamicRoutes.push(route);
|
|
70
|
-
this.logger.debug(`Added dynamic route: ${method} ${path}`, 'DynamicRoute');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Initialize object pool on first route
|
|
74
|
-
if (this.paramObjectPool.length === 0) {
|
|
75
|
-
for (let i = 0; i < this.maxPoolSize; i++) {
|
|
76
|
-
this.paramObjectPool.push({});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
47
|
+
});
|
|
79
48
|
}
|
|
80
49
|
|
|
81
50
|
private pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {
|
|
@@ -108,30 +77,10 @@ export class Router {
|
|
|
108
77
|
'Processing'
|
|
109
78
|
);
|
|
110
79
|
|
|
111
|
-
|
|
112
|
-
const routeKey = `${req.method}:${path}`;
|
|
113
|
-
const staticRoute = this.staticRoutes.get(routeKey);
|
|
114
|
-
|
|
115
|
-
if (staticRoute) {
|
|
116
|
-
this.logger.debug(`Fast route match: ${routeKey}`, 'FastRoute');
|
|
117
|
-
|
|
118
|
-
// Static route with no middleware - execute handler directly
|
|
119
|
-
req.params = {}; // No params for static routes
|
|
120
|
-
const result = await staticRoute.handler(req, res);
|
|
121
|
-
|
|
122
|
-
// If handler returns data and response hasn't been sent, send it
|
|
123
|
-
if (result !== undefined && result !== null && !res.headersSent) {
|
|
124
|
-
res.json(result);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Fallback: Dynamic route matching (with middleware support)
|
|
131
|
-
const route = this.dynamicRoutes.find(r => r.method === req.method && r.pattern.test(path));
|
|
80
|
+
const route = this.routes.find(r => r.method === req.method && r.pattern.test(path));
|
|
132
81
|
|
|
133
82
|
this.logger.debug(
|
|
134
|
-
`Found
|
|
83
|
+
`Found route: ${!!route}${route ? ` ${route.method} ${route.path}` : ' none'}`,
|
|
135
84
|
'RouteMatch'
|
|
136
85
|
);
|
|
137
86
|
|
|
@@ -139,92 +88,54 @@ export class Router {
|
|
|
139
88
|
return false; // Route not found
|
|
140
89
|
}
|
|
141
90
|
|
|
142
|
-
// Extract path parameters
|
|
91
|
+
// Extract path parameters
|
|
143
92
|
const matches = path.match(route.pattern);
|
|
144
93
|
if (matches) {
|
|
145
|
-
req.params =
|
|
94
|
+
req.params = {};
|
|
146
95
|
route.paramNames.forEach((name, index) => {
|
|
147
96
|
req.params[name] = matches[index + 1];
|
|
148
97
|
});
|
|
149
98
|
}
|
|
150
99
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
.catch(reject);
|
|
172
|
-
}
|
|
173
|
-
} catch (error) {
|
|
174
|
-
reject(error);
|
|
100
|
+
// Execute middleware
|
|
101
|
+
for (const mw of route.middleware) {
|
|
102
|
+
await new Promise<void>((resolve, reject) => {
|
|
103
|
+
let nextCalled = false;
|
|
104
|
+
|
|
105
|
+
const next = () => {
|
|
106
|
+
if (nextCalled) return;
|
|
107
|
+
nextCalled = true;
|
|
108
|
+
resolve();
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
const result = mw(req, res, next);
|
|
113
|
+
|
|
114
|
+
if (result instanceof Promise) {
|
|
115
|
+
result
|
|
116
|
+
.then(() => {
|
|
117
|
+
if (!nextCalled) next();
|
|
118
|
+
})
|
|
119
|
+
.catch(reject);
|
|
175
120
|
}
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Execute handler
|
|
182
|
-
const result = await route.handler(req, res);
|
|
183
|
-
|
|
184
|
-
// If handler returns data and response hasn't been sent, send it
|
|
185
|
-
if (result !== undefined && result !== null && !res.headersSent) {
|
|
186
|
-
res.json(result);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return true;
|
|
190
|
-
} finally {
|
|
191
|
-
// Release parameter object back to pool
|
|
192
|
-
if (req.params && matches) {
|
|
193
|
-
this.releaseParamObject(req.params);
|
|
194
|
-
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
reject(error);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
195
125
|
}
|
|
196
|
-
}
|
|
197
126
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
127
|
+
// Execute handler
|
|
128
|
+
const result = await route.handler(req, res);
|
|
201
129
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
if (obj) {
|
|
206
|
-
// Clear the object
|
|
207
|
-
for (const key in obj) {
|
|
208
|
-
delete obj[key];
|
|
209
|
-
}
|
|
210
|
-
return obj;
|
|
130
|
+
// If handler returns data and response hasn't been sent, send it
|
|
131
|
+
if (result !== undefined && result !== null && !res.headersSent) {
|
|
132
|
+
res.json(result);
|
|
211
133
|
}
|
|
212
|
-
return {};
|
|
213
|
-
}
|
|
214
134
|
|
|
215
|
-
|
|
216
|
-
if (this.paramObjectPool.length < this.maxPoolSize) {
|
|
217
|
-
this.paramObjectPool.push(obj);
|
|
218
|
-
}
|
|
135
|
+
return true;
|
|
219
136
|
}
|
|
220
137
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
return {
|
|
224
|
-
totalRoutes: this.routes.length,
|
|
225
|
-
staticRoutes: this.staticRoutes.size,
|
|
226
|
-
dynamicRoutes: this.dynamicRoutes.length,
|
|
227
|
-
paramObjectPoolSize: this.paramObjectPool.length,
|
|
228
|
-
};
|
|
138
|
+
getRoutes(): RouteDefinition[] {
|
|
139
|
+
return [...this.routes];
|
|
229
140
|
}
|
|
230
141
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Advanced Logger Filters
|
|
2
|
-
import { LogEntry, LogFilter } from '../../types/logger
|
|
2
|
+
import { LogEntry, LogFilter } from '../../types/logger';
|
|
3
3
|
|
|
4
4
|
// Level-based filter
|
|
5
5
|
export const levelFilter = (minLevel: string): LogFilter => ({
|
|
@@ -22,24 +22,16 @@ export const contextFilter = (allowedContexts: string[]): LogFilter => ({
|
|
|
22
22
|
// Rate limiting filter
|
|
23
23
|
export const rateLimitFilter = (maxPerSecond: number): LogFilter => {
|
|
24
24
|
const timestamps: number[] = [];
|
|
25
|
-
let lastCleanup = 0;
|
|
26
25
|
|
|
27
26
|
return {
|
|
28
27
|
name: 'rate-limit',
|
|
29
28
|
filter: (entry: LogEntry) => {
|
|
30
29
|
const now = Date.now();
|
|
30
|
+
const oneSecondAgo = now - 1000;
|
|
31
31
|
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
let keepIndex = 0;
|
|
36
|
-
for (let i = 0; i < timestamps.length; i++) {
|
|
37
|
-
if (timestamps[i] >= cutoff) {
|
|
38
|
-
timestamps[keepIndex++] = timestamps[i];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
timestamps.length = keepIndex;
|
|
42
|
-
lastCleanup = now;
|
|
32
|
+
// Remove old timestamps
|
|
33
|
+
while (timestamps.length > 0 && timestamps[0] < oneSecondAgo) {
|
|
34
|
+
timestamps.shift();
|
|
43
35
|
}
|
|
44
36
|
|
|
45
37
|
// Check rate limit
|
package/src/core/logger/index.ts
CHANGED
|
@@ -5,9 +5,8 @@ export {
|
|
|
5
5
|
createFrameworkLogger,
|
|
6
6
|
configureGlobalLogger,
|
|
7
7
|
applyLoggingConfiguration,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export * from './filters.js';
|
|
8
|
+
} from './logger';
|
|
9
|
+
export * from './filters';
|
|
11
10
|
|
|
12
11
|
export type {
|
|
13
12
|
LogLevel,
|
|
@@ -18,4 +17,4 @@ export type {
|
|
|
18
17
|
LogFilter,
|
|
19
18
|
LogMetrics,
|
|
20
19
|
ColorScheme,
|
|
21
|
-
} from '../../types/logger
|
|
20
|
+
} from '../../types/logger';
|