@ddd-ts-kit/rabbitmq 0.0.0-stage → 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 (174) hide show
  1. package/README.md +277 -2
  2. package/dist/codec/attempt-of.d.ts +4 -0
  3. package/dist/codec/attempt-of.d.ts.map +1 -0
  4. package/dist/codec/attempt-of.js +8 -0
  5. package/dist/codec/attempt-of.js.map +1 -0
  6. package/dist/codec/decode.d.ts +5 -0
  7. package/dist/codec/decode.d.ts.map +1 -0
  8. package/dist/codec/decode.js +39 -0
  9. package/dist/codec/decode.js.map +1 -0
  10. package/dist/codec/encode.d.ts +8 -0
  11. package/dist/codec/encode.d.ts.map +1 -0
  12. package/dist/codec/encode.js +23 -0
  13. package/dist/codec/encode.js.map +1 -0
  14. package/dist/codec/headers-of.d.ts +4 -0
  15. package/dist/codec/headers-of.d.ts.map +1 -0
  16. package/dist/codec/headers-of.js +6 -0
  17. package/dist/codec/headers-of.js.map +1 -0
  18. package/dist/codec/headers.d.ts +7 -0
  19. package/dist/codec/headers.d.ts.map +1 -0
  20. package/dist/codec/headers.js +7 -0
  21. package/dist/codec/headers.js.map +1 -0
  22. package/dist/codec/publication.d.ts +7 -0
  23. package/dist/codec/publication.d.ts.map +1 -0
  24. package/dist/codec/publication.js +2 -0
  25. package/dist/codec/publication.js.map +1 -0
  26. package/dist/codec/republication.d.ts +5 -0
  27. package/dist/codec/republication.d.ts.map +1 -0
  28. package/dist/codec/republication.js +20 -0
  29. package/dist/codec/republication.js.map +1 -0
  30. package/dist/connection/broker-link.d.ts +44 -0
  31. package/dist/connection/broker-link.d.ts.map +1 -0
  32. package/dist/connection/broker-link.js +133 -0
  33. package/dist/connection/broker-link.js.map +1 -0
  34. package/dist/consumption/consumption.d.ts +50 -0
  35. package/dist/consumption/consumption.d.ts.map +1 -0
  36. package/dist/consumption/consumption.js +214 -0
  37. package/dist/consumption/consumption.js.map +1 -0
  38. package/dist/consumption/failure-of.d.ts +7 -0
  39. package/dist/consumption/failure-of.d.ts.map +1 -0
  40. package/dist/consumption/failure-of.js +18 -0
  41. package/dist/consumption/failure-of.js.map +1 -0
  42. package/dist/consumption/poison-message.d.ts +3 -0
  43. package/dist/consumption/poison-message.d.ts.map +1 -0
  44. package/dist/consumption/poison-message.js +3 -0
  45. package/dist/consumption/poison-message.js.map +1 -0
  46. package/dist/consumption/track.d.ts +3 -0
  47. package/dist/consumption/track.d.ts.map +1 -0
  48. package/dist/consumption/track.js +9 -0
  49. package/dist/consumption/track.js.map +1 -0
  50. package/dist/errors/broker-unavailable-error.d.ts +8 -0
  51. package/dist/errors/broker-unavailable-error.d.ts.map +1 -0
  52. package/dist/errors/broker-unavailable-error.js +12 -0
  53. package/dist/errors/broker-unavailable-error.js.map +1 -0
  54. package/dist/errors/consumer-name-required-error.d.ts +5 -0
  55. package/dist/errors/consumer-name-required-error.d.ts.map +1 -0
  56. package/dist/errors/consumer-name-required-error.js +8 -0
  57. package/dist/errors/consumer-name-required-error.js.map +1 -0
  58. package/dist/errors/event-bus-closed-error.d.ts +5 -0
  59. package/dist/errors/event-bus-closed-error.d.ts.map +1 -0
  60. package/dist/errors/event-bus-closed-error.js +8 -0
  61. package/dist/errors/event-bus-closed-error.js.map +1 -0
  62. package/dist/errors/failure-code.d.ts +6 -0
  63. package/dist/errors/failure-code.d.ts.map +1 -0
  64. package/dist/errors/failure-code.js +15 -0
  65. package/dist/errors/failure-code.js.map +1 -0
  66. package/dist/errors/publish-not-confirmed-error.d.ts +7 -0
  67. package/dist/errors/publish-not-confirmed-error.d.ts.map +1 -0
  68. package/dist/errors/publish-not-confirmed-error.js +11 -0
  69. package/dist/errors/publish-not-confirmed-error.js.map +1 -0
  70. package/dist/errors/unroutable-event-error.d.ts +8 -0
  71. package/dist/errors/unroutable-event-error.d.ts.map +1 -0
  72. package/dist/errors/unroutable-event-error.js +13 -0
  73. package/dist/errors/unroutable-event-error.js.map +1 -0
  74. package/dist/ignore.d.ts +3 -0
  75. package/dist/ignore.d.ts.map +1 -0
  76. package/dist/ignore.js +5 -0
  77. package/dist/ignore.js.map +1 -0
  78. package/dist/index.d.ts +23 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +11 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/messaging-system.d.ts +3 -0
  83. package/dist/messaging-system.d.ts.map +1 -0
  84. package/dist/messaging-system.js +3 -0
  85. package/dist/messaging-system.js.map +1 -0
  86. package/dist/options/queue-type.d.ts +2 -0
  87. package/dist/options/queue-type.d.ts.map +1 -0
  88. package/dist/options/queue-type.js +2 -0
  89. package/dist/options/queue-type.js.map +1 -0
  90. package/dist/options/rabbit-mq-delivery.d.ts +12 -0
  91. package/dist/options/rabbit-mq-delivery.d.ts.map +1 -0
  92. package/dist/options/rabbit-mq-delivery.js +2 -0
  93. package/dist/options/rabbit-mq-delivery.js.map +1 -0
  94. package/dist/options/rabbit-mq-event-bus-options.d.ts +31 -0
  95. package/dist/options/rabbit-mq-event-bus-options.d.ts.map +1 -0
  96. package/dist/options/rabbit-mq-event-bus-options.js +2 -0
  97. package/dist/options/rabbit-mq-event-bus-options.js.map +1 -0
  98. package/dist/options/rabbit-mq-failure.d.ts +17 -0
  99. package/dist/options/rabbit-mq-failure.d.ts.map +1 -0
  100. package/dist/options/rabbit-mq-failure.js +2 -0
  101. package/dist/options/rabbit-mq-failure.js.map +1 -0
  102. package/dist/options/reconnect-options.d.ts +9 -0
  103. package/dist/options/reconnect-options.d.ts.map +1 -0
  104. package/dist/options/reconnect-options.js +2 -0
  105. package/dist/options/reconnect-options.js.map +1 -0
  106. package/dist/options/retry-options.d.ts +7 -0
  107. package/dist/options/retry-options.d.ts.map +1 -0
  108. package/dist/options/retry-options.js +2 -0
  109. package/dist/options/retry-options.js.map +1 -0
  110. package/dist/options/settings-of.d.ts +5 -0
  111. package/dist/options/settings-of.d.ts.map +1 -0
  112. package/dist/options/settings-of.js +38 -0
  113. package/dist/options/settings-of.js.map +1 -0
  114. package/dist/options/settings.d.ts +20 -0
  115. package/dist/options/settings.d.ts.map +1 -0
  116. package/dist/options/settings.js +2 -0
  117. package/dist/options/settings.js.map +1 -0
  118. package/dist/publication/publications.d.ts +28 -0
  119. package/dist/publication/publications.d.ts.map +1 -0
  120. package/dist/publication/publications.js +87 -0
  121. package/dist/publication/publications.js.map +1 -0
  122. package/dist/publication/send-confirmed.d.ts +5 -0
  123. package/dist/publication/send-confirmed.d.ts.map +1 -0
  124. package/dist/publication/send-confirmed.js +21 -0
  125. package/dist/publication/send-confirmed.js.map +1 -0
  126. package/dist/rabbit-mq-event-bus.d.ts +55 -0
  127. package/dist/rabbit-mq-event-bus.d.ts.map +1 -0
  128. package/dist/rabbit-mq-event-bus.js +168 -0
  129. package/dist/rabbit-mq-event-bus.js.map +1 -0
  130. package/dist/secrecy/conceal.d.ts +8 -0
  131. package/dist/secrecy/conceal.d.ts.map +1 -0
  132. package/dist/secrecy/conceal.js +12 -0
  133. package/dist/secrecy/conceal.js.map +1 -0
  134. package/dist/topology/binding-description.d.ts +6 -0
  135. package/dist/topology/binding-description.d.ts.map +1 -0
  136. package/dist/topology/binding-description.js +2 -0
  137. package/dist/topology/binding-description.js.map +1 -0
  138. package/dist/topology/consumer-binding.d.ts +6 -0
  139. package/dist/topology/consumer-binding.d.ts.map +1 -0
  140. package/dist/topology/consumer-binding.js +2 -0
  141. package/dist/topology/consumer-binding.js.map +1 -0
  142. package/dist/topology/declare-topology.d.ts +5 -0
  143. package/dist/topology/declare-topology.d.ts.map +1 -0
  144. package/dist/topology/declare-topology.js +13 -0
  145. package/dist/topology/declare-topology.js.map +1 -0
  146. package/dist/topology/exchange-description.d.ts +6 -0
  147. package/dist/topology/exchange-description.d.ts.map +1 -0
  148. package/dist/topology/exchange-description.js +2 -0
  149. package/dist/topology/exchange-description.js.map +1 -0
  150. package/dist/topology/queue-description.d.ts +8 -0
  151. package/dist/topology/queue-description.d.ts.map +1 -0
  152. package/dist/topology/queue-description.js +2 -0
  153. package/dist/topology/queue-description.js.map +1 -0
  154. package/dist/topology/queue-names-of.d.ts +4 -0
  155. package/dist/topology/queue-names-of.d.ts.map +1 -0
  156. package/dist/topology/queue-names-of.js +5 -0
  157. package/dist/topology/queue-names-of.js.map +1 -0
  158. package/dist/topology/queue-names.d.ts +6 -0
  159. package/dist/topology/queue-names.d.ts.map +1 -0
  160. package/dist/topology/queue-names.js +2 -0
  161. package/dist/topology/queue-names.js.map +1 -0
  162. package/dist/topology/rabbit-mq-topology.d.ts +10 -0
  163. package/dist/topology/rabbit-mq-topology.d.ts.map +1 -0
  164. package/dist/topology/rabbit-mq-topology.js +2 -0
  165. package/dist/topology/rabbit-mq-topology.js.map +1 -0
  166. package/dist/topology/topology-of.d.ts +5 -0
  167. package/dist/topology/topology-of.d.ts.map +1 -0
  168. package/dist/topology/topology-of.js +50 -0
  169. package/dist/topology/topology-of.js.map +1 -0
  170. package/dist/topology/topology-settings.d.ts +7 -0
  171. package/dist/topology/topology-settings.d.ts.map +1 -0
  172. package/dist/topology/topology-settings.js +2 -0
  173. package/dist/topology/topology-settings.js.map +1 -0
  174. package/package.json +37 -4
