@warlock.js/herald 5.31.0 → 5.32.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.
Files changed (59) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/cjs/index.cjs +4 -3
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/communicators/broker-registry.d.mts +4 -3
  5. package/esm/communicators/broker-registry.d.mts.map +1 -1
  6. package/esm/communicators/broker.d.mts +5 -3
  7. package/esm/communicators/broker.d.mts.map +1 -1
  8. package/esm/communicators/index.d.mts +2 -1
  9. package/esm/communicators/index.mjs +1 -1
  10. package/esm/contracts/broker-driver.contract.d.mts +2 -2
  11. package/esm/contracts/broker-driver.contract.d.mts.map +1 -1
  12. package/esm/contracts/channel.contract.d.mts +2 -2
  13. package/esm/contracts/channel.contract.d.mts.map +1 -1
  14. package/esm/contracts/index.d.mts +2 -1
  15. package/esm/decorators/consumable.d.mts +3 -5
  16. package/esm/decorators/consumable.d.mts.map +1 -1
  17. package/esm/decorators/index.d.mts +2 -1
  18. package/esm/decorators/index.mjs +1 -1
  19. package/esm/drivers/index.d.mts +3 -1
  20. package/esm/drivers/index.mjs +1 -1
  21. package/esm/drivers/rabbitmq/index.d.mts +2 -1
  22. package/esm/drivers/rabbitmq/index.mjs +1 -1
  23. package/esm/drivers/rabbitmq/rabbitmq-channel.d.mts +3 -2
  24. package/esm/drivers/rabbitmq/rabbitmq-channel.d.mts.map +1 -1
  25. package/esm/drivers/rabbitmq/rabbitmq-channel.mjs +4 -3
  26. package/esm/drivers/rabbitmq/rabbitmq-channel.mjs.map +1 -1
  27. package/esm/drivers/rabbitmq/rabbitmq-driver.d.mts +3 -2
  28. package/esm/drivers/rabbitmq/rabbitmq-driver.d.mts.map +1 -1
  29. package/esm/index.d.mts +7 -0
  30. package/esm/message-managers/event-consumer.d.mts +3 -4
  31. package/esm/message-managers/event-consumer.d.mts.map +1 -1
  32. package/esm/message-managers/event-message.d.mts +3 -4
  33. package/esm/message-managers/event-message.d.mts.map +1 -1
  34. package/esm/message-managers/index.d.mts +2 -1
  35. package/esm/message-managers/index.mjs +1 -1
  36. package/esm/message-managers/types.d.mts +3 -3
  37. package/esm/message-managers/types.d.mts.map +1 -1
  38. package/esm/types/channel.types.d.mts +2 -4
  39. package/esm/types/channel.types.d.mts.map +1 -1
  40. package/esm/types/connection.types.d.mts +8 -9
  41. package/esm/types/connection.types.d.mts.map +1 -1
  42. package/esm/types/driver.types.d.mts +4 -5
  43. package/esm/types/driver.types.d.mts.map +1 -1
  44. package/esm/types/index.d.mts +2 -1
  45. package/esm/types/message.types.d.mts +6 -7
  46. package/esm/types/message.types.d.mts.map +1 -1
  47. package/esm/types/publish.types.d.mts +2 -3
  48. package/esm/types/publish.types.d.mts.map +1 -1
  49. package/esm/types/registry.types.d.mts +2 -4
  50. package/esm/types/registry.types.d.mts.map +1 -1
  51. package/esm/types/subscribe.types.d.mts +3 -4
  52. package/esm/types/subscribe.types.d.mts.map +1 -1
  53. package/esm/use-case-broadcast.d.mts +2 -3
  54. package/esm/use-case-broadcast.d.mts.map +1 -1
  55. package/esm/utils/connect-to-broker.d.mts +9 -6
  56. package/esm/utils/connect-to-broker.d.mts.map +1 -1
  57. package/esm/utils/index.d.mts +2 -1
  58. package/esm/utils/index.mjs +1 -1
  59. package/package.json +3 -3
@@ -1,2 +1,3 @@
1
1
  import { RabbitMQDriver } from "./rabbitmq-driver.mjs";
2
- import { RabbitMQChannel } from "./rabbitmq-channel.mjs";
2
+ import { RabbitMQChannel } from "./rabbitmq-channel.mjs";
3
+ export { RabbitMQChannel, RabbitMQDriver };
@@ -1,4 +1,4 @@
1
1
  import { RabbitMQChannel } from "./rabbitmq-channel.mjs";
2
2
  import { RabbitMQDriver } from "./rabbitmq-driver.mjs";
3
3
 
4
- export { };
4
+ export { RabbitMQChannel, RabbitMQDriver };
@@ -3,6 +3,8 @@ import { ChannelOptions, ChannelStats } from "../../types/channel.types.mjs";
3
3
  import { MessageHandler, ResponseHandler, Subscription } from "../../types/message.types.mjs";
4
4
  import { PublishOptions, RequestOptions } from "../../types/publish.types.mjs";
5
5
  import { ChannelContract } from "../../contracts/channel.contract.mjs";
6
+ import "../../contracts/index.mjs";
7
+ import "../../types/index.mjs";
6
8
  //#region ../../packages/herald/src/drivers/rabbitmq/rabbitmq-channel.d.ts
7
9
  /**
8
10
  * RabbitMQ Channel Implementation
@@ -11,7 +13,7 @@ import { ChannelContract } from "../../contracts/channel.contract.mjs";
11
13
  *
12
14
  * @template TPayload - The typed payload
13
15
  */
