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