@geekmidas/events 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/{BasicConnection-C4_Y0nIj.d.mts → BasicConnection-BTRsXiuH.d.cts} +3 -2
  2. package/dist/BasicConnection-BTRsXiuH.d.cts.map +1 -0
  3. package/dist/{BasicConnection-Bz3F2rXA.cjs → BasicConnection-C-Cg2FJT.cjs} +1 -1
  4. package/dist/BasicConnection-C-Cg2FJT.cjs.map +1 -0
  5. package/dist/{BasicConnection-DOSOFSsW.mjs → BasicConnection-CpwybcC9.mjs} +1 -1
  6. package/dist/BasicConnection-CpwybcC9.mjs.map +1 -0
  7. package/dist/{BasicConnection-CddnULuT.d.cts → BasicConnection-DIxtA7jK.d.mts} +3 -2
  8. package/dist/BasicConnection-DIxtA7jK.d.mts.map +1 -0
  9. package/dist/{BasicPublisher-afwuA4Xp.cjs → BasicPublisher-CXAVKxgq.cjs} +1 -1
  10. package/dist/BasicPublisher-CXAVKxgq.cjs.map +1 -0
  11. package/dist/{BasicPublisher-DCBxaTwC.d.mts → BasicPublisher-CpJFK2oS.d.mts} +5 -3
  12. package/dist/BasicPublisher-CpJFK2oS.d.mts.map +1 -0
  13. package/dist/{BasicPublisher-V5hELHG9.d.cts → BasicPublisher-D1q0a2xp.d.cts} +5 -3
  14. package/dist/BasicPublisher-D1q0a2xp.d.cts.map +1 -0
  15. package/dist/{BasicPublisher-CaX8GCUi.mjs → BasicPublisher-DogbeHAH.mjs} +1 -1
  16. package/dist/BasicPublisher-DogbeHAH.mjs.map +1 -0
  17. package/dist/{BasicSubscriber-BB3aKeph.d.mts → BasicSubscriber-6w0Af4DD.d.mts} +5 -3
  18. package/dist/BasicSubscriber-6w0Af4DD.d.mts.map +1 -0
  19. package/dist/{BasicSubscriber-DPpJNUUY.mjs → BasicSubscriber-BJSZN22M.mjs} +2 -4
  20. package/dist/BasicSubscriber-BJSZN22M.mjs.map +1 -0
  21. package/dist/{BasicSubscriber-DOwgFw5j.d.cts → BasicSubscriber-DXxQewjc.d.cts} +5 -3
  22. package/dist/BasicSubscriber-DXxQewjc.d.cts.map +1 -0
  23. package/dist/{BasicSubscriber-Ckf3BkxS.cjs → BasicSubscriber-mVJRMXhZ.cjs} +2 -4
  24. package/dist/BasicSubscriber-mVJRMXhZ.cjs.map +1 -0
  25. package/dist/{EventConnection-DZhn1Msl.d.cts → EventConnection-BaJRXdg7.d.cts} +2 -2
  26. package/dist/EventConnection-BaJRXdg7.d.cts.map +1 -0
  27. package/dist/EventConnection-ClLMoIUU.mjs.map +1 -1
  28. package/dist/EventConnection-F_N81SXu.cjs.map +1 -1
  29. package/dist/{EventConnection-DeXfLGom.d.mts → EventConnection-SOhtmxib.d.mts} +2 -2
  30. package/dist/EventConnection-SOhtmxib.d.mts.map +1 -0
  31. package/dist/EventConnection.d.cts +2 -2
  32. package/dist/EventConnection.d.mts +2 -2
  33. package/dist/{Publisher-C3m8JFXm.d.mts → Publisher-1CfcYRnm.d.mts} +4 -2
  34. package/dist/Publisher-1CfcYRnm.d.mts.map +1 -0
  35. package/dist/{Publisher-nXNVjL0e.d.cts → Publisher-BfNgvHwQ.d.cts} +4 -2
  36. package/dist/Publisher-BfNgvHwQ.d.cts.map +1 -0
  37. package/dist/Publisher-DS0aOh8r.mjs.map +1 -1
  38. package/dist/Publisher-ceu6OxCj.cjs.map +1 -1
  39. package/dist/Publisher.d.cts +2 -2
  40. package/dist/Publisher.d.mts +2 -2
  41. package/dist/{RabbitMQConnection-BN_GybOv.cjs → RabbitMQConnection-Blj9Lo05.cjs} +2 -2
  42. package/dist/RabbitMQConnection-Blj9Lo05.cjs.map +1 -0
  43. package/dist/{RabbitMQConnection-7cWp_-_Q.d.cts → RabbitMQConnection-Bm8VCI2R.d.cts} +3 -2
  44. package/dist/RabbitMQConnection-Bm8VCI2R.d.cts.map +1 -0
  45. package/dist/{RabbitMQConnection-C2HC7J7K.d.mts → RabbitMQConnection-Ck-ktCp_.d.mts} +3 -2
  46. package/dist/RabbitMQConnection-Ck-ktCp_.d.mts.map +1 -0
  47. package/dist/{RabbitMQConnection-eVOVS4Dl.mjs → RabbitMQConnection-Co7f5Xsx.mjs} +2 -2
  48. package/dist/RabbitMQConnection-Co7f5Xsx.mjs.map +1 -0
  49. package/dist/{RabbitMQPublisher-CSCn6gMA.cjs → RabbitMQPublisher--DL6GM6g.cjs} +1 -1
  50. package/dist/RabbitMQPublisher--DL6GM6g.cjs.map +1 -0
  51. package/dist/{RabbitMQPublisher-CpcbgrXj.d.cts → RabbitMQPublisher-COnxcWEZ.d.mts} +5 -3
  52. package/dist/RabbitMQPublisher-COnxcWEZ.d.mts.map +1 -0
  53. package/dist/{RabbitMQPublisher-BZX0edgL.mjs → RabbitMQPublisher-o_oVI3wr.mjs} +1 -1
  54. package/dist/RabbitMQPublisher-o_oVI3wr.mjs.map +1 -0
  55. package/dist/{RabbitMQPublisher-DDZi15Ro.d.mts → RabbitMQPublisher-qQT7-1-p.d.cts} +5 -3
  56. package/dist/RabbitMQPublisher-qQT7-1-p.d.cts.map +1 -0
  57. package/dist/{RabbitMQSubscriber-Cj7qLIi6.cjs → RabbitMQSubscriber-C8MYAihn.cjs} +2 -3
  58. package/dist/RabbitMQSubscriber-C8MYAihn.cjs.map +1 -0
  59. package/dist/{RabbitMQSubscriber-BJ9PTGny.d.cts → RabbitMQSubscriber-C_sZjDPU.d.mts} +5 -3
  60. package/dist/RabbitMQSubscriber-C_sZjDPU.d.mts.map +1 -0
  61. package/dist/{RabbitMQSubscriber-CIvIw8MG.d.mts → RabbitMQSubscriber-D12sssMb.d.cts} +5 -3
  62. package/dist/RabbitMQSubscriber-D12sssMb.d.cts.map +1 -0
  63. package/dist/{RabbitMQSubscriber-B5I-hBaT.mjs → RabbitMQSubscriber-DlGL0pC2.mjs} +2 -3
  64. package/dist/RabbitMQSubscriber-DlGL0pC2.mjs.map +1 -0
  65. package/dist/{SNSConnection-CAImaMM2.d.mts → SNSConnection-BDfQrVBO.d.cts} +3 -2
  66. package/dist/SNSConnection-BDfQrVBO.d.cts.map +1 -0
  67. package/dist/{SNSConnection-DVEE3XoC.mjs → SNSConnection-D7wCf9Si.mjs} +1 -1
  68. package/dist/SNSConnection-D7wCf9Si.mjs.map +1 -0
  69. package/dist/{SNSConnection-CZz_U56V.cjs → SNSConnection-DVsC_pbB.cjs} +1 -1
  70. package/dist/SNSConnection-DVsC_pbB.cjs.map +1 -0
  71. package/dist/{SNSConnection-Cqbr7-Ho.d.cts → SNSConnection-mHb10nQ6.d.mts} +3 -2
  72. package/dist/SNSConnection-mHb10nQ6.d.mts.map +1 -0
  73. package/dist/{SNSPublisher-DbWVH-g_.cjs → SNSPublisher-BoA8uLnw.cjs} +2 -3
  74. package/dist/SNSPublisher-BoA8uLnw.cjs.map +1 -0
  75. package/dist/{SNSPublisher-Dkhb4LU-.d.mts → SNSPublisher-CM7UAWtf.d.mts} +7 -6
  76. package/dist/SNSPublisher-CM7UAWtf.d.mts.map +1 -0
  77. package/dist/{SNSPublisher-Do-FMUyT.mjs → SNSPublisher-Drr4kHn6.mjs} +2 -3
  78. package/dist/SNSPublisher-Drr4kHn6.mjs.map +1 -0
  79. package/dist/{SNSPublisher-RVZFa7kL.d.cts → SNSPublisher-kpsSlGDn.d.cts} +7 -6
  80. package/dist/SNSPublisher-kpsSlGDn.d.cts.map +1 -0
  81. package/dist/{SNSSubscriber-e7eG48yJ.mjs → SNSSubscriber-CBIvQpqK.mjs} +5 -9
  82. package/dist/SNSSubscriber-CBIvQpqK.mjs.map +1 -0
  83. package/dist/{SNSSubscriber-DpEwQ8Tb.cjs → SNSSubscriber-CWiAJjpU.cjs} +5 -9
  84. package/dist/SNSSubscriber-CWiAJjpU.cjs.map +1 -0
  85. package/dist/{SNSSubscriber-B31JmkAE.d.mts → SNSSubscriber-DDB3--pm.d.cts} +4 -3
  86. package/dist/SNSSubscriber-DDB3--pm.d.cts.map +1 -0
  87. package/dist/{SNSSubscriber-k2UwKUxu.d.cts → SNSSubscriber-Dwo8391f.d.mts} +4 -3
  88. package/dist/SNSSubscriber-Dwo8391f.d.mts.map +1 -0
  89. package/dist/{SQSConnection-C5WFqZW7.d.mts → SQSConnection-B5Ep9Tma.d.cts} +3 -2
  90. package/dist/SQSConnection-B5Ep9Tma.d.cts.map +1 -0
  91. package/dist/{SQSConnection-geav2Rsn.d.cts → SQSConnection-BI_xOzyJ.d.mts} +3 -2
  92. package/dist/SQSConnection-BI_xOzyJ.d.mts.map +1 -0
  93. package/dist/{SQSConnection-DWYDtftQ.cjs → SQSConnection-BwNjUPr4.cjs} +1 -1
  94. package/dist/SQSConnection-BwNjUPr4.cjs.map +1 -0
  95. package/dist/{SQSConnection-BBlDWZLU.mjs → SQSConnection-Eleqqre3.mjs} +1 -1
  96. package/dist/SQSConnection-Eleqqre3.mjs.map +1 -0
  97. package/dist/{SQSPublisher-CdsayOLV.d.mts → SQSPublisher-BN1ds6SN.d.mts} +5 -3
  98. package/dist/SQSPublisher-BN1ds6SN.d.mts.map +1 -0
  99. package/dist/{SQSPublisher-Utb_FTe5.d.cts → SQSPublisher-DFTqwzRW.d.cts} +5 -3
  100. package/dist/SQSPublisher-DFTqwzRW.d.cts.map +1 -0
  101. package/dist/{SQSPublisher-B3lS2zbu.mjs → SQSPublisher-DG9o4ME3.mjs} +1 -1
  102. package/dist/SQSPublisher-DG9o4ME3.mjs.map +1 -0
  103. package/dist/{SQSPublisher-nzbSaXSH.cjs → SQSPublisher-Dq5353oZ.cjs} +1 -1
  104. package/dist/SQSPublisher-Dq5353oZ.cjs.map +1 -0
  105. package/dist/{SQSSubscriber-DcL9BbG1.cjs → SQSSubscriber-B4sRXVl6.cjs} +5 -12
  106. package/dist/SQSSubscriber-B4sRXVl6.cjs.map +1 -0
  107. package/dist/{SQSSubscriber-B6iL1EnX.d.cts → SQSSubscriber-BO2me_gs.d.cts} +4 -3
  108. package/dist/SQSSubscriber-BO2me_gs.d.cts.map +1 -0
  109. package/dist/{SQSSubscriber-84pFnW1z.mjs → SQSSubscriber-CVGhZ8Nr.mjs} +5 -12
  110. package/dist/SQSSubscriber-CVGhZ8Nr.mjs.map +1 -0
  111. package/dist/{SQSSubscriber-DBeE4XAR.d.mts → SQSSubscriber-FyZFfr2-.d.mts} +4 -3
  112. package/dist/SQSSubscriber-FyZFfr2-.d.mts.map +1 -0
  113. package/dist/Subscriber-Bd9hb_jp.mjs.map +1 -1
  114. package/dist/{Subscriber-Cff9EIpv.d.mts → Subscriber-BxT-KzFJ.d.mts} +4 -2
  115. package/dist/Subscriber-BxT-KzFJ.d.mts.map +1 -0
  116. package/dist/{Subscriber-CpAwcUzb.d.cts → Subscriber-DDD_4Nlx.d.cts} +4 -2
  117. package/dist/Subscriber-DDD_4Nlx.d.cts.map +1 -0
  118. package/dist/Subscriber-saVOWuMq.cjs.map +1 -1
  119. package/dist/Subscriber.d.cts +2 -2
  120. package/dist/Subscriber.d.mts +2 -2
  121. package/dist/basic/BasicConnection.cjs +1 -1
  122. package/dist/basic/BasicConnection.d.cts +2 -2
  123. package/dist/basic/BasicConnection.d.mts +2 -2
  124. package/dist/basic/BasicConnection.mjs +1 -1
  125. package/dist/basic/BasicPublisher.cjs +1 -1
  126. package/dist/basic/BasicPublisher.d.cts +3 -3
  127. package/dist/basic/BasicPublisher.d.mts +3 -3
  128. package/dist/basic/BasicPublisher.mjs +1 -1
  129. package/dist/basic/BasicSubscriber.cjs +1 -1
  130. package/dist/basic/BasicSubscriber.d.cts +3 -3
  131. package/dist/basic/BasicSubscriber.d.mts +3 -3
  132. package/dist/basic/BasicSubscriber.mjs +1 -1
  133. package/dist/basic/index.cjs +3 -3
  134. package/dist/basic/index.d.cts +4 -4
  135. package/dist/basic/index.d.mts +4 -4
  136. package/dist/basic/index.mjs +3 -3
  137. package/dist/index.d.cts +4 -4
  138. package/dist/index.d.mts +4 -4
  139. package/dist/rabbitmq/RabbitMQConnection.cjs +1 -1
  140. package/dist/rabbitmq/RabbitMQConnection.d.cts +2 -2
  141. package/dist/rabbitmq/RabbitMQConnection.d.mts +2 -2
  142. package/dist/rabbitmq/RabbitMQConnection.mjs +1 -1
  143. package/dist/rabbitmq/RabbitMQPublisher.cjs +1 -1
  144. package/dist/rabbitmq/RabbitMQPublisher.d.cts +3 -3
  145. package/dist/rabbitmq/RabbitMQPublisher.d.mts +3 -3
  146. package/dist/rabbitmq/RabbitMQPublisher.mjs +1 -1
  147. package/dist/rabbitmq/RabbitMQSubscriber.cjs +1 -1
  148. package/dist/rabbitmq/RabbitMQSubscriber.d.cts +3 -3
  149. package/dist/rabbitmq/RabbitMQSubscriber.d.mts +3 -3
  150. package/dist/rabbitmq/RabbitMQSubscriber.mjs +1 -1
  151. package/dist/rabbitmq/index.cjs +3 -3
  152. package/dist/rabbitmq/index.d.cts +4 -4
  153. package/dist/rabbitmq/index.d.mts +4 -4
  154. package/dist/rabbitmq/index.mjs +3 -3
  155. package/dist/sns/SNSConnection.cjs +1 -1
  156. package/dist/sns/SNSConnection.d.cts +2 -2
  157. package/dist/sns/SNSConnection.d.mts +2 -2
  158. package/dist/sns/SNSConnection.mjs +1 -1
  159. package/dist/sns/SNSPublisher.cjs +1 -1
  160. package/dist/sns/SNSPublisher.d.cts +3 -3
  161. package/dist/sns/SNSPublisher.d.mts +3 -3
  162. package/dist/sns/SNSPublisher.mjs +1 -1
  163. package/dist/sns/SNSSubscriber.cjs +3 -3
  164. package/dist/sns/SNSSubscriber.d.cts +3 -3
  165. package/dist/sns/SNSSubscriber.d.mts +3 -3
  166. package/dist/sns/SNSSubscriber.mjs +3 -3
  167. package/dist/sns/index.cjs +5 -5
  168. package/dist/sns/index.d.cts +4 -4
  169. package/dist/sns/index.d.mts +4 -4
  170. package/dist/sns/index.mjs +5 -5
  171. package/dist/sqs/SQSConnection.cjs +1 -1
  172. package/dist/sqs/SQSConnection.d.cts +2 -2
  173. package/dist/sqs/SQSConnection.d.mts +2 -2
  174. package/dist/sqs/SQSConnection.mjs +1 -1
  175. package/dist/sqs/SQSPublisher.cjs +1 -1
  176. package/dist/sqs/SQSPublisher.d.cts +3 -3
  177. package/dist/sqs/SQSPublisher.d.mts +3 -3
  178. package/dist/sqs/SQSPublisher.mjs +1 -1
  179. package/dist/sqs/SQSSubscriber.cjs +1 -1
  180. package/dist/sqs/SQSSubscriber.d.cts +3 -3
  181. package/dist/sqs/SQSSubscriber.d.mts +3 -3
  182. package/dist/sqs/SQSSubscriber.mjs +1 -1
  183. package/dist/sqs/index.cjs +3 -3
  184. package/dist/sqs/index.d.cts +4 -4
  185. package/dist/sqs/index.d.mts +4 -4
  186. package/dist/sqs/index.mjs +3 -3
  187. package/dist/types-B63qHVOG.mjs.map +1 -1
  188. package/dist/types-CvSMEO5z.cjs.map +1 -1
  189. package/dist/{types-D0g-o6wX.d.mts → types-DSVsPgKd.d.mts} +2 -1
  190. package/dist/types-DSVsPgKd.d.mts.map +1 -0
  191. package/dist/{types-DEGUg5BA.d.cts → types-Dmbp1U-6.d.cts} +2 -1
  192. package/dist/types-Dmbp1U-6.d.cts.map +1 -0
  193. package/dist/types.d.cts +1 -1
  194. package/dist/types.d.mts +1 -1
  195. package/package.json +1 -1
  196. package/src/EventConnection.ts +31 -31
  197. package/src/Publisher.ts +78 -78
  198. package/src/Subscriber.ts +91 -91
  199. package/src/__tests__/EventConnection.spec.ts +42 -0
  200. package/src/__tests__/Publisher.spec.ts +96 -0
  201. package/src/__tests__/Subscriber.spec.ts +91 -23
  202. package/src/basic/BasicConnection.ts +35 -35
  203. package/src/basic/BasicPublisher.ts +8 -8
  204. package/src/basic/BasicSubscriber.ts +13 -16
  205. package/src/basic/__tests__/BasicSubscriber.spec.ts +116 -116
  206. package/src/index.ts +13 -13
  207. package/src/rabbitmq/RabbitMQConnection.ts +139 -139
  208. package/src/rabbitmq/RabbitMQPublisher.ts +48 -48
  209. package/src/rabbitmq/RabbitMQSubscriber.ts +100 -102
  210. package/src/rabbitmq/__tests__/RabbitMQPublisher.spec.ts +364 -364
  211. package/src/rabbitmq/__tests__/RabbitMQSubscriber.spec.ts +204 -204
  212. package/src/rabbitmq/index.ts +3 -3
  213. package/src/sns/SNSConnection.ts +76 -76
  214. package/src/sns/SNSPublisher.ts +54 -56
  215. package/src/sns/SNSSubscriber.ts +187 -191
  216. package/src/sns/__tests__/SNS-SQS-Integration.spec.ts +321 -321
  217. package/src/sns/__tests__/SNSPublisher.spec.ts +449 -0
  218. package/src/sns/__tests__/SNSSubscriber.spec.ts +527 -0
  219. package/src/sns/index.ts +3 -3
  220. package/src/sqs/SQSConnection.ts +75 -75
  221. package/src/sqs/SQSPublisher.ts +93 -93
  222. package/src/sqs/SQSSubscriber.ts +157 -165
  223. package/src/sqs/__tests__/SQSPublisher.spec.ts +178 -178
  224. package/src/sqs/index.ts +3 -3
  225. package/src/types.ts +28 -29
  226. package/tsconfig.json +9 -0
  227. package/tsdown.config.ts +1 -1
  228. package/dist/BasicConnection-Bz3F2rXA.cjs.map +0 -1
  229. package/dist/BasicConnection-DOSOFSsW.mjs.map +0 -1
  230. package/dist/BasicPublisher-CaX8GCUi.mjs.map +0 -1
  231. package/dist/BasicPublisher-afwuA4Xp.cjs.map +0 -1
  232. package/dist/BasicSubscriber-Ckf3BkxS.cjs.map +0 -1
  233. package/dist/BasicSubscriber-DPpJNUUY.mjs.map +0 -1
  234. package/dist/RabbitMQConnection-BN_GybOv.cjs.map +0 -1
  235. package/dist/RabbitMQConnection-eVOVS4Dl.mjs.map +0 -1
  236. package/dist/RabbitMQPublisher-BZX0edgL.mjs.map +0 -1
  237. package/dist/RabbitMQPublisher-CSCn6gMA.cjs.map +0 -1
  238. package/dist/RabbitMQSubscriber-B5I-hBaT.mjs.map +0 -1
  239. package/dist/RabbitMQSubscriber-Cj7qLIi6.cjs.map +0 -1
  240. package/dist/SNSConnection-CZz_U56V.cjs.map +0 -1
  241. package/dist/SNSConnection-DVEE3XoC.mjs.map +0 -1
  242. package/dist/SNSPublisher-DbWVH-g_.cjs.map +0 -1
  243. package/dist/SNSPublisher-Do-FMUyT.mjs.map +0 -1
  244. package/dist/SNSSubscriber-DpEwQ8Tb.cjs.map +0 -1
  245. package/dist/SNSSubscriber-e7eG48yJ.mjs.map +0 -1
  246. package/dist/SQSConnection-BBlDWZLU.mjs.map +0 -1
  247. package/dist/SQSConnection-DWYDtftQ.cjs.map +0 -1
  248. package/dist/SQSPublisher-B3lS2zbu.mjs.map +0 -1
  249. package/dist/SQSPublisher-nzbSaXSH.cjs.map +0 -1
  250. package/dist/SQSSubscriber-84pFnW1z.mjs.map +0 -1
  251. package/dist/SQSSubscriber-DcL9BbG1.cjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import { SubscribeCommand, UnsubscribeCommand } from '@aws-sdk/client-sns';
