@zdavison/matador 2.0.9 → 2.0.10

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 (259) hide show
  1. package/dist/checkpoint/context.d.ts +59 -0
  2. package/dist/checkpoint/context.d.ts.map +1 -0
  3. package/dist/checkpoint/context.js +140 -0
  4. package/dist/checkpoint/context.test.d.ts +2 -0
  5. package/dist/checkpoint/context.test.d.ts.map +1 -0
  6. package/dist/checkpoint/context.test.js +424 -0
  7. package/dist/checkpoint/index.d.ts +7 -0
  8. package/dist/checkpoint/index.d.ts.map +1 -0
  9. package/dist/checkpoint/index.js +6 -0
  10. package/dist/checkpoint/stores/memory.d.ts +29 -0
  11. package/dist/checkpoint/stores/memory.d.ts.map +1 -0
  12. package/dist/checkpoint/stores/memory.js +39 -0
  13. package/{src/checkpoint/stores/noop.ts → dist/checkpoint/stores/noop.d.ts} +5 -13
  14. package/dist/checkpoint/stores/noop.d.ts.map +1 -0
  15. package/dist/checkpoint/stores/noop.js +18 -0
  16. package/dist/checkpoint/stores/stores.test.d.ts +2 -0
  17. package/dist/checkpoint/stores/stores.test.d.ts.map +1 -0
  18. package/dist/checkpoint/stores/stores.test.js +146 -0
  19. package/dist/checkpoint/types.d.ts +119 -0
  20. package/dist/checkpoint/types.d.ts.map +1 -0
  21. package/dist/checkpoint/types.js +1 -0
  22. package/dist/codec/codec.d.ts +29 -0
  23. package/dist/codec/codec.d.ts.map +1 -0
  24. package/dist/codec/codec.js +15 -0
  25. package/dist/codec/header-aware-codec.d.ts +36 -0
  26. package/dist/codec/header-aware-codec.d.ts.map +1 -0
  27. package/dist/codec/header-aware-codec.js +1 -0
  28. package/{src/codec/index.ts → dist/codec/index.d.ts} +2 -7
  29. package/dist/codec/index.d.ts.map +1 -0
  30. package/dist/codec/index.js +3 -0
  31. package/dist/codec/json-codec.d.ts +13 -0
  32. package/dist/codec/json-codec.d.ts.map +1 -0
  33. package/dist/codec/json-codec.js +64 -0
  34. package/dist/codec/rabbitmq-codec.d.ts +28 -0
  35. package/dist/codec/rabbitmq-codec.d.ts.map +1 -0
  36. package/dist/codec/rabbitmq-codec.js +242 -0
  37. package/dist/codec/rabbitmq-codec.test.d.ts +2 -0
  38. package/dist/codec/rabbitmq-codec.test.d.ts.map +1 -0
  39. package/dist/codec/rabbitmq-codec.test.js +433 -0
  40. package/dist/core/fanout.d.ts +59 -0
  41. package/dist/core/fanout.d.ts.map +1 -0
  42. package/dist/core/fanout.js +121 -0
  43. package/dist/core/fanout.test.d.ts +2 -0
  44. package/dist/core/fanout.test.d.ts.map +1 -0
  45. package/dist/core/fanout.test.js +1054 -0
  46. package/{src/core/index.ts → dist/core/index.d.ts} +2 -7
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +3 -0
  49. package/dist/core/matador.d.ts +133 -0
  50. package/dist/core/matador.d.ts.map +1 -0
  51. package/dist/core/matador.js +228 -0
  52. package/dist/core/matador.test.d.ts +2 -0
  53. package/dist/core/matador.test.d.ts.map +1 -0
  54. package/dist/core/matador.test.js +446 -0
  55. package/dist/core/shutdown.d.ts +78 -0
  56. package/dist/core/shutdown.d.ts.map +1 -0
  57. package/dist/core/shutdown.js +111 -0
  58. package/dist/core/shutdown.test.d.ts +2 -0
  59. package/dist/core/shutdown.test.d.ts.map +1 -0
  60. package/dist/core/shutdown.test.js +524 -0
  61. package/dist/errors/checkpoint-errors.d.ts +30 -0
  62. package/dist/errors/checkpoint-errors.d.ts.map +1 -0
  63. package/dist/errors/checkpoint-errors.js +49 -0
  64. package/dist/errors/has-description.d.ts +18 -0
  65. package/dist/errors/has-description.d.ts.map +1 -0
  66. package/dist/errors/has-description.js +9 -0
  67. package/dist/errors/index.d.ts +6 -0
  68. package/dist/errors/index.d.ts.map +1 -0
  69. package/dist/errors/index.js +22 -0
  70. package/dist/errors/matador-errors.d.ts +183 -0
  71. package/dist/errors/matador-errors.d.ts.map +1 -0
  72. package/dist/errors/matador-errors.js +376 -0
  73. package/dist/errors/retry-errors.d.ts +102 -0
  74. package/dist/errors/retry-errors.d.ts.map +1 -0
  75. package/dist/errors/retry-errors.js +155 -0
  76. package/dist/errors/retry-errors.test.d.ts +2 -0
  77. package/dist/errors/retry-errors.test.d.ts.map +1 -0
  78. package/dist/errors/retry-errors.test.js +136 -0
  79. package/dist/hooks/index.d.ts +4 -0
  80. package/dist/hooks/index.d.ts.map +1 -0
  81. package/dist/hooks/index.js +2 -0
  82. package/dist/hooks/safe-hooks.d.ts +32 -0
  83. package/dist/hooks/safe-hooks.d.ts.map +1 -0
  84. package/dist/hooks/safe-hooks.js +120 -0
  85. package/dist/hooks/types.d.ts +172 -0
  86. package/dist/hooks/types.d.ts.map +1 -0
  87. package/dist/hooks/types.js +9 -0
  88. package/dist/index.cjs +3228 -0
  89. package/dist/index.cjs.map +1 -0
  90. package/dist/index.d.cts +23 -0
  91. package/dist/index.d.ts +23 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +31 -0
  94. package/dist/index.js.map +1 -0
  95. package/{src/pipeline/index.ts → dist/pipeline/index.d.ts} +1 -0
  96. package/dist/pipeline/index.d.ts.map +1 -0
  97. package/dist/pipeline/index.js +1 -0
  98. package/dist/pipeline/pipeline.d.ts +63 -0
  99. package/dist/pipeline/pipeline.d.ts.map +1 -0
  100. package/dist/pipeline/pipeline.js +273 -0
  101. package/dist/pipeline/pipeline.test.d.ts +2 -0
  102. package/dist/pipeline/pipeline.test.d.ts.map +1 -0
  103. package/dist/pipeline/pipeline.test.js +1112 -0
  104. package/{src/retry/index.ts → dist/retry/index.d.ts} +1 -1
  105. package/dist/retry/index.d.ts.map +1 -0
  106. package/dist/retry/index.js +1 -0
  107. package/dist/retry/policy.d.ts +43 -0
  108. package/dist/retry/policy.d.ts.map +1 -0
  109. package/dist/retry/policy.js +1 -0
  110. package/dist/retry/standard-policy.d.ts +44 -0
  111. package/dist/retry/standard-policy.d.ts.map +1 -0
  112. package/dist/retry/standard-policy.js +102 -0
  113. package/dist/retry/standard-policy.test.d.ts +2 -0
  114. package/dist/retry/standard-policy.test.d.ts.map +1 -0
  115. package/dist/retry/standard-policy.test.js +196 -0
  116. package/dist/schema/index.d.ts +4 -0
  117. package/dist/schema/index.d.ts.map +1 -0
  118. package/dist/schema/index.js +2 -0
  119. package/dist/schema/registry.d.ts +63 -0
  120. package/dist/schema/registry.d.ts.map +1 -0
  121. package/dist/schema/registry.js +174 -0
  122. package/dist/schema/registry.test.d.ts +2 -0
  123. package/dist/schema/registry.test.d.ts.map +1 -0
  124. package/dist/schema/registry.test.js +278 -0
  125. package/{src/schema/types.ts → dist/schema/types.d.ts} +29 -88
  126. package/dist/schema/types.d.ts.map +1 -0
  127. package/dist/schema/types.js +74 -0
  128. package/dist/schema/types.test.d.ts +2 -0
  129. package/dist/schema/types.test.d.ts.map +1 -0
  130. package/dist/schema/types.test.js +242 -0
  131. package/dist/topology/builder.d.ts +80 -0
  132. package/dist/topology/builder.d.ts.map +1 -0
  133. package/dist/topology/builder.js +165 -0
  134. package/dist/topology/builder.test.d.ts +2 -0
  135. package/dist/topology/builder.test.d.ts.map +1 -0
  136. package/dist/topology/builder.test.js +360 -0
  137. package/dist/topology/index.d.ts +5 -0
  138. package/dist/topology/index.d.ts.map +1 -0
  139. package/dist/topology/index.js +2 -0
  140. package/dist/topology/types.d.ts +128 -0
  141. package/dist/topology/types.d.ts.map +1 -0
  142. package/dist/topology/types.js +28 -0
  143. package/dist/transport/capabilities.d.ts +66 -0
  144. package/dist/transport/capabilities.d.ts.map +1 -0
  145. package/dist/transport/capabilities.js +18 -0
  146. package/dist/transport/connection-manager.d.ts +95 -0
  147. package/dist/transport/connection-manager.d.ts.map +1 -0
  148. package/dist/transport/connection-manager.js +144 -0
  149. package/dist/transport/index.d.ts +11 -0
  150. package/dist/transport/index.d.ts.map +1 -0
  151. package/dist/transport/index.js +5 -0
  152. package/dist/transport/local/local-transport.d.ts +62 -0
  153. package/dist/transport/local/local-transport.d.ts.map +1 -0
  154. package/dist/transport/local/local-transport.js +241 -0
  155. package/dist/transport/local/local-transport.test.d.ts +2 -0
  156. package/dist/transport/local/local-transport.test.d.ts.map +1 -0
  157. package/dist/transport/local/local-transport.test.js +192 -0
  158. package/dist/transport/multi/multi-transport.d.ts +94 -0
  159. package/dist/transport/multi/multi-transport.d.ts.map +1 -0
  160. package/dist/transport/multi/multi-transport.js +184 -0
  161. package/dist/transport/multi/multi-transport.test.d.ts +2 -0
  162. package/dist/transport/multi/multi-transport.test.d.ts.map +1 -0
  163. package/dist/transport/multi/multi-transport.test.js +236 -0
  164. package/dist/transport/rabbitmq/rabbitmq-transport.d.ts +83 -0
  165. package/dist/transport/rabbitmq/rabbitmq-transport.d.ts.map +1 -0
  166. package/dist/transport/rabbitmq/rabbitmq-transport.js +541 -0
  167. package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts +2 -0
  168. package/dist/transport/rabbitmq/rabbitmq-transport.test.d.ts.map +1 -0
  169. package/dist/transport/rabbitmq/rabbitmq-transport.test.js +100 -0
  170. package/dist/transport/transport.d.ts +152 -0
  171. package/dist/transport/transport.d.ts.map +1 -0
  172. package/dist/transport/transport.js +1 -0
  173. package/{src/types/common.ts → dist/types/common.d.ts} +8 -20
  174. package/dist/types/common.d.ts.map +1 -0
  175. package/dist/types/common.js +12 -0
  176. package/dist/types/dispatcher.d.ts +14 -0
  177. package/dist/types/dispatcher.d.ts.map +1 -0
  178. package/dist/types/dispatcher.js +1 -0
  179. package/dist/types/envelope.d.ts +131 -0
  180. package/dist/types/envelope.d.ts.map +1 -0
  181. package/dist/types/envelope.js +99 -0
  182. package/dist/types/event.d.ts +92 -0
  183. package/dist/types/event.d.ts.map +1 -0
  184. package/dist/types/event.js +26 -0
  185. package/dist/types/event.test.d.ts +2 -0
  186. package/dist/types/event.test.d.ts.map +1 -0
  187. package/dist/types/event.test.js +130 -0
  188. package/dist/types/index.d.ts +11 -0
  189. package/dist/types/index.d.ts.map +1 -0
  190. package/dist/types/index.js +4 -0
  191. package/dist/types/subscriber.d.ts +227 -0
  192. package/dist/types/subscriber.d.ts.map +1 -0
  193. package/dist/types/subscriber.js +97 -0
  194. package/package.json +6 -2
  195. package/examples/config.ts +0 -126
  196. package/examples/event.ts +0 -26
  197. package/examples/order-event.json +0 -19
  198. package/src/checkpoint/context.test.ts +0 -510
  199. package/src/checkpoint/context.ts +0 -213
  200. package/src/checkpoint/index.ts +0 -30
  201. package/src/checkpoint/stores/memory.ts +0 -47
  202. package/src/checkpoint/stores/stores.test.ts +0 -177
  203. package/src/checkpoint/types.ts +0 -147
  204. package/src/codec/codec.ts +0 -42
  205. package/src/codec/header-aware-codec.ts +0 -41
  206. package/src/codec/json-codec.ts +0 -69
  207. package/src/codec/rabbitmq-codec.test.ts +0 -516
  208. package/src/codec/rabbitmq-codec.ts +0 -336
  209. package/src/core/fanout.test.ts +0 -1350
  210. package/src/core/fanout.ts +0 -184
  211. package/src/core/matador.test.ts +0 -575
  212. package/src/core/matador.ts +0 -357
  213. package/src/core/shutdown.test.ts +0 -853
  214. package/src/core/shutdown.ts +0 -165
  215. package/src/errors/checkpoint-errors.ts +0 -62
  216. package/src/errors/has-description.ts +0 -25
  217. package/src/errors/index.ts +0 -58
  218. package/src/errors/matador-errors.ts +0 -477
  219. package/src/errors/retry-errors.test.ts +0 -175
  220. package/src/errors/retry-errors.ts +0 -188
  221. package/src/hooks/index.ts +0 -14
  222. package/src/hooks/safe-hooks.ts +0 -200
  223. package/src/hooks/types.ts +0 -226
  224. package/src/index.ts +0 -242
  225. package/src/pipeline/pipeline.test.ts +0 -1377
  226. package/src/pipeline/pipeline.ts +0 -393
  227. package/src/retry/policy.ts +0 -46
  228. package/src/retry/standard-policy.test.ts +0 -290
  229. package/src/retry/standard-policy.ts +0 -156
  230. package/src/schema/index.ts +0 -16
  231. package/src/schema/registry.test.ts +0 -339
  232. package/src/schema/registry.ts +0 -229
  233. package/src/schema/types.test.ts +0 -280
  234. package/src/topology/builder.test.ts +0 -451
  235. package/src/topology/builder.ts +0 -238
  236. package/src/topology/index.ts +0 -19
  237. package/src/topology/types.ts +0 -183
  238. package/src/transport/capabilities.ts +0 -88
  239. package/src/transport/connection-manager.ts +0 -218
  240. package/src/transport/index.ts +0 -42
  241. package/src/transport/local/local-transport.test.ts +0 -262
  242. package/src/transport/local/local-transport.ts +0 -330
  243. package/src/transport/multi/multi-transport.test.ts +0 -320
  244. package/src/transport/multi/multi-transport.ts +0 -294
  245. package/src/transport/rabbitmq/rabbitmq-transport.test.ts +0 -120
  246. package/src/transport/rabbitmq/rabbitmq-transport.ts +0 -782
  247. package/src/transport/transport.ts +0 -200
  248. package/src/types/dispatcher.ts +0 -18
  249. package/src/types/envelope.ts +0 -244
  250. package/src/types/event.test.ts +0 -157
  251. package/src/types/event.ts +0 -112
  252. package/src/types/index.ts +0 -62
  253. package/src/types/subscriber.ts +0 -333
  254. package/test/e2e/multi-transport.e2e.test.ts +0 -237
  255. package/test/e2e/rabbitmq-transport.e2e.test.ts +0 -618
  256. package/test/e2e/transport-compliance.e2e.test.ts +0 -506
  257. package/test/integration/matador.integration.test.ts +0 -634
  258. package/tsconfig.json +0 -29
  259. package/tsup.config.ts +0 -13
