@zdavison/matador 2.0.9 → 2.0.11

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,516 +0,0 @@
1
- import { describe, expect, it } from 'bun:test';
2
- import type { Importance } from '../types/common.js';
3
- import { RabbitMQCodec } from './rabbitmq-codec.js';
4
-
5
- /**
6
- * V1 message body format for test fixtures.
7
- */
8
- interface V1MessageBody {
9
- key: string;
10
- data: unknown;
11
- metadata?: unknown;
12
- universal?: {
13
- event_id?: string | null;
14
- user_id?: string | null;
15
- correlation_id?: string | null;
16
- [key: string]: unknown;
17
- };
18
- before?: unknown;
19
- options?: { delayMs?: number };
20
- targetSubscriber: string;
21
- }
22
-
23
- /**
24
- * A v1 message fixture with optional headers.
25
- */
26
- interface V1MessageFixture {
27
- name: string;
28
- body: V1MessageBody;
29
- headers?: Record<string, unknown>;
30
- expected: {
31
- id?: string;
32
- eventKey: string;
33
- targetSubscriber: string;
34
- data: unknown;
35
- metadata?: Record<string, unknown>;
36
- correlationId?: string;
37
- attempts?: number;
38
- importance?: Importance;
39
- };
40
- }
41
-
42
- /**
43
- * Add your v1 message examples here.
44
- * Each fixture describes:
45
- * - name: A descriptive name for the test case
46
- * - body: The v1 message body (what goes in the RabbitMQ message content)
47
- * - headers: Optional RabbitMQ headers that accompany the message
48
- * - expected: The expected v2 envelope fields after translation
49
- */
50
- const V1_MESSAGE_FIXTURES: V1MessageFixture[] = [
51
- // === BASIC EXAMPLES ===
52
- {
53
- name: 'minimal v1 message with only required fields',
54
- body: {
55
- key: 'user.created',
56
- data: { userId: '123' },
57
- targetSubscriber: 'email-service',
58
- },
59
- expected: {
60
- eventKey: 'user.created',
61
- targetSubscriber: 'email-service',
62
- data: { userId: '123' },
63
- attempts: 1,
64
- importance: 'should-investigate',
65
- },
66
- },
67
-
68
- {
69
- name: 'v1 message with metadata',
70
- body: {
71
- key: 'order.placed',
72
- data: { orderId: 'ORD-456', amount: 99.99 },
73
- metadata: { source: 'web', region: 'us-east' },
74
- targetSubscriber: 'fulfillment-service',
75
- },
76
- expected: {
77
- eventKey: 'order.placed',
78
- targetSubscriber: 'fulfillment-service',
79
- data: { orderId: 'ORD-456', amount: 99.99 },
80
- metadata: { source: 'web', region: 'us-east' },
81
- },
82
- },
83
-
84
- // === UNIVERSAL METADATA EXAMPLES ===
85
- {
86
- name: 'v1 message with universal.event_id',
87
- body: {
88
- key: 'payment.processed',
89
- data: { paymentId: 'PAY-789' },
90
- universal: {
91
- event_id: 'evt-abc-123',
92
- },
93
- targetSubscriber: 'notification-service',
94
- },
95
- expected: {
96
- id: 'evt-abc-123',
97
- eventKey: 'payment.processed',
98
- targetSubscriber: 'notification-service',
99
- data: { paymentId: 'PAY-789' },
100
- },
101
- },
102
-
103
- {
104
- name: 'v1 message with universal.user_id (merged into metadata)',
105
- body: {
106
- key: 'profile.updated',
107
- data: { field: 'email' },
108
- universal: {
109
- user_id: 'user-456',
110
- },
111
- targetSubscriber: 'audit-service',
112
- },
113
- expected: {
114
- eventKey: 'profile.updated',
115
- targetSubscriber: 'audit-service',
116
- data: { field: 'email' },
117
- metadata: { user_id: 'user-456' },
118
- },
119
- },
120
-
121
- {
122
- name: 'v1 message with universal.correlation_id',
123
- body: {
124
- key: 'request.received',
125
- data: { requestId: 'req-001' },
126
- universal: {
127
- correlation_id: 'corr-xyz-789',
128
- },
129
- targetSubscriber: 'logger-service',
130
- },
131
- expected: {
132
- eventKey: 'request.received',
133
- targetSubscriber: 'logger-service',
134
- data: { requestId: 'req-001' },
135
- correlationId: 'corr-xyz-789',
136
- },
137
- },
138
-
139
- {
140
- name: 'v1 message with all universal fields',
141
- body: {
142
- key: 'checkout.completed',
143
- data: { cartId: 'cart-999' },
144
- universal: {
145
- event_id: 'evt-full-123',
146
- user_id: 'user-777',
147
- correlation_id: 'corr-full-456',
148
- custom_field: 'custom_value',
149
- },
150
- targetSubscriber: 'analytics-service',
151
- },
152
- expected: {
153
- id: 'evt-full-123',
154
- eventKey: 'checkout.completed',
155
- targetSubscriber: 'analytics-service',
156
- data: { cartId: 'cart-999' },
157
- correlationId: 'corr-full-456',
158
- metadata: {
159
- user_id: 'user-777',
160
- custom_field: 'custom_value',
161
- },
162
- },
163
- },
164
-
165
- // === METADATA MERGING EXAMPLES ===
166
- {
167
- name: 'v1 message with both metadata and universal (merged)',
168
- body: {
169
- key: 'item.added',
170
- data: { itemId: 'item-123' },
171
- metadata: { category: 'electronics', priority: 'high' },
172
- universal: {
173
- user_id: 'user-888',
174
- tenant_id: 'tenant-001',
175
- },
176
- targetSubscriber: 'inventory-service',
177
- },
178
- expected: {
179
- eventKey: 'item.added',
180
- targetSubscriber: 'inventory-service',
181
- data: { itemId: 'item-123' },
182
- metadata: {
183
- category: 'electronics',
184
- priority: 'high',
185
- user_id: 'user-888',
186
- tenant_id: 'tenant-001',
187
- },
188
- },
189
- },
190
-
191
- // === HEADER-BASED EXAMPLES ===
192
- {
193
- name: 'v1 message with attempt count from header',
194
- body: {
195
- key: 'task.retry',
196
- data: { taskId: 'task-555' },
197
- targetSubscriber: 'worker-service',
198
- },
199
- headers: {
200
- 'x-matador-attempts': 3,
201
- },
202
- expected: {
203
- eventKey: 'task.retry',
204
- targetSubscriber: 'worker-service',
205
- data: { taskId: 'task-555' },
206
- attempts: 3,
207
- },
208
- },
209
-
210
- {
211
- name: 'v1 message with importance from header',
212
- body: {
213
- key: 'alert.triggered',
214
- data: { alertId: 'alert-111' },
215
- targetSubscriber: 'pager-service',
216
- },
217
- headers: {
218
- 'x-matador-importance': 'must-investigate',
219
- },
220
- expected: {
221
- eventKey: 'alert.triggered',
222
- targetSubscriber: 'pager-service',
223
- data: { alertId: 'alert-111' },
224
- importance: 'must-investigate',
225
- },
226
- },
227
-
228
- {
229
- name: 'v1 message with correlation_id from v1 header',
230
- body: {
231
- key: 'trace.event',
232
- data: { traceId: 'trace-222' },
233
- targetSubscriber: 'tracing-service',
234
- },
235
- headers: {
236
- 'x-correlation-id': 'header-corr-id',
237
- },
238
- expected: {
239
- eventKey: 'trace.event',
240
- targetSubscriber: 'tracing-service',
241
- data: { traceId: 'trace-222' },
242
- correlationId: 'header-corr-id',
243
- },
244
- },
245
-
246
- {
247
- name: 'v1 message with event_id from v1 header',
248
- body: {
249
- key: 'legacy.event',
250
- data: { legacyId: 'leg-333' },
251
- targetSubscriber: 'legacy-handler',
252
- },
253
- headers: {
254
- 'x-event-id': 'header-event-id-456',
255
- },
256
- expected: {
257
- id: 'header-event-id-456',
258
- eventKey: 'legacy.event',
259
- targetSubscriber: 'legacy-handler',
260
- data: { legacyId: 'leg-333' },
261
- },
262
- },
263
-
264
- // === EDGE CASES ===
265
- {
266
- name: 'v1 message with null universal fields (ignored)',
267
- body: {
268
- key: 'null.test',
269
- data: { test: true },
270
- universal: {
271
- event_id: null,
272
- user_id: null,
273
- correlation_id: null,
274
- },
275
- targetSubscriber: 'null-handler',
276
- },
277
- expected: {
278
- eventKey: 'null.test',
279
- targetSubscriber: 'null-handler',
280
- data: { test: true },
281
- },
282
- },
283
-
284
- {
285
- name: 'v1 message with empty metadata object',
286
- body: {
287
- key: 'empty.metadata',
288
- data: { value: 42 },
289
- metadata: {},
290
- targetSubscriber: 'empty-handler',
291
- },
292
- expected: {
293
- eventKey: 'empty.metadata',
294
- targetSubscriber: 'empty-handler',
295
- data: { value: 42 },
296
- },
297
- },
298
-
299
- {
300
- name: 'v1 message with complex nested data',
301
- body: {
302
- key: 'complex.event',
303
- data: {
304
- nested: {
305
- deeply: {
306
- value: [1, 2, { three: 'four' }],
307
- },
308
- },
309
- array: ['a', 'b', 'c'],
310
- },
311
- targetSubscriber: 'complex-handler',
312
- },
313
- expected: {
314
- eventKey: 'complex.event',
315
- targetSubscriber: 'complex-handler',
316
- data: {
317
- nested: {
318
- deeply: {
319
- value: [1, 2, { three: 'four' }],
320
- },
321
- },
322
- array: ['a', 'b', 'c'],
323
- },
324
- },
325
- },
326
-
327
- {
328
- name: 'v1 message with before field (ignored in v2)',
329
- body: {
330
- key: 'update.event',
331
- data: { newValue: 'after' },
332
- before: { oldValue: 'before' },
333
- targetSubscriber: 'update-handler',
334
- },
335
- expected: {
336
- eventKey: 'update.event',
337
- targetSubscriber: 'update-handler',
338
- data: { newValue: 'after' },
339
- },
340
- },
341
-
342
- // === ADD YOUR EXAMPLES BELOW ===
343
- // Copy this template and fill in your v1 message data:
344
- //
345
- // {
346
- // name: 'descriptive name for your test case',
347
- // body: {
348
- // key: 'your.event.key',
349
- // data: { /* your event data */ },
350
- // metadata: { /* optional metadata */ },
351
- // universal: {
352
- // event_id: 'optional-event-id',
353
- // user_id: 'optional-user-id',
354
- // correlation_id: 'optional-correlation-id',
355
- // // any other custom fields
356
- // },
357
- // before: { /* optional, will be ignored */ },
358
- // options: { delayMs: 1000 }, // optional
359
- // targetSubscriber: 'your-subscriber-name',
360
- // },
361
- // headers: {
362
- // // optional headers
363
- // 'x-matador-attempts': 1,
364
- // 'x-matador-importance': 'should-investigate',
365
- // 'x-event-id': 'header-event-id',
366
- // 'x-correlation-id': 'header-correlation-id',
367
- // },
368
- // expected: {
369
- // id: 'expected-id', // optional, will be generated if not in body/headers
370
- // eventKey: 'your.event.key',
371
- // targetSubscriber: 'your-subscriber-name',
372
- // data: { /* expected data */ },
373
- // metadata: { /* expected merged metadata */ },
374
- // correlationId: 'expected-correlation-id',
375
- // attempts: 1,
376
- // importance: 'should-investigate',
377
- // },
378
- // },
379
- ];
380
-
381
- describe('RabbitMQCodec', () => {
382
- const codec = new RabbitMQCodec();
383
-
384
- describe('v1 to v2 translation', () => {
385
- for (const fixture of V1_MESSAGE_FIXTURES) {
386
- it(`should translate: ${fixture.name}`, () => {
387
- const body = new TextEncoder().encode(JSON.stringify(fixture.body));
388
- const headers = fixture.headers ?? {};
389
-
390
- const envelope = codec.decode(body, headers);
391
-
392
- // Check required fields
393
- expect(envelope.docket.eventKey).toBe(fixture.expected.eventKey);
394
- expect(envelope.docket.targetSubscriber).toBe(
395
- fixture.expected.targetSubscriber,
396
- );
397
- expect(envelope.data).toEqual(fixture.expected.data);
398
-
399
- // Check optional ID (may be generated if not specified)
400
- if (fixture.expected.id !== undefined) {
401
- expect(envelope.id).toBe(fixture.expected.id);
402
- } else {
403
- expect(envelope.id).toMatch(
404
- /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
405
- );
406
- }
407
-
408
- // Check metadata
409
- if (fixture.expected.metadata !== undefined) {
410
- expect(envelope.docket.metadata).toEqual(fixture.expected.metadata);
411
- } else {
412
- expect(
413
- envelope.docket.metadata === undefined ||
414
- Object.keys(envelope.docket.metadata).length === 0,
415
- ).toBe(true);
416
- }
417
-
418
- // Check correlation ID
419
- if (fixture.expected.correlationId !== undefined) {
420
- expect(envelope.docket.correlationId).toBe(
421
- fixture.expected.correlationId,
422
- );
423
- }
424
-
425
- // Check attempts (defaults to 1)
426
- if (fixture.expected.attempts !== undefined) {
427
- expect(envelope.docket.attempts).toBe(fixture.expected.attempts);
428
- } else {
429
- expect(envelope.docket.attempts).toBe(1);
430
- }
431
-
432
- // Check importance (defaults to 'should-investigate')
433
- if (fixture.expected.importance !== undefined) {
434
- expect(envelope.docket.importance).toBe(fixture.expected.importance);
435
- } else {
436
- expect(envelope.docket.importance).toBe('should-investigate');
437
- }
438
-
439
- // Check createdAt is a valid ISO string
440
- expect(envelope.docket.createdAt).toMatch(
441
- /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/,
442
- );
443
- });
444
- }
445
- });
446
-
447
- describe('v1 edge cases', () => {
448
- it('should handle options.delayMs by setting scheduledFor', () => {
449
- const body: V1MessageBody = {
450
- key: 'delayed.event',
451
- data: { test: true },
452
- options: { delayMs: 5000 },
453
- targetSubscriber: 'delay-handler',
454
- };
455
-
456
- const encoded = new TextEncoder().encode(JSON.stringify(body));
457
- const before = Date.now();
458
- const envelope = codec.decode(encoded, {});
459
- const after = Date.now();
460
-
461
- expect(envelope.docket.scheduledFor).toBeDefined();
462
-
463
- const scheduledTime = new Date(envelope.docket.scheduledFor!).getTime();
464
- expect(scheduledTime).toBeGreaterThanOrEqual(before + 5000);
465
- expect(scheduledTime).toBeLessThanOrEqual(after + 5000);
466
- });
467
-
468
- it('should prefer header event_id over body universal.event_id', () => {
469
- const body: V1MessageBody = {
470
- key: 'priority.test',
471
- data: {},
472
- universal: { event_id: 'body-event-id' },
473
- targetSubscriber: 'test-handler',
474
- };
475
-
476
- const encoded = new TextEncoder().encode(JSON.stringify(body));
477
- const envelope = codec.decode(encoded, {
478
- 'x-event-id': 'header-event-id',
479
- });
480
-
481
- expect(envelope.id).toBe('header-event-id');
482
- });
483
-
484
- it('should prefer v2 correlation header over v1 header', () => {
485
- const body: V1MessageBody = {
486
- key: 'corr.priority',
487
- data: {},
488
- targetSubscriber: 'test-handler',
489
- };
490
-
491
- const encoded = new TextEncoder().encode(JSON.stringify(body));
492
- const envelope = codec.decode(encoded, {
493
- 'x-matador-correlation-id': 'v2-corr-id',
494
- 'x-correlation-id': 'v1-corr-id',
495
- });
496
-
497
- expect(envelope.docket.correlationId).toBe('v2-corr-id');
498
- });
499
-
500
- it('should prefer header correlation_id over body universal.correlation_id', () => {
501
- const body: V1MessageBody = {
502
- key: 'corr.priority',
503
- data: {},
504
- universal: { correlation_id: 'body-corr-id' },
505
- targetSubscriber: 'test-handler',
506
- };
507
-
508
- const encoded = new TextEncoder().encode(JSON.stringify(body));
509
- const envelope = codec.decode(encoded, {
510
- 'x-correlation-id': 'header-corr-id',
511
- });
512
-
513
- expect(envelope.docket.correlationId).toBe('header-corr-id');
514
- });
515
- });
516
- });