14
- declare class RabbitMQChannel<TPayload = unknown> implements ChannelContract<TPayload> {
16
+ export declare class RabbitMQChannel<TPayload = unknown> implements ChannelContract<TPayload> {
15
17
  readonly name: string;
16
18
  readonly options: ChannelOptions<TPayload>;
17
19
  private readonly amqpChannel;
@@ -103,5 +105,4 @@ declare class RabbitMQChannel<TPayload = unknown> implements ChannelContract<TPa
103
105
  delete(): Promise<void>;
104
106
  }
105
107
  //#endregion
106
- export { RabbitMQChannel };
107
108
  //# sourceMappingURL=rabbitmq-channel.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rabbitmq-channel.d.mts","names":[],"sources":["../../../../../../../../../packages/herald/src/drivers/rabbitmq/rabbitmq-channel.ts"],"mappings":";;;;;;;;;;;;;cAyBa,eAAA,gCAA+C,eAAA,CAAgB,QAAA;EAAA,SAC1D,IAAA;EAAA,SACA,OAAA,EAAS,cAAA,CAAe,QAAA;EAAA,iBAEvB,WAAA;EAAA,iBACA,aAAA;EAAA,QACT,QAAA;EAKoE;;;cAAzD,IAAA,UAAc,WAAA,OAAkB,OAAA,GAAU,cAAA,CAAe,QAAA;EA6B1B;;;EApBrC,MAAA,IAAU,OAAA;EAyEoD;;;EArD9D,OAAA,CAAQ,OAAA,EAAS,QAAA,EAAU,OAAA,GAAU,cAAA,GAAiB,OAAA;EAsExD;;;EAjBE,YAAA,CAAa,QAAA,EAAU,QAAA,IAAY,OAAA,GAAU,cAAA,GAAiB,OAAA;EAmShE;;;;;;;;EArRE,SAAA,CACX,OAAA,EAAS,cAAA,CAAe,QAAA,GACxB,OAAA,GAAU,gBAAA,GACT,OAAA,CAAQ,YAAA;EAqVmB;;;EArLjB,eAAA,CAAgB,UAAA,WAAqB,OAAA;EA0N3B;;;;EA9MV,aAAA,IAAiB,OAAA;EA1R4B;;;EAAA,QAkS5C,gBAAA;EAhSW;;;;;;EAAA,QAqTjB,mBAAA;EA5SyB;;;;;;;;;;;;;;EAAA,QAiUnB,aAAA;EA/O4C;;;EAkS7C,OAAA,sBACX,OAAA,EAAS,QAAA,EACT,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,SAAA;EAtRA;;;EA0UE,OAAA,sBACX,OAAA,EAAS,eAAA,CAAgB,QAAA,EAAU,SAAA,IAClC,OAAA,CAAQ,YAAA;EA3UT;;;EAsVW,KAAA,IAAS,OAAA,CAAQ,YAAA;EArLD;;;EAoMhB,KAAA,IAAS,OAAA;EAhLR;;;EA0LD,MAAA,IAAU,OAAA;EA7FF;;;EAyGR,MAAA,IAAU,OAAA;AAAA"}
1
+ {"version":3,"file":"rabbitmq-channel.d.mts","names":[],"sources":["../../../../../../../../../packages/herald/src/drivers/rabbitmq/rabbitmq-channel.ts"],"mappings":";;;;;;;;;;;;;;;qBAyBa,gBAAgB,+BAA+B,gBAAgB;WAC1D;WACA,SAAS,eAAe;mBAEvB;mBACA;UACT;;;;EAKR,YAAmB,cAAc,kBAAkB,UAAU,eAAe;;;;EAS/D,UAAU;;;;EAoBV,QAAQ,SAAS,UAAU,UAAU,iBAAiB;;;;EAqDtD,aAAa,UAAU,YAAY,UAAU,iBAAiB;;;;;;;;;EAc9D,UACX,SAAS,eAAe,WACxB,UAAU,mBACT,QAAQ;;;;EAgKE,gBAAgB,qBAAqB;;;;;EAYrC,iBAAiB;;;;UAQhB;;;;;;;UAqBN;;;;;;;;;;;;;;;UAqBM;;;;EAmDD,QAAQ,qBACnB,SAAS,UACT,UAAU,iBACT,QAAQ;;;;EAoDE,QAAQ,qBACnB,SAAS,gBAAgB,UAAU,aAClC,QAAQ;;;;EAWE,SAAS,QAAQ;;;;EAejB,SAAS;;;;EAUT,UAAU;;;;EAYV,UAAU"}
@@ -249,9 +249,10 @@ var RabbitMQChannel = class {
249
249
  const retryCount = currentRetryCount + 1;
250
250
  const maxRetries = options?.retry?.maxRetries ?? 3;
251
251
  if (retryCount > maxRetries) {
252
- if (options?.deadLetter) if (parsedMessage) await this.sendToDeadLetter(parsedMessage, options.deadLetter.channel);
253
- else this.sendToDeadLetterRaw(msg, options.deadLetter.channel);
254
- else {
252
+ if (options?.deadLetter) {
253
+ if (parsedMessage) await this.sendToDeadLetter(parsedMessage, options.deadLetter.channel);
254
+ else this.sendToDeadLetterRaw(msg, options.deadLetter.channel);
255
+ } else {
255
256
  log.error("herald", "poison-message", `Dropping message on channel "${this.name}" after ${retryCount - 1} failed ${retryCount - 1 === 1 ? "retry" : "retries"} (maxRetries: ${maxRetries}) with no dead-letter channel configured.`, {
256
257
  channel: this.name,
257
258
  retryCount: retryCount - 1,
@@ -1 +1 @@
1
- {"version":3,"file":"rabbitmq-channel.mjs","names":[],"sources":["../../../../../../../../../packages/herald/src/drivers/rabbitmq/rabbitmq-channel.ts"],"sourcesContent":["import { log } from \"@warlock.js/logger\";\nimport { v } from \"@warlock.js/seal\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ChannelContract } from \"../../contracts\";\nimport type {\n ChannelOptions,\n ChannelStats,\n Message,\n MessageContext,\n MessageHandler,\n MessageMetadata,\n PublishOptions,\n RequestOptions,\n ResponseHandler,\n SubscribeOptions,\n Subscription,\n} from \"../../types\";\n\n/**\n * RabbitMQ Channel Implementation\n *\n * Wraps a RabbitMQ queue/exchange with a unified API.\n *\n * @template TPayload - The typed payload\n */\nexport class RabbitMQChannel<TPayload = unknown> implements ChannelContract<TPayload> {\n public readonly name: string;\n public readonly options: ChannelOptions<TPayload>;\n\n private readonly amqpChannel: any;\n private readonly subscriptions = new Map<string, RabbitMQSubscription>();\n private asserted = false;\n\n /**\n * Create a new RabbitMQ channel\n */\n public constructor(name: string, amqpChannel: any, options?: ChannelOptions<TPayload>) {\n this.name = name;\n this.amqpChannel = amqpChannel;\n this.options = options ?? {};\n }\n\n /**\n * Assert the queue exists\n */\n public async assert(): Promise<void> {\n if (this.asserted) return;\n\n const queueOptions = {\n durable: this.options.durable ?? true,\n autoDelete: this.options.autoDelete ?? false,\n exclusive: this.options.exclusive ?? false,\n messageTtl: this.options.messageTtl,\n maxLength: this.options.maxLength,\n deadLetterExchange: this.options.deadLetter?.channel ? \"\" : undefined,\n deadLetterRoutingKey: this.options.deadLetter?.channel,\n };\n\n await this.amqpChannel.assertQueue(this.name, queueOptions);\n this.asserted = true;\n }\n\n /**\n * Publish a message\n */\n public async publish(payload: TPayload, options?: PublishOptions): Promise<void> {\n await this.assert();\n\n // Validate with schema if provided\n if (this.options.schema) {\n const context = {\n allValues: payload,\n value: payload,\n };\n const result = await v.validate(this.options.schema, payload, { context });\n if (!result.isValid) {\n throw new Error(`Message validation failed: ${JSON.stringify(result.errors)}`);\n }\n payload = result.data as TPayload;\n }\n\n const messageId = randomUUID();\n const timestamp = new Date();\n\n const messageContent = JSON.stringify({\n payload,\n metadata: {\n messageId,\n timestamp: timestamp.toISOString(),\n correlationId: options?.correlationId,\n headers: options?.headers,\n },\n });\n\n const publishOptions: any = {\n persistent: options?.persistent ?? true,\n messageId,\n timestamp: timestamp.getTime(),\n correlationId: options?.correlationId,\n expiration: options?.expiration?.toString(),\n priority: options?.priority,\n headers: options?.headers,\n };\n\n // Handle delayed messages (requires rabbitmq-delayed-message-exchange plugin)\n if (options?.delay) {\n publishOptions.headers = {\n ...publishOptions.headers,\n \"x-delay\": options.delay,\n };\n }\n\n this.amqpChannel.sendToQueue(this.name, Buffer.from(messageContent), publishOptions);\n }\n\n /**\n * Publish multiple messages\n */\n public async publishBatch(messages: TPayload[], options?: PublishOptions): Promise<void> {\n for (const payload of messages) {\n await this.publish(payload, options);\n }\n }\n\n /**\n * Subscribe to messages\n *\n * Smart auto-ack behavior (when autoAck is not true):\n * - If handler completes successfully without explicit ack/nack/reject → auto-ack\n * - If handler throws an error → auto-nack (with retry if configured)\n * - If handler explicitly calls ack/nack/reject → respects that call\n */\n public async subscribe(\n handler: MessageHandler<TPayload>,\n options?: SubscribeOptions,\n ): Promise<Subscription> {\n await this.assert();\n\n // Use consumerId from options if provided, otherwise generate a random one\n const subscriptionId = options?.consumerId ?? randomUUID();\n\n // Set prefetch if specified\n if (options?.prefetch) {\n await this.amqpChannel.prefetch(options.prefetch);\n }\n\n // If autoAck is true, RabbitMQ handles ack immediately (fire-and-forget)\n const isFireAndForget = options?.autoAck === true;\n\n const consumerOptions = {\n noAck: isFireAndForget,\n exclusive: options?.exclusive ?? false,\n consumerTag: options?.group ?? subscriptionId,\n };\n\n const { consumerTag } = await this.amqpChannel.consume(\n this.name,\n async (msg: any) => {\n if (!msg) return;\n\n // Track if acknowledgment was handled explicitly\n let ackHandled = isFireAndForget;\n\n // Populated once the message is successfully parsed, so the catch\n // block below can dead-letter with the full envelope. Stays\n // `undefined` when `JSON.parse` itself is what threw.\n let parsedMessage: Message<TPayload> | undefined;\n\n try {\n const content = JSON.parse(msg.content.toString());\n let payload = content.payload as TPayload;\n\n // Validate with schema if provided\n if (this.options.schema) {\n const context = {\n allValues: payload,\n value: payload,\n };\n const result = await v.validate(this.options.schema, payload, { context });\n if (!result.isValid) {\n // Reject invalid messages\n this.amqpChannel.nack(msg, false, false);\n return;\n }\n payload = result.data as TPayload;\n }\n\n const metadata: MessageMetadata = {\n messageId: msg.properties.messageId || content.metadata?.messageId || randomUUID(),\n timestamp: new Date(msg.properties.timestamp || content.metadata?.timestamp),\n correlationId: msg.properties.correlationId || content.metadata?.correlationId,\n replyTo: msg.properties.replyTo,\n priority: msg.properties.priority,\n headers: msg.properties.headers,\n retryCount: msg.properties.headers?.[\"x-retry-count\"] || 0,\n originalChannel: this.name,\n };\n\n const message: Message<TPayload> = {\n metadata,\n payload,\n raw: msg,\n };\n\n parsedMessage = message;\n\n const context: MessageContext = {\n ack: async () => {\n if (!ackHandled) {\n ackHandled = true;\n this.amqpChannel.ack(msg);\n }\n },\n nack: async (requeue = true) => {\n if (!ackHandled) {\n ackHandled = true;\n this.amqpChannel.nack(msg, false, requeue);\n }\n },\n reject: async () => {\n if (!ackHandled) {\n ackHandled = true;\n this.amqpChannel.reject(msg, false);\n }\n },\n reply: async <T>(replyPayload: T) => {\n if (msg.properties.replyTo) {\n const replyContent = JSON.stringify({\n payload: replyPayload,\n metadata: {\n messageId: randomUUID(),\n timestamp: new Date().toISOString(),\n correlationId: msg.properties.correlationId,\n },\n });\n\n this.amqpChannel.sendToQueue(msg.properties.replyTo, Buffer.from(replyContent), {\n correlationId: msg.properties.correlationId,\n });\n }\n },\n retry: async (delay?: number) => {\n if (ackHandled) return;\n ackHandled = true;\n\n await this.retryOrGiveUp(msg, metadata.retryCount || 0, options, message, delay);\n },\n };\n\n // Execute handler\n await handler(message, context);\n\n // Smart auto-ack: if handler succeeded and didn't explicitly handle ack\n if (!ackHandled) {\n this.amqpChannel.ack(msg);\n }\n } catch (error) {\n // Smart auto-nack: if handler threw and didn't explicitly handle ack\n if (ackHandled) return;\n\n if (options?.retry) {\n // A bare `nack(msg, false, true)` redelivers the ORIGINAL message\n // untouched — amqplib/RabbitMQ do not add an `x-retry-count`\n // header on requeue, so a plain requeue here never advances the\n // counter and `maxRetries`/`deadLetter` are silently never\n // reached. Route through the same bounded-retry path `ctx.retry()`\n // uses, so the counter increments (and the cap/dead-letter fires)\n // on this automatic path too.\n const currentRetryCount = msg.properties.headers?.[\"x-retry-count\"] || 0;\n await this.retryOrGiveUp(msg, currentRetryCount, options, parsedMessage);\n } else {\n // No retry configured - reject without requeue (already bounded:\n // a single attempt, no requeue loop possible).\n this.amqpChannel.nack(msg, false, false);\n }\n }\n },\n consumerOptions,\n );\n\n const subscription = new RabbitMQSubscription(\n subscriptionId,\n this.name,\n consumerTag,\n this.amqpChannel,\n );\n\n this.subscriptions.set(subscriptionId, subscription);\n\n return subscription;\n }\n\n /**\n * Unsubscribe by consumer ID\n */\n public async unsubscribeById(consumerId: string): Promise<void> {\n const subscription = this.subscriptions.get(consumerId);\n if (subscription) {\n await subscription.unsubscribe();\n this.subscriptions.delete(consumerId);\n }\n }\n\n /**\n * Stop consuming messages on this channel.\n * Cancels all active subscriptions gracefully.\n */\n public async stopConsuming(): Promise<void> {\n const cancellations = Array.from(this.subscriptions.values()).map((sub) => sub.unsubscribe());\n await Promise.all(cancellations);\n }\n\n /**\n * Send message to dead-letter queue\n */\n private async sendToDeadLetter(\n message: Message<TPayload>,\n deadLetterChannel: string,\n ): Promise<void> {\n const content = JSON.stringify({\n payload: message.payload,\n metadata: {\n ...message.metadata,\n originalChannel: this.name,\n },\n });\n\n this.amqpChannel.sendToQueue(deadLetterChannel, Buffer.from(content), { persistent: true });\n }\n\n /**\n * Dead-letter a message whose body couldn't be parsed into a {@link Message}\n * (e.g. `JSON.parse` itself threw before an envelope existed). Forwards the\n * raw AMQP bytes/properties as-is rather than re-deriving a payload, so a\n * malformed message isn't lost.\n */\n private sendToDeadLetterRaw(msg: any, deadLetterChannel: string): void {\n this.amqpChannel.sendToQueue(deadLetterChannel, msg.content, {\n ...msg.properties,\n persistent: true,\n });\n }\n\n /**\n * Bounded retry shared by the explicit `ctx.retry()` call and the automatic\n * catch when a handler throws without calling it itself — so both paths\n * honor the same cap instead of the automatic path silently requeueing\n * forever (see `subscribe()`'s catch block).\n *\n * Under the cap: republishes with an incremented `x-retry-count` header —\n * NOT a plain `nack(msg, false, true)`, which redelivers the original\n * message untouched and never advances the counter.\n *\n * At/over the cap: dead-letters if configured, otherwise drops the message\n * with a loud `log.error` (never a silent drop) so an operator can see a\n * poison message was discarded instead of it vanishing without a trace.\n */\n private async retryOrGiveUp(\n msg: any,\n currentRetryCount: number,\n options: SubscribeOptions | undefined,\n parsedMessage: Message<TPayload> | undefined,\n delay?: number,\n ): Promise<void> {\n const retryCount = currentRetryCount + 1;\n const maxRetries = options?.retry?.maxRetries ?? 3;\n\n if (retryCount > maxRetries) {\n if (options?.deadLetter) {\n if (parsedMessage) {\n await this.sendToDeadLetter(parsedMessage, options.deadLetter.channel);\n } else {\n this.sendToDeadLetterRaw(msg, options.deadLetter.channel);\n }\n } else {\n log.error(\n \"herald\",\n \"poison-message\",\n `Dropping message on channel \"${this.name}\" after ${retryCount - 1} failed ` +\n `${retryCount - 1 === 1 ? \"retry\" : \"retries\"} (maxRetries: ${maxRetries}) with no ` +\n `dead-letter channel configured.`,\n { channel: this.name, retryCount: retryCount - 1, maxRetries },\n );\n this.amqpChannel.reject(msg, false);\n return;\n }\n\n this.amqpChannel.ack(msg);\n return;\n }\n\n const headers: Record<string, unknown> = {\n ...msg.properties.headers,\n \"x-retry-count\": retryCount,\n };\n\n if (delay) {\n headers[\"x-delay\"] = delay;\n }\n\n this.amqpChannel.sendToQueue(this.name, msg.content, { ...msg.properties, headers });\n\n this.amqpChannel.ack(msg);\n }\n\n /**\n * Request-response pattern\n */\n public async request<TResponse = unknown>(\n payload: TPayload,\n options?: RequestOptions,\n ): Promise<TResponse> {\n await this.assert();\n\n const correlationId = randomUUID();\n const timeout = options?.timeout ?? 30000;\n\n // Create exclusive reply queue\n const { queue: replyQueue } = await this.amqpChannel.assertQueue(\"\", {\n exclusive: true,\n autoDelete: true,\n });\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Request timeout after ${timeout}ms`));\n }, timeout);\n\n // Consume reply\n this.amqpChannel.consume(\n replyQueue,\n (msg: any) => {\n if (msg?.properties.correlationId === correlationId) {\n clearTimeout(timeoutId);\n const content = JSON.parse(msg.content.toString());\n resolve(content.payload as TResponse);\n }\n },\n { noAck: true },\n );\n\n // Send request\n const messageContent = JSON.stringify({\n payload,\n metadata: {\n messageId: randomUUID(),\n timestamp: new Date().toISOString(),\n correlationId,\n },\n });\n\n this.amqpChannel.sendToQueue(this.name, Buffer.from(messageContent), {\n correlationId,\n replyTo: replyQueue,\n expiration: timeout.toString(),\n ...options,\n });\n });\n }\n\n /**\n * Register response handler for RPC\n */\n public async respond<TResponse = unknown>(\n handler: ResponseHandler<TPayload, TResponse>,\n ): Promise<Subscription> {\n return this.subscribe(async (message, ctx) => {\n const response = await handler(message, ctx);\n await ctx.reply(response);\n await ctx.ack();\n });\n }\n\n /**\n * Get queue statistics\n */\n public async stats(): Promise<ChannelStats> {\n await this.assert();\n\n const queueInfo = await this.amqpChannel.checkQueue(this.name);\n\n return {\n name: this.name,\n messageCount: queueInfo.messageCount,\n consumerCount: queueInfo.consumerCount,\n };\n }\n\n /**\n * Purge all messages\n */\n public async purge(): Promise<number> {\n await this.assert();\n\n const result = await this.amqpChannel.purgeQueue(this.name);\n return result.messageCount;\n }\n\n /**\n * Check if queue exists\n */\n public async exists(): Promise<boolean> {\n try {\n await this.amqpChannel.checkQueue(this.name);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Delete the queue\n */\n public async delete(): Promise<void> {\n // Cancel all subscriptions\n for (const subscription of this.subscriptions.values()) {\n await subscription.unsubscribe();\n }\n this.subscriptions.clear();\n\n try {\n await this.amqpChannel.deleteQueue(this.name);\n } catch {\n // Ignore if queue doesn't exist\n }\n\n this.asserted = false;\n }\n}\n\n/**\n * RabbitMQ Subscription Implementation\n */\nclass RabbitMQSubscription implements Subscription {\n public readonly id: string;\n public readonly channel: string;\n public readonly consumerTag: string;\n\n private readonly amqpChannel: any;\n private _isActive = true;\n\n public constructor(id: string, channel: string, consumerTag: string, amqpChannel: any) {\n this.id = id;\n this.channel = channel;\n this.consumerTag = consumerTag;\n this.amqpChannel = amqpChannel;\n }\n\n public async unsubscribe(): Promise<void> {\n if (!this._isActive) return;\n\n await this.amqpChannel.cancel(this.consumerTag);\n this._isActive = false;\n }\n\n public async pause(): Promise<void> {\n // RabbitMQ doesn't have native pause, cancel consumer\n await this.amqpChannel.cancel(this.consumerTag);\n }\n\n public async resume(): Promise<void> {\n // Would need to re-subscribe - not directly supported\n throw new Error(\"Resume is not supported for RabbitMQ. Please create a new subscription.\");\n }\n\n public isActive(): boolean {\n return this._isActive;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rabbitmq-channel.mjs","names":[],"sources":["../../../../../../../../../packages/herald/src/drivers/rabbitmq/rabbitmq-channel.ts"],"sourcesContent":["import { log } from \"@warlock.js/logger\";\nimport { v } from \"@warlock.js/seal\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ChannelContract } from \"../../contracts\";\nimport type {\n ChannelOptions,\n ChannelStats,\n Message,\n MessageContext,\n MessageHandler,\n MessageMetadata,\n PublishOptions,\n RequestOptions,\n ResponseHandler,\n SubscribeOptions,\n Subscription,\n} from \"../../types\";\n\n/**\n * RabbitMQ Channel Implementation\n *\n * Wraps a RabbitMQ queue/exchange with a unified API.\n *\n * @template TPayload - The typed payload\n */\nexport class RabbitMQChannel<TPayload = unknown> implements ChannelContract<TPayload> {\n public readonly name: string;\n public readonly options: ChannelOptions<TPayload>;\n\n private readonly amqpChannel: any;\n private readonly subscriptions = new Map<string, RabbitMQSubscription>();\n private asserted = false;\n\n /**\n * Create a new RabbitMQ channel\n */\n public constructor(name: string, amqpChannel: any, options?: ChannelOptions<TPayload>) {\n this.name = name;\n this.amqpChannel = amqpChannel;\n this.options = options ?? {};\n }\n\n /**\n * Assert the queue exists\n */\n public async assert(): Promise<void> {\n if (this.asserted) return;\n\n const queueOptions = {\n durable: this.options.durable ?? true,\n autoDelete: this.options.autoDelete ?? false,\n exclusive: this.options.exclusive ?? false,\n messageTtl: this.options.messageTtl,\n maxLength: this.options.maxLength,\n deadLetterExchange: this.options.deadLetter?.channel ? \"\" : undefined,\n deadLetterRoutingKey: this.options.deadLetter?.channel,\n };\n\n await this.amqpChannel.assertQueue(this.name, queueOptions);\n this.asserted = true;\n }\n\n /**\n * Publish a message\n */\n public async publish(payload: TPayload, options?: PublishOptions): Promise<void> {\n await this.assert();\n\n // Validate with schema if provided\n if (this.options.schema) {\n const context = {\n allValues: payload,\n value: payload,\n };\n const result = await v.validate(this.options.schema, payload, { context });\n if (!result.isValid) {\n throw new Error(`Message validation failed: ${JSON.stringify(result.errors)}`);\n }\n payload = result.data as TPayload;\n }\n\n const messageId = randomUUID();\n const timestamp = new Date();\n\n const messageContent = JSON.stringify({\n payload,\n metadata: {\n messageId,\n timestamp: timestamp.toISOString(),\n correlationId: options?.correlationId,\n headers: options?.headers,\n },\n });\n\n const publishOptions: any = {\n persistent: options?.persistent ?? true,\n messageId,\n timestamp: timestamp.getTime(),\n correlationId: options?.correlationId,\n expiration: options?.expiration?.toString(),\n priority: options?.priority,\n headers: options?.headers,\n };\n\n // Handle delayed messages (requires rabbitmq-delayed-message-exchange plugin)\n if (options?.delay) {\n publishOptions.headers = {\n ...publishOptions.headers,\n \"x-delay\": options.delay,\n };\n }\n\n this.amqpChannel.sendToQueue(this.name, Buffer.from(messageContent), publishOptions);\n }\n\n /**\n * Publish multiple messages\n */\n public async publishBatch(messages: TPayload[], options?: PublishOptions): Promise<void> {\n for (const payload of messages) {\n await this.publish(payload, options);\n }\n }\n\n /**\n * Subscribe to messages\n *\n * Smart auto-ack behavior (when autoAck is not true):\n * - If handler completes successfully without explicit ack/nack/reject → auto-ack\n * - If handler throws an error → auto-nack (with retry if configured)\n * - If handler explicitly calls ack/nack/reject → respects that call\n */\n public async subscribe(\n handler: MessageHandler<TPayload>,\n options?: SubscribeOptions,\n ): Promise<Subscription> {\n await this.assert();\n\n // Use consumerId from options if provided, otherwise generate a random one\n const subscriptionId = options?.consumerId ?? randomUUID();\n\n // Set prefetch if specified\n if (options?.prefetch) {\n await this.amqpChannel.prefetch(options.prefetch);\n }\n\n // If autoAck is true, RabbitMQ handles ack immediately (fire-and-forget)\n const isFireAndForget = options?.autoAck === true;\n\n const consumerOptions = {\n noAck: isFireAndForget,\n exclusive: options?.exclusive ?? false,\n consumerTag: options?.group ?? subscriptionId,\n };\n\n const { consumerTag } = await this.amqpChannel.consume(\n this.name,\n async (msg: any) => {\n if (!msg) return;\n\n // Track if acknowledgment was handled explicitly\n let ackHandled = isFireAndForget;\n\n // Populated once the message is successfully parsed, so the catch\n // block below can dead-letter with the full envelope. Stays\n // `undefined` when `JSON.parse` itself is what threw.\n let parsedMessage: Message<TPayload> | undefined;\n\n try {\n const content = JSON.parse(msg.content.toString());\n let payload = content.payload as TPayload;\n\n // Validate with schema if provided\n if (this.options.schema) {\n const context = {\n allValues: payload,\n value: payload,\n };\n const result = await v.validate(this.options.schema, payload, { context });\n if (!result.isValid) {\n // Reject invalid messages\n this.amqpChannel.nack(msg, false, false);\n return;\n }\n payload = result.data as TPayload;\n }\n\n const metadata: MessageMetadata = {\n messageId: msg.properties.messageId || content.metadata?.messageId || randomUUID(),\n timestamp: new Date(msg.properties.timestamp || content.metadata?.timestamp),\n correlationId: msg.properties.correlationId || content.metadata?.correlationId,\n replyTo: msg.properties.replyTo,\n priority: msg.properties.priority,\n headers: msg.properties.headers,\n retryCount: msg.properties.headers?.[\"x-retry-count\"] || 0,\n originalChannel: this.name,\n };\n\n const message: Message<TPayload> = {\n metadata,\n payload,\n raw: msg,\n };\n\n parsedMessage = message;\n\n const context: MessageContext = {\n ack: async () => {\n if (!ackHandled) {\n ackHandled = true;\n this.amqpChannel.ack(msg);\n }\n },\n nack: async (requeue = true) => {\n if (!ackHandled) {\n ackHandled = true;\n this.amqpChannel.nack(msg, false, requeue);\n }\n },\n reject: async () => {\n if (!ackHandled) {\n ackHandled = true;\n this.amqpChannel.reject(msg, false);\n }\n },\n reply: async <T>(replyPayload: T) => {\n if (msg.properties.replyTo) {\n const replyContent = JSON.stringify({\n payload: replyPayload,\n metadata: {\n messageId: randomUUID(),\n timestamp: new Date().toISOString(),\n correlationId: msg.properties.correlationId,\n },\n });\n\n this.amqpChannel.sendToQueue(msg.properties.replyTo, Buffer.from(replyContent), {\n correlationId: msg.properties.correlationId,\n });\n }\n },\n retry: async (delay?: number) => {\n if (ackHandled) return;\n ackHandled = true;\n\n await this.retryOrGiveUp(msg, metadata.retryCount || 0, options, message, delay);\n },\n };\n\n // Execute handler\n await handler(message, context);\n\n // Smart auto-ack: if handler succeeded and didn't explicitly handle ack\n if (!ackHandled) {\n this.amqpChannel.ack(msg);\n }\n } catch (error) {\n // Smart auto-nack: if handler threw and didn't explicitly handle ack\n if (ackHandled) return;\n\n if (options?.retry) {\n // A bare `nack(msg, false, true)` redelivers the ORIGINAL message\n // untouched — amqplib/RabbitMQ do not add an `x-retry-count`\n // header on requeue, so a plain requeue here never advances the\n // counter and `maxRetries`/`deadLetter` are silently never\n // reached. Route through the same bounded-retry path `ctx.retry()`\n // uses, so the counter increments (and the cap/dead-letter fires)\n // on this automatic path too.\n const currentRetryCount = msg.properties.headers?.[\"x-retry-count\"] || 0;\n await this.retryOrGiveUp(msg, currentRetryCount, options, parsedMessage);\n } else {\n // No retry configured - reject without requeue (already bounded:\n // a single attempt, no requeue loop possible).\n this.amqpChannel.nack(msg, false, false);\n }\n }\n },\n consumerOptions,\n );\n\n const subscription = new RabbitMQSubscription(\n subscriptionId,\n this.name,\n consumerTag,\n this.amqpChannel,\n );\n\n this.subscriptions.set(subscriptionId, subscription);\n\n return subscription;\n }\n\n /**\n * Unsubscribe by consumer ID\n */\n public async unsubscribeById(consumerId: string): Promise<void> {\n const subscription = this.subscriptions.get(consumerId);\n if (subscription) {\n await subscription.unsubscribe();\n this.subscriptions.delete(consumerId);\n }\n }\n\n /**\n * Stop consuming messages on this channel.\n * Cancels all active subscriptions gracefully.\n */\n public async stopConsuming(): Promise<void> {\n const cancellations = Array.from(this.subscriptions.values()).map((sub) => sub.unsubscribe());\n await Promise.all(cancellations);\n }\n\n /**\n * Send message to dead-letter queue\n */\n private async sendToDeadLetter(\n message: Message<TPayload>,\n deadLetterChannel: string,\n ): Promise<void> {\n const content = JSON.stringify({\n payload: message.payload,\n metadata: {\n ...message.metadata,\n originalChannel: this.name,\n },\n });\n\n this.amqpChannel.sendToQueue(deadLetterChannel, Buffer.from(content), { persistent: true });\n }\n\n /**\n * Dead-letter a message whose body couldn't be parsed into a {@link Message}\n * (e.g. `JSON.parse` itself threw before an envelope existed). Forwards the\n * raw AMQP bytes/properties as-is rather than re-deriving a payload, so a\n * malformed message isn't lost.\n */\n private sendToDeadLetterRaw(msg: any, deadLetterChannel: string): void {\n this.amqpChannel.sendToQueue(deadLetterChannel, msg.content, {\n ...msg.properties,\n persistent: true,\n });\n }\n\n /**\n * Bounded retry shared by the explicit `ctx.retry()` call and the automatic\n * catch when a handler throws without calling it itself — so both paths\n * honor the same cap instead of the automatic path silently requeueing\n * forever (see `subscribe()`'s catch block).\n *\n * Under the cap: republishes with an incremented `x-retry-count` header —\n * NOT a plain `nack(msg, false, true)`, which redelivers the original\n * message untouched and never advances the counter.\n *\n * At/over the cap: dead-letters if configured, otherwise drops the message\n * with a loud `log.error` (never a silent drop) so an operator can see a\n * poison message was discarded instead of it vanishing without a trace.\n */\n private async retryOrGiveUp(\n msg: any,\n currentRetryCount: number,\n options: SubscribeOptions | undefined,\n parsedMessage: Message<TPayload> | undefined,\n delay?: number,\n ): Promise<void> {\n const retryCount = currentRetryCount + 1;\n const maxRetries = options?.retry?.maxRetries ?? 3;\n\n if (retryCount > maxRetries) {\n if (options?.deadLetter) {\n if (parsedMessage) {\n await this.sendToDeadLetter(parsedMessage, options.deadLetter.channel);\n } else {\n this.sendToDeadLetterRaw(msg, options.deadLetter.channel);\n }\n } else {\n log.error(\n \"herald\",\n \"poison-message\",\n `Dropping message on channel \"${this.name}\" after ${retryCount - 1} failed ` +\n `${retryCount - 1 === 1 ? \"retry\" : \"retries\"} (maxRetries: ${maxRetries}) with no ` +\n `dead-letter channel configured.`,\n { channel: this.name, retryCount: retryCount - 1, maxRetries },\n );\n this.amqpChannel.reject(msg, false);\n return;\n }\n\n this.amqpChannel.ack(msg);\n return;\n }\n\n const headers: Record<string, unknown> = {\n ...msg.properties.headers,\n \"x-retry-count\": retryCount,\n };\n\n if (delay) {\n headers[\"x-delay\"] = delay;\n }\n\n this.amqpChannel.sendToQueue(this.name, msg.content, { ...msg.properties, headers });\n\n this.amqpChannel.ack(msg);\n }\n\n /**\n * Request-response pattern\n */\n public async request<TResponse = unknown>(\n payload: TPayload,\n options?: RequestOptions,\n ): Promise<TResponse> {\n await this.assert();\n\n const correlationId = randomUUID();\n const timeout = options?.timeout ?? 30000;\n\n // Create exclusive reply queue\n const { queue: replyQueue } = await this.amqpChannel.assertQueue(\"\", {\n exclusive: true,\n autoDelete: true,\n });\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Request timeout after ${timeout}ms`));\n }, timeout);\n\n // Consume reply\n this.amqpChannel.consume(\n replyQueue,\n (msg: any) => {\n if (msg?.properties.correlationId === correlationId) {\n clearTimeout(timeoutId);\n const content = JSON.parse(msg.content.toString());\n resolve(content.payload as TResponse);\n }\n },\n { noAck: true },\n );\n\n // Send request\n const messageContent = JSON.stringify({\n payload,\n metadata: {\n messageId: randomUUID(),\n timestamp: new Date().toISOString(),\n correlationId,\n },\n });\n\n this.amqpChannel.sendToQueue(this.name, Buffer.from(messageContent), {\n correlationId,\n replyTo: replyQueue,\n expiration: timeout.toString(),\n ...options,\n });\n });\n }\n\n /**\n * Register response handler for RPC\n */\n public async respond<TResponse = unknown>(\n handler: ResponseHandler<TPayload, TResponse>,\n ): Promise<Subscription> {\n return this.subscribe(async (message, ctx) => {\n const response = await handler(message, ctx);\n await ctx.reply(response);\n await ctx.ack();\n });\n }\n\n /**\n * Get queue statistics\n */\n public async stats(): Promise<ChannelStats> {\n await this.assert();\n\n const queueInfo = await this.amqpChannel.checkQueue(this.name);\n\n return {\n name: this.name,\n messageCount: queueInfo.messageCount,\n consumerCount: queueInfo.consumerCount,\n };\n }\n\n /**\n * Purge all messages\n */\n public async purge(): Promise<number> {\n await this.assert();\n\n const result = await this.amqpChannel.purgeQueue(this.name);\n return result.messageCount;\n }\n\n /**\n * Check if queue exists\n */\n public async exists(): Promise<boolean> {\n try {\n await this.amqpChannel.checkQueue(this.name);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Delete the queue\n */\n public async delete(): Promise<void> {\n // Cancel all subscriptions\n for (const subscription of this.subscriptions.values()) {\n await subscription.unsubscribe();\n }\n this.subscriptions.clear();\n\n try {\n await this.amqpChannel.deleteQueue(this.name);\n } catch {\n // Ignore if queue doesn't exist\n }\n\n this.asserted = false;\n }\n}\n\n/**\n * RabbitMQ Subscription Implementation\n */\nclass RabbitMQSubscription implements Subscription {\n public readonly id: string;\n public readonly channel: string;\n public readonly consumerTag: string;\n\n private readonly amqpChannel: any;\n private _isActive = true;\n\n public constructor(id: string, channel: string, consumerTag: string, amqpChannel: any) {\n this.id = id;\n this.channel = channel;\n this.consumerTag = consumerTag;\n this.amqpChannel = amqpChannel;\n }\n\n public async unsubscribe(): Promise<void> {\n if (!this._isActive) return;\n\n await this.amqpChannel.cancel(this.consumerTag);\n this._isActive = false;\n }\n\n public async pause(): Promise<void> {\n // RabbitMQ doesn't have native pause, cancel consumer\n await this.amqpChannel.cancel(this.consumerTag);\n }\n\n public async resume(): Promise<void> {\n // Would need to re-subscribe - not directly supported\n throw new Error(\"Resume is not supported for RabbitMQ. Please create a new subscription.\");\n }\n\n public isActive(): boolean {\n return this._isActive;\n }\n}\n"],"mappings":"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"}
@@ -5,6 +5,8 @@ import { ChannelContract } from "../../contracts/channel.contract.mjs";
5
5
  import { EventMessage } from "../../message-managers/event-message.mjs";
6
6
  import { EventConsumerClass } from "../../message-managers/types.mjs";
7
7
  import { BrokerDriverContract } from "../../contracts/broker-driver.contract.mjs";
8
+ import "../../contracts/index.mjs";
9
+ import "../../types/index.mjs";
8
10
  //#region ../../packages/herald/src/drivers/rabbitmq/rabbitmq-driver.d.ts
9
11
  /**
10
12
  * RabbitMQ Driver
@@ -28,7 +30,7 @@ import { BrokerDriverContract } from "../../contracts/broker-driver.contract.mjs
28
30
  * const channel = driver.channel("user.created");
29
31
  * ```
30
32
  */
31
- declare class RabbitMQDriver implements BrokerDriverContract {
33
+ export declare class RabbitMQDriver implements BrokerDriverContract {
32
34
  readonly name: "rabbitmq";
33
35
  readonly consumers: EventConsumerClass[];
34
36
  private readonly options;
@@ -126,5 +128,4 @@ declare class RabbitMQDriver implements BrokerDriverContract {
126
128
  getRawConnection(): any;
127
129
  }
128
130
  //#endregion
129
- export { RabbitMQDriver };
130
131
  //# sourceMappingURL=rabbitmq-driver.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rabbitmq-driver.d.mts","names":[],"sources":["../../../../../../../../../packages/herald/src/drivers/rabbitmq/rabbitmq-driver.ts"],"mappings":";;;;;;;;;;;;;;;AAuGA;;;;;;;;;;;;;;;cAAa,cAAA,YAA0B,oBAAA;EAAA,SACrB,IAAA;EAAA,SAEA,SAAA,EAAW,kBAAA;EAAA,iBAEV,OAAA;EAAA,iBACA,MAAA;EAAA,iBACA,QAAA;EAAA,QAET,UAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAwSiC;;;;;cAjStB,OAAA,EAAS,yBAAA;EAfZ;;;EAAA,IAsBL,WAAA;EAlBM;;;;;;;;;;EAgCV,SAAA,CAAU,QAAA,EAAU,kBAAA;EAsBpB;;;EAAA,WAAA,CAAY,QAAA,EAAU,kBAAA;EAcd;;;;EAAR,OAAA,YAAmB,MAAA,eAAqB,KAAA,EAAO,YAAA,CAAa,QAAA;EAOtD;;;EAAA,OAAA,IAAW,OAAA;EA2GX;;;EAAA,QA5CL,kBAAA;EAsEE;;;EAAA,QA/CI,eAAA;EAsDI;;;EAjCL,UAAA,IAAc,OAAA;EAwCpB;;;EAdA,EAAA,CAAG,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,mBAAA;EAgBb;;;EATpB,GAAA,CAAI,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,mBAAA;EA2B5B;;;EApBN,OAAA,qBACL,IAAA,UACA,OAAA,GAAU,cAAA,CAAe,QAAA,IACxB,eAAA,CAAgB,QAAA;EAoCN;;;EAnBA,cAAA,IAAkB,OAAA;EA0DlB;;;;EAjDA,aAAA,IAAiB,OAAA;EAmEP;AAAA;;EAzDV,WAAA,IAAe,OAAA,CAAQ,iBAAA;;;;EAgC7B,eAAA;;;;EAOM,YAAA,CAAa,IAAA,WAAe,OAAA;;;;EAWlC,aAAA;;;;EAOA,gBAAA;AAAA"}
1
+ {"version":3,"file":"rabbitmq-driver.d.mts","names":[],"sources":["../../../../../../../../../packages/herald/src/drivers/rabbitmq/rabbitmq-driver.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAuGa,0BAA0B;WACrB;WAEA,WAAW;mBAEV;mBACA;mBACA;UAET;UACA;UACA;;;;;;EAOR,YAAmB,SAAS;;;;MAOjB;;;;;;;;;;;EAcJ,UAAU,UAAU;;;;EAsBpB,YAAY,UAAU;;;;;EActB,QAAQ,WAAW,qBAAqB,OAAO,aAAa;;;;EAOtD,WAAW;;;;UA+DhB;;;;UAuBM;;;;EAqBD,cAAc;;;;EA0BpB,GAAG,OAAO,aAAa,UAAU;;;;EAOjC,IAAI,OAAO,aAAa,UAAU;;;;EAOlC,QAAQ,oBACb,cACA,UAAU,eAAe,YACxB,gBAAgB;;;;EAiBN,kBAAkB;;;;;EASlB,iBAAiB;;;;EAUjB,eAAe,QAAQ;;;;EAgC7B;;;;EAOM,aAAa,eAAe;;;;EAWlC;;;;EAOA"}
package/esm/index.d.mts CHANGED
@@ -9,12 +9,19 @@ import { EventMessage, defineEvent } from "./message-managers/event-message.mjs"
9
9
  import { EventConsumer, defineConsumer } from "./message-managers/event-consumer.mjs";
10
10
  import { ConsumedEventMessage, EventConsumerClass } from "./message-managers/types.mjs";
11
11
  import { BrokerDriverContract } from "./contracts/broker-driver.contract.mjs";
12
+ import "./contracts/index.mjs";
12
13
  import { Broker, BrokerOptions } from "./communicators/broker.mjs";
13
14
  import { BrokerRegistryEvent, BrokerRegistryListener } from "./types/registry.types.mjs";
15
+ import "./types/index.mjs";
14
16
  import { MissingBrokerError, brokerRegistry } from "./communicators/broker-registry.mjs";
17
+ import "./communicators/index.mjs";
15
18
  import { RabbitMQDriver } from "./drivers/rabbitmq/rabbitmq-driver.mjs";
16
19
  import { RabbitMQChannel } from "./drivers/rabbitmq/rabbitmq-channel.mjs";
20
+ import "./drivers/index.mjs";
21
+ import "./message-managers/index.mjs";
17
22
  import { connectToBroker, herald, heraldChannel, publishEvent, subscribeConsumer } from "./utils/connect-to-broker.mjs";
23
+ import "./utils/index.mjs";
18
24
  import { Consumable, ConsumableOptions, pendingSubscribers } from "./decorators/consumable.mjs";
25
+ import "./decorators/index.mjs";
19
26
  import { UseCaseBroadcastEvent, heraldBroadcast } from "./use-case-broadcast.mjs";
20
27
  export { BaseConnectionOptions, Broker, BrokerConfigurations, BrokerDriverContract, BrokerDriverType, BrokerEvent, BrokerEventListener, BrokerOptions, BrokerRegistryEvent, BrokerRegistryListener, ChannelContract, ChannelOptions, ChannelStats, ConnectionOptions, Consumable, ConsumableOptions, ConsumedEventMessage, DeadLetterOptions, EventConsumer, EventConsumerClass, EventMessage, HealthCheckResult, KafkaClientOptions, KafkaConnectionOptions, Message, MessageContext, MessageHandler, MessageMetadata, MissingBrokerError, PublishOptions, RabbitMQChannel, RabbitMQClientOptions, RabbitMQConnectionOptions, RabbitMQDriver, RabbitMQSocketOptions, RequestOptions, ResponseHandler, RetryOptions, SubscribeOptions, Subscription, UseCaseBroadcastEvent, brokerRegistry, connectToBroker, defineConsumer, defineEvent, herald, heraldBroadcast, heraldChannel, pendingSubscribers, publishEvent, subscribeConsumer };
@@ -1,8 +1,7 @@
1
1
  import { ConsumedEventMessage, EventConsumerClass } from "./types.mjs";
2
2
  import { ObjectValidator, ValidationResult } from "@warlock.js/seal";
3
-
4
3
  //#region ../../packages/herald/src/message-managers/event-consumer.d.ts
5
- declare abstract class EventConsumer<Payload = Record<string, any>> {
4
+ export declare abstract class EventConsumer<Payload = Record<string, any>> {
6
5
  /**
7
6
  * Event name
8
7
  */
@@ -55,7 +54,7 @@ type ConsumerOptions<Payload> = {
55
54
  /**
56
55
  * A shorthand to define an event consumer without declaring an entire class
57
56
  */
58
- declare function defineConsumer<Payload = Record<string, any>>(eventName: string, options: ConsumerOptions<Payload>): EventConsumerClass;
57
+ export declare function defineConsumer<Payload = Record<string, any>>(eventName: string, options: ConsumerOptions<Payload>): EventConsumerClass;
59
58
  //#endregion
60
- export { EventConsumer, defineConsumer };
59
+ export {};
61
60
  //# sourceMappingURL=event-consumer.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-consumer.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/message-managers/event-consumer.ts"],"mappings":";;;;uBAWsB,aAAA,WAAwB,MAAA;EAqCZ;;;EAAA,OAjClB,SAAA;EAAA,eAEC,WAAA;EAAA,WAEG,UAAA;EAAA,IAOP,SAAA;EAqCkC;;;EAAA,OA9B/B,UAAA;EAhBC;;;EAAA,OAqBD,UAAA;EAAA;;;EAKP,MAAA,GAAS,eAAA;EAKgB;;;EAAA,SAAhB,MAAA,CAAO,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,oBAAA,GAAuB,OAAA;EAAA;;;EAAA,OAKzD,iBAAA,CAAkB,OAAA;EAUJ;;;EAAf,QAAA,CAAS,IAAA,EAAM,OAAA,GAAU,OAAA,CAAQ,gBAAA;AAAA;AAAgB;AAK/D;;AAL+D,KAU3D,eAAA;EAIM;;;EAAT,MAAA,GAAS,eAAA;EAQY;;;EAJrB,MAAA,GAAS,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,oBAAA,KAAyB,OAAA;EAInB;;;EAAxC,QAAA,IAAY,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,gBAAA;AAAA;;;;iBAM3B,cAAA,WAAyB,MAAA,eACvC,SAAA,UACA,OAAA,EAAS,eAAA,CAAgB,OAAA,IACxB,kBAAA"}
1
+ {"version":3,"file":"event-consumer.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/message-managers/event-consumer.ts"],"mappings":";;;8BAWsB,cAAc,UAAU;;;;SAI9B;iBAEC;aAEG;MAOP;;;;SAOG;;;;SAKA;;;;EAKP,SAAS;;;;WAKA,OAAO,SAAS,SAAS,OAAO,uBAAuB;;;;SAKzD,kBAAkB;;;;EAUnB,SAAS,MAAM,UAAU,QAAQ;;;;;KAU3C,gBAAgB;;;;EAInB,SAAS;;;;EAIT,SAAS,SAAS,SAAS,OAAO,yBAAyB;;;;EAI3D,YAAY,SAAS,YAAY,QAAQ;;;;;wBAM3B,eAAe,UAAU,qBACvC,mBACA,SAAS,gBAAgB,WACxB"}
@@ -1,8 +1,7 @@
1
1
  import { ObjectValidator } from "@warlock.js/seal";
2
2
  import { GenericObject } from "@mongez/reinforcements";
3
-
4
3
  //#region ../../packages/herald/src/message-managers/event-message.d.ts
5
- declare abstract class EventMessage<TPayload = Record<string, any>> {
4
+ export declare abstract class EventMessage<TPayload = Record<string, any>> {
6
5
  protected data?: TPayload | undefined;
7
6
  /**
8
7
  * Event Name
@@ -81,7 +80,7 @@ type EventMessageClass<TIncoming = Record<string, any>, TOutgoing = TIncoming> =
81
80
  * publishEvent(new UserCreatedEvent(user));
82
81
  * ```
83
82
  */
84
- declare function defineEvent<IncomingData = unknown, OutgoingData = unknown>(eventName: string, options?: EventOptions<IncomingData>): EventMessageClass<IncomingData, OutgoingData>;
83
+ export declare function defineEvent<IncomingData = unknown, OutgoingData = unknown>(eventName: string, options?: EventOptions<IncomingData>): EventMessageClass<IncomingData, OutgoingData>;
85
84
  //#endregion
86
- export { EventMessage, defineEvent };
85
+ export {};
87
86
  //# sourceMappingURL=event-message.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-message.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/message-managers/event-message.ts"],"mappings":";;;;uBAUsB,YAAA,YAAwB,MAAA;EAAA,UAqCf,IAAA,GAAO,QAAA;EAbpB;;;EAAA,SApBA,SAAA;;;;EAKT,OAAA;EAT0B;;;EAc1B,QAAA,GAAW,MAAA;EAVF;;;EAeT,SAAA;EAAA;;;EAKA,MAAA,GAAS,eAAA;EAKC;;;EAAV,MAAA,IAAU,QAAA;cAQY,IAAA,GAAO,QAAA;;;;;;;EAQ7B,SAAA;;;;;;;;;;KAeJ,YAAA;EAQM;;;EAJT,MAAA,IAAU,IAAA,EAAM,CAAA,KAAM,aAAA;EAAtB;;;EAIA,MAAA,GAAS,eAAA;AAAA;;;AAAe;AAAA;;;KASrB,iBAAA,aAA8B,MAAA,2BAAiC,SAAA,SAClE,IAAA,GAAO,SAAA,KACJ,YAAA,CAAa,SAAA;;;;;;;;;;;;;;;;AAAS;AAqB3B;;;iBAAgB,WAAA,iDACd,SAAA,UACA,OAAA,GAAS,YAAA,CAAa,YAAA,IACrB,iBAAA,CAAkB,YAAA,EAAc,YAAA"}
1
+ {"version":3,"file":"event-message.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/message-managers/event-message.ts"],"mappings":";;;8BAUsB,aAAa,WAAW;YAqCf,OAAO;;;;WAjCpB;;;;EAKT;;;;EAKA,WAAW;;;;EAKX;;;;EAKA,SAAS;;;;EAKT,UAAU;EAQjB,YAA6B,OAAO;;;;;;;EAQ7B;;;;;;;;;;KAeJ,aAAa;;;;EAIhB,UAAU,MAAM,MAAM;;;;EAItB,SAAS;;;;;;;;KASN,kBAAkB,YAAY,qBAAqB,YAAY,kBAClE,OAAO,cACJ,aAAa;;;;;;;;;;;;;;;;;;;;wBAqBF,YAAY,wBAAwB,wBAClD,mBACA,UAAS,aAAa,gBACrB,kBAAkB,cAAc"}
@@ -1,3 +1,4 @@
1
1
  import { EventMessage, defineEvent } from "./event-message.mjs";
2
2
  import { EventConsumer, defineConsumer } from "./event-consumer.mjs";
3
- import { ConsumedEventMessage, EventConsumerClass } from "./types.mjs";
3
+ import { ConsumedEventMessage, EventConsumerClass } from "./types.mjs";
4
+ export { ConsumedEventMessage, EventConsumer, EventConsumerClass, EventMessage, defineConsumer, defineEvent };
@@ -1,4 +1,4 @@
1
1
  import { EventConsumer, defineConsumer } from "./event-consumer.mjs";
2
2
  import { EventMessage, defineEvent } from "./event-message.mjs";
3
3
 
4
- export { };
4
+ export { EventConsumer, EventMessage, defineConsumer, defineEvent };
@@ -1,7 +1,8 @@
1
1
  import { Message } from "../types/message.types.mjs";
2
2
  import { EventConsumer } from "./event-consumer.mjs";
3
+ import "../types/index.mjs";
3
4
  //#region ../../packages/herald/src/message-managers/types.d.ts
4
- type ConsumedEventMessage = {
5
+ export type ConsumedEventMessage = {
5
6
  version?: number;
6
7
  occurredAt?: Date;
7
8
  metadata?: Record<string, any>;
@@ -10,7 +11,7 @@ type ConsumedEventMessage = {
10
11
  payload: Record<string, any>;
11
12
  message: Message<any>;
12
13
  };
13
- type EventConsumerClass<P = Record<string, any>> = {
14
+ export type EventConsumerClass<P = Record<string, any>> = {
14
15
  new (): EventConsumer<P>;
15
16
  eventName: string;
16
17
  consumerId: string;
@@ -19,5 +20,4 @@ type EventConsumerClass<P = Record<string, any>> = {
19
20
  isAcceptedVersion(version: number): boolean;
20
21
  };
21
22
  //#endregion
22
- export { ConsumedEventMessage, EventConsumerClass };
23
23
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/message-managers/types.ts"],"mappings":";;;KAGY,oBAAA;EACV,OAAA;EACA,UAAA,GAAa,IAAA;EACb,QAAA,GAAW,MAAA;EACX,SAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAA;EACT,OAAA,EAAS,OAAA;AAAA;AAAA,KAGC,kBAAA,KAAuB,MAAA;EAAA,QACzB,aAAA,CAAc,CAAA;EACtB,SAAA;EACA,UAAA;EACA,UAAA;EACA,UAAA;EACA,iBAAA,CAAkB,OAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/message-managers/types.ts"],"mappings":";;;;YAGY;EACV;EACA,aAAa;EACb,WAAW;EACX;EACA;EACA,SAAS;EACT,SAAS;;YAGC,mBAAmB,IAAI;UACzB,cAAc;EACtB;EACA;EACA;EACA;EACA,kBAAkB"}
@@ -1,8 +1,7 @@
1
1
  import { DeadLetterOptions } from "./subscribe.types.mjs";
2
2
  import { BaseValidator } from "@warlock.js/seal";
3
-
4
3
  //#region ../../packages/herald/src/types/channel.types.d.ts
5
- type ChannelOptions<_TPayload = unknown> = {
4
+ export type ChannelOptions<_TPayload = unknown> = {
6
5
  type?: "queue" | "topic" | "fanout";
7
6
  durable?: boolean;
8
7
  autoDelete?: boolean;
@@ -13,11 +12,10 @@ type ChannelOptions<_TPayload = unknown> = {
13
12
  maxLength?: number;
14
13
  schema?: BaseValidator;
15
14
  };
16
- type ChannelStats = {
15
+ export type ChannelStats = {
17
16
  messageCount: number;
18
17
  consumerCount: number;
19
18
  name: string;
20
19
  };
21
20
  //#endregion
22
- export { ChannelOptions, ChannelStats };
23
21
  //# sourceMappingURL=channel.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/channel.types.ts"],"mappings":";;;;KAGY,cAAA;EACV,IAAA;EACA,OAAA;EACA,UAAA;EACA,SAAA;EACA,UAAA,GAAa,iBAAA;EACb,cAAA;EACA,UAAA;EACA,SAAA;EACA,MAAA,GAAS,aAAa;AAAA;AAAA,KAGZ,YAAA;EACV,YAAA;EACA,aAAA;EACA,IAAA;AAAA"}
1
+ {"version":3,"file":"channel.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/channel.types.ts"],"mappings":";;;YAGY,eAAe;EACzB;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;EACA;EACA,SAAS;;YAGC;EACV;EACA;EACA"}
@@ -1,9 +1,9 @@
1
1
  //#region ../../packages/herald/src/types/connection.types.d.ts
2
- type BaseConnectionOptions = {
2
+ export type BaseConnectionOptions = {
3
3
  name?: string;
4
4
  isDefault?: boolean;
5
5
  };
6
- type RabbitMQSocketOptions = {
6
+ export type RabbitMQSocketOptions = {
7
7
  keepAlive?: boolean | number;
8
8
  noDelay?: boolean;
9
9
  timeout?: number;
@@ -14,13 +14,13 @@ type RabbitMQSocketOptions = {
14
14
  servername?: string;
15
15
  rejectUnauthorized?: boolean;
16
16
  };
17
- type RabbitMQClientOptions = {
17
+ export type RabbitMQClientOptions = {
18
18
  frameMax?: number;
19
19
  channelMax?: number;
20
20
  locale?: string;
21
21
  socket?: RabbitMQSocketOptions;
22
22
  };
23
- type RabbitMQConnectionOptions<TClientOptions extends RabbitMQClientOptions = RabbitMQClientOptions> = BaseConnectionOptions & {
23
+ export type RabbitMQConnectionOptions<TClientOptions extends RabbitMQClientOptions = RabbitMQClientOptions> = BaseConnectionOptions & {
24
24
  driver: "rabbitmq";
25
25
  host?: string;
26
26
  port?: number;
@@ -35,7 +35,7 @@ type RabbitMQConnectionOptions<TClientOptions extends RabbitMQClientOptions = Ra
35
35
  prefetch?: number;
36
36
  clientOptions?: TClientOptions;
37
37
  };
38
- type KafkaClientOptions = {
38
+ export type KafkaClientOptions = {
39
39
  retry?: {
40
40
  initialRetryTime?: number;
41
41
  retries?: number;
@@ -46,7 +46,7 @@ type KafkaClientOptions = {
46
46
  logLevel?: number;
47
47
  logCreator?: any;
48
48
  };
49
- type KafkaConnectionOptions<TClientOptions extends KafkaClientOptions = KafkaClientOptions> = BaseConnectionOptions & {
49
+ export type KafkaConnectionOptions<TClientOptions extends KafkaClientOptions = KafkaClientOptions> = BaseConnectionOptions & {
50
50
  driver: "kafka";
51
51
  brokers: string[];
52
52
  clientId?: string;
@@ -60,8 +60,7 @@ type KafkaConnectionOptions<TClientOptions extends KafkaClientOptions = KafkaCli
60
60
  };
61
61
  clientOptions?: TClientOptions;
62
62
  };
63
- type ConnectionOptions = RabbitMQConnectionOptions | KafkaConnectionOptions;
64
- type BrokerConfigurations<TClientOptions = any> = RabbitMQConnectionOptions<TClientOptions extends RabbitMQClientOptions ? TClientOptions : RabbitMQClientOptions> | KafkaConnectionOptions<TClientOptions extends KafkaClientOptions ? TClientOptions : KafkaClientOptions>;
63
+ export type ConnectionOptions = RabbitMQConnectionOptions | KafkaConnectionOptions;
64
+ export type BrokerConfigurations<TClientOptions = any> = RabbitMQConnectionOptions<TClientOptions extends RabbitMQClientOptions ? TClientOptions : RabbitMQClientOptions> | KafkaConnectionOptions<TClientOptions extends KafkaClientOptions ? TClientOptions : KafkaClientOptions>;
65
65
  //#endregion
66
- export { BaseConnectionOptions, BrokerConfigurations, ConnectionOptions, KafkaClientOptions, KafkaConnectionOptions, RabbitMQClientOptions, RabbitMQConnectionOptions, RabbitMQSocketOptions };
67
66
  //# sourceMappingURL=connection.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/connection.types.ts"],"mappings":";KAAY,qBAAA;EACV,IAAA;EACA,SAAS;AAAA;AAAA,KAGC,qBAAA;EACV,SAAA;EACA,OAAA;EACA,OAAA;EACA,EAAA,YAAc,MAAA,GAAS,KAAA,UAAe,MAAA;EACtC,IAAA,YAAgB,MAAA;EAChB,GAAA,YAAe,MAAA;EACf,UAAA;EACA,UAAA;EACA,kBAAA;AAAA;AAAA,KAGU,qBAAA;EACV,QAAA;EACA,UAAA;EACA,MAAA;EACA,MAAA,GAAS,qBAAqB;AAAA;AAAA,KAGpB,yBAAA,wBACa,qBAAA,GAAwB,qBAAA,IAC7C,qBAAA;EACF,MAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EACA,QAAA;EACA,KAAA;EACA,GAAA;EACA,SAAA;EACA,iBAAA;EACA,SAAA;EACA,cAAA;EACA,QAAA;EACA,aAAA,GAAgB,cAAA;AAAA;AAAA,KAGN,kBAAA;EACV,KAAA;IACE,gBAAA;IACA,OAAA;IACA,YAAA;IACA,MAAA;IACA,UAAA;EAAA;EAEF,QAAA;EACA,UAAA;AAAA;AAAA,KAGU,sBAAA,wBAA8C,kBAAA,GAAqB,kBAAA,IAC7E,qBAAA;EACE,MAAA;EACA,OAAA;EACA,QAAA;EACA,iBAAA;EACA,cAAA;EACA,GAAA;EACA,IAAA;IACE,SAAA;IACA,QAAA;IACA,QAAA;EAAA;EAEF,aAAA,GAAgB,cAAA;AAAA;AAAA,KAGR,iBAAA,GAAoB,yBAAA,GAA4B,sBAAsB;AAAA,KAEtE,oBAAA,yBACR,yBAAA,CACE,cAAA,SAAuB,qBAAA,GAAwB,cAAA,GAAiB,qBAAA,IAElE,sBAAA,CACE,cAAA,SAAuB,kBAAA,GAAqB,cAAA,GAAiB,kBAAA"}
1
+ {"version":3,"file":"connection.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/connection.types.ts"],"mappings":";YAAY;EACV;EACA;;YAGU;EACV;EACA;EACA;EACA,cAAc,SAAS,eAAe;EACtC,gBAAgB;EAChB,eAAe;EACf;EACA;EACA;;YAGU;EACV;EACA;EACA;EACA,SAAS;;YAGC,0BACV,uBAAuB,wBAAwB,yBAC7C;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAgB;;YAGN;EACV;IACE;IACA;IACA;IACA;IACA;;EAEF;EACA;;YAGU,uBAAuB,uBAAuB,qBAAqB,sBAC7E;EACE;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA;IACA;;EAEF,gBAAgB;;YAGR,oBAAoB,4BAA4B;YAEhD,qBAAqB,wBAC7B,0BACE,uBAAuB,wBAAwB,iBAAiB,yBAElE,uBACE,uBAAuB,qBAAqB,iBAAiB"}
@@ -1,13 +1,12 @@
1
1
  //#region ../../packages/herald/src/types/driver.types.d.ts
2
- type BrokerDriverType = "rabbitmq" | "kafka" | "redis-streams" | "sqs";
3
- type BrokerEvent = "connected" | "disconnected" | "error" | "reconnecting";
4
- type BrokerEventListener = (...args: unknown[]) => void;
5
- type HealthCheckResult = {
2
+ export type BrokerDriverType = "rabbitmq" | "kafka" | "redis-streams" | "sqs";
3
+ export type BrokerEvent = "connected" | "disconnected" | "error" | "reconnecting";
4
+ export type BrokerEventListener = (...args: unknown[]) => void;
5
+ export type HealthCheckResult = {
6
6
  healthy: boolean;
7
7
  latency?: number;
8
8
  error?: string;
9
9
  details?: Record<string, unknown>;
10
10
  };
11
11
  //#endregion
12
- export { BrokerDriverType, BrokerEvent, BrokerEventListener, HealthCheckResult };
13
12
  //# sourceMappingURL=driver.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/driver.types.ts"],"mappings":";KAAY,gBAAA;AAAA,KAEA,WAAA;AAAA,KAEA,mBAAA,OAA0B,IAAI;AAAA,KAE9B,iBAAA;EACV,OAAA;EACA,OAAA;EACA,KAAA;EACA,OAAA,GAAU,MAAM;AAAA"}
1
+ {"version":3,"file":"driver.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/driver.types.ts"],"mappings":";YAAY;YAEA;YAEA,0BAA0B;YAE1B;EACV;EACA;EACA;EACA,UAAU"}
@@ -4,4 +4,5 @@ import { BaseConnectionOptions, BrokerConfigurations, ConnectionOptions, KafkaCl
4
4
  import { BrokerDriverType, BrokerEvent, BrokerEventListener, HealthCheckResult } from "./driver.types.mjs";
5
5
  import { Message, MessageContext, MessageHandler, MessageMetadata, ResponseHandler, Subscription } from "./message.types.mjs";
6
6
  import { PublishOptions, RequestOptions } from "./publish.types.mjs";
7
- import { BrokerRegistryEvent, BrokerRegistryListener } from "./registry.types.mjs";
7
+ import { BrokerRegistryEvent, BrokerRegistryListener } from "./registry.types.mjs";
8
+ export { BaseConnectionOptions, BrokerConfigurations, BrokerDriverType, BrokerEvent, BrokerEventListener, BrokerRegistryEvent, BrokerRegistryListener, ChannelOptions, ChannelStats, ConnectionOptions, DeadLetterOptions, HealthCheckResult, KafkaClientOptions, KafkaConnectionOptions, Message, MessageContext, MessageHandler, MessageMetadata, PublishOptions, RabbitMQClientOptions, RabbitMQConnectionOptions, RabbitMQSocketOptions, RequestOptions, ResponseHandler, RetryOptions, SubscribeOptions, Subscription };
@@ -1,5 +1,5 @@
1
1
  //#region ../../packages/herald/src/types/message.types.d.ts
2
- type MessageMetadata = {
2
+ export type MessageMetadata = {
3
3
  messageId: string;
4
4
  correlationId?: string;
5
5
  replyTo?: string;
@@ -9,19 +9,19 @@ type MessageMetadata = {
9
9
  retryCount?: number;
10
10
  originalChannel?: string;
11
11
  };
12
- type Message<TPayload = unknown> = {
12
+ export type Message<TPayload = unknown> = {
13
13
  readonly metadata: MessageMetadata;
14
14
  readonly payload: TPayload;
15
15
  readonly raw?: unknown;
16
16
  };
17
- type MessageContext = {
17
+ export type MessageContext = {
18
18
  ack(): Promise<void>;
19
19
  nack(requeue?: boolean): Promise<void>;
20
20
  reject(): Promise<void>;
21
21
  reply<T>(payload: T): Promise<void>;
22
22
  retry(delay?: number): Promise<void>;
23
23
  };
24
- type Subscription = {
24
+ export type Subscription = {
25
25
  readonly id: string;
26
26
  readonly channel: string;
27
27
  readonly consumerTag?: string;
@@ -30,8 +30,7 @@ type Subscription = {
30
30
  resume(): Promise<void>;
31
31
  isActive(): boolean;
32
32
  };
33
- type MessageHandler<TPayload = unknown> = (message: Message<TPayload>, ctx: MessageContext) => Promise<void> | void;
34
- type ResponseHandler<TPayload = unknown, TResponse = unknown> = (message: Message<TPayload>, ctx: MessageContext) => Promise<TResponse> | TResponse;
33
+ export type MessageHandler<TPayload = unknown> = (message: Message<TPayload>, ctx: MessageContext) => Promise<void> | void;
34
+ export type ResponseHandler<TPayload = unknown, TResponse = unknown> = (message: Message<TPayload>, ctx: MessageContext) => Promise<TResponse> | TResponse;
35
35
  //#endregion
36
- export { Message, MessageContext, MessageHandler, MessageMetadata, ResponseHandler, Subscription };
37
36
  //# sourceMappingURL=message.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/message.types.ts"],"mappings":";KAAY,eAAA;EACV,SAAA;EACA,aAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA,EAAW,IAAA;EACX,OAAA,GAAU,MAAM;EAChB,UAAA;EACA,eAAA;AAAA;AAAA,KAGU,OAAA;EAAA,SACD,QAAA,EAAU,eAAA;EAAA,SACV,OAAA,EAAS,QAAQ;EAAA,SACjB,GAAA;AAAA;AAAA,KAGC,cAAA;EACV,GAAA,IAAO,OAAA;EACP,IAAA,CAAK,OAAA,aAAoB,OAAA;EACzB,MAAA,IAAU,OAAA;EACV,KAAA,IAAS,OAAA,EAAS,CAAA,GAAI,OAAA;EACtB,KAAA,CAAM,KAAA,YAAiB,OAAA;AAAA;AAAA,KAGb,YAAA;EAAA,SACD,EAAA;EAAA,SACA,OAAA;EAAA,SACA,WAAA;EACT,WAAA,IAAe,OAAA;EACf,KAAA,IAAS,OAAA;EACT,MAAA,IAAU,OAAA;EACV,QAAA;AAAA;AAAA,KAGU,cAAA,wBACV,OAAA,EAAS,OAAA,CAAQ,QAAA,GACjB,GAAA,EAAK,cAAA,KACF,OAAA;AAAA,KAEO,eAAA,6CACV,OAAA,EAAS,OAAA,CAAQ,QAAA,GACjB,GAAA,EAAK,cAAA,KACF,OAAA,CAAQ,SAAA,IAAa,SAAA"}
1
+ {"version":3,"file":"message.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/message.types.ts"],"mappings":";YAAY;EACV;EACA;EACA;EACA;EACA,WAAW;EACX,UAAU;EACV;EACA;;YAGU,QAAQ;WACT,UAAU;WACV,SAAS;WACT;;YAGC;EACV,OAAO;EACP,KAAK,oBAAoB;EACzB,UAAU;EACV,MAAM,GAAG,SAAS,IAAI;EACtB,MAAM,iBAAiB;;YAGb;WACD;WACA;WACA;EACT,eAAe;EACf,SAAS;EACT,UAAU;EACV;;YAGU,eAAe,uBACzB,SAAS,QAAQ,WACjB,KAAK,mBACF;YAEO,gBAAgB,oBAAoB,wBAC9C,SAAS,QAAQ,WACjB,KAAK,mBACF,QAAQ,aAAa"}
@@ -1,5 +1,5 @@
1
1
  //#region ../../packages/herald/src/types/publish.types.d.ts
2
- type PublishOptions = {
2
+ export type PublishOptions = {
3
3
  priority?: number;
4
4
  ttl?: number;
5
5
  delay?: number;
@@ -8,9 +8,8 @@ type PublishOptions = {
8
8
  correlationId?: string;
9
9
  expiration?: number;
10
10
  };
11
- type RequestOptions = PublishOptions & {
11
+ export type RequestOptions = PublishOptions & {
12
12
  timeout?: number;
13
13
  };
14
14
  //#endregion
15
- export { PublishOptions, RequestOptions };
16
15
  //# sourceMappingURL=publish.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/publish.types.ts"],"mappings":";KAAY,cAAA;EACV,QAAA;EACA,GAAA;EACA,KAAA;EACA,OAAA,GAAU,MAAM;EAChB,UAAA;EACA,aAAA;EACA,UAAA;AAAA;AAAA,KAGU,cAAA,GAAiB,cAAc;EACzC,OAAO;AAAA"}
1
+ {"version":3,"file":"publish.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/publish.types.ts"],"mappings":";YAAY;EACV;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;;YAGU,iBAAiB;EAC3B"}
@@ -1,8 +1,6 @@
1
1
  import { Broker } from "../communicators/broker.mjs";
2
-
3
2
  //#region ../../packages/herald/src/types/registry.types.d.ts
4
- type BrokerRegistryEvent = "registered" | "default-registered" | "connected" | "disconnected";
5
- type BrokerRegistryListener = (broker: Broker) => void;
3
+ export type BrokerRegistryEvent = "registered" | "default-registered" | "connected" | "disconnected";
4
+ export type BrokerRegistryListener = (broker: Broker) => void;
6
5
  //#endregion
7
- export { BrokerRegistryEvent, BrokerRegistryListener };
8
6
  //# sourceMappingURL=registry.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/registry.types.ts"],"mappings":";;;KAEY,mBAAA;AAAA,KAMA,sBAAA,IAA0B,MAAc,EAAN,MAAM"}
1
+ {"version":3,"file":"registry.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/registry.types.ts"],"mappings":";;YAEY;YAMA,0BAA0B,QAAQ"}
@@ -1,13 +1,13 @@
1
1
  //#region ../../packages/herald/src/types/subscribe.types.d.ts
2
- type RetryOptions = {
2
+ export type RetryOptions = {
3
3
  maxRetries: number;
4
4
  delay: number | ((attempt: number) => number);
5
5
  };
6
- type DeadLetterOptions = {
6
+ export type DeadLetterOptions = {
7
7
  channel: string;
8
8
  preserveOriginal?: boolean;
9
9
  };
10
- type SubscribeOptions = {
10
+ export type SubscribeOptions = {
11
11
  consumerId?: string;
12
12
  group?: string;
13
13
  prefetch?: number;
@@ -17,5 +17,4 @@ type SubscribeOptions = {
17
17
  exclusive?: boolean;
18
18
  };
19
19
  //#endregion
20
- export { DeadLetterOptions, RetryOptions, SubscribeOptions };
21
20
  //# sourceMappingURL=subscribe.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribe.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/subscribe.types.ts"],"mappings":";KAAY,YAAA;EACV,UAAA;EACA,KAAA,aAAkB,OAAA;AAAA;AAAA,KAGR,iBAAA;EACV,OAAA;EACA,gBAAgB;AAAA;AAAA,KAGN,gBAAA;EACV,UAAA;EACA,KAAA;EACA,QAAA;EACA,OAAA;EACA,KAAA,GAAQ,YAAA;EACR,UAAA,GAAa,iBAAiB;EAC9B,SAAA;AAAA"}
1
+ {"version":3,"file":"subscribe.types.d.mts","names":[],"sources":["../../../../../../../../packages/herald/src/types/subscribe.types.ts"],"mappings":";YAAY;EACV;EACA,kBAAkB;;YAGR;EACV;EACA;;YAGU;EACV;EACA;EACA;EACA;EACA,QAAQ;EACR,aAAa;EACb"}