pp-command-bus 1.5.0 → 2.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.
Files changed (193) hide show
  1. package/README.md +400 -1219
  2. package/dist/command-bus/command-bus.spec.js +138 -359
  3. package/dist/command-bus/command-bus.spec.js.map +1 -1
  4. package/dist/command-bus/command.d.ts +3 -4
  5. package/dist/command-bus/command.js +3 -32
  6. package/dist/command-bus/command.js.map +1 -1
  7. package/dist/command-bus/config/command-bus-config.d.ts +75 -21
  8. package/dist/command-bus/config/command-bus-config.js +99 -58
  9. package/dist/command-bus/config/command-bus-config.js.map +1 -1
  10. package/dist/command-bus/config/command-bus-config.spec.js +174 -100
  11. package/dist/command-bus/config/command-bus-config.spec.js.map +1 -1
  12. package/dist/command-bus/index.d.ts +39 -52
  13. package/dist/command-bus/index.js +133 -126
  14. package/dist/command-bus/index.js.map +1 -1
  15. package/dist/command-bus/logging/command-logger.d.ts +2 -0
  16. package/dist/command-bus/logging/command-logger.js +7 -0
  17. package/dist/command-bus/logging/command-logger.js.map +1 -1
  18. package/dist/command-bus/logging/command-logger.spec.js +36 -0
  19. package/dist/command-bus/logging/command-logger.spec.js.map +1 -1
  20. package/dist/command-bus/serialization/index.d.ts +6 -0
  21. package/dist/command-bus/serialization/index.js +9 -0
  22. package/dist/command-bus/serialization/index.js.map +1 -0
  23. package/dist/command-bus/serialization/msgpack-serializer.d.ts +26 -0
  24. package/dist/command-bus/serialization/msgpack-serializer.js +70 -0
  25. package/dist/command-bus/serialization/msgpack-serializer.js.map +1 -0
  26. package/dist/command-bus/serialization/msgpack-serializer.spec.js +223 -0
  27. package/dist/command-bus/serialization/msgpack-serializer.spec.js.map +1 -0
  28. package/dist/command-bus/serialization/serializer.interface.d.ts +21 -0
  29. package/dist/command-bus/serialization/serializer.interface.js +3 -0
  30. package/dist/command-bus/serialization/serializer.interface.js.map +1 -0
  31. package/dist/command-bus/transport/consumer-loop.d.ts +45 -0
  32. package/dist/command-bus/transport/consumer-loop.js +90 -0
  33. package/dist/command-bus/transport/consumer-loop.js.map +1 -0
  34. package/dist/command-bus/transport/consumer-loop.spec.js +216 -0
  35. package/dist/command-bus/transport/consumer-loop.spec.js.map +1 -0
  36. package/dist/command-bus/transport/index.d.ts +21 -0
  37. package/dist/command-bus/transport/index.js +23 -0
  38. package/dist/command-bus/transport/index.js.map +1 -0
  39. package/dist/command-bus/transport/message-processor.d.ts +59 -0
  40. package/dist/command-bus/transport/message-processor.js +111 -0
  41. package/dist/command-bus/transport/message-processor.js.map +1 -0
  42. package/dist/command-bus/transport/message-processor.spec.js +185 -0
  43. package/dist/command-bus/transport/message-processor.spec.js.map +1 -0
  44. package/dist/command-bus/transport/pending-recovery.d.ts +54 -0
  45. package/dist/command-bus/transport/pending-recovery.js +139 -0
  46. package/dist/command-bus/transport/pending-recovery.js.map +1 -0
  47. package/dist/command-bus/transport/pending-recovery.spec.js +176 -0
  48. package/dist/command-bus/transport/pending-recovery.spec.js.map +1 -0
  49. package/dist/command-bus/transport/redis-codec.d.ts +24 -0
  50. package/dist/command-bus/transport/redis-codec.js +33 -0
  51. package/dist/command-bus/transport/redis-codec.js.map +1 -0
  52. package/dist/command-bus/transport/redis-codec.spec.js +53 -0
  53. package/dist/command-bus/transport/redis-codec.spec.js.map +1 -0
  54. package/dist/command-bus/transport/redis-streams-transport.d.ts +91 -0
  55. package/dist/command-bus/transport/redis-streams-transport.js +134 -0
  56. package/dist/command-bus/transport/redis-streams-transport.js.map +1 -0
  57. package/dist/command-bus/transport/redis-streams-transport.spec.js +420 -0
  58. package/dist/command-bus/transport/redis-streams-transport.spec.js.map +1 -0
  59. package/dist/command-bus/transport/rpc-handler.d.ts +39 -0
  60. package/dist/command-bus/transport/rpc-handler.js +87 -0
  61. package/dist/command-bus/transport/rpc-handler.js.map +1 -0
  62. package/dist/command-bus/transport/rpc-handler.spec.js +157 -0
  63. package/dist/command-bus/transport/rpc-handler.spec.js.map +1 -0
  64. package/dist/command-bus/transport/stream-consumer.d.ts +89 -0
  65. package/dist/command-bus/transport/stream-consumer.js +181 -0
  66. package/dist/command-bus/transport/stream-consumer.js.map +1 -0
  67. package/dist/command-bus/transport/stream-consumer.spec.js +284 -0
  68. package/dist/command-bus/transport/stream-consumer.spec.js.map +1 -0
  69. package/dist/command-bus/transport/stream-producer.d.ts +23 -0
  70. package/dist/command-bus/transport/stream-producer.js +70 -0
  71. package/dist/command-bus/transport/stream-producer.js.map +1 -0
  72. package/dist/command-bus/transport/stream-producer.spec.js +125 -0
  73. package/dist/command-bus/transport/stream-producer.spec.js.map +1 -0
  74. package/dist/command-bus/transport/transport.interface.d.ts +87 -0
  75. package/dist/command-bus/transport/transport.interface.js +3 -0
  76. package/dist/command-bus/transport/transport.interface.js.map +1 -0
  77. package/dist/command-bus/types/index.d.ts +0 -84
  78. package/dist/examples/rpc.demo.js +1 -1
  79. package/dist/examples/rpc.demo.js.map +1 -1
  80. package/dist/index.d.ts +8 -5
  81. package/dist/index.js +6 -4
  82. package/dist/index.js.map +1 -1
  83. package/dist/pp-command-bus-2.0.0.tgz +0 -0
  84. package/dist/shared/redis/connection-pool.d.ts +54 -0
  85. package/dist/shared/redis/connection-pool.js +117 -0
  86. package/dist/shared/redis/connection-pool.js.map +1 -0
  87. package/dist/shared/redis/connection-pool.spec.js +114 -0
  88. package/dist/shared/redis/connection-pool.spec.js.map +1 -0
  89. package/dist/shared/redis/index.d.ts +5 -3
  90. package/dist/shared/redis/index.js +6 -4
  91. package/dist/shared/redis/index.js.map +1 -1
  92. package/dist/shared/redis/rpc-connection-pool.d.ts +61 -0
  93. package/dist/shared/redis/rpc-connection-pool.js +154 -0
  94. package/dist/shared/redis/rpc-connection-pool.js.map +1 -0
  95. package/dist/shared/redis/rpc-connection-pool.spec.d.ts +1 -0
  96. package/dist/shared/redis/rpc-connection-pool.spec.js +173 -0
  97. package/dist/shared/redis/rpc-connection-pool.spec.js.map +1 -0
  98. package/dist/shared/types.d.ts +0 -4
  99. package/dist/shared/utils/error-utils.d.ts +8 -0
  100. package/dist/shared/utils/error-utils.js +14 -0
  101. package/dist/shared/utils/error-utils.js.map +1 -0
  102. package/package.json +12 -12
  103. package/dist/command-bus/config/auto-config-optimizer.d.ts +0 -35
  104. package/dist/command-bus/config/auto-config-optimizer.js +0 -52
  105. package/dist/command-bus/config/auto-config-optimizer.js.map +0 -1
  106. package/dist/command-bus/config/auto-config-optimizer.spec.js +0 -42
  107. package/dist/command-bus/config/auto-config-optimizer.spec.js.map +0 -1
  108. package/dist/command-bus/job/index.d.ts +0 -6
  109. package/dist/command-bus/job/index.js +0 -15
  110. package/dist/command-bus/job/index.js.map +0 -1
  111. package/dist/command-bus/job/job-options-builder.d.ts +0 -21
  112. package/dist/command-bus/job/job-options-builder.js +0 -58
  113. package/dist/command-bus/job/job-options-builder.js.map +0 -1
  114. package/dist/command-bus/job/job-options-builder.spec.js +0 -156
  115. package/dist/command-bus/job/job-options-builder.spec.js.map +0 -1
  116. package/dist/command-bus/job/job-processor.d.ts +0 -39
  117. package/dist/command-bus/job/job-processor.js +0 -203
  118. package/dist/command-bus/job/job-processor.js.map +0 -1
  119. package/dist/command-bus/job/job-processor.spec.js +0 -436
  120. package/dist/command-bus/job/job-processor.spec.js.map +0 -1
  121. package/dist/command-bus/queue/index.d.ts +0 -5
  122. package/dist/command-bus/queue/index.js +0 -13
  123. package/dist/command-bus/queue/index.js.map +0 -1
  124. package/dist/command-bus/queue/queue-manager.d.ts +0 -56
  125. package/dist/command-bus/queue/queue-manager.js +0 -163
  126. package/dist/command-bus/queue/queue-manager.js.map +0 -1
  127. package/dist/command-bus/queue/queue-manager.spec.js +0 -371
  128. package/dist/command-bus/queue/queue-manager.spec.js.map +0 -1
  129. package/dist/command-bus/rpc/index.d.ts +0 -11
  130. package/dist/command-bus/rpc/index.js +0 -19
  131. package/dist/command-bus/rpc/index.js.map +0 -1
  132. package/dist/command-bus/rpc/payload-compression.service.d.ts +0 -50
  133. package/dist/command-bus/rpc/payload-compression.service.js +0 -215
  134. package/dist/command-bus/rpc/payload-compression.service.js.map +0 -1
  135. package/dist/command-bus/rpc/payload-compression.service.spec.js +0 -376
  136. package/dist/command-bus/rpc/payload-compression.service.spec.js.map +0 -1
  137. package/dist/command-bus/rpc/rpc-coordinator.d.ts +0 -96
  138. package/dist/command-bus/rpc/rpc-coordinator.js +0 -500
  139. package/dist/command-bus/rpc/rpc-coordinator.js.map +0 -1
  140. package/dist/command-bus/rpc/rpc-coordinator.spec.js +0 -621
  141. package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +0 -1
  142. package/dist/command-bus/rpc/rpc-job-cancellation.service.d.ts +0 -82
  143. package/dist/command-bus/rpc/rpc-job-cancellation.service.js +0 -180
  144. package/dist/command-bus/rpc/rpc-job-cancellation.service.js.map +0 -1
  145. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js +0 -286
  146. package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js.map +0 -1
  147. package/dist/command-bus/worker/index.d.ts +0 -10
  148. package/dist/command-bus/worker/index.js +0 -19
  149. package/dist/command-bus/worker/index.js.map +0 -1
  150. package/dist/command-bus/worker/worker-benchmark.d.ts +0 -71
  151. package/dist/command-bus/worker/worker-benchmark.js +0 -202
  152. package/dist/command-bus/worker/worker-benchmark.js.map +0 -1
  153. package/dist/command-bus/worker/worker-benchmark.spec.js +0 -310
  154. package/dist/command-bus/worker/worker-benchmark.spec.js.map +0 -1
  155. package/dist/command-bus/worker/worker-metrics-collector.d.ts +0 -98
  156. package/dist/command-bus/worker/worker-metrics-collector.js +0 -242
  157. package/dist/command-bus/worker/worker-metrics-collector.js.map +0 -1
  158. package/dist/command-bus/worker/worker-orchestrator.d.ts +0 -70
  159. package/dist/command-bus/worker/worker-orchestrator.js +0 -339
  160. package/dist/command-bus/worker/worker-orchestrator.js.map +0 -1
  161. package/dist/command-bus/worker/worker-orchestrator.spec.js +0 -712
  162. package/dist/command-bus/worker/worker-orchestrator.spec.js.map +0 -1
  163. package/dist/examples/auto-config.demo.d.ts +0 -9
  164. package/dist/examples/auto-config.demo.js +0 -106
  165. package/dist/examples/auto-config.demo.js.map +0 -1
  166. package/dist/examples/rpc-compression.demo.d.ts +0 -5
  167. package/dist/examples/rpc-compression.demo.js +0 -358
  168. package/dist/examples/rpc-compression.demo.js.map +0 -1
  169. package/dist/examples/rpc-resilience.demo.d.ts +0 -15
  170. package/dist/examples/rpc-resilience.demo.js +0 -233
  171. package/dist/examples/rpc-resilience.demo.js.map +0 -1
  172. package/dist/pp-command-bus-1.5.0.tgz +0 -0
  173. package/dist/shared/config/base-config.d.ts +0 -54
  174. package/dist/shared/config/base-config.js +0 -114
  175. package/dist/shared/config/base-config.js.map +0 -1
  176. package/dist/shared/config/base-config.spec.js +0 -204
  177. package/dist/shared/config/base-config.spec.js.map +0 -1
  178. package/dist/shared/config/index.d.ts +0 -1
  179. package/dist/shared/config/index.js +0 -9
  180. package/dist/shared/config/index.js.map +0 -1
  181. package/dist/shared/redis/redis-connection-factory.d.ts +0 -66
  182. package/dist/shared/redis/redis-connection-factory.js +0 -113
  183. package/dist/shared/redis/redis-connection-factory.js.map +0 -1
  184. /package/dist/command-bus/{config/auto-config-optimizer.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
  185. /package/dist/command-bus/{job/job-options-builder.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
  186. /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
  187. /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
  188. /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
  189. /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
  190. /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
  191. /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
  192. /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-producer.spec.d.ts} +0 -0
  193. /package/dist/shared/{config/base-config.spec.d.ts → redis/connection-pool.spec.d.ts} +0 -0
@@ -1,66 +0,0 @@
1
- /**
2
- * Fabryka połączeń Redis z wbudowaną obsługą błędów i eventów
3
- * Zgodna z SRP - odpowiada tylko za tworzenie i konfigurację połączeń
4
- */
5
- import { Redis } from 'ioredis';
6
- import type { ILogger } from '../types';
7
- /**
8
- * Opcje połączenia Redis kompatybilne z ioredis
9
- * BullMQ ConnectionOptions są kompatybilne z podstawowymi opcjami ioredis
10
- */
11
- export interface RedisConnectionOptions {
12
- host?: string;
13
- port?: number;
14
- username?: string;
15
- password?: string;
16
- db?: number;
17
- maxRetriesPerRequest?: number | null;
18
- /**
19
- * Strategia ponownych prób połączenia
20
- * Zwraca opóźnienie w ms lub null aby przerwać reconnect
21
- */
22
- retryStrategy?: (times: number) => number | null;
23
- }
24
- /**
25
- * Fabryka połączeń Redis
26
- *
27
- * Zapewnia:
28
- * - Tworzenie połączeń z pełną obsługą eventów (error, close, reconnecting, connect)
29
- * - Poprawne formatowanie błędów (w tym AggregateError)
30
- * - Logowanie stanu połączenia
31
- * - Wariant dla workerów BullMQ (maxRetriesPerRequest: null)
32
- *
33
- * @example
34
- * const factory = new RedisConnectionFactory(logger);
35
- * const connection = factory.create(options, 'QueueManager');
36
- * const workerConnection = factory.createForWorker(options, 'Worker');
37
- */
38
- export default class RedisConnectionFactory {
39
- private readonly logger;
40
- constructor(logger: ILogger);
41
- /**
42
- * Tworzy połączenie Redis z pełną obsługą eventów
43
- *
44
- * @param options - Opcje połączenia Redis
45
- * @param name - Nazwa połączenia dla logów (np. 'QueueManager', 'RpcCoordinator')
46
- * @returns Skonfigurowane połączenie Redis
47
- */
48
- create(options: RedisConnectionOptions, name: string): Redis;
49
- /**
50
- * Tworzy połączenie Redis dla workerów BullMQ
51
- * Dodaje maxRetriesPerRequest: null wymagane przez BullMQ dla blocking operations
52
- *
53
- * @param options - Opcje połączenia Redis
54
- * @param name - Nazwa połączenia dla logów
55
- * @returns Skonfigurowane połączenie Redis dla workera
56
- */
57
- createForWorker(options: RedisConnectionOptions, name: string): Redis;
58
- /**
59
- * Konfiguruje handlery eventów dla połączenia Redis
60
- * Zapobiega [ioredis] Unhandled error event
61
- *
62
- * @param connection - Połączenie Redis
63
- * @param name - Nazwa połączenia dla logów
64
- */
65
- private setupEventHandlers;
66
- }
@@ -1,113 +0,0 @@
1
- "use strict";
2
- /**
3
- * Fabryka połączeń Redis z wbudowaną obsługą błędów i eventów
4
- * Zgodna z SRP - odpowiada tylko za tworzenie i konfigurację połączeń
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const ioredis_1 = require("ioredis");
8
- const redis_error_formatter_1 = require("./redis-error-formatter");
9
- /**
10
- * Fabryka połączeń Redis
11
- *
12
- * Zapewnia:
13
- * - Tworzenie połączeń z pełną obsługą eventów (error, close, reconnecting, connect)
14
- * - Poprawne formatowanie błędów (w tym AggregateError)
15
- * - Logowanie stanu połączenia
16
- * - Wariant dla workerów BullMQ (maxRetriesPerRequest: null)
17
- *
18
- * @example
19
- * const factory = new RedisConnectionFactory(logger);
20
- * const connection = factory.create(options, 'QueueManager');
21
- * const workerConnection = factory.createForWorker(options, 'Worker');
22
- */
23
- class RedisConnectionFactory {
24
- constructor(logger) {
25
- this.logger = logger;
26
- }
27
- /**
28
- * Tworzy połączenie Redis z pełną obsługą eventów
29
- *
30
- * @param options - Opcje połączenia Redis
31
- * @param name - Nazwa połączenia dla logów (np. 'QueueManager', 'RpcCoordinator')
32
- * @returns Skonfigurowane połączenie Redis
33
- */
34
- create(options, name) {
35
- const connection = new ioredis_1.Redis(options);
36
- this.setupEventHandlers(connection, name);
37
- return connection;
38
- }
39
- /**
40
- * Tworzy połączenie Redis dla workerów BullMQ
41
- * Dodaje maxRetriesPerRequest: null wymagane przez BullMQ dla blocking operations
42
- *
43
- * @param options - Opcje połączenia Redis
44
- * @param name - Nazwa połączenia dla logów
45
- * @returns Skonfigurowane połączenie Redis dla workera
46
- */
47
- createForWorker(options, name) {
48
- const workerOptions = Object.assign(Object.assign({}, options), { maxRetriesPerRequest: null });
49
- return this.create(workerOptions, name);
50
- }
51
- /**
52
- * Konfiguruje handlery eventów dla połączenia Redis
53
- * Zapobiega [ioredis] Unhandled error event
54
- *
55
- * @param connection - Połączenie Redis
56
- * @param name - Nazwa połączenia dla logów
57
- */
58
- setupEventHandlers(connection, name) {
59
- // Flaga do śledzenia czy to reconnect (dla logowania na poziomie INFO)
60
- let isReconnecting = false;
61
- // Handler błędów - WYMAGANY aby uniknąć "Unhandled error event"
62
- connection.on('error', (error) => {
63
- this.logger.error(`Błąd połączenia Redis (${name})`, {
64
- connectionName: name,
65
- error: (0, redis_error_formatter_1.formatRedisError)(error),
66
- errorCode: (0, redis_error_formatter_1.getErrorCode)(error),
67
- timestamp: new Date().toISOString(),
68
- });
69
- });
70
- // Handler zamknięcia połączenia
71
- connection.on('close', () => {
72
- this.logger.warn(`Połączenie Redis zamknięte (${name})`, {
73
- connectionName: name,
74
- timestamp: new Date().toISOString(),
75
- });
76
- });
77
- // Handler ponownego łączenia - ustawia flagę dla logu INFO przy ready
78
- connection.on('reconnecting', () => {
79
- isReconnecting = true;
80
- this.logger.log(`Ponowne łączenie z Redis (${name})`, {
81
- connectionName: name,
82
- timestamp: new Date().toISOString(),
83
- });
84
- });
85
- // Handler nawiązania połączenia
86
- connection.on('connect', () => {
87
- this.logger.debug(`Połączono z Redis (${name})`, {
88
- connectionName: name,
89
- timestamp: new Date().toISOString(),
90
- });
91
- });
92
- // Handler gotowości (po SELECT database)
93
- // Po reconnect loguje na poziomie INFO, pierwsze połączenie na DEBUG
94
- connection.on('ready', () => {
95
- if (isReconnecting) {
96
- this.logger.log(`Ponownie połączono z Redis (${name})`, {
97
- connectionName: name,
98
- reconnected: true,
99
- timestamp: new Date().toISOString(),
100
- });
101
- isReconnecting = false;
102
- }
103
- else {
104
- this.logger.debug(`Redis gotowy (${name})`, {
105
- connectionName: name,
106
- timestamp: new Date().toISOString(),
107
- });
108
- }
109
- });
110
- }
111
- }
112
- exports.default = RedisConnectionFactory;
113
- //# sourceMappingURL=redis-connection-factory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redis-connection-factory.js","sourceRoot":"","sources":["../../../src/shared/redis/redis-connection-factory.ts"],"names":[],"mappings":"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"}