@warlock.js/notifications 5.30.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 (421) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/cjs/index.cjs +2 -2
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/channels/database-channel.d.mts +2 -3
  5. package/esm/channels/database-channel.d.mts.map +1 -1
  6. package/esm/channels/index.d.mts +2 -1
  7. package/esm/channels/index.mjs +1 -1
  8. package/esm/channels/mail-channel.d.mts +6 -4
  9. package/esm/channels/mail-channel.d.mts.map +1 -1
  10. package/esm/config.d.mts +13 -9
  11. package/esm/config.d.mts.map +1 -1
  12. package/esm/config.mjs.map +1 -1
  13. package/esm/contracts/channel.contract.d.mts +1 -3
  14. package/esm/contracts/channel.contract.d.mts.map +1 -1
  15. package/esm/contracts/index.d.mts +2 -1
  16. package/esm/contracts/notification.contract.d.mts +1 -3
  17. package/esm/contracts/notification.contract.d.mts.map +1 -1
  18. package/esm/contracts/preference-provider.contract.d.mts +1 -3
  19. package/esm/contracts/preference-provider.contract.d.mts.map +1 -1
  20. package/esm/contracts/queue-dispatcher.contract.d.mts +1 -3
  21. package/esm/contracts/queue-dispatcher.contract.d.mts.map +1 -1
  22. package/esm/contracts/rate-limiter.contract.d.mts +1 -3
  23. package/esm/contracts/rate-limiter.contract.d.mts.map +1 -1
  24. package/esm/dispatch/define-channel.d.mts +2 -2
  25. package/esm/dispatch/define-channel.d.mts.map +1 -1
  26. package/esm/dispatch/define-notification.d.mts +5 -6
  27. package/esm/dispatch/define-notification.d.mts.map +1 -1
  28. package/esm/dispatch/define-notification.mjs.map +1 -1
  29. package/esm/dispatch/index.d.mts +2 -1
  30. package/esm/dispatch/index.mjs +1 -1
  31. package/esm/dispatch/notifications-event-bus.d.mts +2 -3
  32. package/esm/dispatch/notifications-event-bus.d.mts.map +1 -1
  33. package/esm/dispatch/notify.d.mts +3 -5
  34. package/esm/dispatch/notify.d.mts.map +1 -1
  35. package/esm/dispatch/notify.mjs.map +1 -1
  36. package/esm/errors.d.mts +5 -6
  37. package/esm/errors.d.mts.map +1 -1
  38. package/esm/in-app/base-notifications-repository.d.mts +6 -6
  39. package/esm/in-app/base-notifications-repository.d.mts.map +1 -1
  40. package/esm/in-app/base-notifications-repository.mjs +1 -1
  41. package/esm/in-app/base-notifications-repository.mjs.map +1 -1
  42. package/esm/in-app/column-map.d.mts +11 -8
  43. package/esm/in-app/column-map.d.mts.map +1 -1
  44. package/esm/in-app/database-notification.d.mts +2 -3
  45. package/esm/in-app/database-notification.d.mts.map +1 -1
  46. package/esm/in-app/in-app.d.mts +6 -5
  47. package/esm/in-app/in-app.d.mts.map +1 -1
  48. package/esm/in-app/index.d.mts +2 -1
  49. package/esm/in-app/index.mjs +1 -1
  50. package/esm/index.d.mts +6 -0
  51. package/esm/migration/index.d.mts +2 -1
  52. package/esm/migration/index.mjs +1 -1
  53. package/esm/migration/notification-columns.d.mts +6 -7
  54. package/esm/migration/notification-columns.d.mts.map +1 -1
  55. package/esm/migration/notification-columns.mjs.map +1 -1
  56. package/esm/queue/bullmq-queue.d.mts +9 -7
  57. package/esm/queue/bullmq-queue.d.mts.map +1 -1
  58. package/esm/queue/bullmq-queue.mjs.map +1 -1
  59. package/esm/queue/herald-queue.d.mts +6 -4
  60. package/esm/queue/herald-queue.d.mts.map +1 -1
  61. package/esm/queue/index.d.mts +2 -1
  62. package/esm/queue/index.mjs +1 -1
  63. package/esm/queue/load-herald.d.mts +1 -2
  64. package/esm/queue/load-herald.d.mts.map +1 -1
  65. package/esm/queue/load-herald.mjs +1 -1
  66. package/esm/queue/load-queue.d.mts +2 -3
  67. package/esm/queue/load-queue.d.mts.map +1 -1
  68. package/esm/queue/notifications-worker.d.mts +5 -4
  69. package/esm/queue/notifications-worker.d.mts.map +1 -1
  70. package/esm/queue/notifications-worker.mjs.map +1 -1
  71. package/esm/queue/queue-package-not-installed.error.d.mts +1 -2
  72. package/esm/queue/queue-package-not-installed.error.d.mts.map +1 -1
  73. package/esm/types.d.mts +22 -18
  74. package/esm/types.d.mts.map +1 -1
  75. package/llms-full.txt +89 -81
  76. package/package.json +10 -9
  77. package/skills/configure-notifications/SKILL.md +7 -7
  78. package/skills/define-channel/SKILL.md +9 -7
  79. package/skills/define-notification/SKILL.md +22 -25
  80. package/skills/index.md +4 -1
  81. package/skills/notifications-basics/SKILL.md +12 -12
  82. package/skills/observe-notifications/SKILL.md +14 -10
  83. package/skills/send-ad-hoc/SKILL.md +9 -9
  84. package/skills/use-in-app/SKILL.md +6 -4
  85. package/skills/write-notification-migration/SKILL.md +10 -7
  86. package/cjs/channel_api-C5ZZDkgQ.cjs +0 -7463
  87. package/cjs/channel_api-C5ZZDkgQ.cjs.map +0 -1
  88. package/cjs/chunk-fl3r8ClO.cjs +0 -41
  89. package/cjs/rabbitmq-driver-BFoWr21L.cjs +0 -3
  90. package/cjs/src-eu2jxS21.cjs +0 -11190
  91. package/cjs/src-eu2jxS21.cjs.map +0 -1
  92. package/esm/_virtual/_rolldown/runtime.mjs +0 -32
  93. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs +0 -6
  94. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs.map +0 -1
  95. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/bool.mjs +0 -3
  96. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/color.mjs +0 -3
  97. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/date.mjs +0 -3
  98. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/float.mjs +0 -3
  99. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/id.mjs +0 -3
  100. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/int.mjs +0 -3
  101. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/nanoid.mjs +0 -3
  102. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/pick.mjs +0 -3
  103. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/random.mjs +0 -16
  104. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/sample.mjs +0 -3
  105. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/string.mjs +0 -3
  106. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/token.mjs +0 -3
  107. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/uuid.mjs +0 -3
  108. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/weighted.mjs +0 -3
  109. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/async/retry.mjs +0 -3
  110. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/index.mjs +0 -24
  111. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs +0 -82
  112. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs.map +0 -1
  113. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs +0 -17
  114. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs.map +0 -1
  115. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs +0 -13
  116. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs.map +0 -1
  117. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs +0 -18
  118. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs.map +0 -1
  119. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs +0 -17
  120. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs.map +0 -1
  121. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs +0 -30
  122. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs.map +0 -1
  123. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs +0 -19
  124. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs.map +0 -1
  125. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs +0 -18
  126. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs.map +0 -1
  127. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs +0 -14
  128. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs.map +0 -1
  129. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs +0 -18
  130. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs.map +0 -1
  131. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs +0 -22
  132. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs.map +0 -1
  133. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs +0 -17
  134. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs.map +0 -1
  135. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs +0 -21
  136. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs.map +0 -1
  137. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toStudlyCase.mjs +0 -21
  138. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toStudlyCase.mjs.map +0 -1
  139. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/trim.mjs +0 -20
  140. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/trim.mjs.map +0 -1
  141. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ucfirst.mjs +0 -15
  142. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ucfirst.mjs.map +0 -1
  143. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/words.mjs +0 -25
  144. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/words.mjs.map +0 -1
  145. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/escapeRegex.mjs +0 -11
  146. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/escapeRegex.mjs.map +0 -1
  147. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/lazy.mjs +0 -100
  148. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/lazy.mjs.map +0 -1
  149. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/tap.mjs +0 -27
  150. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/tap.mjs.map +0 -1
  151. package/esm/node_modules/.pnpm/@mongez_supportive-is@3.0.0/node_modules/@mongez/supportive-is/esm/index.mjs +0 -358
  152. package/esm/node_modules/.pnpm/@mongez_supportive-is@3.0.0/node_modules/@mongez/supportive-is/esm/index.mjs.map +0 -1
  153. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/channel_api.mjs +0 -28
  154. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/channel_api.mjs.map +0 -1
  155. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/api_args.mjs +0 -241
  156. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/api_args.mjs.map +0 -1
  157. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/bitset.mjs +0 -130
  158. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/bitset.mjs.map +0 -1
  159. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel.mjs +0 -302
  160. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel.mjs.map +0 -1
  161. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel_model.mjs +0 -206
  162. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel_model.mjs.map +0 -1
  163. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/codec.mjs +0 -273
  164. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/codec.mjs.map +0 -1
  165. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connect.mjs +0 -143
  166. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connect.mjs.map +0 -1
  167. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connection.mjs +0 -416
  168. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connection.mjs.map +0 -1
  169. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/credentials.mjs +0 -50
  170. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/credentials.mjs.map +0 -1
  171. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/defs.mjs +0 -4600
  172. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/defs.mjs.map +0 -1
  173. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/error.mjs +0 -29
  174. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/error.mjs.map +0 -1
  175. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/format.mjs +0 -28
  176. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/format.mjs.map +0 -1
  177. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/frame.mjs +0 -130
  178. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/frame.mjs.map +0 -1
  179. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/heartbeat.mjs +0 -40
  180. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/heartbeat.mjs.map +0 -1
  181. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/mux.mjs +0 -86
  182. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/mux.mjs.map +0 -1
  183. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/package.mjs +0 -41
  184. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/package.mjs.map +0 -1
  185. package/esm/node_modules/.pnpm/buffer-more-ints@1.0.0/node_modules/buffer-more-ints/buffer-more-ints.mjs +0 -360
  186. package/esm/node_modules/.pnpm/buffer-more-ints@1.0.0/node_modules/buffer-more-ints/buffer-more-ints.mjs.map +0 -1
  187. package/esm/node_modules/.pnpm/dayjs@1.11.23/node_modules/dayjs/dayjs.min.mjs +0 -305
  188. package/esm/node_modules/.pnpm/dayjs@1.11.23/node_modules/dayjs/dayjs.min.mjs.map +0 -1
  189. package/esm/node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.mjs +0 -80
  190. package/esm/node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.mjs.map +0 -1
  191. package/esm/node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.mjs +0 -35
  192. package/esm/node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.mjs.map +0 -1
  193. package/esm/node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.mjs +0 -388
  194. package/esm/node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.mjs.map +0 -1
  195. package/esm/packages/herald/src/communicators/broker-registry.mjs +0 -204
  196. package/esm/packages/herald/src/communicators/broker-registry.mjs.map +0 -1
  197. package/esm/packages/herald/src/communicators/broker.mjs +0 -110
  198. package/esm/packages/herald/src/communicators/broker.mjs.map +0 -1
  199. package/esm/packages/herald/src/communicators/index.mjs +0 -4
  200. package/esm/packages/herald/src/decorators/consumable.mjs +0 -36
  201. package/esm/packages/herald/src/decorators/consumable.mjs.map +0 -1
  202. package/esm/packages/herald/src/decorators/index.mjs +0 -3
  203. package/esm/packages/herald/src/drivers/index.mjs +0 -5
  204. package/esm/packages/herald/src/drivers/rabbitmq/index.mjs +0 -4
  205. package/esm/packages/herald/src/drivers/rabbitmq/rabbitmq-channel.mjs +0 -403
  206. package/esm/packages/herald/src/drivers/rabbitmq/rabbitmq-channel.mjs.map +0 -1
  207. package/esm/packages/herald/src/drivers/rabbitmq/rabbitmq-driver.mjs +0 -303
  208. package/esm/packages/herald/src/drivers/rabbitmq/rabbitmq-driver.mjs.map +0 -1
  209. package/esm/packages/herald/src/index.mjs +0 -16
  210. package/esm/packages/herald/src/message-managers/event-consumer.mjs +0 -76
  211. package/esm/packages/herald/src/message-managers/event-consumer.mjs.map +0 -1
  212. package/esm/packages/herald/src/message-managers/event-message.mjs +0 -85
  213. package/esm/packages/herald/src/message-managers/event-message.mjs.map +0 -1
  214. package/esm/packages/herald/src/message-managers/index.mjs +0 -4
  215. package/esm/packages/herald/src/message-managers/prepare-consumer-subscription.mjs +0 -42
  216. package/esm/packages/herald/src/message-managers/prepare-consumer-subscription.mjs.map +0 -1
  217. package/esm/packages/herald/src/use-case-broadcast.mjs +0 -30
  218. package/esm/packages/herald/src/use-case-broadcast.mjs.map +0 -1
  219. package/esm/packages/herald/src/utils/connect-to-broker.mjs +0 -168
  220. package/esm/packages/herald/src/utils/connect-to-broker.mjs.map +0 -1
  221. package/esm/packages/herald/src/utils/index.mjs +0 -3
  222. package/esm/packages/seal/src/config.mjs +0 -15
  223. package/esm/packages/seal/src/config.mjs.map +0 -1
  224. package/esm/packages/seal/src/factory/index.mjs +0 -4
  225. package/esm/packages/seal/src/factory/validate.mjs +0 -42
  226. package/esm/packages/seal/src/factory/validate.mjs.map +0 -1
  227. package/esm/packages/seal/src/factory/validators.mjs +0 -133
  228. package/esm/packages/seal/src/factory/validators.mjs.map +0 -1
  229. package/esm/packages/seal/src/helpers/date-helpers.mjs +0 -24
  230. package/esm/packages/seal/src/helpers/date-helpers.mjs.map +0 -1
  231. package/esm/packages/seal/src/helpers/get-field-value.mjs +0 -46
  232. package/esm/packages/seal/src/helpers/get-field-value.mjs.map +0 -1
  233. package/esm/packages/seal/src/helpers/index.mjs +0 -6
  234. package/esm/packages/seal/src/helpers/is-empty-value.mjs +0 -10
  235. package/esm/packages/seal/src/helpers/is-empty-value.mjs.map +0 -1
  236. package/esm/packages/seal/src/helpers/path-helpers.mjs +0 -12
  237. package/esm/packages/seal/src/helpers/path-helpers.mjs.map +0 -1
  238. package/esm/packages/seal/src/helpers/validation-helpers.mjs +0 -78
  239. package/esm/packages/seal/src/helpers/validation-helpers.mjs.map +0 -1
  240. package/esm/packages/seal/src/index.mjs +0 -88
  241. package/esm/packages/seal/src/mutators/array-mutators.mjs +0 -32
  242. package/esm/packages/seal/src/mutators/array-mutators.mjs.map +0 -1
  243. package/esm/packages/seal/src/mutators/boolean-mutators.mjs +0 -40
  244. package/esm/packages/seal/src/mutators/boolean-mutators.mjs.map +0 -1
  245. package/esm/packages/seal/src/mutators/date-mutators.mjs +0 -94
  246. package/esm/packages/seal/src/mutators/date-mutators.mjs.map +0 -1
  247. package/esm/packages/seal/src/mutators/index.mjs +0 -9
  248. package/esm/packages/seal/src/mutators/number-mutators.mjs +0 -52
  249. package/esm/packages/seal/src/mutators/number-mutators.mjs.map +0 -1
  250. package/esm/packages/seal/src/mutators/object-mutators.mjs +0 -30
  251. package/esm/packages/seal/src/mutators/object-mutators.mjs.map +0 -1
  252. package/esm/packages/seal/src/mutators/scalar-mutators.mjs +0 -9
  253. package/esm/packages/seal/src/mutators/scalar-mutators.mjs.map +0 -1
  254. package/esm/packages/seal/src/mutators/string-mutators.mjs +0 -186
  255. package/esm/packages/seal/src/mutators/string-mutators.mjs.map +0 -1
  256. package/esm/packages/seal/src/object.mjs +0 -13
  257. package/esm/packages/seal/src/object.mjs.map +0 -1
  258. package/esm/packages/seal/src/rules/array/array-rules.mjs +0 -41
  259. package/esm/packages/seal/src/rules/array/array-rules.mjs.map +0 -1
  260. package/esm/packages/seal/src/rules/array/index.mjs +0 -3
  261. package/esm/packages/seal/src/rules/color/color-rules.mjs +0 -104
  262. package/esm/packages/seal/src/rules/color/color-rules.mjs.map +0 -1
  263. package/esm/packages/seal/src/rules/color/index.mjs +0 -3
  264. package/esm/packages/seal/src/rules/common/enum.mjs +0 -77
  265. package/esm/packages/seal/src/rules/common/enum.mjs.map +0 -1
  266. package/esm/packages/seal/src/rules/common/equals-field-rules.mjs +0 -42
  267. package/esm/packages/seal/src/rules/common/equals-field-rules.mjs.map +0 -1
  268. package/esm/packages/seal/src/rules/common/index.mjs +0 -8
  269. package/esm/packages/seal/src/rules/common/instanceof.mjs +0 -23
  270. package/esm/packages/seal/src/rules/common/instanceof.mjs.map +0 -1
  271. package/esm/packages/seal/src/rules/common/literal.mjs +0 -31
  272. package/esm/packages/seal/src/rules/common/literal.mjs.map +0 -1
  273. package/esm/packages/seal/src/rules/common/type-rules.mjs +0 -97
  274. package/esm/packages/seal/src/rules/common/type-rules.mjs.map +0 -1
  275. package/esm/packages/seal/src/rules/common/unknown-key.mjs +0 -25
  276. package/esm/packages/seal/src/rules/common/unknown-key.mjs.map +0 -1
  277. package/esm/packages/seal/src/rules/conditional/forbidden-if-rules.mjs +0 -116
  278. package/esm/packages/seal/src/rules/conditional/forbidden-if-rules.mjs.map +0 -1
  279. package/esm/packages/seal/src/rules/conditional/index.mjs +0 -12
  280. package/esm/packages/seal/src/rules/conditional/present-if-rules.mjs +0 -97
  281. package/esm/packages/seal/src/rules/conditional/present-if-rules.mjs.map +0 -1
  282. package/esm/packages/seal/src/rules/conditional/present-unless-rules.mjs +0 -30
  283. package/esm/packages/seal/src/rules/conditional/present-unless-rules.mjs.map +0 -1
  284. package/esm/packages/seal/src/rules/conditional/present-with-rules.mjs +0 -76
  285. package/esm/packages/seal/src/rules/conditional/present-with-rules.mjs.map +0 -1
  286. package/esm/packages/seal/src/rules/conditional/present-without-rules.mjs +0 -76
  287. package/esm/packages/seal/src/rules/conditional/present-without-rules.mjs.map +0 -1
  288. package/esm/packages/seal/src/rules/conditional/required-if-rules.mjs +0 -204
  289. package/esm/packages/seal/src/rules/conditional/required-if-rules.mjs.map +0 -1
  290. package/esm/packages/seal/src/rules/conditional/required-unless-rules.mjs +0 -31
  291. package/esm/packages/seal/src/rules/conditional/required-unless-rules.mjs.map +0 -1
  292. package/esm/packages/seal/src/rules/conditional/required-when-rule.mjs +0 -32
  293. package/esm/packages/seal/src/rules/conditional/required-when-rule.mjs.map +0 -1
  294. package/esm/packages/seal/src/rules/conditional/required-with-rules.mjs +0 -67
  295. package/esm/packages/seal/src/rules/conditional/required-with-rules.mjs.map +0 -1
  296. package/esm/packages/seal/src/rules/conditional/required-without-rules.mjs +0 -67
  297. package/esm/packages/seal/src/rules/conditional/required-without-rules.mjs.map +0 -1
  298. package/esm/packages/seal/src/rules/core/equal.mjs +0 -22
  299. package/esm/packages/seal/src/rules/core/equal.mjs.map +0 -1
  300. package/esm/packages/seal/src/rules/core/forbidden.mjs +0 -20
  301. package/esm/packages/seal/src/rules/core/forbidden.mjs.map +0 -1
  302. package/esm/packages/seal/src/rules/core/index.mjs +0 -7
  303. package/esm/packages/seal/src/rules/core/required.mjs +0 -36
  304. package/esm/packages/seal/src/rules/core/required.mjs.map +0 -1
  305. package/esm/packages/seal/src/rules/core/union.mjs +0 -32
  306. package/esm/packages/seal/src/rules/core/union.mjs.map +0 -1
  307. package/esm/packages/seal/src/rules/core/when.mjs +0 -37
  308. package/esm/packages/seal/src/rules/core/when.mjs.map +0 -1
  309. package/esm/packages/seal/src/rules/date/date-comparison-rules.mjs +0 -78
  310. package/esm/packages/seal/src/rules/date/date-comparison-rules.mjs.map +0 -1
  311. package/esm/packages/seal/src/rules/date/date-day-rules.mjs +0 -49
  312. package/esm/packages/seal/src/rules/date/date-day-rules.mjs.map +0 -1
  313. package/esm/packages/seal/src/rules/date/date-field-comparison-rules.mjs +0 -82
  314. package/esm/packages/seal/src/rules/date/date-field-comparison-rules.mjs.map +0 -1
  315. package/esm/packages/seal/src/rules/date/date-period-rules.mjs +0 -401
  316. package/esm/packages/seal/src/rules/date/date-period-rules.mjs.map +0 -1
  317. package/esm/packages/seal/src/rules/date/date-relative-rules.mjs +0 -55
  318. package/esm/packages/seal/src/rules/date/date-relative-rules.mjs.map +0 -1
  319. package/esm/packages/seal/src/rules/date/date-special-rules.mjs +0 -58
  320. package/esm/packages/seal/src/rules/date/date-special-rules.mjs.map +0 -1
  321. package/esm/packages/seal/src/rules/date/date.mjs +0 -235
  322. package/esm/packages/seal/src/rules/date/date.mjs.map +0 -1
  323. package/esm/packages/seal/src/rules/date/index.mjs +0 -9
  324. package/esm/packages/seal/src/rules/file/dimensions.mjs +0 -3
  325. package/esm/packages/seal/src/rules/file/file-size.mjs +0 -3
  326. package/esm/packages/seal/src/rules/file/index.mjs +0 -4
  327. package/esm/packages/seal/src/rules/index.mjs +0 -54
  328. package/esm/packages/seal/src/rules/length/index.mjs +0 -3
  329. package/esm/packages/seal/src/rules/length/length-rules.mjs +0 -98
  330. package/esm/packages/seal/src/rules/length/length-rules.mjs.map +0 -1
  331. package/esm/packages/seal/src/rules/number/index.mjs +0 -3
  332. package/esm/packages/seal/src/rules/number/number-rules.mjs +0 -197
  333. package/esm/packages/seal/src/rules/number/number-rules.mjs.map +0 -1
  334. package/esm/packages/seal/src/rules/scalar/accepted-rule.mjs +0 -123
  335. package/esm/packages/seal/src/rules/scalar/accepted-rule.mjs.map +0 -1
  336. package/esm/packages/seal/src/rules/scalar/declined-rule.mjs +0 -123
  337. package/esm/packages/seal/src/rules/scalar/declined-rule.mjs.map +0 -1
  338. package/esm/packages/seal/src/rules/scalar/index.mjs +0 -4
  339. package/esm/packages/seal/src/rules/string/alpha.mjs +0 -41
  340. package/esm/packages/seal/src/rules/string/alpha.mjs.map +0 -1
  341. package/esm/packages/seal/src/rules/string/credit-card.mjs +0 -32
  342. package/esm/packages/seal/src/rules/string/credit-card.mjs.map +0 -1
  343. package/esm/packages/seal/src/rules/string/email.mjs +0 -20
  344. package/esm/packages/seal/src/rules/string/email.mjs.map +0 -1
  345. package/esm/packages/seal/src/rules/string/id-formats.mjs +0 -104
  346. package/esm/packages/seal/src/rules/string/id-formats.mjs.map +0 -1
  347. package/esm/packages/seal/src/rules/string/index.mjs +0 -13
  348. package/esm/packages/seal/src/rules/string/ip.mjs +0 -66
  349. package/esm/packages/seal/src/rules/string/ip.mjs.map +0 -1
  350. package/esm/packages/seal/src/rules/string/matches.mjs +0 -4
  351. package/esm/packages/seal/src/rules/string/pattern.mjs +0 -20
  352. package/esm/packages/seal/src/rules/string/pattern.mjs.map +0 -1
  353. package/esm/packages/seal/src/rules/string/string-comparison.mjs +0 -56
  354. package/esm/packages/seal/src/rules/string/string-comparison.mjs.map +0 -1
  355. package/esm/packages/seal/src/rules/string/strong-password-rule.mjs +0 -31
  356. package/esm/packages/seal/src/rules/string/strong-password-rule.mjs.map +0 -1
  357. package/esm/packages/seal/src/rules/string/url.mjs +0 -23
  358. package/esm/packages/seal/src/rules/string/url.mjs.map +0 -1
  359. package/esm/packages/seal/src/rules/string/without-whitespace.mjs +0 -19
  360. package/esm/packages/seal/src/rules/string/without-whitespace.mjs.map +0 -1
  361. package/esm/packages/seal/src/standard-schema/json-schema.mjs +0 -81
  362. package/esm/packages/seal/src/standard-schema/json-schema.mjs.map +0 -1
  363. package/esm/packages/seal/src/standard-schema/map-result.mjs +0 -26
  364. package/esm/packages/seal/src/standard-schema/map-result.mjs.map +0 -1
  365. package/esm/packages/seal/src/string.mjs +0 -13
  366. package/esm/packages/seal/src/string.mjs.map +0 -1
  367. package/esm/packages/seal/src/types/date-types.mjs +0 -17
  368. package/esm/packages/seal/src/types/date-types.mjs.map +0 -1
  369. package/esm/packages/seal/src/validators/any-validator.mjs +0 -38
  370. package/esm/packages/seal/src/validators/any-validator.mjs.map +0 -1
  371. package/esm/packages/seal/src/validators/array-validator.mjs +0 -186
  372. package/esm/packages/seal/src/validators/array-validator.mjs.map +0 -1
  373. package/esm/packages/seal/src/validators/base-validator.mjs +0 -720
  374. package/esm/packages/seal/src/validators/base-validator.mjs.map +0 -1
  375. package/esm/packages/seal/src/validators/boolean-validator.mjs +0 -175
  376. package/esm/packages/seal/src/validators/boolean-validator.mjs.map +0 -1
  377. package/esm/packages/seal/src/validators/computed-validator.mjs +0 -118
  378. package/esm/packages/seal/src/validators/computed-validator.mjs.map +0 -1
  379. package/esm/packages/seal/src/validators/date-validator.mjs +0 -640
  380. package/esm/packages/seal/src/validators/date-validator.mjs.map +0 -1
  381. package/esm/packages/seal/src/validators/discriminated-union-validator.mjs +0 -138
  382. package/esm/packages/seal/src/validators/discriminated-union-validator.mjs.map +0 -1
  383. package/esm/packages/seal/src/validators/float-validator.mjs +0 -18
  384. package/esm/packages/seal/src/validators/float-validator.mjs.map +0 -1
  385. package/esm/packages/seal/src/validators/index.mjs +0 -28
  386. package/esm/packages/seal/src/validators/instanceof-validator.mjs +0 -64
  387. package/esm/packages/seal/src/validators/instanceof-validator.mjs.map +0 -1
  388. package/esm/packages/seal/src/validators/int-validator.mjs +0 -30
  389. package/esm/packages/seal/src/validators/int-validator.mjs.map +0 -1
  390. package/esm/packages/seal/src/validators/lazy-validator.mjs +0 -87
  391. package/esm/packages/seal/src/validators/lazy-validator.mjs.map +0 -1
  392. package/esm/packages/seal/src/validators/literal-validator.mjs +0 -72
  393. package/esm/packages/seal/src/validators/literal-validator.mjs.map +0 -1
  394. package/esm/packages/seal/src/validators/managed-validator.mjs +0 -39
  395. package/esm/packages/seal/src/validators/managed-validator.mjs.map +0 -1
  396. package/esm/packages/seal/src/validators/methods/equality-conditional-methods.mjs +0 -129
  397. package/esm/packages/seal/src/validators/methods/equality-conditional-methods.mjs.map +0 -1
  398. package/esm/packages/seal/src/validators/methods/forbidden-methods.mjs +0 -131
  399. package/esm/packages/seal/src/validators/methods/forbidden-methods.mjs.map +0 -1
  400. package/esm/packages/seal/src/validators/methods/present-methods.mjs +0 -235
  401. package/esm/packages/seal/src/validators/methods/present-methods.mjs.map +0 -1
  402. package/esm/packages/seal/src/validators/methods/required-methods.mjs +0 -347
  403. package/esm/packages/seal/src/validators/methods/required-methods.mjs.map +0 -1
  404. package/esm/packages/seal/src/validators/number-validator.mjs +0 -331
  405. package/esm/packages/seal/src/validators/number-validator.mjs.map +0 -1
  406. package/esm/packages/seal/src/validators/numeric-validator.mjs +0 -27
  407. package/esm/packages/seal/src/validators/numeric-validator.mjs.map +0 -1
  408. package/esm/packages/seal/src/validators/object-validator.mjs +0 -445
  409. package/esm/packages/seal/src/validators/object-validator.mjs.map +0 -1
  410. package/esm/packages/seal/src/validators/primitive-validator.mjs +0 -88
  411. package/esm/packages/seal/src/validators/primitive-validator.mjs.map +0 -1
  412. package/esm/packages/seal/src/validators/record-validator.mjs +0 -112
  413. package/esm/packages/seal/src/validators/record-validator.mjs.map +0 -1
  414. package/esm/packages/seal/src/validators/scalar-validator.mjs +0 -173
  415. package/esm/packages/seal/src/validators/scalar-validator.mjs.map +0 -1
  416. package/esm/packages/seal/src/validators/string-validator.mjs +0 -459
  417. package/esm/packages/seal/src/validators/string-validator.mjs.map +0 -1
  418. package/esm/packages/seal/src/validators/tuple-validator.mjs +0 -134
  419. package/esm/packages/seal/src/validators/tuple-validator.mjs.map +0 -1
  420. package/esm/packages/seal/src/validators/union-validator.mjs +0 -66
  421. package/esm/packages/seal/src/validators/union-validator.mjs.map +0 -1
