@message-queue-toolkit/core 24.0.0 → 24.2.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 ADDED
@@ -0,0 +1,360 @@
1
+ # @message-queue-toolkit/core
2
+
3
+ Core library for message-queue-toolkit. Provides foundational abstractions, utilities, and base classes for building message queue publishers and consumers.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Installation](#installation)
8
+ - [Overview](#overview)
9
+ - [Core Concepts](#core-concepts)
10
+ - [Message Schemas](#message-schemas)
11
+ - [Handler Configuration](#handler-configuration)
12
+ - [Pre-handlers and Barriers](#pre-handlers-and-barriers)
13
+ - [Handler Spies](#handler-spies)
14
+ - [Key Classes](#key-classes)
15
+ - [AbstractQueueService](#abstractqueueservice)
16
+ - [MessageHandlerConfigBuilder](#messagehandlerconfigbuilder)
17
+ - [HandlerContainer](#handlercontainer)
18
+ - [MessageSchemaContainer](#messageschemacontainer)
19
+ - [AbstractPublisherManager](#abstractpublishermanager)
20
+ - [DomainEventEmitter](#domaineventemitter)
21
+ - [Utilities](#utilities)
22
+ - [NO_MESSAGE_TYPE_FIELD](#no_message_type_field)
23
+ - [Error Classes](#error-classes)
24
+ - [Message Deduplication](#message-deduplication)
25
+ - [Payload Offloading](#payload-offloading)
26
+ - [API Reference](#api-reference)
27
+ - [Links](#links)
28
+
29
+ ## Installation
30
+
31
+ ```bash
32
+ npm install @message-queue-toolkit/core zod
33
+ ```
34
+
35
+ **Peer Dependencies:**
36
+ - `zod` - Schema validation
37
+
38
+ ## Overview
39
+
40
+ The core package provides the foundational building blocks used by all protocol-specific implementations (SQS, SNS, AMQP, Kafka, GCP Pub/Sub). It includes:
41
+
42
+ - **Base Classes**: Abstract classes for publishers and consumers
43
+ - **Handler System**: Type-safe message routing and handling
44
+ - **Validation**: Zod schema validation and message parsing
45
+ - **Utilities**: Retry logic, date handling, environment utilities
46
+ - **Testing**: Handler spies for testing async message flows
47
+ - **Extensibility**: Interfaces for payload stores, deduplication stores, and metrics
48
+
49
+ ## Core Concepts
50
+
51
+ ### Message Schemas
52
+
53
+ Messages are validated using Zod schemas. The library uses configurable field names:
54
+
55
+ - **`messageTypeField`** (required): Field containing the message type discriminator (must be `z.literal()` for routing)
56
+ - **`messageIdField`** (default: `'id'`): Field containing the message ID
57
+ - **`messageTimestampField`** (default: `'timestamp'`): Field containing the timestamp
58
+
59
+ ```typescript
60
+ import { z } from 'zod'
61
+
62
+ const UserCreatedSchema = z.object({
63
+ id: z.string(),
64
+ type: z.literal('user.created'), // Used for routing
65
+ timestamp: z.string().datetime(),
66
+ userId: z.string(),
67
+ email: z.string().email(),
68
+ })
69
+
70
+ type UserCreated = z.infer<typeof UserCreatedSchema>
71
+ ```
72
+
73
+ ### Handler Configuration
74
+
75
+ Use `MessageHandlerConfigBuilder` to configure handlers for different message types:
76
+
77
+ ```typescript
78
+ import { MessageHandlerConfigBuilder } from '@message-queue-toolkit/core'
79
+
80
+ const handlers = new MessageHandlerConfigBuilder<SupportedMessages, ExecutionContext>()
81
+ .addConfig(
82
+ UserCreatedSchema,
83
+ async (message, context, preHandlingOutputs) => {
84
+ await context.userService.createUser(message.userId)
85
+ return { result: 'success' }
86
+ }
87
+ )
88
+ .addConfig(
89
+ UserUpdatedSchema,
90
+ async (message, context, preHandlingOutputs) => {
91
+ await context.userService.updateUser(message.userId, message.changes)
92
+ return { result: 'success' }
93
+ }
94
+ )
95
+ .build()
96
+ ```
97
+
98
+ ### Pre-handlers and Barriers
99
+
100
+ **Pre-handlers** are middleware functions that run before the main handler:
101
+
102
+ ```typescript
103
+ const preHandlers = [
104
+ (message, context, output, next) => {
105
+ // Enrich context, validate prerequisites, etc.
106
+ output.logger = context.logger.child({ messageId: message.id })
107
+ next({ result: 'success' })
108
+ },
109
+ ]
110
+ ```
111
+
112
+ **Barriers** control whether a message should be processed or retried later:
113
+
114
+ ```typescript
115
+ const preHandlerBarrier = async (message, context, preHandlerOutput) => {
116
+ const prerequisiteMet = await checkPrerequisite(message)
117
+ return {
118
+ isPassing: prerequisiteMet,
119
+ output: { ready: true },
120
+ }
121
+ }
122
+ ```
123
+
124
+ ### Handler Spies
125
+
126
+ Handler spies enable testing of async message flows:
127
+
128
+ ```typescript
129
+ // Enable in consumer/publisher options
130
+ { handlerSpy: true }
131
+
132
+ // Wait for specific messages in tests
133
+ const result = await consumer.handlerSpy.waitForMessageWithId('msg-123', 'consumed', 5000)
134
+ expect(result.userId).toBe('user-456')
135
+ ```
136
+
137
+ ## Key Classes
138
+
139
+ ### AbstractQueueService
140
+
141
+ Base class for all queue services. Provides:
142
+
143
+ - Message serialization/deserialization
144
+ - Schema validation
145
+ - Retry logic with exponential backoff
146
+ - Payload offloading support
147
+ - Message deduplication primitives
148
+
149
+ ### MessageHandlerConfigBuilder
150
+
151
+ Fluent builder for configuring message handlers:
152
+
153
+ ```typescript
154
+ import { MessageHandlerConfigBuilder } from '@message-queue-toolkit/core'
155
+
156
+ const handlers = new MessageHandlerConfigBuilder<
157
+ SupportedMessages,
158
+ ExecutionContext,
159
+ PrehandlerOutput
160
+ >()
161
+ .addConfig(Schema1, handler1)
162
+ .addConfig(Schema2, handler2, {
163
+ preHandlers: [preHandler1, preHandler2],
164
+ preHandlerBarrier: barrierFn,
165
+ messageLogFormatter: (msg) => ({ id: msg.id }),
166
+ })
167
+ .build()
168
+ ```
169
+
170
+ ### HandlerContainer
171
+
172
+ Routes messages to appropriate handlers based on message type:
173
+
174
+ ```typescript
175
+ import { HandlerContainer } from '@message-queue-toolkit/core'
176
+
177
+ const container = new HandlerContainer({
178
+ messageHandlers: handlers,
179
+ messageTypeField: 'type',
180
+ })
181
+
182
+ const handler = container.resolveHandler(message.type)
183
+ ```
184
+
185
+ ### MessageSchemaContainer
186
+
187
+ Manages Zod schemas and validates messages:
188
+
189
+ ```typescript
190
+ import { MessageSchemaContainer } from '@message-queue-toolkit/core'
191
+
192
+ const container = new MessageSchemaContainer({
193
+ messageSchemas: [Schema1, Schema2],
194
+ messageTypeField: 'type',
195
+ })
196
+
197
+ const schema = container.resolveSchema(message.type)
198
+ ```
199
+
200
+ ### AbstractPublisherManager
201
+
202
+ Factory pattern for spawning publishers on demand:
203
+
204
+ ```typescript
205
+ import { AbstractPublisherManager } from '@message-queue-toolkit/core'
206
+
207
+ // Automatically spawns publishers and fills metadata
208
+ await publisherManager.publish('user-events-topic', {
209
+ type: 'user.created',
210
+ userId: 'user-123',
211
+ })
212
+ ```
213
+
214
+ ### DomainEventEmitter
215
+
216
+ Event emitter for domain events:
217
+
218
+ ```typescript
219
+ import { DomainEventEmitter } from '@message-queue-toolkit/core'
220
+
221
+ const emitter = new DomainEventEmitter()
222
+
223
+ emitter.on('user.created', async (event) => {
224
+ console.log('User created:', event.userId)
225
+ })
226
+
227
+ await emitter.emit('user.created', { userId: 'user-123' })
228
+ ```
229
+
230
+ ## Utilities
231
+
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
+ ### Error Classes
252
+
253
+ ```typescript
254
+ import {
255
+ MessageValidationError,
256
+ MessageInvalidFormatError,
257
+ DoNotProcessMessageError,
258
+ RetryMessageLaterError,
259
+ } from '@message-queue-toolkit/core'
260
+
261
+ // Validation failed
262
+ throw new MessageValidationError(zodError.issues)
263
+
264
+ // Message format is invalid (cannot parse)
265
+ throw new MessageInvalidFormatError({ message: 'Invalid JSON' })
266
+
267
+ // Do not process this message (skip without retry)
268
+ throw new DoNotProcessMessageError({ message: 'Duplicate message' })
269
+
270
+ // Retry this message later
271
+ throw new RetryMessageLaterError({ message: 'Dependency not ready' })
272
+ ```
273
+
274
+ ### Message Deduplication
275
+
276
+ Interfaces for implementing deduplication stores:
277
+
278
+ ```typescript
279
+ import type { MessageDeduplicationStore, ReleasableLock } from '@message-queue-toolkit/core'
280
+
281
+ // Implement custom deduplication store
282
+ class MyDeduplicationStore implements MessageDeduplicationStore {
283
+ async keyExists(key: string): Promise<boolean> { /* ... */ }
284
+ async setKey(key: string, ttlSeconds: number): Promise<void> { /* ... */ }
285
+ async acquireLock(key: string, options: AcquireLockOptions): Promise<ReleasableLock> { /* ... */ }
286
+ }
287
+ ```
288
+
289
+ ### Payload Offloading
290
+
291
+ Interfaces for implementing payload stores:
292
+
293
+ ```typescript
294
+ import type { PayloadStore, PayloadStoreConfig } from '@message-queue-toolkit/core'
295
+
296
+ // Implement custom payload store
297
+ class MyPayloadStore implements PayloadStore {
298
+ async storePayload(payload: Buffer, messageId: string): Promise<PayloadRef> { /* ... */ }
299
+ async retrievePayload(ref: PayloadRef): Promise<Buffer> { /* ... */ }
300
+ }
301
+ ```
302
+
303
+ ## API Reference
304
+
305
+ ### Types
306
+
307
+ ```typescript
308
+ // Handler result type
309
+ type HandlerResult = Either<'retryLater', 'success'>
310
+
311
+ // Pre-handler signature
312
+ type Prehandler<Message, Context, Output> = (
313
+ message: Message,
314
+ context: Context,
315
+ output: Output,
316
+ next: (result: PrehandlerResult) => void
317
+ ) => void
318
+
319
+ // Barrier signature
320
+ type BarrierCallback<Message, Context, PrehandlerOutput, BarrierOutput> = (
321
+ message: Message,
322
+ context: Context,
323
+ preHandlerOutput: PrehandlerOutput
324
+ ) => Promise<BarrierResult<BarrierOutput>>
325
+
326
+ // Barrier result
327
+ type BarrierResult<Output> =
328
+ | { isPassing: true; output: Output }
329
+ | { isPassing: false; output?: never }
330
+ ```
331
+
332
+ ### Utility Functions
333
+
334
+ ```typescript
335
+ // Environment utilities
336
+ isProduction(): boolean
337
+ reloadConfig(): void
338
+
339
+ // Date utilities
340
+ isRetryDateExceeded(timestamp: string | Date, maxRetryDuration: number): boolean
341
+
342
+ // Message parsing
343
+ parseMessage<T>(data: unknown, schema: ZodSchema<T>): ParseMessageResult<T>
344
+
345
+ // Wait utilities
346
+ waitAndRetry<T>(fn: () => Promise<T>, options: WaitAndRetryOptions): Promise<T>
347
+
348
+ // Object utilities
349
+ objectMatches(obj: unknown, pattern: unknown): boolean
350
+ isShallowSubset(subset: object, superset: object): boolean
351
+ ```
352
+
353
+ ## Links
354
+
355
+ - [Main Repository](https://github.com/kibertoad/message-queue-toolkit)
356
+ - [SQS Package](https://www.npmjs.com/package/@message-queue-toolkit/sqs)
357
+ - [SNS Package](https://www.npmjs.com/package/@message-queue-toolkit/sns)
358
+ - [AMQP Package](https://www.npmjs.com/package/@message-queue-toolkit/amqp)
359
+ - [GCP Pub/Sub Package](https://www.npmjs.com/package/@message-queue-toolkit/gcp-pubsub)
360
+ - [Kafka Package](https://www.npmjs.com/package/@message-queue-toolkit/kafka)
@@ -23,7 +23,7 @@ export declare class DomainEventEmitter<SupportedEvents extends CommonEventDefin
23
23
  constructor(deps: DomainEventEmitterDependencies<SupportedEvents>, options?: {
24
24
  handlerSpy?: HandlerSpy<object> | HandlerSpyParams | boolean;
25
25
  });
26
- get handlerSpy(): PublicHandlerSpy<CommonEventDefinitionPublisherSchemaType<SupportedEvents[number]>>;
26
+ get handlerSpy(): PublicHandlerSpy<CommonEventDefinitionConsumerSchemaType<SupportedEvents[number]>>;
27
27
  dispose(): Promise<void>;
28
28
  emit<SupportedEvent extends SupportedEvents[number]>(supportedEvent: SupportedEvent, data: Omit<CommonEventDefinitionPublisherSchemaType<SupportedEvent>, 'type'>, precedingMessageMetadata?: Partial<ConsumerMessageMetadataType>): Promise<Omit<CommonEventDefinitionConsumerSchemaType<SupportedEvent>, 'type'>>;
29
29
  /**
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@ 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, type PrehandlerResult, } from './queues/HandlerContainer.ts';
19
+ export { HandlerContainer, MessageHandlerConfig, MessageHandlerConfigBuilder, NO_MESSAGE_TYPE_FIELD, type PrehandlerResult, } from './queues/HandlerContainer.ts';
20
20
  export { HandlerSpy, type HandlerSpyParams, type PublicHandlerSpy, resolveHandlerSpy, type SpyResultInput, } from './queues/HandlerSpy.ts';
21
21
  export type { MessageSchemaContainerOptions } from './queues/MessageSchemaContainer.ts';
22
22
  export { MessageSchemaContainer } from './queues/MessageSchemaContainer.ts';
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ 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, } from "./queues/HandlerContainer.js";
17
+ export { HandlerContainer, MessageHandlerConfig, MessageHandlerConfigBuilder, NO_MESSAGE_TYPE_FIELD, } from "./queues/HandlerContainer.js";
18
18
  export { HandlerSpy, resolveHandlerSpy, } from "./queues/HandlerSpy.js";
19
19
  export { MessageSchemaContainer } from "./queues/MessageSchemaContainer.js";
20
20
  export * from "./types/queueOptionsTypes.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,GAE5B,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,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"}
@@ -83,10 +83,21 @@ export type HandlerContainerOptions<MessagePayloadSchemas extends object, Execut
83
83
  messageHandlers: MessageHandlerConfig<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput>[];
84
84
  messageTypeField: string;
85
85
  };
86
+ /**
87
+ * Use this constant as `messageTypeField` value when your consumer should accept
88
+ * all message types without routing by type. When used, a single handler will
89
+ * process all incoming messages regardless of their type field value.
90
+ */
91
+ export declare const NO_MESSAGE_TYPE_FIELD = "";
86
92
  export declare class HandlerContainer<MessagePayloadSchemas extends object, ExecutionContext, PrehandlerOutput = undefined> {
87
93
  private readonly messageHandlers;
88
94
  private readonly messageTypeField;
89
95
  constructor(options: HandlerContainerOptions<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput>);
90
- resolveHandler<PrehandlerOutput = undefined, BarrierOutput = undefined>(messageType: string): MessageHandlerConfig<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput, BarrierOutput>;
96
+ /**
97
+ * Resolves a handler for the given message type.
98
+ * When messageTypeField is NO_MESSAGE_TYPE_FIELD (empty string), pass undefined as messageType
99
+ * to get the default handler.
100
+ */
101
+ resolveHandler<PrehandlerOutput = undefined, BarrierOutput = undefined>(messageType: string | undefined): MessageHandlerConfig<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput, BarrierOutput>;
91
102
  private resolveHandlerMap;
92
103
  }
@@ -73,6 +73,13 @@ export class MessageHandlerConfigBuilder {
73
73
  return this.configs;
74
74
  }
75
75
  }
76
+ /**
77
+ * Use this constant as `messageTypeField` value when your consumer should accept
78
+ * all message types without routing by type. When used, a single handler will
79
+ * process all incoming messages regardless of their type field value.
80
+ */
81
+ export const NO_MESSAGE_TYPE_FIELD = '';
82
+ const DEFAULT_HANDLER_KEY = 'NO_MESSAGE_TYPE';
76
83
  export class HandlerContainer {
77
84
  messageHandlers;
78
85
  messageTypeField;
@@ -80,19 +87,31 @@ export class HandlerContainer {
80
87
  this.messageTypeField = options.messageTypeField;
81
88
  this.messageHandlers = this.resolveHandlerMap(options.messageHandlers);
82
89
  }
90
+ /**
91
+ * Resolves a handler for the given message type.
92
+ * When messageTypeField is NO_MESSAGE_TYPE_FIELD (empty string), pass undefined as messageType
93
+ * to get the default handler.
94
+ */
83
95
  resolveHandler(messageType) {
84
- const handler = this.messageHandlers[messageType];
96
+ const handlerKey = messageType ?? DEFAULT_HANDLER_KEY;
97
+ const handler = this.messageHandlers[handlerKey];
85
98
  if (!handler) {
86
- throw new Error(`Unsupported message type: ${messageType}`);
99
+ throw new Error(`Unsupported message type: ${handlerKey}`);
87
100
  }
88
101
  // @ts-expect-error
89
102
  return handler;
90
103
  }
91
104
  resolveHandlerMap(supportedHandlers) {
92
105
  return supportedHandlers.reduce((acc, entry) => {
93
- // @ts-expect-error
94
- const messageType = entry.schema.shape[this.messageTypeField].value;
95
- acc[messageType] = entry;
106
+ // When messageTypeField is empty (NO_MESSAGE_TYPE_FIELD), use DEFAULT_HANDLER_KEY
107
+ // This allows a single handler to process all message types
108
+ let messageType;
109
+ if (this.messageTypeField) {
110
+ // @ts-expect-error
111
+ messageType = entry.schema.shape[this.messageTypeField]?.value;
112
+ }
113
+ const handlerKey = messageType ?? DEFAULT_HANDLER_KEY;
114
+ acc[handlerKey] = entry;
96
115
  return acc;
97
116
  }, {});
98
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HandlerContainer.js","sourceRoot":"","sources":["../../lib/queues/HandlerContainer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AA+CxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAuB,OAA6B,EAAE,EAAE,CAAC,OAAO,CAAA;AAkBnG,MAAM,OAAO,oBAAoB;IAMf,MAAM,CAAiC;IACvC,UAAU,CAAwB;IAClC,OAAO,CAKtB;IACe,mBAAmB,CAAoC;IACvD,iBAAiB,CAKhC;IACe,WAAW,CAIxB;IAEH,YACE,MAAuC,EACvC,OAAyF,EACzF,OAKC,EACD,eAAuC;QAEvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,UAAU,GAAG,eAAe,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,mBAAmB,CAAA;QAC9E,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,CAAA;QACnD,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE,CAAA;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,2BAA2B;IAKrB,OAAO,CAMrB;IAEH;QACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,SAAS,CACP,MAA+D,EAC/D,OAAyF,EACzF,OAKC;QAED,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC;YACnD,CAAC,CAAC,aAAa;gBACZ,MAAM,CAAC,cAAkD;YAC5D,CAAC,CAAC,MAAM,CAAA;QACV,MAAM,UAAU,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;QAEvE,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,IAAI,oBAAoB,CAMtB,aAAa;QACb,mBAAmB;QACnB,OAAO,EACP,OAAO,EACP,UAAU,CACX,CACF,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAuBD,MAAM,OAAO,gBAAgB;IAKV,eAAe,CAG/B;IACgB,gBAAgB,CAAQ;IAEzC,YACE,OAA2F;QAE3F,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IACxE,CAAC;IAEM,cAAc,CACnB,WAAmB;QAOnB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAA;QAC7D,CAAC;QACD,mBAAmB;QACnB,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,iBAAiB,CACvB,iBAIG;QAKH,OAAO,iBAAiB,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACb,mBAAmB;YACnB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAA;YACnE,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAA;YACxB,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAGC,CACF,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"HandlerContainer.js","sourceRoot":"","sources":["../../lib/queues/HandlerContainer.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ export declare class HandlerSpy<MessagePayloadSchemas extends object> {
29
29
  checkForMessage<T extends MessagePayloadSchemas>(expectedFields: DeepPartial<T>, status?: MessageProcessingResultStatus): SpyResultOutput<T> | undefined;
30
30
  waitForMessage<T extends MessagePayloadSchemas>(expectedFields: DeepPartial<T>, status?: MessageProcessingResultStatus): Promise<SpyResultOutput<T>>;
31
31
  clear(): void;
32
+ getAllReceivedMessages(): SpyResultOutput<MessagePayloadSchemas>[];
32
33
  addProcessedMessage(processingResult: SpyResultInput<MessagePayloadSchemas>, messageId?: string): void;
33
34
  }
34
35
  export declare function resolveHandlerSpy<T extends object>(queueOptions: {
@@ -56,6 +56,9 @@ export class HandlerSpy {
56
56
  clear() {
57
57
  this.messageBuffer.clear();
58
58
  }
59
+ getAllReceivedMessages() {
60
+ return Object.values(this.messageBuffer.items).map((item) => item.value);
61
+ }
59
62
  addProcessedMessage(processingResult, messageId) {
60
63
  const resolvedMessageId = processingResult.message?.[this.messageIdField] ?? messageId ?? randomUUID();
61
64
  const resolvedMessageType = processingResult.message?.[this.messageTypeField] ?? 'FAILED_TO_RESOLVE';
@@ -1 +1 @@
1
- {"version":3,"file":"HandlerSpy.js","sourceRoot":"","sources":["../../lib/queues/HandlerSpy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HandlerSpy.js","sourceRoot":"","sources":["../../lib/queues/HandlerSpy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAMjC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA6BtD,MAAM,UAAU,YAAY,CAAmB,KAAc;IAC3D,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,CAAC,KAAK,YAAY,UAAU,IAAK,KAAuC,CAAC,IAAI,KAAK,YAAY,CAAC,CAChG,CAAA;AACH,CAAC;AAoBD,MAAM,OAAO,UAAU;IACd,IAAI,GAAG,YAAY,CAAA;IAC1B,+DAA+D;IAC9C,aAAa,CAA2B;IACxC,cAAc,CAA6B;IAC3C,gBAAgB,CAA6B;IAC7C,WAAW,CAA6C;IAEzE,YAAY,SAA2B,EAAE;QACvC,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAA;QACvD,mBAAmB;QACnB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAA;QACnD,mBAAmB;QACnB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAA;QACzD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;IACvB,CAAC;IAEO,oBAAoB,CAC1B,SAA6B,EAC7B,MAA0C,EAC1C,MAAsC;QAEtC,OAAO,CACL,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC;YACxC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,MAAM,KAAK,MAAM,CAAC,CAC1D,CAAA;IACH,CAAC;IAED,oBAAoB,CAClB,EAAU,EACV,MAAsC;QAEtC,OAAO,IAAI,CAAC,cAAc;QACxB,mBAAmB;QACnB,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAC7B,MAAM,CACP,CAAA;IACH,CAAC;IAED,eAAe,CACb,cAA8B,EAC9B,MAAsC;QAEtC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YAChE,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,CAAA;QAC3E,CAAC,CAAC,EAAE,KAAK,CAAA;IACX,CAAC;IAED,cAAc,CACZ,cAA8B,EAC9B,MAAsC;QAEtC,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAC1E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,OAA8E,CAAA;QAClF,MAAM,UAAU,GAAG,IAAI,OAAO,CAAqB,CAAC,QAAQ,EAAE,EAAE;YAC9D,OAAO,GAAG,QAAQ,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,UAAU;YACnB,MAAM;YACN,MAAM,EAAE,cAAc;YACtB,mBAAmB;YACnB,OAAO;SACR,CAAC,CAAA;QAEF,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,sBAAsB;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1E,CAAC;IAED,mBAAmB,CAAC,gBAAuD,EAAE,SAAkB;QAC7F,MAAM,iBAAiB,GACrB,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,SAAS,IAAI,UAAU,EAAE,CAAA;QAE9E,MAAM,mBAAmB,GACvB,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,CAAA;QAE1E,kEAAkE;QAClE,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,OAAO;YACvD,CAAC,CAAE,gBAA2D;YAC9D,CAAC,CAAE;gBACC,GAAG,gBAAgB;gBACnB,OAAO,EAAE;oBACP,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS;oBAChC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,mBAAmB;iBAC7C;aACyC,CAAA;QAEhD,MAAM,OAAO,GAAG,GAAG,iBAAiB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;aACtE,QAAQ,CAAC,EAAE,CAAC;aACZ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;QACjB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAA;QAEzD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;YACxD,OAAO,IAAI,CAAC,oBAAoB,CAC9B,wBAAwB,EACxB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,CAClB,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;YAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YACpD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,uCAAuC;gBACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,2CAA2C;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAmB,YAEnD;IACC,IAAI,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC,UAAsC,CAAA;IAC5D,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,YAAY,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO,IAAI,UAAU,EAA8B,CAAA;IACrD,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,UAAU,CAA6B,CAAA;AAC5E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@message-queue-toolkit/core",
3
- "version": "24.0.0",
3
+ "version": "24.2.0",
4
4
  "license": "MIT",
5
5
  "description": "Useful utilities, interfaces and base classes for message queue handling. Supports AMQP and SQS with a common abstraction on top currently",
6
6
  "maintainers": [
@@ -37,10 +37,10 @@
37
37
  "zod": ">=3.25.76 <5.0.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@biomejs/biome": "^2.3.6",
40
+ "@biomejs/biome": "^2.3.8",
41
41
  "@lokalise/biome-config": "^3.1.0",
42
42
  "@lokalise/tsconfig": "^3.0.0",
43
- "@types/node": "^24.0.3",
43
+ "@types/node": "^24.10.1",
44
44
  "@types/tmp": "^0.2.6",
45
45
  "@vitest/coverage-v8": "^3.2.4",
46
46
  "awilix": "^12.0.5",