@geekmidas/events 0.0.1

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 (211) hide show
  1. package/README.md +473 -0
  2. package/dist/BasicConnection-BNi6_olg.mjs +42 -0
  3. package/dist/BasicConnection-BNi6_olg.mjs.map +1 -0
  4. package/dist/BasicConnection-C4_Y0nIj.d.mts +26 -0
  5. package/dist/BasicConnection-CddnULuT.d.cts +26 -0
  6. package/dist/BasicConnection-CzfMubv_.cjs +48 -0
  7. package/dist/BasicConnection-CzfMubv_.cjs.map +1 -0
  8. package/dist/BasicPublisher-BzfzHIfb.cjs +20 -0
  9. package/dist/BasicPublisher-BzfzHIfb.cjs.map +1 -0
  10. package/dist/BasicPublisher-Cg3SxIVR.mjs +14 -0
  11. package/dist/BasicPublisher-Cg3SxIVR.mjs.map +1 -0
  12. package/dist/BasicPublisher-DCBxaTwC.d.mts +12 -0
  13. package/dist/BasicPublisher-V5hELHG9.d.cts +12 -0
  14. package/dist/BasicSubscriber-BB3aKeph.d.mts +12 -0
  15. package/dist/BasicSubscriber-BEv5N21f.mjs +18 -0
  16. package/dist/BasicSubscriber-BEv5N21f.mjs.map +1 -0
  17. package/dist/BasicSubscriber-DOwgFw5j.d.cts +12 -0
  18. package/dist/BasicSubscriber-DyTKOixe.cjs +24 -0
  19. package/dist/BasicSubscriber-DyTKOixe.cjs.map +1 -0
  20. package/dist/EventConnection-ClLMoIUU.mjs +36 -0
  21. package/dist/EventConnection-ClLMoIUU.mjs.map +1 -0
  22. package/dist/EventConnection-DZhn1Msl.d.cts +13 -0
  23. package/dist/EventConnection-DeXfLGom.d.mts +13 -0
  24. package/dist/EventConnection-F_N81SXu.cjs +41 -0
  25. package/dist/EventConnection-F_N81SXu.cjs.map +1 -0
  26. package/dist/EventConnection.cjs +5 -0
  27. package/dist/EventConnection.d.cts +3 -0
  28. package/dist/EventConnection.d.mts +3 -0
  29. package/dist/EventConnection.mjs +4 -0
  30. package/dist/Publisher-C3m8JFXm.d.mts +19 -0
  31. package/dist/Publisher-DS0aOh8r.mjs +65 -0
  32. package/dist/Publisher-DS0aOh8r.mjs.map +1 -0
  33. package/dist/Publisher-ceu6OxCj.cjs +70 -0
  34. package/dist/Publisher-ceu6OxCj.cjs.map +1 -0
  35. package/dist/Publisher-nXNVjL0e.d.cts +19 -0
  36. package/dist/Publisher.cjs +4 -0
  37. package/dist/Publisher.d.cts +3 -0
  38. package/dist/Publisher.d.mts +3 -0
  39. package/dist/Publisher.mjs +4 -0
  40. package/dist/RabbitMQConnection-7cWp_-_Q.d.cts +43 -0
  41. package/dist/RabbitMQConnection-BN_GybOv.cjs +113 -0
  42. package/dist/RabbitMQConnection-BN_GybOv.cjs.map +1 -0
  43. package/dist/RabbitMQConnection-C2HC7J7K.d.mts +43 -0
  44. package/dist/RabbitMQConnection-eVOVS4Dl.mjs +107 -0
  45. package/dist/RabbitMQConnection-eVOVS4Dl.mjs.map +1 -0
  46. package/dist/RabbitMQPublisher-BZX0edgL.mjs +39 -0
  47. package/dist/RabbitMQPublisher-BZX0edgL.mjs.map +1 -0
  48. package/dist/RabbitMQPublisher-CSCn6gMA.cjs +45 -0
  49. package/dist/RabbitMQPublisher-CSCn6gMA.cjs.map +1 -0
  50. package/dist/RabbitMQPublisher-CpcbgrXj.d.cts +23 -0
  51. package/dist/RabbitMQPublisher-DDZi15Ro.d.mts +23 -0
  52. package/dist/RabbitMQSubscriber-B5I-hBaT.mjs +57 -0
  53. package/dist/RabbitMQSubscriber-B5I-hBaT.mjs.map +1 -0
  54. package/dist/RabbitMQSubscriber-BJ9PTGny.d.cts +25 -0
  55. package/dist/RabbitMQSubscriber-CIvIw8MG.d.mts +25 -0
  56. package/dist/RabbitMQSubscriber-Cj7qLIi6.cjs +63 -0
  57. package/dist/RabbitMQSubscriber-Cj7qLIi6.cjs.map +1 -0
  58. package/dist/SNSConnection-CAImaMM2.d.mts +40 -0
  59. package/dist/SNSConnection-Cqbr7-Ho.d.cts +40 -0
  60. package/dist/SNSConnection-D7wCf9Si.mjs +70 -0
  61. package/dist/SNSConnection-D7wCf9Si.mjs.map +1 -0
  62. package/dist/SNSConnection-DVsC_pbB.cjs +76 -0
  63. package/dist/SNSConnection-DVsC_pbB.cjs.map +1 -0
  64. package/dist/SNSPublisher-BZ6N3JI9.cjs +48 -0
  65. package/dist/SNSPublisher-BZ6N3JI9.cjs.map +1 -0
  66. package/dist/SNSPublisher-BfWjzNiB.mjs +42 -0
  67. package/dist/SNSPublisher-BfWjzNiB.mjs.map +1 -0
  68. package/dist/SNSPublisher-Dkhb4LU-.d.mts +21 -0
  69. package/dist/SNSPublisher-RVZFa7kL.d.cts +21 -0
  70. package/dist/SNSSubscriber-B31JmkAE.d.mts +54 -0
  71. package/dist/SNSSubscriber-C9YJWa7m.mjs +143 -0
  72. package/dist/SNSSubscriber-C9YJWa7m.mjs.map +1 -0
  73. package/dist/SNSSubscriber-UE0ia4XM.cjs +149 -0
  74. package/dist/SNSSubscriber-UE0ia4XM.cjs.map +1 -0
  75. package/dist/SNSSubscriber-k2UwKUxu.d.cts +54 -0
  76. package/dist/SQSConnection-BwNjUPr4.cjs +76 -0
  77. package/dist/SQSConnection-BwNjUPr4.cjs.map +1 -0
  78. package/dist/SQSConnection-C5WFqZW7.d.mts +40 -0
  79. package/dist/SQSConnection-Eleqqre3.mjs +70 -0
  80. package/dist/SQSConnection-Eleqqre3.mjs.map +1 -0
  81. package/dist/SQSConnection-geav2Rsn.d.cts +40 -0
  82. package/dist/SQSPublisher-CdsayOLV.d.mts +23 -0
  83. package/dist/SQSPublisher-DG9o4ME3.mjs +57 -0
  84. package/dist/SQSPublisher-DG9o4ME3.mjs.map +1 -0
  85. package/dist/SQSPublisher-Dq5353oZ.cjs +63 -0
  86. package/dist/SQSPublisher-Dq5353oZ.cjs.map +1 -0
  87. package/dist/SQSPublisher-Utb_FTe5.d.cts +23 -0
  88. package/dist/SQSSubscriber-B6iL1EnX.d.cts +43 -0
  89. package/dist/SQSSubscriber-CD66P7hH.mjs +121 -0
  90. package/dist/SQSSubscriber-CD66P7hH.mjs.map +1 -0
  91. package/dist/SQSSubscriber-DBeE4XAR.d.mts +43 -0
  92. package/dist/SQSSubscriber-DZDNgLE5.cjs +127 -0
  93. package/dist/SQSSubscriber-DZDNgLE5.cjs.map +1 -0
  94. package/dist/Subscriber-Bd9hb_jp.mjs +74 -0
  95. package/dist/Subscriber-Bd9hb_jp.mjs.map +1 -0
  96. package/dist/Subscriber-Cff9EIpv.d.mts +19 -0
  97. package/dist/Subscriber-CpAwcUzb.d.cts +19 -0
  98. package/dist/Subscriber-saVOWuMq.cjs +79 -0
  99. package/dist/Subscriber-saVOWuMq.cjs.map +1 -0
  100. package/dist/Subscriber.cjs +4 -0
  101. package/dist/Subscriber.d.cts +3 -0
  102. package/dist/Subscriber.d.mts +3 -0
  103. package/dist/Subscriber.mjs +4 -0
  104. package/dist/basic/BasicConnection.cjs +4 -0
  105. package/dist/basic/BasicConnection.d.cts +3 -0
  106. package/dist/basic/BasicConnection.d.mts +3 -0
  107. package/dist/basic/BasicConnection.mjs +4 -0
  108. package/dist/basic/BasicPublisher.cjs +3 -0
  109. package/dist/basic/BasicPublisher.d.cts +4 -0
  110. package/dist/basic/BasicPublisher.d.mts +4 -0
  111. package/dist/basic/BasicPublisher.mjs +3 -0
  112. package/dist/basic/BasicSubscriber.cjs +3 -0
  113. package/dist/basic/BasicSubscriber.d.cts +4 -0
  114. package/dist/basic/BasicSubscriber.d.mts +4 -0
  115. package/dist/basic/BasicSubscriber.mjs +3 -0
  116. package/dist/basic/index.cjs +8 -0
  117. package/dist/basic/index.d.cts +5 -0
  118. package/dist/basic/index.d.mts +5 -0
  119. package/dist/basic/index.mjs +6 -0
  120. package/dist/chunk-CUT6urMc.cjs +30 -0
  121. package/dist/index.cjs +9 -0
  122. package/dist/index.d.cts +5 -0
  123. package/dist/index.d.mts +5 -0
  124. package/dist/index.mjs +6 -0
  125. package/dist/rabbitmq/RabbitMQConnection.cjs +4 -0
  126. package/dist/rabbitmq/RabbitMQConnection.d.cts +3 -0
  127. package/dist/rabbitmq/RabbitMQConnection.d.mts +3 -0
  128. package/dist/rabbitmq/RabbitMQConnection.mjs +4 -0
  129. package/dist/rabbitmq/RabbitMQPublisher.cjs +3 -0
  130. package/dist/rabbitmq/RabbitMQPublisher.d.cts +4 -0
  131. package/dist/rabbitmq/RabbitMQPublisher.d.mts +4 -0
  132. package/dist/rabbitmq/RabbitMQPublisher.mjs +3 -0
  133. package/dist/rabbitmq/RabbitMQSubscriber.cjs +3 -0
  134. package/dist/rabbitmq/RabbitMQSubscriber.d.cts +4 -0
  135. package/dist/rabbitmq/RabbitMQSubscriber.d.mts +4 -0
  136. package/dist/rabbitmq/RabbitMQSubscriber.mjs +3 -0
  137. package/dist/rabbitmq/index.cjs +8 -0
  138. package/dist/rabbitmq/index.d.cts +5 -0
  139. package/dist/rabbitmq/index.d.mts +5 -0
  140. package/dist/rabbitmq/index.mjs +6 -0
  141. package/dist/sns/SNSConnection.cjs +4 -0
  142. package/dist/sns/SNSConnection.d.cts +3 -0
  143. package/dist/sns/SNSConnection.d.mts +3 -0
  144. package/dist/sns/SNSConnection.mjs +4 -0
  145. package/dist/sns/SNSPublisher.cjs +3 -0
  146. package/dist/sns/SNSPublisher.d.cts +4 -0
  147. package/dist/sns/SNSPublisher.d.mts +4 -0
  148. package/dist/sns/SNSPublisher.mjs +3 -0
  149. package/dist/sns/SNSSubscriber.cjs +6 -0
  150. package/dist/sns/SNSSubscriber.d.cts +4 -0
  151. package/dist/sns/SNSSubscriber.d.mts +4 -0
  152. package/dist/sns/SNSSubscriber.mjs +6 -0
  153. package/dist/sns/index.cjs +10 -0
  154. package/dist/sns/index.d.cts +5 -0
  155. package/dist/sns/index.d.mts +5 -0
  156. package/dist/sns/index.mjs +8 -0
  157. package/dist/sqs/SQSConnection.cjs +4 -0
  158. package/dist/sqs/SQSConnection.d.cts +3 -0
  159. package/dist/sqs/SQSConnection.d.mts +3 -0
  160. package/dist/sqs/SQSConnection.mjs +4 -0
  161. package/dist/sqs/SQSPublisher.cjs +3 -0
  162. package/dist/sqs/SQSPublisher.d.cts +4 -0
  163. package/dist/sqs/SQSPublisher.d.mts +4 -0
  164. package/dist/sqs/SQSPublisher.mjs +3 -0
  165. package/dist/sqs/SQSSubscriber.cjs +3 -0
  166. package/dist/sqs/SQSSubscriber.d.cts +4 -0
  167. package/dist/sqs/SQSSubscriber.d.mts +4 -0
  168. package/dist/sqs/SQSSubscriber.mjs +3 -0
  169. package/dist/sqs/index.cjs +8 -0
  170. package/dist/sqs/index.d.cts +5 -0
  171. package/dist/sqs/index.d.mts +5 -0
  172. package/dist/sqs/index.mjs +6 -0
  173. package/dist/types-B63qHVOG.mjs +17 -0
  174. package/dist/types-B63qHVOG.mjs.map +1 -0
  175. package/dist/types-CvSMEO5z.cjs +23 -0
  176. package/dist/types-CvSMEO5z.cjs.map +1 -0
  177. package/dist/types-D0g-o6wX.d.mts +65 -0
  178. package/dist/types-DEGUg5BA.d.cts +65 -0
  179. package/dist/types.cjs +3 -0
  180. package/dist/types.d.cts +2 -0
  181. package/dist/types.d.mts +2 -0
  182. package/dist/types.mjs +3 -0
  183. package/package.json +49 -0
  184. package/src/EventConnection.ts +39 -0
  185. package/src/Publisher.ts +87 -0
  186. package/src/Subscriber.ts +102 -0
  187. package/src/__tests__/Subscriber.spec.ts +41 -0
  188. package/src/basic/BasicConnection.ts +47 -0
  189. package/src/basic/BasicPublisher.ts +15 -0
  190. package/src/basic/BasicSubscriber.ts +24 -0
  191. package/src/basic/__tests__/BasicSubscriber.spec.ts +166 -0
  192. package/src/basic/index.ts +3 -0
  193. package/src/index.ts +25 -0
  194. package/src/rabbitmq/RabbitMQConnection.ts +148 -0
  195. package/src/rabbitmq/RabbitMQPublisher.ts +67 -0
  196. package/src/rabbitmq/RabbitMQSubscriber.ts +113 -0
  197. package/src/rabbitmq/__tests__/RabbitMQPublisher.spec.ts +378 -0
  198. package/src/rabbitmq/__tests__/RabbitMQSubscriber.spec.ts +292 -0
  199. package/src/rabbitmq/index.ts +6 -0
  200. package/src/sns/SNSConnection.ts +98 -0
  201. package/src/sns/SNSPublisher.ts +64 -0
  202. package/src/sns/SNSSubscriber.ts +222 -0
  203. package/src/sns/__tests__/SNS-SQS-Integration.spec.ts +389 -0
  204. package/src/sns/index.ts +6 -0
  205. package/src/sqs/SQSConnection.ts +97 -0
  206. package/src/sqs/SQSPublisher.ts +105 -0
  207. package/src/sqs/SQSSubscriber.ts +189 -0
  208. package/src/sqs/__tests__/SQSPublisher.spec.ts +189 -0
  209. package/src/sqs/index.ts +6 -0
  210. package/src/types.ts +76 -0
  211. package/tsdown.config.ts +5 -0
