@morojs/moro 1.6.2 → 1.6.3
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/dist/core/http/http-server.js +12 -9
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/uws-http-server.js +1 -1
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/middleware/built-in/auth/core.d.ts +78 -0
- package/dist/core/middleware/built-in/auth/core.js +358 -0
- package/dist/core/middleware/built-in/auth/core.js.map +1 -0
- package/dist/core/middleware/built-in/{auth-helpers.js → auth/helpers.js} +1 -1
- package/dist/core/middleware/built-in/auth/helpers.js.map +1 -0
- package/dist/core/middleware/built-in/auth/hook.d.ts +30 -0
- package/dist/core/middleware/built-in/auth/hook.js +99 -0
- package/dist/core/middleware/built-in/auth/hook.js.map +1 -0
- package/dist/core/middleware/built-in/auth/index.d.ts +7 -0
- package/dist/core/middleware/built-in/auth/index.js +15 -0
- package/dist/core/middleware/built-in/auth/index.js.map +1 -0
- package/dist/core/middleware/built-in/{jwt-helpers.js → auth/jwt-helpers.js} +1 -1
- package/dist/core/middleware/built-in/auth/jwt-helpers.js.map +1 -0
- package/dist/core/middleware/built-in/auth/middleware.d.ts +23 -0
- package/dist/core/middleware/built-in/auth/middleware.js +71 -0
- package/dist/core/middleware/built-in/auth/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/{auth-providers.d.ts → auth/providers.d.ts} +1 -1
- package/dist/core/middleware/built-in/{auth-providers.js → auth/providers.js} +1 -1
- package/dist/core/middleware/built-in/auth/providers.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/file.js +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/file.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/memory.js +1 -1
- package/dist/core/middleware/built-in/cache/adapters/cache/memory.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/redis.js +2 -2
- package/dist/core/middleware/built-in/cache/adapters/cache/redis.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cache/adapters}/index.d.ts +0 -2
- package/{src/core/middleware/built-in/adapters/index.ts → dist/core/middleware/built-in/cache/adapters/index.js} +1 -3
- package/dist/core/middleware/built-in/cache/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/cache/core.d.ts +37 -0
- package/dist/core/middleware/built-in/cache/core.js +87 -0
- package/dist/core/middleware/built-in/cache/core.js.map +1 -0
- package/dist/core/middleware/built-in/cache/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/{cache.js → cache/hook.js} +22 -5
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cache/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cache/index.js +9 -0
- package/dist/core/middleware/built-in/cache/index.js.map +1 -0
- package/dist/core/middleware/built-in/cache/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/cache/middleware.js +44 -0
- package/dist/core/middleware/built-in/cache/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/azure.js +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/azure.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudflare.js +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudflare.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/cloudfront.js +2 -2
- package/dist/core/middleware/built-in/cdn/adapters/cdn/cloudfront.js.map +1 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.d.ts +1 -1
- package/dist/core/middleware/built-in/cdn/adapters/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/adapters/index.d.ts +2 -0
- package/dist/core/middleware/built-in/{adapters → cdn/adapters}/index.js +0 -2
- package/dist/core/middleware/built-in/cdn/adapters/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/core.d.ts +43 -0
- package/dist/core/middleware/built-in/cdn/core.js +144 -0
- package/dist/core/middleware/built-in/cdn/core.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/hook.d.ts +22 -0
- package/dist/core/middleware/built-in/cdn/hook.js +70 -0
- package/dist/core/middleware/built-in/cdn/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/index.d.ts +5 -0
- package/dist/core/middleware/built-in/cdn/index.js +11 -0
- package/dist/core/middleware/built-in/cdn/index.js.map +1 -0
- package/dist/core/middleware/built-in/cdn/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/cdn/middleware.js +52 -0
- package/dist/core/middleware/built-in/cdn/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/core.d.ts +37 -0
- package/dist/core/middleware/built-in/cookie/core.js +83 -0
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/cookie/hook.js +47 -0
- package/dist/core/middleware/built-in/cookie/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cookie/index.js +9 -0
- package/dist/core/middleware/built-in/cookie/index.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/cookie/middleware.js +36 -0
- package/dist/core/middleware/built-in/cookie/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cors/core.d.ts +23 -0
- package/dist/core/middleware/built-in/cors/core.js +51 -0
- package/dist/core/middleware/built-in/cors/core.js.map +1 -0
- package/dist/core/middleware/built-in/cors/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/cors/hook.js +37 -0
- package/dist/core/middleware/built-in/cors/hook.js.map +1 -0
- package/dist/core/middleware/built-in/cors/index.d.ts +3 -0
- package/dist/core/middleware/built-in/cors/index.js +9 -0
- package/dist/core/middleware/built-in/cors/index.js.map +1 -0
- package/dist/core/middleware/built-in/cors/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/cors/middleware.js +22 -0
- package/dist/core/middleware/built-in/cors/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/csp/core.d.ts +45 -0
- package/dist/core/middleware/built-in/csp/core.js +88 -0
- package/dist/core/middleware/built-in/csp/core.js.map +1 -0
- package/dist/core/middleware/built-in/csp/hook.d.ts +22 -0
- package/dist/core/middleware/built-in/csp/hook.js +47 -0
- package/dist/core/middleware/built-in/csp/hook.js.map +1 -0
- package/dist/core/middleware/built-in/csp/index.d.ts +3 -0
- package/dist/core/middleware/built-in/csp/index.js +9 -0
- package/dist/core/middleware/built-in/csp/index.js.map +1 -0
- package/dist/core/middleware/built-in/csp/middleware.d.ts +19 -0
- package/dist/core/middleware/built-in/csp/middleware.js +29 -0
- package/dist/core/middleware/built-in/csp/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/core.d.ts +28 -0
- package/dist/core/middleware/built-in/csrf/core.js +69 -0
- package/dist/core/middleware/built-in/csrf/core.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/csrf/hook.js +45 -0
- package/dist/core/middleware/built-in/csrf/hook.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/index.d.ts +3 -0
- package/dist/core/middleware/built-in/csrf/index.js +9 -0
- package/dist/core/middleware/built-in/csrf/index.js.map +1 -0
- package/dist/core/middleware/built-in/csrf/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/csrf/middleware.js +34 -0
- package/dist/core/middleware/built-in/csrf/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.d.ts +1 -0
- package/dist/core/middleware/built-in/error-tracker/index.js +4 -0
- package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -0
- package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{error-tracker.js → error-tracker/middleware.js} +14 -3
- package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +25 -59
- package/dist/core/middleware/built-in/index.js +31 -31
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/performance-monitor/index.d.ts +1 -0
- package/dist/core/middleware/built-in/performance-monitor/index.js +4 -0
- package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -0
- package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{performance-monitor.js → performance-monitor/middleware.js} +14 -3
- package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/core.d.ts +33 -0
- package/dist/core/middleware/built-in/rate-limit/core.js +86 -0
- package/dist/core/middleware/built-in/rate-limit/core.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/hook.d.ts +20 -0
- package/dist/core/middleware/built-in/{rate-limit.js → rate-limit/hook.js} +22 -16
- package/dist/core/middleware/built-in/rate-limit/hook.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/index.d.ts +3 -0
- package/dist/core/middleware/built-in/rate-limit/index.js +9 -0
- package/dist/core/middleware/built-in/rate-limit/index.js.map +1 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.js +35 -0
- package/dist/core/middleware/built-in/rate-limit/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/index.d.ts +1 -0
- package/dist/core/middleware/built-in/request-logger/index.js +4 -0
- package/dist/core/middleware/built-in/request-logger/index.js.map +1 -0
- package/dist/core/middleware/built-in/request-logger/middleware.d.ts +12 -0
- package/dist/core/middleware/built-in/{request-logger.js → request-logger/middleware.js} +14 -3
- package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/session/core.d.ts +73 -0
- package/dist/core/middleware/built-in/session/core.js +227 -0
- package/dist/core/middleware/built-in/session/core.js.map +1 -0
- package/dist/core/middleware/built-in/session/hook.d.ts +17 -0
- package/dist/core/middleware/built-in/session/hook.js +53 -0
- package/dist/core/middleware/built-in/session/hook.js.map +1 -0
- package/dist/core/middleware/built-in/session/index.d.ts +3 -0
- package/dist/core/middleware/built-in/session/index.js +9 -0
- package/dist/core/middleware/built-in/session/index.js.map +1 -0
- package/dist/core/middleware/built-in/session/middleware.d.ts +17 -0
- package/dist/core/middleware/built-in/session/middleware.js +38 -0
- package/dist/core/middleware/built-in/session/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/sse/core.d.ts +44 -0
- package/dist/core/middleware/built-in/sse/core.js +117 -0
- package/dist/core/middleware/built-in/sse/core.js.map +1 -0
- package/dist/core/middleware/built-in/sse/hook.d.ts +18 -0
- package/dist/core/middleware/built-in/sse/hook.js +60 -0
- package/dist/core/middleware/built-in/sse/hook.js.map +1 -0
- package/dist/core/middleware/built-in/sse/index.d.ts +3 -0
- package/dist/core/middleware/built-in/sse/index.js +9 -0
- package/dist/core/middleware/built-in/sse/index.js.map +1 -0
- package/dist/core/middleware/built-in/sse/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/sse/middleware.js +43 -0
- package/dist/core/middleware/built-in/sse/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/validation/core.d.ts +23 -0
- package/dist/core/middleware/built-in/validation/core.js +93 -0
- package/dist/core/middleware/built-in/validation/core.js.map +1 -0
- package/dist/core/middleware/built-in/validation/hook.d.ts +13 -0
- package/dist/core/middleware/built-in/{validation.js → validation/hook.js} +14 -3
- package/dist/core/middleware/built-in/validation/hook.js.map +1 -0
- package/dist/core/middleware/built-in/validation/index.d.ts +3 -0
- package/dist/core/middleware/built-in/validation/index.js +9 -0
- package/dist/core/middleware/built-in/validation/index.js.map +1 -0
- package/dist/core/middleware/built-in/validation/middleware.d.ts +16 -0
- package/dist/core/middleware/built-in/validation/middleware.js +27 -0
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -0
- package/dist/core/middleware/index.js +6 -0
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +4 -20
- package/dist/core/routing/unified-router.js +61 -106
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/moro.js +12 -18
- package/dist/moro.js.map +1 -1
- package/dist/types/hooks.d.ts +3 -0
- package/package.json +2 -6
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.js.map +0 -1
- package/dist/core/middleware/built-in/adapters/index.js.map +0 -1
- package/dist/core/middleware/built-in/auth-helpers.js.map +0 -1
- package/dist/core/middleware/built-in/auth-providers.js.map +0 -1
- package/dist/core/middleware/built-in/auth.d.ts +0 -30
- package/dist/core/middleware/built-in/auth.js +0 -348
- package/dist/core/middleware/built-in/auth.js.map +0 -1
- package/dist/core/middleware/built-in/cache.d.ts +0 -3
- package/dist/core/middleware/built-in/cache.js.map +0 -1
- package/dist/core/middleware/built-in/cdn.d.ts +0 -3
- package/dist/core/middleware/built-in/cdn.js +0 -109
- package/dist/core/middleware/built-in/cdn.js.map +0 -1
- package/dist/core/middleware/built-in/cookie.d.ts +0 -14
- package/dist/core/middleware/built-in/cookie.js +0 -64
- package/dist/core/middleware/built-in/cookie.js.map +0 -1
- package/dist/core/middleware/built-in/cors.d.ts +0 -2
- package/dist/core/middleware/built-in/cors.js +0 -25
- package/dist/core/middleware/built-in/cors.js.map +0 -1
- package/dist/core/middleware/built-in/csp.d.ts +0 -22
- package/dist/core/middleware/built-in/csp.js +0 -68
- package/dist/core/middleware/built-in/csp.js.map +0 -1
- package/dist/core/middleware/built-in/csrf.d.ts +0 -9
- package/dist/core/middleware/built-in/csrf.js +0 -60
- package/dist/core/middleware/built-in/csrf.js.map +0 -1
- package/dist/core/middleware/built-in/error-tracker.d.ts +0 -1
- package/dist/core/middleware/built-in/error-tracker.js.map +0 -1
- package/dist/core/middleware/built-in/jwt-helpers.js.map +0 -1
- package/dist/core/middleware/built-in/performance-monitor.d.ts +0 -1
- package/dist/core/middleware/built-in/performance-monitor.js.map +0 -1
- package/dist/core/middleware/built-in/rate-limit.d.ts +0 -6
- package/dist/core/middleware/built-in/rate-limit.js.map +0 -1
- package/dist/core/middleware/built-in/request-logger.d.ts +0 -1
- package/dist/core/middleware/built-in/request-logger.js.map +0 -1
- package/dist/core/middleware/built-in/session.d.ts +0 -41
- package/dist/core/middleware/built-in/session.js +0 -205
- package/dist/core/middleware/built-in/session.js.map +0 -1
- package/dist/core/middleware/built-in/sse.d.ts +0 -6
- package/dist/core/middleware/built-in/sse.js +0 -69
- package/dist/core/middleware/built-in/sse.js.map +0 -1
- package/dist/core/middleware/built-in/validation.d.ts +0 -2
- package/dist/core/middleware/built-in/validation.js.map +0 -1
- package/jest.config.mjs +0 -41
- package/src/core/auth/README.md +0 -339
- package/src/core/auth/morojs-adapter.ts +0 -415
- package/src/core/config/config-manager.ts +0 -133
- package/src/core/config/config-sources.ts +0 -600
- package/src/core/config/config-validator.ts +0 -1116
- package/src/core/config/file-loader.ts +0 -150
- package/src/core/config/index.ts +0 -109
- package/src/core/config/schema.ts +0 -164
- package/src/core/config/utils.ts +0 -244
- package/src/core/database/README.md +0 -238
- package/src/core/database/adapters/drizzle.ts +0 -415
- package/src/core/database/adapters/index.ts +0 -42
- package/src/core/database/adapters/mongodb.ts +0 -317
- package/src/core/database/adapters/mysql.ts +0 -235
- package/src/core/database/adapters/postgresql.ts +0 -226
- package/src/core/database/adapters/redis.ts +0 -379
- package/src/core/database/adapters/sqlite.ts +0 -263
- package/src/core/database/index.ts +0 -3
- package/src/core/docs/index.ts +0 -231
- package/src/core/docs/openapi-generator.ts +0 -576
- package/src/core/docs/schema-to-openapi.ts +0 -145
- package/src/core/docs/simple-docs.ts +0 -295
- package/src/core/docs/swagger-ui.ts +0 -354
- package/src/core/docs/zod-to-openapi.ts +0 -532
- package/src/core/events/event-bus.ts +0 -231
- package/src/core/events/index.ts +0 -12
- package/src/core/framework.ts +0 -885
- package/src/core/http/http-server.ts +0 -1847
- package/src/core/http/index.ts +0 -7
- package/src/core/http/uws-http-server.ts +0 -591
- package/src/core/logger/filters.ts +0 -153
- package/src/core/logger/index.ts +0 -21
- package/src/core/logger/logger.ts +0 -1033
- package/src/core/logger/outputs.ts +0 -132
- package/src/core/middleware/built-in/adapters/cache/file.ts +0 -104
- package/src/core/middleware/built-in/adapters/cache/index.ts +0 -23
- package/src/core/middleware/built-in/adapters/cache/memory.ts +0 -73
- package/src/core/middleware/built-in/adapters/cache/redis.ts +0 -114
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +0 -60
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +0 -83
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +0 -94
- package/src/core/middleware/built-in/adapters/cdn/index.ts +0 -23
- package/src/core/middleware/built-in/auth-helpers.ts +0 -401
- package/src/core/middleware/built-in/auth-providers.ts +0 -480
- package/src/core/middleware/built-in/auth.ts +0 -410
- package/src/core/middleware/built-in/cache.ts +0 -213
- package/src/core/middleware/built-in/cdn.ts +0 -124
- package/src/core/middleware/built-in/cookie.ts +0 -85
- package/src/core/middleware/built-in/cors.ts +0 -38
- package/src/core/middleware/built-in/csp.ts +0 -101
- package/src/core/middleware/built-in/csrf.ts +0 -82
- package/src/core/middleware/built-in/error-tracker.ts +0 -16
- package/src/core/middleware/built-in/index.ts +0 -87
- package/src/core/middleware/built-in/jwt-helpers.ts +0 -243
- package/src/core/middleware/built-in/performance-monitor.ts +0 -25
- package/src/core/middleware/built-in/rate-limit.ts +0 -60
- package/src/core/middleware/built-in/request-logger.ts +0 -16
- package/src/core/middleware/built-in/session.ts +0 -287
- package/src/core/middleware/built-in/sse.ts +0 -88
- package/src/core/middleware/built-in/validation.ts +0 -33
- package/src/core/middleware/index.ts +0 -177
- package/src/core/modules/auto-discovery.ts +0 -726
- package/src/core/modules/index.ts +0 -3
- package/src/core/modules/modules.ts +0 -135
- package/src/core/networking/adapters/index.ts +0 -17
- package/src/core/networking/adapters/socketio-adapter.ts +0 -254
- package/src/core/networking/adapters/uws-adapter.ts +0 -619
- package/src/core/networking/adapters/ws-adapter.ts +0 -429
- package/src/core/networking/index.ts +0 -4
- package/src/core/networking/service-discovery.ts +0 -303
- package/src/core/networking/websocket-adapter.ts +0 -217
- package/src/core/networking/websocket-manager.ts +0 -308
- package/src/core/pooling/object-pool-manager.ts +0 -630
- package/src/core/routing/app-integration.ts +0 -164
- package/src/core/routing/index.ts +0 -261
- package/src/core/routing/path-matcher.ts +0 -222
- package/src/core/routing/router.ts +0 -97
- package/src/core/routing/unified-router.ts +0 -870
- package/src/core/runtime/aws-lambda-adapter.ts +0 -147
- package/src/core/runtime/base-adapter.ts +0 -130
- package/src/core/runtime/cloudflare-workers-adapter.ts +0 -152
- package/src/core/runtime/index.ts +0 -62
- package/src/core/runtime/node-adapter.ts +0 -202
- package/src/core/runtime/vercel-edge-adapter.ts +0 -114
- package/src/core/utilities/circuit-breaker.ts +0 -46
- package/src/core/utilities/container.ts +0 -736
- package/src/core/utilities/hooks.ts +0 -142
- package/src/core/utilities/index.ts +0 -17
- package/src/core/utilities/package-utils.ts +0 -59
- package/src/core/validation/adapters.ts +0 -147
- package/src/core/validation/index.ts +0 -258
- package/src/core/validation/schema-interface.ts +0 -100
- package/src/index.ts +0 -233
- package/src/moro.ts +0 -1728
- package/src/types/auth.ts +0 -440
- package/src/types/cache.ts +0 -38
- package/src/types/cdn.ts +0 -22
- package/src/types/config.ts +0 -229
- package/src/types/core.ts +0 -58
- package/src/types/database.ts +0 -32
- package/src/types/discovery.ts +0 -7
- package/src/types/events.ts +0 -82
- package/src/types/hooks.ts +0 -47
- package/src/types/http.ts +0 -89
- package/src/types/logger.ts +0 -102
- package/src/types/module.ts +0 -99
- package/src/types/runtime.ts +0 -76
- package/src/types/session.ts +0 -89
- package/tsconfig.json +0 -23
- /package/dist/core/middleware/built-in/{auth-helpers.d.ts → auth/helpers.d.ts} +0 -0
- /package/dist/core/middleware/built-in/{jwt-helpers.d.ts → auth/jwt-helpers.d.ts} +0 -0
- /package/dist/core/middleware/built-in/{adapters → cache/adapters}/cache/index.js +0 -0
- /package/dist/core/middleware/built-in/{adapters → cdn/adapters}/cdn/index.js +0 -0
|
@@ -1,1033 +0,0 @@
|
|
|
1
|
-
// Moro Logger - Beautiful, Fast, Feature-Rich
|
|
2
|
-
import { performance } from 'perf_hooks';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
LogLevel,
|
|
6
|
-
LogEntry,
|
|
7
|
-
LoggerOptions,
|
|
8
|
-
Logger,
|
|
9
|
-
LogOutput,
|
|
10
|
-
LogFilter,
|
|
11
|
-
LogMetrics,
|
|
12
|
-
ColorScheme,
|
|
13
|
-
} from '../../types/logger.js';
|
|
14
|
-
|
|
15
|
-
export class MoroLogger implements Logger {
|
|
16
|
-
private level: LogLevel = 'info';
|
|
17
|
-
private options: LoggerOptions;
|
|
18
|
-
private outputs: Map<string, LogOutput> = new Map();
|
|
19
|
-
private filters: Map<string, LogFilter> = new Map();
|
|
20
|
-
private history: LogEntry[] = [];
|
|
21
|
-
private timers: Map<string, number> = new Map();
|
|
22
|
-
private metrics: LogMetrics = {
|
|
23
|
-
totalLogs: 0,
|
|
24
|
-
logsByLevel: { debug: 0, info: 0, warn: 0, error: 0, fatal: 0 },
|
|
25
|
-
logsByContext: {},
|
|
26
|
-
averageLogRate: 0,
|
|
27
|
-
errorRate: 0,
|
|
28
|
-
memoryUsage: 0,
|
|
29
|
-
};
|
|
30
|
-
private startTime = Date.now();
|
|
31
|
-
private contextPrefix?: string;
|
|
32
|
-
private contextMetadata?: Record<string, any>;
|
|
33
|
-
private parent?: MoroLogger; // Reference to parent logger for level inheritance
|
|
34
|
-
|
|
35
|
-
// Performance optimizations
|
|
36
|
-
private historyIndex = 0;
|
|
37
|
-
private historySize = 0;
|
|
38
|
-
private lastMemoryCheck = 0;
|
|
39
|
-
private memoryCheckInterval = 5000; // 5 seconds
|
|
40
|
-
private cachedTimestamp = '';
|
|
41
|
-
private lastTimestamp = 0;
|
|
42
|
-
private timestampCacheInterval = 100; // 100ms for better precision
|
|
43
|
-
|
|
44
|
-
// Object pooling for LogEntry objects (Pino's technique)
|
|
45
|
-
private static readonly ENTRY_POOL: LogEntry[] = [];
|
|
46
|
-
private static readonly MAX_POOL_SIZE = 100;
|
|
47
|
-
private static poolIndex = 0;
|
|
48
|
-
|
|
49
|
-
// String builder for efficient concatenation
|
|
50
|
-
private static stringBuilder: string[] = [];
|
|
51
|
-
private static stringBuilderIndex = 0;
|
|
52
|
-
|
|
53
|
-
// Buffered output for performance
|
|
54
|
-
private outputBuffer: string[] = [];
|
|
55
|
-
private bufferSize = 0;
|
|
56
|
-
private maxBufferSize = 1000;
|
|
57
|
-
private flushTimeout: NodeJS.Timeout | null = null;
|
|
58
|
-
private flushInterval = 1; // 1ms micro-batching
|
|
59
|
-
|
|
60
|
-
// Buffer overflow protection
|
|
61
|
-
private bufferOverflowThreshold: number;
|
|
62
|
-
private emergencyFlushInProgress = false;
|
|
63
|
-
private isDestroyed = false;
|
|
64
|
-
|
|
65
|
-
// High-performance output methods
|
|
66
|
-
|
|
67
|
-
private static readonly LEVELS: Record<LogLevel, number> = {
|
|
68
|
-
debug: 0,
|
|
69
|
-
info: 1,
|
|
70
|
-
warn: 2,
|
|
71
|
-
error: 3,
|
|
72
|
-
fatal: 4,
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
private static readonly COLORS: ColorScheme = {
|
|
76
|
-
debug: '\x1b[36m', // Cyan
|
|
77
|
-
info: '\x1b[32m', // Green
|
|
78
|
-
warn: '\x1b[33m', // Yellow
|
|
79
|
-
error: '\x1b[31m', // Red
|
|
80
|
-
fatal: '\x1b[35m', // Magenta
|
|
81
|
-
timestamp: '\x1b[90m', // Gray
|
|
82
|
-
context: '\x1b[34m', // Blue
|
|
83
|
-
metadata: '\x1b[37m', // White
|
|
84
|
-
performance: '\x1b[36m', // Cyan
|
|
85
|
-
reset: '\x1b[0m', // Reset
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
private static readonly RESET = '\x1b[0m';
|
|
89
|
-
private static readonly BOLD = '\x1b[1m';
|
|
90
|
-
|
|
91
|
-
// Static pre-allocated strings for performance
|
|
92
|
-
private static readonly LEVEL_STRINGS: Record<LogLevel, string> = {
|
|
93
|
-
debug: 'DEBUG',
|
|
94
|
-
info: 'INFO ',
|
|
95
|
-
warn: 'WARN ',
|
|
96
|
-
error: 'ERROR',
|
|
97
|
-
fatal: 'FATAL',
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
constructor(options: LoggerOptions = {}) {
|
|
101
|
-
this.options = this.validateOptions({
|
|
102
|
-
level: 'info',
|
|
103
|
-
enableColors: true,
|
|
104
|
-
enableTimestamp: true,
|
|
105
|
-
enableContext: true,
|
|
106
|
-
enableMetadata: true,
|
|
107
|
-
enablePerformance: true,
|
|
108
|
-
format: 'pretty',
|
|
109
|
-
outputs: [],
|
|
110
|
-
filters: [],
|
|
111
|
-
maxEntries: 1000,
|
|
112
|
-
maxBufferSize: 1000,
|
|
113
|
-
...options,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
this.level = this.options.level || 'info';
|
|
117
|
-
|
|
118
|
-
// Initialize buffer size from options
|
|
119
|
-
this.maxBufferSize = this.options.maxBufferSize || 1000;
|
|
120
|
-
|
|
121
|
-
// Initialize buffer overflow protection
|
|
122
|
-
this.bufferOverflowThreshold = this.maxBufferSize * 2;
|
|
123
|
-
|
|
124
|
-
// Add default console output
|
|
125
|
-
this.addOutput({
|
|
126
|
-
name: 'console',
|
|
127
|
-
write: this.writeToConsole.bind(this),
|
|
128
|
-
format: this.options.format,
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
// Add custom outputs
|
|
132
|
-
this.options.outputs?.forEach(output => this.addOutput(output));
|
|
133
|
-
this.options.filters?.forEach(filter => this.addFilter(filter));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Object pooling methods
|
|
137
|
-
private static getPooledEntry(): LogEntry {
|
|
138
|
-
if (MoroLogger.ENTRY_POOL.length > 0) {
|
|
139
|
-
const entry = MoroLogger.ENTRY_POOL.pop()!;
|
|
140
|
-
// Properly reset ALL properties to prevent memory leaks
|
|
141
|
-
entry.timestamp = new Date();
|
|
142
|
-
entry.level = 'info';
|
|
143
|
-
entry.message = '';
|
|
144
|
-
entry.context = undefined;
|
|
145
|
-
entry.metadata = undefined;
|
|
146
|
-
entry.performance = undefined;
|
|
147
|
-
entry.moduleId = undefined;
|
|
148
|
-
return entry;
|
|
149
|
-
}
|
|
150
|
-
return MoroLogger.createFreshEntry();
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// ADD this new method:
|
|
154
|
-
private static createFreshEntry(): LogEntry {
|
|
155
|
-
return {
|
|
156
|
-
timestamp: new Date(),
|
|
157
|
-
level: 'info',
|
|
158
|
-
message: '',
|
|
159
|
-
context: undefined,
|
|
160
|
-
metadata: undefined,
|
|
161
|
-
performance: undefined,
|
|
162
|
-
moduleId: undefined,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private static returnPooledEntry(entry: LogEntry): void {
|
|
167
|
-
if (MoroLogger.ENTRY_POOL.length < MoroLogger.MAX_POOL_SIZE) {
|
|
168
|
-
MoroLogger.ENTRY_POOL.push(entry);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// String builder methods
|
|
173
|
-
private static resetStringBuilder(): void {
|
|
174
|
-
MoroLogger.stringBuilder.length = 0;
|
|
175
|
-
MoroLogger.stringBuilderIndex = 0;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
private static appendToBuilder(str: string): void {
|
|
179
|
-
MoroLogger.stringBuilder[MoroLogger.stringBuilderIndex++] = str;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
private static buildString(): string {
|
|
183
|
-
const result = MoroLogger.stringBuilder.join('');
|
|
184
|
-
MoroLogger.resetStringBuilder();
|
|
185
|
-
return result;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
debug(message: string, context?: string, metadata?: Record<string, any>): void {
|
|
189
|
-
this.log('debug', message, context, metadata);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
info(message: string, context?: string, metadata?: Record<string, any>): void {
|
|
193
|
-
this.log('info', message, context, metadata);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
warn(message: string, context?: string, metadata?: Record<string, any>): void {
|
|
197
|
-
this.log('warn', message, context, metadata);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
error(message: string | Error, context?: string, metadata?: Record<string, any>): void {
|
|
201
|
-
const msg = message instanceof Error ? message.message : message;
|
|
202
|
-
const stack = message instanceof Error ? message.stack : undefined;
|
|
203
|
-
this.log('error', msg, context, { ...metadata, stack });
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
fatal(message: string | Error, context?: string, metadata?: Record<string, any>): void {
|
|
207
|
-
const msg = message instanceof Error ? message.message : message;
|
|
208
|
-
const stack = message instanceof Error ? message.stack : undefined;
|
|
209
|
-
this.log('fatal', msg, context, { ...metadata, stack });
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
time(label: string): void {
|
|
213
|
-
this.timers.set(label, performance.now());
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
timeEnd(label: string, context?: string, metadata?: Record<string, any>): void {
|
|
217
|
-
const startTime = this.timers.get(label);
|
|
218
|
-
if (startTime !== undefined) {
|
|
219
|
-
const duration = performance.now() - startTime;
|
|
220
|
-
this.timers.delete(label);
|
|
221
|
-
|
|
222
|
-
this.log('info', `Timer: ${label}`, context, {
|
|
223
|
-
...metadata,
|
|
224
|
-
performance: { duration: Math.round(duration * 100) / 100 },
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
child(context: string, metadata?: Record<string, any>): Logger {
|
|
230
|
-
// Create child logger with current parent level (not original options level)
|
|
231
|
-
const childOptions = { ...this.options, level: this.level };
|
|
232
|
-
const childLogger = new MoroLogger(childOptions);
|
|
233
|
-
childLogger.contextPrefix = this.contextPrefix ? `${this.contextPrefix}:${context}` : context;
|
|
234
|
-
childLogger.contextMetadata = { ...this.contextMetadata, ...metadata };
|
|
235
|
-
childLogger.outputs = this.outputs;
|
|
236
|
-
childLogger.filters = this.filters;
|
|
237
|
-
|
|
238
|
-
// Keep reference to parent for level inheritance
|
|
239
|
-
(childLogger as any).parent = this;
|
|
240
|
-
|
|
241
|
-
return childLogger;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
setLevel(level: LogLevel): void {
|
|
245
|
-
this.level = level;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
getLevel(): LogLevel {
|
|
249
|
-
return this.level;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
addOutput(output: LogOutput): void {
|
|
253
|
-
this.outputs.set(output.name, output);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
removeOutput(name: string): void {
|
|
257
|
-
this.outputs.delete(name);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
addFilter(filter: LogFilter): void {
|
|
261
|
-
this.filters.set(filter.name, filter);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
removeFilter(name: string): void {
|
|
265
|
-
this.filters.delete(name);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
getHistory(count?: number): LogEntry[] {
|
|
269
|
-
if (this.historySize === 0) return [];
|
|
270
|
-
|
|
271
|
-
if (this.historySize < (this.options.maxEntries || 1000)) {
|
|
272
|
-
// History not full yet, return all entries
|
|
273
|
-
const entries = this.history.slice(0, this.historySize);
|
|
274
|
-
return count ? entries.slice(-count) : entries;
|
|
275
|
-
} else {
|
|
276
|
-
// History is full, use circular buffer logic
|
|
277
|
-
const entries: LogEntry[] = [];
|
|
278
|
-
const maxEntries = this.options.maxEntries || 1000;
|
|
279
|
-
|
|
280
|
-
for (let i = 0; i < maxEntries; i++) {
|
|
281
|
-
const index = (this.historyIndex + i) % maxEntries;
|
|
282
|
-
if (this.history[index]) {
|
|
283
|
-
entries.push(this.history[index]);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
return count ? entries.slice(-count) : entries;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Cached timestamp formatting to avoid repeated string operations
|
|
292
|
-
private getCachedTimestamp(timestamp: Date): string {
|
|
293
|
-
const now = timestamp.getTime();
|
|
294
|
-
if (now - this.lastTimestamp > this.timestampCacheInterval) {
|
|
295
|
-
this.lastTimestamp = now;
|
|
296
|
-
this.cachedTimestamp = timestamp.toISOString().replace('T', ' ').slice(0, 19);
|
|
297
|
-
}
|
|
298
|
-
return this.cachedTimestamp;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Cached timestamp generation (updates once per second)
|
|
302
|
-
private getFastCachedTimestamp(): string {
|
|
303
|
-
const now = Date.now();
|
|
304
|
-
if (now - this.lastTimestamp > 1000) {
|
|
305
|
-
// Update every second
|
|
306
|
-
this.lastTimestamp = now;
|
|
307
|
-
this.cachedTimestamp = new Date(now).toISOString().slice(0, 19).replace('T', ' ');
|
|
308
|
-
}
|
|
309
|
-
return this.cachedTimestamp;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
getMetrics(): LogMetrics {
|
|
313
|
-
const now = Date.now();
|
|
314
|
-
const uptime = (now - this.startTime) / 1000; // seconds
|
|
315
|
-
const avgRate = uptime > 0 ? this.metrics.totalLogs / uptime : 0;
|
|
316
|
-
const errorCount = this.metrics.logsByLevel.error + this.metrics.logsByLevel.fatal;
|
|
317
|
-
const errorRate = this.metrics.totalLogs > 0 ? (errorCount / this.metrics.totalLogs) * 100 : 0;
|
|
318
|
-
|
|
319
|
-
return {
|
|
320
|
-
...this.metrics,
|
|
321
|
-
averageLogRate: Math.round(avgRate * 100) / 100,
|
|
322
|
-
errorRate: Math.round(errorRate * 100) / 100,
|
|
323
|
-
memoryUsage: process.memoryUsage().heapUsed / 1024 / 1024, // MB
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
clear(): void {
|
|
328
|
-
this.history = [];
|
|
329
|
-
this.metrics = {
|
|
330
|
-
totalLogs: 0,
|
|
331
|
-
logsByLevel: { debug: 0, info: 0, warn: 0, error: 0, fatal: 0 },
|
|
332
|
-
logsByContext: {},
|
|
333
|
-
averageLogRate: 0,
|
|
334
|
-
errorRate: 0,
|
|
335
|
-
memoryUsage: 0,
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Optimized logging method
|
|
340
|
-
private log(
|
|
341
|
-
level: LogLevel,
|
|
342
|
-
message: string,
|
|
343
|
-
context?: string,
|
|
344
|
-
metadata?: Record<string, any>
|
|
345
|
-
): void {
|
|
346
|
-
// Prevent logging after destroy() is called (important for test cleanup)
|
|
347
|
-
if (this.isDestroyed) {
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Quick level check - use parent level if available (for child loggers)
|
|
352
|
-
const effectiveLevel = this.parent ? this.parent.level : this.level;
|
|
353
|
-
if (MoroLogger.LEVELS[level] < MoroLogger.LEVELS[effectiveLevel as LogLevel]) {
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Absolute minimal path for simple logs - pure speed
|
|
358
|
-
if (!metadata && !context && !this.contextPrefix && !this.contextMetadata) {
|
|
359
|
-
this.writeSimpleLog(level, message);
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Minimal path for logs with context but no metadata
|
|
364
|
-
if (!metadata && !this.contextMetadata) {
|
|
365
|
-
this.writeSimpleLog(level, message, context);
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// Path for complex logs
|
|
370
|
-
if (metadata && Object.keys(metadata).length > 0) {
|
|
371
|
-
this.complexLog(level, message, context, metadata);
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Full logging path for complex logs
|
|
376
|
-
this.fullLog(level, message, context, metadata);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
// Full logging with all features
|
|
380
|
-
private fullLog(
|
|
381
|
-
level: LogLevel,
|
|
382
|
-
message: string,
|
|
383
|
-
context?: string,
|
|
384
|
-
metadata?: Record<string, any>
|
|
385
|
-
): void {
|
|
386
|
-
// Use object pooling for LogEntry (Pino's technique)
|
|
387
|
-
const entry = MoroLogger.getPooledEntry();
|
|
388
|
-
const now = Date.now();
|
|
389
|
-
|
|
390
|
-
entry.timestamp = new Date(now);
|
|
391
|
-
entry.level = level;
|
|
392
|
-
entry.message = message;
|
|
393
|
-
entry.context = this.contextPrefix
|
|
394
|
-
? context
|
|
395
|
-
? `${this.contextPrefix}:${context}`
|
|
396
|
-
: this.contextPrefix
|
|
397
|
-
: context;
|
|
398
|
-
entry.metadata = this.createMetadata(metadata);
|
|
399
|
-
entry.performance = this.options.enablePerformance ? this.getPerformanceData(now) : undefined;
|
|
400
|
-
|
|
401
|
-
// Apply filters with early return optimization
|
|
402
|
-
if (this.filters.size > 0) {
|
|
403
|
-
for (const filter of this.filters.values()) {
|
|
404
|
-
if (!filter.filter(entry)) {
|
|
405
|
-
MoroLogger.returnPooledEntry(entry);
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// Update metrics
|
|
412
|
-
this.updateMetrics(entry);
|
|
413
|
-
|
|
414
|
-
// Store in history with circular buffer optimization
|
|
415
|
-
this.addToHistory(entry);
|
|
416
|
-
|
|
417
|
-
// Write to outputs with batched processing
|
|
418
|
-
this.writeToOutputs(entry, level);
|
|
419
|
-
|
|
420
|
-
// Return entry to pool
|
|
421
|
-
MoroLogger.returnPooledEntry(entry);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Absolute minimal logging - pure speed, no overhead
|
|
425
|
-
private complexLog(
|
|
426
|
-
level: LogLevel,
|
|
427
|
-
message: string,
|
|
428
|
-
context?: string,
|
|
429
|
-
metadata?: Record<string, any>
|
|
430
|
-
): void {
|
|
431
|
-
// Use object pooling for LogEntry (Pino's technique)
|
|
432
|
-
const entry = MoroLogger.getPooledEntry();
|
|
433
|
-
const now = Date.now();
|
|
434
|
-
|
|
435
|
-
entry.timestamp = new Date(now);
|
|
436
|
-
entry.level = level;
|
|
437
|
-
entry.message = message;
|
|
438
|
-
entry.context = this.contextPrefix
|
|
439
|
-
? context
|
|
440
|
-
? `${this.contextPrefix}:${context}`
|
|
441
|
-
: this.contextPrefix
|
|
442
|
-
: context;
|
|
443
|
-
entry.metadata = this.createMetadata(metadata);
|
|
444
|
-
entry.performance = this.options.enablePerformance ? this.getPerformanceData(now) : undefined;
|
|
445
|
-
|
|
446
|
-
// Write to outputs with batched processing
|
|
447
|
-
this.writeToOutputs(entry, level);
|
|
448
|
-
|
|
449
|
-
// Return entry to pool
|
|
450
|
-
MoroLogger.returnPooledEntry(entry);
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// Simple log writer with colors for minimal overhead cases
|
|
454
|
-
private writeSimpleLog(level: LogLevel, message: string, context?: string): void {
|
|
455
|
-
const colors = this.options.enableColors !== false;
|
|
456
|
-
const levelReset = colors ? MoroLogger.RESET : '';
|
|
457
|
-
|
|
458
|
-
MoroLogger.resetStringBuilder();
|
|
459
|
-
|
|
460
|
-
// Timestamp with caching optimization
|
|
461
|
-
if (this.options.enableTimestamp !== false) {
|
|
462
|
-
const timestamp = this.getFastCachedTimestamp();
|
|
463
|
-
if (colors) {
|
|
464
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS.timestamp);
|
|
465
|
-
MoroLogger.appendToBuilder(timestamp);
|
|
466
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
467
|
-
} else {
|
|
468
|
-
MoroLogger.appendToBuilder(timestamp);
|
|
469
|
-
}
|
|
470
|
-
MoroLogger.appendToBuilder(' ');
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
// Level with pre-allocated strings
|
|
474
|
-
const levelStr = MoroLogger.LEVEL_STRINGS[level];
|
|
475
|
-
if (colors) {
|
|
476
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS[level]);
|
|
477
|
-
MoroLogger.appendToBuilder(MoroLogger.BOLD);
|
|
478
|
-
MoroLogger.appendToBuilder(levelStr);
|
|
479
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
480
|
-
} else {
|
|
481
|
-
MoroLogger.appendToBuilder(levelStr);
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
// Context
|
|
485
|
-
if (context && this.options.enableContext !== false) {
|
|
486
|
-
MoroLogger.appendToBuilder(' ');
|
|
487
|
-
if (colors) {
|
|
488
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS.context);
|
|
489
|
-
MoroLogger.appendToBuilder(`[${context}]`);
|
|
490
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
491
|
-
} else {
|
|
492
|
-
MoroLogger.appendToBuilder(`[${context}]`);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// Message
|
|
497
|
-
MoroLogger.appendToBuilder(' ');
|
|
498
|
-
MoroLogger.appendToBuilder(message);
|
|
499
|
-
|
|
500
|
-
// Output main log line with high-performance method
|
|
501
|
-
const finalMessage = MoroLogger.buildString();
|
|
502
|
-
this.output(`${finalMessage}\n`, level);
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
private updateMetrics(entry: LogEntry): void {
|
|
506
|
-
this.metrics.totalLogs++;
|
|
507
|
-
this.metrics.logsByLevel[entry.level]++;
|
|
508
|
-
|
|
509
|
-
if (entry.context) {
|
|
510
|
-
this.metrics.logsByContext[entry.context] =
|
|
511
|
-
(this.metrics.logsByContext[entry.context] || 0) + 1;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
// Optimized metadata creation to avoid unnecessary object spreading
|
|
516
|
-
private createMetadata(metadata?: Record<string, any>): Record<string, any> {
|
|
517
|
-
if (!metadata && !this.contextMetadata) {
|
|
518
|
-
return {};
|
|
519
|
-
}
|
|
520
|
-
if (!metadata) {
|
|
521
|
-
return { ...this.contextMetadata };
|
|
522
|
-
}
|
|
523
|
-
if (!this.contextMetadata) {
|
|
524
|
-
return { ...metadata };
|
|
525
|
-
}
|
|
526
|
-
return { ...this.contextMetadata, ...metadata };
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
// Optimized performance data with caching
|
|
530
|
-
private getPerformanceData(now: number): { memory: number } | undefined {
|
|
531
|
-
if (now - this.lastMemoryCheck > this.memoryCheckInterval) {
|
|
532
|
-
this.lastMemoryCheck = now;
|
|
533
|
-
this.metrics.memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;
|
|
534
|
-
}
|
|
535
|
-
return { memory: this.metrics.memoryUsage };
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
// Circular buffer implementation for history (O(1) instead of O(n))
|
|
539
|
-
private addToHistory(entry: LogEntry): void {
|
|
540
|
-
const maxEntries = this.options.maxEntries || 1000;
|
|
541
|
-
|
|
542
|
-
if (this.historySize < maxEntries) {
|
|
543
|
-
this.history[this.historySize] = entry;
|
|
544
|
-
this.historySize++;
|
|
545
|
-
} else {
|
|
546
|
-
// Circular buffer: overwrite oldest entry
|
|
547
|
-
this.history[this.historyIndex] = entry;
|
|
548
|
-
this.historyIndex = (this.historyIndex + 1) % maxEntries;
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
// Optimized output writing with batching
|
|
553
|
-
private writeToOutputs(entry: LogEntry, level: LogLevel): void {
|
|
554
|
-
if (this.outputs.size === 0) return;
|
|
555
|
-
|
|
556
|
-
let successCount = 0;
|
|
557
|
-
const errors: Array<{ outputName: string; error: any }> = [];
|
|
558
|
-
|
|
559
|
-
for (const output of this.outputs.values()) {
|
|
560
|
-
if (!output.level || MoroLogger.LEVELS[level] >= MoroLogger.LEVELS[output.level]) {
|
|
561
|
-
try {
|
|
562
|
-
output.write(entry);
|
|
563
|
-
successCount++;
|
|
564
|
-
} catch (error) {
|
|
565
|
-
errors.push({ outputName: output.name, error });
|
|
566
|
-
this.handleOutputError(output.name, error);
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
// If all outputs fail, use emergency console
|
|
572
|
-
if (successCount === 0 && this.outputs.size > 0) {
|
|
573
|
-
this.emergencyConsoleWrite(entry);
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
// Log output errors (but avoid infinite loops)
|
|
577
|
-
if (errors.length > 0 && level !== 'error') {
|
|
578
|
-
this.error(`Logger output errors: ${errors.length} failed`, 'MoroLogger', {
|
|
579
|
-
errors: errors.map(e => e.outputName),
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
private writeToConsole(entry: LogEntry): void {
|
|
585
|
-
const format = this.options.format || 'pretty';
|
|
586
|
-
|
|
587
|
-
if (format === 'json') {
|
|
588
|
-
this.output(`${this.safeStringify(entry)}\n`, entry.level);
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
if (format === 'compact') {
|
|
593
|
-
const level = entry.level.toUpperCase().padEnd(5);
|
|
594
|
-
const context = entry.context ? `[${entry.context}] ` : '';
|
|
595
|
-
this.output(`${level} ${context}${entry.message}\n`, entry.level);
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
// Pretty format (default)
|
|
600
|
-
this.writePrettyLog(entry);
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
private writePrettyLog(entry: LogEntry): void {
|
|
604
|
-
const colors = this.options.enableColors !== false;
|
|
605
|
-
const levelReset = colors ? MoroLogger.RESET : '';
|
|
606
|
-
|
|
607
|
-
MoroLogger.resetStringBuilder();
|
|
608
|
-
|
|
609
|
-
// Timestamp with caching optimization
|
|
610
|
-
if (this.options.enableTimestamp !== false) {
|
|
611
|
-
const timestamp = this.getCachedTimestamp(entry.timestamp);
|
|
612
|
-
if (colors) {
|
|
613
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS.timestamp);
|
|
614
|
-
MoroLogger.appendToBuilder(timestamp);
|
|
615
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
616
|
-
} else {
|
|
617
|
-
MoroLogger.appendToBuilder(timestamp);
|
|
618
|
-
}
|
|
619
|
-
MoroLogger.appendToBuilder(' ');
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
// Level with pre-allocated strings
|
|
623
|
-
const levelStr = MoroLogger.LEVEL_STRINGS[entry.level];
|
|
624
|
-
if (colors) {
|
|
625
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS[entry.level]);
|
|
626
|
-
MoroLogger.appendToBuilder(MoroLogger.BOLD);
|
|
627
|
-
MoroLogger.appendToBuilder(levelStr);
|
|
628
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
629
|
-
} else {
|
|
630
|
-
MoroLogger.appendToBuilder(levelStr);
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
// Context
|
|
634
|
-
if (entry.context && this.options.enableContext !== false) {
|
|
635
|
-
MoroLogger.appendToBuilder(' ');
|
|
636
|
-
if (colors) {
|
|
637
|
-
MoroLogger.appendToBuilder(MoroLogger.COLORS.context);
|
|
638
|
-
MoroLogger.appendToBuilder(`[${entry.context}]`);
|
|
639
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
640
|
-
} else {
|
|
641
|
-
MoroLogger.appendToBuilder(`[${entry.context}]`);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
// Message
|
|
646
|
-
MoroLogger.appendToBuilder(' ');
|
|
647
|
-
MoroLogger.appendToBuilder(entry.message);
|
|
648
|
-
|
|
649
|
-
// Performance info
|
|
650
|
-
if (entry.performance && this.options.enablePerformance !== false) {
|
|
651
|
-
const perfColor = colors ? MoroLogger.COLORS.performance : '';
|
|
652
|
-
const perfParts: string[] = [];
|
|
653
|
-
|
|
654
|
-
if (entry.performance.duration !== undefined) {
|
|
655
|
-
perfParts.push(`${entry.performance.duration}ms`);
|
|
656
|
-
}
|
|
657
|
-
if (entry.performance.memory !== undefined) {
|
|
658
|
-
perfParts.push(`${Math.round(entry.performance.memory)}MB`);
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
if (perfParts.length > 0) {
|
|
662
|
-
MoroLogger.appendToBuilder(' ');
|
|
663
|
-
if (colors) {
|
|
664
|
-
MoroLogger.appendToBuilder(perfColor);
|
|
665
|
-
MoroLogger.appendToBuilder(`(${perfParts.join(', ')})`);
|
|
666
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
667
|
-
} else {
|
|
668
|
-
MoroLogger.appendToBuilder(`(${perfParts.join(', ')})`);
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
// Metadata with optimized JSON stringify
|
|
674
|
-
if (
|
|
675
|
-
entry.metadata &&
|
|
676
|
-
Object.keys(entry.metadata).length > 0 &&
|
|
677
|
-
this.options.enableMetadata !== false
|
|
678
|
-
) {
|
|
679
|
-
const metaColor = colors ? MoroLogger.COLORS.metadata : '';
|
|
680
|
-
const cleanMetadata = this.cleanMetadata(entry.metadata);
|
|
681
|
-
|
|
682
|
-
if (Object.keys(cleanMetadata).length > 0) {
|
|
683
|
-
MoroLogger.appendToBuilder(' ');
|
|
684
|
-
if (colors) {
|
|
685
|
-
MoroLogger.appendToBuilder(metaColor);
|
|
686
|
-
MoroLogger.appendToBuilder(this.safeStringify(cleanMetadata));
|
|
687
|
-
MoroLogger.appendToBuilder(levelReset);
|
|
688
|
-
} else {
|
|
689
|
-
MoroLogger.appendToBuilder(this.safeStringify(cleanMetadata));
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
// Output main log line with high-performance method
|
|
695
|
-
const finalMessage = MoroLogger.buildString();
|
|
696
|
-
this.output(`${finalMessage}\n`, entry.level);
|
|
697
|
-
|
|
698
|
-
// Stack trace for errors
|
|
699
|
-
if (entry.metadata?.stack && (entry.level === 'error' || entry.level === 'fatal')) {
|
|
700
|
-
const stackColor = colors ? MoroLogger.COLORS.error : '';
|
|
701
|
-
this.output(`${stackColor}${entry.metadata.stack}${levelReset}\n`, entry.level);
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
// Optimized metadata cleaning to avoid unnecessary object operations
|
|
706
|
-
private cleanMetadata(metadata: Record<string, any>): Record<string, any> {
|
|
707
|
-
const clean: Record<string, any> = {};
|
|
708
|
-
for (const [key, value] of Object.entries(metadata)) {
|
|
709
|
-
if (key !== 'stack') {
|
|
710
|
-
clean[key] = value;
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
return clean;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// High-performance output with buffering
|
|
717
|
-
private output(message: string, level: LogLevel = 'info'): void {
|
|
718
|
-
// Prevent memory exhaustion
|
|
719
|
-
if (
|
|
720
|
-
this.outputBuffer.length >= this.bufferOverflowThreshold &&
|
|
721
|
-
!this.emergencyFlushInProgress
|
|
722
|
-
) {
|
|
723
|
-
this.emergencyFlushInProgress = true;
|
|
724
|
-
this.forceFlushBuffer();
|
|
725
|
-
this.emergencyFlushInProgress = false;
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
this.outputBuffer.push(message);
|
|
729
|
-
this.bufferSize++;
|
|
730
|
-
|
|
731
|
-
// Immediate flush for critical levels or full buffer
|
|
732
|
-
if (level === 'fatal' || level === 'error' || this.bufferSize >= this.maxBufferSize) {
|
|
733
|
-
this.flushBuffer();
|
|
734
|
-
} else {
|
|
735
|
-
this.scheduleFlush();
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
private scheduleFlush(): void {
|
|
740
|
-
if (this.flushTimeout || this.isDestroyed) {
|
|
741
|
-
return; // Already scheduled or destroyed
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
this.flushTimeout = setTimeout(() => {
|
|
745
|
-
this.flushBuffer();
|
|
746
|
-
}, this.flushInterval);
|
|
747
|
-
|
|
748
|
-
// Unref the timeout so it doesn't prevent process exit (important for tests)
|
|
749
|
-
this.flushTimeout.unref();
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
public flushBuffer(): void {
|
|
753
|
-
if (this.outputBuffer.length === 0) {
|
|
754
|
-
return;
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
// Group messages by stream type
|
|
758
|
-
const stdoutMessages: string[] = [];
|
|
759
|
-
const stderrMessages: string[] = [];
|
|
760
|
-
|
|
761
|
-
for (const message of this.outputBuffer) {
|
|
762
|
-
// Determine stream based on message content or level
|
|
763
|
-
if (message.includes('ERROR') || message.includes('FATAL')) {
|
|
764
|
-
stderrMessages.push(message);
|
|
765
|
-
} else {
|
|
766
|
-
stdoutMessages.push(message);
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
// Write to appropriate streams with error handling
|
|
771
|
-
try {
|
|
772
|
-
if (stdoutMessages.length > 0 && process.stdout.writable) {
|
|
773
|
-
process.stdout.write(stdoutMessages.join(''));
|
|
774
|
-
}
|
|
775
|
-
if (stderrMessages.length > 0 && process.stderr.writable) {
|
|
776
|
-
process.stderr.write(stderrMessages.join(''));
|
|
777
|
-
}
|
|
778
|
-
} catch {
|
|
779
|
-
// Fallback to console if streams fail
|
|
780
|
-
try {
|
|
781
|
-
// eslint-disable-next-line no-console
|
|
782
|
-
console.log(this.outputBuffer.join(''));
|
|
783
|
-
} catch {
|
|
784
|
-
// If even console.log fails, just ignore
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
// Clear buffer
|
|
789
|
-
this.outputBuffer.length = 0;
|
|
790
|
-
this.bufferSize = 0;
|
|
791
|
-
|
|
792
|
-
// Clear timeout
|
|
793
|
-
if (this.flushTimeout) {
|
|
794
|
-
clearTimeout(this.flushTimeout);
|
|
795
|
-
this.flushTimeout = null;
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
// Emergency flush for buffer overflow protection
|
|
800
|
-
private forceFlushBuffer(): void {
|
|
801
|
-
if (this.outputBuffer.length === 0) return;
|
|
802
|
-
|
|
803
|
-
try {
|
|
804
|
-
const message = this.outputBuffer.join('');
|
|
805
|
-
process.stdout.write(message);
|
|
806
|
-
} catch (error) {
|
|
807
|
-
// Emergency fallback - write individual messages
|
|
808
|
-
for (const msg of this.outputBuffer) {
|
|
809
|
-
try {
|
|
810
|
-
process.stdout.write(msg);
|
|
811
|
-
} catch {
|
|
812
|
-
// If even this fails, give up on this batch
|
|
813
|
-
break;
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
} finally {
|
|
817
|
-
this.outputBuffer.length = 0;
|
|
818
|
-
this.bufferSize = 0;
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
|
|
822
|
-
// Safe stringify with circular reference detection
|
|
823
|
-
private safeStringify(obj: any, maxDepth = 3): string {
|
|
824
|
-
const seen = new WeakSet();
|
|
825
|
-
|
|
826
|
-
const stringify = (value: any, depth: number): any => {
|
|
827
|
-
if (depth > maxDepth) return '[Max Depth Reached]';
|
|
828
|
-
if (value === null || typeof value !== 'object') return value;
|
|
829
|
-
if (seen.has(value)) return '[Circular Reference]';
|
|
830
|
-
|
|
831
|
-
seen.add(value);
|
|
832
|
-
|
|
833
|
-
if (Array.isArray(value)) {
|
|
834
|
-
return value.map(item => stringify(item, depth + 1));
|
|
835
|
-
}
|
|
836
|
-
|
|
837
|
-
const result: any = {};
|
|
838
|
-
for (const [key, val] of Object.entries(value)) {
|
|
839
|
-
if (typeof val !== 'function') {
|
|
840
|
-
// Skip functions
|
|
841
|
-
result[key] = stringify(val, depth + 1);
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
return result;
|
|
845
|
-
};
|
|
846
|
-
|
|
847
|
-
try {
|
|
848
|
-
return JSON.stringify(stringify(obj, 0));
|
|
849
|
-
} catch (error) {
|
|
850
|
-
return '[Stringify Error]';
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
// Configuration validation
|
|
855
|
-
private validateOptions(options: LoggerOptions): LoggerOptions {
|
|
856
|
-
const validated = { ...options };
|
|
857
|
-
|
|
858
|
-
// Validate log level
|
|
859
|
-
const validLevels = ['debug', 'info', 'warn', 'error', 'fatal'];
|
|
860
|
-
if (validated.level && !validLevels.includes(validated.level)) {
|
|
861
|
-
console.warn(`[MoroLogger] Invalid log level: ${validated.level}, defaulting to 'info'`);
|
|
862
|
-
validated.level = 'info';
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
// Validate max entries
|
|
866
|
-
if (validated.maxEntries !== undefined) {
|
|
867
|
-
if (validated.maxEntries < 1 || validated.maxEntries > 100000) {
|
|
868
|
-
console.warn(
|
|
869
|
-
`[MoroLogger] Invalid maxEntries: ${validated.maxEntries}, defaulting to 1000`
|
|
870
|
-
);
|
|
871
|
-
validated.maxEntries = 1000;
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
// Validate buffer size
|
|
876
|
-
if (validated.maxBufferSize !== undefined) {
|
|
877
|
-
if (validated.maxBufferSize < 10 || validated.maxBufferSize > 10000) {
|
|
878
|
-
console.warn(
|
|
879
|
-
`[MoroLogger] Invalid maxBufferSize: ${validated.maxBufferSize}, defaulting to 1000`
|
|
880
|
-
);
|
|
881
|
-
validated.maxBufferSize = 1000;
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
return validated;
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
// Error handling methods
|
|
889
|
-
private handleOutputError(outputName: string, error: any): void {
|
|
890
|
-
// Could implement output retry logic, circuit breaker, etc.
|
|
891
|
-
// For now, just track the error
|
|
892
|
-
if (!this.metrics.outputErrors) {
|
|
893
|
-
this.metrics.outputErrors = {};
|
|
894
|
-
}
|
|
895
|
-
this.metrics.outputErrors[outputName] = (this.metrics.outputErrors[outputName] || 0) + 1;
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
private emergencyConsoleWrite(entry: LogEntry): void {
|
|
899
|
-
const message = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()} ${entry.message}`;
|
|
900
|
-
try {
|
|
901
|
-
if (entry.level === 'error' || entry.level === 'fatal') {
|
|
902
|
-
process.stderr.write(`[EMERGENCY] ${message}\n`);
|
|
903
|
-
} else {
|
|
904
|
-
process.stdout.write(`[EMERGENCY] ${message}\n`);
|
|
905
|
-
}
|
|
906
|
-
} catch {
|
|
907
|
-
// If even emergency write fails, there's nothing more we can do
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
// Force flush streams (useful for shutdown)
|
|
912
|
-
public flush(): void {
|
|
913
|
-
// Clear any pending flush timeout
|
|
914
|
-
if (this.flushTimeout) {
|
|
915
|
-
clearTimeout(this.flushTimeout);
|
|
916
|
-
this.flushTimeout = null;
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
// Flush any remaining buffer
|
|
920
|
-
this.flushBuffer();
|
|
921
|
-
|
|
922
|
-
try {
|
|
923
|
-
// Force flush streams without ending them
|
|
924
|
-
if (process.stdout.writable) {
|
|
925
|
-
process.stdout.write(''); // Force flush without ending
|
|
926
|
-
}
|
|
927
|
-
if (process.stderr.writable) {
|
|
928
|
-
process.stderr.write(''); // Force flush without ending
|
|
929
|
-
}
|
|
930
|
-
} catch {
|
|
931
|
-
// Ignore flush errors
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
// Destroy logger and clean up all resources (for testing)
|
|
936
|
-
public destroy(): void {
|
|
937
|
-
// Mark as destroyed to prevent new timeouts
|
|
938
|
-
this.isDestroyed = true;
|
|
939
|
-
|
|
940
|
-
// Clear any remaining timeouts
|
|
941
|
-
if (this.flushTimeout) {
|
|
942
|
-
clearTimeout(this.flushTimeout);
|
|
943
|
-
this.flushTimeout = null;
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
// Flush any remaining buffer
|
|
947
|
-
this.flushBuffer();
|
|
948
|
-
|
|
949
|
-
// Clear outputs and filters
|
|
950
|
-
this.outputs.clear();
|
|
951
|
-
this.filters.clear();
|
|
952
|
-
|
|
953
|
-
// Clear history
|
|
954
|
-
this.history.length = 0;
|
|
955
|
-
this.historyIndex = 0;
|
|
956
|
-
this.historySize = 0;
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
// Global logger instance
|
|
961
|
-
const initialLogLevel =
|
|
962
|
-
process.env.LOG_LEVEL ||
|
|
963
|
-
process.env.MORO_LOG_LEVEL ||
|
|
964
|
-
(process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
|
|
965
|
-
|
|
966
|
-
export const logger = new MoroLogger({
|
|
967
|
-
level: initialLogLevel as LogLevel,
|
|
968
|
-
enableColors: !process.env.NO_COLOR,
|
|
969
|
-
format: (process.env.LOG_FORMAT as any) || 'pretty',
|
|
970
|
-
});
|
|
971
|
-
|
|
972
|
-
/**
|
|
973
|
-
* Configure the global logger with new settings
|
|
974
|
-
* This allows runtime configuration of the logger
|
|
975
|
-
*/
|
|
976
|
-
export function configureGlobalLogger(options: Partial<LoggerOptions>): void {
|
|
977
|
-
if (options.level) {
|
|
978
|
-
logger.setLevel(options.level);
|
|
979
|
-
}
|
|
980
|
-
// Additional configuration options can be added here as needed
|
|
981
|
-
// For now, focusing on level which is the most critical
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
/**
|
|
985
|
-
* Destroy the global logger and clean up resources (for testing)
|
|
986
|
-
* @internal
|
|
987
|
-
*/
|
|
988
|
-
export function destroyGlobalLogger(): void {
|
|
989
|
-
logger.destroy();
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
/**
|
|
993
|
-
* Apply logging configuration from the config system and/or createApp options
|
|
994
|
-
*/
|
|
995
|
-
export function applyLoggingConfiguration(
|
|
996
|
-
configLogging?: any,
|
|
997
|
-
appOptions?: Partial<LoggerOptions> | boolean
|
|
998
|
-
): void {
|
|
999
|
-
// First apply config system settings (from environment variables)
|
|
1000
|
-
if (configLogging?.level) {
|
|
1001
|
-
configureGlobalLogger({ level: configLogging.level });
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
// Then apply createApp options (these take precedence)
|
|
1005
|
-
if (appOptions !== undefined) {
|
|
1006
|
-
if (appOptions === false) {
|
|
1007
|
-
// Disable logging by setting to fatal level
|
|
1008
|
-
configureGlobalLogger({ level: 'fatal' });
|
|
1009
|
-
} else if (typeof appOptions === 'object') {
|
|
1010
|
-
configureGlobalLogger(appOptions);
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
// Framework-specific logger
|
|
1016
|
-
export const createFrameworkLogger = (context: string) => {
|
|
1017
|
-
return logger.child('Moro', { framework: 'moro', context });
|
|
1018
|
-
};
|
|
1019
|
-
|
|
1020
|
-
// Graceful shutdown handler to flush any pending logs
|
|
1021
|
-
process.on('SIGINT', () => {
|
|
1022
|
-
logger.flush();
|
|
1023
|
-
process.exit(0);
|
|
1024
|
-
});
|
|
1025
|
-
|
|
1026
|
-
process.on('SIGTERM', () => {
|
|
1027
|
-
logger.flush();
|
|
1028
|
-
process.exit(0);
|
|
1029
|
-
});
|
|
1030
|
-
|
|
1031
|
-
process.on('beforeExit', () => {
|
|
1032
|
-
logger.flush();
|
|
1033
|
-
});
|