@@ -1,110 +0,0 @@
1
- //#region ../../packages/herald/src/communicators/broker.ts
2
- /**
3
- * Broker - wrapper around a driver with metadata
4
- *
5
- * Similar to DataSource in @warlock.js/cascade
6
- *
7
- * @example
8
- * ```typescript
9
- * const broker = new Broker({
10
- * name: "default",
11
- * driver: rabbitMQDriver,
12
- * isDefault: true,
13
- * });
14
- *
15
- * // Get a channel
16
- * const channel = broker.channel("user.created");
17
- * ```
18
- */
19
- var Broker = class {
20
- /** Unique name identifying this broker */
21
- name;
22
- /** The underlying driver */
23
- driver;
24
- /** Whether this is the default broker */
25
- isDefault;
26
- /**
27
- * Create a new Broker
28
- *
29
- * @param options - Broker configuration
30
- */
31
- constructor(options) {
32
- this.name = options.name;
33
- this.driver = options.driver;
34
- this.isDefault = Boolean(options.isDefault);
35
- }
36
- /**
37
- * Subscribe the given consumer
38
- */
39
- subscribe(consumer) {
40
- return this.driver.subscribe(consumer);
41
- }
42
- /**
43
- * Publish the given event message
44
- */
45
- publish(event) {
46
- this.driver.publish(event);
47
- }
48
- /**
49
- * Get or create a channel
50
- *
51
- * @param name - Channel name
52
- * @param options - Channel options
53
- * @returns Channel instance
54
- *
55
- * @example
56
- * ```typescript
57
- * // Simple channel
58
- * const channel = broker.channel("notifications");
59
- *
60
- * // Typed channel with schema
61
- * const orderChannel = broker.channel<OrderPayload>("orders", {
62
- * schema: OrderSchema,
63
- * durable: true,
64
- * });
65
- * ```
66
- */
67
- channel(name, options) {
68
- return this.driver.channel(name, options);
69
- }
70
- /**
71
- * Check if the broker is connected
72
- */
73
- get isConnected() {
74
- return this.driver.isConnected;
75
- }
76
- /**
77
- * Connect the underlying driver
78
- */
79
- async connect() {
80
- await this.driver.connect();
81
- }
82
- /**
83
- * Disconnect the underlying driver
84
- */
85
- async disconnect() {
86
- await this.driver.disconnect();
87
- }
88
- /**
89
- * Start consuming messages
90
- */
91
- async startConsuming() {
92
- await this.driver.startConsuming();
93
- }
94
- /**
95
- * Stop consuming messages
96
- */
97
- async stopConsuming() {
98
- await this.driver.stopConsuming();
99
- }
100
- /**
101
- * Health check
102
- */
103
- async healthCheck() {
104
- return this.driver.healthCheck();
105
- }
106
- };
107
-
108
- //#endregion
109
- export { Broker };
110
- //# sourceMappingURL=broker.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broker.mjs","names":[],"sources":["../../../../../../../../../../../packages/herald/src/communicators/broker.ts"],"sourcesContent":["import type { BrokerDriverContract } from \"../contracts\";\nimport type { ChannelContract } from \"../contracts/channel.contract\";\nimport { EventMessage } from \"../message-managers/event-message\";\nimport { type EventConsumerClass } from \"../message-managers/types\";\nimport type { ChannelOptions } from \"../types\";\n\n/**\n * Options for creating a Broker\n */\nexport interface BrokerOptions {\n /** Unique name for this broker */\n name: string;\n /** The underlying driver */\n driver: BrokerDriverContract;\n /** Whether this is the default broker */\n isDefault?: boolean;\n}\n\n/**\n * Broker - wrapper around a driver with metadata\n *\n * Similar to DataSource in @warlock.js/cascade\n *\n * @example\n * ```typescript\n * const broker = new Broker({\n * name: \"default\",\n * driver: rabbitMQDriver,\n * isDefault: true,\n * });\n *\n * // Get a channel\n * const channel = broker.channel(\"user.created\");\n * ```\n */\nexport class Broker {\n /** Unique name identifying this broker */\n public readonly name: string;\n\n /** The underlying driver */\n public readonly driver: BrokerDriverContract;\n\n /** Whether this is the default broker */\n public readonly isDefault: boolean;\n\n /**\n * Create a new Broker\n *\n * @param options - Broker configuration\n */\n public constructor(options: BrokerOptions) {\n this.name = options.name;\n this.driver = options.driver;\n this.isDefault = Boolean(options.isDefault);\n }\n\n /**\n * Subscribe the given consumer\n */\n public subscribe(consumer: EventConsumerClass<any>) {\n return this.driver.subscribe(consumer);\n }\n\n /**\n * Publish the given event message\n */\n public publish<TPayload = Record<string, any>>(event: EventMessage<TPayload>) {\n this.driver.publish(event);\n }\n\n /**\n * Get or create a channel\n *\n * @param name - Channel name\n * @param options - Channel options\n * @returns Channel instance\n *\n * @example\n * ```typescript\n * // Simple channel\n * const channel = broker.channel(\"notifications\");\n *\n * // Typed channel with schema\n * const orderChannel = broker.channel<OrderPayload>(\"orders\", {\n * schema: OrderSchema,\n * durable: true,\n * });\n * ```\n */\n public channel<TPayload = unknown>(\n name: string,\n options?: ChannelOptions<TPayload>,\n ): ChannelContract<TPayload> {\n return this.driver.channel<TPayload>(name, options);\n }\n\n /**\n * Check if the broker is connected\n */\n public get isConnected(): boolean {\n return this.driver.isConnected;\n }\n\n /**\n * Connect the underlying driver\n */\n public async connect(): Promise<void> {\n await this.driver.connect();\n }\n\n /**\n * Disconnect the underlying driver\n */\n public async disconnect(): Promise<void> {\n await this.driver.disconnect();\n }\n\n /**\n * Start consuming messages\n */\n public async startConsuming(): Promise<void> {\n await this.driver.startConsuming();\n }\n\n /**\n * Stop consuming messages\n */\n public async stopConsuming(): Promise<void> {\n await this.driver.stopConsuming();\n }\n\n /**\n * Health check\n */\n public async healthCheck() {\n return this.driver.healthCheck();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmCA,IAAa,SAAb,MAAoB;;CAElB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;;;;;CAOhB,AAAO,YAAY,SAAwB;EACzC,KAAK,OAAO,QAAQ;EACpB,KAAK,SAAS,QAAQ;EACtB,KAAK,YAAY,QAAQ,QAAQ,SAAS;CAC5C;;;;CAKA,AAAO,UAAU,UAAmC;EAClD,OAAO,KAAK,OAAO,UAAU,QAAQ;CACvC;;;;CAKA,AAAO,QAAwC,OAA+B;EAC5E,KAAK,OAAO,QAAQ,KAAK;CAC3B;;;;;;;;;;;;;;;;;;;;CAqBA,AAAO,QACL,MACA,SAC2B;EAC3B,OAAO,KAAK,OAAO,QAAkB,MAAM,OAAO;CACpD;;;;CAKA,IAAW,cAAuB;EAChC,OAAO,KAAK,OAAO;CACrB;;;;CAKA,MAAa,UAAyB;EACpC,MAAM,KAAK,OAAO,QAAQ;CAC5B;;;;CAKA,MAAa,aAA4B;EACvC,MAAM,KAAK,OAAO,WAAW;CAC/B;;;;CAKA,MAAa,iBAAgC;EAC3C,MAAM,KAAK,OAAO,eAAe;CACnC;;;;CAKA,MAAa,gBAA+B;EAC1C,MAAM,KAAK,OAAO,cAAc;CAClC;;;;CAKA,MAAa,cAAc;EACzB,OAAO,KAAK,OAAO,YAAY;CACjC;AACF"}
@@ -1,4 +0,0 @@
1
- import { Broker } from "./broker.mjs";
2
- import { MissingBrokerError, brokerRegistry } from "./broker-registry.mjs";
3
-
4
- export { };
@@ -1,36 +0,0 @@
1
- import { brokerRegistry } from "../communicators/broker-registry.mjs";
2
- import "../communicators/index.mjs";
3
-
4
- //#region ../../packages/herald/src/decorators/consumable.ts
5
- const pendingSubscribers = /* @__PURE__ */ new Set();
6
- /**
7
- * Register the consumer to the broker
8
- */
9
- function Consumable(options) {
10
- return function(target) {
11
- const brokerName = options?.broker;
12
- try {
13
- const currentBroker = brokerRegistry.get(brokerName);
14
- if (currentBroker?.isConnected) currentBroker.subscribe(target);
15
- else pendingSubscribers.add({
16
- Consumer: target,
17
- options
18
- });
19
- } catch {
20
- pendingSubscribers.add({
21
- Consumer: target,
22
- options
23
- });
24
- }
25
- };
26
- }
27
- brokerRegistry.on("connected", (broker) => {
28
- for (const { Consumer, options } of pendingSubscribers) {
29
- if (options?.broker && broker.name !== options.broker) continue;
30
- broker.subscribe(Consumer);
31
- }
32
- });
33
-
34
- //#endregion
35
- export { Consumable, pendingSubscribers };
36
- //# sourceMappingURL=consumable.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"consumable.mjs","names":[],"sources":["../../../../../../../../../../../packages/herald/src/decorators/consumable.ts"],"sourcesContent":["import { brokerRegistry } from \"../communicators\";\nimport { type EventConsumerClass } from \"../message-managers/types\";\n\nexport type ConsumableOptions = {\n broker?: string;\n};\n\nexport const pendingSubscribers = new Set<{\n Consumer: EventConsumerClass;\n options?: ConsumableOptions;\n}>();\n\n/**\n * Register the consumer to the broker\n */\nexport function Consumable(options?: ConsumableOptions) {\n return function (target: EventConsumerClass) {\n const brokerName = options?.broker;\n\n try {\n const currentBroker = brokerRegistry.get(brokerName);\n\n // if broker is connected, subscribe the consumer\n if (currentBroker?.isConnected) {\n currentBroker.subscribe(target);\n } else {\n pendingSubscribers.add({ Consumer: target, options });\n }\n } catch {\n // mostly it will be an error that broker is not registered yet\n // then add it to the pending subscribers\n pendingSubscribers.add({ Consumer: target, options });\n }\n };\n}\n\n// Register pending consumers on broker's connection is done\nbrokerRegistry.on(\"connected\", (broker) => {\n for (const { Consumer, options } of pendingSubscribers) {\n if (options?.broker && broker.name !== options.broker) {\n continue;\n }\n\n broker.subscribe(Consumer);\n }\n});\n"],"mappings":";;;;AAOA,MAAa,qCAAqB,IAAI,IAGnC;;;;AAKH,SAAgB,WAAW,SAA6B;CACtD,OAAO,SAAU,QAA4B;EAC3C,MAAM,aAAa,SAAS;EAE5B,IAAI;GACF,MAAM,gBAAgB,eAAe,IAAI,UAAU;GAGnD,IAAI,eAAe,aACjB,cAAc,UAAU,MAAM;QAE9B,mBAAmB,IAAI;IAAE,UAAU;IAAQ;GAAQ,CAAC;EAExD,QAAQ;GAGN,mBAAmB,IAAI;IAAE,UAAU;IAAQ;GAAQ,CAAC;EACtD;CACF;AACF;AAGA,eAAe,GAAG,cAAc,WAAW;CACzC,KAAK,MAAM,EAAE,UAAU,aAAa,oBAAoB;EACtD,IAAI,SAAS,UAAU,OAAO,SAAS,QAAQ,QAC7C;EAGF,OAAO,UAAU,QAAQ;CAC3B;AACF,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Consumable, pendingSubscribers } from "./consumable.mjs";
2
-
3
- export { };
@@ -1,5 +0,0 @@
1
- import { RabbitMQChannel } from "./rabbitmq/rabbitmq-channel.mjs";
2
- import { RabbitMQDriver } from "./rabbitmq/rabbitmq-driver.mjs";
3
- import "./rabbitmq/index.mjs";
4
-
5
- export { };
@@ -1,4 +0,0 @@
1
- import { RabbitMQChannel } from "./rabbitmq-channel.mjs";
2
- import { RabbitMQDriver } from "./rabbitmq-driver.mjs";
3
-
4
- export { };
@@ -1,403 +0,0 @@
1
- import { v } from "../../../../seal/src/factory/validators.mjs";
2
- import "../../../../seal/src/index.mjs";
3
- import { log } from "@warlock.js/logger";
4
- import { randomUUID } from "node:crypto";
5
-
6
- //#region ../../packages/herald/src/drivers/rabbitmq/rabbitmq-channel.ts
7
- /**
8
- * RabbitMQ Channel Implementation
9
- *
10
- * Wraps a RabbitMQ queue/exchange with a unified API.
11
- *
12
- * @template TPayload - The typed payload
13
- */
14
- var RabbitMQChannel = class {
15
- name;
16
- options;
17
- amqpChannel;
18
- subscriptions = /* @__PURE__ */ new Map();
19
- asserted = false;
20
- /**
21
- * Create a new RabbitMQ channel
22
- */
23
- constructor(name, amqpChannel, options) {
24
- this.name = name;
25
- this.amqpChannel = amqpChannel;
26
- this.options = options ?? {};
27
- }
28
- /**
29
- * Assert the queue exists
30
- */
31
- async assert() {
32
- if (this.asserted) return;
33
- const queueOptions = {
34
- durable: this.options.durable ?? true,
35
- autoDelete: this.options.autoDelete ?? false,
36
- exclusive: this.options.exclusive ?? false,
37
- messageTtl: this.options.messageTtl,
38
- maxLength: this.options.maxLength,
39
- deadLetterExchange: this.options.deadLetter?.channel ? "" : void 0,
40
- deadLetterRoutingKey: this.options.deadLetter?.channel
41
- };
42
- await this.amqpChannel.assertQueue(this.name, queueOptions);
43
- this.asserted = true;
44
- }
45
- /**
46
- * Publish a message
47
- */
48
- async publish(payload, options) {
49
- await this.assert();
50
- if (this.options.schema) {
51
- const context = {
52
- allValues: payload,
53
- value: payload
54
- };
55
- const result = await v.validate(this.options.schema, payload, { context });
56
- if (!result.isValid) throw new Error(`Message validation failed: ${JSON.stringify(result.errors)}`);
57
- payload = result.data;
58
- }
59
- const messageId = randomUUID();
60
- const timestamp = /* @__PURE__ */ new Date();
61
- const messageContent = JSON.stringify({
62
- payload,
63
- metadata: {
64
- messageId,
65
- timestamp: timestamp.toISOString(),
66
- correlationId: options?.correlationId,
67
- headers: options?.headers
68
- }
69
- });
70
- const publishOptions = {
71
- persistent: options?.persistent ?? true,
72
- messageId,
73
- timestamp: timestamp.getTime(),
74
- correlationId: options?.correlationId,
75
- expiration: options?.expiration?.toString(),
76
- priority: options?.priority,
77
- headers: options?.headers
78
- };
79
- if (options?.delay) publishOptions.headers = {
80
- ...publishOptions.headers,
81
- "x-delay": options.delay
82
- };
83
- this.amqpChannel.sendToQueue(this.name, Buffer.from(messageContent), publishOptions);
84
- }
85
- /**
86
- * Publish multiple messages
87
- */
88
- async publishBatch(messages, options) {
89
- for (const payload of messages) await this.publish(payload, options);
90
- }
91
- /**
92
- * Subscribe to messages
93
- *
94
- * Smart auto-ack behavior (when autoAck is not true):
95
- * - If handler completes successfully without explicit ack/nack/reject → auto-ack
96
- * - If handler throws an error → auto-nack (with retry if configured)
97
- * - If handler explicitly calls ack/nack/reject → respects that call
98
- */
99
- async subscribe(handler, options) {
100
- await this.assert();
101
- const subscriptionId = options?.consumerId ?? randomUUID();
102
- if (options?.prefetch) await this.amqpChannel.prefetch(options.prefetch);
103
- const isFireAndForget = options?.autoAck === true;
104
- const consumerOptions = {
105
- noAck: isFireAndForget,
106
- exclusive: options?.exclusive ?? false,
107
- consumerTag: options?.group ?? subscriptionId
108
- };
109
- const { consumerTag } = await this.amqpChannel.consume(this.name, async (msg) => {
110
- if (!msg) return;
111
- let ackHandled = isFireAndForget;
112
- let parsedMessage;
113
- try {
114
- const content = JSON.parse(msg.content.toString());
115
- let payload = content.payload;
116
- if (this.options.schema) {
117
- const context = {
118
- allValues: payload,
119
- value: payload
120
- };
121
- const result = await v.validate(this.options.schema, payload, { context });
122
- if (!result.isValid) {
123
- this.amqpChannel.nack(msg, false, false);
124
- return;
125
- }
126
- payload = result.data;
127
- }
128
- const metadata = {
129
- messageId: msg.properties.messageId || content.metadata?.messageId || randomUUID(),
130
- timestamp: new Date(msg.properties.timestamp || content.metadata?.timestamp),
131
- correlationId: msg.properties.correlationId || content.metadata?.correlationId,
132
- replyTo: msg.properties.replyTo,
133
- priority: msg.properties.priority,
134
- headers: msg.properties.headers,
135
- retryCount: msg.properties.headers?.["x-retry-count"] || 0,
136
- originalChannel: this.name
137
- };
138
- const message = {
139
- metadata,
140
- payload,
141
- raw: msg
142
- };
143
- parsedMessage = message;
144
- await handler(message, {
145
- ack: async () => {
146
- if (!ackHandled) {
147
- ackHandled = true;
148
- this.amqpChannel.ack(msg);
149
- }
150
- },
151
- nack: async (requeue = true) => {
152
- if (!ackHandled) {
153
- ackHandled = true;
154
- this.amqpChannel.nack(msg, false, requeue);
155
- }
156
- },
157
- reject: async () => {
158
- if (!ackHandled) {
159
- ackHandled = true;
160
- this.amqpChannel.reject(msg, false);
161
- }
162
- },
163
- reply: async (replyPayload) => {
164
- if (msg.properties.replyTo) {
165
- const replyContent = JSON.stringify({
166
- payload: replyPayload,
167
- metadata: {
168
- messageId: randomUUID(),
169
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
170
- correlationId: msg.properties.correlationId
171
- }
172
- });
173
- this.amqpChannel.sendToQueue(msg.properties.replyTo, Buffer.from(replyContent), { correlationId: msg.properties.correlationId });
174
- }
175
- },
176
- retry: async (delay) => {
177
- if (ackHandled) return;
178
- ackHandled = true;
179
- await this.retryOrGiveUp(msg, metadata.retryCount || 0, options, message, delay);
180
- }
181
- });
182
- if (!ackHandled) this.amqpChannel.ack(msg);
183
- } catch (error) {
184
- if (ackHandled) return;
185
- if (options?.retry) {
186
- const currentRetryCount = msg.properties.headers?.["x-retry-count"] || 0;
187
- await this.retryOrGiveUp(msg, currentRetryCount, options, parsedMessage);
188
- } else this.amqpChannel.nack(msg, false, false);
189
- }
190
- }, consumerOptions);
191
- const subscription = new RabbitMQSubscription(subscriptionId, this.name, consumerTag, this.amqpChannel);
192
- this.subscriptions.set(subscriptionId, subscription);
193
- return subscription;
194
- }
195
- /**
196
- * Unsubscribe by consumer ID
197
- */
198
- async unsubscribeById(consumerId) {
199
- const subscription = this.subscriptions.get(consumerId);
200
- if (subscription) {
201
- await subscription.unsubscribe();
202
- this.subscriptions.delete(consumerId);
203
- }
204
- }
205
- /**
206
- * Stop consuming messages on this channel.
207
- * Cancels all active subscriptions gracefully.
208
- */
209
- async stopConsuming() {
210
- const cancellations = Array.from(this.subscriptions.values()).map((sub) => sub.unsubscribe());
211
- await Promise.all(cancellations);
212
- }
213
- /**
214
- * Send message to dead-letter queue
215
- */
216
- async sendToDeadLetter(message, deadLetterChannel) {
217
- const content = JSON.stringify({
218
- payload: message.payload,
219
- metadata: {
220
- ...message.metadata,
221
- originalChannel: this.name
222
- }
223
- });
224
- this.amqpChannel.sendToQueue(deadLetterChannel, Buffer.from(content), { persistent: true });
225
- }
226
- /**
227
- * Dead-letter a message whose body couldn't be parsed into a {@link Message}
228
- * (e.g. `JSON.parse` itself threw before an envelope existed). Forwards the
229
- * raw AMQP bytes/properties as-is rather than re-deriving a payload, so a
230
- * malformed message isn't lost.
231
- */
232
- sendToDeadLetterRaw(msg, deadLetterChannel) {
233
- this.amqpChannel.sendToQueue(deadLetterChannel, msg.content, {
234
- ...msg.properties,
235
- persistent: true
236
- });
237
- }
238
- /**
239
- * Bounded retry shared by the explicit `ctx.retry()` call and the automatic
240
- * catch when a handler throws without calling it itself — so both paths
241
- * honor the same cap instead of the automatic path silently requeueing
242
- * forever (see `subscribe()`'s catch block).
243
- *
244
- * Under the cap: republishes with an incremented `x-retry-count` header —
245
- * NOT a plain `nack(msg, false, true)`, which redelivers the original
246
- * message untouched and never advances the counter.
247
- *
248
- * At/over the cap: dead-letters if configured, otherwise drops the message
249
- * with a loud `log.error` (never a silent drop) so an operator can see a
250
- * poison message was discarded instead of it vanishing without a trace.
251
- */
252
- async retryOrGiveUp(msg, currentRetryCount, options, parsedMessage, delay) {
253
- const retryCount = currentRetryCount + 1;
254
- const maxRetries = options?.retry?.maxRetries ?? 3;
255
- if (retryCount > maxRetries) {
256
- if (options?.deadLetter) if (parsedMessage) await this.sendToDeadLetter(parsedMessage, options.deadLetter.channel);
257
- else this.sendToDeadLetterRaw(msg, options.deadLetter.channel);
258
- else {
259
- 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.`, {
260
- channel: this.name,
261
- retryCount: retryCount - 1,
262
- maxRetries
263
- });
264
- this.amqpChannel.reject(msg, false);
265
- return;
266
- }
267
- this.amqpChannel.ack(msg);
268
- return;
269
- }
270
- const headers = {
271
- ...msg.properties.headers,
272
- "x-retry-count": retryCount
273
- };
274
- if (delay) headers["x-delay"] = delay;
275
- this.amqpChannel.sendToQueue(this.name, msg.content, {
276
- ...msg.properties,
277
- headers
278
- });
279
- this.amqpChannel.ack(msg);
280
- }
281
- /**
282
- * Request-response pattern
283
- */
284
- async request(payload, options) {
285
- await this.assert();
286
- const correlationId = randomUUID();
287
- const timeout = options?.timeout ?? 3e4;
288
- const { queue: replyQueue } = await this.amqpChannel.assertQueue("", {
289
- exclusive: true,
290
- autoDelete: true
291
- });
292
- return new Promise((resolve, reject) => {
293
- const timeoutId = setTimeout(() => {
294
- reject(/* @__PURE__ */ new Error(`Request timeout after ${timeout}ms`));
295
- }, timeout);
296
- this.amqpChannel.consume(replyQueue, (msg) => {
297
- if (msg?.properties.correlationId === correlationId) {
298
- clearTimeout(timeoutId);
299
- resolve(JSON.parse(msg.content.toString()).payload);
300
- }
301
- }, { noAck: true });
302
- const messageContent = JSON.stringify({
303
- payload,
304
- metadata: {
305
- messageId: randomUUID(),
306
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
307
- correlationId
308
- }
309
- });
310
- this.amqpChannel.sendToQueue(this.name, Buffer.from(messageContent), {
311
- correlationId,
312
- replyTo: replyQueue,
313
- expiration: timeout.toString(),
314
- ...options
315
- });
316
- });
317
- }
318
- /**
319
- * Register response handler for RPC
320
- */
321
- async respond(handler) {
322
- return this.subscribe(async (message, ctx) => {
323
- const response = await handler(message, ctx);
324
- await ctx.reply(response);
325
- await ctx.ack();
326
- });
327
- }
328
- /**
329
- * Get queue statistics
330
- */
331
- async stats() {
332
- await this.assert();
333
- const queueInfo = await this.amqpChannel.checkQueue(this.name);
334
- return {
335
- name: this.name,
336
- messageCount: queueInfo.messageCount,
337
- consumerCount: queueInfo.consumerCount
338
- };
339
- }
340
- /**
341
- * Purge all messages
342
- */
343
- async purge() {
344
- await this.assert();
345
- return (await this.amqpChannel.purgeQueue(this.name)).messageCount;
346
- }
347
- /**
348
- * Check if queue exists
349
- */
350
- async exists() {
351
- try {
352
- await this.amqpChannel.checkQueue(this.name);
353
- return true;
354
- } catch {
355
- return false;
356
- }
357
- }
358
- /**
359
- * Delete the queue
360
- */
361
- async delete() {
362
- for (const subscription of this.subscriptions.values()) await subscription.unsubscribe();
363
- this.subscriptions.clear();
364
- try {
365
- await this.amqpChannel.deleteQueue(this.name);
366
- } catch {}
367
- this.asserted = false;
368
- }
369
- };
370
- /**
371
- * RabbitMQ Subscription Implementation
372
- */
373
- var RabbitMQSubscription = class {
374
- id;
375
- channel;
376
- consumerTag;
377
- amqpChannel;
378
- _isActive = true;
379
- constructor(id, channel, consumerTag, amqpChannel) {
380
- this.id = id;
381
- this.channel = channel;
382
- this.consumerTag = consumerTag;
383
- this.amqpChannel = amqpChannel;
384
- }
385
- async unsubscribe() {
386
- if (!this._isActive) return;
387
- await this.amqpChannel.cancel(this.consumerTag);
388
- this._isActive = false;
389
- }
390
- async pause() {
391
- await this.amqpChannel.cancel(this.consumerTag);
392
- }
393
- async resume() {
394
- throw new Error("Resume is not supported for RabbitMQ. Please create a new subscription.");
395
- }
396
- isActive() {
397
- return this._isActive;
398
- }
399
- };
400
-
401
- //#endregion
402
- export { RabbitMQChannel };
403
- //# sourceMappingURL=rabbitmq-channel.mjs.map
@@ -1 +0,0 @@
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 =>\n sub.unsubscribe(),\n );\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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"}