@message-queue-toolkit/core 24.2.0 → 25.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 +375 -25
- package/dist/events/DomainEventEmitter.js +1 -1
- package/dist/events/DomainEventEmitter.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/queues/AbstractQueueService.d.ts +15 -3
- package/dist/queues/AbstractQueueService.js +51 -17
- package/dist/queues/AbstractQueueService.js.map +1 -1
- package/dist/queues/HandlerContainer.d.ts +36 -11
- package/dist/queues/HandlerContainer.js +69 -21
- package/dist/queues/HandlerContainer.js.map +1 -1
- package/dist/queues/HandlerSpy.d.ts +26 -3
- package/dist/queues/HandlerSpy.js +40 -8
- package/dist/queues/HandlerSpy.js.map +1 -1
- package/dist/queues/MessageSchemaContainer.d.ts +52 -6
- package/dist/queues/MessageSchemaContainer.js +126 -18
- package/dist/queues/MessageSchemaContainer.js.map +1 -1
- package/dist/queues/MessageTypeResolver.d.ts +154 -0
- package/dist/queues/MessageTypeResolver.js +82 -0
- package/dist/queues/MessageTypeResolver.js.map +1 -0
- package/dist/types/queueOptionsTypes.d.ts +35 -3
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ Core library for message-queue-toolkit. Provides foundational abstractions, util
|
|
|
8
8
|
- [Overview](#overview)
|
|
9
9
|
- [Core Concepts](#core-concepts)
|
|
10
10
|
- [Message Schemas](#message-schemas)
|
|
11
|
+
- [Message Type Resolution](#message-type-resolution)
|
|
11
12
|
- [Handler Configuration](#handler-configuration)
|
|
12
13
|
- [Pre-handlers and Barriers](#pre-handlers-and-barriers)
|
|
13
14
|
- [Handler Spies](#handler-spies)
|
|
@@ -19,7 +20,6 @@ Core library for message-queue-toolkit. Provides foundational abstractions, util
|
|
|
19
20
|
- [AbstractPublisherManager](#abstractpublishermanager)
|
|
20
21
|
- [DomainEventEmitter](#domaineventemitter)
|
|
21
22
|
- [Utilities](#utilities)
|
|
22
|
-
- [NO_MESSAGE_TYPE_FIELD](#no_message_type_field)
|
|
23
23
|
- [Error Classes](#error-classes)
|
|
24
24
|
- [Message Deduplication](#message-deduplication)
|
|
25
25
|
- [Payload Offloading](#payload-offloading)
|
|
@@ -52,7 +52,7 @@ The core package provides the foundational building blocks used by all protocol-
|
|
|
52
52
|
|
|
53
53
|
Messages are validated using Zod schemas. The library uses configurable field names:
|
|
54
54
|
|
|
55
|
-
- **`
|
|
55
|
+
- **`messageTypeResolver`**: Configuration for resolving the message type discriminator (see [Message Type Resolution](#message-type-resolution))
|
|
56
56
|
- **`messageIdField`** (default: `'id'`): Field containing the message ID
|
|
57
57
|
- **`messageTimestampField`** (default: `'timestamp'`): Field containing the timestamp
|
|
58
58
|
|
|
@@ -70,6 +70,304 @@ const UserCreatedSchema = z.object({
|
|
|
70
70
|
type UserCreated = z.infer<typeof UserCreatedSchema>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
+
### Message Type Resolution
|
|
74
|
+
|
|
75
|
+
#### What is Message Type?
|
|
76
|
+
|
|
77
|
+
The **message type** is a discriminator field that identifies what kind of event or command a message represents. It's used for:
|
|
78
|
+
|
|
79
|
+
1. **Routing**: Directing messages to the appropriate handler based on their type
|
|
80
|
+
2. **Schema validation**: Selecting the correct Zod schema to validate the message
|
|
81
|
+
3. **Observability**: Tracking metrics and logs per message type
|
|
82
|
+
|
|
83
|
+
In a typical event-driven architecture, a single queue or topic may receive multiple types of messages. For example, a `user-events` queue might receive `user.created`, `user.updated`, and `user.deleted` events. The message type tells the consumer which handler should process each message.
|
|
84
|
+
|
|
85
|
+
#### Configuration Options
|
|
86
|
+
|
|
87
|
+
The `messageTypeResolver` configuration supports three modes:
|
|
88
|
+
|
|
89
|
+
##### Mode 1: Field Path (Simple)
|
|
90
|
+
|
|
91
|
+
Use when the message type is a field in the parsed message body. Supports dot notation for nested paths:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
{
|
|
95
|
+
messageTypeResolver: { messageTypePath: 'type' }, // Extracts from message.type
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Nested path example
|
|
99
|
+
{
|
|
100
|
+
messageTypeResolver: { messageTypePath: 'metadata.eventType' }, // Extracts from message.metadata.eventType
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
##### Mode 2: Literal (Constant)
|
|
105
|
+
|
|
106
|
+
Use when all messages are of the same type:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
{
|
|
110
|
+
messageTypeResolver: { literal: 'order.created' }, // All messages treated as this type
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
##### Mode 3: Custom Resolver (Flexible)
|
|
115
|
+
|
|
116
|
+
Use for complex scenarios where the type needs to be extracted from message attributes, nested fields, or requires transformation:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import type { MessageTypeResolverConfig } from '@message-queue-toolkit/core'
|
|
120
|
+
|
|
121
|
+
const resolverConfig: MessageTypeResolverConfig = {
|
|
122
|
+
resolver: ({ messageData, messageAttributes }) => {
|
|
123
|
+
// Your custom logic here
|
|
124
|
+
return 'resolved.type'
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Important:** The resolver function must always return a valid string. If the type cannot be determined, either return a default type or throw an error with a descriptive message.
|
|
130
|
+
|
|
131
|
+
#### Real-World Examples by Platform
|
|
132
|
+
|
|
133
|
+
##### AWS SQS (Plain)
|
|
134
|
+
|
|
135
|
+
When publishing your own events directly to SQS, you control the message format:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Message format you control
|
|
139
|
+
{
|
|
140
|
+
"id": "msg-123",
|
|
141
|
+
"type": "order.created", // Your type field
|
|
142
|
+
"timestamp": "2024-01-15T10:30:00Z",
|
|
143
|
+
"payload": {
|
|
144
|
+
"orderId": "order-456",
|
|
145
|
+
"amount": 99.99
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Configuration
|
|
150
|
+
{
|
|
151
|
+
messageTypeResolver: { messageTypePath: 'type' },
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
##### AWS EventBridge → SQS
|
|
156
|
+
|
|
157
|
+
EventBridge events have a specific structure with `detail-type`:
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// EventBridge event structure delivered to SQS
|
|
161
|
+
{
|
|
162
|
+
"version": "0",
|
|
163
|
+
"id": "12345678-1234-1234-1234-123456789012",
|
|
164
|
+
"detail-type": "Order Created", // EventBridge uses detail-type
|
|
165
|
+
"source": "com.myapp.orders",
|
|
166
|
+
"account": "123456789012",
|
|
167
|
+
"time": "2024-01-15T10:30:00Z",
|
|
168
|
+
"region": "us-east-1",
|
|
169
|
+
"detail": {
|
|
170
|
+
"orderId": "order-456",
|
|
171
|
+
"amount": 99.99
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Configuration
|
|
176
|
+
{
|
|
177
|
+
messageTypeResolver: { messageTypePath: 'detail-type' },
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Or with resolver for normalization
|
|
181
|
+
{
|
|
182
|
+
messageTypeResolver: {
|
|
183
|
+
resolver: ({ messageData }) => {
|
|
184
|
+
const data = messageData as { 'detail-type'?: string; source?: string }
|
|
185
|
+
const detailType = data['detail-type']
|
|
186
|
+
if (!detailType) throw new Error('detail-type is required')
|
|
187
|
+
// Optionally normalize: "Order Created" → "order.created"
|
|
188
|
+
return detailType.toLowerCase().replace(/ /g, '.')
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
##### AWS SNS → SQS
|
|
195
|
+
|
|
196
|
+
SNS messages wrapped in SQS have the actual payload in the `Message` field (handled automatically by the library after unwrapping):
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// After SNS envelope unwrapping, you get your original message
|
|
200
|
+
{
|
|
201
|
+
"id": "msg-123",
|
|
202
|
+
"type": "user.signup.completed",
|
|
203
|
+
"userId": "user-789",
|
|
204
|
+
"email": "user@example.com"
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Configuration
|
|
208
|
+
{
|
|
209
|
+
messageTypeResolver: { messageTypePath: 'type' },
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
##### Apache Kafka
|
|
214
|
+
|
|
215
|
+
Kafka typically uses topic-based routing, but you may still need message types within a topic:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// Kafka message value (JSON)
|
|
219
|
+
{
|
|
220
|
+
"eventType": "inventory.reserved",
|
|
221
|
+
"eventId": "evt-123",
|
|
222
|
+
"timestamp": 1705312200000,
|
|
223
|
+
"data": {
|
|
224
|
+
"sku": "PROD-001",
|
|
225
|
+
"quantity": 5
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Configuration
|
|
230
|
+
{
|
|
231
|
+
messageTypeResolver: { messageTypePath: 'eventType' },
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Or using Kafka headers (via custom resolver)
|
|
235
|
+
{
|
|
236
|
+
messageTypeResolver: {
|
|
237
|
+
resolver: ({ messageData, messageAttributes }) => {
|
|
238
|
+
// Kafka headers are passed as messageAttributes
|
|
239
|
+
if (messageAttributes?.['ce_type']) {
|
|
240
|
+
return messageAttributes['ce_type'] as string // CloudEvents header
|
|
241
|
+
}
|
|
242
|
+
const data = messageData as { eventType?: string }
|
|
243
|
+
if (!data.eventType) throw new Error('eventType required')
|
|
244
|
+
return data.eventType
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
##### Google Cloud Pub/Sub (Your Own Events)
|
|
251
|
+
|
|
252
|
+
When you control the message format in Pub/Sub:
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// Your message (base64-decoded from data field)
|
|
256
|
+
{
|
|
257
|
+
"type": "payment.processed",
|
|
258
|
+
"paymentId": "pay-123",
|
|
259
|
+
"amount": 150.00,
|
|
260
|
+
"currency": "USD"
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Configuration
|
|
264
|
+
{
|
|
265
|
+
messageTypeResolver: { messageTypePath: 'type' },
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
##### Google Cloud Pub/Sub (Cloud Storage Notifications)
|
|
270
|
+
|
|
271
|
+
Cloud Storage notifications put the event type in message **attributes**, not the data payload:
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
// Pub/Sub message structure for Cloud Storage notifications
|
|
275
|
+
{
|
|
276
|
+
"data": "eyJraW5kIjoic3RvcmFnZSMgb2JqZWN0In0=", // Base64-encoded object metadata
|
|
277
|
+
"attributes": {
|
|
278
|
+
"eventType": "OBJECT_FINALIZE", // Type is HERE, not in data!
|
|
279
|
+
"bucketId": "my-bucket",
|
|
280
|
+
"objectId": "path/to/file.jpg",
|
|
281
|
+
"objectGeneration": "1705312200000"
|
|
282
|
+
},
|
|
283
|
+
"messageId": "123456789",
|
|
284
|
+
"publishTime": "2024-01-15T10:30:00Z"
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Configuration - must use resolver to access attributes
|
|
288
|
+
{
|
|
289
|
+
messageTypeResolver: {
|
|
290
|
+
resolver: ({ messageAttributes }) => {
|
|
291
|
+
const eventType = messageAttributes?.eventType as string
|
|
292
|
+
if (!eventType) {
|
|
293
|
+
throw new Error('eventType attribute required for Cloud Storage notifications')
|
|
294
|
+
}
|
|
295
|
+
// Map GCS event types to your internal types
|
|
296
|
+
const typeMap: Record<string, string> = {
|
|
297
|
+
'OBJECT_FINALIZE': 'storage.object.created',
|
|
298
|
+
'OBJECT_DELETE': 'storage.object.deleted',
|
|
299
|
+
'OBJECT_ARCHIVE': 'storage.object.archived',
|
|
300
|
+
'OBJECT_METADATA_UPDATE': 'storage.object.metadataUpdated',
|
|
301
|
+
}
|
|
302
|
+
return typeMap[eventType] ?? eventType
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
##### Google Cloud Pub/Sub (Eventarc / CloudEvents)
|
|
309
|
+
|
|
310
|
+
Eventarc delivers events in CloudEvents format:
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// CloudEvents structured format
|
|
314
|
+
{
|
|
315
|
+
"specversion": "1.0",
|
|
316
|
+
"type": "google.cloud.storage.object.v1.finalized", // CloudEvents type
|
|
317
|
+
"source": "//storage.googleapis.com/projects/_/buckets/my-bucket",
|
|
318
|
+
"id": "1234567890",
|
|
319
|
+
"time": "2024-01-15T10:30:00Z",
|
|
320
|
+
"datacontenttype": "application/json",
|
|
321
|
+
"data": {
|
|
322
|
+
"bucket": "my-bucket",
|
|
323
|
+
"name": "path/to/file.jpg",
|
|
324
|
+
"contentType": "image/jpeg"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Configuration
|
|
329
|
+
{
|
|
330
|
+
messageTypeResolver: { messageTypePath: 'type' }, // CloudEvents type is at root level
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Or with mapping to simpler types
|
|
334
|
+
{
|
|
335
|
+
messageTypeResolver: {
|
|
336
|
+
resolver: ({ messageData }) => {
|
|
337
|
+
const data = messageData as { type?: string }
|
|
338
|
+
const ceType = data.type
|
|
339
|
+
if (!ceType) throw new Error('CloudEvents type required')
|
|
340
|
+
// Map verbose CloudEvents types to simpler names
|
|
341
|
+
if (ceType.includes('storage.object') && ceType.includes('finalized')) {
|
|
342
|
+
return 'storage.object.created'
|
|
343
|
+
}
|
|
344
|
+
if (ceType.includes('storage.object') && ceType.includes('deleted')) {
|
|
345
|
+
return 'storage.object.deleted'
|
|
346
|
+
}
|
|
347
|
+
return ceType
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
##### Single-Type Queues (Any Platform)
|
|
354
|
+
|
|
355
|
+
When a queue/subscription only ever receives one type of message, use `literal`:
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
// Dedicated queue for order.created events only
|
|
359
|
+
{
|
|
360
|
+
messageTypeResolver: {
|
|
361
|
+
literal: 'order.created',
|
|
362
|
+
},
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
This is useful for:
|
|
367
|
+
- Dedicated queues/subscriptions filtered to a single event type
|
|
368
|
+
- Legacy systems where messages don't have a type field
|
|
369
|
+
- Simple integrations where you know exactly what you're receiving
|
|
370
|
+
|
|
73
371
|
### Handler Configuration
|
|
74
372
|
|
|
75
373
|
Use `MessageHandlerConfigBuilder` to configure handlers for different message types:
|
|
@@ -167,6 +465,56 @@ const handlers = new MessageHandlerConfigBuilder<
|
|
|
167
465
|
.build()
|
|
168
466
|
```
|
|
169
467
|
|
|
468
|
+
#### Handler Configuration Options
|
|
469
|
+
|
|
470
|
+
The third parameter to `addConfig` accepts these options:
|
|
471
|
+
|
|
472
|
+
| Option | Type | Description |
|
|
473
|
+
|--------|------|-------------|
|
|
474
|
+
| `messageType` | `string` | Explicit message type for routing. Required when using custom resolver. |
|
|
475
|
+
| `messageLogFormatter` | `(message) => unknown` | Custom formatter for logging |
|
|
476
|
+
| `preHandlers` | `Prehandler[]` | Middleware functions run before the handler |
|
|
477
|
+
| `preHandlerBarrier` | `BarrierCallback` | Barrier function for out-of-order message handling |
|
|
478
|
+
|
|
479
|
+
#### Explicit Message Type
|
|
480
|
+
|
|
481
|
+
When using a custom resolver function (`messageTypeResolver: { resolver: fn }`), the message type cannot be automatically extracted from schemas at registration time. You must provide an explicit `messageType` for each handler:
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
const handlers = new MessageHandlerConfigBuilder<SupportedMessages, Context>()
|
|
485
|
+
.addConfig(
|
|
486
|
+
STORAGE_OBJECT_SCHEMA,
|
|
487
|
+
handleObjectCreated,
|
|
488
|
+
{ messageType: 'storage.object.created' } // Required for custom resolver
|
|
489
|
+
)
|
|
490
|
+
.addConfig(
|
|
491
|
+
STORAGE_DELETE_SCHEMA,
|
|
492
|
+
handleObjectDeleted,
|
|
493
|
+
{ messageType: 'storage.object.deleted' } // Required for custom resolver
|
|
494
|
+
)
|
|
495
|
+
.build()
|
|
496
|
+
|
|
497
|
+
const container = new HandlerContainer({
|
|
498
|
+
messageHandlers: handlers,
|
|
499
|
+
messageTypeResolver: {
|
|
500
|
+
resolver: ({ messageAttributes }) => {
|
|
501
|
+
// Map external event types to your internal types
|
|
502
|
+
const eventType = messageAttributes?.eventType as string
|
|
503
|
+
if (eventType === 'OBJECT_FINALIZE') return 'storage.object.created'
|
|
504
|
+
if (eventType === 'OBJECT_DELETE') return 'storage.object.deleted'
|
|
505
|
+
throw new Error(`Unknown event type: ${eventType}`)
|
|
506
|
+
},
|
|
507
|
+
},
|
|
508
|
+
})
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
**Priority for determining handler message type:**
|
|
512
|
+
1. Explicit `messageType` in handler options (highest priority)
|
|
513
|
+
2. Literal type from `messageTypeResolver: { literal: 'type' }`
|
|
514
|
+
3. Extract from schema's literal field using `messageTypePath`
|
|
515
|
+
|
|
516
|
+
If the message type cannot be determined, an error is thrown during container construction.
|
|
517
|
+
|
|
170
518
|
### HandlerContainer
|
|
171
519
|
|
|
172
520
|
Routes messages to appropriate handlers based on message type:
|
|
@@ -176,7 +524,7 @@ import { HandlerContainer } from '@message-queue-toolkit/core'
|
|
|
176
524
|
|
|
177
525
|
const container = new HandlerContainer({
|
|
178
526
|
messageHandlers: handlers,
|
|
179
|
-
|
|
527
|
+
messageTypeResolver: { messageTypePath: 'type' },
|
|
180
528
|
})
|
|
181
529
|
|
|
182
530
|
const handler = container.resolveHandler(message.type)
|
|
@@ -190,11 +538,17 @@ Manages Zod schemas and validates messages:
|
|
|
190
538
|
import { MessageSchemaContainer } from '@message-queue-toolkit/core'
|
|
191
539
|
|
|
192
540
|
const container = new MessageSchemaContainer({
|
|
193
|
-
messageSchemas: [Schema1, Schema2],
|
|
194
|
-
|
|
541
|
+
messageSchemas: [{ schema: Schema1 }, { schema: Schema2 }],
|
|
542
|
+
messageDefinitions: [],
|
|
543
|
+
messageTypeResolver: { messageTypePath: 'type' },
|
|
195
544
|
})
|
|
196
545
|
|
|
197
|
-
const
|
|
546
|
+
const result = container.resolveSchema(message)
|
|
547
|
+
if ('error' in result) {
|
|
548
|
+
// Handle error
|
|
549
|
+
} else {
|
|
550
|
+
const schema = result.result
|
|
551
|
+
}
|
|
198
552
|
```
|
|
199
553
|
|
|
200
554
|
### AbstractPublisherManager
|
|
@@ -229,25 +583,6 @@ await emitter.emit('user.created', { userId: 'user-123' })
|
|
|
229
583
|
|
|
230
584
|
## Utilities
|
|
231
585
|
|
|
232
|
-
### NO_MESSAGE_TYPE_FIELD
|
|
233
|
-
|
|
234
|
-
Use this constant when your consumer should accept all message types without routing:
|
|
235
|
-
|
|
236
|
-
```typescript
|
|
237
|
-
import { NO_MESSAGE_TYPE_FIELD } from '@message-queue-toolkit/core'
|
|
238
|
-
|
|
239
|
-
// Consumer will use a single handler for all messages
|
|
240
|
-
{
|
|
241
|
-
messageTypeField: NO_MESSAGE_TYPE_FIELD,
|
|
242
|
-
handlers: new MessageHandlerConfigBuilder()
|
|
243
|
-
.addConfig(PassthroughSchema, async (message) => {
|
|
244
|
-
// Handles any message type
|
|
245
|
-
return { result: 'success' }
|
|
246
|
-
})
|
|
247
|
-
.build(),
|
|
248
|
-
}
|
|
249
|
-
```
|
|
250
|
-
|
|
251
586
|
### Error Classes
|
|
252
587
|
|
|
253
588
|
```typescript
|
|
@@ -327,6 +662,21 @@ type BarrierCallback<Message, Context, PrehandlerOutput, BarrierOutput> = (
|
|
|
327
662
|
type BarrierResult<Output> =
|
|
328
663
|
| { isPassing: true; output: Output }
|
|
329
664
|
| { isPassing: false; output?: never }
|
|
665
|
+
|
|
666
|
+
// Message type resolver context
|
|
667
|
+
type MessageTypeResolverContext = {
|
|
668
|
+
messageData: unknown
|
|
669
|
+
messageAttributes?: Record<string, unknown>
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// Message type resolver function
|
|
673
|
+
type MessageTypeResolverFn = (context: MessageTypeResolverContext) => string
|
|
674
|
+
|
|
675
|
+
// Message type resolver configuration
|
|
676
|
+
type MessageTypeResolverConfig =
|
|
677
|
+
| { messageTypePath: string } // Extract from field at root of message data
|
|
678
|
+
| { literal: string } // Constant type for all messages
|
|
679
|
+
| { resolver: MessageTypeResolverFn } // Custom resolver function
|
|
330
680
|
```
|
|
331
681
|
|
|
332
682
|
### Utility Functions
|
|
@@ -100,7 +100,7 @@ export class DomainEventEmitter {
|
|
|
100
100
|
this._handlerSpy.addProcessedMessage({
|
|
101
101
|
message: event,
|
|
102
102
|
processingResult: { status: 'consumed' },
|
|
103
|
-
}, event.id);
|
|
103
|
+
}, event.id, event.type);
|
|
104
104
|
});
|
|
105
105
|
this.inProgressBackgroundHandlerByEventId.set(event.id, bgPromise);
|
|
106
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomainEventEmitter.js","sourceRoot":"","sources":["../../lib/events/DomainEventEmitter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"DomainEventEmitter.js","sourceRoot":"","sources":["../../lib/events/DomainEventEmitter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,10 +16,12 @@ export { createMultiStoreConfig, isMultiPayloadStoreConfig, } from './payload-st
|
|
|
16
16
|
export * from './queues/AbstractPublisherManager.ts';
|
|
17
17
|
export { AbstractQueueService, type Deserializer, type ResolvedMessage, } from './queues/AbstractQueueService.ts';
|
|
18
18
|
export type { BarrierCallback, BarrierResult, BarrierResultNegative, BarrierResultPositive, Handler, HandlerContainerOptions, PreHandlingOutputs, Prehandler, } from './queues/HandlerContainer.ts';
|
|
19
|
-
export { HandlerContainer, MessageHandlerConfig, MessageHandlerConfigBuilder,
|
|
20
|
-
export { HandlerSpy, type HandlerSpyParams, type PublicHandlerSpy, resolveHandlerSpy, type SpyResultInput, } from './queues/HandlerSpy.ts';
|
|
21
|
-
export type { MessageSchemaContainerOptions } from './queues/MessageSchemaContainer.ts';
|
|
19
|
+
export { HandlerContainer, MessageHandlerConfig, MessageHandlerConfigBuilder, type PrehandlerResult, } from './queues/HandlerContainer.ts';
|
|
20
|
+
export { ANY_MESSAGE_TYPE, HandlerSpy, type HandlerSpyParams, type PublicHandlerSpy, resolveHandlerSpy, type SpyResultInput, TYPE_NOT_RESOLVED, } from './queues/HandlerSpy.ts';
|
|
21
|
+
export type { DefinitionEntry, MessageSchemaContainerOptions, SchemaEntry, } from './queues/MessageSchemaContainer.ts';
|
|
22
22
|
export { MessageSchemaContainer } from './queues/MessageSchemaContainer.ts';
|
|
23
|
+
export type { MessageTypeResolverConfig, MessageTypeResolverContext, MessageTypeResolverFn, } from './queues/MessageTypeResolver.ts';
|
|
24
|
+
export { extractMessageTypeFromSchema, isMessageTypeLiteralConfig, isMessageTypePathConfig, isMessageTypeResolverFnConfig, resolveMessageType, } from './queues/MessageTypeResolver.ts';
|
|
23
25
|
export type { AsyncPublisher, ExtraParams, MessageProcessingResult, QueueConsumer, SchemaMap, SyncPublisher, TransactionObservabilityManager, } from './types/MessageQueueTypes.ts';
|
|
24
26
|
export * from './types/queueOptionsTypes.ts';
|
|
25
27
|
export { isRetryDateExceeded } from './utils/dateUtils.ts';
|
package/dist/index.js
CHANGED
|
@@ -14,9 +14,10 @@ export { isOffloadedPayloadPointerPayload, OFFLOADED_PAYLOAD_POINTER_PAYLOAD_SCH
|
|
|
14
14
|
export { createMultiStoreConfig, isMultiPayloadStoreConfig, } from "./payload-store/payloadStoreTypes.js";
|
|
15
15
|
export * from "./queues/AbstractPublisherManager.js";
|
|
16
16
|
export { AbstractQueueService, } from "./queues/AbstractQueueService.js";
|
|
17
|
-
export { HandlerContainer, MessageHandlerConfig, MessageHandlerConfigBuilder,
|
|
18
|
-
export { HandlerSpy, resolveHandlerSpy, } from "./queues/HandlerSpy.js";
|
|
17
|
+
export { HandlerContainer, MessageHandlerConfig, MessageHandlerConfigBuilder, } from "./queues/HandlerContainer.js";
|
|
18
|
+
export { ANY_MESSAGE_TYPE, HandlerSpy, resolveHandlerSpy, TYPE_NOT_RESOLVED, } from "./queues/HandlerSpy.js";
|
|
19
19
|
export { MessageSchemaContainer } from "./queues/MessageSchemaContainer.js";
|
|
20
|
+
export { extractMessageTypeFromSchema, isMessageTypeLiteralConfig, isMessageTypePathConfig, isMessageTypeResolverFnConfig, resolveMessageType, } from "./queues/MessageTypeResolver.js";
|
|
20
21
|
export * from "./types/queueOptionsTypes.js";
|
|
21
22
|
export { isRetryDateExceeded } from "./utils/dateUtils.js";
|
|
22
23
|
export { isProduction, reloadConfig } from "./utils/envUtils.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,cAAc,8BAA8B,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,cAAc,wBAAwB,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC7D,cAAc,oDAAoD,CAAA;AAClE,OAAO,EAGL,0BAA0B,EAG1B,kBAAkB,GAEnB,MAAM,sDAAsD,CAAA;AAC7D,cAAc,kCAAkC,CAAA;AAChD,cAAc,8BAA8B,CAAA;AAC5C,OAAO,EACL,gCAAgC,EAChC,wCAAwC,EAExC,kBAAkB,GAEnB,MAAM,mDAAmD,CAAA;AAS1D,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,cAAc,sCAAsC,CAAA;AACpD,OAAO,EACL,oBAAoB,GAGrB,MAAM,kCAAkC,CAAA;AAWzC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,cAAc,8BAA8B,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,cAAc,wBAAwB,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC7D,cAAc,oDAAoD,CAAA;AAClE,OAAO,EAGL,0BAA0B,EAG1B,kBAAkB,GAEnB,MAAM,sDAAsD,CAAA;AAC7D,cAAc,kCAAkC,CAAA;AAChD,cAAc,8BAA8B,CAAA;AAC5C,OAAO,EACL,gCAAgC,EAChC,wCAAwC,EAExC,kBAAkB,GAEnB,MAAM,mDAAmD,CAAA;AAS1D,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,cAAc,sCAAsC,CAAA;AACpD,OAAO,EACL,oBAAoB,GAGrB,MAAM,kCAAkC,CAAA;AAWzC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,GAE5B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,gBAAgB,EAChB,UAAU,EAGV,iBAAiB,EAEjB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAM/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAM3E,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,iCAAiC,CAAA;AAUxC,cAAc,8BAA8B,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAA2B,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -11,6 +11,7 @@ import type { DeletionConfig, MessageMetricsManager, QueueDependencies, QueueOpt
|
|
|
11
11
|
import type { BarrierCallback, BarrierResult, MessageHandlerConfig, PreHandlingOutputs, Prehandler, PrehandlerResult } from './HandlerContainer.ts';
|
|
12
12
|
import type { HandlerSpy, PublicHandlerSpy } from './HandlerSpy.ts';
|
|
13
13
|
import { MessageSchemaContainer } from './MessageSchemaContainer.ts';
|
|
14
|
+
import { type MessageTypeResolverConfig } from './MessageTypeResolver.ts';
|
|
14
15
|
export type Deserializer<MessagePayloadType extends object> = (message: unknown, type: ZodType<MessagePayloadType>, errorProcessor: ErrorResolver) => Either<MessageInvalidFormatError | MessageValidationError, MessagePayloadType>;
|
|
15
16
|
type CommonQueueLocator = {
|
|
16
17
|
queueName: string;
|
|
@@ -41,7 +42,10 @@ export declare abstract class AbstractQueueService<MessagePayloadSchemas extends
|
|
|
41
42
|
protected readonly errorReporter: ErrorReporter;
|
|
42
43
|
readonly logger: CommonLogger;
|
|
43
44
|
protected readonly messageIdField: string;
|
|
44
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Configuration for resolving message types.
|
|
47
|
+
*/
|
|
48
|
+
protected readonly messageTypeResolver?: MessageTypeResolverConfig;
|
|
45
49
|
protected readonly logMessages: boolean;
|
|
46
50
|
protected readonly creationConfig?: QueueConfiguration;
|
|
47
51
|
protected readonly locatorConfig?: QueueLocatorType;
|
|
@@ -55,12 +59,20 @@ export declare abstract class AbstractQueueService<MessagePayloadSchemas extends
|
|
|
55
59
|
constructor({ errorReporter, logger, messageMetricsManager }: DependenciesType, options: OptionsType);
|
|
56
60
|
protected resolveConsumerMessageSchemaContainer(options: {
|
|
57
61
|
handlers: MessageHandlerConfig<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput>[];
|
|
58
|
-
|
|
62
|
+
messageTypeResolver?: MessageTypeResolverConfig;
|
|
59
63
|
}): MessageSchemaContainer<MessagePayloadSchemas>;
|
|
60
64
|
protected resolvePublisherMessageSchemaContainer(options: {
|
|
61
65
|
messageSchemas: readonly ZodSchema<MessagePayloadSchemas>[];
|
|
62
|
-
|
|
66
|
+
messageTypeResolver?: MessageTypeResolverConfig;
|
|
63
67
|
}): MessageSchemaContainer<MessagePayloadSchemas>;
|
|
68
|
+
/**
|
|
69
|
+
* Resolves message type from message data and optional attributes using messageTypeResolver.
|
|
70
|
+
*
|
|
71
|
+
* @param messageData - The parsed message data
|
|
72
|
+
* @param messageAttributes - Optional message-level attributes (e.g., PubSub attributes)
|
|
73
|
+
* @returns The resolved message type, or undefined if not configured
|
|
74
|
+
*/
|
|
75
|
+
protected resolveMessageTypeFromMessage(messageData: unknown, messageAttributes?: Record<string, unknown>): string | undefined;
|
|
64
76
|
protected abstract resolveSchema(message: MessagePayloadSchemas): Either<Error, ZodSchema<MessagePayloadSchemas>>;
|
|
65
77
|
protected abstract resolveMessage(message: MessageEnvelopeType): Either<MessageInvalidFormatError | MessageValidationError, ResolvedMessage>;
|
|
66
78
|
/**
|