@geekmidas/events 0.0.2 → 0.1.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 (81) hide show
  1. package/dist/{BasicConnection-C-Cg2FJT.cjs → BasicConnection-Bz3F2rXA.cjs} +1 -1
  2. package/dist/{BasicConnection-C-Cg2FJT.cjs.map → BasicConnection-Bz3F2rXA.cjs.map} +1 -1
  3. package/dist/{BasicConnection-CpwybcC9.mjs → BasicConnection-DOSOFSsW.mjs} +1 -1
  4. package/dist/{BasicConnection-CpwybcC9.mjs.map → BasicConnection-DOSOFSsW.mjs.map} +1 -1
  5. package/dist/{BasicPublisher-DogbeHAH.mjs → BasicPublisher-CaX8GCUi.mjs} +1 -1
  6. package/dist/{BasicPublisher-DogbeHAH.mjs.map → BasicPublisher-CaX8GCUi.mjs.map} +1 -1
  7. package/dist/{BasicPublisher-CXAVKxgq.cjs → BasicPublisher-afwuA4Xp.cjs} +1 -1
  8. package/dist/{BasicPublisher-CXAVKxgq.cjs.map → BasicPublisher-afwuA4Xp.cjs.map} +1 -1
  9. package/dist/{BasicSubscriber-BGqv3c8x.cjs → BasicSubscriber-Ckf3BkxS.cjs} +1 -1
  10. package/dist/{BasicSubscriber-BGqv3c8x.cjs.map → BasicSubscriber-Ckf3BkxS.cjs.map} +1 -1
  11. package/dist/{BasicSubscriber-CCKfbRMo.mjs → BasicSubscriber-DPpJNUUY.mjs} +1 -1
  12. package/dist/{BasicSubscriber-CCKfbRMo.mjs.map → BasicSubscriber-DPpJNUUY.mjs.map} +1 -1
  13. package/dist/{RabbitMQConnection-ungB0Zl6.cjs → RabbitMQConnection-BN_GybOv.cjs} +1 -1
  14. package/dist/{RabbitMQConnection-ungB0Zl6.cjs.map → RabbitMQConnection-BN_GybOv.cjs.map} +1 -1
  15. package/dist/{RabbitMQConnection-kU3MvN5P.mjs → RabbitMQConnection-eVOVS4Dl.mjs} +1 -1
  16. package/dist/{RabbitMQConnection-kU3MvN5P.mjs.map → RabbitMQConnection-eVOVS4Dl.mjs.map} +1 -1
  17. package/dist/{RabbitMQPublisher-o_oVI3wr.mjs → RabbitMQPublisher-BZX0edgL.mjs} +1 -1
  18. package/dist/{RabbitMQPublisher-o_oVI3wr.mjs.map → RabbitMQPublisher-BZX0edgL.mjs.map} +1 -1
  19. package/dist/{RabbitMQPublisher--DL6GM6g.cjs → RabbitMQPublisher-CSCn6gMA.cjs} +1 -1
  20. package/dist/{RabbitMQPublisher--DL6GM6g.cjs.map → RabbitMQPublisher-CSCn6gMA.cjs.map} +1 -1
  21. package/dist/{RabbitMQSubscriber-BaXqs5nO.mjs → RabbitMQSubscriber-B5I-hBaT.mjs} +1 -1
  22. package/dist/{RabbitMQSubscriber-BaXqs5nO.mjs.map → RabbitMQSubscriber-B5I-hBaT.mjs.map} +1 -1
  23. package/dist/{RabbitMQSubscriber-BplEJEk8.cjs → RabbitMQSubscriber-Cj7qLIi6.cjs} +1 -1
  24. package/dist/{RabbitMQSubscriber-BplEJEk8.cjs.map → RabbitMQSubscriber-Cj7qLIi6.cjs.map} +1 -1
  25. package/dist/{SNSConnection-DVsC_pbB.cjs → SNSConnection-CZz_U56V.cjs} +1 -1
  26. package/dist/{SNSConnection-DVsC_pbB.cjs.map → SNSConnection-CZz_U56V.cjs.map} +1 -1
  27. package/dist/{SNSConnection-D7wCf9Si.mjs → SNSConnection-DVEE3XoC.mjs} +1 -1
  28. package/dist/{SNSConnection-D7wCf9Si.mjs.map → SNSConnection-DVEE3XoC.mjs.map} +1 -1
  29. package/dist/{SNSPublisher-BZ6N3JI9.cjs → SNSPublisher-DbWVH-g_.cjs} +1 -1
  30. package/dist/{SNSPublisher-BZ6N3JI9.cjs.map → SNSPublisher-DbWVH-g_.cjs.map} +1 -1
  31. package/dist/{SNSPublisher-BfWjzNiB.mjs → SNSPublisher-Do-FMUyT.mjs} +1 -1
  32. package/dist/{SNSPublisher-BfWjzNiB.mjs.map → SNSPublisher-Do-FMUyT.mjs.map} +1 -1
  33. package/dist/{SNSSubscriber-UE0ia4XM.cjs → SNSSubscriber-DpEwQ8Tb.cjs} +3 -3
  34. package/dist/{SNSSubscriber-UE0ia4XM.cjs.map → SNSSubscriber-DpEwQ8Tb.cjs.map} +1 -1
  35. package/dist/{SNSSubscriber-C9YJWa7m.mjs → SNSSubscriber-e7eG48yJ.mjs} +3 -3
  36. package/dist/{SNSSubscriber-C9YJWa7m.mjs.map → SNSSubscriber-e7eG48yJ.mjs.map} +1 -1
  37. package/dist/{SQSConnection-Eleqqre3.mjs → SQSConnection-BBlDWZLU.mjs} +1 -1
  38. package/dist/{SQSConnection-Eleqqre3.mjs.map → SQSConnection-BBlDWZLU.mjs.map} +1 -1
  39. package/dist/{SQSConnection-BwNjUPr4.cjs → SQSConnection-DWYDtftQ.cjs} +1 -1
  40. package/dist/{SQSConnection-BwNjUPr4.cjs.map → SQSConnection-DWYDtftQ.cjs.map} +1 -1
  41. package/dist/{SQSPublisher-DG9o4ME3.mjs → SQSPublisher-B3lS2zbu.mjs} +1 -1
  42. package/dist/{SQSPublisher-DG9o4ME3.mjs.map → SQSPublisher-B3lS2zbu.mjs.map} +1 -1
  43. package/dist/{SQSPublisher-Dq5353oZ.cjs → SQSPublisher-nzbSaXSH.cjs} +1 -1
  44. package/dist/{SQSPublisher-Dq5353oZ.cjs.map → SQSPublisher-nzbSaXSH.cjs.map} +1 -1
  45. package/dist/{SQSSubscriber-CD66P7hH.mjs → SQSSubscriber-84pFnW1z.mjs} +1 -1
  46. package/dist/{SQSSubscriber-CD66P7hH.mjs.map → SQSSubscriber-84pFnW1z.mjs.map} +1 -1
  47. package/dist/{SQSSubscriber-DZDNgLE5.cjs → SQSSubscriber-DcL9BbG1.cjs} +1 -1
  48. package/dist/{SQSSubscriber-DZDNgLE5.cjs.map → SQSSubscriber-DcL9BbG1.cjs.map} +1 -1
  49. package/dist/basic/BasicConnection.cjs +1 -1
  50. package/dist/basic/BasicConnection.mjs +1 -1
  51. package/dist/basic/BasicPublisher.cjs +1 -1
  52. package/dist/basic/BasicPublisher.mjs +1 -1
  53. package/dist/basic/BasicSubscriber.cjs +1 -1
  54. package/dist/basic/BasicSubscriber.mjs +1 -1
  55. package/dist/basic/index.cjs +3 -3
  56. package/dist/basic/index.mjs +3 -3
  57. package/dist/rabbitmq/RabbitMQConnection.cjs +1 -1
  58. package/dist/rabbitmq/RabbitMQConnection.mjs +1 -1
  59. package/dist/rabbitmq/RabbitMQPublisher.cjs +1 -1
  60. package/dist/rabbitmq/RabbitMQPublisher.mjs +1 -1
  61. package/dist/rabbitmq/RabbitMQSubscriber.cjs +1 -1
  62. package/dist/rabbitmq/RabbitMQSubscriber.mjs +1 -1
  63. package/dist/rabbitmq/index.cjs +3 -3
  64. package/dist/rabbitmq/index.mjs +3 -3
  65. package/dist/sns/SNSConnection.cjs +1 -1
  66. package/dist/sns/SNSConnection.mjs +1 -1
  67. package/dist/sns/SNSPublisher.cjs +1 -1
  68. package/dist/sns/SNSPublisher.mjs +1 -1
  69. package/dist/sns/SNSSubscriber.cjs +3 -3
  70. package/dist/sns/SNSSubscriber.mjs +3 -3
  71. package/dist/sns/index.cjs +5 -5
  72. package/dist/sns/index.mjs +5 -5
  73. package/dist/sqs/SQSConnection.cjs +1 -1
  74. package/dist/sqs/SQSConnection.mjs +1 -1
  75. package/dist/sqs/SQSPublisher.cjs +1 -1
  76. package/dist/sqs/SQSPublisher.mjs +1 -1
  77. package/dist/sqs/SQSSubscriber.cjs +1 -1
  78. package/dist/sqs/SQSSubscriber.mjs +1 -1
  79. package/dist/sqs/index.cjs +3 -3
  80. package/dist/sqs/index.mjs +3 -3
  81. package/package.json +24 -5
@@ -45,4 +45,4 @@ Object.defineProperty(exports, 'BasicConnection', {
45
45
  return BasicConnection;
46
46
  }
47
47
  });