@@ -0,0 +1,43 @@
1
+ import { EventConnection, EventPublisherType } from "./types-D0g-o6wX.mjs";
2
+ import amqplib from "amqplib";
3
+
4
+ //#region src/rabbitmq/RabbitMQConnection.d.ts
5
+ interface RabbitMQConnectionConfig {
6
+ url: string;
7
+ exchange?: string;
8
+ exchangeType?: 'topic' | 'direct' | 'fanout' | 'headers';
9
+ exchangeOptions?: amqplib.Options.AssertExchange;
10
+ timeout?: number;
11
+ }
12
+ declare class RabbitMQConnection implements EventConnection {
13
+ readonly type = EventPublisherType.RabbitMQ;
14
+ private connection?;
15
+ private channel?;
16
+ private connecting?;
17
+ private config;
18
+ constructor(config: RabbitMQConnectionConfig);
19
+ /**
20
+ * Create a RabbitMQConnection from a connection string
21
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
22
+ */
23
+ static fromConnectionString(connectionString: string): Promise<RabbitMQConnection>;
24
+ connect(): Promise<void>;
25
+ close(): Promise<void>;
26
+ isConnected(): boolean;
27
+ private cleanup;
28
+ /**
29
+ * Get the underlying channel for publishing/subscribing
30
+ */
31
+ get amqpChannel(): amqplib.Channel | undefined;
32
+ /**
33
+ * Get the exchange name for this connection
34
+ */
35
+ get exchangeName(): string;
36
+ /**
37
+ * Get the exchange type for this connection
38
+ */
39
+ get exchangeType(): string;
40
+ }
41
+ //#endregion
42
+ export { RabbitMQConnection, RabbitMQConnectionConfig };
43
+ //# sourceMappingURL=RabbitMQConnection-C2HC7J7K.d.mts.map
@@ -0,0 +1,107 @@
1
+ import { EventPublisherType } from "./types-B63qHVOG.mjs";
2
+ import amqplib from "amqplib";
3
+
4
+ //#region src/rabbitmq/RabbitMQConnection.ts
5
+ var RabbitMQConnection = class RabbitMQConnection {
6
+ type = EventPublisherType.RabbitMQ;
7
+ connection;
8
+ channel;
9
+ connecting;
10
+ config;
11
+ constructor(config) {
12
+ this.config = {
13
+ ...config,
14
+ exchange: config.exchange || "geekmidas.events",
15
+ exchangeType: config.exchangeType || "topic",
16
+ timeout: config.timeout ?? 5e3,
17
+ exchangeOptions: {
18
+ durable: true,
19
+ ...config.exchangeOptions
20
+ }
21
+ };
22
+ }
23
+ /**
24
+ * Create a RabbitMQConnection from a connection string
25
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
26
+ */
27
+ static async fromConnectionString(connectionString) {
28
+ const url = new URL(connectionString);
29
+ const params = url.searchParams;
30
+ const baseUrl = `amqp://${url.username ? `${url.username}:${url.password}@` : ""}${url.host}${url.pathname}`;
31
+ const timeoutParam = params.get("timeout");
32
+ const config = {
33
+ url: baseUrl,
34
+ exchange: params.get("exchange") || "geekmidas.events",
35
+ exchangeType: params.get("type") || "topic",
36
+ timeout: timeoutParam ? Number.parseInt(timeoutParam, 10) : void 0
37
+ };
38
+ const connection = new RabbitMQConnection(config);
39
+ await connection.connect();
40
+ return connection;
41
+ }
42
+ async connect() {
43
+ if (this.channel) return;
44
+ if (this.connecting) {
45
+ await this.connecting;
46
+ return;
47
+ }
48
+ this.connecting = (async () => {
49
+ try {
50
+ const connection = await amqplib.connect(this.config.url, { timeout: this.config.timeout });
51
+ const channel = await connection.createChannel();
52
+ await channel.assertExchange(this.config.exchange, this.config.exchangeType, this.config.exchangeOptions);
53
+ connection.on("error", (_err) => {
54
+ this.cleanup();
55
+ });
56
+ connection.on("close", () => {
57
+ this.cleanup();
58
+ });
59
+ this.connection = connection;
60
+ this.channel = channel;
61
+ } catch (error) {
62
+ this.cleanup();
63
+ throw error;
64
+ }
65
+ })();
66
+ await this.connecting;
67
+ this.connecting = void 0;
68
+ }
69
+ async close() {
70
+ try {
71
+ await this.channel?.close();
72
+ await this.connection?.close();
73
+ } catch (error) {} finally {
74
+ this.cleanup();
75
+ }
76
+ }
77
+ isConnected() {
78
+ return !!this.channel;
79
+ }
80
+ cleanup() {
81
+ this.channel = void 0;
82
+ this.connection = void 0;
83
+ this.connecting = void 0;
84
+ }
85
+ /**
86
+ * Get the underlying channel for publishing/subscribing
87
+ */
88
+ get amqpChannel() {
89
+ return this.channel;
90
+ }
91
+ /**
92
+ * Get the exchange name for this connection
93
+ */
94
+ get exchangeName() {
95
+ return this.config.exchange;
96
+ }
97
+ /**
98
+ * Get the exchange type for this connection
99
+ */
100
+ get exchangeType() {
101
+ return this.config.exchangeType;
102
+ }
103
+ };
104
+
105
+ //#endregion
106
+ export { RabbitMQConnection };
107
+ //# sourceMappingURL=RabbitMQConnection-eVOVS4Dl.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RabbitMQConnection-eVOVS4Dl.mjs","names":["config: RabbitMQConnectionConfig","connectionString: string","_err: Error"],"sources":["../src/rabbitmq/RabbitMQConnection.ts"],"sourcesContent":["import amqplib from 'amqplib';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface RabbitMQConnectionConfig {\n url: string;\n exchange?: string;\n exchangeType?: 'topic' | 'direct' | 'fanout' | 'headers';\n exchangeOptions?: amqplib.Options.AssertExchange;\n timeout?: number; // Connection timeout in milliseconds (default: 5000)\n}\n\nexport class RabbitMQConnection implements EventConnection {\n readonly type = EventPublisherType.RabbitMQ;\n private connection?: amqplib.ChannelModel;\n private channel?: amqplib.Channel;\n private connecting?: Promise<void>;\n private config: Required<\n Pick<RabbitMQConnectionConfig, 'exchange' | 'exchangeType' | 'timeout'>\n > &\n RabbitMQConnectionConfig;\n\n constructor(config: RabbitMQConnectionConfig) {\n this.config = {\n ...config,\n exchange: config.exchange || 'geekmidas.events',\n exchangeType: config.exchangeType || 'topic',\n timeout: config.timeout ?? 5000,\n exchangeOptions: {\n durable: true,\n ...config.exchangeOptions,\n },\n };\n }\n\n /**\n * Create a RabbitMQConnection from a connection string\n * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000\n */\n static async fromConnectionString(\n connectionString: string,\n ): Promise<RabbitMQConnection> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n // Extract connection URL without query params\n const baseUrl = `amqp://${url.username ? `${url.username}:${url.password}@` : ''}${url.host}${url.pathname}`;\n\n const timeoutParam = params.get('timeout');\n const config: RabbitMQConnectionConfig = {\n url: baseUrl,\n exchange: params.get('exchange') || 'geekmidas.events',\n exchangeType: (params.get('type') as any) || 'topic',\n timeout: timeoutParam ? Number.parseInt(timeoutParam, 10) : undefined,\n };\n\n const connection = new RabbitMQConnection(config);\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n if (this.channel) return;\n\n // Prevent multiple simultaneous connection attempts\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = (async () => {\n try {\n const connection = await amqplib.connect(this.config.url, {\n timeout: this.config.timeout,\n });\n const channel = await connection.createChannel();\n\n // Assert the exchange exists\n await channel.assertExchange(\n this.config.exchange!,\n this.config.exchangeType!,\n this.config.exchangeOptions,\n );\n\n // Handle connection errors\n connection.on('error', (_err: Error) => {\n this.cleanup();\n });\n\n connection.on('close', () => {\n this.cleanup();\n });\n\n // Only set after successful setup\n this.connection = connection;\n this.channel = channel;\n } catch (error) {\n this.cleanup();\n throw error;\n }\n })();\n\n await this.connecting;\n this.connecting = undefined;\n }\n\n async close(): Promise<void> {\n try {\n await this.channel?.close();\n await this.connection?.close();\n } catch (error) {\n // Ignore errors during close\n } finally {\n this.cleanup();\n }\n }\n\n isConnected(): boolean {\n return !!this.channel;\n }\n\n private cleanup(): void {\n this.channel = undefined;\n this.connection = undefined;\n this.connecting = undefined;\n }\n\n /**\n * Get the underlying channel for publishing/subscribing\n */\n get amqpChannel(): amqplib.Channel | undefined {\n return this.channel;\n }\n\n /**\n * Get the exchange name for this connection\n */\n get exchangeName(): string {\n return this.config.exchange;\n }\n\n /**\n * Get the exchange type for this connection\n */\n get exchangeType(): string {\n return this.config.exchangeType;\n }\n}\n"],"mappings":";;;;AAYA,IAAa,qBAAb,MAAa,mBAA8C;CACzD,AAAS,OAAO,mBAAmB;CACnC,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAKR,YAAYA,QAAkC;AAC5C,OAAK,SAAS;GACZ,GAAG;GACH,UAAU,OAAO,YAAY;GAC7B,cAAc,OAAO,gBAAgB;GACrC,SAAS,OAAO,WAAW;GAC3B,iBAAiB;IACf,SAAS;IACT,GAAG,OAAO;GACX;EACF;CACF;;;;;CAMD,aAAa,qBACXC,kBAC6B;EAC7B,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAGnB,MAAM,WAAW,SAAS,IAAI,YAAY,EAAE,IAAI,SAAS,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,SAAS;EAE3G,MAAM,eAAe,OAAO,IAAI,UAAU;EAC1C,MAAMD,SAAmC;GACvC,KAAK;GACL,UAAU,OAAO,IAAI,WAAW,IAAI;GACpC,cAAe,OAAO,IAAI,OAAO,IAAY;GAC7C,SAAS,eAAe,OAAO,SAAS,cAAc,GAAG;EAC1D;EAED,MAAM,aAAa,IAAI,mBAAmB;AAC1C,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAC7B,MAAI,KAAK,QAAS;AAGlB,MAAI,KAAK,YAAY;AACnB,SAAM,KAAK;AACX;EACD;AAED,OAAK,aAAa,CAAC,YAAY;AAC7B,OAAI;IACF,MAAM,aAAa,MAAM,QAAQ,QAAQ,KAAK,OAAO,KAAK,EACxD,SAAS,KAAK,OAAO,QACtB,EAAC;IACF,MAAM,UAAU,MAAM,WAAW,eAAe;AAGhD,UAAM,QAAQ,eACZ,KAAK,OAAO,UACZ,KAAK,OAAO,cACZ,KAAK,OAAO,gBACb;AAGD,eAAW,GAAG,SAAS,CAACE,SAAgB;AACtC,UAAK,SAAS;IACf,EAAC;AAEF,eAAW,GAAG,SAAS,MAAM;AAC3B,UAAK,SAAS;IACf,EAAC;AAGF,SAAK,aAAa;AAClB,SAAK,UAAU;GAChB,SAAQ,OAAO;AACd,SAAK,SAAS;AACd,UAAM;GACP;EACF,IAAG;AAEJ,QAAM,KAAK;AACX,OAAK;CACN;CAED,MAAM,QAAuB;AAC3B,MAAI;AACF,SAAM,KAAK,SAAS,OAAO;AAC3B,SAAM,KAAK,YAAY,OAAO;EAC/B,SAAQ,OAAO,CAEf,UAAS;AACR,QAAK,SAAS;EACf;CACF;CAED,cAAuB;AACrB,WAAS,KAAK;CACf;CAED,AAAQ,UAAgB;AACtB,OAAK;AACL,OAAK;AACL,OAAK;CACN;;;;CAKD,IAAI,cAA2C;AAC7C,SAAO,KAAK;CACb;;;;CAKD,IAAI,eAAuB;AACzB,SAAO,KAAK,OAAO;CACpB;;;;CAKD,IAAI,eAAuB;AACzB,SAAO,KAAK,OAAO;CACpB;AACF"}
@@ -0,0 +1,39 @@
1
+ //#region src/rabbitmq/RabbitMQPublisher.ts
2
+ var RabbitMQPublisher = class RabbitMQPublisher {
3
+ constructor(connection, options = {}) {
4
+ this.connection = connection;
5
+ this.options = options;
6
+ }
7
+ /**
8
+ * Create a RabbitMQPublisher from a connection string
9
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
10
+ */
11
+ static async fromConnectionString(connectionString) {
12
+ const { RabbitMQConnection } = await import("./rabbitmq/RabbitMQConnection.mjs");
13
+ const connection = await RabbitMQConnection.fromConnectionString(connectionString);
14
+ return new RabbitMQPublisher(connection);
15
+ }
16
+ async publish(messages) {
17
+ if (!this.connection.isConnected()) await this.connection.connect();
18
+ const channel = this.connection.amqpChannel;
19
+ if (!channel) throw new Error("Channel not initialized");
20
+ const exchange = this.connection.exchangeName;
21
+ for (const message of messages) {
22
+ const content = Buffer.from(JSON.stringify(message.payload));
23
+ const routingKey = message.type;
24
+ const published = channel.publish(exchange, routingKey, content, {
25
+ contentType: "application/json",
26
+ timestamp: Date.now(),
27
+ type: message.type,
28
+ persistent: true,
29
+ ...this.options.publishOptions
30
+ });
31
+ if (!published) await new Promise((resolve) => channel.once("drain", resolve));
32
+ }
33
+ }
34
+ async close() {}
35
+ };
36
+
37
+ //#endregion
38
+ export { RabbitMQPublisher };
39
+ //# sourceMappingURL=RabbitMQPublisher-BZX0edgL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RabbitMQPublisher-BZX0edgL.mjs","names":["connection: RabbitMQConnection","options: RabbitMQPublisherOptions","connectionString: string","messages: TMessage[]"],"sources":["../src/rabbitmq/RabbitMQPublisher.ts"],"sourcesContent":["import type amqplib from 'amqplib';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQPublisherOptions {\n publishOptions?: amqplib.Options.Publish;\n}\n\nexport class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(\n private connection: RabbitMQConnection,\n private options: RabbitMQPublisherOptions = {},\n ) {}\n\n /**\n * Create a RabbitMQPublisher from a connection string\n * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<RabbitMQPublisher<TMessage>> {\n const { RabbitMQConnection } = await import('./RabbitMQConnection');\n const connection =\n await RabbitMQConnection.fromConnectionString(connectionString);\n return new RabbitMQPublisher<TMessage>(connection);\n }\n\n async publish(messages: TMessage[]): Promise<void> {\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n const channel = this.connection.amqpChannel;\n if (!channel) {\n throw new Error('Channel not initialized');\n }\n\n const exchange = this.connection.exchangeName;\n\n for (const message of messages) {\n const content = Buffer.from(JSON.stringify(message.payload));\n\n // Use message type as routing key for topic exchanges\n const routingKey = message.type;\n\n const published = channel.publish(exchange, routingKey, content, {\n contentType: 'application/json',\n timestamp: Date.now(),\n type: message.type,\n persistent: true,\n ...this.options.publishOptions,\n });\n\n // Handle backpressure\n if (!published) {\n await new Promise((resolve) => channel.once('drain', resolve));\n }\n }\n }\n\n async close(): Promise<void> {\n // Publisher doesn't own the connection\n // Connection should be closed by whoever created it\n }\n}\n"],"mappings":";AAQA,IAAa,oBAAb,MAAa,kBAEb;CACE,YACUA,YACAC,UAAoC,CAAE,GAC9C;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAAgE;EAChE,MAAM,EAAE,oBAAoB,GAAG,MAAM,OAAO;EAC5C,MAAM,aACJ,MAAM,mBAAmB,qBAAqB,iBAAiB;AACjE,SAAO,IAAI,kBAA4B;CACxC;CAED,MAAM,QAAQC,UAAqC;AACjD,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;EAGjC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,QACH,OAAM,IAAI,MAAM;EAGlB,MAAM,WAAW,KAAK,WAAW;AAEjC,OAAK,MAAM,WAAW,UAAU;GAC9B,MAAM,UAAU,OAAO,KAAK,KAAK,UAAU,QAAQ,QAAQ,CAAC;GAG5D,MAAM,aAAa,QAAQ;GAE3B,MAAM,YAAY,QAAQ,QAAQ,UAAU,YAAY,SAAS;IAC/D,aAAa;IACb,WAAW,KAAK,KAAK;IACrB,MAAM,QAAQ;IACd,YAAY;IACZ,GAAG,KAAK,QAAQ;GACjB,EAAC;AAGF,QAAK,UACH,OAAM,IAAI,QAAQ,CAAC,YAAY,QAAQ,KAAK,SAAS,QAAQ;EAEhE;CACF;CAED,MAAM,QAAuB,CAG5B;AACF"}
@@ -0,0 +1,45 @@
1
+
2
+ //#region src/rabbitmq/RabbitMQPublisher.ts
3
+ var RabbitMQPublisher = class RabbitMQPublisher {
4
+ constructor(connection, options = {}) {
5
+ this.connection = connection;
6
+ this.options = options;
7
+ }
8
+ /**
9
+ * Create a RabbitMQPublisher from a connection string
10
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
11
+ */
12
+ static async fromConnectionString(connectionString) {
13
+ const { RabbitMQConnection } = await Promise.resolve().then(() => require("./rabbitmq/RabbitMQConnection.cjs"));
14
+ const connection = await RabbitMQConnection.fromConnectionString(connectionString);
15
+ return new RabbitMQPublisher(connection);
16
+ }
17
+ async publish(messages) {
18
+ if (!this.connection.isConnected()) await this.connection.connect();
19
+ const channel = this.connection.amqpChannel;
20
+ if (!channel) throw new Error("Channel not initialized");
21
+ const exchange = this.connection.exchangeName;
22
+ for (const message of messages) {
23
+ const content = Buffer.from(JSON.stringify(message.payload));
24
+ const routingKey = message.type;
25
+ const published = channel.publish(exchange, routingKey, content, {
26
+ contentType: "application/json",
27
+ timestamp: Date.now(),
28
+ type: message.type,
29
+ persistent: true,
30
+ ...this.options.publishOptions
31
+ });
32
+ if (!published) await new Promise((resolve) => channel.once("drain", resolve));
33
+ }
34
+ }
35
+ async close() {}
36
+ };
37
+
38
+ //#endregion
39
+ Object.defineProperty(exports, 'RabbitMQPublisher', {
40
+ enumerable: true,
41
+ get: function () {
42
+ return RabbitMQPublisher;
43
+ }
44
+ });
45
+ //# sourceMappingURL=RabbitMQPublisher-CSCn6gMA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RabbitMQPublisher-CSCn6gMA.cjs","names":["connection: RabbitMQConnection","options: RabbitMQPublisherOptions","connectionString: string","messages: TMessage[]"],"sources":["../src/rabbitmq/RabbitMQPublisher.ts"],"sourcesContent":["import type amqplib from 'amqplib';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQPublisherOptions {\n publishOptions?: amqplib.Options.Publish;\n}\n\nexport class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(\n private connection: RabbitMQConnection,\n private options: RabbitMQPublisherOptions = {},\n ) {}\n\n /**\n * Create a RabbitMQPublisher from a connection string\n * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<RabbitMQPublisher<TMessage>> {\n const { RabbitMQConnection } = await import('./RabbitMQConnection');\n const connection =\n await RabbitMQConnection.fromConnectionString(connectionString);\n return new RabbitMQPublisher<TMessage>(connection);\n }\n\n async publish(messages: TMessage[]): Promise<void> {\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n const channel = this.connection.amqpChannel;\n if (!channel) {\n throw new Error('Channel not initialized');\n }\n\n const exchange = this.connection.exchangeName;\n\n for (const message of messages) {\n const content = Buffer.from(JSON.stringify(message.payload));\n\n // Use message type as routing key for topic exchanges\n const routingKey = message.type;\n\n const published = channel.publish(exchange, routingKey, content, {\n contentType: 'application/json',\n timestamp: Date.now(),\n type: message.type,\n persistent: true,\n ...this.options.publishOptions,\n });\n\n // Handle backpressure\n if (!published) {\n await new Promise((resolve) => channel.once('drain', resolve));\n }\n }\n }\n\n async close(): Promise<void> {\n // Publisher doesn't own the connection\n // Connection should be closed by whoever created it\n }\n}\n"],"mappings":";;AAQA,IAAa,oBAAb,MAAa,kBAEb;CACE,YACUA,YACAC,UAAoC,CAAE,GAC9C;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAAgE;EAChE,MAAM,EAAE,oBAAoB,GAAG,2CAAM;EACrC,MAAM,aACJ,MAAM,mBAAmB,qBAAqB,iBAAiB;AACjE,SAAO,IAAI,kBAA4B;CACxC;CAED,MAAM,QAAQC,UAAqC;AACjD,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;EAGjC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,QACH,OAAM,IAAI,MAAM;EAGlB,MAAM,WAAW,KAAK,WAAW;AAEjC,OAAK,MAAM,WAAW,UAAU;GAC9B,MAAM,UAAU,OAAO,KAAK,KAAK,UAAU,QAAQ,QAAQ,CAAC;GAG5D,MAAM,aAAa,QAAQ;GAE3B,MAAM,YAAY,QAAQ,QAAQ,UAAU,YAAY,SAAS;IAC/D,aAAa;IACb,WAAW,KAAK,KAAK;IACrB,MAAM,QAAQ;IACd,YAAY;IACZ,GAAG,KAAK,QAAQ;GACjB,EAAC;AAGF,QAAK,UACH,OAAM,IAAI,QAAQ,CAAC,YAAY,QAAQ,KAAK,SAAS,QAAQ;EAEhE;CACF;CAED,MAAM,QAAuB,CAG5B;AACF"}
@@ -0,0 +1,23 @@
1
+ import { EventPublisher, PublishableMessage } from "./types-DEGUg5BA.cjs";
2
+ import { RabbitMQConnection } from "./RabbitMQConnection-7cWp_-_Q.cjs";
3
+ import amqplib from "amqplib";
4
+
5
+ //#region src/rabbitmq/RabbitMQPublisher.d.ts
6
+ interface RabbitMQPublisherOptions {
7
+ publishOptions?: amqplib.Options.Publish;
8
+ }
9
+ declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
10
+ private connection;
11
+ private options;
12
+ constructor(connection: RabbitMQConnection, options?: RabbitMQPublisherOptions);
13
+ /**
14
+ * Create a RabbitMQPublisher from a connection string
15
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
16
+ */
17
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<RabbitMQPublisher<TMessage>>;
18
+ publish(messages: TMessage[]): Promise<void>;
19
+ close(): Promise<void>;
20
+ }
21
+ //#endregion
22
+ export { RabbitMQPublisher, RabbitMQPublisherOptions };
23
+ //# sourceMappingURL=RabbitMQPublisher-CpcbgrXj.d.cts.map
@@ -0,0 +1,23 @@
1
+ import { EventPublisher, PublishableMessage } from "./types-D0g-o6wX.mjs";
2
+ import { RabbitMQConnection } from "./RabbitMQConnection-C2HC7J7K.mjs";
3
+ import amqplib from "amqplib";
4
+
5
+ //#region src/rabbitmq/RabbitMQPublisher.d.ts
6
+ interface RabbitMQPublisherOptions {
7
+ publishOptions?: amqplib.Options.Publish;
8
+ }
9
+ declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
10
+ private connection;
11
+ private options;
12
+ constructor(connection: RabbitMQConnection, options?: RabbitMQPublisherOptions);
13
+ /**
14
+ * Create a RabbitMQPublisher from a connection string
15
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
16
+ */
17
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<RabbitMQPublisher<TMessage>>;
18
+ publish(messages: TMessage[]): Promise<void>;
19
+ close(): Promise<void>;
20
+ }
21
+ //#endregion
22
+ export { RabbitMQPublisher, RabbitMQPublisherOptions };
23
+ //# sourceMappingURL=RabbitMQPublisher-DDZi15Ro.d.mts.map
@@ -0,0 +1,57 @@
1
+ //#region src/rabbitmq/RabbitMQSubscriber.ts
2
+ var RabbitMQSubscriber = class RabbitMQSubscriber {
3
+ constructor(connection, options = {}) {
4
+ this.connection = connection;
5
+ this.options = options;
6
+ }
7
+ /**
8
+ * Create a RabbitMQSubscriber from a connection string
9
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10
10
+ */
11
+ static async fromConnectionString(connectionString) {
12
+ const url = new URL(connectionString);
13
+ const params = url.searchParams;
14
+ const { RabbitMQConnection } = await import("./rabbitmq/RabbitMQConnection.mjs");
15
+ const connection = await RabbitMQConnection.fromConnectionString(connectionString);
16
+ const options = {
17
+ queueName: params.get("queueName") || void 0,
18
+ prefetch: params.get("prefetch") ? Number.parseInt(params.get("prefetch"), 10) : void 0
19
+ };
20
+ return new RabbitMQSubscriber(connection, options);
21
+ }
22
+ async subscribe(messages, listener) {
23
+ if (!this.connection.isConnected()) await this.connection.connect();
24
+ const channel = this.connection.amqpChannel;
25
+ if (!channel) throw new Error("Channel not initialized");
26
+ const exchange = this.connection.exchangeName;
27
+ if (this.options.prefetch) await channel.prefetch(this.options.prefetch);
28
+ const queueName = this.options.queueName || "";
29
+ const queueOptions = {
30
+ durable: true,
31
+ ...this.options.queueOptions
32
+ };
33
+ const { queue } = await channel.assertQueue(queueName, queueOptions);
34
+ for (const messageType of messages) await channel.bindQueue(queue, exchange, messageType);
35
+ await channel.consume(queue, async (msg) => {
36
+ if (!msg) return;
37
+ try {
38
+ const content = msg.content.toString();
39
+ const payload = JSON.parse(content);
40
+ const messageType = msg.properties.type;
41
+ const fullMessage = {
42
+ type: messageType,
43
+ payload
44
+ };
45
+ await listener(fullMessage);
46
+ channel.ack(msg);
47
+ } catch (error) {
48
+ console.error("Error processing message:", error);
49
+ channel.nack(msg, false, true);
50
+ }
51
+ }, this.options.consumeOptions);
52
+ }
53
+ };
54
+
55
+ //#endregion
56
+ export { RabbitMQSubscriber };
57
+ //# sourceMappingURL=RabbitMQSubscriber-B5I-hBaT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RabbitMQSubscriber-B5I-hBaT.mjs","names":["connection: RabbitMQConnection","options: RabbitMQSubscriberOptions","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","queueOptions: amqplib.Options.AssertQueue","fullMessage: TMessage"],"sources":["../src/rabbitmq/RabbitMQSubscriber.ts"],"sourcesContent":["import type amqplib from 'amqplib';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQSubscriberOptions {\n queueName?: string; // If not provided, a unique queue will be generated\n queueOptions?: amqplib.Options.AssertQueue;\n consumeOptions?: amqplib.Options.Consume;\n prefetch?: number; // Number of messages to prefetch (default: 1)\n}\n\nexport class RabbitMQSubscriber<\n TMessage extends PublishableMessage<string, any>,\n> implements EventSubscriber<TMessage>\n{\n constructor(\n private connection: RabbitMQConnection,\n private options: RabbitMQSubscriberOptions = {},\n ) {}\n\n /**\n * Create a RabbitMQSubscriber from a connection string\n * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<RabbitMQSubscriber<TMessage>> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const { RabbitMQConnection } = await import('./RabbitMQConnection');\n const connection =\n await RabbitMQConnection.fromConnectionString(connectionString);\n\n const options: RabbitMQSubscriberOptions = {\n queueName: params.get('queueName') || undefined,\n prefetch: params.get('prefetch')\n ? Number.parseInt(params.get('prefetch')!, 10)\n : undefined,\n };\n\n return new RabbitMQSubscriber<TMessage>(connection, options);\n }\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n const channel = this.connection.amqpChannel;\n if (!channel) {\n throw new Error('Channel not initialized');\n }\n\n const exchange = this.connection.exchangeName;\n\n // Set prefetch if specified\n if (this.options.prefetch) {\n await channel.prefetch(this.options.prefetch);\n }\n\n // Assert queue\n const queueName = this.options.queueName || '';\n const queueOptions: amqplib.Options.AssertQueue = {\n durable: true,\n ...this.options.queueOptions,\n };\n\n const { queue } = await channel.assertQueue(queueName, queueOptions);\n\n // Bind queue to exchange for each message type\n for (const messageType of messages) {\n await channel.bindQueue(queue, exchange, messageType);\n }\n\n // Consume messages\n await channel.consume(\n queue,\n async (msg) => {\n if (!msg) return;\n\n try {\n // Parse message payload\n const content = msg.content.toString();\n const payload = JSON.parse(content);\n\n // Get message type from properties\n const messageType = msg.properties.type;\n\n // Reconstruct full message\n const fullMessage: TMessage = {\n type: messageType,\n payload,\n } as TMessage;\n\n // Call listener\n await listener(fullMessage);\n\n // Ack message\n channel.ack(msg);\n } catch (error) {\n // Log error and nack message (requeue)\n console.error('Error processing message:', error);\n channel.nack(msg, false, true);\n }\n },\n this.options.consumeOptions,\n );\n }\n}\n"],"mappings":";AAWA,IAAa,qBAAb,MAAa,mBAGb;CACE,YACUA,YACAC,UAAqC,CAAE,GAC/C;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAAiE;EACjE,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,EAAE,oBAAoB,GAAG,MAAM,OAAO;EAC5C,MAAM,aACJ,MAAM,mBAAmB,qBAAqB,iBAAiB;EAEjE,MAAMD,UAAqC;GACzC,WAAW,OAAO,IAAI,YAAY;GAClC,UAAU,OAAO,IAAI,WAAW,GAC5B,OAAO,SAAS,OAAO,IAAI,WAAW,EAAG,GAAG;EAEjD;AAED,SAAO,IAAI,mBAA6B,YAAY;CACrD;CAED,MAAM,UACJE,UACAC,UACe;AACf,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;EAGjC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,QACH,OAAM,IAAI,MAAM;EAGlB,MAAM,WAAW,KAAK,WAAW;AAGjC,MAAI,KAAK,QAAQ,SACf,OAAM,QAAQ,SAAS,KAAK,QAAQ,SAAS;EAI/C,MAAM,YAAY,KAAK,QAAQ,aAAa;EAC5C,MAAMC,eAA4C;GAChD,SAAS;GACT,GAAG,KAAK,QAAQ;EACjB;EAED,MAAM,EAAE,OAAO,GAAG,MAAM,QAAQ,YAAY,WAAW,aAAa;AAGpE,OAAK,MAAM,eAAe,SACxB,OAAM,QAAQ,UAAU,OAAO,UAAU,YAAY;AAIvD,QAAM,QAAQ,QACZ,OACA,OAAO,QAAQ;AACb,QAAK,IAAK;AAEV,OAAI;IAEF,MAAM,UAAU,IAAI,QAAQ,UAAU;IACtC,MAAM,UAAU,KAAK,MAAM,QAAQ;IAGnC,MAAM,cAAc,IAAI,WAAW;IAGnC,MAAMC,cAAwB;KAC5B,MAAM;KACN;IACD;AAGD,UAAM,SAAS,YAAY;AAG3B,YAAQ,IAAI,IAAI;GACjB,SAAQ,OAAO;AAEd,YAAQ,MAAM,6BAA6B,MAAM;AACjD,YAAQ,KAAK,KAAK,OAAO,KAAK;GAC/B;EACF,GACD,KAAK,QAAQ,eACd;CACF;AACF"}
@@ -0,0 +1,25 @@
1
+ import { EventSubscriber, PublishableMessage } from "./types-DEGUg5BA.cjs";
2
+ import { RabbitMQConnection } from "./RabbitMQConnection-7cWp_-_Q.cjs";
3
+ import amqplib from "amqplib";
4
+
5
+ //#region src/rabbitmq/RabbitMQSubscriber.d.ts
6
+ interface RabbitMQSubscriberOptions {
7
+ queueName?: string;
8
+ queueOptions?: amqplib.Options.AssertQueue;
9
+ consumeOptions?: amqplib.Options.Consume;
10
+ prefetch?: number;
11
+ }
12
+ declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
13
+ private connection;
14
+ private options;
15
+ constructor(connection: RabbitMQConnection, options?: RabbitMQSubscriberOptions);
16
+ /**
17
+ * Create a RabbitMQSubscriber from a connection string
18
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10
19
+ */
20
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<RabbitMQSubscriber<TMessage>>;
21
+ subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
22
+ }
23
+ //#endregion
24
+ export { RabbitMQSubscriber, RabbitMQSubscriberOptions };
25
+ //# sourceMappingURL=RabbitMQSubscriber-BJ9PTGny.d.cts.map
@@ -0,0 +1,25 @@
1
+ import { EventSubscriber, PublishableMessage } from "./types-D0g-o6wX.mjs";
2
+ import { RabbitMQConnection } from "./RabbitMQConnection-C2HC7J7K.mjs";
3
+ import amqplib from "amqplib";
4
+
5
+ //#region src/rabbitmq/RabbitMQSubscriber.d.ts
6
+ interface RabbitMQSubscriberOptions {
7
+ queueName?: string;
8
+ queueOptions?: amqplib.Options.AssertQueue;
9
+ consumeOptions?: amqplib.Options.Consume;
10
+ prefetch?: number;
11
+ }
12
+ declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
13
+ private connection;
14
+ private options;
15
+ constructor(connection: RabbitMQConnection, options?: RabbitMQSubscriberOptions);
16
+ /**
17
+ * Create a RabbitMQSubscriber from a connection string
18
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10
19
+ */
20
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<RabbitMQSubscriber<TMessage>>;
21
+ subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
22
+ }
23
+ //#endregion
24
+ export { RabbitMQSubscriber, RabbitMQSubscriberOptions };
25
+ //# sourceMappingURL=RabbitMQSubscriber-CIvIw8MG.d.mts.map
@@ -0,0 +1,63 @@
1
+
2
+ //#region src/rabbitmq/RabbitMQSubscriber.ts
3
+ var RabbitMQSubscriber = class RabbitMQSubscriber {
4
+ constructor(connection, options = {}) {
5
+ this.connection = connection;
6
+ this.options = options;
7
+ }
8
+ /**
9
+ * Create a RabbitMQSubscriber from a connection string
10
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10
11
+ */
12
+ static async fromConnectionString(connectionString) {
13
+ const url = new URL(connectionString);
14
+ const params = url.searchParams;
15
+ const { RabbitMQConnection } = await Promise.resolve().then(() => require("./rabbitmq/RabbitMQConnection.cjs"));
16
+ const connection = await RabbitMQConnection.fromConnectionString(connectionString);
17
+ const options = {
18
+ queueName: params.get("queueName") || void 0,
19
+ prefetch: params.get("prefetch") ? Number.parseInt(params.get("prefetch"), 10) : void 0
20
+ };
21
+ return new RabbitMQSubscriber(connection, options);
22
+ }
23
+ async subscribe(messages, listener) {
24
+ if (!this.connection.isConnected()) await this.connection.connect();
25
+ const channel = this.connection.amqpChannel;
26
+ if (!channel) throw new Error("Channel not initialized");
27
+ const exchange = this.connection.exchangeName;
28
+ if (this.options.prefetch) await channel.prefetch(this.options.prefetch);
29
+ const queueName = this.options.queueName || "";
30
+ const queueOptions = {
31
+ durable: true,
32
+ ...this.options.queueOptions
33
+ };
34
+ const { queue } = await channel.assertQueue(queueName, queueOptions);
35
+ for (const messageType of messages) await channel.bindQueue(queue, exchange, messageType);
36
+ await channel.consume(queue, async (msg) => {
37
+ if (!msg) return;
38
+ try {
39
+ const content = msg.content.toString();
40
+ const payload = JSON.parse(content);
41
+ const messageType = msg.properties.type;
42
+ const fullMessage = {
43
+ type: messageType,
44
+ payload
45
+ };
46
+ await listener(fullMessage);
47
+ channel.ack(msg);
48
+ } catch (error) {
49
+ console.error("Error processing message:", error);
50
+ channel.nack(msg, false, true);
51
+ }
52
+ }, this.options.consumeOptions);
53
+ }
54
+ };
55
+
56
+ //#endregion
57
+ Object.defineProperty(exports, 'RabbitMQSubscriber', {
58
+ enumerable: true,
59
+ get: function () {
60
+ return RabbitMQSubscriber;
61
+ }
62
+ });
63
+ //# sourceMappingURL=RabbitMQSubscriber-Cj7qLIi6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RabbitMQSubscriber-Cj7qLIi6.cjs","names":["connection: RabbitMQConnection","options: RabbitMQSubscriberOptions","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","queueOptions: amqplib.Options.AssertQueue","fullMessage: TMessage"],"sources":["../src/rabbitmq/RabbitMQSubscriber.ts"],"sourcesContent":["import type amqplib from 'amqplib';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQSubscriberOptions {\n queueName?: string; // If not provided, a unique queue will be generated\n queueOptions?: amqplib.Options.AssertQueue;\n consumeOptions?: amqplib.Options.Consume;\n prefetch?: number; // Number of messages to prefetch (default: 1)\n}\n\nexport class RabbitMQSubscriber<\n TMessage extends PublishableMessage<string, any>,\n> implements EventSubscriber<TMessage>\n{\n constructor(\n private connection: RabbitMQConnection,\n private options: RabbitMQSubscriberOptions = {},\n ) {}\n\n /**\n * Create a RabbitMQSubscriber from a connection string\n * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<RabbitMQSubscriber<TMessage>> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const { RabbitMQConnection } = await import('./RabbitMQConnection');\n const connection =\n await RabbitMQConnection.fromConnectionString(connectionString);\n\n const options: RabbitMQSubscriberOptions = {\n queueName: params.get('queueName') || undefined,\n prefetch: params.get('prefetch')\n ? Number.parseInt(params.get('prefetch')!, 10)\n : undefined,\n };\n\n return new RabbitMQSubscriber<TMessage>(connection, options);\n }\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n const channel = this.connection.amqpChannel;\n if (!channel) {\n throw new Error('Channel not initialized');\n }\n\n const exchange = this.connection.exchangeName;\n\n // Set prefetch if specified\n if (this.options.prefetch) {\n await channel.prefetch(this.options.prefetch);\n }\n\n // Assert queue\n const queueName = this.options.queueName || '';\n const queueOptions: amqplib.Options.AssertQueue = {\n durable: true,\n ...this.options.queueOptions,\n };\n\n const { queue } = await channel.assertQueue(queueName, queueOptions);\n\n // Bind queue to exchange for each message type\n for (const messageType of messages) {\n await channel.bindQueue(queue, exchange, messageType);\n }\n\n // Consume messages\n await channel.consume(\n queue,\n async (msg) => {\n if (!msg) return;\n\n try {\n // Parse message payload\n const content = msg.content.toString();\n const payload = JSON.parse(content);\n\n // Get message type from properties\n const messageType = msg.properties.type;\n\n // Reconstruct full message\n const fullMessage: TMessage = {\n type: messageType,\n payload,\n } as TMessage;\n\n // Call listener\n await listener(fullMessage);\n\n // Ack message\n channel.ack(msg);\n } catch (error) {\n // Log error and nack message (requeue)\n console.error('Error processing message:', error);\n channel.nack(msg, false, true);\n }\n },\n this.options.consumeOptions,\n );\n }\n}\n"],"mappings":";;AAWA,IAAa,qBAAb,MAAa,mBAGb;CACE,YACUA,YACAC,UAAqC,CAAE,GAC/C;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAAiE;EACjE,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,EAAE,oBAAoB,GAAG,2CAAM;EACrC,MAAM,aACJ,MAAM,mBAAmB,qBAAqB,iBAAiB;EAEjE,MAAMD,UAAqC;GACzC,WAAW,OAAO,IAAI,YAAY;GAClC,UAAU,OAAO,IAAI,WAAW,GAC5B,OAAO,SAAS,OAAO,IAAI,WAAW,EAAG,GAAG;EAEjD;AAED,SAAO,IAAI,mBAA6B,YAAY;CACrD;CAED,MAAM,UACJE,UACAC,UACe;AACf,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;EAGjC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,QACH,OAAM,IAAI,MAAM;EAGlB,MAAM,WAAW,KAAK,WAAW;AAGjC,MAAI,KAAK,QAAQ,SACf,OAAM,QAAQ,SAAS,KAAK,QAAQ,SAAS;EAI/C,MAAM,YAAY,KAAK,QAAQ,aAAa;EAC5C,MAAMC,eAA4C;GAChD,SAAS;GACT,GAAG,KAAK,QAAQ;EACjB;EAED,MAAM,EAAE,OAAO,GAAG,MAAM,QAAQ,YAAY,WAAW,aAAa;AAGpE,OAAK,MAAM,eAAe,SACxB,OAAM,QAAQ,UAAU,OAAO,UAAU,YAAY;AAIvD,QAAM,QAAQ,QACZ,OACA,OAAO,QAAQ;AACb,QAAK,IAAK;AAEV,OAAI;IAEF,MAAM,UAAU,IAAI,QAAQ,UAAU;IACtC,MAAM,UAAU,KAAK,MAAM,QAAQ;IAGnC,MAAM,cAAc,IAAI,WAAW;IAGnC,MAAMC,cAAwB;KAC5B,MAAM;KACN;IACD;AAGD,UAAM,SAAS,YAAY;AAG3B,YAAQ,IAAI,IAAI;GACjB,SAAQ,OAAO;AAEd,YAAQ,MAAM,6BAA6B,MAAM;AACjD,YAAQ,KAAK,KAAK,OAAO,KAAK;GAC/B;EACF,GACD,KAAK,QAAQ,eACd;CACF;AACF"}
@@ -0,0 +1,40 @@
1
+ import { EventConnection, EventPublisherType } from "./types-D0g-o6wX.mjs";
2
+ import { SNSClient } from "@aws-sdk/client-sns";
3
+
4
+ //#region src/sns/SNSConnection.d.ts
5
+ interface SNSConnectionConfig {
6
+ topicArn: string;
7
+ region?: string;
8
+ endpoint?: string;
9
+ credentials?: {
10
+ accessKeyId: string;
11
+ secretAccessKey: string;
12
+ sessionToken?: string;
13
+ };
14
+ }
15
+ declare class SNSConnection implements EventConnection {
16
+ readonly type = EventPublisherType.SNS;
17
+ private client;
18
+ private connected;
19
+ private config;
20
+ constructor(config: SNSConnectionConfig);
21
+ /**
22
+ * Create an SNSConnection from a connection string
23
+ * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566
24
+ */
25
+ static fromConnectionString(connectionString: string): Promise<SNSConnection>;
26
+ connect(): Promise<void>;
27
+ close(): Promise<void>;
28
+ isConnected(): boolean;
29
+ /**
30
+ * Get the underlying SNS client
31
+ */
32
+ get snsClient(): SNSClient;
33
+ /**
34
+ * Get the topic ARN for this connection
35
+ */
36
+ get topicArn(): string;
37
+ }
38
+ //#endregion
39
+ export { SNSConnection, SNSConnectionConfig };
40
+ //# sourceMappingURL=SNSConnection-CAImaMM2.d.mts.map
@@ -0,0 +1,40 @@
1
+ import { EventConnection, EventPublisherType } from "./types-DEGUg5BA.cjs";
2
+ import { SNSClient } from "@aws-sdk/client-sns";
3
+
4
+ //#region src/sns/SNSConnection.d.ts
5
+ interface SNSConnectionConfig {
6
+ topicArn: string;
7
+ region?: string;
8
+ endpoint?: string;
9
+ credentials?: {
10
+ accessKeyId: string;
11
+ secretAccessKey: string;
12
+ sessionToken?: string;
13
+ };
14
+ }
15
+ declare class SNSConnection implements EventConnection {
16
+ readonly type = EventPublisherType.SNS;
17
+ private client;
18
+ private connected;
19
+ private config;
20
+ constructor(config: SNSConnectionConfig);
21
+ /**
22
+ * Create an SNSConnection from a connection string
23
+ * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566
24
+ */
25
+ static fromConnectionString(connectionString: string): Promise<SNSConnection>;
26
+ connect(): Promise<void>;
27
+ close(): Promise<void>;
28
+ isConnected(): boolean;
29
+ /**
30
+ * Get the underlying SNS client
31
+ */
32
+ get snsClient(): SNSClient;
33
+ /**
34
+ * Get the topic ARN for this connection
35
+ */
36
+ get topicArn(): string;
37
+ }
38
+ //#endregion
39
+ export { SNSConnection, SNSConnectionConfig };
40
+ //# sourceMappingURL=SNSConnection-Cqbr7-Ho.d.cts.map