2
2
  import {
3
- CreateQueueCommand,
4
- DeleteQueueCommand,
5
- GetQueueAttributesCommand,
6
- SQSClient,
7
- SetQueueAttributesCommand,
3
+ CreateQueueCommand,
4
+ DeleteQueueCommand,
5
+ GetQueueAttributesCommand,
6
+ SetQueueAttributesCommand,
7
+ SQSClient,
8
8
  } from '@aws-sdk/client-sqs';
9
9
  import { SQSConnection } from '../sqs/SQSConnection';
10
10
  import { SQSSubscriber } from '../sqs/SQSSubscriber';
@@ -12,11 +12,11 @@ import type { EventSubscriber, PublishableMessage } from '../types';
12
12
  import type { SNSConnection } from './SNSConnection';
13
13
 
14
14
  export interface SNSSubscriberOptions {
15
- queueName?: string; // Optional queue name (defaults to auto-generated)
16
- createQueue?: boolean; // Auto-create SQS queue (default: true)
17
- deleteQueueOnClose?: boolean; // Delete queue when subscriber closes (default: false for named queues, true for auto-generated)
18
- waitTimeSeconds?: number; // SQS long polling (default: 20)
19
- maxMessages?: number; // Max messages per poll (default: 10)
15
+ queueName?: string; // Optional queue name (defaults to auto-generated)
16
+ createQueue?: boolean; // Auto-create SQS queue (default: true)
17
+ deleteQueueOnClose?: boolean; // Delete queue when subscriber closes (default: false for named queues, true for auto-generated)
18
+ waitTimeSeconds?: number; // SQS long polling (default: 20)
19
+ maxMessages?: number; // Max messages per poll (default: 10)
20
20
  }