@@ -0,0 +1,133 @@
1
+ import { inspect } from 'node:util';
2
+ import { BrokerUnavailableError } from '../errors/broker-unavailable-error.js';
3
+ import { EventBusClosedError } from '../errors/event-bus-closed-error.js';
4
+ import { failureCode } from '../errors/failure-code.js';
5
+ import { ignore } from '../ignore.js';
6
+ import { conceal } from '../secrecy/conceal.js';
7
+ const DESCRIPTION = 'BrokerLink [connection concealed]';
8
+ /**
9
+ * The one connection of a bus, kept alive: when it drops, it is opened again after a delay
10
+ * that grows with each failed attempt, and the hooks rebuild what lived on it.
11
+ */
12
+ export class BrokerLink {
13
+ settings;
14
+ hooks;
15
+ model;
16
+ opening;
17
+ retry;
18
+ failures = 0;
19
+ closed = false;
20
+ constructor(settings, hooks) {
21
+ this.settings = settings;
22
+ this.hooks = hooks;
23
+ conceal(this);
24
+ }
25
+ /**
26
+ * The live connection. Opens the first one, joins an attempt in progress, and fails at
27
+ * once between two attempts so that a publisher never hangs on a broker that is down.
28
+ */
29
+ async opened() {
30
+ if (this.closed) {
31
+ throw new EventBusClosedError();
32
+ }
33
+ if (this.model !== undefined) {
34
+ return this.model;
35
+ }
36
+ if (this.opening === undefined && this.retry === undefined) {
37
+ this.open();
38
+ }
39
+ if (this.opening === undefined) {
40
+ throw new BrokerUnavailableError('RECONNECTING');
41
+ }
42
+ return this.opening;
43
+ }
44
+ /** Drops the connection so that everything is rebuilt, after a channel died on its own. */
45
+ restart() {
46
+ const model = this.model;
47
+ if (model !== undefined) {
48
+ this.lost(model);
49
+ void model.close().catch(ignore);
50
+ }
51
+ }
52
+ async close() {
53
+ this.closed = true;
54
+ clearTimeout(this.retry);
55
+ this.retry = undefined;
56
+ const model = this.model ?? (await this.opening?.catch(ignore));
57
+ this.model = undefined;
58
+ await model?.close().catch(ignore);
59
+ }
60
+ toJSON() {
61
+ return DESCRIPTION;
62
+ }
63
+ [inspect.custom]() {
64
+ return DESCRIPTION;
65
+ }
66
+ open() {
67
+ const opening = this.establish();
68
+ this.opening = opening;
69
+ void opening
70
+ .then(() => {
71
+ this.failures = 0;
72
+ }, (error) => {
73
+ this.failed(error instanceof BrokerUnavailableError ? error.reason : failureCode(error));
74
+ })
75
+ .finally(() => {
76
+ this.opening = undefined;
77
+ });
78
+ }
79
+ async establish() {
80
+ const model = await this.connect();
81
+ model.on('error', ignore);
82
+ model.on('close', () => {
83
+ this.lost(model);
84
+ });
85
+ try {
86
+ await this.hooks.opened(model);
87
+ }
88
+ catch (error) {
89
+ this.hooks.lost();
90
+ await model.close().catch(ignore);
91
+ throw new BrokerUnavailableError(failureCode(error));
92
+ }
93
+ if (this.closed) {
94
+ await model.close().catch(ignore);
95
+ throw new EventBusClosedError();
96
+ }
97
+ this.model = model;
98
+ return model;
99
+ }
100
+ async connect() {
101
+ try {
102
+ return await this.settings.open();
103
+ }
104
+ catch (error) {
105
+ // Rethrown without its message or cause: a connection error may quote the URL.
106
+ throw new BrokerUnavailableError(failureCode(error));
107
+ }
108
+ }
109
+ lost(model) {
110
+ if (this.model !== model) {
111
+ return;
112
+ }
113
+ this.model = undefined;
114
+ this.hooks.lost();
115
+ if (!this.closed) {
116
+ this.failed('CONNECTION_LOST');
117
+ }
118
+ }
119
+ failed(code) {
120
+ if (this.closed) {
121
+ return;
122
+ }
123
+ this.hooks.failed(code);
124
+ const { initialMs, factor, maxMs } = this.settings.reconnect;
125
+ const delay = Math.min(maxMs, initialMs * factor ** this.failures);
126
+ this.failures += 1;
127
+ this.retry = setTimeout(() => {
128
+ this.retry = undefined;
129
+ this.open();
130
+ }, delay);
131
+ }
132
+ }
133
+ //# sourceMappingURL=broker-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker-link.js","sourceRoot":"","sources":["../../src/connection/broker-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ChannelModel } from 'amqplib';
2
+ import type { IntegrationEventCallback, Subscription } from '@ddd-ts-kit/kernel';
3
+ import type { RabbitMqDelivery } from '../options/rabbit-mq-delivery.js';
4
+ import type { RabbitMqFailure } from '../options/rabbit-mq-failure.js';
5
+ import type { RetryOptions } from '../options/retry-options.js';
6
+ import type { ConsumerBinding } from '../topology/consumer-binding.js';
7
+ import type { TopologySettings } from '../topology/topology-settings.js';
8
+ export interface ConsumptionSettings {
9
+ readonly topology: TopologySettings;
10
+ readonly prefetch: number;
11
+ readonly retry: Required<RetryOptions>;
12
+ readonly onFailure: (failure: RabbitMqFailure) => void;
13
+ readonly onDelivery: (delivery: RabbitMqDelivery) => void;
14
+ /** Called when the channel dies while the connection lives. */
15
+ readonly channelLost: () => void;
16
+ }
17
+ /**
18
+ * The consuming side: one durable queue per consumer and event type, manual acknowledgement
19
+ * once every handler resolved, and for a failure a wait in the retry queue, then the dead
20
+ * queue when the attempts are spent. A message is never requeued at once: no hot loop.
21
+ */
22
+ export declare class Consumption {
23
+ private readonly settings;
24
+ private readonly subscriptions;
25
+ private readonly starting;
26
+ private readonly handling;
27
+ private channel;
28
+ constructor(settings: ConsumptionSettings);
29
+ get inFlight(): number;
30
+ bindings(): ConsumerBinding[];
31
+ add(binding: ConsumerBinding, handler: IntegrationEventCallback): Subscription;
32
+ attach(model: ChannelModel): Promise<void>;
33
+ detach(): void;
34
+ /** Resolves once the subscriptions made so far are consuming, or have failed to. */
35
+ started(): Promise<void>;
36
+ /** Stops taking messages, lets the handlers in progress finish and acknowledge. */
37
+ drain(): Promise<void>;
38
+ private subscriptionOf;
39
+ private startOrGiveUp;
40
+ private start;
41
+ private process;
42
+ private deliveryOf;
43
+ private buryPoison;
44
+ private retryOrBury;
45
+ /** Confirmed copy to the other queue first, acknowledgement second: never lost in between. */
46
+ private move;
47
+ private settled;
48
+ private remove;
49
+ }
50
+ //# sourceMappingURL=consumption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumption.d.ts","sourceRoot":"","sources":["../../src/consumption/consumption.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAkC,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAmC,wBAAwB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAKvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAKzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1D,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;CAClC;AAeD;;;;GAIG;AACH,qBAAa,WAAW;IASV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IARrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IAEtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,OAAO,CAA6B;IAE5C,YAA6B,QAAQ,EAAE,mBAAmB,EAAI;IAE9D,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,QAAQ,IAAI,eAAe,EAAE,CAE5B;IAED,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,wBAAwB,GAAG,YAAY,CAU7E;IAEK,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/C;IAED,MAAM,IAAI,IAAI,CAMb;IAED,oFAAoF;IAC9E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7B;IAED,mFAAmF;IAC7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAa3B;IAED,OAAO,CAAC,cAAc;YAmBR,aAAa;YASb,KAAK;YAeL,OAAO;IAiCrB,OAAO,CAAC,UAAU;YAUJ,UAAU;YAYV,WAAW;IAkBzB,8FAA8F;YAChF,IAAI;IAoBlB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,MAAM;CAef"}
@@ -0,0 +1,214 @@
1
+ import { attemptOf } from '../codec/attempt-of.js';
2
+ import { decode } from '../codec/decode.js';
3
+ import { ATTEMPT_HEADER, DEAD_REASON_HEADER, ERROR_CODE_HEADER } from '../codec/headers.js';
4
+ import { republication } from '../codec/republication.js';
5
+ import { failureCode } from '../errors/failure-code.js';
6
+ import { ignore } from '../ignore.js';
7
+ import { MESSAGING_SYSTEM } from '../messaging-system.js';
8
+ import { sendConfirmed } from '../publication/send-confirmed.js';
9
+ import { declareTopology } from '../topology/declare-topology.js';
10
+ import { queueNamesOf } from '../topology/queue-names-of.js';
11
+ import { topologyOf } from '../topology/topology-of.js';
12
+ import { failureOf } from './failure-of.js';
13
+ import { POISON_MESSAGE } from './poison-message.js';
14
+ import { track } from './track.js';
15
+ /**
16
+ * The consuming side: one durable queue per consumer and event type, manual acknowledgement
17
+ * once every handler resolved, and for a failure a wait in the retry queue, then the dead
18
+ * queue when the attempts are spent. A message is never requeued at once: no hot loop.
19
+ */
20
+ export class Consumption {
21
+ settings;
22
+ subscriptions = new Map();
23
+ starting = new Set();
24
+ handling = new Set();
25
+ channel;
26
+ constructor(settings) {
27
+ this.settings = settings;
28
+ }
29
+ get inFlight() {
30
+ return this.handling.size;
31
+ }
32
+ bindings() {
33
+ return [...this.subscriptions.values()].map((subscription) => subscription.binding);
34
+ }
35
+ add(binding, handler) {
36
+ const subscription = this.subscriptionOf(binding);
37
+ subscription.handlers.add(handler);
38
+ return {
39
+ unsubscribe: () => {
40
+ this.remove(subscription, handler);
41
+ },
42
+ };
43
+ }
44
+ async attach(model) {
45
+ const channel = await model.createConfirmChannel();
46
+ channel.on('error', ignore);
47
+ channel.on('close', () => {
48
+ if (this.channel === channel) {
49
+ this.settings.channelLost();
50
+ }
51
+ });
52
+ await channel.prefetch(this.settings.prefetch);
53
+ // The map is iterated live: a subscription added meanwhile is started by this loop.
54
+ for (const subscription of this.subscriptions.values()) {
55
+ await this.start(channel, subscription);
56
+ }
57
+ this.channel = channel;
58
+ }
59
+ detach() {
60
+ this.channel = undefined;
61
+ for (const subscription of this.subscriptions.values()) {
62
+ subscription.consumerTag = undefined;
63
+ }
64
+ }
65
+ /** Resolves once the subscriptions made so far are consuming, or have failed to. */
66
+ async started() {
67
+ while (this.starting.size > 0) {
68
+ await Promise.allSettled([...this.starting]);
69
+ }
70
+ }
71
+ /** Stops taking messages, lets the handlers in progress finish and acknowledge. */
72
+ async drain() {
73
+ const channel = this.channel;
74
+ this.channel = undefined;
75
+ const tags = [...this.subscriptions.values()].flatMap(({ consumerTag }) => consumerTag ?? []);
76
+ await Promise.allSettled(tags.map(async (tag) => channel?.cancel(tag)));
77
+ while (this.handling.size > 0) {
78
+ await Promise.allSettled([...this.handling]);
79
+ }
80
+ await channel?.close().catch(ignore);
81
+ }
82
+ subscriptionOf(binding) {
83
+ const queues = queueNamesOf(binding);
84
+ const existing = this.subscriptions.get(queues.work);
85
+ if (existing !== undefined) {
86
+ return existing;
87
+ }
88
+ const subscription = { binding, queues, handlers: new Set(), consumerTag: undefined };
89
+ this.subscriptions.set(queues.work, subscription);
90
+ if (this.channel !== undefined) {
91
+ track(this.starting, this.startOrGiveUp(this.channel, subscription));
92
+ }
93
+ return subscription;
94
+ }
95
+ async startOrGiveUp(channel, subscription) {
96
+ try {
97
+ await this.start(channel, subscription);
98
+ }
99
+ catch (error) {
100
+ this.settings.onFailure({ kind: 'connection', code: failureCode(error) });
101
+ this.settings.channelLost();
102
+ }
103
+ }
104
+ async start(channel, subscription) {
105
+ await declareTopology(channel, topologyOf(this.settings.topology, [subscription.binding]));
106
+ const { consumerTag } = await channel.consume(subscription.queues.work, (message) => {
107
+ if (message === null) {
108
+ // Cancelled by the broker (queue deleted, node lost): rebuild everything.
109
+ this.settings.channelLost();
110
+ }
111
+ else {
112
+ track(this.handling, this.process({ channel, subscription, message }));
113
+ }
114
+ });
115
+ subscription.consumerTag = consumerTag;
116
+ }
117
+ async process(delivery) {
118
+ const { channel, subscription, message } = delivery;
119
+ const event = decode(message);
120
+ if (event === undefined) {
121
+ await this.buryPoison(delivery);
122
+ return;
123
+ }
124
+ if (subscription.handlers.size === 0) {
125
+ quietly(() => {
126
+ channel.nack(message, false, true);
127
+ });
128
+ return;
129
+ }
130
+ const code = await failureOf(subscription.handlers, event, this.deliveryOf(delivery));
131
+ if (code === undefined) {
132
+ this.settled(delivery, 'acknowledged');
133
+ quietly(() => {
134
+ channel.ack(message);
135
+ });
136
+ return;
137
+ }
138
+ await this.retryOrBury(delivery, event, code);
139
+ }
140
+ deliveryOf({ subscription, message }) {
141
+ return {
142
+ attempt: attemptOf(message),
143
+ maxAttempts: this.settings.retry.maxAttempts,
144
+ system: MESSAGING_SYSTEM,
145
+ destination: subscription.queues.work,
146
+ consumer: subscription.binding.consumer,
147
+ };
148
+ }
149
+ async buryPoison(delivery) {
150
+ const { work, dead } = delivery.subscription.queues;
151
+ this.settings.onFailure({ kind: 'poison', queue: work, code: POISON_MESSAGE });
152
+ this.settled(delivery, 'poison');
153
+ await this.move(delivery, dead, {
154
+ [ERROR_CODE_HEADER]: POISON_MESSAGE,
155
+ [DEAD_REASON_HEADER]: 'poison',
156
+ });
157
+ }
158
+ async retryOrBury(delivery, event, code) {
159
+ const { work, retry, dead: deadQueue } = delivery.subscription.queues;
160
+ const attempt = attemptOf(delivery.message);
161
+ const dead = attempt >= this.settings.retry.maxAttempts;
162
+ const { id: eventId, type: eventType } = event;
163
+ this.settings.onFailure({ kind: 'handler', queue: work, eventId, eventType, code, attempt, dead });
164
+ this.settled(delivery, dead ? 'dead' : 'retried');
165
+ if (dead) {
166
+ const headers = { [ERROR_CODE_HEADER]: code, [DEAD_REASON_HEADER]: 'max-attempts' };
167
+ await this.move(delivery, deadQueue, { ...headers, [ATTEMPT_HEADER]: attempt });
168
+ }
169
+ else {
170
+ await this.move(delivery, retry, { [ERROR_CODE_HEADER]: code, [ATTEMPT_HEADER]: attempt + 1 });
171
+ }
172
+ }
173
+ /** Confirmed copy to the other queue first, acknowledgement second: never lost in between. */
174
+ async move({ channel, message }, queue, headers) {
175
+ try {
176
+ await sendConfirmed(channel, queue, republication(message, headers));
177
+ }
178
+ catch {
179
+ quietly(() => {
180
+ channel.nack(message, false, true);
181
+ });
182
+ return;
183
+ }
184
+ quietly(() => {
185
+ channel.ack(message);
186
+ });
187
+ }
188
+ settled({ subscription, message }, outcome) {
189
+ const queue = subscription.queues.work;
190
+ this.settings.onDelivery({ queue, attempt: attemptOf(message), outcome });
191
+ }
192
+ remove(subscription, handler) {
193
+ subscription.handlers.delete(handler);
194
+ if (subscription.handlers.size > 0) {
195
+ return;
196
+ }
197
+ // The queue and its binding stay: the consumer keeps receiving, it only stopped reading.
198
+ this.subscriptions.delete(subscription.queues.work);
199
+ const { consumerTag } = subscription;
200
+ if (this.channel !== undefined && consumerTag !== undefined) {
201
+ void this.channel.cancel(consumerTag).catch(ignore);
202
+ }
203
+ }
204
+ }
205
+ // Acknowledging on a channel that died throws; the broker redelivers the message anyway.
206
+ function quietly(settle) {
207
+ try {
208
+ settle();
209
+ }
210
+ catch {
211
+ return;
212
+ }
213
+ }
214
+ //# sourceMappingURL=consumption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumption.js","sourceRoot":"","sources":["../../src/consumption/consumption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { EventDelivery, IntegrationEvent, IntegrationEventCallback } from '@ddd-ts-kit/kernel';
2
+ /**
3
+ * Runs every handler, so one that fails does not starve the others; gives the first code. Each
4
+ * handler is told which delivery this is, for what observes it from outside.
5
+ */
6
+ export declare function failureOf(handlers: ReadonlySet<IntegrationEventCallback>, event: IntegrationEvent, delivery: EventDelivery): Promise<string | undefined>;
7
+ //# sourceMappingURL=failure-of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-of.d.ts","sourceRoot":"","sources":["../../src/consumption/failure-of.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGpG;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,WAAW,CAAC,wBAAwB,CAAC,EAC/C,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B"}
@@ -0,0 +1,18 @@
1
+ import { failureCode } from '../errors/failure-code.js';
2
+ /**
3
+ * Runs every handler, so one that fails does not starve the others; gives the first code. Each
4
+ * handler is told which delivery this is, for what observes it from outside.
5
+ */
6
+ export async function failureOf(handlers, event, delivery) {
7
+ let code;
8
+ for (const handler of [...handlers]) {
9
+ try {
10
+ await handler(event, delivery);
11
+ }
12
+ catch (error) {
13
+ code ??= failureCode(error);
14
+ }
15
+ }
16
+ return code;
17
+ }
18
+ //# sourceMappingURL=failure-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-of.js","sourceRoot":"","sources":["../../src/consumption/failure-of.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAA+C,EAC/C,KAAuB,EACvB,QAAuB;IAEvB,IAAI,IAAwB,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The error code reported for a message whose body is not an envelope. */
2
+ export declare const POISON_MESSAGE = "POISON_MESSAGE";
3
+ //# sourceMappingURL=poison-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poison-message.d.ts","sourceRoot":"","sources":["../../src/consumption/poison-message.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,eAAO,MAAM,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The error code reported for a message whose body is not an envelope. */
2
+ export const POISON_MESSAGE = 'POISON_MESSAGE';
3
+ //# sourceMappingURL=poison-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poison-message.js","sourceRoot":"","sources":["../../src/consumption/poison-message.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Keeps `work` in `set` for as long as it is pending. */
2
+ export declare function track(set: Set<Promise<void>>, work: Promise<void>): void;
3
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/consumption/track.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAQxE"}
@@ -0,0 +1,9 @@
1
+ /** Keeps `work` in `set` for as long as it is pending. */
2
+ export function track(set, work) {
3
+ set.add(work);
4
+ const done = () => {
5
+ set.delete(work);
6
+ };
7
+ void work.then(done, done);
8
+ }
9
+ //# sourceMappingURL=track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/consumption/track.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,UAAU,KAAK,CAAC,GAAuB,EAAE,IAAmB;IAChE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** No live connection: the first one failed, or a reconnection is pending. */
2
+ export declare class BrokerUnavailableError extends Error {
3
+ readonly reason: string;
4
+ readonly code = "BROKER_UNAVAILABLE";
5
+ /** `reason` is the code of what made the broker unreachable, never a message. */
6
+ constructor(reason: string);
7
+ }
8
+ //# sourceMappingURL=broker-unavailable-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker-unavailable-error.d.ts","sourceRoot":"","sources":["../../src/errors/broker-unavailable-error.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qBAAa,sBAAuB,SAAQ,KAAK;IAInC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAHnC,QAAQ,CAAC,IAAI,wBAAwB;IAErC,iFAAiF;IACjF,YAAqB,MAAM,EAAE,MAAM,EAGlC;CACF"}
@@ -0,0 +1,12 @@
1
+ /** No live connection: the first one failed, or a reconnection is pending. */
2
+ export class BrokerUnavailableError extends Error {
3
+ reason;
4
+ code = 'BROKER_UNAVAILABLE';
5
+ /** `reason` is the code of what made the broker unreachable, never a message. */
6
+ constructor(reason) {
7
+ super(`The broker is unavailable (${reason})`);
8
+ this.reason = reason;
9
+ this.name = 'BrokerUnavailableError';
10
+ }
11
+ }
12
+ //# sourceMappingURL=broker-unavailable-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker-unavailable-error.js","sourceRoot":"","sources":["../../src/errors/broker-unavailable-error.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAI1B,MAAM;IAHlB,IAAI,GAAG,oBAAoB,CAAC;IAErC,iFAAiF;IACjF,YAAqB,MAAc;QACjC,KAAK,CAAC,8BAA8B,MAAM,GAAG,CAAC,CAAC;sBAD5B,MAAM;QAEzB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare class ConsumerNameRequiredError extends Error {
2
+ readonly code = "CONSUMER_NAME_REQUIRED";
3
+ constructor();
4
+ }
5
+ //# sourceMappingURL=consumer-name-required-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-name-required-error.d.ts","sourceRoot":"","sources":["../../src/errors/consumer-name-required-error.ts"],"names":[],"mappings":"AAAA,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,4BAA4B;IAEzC,cAIC;CACF"}
@@ -0,0 +1,8 @@
1
+ export class ConsumerNameRequiredError extends Error {
2
+ code = 'CONSUMER_NAME_REQUIRED';
3
+ constructor() {
4
+ super('Subscribing needs a consumer name: build the bus with `consumer`, or use `forConsumer(name)`');
5
+ this.name = 'ConsumerNameRequiredError';
6
+ }
7
+ }
8
+ //# sourceMappingURL=consumer-name-required-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-name-required-error.js","sourceRoot":"","sources":["../../src/errors/consumer-name-required-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,wBAAwB,CAAC;IAEzC;QACE,KAAK,CAAC,8FAA8F,CAAC,CAAC;QAEtG,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare class EventBusClosedError extends Error {
2
+ readonly code = "EVENT_BUS_CLOSED";
3
+ constructor();
4
+ }
5
+ //# sourceMappingURL=event-bus-closed-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus-closed-error.d.ts","sourceRoot":"","sources":["../../src/errors/event-bus-closed-error.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,sBAAsB;IAEnC,cAGC;CACF"}
@@ -0,0 +1,8 @@
1
+ export class EventBusClosedError extends Error {
2
+ code = 'EVENT_BUS_CLOSED';
3
+ constructor() {
4
+ super('The event bus is closed');
5
+ this.name = 'EventBusClosedError';
6
+ }
7
+ }
8
+ //# sourceMappingURL=event-bus-closed-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus-closed-error.js","sourceRoot":"","sources":["../../src/errors/event-bus-closed-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,GAAG,kBAAkB,CAAC;IAEnC;QACE,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * What may be reported about a caught error. amqplib carries the AMQP reply code as a number
3
+ * (`406` for an inequivalent declaration): it becomes `AMQP_406`. Never the message.
4
+ */
5
+ export declare function failureCode(error: unknown): string;
6
+ //# sourceMappingURL=failure-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-code.d.ts","sourceRoot":"","sources":["../../src/errors/failure-code.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD"}
@@ -0,0 +1,15 @@
1
+ import { errorCode } from '@ddd-ts-kit/events';
2
+ /**
3
+ * What may be reported about a caught error. amqplib carries the AMQP reply code as a number
4
+ * (`406` for an inequivalent declaration): it becomes `AMQP_406`. Never the message.
5
+ */
6
+ export function failureCode(error) {
7
+ if (typeof error === 'object' && error !== null && 'code' in error) {
8
+ const { code } = error;
9
+ if (typeof code === 'number' && Number.isInteger(code)) {
10
+ return `AMQP_${String(code)}`;
11
+ }
12
+ }
13
+ return errorCode(error);
14
+ }
15
+ //# sourceMappingURL=failure-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-code.js","sourceRoot":"","sources":["../../src/errors/failure-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAEvB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** The broker did not confirm the message: it may or may not have it. Publish again. */
2
+ export declare class PublishNotConfirmedError extends Error {
3
+ readonly eventId: string;
4
+ readonly code = "PUBLISH_NOT_CONFIRMED";
5
+ constructor(eventId: string);
6
+ }
7
+ //# sourceMappingURL=publish-not-confirmed-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-not-confirmed-error.d.ts","sourceRoot":"","sources":["../../src/errors/publish-not-confirmed-error.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,qBAAa,wBAAyB,SAAQ,KAAK;IAGrC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAFpC,QAAQ,CAAC,IAAI,2BAA2B;IAExC,YAAqB,OAAO,EAAE,MAAM,EAGnC;CACF"}
@@ -0,0 +1,11 @@
1
+ /** The broker did not confirm the message: it may or may not have it. Publish again. */
2
+ export class PublishNotConfirmedError extends Error {
3
+ eventId;
4
+ code = 'PUBLISH_NOT_CONFIRMED';
5
+ constructor(eventId) {
6
+ super(`The broker did not confirm event ${eventId}`);
7
+ this.eventId = eventId;
8
+ this.name = 'PublishNotConfirmedError';
9
+ }
10
+ }
11
+ //# sourceMappingURL=publish-not-confirmed-error.js.map