@geekmidas/events 10.0.0-alpha.9 → 10.0.0-alpha.91

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 (137) hide show
  1. package/README.md +46 -1
  2. package/dist/SQSSubscriber-BEJBfNTe.mjs +264 -0
  3. package/dist/SQSSubscriber-BEJBfNTe.mjs.map +1 -0
  4. package/dist/SQSSubscriber-COTqWvOk.cjs +288 -0
  5. package/dist/SQSSubscriber-COTqWvOk.cjs.map +1 -0
  6. package/dist/basic/index.cjs +41 -11
  7. package/dist/basic/index.cjs.map +1 -1
  8. package/dist/basic/index.d.cts +11 -10
  9. package/dist/basic/index.d.cts.map +1 -1
  10. package/dist/basic/index.d.mts +11 -10
  11. package/dist/basic/index.d.mts.map +1 -1
  12. package/dist/basic/index.mjs +39 -10
  13. package/dist/basic/index.mjs.map +1 -1
  14. package/dist/index.cjs +47 -151
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +82 -26
  17. package/dist/index.d.cts.map +1 -1
  18. package/dist/index.d.mts +82 -26
  19. package/dist/index.d.mts.map +1 -1
  20. package/dist/index.mjs +34 -151
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/pgboss/index.cjs +198 -34
  23. package/dist/pgboss/index.cjs.map +1 -1
  24. package/dist/pgboss/index.d.cts +54 -12
  25. package/dist/pgboss/index.d.cts.map +1 -1
  26. package/dist/pgboss/index.d.mts +54 -12
  27. package/dist/pgboss/index.d.mts.map +1 -1
  28. package/dist/pgboss/index.mjs +193 -34
  29. package/dist/pgboss/index.mjs.map +1 -1
  30. package/dist/rabbitmq/index.cjs +173 -27
  31. package/dist/rabbitmq/index.cjs.map +1 -1
  32. package/dist/rabbitmq/index.d.cts +19 -10
  33. package/dist/rabbitmq/index.d.cts.map +1 -1
  34. package/dist/rabbitmq/index.d.mts +19 -10
  35. package/dist/rabbitmq/index.d.mts.map +1 -1
  36. package/dist/rabbitmq/index.mjs +169 -27
  37. package/dist/rabbitmq/index.mjs.map +1 -1
  38. package/dist/registry-DIx25Q5s.d.cts +255 -0
  39. package/dist/registry-DIx25Q5s.d.cts.map +1 -0
  40. package/dist/registry-DIx25Q5s.d.mts +255 -0
  41. package/dist/registry-DIx25Q5s.d.mts.map +1 -0
  42. package/dist/registry-DXLY1Xf6.mjs +99 -0
  43. package/dist/registry-DXLY1Xf6.mjs.map +1 -0
  44. package/dist/registry-DlT36229.cjs +122 -0
  45. package/dist/registry-DlT36229.cjs.map +1 -0
  46. package/dist/{chunk-CsX-DzYB.cjs → rolldown-runtime-C0BPl7ul.cjs} +17 -16
  47. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  48. package/dist/sns/index.cjs +403 -40
  49. package/dist/sns/index.cjs.map +1 -1
  50. package/dist/sns/index.d.cts +175 -11
  51. package/dist/sns/index.d.cts.map +1 -1
  52. package/dist/sns/index.d.mts +175 -11
  53. package/dist/sns/index.d.mts.map +1 -1
  54. package/dist/sns/index.mjs +372 -24
  55. package/dist/sns/index.mjs.map +1 -1
  56. package/dist/sns/snsUrl.cjs +91 -6
  57. package/dist/sns/snsUrl.cjs.map +1 -0
  58. package/dist/sns/snsUrl.d.cts +57 -2
  59. package/dist/sns/snsUrl.d.cts.map +1 -0
  60. package/dist/sns/snsUrl.d.mts +57 -2
  61. package/dist/sns/snsUrl.d.mts.map +1 -0
  62. package/dist/sns/snsUrl.mjs +81 -2
  63. package/dist/sns/snsUrl.mjs.map +1 -0
  64. package/dist/sqs/index.cjs +31 -65
  65. package/dist/sqs/index.cjs.map +1 -1
  66. package/dist/sqs/index.d.cts +28 -11
  67. package/dist/sqs/index.d.cts.map +1 -1
  68. package/dist/sqs/index.d.mts +28 -11
  69. package/dist/sqs/index.d.mts.map +1 -1
  70. package/dist/sqs/index.mjs +22 -58
  71. package/dist/sqs/index.mjs.map +1 -1
  72. package/dist/sqs/sqsUrl.cjs +92 -6
  73. package/dist/sqs/sqsUrl.cjs.map +1 -0
  74. package/dist/sqs/sqsUrl.d.cts +56 -2
  75. package/dist/sqs/sqsUrl.d.cts.map +1 -0
  76. package/dist/sqs/sqsUrl.d.mts +56 -2
  77. package/dist/sqs/sqsUrl.d.mts.map +1 -0
  78. package/dist/sqs/sqsUrl.mjs +82 -2
  79. package/dist/sqs/sqsUrl.mjs.map +1 -0
  80. package/dist/telemetry-DG3l807O.cjs +309 -0
  81. package/dist/telemetry-DG3l807O.cjs.map +1 -0
  82. package/dist/telemetry-DjjgJMul.mjs +244 -0
  83. package/dist/telemetry-DjjgJMul.mjs.map +1 -0
  84. package/package.json +8 -3
  85. package/dist/PgBossConnection-23soZ_aM.cjs +0 -80
  86. package/dist/PgBossConnection-23soZ_aM.cjs.map +0 -1
  87. package/dist/PgBossConnection-CCXhoNzb.cjs +0 -4
  88. package/dist/PgBossConnection-DvNbd4Zk.mjs +0 -74
  89. package/dist/PgBossConnection-DvNbd4Zk.mjs.map +0 -1
  90. package/dist/PgBossConnection-_gdM40JB.mjs +0 -4
  91. package/dist/RabbitMQConnection-BKEdCUro.cjs +0 -113
  92. package/dist/RabbitMQConnection-BKEdCUro.cjs.map +0 -1
  93. package/dist/RabbitMQConnection-CCOqDDnb.cjs +0 -4
  94. package/dist/RabbitMQConnection-DJEyM-Bu.mjs +0 -4
  95. package/dist/RabbitMQConnection-DJgUPc19.mjs +0 -107
  96. package/dist/RabbitMQConnection-DJgUPc19.mjs.map +0 -1
  97. package/dist/SNSConnection-B2K86hpz.cjs +0 -75
  98. package/dist/SNSConnection-B2K86hpz.cjs.map +0 -1
  99. package/dist/SNSConnection-BVo84FeW.mjs +0 -5
  100. package/dist/SNSConnection-DIHRjrQF.cjs +0 -5
  101. package/dist/SNSConnection-v9jjF99w.mjs +0 -69
  102. package/dist/SNSConnection-v9jjF99w.mjs.map +0 -1
  103. package/dist/SQSConnection-4tBMkVZE.mjs +0 -69
  104. package/dist/SQSConnection-4tBMkVZE.mjs.map +0 -1
  105. package/dist/SQSConnection-BBLAvF-1.cjs +0 -5
  106. package/dist/SQSConnection-BaC7rGhI.cjs +0 -75
  107. package/dist/SQSConnection-BaC7rGhI.cjs.map +0 -1
  108. package/dist/SQSConnection-DbavOq8_.mjs +0 -5
  109. package/dist/SQSSubscriber-BMWZ3s5q.mjs +0 -114
  110. package/dist/SQSSubscriber-BMWZ3s5q.mjs.map +0 -1
  111. package/dist/SQSSubscriber-YXPlg2rm.cjs +0 -120
  112. package/dist/SQSSubscriber-YXPlg2rm.cjs.map +0 -1
  113. package/dist/chunk-B9dir_RE.mjs +0 -11
  114. package/dist/snsUrl-ASdc0D1v.d.cts +0 -61
  115. package/dist/snsUrl-ASdc0D1v.d.cts.map +0 -1
  116. package/dist/snsUrl-CifYhPAa.mjs +0 -79
  117. package/dist/snsUrl-CifYhPAa.mjs.map +0 -1
  118. package/dist/snsUrl-FRbRcwF0.d.mts +0 -61
  119. package/dist/snsUrl-FRbRcwF0.d.mts.map +0 -1
  120. package/dist/snsUrl-f2gU3CzK.cjs +0 -114
  121. package/dist/snsUrl-f2gU3CzK.cjs.map +0 -1
  122. package/dist/sqsUrl-BV6zS-mi.d.mts +0 -60
  123. package/dist/sqsUrl-BV6zS-mi.d.mts.map +0 -1
  124. package/dist/sqsUrl-CbAsBFHI.mjs +0 -80
  125. package/dist/sqsUrl-CbAsBFHI.mjs.map +0 -1
  126. package/dist/sqsUrl-CdisN3GU.cjs +0 -115
  127. package/dist/sqsUrl-CdisN3GU.cjs.map +0 -1
  128. package/dist/sqsUrl-DZDPHxIk.d.cts +0 -60
  129. package/dist/sqsUrl-DZDPHxIk.d.cts.map +0 -1
  130. package/dist/types-BmixGrOD.d.cts +0 -67
  131. package/dist/types-BmixGrOD.d.cts.map +0 -1
  132. package/dist/types-Byv8N9ma.cjs +0 -24
  133. package/dist/types-Byv8N9ma.cjs.map +0 -1
  134. package/dist/types-CYDt-2RQ.mjs +0 -18
  135. package/dist/types-CYDt-2RQ.mjs.map +0 -1
  136. package/dist/types-DycjsYms.d.mts +0 -67
  137. package/dist/types-DycjsYms.d.mts.map +0 -1