21
21
 
22
22
  /**
@@ -37,186 +37,182 @@ export interface SNSSubscriberOptions {
37
37
  * Messages are pushed from SNS to SQS, and we receive those pushed messages.
38
38
  */
39
39
  export class SNSSubscriber<TMessage extends PublishableMessage<string, any>>
40
- implements EventSubscriber<TMessage>
40
+ implements EventSubscriber<TMessage>
41
41
  {
42
- private sqsClient: SQSClient;
43
- private queueUrl?: string;
44
- private queueArn?: string;
45
- private subscriptionArn?: string;
46
- private sqsSubscriber?: SQSSubscriber<TMessage>;
47
- private options: Required<SNSSubscriberOptions>;
48
-
49
- constructor(
50
- private connection: SNSConnection,
51
- options: SNSSubscriberOptions = {},
52
- ) {
53
- this.options = {
54
- queueName:
55
- options.queueName ||
56
- `sns-sub-${Date.now()}-${Math.random().toString(36).substring(7)}`,
57
- createQueue: options.createQueue ?? true,
58
- deleteQueueOnClose: options.deleteQueueOnClose ?? !options.queueName, // Delete auto-generated queues
59
- waitTimeSeconds: options.waitTimeSeconds ?? 20,
60
- maxMessages: options.maxMessages ?? 10,
61
- };
62
-
63
- // Create SQS client with same config as SNS
64
- this.sqsClient = new SQSClient({
65
- region: (this.connection as any).config.region,
66
- endpoint: (this.connection as any).config.endpoint,
67
- credentials: (this.connection as any).config.credentials,
68
- });
69
- }
70
-
71
- /**
72
- * Create an SNSSubscriber from a connection string
73
- * Format: sns://?topicArn=...&queueName=myqueue&region=us-east-1
74
- */
75
- static async fromConnectionString<
76
- TMessage extends PublishableMessage<string, any>,
77
- >(connectionString: string): Promise<SNSSubscriber<TMessage>> {
78
- const url = new URL(connectionString);
79
- const params = url.searchParams;
80
-
81
- const { SNSConnection } = await import('./SNSConnection');
82
- const connection =
83
- await SNSConnection.fromConnectionString(connectionString);
84
-
85
- const options: SNSSubscriberOptions = {
86
- queueName: params.get('queueName') || undefined,
87
- createQueue: params.get('createQueue') !== 'false',
88
- deleteQueueOnClose: params.get('deleteQueueOnClose') === 'true',
89
- waitTimeSeconds: params.get('waitTimeSeconds')
90
- ? Number.parseInt(params.get('waitTimeSeconds')!, 10)
91
- : undefined,
92
- };
93
-
94
- return new SNSSubscriber<TMessage>(connection, options);
95
- }
96
-
97
- async subscribe(
98
- messages: TMessage['type'][],
99
- listener: (payload: TMessage) => Promise<void>,
100
- ): Promise<void> {
101
- // Setup SQS queue and SNS subscription
102
- await this.setupQueue();
103
- await this.subscribeToTopic();
104
-
105
- // Create SQS connection for the subscriber
106
- const sqsConnection = new SQSConnection({
107
- queueUrl: this.queueUrl!,
108
- region: (this.connection as any).config.region,
109
- endpoint: (this.connection as any).config.endpoint,
110
- credentials: (this.connection as any).config.credentials,
111
- });
112
- await sqsConnection.connect();
113
-
114
- // Use SQSSubscriber to receive messages, with topic filtering
115
- this.sqsSubscriber = new SQSSubscriber<TMessage>(sqsConnection, {
116
- waitTimeSeconds: this.options.waitTimeSeconds,
117
- maxMessages: this.options.maxMessages,
118
- expectedTopicArn: this.connection.topicArn,
119
- });
120
-
121
- await this.sqsSubscriber.subscribe(messages, listener);
122
- }
123
-
124
- /**
125
- * Stop receiving messages and clean up resources
126
- */
127
- async stop(): Promise<void> {
128
- // Stop SQS subscriber
129
- if (this.sqsSubscriber) {
130
- this.sqsSubscriber.stop();
131
- }
132
-
133
- // Unsubscribe from topic
134
- if (this.subscriptionArn) {
135
- try {
136
- const command = new UnsubscribeCommand({
137
- SubscriptionArn: this.subscriptionArn,
138
- });
139
- await this.connection.snsClient.send(command);
140
- } catch (error) {
141
- console.error('Error unsubscribing:', error);
142
- }
143
- }
144
-
145
- // Delete queue if configured
146
- if (this.queueUrl && this.options.deleteQueueOnClose) {
147
- try {
148
- const command = new DeleteQueueCommand({
149
- QueueUrl: this.queueUrl,
150
- });
151
- await this.sqsClient.send(command);
152
- } catch (error) {
153
- console.error('Error deleting queue:', error);
154
- }
155
- }
156
-
157
- this.sqsClient.destroy();
158
- }
159
-
160
- private async setupQueue(): Promise<void> {
161
- if (this.options.createQueue) {
162
- // Create queue
163
- const createCommand = new CreateQueueCommand({
164
- QueueName: this.options.queueName,
165
- });
166
- const response = await this.sqsClient.send(createCommand);
167
- this.queueUrl = response.QueueUrl!;
168
- } else {
169
- throw new Error('Queue must exist or createQueue option must be true');
170
- }
171
-
172
- // Get queue ARN
173
- const attrsCommand = new GetQueueAttributesCommand({
174
- QueueUrl: this.queueUrl,
175
- AttributeNames: ['QueueArn'],
176
- });
177
- const attrsResponse = await this.sqsClient.send(attrsCommand);
178
- this.queueArn = attrsResponse.Attributes?.QueueArn!;
179
-
180
- // Set queue policy to allow SNS
181
- await this.setQueuePolicy();
182
- }
183
-
184
- private async setQueuePolicy(): Promise<void> {
185
- const policy = {
186
- Version: '2012-10-17',
187
- Statement: [
188
- {
189
- Effect: 'Allow',
190
- Principal: '*',
191
- Action: 'SQS:SendMessage',
192
- Resource: this.queueArn,
193
- Condition: {
194
- ArnEquals: {
195
- 'aws:SourceArn': this.connection.topicArn,
196
- },
197
- },
198
- },
199
- ],
200
- };
201
-
202
- const command = new SetQueueAttributesCommand({
203
- QueueUrl: this.queueUrl,
204
- Attributes: {
205
- Policy: JSON.stringify(policy),
206
- },
207
- });
208
-
209
- await this.sqsClient.send(command);
210
- }
211
-
212
- private async subscribeToTopic(): Promise<void> {
213
- const command = new SubscribeCommand({
214
- TopicArn: this.connection.topicArn,
215
- Protocol: 'sqs',
216
- Endpoint: this.queueArn,
217
- });
218
-
219
- const response = await this.connection.snsClient.send(command);
220
- this.subscriptionArn = response.SubscriptionArn!;
221
- }
42
+ private sqsClient: SQSClient;
43
+ private queueUrl?: string;
44
+ private queueArn?: string;
45
+ private subscriptionArn?: string;
46
+ private sqsSubscriber?: SQSSubscriber<TMessage>;
47
+ private options: Required<SNSSubscriberOptions>;
48
+
49
+ constructor(
50
+ private connection: SNSConnection,
51
+ options: SNSSubscriberOptions = {},
52
+ ) {
53
+ this.options = {
54
+ queueName:
55
+ options.queueName ||
56
+ `sns-sub-${Date.now()}-${Math.random().toString(36).substring(7)}`,
57
+ createQueue: options.createQueue ?? true,
58
+ deleteQueueOnClose: options.deleteQueueOnClose ?? !options.queueName, // Delete auto-generated queues
59
+ waitTimeSeconds: options.waitTimeSeconds ?? 20,
60
+ maxMessages: options.maxMessages ?? 10,
61
+ };
62
+
63
+ // Create SQS client with same config as SNS
64
+ this.sqsClient = new SQSClient({
65
+ region: (this.connection as any).config.region,
66
+ endpoint: (this.connection as any).config.endpoint,
67
+ credentials: (this.connection as any).config.credentials,
68
+ });
69
+ }
70
+
71
+ /**
72
+ * Create an SNSSubscriber from a connection string
73
+ * Format: sns://?topicArn=...&queueName=myqueue&region=us-east-1
74
+ */
75
+ static async fromConnectionString<
76
+ TMessage extends PublishableMessage<string, any>,
77
+ >(connectionString: string): Promise<SNSSubscriber<TMessage>> {
78
+ const url = new URL(connectionString);
79
+ const params = url.searchParams;
80
+
81
+ const { SNSConnection } = await import('./SNSConnection');
82
+ const connection =
83
+ await SNSConnection.fromConnectionString(connectionString);
84
+
85
+ const options: SNSSubscriberOptions = {
86
+ queueName: params.get('queueName') || undefined,
87
+ createQueue: params.get('createQueue') !== 'false',
88
+ deleteQueueOnClose: params.get('deleteQueueOnClose') === 'true',
89
+ waitTimeSeconds: params.get('waitTimeSeconds')
90
+ ? Number.parseInt(params.get('waitTimeSeconds')!, 10)
91
+ : undefined,
92
+ };
93
+
94
+ return new SNSSubscriber<TMessage>(connection, options);
95
+ }
96
+
97
+ async subscribe(
98
+ messages: TMessage['type'][],
99
+ listener: (payload: TMessage) => Promise<void>,
100
+ ): Promise<void> {
101
+ // Setup SQS queue and SNS subscription
102
+ await this.setupQueue();
103
+ await this.subscribeToTopic();
104
+
105
+ // Create SQS connection for the subscriber
106
+ const sqsConnection = new SQSConnection({
107
+ queueUrl: this.queueUrl!,
108
+ region: (this.connection as any).config.region,
109
+ endpoint: (this.connection as any).config.endpoint,
110
+ credentials: (this.connection as any).config.credentials,
111
+ });
112
+ await sqsConnection.connect();
113
+
114
+ // Use SQSSubscriber to receive messages, with topic filtering
115
+ this.sqsSubscriber = new SQSSubscriber<TMessage>(sqsConnection, {
116
+ waitTimeSeconds: this.options.waitTimeSeconds,
117
+ maxMessages: this.options.maxMessages,
118
+ expectedTopicArn: this.connection.topicArn,
119
+ });
120
+
121
+ await this.sqsSubscriber.subscribe(messages, listener);
122
+ }
123
+
124
+ /**
125
+ * Stop receiving messages and clean up resources
126
+ */
127
+ async stop(): Promise<void> {
128
+ // Stop SQS subscriber
129
+ if (this.sqsSubscriber) {
130
+ this.sqsSubscriber.stop();
131
+ }
132
+
133
+ // Unsubscribe from topic
134
+ if (this.subscriptionArn) {
135
+ try {
136
+ const command = new UnsubscribeCommand({
137
+ SubscriptionArn: this.subscriptionArn,
138
+ });
139
+ await this.connection.snsClient.send(command);
140
+ } catch (_error) {}
141
+ }
142
+
143
+ // Delete queue if configured
144
+ if (this.queueUrl && this.options.deleteQueueOnClose) {
145
+ try {
146
+ const command = new DeleteQueueCommand({
147
+ QueueUrl: this.queueUrl,
148
+ });
149
+ await this.sqsClient.send(command);
150
+ } catch (_error) {}
151
+ }
152
+
153
+ this.sqsClient.destroy();
154
+ }
155
+
156
+ private async setupQueue(): Promise<void> {
157
+ if (this.options.createQueue) {
158
+ // Create queue
159
+ const createCommand = new CreateQueueCommand({
160
+ QueueName: this.options.queueName,
161
+ });
162
+ const response = await this.sqsClient.send(createCommand);
163
+ this.queueUrl = response.QueueUrl!;
164
+ } else {
165
+ throw new Error('Queue must exist or createQueue option must be true');
166
+ }
167
+
168
+ // Get queue ARN
169
+ const attrsCommand = new GetQueueAttributesCommand({
170
+ QueueUrl: this.queueUrl,
171
+ AttributeNames: ['QueueArn'],
172
+ });
173
+ const attrsResponse = await this.sqsClient.send(attrsCommand);
174
+ this.queueArn = attrsResponse.Attributes?.QueueArn!;
175
+
176
+ // Set queue policy to allow SNS
177
+ await this.setQueuePolicy();
178
+ }
179
+
180
+ private async setQueuePolicy(): Promise<void> {
181
+ const policy = {
182
+ Version: '2012-10-17',
183
+ Statement: [
184
+ {
185
+ Effect: 'Allow',
186
+ Principal: '*',
187
+ Action: 'SQS:SendMessage',
188
+ Resource: this.queueArn,
189
+ Condition: {
190
+ ArnEquals: {
191
+ 'aws:SourceArn': this.connection.topicArn,
192
+ },
193
+ },
194
+ },
195
+ ],
196
+ };
197
+
198
+ const command = new SetQueueAttributesCommand({
199
+ QueueUrl: this.queueUrl,
200
+ Attributes: {
201
+ Policy: JSON.stringify(policy),
202
+ },
203
+ });
204
+
205
+ await this.sqsClient.send(command);
206
+ }
207
+
208
+ private async subscribeToTopic(): Promise<void> {
209
+ const command = new SubscribeCommand({
210
+ TopicArn: this.connection.topicArn,
211
+ Protocol: 'sqs',
212
+ Endpoint: this.queueArn,
213
+ });
214
+
215
+ const response = await this.connection.snsClient.send(command);
216
+ this.subscriptionArn = response.SubscriptionArn!;
217
+ }
222
218
  }