atomic-queues 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +297 -382
- package/dist/cli/generators/classes.d.ts +1 -1
- package/dist/cli/generators/json-schema.d.ts +1 -1
- package/dist/cli/generators/typescript.d.ts +1 -1
- package/dist/cli/index.js +147 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cluster/cluster-discovery.service.d.ts +91 -0
- package/dist/cluster/cluster-discovery.service.d.ts.map +1 -0
- package/dist/cluster/cluster-discovery.service.js +423 -0
- package/dist/cluster/cluster-discovery.service.js.map +1 -0
- package/dist/cluster/grpc-peer-monitor.service.d.ts +31 -0
- package/dist/cluster/grpc-peer-monitor.service.d.ts.map +1 -0
- package/dist/cluster/grpc-peer-monitor.service.js +192 -0
- package/dist/cluster/grpc-peer-monitor.service.js.map +1 -0
- package/dist/cluster/index.d.ts +7 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +23 -0
- package/dist/cluster/index.js.map +1 -0
- package/dist/cluster/leader-election.service.d.ts +38 -0
- package/dist/cluster/leader-election.service.d.ts.map +1 -0
- package/dist/cluster/leader-election.service.js +184 -0
- package/dist/cluster/leader-election.service.js.map +1 -0
- package/dist/cluster/master-coordinator.d.ts +50 -0
- package/dist/cluster/master-coordinator.d.ts.map +1 -0
- package/dist/cluster/master-coordinator.js +307 -0
- package/dist/cluster/master-coordinator.js.map +1 -0
- package/dist/cluster/redis-health-monitor.service.d.ts +23 -0
- package/dist/cluster/redis-health-monitor.service.d.ts.map +1 -0
- package/dist/cluster/redis-health-monitor.service.js +100 -0
- package/dist/cluster/redis-health-monitor.service.js.map +1 -0
- package/dist/cluster/server-ring.service.d.ts +48 -0
- package/dist/cluster/server-ring.service.d.ts.map +1 -0
- package/dist/cluster/server-ring.service.js +136 -0
- package/dist/cluster/server-ring.service.js.map +1 -0
- package/dist/decorators/entity.decorators.d.ts +16 -24
- package/dist/decorators/entity.decorators.d.ts.map +1 -1
- package/dist/decorators/entity.decorators.js +0 -39
- package/dist/decorators/entity.decorators.js.map +1 -1
- package/dist/decorators/interfaces.d.ts +10 -10
- package/dist/decorators/interfaces.d.ts.map +1 -1
- package/dist/decorators/job.decorators.d.ts +4 -52
- package/dist/decorators/job.decorators.d.ts.map +1 -1
- package/dist/decorators/job.decorators.js +6 -54
- package/dist/decorators/job.decorators.js.map +1 -1
- package/dist/decorators/metadata-readers.d.ts +4 -2
- package/dist/decorators/metadata-readers.d.ts.map +1 -1
- package/dist/decorators/metadata-readers.js +2 -0
- package/dist/decorators/metadata-readers.js.map +1 -1
- package/dist/decorators/schema.decorators.d.ts +1 -1
- package/dist/decorators/schema.decorators.d.ts.map +1 -1
- package/dist/decorators/schema.decorators.js.map +1 -1
- package/dist/decorators/utils.d.ts +1 -1
- package/dist/decorators/utils.d.ts.map +1 -1
- package/dist/decorators/utils.js +5 -1
- package/dist/decorators/utils.js.map +1 -1
- package/dist/domain/interfaces/config.interfaces.d.ts +92 -29
- package/dist/domain/interfaces/config.interfaces.d.ts.map +1 -1
- package/dist/domain/interfaces/index.d.ts +1 -0
- package/dist/domain/interfaces/index.d.ts.map +1 -1
- package/dist/domain/interfaces/index.js +1 -0
- package/dist/domain/interfaces/index.js.map +1 -1
- package/dist/{services/registry → domain/interfaces}/registry.types.d.ts.map +1 -1
- package/dist/domain/interfaces/registry.types.js.map +1 -0
- package/dist/grpc/grpc-client-pool.service.d.ts +71 -0
- package/dist/grpc/grpc-client-pool.service.d.ts.map +1 -0
- package/dist/grpc/grpc-client-pool.service.js +307 -0
- package/dist/grpc/grpc-client-pool.service.js.map +1 -0
- package/dist/grpc/grpc-server.service.d.ts +47 -0
- package/dist/grpc/grpc-server.service.d.ts.map +1 -0
- package/dist/grpc/grpc-server.service.js +494 -0
- package/dist/grpc/grpc-server.service.js.map +1 -0
- package/dist/grpc/index.d.ts +3 -0
- package/dist/grpc/index.d.ts.map +1 -0
- package/dist/{services/executor-pool → grpc}/index.js +2 -1
- package/dist/grpc/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/module/atomic-queues.module.d.ts +1 -0
- package/dist/module/atomic-queues.module.d.ts.map +1 -1
- package/dist/module/atomic-queues.module.js +59 -10
- package/dist/module/atomic-queues.module.js.map +1 -1
- package/dist/services/command-discovery/command-discovery.service.js +2 -2
- package/dist/services/command-discovery/command-discovery.service.js.map +1 -1
- package/dist/services/index.d.ts +2 -8
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -8
- package/dist/services/index.js.map +1 -1
- package/dist/services/message-router/index.d.ts +2 -0
- package/dist/services/message-router/index.d.ts.map +1 -0
- package/dist/services/{actor-system → message-router}/index.js +1 -1
- package/dist/services/message-router/index.js.map +1 -0
- package/dist/services/message-router/message-router.service.d.ts +53 -0
- package/dist/services/message-router/message-router.service.d.ts.map +1 -0
- package/dist/services/message-router/message-router.service.js +519 -0
- package/dist/services/message-router/message-router.service.js.map +1 -0
- package/dist/services/queue-bus/cluster-contracts.d.ts +1 -1
- package/dist/services/queue-bus/cluster-contracts.d.ts.map +1 -1
- package/dist/services/queue-bus/cluster-contracts.js.map +1 -1
- package/dist/services/queue-bus/queue-bus.service.d.ts +3 -21
- package/dist/services/queue-bus/queue-bus.service.d.ts.map +1 -1
- package/dist/services/queue-bus/queue-bus.service.js +15 -119
- package/dist/services/queue-bus/queue-bus.service.js.map +1 -1
- package/dist/utils/id.utils.d.ts +3 -0
- package/dist/utils/id.utils.d.ts.map +1 -0
- package/dist/utils/id.utils.js +14 -0
- package/dist/utils/id.utils.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/wal/index.d.ts +4 -0
- package/dist/wal/index.d.ts.map +1 -0
- package/dist/{services/gate → wal}/index.js +3 -1
- package/dist/wal/index.js.map +1 -0
- package/dist/wal/wal.scripts.d.ts +51 -0
- package/dist/wal/wal.scripts.d.ts.map +1 -0
- package/dist/wal/wal.scripts.js +84 -0
- package/dist/wal/wal.scripts.js.map +1 -0
- package/dist/wal/wal.service.d.ts +46 -0
- package/dist/wal/wal.service.d.ts.map +1 -0
- package/dist/wal/wal.service.js +243 -0
- package/dist/wal/wal.service.js.map +1 -0
- package/dist/wal/wal.types.d.ts +23 -0
- package/dist/wal/wal.types.d.ts.map +1 -0
- package/dist/wal/wal.types.js +3 -0
- package/dist/wal/wal.types.js.map +1 -0
- package/dist/workers/consistent-hash.d.ts +97 -0
- package/dist/workers/consistent-hash.d.ts.map +1 -0
- package/dist/workers/consistent-hash.js +231 -0
- package/dist/workers/consistent-hash.js.map +1 -0
- package/dist/workers/entity-worker-manager.d.ts +35 -0
- package/dist/workers/entity-worker-manager.d.ts.map +1 -0
- package/dist/workers/entity-worker-manager.js +237 -0
- package/dist/workers/entity-worker-manager.js.map +1 -0
- package/dist/workers/entity-worker.d.ts +54 -0
- package/dist/workers/entity-worker.d.ts.map +1 -0
- package/dist/workers/entity-worker.js +142 -0
- package/dist/workers/entity-worker.js.map +1 -0
- package/dist/workers/index.d.ts +4 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/{services/log → workers}/index.js +3 -1
- package/dist/workers/index.js.map +1 -0
- package/package.json +17 -4
- package/dist/services/actor-system/actor-system.service.d.ts +0 -19
- package/dist/services/actor-system/actor-system.service.d.ts.map +0 -1
- package/dist/services/actor-system/actor-system.service.js +0 -86
- package/dist/services/actor-system/actor-system.service.js.map +0 -1
- package/dist/services/actor-system/index.d.ts +0 -2
- package/dist/services/actor-system/index.d.ts.map +0 -1
- package/dist/services/actor-system/index.js.map +0 -1
- package/dist/services/executor-pool/executor-pool.service.d.ts +0 -38
- package/dist/services/executor-pool/executor-pool.service.d.ts.map +0 -1
- package/dist/services/executor-pool/executor-pool.service.js +0 -166
- package/dist/services/executor-pool/executor-pool.service.js.map +0 -1
- package/dist/services/executor-pool/index.d.ts +0 -2
- package/dist/services/executor-pool/index.d.ts.map +0 -1
- package/dist/services/executor-pool/index.js.map +0 -1
- package/dist/services/gate/gate.service.d.ts +0 -17
- package/dist/services/gate/gate.service.d.ts.map +0 -1
- package/dist/services/gate/gate.service.js +0 -81
- package/dist/services/gate/gate.service.js.map +0 -1
- package/dist/services/gate/index.d.ts +0 -2
- package/dist/services/gate/index.d.ts.map +0 -1
- package/dist/services/gate/index.js.map +0 -1
- package/dist/services/log/index.d.ts +0 -2
- package/dist/services/log/index.d.ts.map +0 -1
- package/dist/services/log/index.js.map +0 -1
- package/dist/services/log/log.service.d.ts +0 -21
- package/dist/services/log/log.service.d.ts.map +0 -1
- package/dist/services/log/log.service.js +0 -92
- package/dist/services/log/log.service.js.map +0 -1
- package/dist/services/registry/index.d.ts +0 -4
- package/dist/services/registry/index.d.ts.map +0 -1
- package/dist/services/registry/index.js +0 -20
- package/dist/services/registry/index.js.map +0 -1
- package/dist/services/registry/registry.service.d.ts +0 -43
- package/dist/services/registry/registry.service.d.ts.map +0 -1
- package/dist/services/registry/registry.service.js +0 -367
- package/dist/services/registry/registry.service.js.map +0 -1
- package/dist/services/registry/registry.types.js.map +0 -1
- package/dist/services/registry/schema-converter.d.ts +0 -2
- package/dist/services/registry/schema-converter.d.ts.map +0 -1
- package/dist/services/registry/schema-converter.js +0 -27
- package/dist/services/registry/schema-converter.js.map +0 -1
- package/dist/services/result-collector/index.d.ts +0 -2
- package/dist/services/result-collector/index.d.ts.map +0 -1
- package/dist/services/result-collector/index.js +0 -18
- package/dist/services/result-collector/index.js.map +0 -1
- package/dist/services/result-collector/result-collector.service.d.ts +0 -17
- package/dist/services/result-collector/result-collector.service.d.ts.map +0 -1
- package/dist/services/result-collector/result-collector.service.js +0 -92
- package/dist/services/result-collector/result-collector.service.js.map +0 -1
- package/dist/services/scheduler/index.d.ts +0 -2
- package/dist/services/scheduler/index.d.ts.map +0 -1
- package/dist/services/scheduler/index.js +0 -18
- package/dist/services/scheduler/index.js.map +0 -1
- package/dist/services/scheduler/scheduler.service.d.ts +0 -17
- package/dist/services/scheduler/scheduler.service.d.ts.map +0 -1
- package/dist/services/scheduler/scheduler.service.js +0 -140
- package/dist/services/scheduler/scheduler.service.js.map +0 -1
- /package/dist/{services/registry → domain/interfaces}/registry.types.d.ts +0 -0
- /package/dist/{services/registry → domain/interfaces}/registry.types.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"master-coordinator.js","sourceRoot":"","sources":["../../src/cluster/master-coordinator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAoF;AAEpF,qDAA6D;AAC7D,kCAAyC;AACzC,uEAAkE;AAClE,2EAAmF;AACnF,+DAA0D;AASnD,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAY5B,YACgC,MAAkD,EAC/D,cAAqC,EACrC,gBAAyC,EACzC,UAA6B,EAClC,cAAgD;QAJb,WAAM,GAAN,MAAM,CAA2B;QAC/D,mBAAc,GAAd,cAAc,CAAuB;QACrC,qBAAgB,GAAhB,gBAAgB,CAAyB;QACzC,eAAU,GAAV,UAAU,CAAmB;QACjB,mBAAc,GAAd,cAAc,CAAiB;QAhB7C,WAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;QAE5C,gBAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;QAClD,gBAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAKjD,eAAU,GAAG,KAAK,CAAC;QACnB,uBAAkB,GAAqC,IAAI,CAAC;QASlE,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,OAAO,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;QACnD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,YAAY,IAAI,SAAS,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;gBAChF,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;gBAC7E,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3C,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,aAAa;IACb,4EAA4E;IAE5E,OAAO,CAAC,SAAiB;QAMvB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QACzF,CAAC;QAED,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACrC,OAAO;gBACL,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,OAAO,EAAE,UAAU,CAAC,SAAS,KAAK,IAAI,CAAC,cAAc;gBACrD,UAAU,EAAE,KAAK;gBACjB,KAAK;aACN,CAAC;QACJ,CAAC;QAED,wDAAwD;QACxD,IAAI,aAAqB,CAAC;QAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC7D,aAAa,GAAG,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE5C,OAAO;YACL,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC,cAAc;YAC9C,UAAU,EAAE,IAAI;YAChB,KAAK;SACN,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,qBAAqB,CAAC,QAAiC;QACrD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED,kBAAkB,CAAC,SAAiB,EAAE,UAAoB,EAAE,KAAa;QACvE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE;oBAC9B,SAAS;oBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;oBACtB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC9B,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+BAA+B,SAAS,KAAK,UAAU,CAAC,MAAM,cAAc,KAAK,kBAAkB,CACpG,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,mCAAmC;IACnC,4EAA4E;IAEpE,YAAY,CAAC,SAAiB,EAAE,SAAiB;QACvD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE;YAC9B,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,SAAS,MAAM,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;QAEjC,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa,CAAC,SAAiB;QACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,aAAa,CAAC,SAAiB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,4EAA4E;IAC5E,gCAAgC;IAChC,4EAA4E;IAEpE,KAAK,CAAC,sBAAsB;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;QAE3E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAE7C,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9C,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,cAAc;oBAAE,SAAS;gBAEpD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACpF,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;oBACtF,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAA+B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;wBACjF,MAA8C,CAAC,WAAW,CACzD,EAAE,EACF,EAAE,QAAQ,EAAE,EACZ,CAAC,GAAiB,EAAE,QAAiC,EAAE,EAAE;4BACvD,IAAI,GAAG;gCAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;4BAC5B,OAAO,CAAE,QAAQ,CAAC,OAAwC,IAAI,EAAE,CAAC,CAAC;wBACpE,CAAC,CACF,CAAC;oBACJ,CAAC,CAAC,CAAC;oBAEH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE;4BAChC,SAAS,EAAE,IAAI,CAAC,QAAQ;4BACxB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;4BACtB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;yBACzB,CAAC,CAAC;wBACH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAClC,cAAc,EAAE,CAAC;oBACnB,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,2BAA2B,IAAI,CAAC,QAAQ,iBAAkB,GAAa,CAAC,OAAO,2BAA2B,CAC3G,CAAC;oBACF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,6BAA6B,IAAI,CAAC,WAAW,CAAC,IAAI,cAAc,cAAc,oBAAoB,CACnG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,WAAW,CAAC,IAAI,sBAAsB,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAEO,iBAAiB,CAAC,KAAoB;QAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE/D,KAAK,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;gBACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,SAAS,iCAAiC,CAAC,CAAC;gBAExE,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACvD,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;wBACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAE7D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;QACnE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;YACtF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACzC,MAA8C,CAAC,aAAa,CAC3D;oBACE,SAAS,EAAE,IAAI,CAAC,cAAc;oBAC9B,UAAU,EAAE,OAAO;oBACnB,KAAK,EAAE,CAAC;iBACT,EACD,EAAE,QAAQ,EAAE,EACZ,CAAC,GAAiB,EAAE,QAAiC,EAAE,EAAE;oBACvD,IAAI,GAAG;wBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ;wBAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAsB,CAAC,CAAC,CAAC;oBAClF,OAAO,EAAE,CAAC;gBACZ,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,6BAA6B,aAAa,EAAE,CAAC,CAAC;QACxF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAsC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF,CAAA;AA7UY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAcR,WAAA,IAAA,eAAM,EAAC,gCAAoB,CAAC,CAAA;IAI5B,WAAA,IAAA,iBAAQ,GAAE,CAAA;6CAHsB,+CAAqB;QACnB,mDAAuB;QAC7B,uCAAiB;QACA,qBAAc;GAjBnD,iBAAiB,CA6U7B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OnModuleInit, OnApplicationShutdown } from '@nestjs/common';
|
|
2
|
+
import Redis from 'ioredis';
|
|
3
|
+
import { IAtomicQueuesModuleConfig } from '../domain';
|
|
4
|
+
export declare class RedisHealthMonitor implements OnModuleInit, OnApplicationShutdown {
|
|
5
|
+
private readonly redis;
|
|
6
|
+
private readonly config;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
private readonly enabled;
|
|
9
|
+
private readonly checkIntervalMs;
|
|
10
|
+
private readonly failureThreshold;
|
|
11
|
+
private checkTimer;
|
|
12
|
+
private consecutiveFailures;
|
|
13
|
+
private _isDegraded;
|
|
14
|
+
private readonly healthChangeListeners;
|
|
15
|
+
constructor(redis: Redis, config: IAtomicQueuesModuleConfig);
|
|
16
|
+
onModuleInit(): Promise<void>;
|
|
17
|
+
onApplicationShutdown(): Promise<void>;
|
|
18
|
+
get isDegraded(): boolean;
|
|
19
|
+
onHealthChange(listener: (healthy: boolean) => void): () => void;
|
|
20
|
+
private check;
|
|
21
|
+
private notifyListeners;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=redis-health-monitor.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-health-monitor.service.d.ts","sourceRoot":"","sources":["../../src/cluster/redis-health-monitor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAGtD,qBACa,kBAAmB,YAAW,YAAY,EAAE,qBAAqB;IAa7C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAyC;gBAG/B,KAAK,EAAE,KAAK,EACX,MAAM,EAAE,yBAAyB;IAO5E,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAc7B,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5C,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,cAAc,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;YAQlD,KAAK;IAuBnB,OAAO,CAAC,eAAe;CASxB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
var RedisHealthMonitor_1;
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.RedisHealthMonitor = void 0;
|
|
20
|
+
const common_1 = require("@nestjs/common");
|
|
21
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
22
|
+
const constants_1 = require("../services/constants");
|
|
23
|
+
let RedisHealthMonitor = RedisHealthMonitor_1 = class RedisHealthMonitor {
|
|
24
|
+
constructor(redis, config) {
|
|
25
|
+
this.redis = redis;
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.logger = new common_1.Logger(RedisHealthMonitor_1.name);
|
|
28
|
+
this.checkTimer = null;
|
|
29
|
+
this.consecutiveFailures = 0;
|
|
30
|
+
this._isDegraded = false;
|
|
31
|
+
this.healthChangeListeners = [];
|
|
32
|
+
this.enabled = config.grpc?.enabled ?? false;
|
|
33
|
+
this.checkIntervalMs = config.grpc?.redisHealthCheckMs ?? 500;
|
|
34
|
+
this.failureThreshold = config.grpc?.redisHealthFailureThreshold ?? 3;
|
|
35
|
+
}
|
|
36
|
+
async onModuleInit() {
|
|
37
|
+
if (!this.enabled)
|
|
38
|
+
return;
|
|
39
|
+
this.checkTimer = setInterval(() => {
|
|
40
|
+
this.check().catch((err) => {
|
|
41
|
+
this.logger.error(`Health check error: ${err.message}`);
|
|
42
|
+
});
|
|
43
|
+
}, this.checkIntervalMs);
|
|
44
|
+
this.logger.log(`Redis health monitor started: interval=${this.checkIntervalMs}ms, threshold=${this.failureThreshold}`);
|
|
45
|
+
}
|
|
46
|
+
async onApplicationShutdown() {
|
|
47
|
+
if (this.checkTimer) {
|
|
48
|
+
clearInterval(this.checkTimer);
|
|
49
|
+
this.checkTimer = null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
get isDegraded() {
|
|
53
|
+
return this._isDegraded;
|
|
54
|
+
}
|
|
55
|
+
onHealthChange(listener) {
|
|
56
|
+
this.healthChangeListeners.push(listener);
|
|
57
|
+
return () => {
|
|
58
|
+
const idx = this.healthChangeListeners.indexOf(listener);
|
|
59
|
+
if (idx >= 0)
|
|
60
|
+
this.healthChangeListeners.splice(idx, 1);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
async check() {
|
|
64
|
+
try {
|
|
65
|
+
await this.redis.ping();
|
|
66
|
+
this.consecutiveFailures = 0;
|
|
67
|
+
if (this._isDegraded) {
|
|
68
|
+
this._isDegraded = false;
|
|
69
|
+
this.logger.log('Redis connectivity restored');
|
|
70
|
+
this.notifyListeners(true);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
this.consecutiveFailures++;
|
|
75
|
+
if (!this._isDegraded && this.consecutiveFailures >= this.failureThreshold) {
|
|
76
|
+
this._isDegraded = true;
|
|
77
|
+
this.logger.error(`Redis unreachable after ${this.consecutiveFailures} consecutive failures — entering degraded mode`);
|
|
78
|
+
this.notifyListeners(false);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
notifyListeners(healthy) {
|
|
83
|
+
for (const listener of this.healthChangeListeners) {
|
|
84
|
+
try {
|
|
85
|
+
listener(healthy);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
this.logger.error(`Health change listener error: ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.RedisHealthMonitor = RedisHealthMonitor;
|
|
94
|
+
exports.RedisHealthMonitor = RedisHealthMonitor = RedisHealthMonitor_1 = __decorate([
|
|
95
|
+
(0, common_1.Injectable)(),
|
|
96
|
+
__param(0, (0, common_1.Inject)(constants_1.ATOMIC_QUEUES_REDIS)),
|
|
97
|
+
__param(1, (0, common_1.Inject)(constants_1.ATOMIC_QUEUES_CONFIG)),
|
|
98
|
+
__metadata("design:paramtypes", [ioredis_1.default, Object])
|
|
99
|
+
], RedisHealthMonitor);
|
|
100
|
+
//# sourceMappingURL=redis-health-monitor.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-health-monitor.service.js","sourceRoot":"","sources":["../../src/cluster/redis-health-monitor.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,2CAAiG;AACjG,sDAA4B;AAE5B,qDAAkF;AAG3E,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAY7B,YAC+B,KAA6B,EAC5B,MAAkD;QADlC,UAAK,GAAL,KAAK,CAAO;QACX,WAAM,GAAN,MAAM,CAA2B;QAbjE,WAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAKtD,eAAU,GAA0B,IAAI,CAAC;QACzC,wBAAmB,GAAG,CAAC,CAAC;QACxB,gBAAW,GAAG,KAAK,CAAC;QAEX,0BAAqB,GAAsC,EAAE,CAAC;QAM7E,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,EAAE,kBAAkB,IAAI,GAAG,CAAC;QAC9D,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,2BAA2B,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEzB,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,0CAA0C,IAAI,CAAC,eAAe,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,CACvG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,cAAc,CAAC,QAAoC;QACjD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAE7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC/C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,2BAA2B,IAAI,CAAC,mBAAmB,gDAAgD,CACpG,CAAC;gBACF,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAgB;QACtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAtFY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAcR,WAAA,IAAA,eAAM,EAAC,+BAAmB,CAAC,CAAA;IAC3B,WAAA,IAAA,eAAM,EAAC,gCAAoB,CAAC,CAAA;qCADwB,iBAAK;GAbjD,kBAAkB,CAsF9B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { IAtomicQueuesModuleConfig } from '../domain';
|
|
3
|
+
import { ClusterDiscoveryService } from './cluster-discovery.service';
|
|
4
|
+
export interface ServerRingNode {
|
|
5
|
+
serverId: string;
|
|
6
|
+
grpcAddress: string;
|
|
7
|
+
serviceGroup: string;
|
|
8
|
+
entityTypes: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Server Ring — consistent hash ring of cluster servers.
|
|
12
|
+
*
|
|
13
|
+
* Determines which server owns a given entity key.
|
|
14
|
+
* Updates automatically when cluster membership changes.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ServerRingService implements OnModuleInit {
|
|
17
|
+
private readonly config;
|
|
18
|
+
private readonly discovery;
|
|
19
|
+
private readonly logger;
|
|
20
|
+
private readonly ring;
|
|
21
|
+
private readonly enabled;
|
|
22
|
+
private readonly localServerId;
|
|
23
|
+
constructor(config: IAtomicQueuesModuleConfig, discovery: ClusterDiscoveryService);
|
|
24
|
+
onModuleInit(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Determine which server owns the given entity key.
|
|
27
|
+
* If gRPC is disabled or the entity is local, returns null (process locally).
|
|
28
|
+
*/
|
|
29
|
+
getOwner(entityType: string, entityId: string): ServerRingNode | null;
|
|
30
|
+
/**
|
|
31
|
+
* Check if the current server owns the given entity.
|
|
32
|
+
*/
|
|
33
|
+
isLocal(entityType: string, entityId: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get the local server ID.
|
|
36
|
+
*/
|
|
37
|
+
getLocalServerId(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get all server IDs in the ring.
|
|
40
|
+
*/
|
|
41
|
+
getServerIds(): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Get the number of servers in the ring.
|
|
44
|
+
*/
|
|
45
|
+
get size(): number;
|
|
46
|
+
private rebuildRing;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=server-ring.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-ring.service.d.ts","sourceRoot":"","sources":["../../src/cluster/server-ring.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,uBAAuB,EAAe,MAAM,6BAA6B,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBACa,iBAAkB,YAAW,YAAY;IAOpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+C;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAGU,MAAM,EAAE,yBAAyB,EAC/D,SAAS,EAAE,uBAAuB;IAM/C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBnC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAgBrE;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAStD;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAMD,OAAO,CAAC,WAAW;CA8BpB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var ServerRingService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.ServerRingService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const consistent_hash_1 = require("../workers/consistent-hash");
|
|
19
|
+
const constants_1 = require("../services/constants");
|
|
20
|
+
const cluster_discovery_service_1 = require("./cluster-discovery.service");
|
|
21
|
+
/**
|
|
22
|
+
* Server Ring — consistent hash ring of cluster servers.
|
|
23
|
+
*
|
|
24
|
+
* Determines which server owns a given entity key.
|
|
25
|
+
* Updates automatically when cluster membership changes.
|
|
26
|
+
*/
|
|
27
|
+
let ServerRingService = ServerRingService_1 = class ServerRingService {
|
|
28
|
+
constructor(config, discovery) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.discovery = discovery;
|
|
31
|
+
this.logger = new common_1.Logger(ServerRingService_1.name);
|
|
32
|
+
this.ring = new consistent_hash_1.ConsistentHashRing(150);
|
|
33
|
+
this.enabled = config.grpc?.enabled ?? false;
|
|
34
|
+
this.localServerId = config.grpc?.serverId ?? 'unknown';
|
|
35
|
+
}
|
|
36
|
+
async onModuleInit() {
|
|
37
|
+
if (!this.enabled)
|
|
38
|
+
return;
|
|
39
|
+
// Load initial ring state
|
|
40
|
+
const nodes = await this.discovery.getNodes();
|
|
41
|
+
this.rebuildRing(nodes);
|
|
42
|
+
// Listen for ring changes
|
|
43
|
+
this.discovery.onRingChange((updatedNodes) => {
|
|
44
|
+
this.rebuildRing(updatedNodes);
|
|
45
|
+
});
|
|
46
|
+
this.logger.log(`Server ring initialized with ${this.ring.size} nodes`);
|
|
47
|
+
}
|
|
48
|
+
// =========================================================================
|
|
49
|
+
// PUBLIC API
|
|
50
|
+
// =========================================================================
|
|
51
|
+
/**
|
|
52
|
+
* Determine which server owns the given entity key.
|
|
53
|
+
* If gRPC is disabled or the entity is local, returns null (process locally).
|
|
54
|
+
*/
|
|
55
|
+
getOwner(entityType, entityId) {
|
|
56
|
+
if (!this.enabled)
|
|
57
|
+
return null;
|
|
58
|
+
if (this.ring.size === 0)
|
|
59
|
+
return null;
|
|
60
|
+
const entityKey = `${entityType}:${entityId}`;
|
|
61
|
+
// Use filtered lookup: only consider servers that handle this entity type
|
|
62
|
+
const owner = this.ring.getNodeFiltered(entityKey, (node) => {
|
|
63
|
+
// If the node has no entity types declared, it accepts all
|
|
64
|
+
if (node.data.entityTypes.length === 0)
|
|
65
|
+
return true;
|
|
66
|
+
return node.data.entityTypes.includes(entityType);
|
|
67
|
+
});
|
|
68
|
+
return owner?.data ?? null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if the current server owns the given entity.
|
|
72
|
+
*/
|
|
73
|
+
isLocal(entityType, entityId) {
|
|
74
|
+
if (!this.enabled)
|
|
75
|
+
return true; // Single-server mode: everything is local
|
|
76
|
+
const owner = this.getOwner(entityType, entityId);
|
|
77
|
+
if (!owner)
|
|
78
|
+
return true; // No owner found, process locally
|
|
79
|
+
return owner.serverId === this.localServerId;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the local server ID.
|
|
83
|
+
*/
|
|
84
|
+
getLocalServerId() {
|
|
85
|
+
return this.localServerId;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get all server IDs in the ring.
|
|
89
|
+
*/
|
|
90
|
+
getServerIds() {
|
|
91
|
+
return this.ring.getNodeIds();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the number of servers in the ring.
|
|
95
|
+
*/
|
|
96
|
+
get size() {
|
|
97
|
+
return this.ring.size;
|
|
98
|
+
}
|
|
99
|
+
// =========================================================================
|
|
100
|
+
// INTERNAL
|
|
101
|
+
// =========================================================================
|
|
102
|
+
rebuildRing(nodes) {
|
|
103
|
+
const currentIds = new Set(this.ring.getNodeIds());
|
|
104
|
+
const newIds = new Set(nodes.map((n) => n.serverId));
|
|
105
|
+
// Remove nodes that left
|
|
106
|
+
for (const id of currentIds) {
|
|
107
|
+
if (!newIds.has(id)) {
|
|
108
|
+
this.ring.removeNode(id);
|
|
109
|
+
this.logger.log(`Removed server ${id} from ring`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Add/update nodes
|
|
113
|
+
for (const node of nodes) {
|
|
114
|
+
const ringNode = {
|
|
115
|
+
id: node.serverId,
|
|
116
|
+
data: {
|
|
117
|
+
serverId: node.serverId,
|
|
118
|
+
grpcAddress: node.grpcAddress,
|
|
119
|
+
serviceGroup: node.serviceGroup,
|
|
120
|
+
entityTypes: node.entityTypes,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
if (!currentIds.has(node.serverId)) {
|
|
124
|
+
this.ring.addNode(ringNode);
|
|
125
|
+
this.logger.log(`Added server ${node.serverId} to ring`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
exports.ServerRingService = ServerRingService;
|
|
131
|
+
exports.ServerRingService = ServerRingService = ServerRingService_1 = __decorate([
|
|
132
|
+
(0, common_1.Injectable)(),
|
|
133
|
+
__param(0, (0, common_1.Inject)(constants_1.ATOMIC_QUEUES_CONFIG)),
|
|
134
|
+
__metadata("design:paramtypes", [Object, cluster_discovery_service_1.ClusterDiscoveryService])
|
|
135
|
+
], ServerRingService);
|
|
136
|
+
//# sourceMappingURL=server-ring.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-ring.service.js","sourceRoot":"","sources":["../../src/cluster/server-ring.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,36 +53,28 @@ export declare const EntityId: typeof QueueEntityId;
|
|
|
53
53
|
/**
|
|
54
54
|
* @QueueEntity decorator
|
|
55
55
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
56
|
+
* Sets the entity type for queue routing. Use with `@QueueEntityId()` on the
|
|
57
|
+
* constructor parameter that holds the entity ID.
|
|
58
58
|
*
|
|
59
|
-
* @param entityType - The entity type for routing (e.g., '
|
|
60
|
-
* @param entityIdProperty - Optional property name containing the entity ID.
|
|
61
|
-
* If omitted, uses module-level defaultEntityId from entities config.
|
|
59
|
+
* @param entityType - The entity type for routing (e.g., 'order', 'account')
|
|
62
60
|
*
|
|
63
61
|
* @example
|
|
64
|
-
*
|
|
65
|
-
* @QueueEntity('
|
|
66
|
-
* export class
|
|
67
|
-
* constructor(
|
|
68
|
-
* public readonly tableId: string, // <- unchanged!
|
|
69
|
-
* public readonly amount: number,
|
|
70
|
-
* ) {}
|
|
71
|
-
* }
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* // Using module default (entities config has defaultEntityId: 'tableId'):
|
|
75
|
-
* @QueueEntity('table')
|
|
76
|
-
* export class DealCommand {
|
|
62
|
+
* ```typescript
|
|
63
|
+
* @QueueEntity('order')
|
|
64
|
+
* export class PlaceOrderCommand {
|
|
77
65
|
* constructor(
|
|
78
|
-
* public readonly
|
|
79
|
-
* public readonly
|
|
66
|
+
* @QueueEntityId() public readonly orderId: string,
|
|
67
|
+
* public readonly quantity: number,
|
|
80
68
|
* ) {}
|
|
81
69
|
* }
|
|
82
70
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
|
|
71
|
+
* await queueBus.enqueue(new PlaceOrderCommand(orderId, 100));
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function QueueEntity(entityType: string): ClassDecorator;
|
|
75
|
+
/**
|
|
76
|
+
* @deprecated The two-argument form `@QueueEntity('type', 'idProp')` is deprecated.
|
|
77
|
+
* Use `@QueueEntity('type')` + `@QueueEntityId()` on the parameter instead.
|
|
86
78
|
*/
|
|
87
|
-
export declare function QueueEntity(entityType: string, entityIdProperty
|
|
79
|
+
export declare function QueueEntity(entityType: string, entityIdProperty: string): ClassDecorator;
|
|
88
80
|
//# sourceMappingURL=entity.decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.decorators.d.ts","sourceRoot":"","sources":["../../src/decorators/entity.decorators.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAI7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,IAAI,iBAAiB,GAAG,kBAAkB,CAiDtE;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,sBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"entity.decorators.d.ts","sourceRoot":"","sources":["../../src/decorators/entity.decorators.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAI7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,IAAI,iBAAiB,GAAG,kBAAkB,CAiDtE;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,sBAAgB,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAAC;AAChE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,cAAc,CAAC"}
|
|
@@ -100,48 +100,9 @@ function QueueEntityId() {
|
|
|
100
100
|
* @deprecated Use @QueueEntityId() instead. This alias is provided for backwards compatibility.
|
|
101
101
|
*/
|
|
102
102
|
exports.EntityId = QueueEntityId;
|
|
103
|
-
// =============================================================================
|
|
104
|
-
// NEW COMBINED DECORATOR - Less Invasive
|
|
105
|
-
// =============================================================================
|
|
106
|
-
/**
|
|
107
|
-
* @QueueEntity decorator
|
|
108
|
-
*
|
|
109
|
-
* Single decorator that combines @EntityType and @QueueEntityId into one.
|
|
110
|
-
* This is the recommended way to mark commands/queries for queue routing.
|
|
111
|
-
*
|
|
112
|
-
* @param entityType - The entity type for routing (e.g., 'table', 'account')
|
|
113
|
-
* @param entityIdProperty - Optional property name containing the entity ID.
|
|
114
|
-
* If omitted, uses module-level defaultEntityId from entities config.
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* // With explicit property name:
|
|
118
|
-
* @QueueEntity('table', 'tableId')
|
|
119
|
-
* export class MakeBetCommand {
|
|
120
|
-
* constructor(
|
|
121
|
-
* public readonly tableId: string, // <- unchanged!
|
|
122
|
-
* public readonly amount: number,
|
|
123
|
-
* ) {}
|
|
124
|
-
* }
|
|
125
|
-
*
|
|
126
|
-
* @example
|
|
127
|
-
* // Using module default (entities config has defaultEntityId: 'tableId'):
|
|
128
|
-
* @QueueEntity('table')
|
|
129
|
-
* export class DealCommand {
|
|
130
|
-
* constructor(
|
|
131
|
-
* public readonly tableId: string,
|
|
132
|
-
* public readonly card: string,
|
|
133
|
-
* ) {}
|
|
134
|
-
* }
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* // Then just enqueue directly:
|
|
138
|
-
* await queueBus.enqueue(new MakeBetCommand(tableId, 100));
|
|
139
|
-
*/
|
|
140
103
|
function QueueEntity(entityType, entityIdProperty) {
|
|
141
104
|
return (target) => {
|
|
142
|
-
// Always set entity type
|
|
143
105
|
Reflect.defineMetadata(constants_1.ENTITY_TYPE_METADATA, entityType, target);
|
|
144
|
-
// Set entity ID property if provided (otherwise falls back to module config)
|
|
145
106
|
if (entityIdProperty) {
|
|
146
107
|
Reflect.defineMetadata(constants_1.ENTITY_ID_METADATA, entityIdProperty, target);
|
|
147
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.decorators.js","sourceRoot":"","sources":["../../src/decorators/entity.decorators.ts"],"names":[],"mappings":";;;AAuBA,gCAIC;AA6BD,sCAiDC;
|
|
1
|
+
{"version":3,"file":"entity.decorators.js","sourceRoot":"","sources":["../../src/decorators/entity.decorators.ts"],"names":[],"mappings":";;;AAuBA,gCAIC;AA6BD,sCAiDC;AAkCD,kCAQC;AAnJD,2CAAuE;AACvE,yCAAmD;AACnD,mCAAkD;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,UAAU,CAAC,UAAkB;IAC3C,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,OAAO,CAAC,cAAc,CAAC,gCAAoB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,aAAa;IAC3B,OAAO,CAAC,MAAc,EAAE,WAAwC,EAAE,cAAuB,EAAE,EAAE;QAC3F,kDAAkD;QAClD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,MAAkB,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;YAEnC,0CAA0C;YAC1C,MAAM,SAAS,GAAG,IAAA,+BAAuB,EAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACvE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,4CAA4C,cAAc,OAAO,SAAS,IAAI;oBAC5E,yDAAyD,CAC5D,CAAC;YACJ,CAAC;YAED,sBAAsB;YACtB,MAAM,QAAQ,GAAG,gCAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,2CAA2C,SAAS,IAAI;oBACtD,aAAa,QAAQ,UAAU,SAAS,KAAK;oBAC7C,mDAAmD,CACtD,CAAC;YACJ,CAAC;YAED,gCAAqB,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAClD,OAAO,CAAC,cAAc,CAAC,8BAAkB,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,8CAA8C;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAErC,mDAAmD;QACnD,MAAM,QAAQ,GAAG,gCAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,2CAA2C,SAAS,IAAI;gBACtD,aAAa,QAAQ,UAAU,QAAQ,KAAK;gBAC5C,yCAAyC,CAC5C,CAAC;QACJ,CAAC;QAED,gCAAqB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO,CAAC,cAAc,CAAC,8BAAkB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACU,QAAA,QAAQ,GAAG,aAAa,CAAC;AA6BtC,SAAgB,WAAW,CAAC,UAAkB,EAAE,gBAAyB;IACvE,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,OAAO,CAAC,cAAc,CAAC,gCAAoB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAEjE,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,CAAC,cAAc,CAAC,8BAAkB,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @deprecated `@JobCommand` is deprecated. Use `@EntityType` + `@QueueEntityId` with `@CommandHandler`.
|
|
3
3
|
*/
|
|
4
4
|
export interface JobCommandOptions {
|
|
5
5
|
/** Job name (defaults to kebab-case of class name without 'Command' suffix) */
|
|
@@ -8,9 +8,11 @@ export interface JobCommandOptions {
|
|
|
8
8
|
entityType?: string;
|
|
9
9
|
/** Which constructor parameter is the entityId (default: 0 = first param) */
|
|
10
10
|
entityIdParam?: number | string;
|
|
11
|
+
/** Explicit parameter names — use when builds minify constructor argument names */
|
|
12
|
+
params?: string[];
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
15
|
+
* @deprecated `@JobQuery` is deprecated. Use `@EntityType` + `@QueueEntityId` with `@QueryHandler`.
|
|
14
16
|
*/
|
|
15
17
|
export interface JobQueryOptions {
|
|
16
18
|
/** Job name (defaults to kebab-case of class name without 'Query' suffix) */
|
|
@@ -19,10 +21,10 @@ export interface JobQueryOptions {
|
|
|
19
21
|
entityType?: string;
|
|
20
22
|
/** Which constructor parameter is the entityId (default: 0 = first param) */
|
|
21
23
|
entityIdParam?: number | string;
|
|
24
|
+
/** Explicit parameter names — use when builds minify constructor argument names */
|
|
25
|
+
params?: string[];
|
|
22
26
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Stored job command metadata
|
|
25
|
-
*/
|
|
27
|
+
/** @deprecated Part of the deprecated `@JobCommand` API. */
|
|
26
28
|
export interface JobCommandMetadata {
|
|
27
29
|
jobName: string;
|
|
28
30
|
entityType?: string;
|
|
@@ -30,9 +32,7 @@ export interface JobCommandMetadata {
|
|
|
30
32
|
targetClass: Function;
|
|
31
33
|
paramNames: string[];
|
|
32
34
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Stored job query metadata
|
|
35
|
-
*/
|
|
35
|
+
/** @deprecated Part of the deprecated `@JobQuery` API. */
|
|
36
36
|
export interface JobQueryMetadata {
|
|
37
37
|
jobName: string;
|
|
38
38
|
entityType?: string;
|
|
@@ -45,8 +45,8 @@ export interface JobQueryMetadata {
|
|
|
45
45
|
*/
|
|
46
46
|
export interface SchemaDecoratorOptions {
|
|
47
47
|
/** The Zod schema for the message payload */
|
|
48
|
-
schema:
|
|
48
|
+
schema: unknown;
|
|
49
49
|
/** Optional reply schema (for queries) */
|
|
50
|
-
replySchema?:
|
|
50
|
+
replySchema?: unknown;
|
|
51
51
|
}
|
|
52
52
|
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/decorators/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/decorators/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,WAAW,EAAE,QAAQ,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,WAAW,EAAE,QAAQ,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,MAAM,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
|
|
@@ -1,60 +1,12 @@
|
|
|
1
1
|
import { JobCommandOptions, JobQueryOptions } from './interfaces';
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
4
|
-
*
|
|
5
|
-
* Marks a command class for automatic job routing. When a job with the
|
|
6
|
-
* specified name arrives, the library will automatically instantiate
|
|
7
|
-
* the command with entityId + job.data and execute it via CommandBus.
|
|
8
|
-
*
|
|
9
|
-
* This eliminates the need for @JobHandler boilerplate in processors.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* // Option 1: Explicit job name
|
|
14
|
-
* @JobCommand('make-bet')
|
|
15
|
-
* export class MakeBetCommand {
|
|
16
|
-
* constructor(
|
|
17
|
-
* public readonly tableId: string, // entityId (first param)
|
|
18
|
-
* public readonly playerId: string,
|
|
19
|
-
* public readonly amount: number,
|
|
20
|
-
* ) {}
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* // Option 2: Auto-derived job name (MakeBetCommand -> 'make-bet')
|
|
24
|
-
* @JobCommand()
|
|
25
|
-
* export class MakeBetCommand { ... }
|
|
26
|
-
*
|
|
27
|
-
* // Option 3: With options
|
|
28
|
-
* @JobCommand({
|
|
29
|
-
* name: 'place-bet',
|
|
30
|
-
* entityType: 'table',
|
|
31
|
-
* entityIdParam: 'tableId', // or 0 for first param
|
|
32
|
-
* })
|
|
33
|
-
* export class PlaceBetCommand { ... }
|
|
34
|
-
* ```
|
|
3
|
+
* @deprecated Use `@EntityType` + `@QueueEntityId` (or `@QueueEntity`) with standard `@nestjs/cqrs`
|
|
4
|
+
* `@CommandHandler` instead. This decorator will be removed in a future major version.
|
|
35
5
|
*/
|
|
36
6
|
export declare function JobCommand(options?: string | JobCommandOptions): ClassDecorator;
|
|
37
7
|
/**
|
|
38
|
-
* @
|
|
39
|
-
*
|
|
40
|
-
* Marks a query class for automatic job routing. When a job with the
|
|
41
|
-
* specified name arrives, the library will automatically instantiate
|
|
42
|
-
* the query with entityId + job.data and execute it via QueryBus.
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```typescript
|
|
46
|
-
* @JobQuery('get-score')
|
|
47
|
-
* export class GetScoreQuery {
|
|
48
|
-
* constructor(
|
|
49
|
-
* public readonly tableId: string,
|
|
50
|
-
* public readonly seatIndex: number,
|
|
51
|
-
* ) {}
|
|
52
|
-
* }
|
|
53
|
-
*
|
|
54
|
-
* // Auto-derived: GetTableStateQuery -> 'get-table-state'
|
|
55
|
-
* @JobQuery()
|
|
56
|
-
* export class GetTableStateQuery { ... }
|
|
57
|
-
* ```
|
|
8
|
+
* @deprecated Use `@EntityType` + `@QueueEntityId` (or `@QueueEntity`) with standard `@nestjs/cqrs`
|
|
9
|
+
* `@QueryHandler` instead. This decorator will be removed in a future major version.
|
|
58
10
|
*/
|
|
59
11
|
export declare function JobQuery(options?: string | JobQueryOptions): ClassDecorator;
|
|
60
12
|
//# sourceMappingURL=job.decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job.decorators.d.ts","sourceRoot":"","sources":["../../src/decorators/job.decorators.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAGhB,MAAM,cAAc,CAAC;AAGtB
|
|
1
|
+
{"version":3,"file":"job.decorators.d.ts","sourceRoot":"","sources":["../../src/decorators/job.decorators.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,EAGhB,MAAM,cAAc,CAAC;AAGtB;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,cAAc,CAiB/E;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,cAAc,CAiB3E"}
|