@@ -1,183 +0,0 @@
1
- /**
2
- * Transport-agnostic topology definition.
3
- * Matador owns the topology; transports translate and apply it.
4
- */
5
- export interface Topology {
6
- /** Namespace prefix for all queues */
7
- readonly namespace: string;
8
-
9
- /** Work queues for processing events */
10
- readonly queues: readonly QueueDefinition[];
11
-
12
- /** Dead-letter queue configuration */
13
- readonly deadLetter: DeadLetterConfig;
14
-
15
- /** Retry queue configuration */
16
- readonly retry: RetryConfig;
17
- }
18
-
19
- /**
20
- * Individual queue definition.
21
- */
22
- export interface QueueDefinition {
23
- /** Queue name (will be prefixed with namespace unless exact: true) */
24
- readonly name: string;
25
-
26
- /** Concurrency for this queue */
27
- readonly concurrency?: number | undefined;
28
-
29
- /** Consumer timeout in milliseconds */
30
- readonly consumerTimeout?: number | undefined;
31
-
32
- /** Enable priority support if transport allows */
33
- readonly priorities?: boolean | undefined;
34
-
35
- /**
36
- * When true, the queue name is used exactly as provided without any
37
- * modification. The namespace prefix will NOT be added, and no other
38
- * transformations will be applied. Use this for referencing external
39
- * queues that are not managed by Matador.
40
- */
41
- readonly exact?: boolean | undefined;
42
-
43
- /** Transport-specific queue options */
44
- readonly transport?: TransportQueueOptions | undefined;
45
- }
46
-
47
- /**
48
- * Transport-specific queue options.
49
- * Each transport can define its own options under its transport name key.
50
- */
51
- export interface TransportQueueOptions {
52
- /** RabbitMQ-specific queue options */
53
- readonly rabbitmq?: RabbitMQQueueDefinition | undefined;
54
- }
55
-
56
- /**
57
- * RabbitMQ-specific queue definition options.
58
- */
59
- export interface RabbitMQQueueDefinition {
60
- /**
61
- * Exact RabbitMQ queue assertion options.
62
- * When provided, these options completely replace all auto-computed defaults
63
- * (durable, x-queue-type, x-dead-letter-exchange, etc.).
64
- */
65
- readonly options?: RabbitMQQueueOptions | undefined;
66
- }
67
-
68
- /**
69
- * RabbitMQ queue assertion options.
70
- * Maps to amqplib's Options.AssertQueue.
71
- */
72
- export interface RabbitMQQueueOptions {
73
- /** Queue survives broker restart */
74
- readonly durable?: boolean | undefined;
75
-
76
- /** Queue is deleted when last consumer unsubscribes */
77
- readonly autoDelete?: boolean | undefined;
78
-
79
- /** Queue can only be used by the declaring connection */
80
- readonly exclusive?: boolean | undefined;
81
-
82
- /** Exchange to which dead-lettered messages are sent */
83
- readonly deadLetterExchange?: string | undefined;
84
-
85
- /** Routing key for dead-lettered messages */
86
- readonly deadLetterRoutingKey?: string | undefined;
87
-
88
- /** Message TTL in milliseconds */
89
- readonly messageTtl?: number | undefined;
90
-
91
- /** Queue expires after this many milliseconds of non-use */
92
- readonly expires?: number | undefined;
93
-
94
- /** Maximum number of messages in the queue */
95
- readonly maxLength?: number | undefined;
96
-
97
- /** Maximum priority level (0-255) */
98
- readonly maxPriority?: number | undefined;
99
-
100
- /** Additional x-* arguments for RabbitMQ */
101
- readonly arguments?: Record<string, unknown> | undefined;
102
- }
103
-
104
- /**
105
- * Dead-letter queue configuration.
106
- */
107
- export interface DeadLetterConfig {
108
- /** Unhandled events (schema mismatch) queue */
109
- readonly unhandled: DeadLetterQueueConfig;
110
-
111
- /** Undeliverable events (permanent failures) queue */
112
- readonly undeliverable: DeadLetterQueueConfig;
113
- }
114
-
115
- /**
116
- * Configuration for a specific dead-letter queue.
117
- */
118
- export interface DeadLetterQueueConfig {
119
- /** Whether this DLQ is enabled */
120
- readonly enabled: boolean;
121
-
122
- /** Maximum number of messages in the DLQ */
123
- readonly maxLength?: number | undefined;
124
- }
125
-
126
- /**
127
- * Retry queue configuration.
128
- */
129
- export interface RetryConfig {
130
- /** Enable retry queue with delay */
131
- readonly enabled: boolean;
132
-
133
- /** Default retry delay in milliseconds */
134
- readonly defaultDelayMs: number;
135
-
136
- /** Maximum retry delay in milliseconds */
137
- readonly maxDelayMs: number;
138
- }
139
-
140
- /**
141
- * Gets the fully qualified queue name with namespace prefix.
142
- */
143
- export function getQualifiedQueueName(
144
- namespace: string,
145
- queueName: string,
146
- ): string {
147
- return `${namespace}.${queueName}`;
148
- }
149
-
150
- /**
151
- * Gets the dead-letter queue name for a given queue.
152
- */
153
- export function getDeadLetterQueueName(
154
- namespace: string,
155
- queueName: string,
156
- dlqType: 'unhandled' | 'undeliverable',
157
- ): string {
158
- return `${namespace}.${queueName}.${dlqType}`;
159
- }
160
-
161
- /**
162
- * Gets the retry queue name for a given queue.
163
- */
164
- export function getRetryQueueName(
165
- namespace: string,
166
- queueName: string,
167
- ): string {
168
- return `${namespace}.${queueName}.retry`;
169
- }
170
-
171
- /**
172
- * Resolves the actual queue name for a given queue definition.
173
- * When exact: true, returns name as-is. Otherwise, returns namespace.name.
174
- */
175
- export function resolveQueueName(
176
- namespace: string,
177
- queueDef: QueueDefinition,
178
- ): string {
179
- if (queueDef.exact) {
180
- return queueDef.name;
181
- }
182
- return `${namespace}.${queueDef.name}`;
183
- }
@@ -1,88 +0,0 @@
1
- import type { DeliveryMode } from '../types/index.js';
2
-
3
- /**
4
- * Describes the native capabilities of a transport.
5
- * Matador adapts its behavior based on these capabilities.
6
- */
7
- export interface TransportCapabilities {
8
- /**
9
- * Delivery semantics the transport supports.
10
- * - 'at-least-once': Ack after processing (may redeliver on failure)
11
- * - 'at-most-once': Ack before processing (no redelivery, may lose messages)
12
- */
13
- readonly deliveryModes: readonly DeliveryMode[];
14
-
15
- /**
16
- * Transport can delay message delivery natively.
17
- * - true: Use transport's native delay (BullMQ, RabbitMQ with plugin)
18
- * - false: Matador handles via retry queue with TTL or external scheduler
19
- */
20
- readonly delayedMessages: boolean;
21
-
22
- /**
23
- * Transport can route failed messages to dead-letter queue natively.
24
- * - 'native': Transport handles DL routing (RabbitMQ DLX)
25
- * - 'manual': Matador must send() to DLQ then complete() original
26
- * - 'none': No DL support, Matador logs and discards
27
- */
28
- readonly deadLetterRouting: 'native' | 'manual' | 'none';
29
-
30
- /**
31
- * Transport tracks delivery/attempt count natively.
32
- * - true: Receipt includes accurate attemptNumber from transport
33
- * - false: Matador tracks attempts in envelope.docket.attempts field
34
- */
35
- readonly attemptTracking: boolean;
36
-
37
- /**
38
- * How transport handles concurrency.
39
- * - 'prefetch': Channel-based prefetch (RabbitMQ)
40
- * - 'worker': Worker concurrency setting (BullMQ)
41
- * - 'partition': Partition-based parallelism (Kafka)
42
- * - 'none': No concurrency control (Memory)
43
- */
44
- readonly concurrencyModel: 'prefetch' | 'worker' | 'partition' | 'none';
45
-
46
- /**
47
- * Message ordering guarantees.
48
- * - 'none': No ordering guarantee (most transports with multiple consumers)
49
- * - 'queue': Ordered within queue (single consumer scenarios)
50
- * - 'partition': Ordered within partition/key (Kafka)
51
- */
52
- readonly ordering: 'none' | 'queue' | 'partition';
53
-
54
- /**
55
- * Transport supports message priority.
56
- * - true: Higher priority messages processed first
57
- * - false: FIFO only
58
- */
59
- readonly priorities: boolean;
60
- }
61
-
62
- /**
63
- * Checks if the transport supports a specific delivery mode.
64
- */
65
- export function supportsDeliveryMode(
66
- capabilities: TransportCapabilities,
67
- mode: DeliveryMode,
68
- ): boolean {
69
- return capabilities.deliveryModes.includes(mode);
70
- }
71
-
72
- /**
73
- * Checks if the transport supports native delayed messages.
74
- */
75
- export function supportsDelayedMessages(
76
- capabilities: TransportCapabilities,
77
- ): boolean {
78
- return capabilities.delayedMessages;
79
- }
80
-
81
- /**
82
- * Checks if the transport has native dead-letter routing.
83
- */
84
- export function hasNativeDeadLetter(
85
- capabilities: TransportCapabilities,
86
- ): boolean {
87
- return capabilities.deadLetterRouting === 'native';
88
- }
@@ -1,218 +0,0 @@
1
- /**
2
- * Connection state machine states.
3
- */
4
- export type ConnectionState =
5
- | { readonly status: 'disconnected' }
6
- | { readonly status: 'connecting'; readonly attempt: number }
7
- | { readonly status: 'connected' }
8
- | {
9
- readonly status: 'reconnecting';
10
- readonly attempt: number;
11
- readonly lastError: Error;
12
- }
13
- | { readonly status: 'failed'; readonly error: Error };
14
-
15
- /**
16
- * Configuration for the connection manager.
17
- */
18
- export interface ConnectionManagerConfig {
19
- /** Maximum reconnection attempts before giving up (0 = infinite) */
20
- readonly maxReconnectAttempts: number;
21
-
22
- /** Initial delay between reconnection attempts (ms) */
23
- readonly initialReconnectDelay: number;
24
-
25
- /** Maximum delay between reconnection attempts (ms) */
26
- readonly maxReconnectDelay: number;
27
-
28
- /** Backoff multiplier for reconnection delay */
29
- readonly backoffMultiplier: number;
30
-
31
- /** Heartbeat interval for connection health (ms), optional */
32
- readonly heartbeatInterval?: number;
33
- }
34
-
35
- /**
36
- * Default configuration values.
37
- */
38
- export const defaultConnectionConfig: ConnectionManagerConfig = {
39
- maxReconnectAttempts: 0, // Infinite
40
- initialReconnectDelay: 1000,
41
- maxReconnectDelay: 30000,
42
- backoffMultiplier: 2,
43
- };
44
-
45
- /**
46
- * Callback for state change notifications.
47
- */
48
- export type StateChangeCallback = (state: ConnectionState) => void;
49
-
50
- /**
51
- * Function that performs the actual connection.
52
- */
53
- export type ConnectFn = () => Promise<void>;
54
-
55
- /**
56
- * Function that performs disconnection.
57
- */
58
- export type DisconnectFn = () => Promise<void>;
59
-
60
- /**
61
- * Manages connection lifecycle with automatic reconnection.
62
- */
63
- export class ConnectionManager {
64
- private _state: ConnectionState = { status: 'disconnected' };
65
- private readonly listeners: Set<StateChangeCallback> = new Set();
66
- private reconnectTimer: ReturnType<typeof setTimeout> | null = null;
67
- private readonly config: ConnectionManagerConfig;
68
-
69
- constructor(
70
- private readonly connectFn: ConnectFn,
71
- private readonly disconnectFn: DisconnectFn,
72
- config: Partial<ConnectionManagerConfig> = {},
73
- ) {
74
- this.config = { ...defaultConnectionConfig, ...config };
75
- }
76
-
77
- /**
78
- * Current connection state.
79
- */
80
- get state(): ConnectionState {
81
- return this._state;
82
- }
83
-
84
- /**
85
- * Whether currently connected.
86
- */
87
- isConnected(): boolean {
88
- return this._state.status === 'connected';
89
- }
90
-
91
- /**
92
- * Register a callback for connection state changes.
93
- */
94
- onStateChange(callback: StateChangeCallback): () => void {
95
- this.listeners.add(callback);
96
- return () => this.listeners.delete(callback);
97
- }
98
-
99
- /**
100
- * Attempt to establish connection.
101
- */
102
- async connect(): Promise<void> {
103
- if (this._state.status === 'connected') {
104
- return;
105
- }
106
-
107
- this.setState({ status: 'connecting', attempt: 1 });
108
-
109
- try {
110
- await this.connectFn();
111
- this.setState({ status: 'connected' });
112
- } catch (error) {
113
- const err = error instanceof Error ? error : new Error(String(error));
114
- await this.handleConnectionFailure(err, 1);
115
- }
116
- }
117
-
118
- /**
119
- * Gracefully disconnect.
120
- */
121
- async disconnect(): Promise<void> {
122
- this.clearReconnectTimer();
123
-
124
- if (this._state.status === 'disconnected') {
125
- return;
126
- }
127
-
128
- try {
129
- await this.disconnectFn();
130
- } finally {
131
- this.setState({ status: 'disconnected' });
132
- }
133
- }
134
-
135
- /**
136
- * Called by transport when connection is lost unexpectedly.
137
- */
138
- async handleConnectionLost(error: Error): Promise<void> {
139
- if (this._state.status === 'disconnected') {
140
- return;
141
- }
142
-
143
- this.setState({ status: 'reconnecting', attempt: 1, lastError: error });
144
- await this.attemptReconnect(1);
145
- }
146
-
147
- /**
148
- * Calculate delay for a given attempt using exponential backoff.
149
- */
150
- calculateDelay(attempt: number): number {
151
- const delay =
152
- this.config.initialReconnectDelay *
153
- Math.pow(this.config.backoffMultiplier, attempt - 1);
154
- return Math.min(delay, this.config.maxReconnectDelay);
155
- }
156
-
157
- private setState(state: ConnectionState): void {
158
- this._state = state;
159
- for (const listener of this.listeners) {
160
- try {
161
- listener(state);
162
- } catch {
163
- // Ignore listener errors
164
- }
165
- }
166
- }
167
-
168
- private async handleConnectionFailure(
169
- error: Error,
170
- attempt: number,
171
- ): Promise<void> {
172
- if (this.shouldGiveUp(attempt)) {
173
- this.setState({ status: 'failed', error });
174
- throw error;
175
- }
176
-
177
- this.setState({
178
- status: 'reconnecting',
179
- attempt: attempt + 1,
180
- lastError: error,
181
- });
182
- await this.attemptReconnect(attempt + 1);
183
- }
184
-
185
- private shouldGiveUp(attempt: number): boolean {
186
- return (
187
- this.config.maxReconnectAttempts > 0 &&
188
- attempt >= this.config.maxReconnectAttempts
189
- );
190
- }
191
-
192
- private async attemptReconnect(attempt: number): Promise<void> {
193
- const delay = this.calculateDelay(attempt);
194
-
195
- await new Promise<void>((resolve) => {
196
- this.reconnectTimer = setTimeout(resolve, delay);
197
- });
198
-
199
- if (this._state.status === 'disconnected') {
200
- return;
201
- }
202
-
203
- try {
204
- await this.connectFn();
205
- this.setState({ status: 'connected' });
206
- } catch (error) {
207
- const err = error instanceof Error ? error : new Error(String(error));
208
- await this.handleConnectionFailure(err, attempt);
209
- }
210
- }
211
-
212
- private clearReconnectTimer(): void {
213
- if (this.reconnectTimer !== null) {
214
- clearTimeout(this.reconnectTimer);
215
- this.reconnectTimer = null;
216
- }
217
- }
218
- }
@@ -1,42 +0,0 @@
1
- export type { TransportCapabilities } from './capabilities.js';
2
- export {
3
- hasNativeDeadLetter,
4
- supportsDeliveryMode,
5
- supportsDelayedMessages,
6
- } from './capabilities.js';
7
-
8
- export type {
9
- MessageHandler,
10
- MessageReceipt,
11
- RabbitMQSendOptions,
12
- RabbitMQSubscribeOptions,
13
- SendOptions,
14
- SubscribeOptions,
15
- Subscription,
16
- Transport,
17
- TransportSendOptions,
18
- TransportSubscribeOptions,
19
- } from './transport.js';
20
-
21
- export type {
22
- ConnectFn,
23
- ConnectionManagerConfig,
24
- ConnectionState,
25
- DisconnectFn,
26
- StateChangeCallback,
27
- } from './connection-manager.js';
28
- export {
29
- ConnectionManager,
30
- defaultConnectionConfig,
31
- } from './connection-manager.js';
32
-
33
- export { LocalTransport } from './local/local-transport.js';
34
-
35
- export type {
36
- MultiTransportConfig,
37
- MultiTransportHooks,
38
- } from './multi/multi-transport.js';
39
- export { MultiTransport } from './multi/multi-transport.js';
40
-
41
- export type { RabbitMQTransportConfig } from './rabbitmq/rabbitmq-transport.js';
42
- export { RabbitMQTransport } from './rabbitmq/rabbitmq-transport.js';