@kronos-ts/rabbitmq 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/amqp-command-transport.d.ts +8 -9
- package/dist/amqp-command-transport.d.ts.map +1 -1
- package/dist/amqp-command-transport.js +9 -11
- package/dist/amqp-command-transport.js.map +1 -1
- package/dist/amqp-query-transport.d.ts +38 -0
- package/dist/amqp-query-transport.d.ts.map +1 -0
- package/dist/amqp-query-transport.js +174 -0
- package/dist/amqp-query-transport.js.map +1 -0
- package/dist/connection.d.ts +26 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +28 -0
- package/dist/connection.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/query-bus.d.ts +38 -0
- package/dist/query-bus.d.ts.map +1 -0
- package/dist/query-bus.js +80 -0
- package/dist/query-bus.js.map +1 -0
- package/dist/rabbitmq.d.ts +14 -3
- package/dist/rabbitmq.d.ts.map +1 -1
- package/dist/rabbitmq.js +23 -4
- package/dist/rabbitmq.js.map +1 -1
- package/dist/topology.d.ts +6 -1
- package/dist/topology.d.ts.map +1 -1
- package/dist/topology.js +12 -1
- package/dist/topology.js.map +1 -1
- package/package.json +1 -1
- package/src/amqp-command-transport.ts +10 -23
- package/src/amqp-query-transport.ts +215 -0
- package/src/connection.ts +50 -0
- package/src/index.ts +16 -0
- package/src/query-bus.ts +137 -0
- package/src/rabbitmq.ts +37 -4
- package/src/topology.ts +18 -2
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import type { Channel, ChannelModel } from "amqplib";
|
|
2
1
|
import type { RabbitMqCommandEnvelope, RabbitMqCommandReplyEnvelope, RabbitMqCommandTransport } from "./command-bus.js";
|
|
2
|
+
import type { AmqpConnection } from "./connection.js";
|
|
3
3
|
import type { RabbitMqResolvedConfig } from "./rabbitmq.js";
|
|
4
|
-
export interface AmqpConnectionLike {
|
|
5
|
-
createChannel(): Promise<Channel>;
|
|
6
|
-
close(): Promise<void>;
|
|
7
|
-
}
|
|
8
|
-
export type AmqpConnect = (url: string) => Promise<ChannelModel>;
|
|
9
4
|
export declare class AmqpRabbitMqCommandTransport implements RabbitMqCommandTransport {
|
|
10
5
|
private readonly config;
|
|
11
|
-
private readonly
|
|
12
|
-
private connection;
|
|
6
|
+
private readonly connection;
|
|
13
7
|
private channel;
|
|
14
8
|
private replyQueue;
|
|
15
9
|
private readonly handlers;
|
|
@@ -17,9 +11,14 @@ export declare class AmqpRabbitMqCommandTransport implements RabbitMqCommandTran
|
|
|
17
11
|
private readonly pending;
|
|
18
12
|
private connectPromise;
|
|
19
13
|
private closed;
|
|
20
|
-
constructor(config: RabbitMqResolvedConfig,
|
|
14
|
+
constructor(config: RabbitMqResolvedConfig, connection: AmqpConnection);
|
|
21
15
|
connect(): Promise<void>;
|
|
22
16
|
private doConnect;
|
|
17
|
+
/**
|
|
18
|
+
* Close this transport's channel and fail any in-flight requests. The shared
|
|
19
|
+
* connection is owned by its creator (see {@link createAmqpConnection}) and is
|
|
20
|
+
* not closed here.
|
|
21
|
+
*/
|
|
23
22
|
close(): Promise<void>;
|
|
24
23
|
dispatch(envelope: RabbitMqCommandEnvelope): Promise<RabbitMqCommandReplyEnvelope>;
|
|
25
24
|
subscribe(commandName: string, handler: (envelope: RabbitMqCommandEnvelope) => Promise<RabbitMqCommandReplyEnvelope>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amqp-command-transport.d.ts","sourceRoot":"","sources":["../src/amqp-command-transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"amqp-command-transport.d.ts","sourceRoot":"","sources":["../src/amqp-command-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAQ3D,qBAAa,4BAA6B,YAAW,wBAAwB;IAUzE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAV7B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkG;IAC3H,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,MAAM,CAAQ;gBAGH,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,cAAc;IAGvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMhB,SAAS;IAsBvB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAoCxF,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,uBAAuB,KAAK,OAAO,CAAC,4BAA4B,CAAC,GACpF,IAAI;YAOO,kBAAkB;YA0BlB,aAAa;IAyC3B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;CAIvB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export class AmqpRabbitMqCommandTransport {
|
|
2
2
|
config;
|
|
3
|
-
connectFn;
|
|
4
3
|
connection;
|
|
5
4
|
channel;
|
|
6
5
|
replyQueue;
|
|
@@ -9,9 +8,9 @@ export class AmqpRabbitMqCommandTransport {
|
|
|
9
8
|
pending = new Map();
|
|
10
9
|
connectPromise;
|
|
11
10
|
closed = false;
|
|
12
|
-
constructor(config,
|
|
11
|
+
constructor(config, connection) {
|
|
13
12
|
this.config = config;
|
|
14
|
-
this.
|
|
13
|
+
this.connection = connection;
|
|
15
14
|
}
|
|
16
15
|
async connect() {
|
|
17
16
|
if (this.connectPromise)
|
|
@@ -20,13 +19,12 @@ export class AmqpRabbitMqCommandTransport {
|
|
|
20
19
|
return this.connectPromise;
|
|
21
20
|
}
|
|
22
21
|
async doConnect() {
|
|
23
|
-
this.
|
|
24
|
-
this.channel = await this.connection.createChannel();
|
|
22
|
+
this.channel = await this.connection.channel();
|
|
25
23
|
await this.channel.assertExchange(this.config.topology.commandsExchange, "topic", { durable: true });
|
|
26
24
|
if (this.config.retry.deadLetter) {
|
|
27
25
|
await this.channel.assertExchange(this.config.retry.deadLetterExchange, "topic", { durable: true });
|
|
28
26
|
}
|
|
29
|
-
const reply = await this.channel.assertQueue(this.config.topology.
|
|
27
|
+
const reply = await this.channel.assertQueue(this.config.topology.commandReplyQueue(), {
|
|
30
28
|
durable: false,
|
|
31
29
|
exclusive: true,
|
|
32
30
|
autoDelete: true,
|
|
@@ -38,6 +36,11 @@ export class AmqpRabbitMqCommandTransport {
|
|
|
38
36
|
await this.bindCommandHandler(commandName, handler);
|
|
39
37
|
}
|
|
40
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Close this transport's channel and fail any in-flight requests. The shared
|
|
41
|
+
* connection is owned by its creator (see {@link createAmqpConnection}) and is
|
|
42
|
+
* not closed here.
|
|
43
|
+
*/
|
|
41
44
|
async close() {
|
|
42
45
|
this.closed = true;
|
|
43
46
|
for (const [requestId, pending] of this.pending) {
|
|
@@ -46,7 +49,6 @@ export class AmqpRabbitMqCommandTransport {
|
|
|
46
49
|
}
|
|
47
50
|
this.pending.clear();
|
|
48
51
|
await this.channel?.close().catch(() => { });
|
|
49
|
-
await this.connection?.close().catch(() => { });
|
|
50
52
|
}
|
|
51
53
|
async dispatch(envelope) {
|
|
52
54
|
await this.connect();
|
|
@@ -165,8 +167,4 @@ function serializeError(error) {
|
|
|
165
167
|
}
|
|
166
168
|
return { message: String(error) };
|
|
167
169
|
}
|
|
168
|
-
async function defaultAmqpConnect(url) {
|
|
169
|
-
const amqp = await import("amqplib");
|
|
170
|
-
return amqp.connect(url);
|
|
171
|
-
}
|
|
172
170
|
//# sourceMappingURL=amqp-command-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amqp-command-transport.js","sourceRoot":"","sources":["../src/amqp-command-transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"amqp-command-transport.js","sourceRoot":"","sources":["../src/amqp-command-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RabbitMqQueryEnvelope, RabbitMqQueryReplyEnvelope, RabbitMqQueryTransport } from "./query-bus.js";
|
|
2
|
+
import type { AmqpConnection } from "./connection.js";
|
|
3
|
+
import type { RabbitMqResolvedConfig } from "./rabbitmq.js";
|
|
4
|
+
/**
|
|
5
|
+
* AMQP request/reply transport for distributed queries.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors {@link AmqpRabbitMqCommandTransport}: a per-process exclusive reply
|
|
8
|
+
* queue, durable per-query handler queues bound to the shared queries exchange,
|
|
9
|
+
* and correlation-id matched replies. Takes its own channel off the shared
|
|
10
|
+
* {@link AmqpConnection}.
|
|
11
|
+
*/
|
|
12
|
+
export declare class AmqpRabbitMqQueryTransport implements RabbitMqQueryTransport {
|
|
13
|
+
private readonly config;
|
|
14
|
+
private readonly connection;
|
|
15
|
+
private channel;
|
|
16
|
+
private replyQueue;
|
|
17
|
+
private readonly handlers;
|
|
18
|
+
private readonly boundHandlers;
|
|
19
|
+
private readonly pending;
|
|
20
|
+
private connectPromise;
|
|
21
|
+
private closed;
|
|
22
|
+
constructor(config: RabbitMqResolvedConfig, connection: AmqpConnection);
|
|
23
|
+
connect(): Promise<void>;
|
|
24
|
+
private doConnect;
|
|
25
|
+
/**
|
|
26
|
+
* Close this transport's channel and fail any in-flight requests. The shared
|
|
27
|
+
* connection is owned by its creator (see {@link createAmqpConnection}) and is
|
|
28
|
+
* not closed here.
|
|
29
|
+
*/
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
dispatch(envelope: RabbitMqQueryEnvelope): Promise<RabbitMqQueryReplyEnvelope>;
|
|
32
|
+
subscribe(queryName: string, handler: (envelope: RabbitMqQueryEnvelope) => Promise<RabbitMqQueryReplyEnvelope>): void;
|
|
33
|
+
private bindQueryHandler;
|
|
34
|
+
private handleQuery;
|
|
35
|
+
private handleReply;
|
|
36
|
+
private requireChannel;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=amqp-query-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amqp-query-transport.d.ts","sourceRoot":"","sources":["../src/amqp-query-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAQ3D;;;;;;;GAOG;AACH,qBAAa,0BAA2B,YAAW,sBAAsB;IAUrE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAV7B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8F;IACvH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,MAAM,CAAQ;gBAGH,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,cAAc;IAGvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMhB,SAAS;IAsBvB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA+BpF,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,OAAO,CAAC,0BAA0B,CAAC,GAChF,IAAI;YAOO,gBAAgB;YA0BhB,WAAW;IAyCzB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;CAIvB"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AMQP request/reply transport for distributed queries.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors {@link AmqpRabbitMqCommandTransport}: a per-process exclusive reply
|
|
5
|
+
* queue, durable per-query handler queues bound to the shared queries exchange,
|
|
6
|
+
* and correlation-id matched replies. Takes its own channel off the shared
|
|
7
|
+
* {@link AmqpConnection}.
|
|
8
|
+
*/
|
|
9
|
+
export class AmqpRabbitMqQueryTransport {
|
|
10
|
+
config;
|
|
11
|
+
connection;
|
|
12
|
+
channel;
|
|
13
|
+
replyQueue;
|
|
14
|
+
handlers = new Map();
|
|
15
|
+
boundHandlers = new Set();
|
|
16
|
+
pending = new Map();
|
|
17
|
+
connectPromise;
|
|
18
|
+
closed = false;
|
|
19
|
+
constructor(config, connection) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.connection = connection;
|
|
22
|
+
}
|
|
23
|
+
async connect() {
|
|
24
|
+
if (this.connectPromise)
|
|
25
|
+
return this.connectPromise;
|
|
26
|
+
this.connectPromise = this.doConnect();
|
|
27
|
+
return this.connectPromise;
|
|
28
|
+
}
|
|
29
|
+
async doConnect() {
|
|
30
|
+
this.channel = await this.connection.channel();
|
|
31
|
+
await this.channel.assertExchange(this.config.topology.queriesExchange, "topic", { durable: true });
|
|
32
|
+
if (this.config.retry.deadLetter) {
|
|
33
|
+
await this.channel.assertExchange(this.config.retry.deadLetterExchange, "topic", { durable: true });
|
|
34
|
+
}
|
|
35
|
+
const reply = await this.channel.assertQueue(this.config.topology.queryReplyQueue(), {
|
|
36
|
+
durable: false,
|
|
37
|
+
exclusive: true,
|
|
38
|
+
autoDelete: true,
|
|
39
|
+
});
|
|
40
|
+
this.replyQueue = reply.queue;
|
|
41
|
+
await this.channel.consume(reply.queue, (msg) => this.handleReply(msg), { noAck: true });
|
|
42
|
+
this.boundHandlers.clear();
|
|
43
|
+
for (const [queryName, handler] of this.handlers) {
|
|
44
|
+
await this.bindQueryHandler(queryName, handler);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Close this transport's channel and fail any in-flight requests. The shared
|
|
49
|
+
* connection is owned by its creator (see {@link createAmqpConnection}) and is
|
|
50
|
+
* not closed here.
|
|
51
|
+
*/
|
|
52
|
+
async close() {
|
|
53
|
+
this.closed = true;
|
|
54
|
+
for (const [requestId, pending] of this.pending) {
|
|
55
|
+
clearTimeout(pending.timer);
|
|
56
|
+
pending.reject(new Error(`RabbitMQ query transport closed before reply for ${requestId}`));
|
|
57
|
+
}
|
|
58
|
+
this.pending.clear();
|
|
59
|
+
await this.channel?.close().catch(() => { });
|
|
60
|
+
}
|
|
61
|
+
async dispatch(envelope) {
|
|
62
|
+
await this.connect();
|
|
63
|
+
if (this.closed)
|
|
64
|
+
throw new Error("RabbitMQ query transport is closed");
|
|
65
|
+
const channel = this.requireChannel();
|
|
66
|
+
const replyQueue = this.replyQueue;
|
|
67
|
+
if (!replyQueue)
|
|
68
|
+
throw new Error("RabbitMQ reply queue is not initialized");
|
|
69
|
+
const body = Buffer.from(JSON.stringify(envelope));
|
|
70
|
+
const routingKey = this.config.topology.queryRoutingKey(envelope.message.name);
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
const timer = setTimeout(() => {
|
|
73
|
+
this.pending.delete(envelope.requestId);
|
|
74
|
+
reject(new Error(`Query ${routingKey} timed out after ${envelope.timeoutMs}ms`));
|
|
75
|
+
}, envelope.timeoutMs);
|
|
76
|
+
this.pending.set(envelope.requestId, { resolve, reject, timer });
|
|
77
|
+
channel.publish(this.config.topology.queriesExchange, routingKey, body, {
|
|
78
|
+
contentType: "application/json",
|
|
79
|
+
correlationId: envelope.requestId,
|
|
80
|
+
replyTo: replyQueue,
|
|
81
|
+
persistent: true,
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
subscribe(queryName, handler) {
|
|
86
|
+
this.handlers.set(queryName, handler);
|
|
87
|
+
if (this.channel) {
|
|
88
|
+
void this.bindQueryHandler(queryName, handler);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async bindQueryHandler(queryName, handler) {
|
|
92
|
+
if (this.boundHandlers.has(queryName))
|
|
93
|
+
return;
|
|
94
|
+
const channel = this.requireChannel();
|
|
95
|
+
const queue = this.config.topology.queryQueue(queryName);
|
|
96
|
+
const routingKey = this.config.topology.queryRoutingKey(queryName);
|
|
97
|
+
await channel.assertQueue(queue, {
|
|
98
|
+
durable: true,
|
|
99
|
+
exclusive: false,
|
|
100
|
+
autoDelete: false,
|
|
101
|
+
arguments: this.config.retry.deadLetter
|
|
102
|
+
? {
|
|
103
|
+
"x-dead-letter-exchange": this.config.retry.deadLetterExchange,
|
|
104
|
+
"x-dead-letter-routing-key": routingKey,
|
|
105
|
+
}
|
|
106
|
+
: undefined,
|
|
107
|
+
});
|
|
108
|
+
await channel.bindQueue(queue, this.config.topology.queriesExchange, routingKey);
|
|
109
|
+
await channel.prefetch(1);
|
|
110
|
+
await channel.consume(queue, (msg) => this.handleQuery(msg, handler), { noAck: false });
|
|
111
|
+
this.boundHandlers.add(queryName);
|
|
112
|
+
}
|
|
113
|
+
async handleQuery(msg, handler) {
|
|
114
|
+
if (!msg)
|
|
115
|
+
return;
|
|
116
|
+
const channel = this.requireChannel();
|
|
117
|
+
try {
|
|
118
|
+
const envelope = JSON.parse(msg.content.toString("utf8"));
|
|
119
|
+
const reply = await handler(envelope);
|
|
120
|
+
if (msg.properties.replyTo) {
|
|
121
|
+
channel.sendToQueue(msg.properties.replyTo, Buffer.from(JSON.stringify(reply)), {
|
|
122
|
+
contentType: "application/json",
|
|
123
|
+
correlationId: msg.properties.correlationId,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
channel.ack(msg);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
const requestId = msg.properties.correlationId;
|
|
130
|
+
if (msg.properties.replyTo && requestId) {
|
|
131
|
+
const reply = {
|
|
132
|
+
requestId,
|
|
133
|
+
ok: false,
|
|
134
|
+
error: serializeError(error),
|
|
135
|
+
};
|
|
136
|
+
channel.sendToQueue(msg.properties.replyTo, Buffer.from(JSON.stringify(reply)), {
|
|
137
|
+
contentType: "application/json",
|
|
138
|
+
correlationId: requestId,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
channel.nack(msg, false, false);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
handleReply(msg) {
|
|
145
|
+
if (!msg)
|
|
146
|
+
return;
|
|
147
|
+
const requestId = msg.properties.correlationId;
|
|
148
|
+
if (!requestId)
|
|
149
|
+
return;
|
|
150
|
+
const pending = this.pending.get(requestId);
|
|
151
|
+
if (!pending)
|
|
152
|
+
return;
|
|
153
|
+
this.pending.delete(requestId);
|
|
154
|
+
clearTimeout(pending.timer);
|
|
155
|
+
try {
|
|
156
|
+
pending.resolve(JSON.parse(msg.content.toString("utf8")));
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
pending.reject(error instanceof Error ? error : new Error(String(error)));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
requireChannel() {
|
|
163
|
+
if (!this.channel)
|
|
164
|
+
throw new Error("RabbitMQ query transport is not connected");
|
|
165
|
+
return this.channel;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function serializeError(error) {
|
|
169
|
+
if (error instanceof Error) {
|
|
170
|
+
return { name: error.name, message: error.message, stack: error.stack };
|
|
171
|
+
}
|
|
172
|
+
return { message: String(error) };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=amqp-query-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amqp-query-transport.js","sourceRoot":"","sources":["../src/amqp-query-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Channel, ChannelModel } from "amqplib";
|
|
2
|
+
/** Establishes a raw AMQP connection. Swapped for a fake in tests. */
|
|
3
|
+
export type AmqpConnect = (url: string) => Promise<ChannelModel>;
|
|
4
|
+
/**
|
|
5
|
+
* A lazily-established AMQP connection, shared by the command and query
|
|
6
|
+
* transports so a Kronos process opens a single connection to the broker.
|
|
7
|
+
*/
|
|
8
|
+
export interface AmqpConnection {
|
|
9
|
+
/**
|
|
10
|
+
* Open a fresh channel on the (lazily established) connection. Each transport
|
|
11
|
+
* takes its own channel so prefetch and consumer state stay isolated.
|
|
12
|
+
*/
|
|
13
|
+
channel(): Promise<Channel>;
|
|
14
|
+
/** Close the underlying connection. Idempotent — safe to call more than once. */
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a shared AMQP connection. The connection opens on the first
|
|
19
|
+
* `channel()` call and is reused for every channel thereafter.
|
|
20
|
+
*
|
|
21
|
+
* Ownership: whoever calls {@link createAmqpConnection} owns the connection and
|
|
22
|
+
* is responsible for calling `close()`. Transports borrow channels and only
|
|
23
|
+
* close their own channels.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createAmqpConnection(url: string, connect?: AmqpConnect): AmqpConnection;
|
|
26
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEpD,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;AAEhE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3B,iFAAiF;IACjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAOD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgC,GACxC,cAAc,CAchB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
async function defaultAmqpConnect(url) {
|
|
2
|
+
const amqp = (await import("amqplib"));
|
|
3
|
+
return amqp.connect(url);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Create a shared AMQP connection. The connection opens on the first
|
|
7
|
+
* `channel()` call and is reused for every channel thereafter.
|
|
8
|
+
*
|
|
9
|
+
* Ownership: whoever calls {@link createAmqpConnection} owns the connection and
|
|
10
|
+
* is responsible for calling `close()`. Transports borrow channels and only
|
|
11
|
+
* close their own channels.
|
|
12
|
+
*/
|
|
13
|
+
export function createAmqpConnection(url, connect = defaultAmqpConnect) {
|
|
14
|
+
let connection;
|
|
15
|
+
return {
|
|
16
|
+
async channel() {
|
|
17
|
+
connection ??= connect(url);
|
|
18
|
+
return (await connection).createChannel();
|
|
19
|
+
},
|
|
20
|
+
async close() {
|
|
21
|
+
const pending = connection;
|
|
22
|
+
connection = undefined;
|
|
23
|
+
if (pending)
|
|
24
|
+
await (await pending).close().catch(() => { });
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAmBA,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAC3C,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAoD,CAAA;IACzF,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,UAAuB,kBAAkB;IAEzC,IAAI,UAA6C,CAAA;IAEjD,OAAO;QACL,KAAK,CAAC,OAAO;YACX,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3B,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC,aAAa,EAAE,CAAA;QAC3C,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,GAAG,UAAU,CAAA;YAC1B,UAAU,GAAG,SAAS,CAAA;YACtB,IAAI,OAAO;gBAAE,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC5D,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
export { rabbitMq, resolveRabbitMqConfig, type RabbitMqExtensionConfig, type RabbitMqCommandDispatchConfig, type RabbitMqRetryConfig, type RabbitMqResolvedConfig, } from "./rabbitmq.js";
|
|
1
|
+
export { rabbitMq, resolveRabbitMqConfig, type RabbitMqExtensionConfig, type RabbitMqCommandDispatchConfig, type RabbitMqQueryDispatchConfig, type RabbitMqRetryConfig, type RabbitMqResolvedConfig, } from "./rabbitmq.js";
|
|
2
2
|
export { createRabbitMqTopologyNames, type RabbitMqTopologyConfig, type RabbitMqTopologyNames, } from "./topology.js";
|
|
3
3
|
export { createRabbitMqCommandBus, type RabbitMqCommandEnvelope, type RabbitMqCommandReplyEnvelope, type RabbitMqCommandTransport, type RabbitMqCommandBusOptions, } from "./command-bus.js";
|
|
4
|
+
export { createRabbitMqQueryBus, type RabbitMqQueryEnvelope, type RabbitMqQueryReplyEnvelope, type RabbitMqQueryTransport, type RabbitMqQueryBusOptions, } from "./query-bus.js";
|
|
4
5
|
export { AmqpRabbitMqCommandTransport } from "./amqp-command-transport.js";
|
|
6
|
+
export { AmqpRabbitMqQueryTransport } from "./amqp-query-transport.js";
|
|
7
|
+
export { createAmqpConnection, type AmqpConnection, type AmqpConnect, } from "./connection.js";
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,2BAA2B,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,2BAA2B,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAEtE,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export { rabbitMq, resolveRabbitMqConfig, } from "./rabbitmq.js";
|
|
2
2
|
export { createRabbitMqTopologyNames, } from "./topology.js";
|
|
3
3
|
export { createRabbitMqCommandBus, } from "./command-bus.js";
|
|
4
|
+
export { createRabbitMqQueryBus, } from "./query-bus.js";
|
|
4
5
|
export { AmqpRabbitMqCommandTransport } from "./amqp-command-transport.js";
|
|
6
|
+
export { AmqpRabbitMqQueryTransport } from "./amqp-query-transport.js";
|
|
7
|
+
export { createAmqpConnection, } from "./connection.js";
|
|
5
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,qBAAqB,GAMtB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,2BAA2B,GAG5B,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,wBAAwB,GAKzB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,sBAAsB,GAKvB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAEtE,OAAO,EACL,oBAAoB,GAGrB,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { QueryBus, QueryMessage } from "@kronos-ts/messaging";
|
|
2
|
+
import type { RabbitMqResolvedConfig } from "./rabbitmq.js";
|
|
3
|
+
export interface RabbitMqQueryEnvelope {
|
|
4
|
+
readonly kind: "query";
|
|
5
|
+
readonly requestId: string;
|
|
6
|
+
readonly message: QueryMessage;
|
|
7
|
+
readonly timeoutMs: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RabbitMqQueryReplyEnvelope {
|
|
10
|
+
readonly requestId: string;
|
|
11
|
+
readonly ok: boolean;
|
|
12
|
+
readonly result?: unknown;
|
|
13
|
+
readonly error?: {
|
|
14
|
+
readonly name?: string;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
readonly stack?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface RabbitMqQueryTransport {
|
|
20
|
+
dispatch(envelope: RabbitMqQueryEnvelope): Promise<RabbitMqQueryReplyEnvelope>;
|
|
21
|
+
subscribe(queryName: string, handler: (envelope: RabbitMqQueryEnvelope) => Promise<RabbitMqQueryReplyEnvelope>): void | Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface RabbitMqQueryBusOptions {
|
|
24
|
+
readonly localSegment: QueryBus;
|
|
25
|
+
readonly transport: RabbitMqQueryTransport;
|
|
26
|
+
readonly config: RabbitMqResolvedConfig;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Distributed query bus decorator.
|
|
30
|
+
*
|
|
31
|
+
* Direct request/reply queries (`query` + `subscribe`) route over RabbitMQ.
|
|
32
|
+
* Subscription queries (`subscriptionQuery`, `subscribeToUpdates`, `emitUpdate`,
|
|
33
|
+
* `completeSubscription*`) remain process-local and delegate to the local
|
|
34
|
+
* segment — distributing subscription-query update streams over RabbitMQ is
|
|
35
|
+
* intentionally out of scope for this version (see rabbitmq-extension-plan.md).
|
|
36
|
+
*/
|
|
37
|
+
export declare function createRabbitMqQueryBus(options: RabbitMqQueryBusOptions): QueryBus;
|
|
38
|
+
//# sourceMappingURL=query-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-bus.d.ts","sourceRoot":"","sources":["../src/query-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAA2B,MAAM,sBAAsB,CAAA;AAG3F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;CACF;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC9E,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,OAAO,CAAC,0BAA0B,CAAC,GAChF,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAA;IAC1C,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,QAAQ,CA4EjF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { qualifiedNameToString } from "@kronos-ts/common";
|
|
2
|
+
import { runInNewUoW } from "@kronos-ts/messaging";
|
|
3
|
+
/**
|
|
4
|
+
* Distributed query bus decorator.
|
|
5
|
+
*
|
|
6
|
+
* Direct request/reply queries (`query` + `subscribe`) route over RabbitMQ.
|
|
7
|
+
* Subscription queries (`subscriptionQuery`, `subscribeToUpdates`, `emitUpdate`,
|
|
8
|
+
* `completeSubscription*`) remain process-local and delegate to the local
|
|
9
|
+
* segment — distributing subscription-query update streams over RabbitMQ is
|
|
10
|
+
* intentionally out of scope for this version (see rabbitmq-extension-plan.md).
|
|
11
|
+
*/
|
|
12
|
+
export function createRabbitMqQueryBus(options) {
|
|
13
|
+
const localHandlers = new Set();
|
|
14
|
+
const { localSegment, transport, config } = options;
|
|
15
|
+
return {
|
|
16
|
+
async query(message) {
|
|
17
|
+
const queryName = qualifiedNameToString(message.name);
|
|
18
|
+
const preferLocal = config.queries.preferLocalHandlers && !config.queries.alwaysUseDistributedBus;
|
|
19
|
+
if (preferLocal && localHandlers.has(queryName)) {
|
|
20
|
+
return localSegment.query(message);
|
|
21
|
+
}
|
|
22
|
+
const envelope = {
|
|
23
|
+
kind: "query",
|
|
24
|
+
requestId: message.identifier,
|
|
25
|
+
message,
|
|
26
|
+
timeoutMs: config.queries.defaultTimeoutMs,
|
|
27
|
+
};
|
|
28
|
+
const reply = await transport.dispatch(envelope);
|
|
29
|
+
if (!reply.ok)
|
|
30
|
+
throw deserializeRemoteError(reply.error);
|
|
31
|
+
return reply.result;
|
|
32
|
+
},
|
|
33
|
+
subscribe(queryName, handler) {
|
|
34
|
+
localHandlers.add(queryName);
|
|
35
|
+
localSegment.subscribe(queryName, handler);
|
|
36
|
+
void transport.subscribe(queryName, async (envelope) => {
|
|
37
|
+
try {
|
|
38
|
+
// AF5 parity: an inbound distributed query is handled in its own
|
|
39
|
+
// fresh UnitOfWork. Correlation/causation lineage rides on the query
|
|
40
|
+
// message metadata, which crosses the wire intact.
|
|
41
|
+
const result = await runInNewUoW(envelope.message.metadata, () => handler(envelope.message));
|
|
42
|
+
return { requestId: envelope.requestId, ok: true, result };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return { requestId: envelope.requestId, ok: false, error: serializeError(error) };
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
// Subscription queries stay process-local — see the doc comment above.
|
|
50
|
+
subscriptionQuery(message, bufferSize) {
|
|
51
|
+
return localSegment.subscriptionQuery(message, bufferSize);
|
|
52
|
+
},
|
|
53
|
+
subscribeToUpdates(message, bufferSize) {
|
|
54
|
+
return localSegment.subscribeToUpdates(message, bufferSize);
|
|
55
|
+
},
|
|
56
|
+
emitUpdate(queryName, filter, update) {
|
|
57
|
+
return localSegment.emitUpdate(queryName, filter, update);
|
|
58
|
+
},
|
|
59
|
+
completeSubscription(queryName, filter) {
|
|
60
|
+
return localSegment.completeSubscription(queryName, filter);
|
|
61
|
+
},
|
|
62
|
+
completeSubscriptionExceptionally(queryName, error, filter) {
|
|
63
|
+
return localSegment.completeSubscriptionExceptionally(queryName, error, filter);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function serializeError(error) {
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
return { name: error.name, message: error.message, stack: error.stack };
|
|
70
|
+
}
|
|
71
|
+
return { message: String(error) };
|
|
72
|
+
}
|
|
73
|
+
function deserializeRemoteError(error) {
|
|
74
|
+
const result = new Error(error?.message ?? "Remote query handling failed");
|
|
75
|
+
result.name = error?.name ?? "RemoteQueryHandlingError";
|
|
76
|
+
if (error?.stack)
|
|
77
|
+
result.stack = error.stack;
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=query-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-bus.js","sourceRoot":"","sources":["../src/query-bus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAmClD;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAEnD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAqB;YAC/B,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACrD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAA;YACjG,IAAI,WAAW,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChD,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACpC,CAAC;YAED,MAAM,QAAQ,GAA0B;gBACtC,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,OAAO,CAAC,UAAU;gBAC7B,OAAO;gBACP,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB;aAC3C,CAAA;YACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAChD,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACxD,OAAO,KAAK,CAAC,MAAM,CAAA;QACrB,CAAC;QAED,SAAS,CAAC,SAAiB,EAAE,OAAoD;YAC/E,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC5B,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC1C,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACrD,IAAI,CAAC;oBACH,iEAAiE;oBACjE,qEAAqE;oBACrE,mDAAmD;oBACnD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC1B,CAAA;oBACD,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAA;gBACnF,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,uEAAuE;QACvE,iBAAiB,CAAC,OAAqB,EAAE,UAAmB;YAC1D,OAAO,YAAY,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAC5D,CAAC;QAED,kBAAkB,CAChB,OAAqB,EACrB,UAAmB;YAEnB,OAAO,YAAY,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAC7D,CAAC;QAED,UAAU,CACR,SAAiB,EACjB,MAA0C,EAC1C,MAAe;YAEf,OAAO,YAAY,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3D,CAAC;QAED,oBAAoB,CAClB,SAAiB,EACjB,MAA2C;YAE3C,OAAO,YAAY,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC7D,CAAC;QAED,iCAAiC,CAC/B,SAAiB,EACjB,KAAY,EACZ,MAA2C;YAE3C,OAAO,YAAY,CAAC,iCAAiC,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QACjF,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAA;IACzE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA0C;IACxE,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,8BAA8B,CAAC,CAAA;IAC1E,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,0BAA0B,CAAA;IACvD,IAAI,KAAK,EAAE,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;IAC5C,OAAO,MAAM,CAAA;AACf,CAAC"}
|