48
- //# sourceMappingURL=BasicConnection-C-Cg2FJT.cjs.map
48
+ //# sourceMappingURL=BasicConnection-Bz3F2rXA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicConnection-C-Cg2FJT.cjs","names":["EventPublisherType","EventEmitter","_connectionString: string"],"sources":["../src/basic/BasicConnection.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n readonly type = EventPublisherType.Basic;\n private emitter: EventEmitter;\n private connected = false;\n\n constructor() {\n this.emitter = new EventEmitter();\n }\n\n /**\n * Create a BasicConnection from a connection string\n * Format: basic://\n */\n static async fromConnectionString(\n _connectionString: string,\n ): Promise<BasicConnection> {\n // Basic connection doesn't need any configuration\n const connection = new BasicConnection();\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.emitter.removeAllListeners();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying EventEmitter\n * Used by BasicPublisher and BasicSubscriber\n */\n get eventEmitter(): EventEmitter {\n return this.emitter;\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACtD,AAAS,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CAEpB,cAAc;AACZ,OAAK,UAAU,IAAIC;CACpB;;;;;CAMD,aAAa,qBACXC,mBAC0B;EAE1B,MAAM,aAAa,IAAI;AACvB,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAC7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,QAAQ,oBAAoB;AACjC,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;;CAMD,IAAI,eAA6B;AAC/B,SAAO,KAAK;CACb;AACF"}
1
+ {"version":3,"file":"BasicConnection-Bz3F2rXA.cjs","names":["EventPublisherType","EventEmitter","_connectionString: string"],"sources":["../src/basic/BasicConnection.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n readonly type = EventPublisherType.Basic;\n private emitter: EventEmitter;\n private connected = false;\n\n constructor() {\n this.emitter = new EventEmitter();\n }\n\n /**\n * Create a BasicConnection from a connection string\n * Format: basic://\n */\n static async fromConnectionString(\n _connectionString: string,\n ): Promise<BasicConnection> {\n // Basic connection doesn't need any configuration\n const connection = new BasicConnection();\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.emitter.removeAllListeners();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying EventEmitter\n * Used by BasicPublisher and BasicSubscriber\n */\n get eventEmitter(): EventEmitter {\n return this.emitter;\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACtD,AAAS,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CAEpB,cAAc;AACZ,OAAK,UAAU,IAAIC;CACpB;;;;;CAMD,aAAa,qBACXC,mBAC0B;EAE1B,MAAM,aAAa,IAAI;AACvB,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAC7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,QAAQ,oBAAoB;AACjC,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;;CAMD,IAAI,eAA6B;AAC/B,SAAO,KAAK;CACb;AACF"}
@@ -39,4 +39,4 @@ var BasicConnection = class BasicConnection {
39
39
 
40
40
  //#endregion
41
41
  export { BasicConnection };
42
- //# sourceMappingURL=BasicConnection-CpwybcC9.mjs.map
42
+ //# sourceMappingURL=BasicConnection-DOSOFSsW.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicConnection-CpwybcC9.mjs","names":["_connectionString: string"],"sources":["../src/basic/BasicConnection.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n readonly type = EventPublisherType.Basic;\n private emitter: EventEmitter;\n private connected = false;\n\n constructor() {\n this.emitter = new EventEmitter();\n }\n\n /**\n * Create a BasicConnection from a connection string\n * Format: basic://\n */\n static async fromConnectionString(\n _connectionString: string,\n ): Promise<BasicConnection> {\n // Basic connection doesn't need any configuration\n const connection = new BasicConnection();\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.emitter.removeAllListeners();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying EventEmitter\n * Used by BasicPublisher and BasicSubscriber\n */\n get eventEmitter(): EventEmitter {\n return this.emitter;\n }\n}\n"],"mappings":";;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACtD,AAAS,OAAO,mBAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CAEpB,cAAc;AACZ,OAAK,UAAU,IAAI;CACpB;;;;;CAMD,aAAa,qBACXA,mBAC0B;EAE1B,MAAM,aAAa,IAAI;AACvB,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAC7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,QAAQ,oBAAoB;AACjC,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;;CAMD,IAAI,eAA6B;AAC/B,SAAO,KAAK;CACb;AACF"}
1
+ {"version":3,"file":"BasicConnection-DOSOFSsW.mjs","names":["_connectionString: string"],"sources":["../src/basic/BasicConnection.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n readonly type = EventPublisherType.Basic;\n private emitter: EventEmitter;\n private connected = false;\n\n constructor() {\n this.emitter = new EventEmitter();\n }\n\n /**\n * Create a BasicConnection from a connection string\n * Format: basic://\n */\n static async fromConnectionString(\n _connectionString: string,\n ): Promise<BasicConnection> {\n // Basic connection doesn't need any configuration\n const connection = new BasicConnection();\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.emitter.removeAllListeners();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying EventEmitter\n * Used by BasicPublisher and BasicSubscriber\n */\n get eventEmitter(): EventEmitter {\n return this.emitter;\n }\n}\n"],"mappings":";;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACtD,AAAS,OAAO,mBAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CAEpB,cAAc;AACZ,OAAK,UAAU,IAAI;CACpB;;;;;CAMD,aAAa,qBACXA,mBAC0B;EAE1B,MAAM,aAAa,IAAI;AACvB,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAC7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,QAAQ,oBAAoB;AACjC,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;;CAMD,IAAI,eAA6B;AAC/B,SAAO,KAAK;CACb;AACF"}
@@ -11,4 +11,4 @@ var BasicPublisher = class {
11
11
 
12
12
  //#endregion
13
13
  export { BasicPublisher };
14
- //# sourceMappingURL=BasicPublisher-DogbeHAH.mjs.map
14
+ //# sourceMappingURL=BasicPublisher-CaX8GCUi.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicPublisher-DogbeHAH.mjs","names":["connection: BasicConnection","messages: TMessage[]"],"sources":["../src/basic/BasicPublisher.ts"],"sourcesContent":["import type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async publish(messages: TMessage[]) {\n const emitter = this.connection.eventEmitter;\n for (const message of messages) {\n emitter.emit(message.type, message);\n }\n }\n}\n"],"mappings":";AAGA,IAAa,iBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,QAAQC,UAAsB;EAClC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,MAAM,WAAW,SACpB,SAAQ,KAAK,QAAQ,MAAM,QAAQ;CAEtC;AACF"}
1
+ {"version":3,"file":"BasicPublisher-CaX8GCUi.mjs","names":["connection: BasicConnection","messages: TMessage[]"],"sources":["../src/basic/BasicPublisher.ts"],"sourcesContent":["import type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async publish(messages: TMessage[]) {\n const emitter = this.connection.eventEmitter;\n for (const message of messages) {\n emitter.emit(message.type, message);\n }\n }\n}\n"],"mappings":";AAGA,IAAa,iBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,QAAQC,UAAsB;EAClC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,MAAM,WAAW,SACpB,SAAQ,KAAK,QAAQ,MAAM,QAAQ;CAEtC;AACF"}
@@ -17,4 +17,4 @@ Object.defineProperty(exports, 'BasicPublisher', {
17
17
  return BasicPublisher;
18
18
  }
19
19
  });
20
- //# sourceMappingURL=BasicPublisher-CXAVKxgq.cjs.map
20
+ //# sourceMappingURL=BasicPublisher-afwuA4Xp.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicPublisher-CXAVKxgq.cjs","names":["connection: BasicConnection","messages: TMessage[]"],"sources":["../src/basic/BasicPublisher.ts"],"sourcesContent":["import type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async publish(messages: TMessage[]) {\n const emitter = this.connection.eventEmitter;\n for (const message of messages) {\n emitter.emit(message.type, message);\n }\n }\n}\n"],"mappings":";;AAGA,IAAa,iBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,QAAQC,UAAsB;EAClC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,MAAM,WAAW,SACpB,SAAQ,KAAK,QAAQ,MAAM,QAAQ;CAEtC;AACF"}
1
+ {"version":3,"file":"BasicPublisher-afwuA4Xp.cjs","names":["connection: BasicConnection","messages: TMessage[]"],"sources":["../src/basic/BasicPublisher.ts"],"sourcesContent":["import type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async publish(messages: TMessage[]) {\n const emitter = this.connection.eventEmitter;\n for (const message of messages) {\n emitter.emit(message.type, message);\n }\n }\n}\n"],"mappings":";;AAGA,IAAa,iBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,QAAQC,UAAsB;EAClC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,MAAM,WAAW,SACpB,SAAQ,KAAK,QAAQ,MAAM,QAAQ;CAEtC;AACF"}
@@ -21,4 +21,4 @@ Object.defineProperty(exports, 'BasicSubscriber', {
21
21
  return BasicSubscriber;
22
22
  }
23
23
  });
24
- //# sourceMappingURL=BasicSubscriber-BGqv3c8x.cjs.map
24
+ //# sourceMappingURL=BasicSubscriber-Ckf3BkxS.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicSubscriber-BGqv3c8x.cjs","names":["connection: BasicConnection","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","message: TMessage"],"sources":["../src/basic/BasicSubscriber.ts"],"sourcesContent":["import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n const emitter = this.connection.eventEmitter;\n\n for (const messageType of messages) {\n emitter.on(messageType, (message: TMessage) => {\n listener(message).catch((error) => {\n // Log error but don't throw to prevent unhandled promise rejections\n console.error(`Error processing message ${messageType}:`, error);\n });\n });\n }\n }\n}\n"],"mappings":";;AAGA,IAAa,kBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,UACJC,UACAC,UACe;EACf,MAAM,UAAU,KAAK,WAAW;AAEhC,OAAK,MAAM,eAAe,SACxB,SAAQ,GAAG,aAAa,CAACC,YAAsB;AAC7C,YAAS,QAAQ,CAAC,MAAM,CAAC,UAAU;AAEjC,YAAQ,OAAO,2BAA2B,YAAY,IAAI,MAAM;GACjE,EAAC;EACH,EAAC;CAEL;AACF"}
1
+ {"version":3,"file":"BasicSubscriber-Ckf3BkxS.cjs","names":["connection: BasicConnection","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","message: TMessage"],"sources":["../src/basic/BasicSubscriber.ts"],"sourcesContent":["import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n const emitter = this.connection.eventEmitter;\n\n for (const messageType of messages) {\n emitter.on(messageType, (message: TMessage) => {\n listener(message).catch((error) => {\n // Log error but don't throw to prevent unhandled promise rejections\n console.error(`Error processing message ${messageType}:`, error);\n });\n });\n }\n }\n}\n"],"mappings":";;AAGA,IAAa,kBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,UACJC,UACAC,UACe;EACf,MAAM,UAAU,KAAK,WAAW;AAEhC,OAAK,MAAM,eAAe,SACxB,SAAQ,GAAG,aAAa,CAACC,YAAsB;AAC7C,YAAS,QAAQ,CAAC,MAAM,CAAC,UAAU;AAEjC,YAAQ,OAAO,2BAA2B,YAAY,IAAI,MAAM;GACjE,EAAC;EACH,EAAC;CAEL;AACF"}
@@ -15,4 +15,4 @@ var BasicSubscriber = class {
15
15
 
16
16
  //#endregion
17
17
  export { BasicSubscriber };
18
- //# sourceMappingURL=BasicSubscriber-CCKfbRMo.mjs.map
18
+ //# sourceMappingURL=BasicSubscriber-DPpJNUUY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicSubscriber-CCKfbRMo.mjs","names":["connection: BasicConnection","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","message: TMessage"],"sources":["../src/basic/BasicSubscriber.ts"],"sourcesContent":["import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n const emitter = this.connection.eventEmitter;\n\n for (const messageType of messages) {\n emitter.on(messageType, (message: TMessage) => {\n listener(message).catch((error) => {\n // Log error but don't throw to prevent unhandled promise rejections\n console.error(`Error processing message ${messageType}:`, error);\n });\n });\n }\n }\n}\n"],"mappings":";AAGA,IAAa,kBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,UACJC,UACAC,UACe;EACf,MAAM,UAAU,KAAK,WAAW;AAEhC,OAAK,MAAM,eAAe,SACxB,SAAQ,GAAG,aAAa,CAACC,YAAsB;AAC7C,YAAS,QAAQ,CAAC,MAAM,CAAC,UAAU;AAEjC,YAAQ,OAAO,2BAA2B,YAAY,IAAI,MAAM;GACjE,EAAC;EACH,EAAC;CAEL;AACF"}
1
+ {"version":3,"file":"BasicSubscriber-DPpJNUUY.mjs","names":["connection: BasicConnection","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","message: TMessage"],"sources":["../src/basic/BasicSubscriber.ts"],"sourcesContent":["import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n constructor(private connection: BasicConnection) {}\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n const emitter = this.connection.eventEmitter;\n\n for (const messageType of messages) {\n emitter.on(messageType, (message: TMessage) => {\n listener(message).catch((error) => {\n // Log error but don't throw to prevent unhandled promise rejections\n console.error(`Error processing message ${messageType}:`, error);\n });\n });\n }\n }\n}\n"],"mappings":";AAGA,IAAa,kBAAb,MAEA;CACE,YAAoBA,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,UACJC,UACAC,UACe;EACf,MAAM,UAAU,KAAK,WAAW;AAEhC,OAAK,MAAM,eAAe,SACxB,SAAQ,GAAG,aAAa,CAACC,YAAsB;AAC7C,YAAS,QAAQ,CAAC,MAAM,CAAC,UAAU;AAEjC,YAAQ,OAAO,2BAA2B,YAAY,IAAI,MAAM;GACjE,EAAC;EACH,EAAC;CAEL;AACF"}
@@ -110,4 +110,4 @@ Object.defineProperty(exports, 'RabbitMQConnection', {
110
110
  return RabbitMQConnection;
111
111
  }
112
112
  });
113
- //# sourceMappingURL=RabbitMQConnection-ungB0Zl6.cjs.map
113
+ //# sourceMappingURL=RabbitMQConnection-BN_GybOv.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RabbitMQConnection-ungB0Zl6.cjs","names":["EventPublisherType","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,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAKR,YAAYC,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,gBAAQ,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"}
1
+ {"version":3,"file":"RabbitMQConnection-BN_GybOv.cjs","names":["EventPublisherType","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,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAKR,YAAYC,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,gBAAQ,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"}
@@ -104,4 +104,4 @@ var RabbitMQConnection = class RabbitMQConnection {
104
104
 
105
105
  //#endregion
106
106
  export { RabbitMQConnection };
107
- //# sourceMappingURL=RabbitMQConnection-kU3MvN5P.mjs.map
107
+ //# sourceMappingURL=RabbitMQConnection-eVOVS4Dl.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RabbitMQConnection-kU3MvN5P.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"}
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"}
@@ -36,4 +36,4 @@ var RabbitMQPublisher = class RabbitMQPublisher {
36
36
 
37
37
  //#endregion
38
38
  export { RabbitMQPublisher };
39
- //# sourceMappingURL=RabbitMQPublisher-o_oVI3wr.mjs.map
39
+ //# sourceMappingURL=RabbitMQPublisher-BZX0edgL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RabbitMQPublisher-o_oVI3wr.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"}
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"}
@@ -42,4 +42,4 @@ Object.defineProperty(exports, 'RabbitMQPublisher', {
42
42
  return RabbitMQPublisher;
43
43
  }
44
44
  });
45
- //# sourceMappingURL=RabbitMQPublisher--DL6GM6g.cjs.map
45
+ //# sourceMappingURL=RabbitMQPublisher-CSCn6gMA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RabbitMQPublisher--DL6GM6g.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"}
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"}
@@ -54,4 +54,4 @@ var RabbitMQSubscriber = class RabbitMQSubscriber {
54
54
 
55
55
  //#endregion
56
56
  export { RabbitMQSubscriber };
57
- //# sourceMappingURL=RabbitMQSubscriber-BaXqs5nO.mjs.map
57
+ //# sourceMappingURL=RabbitMQSubscriber-B5I-hBaT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RabbitMQSubscriber-BaXqs5nO.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"}
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"}
@@ -60,4 +60,4 @@ Object.defineProperty(exports, 'RabbitMQSubscriber', {
60
60
  return RabbitMQSubscriber;
61
61
  }
62
62
  });
63
- //# sourceMappingURL=RabbitMQSubscriber-BplEJEk8.cjs.map
63
+ //# sourceMappingURL=RabbitMQSubscriber-Cj7qLIi6.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RabbitMQSubscriber-BplEJEk8.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"}
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"}
@@ -73,4 +73,4 @@ Object.defineProperty(exports, 'SNSConnection', {
73
73
  return SNSConnection;
74
74
  }
75
75
  });
76
- //# sourceMappingURL=SNSConnection-DVsC_pbB.cjs.map
76
+ //# sourceMappingURL=SNSConnection-CZz_U56V.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SNSConnection-DVsC_pbB.cjs","names":["EventPublisherType","config: SNSConnectionConfig","clientConfig: SNSClientConfig","SNSClient","connectionString: string"],"sources":["../src/sns/SNSConnection.ts"],"sourcesContent":["import { SNSClient, type SNSClientConfig } from '@aws-sdk/client-sns';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface SNSConnectionConfig {\n topicArn: string;\n region?: string;\n endpoint?: string; // Custom endpoint (e.g., for LocalStack)\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n}\n\nexport class SNSConnection implements EventConnection {\n readonly type = EventPublisherType.SNS;\n private client: SNSClient;\n private connected = false;\n private config: SNSConnectionConfig;\n\n constructor(config: SNSConnectionConfig) {\n this.config = config;\n\n const clientConfig: SNSClientConfig = {\n region: config.region,\n endpoint: config.endpoint,\n credentials: config.credentials,\n };\n\n this.client = new SNSClient(clientConfig);\n }\n\n /**\n * Create an SNSConnection from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString(\n connectionString: string,\n ): Promise<SNSConnection> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const topicArn = params.get('topicArn');\n if (!topicArn) {\n throw new Error('topicArn parameter is required in connection string');\n }\n\n const config: SNSConnectionConfig = {\n topicArn,\n region: params.get('region') || undefined,\n endpoint: params.get('endpoint') || undefined,\n };\n\n // Parse credentials if provided\n const accessKeyId = params.get('accessKeyId');\n const secretAccessKey = params.get('secretAccessKey');\n if (accessKeyId && secretAccessKey) {\n config.credentials = {\n accessKeyId,\n secretAccessKey,\n sessionToken: params.get('sessionToken') || undefined,\n };\n }\n\n const connection = new SNSConnection(config);\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n // SNS doesn't have a traditional connection, but we mark as connected\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.client.destroy();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying SNS client\n */\n get snsClient(): SNSClient {\n return this.client;\n }\n\n /**\n * Get the topic ARN for this connection\n */\n get topicArn(): string {\n return this.config.topicArn;\n }\n}\n"],"mappings":";;;;;AAeA,IAAa,gBAAb,MAAa,cAAyC;CACpD,AAAS,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CACpB,AAAQ;CAER,YAAYC,QAA6B;AACvC,OAAK,SAAS;EAEd,MAAMC,eAAgC;GACpC,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,aAAa,OAAO;EACrB;AAED,OAAK,SAAS,IAAIC,+BAAU;CAC7B;;;;;CAMD,aAAa,qBACXC,kBACwB;EACxB,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,WAAW,OAAO,IAAI,WAAW;AACvC,OAAK,SACH,OAAM,IAAI,MAAM;EAGlB,MAAMH,SAA8B;GAClC;GACA,QAAQ,OAAO,IAAI,SAAS;GAC5B,UAAU,OAAO,IAAI,WAAW;EACjC;EAGD,MAAM,cAAc,OAAO,IAAI,cAAc;EAC7C,MAAM,kBAAkB,OAAO,IAAI,kBAAkB;AACrD,MAAI,eAAe,gBACjB,QAAO,cAAc;GACnB;GACA;GACA,cAAc,OAAO,IAAI,eAAe;EACzC;EAGH,MAAM,aAAa,IAAI,cAAc;AACrC,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAE7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,OAAO,SAAS;AACrB,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;CAKD,IAAI,YAAuB;AACzB,SAAO,KAAK;CACb;;;;CAKD,IAAI,WAAmB;AACrB,SAAO,KAAK,OAAO;CACpB;AACF"}
1
+ {"version":3,"file":"SNSConnection-CZz_U56V.cjs","names":["EventPublisherType","config: SNSConnectionConfig","clientConfig: SNSClientConfig","SNSClient","connectionString: string"],"sources":["../src/sns/SNSConnection.ts"],"sourcesContent":["import { SNSClient, type SNSClientConfig } from '@aws-sdk/client-sns';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface SNSConnectionConfig {\n topicArn: string;\n region?: string;\n endpoint?: string; // Custom endpoint (e.g., for LocalStack)\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n}\n\nexport class SNSConnection implements EventConnection {\n readonly type = EventPublisherType.SNS;\n private client: SNSClient;\n private connected = false;\n private config: SNSConnectionConfig;\n\n constructor(config: SNSConnectionConfig) {\n this.config = config;\n\n const clientConfig: SNSClientConfig = {\n region: config.region,\n endpoint: config.endpoint,\n credentials: config.credentials,\n };\n\n this.client = new SNSClient(clientConfig);\n }\n\n /**\n * Create an SNSConnection from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString(\n connectionString: string,\n ): Promise<SNSConnection> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const topicArn = params.get('topicArn');\n if (!topicArn) {\n throw new Error('topicArn parameter is required in connection string');\n }\n\n const config: SNSConnectionConfig = {\n topicArn,\n region: params.get('region') || undefined,\n endpoint: params.get('endpoint') || undefined,\n };\n\n // Parse credentials if provided\n const accessKeyId = params.get('accessKeyId');\n const secretAccessKey = params.get('secretAccessKey');\n if (accessKeyId && secretAccessKey) {\n config.credentials = {\n accessKeyId,\n secretAccessKey,\n sessionToken: params.get('sessionToken') || undefined,\n };\n }\n\n const connection = new SNSConnection(config);\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n // SNS doesn't have a traditional connection, but we mark as connected\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.client.destroy();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying SNS client\n */\n get snsClient(): SNSClient {\n return this.client;\n }\n\n /**\n * Get the topic ARN for this connection\n */\n get topicArn(): string {\n return this.config.topicArn;\n }\n}\n"],"mappings":";;;;;AAeA,IAAa,gBAAb,MAAa,cAAyC;CACpD,AAAS,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CACpB,AAAQ;CAER,YAAYC,QAA6B;AACvC,OAAK,SAAS;EAEd,MAAMC,eAAgC;GACpC,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,aAAa,OAAO;EACrB;AAED,OAAK,SAAS,IAAIC,+BAAU;CAC7B;;;;;CAMD,aAAa,qBACXC,kBACwB;EACxB,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,WAAW,OAAO,IAAI,WAAW;AACvC,OAAK,SACH,OAAM,IAAI,MAAM;EAGlB,MAAMH,SAA8B;GAClC;GACA,QAAQ,OAAO,IAAI,SAAS;GAC5B,UAAU,OAAO,IAAI,WAAW;EACjC;EAGD,MAAM,cAAc,OAAO,IAAI,cAAc;EAC7C,MAAM,kBAAkB,OAAO,IAAI,kBAAkB;AACrD,MAAI,eAAe,gBACjB,QAAO,cAAc;GACnB;GACA;GACA,cAAc,OAAO,IAAI,eAAe;EACzC;EAGH,MAAM,aAAa,IAAI,cAAc;AACrC,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAE7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,OAAO,SAAS;AACrB,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;CAKD,IAAI,YAAuB;AACzB,SAAO,KAAK;CACb;;;;CAKD,IAAI,WAAmB;AACrB,SAAO,KAAK,OAAO;CACpB;AACF"}
@@ -67,4 +67,4 @@ var SNSConnection = class SNSConnection {
67
67
 
68
68
  //#endregion
69
69
  export { SNSConnection };
70
- //# sourceMappingURL=SNSConnection-D7wCf9Si.mjs.map
70
+ //# sourceMappingURL=SNSConnection-DVEE3XoC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SNSConnection-D7wCf9Si.mjs","names":["config: SNSConnectionConfig","clientConfig: SNSClientConfig","connectionString: string"],"sources":["../src/sns/SNSConnection.ts"],"sourcesContent":["import { SNSClient, type SNSClientConfig } from '@aws-sdk/client-sns';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface SNSConnectionConfig {\n topicArn: string;\n region?: string;\n endpoint?: string; // Custom endpoint (e.g., for LocalStack)\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n}\n\nexport class SNSConnection implements EventConnection {\n readonly type = EventPublisherType.SNS;\n private client: SNSClient;\n private connected = false;\n private config: SNSConnectionConfig;\n\n constructor(config: SNSConnectionConfig) {\n this.config = config;\n\n const clientConfig: SNSClientConfig = {\n region: config.region,\n endpoint: config.endpoint,\n credentials: config.credentials,\n };\n\n this.client = new SNSClient(clientConfig);\n }\n\n /**\n * Create an SNSConnection from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString(\n connectionString: string,\n ): Promise<SNSConnection> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const topicArn = params.get('topicArn');\n if (!topicArn) {\n throw new Error('topicArn parameter is required in connection string');\n }\n\n const config: SNSConnectionConfig = {\n topicArn,\n region: params.get('region') || undefined,\n endpoint: params.get('endpoint') || undefined,\n };\n\n // Parse credentials if provided\n const accessKeyId = params.get('accessKeyId');\n const secretAccessKey = params.get('secretAccessKey');\n if (accessKeyId && secretAccessKey) {\n config.credentials = {\n accessKeyId,\n secretAccessKey,\n sessionToken: params.get('sessionToken') || undefined,\n };\n }\n\n const connection = new SNSConnection(config);\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n // SNS doesn't have a traditional connection, but we mark as connected\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.client.destroy();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying SNS client\n */\n get snsClient(): SNSClient {\n return this.client;\n }\n\n /**\n * Get the topic ARN for this connection\n */\n get topicArn(): string {\n return this.config.topicArn;\n }\n}\n"],"mappings":";;;;AAeA,IAAa,gBAAb,MAAa,cAAyC;CACpD,AAAS,OAAO,mBAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CACpB,AAAQ;CAER,YAAYA,QAA6B;AACvC,OAAK,SAAS;EAEd,MAAMC,eAAgC;GACpC,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,aAAa,OAAO;EACrB;AAED,OAAK,SAAS,IAAI,UAAU;CAC7B;;;;;CAMD,aAAa,qBACXC,kBACwB;EACxB,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,WAAW,OAAO,IAAI,WAAW;AACvC,OAAK,SACH,OAAM,IAAI,MAAM;EAGlB,MAAMF,SAA8B;GAClC;GACA,QAAQ,OAAO,IAAI,SAAS;GAC5B,UAAU,OAAO,IAAI,WAAW;EACjC;EAGD,MAAM,cAAc,OAAO,IAAI,cAAc;EAC7C,MAAM,kBAAkB,OAAO,IAAI,kBAAkB;AACrD,MAAI,eAAe,gBACjB,QAAO,cAAc;GACnB;GACA;GACA,cAAc,OAAO,IAAI,eAAe;EACzC;EAGH,MAAM,aAAa,IAAI,cAAc;AACrC,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAE7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,OAAO,SAAS;AACrB,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;CAKD,IAAI,YAAuB;AACzB,SAAO,KAAK;CACb;;;;CAKD,IAAI,WAAmB;AACrB,SAAO,KAAK,OAAO;CACpB;AACF"}
1
+ {"version":3,"file":"SNSConnection-DVEE3XoC.mjs","names":["config: SNSConnectionConfig","clientConfig: SNSClientConfig","connectionString: string"],"sources":["../src/sns/SNSConnection.ts"],"sourcesContent":["import { SNSClient, type SNSClientConfig } from '@aws-sdk/client-sns';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface SNSConnectionConfig {\n topicArn: string;\n region?: string;\n endpoint?: string; // Custom endpoint (e.g., for LocalStack)\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n}\n\nexport class SNSConnection implements EventConnection {\n readonly type = EventPublisherType.SNS;\n private client: SNSClient;\n private connected = false;\n private config: SNSConnectionConfig;\n\n constructor(config: SNSConnectionConfig) {\n this.config = config;\n\n const clientConfig: SNSClientConfig = {\n region: config.region,\n endpoint: config.endpoint,\n credentials: config.credentials,\n };\n\n this.client = new SNSClient(clientConfig);\n }\n\n /**\n * Create an SNSConnection from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString(\n connectionString: string,\n ): Promise<SNSConnection> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const topicArn = params.get('topicArn');\n if (!topicArn) {\n throw new Error('topicArn parameter is required in connection string');\n }\n\n const config: SNSConnectionConfig = {\n topicArn,\n region: params.get('region') || undefined,\n endpoint: params.get('endpoint') || undefined,\n };\n\n // Parse credentials if provided\n const accessKeyId = params.get('accessKeyId');\n const secretAccessKey = params.get('secretAccessKey');\n if (accessKeyId && secretAccessKey) {\n config.credentials = {\n accessKeyId,\n secretAccessKey,\n sessionToken: params.get('sessionToken') || undefined,\n };\n }\n\n const connection = new SNSConnection(config);\n await connection.connect();\n return connection;\n }\n\n async connect(): Promise<void> {\n // SNS doesn't have a traditional connection, but we mark as connected\n this.connected = true;\n }\n\n async close(): Promise<void> {\n this.client.destroy();\n this.connected = false;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the underlying SNS client\n */\n get snsClient(): SNSClient {\n return this.client;\n }\n\n /**\n * Get the topic ARN for this connection\n */\n get topicArn(): string {\n return this.config.topicArn;\n }\n}\n"],"mappings":";;;;AAeA,IAAa,gBAAb,MAAa,cAAyC;CACpD,AAAS,OAAO,mBAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CACpB,AAAQ;CAER,YAAYA,QAA6B;AACvC,OAAK,SAAS;EAEd,MAAMC,eAAgC;GACpC,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,aAAa,OAAO;EACrB;AAED,OAAK,SAAS,IAAI,UAAU;CAC7B;;;;;CAMD,aAAa,qBACXC,kBACwB;EACxB,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,WAAW,OAAO,IAAI,WAAW;AACvC,OAAK,SACH,OAAM,IAAI,MAAM;EAGlB,MAAMF,SAA8B;GAClC;GACA,QAAQ,OAAO,IAAI,SAAS;GAC5B,UAAU,OAAO,IAAI,WAAW;EACjC;EAGD,MAAM,cAAc,OAAO,IAAI,cAAc;EAC7C,MAAM,kBAAkB,OAAO,IAAI,kBAAkB;AACrD,MAAI,eAAe,gBACjB,QAAO,cAAc;GACnB;GACA;GACA,cAAc,OAAO,IAAI,eAAe;EACzC;EAGH,MAAM,aAAa,IAAI,cAAc;AACrC,QAAM,WAAW,SAAS;AAC1B,SAAO;CACR;CAED,MAAM,UAAyB;AAE7B,OAAK,YAAY;CAClB;CAED,MAAM,QAAuB;AAC3B,OAAK,OAAO,SAAS;AACrB,OAAK,YAAY;CAClB;CAED,cAAuB;AACrB,SAAO,KAAK;CACb;;;;CAKD,IAAI,YAAuB;AACzB,SAAO,KAAK;CACb;;;;CAKD,IAAI,WAAmB;AACrB,SAAO,KAAK,OAAO;CACpB;AACF"}
@@ -45,4 +45,4 @@ Object.defineProperty(exports, 'SNSPublisher', {
45
45
  return SNSPublisher;
46
46
  }
47
47
  });
48
- //# sourceMappingURL=SNSPublisher-BZ6N3JI9.cjs.map
48
+ //# sourceMappingURL=SNSPublisher-DbWVH-g_.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SNSPublisher-BZ6N3JI9.cjs","names":["connection: SNSConnection","options: SNSPublisherOptions","connectionString: string","messages: TMessage[]","message: TMessage","PublishCommand"],"sources":["../src/sns/SNSPublisher.ts"],"sourcesContent":["import { PublishCommand } from '@aws-sdk/client-sns';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSPublisherOptions {\n // Optional publisher-specific options\n}\n\nexport class SNSPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(\n private connection: SNSConnection,\n private options: SNSPublisherOptions = {},\n ) {}\n\n /**\n * Create an SNSPublisher from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSPublisher<TMessage>> {\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n return new SNSPublisher<TMessage>(connection);\n }\n\n async publish(messages: TMessage[]): Promise<void> {\n if (messages.length === 0) return;\n\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n // Publish all messages\n await Promise.all(messages.map((message) => this.publishMessage(message)));\n }\n\n private async publishMessage(message: TMessage): Promise<void> {\n const command = new PublishCommand({\n TopicArn: this.connection.topicArn,\n Message: JSON.stringify({\n type: message.type,\n payload: message.payload,\n }),\n MessageAttributes: {\n type: {\n DataType: 'String',\n StringValue: message.type,\n },\n },\n });\n\n await this.connection.snsClient.send(command);\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,eAAb,MAAa,aAEb;CACE,YACUA,YACAC,UAA+B,CAAE,GACzC;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAA2D;EAC3D,MAAM,EAAE,eAAe,GAAG,2CAAM;EAChC,MAAM,aACJ,MAAM,cAAc,qBAAqB,iBAAiB;AAE5D,SAAO,IAAI,aAAuB;CACnC;CAED,MAAM,QAAQC,UAAqC;AACjD,MAAI,SAAS,WAAW,EAAG;AAE3B,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;AAIjC,QAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY,KAAK,eAAe,QAAQ,CAAC,CAAC;CAC3E;CAED,MAAc,eAAeC,SAAkC;EAC7D,MAAM,UAAU,IAAIC,oCAAe;GACjC,UAAU,KAAK,WAAW;GAC1B,SAAS,KAAK,UAAU;IACtB,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB,EAAC;GACF,mBAAmB,EACjB,MAAM;IACJ,UAAU;IACV,aAAa,QAAQ;GACtB,EACF;EACF;AAED,QAAM,KAAK,WAAW,UAAU,KAAK,QAAQ;CAC9C;CAED,MAAM,QAAuB,CAG5B;AACF"}
1
+ {"version":3,"file":"SNSPublisher-DbWVH-g_.cjs","names":["connection: SNSConnection","options: SNSPublisherOptions","connectionString: string","messages: TMessage[]","message: TMessage","PublishCommand"],"sources":["../src/sns/SNSPublisher.ts"],"sourcesContent":["import { PublishCommand } from '@aws-sdk/client-sns';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSPublisherOptions {\n // Optional publisher-specific options\n}\n\nexport class SNSPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(\n private connection: SNSConnection,\n private options: SNSPublisherOptions = {},\n ) {}\n\n /**\n * Create an SNSPublisher from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSPublisher<TMessage>> {\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n return new SNSPublisher<TMessage>(connection);\n }\n\n async publish(messages: TMessage[]): Promise<void> {\n if (messages.length === 0) return;\n\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n // Publish all messages\n await Promise.all(messages.map((message) => this.publishMessage(message)));\n }\n\n private async publishMessage(message: TMessage): Promise<void> {\n const command = new PublishCommand({\n TopicArn: this.connection.topicArn,\n Message: JSON.stringify({\n type: message.type,\n payload: message.payload,\n }),\n MessageAttributes: {\n type: {\n DataType: 'String',\n StringValue: message.type,\n },\n },\n });\n\n await this.connection.snsClient.send(command);\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,eAAb,MAAa,aAEb;CACE,YACUA,YACAC,UAA+B,CAAE,GACzC;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAA2D;EAC3D,MAAM,EAAE,eAAe,GAAG,2CAAM;EAChC,MAAM,aACJ,MAAM,cAAc,qBAAqB,iBAAiB;AAE5D,SAAO,IAAI,aAAuB;CACnC;CAED,MAAM,QAAQC,UAAqC;AACjD,MAAI,SAAS,WAAW,EAAG;AAE3B,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;AAIjC,QAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY,KAAK,eAAe,QAAQ,CAAC,CAAC;CAC3E;CAED,MAAc,eAAeC,SAAkC;EAC7D,MAAM,UAAU,IAAIC,oCAAe;GACjC,UAAU,KAAK,WAAW;GAC1B,SAAS,KAAK,UAAU;IACtB,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB,EAAC;GACF,mBAAmB,EACjB,MAAM;IACJ,UAAU;IACV,aAAa,QAAQ;GACtB,EACF;EACF;AAED,QAAM,KAAK,WAAW,UAAU,KAAK,QAAQ;CAC9C;CAED,MAAM,QAAuB,CAG5B;AACF"}
@@ -39,4 +39,4 @@ var SNSPublisher = class SNSPublisher {
39
39
 
40
40
  //#endregion
41
41
  export { SNSPublisher };
42
- //# sourceMappingURL=SNSPublisher-BfWjzNiB.mjs.map
42
+ //# sourceMappingURL=SNSPublisher-Do-FMUyT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SNSPublisher-BfWjzNiB.mjs","names":["connection: SNSConnection","options: SNSPublisherOptions","connectionString: string","messages: TMessage[]","message: TMessage"],"sources":["../src/sns/SNSPublisher.ts"],"sourcesContent":["import { PublishCommand } from '@aws-sdk/client-sns';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSPublisherOptions {\n // Optional publisher-specific options\n}\n\nexport class SNSPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(\n private connection: SNSConnection,\n private options: SNSPublisherOptions = {},\n ) {}\n\n /**\n * Create an SNSPublisher from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSPublisher<TMessage>> {\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n return new SNSPublisher<TMessage>(connection);\n }\n\n async publish(messages: TMessage[]): Promise<void> {\n if (messages.length === 0) return;\n\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n // Publish all messages\n await Promise.all(messages.map((message) => this.publishMessage(message)));\n }\n\n private async publishMessage(message: TMessage): Promise<void> {\n const command = new PublishCommand({\n TopicArn: this.connection.topicArn,\n Message: JSON.stringify({\n type: message.type,\n payload: message.payload,\n }),\n MessageAttributes: {\n type: {\n DataType: 'String',\n StringValue: message.type,\n },\n },\n });\n\n await this.connection.snsClient.send(command);\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,eAAb,MAAa,aAEb;CACE,YACUA,YACAC,UAA+B,CAAE,GACzC;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAA2D;EAC3D,MAAM,EAAE,eAAe,GAAG,MAAM,OAAO;EACvC,MAAM,aACJ,MAAM,cAAc,qBAAqB,iBAAiB;AAE5D,SAAO,IAAI,aAAuB;CACnC;CAED,MAAM,QAAQC,UAAqC;AACjD,MAAI,SAAS,WAAW,EAAG;AAE3B,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;AAIjC,QAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY,KAAK,eAAe,QAAQ,CAAC,CAAC;CAC3E;CAED,MAAc,eAAeC,SAAkC;EAC7D,MAAM,UAAU,IAAI,eAAe;GACjC,UAAU,KAAK,WAAW;GAC1B,SAAS,KAAK,UAAU;IACtB,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB,EAAC;GACF,mBAAmB,EACjB,MAAM;IACJ,UAAU;IACV,aAAa,QAAQ;GACtB,EACF;EACF;AAED,QAAM,KAAK,WAAW,UAAU,KAAK,QAAQ;CAC9C;CAED,MAAM,QAAuB,CAG5B;AACF"}
1
+ {"version":3,"file":"SNSPublisher-Do-FMUyT.mjs","names":["connection: SNSConnection","options: SNSPublisherOptions","connectionString: string","messages: TMessage[]","message: TMessage"],"sources":["../src/sns/SNSPublisher.ts"],"sourcesContent":["import { PublishCommand } from '@aws-sdk/client-sns';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSPublisherOptions {\n // Optional publisher-specific options\n}\n\nexport class SNSPublisher<TMessage extends PublishableMessage<string, any>>\n implements EventPublisher<TMessage>\n{\n constructor(\n private connection: SNSConnection,\n private options: SNSPublisherOptions = {},\n ) {}\n\n /**\n * Create an SNSPublisher from a connection string\n * Format: sns://?topicArn=arn:aws:sns:region:account:topic&region=us-east-1&endpoint=http://localhost:4566\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSPublisher<TMessage>> {\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n return new SNSPublisher<TMessage>(connection);\n }\n\n async publish(messages: TMessage[]): Promise<void> {\n if (messages.length === 0) return;\n\n if (!this.connection.isConnected()) {\n await this.connection.connect();\n }\n\n // Publish all messages\n await Promise.all(messages.map((message) => this.publishMessage(message)));\n }\n\n private async publishMessage(message: TMessage): Promise<void> {\n const command = new PublishCommand({\n TopicArn: this.connection.topicArn,\n Message: JSON.stringify({\n type: message.type,\n payload: message.payload,\n }),\n MessageAttributes: {\n type: {\n DataType: 'String',\n StringValue: message.type,\n },\n },\n });\n\n await this.connection.snsClient.send(command);\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,eAAb,MAAa,aAEb;CACE,YACUA,YACAC,UAA+B,CAAE,GACzC;EAFQ;EACA;CACN;;;;;CAMJ,aAAa,qBAEXC,kBAA2D;EAC3D,MAAM,EAAE,eAAe,GAAG,MAAM,OAAO;EACvC,MAAM,aACJ,MAAM,cAAc,qBAAqB,iBAAiB;AAE5D,SAAO,IAAI,aAAuB;CACnC;CAED,MAAM,QAAQC,UAAqC;AACjD,MAAI,SAAS,WAAW,EAAG;AAE3B,OAAK,KAAK,WAAW,aAAa,CAChC,OAAM,KAAK,WAAW,SAAS;AAIjC,QAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY,KAAK,eAAe,QAAQ,CAAC,CAAC;CAC3E;CAED,MAAc,eAAeC,SAAkC;EAC7D,MAAM,UAAU,IAAI,eAAe;GACjC,UAAU,KAAK,WAAW;GAC1B,SAAS,KAAK,UAAU;IACtB,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB,EAAC;GACF,mBAAmB,EACjB,MAAM;IACJ,UAAU;IACV,aAAa,QAAQ;GACtB,EACF;EACF;AAED,QAAM,KAAK,WAAW,UAAU,KAAK,QAAQ;CAC9C;CAED,MAAM,QAAuB,CAG5B;AACF"}
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_SQSConnection = require('./SQSConnection-BwNjUPr4.cjs');
3
- const require_SQSSubscriber = require('./SQSSubscriber-DZDNgLE5.cjs');
2
+ const require_SQSConnection = require('./SQSConnection-DWYDtftQ.cjs');
3
+ const require_SQSSubscriber = require('./SQSSubscriber-DcL9BbG1.cjs');
4
4
  const __aws_sdk_client_sns = require_chunk.__toESM(require("@aws-sdk/client-sns"));
5
5
  const __aws_sdk_client_sqs = require_chunk.__toESM(require("@aws-sdk/client-sqs"));
6
6
 
@@ -146,4 +146,4 @@ Object.defineProperty(exports, 'SNSSubscriber', {
146
146
  return SNSSubscriber;
147
147
  }
148
148
  });
149
- //# sourceMappingURL=SNSSubscriber-UE0ia4XM.cjs.map
149
+ //# sourceMappingURL=SNSSubscriber-DpEwQ8Tb.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SNSSubscriber-UE0ia4XM.cjs","names":["connection: SNSConnection","options: SNSSubscriberOptions","SQSClient","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","SQSConnection","SQSSubscriber","UnsubscribeCommand","DeleteQueueCommand","CreateQueueCommand","GetQueueAttributesCommand","SetQueueAttributesCommand","SubscribeCommand"],"sources":["../src/sns/SNSSubscriber.ts"],"sourcesContent":["import { SubscribeCommand, UnsubscribeCommand } from '@aws-sdk/client-sns';\nimport {\n CreateQueueCommand,\n DeleteQueueCommand,\n GetQueueAttributesCommand,\n SQSClient,\n SetQueueAttributesCommand,\n} from '@aws-sdk/client-sqs';\nimport { SQSConnection } from '../sqs/SQSConnection';\nimport { SQSSubscriber } from '../sqs/SQSSubscriber';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSSubscriberOptions {\n queueName?: string; // Optional queue name (defaults to auto-generated)\n createQueue?: boolean; // Auto-create SQS queue (default: true)\n deleteQueueOnClose?: boolean; // Delete queue when subscriber closes (default: false for named queues, true for auto-generated)\n waitTimeSeconds?: number; // SQS long polling (default: 20)\n maxMessages?: number; // Max messages per poll (default: 10)\n}\n\n/**\n * SNS Subscriber - receives push-based messages from SNS via SQS queue\n *\n * Architecture:\n * SNS Topic → (push) → SQS Queue → Subscriber\n *\n * This subscriber automatically:\n * 1. Creates an SQS queue (or uses existing one)\n * 2. Subscribes the queue to the SNS topic\n * 3. Receives messages pushed from SNS to the queue\n * 4. Filters messages by topic ARN and message type\n * 5. Processes and acknowledges messages\n *\n * Note: While SQS long-polling is used internally to receive messages,\n * this is an implementation detail of the SNS push delivery mechanism.\n * Messages are pushed from SNS to SQS, and we receive those pushed messages.\n */\nexport class SNSSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n private sqsClient: SQSClient;\n private queueUrl?: string;\n private queueArn?: string;\n private subscriptionArn?: string;\n private sqsSubscriber?: SQSSubscriber<TMessage>;\n private options: Required<SNSSubscriberOptions>;\n\n constructor(\n private connection: SNSConnection,\n options: SNSSubscriberOptions = {},\n ) {\n this.options = {\n queueName:\n options.queueName ||\n `sns-sub-${Date.now()}-${Math.random().toString(36).substring(7)}`,\n createQueue: options.createQueue ?? true,\n deleteQueueOnClose: options.deleteQueueOnClose ?? !options.queueName, // Delete auto-generated queues\n waitTimeSeconds: options.waitTimeSeconds ?? 20,\n maxMessages: options.maxMessages ?? 10,\n };\n\n // Create SQS client with same config as SNS\n this.sqsClient = new SQSClient({\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n }\n\n /**\n * Create an SNSSubscriber from a connection string\n * Format: sns://?topicArn=...&queueName=myqueue&region=us-east-1\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSSubscriber<TMessage>> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n const options: SNSSubscriberOptions = {\n queueName: params.get('queueName') || undefined,\n createQueue: params.get('createQueue') !== 'false',\n deleteQueueOnClose: params.get('deleteQueueOnClose') === 'true',\n waitTimeSeconds: params.get('waitTimeSeconds')\n ? Number.parseInt(params.get('waitTimeSeconds')!, 10)\n : undefined,\n };\n\n return new SNSSubscriber<TMessage>(connection, options);\n }\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n // Setup SQS queue and SNS subscription\n await this.setupQueue();\n await this.subscribeToTopic();\n\n // Create SQS connection for the subscriber\n const sqsConnection = new SQSConnection({\n queueUrl: this.queueUrl!,\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n await sqsConnection.connect();\n\n // Use SQSSubscriber to receive messages, with topic filtering\n this.sqsSubscriber = new SQSSubscriber<TMessage>(sqsConnection, {\n waitTimeSeconds: this.options.waitTimeSeconds,\n maxMessages: this.options.maxMessages,\n expectedTopicArn: this.connection.topicArn,\n });\n\n await this.sqsSubscriber.subscribe(messages, listener);\n }\n\n /**\n * Stop receiving messages and clean up resources\n */\n async stop(): Promise<void> {\n // Stop SQS subscriber\n if (this.sqsSubscriber) {\n this.sqsSubscriber.stop();\n }\n\n // Unsubscribe from topic\n if (this.subscriptionArn) {\n try {\n const command = new UnsubscribeCommand({\n SubscriptionArn: this.subscriptionArn,\n });\n await this.connection.snsClient.send(command);\n } catch (error) {\n console.error('Error unsubscribing:', error);\n }\n }\n\n // Delete queue if configured\n if (this.queueUrl && this.options.deleteQueueOnClose) {\n try {\n const command = new DeleteQueueCommand({\n QueueUrl: this.queueUrl,\n });\n await this.sqsClient.send(command);\n } catch (error) {\n console.error('Error deleting queue:', error);\n }\n }\n\n this.sqsClient.destroy();\n }\n\n private async setupQueue(): Promise<void> {\n if (this.options.createQueue) {\n // Create queue\n const createCommand = new CreateQueueCommand({\n QueueName: this.options.queueName,\n });\n const response = await this.sqsClient.send(createCommand);\n this.queueUrl = response.QueueUrl!;\n } else {\n throw new Error('Queue must exist or createQueue option must be true');\n }\n\n // Get queue ARN\n const attrsCommand = new GetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n AttributeNames: ['QueueArn'],\n });\n const attrsResponse = await this.sqsClient.send(attrsCommand);\n this.queueArn = attrsResponse.Attributes?.QueueArn!;\n\n // Set queue policy to allow SNS\n await this.setQueuePolicy();\n }\n\n private async setQueuePolicy(): Promise<void> {\n const policy = {\n Version: '2012-10-17',\n Statement: [\n {\n Effect: 'Allow',\n Principal: '*',\n Action: 'SQS:SendMessage',\n Resource: this.queueArn,\n Condition: {\n ArnEquals: {\n 'aws:SourceArn': this.connection.topicArn,\n },\n },\n },\n ],\n };\n\n const command = new SetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n Attributes: {\n Policy: JSON.stringify(policy),\n },\n });\n\n await this.sqsClient.send(command);\n }\n\n private async subscribeToTopic(): Promise<void> {\n const command = new SubscribeCommand({\n TopicArn: this.connection.topicArn,\n Protocol: 'sqs',\n Endpoint: this.queueArn,\n });\n\n const response = await this.connection.snsClient.send(command);\n this.subscriptionArn = response.SubscriptionArn!;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SNSSubscriber-DpEwQ8Tb.cjs","names":["connection: SNSConnection","options: SNSSubscriberOptions","SQSClient","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","SQSConnection","SQSSubscriber","UnsubscribeCommand","DeleteQueueCommand","CreateQueueCommand","GetQueueAttributesCommand","SetQueueAttributesCommand","SubscribeCommand"],"sources":["../src/sns/SNSSubscriber.ts"],"sourcesContent":["import { SubscribeCommand, UnsubscribeCommand } from '@aws-sdk/client-sns';\nimport {\n CreateQueueCommand,\n DeleteQueueCommand,\n GetQueueAttributesCommand,\n SQSClient,\n SetQueueAttributesCommand,\n} from '@aws-sdk/client-sqs';\nimport { SQSConnection } from '../sqs/SQSConnection';\nimport { SQSSubscriber } from '../sqs/SQSSubscriber';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSSubscriberOptions {\n queueName?: string; // Optional queue name (defaults to auto-generated)\n createQueue?: boolean; // Auto-create SQS queue (default: true)\n deleteQueueOnClose?: boolean; // Delete queue when subscriber closes (default: false for named queues, true for auto-generated)\n waitTimeSeconds?: number; // SQS long polling (default: 20)\n maxMessages?: number; // Max messages per poll (default: 10)\n}\n\n/**\n * SNS Subscriber - receives push-based messages from SNS via SQS queue\n *\n * Architecture:\n * SNS Topic → (push) → SQS Queue → Subscriber\n *\n * This subscriber automatically:\n * 1. Creates an SQS queue (or uses existing one)\n * 2. Subscribes the queue to the SNS topic\n * 3. Receives messages pushed from SNS to the queue\n * 4. Filters messages by topic ARN and message type\n * 5. Processes and acknowledges messages\n *\n * Note: While SQS long-polling is used internally to receive messages,\n * this is an implementation detail of the SNS push delivery mechanism.\n * Messages are pushed from SNS to SQS, and we receive those pushed messages.\n */\nexport class SNSSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n private sqsClient: SQSClient;\n private queueUrl?: string;\n private queueArn?: string;\n private subscriptionArn?: string;\n private sqsSubscriber?: SQSSubscriber<TMessage>;\n private options: Required<SNSSubscriberOptions>;\n\n constructor(\n private connection: SNSConnection,\n options: SNSSubscriberOptions = {},\n ) {\n this.options = {\n queueName:\n options.queueName ||\n `sns-sub-${Date.now()}-${Math.random().toString(36).substring(7)}`,\n createQueue: options.createQueue ?? true,\n deleteQueueOnClose: options.deleteQueueOnClose ?? !options.queueName, // Delete auto-generated queues\n waitTimeSeconds: options.waitTimeSeconds ?? 20,\n maxMessages: options.maxMessages ?? 10,\n };\n\n // Create SQS client with same config as SNS\n this.sqsClient = new SQSClient({\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n }\n\n /**\n * Create an SNSSubscriber from a connection string\n * Format: sns://?topicArn=...&queueName=myqueue&region=us-east-1\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSSubscriber<TMessage>> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n const options: SNSSubscriberOptions = {\n queueName: params.get('queueName') || undefined,\n createQueue: params.get('createQueue') !== 'false',\n deleteQueueOnClose: params.get('deleteQueueOnClose') === 'true',\n waitTimeSeconds: params.get('waitTimeSeconds')\n ? Number.parseInt(params.get('waitTimeSeconds')!, 10)\n : undefined,\n };\n\n return new SNSSubscriber<TMessage>(connection, options);\n }\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n // Setup SQS queue and SNS subscription\n await this.setupQueue();\n await this.subscribeToTopic();\n\n // Create SQS connection for the subscriber\n const sqsConnection = new SQSConnection({\n queueUrl: this.queueUrl!,\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n await sqsConnection.connect();\n\n // Use SQSSubscriber to receive messages, with topic filtering\n this.sqsSubscriber = new SQSSubscriber<TMessage>(sqsConnection, {\n waitTimeSeconds: this.options.waitTimeSeconds,\n maxMessages: this.options.maxMessages,\n expectedTopicArn: this.connection.topicArn,\n });\n\n await this.sqsSubscriber.subscribe(messages, listener);\n }\n\n /**\n * Stop receiving messages and clean up resources\n */\n async stop(): Promise<void> {\n // Stop SQS subscriber\n if (this.sqsSubscriber) {\n this.sqsSubscriber.stop();\n }\n\n // Unsubscribe from topic\n if (this.subscriptionArn) {\n try {\n const command = new UnsubscribeCommand({\n SubscriptionArn: this.subscriptionArn,\n });\n await this.connection.snsClient.send(command);\n } catch (error) {\n console.error('Error unsubscribing:', error);\n }\n }\n\n // Delete queue if configured\n if (this.queueUrl && this.options.deleteQueueOnClose) {\n try {\n const command = new DeleteQueueCommand({\n QueueUrl: this.queueUrl,\n });\n await this.sqsClient.send(command);\n } catch (error) {\n console.error('Error deleting queue:', error);\n }\n }\n\n this.sqsClient.destroy();\n }\n\n private async setupQueue(): Promise<void> {\n if (this.options.createQueue) {\n // Create queue\n const createCommand = new CreateQueueCommand({\n QueueName: this.options.queueName,\n });\n const response = await this.sqsClient.send(createCommand);\n this.queueUrl = response.QueueUrl!;\n } else {\n throw new Error('Queue must exist or createQueue option must be true');\n }\n\n // Get queue ARN\n const attrsCommand = new GetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n AttributeNames: ['QueueArn'],\n });\n const attrsResponse = await this.sqsClient.send(attrsCommand);\n this.queueArn = attrsResponse.Attributes?.QueueArn!;\n\n // Set queue policy to allow SNS\n await this.setQueuePolicy();\n }\n\n private async setQueuePolicy(): Promise<void> {\n const policy = {\n Version: '2012-10-17',\n Statement: [\n {\n Effect: 'Allow',\n Principal: '*',\n Action: 'SQS:SendMessage',\n Resource: this.queueArn,\n Condition: {\n ArnEquals: {\n 'aws:SourceArn': this.connection.topicArn,\n },\n },\n },\n ],\n };\n\n const command = new SetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n Attributes: {\n Policy: JSON.stringify(policy),\n },\n });\n\n await this.sqsClient.send(command);\n }\n\n private async subscribeToTopic(): Promise<void> {\n const command = new SubscribeCommand({\n TopicArn: this.connection.topicArn,\n Protocol: 'sqs',\n Endpoint: this.queueArn,\n });\n\n const response = await this.connection.snsClient.send(command);\n this.subscriptionArn = response.SubscriptionArn!;\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { SQSConnection } from "./SQSConnection-Eleqqre3.mjs";
2
- import { SQSSubscriber } from "./SQSSubscriber-CD66P7hH.mjs";
1
+ import { SQSConnection } from "./SQSConnection-BBlDWZLU.mjs";
2
+ import { SQSSubscriber } from "./SQSSubscriber-84pFnW1z.mjs";
3
3
  import { SubscribeCommand, UnsubscribeCommand } from "@aws-sdk/client-sns";
4
4
  import { CreateQueueCommand, DeleteQueueCommand, GetQueueAttributesCommand, SQSClient, SetQueueAttributesCommand } from "@aws-sdk/client-sqs";
5
5
 
@@ -140,4 +140,4 @@ var SNSSubscriber = class SNSSubscriber {
140
140
 
141
141
  //#endregion
142
142
  export { SNSSubscriber };
143
- //# sourceMappingURL=SNSSubscriber-C9YJWa7m.mjs.map
143
+ //# sourceMappingURL=SNSSubscriber-e7eG48yJ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SNSSubscriber-C9YJWa7m.mjs","names":["connection: SNSConnection","options: SNSSubscriberOptions","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>"],"sources":["../src/sns/SNSSubscriber.ts"],"sourcesContent":["import { SubscribeCommand, UnsubscribeCommand } from '@aws-sdk/client-sns';\nimport {\n CreateQueueCommand,\n DeleteQueueCommand,\n GetQueueAttributesCommand,\n SQSClient,\n SetQueueAttributesCommand,\n} from '@aws-sdk/client-sqs';\nimport { SQSConnection } from '../sqs/SQSConnection';\nimport { SQSSubscriber } from '../sqs/SQSSubscriber';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSSubscriberOptions {\n queueName?: string; // Optional queue name (defaults to auto-generated)\n createQueue?: boolean; // Auto-create SQS queue (default: true)\n deleteQueueOnClose?: boolean; // Delete queue when subscriber closes (default: false for named queues, true for auto-generated)\n waitTimeSeconds?: number; // SQS long polling (default: 20)\n maxMessages?: number; // Max messages per poll (default: 10)\n}\n\n/**\n * SNS Subscriber - receives push-based messages from SNS via SQS queue\n *\n * Architecture:\n * SNS Topic → (push) → SQS Queue → Subscriber\n *\n * This subscriber automatically:\n * 1. Creates an SQS queue (or uses existing one)\n * 2. Subscribes the queue to the SNS topic\n * 3. Receives messages pushed from SNS to the queue\n * 4. Filters messages by topic ARN and message type\n * 5. Processes and acknowledges messages\n *\n * Note: While SQS long-polling is used internally to receive messages,\n * this is an implementation detail of the SNS push delivery mechanism.\n * Messages are pushed from SNS to SQS, and we receive those pushed messages.\n */\nexport class SNSSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n private sqsClient: SQSClient;\n private queueUrl?: string;\n private queueArn?: string;\n private subscriptionArn?: string;\n private sqsSubscriber?: SQSSubscriber<TMessage>;\n private options: Required<SNSSubscriberOptions>;\n\n constructor(\n private connection: SNSConnection,\n options: SNSSubscriberOptions = {},\n ) {\n this.options = {\n queueName:\n options.queueName ||\n `sns-sub-${Date.now()}-${Math.random().toString(36).substring(7)}`,\n createQueue: options.createQueue ?? true,\n deleteQueueOnClose: options.deleteQueueOnClose ?? !options.queueName, // Delete auto-generated queues\n waitTimeSeconds: options.waitTimeSeconds ?? 20,\n maxMessages: options.maxMessages ?? 10,\n };\n\n // Create SQS client with same config as SNS\n this.sqsClient = new SQSClient({\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n }\n\n /**\n * Create an SNSSubscriber from a connection string\n * Format: sns://?topicArn=...&queueName=myqueue&region=us-east-1\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSSubscriber<TMessage>> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n const options: SNSSubscriberOptions = {\n queueName: params.get('queueName') || undefined,\n createQueue: params.get('createQueue') !== 'false',\n deleteQueueOnClose: params.get('deleteQueueOnClose') === 'true',\n waitTimeSeconds: params.get('waitTimeSeconds')\n ? Number.parseInt(params.get('waitTimeSeconds')!, 10)\n : undefined,\n };\n\n return new SNSSubscriber<TMessage>(connection, options);\n }\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n // Setup SQS queue and SNS subscription\n await this.setupQueue();\n await this.subscribeToTopic();\n\n // Create SQS connection for the subscriber\n const sqsConnection = new SQSConnection({\n queueUrl: this.queueUrl!,\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n await sqsConnection.connect();\n\n // Use SQSSubscriber to receive messages, with topic filtering\n this.sqsSubscriber = new SQSSubscriber<TMessage>(sqsConnection, {\n waitTimeSeconds: this.options.waitTimeSeconds,\n maxMessages: this.options.maxMessages,\n expectedTopicArn: this.connection.topicArn,\n });\n\n await this.sqsSubscriber.subscribe(messages, listener);\n }\n\n /**\n * Stop receiving messages and clean up resources\n */\n async stop(): Promise<void> {\n // Stop SQS subscriber\n if (this.sqsSubscriber) {\n this.sqsSubscriber.stop();\n }\n\n // Unsubscribe from topic\n if (this.subscriptionArn) {\n try {\n const command = new UnsubscribeCommand({\n SubscriptionArn: this.subscriptionArn,\n });\n await this.connection.snsClient.send(command);\n } catch (error) {\n console.error('Error unsubscribing:', error);\n }\n }\n\n // Delete queue if configured\n if (this.queueUrl && this.options.deleteQueueOnClose) {\n try {\n const command = new DeleteQueueCommand({\n QueueUrl: this.queueUrl,\n });\n await this.sqsClient.send(command);\n } catch (error) {\n console.error('Error deleting queue:', error);\n }\n }\n\n this.sqsClient.destroy();\n }\n\n private async setupQueue(): Promise<void> {\n if (this.options.createQueue) {\n // Create queue\n const createCommand = new CreateQueueCommand({\n QueueName: this.options.queueName,\n });\n const response = await this.sqsClient.send(createCommand);\n this.queueUrl = response.QueueUrl!;\n } else {\n throw new Error('Queue must exist or createQueue option must be true');\n }\n\n // Get queue ARN\n const attrsCommand = new GetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n AttributeNames: ['QueueArn'],\n });\n const attrsResponse = await this.sqsClient.send(attrsCommand);\n this.queueArn = attrsResponse.Attributes?.QueueArn!;\n\n // Set queue policy to allow SNS\n await this.setQueuePolicy();\n }\n\n private async setQueuePolicy(): Promise<void> {\n const policy = {\n Version: '2012-10-17',\n Statement: [\n {\n Effect: 'Allow',\n Principal: '*',\n Action: 'SQS:SendMessage',\n Resource: this.queueArn,\n Condition: {\n ArnEquals: {\n 'aws:SourceArn': this.connection.topicArn,\n },\n },\n },\n ],\n };\n\n const command = new SetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n Attributes: {\n Policy: JSON.stringify(policy),\n },\n });\n\n await this.sqsClient.send(command);\n }\n\n private async subscribeToTopic(): Promise<void> {\n const command = new SubscribeCommand({\n TopicArn: this.connection.topicArn,\n Protocol: 'sqs',\n Endpoint: this.queueArn,\n });\n\n const response = await this.connection.snsClient.send(command);\n this.subscriptionArn = response.SubscriptionArn!;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SNSSubscriber-e7eG48yJ.mjs","names":["connection: SNSConnection","options: SNSSubscriberOptions","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>"],"sources":["../src/sns/SNSSubscriber.ts"],"sourcesContent":["import { SubscribeCommand, UnsubscribeCommand } from '@aws-sdk/client-sns';\nimport {\n CreateQueueCommand,\n DeleteQueueCommand,\n GetQueueAttributesCommand,\n SQSClient,\n SetQueueAttributesCommand,\n} from '@aws-sdk/client-sqs';\nimport { SQSConnection } from '../sqs/SQSConnection';\nimport { SQSSubscriber } from '../sqs/SQSSubscriber';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SNSConnection } from './SNSConnection';\n\nexport interface SNSSubscriberOptions {\n queueName?: string; // Optional queue name (defaults to auto-generated)\n createQueue?: boolean; // Auto-create SQS queue (default: true)\n deleteQueueOnClose?: boolean; // Delete queue when subscriber closes (default: false for named queues, true for auto-generated)\n waitTimeSeconds?: number; // SQS long polling (default: 20)\n maxMessages?: number; // Max messages per poll (default: 10)\n}\n\n/**\n * SNS Subscriber - receives push-based messages from SNS via SQS queue\n *\n * Architecture:\n * SNS Topic → (push) → SQS Queue → Subscriber\n *\n * This subscriber automatically:\n * 1. Creates an SQS queue (or uses existing one)\n * 2. Subscribes the queue to the SNS topic\n * 3. Receives messages pushed from SNS to the queue\n * 4. Filters messages by topic ARN and message type\n * 5. Processes and acknowledges messages\n *\n * Note: While SQS long-polling is used internally to receive messages,\n * this is an implementation detail of the SNS push delivery mechanism.\n * Messages are pushed from SNS to SQS, and we receive those pushed messages.\n */\nexport class SNSSubscriber<TMessage extends PublishableMessage<string, any>>\n implements EventSubscriber<TMessage>\n{\n private sqsClient: SQSClient;\n private queueUrl?: string;\n private queueArn?: string;\n private subscriptionArn?: string;\n private sqsSubscriber?: SQSSubscriber<TMessage>;\n private options: Required<SNSSubscriberOptions>;\n\n constructor(\n private connection: SNSConnection,\n options: SNSSubscriberOptions = {},\n ) {\n this.options = {\n queueName:\n options.queueName ||\n `sns-sub-${Date.now()}-${Math.random().toString(36).substring(7)}`,\n createQueue: options.createQueue ?? true,\n deleteQueueOnClose: options.deleteQueueOnClose ?? !options.queueName, // Delete auto-generated queues\n waitTimeSeconds: options.waitTimeSeconds ?? 20,\n maxMessages: options.maxMessages ?? 10,\n };\n\n // Create SQS client with same config as SNS\n this.sqsClient = new SQSClient({\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n }\n\n /**\n * Create an SNSSubscriber from a connection string\n * Format: sns://?topicArn=...&queueName=myqueue&region=us-east-1\n */\n static async fromConnectionString<\n TMessage extends PublishableMessage<string, any>,\n >(connectionString: string): Promise<SNSSubscriber<TMessage>> {\n const url = new URL(connectionString);\n const params = url.searchParams;\n\n const { SNSConnection } = await import('./SNSConnection');\n const connection =\n await SNSConnection.fromConnectionString(connectionString);\n\n const options: SNSSubscriberOptions = {\n queueName: params.get('queueName') || undefined,\n createQueue: params.get('createQueue') !== 'false',\n deleteQueueOnClose: params.get('deleteQueueOnClose') === 'true',\n waitTimeSeconds: params.get('waitTimeSeconds')\n ? Number.parseInt(params.get('waitTimeSeconds')!, 10)\n : undefined,\n };\n\n return new SNSSubscriber<TMessage>(connection, options);\n }\n\n async subscribe(\n messages: TMessage['type'][],\n listener: (payload: TMessage) => Promise<void>,\n ): Promise<void> {\n // Setup SQS queue and SNS subscription\n await this.setupQueue();\n await this.subscribeToTopic();\n\n // Create SQS connection for the subscriber\n const sqsConnection = new SQSConnection({\n queueUrl: this.queueUrl!,\n region: (this.connection as any).config.region,\n endpoint: (this.connection as any).config.endpoint,\n credentials: (this.connection as any).config.credentials,\n });\n await sqsConnection.connect();\n\n // Use SQSSubscriber to receive messages, with topic filtering\n this.sqsSubscriber = new SQSSubscriber<TMessage>(sqsConnection, {\n waitTimeSeconds: this.options.waitTimeSeconds,\n maxMessages: this.options.maxMessages,\n expectedTopicArn: this.connection.topicArn,\n });\n\n await this.sqsSubscriber.subscribe(messages, listener);\n }\n\n /**\n * Stop receiving messages and clean up resources\n */\n async stop(): Promise<void> {\n // Stop SQS subscriber\n if (this.sqsSubscriber) {\n this.sqsSubscriber.stop();\n }\n\n // Unsubscribe from topic\n if (this.subscriptionArn) {\n try {\n const command = new UnsubscribeCommand({\n SubscriptionArn: this.subscriptionArn,\n });\n await this.connection.snsClient.send(command);\n } catch (error) {\n console.error('Error unsubscribing:', error);\n }\n }\n\n // Delete queue if configured\n if (this.queueUrl && this.options.deleteQueueOnClose) {\n try {\n const command = new DeleteQueueCommand({\n QueueUrl: this.queueUrl,\n });\n await this.sqsClient.send(command);\n } catch (error) {\n console.error('Error deleting queue:', error);\n }\n }\n\n this.sqsClient.destroy();\n }\n\n private async setupQueue(): Promise<void> {\n if (this.options.createQueue) {\n // Create queue\n const createCommand = new CreateQueueCommand({\n QueueName: this.options.queueName,\n });\n const response = await this.sqsClient.send(createCommand);\n this.queueUrl = response.QueueUrl!;\n } else {\n throw new Error('Queue must exist or createQueue option must be true');\n }\n\n // Get queue ARN\n const attrsCommand = new GetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n AttributeNames: ['QueueArn'],\n });\n const attrsResponse = await this.sqsClient.send(attrsCommand);\n this.queueArn = attrsResponse.Attributes?.QueueArn!;\n\n // Set queue policy to allow SNS\n await this.setQueuePolicy();\n }\n\n private async setQueuePolicy(): Promise<void> {\n const policy = {\n Version: '2012-10-17',\n Statement: [\n {\n Effect: 'Allow',\n Principal: '*',\n Action: 'SQS:SendMessage',\n Resource: this.queueArn,\n Condition: {\n ArnEquals: {\n 'aws:SourceArn': this.connection.topicArn,\n },\n },\n },\n ],\n };\n\n const command = new SetQueueAttributesCommand({\n QueueUrl: this.queueUrl,\n Attributes: {\n Policy: JSON.stringify(policy),\n },\n });\n\n await this.sqsClient.send(command);\n }\n\n private async subscribeToTopic(): Promise<void> {\n const command = new SubscribeCommand({\n TopicArn: this.connection.topicArn,\n Protocol: 'sqs',\n Endpoint: this.queueArn,\n });\n\n const response = await this.connection.snsClient.send(command);\n this.subscriptionArn = response.SubscriptionArn!;\n }\n}\n"],"mappings":"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"}
@@ -67,4 +67,4 @@ var SQSConnection = class SQSConnection {
67
67
 
68
68
  //#endregion
69
69
  export { SQSConnection };
70
- //# sourceMappingURL=SQSConnection-Eleqqre3.mjs.map
70
+ //# sourceMappingURL=SQSConnection-BBlDWZLU.mjs.map