@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 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
- - **`messageTypeField`** (required): Field containing the message type discriminator (must be `z.literal()` for routing)
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
- messageTypeField: 'type',
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
- messageTypeField: 'type',
541
+ messageSchemas: [{ schema: Schema1 }, { schema: Schema2 }],
542
+ messageDefinitions: [],
543
+ messageTypeResolver: { messageTypePath: 'type' },
195
544
  })
196
545
 
197
- const schema = container.resolveSchema(message.type)
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAGL,aAAa,EACb,2BAA2B,GAE5B,MAAM,qBAAqB,CAAA;AAI5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAyB3D,MAAM,OAAO,kBAAkB;IACZ,aAAa,CAAgC;IAC7C,cAAc,CAAgB;IAC9B,MAAM,CAAc;IACpB,aAAa,CAAgB;IAC7B,+BAA+B,CAAkC;IACjE,WAAW,CAE3B;IAEgB,eAAe,CAG/B;IACgB,oCAAoC,CAA4B;IAEjF,YACE,IAAqD,EACrD,UAEI,EAAE;QAEN,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;QACvC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,+BAA+B,CAAA;QAE3E,IAAI,CAAC,WAAW;YACd,iBAAiB,CAAmE,OAAO,CAAC,CAAA;QAE9F,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAA;QAChC,IAAI,CAAC,oCAAoC,GAAG,IAAI,GAAG,EAAE,CAAA;IACvD,CAAC;IAED,IAAI,UAAU;QAGZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,MAAM,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,oCAAoC,CAAC,KAAK,EAAE,CAAA;QACjD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC5B,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAA;IAC3B,CAAC;IAEM,KAAK,CAAC,IAAI,CACf,cAA8B,EAC9B,IAA4E,EAC5E,wBAA+D;QAE/D,MAAM,aAAa,GAAG,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;QACrE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,aAAa,CAAC;gBACtB,SAAS,EAAE,eAAe;gBAC1B,OAAO,EAAE,iBAAiB,aAAa,EAAE;aAC1C,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAA;QAC5E,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAA;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe;YACjD,mBAAmB;YACnB,IAAI,EACJ,cAAc,EACd,wBAAwB,IAAI,EAAE,CAC/B,CAAA;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa;YAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAA;QAE/F,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;aACtC,4BAA4B,CAAC,aAAa,CAAC;aAC3C,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;QAE1D,mBAAmB;QACnB,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;QAEtC,mBAAmB;QACnB,OAAO,cAAc,CAAA;IACvB,CAAC;IAED;;OAEG;IACI,EAAE,CACP,aAA4B,EAC5B,OAA2D,EAC3D,mBAAmB,GAAG,KAAK;QAE3B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7E,CAAC;QAED,IAAI,mBAAmB;YAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;YACrF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxE,CAAC;IAED;;OAEG;IACI,MAAM,CACX,cAA+B,EAC/B,OAA2D,EAC3D,mBAAmB,GAAG,KAAK;QAE3B,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAyC,EAAE,mBAAmB,GAAG,KAAK;QACjF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAA;IAC/F,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,KAA8D;QAE9D,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1D,IAAI,CAAC,aAAa;YAAE,OAAM;QAE1B,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACvD,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAC3B,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAC1F,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,oCAAoC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC1D,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAM;YAC7B,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAClC;gBACE,OAAO,EAAE,KAAK;gBACd,gBAAgB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;aACzC,EACD,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,IAAI,CACX,CAAA;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,oCAAoC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;IACpE,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,KAA8D,EAC9D,OAA8E,EAC9E,mBAA4B;QAE5B,MAAM,aAAa,GAAG,UAAU,EAAE,CAAA;QAClC,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,+BAA+B,EAAE,cAAc,CAClD,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAC7D,aAAa,EACb,KAAK,CAAC,IAAI,CACX,CAAA;YACD,MAAM,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAChC,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,mBAAmB;gBAAE,MAAM,KAAK,CAAA;YAErC,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,aAAa;aAC9C,CAAA;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAChB,GAAG,2BAA2B,CAAC,KAAK,CAAC;gBACrC,GAAG,OAAO;aACX,CAAC,CAAA;YACF,uEAAuE;YACvE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAY,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,+BAA+B,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IAEO,mBAAmB,CACzB,KAA8D,EAC9D,OAA8E,EAC9E,mBAA4B;QAE5B,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,mBAAmB,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAA;IACtG,CAAC;CACF"}
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, NO_MESSAGE_TYPE_FIELD, type PrehandlerResult, } from './queues/HandlerContainer.ts';
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, NO_MESSAGE_TYPE_FIELD, } from "./queues/HandlerContainer.js";
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,EAC3B,qBAAqB,GAEtB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,UAAU,EAGV,iBAAiB,GAElB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAU3E,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"}
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
- protected readonly messageTypeField: string;
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
- messageTypeField: string;
62
+ messageTypeResolver?: MessageTypeResolverConfig;
59
63
  }): MessageSchemaContainer<MessagePayloadSchemas>;
60
64
  protected resolvePublisherMessageSchemaContainer(options: {
61
65
  messageSchemas: readonly ZodSchema<MessagePayloadSchemas>[];
62
- messageTypeField: string;
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
  /**