@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,225 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import WebSocket from "ws";
|
|
4
|
+
import { log } from "./utils.js";
|
|
5
|
+
import { Helper, Time } from "../util/index.js";
|
|
6
|
+
import cluster from "cluster";
|
|
7
|
+
class WebSocketClientManager {
|
|
8
|
+
static {
|
|
9
|
+
__name(this, "WebSocketClientManager");
|
|
10
|
+
}
|
|
11
|
+
clients = /* @__PURE__ */ new Map();
|
|
12
|
+
addClient({
|
|
13
|
+
clientId,
|
|
14
|
+
ws,
|
|
15
|
+
lastActivity,
|
|
16
|
+
user
|
|
17
|
+
}) {
|
|
18
|
+
this.clients.set(clientId, {
|
|
19
|
+
ws,
|
|
20
|
+
lastActivity,
|
|
21
|
+
user
|
|
22
|
+
});
|
|
23
|
+
this.broadcastClientList("addClient");
|
|
24
|
+
log("Client connected", {
|
|
25
|
+
ID: clientId,
|
|
26
|
+
UserId: user?.userId ?? "unauthenticated"
|
|
27
|
+
});
|
|
28
|
+
this.printClients();
|
|
29
|
+
}
|
|
30
|
+
getClientId({ ws }) {
|
|
31
|
+
return [...this.clients.entries()].find(([_, value]) => value.ws === ws)?.[0];
|
|
32
|
+
}
|
|
33
|
+
getClient({
|
|
34
|
+
clientId,
|
|
35
|
+
requireWs
|
|
36
|
+
}) {
|
|
37
|
+
const client = this.clients.get(clientId);
|
|
38
|
+
if (requireWs && !client?.ws) {
|
|
39
|
+
return void 0;
|
|
40
|
+
}
|
|
41
|
+
return client;
|
|
42
|
+
}
|
|
43
|
+
updateClient({
|
|
44
|
+
clientId,
|
|
45
|
+
key,
|
|
46
|
+
data,
|
|
47
|
+
broadcastClientList
|
|
48
|
+
}) {
|
|
49
|
+
const client = this.clients.get(clientId);
|
|
50
|
+
if (!client) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype") {
|
|
54
|
+
console.warn(`Blocked attempt to modify dangerous property: ${key}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const allowedClientProperties = [
|
|
58
|
+
"id",
|
|
59
|
+
"ws",
|
|
60
|
+
"room",
|
|
61
|
+
"userId",
|
|
62
|
+
"username",
|
|
63
|
+
"metadata",
|
|
64
|
+
"connectedAt",
|
|
65
|
+
"lastActivity",
|
|
66
|
+
"status",
|
|
67
|
+
"permissions"
|
|
68
|
+
];
|
|
69
|
+
if (!allowedClientProperties.includes(key)) {
|
|
70
|
+
console.warn(`Blocked attempt to modify unauthorized property: ${key}`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
Reflect.set(client, key, data);
|
|
74
|
+
this.clients.set(clientId, client);
|
|
75
|
+
if (broadcastClientList !== false) {
|
|
76
|
+
this.broadcastClientList("updateClient");
|
|
77
|
+
}
|
|
78
|
+
this.printClients();
|
|
79
|
+
}
|
|
80
|
+
removeClient(clientId) {
|
|
81
|
+
const client = this.clients.get(clientId);
|
|
82
|
+
if (client?.ws) {
|
|
83
|
+
try {
|
|
84
|
+
client.ws.removeAllListeners();
|
|
85
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
86
|
+
client.ws.close();
|
|
87
|
+
}
|
|
88
|
+
} catch (error) {
|
|
89
|
+
log("Error cleaning up WebSocket connection", {
|
|
90
|
+
error: error instanceof Error ? error.message : String(error)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.clients.delete(clientId);
|
|
95
|
+
this.broadcastClientList("removeClient");
|
|
96
|
+
this.printClients();
|
|
97
|
+
}
|
|
98
|
+
getClientList() {
|
|
99
|
+
const clientList = [];
|
|
100
|
+
this.clients.forEach((clientData, clientId) => {
|
|
101
|
+
clientList.push({
|
|
102
|
+
clientId,
|
|
103
|
+
...clientData
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
return clientList;
|
|
107
|
+
}
|
|
108
|
+
getClientByKey({
|
|
109
|
+
key,
|
|
110
|
+
value,
|
|
111
|
+
requireWs,
|
|
112
|
+
userType
|
|
113
|
+
}) {
|
|
114
|
+
const clients = [...this.clients.entries()];
|
|
115
|
+
const client = clients.find(([_, clientData]) => {
|
|
116
|
+
const deepKeyValue = Helper.getValueFromObject(clientData, key);
|
|
117
|
+
const isValueMatching = deepKeyValue === value;
|
|
118
|
+
if (userType && clientData.user?.userType !== userType) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
return isValueMatching;
|
|
122
|
+
});
|
|
123
|
+
const formattedClient = client ? {
|
|
124
|
+
clientId: client[0],
|
|
125
|
+
...client[1]
|
|
126
|
+
} : void 0;
|
|
127
|
+
if (requireWs && !formattedClient?.ws) {
|
|
128
|
+
return void 0;
|
|
129
|
+
}
|
|
130
|
+
return formattedClient;
|
|
131
|
+
}
|
|
132
|
+
getClients({ userType } = {}) {
|
|
133
|
+
const clients = [];
|
|
134
|
+
this.clients.forEach((clientData, clientId) => {
|
|
135
|
+
if (userType && clientData.user?.userType !== userType) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
clientData.clientId = clientId;
|
|
139
|
+
clients.push(clientData);
|
|
140
|
+
});
|
|
141
|
+
return clients;
|
|
142
|
+
}
|
|
143
|
+
disconnectClient({ clientId }) {
|
|
144
|
+
const clientInfo = this.clients.get(clientId);
|
|
145
|
+
if (clientInfo?.ws) {
|
|
146
|
+
const connectedTime = Date.now() - clientInfo.lastActivity;
|
|
147
|
+
clientInfo.ws.close();
|
|
148
|
+
log("WebSocket client was disconnected due to inactivity", {
|
|
149
|
+
ID: clientId,
|
|
150
|
+
"Time Connected": Time.formatTime({
|
|
151
|
+
time: connectedTime,
|
|
152
|
+
format: "s"
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
this.removeClient(clientId);
|
|
157
|
+
log("Client disconnected", { ID: clientId });
|
|
158
|
+
this.printClients();
|
|
159
|
+
}
|
|
160
|
+
printClients() {
|
|
161
|
+
const numClients = this.clients.size;
|
|
162
|
+
const workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;
|
|
163
|
+
let logOutput = "\n-------------------------------------------------------\n";
|
|
164
|
+
logOutput += `Connected clients (Count: ${numClients}${workerId ? ` | Worker: ${workerId}` : ""}):
|
|
165
|
+
`;
|
|
166
|
+
logOutput += "-------------------------------------------------------\n";
|
|
167
|
+
if (numClients > 0) {
|
|
168
|
+
this.clients.forEach((client, clientId) => {
|
|
169
|
+
logOutput += `ID: ${clientId} | Username: ${client?.user?.username ?? "-"} | User Type: ${client?.user?.userType ?? "-"} | Email: ${client.user?.email ?? "-"}
|
|
170
|
+
`;
|
|
171
|
+
});
|
|
172
|
+
} else {
|
|
173
|
+
logOutput += "No clients";
|
|
174
|
+
}
|
|
175
|
+
logOutput += "\n";
|
|
176
|
+
log(logOutput, void 0, {
|
|
177
|
+
muteWorker: true
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
broadcastClientList(type) {
|
|
181
|
+
const clientList = this.getClientList();
|
|
182
|
+
this.clients.forEach(({ ws }) => {
|
|
183
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
ws.send(
|
|
188
|
+
JSON.stringify({
|
|
189
|
+
type: "system",
|
|
190
|
+
action: "clientList",
|
|
191
|
+
clientListType: type,
|
|
192
|
+
data: clientList
|
|
193
|
+
})
|
|
194
|
+
);
|
|
195
|
+
} catch (error) {
|
|
196
|
+
log("Error broadcasting client list", {
|
|
197
|
+
error: error instanceof Error ? error.message : String(error)
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
cleanup() {
|
|
203
|
+
this.clients.forEach((client, clientId) => {
|
|
204
|
+
if (client.ws) {
|
|
205
|
+
try {
|
|
206
|
+
client.ws.removeAllListeners();
|
|
207
|
+
if (client.ws.readyState === WebSocket.OPEN) {
|
|
208
|
+
client.ws.close();
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
log("Error cleaning up client connection", {
|
|
212
|
+
clientId,
|
|
213
|
+
error: error instanceof Error ? error.message : String(error)
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
this.clients.clear();
|
|
219
|
+
log("WebSocket client manager cleaned up");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export {
|
|
223
|
+
WebSocketClientManager as default
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=websocket-client-manager.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/websocket/websocket-client-manager.ts"],
|
|
4
|
+
"sourcesContent": ["import WebSocket from 'ws';\nimport { log } from './utils.js';\nimport type { WebSocketClientData } from './websocket-client-manager.interface.js';\nimport { Helper, Time } from '../util/index.js';\nimport cluster from 'cluster';\n\nexport default class WebSocketClientManager {\n private clients: Map<string, WebSocketClientData> = new Map();\n\n public addClient({\n clientId,\n ws,\n lastActivity,\n user,\n }: {\n clientId: string;\n ws: WebSocket | null;\n lastActivity: number;\n user?: { userId: number; payload: any } | null;\n }) {\n this.clients.set(clientId, {\n ws,\n lastActivity,\n user,\n });\n\n this.broadcastClientList('addClient');\n\n log('Client connected', {\n ID: clientId,\n UserId: user?.userId ?? 'unauthenticated',\n });\n\n this.printClients();\n }\n\n public getClientId({ ws }: { ws: WebSocket }): string | undefined {\n return [...this.clients.entries()].find(([_, value]) => value.ws === ws)?.[0];\n }\n\n public getClient({\n clientId,\n requireWs,\n }: {\n clientId: string;\n requireWs?: boolean;\n }): WebSocketClientData | undefined {\n const client = this.clients.get(clientId);\n\n if (requireWs && !client?.ws) {\n return undefined;\n }\n\n return client;\n }\n\n public updateClient({\n clientId,\n key,\n data,\n broadcastClientList,\n }: {\n clientId: string;\n key: string;\n data: any;\n broadcastClientList?: boolean;\n }) {\n const client = this.clients.get(clientId);\n\n if (!client) {\n return;\n }\n\n // Prevent prototype pollution attacks\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n console.warn(`Blocked attempt to modify dangerous property: ${key}`);\n return;\n }\n\n // Define allowed client properties to prevent unauthorized modifications\n const allowedClientProperties = [\n 'id',\n 'ws',\n 'room',\n 'userId',\n 'username',\n 'metadata',\n 'connectedAt',\n 'lastActivity',\n 'status',\n 'permissions',\n ];\n\n if (!allowedClientProperties.includes(key)) {\n console.warn(`Blocked attempt to modify unauthorized property: ${key}`);\n return;\n }\n\n Reflect.set(client, key, data);\n\n this.clients.set(clientId, client);\n\n if (broadcastClientList !== false) {\n this.broadcastClientList('updateClient');\n }\n\n this.printClients();\n }\n\n public removeClient(clientId: string) {\n const client = this.clients.get(clientId);\n\n // Clean up WebSocket connection if it exists\n if (client?.ws) {\n try {\n client.ws.removeAllListeners();\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.close();\n }\n } catch (error) {\n log('Error cleaning up WebSocket connection', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.clients.delete(clientId);\n this.broadcastClientList('removeClient');\n this.printClients();\n }\n\n public getClientList() {\n const clientList: {\n clientId: string;\n [key: string]: any;\n }[] = [];\n\n this.clients.forEach((clientData, clientId) => {\n clientList.push({\n clientId,\n ...clientData,\n });\n });\n\n return clientList;\n }\n\n public getClientByKey({\n key,\n value,\n requireWs,\n userType,\n }: {\n key: string;\n value: string;\n requireWs?: boolean;\n userType?: string;\n }) {\n const clients = [...this.clients.entries()];\n\n const client = clients.find(([_, clientData]) => {\n const deepKeyValue = Helper.getValueFromObject(clientData, key);\n\n const isValueMatching = deepKeyValue === value;\n\n if (userType && clientData.user?.userType !== userType) {\n return false;\n }\n\n return isValueMatching;\n });\n\n const formattedClient = client\n ? {\n clientId: client[0],\n ...client[1],\n }\n : undefined;\n\n if (requireWs && !formattedClient?.ws) {\n return undefined;\n }\n\n return formattedClient;\n }\n\n public getClients({ userType }: { userType?: string } = {}) {\n const clients: WebSocketClientData[] = [];\n\n this.clients.forEach((clientData, clientId) => {\n if (userType && clientData.user?.userType !== userType) {\n return;\n }\n\n clientData.clientId = clientId;\n\n clients.push(clientData);\n });\n\n return clients;\n }\n\n public disconnectClient({ clientId }: { clientId: string }) {\n const clientInfo = this.clients.get(clientId);\n\n if (clientInfo?.ws) {\n const connectedTime = Date.now() - clientInfo.lastActivity;\n\n clientInfo.ws.close();\n\n log('WebSocket client was disconnected due to inactivity', {\n ID: clientId,\n 'Time Connected': Time.formatTime({\n time: connectedTime,\n format: 's',\n }),\n });\n }\n\n this.removeClient(clientId);\n\n log('Client disconnected', { ID: clientId });\n\n this.printClients();\n }\n\n public printClients() {\n const numClients = this.clients.size;\n\n const workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;\n\n let logOutput = '\\n-------------------------------------------------------\\n';\n logOutput += `Connected clients (Count: ${numClients}${workerId ? ` | Worker: ${workerId}` : ''}):\\n`;\n logOutput += '-------------------------------------------------------\\n';\n\n if (numClients > 0) {\n this.clients.forEach((client, clientId) => {\n logOutput += `ID: ${clientId} | Username: ${client?.user?.username ?? '-'} | User Type: ${client?.user?.userType ?? '-'} | Email: ${client.user?.email ?? '-'}\\n`;\n });\n } else {\n logOutput += 'No clients';\n }\n\n logOutput += '\\n';\n\n log(logOutput, undefined, {\n muteWorker: true,\n });\n }\n\n public broadcastClientList(type: string) {\n const clientList = this.getClientList();\n\n this.clients.forEach(({ ws }) => {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n try {\n ws.send(\n JSON.stringify({\n type: 'system',\n action: 'clientList',\n clientListType: type,\n data: clientList,\n }),\n );\n } catch (error) {\n // Handle send errors (e.g., connection closed)\n log('Error broadcasting client list', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n }\n\n public cleanup(): void {\n // Clean up all client connections\n this.clients.forEach((client, clientId) => {\n if (client.ws) {\n try {\n client.ws.removeAllListeners();\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.close();\n }\n } catch (error) {\n log('Error cleaning up client connection', {\n clientId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n });\n\n // Clear all clients\n this.clients.clear();\n log('WebSocket client manager cleaned up');\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { WebSocketRoute, WebSocketType } from './websocket.interface.js';
|
|
2
|
+
import type RedisInstance from '../redis/instance.js';
|
|
3
|
+
import type QueueManager from '../queue/manager.js';
|
|
4
|
+
import type DatabaseInstance from '../database/instance.js';
|
|
5
|
+
import type { WebSocketClientProps } from './websocket-client.interface.js';
|
|
6
|
+
import WebSocketBase from './websocket-base.js';
|
|
7
|
+
export default class WebSocketClient extends WebSocketBase {
|
|
8
|
+
protected defaultRoutes: WebSocketRoute[];
|
|
9
|
+
private applicationConfig;
|
|
10
|
+
private options;
|
|
11
|
+
private redisInstance;
|
|
12
|
+
private queueManager;
|
|
13
|
+
private databaseInstance;
|
|
14
|
+
private ws?;
|
|
15
|
+
private clientId?;
|
|
16
|
+
private isConnected;
|
|
17
|
+
constructor(props: WebSocketClientProps);
|
|
18
|
+
get type(): WebSocketType;
|
|
19
|
+
load(): Promise<void>;
|
|
20
|
+
connectToServer(): Promise<void>;
|
|
21
|
+
protected getControllerDependencies(): {
|
|
22
|
+
sendMessage: (data: unknown) => void;
|
|
23
|
+
redisInstance: RedisInstance;
|
|
24
|
+
queueManager: QueueManager;
|
|
25
|
+
databaseInstance: DatabaseInstance;
|
|
26
|
+
};
|
|
27
|
+
protected shouldPrintRoutes(): boolean;
|
|
28
|
+
private handleIncomingMessage;
|
|
29
|
+
protected handleMessageError(clientId: string, error: string): void;
|
|
30
|
+
sendClientMessage: (data: unknown, binary?: boolean) => void;
|
|
31
|
+
sendMessage: (data: unknown) => void;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
isClientConnected(): boolean;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=websocket-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAKhD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,aAAa;IACxD,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,CAMvC;IAEF,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAkB;gBAEzB,KAAK,EAAE,oBAAoB;IAWvC,IAAW,IAAI,IAAI,aAAa,CAE/B;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA0E7C,SAAS,CAAC,yBAAyB,IAAI;QACrC,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;QACrC,aAAa,EAAE,aAAa,CAAC;QAC7B,YAAY,EAAE,YAAY,CAAC;QAC3B,gBAAgB,EAAE,gBAAgB,CAAC;KACpC;IAQD,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,OAAO,CAAC,qBAAqB,CAqB3B;IAEF,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5D,iBAAiB,GAAI,MAAM,OAAO,EAAE,SAAQ,OAAe,KAAG,IAAI,CAYvE;IAEK,WAAW,GAAI,MAAM,OAAO,KAAG,IAAI,CAExC;IAEK,UAAU,IAAI,IAAI;IAWlB,iBAAiB,IAAI,OAAO;CAGpC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ApplicationConfig } from '../application/base-application.interface.js';
|
|
2
|
+
import type DatabaseInstance from '../database/instance.js';
|
|
3
|
+
import type QueueManager from '../queue/manager.js';
|
|
4
|
+
import type { RedisInstance } from '../redis/index.js';
|
|
5
|
+
import type { WebSocketOptions, WebSocketRoute } from './websocket.interface.js';
|
|
6
|
+
export interface WebSocketClientProps {
|
|
7
|
+
applicationConfig: ApplicationConfig;
|
|
8
|
+
options: WebSocketOptions;
|
|
9
|
+
redisInstance: RedisInstance;
|
|
10
|
+
queueManager: QueueManager;
|
|
11
|
+
databaseInstance: DatabaseInstance;
|
|
12
|
+
routes: WebSocketRoute[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=websocket-client.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-client.interface.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-client.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=websocket-client.interface.js.map
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import WebSocket from "ws";
|
|
4
|
+
import { generateClientId, log, parseServerMessage } from "./utils.js";
|
|
5
|
+
import WebSocketBase from "./websocket-base.js";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import { baseDir } from "../index.js";
|
|
8
|
+
class WebSocketClient extends WebSocketBase {
|
|
9
|
+
static {
|
|
10
|
+
__name(this, "WebSocketClient");
|
|
11
|
+
}
|
|
12
|
+
defaultRoutes = [
|
|
13
|
+
{
|
|
14
|
+
type: "system",
|
|
15
|
+
action: "clientList",
|
|
16
|
+
controllerName: "system"
|
|
17
|
+
}
|
|
18
|
+
];
|
|
19
|
+
applicationConfig;
|
|
20
|
+
options;
|
|
21
|
+
redisInstance;
|
|
22
|
+
queueManager;
|
|
23
|
+
databaseInstance;
|
|
24
|
+
ws;
|
|
25
|
+
clientId;
|
|
26
|
+
isConnected = false;
|
|
27
|
+
constructor(props) {
|
|
28
|
+
super();
|
|
29
|
+
this.applicationConfig = props.applicationConfig;
|
|
30
|
+
this.options = props.options;
|
|
31
|
+
this.redisInstance = props.redisInstance;
|
|
32
|
+
this.queueManager = props.queueManager;
|
|
33
|
+
this.databaseInstance = props.databaseInstance;
|
|
34
|
+
this.routes = props.routes;
|
|
35
|
+
}
|
|
36
|
+
get type() {
|
|
37
|
+
return "client";
|
|
38
|
+
}
|
|
39
|
+
async load() {
|
|
40
|
+
const libraryControllersDirectory = path.join(baseDir, "websocket", "controllers", "client");
|
|
41
|
+
await this.configureRoutes(this.defaultRoutes, libraryControllersDirectory);
|
|
42
|
+
await this.configureRoutes(this.routes, this.options.controllersDirectory);
|
|
43
|
+
}
|
|
44
|
+
async connectToServer() {
|
|
45
|
+
const url = this.options.url;
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
const ws = new WebSocket(url);
|
|
48
|
+
ws.on("open", () => {
|
|
49
|
+
this.clientId = generateClientId();
|
|
50
|
+
this.isConnected = true;
|
|
51
|
+
log("Connected to server", { ID: this.clientId });
|
|
52
|
+
if (this.options.events?.onConnected) {
|
|
53
|
+
this.options.events.onConnected({
|
|
54
|
+
ws,
|
|
55
|
+
clientId: this.clientId,
|
|
56
|
+
joinRoom: /* @__PURE__ */ __name(({
|
|
57
|
+
userId,
|
|
58
|
+
userType,
|
|
59
|
+
username,
|
|
60
|
+
roomName
|
|
61
|
+
}) => {
|
|
62
|
+
this.sendClientMessage({
|
|
63
|
+
type: "system",
|
|
64
|
+
action: "joinRoom",
|
|
65
|
+
data: {
|
|
66
|
+
userId,
|
|
67
|
+
userType,
|
|
68
|
+
username,
|
|
69
|
+
roomName
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}, "joinRoom")
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
resolve();
|
|
76
|
+
});
|
|
77
|
+
ws.on("message", this.handleIncomingMessage);
|
|
78
|
+
ws.on("close", () => {
|
|
79
|
+
this.isConnected = false;
|
|
80
|
+
log("Connection to server closed");
|
|
81
|
+
if (this.options.events?.onDisconnected) {
|
|
82
|
+
this.options.events.onDisconnected({ clientId: this.clientId });
|
|
83
|
+
}
|
|
84
|
+
ws.removeAllListeners();
|
|
85
|
+
this.ws = void 0;
|
|
86
|
+
this.clientId = void 0;
|
|
87
|
+
});
|
|
88
|
+
ws.on("error", (error) => {
|
|
89
|
+
log("WebSocket error", { error: error.message });
|
|
90
|
+
if (this.options.events?.onError) {
|
|
91
|
+
this.options.events.onError({ error });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
this.ws = ws;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
getControllerDependencies() {
|
|
98
|
+
return {
|
|
99
|
+
sendMessage: this.sendMessage,
|
|
100
|
+
redisInstance: this.redisInstance,
|
|
101
|
+
queueManager: this.queueManager,
|
|
102
|
+
databaseInstance: this.databaseInstance
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
shouldPrintRoutes() {
|
|
106
|
+
return this.options.debug?.printRoutes ?? false;
|
|
107
|
+
}
|
|
108
|
+
handleIncomingMessage = /* @__PURE__ */ __name(async (message) => {
|
|
109
|
+
if (!this.ws || !this.clientId) {
|
|
110
|
+
log("WebSocket not initialized or client ID not set");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (this.options.events?.onMessage) {
|
|
114
|
+
const parsedMessage = parseServerMessage(message);
|
|
115
|
+
this.options.events.onMessage({
|
|
116
|
+
ws: this.ws,
|
|
117
|
+
clientId: this.clientId,
|
|
118
|
+
data: parsedMessage,
|
|
119
|
+
redisInstance: this.redisInstance,
|
|
120
|
+
queueManager: this.queueManager,
|
|
121
|
+
databaseInstance: this.databaseInstance
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
await this.handleServerMessage(this.ws, message, this.clientId);
|
|
125
|
+
}, "handleIncomingMessage");
|
|
126
|
+
handleMessageError(clientId, error) {
|
|
127
|
+
log(error);
|
|
128
|
+
}
|
|
129
|
+
sendClientMessage = /* @__PURE__ */ __name((data, binary = false) => {
|
|
130
|
+
if (!this.ws) {
|
|
131
|
+
log("WebSocket not initialized");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const webSocketMessage = JSON.stringify(data);
|
|
135
|
+
console.log("SENDING LCIENT MESSAGE: ", webSocketMessage);
|
|
136
|
+
this.ws.send(webSocketMessage, { binary });
|
|
137
|
+
}, "sendClientMessage");
|
|
138
|
+
sendMessage = /* @__PURE__ */ __name((data) => {
|
|
139
|
+
this.sendClientMessage(data);
|
|
140
|
+
}, "sendMessage");
|
|
141
|
+
disconnect() {
|
|
142
|
+
if (this.ws && this.isConnected) {
|
|
143
|
+
this.ws.removeAllListeners();
|
|
144
|
+
this.ws.close();
|
|
145
|
+
this.ws = void 0;
|
|
146
|
+
this.clientId = void 0;
|
|
147
|
+
this.isConnected = false;
|
|
148
|
+
log("WebSocket client disconnected");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
isClientConnected() {
|
|
152
|
+
return this.isConnected && this.ws?.readyState === WebSocket.OPEN;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export {
|
|
156
|
+
WebSocketClient as default
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=websocket-client.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/websocket/websocket-client.ts"],
|
|
4
|
+
"sourcesContent": ["import WebSocket, { type RawData } from 'ws';\nimport type { WebSocketOptions, WebSocketRoute, WebSocketType } from './websocket.interface.js';\nimport type RedisInstance from '../redis/instance.js';\nimport type QueueManager from '../queue/manager.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport type { WebSocketClientProps } from './websocket-client.interface.js';\nimport { generateClientId, log, parseServerMessage } from './utils.js';\nimport WebSocketBase from './websocket-base.js';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport path from 'path';\nimport { baseDir } from '../index.js';\n\nexport default class WebSocketClient extends WebSocketBase {\n protected defaultRoutes: WebSocketRoute[] = [\n {\n type: 'system',\n action: 'clientList',\n controllerName: 'system',\n },\n ];\n\n private applicationConfig: ApplicationConfig;\n private options: WebSocketOptions;\n private redisInstance: RedisInstance;\n private queueManager: QueueManager;\n private databaseInstance: DatabaseInstance;\n private ws?: WebSocket;\n private clientId?: string;\n private isConnected: boolean = false;\n\n constructor(props: WebSocketClientProps) {\n super();\n\n this.applicationConfig = props.applicationConfig;\n this.options = props.options;\n this.redisInstance = props.redisInstance;\n this.queueManager = props.queueManager;\n this.databaseInstance = props.databaseInstance;\n this.routes = props.routes;\n }\n\n public get type(): WebSocketType {\n return 'client';\n }\n\n public async load(): Promise<void> {\n const libraryControllersDirectory = path.join(baseDir, 'websocket', 'controllers', 'client');\n\n await this.configureRoutes(this.defaultRoutes, libraryControllersDirectory);\n\n await this.configureRoutes(this.routes, this.options.controllersDirectory);\n }\n\n public async connectToServer(): Promise<void> {\n const url = this.options.url;\n // const host = this.options.host;\n // const port = this.options.port;\n\n return new Promise(resolve => {\n const ws = new WebSocket(url);\n\n ws.on('open', () => {\n this.clientId = generateClientId();\n this.isConnected = true;\n\n log('Connected to server', { ID: this.clientId });\n\n if (this.options.events?.onConnected) {\n this.options.events.onConnected({\n ws,\n clientId: this.clientId,\n joinRoom: ({\n userId,\n userType,\n username,\n roomName,\n }: {\n userId?: string;\n userType?: string;\n username: string;\n roomName: string;\n }) => {\n this.sendClientMessage({\n type: 'system',\n action: 'joinRoom',\n data: {\n userId,\n userType,\n username,\n roomName,\n },\n });\n },\n });\n }\n\n resolve();\n });\n\n ws.on('message', this.handleIncomingMessage);\n\n ws.on('close', () => {\n this.isConnected = false;\n log('Connection to server closed');\n\n if (this.options.events?.onDisconnected) {\n this.options.events.onDisconnected({ clientId: this.clientId });\n }\n\n // Clean up event listeners to prevent memory leaks\n ws.removeAllListeners();\n this.ws = undefined;\n this.clientId = undefined;\n });\n\n ws.on('error', error => {\n log('WebSocket error', { error: error.message });\n\n if (this.options.events?.onError) {\n this.options.events.onError({ error });\n }\n });\n\n this.ws = ws;\n });\n }\n\n protected getControllerDependencies(): {\n sendMessage: (data: unknown) => void;\n redisInstance: RedisInstance;\n queueManager: QueueManager;\n databaseInstance: DatabaseInstance;\n } {\n return {\n sendMessage: this.sendMessage,\n redisInstance: this.redisInstance,\n queueManager: this.queueManager,\n databaseInstance: this.databaseInstance,\n };\n }\n protected shouldPrintRoutes(): boolean {\n return this.options.debug?.printRoutes ?? false;\n }\n\n private handleIncomingMessage = async (message: RawData): Promise<void> => {\n if (!this.ws || !this.clientId) {\n log('WebSocket not initialized or client ID not set');\n\n return;\n }\n\n if (this.options.events?.onMessage) {\n const parsedMessage = parseServerMessage(message);\n\n this.options.events.onMessage({\n ws: this.ws,\n clientId: this.clientId,\n data: parsedMessage,\n redisInstance: this.redisInstance,\n queueManager: this.queueManager,\n databaseInstance: this.databaseInstance,\n });\n }\n\n await this.handleServerMessage(this.ws, message, this.clientId);\n };\n\n protected handleMessageError(clientId: string, error: string): void {\n log(error);\n }\n\n public sendClientMessage = (data: unknown, binary: boolean = false): void => {\n if (!this.ws) {\n log('WebSocket not initialized');\n\n return;\n }\n\n const webSocketMessage = JSON.stringify(data);\n\n console.log('SENDING LCIENT MESSAGE: ', webSocketMessage);\n\n this.ws.send(webSocketMessage, { binary });\n };\n\n public sendMessage = (data: unknown): void => {\n this.sendClientMessage(data);\n };\n\n public disconnect(): void {\n if (this.ws && this.isConnected) {\n this.ws.removeAllListeners();\n this.ws.close();\n this.ws = undefined;\n this.clientId = undefined;\n this.isConnected = false;\n log('WebSocket client disconnected');\n }\n }\n\n public isClientConnected(): boolean {\n return this.isConnected && this.ws?.readyState === WebSocket.OPEN;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type WebSocketClientManager from './websocket-client-manager.js';
|
|
2
|
+
export default class WebSocketRoomManager {
|
|
3
|
+
private clientManager;
|
|
4
|
+
rooms: Map<string, Set<string>>;
|
|
5
|
+
constructor({ clientManager }: {
|
|
6
|
+
clientManager: WebSocketClientManager;
|
|
7
|
+
});
|
|
8
|
+
addClientToRoom({ clientId, user, roomName, broadcast, }: {
|
|
9
|
+
clientId: string;
|
|
10
|
+
user: any;
|
|
11
|
+
roomName: string;
|
|
12
|
+
broadcast?: boolean;
|
|
13
|
+
}): void;
|
|
14
|
+
removeClientFromRoom({ roomName, clientId, broadcast, }: {
|
|
15
|
+
roomName: string;
|
|
16
|
+
clientId: string;
|
|
17
|
+
broadcast?: boolean;
|
|
18
|
+
}): void;
|
|
19
|
+
removeClientFromAllRooms({ clientId }: {
|
|
20
|
+
clientId: string;
|
|
21
|
+
}): void;
|
|
22
|
+
isClientInRoom({ clientId, roomName }: {
|
|
23
|
+
clientId: string;
|
|
24
|
+
roomName: string;
|
|
25
|
+
}): boolean;
|
|
26
|
+
printRooms(): void;
|
|
27
|
+
getRoomClients({ roomName }: {
|
|
28
|
+
roomName: string;
|
|
29
|
+
}): string[];
|
|
30
|
+
cleanup(): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=websocket-room-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-room-manager.d.ts","sourceRoot":"","sources":["../../src/websocket/websocket-room-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,sBAAsB,MAAM,+BAA+B,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,OAAO,CAAC,aAAa,CAAyB;IAEvC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;gBAEvC,EAAE,aAAa,EAAE,EAAE;QAAE,aAAa,EAAE,sBAAsB,CAAA;KAAE;IAIjE,eAAe,CAAC,EACrB,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,SAAS,GACV,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB;IAwCM,oBAAoB,CAAC,EAC1B,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB;IA0CM,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;IAc3D,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAY7E,UAAU;IAqCV,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IAK5D,OAAO,IAAI,IAAI;CAKvB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import cluster from "cluster";
|
|
4
|
+
import { log } from "./utils.js";
|
|
5
|
+
class WebSocketRoomManager {
|
|
6
|
+
static {
|
|
7
|
+
__name(this, "WebSocketRoomManager");
|
|
8
|
+
}
|
|
9
|
+
clientManager;
|
|
10
|
+
rooms = /* @__PURE__ */ new Map();
|
|
11
|
+
constructor({ clientManager }) {
|
|
12
|
+
this.clientManager = clientManager;
|
|
13
|
+
}
|
|
14
|
+
addClientToRoom({
|
|
15
|
+
clientId,
|
|
16
|
+
user,
|
|
17
|
+
roomName,
|
|
18
|
+
broadcast
|
|
19
|
+
}) {
|
|
20
|
+
if (!this.rooms.has(roomName)) {
|
|
21
|
+
this.rooms.set(roomName, /* @__PURE__ */ new Set());
|
|
22
|
+
}
|
|
23
|
+
const room = this.rooms.get(roomName);
|
|
24
|
+
if (!room) {
|
|
25
|
+
log("Room not found when adding client", { Name: roomName });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
room.add(clientId);
|
|
29
|
+
this.clientManager.updateClient({
|
|
30
|
+
clientId,
|
|
31
|
+
key: "roomName",
|
|
32
|
+
data: roomName
|
|
33
|
+
});
|
|
34
|
+
if (broadcast !== false) {
|
|
35
|
+
this.clientManager.broadcastClientList("clientAddedToRoom");
|
|
36
|
+
}
|
|
37
|
+
this.printRooms();
|
|
38
|
+
log("Client joined room", {
|
|
39
|
+
"User Type": user?.userType ?? "-",
|
|
40
|
+
Room: roomName,
|
|
41
|
+
ID: clientId,
|
|
42
|
+
Email: user.email ?? "-"
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
removeClientFromRoom({
|
|
46
|
+
roomName,
|
|
47
|
+
clientId,
|
|
48
|
+
broadcast
|
|
49
|
+
}) {
|
|
50
|
+
const room = this.rooms.get(roomName);
|
|
51
|
+
if (!room) {
|
|
52
|
+
log("Room not found when removing client", { Name: roomName });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const clientsInRoom = this.rooms.get(roomName);
|
|
56
|
+
if (!clientsInRoom) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
clientsInRoom.delete(clientId);
|
|
60
|
+
if (clientsInRoom.size === 0) {
|
|
61
|
+
this.rooms.delete(roomName);
|
|
62
|
+
}
|
|
63
|
+
this.clientManager.updateClient({
|
|
64
|
+
clientId,
|
|
65
|
+
key: "roomName",
|
|
66
|
+
data: null
|
|
67
|
+
});
|
|
68
|
+
if (broadcast !== false) {
|
|
69
|
+
this.clientManager.broadcastClientList("clientRemovedFromRoom");
|
|
70
|
+
}
|
|
71
|
+
this.printRooms();
|
|
72
|
+
log("Client left room", { Room: roomName, ID: clientId });
|
|
73
|
+
}
|
|
74
|
+
removeClientFromAllRooms({ clientId }) {
|
|
75
|
+
this.rooms.forEach((clientsInRoom, room) => {
|
|
76
|
+
if (!clientsInRoom.has(clientId)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this.removeClientFromRoom({ roomName: room, clientId, broadcast: false });
|
|
80
|
+
});
|
|
81
|
+
this.clientManager.broadcastClientList("clientRemovedFromAllRooms");
|
|
82
|
+
this.printRooms();
|
|
83
|
+
}
|
|
84
|
+
isClientInRoom({ clientId, roomName }) {
|
|
85
|
+
const clientsInRoom = this.rooms.get(roomName);
|
|
86
|
+
if (!clientsInRoom) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return clientsInRoom.has(clientId);
|
|
90
|
+
}
|
|
91
|
+
printRooms() {
|
|
92
|
+
const numRooms = this.rooms.size;
|
|
93
|
+
let logOutput = "\n-------------------------------------------------------\n";
|
|
94
|
+
logOutput += `Rooms (Count: ${numRooms}):
|
|
95
|
+
`;
|
|
96
|
+
logOutput += "-------------------------------------------------------\n";
|
|
97
|
+
if (numRooms > 0) {
|
|
98
|
+
const workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;
|
|
99
|
+
let roomNumber = 1;
|
|
100
|
+
this.rooms.forEach((clientsInRoom, room) => {
|
|
101
|
+
const numClientsInRoom = clientsInRoom.size;
|
|
102
|
+
logOutput += `Room ${roomNumber} (Name: ${room} | Clients: ${numClientsInRoom}${workerId ? ` | Worker: ${workerId}` : ""}):
|
|
103
|
+
`;
|
|
104
|
+
logOutput += " Clients:\n";
|
|
105
|
+
clientsInRoom.forEach((clientId) => {
|
|
106
|
+
const client = this.clientManager.getClient({ clientId });
|
|
107
|
+
logOutput += ` Client (ID: ${clientId} | Username: ${client?.user?.username ?? "-"} | User Type: ${client?.user?.userType ?? "-"} | Email: ${client?.user?.email ?? "-"})
|
|
108
|
+
`;
|
|
109
|
+
});
|
|
110
|
+
roomNumber++;
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
logOutput += "No rooms\n";
|
|
114
|
+
}
|
|
115
|
+
logOutput += "\n";
|
|
116
|
+
log(logOutput);
|
|
117
|
+
}
|
|
118
|
+
getRoomClients({ roomName }) {
|
|
119
|
+
const room = this.rooms.get(roomName);
|
|
120
|
+
return room ? Array.from(room) : [];
|
|
121
|
+
}
|
|
122
|
+
cleanup() {
|
|
123
|
+
this.rooms.clear();
|
|
124
|
+
log("WebSocket room manager cleaned up");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
WebSocketRoomManager as default
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=websocket-room-manager.js.map
|