@scpxl/nodejs-framework 1.0.13
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 +195 -0
- package/dist/api-requester/api-requester.d.ts +11 -0
- package/dist/api-requester/api-requester.d.ts.map +1 -0
- package/dist/api-requester/api-requester.js +59 -0
- package/dist/api-requester/api-requester.js.map +7 -0
- package/dist/api-requester/index.d.ts +2 -0
- package/dist/api-requester/index.d.ts.map +1 -0
- package/dist/api-requester/index.js +5 -0
- package/dist/api-requester/index.js.map +7 -0
- package/dist/application/base-application.d.ts +110 -0
- package/dist/application/base-application.d.ts.map +1 -0
- package/dist/application/base-application.interface.d.ts +161 -0
- package/dist/application/base-application.interface.d.ts.map +1 -0
- package/dist/application/base-application.interface.js +1 -0
- package/dist/application/base-application.interface.js.map +7 -0
- package/dist/application/base-application.js +350 -0
- package/dist/application/base-application.js.map +7 -0
- package/dist/application/command-application.d.ts +18 -0
- package/dist/application/command-application.d.ts.map +1 -0
- package/dist/application/command-application.interface.d.ts +26 -0
- package/dist/application/command-application.interface.d.ts.map +1 -0
- package/dist/application/command-application.interface.js +1 -0
- package/dist/application/command-application.interface.js.map +7 -0
- package/dist/application/command-application.js +110 -0
- package/dist/application/command-application.js.map +7 -0
- package/dist/application/index.d.ts +5 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +7 -0
- package/dist/application/index.js.map +7 -0
- package/dist/application/web-application.d.ts +43 -0
- package/dist/application/web-application.d.ts.map +1 -0
- package/dist/application/web-application.interface.d.ts +21 -0
- package/dist/application/web-application.interface.d.ts.map +1 -0
- package/dist/application/web-application.interface.js +1 -0
- package/dist/application/web-application.interface.js.map +7 -0
- package/dist/application/web-application.js +176 -0
- package/dist/application/web-application.js.map +7 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +7 -0
- package/dist/auth/jwt.d.ts +25 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +51 -0
- package/dist/auth/jwt.js.map +7 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +7 -0
- package/dist/cache/manager.d.ts +26 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +54 -0
- package/dist/cache/manager.js.map +7 -0
- package/dist/cluster/cluster-manager.d.ts +15 -0
- package/dist/cluster/cluster-manager.d.ts.map +1 -0
- package/dist/cluster/cluster-manager.interface.d.ts +23 -0
- package/dist/cluster/cluster-manager.interface.d.ts.map +1 -0
- package/dist/cluster/cluster-manager.interface.js +1 -0
- package/dist/cluster/cluster-manager.interface.js.map +7 -0
- package/dist/cluster/cluster-manager.js +106 -0
- package/dist/cluster/cluster-manager.js.map +7 -0
- package/dist/cluster/index.d.ts +2 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +13 -0
- package/dist/cluster/index.js.map +7 -0
- package/dist/command/command-manager.d.ts +19 -0
- package/dist/command/command-manager.d.ts.map +1 -0
- package/dist/command/command-manager.js +42 -0
- package/dist/command/command-manager.js.map +7 -0
- package/dist/command/command.d.ts +27 -0
- package/dist/command/command.d.ts.map +1 -0
- package/dist/command/command.interface.d.ts +11 -0
- package/dist/command/command.interface.d.ts.map +1 -0
- package/dist/command/command.interface.js +1 -0
- package/dist/command/command.interface.js.map +7 -0
- package/dist/command/command.js +37 -0
- package/dist/command/command.js.map +7 -0
- package/dist/command/index.d.ts +3 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +7 -0
- package/dist/command/index.js.map +7 -0
- package/dist/database/dynamic-entity-form-decorators.d.ts +31 -0
- package/dist/database/dynamic-entity-form-decorators.d.ts.map +1 -0
- package/dist/database/dynamic-entity-form-decorators.js +62 -0
- package/dist/database/dynamic-entity-form-decorators.js.map +7 -0
- package/dist/database/dynamic-entity.d.ts +15 -0
- package/dist/database/dynamic-entity.d.ts.map +1 -0
- package/dist/database/dynamic-entity.js +42 -0
- package/dist/database/dynamic-entity.js.map +7 -0
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +12 -0
- package/dist/database/index.js.map +7 -0
- package/dist/database/instance.d.ts +36 -0
- package/dist/database/instance.d.ts.map +1 -0
- package/dist/database/instance.interface.d.ts +5 -0
- package/dist/database/instance.interface.d.ts.map +1 -0
- package/dist/database/instance.interface.js +1 -0
- package/dist/database/instance.interface.js.map +7 -0
- package/dist/database/instance.js +57 -0
- package/dist/database/instance.js.map +7 -0
- package/dist/database/manager.d.ts +27 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.interface.d.ts +18 -0
- package/dist/database/manager.interface.d.ts.map +1 -0
- package/dist/database/manager.interface.js +1 -0
- package/dist/database/manager.interface.js.map +7 -0
- package/dist/database/manager.js +49 -0
- package/dist/database/manager.js.map +7 -0
- package/dist/event/controller/base.d.ts +23 -0
- package/dist/event/controller/base.d.ts.map +1 -0
- package/dist/event/controller/base.interface.d.ts +11 -0
- package/dist/event/controller/base.interface.d.ts.map +1 -0
- package/dist/event/controller/base.interface.js +1 -0
- package/dist/event/controller/base.interface.js.map +7 -0
- package/dist/event/controller/base.js +51 -0
- package/dist/event/controller/base.js.map +7 -0
- package/dist/event/index.d.ts +5 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +9 -0
- package/dist/event/index.js.map +7 -0
- package/dist/event/manager.d.ts +21 -0
- package/dist/event/manager.d.ts.map +1 -0
- package/dist/event/manager.interface.d.ts +134 -0
- package/dist/event/manager.interface.d.ts.map +1 -0
- package/dist/event/manager.interface.js +1 -0
- package/dist/event/manager.interface.js.map +7 -0
- package/dist/event/manager.js +134 -0
- package/dist/event/manager.js.map +7 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +7 -0
- package/dist/logger/index.d.ts +2 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +5 -0
- package/dist/logger/index.js.map +7 -0
- package/dist/logger/logger.d.ts +51 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.interface.d.ts +2 -0
- package/dist/logger/logger.interface.d.ts.map +1 -0
- package/dist/logger/logger.interface.js +1 -0
- package/dist/logger/logger.interface.js.map +7 -0
- package/dist/logger/logger.js +168 -0
- package/dist/logger/logger.js.map +7 -0
- package/dist/performance/cache-performance.d.ts +58 -0
- package/dist/performance/cache-performance.d.ts.map +1 -0
- package/dist/performance/cache-performance.js +199 -0
- package/dist/performance/cache-performance.js.map +7 -0
- package/dist/performance/database-performance.d.ts +40 -0
- package/dist/performance/database-performance.d.ts.map +1 -0
- package/dist/performance/database-performance.js +132 -0
- package/dist/performance/database-performance.js.map +7 -0
- package/dist/performance/index.d.ts +7 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +7 -0
- package/dist/performance/index.js.map +7 -0
- package/dist/performance/performance-monitor.d.ts +68 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +270 -0
- package/dist/performance/performance-monitor.js.map +7 -0
- package/dist/performance/queue-performance.d.ts +46 -0
- package/dist/performance/queue-performance.d.ts.map +1 -0
- package/dist/performance/queue-performance.js +144 -0
- package/dist/performance/queue-performance.js.map +7 -0
- package/dist/performance/webserver-performance.d.ts +69 -0
- package/dist/performance/webserver-performance.d.ts.map +1 -0
- package/dist/performance/webserver-performance.js +164 -0
- package/dist/performance/webserver-performance.js.map +7 -0
- package/dist/performance/websocket-performance.d.ts +44 -0
- package/dist/performance/websocket-performance.d.ts.map +1 -0
- package/dist/performance/websocket-performance.js +139 -0
- package/dist/performance/websocket-performance.js.map +7 -0
- package/dist/queue/index.d.ts +6 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.interface.d.ts +10 -0
- package/dist/queue/index.interface.d.ts.map +1 -0
- package/dist/queue/index.interface.js +1 -0
- package/dist/queue/index.interface.js.map +7 -0
- package/dist/queue/index.js +7 -0
- package/dist/queue/index.js.map +7 -0
- package/dist/queue/job.interface.d.ts +42 -0
- package/dist/queue/job.interface.d.ts.map +1 -0
- package/dist/queue/job.interface.js +1 -0
- package/dist/queue/job.interface.js.map +7 -0
- package/dist/queue/manager.d.ts +36 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.interface.d.ts +18 -0
- package/dist/queue/manager.interface.d.ts.map +1 -0
- package/dist/queue/manager.interface.js +1 -0
- package/dist/queue/manager.interface.js.map +7 -0
- package/dist/queue/manager.js +244 -0
- package/dist/queue/manager.js.map +7 -0
- package/dist/queue/processor/base.d.ts +28 -0
- package/dist/queue/processor/base.d.ts.map +1 -0
- package/dist/queue/processor/base.js +46 -0
- package/dist/queue/processor/base.js.map +7 -0
- package/dist/queue/processor/processor.interface.d.ts +15 -0
- package/dist/queue/processor/processor.interface.d.ts.map +1 -0
- package/dist/queue/processor/processor.interface.js +1 -0
- package/dist/queue/processor/processor.interface.js.map +7 -0
- package/dist/queue/worker.d.ts +14 -0
- package/dist/queue/worker.d.ts.map +1 -0
- package/dist/queue/worker.interface.d.ts +13 -0
- package/dist/queue/worker.interface.d.ts.map +1 -0
- package/dist/queue/worker.interface.js +1 -0
- package/dist/queue/worker.interface.js.map +7 -0
- package/dist/queue/worker.js +72 -0
- package/dist/queue/worker.js.map +7 -0
- package/dist/redis/index.d.ts +3 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +7 -0
- package/dist/redis/index.js.map +7 -0
- package/dist/redis/instance.d.ts +32 -0
- package/dist/redis/instance.d.ts.map +1 -0
- package/dist/redis/instance.interface.d.ts +9 -0
- package/dist/redis/instance.interface.d.ts.map +1 -0
- package/dist/redis/instance.interface.js +1 -0
- package/dist/redis/instance.interface.js.map +7 -0
- package/dist/redis/instance.js +92 -0
- package/dist/redis/instance.js.map +7 -0
- package/dist/redis/manager.d.ts +15 -0
- package/dist/redis/manager.d.ts.map +1 -0
- package/dist/redis/manager.interface.d.ts +8 -0
- package/dist/redis/manager.interface.d.ts.map +1 -0
- package/dist/redis/manager.interface.js +1 -0
- package/dist/redis/manager.interface.js.map +7 -0
- package/dist/redis/manager.js +65 -0
- package/dist/redis/manager.js.map +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.d.ts.map +1 -0
- package/dist/services/aws/index.js +5 -0
- package/dist/services/aws/index.js.map +7 -0
- package/dist/services/aws/s3.d.ts +54 -0
- package/dist/services/aws/s3.d.ts.map +1 -0
- package/dist/services/aws/s3.interface.d.ts +14 -0
- package/dist/services/aws/s3.interface.d.ts.map +1 -0
- package/dist/services/aws/s3.interface.js +1 -0
- package/dist/services/aws/s3.interface.js.map +7 -0
- package/dist/services/aws/s3.js +236 -0
- package/dist/services/aws/s3.js.map +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +7 -0
- package/dist/util/file.d.ts +45 -0
- package/dist/util/file.d.ts.map +1 -0
- package/dist/util/file.js +105 -0
- package/dist/util/file.js.map +7 -0
- package/dist/util/helper.d.ts +37 -0
- package/dist/util/helper.d.ts.map +1 -0
- package/dist/util/helper.js +73 -0
- package/dist/util/helper.js.map +7 -0
- package/dist/util/image.d.ts +12 -0
- package/dist/util/image.d.ts.map +1 -0
- package/dist/util/image.js +35 -0
- package/dist/util/image.js.map +7 -0
- package/dist/util/index.d.ts +10 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +21 -0
- package/dist/util/index.js.map +7 -0
- package/dist/util/loader.d.ts +19 -0
- package/dist/util/loader.d.ts.map +1 -0
- package/dist/util/loader.js +84 -0
- package/dist/util/loader.js.map +7 -0
- package/dist/util/num.d.ts +13 -0
- package/dist/util/num.d.ts.map +1 -0
- package/dist/util/num.js +16 -0
- package/dist/util/num.js.map +7 -0
- package/dist/util/os.d.ts +6 -0
- package/dist/util/os.d.ts.map +1 -0
- package/dist/util/os.js +32 -0
- package/dist/util/os.js.map +7 -0
- package/dist/util/str.d.ts +39 -0
- package/dist/util/str.d.ts.map +1 -0
- package/dist/util/str.js +34 -0
- package/dist/util/str.js.map +7 -0
- package/dist/util/time.d.ts +13 -0
- package/dist/util/time.d.ts.map +1 -0
- package/dist/util/time.interface.d.ts +12 -0
- package/dist/util/time.interface.d.ts.map +1 -0
- package/dist/util/time.interface.js +1 -0
- package/dist/util/time.interface.js.map +7 -0
- package/dist/util/time.js +90 -0
- package/dist/util/time.js.map +7 -0
- package/dist/util/url.d.ts +7 -0
- package/dist/util/url.d.ts.map +1 -0
- package/dist/util/url.js +12 -0
- package/dist/util/url.js.map +7 -0
- package/dist/webserver/controller/auth-middleware.d.ts +21 -0
- package/dist/webserver/controller/auth-middleware.d.ts.map +1 -0
- package/dist/webserver/controller/auth-middleware.js +33 -0
- package/dist/webserver/controller/auth-middleware.js.map +7 -0
- package/dist/webserver/controller/base.d.ts +39 -0
- package/dist/webserver/controller/base.d.ts.map +1 -0
- package/dist/webserver/controller/base.interface.d.ts +45 -0
- package/dist/webserver/controller/base.interface.d.ts.map +1 -0
- package/dist/webserver/controller/base.interface.js +1 -0
- package/dist/webserver/controller/base.interface.js.map +7 -0
- package/dist/webserver/controller/base.js +188 -0
- package/dist/webserver/controller/base.js.map +7 -0
- package/dist/webserver/controller/entity.d.ts +94 -0
- package/dist/webserver/controller/entity.d.ts.map +1 -0
- package/dist/webserver/controller/entity.js +361 -0
- package/dist/webserver/controller/entity.js.map +7 -0
- package/dist/webserver/controller/example-auth.d.ts +12 -0
- package/dist/webserver/controller/example-auth.d.ts.map +1 -0
- package/dist/webserver/controller/example-auth.js +53 -0
- package/dist/webserver/controller/example-auth.js.map +7 -0
- package/dist/webserver/controller/health.d.ts +8 -0
- package/dist/webserver/controller/health.d.ts.map +1 -0
- package/dist/webserver/controller/health.js +50 -0
- package/dist/webserver/controller/health.js.map +7 -0
- package/dist/webserver/index.d.ts +12 -0
- package/dist/webserver/index.d.ts.map +1 -0
- package/dist/webserver/index.js +19 -0
- package/dist/webserver/index.js.map +7 -0
- package/dist/webserver/util.d.ts +10 -0
- package/dist/webserver/util.d.ts.map +1 -0
- package/dist/webserver/util.js +63 -0
- package/dist/webserver/util.js.map +7 -0
- package/dist/webserver/webserver.d.ts +65 -0
- package/dist/webserver/webserver.d.ts.map +1 -0
- package/dist/webserver/webserver.interface.d.ts +118 -0
- package/dist/webserver/webserver.interface.d.ts.map +1 -0
- package/dist/webserver/webserver.interface.js +9 -0
- package/dist/webserver/webserver.interface.js.map +7 -0
- package/dist/webserver/webserver.js +347 -0
- package/dist/webserver/webserver.js.map +7 -0
- package/dist/websocket/controller/client/base.d.ts +12 -0
- package/dist/websocket/controller/client/base.d.ts.map +1 -0
- package/dist/websocket/controller/client/base.interface.d.ts +12 -0
- package/dist/websocket/controller/client/base.interface.d.ts.map +1 -0
- package/dist/websocket/controller/client/base.interface.js +1 -0
- package/dist/websocket/controller/client/base.interface.js.map +7 -0
- package/dist/websocket/controller/client/base.js +26 -0
- package/dist/websocket/controller/client/base.js.map +7 -0
- package/dist/websocket/controller/server/base.d.ts +13 -0
- package/dist/websocket/controller/server/base.d.ts.map +1 -0
- package/dist/websocket/controller/server/base.interface.d.ts +13 -0
- package/dist/websocket/controller/server/base.interface.d.ts.map +1 -0
- package/dist/websocket/controller/server/base.interface.js +1 -0
- package/dist/websocket/controller/server/base.interface.js.map +7 -0
- package/dist/websocket/controller/server/base.js +26 -0
- package/dist/websocket/controller/server/base.js.map +7 -0
- package/dist/websocket/controllers/client/system.d.ts +6 -0
- package/dist/websocket/controllers/client/system.d.ts.map +1 -0
- package/dist/websocket/controllers/client/system.js +14 -0
- package/dist/websocket/controllers/client/system.js.map +7 -0
- package/dist/websocket/controllers/server/system.d.ts +7 -0
- package/dist/websocket/controllers/server/system.d.ts.map +1 -0
- package/dist/websocket/controllers/server/system.js +87 -0
- package/dist/websocket/controllers/server/system.js.map +7 -0
- package/dist/websocket/index.d.ts +7 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +11 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/routes/client/system.d.ts +3 -0
- package/dist/websocket/routes/client/system.d.ts.map +1 -0
- package/dist/websocket/routes/client/system.js +11 -0
- package/dist/websocket/routes/client/system.js.map +7 -0
- package/dist/websocket/routes/server/system.d.ts +3 -0
- package/dist/websocket/routes/server/system.d.ts.map +1 -0
- package/dist/websocket/routes/server/system.js +16 -0
- package/dist/websocket/routes/server/system.js.map +7 -0
- package/dist/websocket/utils.d.ts +9 -0
- package/dist/websocket/utils.d.ts.map +1 -0
- package/dist/websocket/utils.js +39 -0
- package/dist/websocket/utils.js.map +7 -0
- package/dist/websocket/websocket-base.d.ts +15 -0
- package/dist/websocket/websocket-base.d.ts.map +1 -0
- package/dist/websocket/websocket-base.js +104 -0
- package/dist/websocket/websocket-base.js.map +7 -0
- package/dist/websocket/websocket-client-manager.d.ts +53 -0
- package/dist/websocket/websocket-client-manager.d.ts.map +1 -0
- package/dist/websocket/websocket-client-manager.interface.d.ts +8 -0
- package/dist/websocket/websocket-client-manager.interface.d.ts.map +1 -0
- package/dist/websocket/websocket-client-manager.interface.js +1 -0
- package/dist/websocket/websocket-client-manager.interface.js.map +7 -0
- package/dist/websocket/websocket-client-manager.js +225 -0
- package/dist/websocket/websocket-client-manager.js.map +7 -0
- package/dist/websocket/websocket-client.d.ts +35 -0
- package/dist/websocket/websocket-client.d.ts.map +1 -0
- package/dist/websocket/websocket-client.interface.d.ts +14 -0
- package/dist/websocket/websocket-client.interface.d.ts.map +1 -0
- package/dist/websocket/websocket-client.interface.js +1 -0
- package/dist/websocket/websocket-client.interface.js.map +7 -0
- package/dist/websocket/websocket-client.js +158 -0
- package/dist/websocket/websocket-client.js.map +7 -0
- package/dist/websocket/websocket-room-manager.d.ts +32 -0
- package/dist/websocket/websocket-room-manager.d.ts.map +1 -0
- package/dist/websocket/websocket-room-manager.js +130 -0
- package/dist/websocket/websocket-room-manager.js.map +7 -0
- package/dist/websocket/websocket-server.d.ts +92 -0
- package/dist/websocket/websocket-server.d.ts.map +1 -0
- package/dist/websocket/websocket-server.interface.d.ts +16 -0
- package/dist/websocket/websocket-server.interface.d.ts.map +1 -0
- package/dist/websocket/websocket-server.interface.js +1 -0
- package/dist/websocket/websocket-server.interface.js.map +7 -0
- package/dist/websocket/websocket-server.js +686 -0
- package/dist/websocket/websocket-server.js.map +7 -0
- package/dist/websocket/websocket-service.d.ts +44 -0
- package/dist/websocket/websocket-service.d.ts.map +1 -0
- package/dist/websocket/websocket-service.js +99 -0
- package/dist/websocket/websocket-service.js.map +7 -0
- package/dist/websocket/websocket.interface.d.ts +119 -0
- package/dist/websocket/websocket.interface.d.ts.map +1 -0
- package/dist/websocket/websocket.interface.js +18 -0
- package/dist/websocket/websocket.interface.js.map +7 -0
- package/package.json +159 -0
- package/pxl.js +4 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import cluster from "cluster";
|
|
4
|
+
import { existsSync, readFileSync } from "fs";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { dirname, join, resolve } from "path";
|
|
7
|
+
import { DatabaseManager } from "../database/index.js";
|
|
8
|
+
import QueueManager from "../queue/manager.js";
|
|
9
|
+
import RedisManager from "../redis/manager.js";
|
|
10
|
+
import ClusterManager from "../cluster/cluster-manager.js";
|
|
11
|
+
import { OS, Time } from "../util/index.js";
|
|
12
|
+
import CacheManager from "../cache/manager.js";
|
|
13
|
+
import os from "os";
|
|
14
|
+
import EventManager from "../event/manager.js";
|
|
15
|
+
import Logger from "../logger/logger.js";
|
|
16
|
+
import { PerformanceMonitor } from "../performance/performance-monitor.js";
|
|
17
|
+
import { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from "../performance/index.js";
|
|
18
|
+
class BaseApplication {
|
|
19
|
+
static {
|
|
20
|
+
__name(this, "BaseApplication");
|
|
21
|
+
}
|
|
22
|
+
/** Unique instance ID */
|
|
23
|
+
uniqueInstanceId;
|
|
24
|
+
/** Shutdown signals */
|
|
25
|
+
shutdownSignals = ["SIGTERM", "SIGINT"];
|
|
26
|
+
/** Application start time */
|
|
27
|
+
startTime = [0, 0];
|
|
28
|
+
/** Whether application is stopping */
|
|
29
|
+
isStopping = false;
|
|
30
|
+
/** Shutdown timeout (30 seconds) */
|
|
31
|
+
shutdownTimeout = 3e4;
|
|
32
|
+
/** Cache for application version to avoid repeated imports */
|
|
33
|
+
static applicationVersionCache;
|
|
34
|
+
/** Cluster worker ID */
|
|
35
|
+
workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;
|
|
36
|
+
/** Application config */
|
|
37
|
+
config;
|
|
38
|
+
/** Application version */
|
|
39
|
+
applicationVersion;
|
|
40
|
+
/** Redis manager */
|
|
41
|
+
redisManager;
|
|
42
|
+
/** Cache manager */
|
|
43
|
+
cacheManager;
|
|
44
|
+
/** Database manager */
|
|
45
|
+
databaseManager;
|
|
46
|
+
/** Queue manager */
|
|
47
|
+
queueManager;
|
|
48
|
+
/** Event manager */
|
|
49
|
+
eventManager;
|
|
50
|
+
/** Performance monitor */
|
|
51
|
+
performanceMonitor;
|
|
52
|
+
get Name() {
|
|
53
|
+
return this.config.name;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Application constructor
|
|
57
|
+
*/
|
|
58
|
+
constructor(config) {
|
|
59
|
+
const computerName = os.hostname();
|
|
60
|
+
this.uniqueInstanceId = `${config.instanceId}-${computerName}-${OS.getUniqueComputerId()}`;
|
|
61
|
+
this.config = config;
|
|
62
|
+
this.redisManager = new RedisManager({
|
|
63
|
+
applicationConfig: this.config,
|
|
64
|
+
host: this.config.redis.host,
|
|
65
|
+
port: this.config.redis.port,
|
|
66
|
+
password: this.config.redis.password
|
|
67
|
+
});
|
|
68
|
+
this.cacheManager = new CacheManager({
|
|
69
|
+
applicationConfig: this.config,
|
|
70
|
+
redisManager: this.redisManager
|
|
71
|
+
});
|
|
72
|
+
this.initializePerformanceMonitor();
|
|
73
|
+
this.setupGlobalErrorHandlers();
|
|
74
|
+
if (this.config.database && this.config.database.enabled === true) {
|
|
75
|
+
const defaultEntitiesDirectory = join(this.config.rootDirectory, "src", "database", "entities");
|
|
76
|
+
if (!this.config.database.entitiesDirectory) {
|
|
77
|
+
this.config.database.entitiesDirectory = defaultEntitiesDirectory;
|
|
78
|
+
}
|
|
79
|
+
if (!existsSync(this.config.database.entitiesDirectory)) {
|
|
80
|
+
throw new Error(`Database entities directory not found (Path: ${this.config.database.entitiesDirectory})`);
|
|
81
|
+
}
|
|
82
|
+
this.databaseManager = new DatabaseManager({
|
|
83
|
+
applicationConfig: this.config,
|
|
84
|
+
host: this.config.database.host,
|
|
85
|
+
port: this.config.database.port,
|
|
86
|
+
username: this.config.database.username,
|
|
87
|
+
password: this.config.database.password,
|
|
88
|
+
databaseName: this.config.database.databaseName,
|
|
89
|
+
entitiesDirectory: this.config.database.entitiesDirectory
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get application version
|
|
95
|
+
*/
|
|
96
|
+
async getApplicationVersion() {
|
|
97
|
+
if (BaseApplication.applicationVersionCache !== void 0) {
|
|
98
|
+
return BaseApplication.applicationVersionCache;
|
|
99
|
+
}
|
|
100
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
101
|
+
const __dirname = dirname(__filename);
|
|
102
|
+
const packageJsonPath = resolve(__dirname, "../../package.json");
|
|
103
|
+
const fileContents = readFileSync(packageJsonPath, "utf-8");
|
|
104
|
+
const packageJson = JSON.parse(fileContents);
|
|
105
|
+
if (!packageJson?.version) {
|
|
106
|
+
throw new Error("Application version not found");
|
|
107
|
+
}
|
|
108
|
+
BaseApplication.applicationVersionCache = packageJson.version;
|
|
109
|
+
return packageJson.version;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Start application
|
|
113
|
+
*/
|
|
114
|
+
async start() {
|
|
115
|
+
this.startTime = process.hrtime();
|
|
116
|
+
this.applicationVersion = await this.getApplicationVersion();
|
|
117
|
+
const startInstanceOptions = {
|
|
118
|
+
// onStarted: ({ startupTime }) => {
|
|
119
|
+
// if (this.config.log?.startUp) {
|
|
120
|
+
// Logger.info('Application started', {
|
|
121
|
+
// Name: this.config.name,
|
|
122
|
+
// 'PXL Framework Version': this.applicationVersion,
|
|
123
|
+
// 'Startup Time': Time.formatTime({ time: startupTime, format: 's', numDecimals: 2, showUnit: true }),
|
|
124
|
+
// });
|
|
125
|
+
// }
|
|
126
|
+
// if (this.config.events?.onStarted) {
|
|
127
|
+
// this.config.events.onStarted({ app: this, startupTime });
|
|
128
|
+
// }
|
|
129
|
+
// },
|
|
130
|
+
onStarted: this.onStarted.bind(this)
|
|
131
|
+
};
|
|
132
|
+
const stopInstanceOptions = {
|
|
133
|
+
// onStopped: ({ runtime }) => {
|
|
134
|
+
// if (this.config.log?.shutdown) {
|
|
135
|
+
// Logger.info('Application stopped', {
|
|
136
|
+
// Name: this.config.name,
|
|
137
|
+
// 'Runtime': Time.formatTime({ time: runtime, format: 's', numDecimals: 2, showUnit: true }),
|
|
138
|
+
// });
|
|
139
|
+
// }
|
|
140
|
+
// if (this.config.events?.onStopped) {
|
|
141
|
+
// this.config.events.onStopped({ app: this, runtime });
|
|
142
|
+
// }
|
|
143
|
+
// },
|
|
144
|
+
onStopped: this.onStopped.bind(this)
|
|
145
|
+
};
|
|
146
|
+
if (this.config.cluster?.enabled) {
|
|
147
|
+
const clusterManager = new ClusterManager({
|
|
148
|
+
config: this.config.cluster,
|
|
149
|
+
startApplicationCallback: /* @__PURE__ */ __name(() => this.startInstance(startInstanceOptions), "startApplicationCallback"),
|
|
150
|
+
stopApplicationCallback: /* @__PURE__ */ __name(() => this.stop(stopInstanceOptions), "stopApplicationCallback")
|
|
151
|
+
});
|
|
152
|
+
clusterManager.start();
|
|
153
|
+
} else {
|
|
154
|
+
await this.startInstance(startInstanceOptions);
|
|
155
|
+
this.handleShutdown({
|
|
156
|
+
onStopped: stopInstanceOptions.onStopped
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Before application start
|
|
162
|
+
*/
|
|
163
|
+
async onBeforeStart() {
|
|
164
|
+
const redisInstance = await this.redisManager.connect();
|
|
165
|
+
const databaseInstance = this.databaseManager ? await this.databaseManager.connect() : null;
|
|
166
|
+
let eventManager;
|
|
167
|
+
if (this.config.event?.enabled) {
|
|
168
|
+
eventManager = new EventManager({
|
|
169
|
+
applicationConfig: this.config,
|
|
170
|
+
options: this.config.event,
|
|
171
|
+
events: this.config.event.events || [],
|
|
172
|
+
redisInstance,
|
|
173
|
+
databaseInstance
|
|
174
|
+
// queueManager,
|
|
175
|
+
});
|
|
176
|
+
eventManager.load();
|
|
177
|
+
}
|
|
178
|
+
const queueManager = new QueueManager({
|
|
179
|
+
applicationConfig: this.config,
|
|
180
|
+
options: {
|
|
181
|
+
processorsDirectory: this.config.queue.processorsDirectory
|
|
182
|
+
},
|
|
183
|
+
queues: this.config.queue.queues,
|
|
184
|
+
redisInstance,
|
|
185
|
+
databaseInstance,
|
|
186
|
+
eventManager
|
|
187
|
+
});
|
|
188
|
+
await queueManager.registerQueues({
|
|
189
|
+
queues: this.config.queue.queues
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
redisInstance,
|
|
193
|
+
databaseInstance,
|
|
194
|
+
queueManager,
|
|
195
|
+
eventManager
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Application started event
|
|
200
|
+
*/
|
|
201
|
+
onStarted({ startupTime: _startupTime }) {
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Application stopped event
|
|
205
|
+
*/
|
|
206
|
+
onStopped({ runtime: _runtime }) {
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Before application stop event
|
|
210
|
+
*/
|
|
211
|
+
async onBeforeStop() {
|
|
212
|
+
await this.redisManager.disconnect();
|
|
213
|
+
if (this.databaseManager) {
|
|
214
|
+
await this.databaseManager.disconnect();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Start application instance
|
|
219
|
+
*/
|
|
220
|
+
async startInstance(options) {
|
|
221
|
+
try {
|
|
222
|
+
const { redisInstance, databaseInstance, queueManager, eventManager } = await this.onBeforeStart();
|
|
223
|
+
await this.startHandler({
|
|
224
|
+
redisInstance,
|
|
225
|
+
databaseInstance,
|
|
226
|
+
queueManager,
|
|
227
|
+
eventManager
|
|
228
|
+
});
|
|
229
|
+
const startupTime = Time.calculateElapsedTime({
|
|
230
|
+
startTime: this.startTime
|
|
231
|
+
});
|
|
232
|
+
if (options.onStarted) {
|
|
233
|
+
await options.onStarted({ startupTime });
|
|
234
|
+
}
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error(error);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Set up global error handlers
|
|
242
|
+
*/
|
|
243
|
+
/**
|
|
244
|
+
* Initialize performance monitor
|
|
245
|
+
*/
|
|
246
|
+
initializePerformanceMonitor() {
|
|
247
|
+
if (!this.config.performanceMonitoring?.enabled) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
this.performanceMonitor = PerformanceMonitor.initialize({
|
|
251
|
+
enabled: true,
|
|
252
|
+
thresholds: this.config.performanceMonitoring.thresholds,
|
|
253
|
+
maxMetricsHistory: this.config.performanceMonitoring.maxMetricsHistory,
|
|
254
|
+
logSlowOperations: this.config.performanceMonitoring.logSlowOperations,
|
|
255
|
+
logAllOperations: this.config.performanceMonitoring.logAllOperations
|
|
256
|
+
});
|
|
257
|
+
if (this.config.performanceMonitoring.monitorDatabaseOperations !== false) {
|
|
258
|
+
DatabasePerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);
|
|
259
|
+
}
|
|
260
|
+
if (this.config.performanceMonitoring.monitorQueueOperations !== false) {
|
|
261
|
+
QueuePerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);
|
|
262
|
+
}
|
|
263
|
+
if (this.config.performanceMonitoring.monitorCacheOperations !== false) {
|
|
264
|
+
CachePerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);
|
|
265
|
+
}
|
|
266
|
+
if (this.config.performanceMonitoring.reportInterval && this.config.performanceMonitoring.reportInterval > 0) {
|
|
267
|
+
setInterval(() => {
|
|
268
|
+
const reportFormat = this.config.performanceMonitoring?.reportFormat ?? "detailed";
|
|
269
|
+
const report = this.performanceMonitor?.generateFormattedReport(reportFormat);
|
|
270
|
+
if (report) {
|
|
271
|
+
Logger.info({ message: report });
|
|
272
|
+
}
|
|
273
|
+
}, this.config.performanceMonitoring.reportInterval);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
setupGlobalErrorHandlers() {
|
|
277
|
+
process.on("uncaughtException", (error) => {
|
|
278
|
+
Logger.error({ error, message: "Uncaught Exception" });
|
|
279
|
+
this.initiateGracefulShutdown();
|
|
280
|
+
});
|
|
281
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
282
|
+
Logger.error({
|
|
283
|
+
error: reason instanceof Error ? reason : new Error(String(reason)),
|
|
284
|
+
message: "Unhandled Rejection",
|
|
285
|
+
meta: { promise }
|
|
286
|
+
});
|
|
287
|
+
this.initiateGracefulShutdown();
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Initiate graceful shutdown
|
|
292
|
+
*/
|
|
293
|
+
initiateGracefulShutdown() {
|
|
294
|
+
if (this.isStopping) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
Logger.info({ message: "Initiating graceful shutdown due to error" });
|
|
298
|
+
this.stop().catch((error) => {
|
|
299
|
+
Logger.error({
|
|
300
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
301
|
+
message: "Error during graceful shutdown"
|
|
302
|
+
});
|
|
303
|
+
process.exit(1);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Handle shutdown
|
|
308
|
+
*/
|
|
309
|
+
handleShutdown({ onStopped }) {
|
|
310
|
+
this.shutdownSignals.forEach((signal) => {
|
|
311
|
+
process.on(signal, async () => {
|
|
312
|
+
await this.stop({ onStopped });
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Stop application
|
|
318
|
+
*/
|
|
319
|
+
async stop({ onStopped } = {}) {
|
|
320
|
+
if (this.isStopping) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
this.isStopping = true;
|
|
324
|
+
const forceExitTimeout = setTimeout(() => {
|
|
325
|
+
Logger.warn({ message: "Forced shutdown due to timeout" });
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}, this.shutdownTimeout);
|
|
328
|
+
try {
|
|
329
|
+
await this.stopCallback();
|
|
330
|
+
await this.onBeforeStop();
|
|
331
|
+
if (onStopped) {
|
|
332
|
+
const runtime = process.uptime() * 1e3;
|
|
333
|
+
await onStopped({ runtime });
|
|
334
|
+
}
|
|
335
|
+
clearTimeout(forceExitTimeout);
|
|
336
|
+
process.exit(0);
|
|
337
|
+
} catch (error) {
|
|
338
|
+
Logger.error({
|
|
339
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
340
|
+
message: "Error during shutdown"
|
|
341
|
+
});
|
|
342
|
+
clearTimeout(forceExitTimeout);
|
|
343
|
+
process.exit(1);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
export {
|
|
348
|
+
BaseApplication as default
|
|
349
|
+
};
|
|
350
|
+
//# sourceMappingURL=base-application.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/application/base-application.ts"],
|
|
4
|
+
"sourcesContent": ["import cluster from 'cluster';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { type DatabaseInstance, DatabaseManager } from '../database/index.js';\nimport QueueManager from '../queue/manager.js';\nimport RedisManager from '../redis/manager.js';\nimport type {\n ApplicationConfig,\n ApplicationStartInstanceOptions,\n ApplicationStopInstanceOptions,\n} from './base-application.interface.js';\nimport ClusterManager from '../cluster/cluster-manager.js';\nimport type RedisInstance from '../redis/instance.js';\nimport { OS, Time } from '../util/index.js';\nimport CacheManager from '../cache/manager.js';\nimport os from 'os';\nimport EventManager from '../event/manager.js';\nimport Logger from '../logger/logger.js';\nimport { PerformanceMonitor } from '../performance/performance-monitor.js';\nimport { CachePerformanceWrapper, DatabasePerformanceWrapper, QueuePerformanceWrapper } from '../performance/index.js';\n\n// Re-export types for external use\nexport type { ApplicationConfig } from './base-application.interface.js';\n\nexport default abstract class BaseApplication {\n /** Unique instance ID */\n public uniqueInstanceId: string;\n\n /** Shutdown signals */\n protected shutdownSignals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\n\n /** Application start time */\n protected startTime: [number, number] = [0, 0];\n\n /** Whether application is stopping */\n protected isStopping = false;\n\n /** Shutdown timeout (30 seconds) */\n protected shutdownTimeout = 30000;\n\n /** Cache for application version to avoid repeated imports */\n private static applicationVersionCache: string | undefined;\n\n /** Cluster worker ID */\n protected workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;\n\n /** Application config */\n protected config: ApplicationConfig;\n\n /** Application version */\n protected applicationVersion?: string;\n\n /** Redis manager */\n public redisManager: RedisManager;\n\n /** Cache manager */\n public cacheManager: CacheManager;\n\n /** Database manager */\n public databaseManager?: DatabaseManager;\n\n /** Queue manager */\n public queueManager?: QueueManager;\n\n /** Event manager */\n public eventManager?: EventManager;\n\n /** Performance monitor */\n public performanceMonitor?: PerformanceMonitor;\n\n public get Name() {\n return this.config.name;\n }\n\n /**\n * Application constructor\n */\n constructor(config: ApplicationConfig) {\n const computerName = os.hostname();\n\n this.uniqueInstanceId = `${config.instanceId}-${computerName}-${OS.getUniqueComputerId()}`;\n\n this.config = config;\n\n // const schema = Joi.object({\n // name: Joi.string().required(),\n\n // redis: {\n // host: Joi.string().required(),\n // port: Joi.number().required(),\n // password: Joi.string().allow('').optional(),\n // },\n\n // database: {\n // host: Joi.string().required(),\n // port: Joi.number().required(),\n // username: Joi.string().required(),\n // password: Joi.string().required(),\n // databaseName: Joi.string().required(),\n // },\n // });\n\n // // Validation application constructor props\n // const validationResult = schema.validate(props);\n\n // if (validationResult.error) {\n // throw new Error(validationResult.error.message);\n // }\n\n // Initialize Redis manager\n this.redisManager = new RedisManager({\n applicationConfig: this.config,\n host: this.config.redis.host,\n port: this.config.redis.port,\n password: this.config.redis.password,\n });\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n applicationConfig: this.config,\n redisManager: this.redisManager,\n });\n\n // Initialize performance monitor\n this.initializePerformanceMonitor();\n\n // Set up global error handlers\n this.setupGlobalErrorHandlers();\n\n if (this.config.database && this.config.database.enabled === true) {\n const defaultEntitiesDirectory = join(this.config.rootDirectory, 'src', 'database', 'entities');\n\n if (!this.config.database.entitiesDirectory) {\n this.config.database.entitiesDirectory = defaultEntitiesDirectory;\n }\n\n if (!existsSync(this.config.database.entitiesDirectory)) {\n throw new Error(`Database entities directory not found (Path: ${this.config.database.entitiesDirectory})`);\n }\n\n // Initialize Database manager\n this.databaseManager = new DatabaseManager({\n applicationConfig: this.config,\n host: this.config.database.host,\n port: this.config.database.port,\n username: this.config.database.username,\n password: this.config.database.password,\n databaseName: this.config.database.databaseName,\n entitiesDirectory: this.config.database.entitiesDirectory,\n });\n }\n }\n\n /**\n * Get application version\n */\n public async getApplicationVersion(): Promise<string> {\n // Return cached version if available\n if (BaseApplication.applicationVersionCache !== undefined) {\n return BaseApplication.applicationVersionCache;\n }\n\n // Resolve the path to package.json\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = resolve(__dirname, '../../package.json');\n\n // Read and parse the file\n const fileContents = readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(fileContents);\n\n if (!packageJson?.version) {\n throw new Error('Application version not found');\n }\n\n // Cache and return the version\n BaseApplication.applicationVersionCache = packageJson.version;\n\n return packageJson.version;\n }\n\n /**\n * Start application\n */\n public async start(): Promise<void> {\n // Start application timer\n this.startTime = process.hrtime();\n\n // Get application version`\n this.applicationVersion = await this.getApplicationVersion();\n\n const startInstanceOptions: ApplicationStartInstanceOptions = {\n // onStarted: ({ startupTime }) => {\n // if (this.config.log?.startUp) {\n // Logger.info('Application started', {\n // Name: this.config.name,\n // 'PXL Framework Version': this.applicationVersion,\n // 'Startup Time': Time.formatTime({ time: startupTime, format: 's', numDecimals: 2, showUnit: true }),\n // });\n // }\n\n // if (this.config.events?.onStarted) {\n // this.config.events.onStarted({ app: this, startupTime });\n // }\n // },\n onStarted: this.onStarted.bind(this),\n };\n\n const stopInstanceOptions: ApplicationStopInstanceOptions = {\n // onStopped: ({ runtime }) => {\n // if (this.config.log?.shutdown) {\n // Logger.info('Application stopped', {\n // Name: this.config.name,\n // 'Runtime': Time.formatTime({ time: runtime, format: 's', numDecimals: 2, showUnit: true }),\n // });\n // }\n\n // if (this.config.events?.onStopped) {\n // this.config.events.onStopped({ app: this, runtime });\n // }\n // },\n onStopped: this.onStopped.bind(this),\n };\n\n if (this.config.cluster?.enabled) {\n // Initialize clustered application\n const clusterManager = new ClusterManager({\n config: this.config.cluster,\n\n startApplicationCallback: () => this.startInstance(startInstanceOptions),\n stopApplicationCallback: () => this.stop(stopInstanceOptions),\n });\n\n // Start cluster\n clusterManager.start();\n } else {\n // Start standalone application\n await this.startInstance(startInstanceOptions);\n\n // Handle standalone application shutdown\n this.handleShutdown({\n onStopped: stopInstanceOptions.onStopped,\n });\n }\n }\n\n /**\n * Before application start\n */\n private async onBeforeStart(): Promise<{\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance | null;\n queueManager: QueueManager;\n eventManager?: EventManager;\n }> {\n // Connect to Redis\n const redisInstance = await this.redisManager.connect();\n\n // Connect to database\n const databaseInstance = this.databaseManager ? await this.databaseManager.connect() : null;\n\n let eventManager: EventManager | undefined;\n\n if (this.config.event?.enabled) {\n eventManager = new EventManager({\n applicationConfig: this.config,\n options: this.config.event,\n events: this.config.event.events || [],\n redisInstance,\n databaseInstance,\n // queueManager,\n });\n\n eventManager.load();\n }\n\n // Initialize queue\n const queueManager = new QueueManager({\n applicationConfig: this.config,\n options: {\n processorsDirectory: this.config.queue.processorsDirectory,\n },\n queues: this.config.queue.queues,\n redisInstance,\n databaseInstance,\n eventManager,\n });\n\n // Register queues\n await queueManager.registerQueues({\n queues: this.config.queue.queues,\n });\n\n return {\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n };\n }\n\n /**\n * Application started event\n */\n protected onStarted({ startupTime: _startupTime }: { startupTime: number }): void {}\n\n /**\n * Application stopped event\n */\n protected onStopped({ runtime: _runtime }: { runtime: number }): void {}\n\n /**\n * Before application stop event\n */\n private async onBeforeStop(): Promise<void> {\n // Disconnect from Redis\n await this.redisManager.disconnect();\n\n if (this.databaseManager) {\n // Disconnect from database\n await this.databaseManager.disconnect();\n }\n }\n\n /**\n * Start application instance\n */\n private async startInstance(options: ApplicationStartInstanceOptions): Promise<void> {\n try {\n // Before application start\n const { redisInstance, databaseInstance, queueManager, eventManager } = await this.onBeforeStart();\n\n // Start application\n await this.startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n });\n\n // Calculate application startup time\n const startupTime = Time.calculateElapsedTime({\n startTime: this.startTime,\n });\n\n // On application started\n if (options.onStarted) {\n await options.onStarted({ startupTime });\n }\n } catch (error) {\n // Log error\n console.error(error);\n\n process.exit(1);\n }\n }\n\n protected abstract startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance?: DatabaseInstance | null;\n queueManager: QueueManager;\n eventManager?: EventManager | null;\n }): Promise<void>;\n\n protected abstract stopCallback(): void;\n\n /**\n * Set up global error handlers\n */\n /**\n * Initialize performance monitor\n */\n private initializePerformanceMonitor(): void {\n // Check if performance monitoring is enabled\n if (!this.config.performanceMonitoring?.enabled) {\n return;\n }\n\n // Initialize performance monitor with configuration\n this.performanceMonitor = PerformanceMonitor.initialize({\n enabled: true,\n thresholds: this.config.performanceMonitoring.thresholds,\n maxMetricsHistory: this.config.performanceMonitoring.maxMetricsHistory,\n logSlowOperations: this.config.performanceMonitoring.logSlowOperations,\n logAllOperations: this.config.performanceMonitoring.logAllOperations,\n });\n\n // Set up performance monitoring for different components\n if (this.config.performanceMonitoring.monitorDatabaseOperations !== false) {\n DatabasePerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n if (this.config.performanceMonitoring.monitorQueueOperations !== false) {\n QueuePerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n if (this.config.performanceMonitoring.monitorCacheOperations !== false) {\n CachePerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n // Set up periodic performance reports if configured\n if (this.config.performanceMonitoring.reportInterval && this.config.performanceMonitoring.reportInterval > 0) {\n setInterval(() => {\n const reportFormat = this.config.performanceMonitoring?.reportFormat ?? 'detailed';\n const report = this.performanceMonitor?.generateFormattedReport(reportFormat);\n\n if (report) {\n Logger.info({ message: report });\n }\n }, this.config.performanceMonitoring.reportInterval);\n }\n }\n\n private setupGlobalErrorHandlers(): void {\n // Handle uncaught exceptions\n process.on('uncaughtException', error => {\n Logger.error({ error, message: 'Uncaught Exception' });\n this.initiateGracefulShutdown();\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason, promise) => {\n Logger.error({\n error: reason instanceof Error ? reason : new Error(String(reason)),\n message: 'Unhandled Rejection',\n meta: { promise },\n });\n this.initiateGracefulShutdown();\n });\n }\n\n /**\n * Initiate graceful shutdown\n */\n private initiateGracefulShutdown(): void {\n if (this.isStopping) {\n return;\n }\n\n Logger.info({ message: 'Initiating graceful shutdown due to error' });\n this.stop().catch(error => {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'Error during graceful shutdown',\n });\n process.exit(1);\n });\n }\n\n /**\n * Handle shutdown\n */\n public handleShutdown({ onStopped }: { onStopped?: ({ runtime }: { runtime: number }) => void }): void {\n this.shutdownSignals.forEach(signal => {\n process.on(signal, async () => {\n // Stop application\n await this.stop({ onStopped });\n });\n });\n }\n\n /**\n * Stop application\n */\n private async stop({ onStopped }: ApplicationStopInstanceOptions = {}): Promise<void> {\n if (this.isStopping) {\n return;\n }\n\n this.isStopping = true;\n\n // Set timeout for forced termination\n const forceExitTimeout = setTimeout(() => {\n Logger.warn({ message: 'Forced shutdown due to timeout' });\n process.exit(1);\n }, this.shutdownTimeout);\n\n try {\n // Stop callback\n await this.stopCallback();\n\n // Disconnect\n await this.onBeforeStop();\n\n if (onStopped) {\n // Calculate runtime\n const runtime = process.uptime() * 1000;\n\n // Emit stopped event\n await onStopped({ runtime });\n }\n\n clearTimeout(forceExitTimeout);\n process.exit(0);\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'Error during shutdown',\n });\n clearTimeout(forceExitTimeout);\n process.exit(1);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type DatabaseInstance from '../database/instance.js';
|
|
2
|
+
import type QueueManager from '../queue/manager.js';
|
|
3
|
+
import type RedisInstance from '../redis/instance.js';
|
|
4
|
+
import BaseApplication from './base-application.js';
|
|
5
|
+
import type { CommandApplicationConfig } from './command-application.interface.js';
|
|
6
|
+
export default class CommandApplication extends BaseApplication {
|
|
7
|
+
/** Command application config */
|
|
8
|
+
protected config: CommandApplicationConfig;
|
|
9
|
+
constructor(config: CommandApplicationConfig);
|
|
10
|
+
protected startHandler({ redisInstance, databaseInstance, queueManager, }: {
|
|
11
|
+
redisInstance: RedisInstance;
|
|
12
|
+
databaseInstance: DatabaseInstance;
|
|
13
|
+
queueManager: QueueManager;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
private stopCommand;
|
|
16
|
+
protected stopCallback(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=command-application.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-application.d.ts","sourceRoot":"","sources":["../../src/application/command-application.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,eAAe,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAGnF,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,eAAe;IAC7D,iCAAiC;IACjC,SAAS,CAAC,MAAM,EAAE,wBAAwB,CAAC;gBAE/B,MAAM,EAAE,wBAAwB;cA0B5B,YAAY,CAAC,EAC3B,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,EAAE;QACD,aAAa,EAAE,aAAa,CAAC;QAC7B,gBAAgB,EAAE,gBAAgB,CAAC;QACnC,YAAY,EAAE,YAAY,CAAC;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IA4FjB,OAAO,CAAC,WAAW;IAKnB,SAAS,CAAC,YAAY,IAAI,IAAI;CAG/B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type CommandManager from '../command/command-manager.js';
|
|
2
|
+
import type { ApplicationConfig } from './base-application.interface.js';
|
|
3
|
+
import type CommandApplication from './command-application.js';
|
|
4
|
+
export interface CommandApplicationEventsConfig {
|
|
5
|
+
onStarted?: ({ app, startupTime }: {
|
|
6
|
+
app: CommandApplication;
|
|
7
|
+
startupTime: number;
|
|
8
|
+
}) => void;
|
|
9
|
+
onStopped?: ({ app, runtime }: {
|
|
10
|
+
app: CommandApplication;
|
|
11
|
+
runtime: number;
|
|
12
|
+
}) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface CommandApplicationConfig extends ApplicationConfig {
|
|
15
|
+
/** Commands directory */
|
|
16
|
+
commandsDirectory: string;
|
|
17
|
+
/** Command manager */
|
|
18
|
+
commandManager: CommandManager;
|
|
19
|
+
/** Command debug config */
|
|
20
|
+
debug?: {
|
|
21
|
+
measureExecutionTime?: boolean;
|
|
22
|
+
};
|
|
23
|
+
/** Command application events */
|
|
24
|
+
events?: CommandApplicationEventsConfig;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=command-application.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-application.interface.d.ts","sourceRoot":"","sources":["../../src/application/command-application.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,8BAA8B;IAC7C,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE;QAAE,GAAG,EAAE,kBAAkB,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7F,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAAE,GAAG,EAAE,kBAAkB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACtF;AAED,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE,yBAAyB;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,sBAAsB;IACtB,cAAc,EAAE,cAAc,CAAC;IAE/B,2BAA2B;IAC3B,KAAK,CAAC,EAAE;QACN,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;IAEF,iCAAiC;IACjC,MAAM,CAAC,EAAE,8BAA8B,CAAC;CACzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=command-application.interface.js.map
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { Logger } from "../logger/index.js";
|
|
5
|
+
import BaseApplication from "./base-application.js";
|
|
6
|
+
import { Helper, Loader, Time } from "../util/index.js";
|
|
7
|
+
class CommandApplication extends BaseApplication {
|
|
8
|
+
static {
|
|
9
|
+
__name(this, "CommandApplication");
|
|
10
|
+
}
|
|
11
|
+
/** Command application config */
|
|
12
|
+
config;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
super(config);
|
|
15
|
+
const defaultConfig = {
|
|
16
|
+
cluster: {
|
|
17
|
+
enabled: false
|
|
18
|
+
},
|
|
19
|
+
log: {
|
|
20
|
+
startUp: false
|
|
21
|
+
},
|
|
22
|
+
debug: {
|
|
23
|
+
measureExecutionTime: false
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const mergedConfig = Helper.defaultsDeep(config, defaultConfig);
|
|
27
|
+
if (mergedConfig.cluster) {
|
|
28
|
+
mergedConfig.cluster.enabled = false;
|
|
29
|
+
}
|
|
30
|
+
this.config = mergedConfig;
|
|
31
|
+
}
|
|
32
|
+
async startHandler({
|
|
33
|
+
redisInstance,
|
|
34
|
+
databaseInstance,
|
|
35
|
+
queueManager
|
|
36
|
+
}) {
|
|
37
|
+
const startTime = performance.now();
|
|
38
|
+
const argv = this.config.commandManager.argv;
|
|
39
|
+
const parsedArgv = argv.parseSync();
|
|
40
|
+
if (parsedArgv._.length === 0) {
|
|
41
|
+
Logger.warn({ message: "No command provided" });
|
|
42
|
+
this.stopCommand();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const inputCommandName = parsedArgv._[0];
|
|
46
|
+
const commandsDirectoryExists = await existsSync(this.config.commandsDirectory);
|
|
47
|
+
if (!commandsDirectoryExists) {
|
|
48
|
+
Logger.warn({
|
|
49
|
+
message: "Commands directory not found",
|
|
50
|
+
meta: {
|
|
51
|
+
Directory: this.config.commandsDirectory
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const commands = await Loader.loadModulesInDirectory({
|
|
57
|
+
directory: this.config.commandsDirectory,
|
|
58
|
+
extensions: [".ts", ".js"]
|
|
59
|
+
});
|
|
60
|
+
let CommandClass = null;
|
|
61
|
+
if (Object.prototype.hasOwnProperty.call(commands, inputCommandName)) {
|
|
62
|
+
CommandClass = Reflect.get(commands, inputCommandName);
|
|
63
|
+
}
|
|
64
|
+
if (!CommandClass) {
|
|
65
|
+
Logger.warn({
|
|
66
|
+
message: "Command not found",
|
|
67
|
+
meta: { Command: inputCommandName }
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const command = new CommandClass({
|
|
72
|
+
applicationConfig: this.config,
|
|
73
|
+
redisInstance,
|
|
74
|
+
queueManager,
|
|
75
|
+
databaseInstance
|
|
76
|
+
});
|
|
77
|
+
Logger.info({
|
|
78
|
+
message: "Command started",
|
|
79
|
+
meta: { Command: inputCommandName }
|
|
80
|
+
});
|
|
81
|
+
await command.run(parsedArgv);
|
|
82
|
+
const commandCompletedLogParams = {
|
|
83
|
+
Command: inputCommandName
|
|
84
|
+
};
|
|
85
|
+
if (this.config.debug?.measureExecutionTime) {
|
|
86
|
+
const endTime = performance.now();
|
|
87
|
+
const executionTime = endTime - startTime;
|
|
88
|
+
commandCompletedLogParams["Execution Time"] = Time.formatTime({
|
|
89
|
+
time: executionTime,
|
|
90
|
+
numDecimals: 2,
|
|
91
|
+
showUnit: true
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
Logger.info({
|
|
95
|
+
message: "Command completed",
|
|
96
|
+
meta: commandCompletedLogParams
|
|
97
|
+
});
|
|
98
|
+
this.stopCommand();
|
|
99
|
+
}
|
|
100
|
+
stopCommand() {
|
|
101
|
+
this.handleShutdown({ onStopped: this.onStopped.bind(this) });
|
|
102
|
+
}
|
|
103
|
+
stopCallback() {
|
|
104
|
+
Logger.info({ message: "Command stopped" });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
CommandApplication as default
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=command-application.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/application/command-application.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync } from 'fs';\nimport type DatabaseInstance from '../database/instance.js';\nimport { Logger } from '../logger/index.js';\nimport type QueueManager from '../queue/manager.js';\nimport type RedisInstance from '../redis/instance.js';\nimport BaseApplication from './base-application.js';\nimport type { CommandApplicationConfig } from './command-application.interface.js';\nimport { Helper, Loader, Time } from '../util/index.js';\n\nexport default class CommandApplication extends BaseApplication {\n /** Command application config */\n protected config: CommandApplicationConfig;\n\n constructor(config: CommandApplicationConfig) {\n super(config);\n\n const defaultConfig: Partial<CommandApplicationConfig> = {\n cluster: {\n enabled: false,\n },\n\n log: {\n startUp: false,\n },\n\n debug: {\n measureExecutionTime: false,\n },\n };\n\n const mergedConfig: CommandApplicationConfig = Helper.defaultsDeep(config, defaultConfig);\n\n if (mergedConfig.cluster) {\n mergedConfig.cluster.enabled = false;\n }\n\n this.config = mergedConfig;\n }\n\n protected async startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance;\n queueManager: QueueManager;\n }): Promise<void> {\n const startTime = performance.now();\n\n // get argv (yargs) input args\n const argv = this.config.commandManager.argv;\n\n const parsedArgv = argv.parseSync();\n\n if (parsedArgv._.length === 0) {\n Logger.warn({ message: 'No command provided' });\n\n this.stopCommand();\n\n return;\n }\n\n const inputCommandName = parsedArgv._[0];\n\n const commandsDirectoryExists = await existsSync(this.config.commandsDirectory);\n\n if (!commandsDirectoryExists) {\n Logger.warn({\n message: 'Commands directory not found',\n meta: {\n Directory: this.config.commandsDirectory,\n },\n });\n\n return;\n }\n\n // Load commands\n const commands = await Loader.loadModulesInDirectory({\n directory: this.config.commandsDirectory,\n extensions: ['.ts', '.js'],\n });\n\n // Find command by name - use safe property access to prevent object injection\n let CommandClass = null;\n if (Object.prototype.hasOwnProperty.call(commands, inputCommandName)) {\n CommandClass = Reflect.get(commands, inputCommandName);\n }\n\n if (!CommandClass) {\n Logger.warn({\n message: 'Command not found',\n meta: { Command: inputCommandName },\n });\n\n return;\n }\n\n // Initialize command\n const command = new CommandClass({\n applicationConfig: this.config,\n redisInstance,\n queueManager,\n databaseInstance,\n });\n\n Logger.info({\n message: 'Command started',\n meta: { Command: inputCommandName },\n });\n\n // Run command\n await command.run(parsedArgv);\n\n const commandCompletedLogParams: Record<string, unknown> = {\n Command: inputCommandName,\n };\n\n if (this.config.debug?.measureExecutionTime) {\n const endTime = performance.now();\n const executionTime = endTime - startTime;\n\n commandCompletedLogParams['Execution Time'] = Time.formatTime({\n time: executionTime,\n numDecimals: 2,\n showUnit: true,\n });\n }\n\n Logger.info({\n message: 'Command completed',\n meta: commandCompletedLogParams,\n });\n\n // Call shutdown signtal to stop the command\n this.stopCommand();\n }\n\n private stopCommand(): void {\n // Use existing graceful shutdown mechanism instead of self-termination\n this.handleShutdown({ onStopped: this.onStopped.bind(this) });\n }\n\n protected stopCallback(): void {\n Logger.info({ message: 'Command stopped' });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AAAA,SAAS,kBAAkB;AAE3B,SAAS,cAAc;AAGvB,OAAO,qBAAqB;AAE5B,SAAS,QAAQ,QAAQ,YAAY;AAErC,MAAO,2BAAyC,gBAAgB;AAAA,EAThE,OASgE;AAAA;AAAA;AAAA;AAAA,EAEpD;AAAA,EAEV,YAAY,QAAkC;AAC5C,UAAM,MAAM;AAEZ,UAAM,gBAAmD;AAAA,MACvD,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,MAEA,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MAEA,OAAO;AAAA,QACL,sBAAsB;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,eAAyC,OAAO,aAAa,QAAQ,aAAa;AAExF,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,UAAU;AAAA,IACjC;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAgB,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIkB;AAChB,UAAM,YAAY,YAAY,IAAI;AAGlC,UAAM,OAAO,KAAK,OAAO,eAAe;AAExC,UAAM,aAAa,KAAK,UAAU;AAElC,QAAI,WAAW,EAAE,WAAW,GAAG;AAC7B,aAAO,KAAK,EAAE,SAAS,sBAAsB,CAAC;AAE9C,WAAK,YAAY;AAEjB;AAAA,IACF;AAEA,UAAM,mBAAmB,WAAW,EAAE,CAAC;AAEvC,UAAM,0BAA0B,MAAM,WAAW,KAAK,OAAO,iBAAiB;AAE9E,QAAI,CAAC,yBAAyB;AAC5B,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,WAAW,KAAK,OAAO;AAAA,QACzB;AAAA,MACF,CAAC;AAED;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,OAAO,uBAAuB;AAAA,MACnD,WAAW,KAAK,OAAO;AAAA,MACvB,YAAY,CAAC,OAAO,KAAK;AAAA,IAC3B,CAAC;AAGD,QAAI,eAAe;AACnB,QAAI,OAAO,UAAU,eAAe,KAAK,UAAU,gBAAgB,GAAG;AACpE,qBAAe,QAAQ,IAAI,UAAU,gBAAgB;AAAA,IACvD;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM,EAAE,SAAS,iBAAiB;AAAA,MACpC,CAAC;AAED;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,aAAa;AAAA,MAC/B,mBAAmB,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,MAAM,EAAE,SAAS,iBAAiB;AAAA,IACpC,CAAC;AAGD,UAAM,QAAQ,IAAI,UAAU;AAE5B,UAAM,4BAAqD;AAAA,MACzD,SAAS;AAAA,IACX;AAEA,QAAI,KAAK,OAAO,OAAO,sBAAsB;AAC3C,YAAM,UAAU,YAAY,IAAI;AAChC,YAAM,gBAAgB,UAAU;AAEhC,gCAA0B,gBAAgB,IAAI,KAAK,WAAW;AAAA,QAC5D,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAGD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,cAAoB;AAE1B,SAAK,eAAe,EAAE,WAAW,KAAK,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,EAC9D;AAAA,EAEU,eAAqB;AAC7B,WAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;AAAA,EAC5C;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as WebApplication } from './web-application.js';
|
|
2
|
+
export { default as CommandApplication } from './command-application.js';
|
|
3
|
+
export type { ApplicationConfig } from './base-application.interface.js';
|
|
4
|
+
export type { WebApplicationConfig } from './web-application.interface.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/application/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { default as WebApplication } from './web-application.js';\nexport { default as CommandApplication } from './command-application.js';\nexport type { ApplicationConfig } from './base-application.interface.js';\nexport type { WebApplicationConfig } from './web-application.interface.js';\n"],
|
|
5
|
+
"mappings": "AAAA,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAqC;",
|
|
6
|
+
"names": ["default"]
|
|
7
|
+
}
|