@@ -1,6 +1,19 @@
1
- import { EventConnection, EventPublisher, EventPublisherType, EventSubscriber, PublishableMessage } from "../types-BmixGrOD.cjs";
1
+ import { d as EventPublisher, f as EventPublisherType, g as PublishableMessage, p as EventSubscriber, t as EventsDriver, u as EventConnection } from "../registry-DIx25Q5s.cjs";
2
2
  import amqplib from "amqplib";
3
-
3
+ //#region src/rabbitmq/driver.d.ts
4
+ /**
5
+ * `rabbitmq://` — an AMQP exchange. Register it with
6
+ * `registerEventsDriver(rabbitmqEventsDriver)`; this subpath is the only one
7
+ * that imports `amqplib`.
8
+ */
9
+ export declare const rabbitmqEventsDriver: EventsDriver;
10
+ //#endregion
11
+ //#region src/rabbitmq/errors.d.ts
12
+ /** The connection opened but has no channel to publish or consume on. */
13
+ export declare class RabbitMQChannelUnavailable extends Error {
14
+ constructor();
15
+ }
16
+ //#endregion
4
17
  //#region src/rabbitmq/RabbitMQConnection.d.ts
5
18
  interface RabbitMQConnectionConfig {
6
19
  url: string;
@@ -9,7 +22,7 @@ interface RabbitMQConnectionConfig {
9
22
  exchangeOptions?: amqplib.Options.AssertExchange;
10
23
  timeout?: number;
11
24
  }
12
- declare class RabbitMQConnection implements EventConnection {
25
+ export declare class RabbitMQConnection implements EventConnection {
13
26
  readonly type = EventPublisherType.RabbitMQ;
14
27
  private connection?;
15
28
  private channel?;
@@ -38,13 +51,12 @@ declare class RabbitMQConnection implements EventConnection {
38
51
  */
39
52
  get exchangeType(): string;
40
53
  }
41
- //# sourceMappingURL=RabbitMQConnection.d.ts.map
42
54
  //#endregion
43
55
  //#region src/rabbitmq/RabbitMQPublisher.d.ts
44
56
  interface RabbitMQPublisherOptions {
45
57
  publishOptions?: amqplib.Options.Publish;
46
58
  }
47
- declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
59
+ export declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
48
60
  private connection;
49
61
  private options;
50
62
  constructor(connection: RabbitMQConnection, options?: RabbitMQPublisherOptions);
@@ -56,7 +68,6 @@ declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>
56
68
  publish(messages: TMessage[]): Promise<void>;
57
69
  close(): Promise<void>;
58
70
  }
59
- //# sourceMappingURL=RabbitMQPublisher.d.ts.map
60
71
  //#endregion
61
72
  //#region src/rabbitmq/RabbitMQSubscriber.d.ts
62
73
  interface RabbitMQSubscriberOptions {
@@ -65,7 +76,7 @@ interface RabbitMQSubscriberOptions {
65
76
  consumeOptions?: amqplib.Options.Consume;
66
77
  prefetch?: number;
67
78
  }
68
- declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
79
+ export declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
69
80
  private connection;
70
81
  private options;
71
82
  constructor(connection: RabbitMQConnection, options?: RabbitMQSubscriberOptions);
@@ -76,8 +87,6 @@ declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any
76
87
  static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<RabbitMQSubscriber<TMessage>>;
77
88
  subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
78
89
  }
79
- //# sourceMappingURL=RabbitMQSubscriber.d.ts.map
80
-
81
90
  //#endregion
82
- export { RabbitMQConnection, RabbitMQConnectionConfig, RabbitMQPublisher, RabbitMQPublisherOptions, RabbitMQSubscriber, RabbitMQSubscriberOptions };
91
+ export type { RabbitMQConnectionConfig, RabbitMQPublisherOptions, RabbitMQSubscriberOptions };
83
92
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/rabbitmq/RabbitMQConnection.ts","../../src/rabbitmq/RabbitMQPublisher.ts","../../src/rabbitmq/RabbitMQSubscriber.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,wBAAA;EAAA,GAAA,EAAA,MAAA;EAQJ,QAAA,CAAA,EAAA,MAAA;EAAmB,YAAA,CAAA,EAAA,OAAA,GAAA,QAAA,GAAA,QAAA,GAAA,SAAA;EAAA,eAClB,CAAA,EALK,OAAA,CAAQ,OAAA,CAAQ,cAKrB;EAAA,OASO,CAAA,EAAA,MAAA;;AAmBjB,cA7BS,kBAAA,YAA8B,eA6BvC,CAAA;EAAO,SAoBO,IAAA,GAhDJ,kBAAA,CAAA,QAAA;EAgDW,QA6CT,UAAA;EAAO,QAwBH,OAAQ;EAAO,QAtHQ,UAAA;EAAe,QAAA,MAAA;sBAUrC;;;AClBrB;AAIA;EAA8B,OAAA,oBAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,EDiC1B,OCjC0B,CDiClB,kBCjCkB,CAAA;EAAA,OAAkB,CAAA,CAAA,EDqD9B,OCrD8B,CAAA,IAAA,CAAA;EAAkB,KACvC,CAAA,CAAA,EDiGX,OCjGW,CAAA,IAAA,CAAA;EAAQ,WAGb,CAAA,CAAA,EAAA,OAAA;EAAkB,QACrB,OAAA;EAA6B;;;EASO,IAAzB,WAAA,CAAA,CAAA,ED4GV,OAAA,CAAQ,OC5GE,GAAA,SAAA;EAAO;;;EAwCd,IArDX,YAAA,CAAA,CAAA,EAAA,MAAA;EAAc;;;;ACL1B;;;;UDAiB,wBAAA;EDAA,cAAA,CAAA,ECCC,OAAA,CAAQ,OAAA,CAAQ,ODGf;AAInB;AAAgC,cCJnB,iBDImB,CAAA,iBCJgB,kBDIhB,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,YCHpB,cDGoB,CCHL,QDGK,CAAA,CAAA;EAAA,QAClB,UAAA;EAAA,QASO,OAAA;EAAwB,WAmBjC,CAAA,UAAA,EC7BU,kBD6BV,EAAA,OAAA,CAAA,EC5BO,wBD4BP;EAAkB;;;;EAyFK,OAtHQ,oBAAA,CAAA,iBCSxB,kBDTwB,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,ECUb,ODVa,CCUL,iBDVK,CCUa,QDVb,CAAA,CAAA;EAAe,OAAA,CAAA,QAAA,ECiBjC,QDjBiC,EAAA,CAAA,ECiBpB,ODjBoB,CAAA,IAAA,CAAA;WCkD1C;;;;;UC1DC,yBAAA;EFAA,SAAA,CAAA,EAAA,MAAA;EAQJ,YAAA,CAAA,EENG,OAAA,CAAQ,OAAA,CAAQ,WFMA;EAAA,cAAA,CAAA,EELd,OAAA,CAAQ,OAAA,CAAQ,OFKF;EAAA,QAClB,CAAA,EAAA,MAAA;;AA4BF,cE9BC,kBF8BD,CAAA,iBE7BM,kBF6BN,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,YE5BC,eF4BD,CE5BiB,QF4BjB,CAAA,CAAA;EAAkB,QAA1B,UAAA;EAAO,QAoBO,OAAA;EAAO,WA6CT,CAAA,UAAA,EE1FM,kBF0FN,EAAA,OAAA,CAAA,EEzFG,yBFyFH;EAAO;;AA9FmC;;+CEavC,4DACW,QAAQ,mBAAmB;sBAmB7C,wCACU,aAAa,gBAC/B;AD3CJ;AAIA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/rabbitmq/driver.ts","../../src/rabbitmq/errors.ts","../../src/rabbitmq/RabbitMQConnection.ts","../../src/rabbitmq/RabbitMQPublisher.ts","../../src/rabbitmq/RabbitMQSubscriber.ts"],"mappings":";;;;;;;;qBAWa,sBAAsB;;;;qBCNtB,mCAAmC;EAC/C;;;;UCFgB;EAChB;EACA;EACA;EACA,kBAAkB,QAAQ,QAAQ;EAClC;;qBAGY,8BAA8B;WACjC,OAAI,mBAAA;UACL;UACA;UACA;UACA;EAKR,YAAY,QAAQ;;;;;SAiBP,qBACZ,2BACE,QAAQ;EAoBL,WAAW;EA6CX,SAAS;EAWf;UAIQ;;;;MASJ,eAAe,QAAQ;;;;MAOvB;;;;MAOA;;;;UC1IY;EAChB,iBAAiB,QAAQ,QAAQ;;qBAGrB,kBAAkB,iBAAiB,4CACpC,eAAe;UAGjB;UACA;EAFT,YACS,YAAY,oBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,kBAAkB;EAOjD,QAAQ,UAAU,aAAa;EA+C/B,SAAS;;;;UCxEC;EAChB;EACA,eAAe,QAAQ,QAAQ;EAC/B,iBAAiB,QAAQ,QAAQ;EACjC;;qBAGY,mBACZ,iBAAiB,4CACL,gBAAgB;UAGnB;UACA;EAFT,YACS,YAAY,oBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,mBAAmB;EAkBlD,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B"}
@@ -1,6 +1,19 @@
1
- import { EventConnection, EventPublisher, EventPublisherType, EventSubscriber, PublishableMessage } from "../types-DycjsYms.mjs";
1
+ import { d as EventPublisher, f as EventPublisherType, g as PublishableMessage, p as EventSubscriber, t as EventsDriver, u as EventConnection } from "../registry-DIx25Q5s.mjs";
2
2
  import amqplib from "amqplib";
3
-
3
+ //#region src/rabbitmq/driver.d.ts
4
+ /**
5
+ * `rabbitmq://` — an AMQP exchange. Register it with
6
+ * `registerEventsDriver(rabbitmqEventsDriver)`; this subpath is the only one
7
+ * that imports `amqplib`.
8
+ */
9
+ export declare const rabbitmqEventsDriver: EventsDriver;
10
+ //#endregion
11
+ //#region src/rabbitmq/errors.d.ts
12
+ /** The connection opened but has no channel to publish or consume on. */
13
+ export declare class RabbitMQChannelUnavailable extends Error {
14
+ constructor();
15
+ }
16
+ //#endregion
4
17
  //#region src/rabbitmq/RabbitMQConnection.d.ts
5
18
  interface RabbitMQConnectionConfig {
6
19
  url: string;
@@ -9,7 +22,7 @@ interface RabbitMQConnectionConfig {
9
22
  exchangeOptions?: amqplib.Options.AssertExchange;
10
23
  timeout?: number;
11
24
  }
12
- declare class RabbitMQConnection implements EventConnection {
25
+ export declare class RabbitMQConnection implements EventConnection {
13
26
  readonly type = EventPublisherType.RabbitMQ;
14
27
  private connection?;
15
28
  private channel?;
@@ -38,13 +51,12 @@ declare class RabbitMQConnection implements EventConnection {
38
51
  */
39
52
  get exchangeType(): string;
40
53
  }
41
- //# sourceMappingURL=RabbitMQConnection.d.ts.map
42
54
  //#endregion
43
55
  //#region src/rabbitmq/RabbitMQPublisher.d.ts
44
56
  interface RabbitMQPublisherOptions {
45
57
  publishOptions?: amqplib.Options.Publish;
46
58
  }
47
- declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
59
+ export declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
48
60
  private connection;
49
61
  private options;
50
62
  constructor(connection: RabbitMQConnection, options?: RabbitMQPublisherOptions);
@@ -56,7 +68,6 @@ declare class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>
56
68
  publish(messages: TMessage[]): Promise<void>;
57
69
  close(): Promise<void>;
58
70
  }
59
- //# sourceMappingURL=RabbitMQPublisher.d.ts.map
60
71
  //#endregion
61
72
  //#region src/rabbitmq/RabbitMQSubscriber.d.ts
62
73
  interface RabbitMQSubscriberOptions {
@@ -65,7 +76,7 @@ interface RabbitMQSubscriberOptions {
65
76
  consumeOptions?: amqplib.Options.Consume;
66
77
  prefetch?: number;
67
78
  }
68
- declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
79
+ export declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
69
80
  private connection;
70
81
  private options;
71
82
  constructor(connection: RabbitMQConnection, options?: RabbitMQSubscriberOptions);
@@ -76,8 +87,6 @@ declare class RabbitMQSubscriber<TMessage extends PublishableMessage<string, any
76
87
  static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<RabbitMQSubscriber<TMessage>>;
77
88
  subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
78
89
  }
79
- //# sourceMappingURL=RabbitMQSubscriber.d.ts.map
80
-
81
90
  //#endregion
82
- export { RabbitMQConnection, RabbitMQConnectionConfig, RabbitMQPublisher, RabbitMQPublisherOptions, RabbitMQSubscriber, RabbitMQSubscriberOptions };
91
+ export type { RabbitMQConnectionConfig, RabbitMQPublisherOptions, RabbitMQSubscriberOptions };
83
92
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/rabbitmq/RabbitMQConnection.ts","../../src/rabbitmq/RabbitMQPublisher.ts","../../src/rabbitmq/RabbitMQSubscriber.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,wBAAA;EAAA,GAAA,EAAA,MAAA;EAQJ,QAAA,CAAA,EAAA,MAAA;EAAmB,YAAA,CAAA,EAAA,OAAA,GAAA,QAAA,GAAA,QAAA,GAAA,SAAA;EAAA,eAClB,CAAA,EALK,OAAA,CAAQ,OAAA,CAAQ,cAKrB;EAAA,OASO,CAAA,EAAA,MAAA;;AAmBjB,cA7BS,kBAAA,YAA8B,eA6BvC,CAAA;EAAO,SAoBO,IAAA,GAhDJ,kBAAA,CAAA,QAAA;EAgDW,QA6CT,UAAA;EAAO,QAwBH,OAAQ;EAAO,QAtHQ,UAAA;EAAe,QAAA,MAAA;sBAUrC;;;AClBrB;AAIA;EAA8B,OAAA,oBAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,EDiC1B,OCjC0B,CDiClB,kBCjCkB,CAAA;EAAA,OAAkB,CAAA,CAAA,EDqD9B,OCrD8B,CAAA,IAAA,CAAA;EAAkB,KACvC,CAAA,CAAA,EDiGX,OCjGW,CAAA,IAAA,CAAA;EAAQ,WAGb,CAAA,CAAA,EAAA,OAAA;EAAkB,QACrB,OAAA;EAA6B;;;EASO,IAAzB,WAAA,CAAA,CAAA,ED4GV,OAAA,CAAQ,OC5GE,GAAA,SAAA;EAAO;;;EAwCd,IArDX,YAAA,CAAA,CAAA,EAAA,MAAA;EAAc;;;;ACL1B;;;;UDAiB,wBAAA;EDAA,cAAA,CAAA,ECCC,OAAA,CAAQ,OAAA,CAAQ,ODGf;AAInB;AAAgC,cCJnB,iBDImB,CAAA,iBCJgB,kBDIhB,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,YCHpB,cDGoB,CCHL,QDGK,CAAA,CAAA;EAAA,QAClB,UAAA;EAAA,QASO,OAAA;EAAwB,WAmBjC,CAAA,UAAA,EC7BU,kBD6BV,EAAA,OAAA,CAAA,EC5BO,wBD4BP;EAAkB;;;;EAyFK,OAtHQ,oBAAA,CAAA,iBCSxB,kBDTwB,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,ECUb,ODVa,CCUL,iBDVK,CCUa,QDVb,CAAA,CAAA;EAAe,OAAA,CAAA,QAAA,ECiBjC,QDjBiC,EAAA,CAAA,ECiBpB,ODjBoB,CAAA,IAAA,CAAA;WCkD1C;;;;;UC1DC,yBAAA;EFAA,SAAA,CAAA,EAAA,MAAA;EAQJ,YAAA,CAAA,EENG,OAAA,CAAQ,OAAA,CAAQ,WFMA;EAAA,cAAA,CAAA,EELd,OAAA,CAAQ,OAAA,CAAQ,OFKF;EAAA,QAClB,CAAA,EAAA,MAAA;;AA4BF,cE9BC,kBF8BD,CAAA,iBE7BM,kBF6BN,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,YE5BC,eF4BD,CE5BiB,QF4BjB,CAAA,CAAA;EAAkB,QAA1B,UAAA;EAAO,QAoBO,OAAA;EAAO,WA6CT,CAAA,UAAA,EE1FM,kBF0FN,EAAA,OAAA,CAAA,EEzFG,yBFyFH;EAAO;;AA9FmC;;+CEavC,4DACW,QAAQ,mBAAmB;sBAmB7C,wCACU,aAAa,gBAC/B;AD3CJ;AAIA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/rabbitmq/driver.ts","../../src/rabbitmq/errors.ts","../../src/rabbitmq/RabbitMQConnection.ts","../../src/rabbitmq/RabbitMQPublisher.ts","../../src/rabbitmq/RabbitMQSubscriber.ts"],"mappings":";;;;;;;;qBAWa,sBAAsB;;;;qBCNtB,mCAAmC;EAC/C;;;;UCFgB;EAChB;EACA;EACA;EACA,kBAAkB,QAAQ,QAAQ;EAClC;;qBAGY,8BAA8B;WACjC,OAAI,mBAAA;UACL;UACA;UACA;UACA;EAKR,YAAY,QAAQ;;;;;SAiBP,qBACZ,2BACE,QAAQ;EAoBL,WAAW;EA6CX,SAAS;EAWf;UAIQ;;;;MASJ,eAAe,QAAQ;;;;MAOvB;;;;MAOA;;;;UC1IY;EAChB,iBAAiB,QAAQ,QAAQ;;qBAGrB,kBAAkB,iBAAiB,4CACpC,eAAe;UAGjB;UACA;EAFT,YACS,YAAY,oBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,kBAAkB;EAOjD,QAAQ,UAAU,aAAa;EA+C/B,SAAS;;;;UCxEC;EAChB;EACA,eAAe,QAAQ,QAAQ;EAC/B,iBAAiB,QAAQ,QAAQ;EACjC;;qBAGY,mBACZ,iBAAiB,4CACL,gBAAgB;UAGnB;UACA;EAFT,YACS,YAAY,oBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,mBAAmB;EAkBlD,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B"}
@@ -1,8 +1,121 @@
1
- import "../types-CYDt-2RQ.mjs";
2
- import { RabbitMQConnection } from "../RabbitMQConnection-DJgUPc19.mjs";
3
-
1
+ import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
2
+ import { a as consumeTraced, r as carrierFromAttributes, s as publishTraced } from "../telemetry-DjjgJMul.mjs";
3
+ import amqplib from "amqplib";
4
+ //#region src/rabbitmq/RabbitMQConnection.ts
5
+ var RabbitMQConnection_exports = /* @__PURE__ */ __exportAll({ RabbitMQConnection: () => RabbitMQConnection });
6
+ var RabbitMQConnection = class RabbitMQConnection {
7
+ type = "rabbitmq";
8
+ connection;
9
+ channel;
10
+ connecting;
11
+ config;
12
+ constructor(config) {
13
+ this.config = {
14
+ ...config,
15
+ exchange: config.exchange || "geekmidas.events",
16
+ exchangeType: config.exchangeType || "topic",
17
+ timeout: config.timeout ?? 5e3,
18
+ exchangeOptions: {
19
+ durable: true,
20
+ ...config.exchangeOptions
21
+ }
22
+ };
23
+ }
24
+ /**
25
+ * Create a RabbitMQConnection from a connection string
26
+ * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
27
+ */
28
+ static async fromConnectionString(connectionString) {
29
+ const url = new URL(connectionString);
30
+ const params = url.searchParams;
31
+ const baseUrl = `amqp://${url.username ? `${url.username}:${url.password}@` : ""}${url.host}${url.pathname}`;
32
+ const timeoutParam = params.get("timeout");
33
+ const config = {
34
+ url: baseUrl,
35
+ exchange: params.get("exchange") || "geekmidas.events",
36
+ exchangeType: params.get("type") || "topic",
37
+ timeout: timeoutParam ? Number.parseInt(timeoutParam, 10) : void 0
38
+ };
39
+ const connection = new RabbitMQConnection(config);
40
+ await connection.connect();
41
+ return connection;
42
+ }
43
+ async connect() {
44
+ if (this.channel) return;
45
+ if (this.connecting) {
46
+ await this.connecting;
47
+ return;
48
+ }
49
+ this.connecting = (async () => {
50
+ try {
51
+ const connection = await amqplib.connect(this.config.url, { timeout: this.config.timeout });
52
+ const channel = await connection.createChannel();
53
+ await channel.assertExchange(this.config.exchange, this.config.exchangeType, this.config.exchangeOptions);
54
+ connection.on("error", (_err) => {
55
+ this.cleanup();
56
+ });
57
+ connection.on("close", () => {
58
+ this.cleanup();
59
+ });
60
+ this.connection = connection;
61
+ this.channel = channel;
62
+ } catch (error) {
63
+ this.cleanup();
64
+ throw error;
65
+ }
66
+ })();
67
+ await this.connecting;
68
+ this.connecting = void 0;
69
+ }
70
+ async close() {
71
+ try {
72
+ await this.channel?.close();
73
+ await this.connection?.close();
74
+ } catch (_error) {} finally {
75
+ this.cleanup();
76
+ }
77
+ }
78
+ isConnected() {
79
+ return !!this.channel;
80
+ }
81
+ cleanup() {
82
+ this.channel = void 0;
83
+ this.connection = void 0;
84
+ this.connecting = void 0;
85
+ }
86
+ /**
87
+ * Get the underlying channel for publishing/subscribing
88
+ */
89
+ get amqpChannel() {
90
+ return this.channel;
91
+ }
92
+ /**
93
+ * Get the exchange name for this connection
94
+ */
95
+ get exchangeName() {
96
+ return this.config.exchange;
97
+ }
98
+ /**
99
+ * Get the exchange type for this connection
100
+ */
101
+ get exchangeType() {
102
+ return this.config.exchangeType;
103
+ }
104
+ };
105
+ //#endregion
106
+ //#region src/rabbitmq/errors.ts
107
+ /** The connection opened but has no channel to publish or consume on. */
108
+ var RabbitMQChannelUnavailable = class extends Error {
109
+ constructor() {
110
+ super("RabbitMQ connected without a channel. Check the broker is reachable and the connection string names a vhost the user can open channels on.");
111
+ this.name = "RabbitMQChannelUnavailable";
112
+ }
113
+ };
114
+ //#endregion
4
115
  //#region src/rabbitmq/RabbitMQPublisher.ts
5
116
  var RabbitMQPublisher = class RabbitMQPublisher {
117
+ connection;
118
+ options;
6
119
  constructor(connection, options = {}) {
7
120
  this.connection = connection;
8
121
  this.options = options;
@@ -12,34 +125,44 @@ var RabbitMQPublisher = class RabbitMQPublisher {
12
125
  * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000
13
126
  */
14
127
  static async fromConnectionString(connectionString) {
15
- const { RabbitMQConnection: RabbitMQConnection$1 } = await import("../RabbitMQConnection-DJEyM-Bu.mjs");
16
- const connection = await RabbitMQConnection$1.fromConnectionString(connectionString);
128
+ const { RabbitMQConnection } = await Promise.resolve().then(() => RabbitMQConnection_exports);
129
+ const connection = await RabbitMQConnection.fromConnectionString(connectionString);
17
130
  return new RabbitMQPublisher(connection);
18
131
  }
19
132
  async publish(messages) {
20
133
  if (!this.connection.isConnected()) await this.connection.connect();
21
134
  const channel = this.connection.amqpChannel;
22
- if (!channel) throw new Error("Channel not initialized");
135
+ if (!channel) throw new RabbitMQChannelUnavailable();
23
136
  const exchange = this.connection.exchangeName;
24
- for (const message of messages) {
25
- const content = Buffer.from(JSON.stringify(message.payload));
26
- const routingKey = message.type;
27
- const published = channel.publish(exchange, routingKey, content, {
28
- contentType: "application/json",
29
- timestamp: Date.now(),
30
- type: message.type,
31
- persistent: true,
32
- ...this.options.publishOptions
33
- });
34
- if (!published) await new Promise((resolve) => channel.once("drain", resolve));
35
- }
137
+ await publishTraced(messages, (message) => ({
138
+ system: "rabbitmq",
139
+ destination: exchange,
140
+ type: message.type
141
+ }), async (carriers) => {
142
+ for (const [i, message] of messages.entries()) {
143
+ const content = Buffer.from(JSON.stringify(message.payload));
144
+ const { headers, ...publishOptions } = this.options.publishOptions ?? {};
145
+ if (!channel.publish(exchange, message.type, content, {
146
+ contentType: "application/json",
147
+ timestamp: Date.now(),
148
+ type: message.type,
149
+ persistent: true,
150
+ ...publishOptions,
151
+ ...(headers || carriers[i]) && { headers: {
152
+ ...headers,
153
+ ...carriers[i]
154
+ } }
155
+ })) await new Promise((resolve) => channel.once("drain", resolve));
156
+ }
157
+ });
36
158
  }
37
159
  async close() {}
38
160
  };
39
-
40
161
  //#endregion
41
162
  //#region src/rabbitmq/RabbitMQSubscriber.ts
42
163
  var RabbitMQSubscriber = class RabbitMQSubscriber {
164
+ connection;
165
+ options;
43
166
  constructor(connection, options = {}) {
44
167
  this.connection = connection;
45
168
  this.options = options;
@@ -49,10 +172,9 @@ var RabbitMQSubscriber = class RabbitMQSubscriber {
49
172
  * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10
50
173
  */
51
174
  static async fromConnectionString(connectionString) {
52
- const url = new URL(connectionString);
53
- const params = url.searchParams;
54
- const { RabbitMQConnection: RabbitMQConnection$1 } = await import("../RabbitMQConnection-DJEyM-Bu.mjs");
55
- const connection = await RabbitMQConnection$1.fromConnectionString(connectionString);
175
+ const params = new URL(connectionString).searchParams;
176
+ const { RabbitMQConnection } = await Promise.resolve().then(() => RabbitMQConnection_exports);
177
+ const connection = await RabbitMQConnection.fromConnectionString(connectionString);
56
178
  const options = {
57
179
  queueName: params.get("queueName") || void 0,
58
180
  prefetch: params.get("prefetch") ? Number.parseInt(params.get("prefetch"), 10) : void 0
@@ -62,7 +184,7 @@ var RabbitMQSubscriber = class RabbitMQSubscriber {
62
184
  async subscribe(messages, listener) {
63
185
  if (!this.connection.isConnected()) await this.connection.connect();
64
186
  const channel = this.connection.amqpChannel;
65
- if (!channel) throw new Error("Channel not initialized");
187
+ if (!channel) throw new RabbitMQChannelUnavailable();
66
188
  const exchange = this.connection.exchangeName;
67
189
  if (this.options.prefetch) await channel.prefetch(this.options.prefetch);
68
190
  const queueName = this.options.queueName || "";
@@ -82,7 +204,12 @@ var RabbitMQSubscriber = class RabbitMQSubscriber {
82
204
  type: messageType,
83
205
  payload
84
206
  };
85
- await listener(fullMessage);
207
+ await consumeTraced({
208
+ system: "rabbitmq",
209
+ destination: queue,
210
+ type: messageType,
211
+ messageId: msg.properties.messageId
212
+ }, carrierFromAttributes(msg.properties.headers), () => listener(fullMessage));
86
213
  channel.ack(msg);
87
214
  } catch (_error) {
88
215
  channel.nack(msg, false, true);
@@ -90,7 +217,22 @@ var RabbitMQSubscriber = class RabbitMQSubscriber {
90
217
  }, this.options.consumeOptions);
91
218
  }
92
219
  };
93
-
94
220
  //#endregion
95
- export { RabbitMQConnection, RabbitMQPublisher, RabbitMQSubscriber };
221
+ //#region src/rabbitmq/driver.ts
222
+ /**
223
+ * `rabbitmq://` — an AMQP exchange. Register it with
224
+ * `registerEventsDriver(rabbitmqEventsDriver)`; this subpath is the only one
225
+ * that imports `amqplib`.
226
+ */
227
+ const rabbitmqEventsDriver = {
228
+ scheme: "rabbitmq",
229
+ connect: (url) => RabbitMQConnection.fromConnectionString(url),
230
+ publisher: (url) => RabbitMQPublisher.fromConnectionString(url),
231
+ publisherFor: (connection) => new RabbitMQPublisher(connection),
232
+ subscriber: (url) => RabbitMQSubscriber.fromConnectionString(url),
233
+ subscriberFor: (connection) => new RabbitMQSubscriber(connection)
234
+ };
235
+ //#endregion
236
+ export { RabbitMQChannelUnavailable, RabbitMQConnection, RabbitMQPublisher, RabbitMQSubscriber, rabbitmqEventsDriver };
237
+
96
238
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["connection: RabbitMQConnection","options: RabbitMQPublisherOptions","connectionString: string","messages: TMessage[]","connection: RabbitMQConnection","options: RabbitMQSubscriberOptions","connectionString: string","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","queueOptions: amqplib.Options.AssertQueue","fullMessage: TMessage"],"sources":["../../src/rabbitmq/RabbitMQPublisher.ts","../../src/rabbitmq/RabbitMQSubscriber.ts"],"sourcesContent":["import type amqplib from 'amqplib';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQPublisherOptions {\n\tpublishOptions?: amqplib.Options.Publish;\n}\n\nexport class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: RabbitMQConnection,\n\t\tprivate options: RabbitMQPublisherOptions = {},\n\t) {}\n\n\t/**\n\t * Create a RabbitMQPublisher from a connection string\n\t * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<RabbitMQPublisher<TMessage>> {\n\t\tconst { RabbitMQConnection } = await import('./RabbitMQConnection');\n\t\tconst connection =\n\t\t\tawait RabbitMQConnection.fromConnectionString(connectionString);\n\t\treturn new RabbitMQPublisher<TMessage>(connection);\n\t}\n\n\tasync publish(messages: TMessage[]): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst channel = this.connection.amqpChannel;\n\t\tif (!channel) {\n\t\t\tthrow new Error('Channel not initialized');\n\t\t}\n\n\t\tconst exchange = this.connection.exchangeName;\n\n\t\tfor (const message of messages) {\n\t\t\tconst content = Buffer.from(JSON.stringify(message.payload));\n\n\t\t\t// Use message type as routing key for topic exchanges\n\t\t\tconst routingKey = message.type;\n\n\t\t\tconst published = channel.publish(exchange, routingKey, content, {\n\t\t\t\tcontentType: 'application/json',\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\ttype: message.type,\n\t\t\t\tpersistent: true,\n\t\t\t\t...this.options.publishOptions,\n\t\t\t});\n\n\t\t\t// Handle backpressure\n\t\t\tif (!published) {\n\t\t\t\tawait new Promise((resolve) => channel.once('drain', resolve));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\t// Publisher doesn't own the connection\n\t\t// Connection should be closed by whoever created it\n\t}\n}\n","import type amqplib from 'amqplib';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQSubscriberOptions {\n\tqueueName?: string; // If not provided, a unique queue will be generated\n\tqueueOptions?: amqplib.Options.AssertQueue;\n\tconsumeOptions?: amqplib.Options.Consume;\n\tprefetch?: number; // Number of messages to prefetch (default: 1)\n}\n\nexport class RabbitMQSubscriber<\n\tTMessage extends PublishableMessage<string, any>,\n> implements EventSubscriber<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: RabbitMQConnection,\n\t\tprivate options: RabbitMQSubscriberOptions = {},\n\t) {}\n\n\t/**\n\t * Create a RabbitMQSubscriber from a connection string\n\t * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<RabbitMQSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst { RabbitMQConnection } = await import('./RabbitMQConnection');\n\t\tconst connection =\n\t\t\tawait RabbitMQConnection.fromConnectionString(connectionString);\n\n\t\tconst options: RabbitMQSubscriberOptions = {\n\t\t\tqueueName: params.get('queueName') || undefined,\n\t\t\tprefetch: params.get('prefetch')\n\t\t\t\t? Number.parseInt(params.get('prefetch')!, 10)\n\t\t\t\t: undefined,\n\t\t};\n\n\t\treturn new RabbitMQSubscriber<TMessage>(connection, options);\n\t}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst channel = this.connection.amqpChannel;\n\t\tif (!channel) {\n\t\t\tthrow new Error('Channel not initialized');\n\t\t}\n\n\t\tconst exchange = this.connection.exchangeName;\n\n\t\t// Set prefetch if specified\n\t\tif (this.options.prefetch) {\n\t\t\tawait channel.prefetch(this.options.prefetch);\n\t\t}\n\n\t\t// Assert queue\n\t\tconst queueName = this.options.queueName || '';\n\t\tconst queueOptions: amqplib.Options.AssertQueue = {\n\t\t\tdurable: true,\n\t\t\t...this.options.queueOptions,\n\t\t};\n\n\t\tconst { queue } = await channel.assertQueue(queueName, queueOptions);\n\n\t\t// Bind queue to exchange for each message type\n\t\tfor (const messageType of messages) {\n\t\t\tawait channel.bindQueue(queue, exchange, messageType);\n\t\t}\n\n\t\t// Consume messages\n\t\tawait channel.consume(\n\t\t\tqueue,\n\t\t\tasync (msg) => {\n\t\t\t\tif (!msg) return;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Parse message payload\n\t\t\t\t\tconst content = msg.content.toString();\n\t\t\t\t\tconst payload = JSON.parse(content);\n\n\t\t\t\t\t// Get message type from properties\n\t\t\t\t\tconst messageType = msg.properties.type;\n\n\t\t\t\t\t// Reconstruct full message\n\t\t\t\t\tconst fullMessage: TMessage = {\n\t\t\t\t\t\ttype: messageType,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t} as TMessage;\n\n\t\t\t\t\t// Call listener\n\t\t\t\t\tawait listener(fullMessage);\n\n\t\t\t\t\t// Ack message\n\t\t\t\t\tchannel.ack(msg);\n\t\t\t\t} catch (_error) {\n\t\t\t\t\tchannel.nack(msg, false, true);\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.options.consumeOptions,\n\t\t);\n\t}\n}\n"],"mappings":";;;;AAQA,IAAa,oBAAb,MAAa,kBAEb;CACC,YACSA,YACAC,UAAoC,CAAE,GAC7C;EAFO;EACA;CACL;;;;;CAMJ,aAAa,qBAEXC,kBAAgE;EACjE,MAAM,EAAE,0CAAoB,GAAG,MAAM,OAAO;EAC5C,MAAM,aACL,MAAM,qBAAmB,qBAAqB,iBAAiB;AAChE,SAAO,IAAI,kBAA4B;CACvC;CAED,MAAM,QAAQC,UAAqC;AAClD,OAAK,KAAK,WAAW,aAAa,CACjC,OAAM,KAAK,WAAW,SAAS;EAGhC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,QACJ,OAAM,IAAI,MAAM;EAGjB,MAAM,WAAW,KAAK,WAAW;AAEjC,OAAK,MAAM,WAAW,UAAU;GAC/B,MAAM,UAAU,OAAO,KAAK,KAAK,UAAU,QAAQ,QAAQ,CAAC;GAG5D,MAAM,aAAa,QAAQ;GAE3B,MAAM,YAAY,QAAQ,QAAQ,UAAU,YAAY,SAAS;IAChE,aAAa;IACb,WAAW,KAAK,KAAK;IACrB,MAAM,QAAQ;IACd,YAAY;IACZ,GAAG,KAAK,QAAQ;GAChB,EAAC;AAGF,QAAK,UACJ,OAAM,IAAI,QAAQ,CAAC,YAAY,QAAQ,KAAK,SAAS,QAAQ;EAE9D;CACD;CAED,MAAM,QAAuB,CAG5B;AACD;;;;ACvDD,IAAa,qBAAb,MAAa,mBAGb;CACC,YACSC,YACAC,UAAqC,CAAE,GAC9C;EAFO;EACA;CACL;;;;;CAMJ,aAAa,qBAEXC,kBAAiE;EAClE,MAAM,MAAM,IAAI,IAAI;EACpB,MAAM,SAAS,IAAI;EAEnB,MAAM,EAAE,0CAAoB,GAAG,MAAM,OAAO;EAC5C,MAAM,aACL,MAAM,qBAAmB,qBAAqB,iBAAiB;EAEhE,MAAMD,UAAqC;GAC1C,WAAW,OAAO,IAAI,YAAY;GAClC,UAAU,OAAO,IAAI,WAAW,GAC7B,OAAO,SAAS,OAAO,IAAI,WAAW,EAAG,GAAG;EAE/C;AAED,SAAO,IAAI,mBAA6B,YAAY;CACpD;CAED,MAAM,UACLE,UACAC,UACgB;AAChB,OAAK,KAAK,WAAW,aAAa,CACjC,OAAM,KAAK,WAAW,SAAS;EAGhC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,QACJ,OAAM,IAAI,MAAM;EAGjB,MAAM,WAAW,KAAK,WAAW;AAGjC,MAAI,KAAK,QAAQ,SAChB,OAAM,QAAQ,SAAS,KAAK,QAAQ,SAAS;EAI9C,MAAM,YAAY,KAAK,QAAQ,aAAa;EAC5C,MAAMC,eAA4C;GACjD,SAAS;GACT,GAAG,KAAK,QAAQ;EAChB;EAED,MAAM,EAAE,OAAO,GAAG,MAAM,QAAQ,YAAY,WAAW,aAAa;AAGpE,OAAK,MAAM,eAAe,SACzB,OAAM,QAAQ,UAAU,OAAO,UAAU,YAAY;AAItD,QAAM,QAAQ,QACb,OACA,OAAO,QAAQ;AACd,QAAK,IAAK;AAEV,OAAI;IAEH,MAAM,UAAU,IAAI,QAAQ,UAAU;IACtC,MAAM,UAAU,KAAK,MAAM,QAAQ;IAGnC,MAAM,cAAc,IAAI,WAAW;IAGnC,MAAMC,cAAwB;KAC7B,MAAM;KACN;IACA;AAGD,UAAM,SAAS,YAAY;AAG3B,YAAQ,IAAI,IAAI;GAChB,SAAQ,QAAQ;AAChB,YAAQ,KAAK,KAAK,OAAO,KAAK;GAC9B;EACD,GACD,KAAK,QAAQ,eACb;CACD;AACD"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/rabbitmq/RabbitMQConnection.ts","../../src/rabbitmq/errors.ts","../../src/rabbitmq/RabbitMQPublisher.ts","../../src/rabbitmq/RabbitMQSubscriber.ts","../../src/rabbitmq/driver.ts"],"sourcesContent":["import amqplib from 'amqplib';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface RabbitMQConnectionConfig {\n\turl: string;\n\texchange?: string;\n\texchangeType?: 'topic' | 'direct' | 'fanout' | 'headers';\n\texchangeOptions?: amqplib.Options.AssertExchange;\n\ttimeout?: number; // Connection timeout in milliseconds (default: 5000)\n}\n\nexport class RabbitMQConnection implements EventConnection {\n\treadonly type = EventPublisherType.RabbitMQ;\n\tprivate connection?: amqplib.ChannelModel;\n\tprivate channel?: amqplib.Channel;\n\tprivate connecting?: Promise<void>;\n\tprivate config: Required<\n\t\tPick<RabbitMQConnectionConfig, 'exchange' | 'exchangeType' | 'timeout'>\n\t> &\n\t\tRabbitMQConnectionConfig;\n\n\tconstructor(config: RabbitMQConnectionConfig) {\n\t\tthis.config = {\n\t\t\t...config,\n\t\t\texchange: config.exchange || 'geekmidas.events',\n\t\t\texchangeType: config.exchangeType || 'topic',\n\t\t\ttimeout: config.timeout ?? 5000,\n\t\t\texchangeOptions: {\n\t\t\t\tdurable: true,\n\t\t\t\t...config.exchangeOptions,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Create a RabbitMQConnection from a connection string\n\t * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionString: string,\n\t): Promise<RabbitMQConnection> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\t// Extract connection URL without query params\n\t\tconst baseUrl = `amqp://${url.username ? `${url.username}:${url.password}@` : ''}${url.host}${url.pathname}`;\n\n\t\tconst timeoutParam = params.get('timeout');\n\t\tconst config: RabbitMQConnectionConfig = {\n\t\t\turl: baseUrl,\n\t\t\texchange: params.get('exchange') || 'geekmidas.events',\n\t\t\texchangeType: (params.get('type') as any) || 'topic',\n\t\t\ttimeout: timeoutParam ? Number.parseInt(timeoutParam, 10) : undefined,\n\t\t};\n\n\t\tconst connection = new RabbitMQConnection(config);\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.channel) return;\n\n\t\t// Prevent multiple simultaneous connection attempts\n\t\tif (this.connecting) {\n\t\t\tawait this.connecting;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connecting = (async () => {\n\t\t\ttry {\n\t\t\t\tconst connection = await amqplib.connect(this.config.url, {\n\t\t\t\t\ttimeout: this.config.timeout,\n\t\t\t\t});\n\t\t\t\tconst channel = await connection.createChannel();\n\n\t\t\t\t// Assert the exchange exists\n\t\t\t\tawait channel.assertExchange(\n\t\t\t\t\tthis.config.exchange!,\n\t\t\t\t\tthis.config.exchangeType!,\n\t\t\t\t\tthis.config.exchangeOptions,\n\t\t\t\t);\n\n\t\t\t\t// Handle connection errors\n\t\t\t\tconnection.on('error', (_err: Error) => {\n\t\t\t\t\tthis.cleanup();\n\t\t\t\t});\n\n\t\t\t\tconnection.on('close', () => {\n\t\t\t\t\tthis.cleanup();\n\t\t\t\t});\n\n\t\t\t\t// Only set after successful setup\n\t\t\t\tthis.connection = connection;\n\t\t\t\tthis.channel = channel;\n\t\t\t} catch (error) {\n\t\t\t\tthis.cleanup();\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})();\n\n\t\tawait this.connecting;\n\t\tthis.connecting = undefined;\n\t}\n\n\tasync close(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.channel?.close();\n\t\t\tawait this.connection?.close();\n\t\t} catch (_error) {\n\t\t\t// Ignore errors during close\n\t\t} finally {\n\t\t\tthis.cleanup();\n\t\t}\n\t}\n\n\tisConnected(): boolean {\n\t\treturn !!this.channel;\n\t}\n\n\tprivate cleanup(): void {\n\t\tthis.channel = undefined;\n\t\tthis.connection = undefined;\n\t\tthis.connecting = undefined;\n\t}\n\n\t/**\n\t * Get the underlying channel for publishing/subscribing\n\t */\n\tget amqpChannel(): amqplib.Channel | undefined {\n\t\treturn this.channel;\n\t}\n\n\t/**\n\t * Get the exchange name for this connection\n\t */\n\tget exchangeName(): string {\n\t\treturn this.config.exchange;\n\t}\n\n\t/**\n\t * Get the exchange type for this connection\n\t */\n\tget exchangeType(): string {\n\t\treturn this.config.exchangeType;\n\t}\n}\n","// Beside the adapter but apart from its connection module, which imports\n// the broker's client: the publisher and subscriber load that lazily, and\n// importing an error class from it would load it eagerly.\n\n/** The connection opened but has no channel to publish or consume on. */\nexport class RabbitMQChannelUnavailable extends Error {\n\tconstructor() {\n\t\tsuper(\n\t\t\t'RabbitMQ connected without a channel. Check the broker is reachable and the connection string names a vhost the user can open channels on.',\n\t\t);\n\t\tthis.name = 'RabbitMQChannelUnavailable';\n\t}\n}\n","import type amqplib from 'amqplib';\nimport { publishTraced } from '../telemetry';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport { RabbitMQChannelUnavailable } from './errors';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQPublisherOptions {\n\tpublishOptions?: amqplib.Options.Publish;\n}\n\nexport class RabbitMQPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: RabbitMQConnection,\n\t\tprivate options: RabbitMQPublisherOptions = {},\n\t) {}\n\n\t/**\n\t * Create a RabbitMQPublisher from a connection string\n\t * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&timeout=5000\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<RabbitMQPublisher<TMessage>> {\n\t\tconst { RabbitMQConnection } = await import('./RabbitMQConnection');\n\t\tconst connection =\n\t\t\tawait RabbitMQConnection.fromConnectionString(connectionString);\n\t\treturn new RabbitMQPublisher<TMessage>(connection);\n\t}\n\n\tasync publish(messages: TMessage[]): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst channel = this.connection.amqpChannel;\n\t\tif (!channel) {\n\t\t\tthrow new RabbitMQChannelUnavailable();\n\t\t}\n\n\t\tconst exchange = this.connection.exchangeName;\n\n\t\tawait publishTraced(\n\t\t\tmessages,\n\t\t\t(message) => ({\n\t\t\t\tsystem: 'rabbitmq',\n\t\t\t\tdestination: exchange,\n\t\t\t\ttype: message.type,\n\t\t\t}),\n\t\t\tasync (carriers) => {\n\t\t\t\tfor (const [i, message] of messages.entries()) {\n\t\t\t\t\tconst content = Buffer.from(JSON.stringify(message.payload));\n\t\t\t\t\tconst { headers, ...publishOptions } =\n\t\t\t\t\t\tthis.options.publishOptions ?? {};\n\n\t\t\t\t\t// Use message type as routing key for topic exchanges; the trace\n\t\t\t\t\t// context goes in the message's headers.\n\t\t\t\t\tconst published = channel.publish(exchange, message.type, content, {\n\t\t\t\t\t\tcontentType: 'application/json',\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\tpersistent: true,\n\t\t\t\t\t\t...publishOptions,\n\t\t\t\t\t\t...((headers || carriers[i]) && {\n\t\t\t\t\t\t\theaders: { ...headers, ...carriers[i] },\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Handle backpressure\n\t\t\t\t\tif (!published) {\n\t\t\t\t\t\tawait new Promise((resolve) => channel.once('drain', resolve));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tasync close(): Promise<void> {\n\t\t// Publisher doesn't own the connection\n\t\t// Connection should be closed by whoever created it\n\t}\n}\n","import type amqplib from 'amqplib';\nimport { carrierFromAttributes, consumeTraced } from '../telemetry';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport { RabbitMQChannelUnavailable } from './errors';\nimport type { RabbitMQConnection } from './RabbitMQConnection';\n\nexport interface RabbitMQSubscriberOptions {\n\tqueueName?: string; // If not provided, a unique queue will be generated\n\tqueueOptions?: amqplib.Options.AssertQueue;\n\tconsumeOptions?: amqplib.Options.Consume;\n\tprefetch?: number; // Number of messages to prefetch (default: 1)\n}\n\nexport class RabbitMQSubscriber<\n\tTMessage extends PublishableMessage<string, any>,\n> implements EventSubscriber<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: RabbitMQConnection,\n\t\tprivate options: RabbitMQSubscriberOptions = {},\n\t) {}\n\n\t/**\n\t * Create a RabbitMQSubscriber from a connection string\n\t * Format: rabbitmq://user:pass@host:port/vhost?exchange=name&type=topic&queueName=myqueue&prefetch=10\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<RabbitMQSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst { RabbitMQConnection } = await import('./RabbitMQConnection');\n\t\tconst connection =\n\t\t\tawait RabbitMQConnection.fromConnectionString(connectionString);\n\n\t\tconst options: RabbitMQSubscriberOptions = {\n\t\t\tqueueName: params.get('queueName') || undefined,\n\t\t\tprefetch: params.get('prefetch')\n\t\t\t\t? Number.parseInt(params.get('prefetch')!, 10)\n\t\t\t\t: undefined,\n\t\t};\n\n\t\treturn new RabbitMQSubscriber<TMessage>(connection, options);\n\t}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst channel = this.connection.amqpChannel;\n\t\tif (!channel) {\n\t\t\tthrow new RabbitMQChannelUnavailable();\n\t\t}\n\n\t\tconst exchange = this.connection.exchangeName;\n\n\t\t// Set prefetch if specified\n\t\tif (this.options.prefetch) {\n\t\t\tawait channel.prefetch(this.options.prefetch);\n\t\t}\n\n\t\t// Assert queue\n\t\tconst queueName = this.options.queueName || '';\n\t\tconst queueOptions: amqplib.Options.AssertQueue = {\n\t\t\tdurable: true,\n\t\t\t...this.options.queueOptions,\n\t\t};\n\n\t\tconst { queue } = await channel.assertQueue(queueName, queueOptions);\n\n\t\t// Bind queue to exchange for each message type\n\t\tfor (const messageType of messages) {\n\t\t\tawait channel.bindQueue(queue, exchange, messageType);\n\t\t}\n\n\t\t// Consume messages\n\t\tawait channel.consume(\n\t\t\tqueue,\n\t\t\tasync (msg) => {\n\t\t\t\tif (!msg) return;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Parse message payload\n\t\t\t\t\tconst content = msg.content.toString();\n\t\t\t\t\tconst payload = JSON.parse(content);\n\n\t\t\t\t\t// Get message type from properties\n\t\t\t\t\tconst messageType = msg.properties.type;\n\n\t\t\t\t\t// Reconstruct full message\n\t\t\t\t\tconst fullMessage: TMessage = {\n\t\t\t\t\t\ttype: messageType,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t} as TMessage;\n\n\t\t\t\t\t// Call listener, as a child of the publisher's span\n\t\t\t\t\tawait consumeTraced(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsystem: 'rabbitmq',\n\t\t\t\t\t\t\tdestination: queue,\n\t\t\t\t\t\t\ttype: messageType,\n\t\t\t\t\t\t\tmessageId: msg.properties.messageId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcarrierFromAttributes(msg.properties.headers),\n\t\t\t\t\t\t() => listener(fullMessage),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Ack message\n\t\t\t\t\tchannel.ack(msg);\n\t\t\t\t} catch (_error) {\n\t\t\t\t\tchannel.nack(msg, false, true);\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.options.consumeOptions,\n\t\t);\n\t}\n}\n","import type { EventsDriver } from '../registry';\nimport { EventPublisherType } from '../types';\nimport { RabbitMQConnection } from './RabbitMQConnection';\nimport { RabbitMQPublisher } from './RabbitMQPublisher';\nimport { RabbitMQSubscriber } from './RabbitMQSubscriber';\n\n/**\n * `rabbitmq://` — an AMQP exchange. Register it with\n * `registerEventsDriver(rabbitmqEventsDriver)`; this subpath is the only one\n * that imports `amqplib`.\n */\nexport const rabbitmqEventsDriver: EventsDriver = {\n\tscheme: EventPublisherType.RabbitMQ,\n\tconnect: (url) => RabbitMQConnection.fromConnectionString(url),\n\tpublisher: (url) => RabbitMQPublisher.fromConnectionString(url),\n\tpublisherFor: (connection) =>\n\t\tnew RabbitMQPublisher(connection as RabbitMQConnection),\n\tsubscriber: (url) => RabbitMQSubscriber.fromConnectionString(url),\n\tsubscriberFor: (connection) =>\n\t\tnew RabbitMQSubscriber(connection as RabbitMQConnection),\n};\n"],"mappings":"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"}