@geekmidas/events 0.1.0 → 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/{BasicConnection-C4_Y0nIj.d.mts → BasicConnection-BTRsXiuH.d.cts} +3 -2
- package/dist/BasicConnection-BTRsXiuH.d.cts.map +1 -0
- package/dist/{BasicConnection-Bz3F2rXA.cjs → BasicConnection-C-Cg2FJT.cjs} +1 -1
- package/dist/BasicConnection-C-Cg2FJT.cjs.map +1 -0
- package/dist/{BasicConnection-DOSOFSsW.mjs → BasicConnection-CpwybcC9.mjs} +1 -1
- package/dist/BasicConnection-CpwybcC9.mjs.map +1 -0
- package/dist/{BasicConnection-CddnULuT.d.cts → BasicConnection-DIxtA7jK.d.mts} +3 -2
- package/dist/BasicConnection-DIxtA7jK.d.mts.map +1 -0
- package/dist/{BasicPublisher-afwuA4Xp.cjs → BasicPublisher-CXAVKxgq.cjs} +1 -1
- package/dist/BasicPublisher-CXAVKxgq.cjs.map +1 -0
- package/dist/{BasicPublisher-DCBxaTwC.d.mts → BasicPublisher-CpJFK2oS.d.mts} +5 -3
- package/dist/BasicPublisher-CpJFK2oS.d.mts.map +1 -0
- package/dist/{BasicPublisher-V5hELHG9.d.cts → BasicPublisher-D1q0a2xp.d.cts} +5 -3
- package/dist/BasicPublisher-D1q0a2xp.d.cts.map +1 -0
- package/dist/{BasicPublisher-CaX8GCUi.mjs → BasicPublisher-DogbeHAH.mjs} +1 -1
- package/dist/BasicPublisher-DogbeHAH.mjs.map +1 -0
- package/dist/{BasicSubscriber-BB3aKeph.d.mts → BasicSubscriber-6w0Af4DD.d.mts} +5 -3
- package/dist/BasicSubscriber-6w0Af4DD.d.mts.map +1 -0
- package/dist/{BasicSubscriber-DPpJNUUY.mjs → BasicSubscriber-BJSZN22M.mjs} +2 -4
- package/dist/BasicSubscriber-BJSZN22M.mjs.map +1 -0
- package/dist/{BasicSubscriber-DOwgFw5j.d.cts → BasicSubscriber-DXxQewjc.d.cts} +5 -3
- package/dist/BasicSubscriber-DXxQewjc.d.cts.map +1 -0
- package/dist/{BasicSubscriber-Ckf3BkxS.cjs → BasicSubscriber-mVJRMXhZ.cjs} +2 -4
- package/dist/BasicSubscriber-mVJRMXhZ.cjs.map +1 -0
- package/dist/{EventConnection-DZhn1Msl.d.cts → EventConnection-BaJRXdg7.d.cts} +2 -2
- package/dist/EventConnection-BaJRXdg7.d.cts.map +1 -0
- package/dist/EventConnection-ClLMoIUU.mjs.map +1 -1
- package/dist/EventConnection-F_N81SXu.cjs.map +1 -1
- package/dist/{EventConnection-DeXfLGom.d.mts → EventConnection-SOhtmxib.d.mts} +2 -2
- package/dist/EventConnection-SOhtmxib.d.mts.map +1 -0
- package/dist/EventConnection.d.cts +2 -2
- package/dist/EventConnection.d.mts +2 -2
- package/dist/{Publisher-C3m8JFXm.d.mts → Publisher-1CfcYRnm.d.mts} +4 -2
- package/dist/Publisher-1CfcYRnm.d.mts.map +1 -0
- package/dist/{Publisher-nXNVjL0e.d.cts → Publisher-BfNgvHwQ.d.cts} +4 -2
- package/dist/Publisher-BfNgvHwQ.d.cts.map +1 -0
- package/dist/Publisher-DS0aOh8r.mjs.map +1 -1
- package/dist/Publisher-ceu6OxCj.cjs.map +1 -1
- package/dist/Publisher.d.cts +2 -2
- package/dist/Publisher.d.mts +2 -2
- package/dist/{RabbitMQConnection-BN_GybOv.cjs → RabbitMQConnection-Blj9Lo05.cjs} +2 -2
- package/dist/RabbitMQConnection-Blj9Lo05.cjs.map +1 -0
- package/dist/{RabbitMQConnection-7cWp_-_Q.d.cts → RabbitMQConnection-Bm8VCI2R.d.cts} +3 -2
- package/dist/RabbitMQConnection-Bm8VCI2R.d.cts.map +1 -0
- package/dist/{RabbitMQConnection-C2HC7J7K.d.mts → RabbitMQConnection-Ck-ktCp_.d.mts} +3 -2
- package/dist/RabbitMQConnection-Ck-ktCp_.d.mts.map +1 -0
- package/dist/{RabbitMQConnection-eVOVS4Dl.mjs → RabbitMQConnection-Co7f5Xsx.mjs} +2 -2
- package/dist/RabbitMQConnection-Co7f5Xsx.mjs.map +1 -0
- package/dist/{RabbitMQPublisher-CSCn6gMA.cjs → RabbitMQPublisher--DL6GM6g.cjs} +1 -1
- package/dist/RabbitMQPublisher--DL6GM6g.cjs.map +1 -0
- package/dist/{RabbitMQPublisher-CpcbgrXj.d.cts → RabbitMQPublisher-COnxcWEZ.d.mts} +5 -3
- package/dist/RabbitMQPublisher-COnxcWEZ.d.mts.map +1 -0
- package/dist/{RabbitMQPublisher-BZX0edgL.mjs → RabbitMQPublisher-o_oVI3wr.mjs} +1 -1
- package/dist/RabbitMQPublisher-o_oVI3wr.mjs.map +1 -0
- package/dist/{RabbitMQPublisher-DDZi15Ro.d.mts → RabbitMQPublisher-qQT7-1-p.d.cts} +5 -3
- package/dist/RabbitMQPublisher-qQT7-1-p.d.cts.map +1 -0
- package/dist/{RabbitMQSubscriber-Cj7qLIi6.cjs → RabbitMQSubscriber-C8MYAihn.cjs} +2 -3
- package/dist/RabbitMQSubscriber-C8MYAihn.cjs.map +1 -0
- package/dist/{RabbitMQSubscriber-BJ9PTGny.d.cts → RabbitMQSubscriber-C_sZjDPU.d.mts} +5 -3
- package/dist/RabbitMQSubscriber-C_sZjDPU.d.mts.map +1 -0
- package/dist/{RabbitMQSubscriber-CIvIw8MG.d.mts → RabbitMQSubscriber-D12sssMb.d.cts} +5 -3
- package/dist/RabbitMQSubscriber-D12sssMb.d.cts.map +1 -0
- package/dist/{RabbitMQSubscriber-B5I-hBaT.mjs → RabbitMQSubscriber-DlGL0pC2.mjs} +2 -3
- package/dist/RabbitMQSubscriber-DlGL0pC2.mjs.map +1 -0
- package/dist/{SNSConnection-CAImaMM2.d.mts → SNSConnection-BDfQrVBO.d.cts} +3 -2
- package/dist/SNSConnection-BDfQrVBO.d.cts.map +1 -0
- package/dist/{SNSConnection-DVEE3XoC.mjs → SNSConnection-D7wCf9Si.mjs} +1 -1
- package/dist/SNSConnection-D7wCf9Si.mjs.map +1 -0
- package/dist/{SNSConnection-CZz_U56V.cjs → SNSConnection-DVsC_pbB.cjs} +1 -1
- package/dist/SNSConnection-DVsC_pbB.cjs.map +1 -0
- package/dist/{SNSConnection-Cqbr7-Ho.d.cts → SNSConnection-mHb10nQ6.d.mts} +3 -2
- package/dist/SNSConnection-mHb10nQ6.d.mts.map +1 -0
- package/dist/{SNSPublisher-DbWVH-g_.cjs → SNSPublisher-BoA8uLnw.cjs} +2 -3
- package/dist/SNSPublisher-BoA8uLnw.cjs.map +1 -0
- package/dist/{SNSPublisher-Dkhb4LU-.d.mts → SNSPublisher-CM7UAWtf.d.mts} +7 -6
- package/dist/SNSPublisher-CM7UAWtf.d.mts.map +1 -0
- package/dist/{SNSPublisher-Do-FMUyT.mjs → SNSPublisher-Drr4kHn6.mjs} +2 -3
- package/dist/SNSPublisher-Drr4kHn6.mjs.map +1 -0
- package/dist/{SNSPublisher-RVZFa7kL.d.cts → SNSPublisher-kpsSlGDn.d.cts} +7 -6
- package/dist/SNSPublisher-kpsSlGDn.d.cts.map +1 -0
- package/dist/{SNSSubscriber-e7eG48yJ.mjs → SNSSubscriber-CBIvQpqK.mjs} +5 -9
- package/dist/SNSSubscriber-CBIvQpqK.mjs.map +1 -0
- package/dist/{SNSSubscriber-DpEwQ8Tb.cjs → SNSSubscriber-CWiAJjpU.cjs} +5 -9
- package/dist/SNSSubscriber-CWiAJjpU.cjs.map +1 -0
- package/dist/{SNSSubscriber-B31JmkAE.d.mts → SNSSubscriber-DDB3--pm.d.cts} +4 -3
- package/dist/SNSSubscriber-DDB3--pm.d.cts.map +1 -0
- package/dist/{SNSSubscriber-k2UwKUxu.d.cts → SNSSubscriber-Dwo8391f.d.mts} +4 -3
- package/dist/SNSSubscriber-Dwo8391f.d.mts.map +1 -0
- package/dist/{SQSConnection-C5WFqZW7.d.mts → SQSConnection-B5Ep9Tma.d.cts} +3 -2
- package/dist/SQSConnection-B5Ep9Tma.d.cts.map +1 -0
- package/dist/{SQSConnection-geav2Rsn.d.cts → SQSConnection-BI_xOzyJ.d.mts} +3 -2
- package/dist/SQSConnection-BI_xOzyJ.d.mts.map +1 -0
- package/dist/{SQSConnection-DWYDtftQ.cjs → SQSConnection-BwNjUPr4.cjs} +1 -1
- package/dist/SQSConnection-BwNjUPr4.cjs.map +1 -0
- package/dist/{SQSConnection-BBlDWZLU.mjs → SQSConnection-Eleqqre3.mjs} +1 -1
- package/dist/SQSConnection-Eleqqre3.mjs.map +1 -0
- package/dist/{SQSPublisher-CdsayOLV.d.mts → SQSPublisher-BN1ds6SN.d.mts} +5 -3
- package/dist/SQSPublisher-BN1ds6SN.d.mts.map +1 -0
- package/dist/{SQSPublisher-Utb_FTe5.d.cts → SQSPublisher-DFTqwzRW.d.cts} +5 -3
- package/dist/SQSPublisher-DFTqwzRW.d.cts.map +1 -0
- package/dist/{SQSPublisher-B3lS2zbu.mjs → SQSPublisher-DG9o4ME3.mjs} +1 -1
- package/dist/SQSPublisher-DG9o4ME3.mjs.map +1 -0
- package/dist/{SQSPublisher-nzbSaXSH.cjs → SQSPublisher-Dq5353oZ.cjs} +1 -1
- package/dist/SQSPublisher-Dq5353oZ.cjs.map +1 -0
- package/dist/{SQSSubscriber-DcL9BbG1.cjs → SQSSubscriber-B4sRXVl6.cjs} +5 -12
- package/dist/SQSSubscriber-B4sRXVl6.cjs.map +1 -0
- package/dist/{SQSSubscriber-B6iL1EnX.d.cts → SQSSubscriber-BO2me_gs.d.cts} +4 -3
- package/dist/SQSSubscriber-BO2me_gs.d.cts.map +1 -0
- package/dist/{SQSSubscriber-84pFnW1z.mjs → SQSSubscriber-CVGhZ8Nr.mjs} +5 -12
- package/dist/SQSSubscriber-CVGhZ8Nr.mjs.map +1 -0
- package/dist/{SQSSubscriber-DBeE4XAR.d.mts → SQSSubscriber-FyZFfr2-.d.mts} +4 -3
- package/dist/SQSSubscriber-FyZFfr2-.d.mts.map +1 -0
- package/dist/Subscriber-Bd9hb_jp.mjs.map +1 -1
- package/dist/{Subscriber-Cff9EIpv.d.mts → Subscriber-BxT-KzFJ.d.mts} +4 -2
- package/dist/Subscriber-BxT-KzFJ.d.mts.map +1 -0
- package/dist/{Subscriber-CpAwcUzb.d.cts → Subscriber-DDD_4Nlx.d.cts} +4 -2
- package/dist/Subscriber-DDD_4Nlx.d.cts.map +1 -0
- package/dist/Subscriber-saVOWuMq.cjs.map +1 -1
- package/dist/Subscriber.d.cts +2 -2
- package/dist/Subscriber.d.mts +2 -2
- package/dist/basic/BasicConnection.cjs +1 -1
- package/dist/basic/BasicConnection.d.cts +2 -2
- package/dist/basic/BasicConnection.d.mts +2 -2
- package/dist/basic/BasicConnection.mjs +1 -1
- package/dist/basic/BasicPublisher.cjs +1 -1
- package/dist/basic/BasicPublisher.d.cts +3 -3
- package/dist/basic/BasicPublisher.d.mts +3 -3
- package/dist/basic/BasicPublisher.mjs +1 -1
- package/dist/basic/BasicSubscriber.cjs +1 -1
- package/dist/basic/BasicSubscriber.d.cts +3 -3
- package/dist/basic/BasicSubscriber.d.mts +3 -3
- package/dist/basic/BasicSubscriber.mjs +1 -1
- package/dist/basic/index.cjs +3 -3
- package/dist/basic/index.d.cts +4 -4
- package/dist/basic/index.d.mts +4 -4
- package/dist/basic/index.mjs +3 -3
- package/dist/index.d.cts +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/rabbitmq/RabbitMQConnection.cjs +1 -1
- package/dist/rabbitmq/RabbitMQConnection.d.cts +2 -2
- package/dist/rabbitmq/RabbitMQConnection.d.mts +2 -2
- package/dist/rabbitmq/RabbitMQConnection.mjs +1 -1
- package/dist/rabbitmq/RabbitMQPublisher.cjs +1 -1
- package/dist/rabbitmq/RabbitMQPublisher.d.cts +3 -3
- package/dist/rabbitmq/RabbitMQPublisher.d.mts +3 -3
- package/dist/rabbitmq/RabbitMQPublisher.mjs +1 -1
- package/dist/rabbitmq/RabbitMQSubscriber.cjs +1 -1
- package/dist/rabbitmq/RabbitMQSubscriber.d.cts +3 -3
- package/dist/rabbitmq/RabbitMQSubscriber.d.mts +3 -3
- package/dist/rabbitmq/RabbitMQSubscriber.mjs +1 -1
- package/dist/rabbitmq/index.cjs +3 -3
- package/dist/rabbitmq/index.d.cts +4 -4
- package/dist/rabbitmq/index.d.mts +4 -4
- package/dist/rabbitmq/index.mjs +3 -3
- package/dist/sns/SNSConnection.cjs +1 -1
- package/dist/sns/SNSConnection.d.cts +2 -2
- package/dist/sns/SNSConnection.d.mts +2 -2
- package/dist/sns/SNSConnection.mjs +1 -1
- package/dist/sns/SNSPublisher.cjs +1 -1
- package/dist/sns/SNSPublisher.d.cts +3 -3
- package/dist/sns/SNSPublisher.d.mts +3 -3
- package/dist/sns/SNSPublisher.mjs +1 -1
- package/dist/sns/SNSSubscriber.cjs +3 -3
- package/dist/sns/SNSSubscriber.d.cts +3 -3
- package/dist/sns/SNSSubscriber.d.mts +3 -3
- package/dist/sns/SNSSubscriber.mjs +3 -3
- package/dist/sns/index.cjs +5 -5
- package/dist/sns/index.d.cts +4 -4
- package/dist/sns/index.d.mts +4 -4
- package/dist/sns/index.mjs +5 -5
- package/dist/sqs/SQSConnection.cjs +1 -1
- package/dist/sqs/SQSConnection.d.cts +2 -2
- package/dist/sqs/SQSConnection.d.mts +2 -2
- package/dist/sqs/SQSConnection.mjs +1 -1
- package/dist/sqs/SQSPublisher.cjs +1 -1
- package/dist/sqs/SQSPublisher.d.cts +3 -3
- package/dist/sqs/SQSPublisher.d.mts +3 -3
- package/dist/sqs/SQSPublisher.mjs +1 -1
- package/dist/sqs/SQSSubscriber.cjs +1 -1
- package/dist/sqs/SQSSubscriber.d.cts +3 -3
- package/dist/sqs/SQSSubscriber.d.mts +3 -3
- package/dist/sqs/SQSSubscriber.mjs +1 -1
- package/dist/sqs/index.cjs +3 -3
- package/dist/sqs/index.d.cts +4 -4
- package/dist/sqs/index.d.mts +4 -4
- package/dist/sqs/index.mjs +3 -3
- package/dist/types-B63qHVOG.mjs.map +1 -1
- package/dist/types-CvSMEO5z.cjs.map +1 -1
- package/dist/{types-D0g-o6wX.d.mts → types-DSVsPgKd.d.mts} +2 -1
- package/dist/types-DSVsPgKd.d.mts.map +1 -0
- package/dist/{types-DEGUg5BA.d.cts → types-Dmbp1U-6.d.cts} +2 -1
- package/dist/types-Dmbp1U-6.d.cts.map +1 -0
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +1 -1
- package/src/EventConnection.ts +31 -31
- package/src/Publisher.ts +78 -78
- package/src/Subscriber.ts +91 -91
- package/src/__tests__/EventConnection.spec.ts +42 -0
- package/src/__tests__/Publisher.spec.ts +96 -0
- package/src/__tests__/Subscriber.spec.ts +91 -23
- package/src/basic/BasicConnection.ts +35 -35
- package/src/basic/BasicPublisher.ts +8 -8
- package/src/basic/BasicSubscriber.ts +13 -16
- package/src/basic/__tests__/BasicSubscriber.spec.ts +116 -116
- package/src/index.ts +13 -13
- package/src/rabbitmq/RabbitMQConnection.ts +139 -139
- package/src/rabbitmq/RabbitMQPublisher.ts +48 -48
- package/src/rabbitmq/RabbitMQSubscriber.ts +100 -102
- package/src/rabbitmq/__tests__/RabbitMQPublisher.spec.ts +364 -364
- package/src/rabbitmq/__tests__/RabbitMQSubscriber.spec.ts +204 -204
- package/src/rabbitmq/index.ts +3 -3
- package/src/sns/SNSConnection.ts +76 -76
- package/src/sns/SNSPublisher.ts +54 -56
- package/src/sns/SNSSubscriber.ts +187 -191
- package/src/sns/__tests__/SNS-SQS-Integration.spec.ts +321 -321
- package/src/sns/__tests__/SNSPublisher.spec.ts +449 -0
- package/src/sns/__tests__/SNSSubscriber.spec.ts +527 -0
- package/src/sns/index.ts +3 -3
- package/src/sqs/SQSConnection.ts +75 -75
- package/src/sqs/SQSPublisher.ts +93 -93
- package/src/sqs/SQSSubscriber.ts +157 -165
- package/src/sqs/__tests__/SQSPublisher.spec.ts +178 -178
- package/src/sqs/index.ts +3 -3
- package/src/types.ts +28 -29
- package/tsconfig.json +9 -0
- package/tsdown.config.ts +1 -1
- package/dist/BasicConnection-Bz3F2rXA.cjs.map +0 -1
- package/dist/BasicConnection-DOSOFSsW.mjs.map +0 -1
- package/dist/BasicPublisher-CaX8GCUi.mjs.map +0 -1
- package/dist/BasicPublisher-afwuA4Xp.cjs.map +0 -1
- package/dist/BasicSubscriber-Ckf3BkxS.cjs.map +0 -1
- package/dist/BasicSubscriber-DPpJNUUY.mjs.map +0 -1
- package/dist/RabbitMQConnection-BN_GybOv.cjs.map +0 -1
- package/dist/RabbitMQConnection-eVOVS4Dl.mjs.map +0 -1
- package/dist/RabbitMQPublisher-BZX0edgL.mjs.map +0 -1
- package/dist/RabbitMQPublisher-CSCn6gMA.cjs.map +0 -1
- package/dist/RabbitMQSubscriber-B5I-hBaT.mjs.map +0 -1
- package/dist/RabbitMQSubscriber-Cj7qLIi6.cjs.map +0 -1
- package/dist/SNSConnection-CZz_U56V.cjs.map +0 -1
- package/dist/SNSConnection-DVEE3XoC.mjs.map +0 -1
- package/dist/SNSPublisher-DbWVH-g_.cjs.map +0 -1
- package/dist/SNSPublisher-Do-FMUyT.mjs.map +0 -1
- package/dist/SNSSubscriber-DpEwQ8Tb.cjs.map +0 -1
- package/dist/SNSSubscriber-e7eG48yJ.mjs.map +0 -1
- package/dist/SQSConnection-BBlDWZLU.mjs.map +0 -1
- package/dist/SQSConnection-DWYDtftQ.cjs.map +0 -1
- package/dist/SQSPublisher-B3lS2zbu.mjs.map +0 -1
- package/dist/SQSPublisher-nzbSaXSH.cjs.map +0 -1
- package/dist/SQSSubscriber-84pFnW1z.mjs.map +0 -1
- package/dist/SQSSubscriber-DcL9BbG1.cjs.map +0 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
CreateTopicCommand,
|
|
3
|
+
DeleteTopicCommand,
|
|
4
|
+
SNSClient,
|
|
5
|
+
SubscribeCommand,
|
|
6
|
+
UnsubscribeCommand,
|
|
7
7
|
} from '@aws-sdk/client-sns';
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
CreateQueueCommand,
|
|
10
|
+
DeleteQueueCommand,
|
|
11
|
+
GetQueueAttributesCommand,
|
|
12
|
+
SetQueueAttributesCommand,
|
|
13
|
+
SQSClient,
|
|
14
14
|
} from '@aws-sdk/client-sqs';
|
|
15
15
|
import { describe, expect, it } from 'vitest';
|
|
16
16
|
import { SQSConnection } from '../../sqs/SQSConnection';
|
|
@@ -24,366 +24,366 @@ type TestMessage = PublishableMessage<'user.created' | 'user.updated', any>;
|
|
|
24
24
|
const LOCALSTACK_ENDPOINT = 'http://localhost:4566';
|
|
25
25
|
const AWS_REGION = 'us-east-1';
|
|
26
26
|
const AWS_CREDENTIALS = {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
accessKeyId: 'test',
|
|
28
|
+
secretAccessKey: 'test',
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
// Helper to create a unique topic name
|
|
32
32
|
const uniqueTopicName = () =>
|
|
33
|
-
|
|
33
|
+
`test-topic-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
34
34
|
|
|
35
35
|
// Helper to create a unique queue name
|
|
36
36
|
const uniqueQueueName = () =>
|
|
37
|
-
|
|
37
|
+
`test-queue-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
38
38
|
|
|
39
39
|
// Helper to create an SNS topic and return its ARN
|
|
40
40
|
async function createTopic(topicName: string): Promise<string> {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
const client = new SNSClient({
|
|
42
|
+
region: AWS_REGION,
|
|
43
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
44
|
+
credentials: AWS_CREDENTIALS,
|
|
45
|
+
});
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
const command = new CreateTopicCommand({
|
|
48
|
+
Name: topicName,
|
|
49
|
+
});
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
const response = await client.send(command);
|
|
52
|
+
client.destroy();
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
if (!response.TopicArn) {
|
|
55
|
+
throw new Error('Failed to create topic');
|
|
56
|
+
}
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
return response.TopicArn;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// Helper to delete an SNS topic
|
|
62
62
|
async function deleteTopic(topicArn: string): Promise<void> {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
63
|
+
const client = new SNSClient({
|
|
64
|
+
region: AWS_REGION,
|
|
65
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
66
|
+
credentials: AWS_CREDENTIALS,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const command = new DeleteTopicCommand({
|
|
70
|
+
TopicArn: topicArn,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await client.send(command);
|
|
74
|
+
client.destroy();
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
// Helper to create an SQS queue and return its URL
|
|
78
78
|
async function createQueue(queueName: string): Promise<string> {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
const client = new SQSClient({
|
|
80
|
+
region: AWS_REGION,
|
|
81
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
82
|
+
credentials: AWS_CREDENTIALS,
|
|
83
|
+
});
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
const command = new CreateQueueCommand({
|
|
86
|
+
QueueName: queueName,
|
|
87
|
+
});
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
const response = await client.send(command);
|
|
90
|
+
client.destroy();
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
if (!response.QueueUrl) {
|
|
93
|
+
throw new Error('Failed to create queue');
|
|
94
|
+
}
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
return response.QueueUrl;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
// Helper to get queue ARN
|
|
100
100
|
async function getQueueArn(queueUrl: string): Promise<string> {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
101
|
+
const client = new SQSClient({
|
|
102
|
+
region: AWS_REGION,
|
|
103
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
104
|
+
credentials: AWS_CREDENTIALS,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const command = new GetQueueAttributesCommand({
|
|
108
|
+
QueueUrl: queueUrl,
|
|
109
|
+
AttributeNames: ['QueueArn'],
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const response = await client.send(command);
|
|
113
|
+
client.destroy();
|
|
114
|
+
|
|
115
|
+
const queueArn = response.Attributes?.QueueArn;
|
|
116
|
+
if (!queueArn) {
|
|
117
|
+
throw new Error('Failed to get queue ARN');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return queueArn;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
// Helper to set queue policy to allow SNS to send messages
|
|
124
124
|
async function setQueuePolicy(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
queueUrl: string,
|
|
126
|
+
queueArn: string,
|
|
127
|
+
topicArn: string,
|
|
128
128
|
): Promise<void> {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
129
|
+
const client = new SQSClient({
|
|
130
|
+
region: AWS_REGION,
|
|
131
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
132
|
+
credentials: AWS_CREDENTIALS,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const policy = {
|
|
136
|
+
Version: '2012-10-17',
|
|
137
|
+
Statement: [
|
|
138
|
+
{
|
|
139
|
+
Effect: 'Allow',
|
|
140
|
+
Principal: '*',
|
|
141
|
+
Action: 'SQS:SendMessage',
|
|
142
|
+
Resource: queueArn,
|
|
143
|
+
Condition: {
|
|
144
|
+
ArnEquals: {
|
|
145
|
+
'aws:SourceArn': topicArn,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const command = new SetQueueAttributesCommand({
|
|
153
|
+
QueueUrl: queueUrl,
|
|
154
|
+
Attributes: {
|
|
155
|
+
Policy: JSON.stringify(policy),
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
await client.send(command);
|
|
160
|
+
client.destroy();
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
// Helper to subscribe SQS queue to SNS topic
|
|
164
164
|
async function subscribeQueueToTopic(
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
topicArn: string,
|
|
166
|
+
queueArn: string,
|
|
167
167
|
): Promise<string> {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
168
|
+
const client = new SNSClient({
|
|
169
|
+
region: AWS_REGION,
|
|
170
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
171
|
+
credentials: AWS_CREDENTIALS,
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const command = new SubscribeCommand({
|
|
175
|
+
TopicArn: topicArn,
|
|
176
|
+
Protocol: 'sqs',
|
|
177
|
+
Endpoint: queueArn,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const response = await client.send(command);
|
|
181
|
+
client.destroy();
|
|
182
|
+
|
|
183
|
+
if (!response.SubscriptionArn) {
|
|
184
|
+
throw new Error('Failed to subscribe queue to topic');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return response.SubscriptionArn;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
// Helper to unsubscribe
|
|
191
191
|
async function unsubscribe(subscriptionArn: string): Promise<void> {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
192
|
+
const client = new SNSClient({
|
|
193
|
+
region: AWS_REGION,
|
|
194
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
195
|
+
credentials: AWS_CREDENTIALS,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
const command = new UnsubscribeCommand({
|
|
199
|
+
SubscriptionArn: subscriptionArn,
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
await client.send(command);
|
|
203
|
+
client.destroy();
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
// Helper to delete a queue
|
|
207
207
|
async function deleteQueue(queueUrl: string): Promise<void> {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
208
|
+
const client = new SQSClient({
|
|
209
|
+
region: AWS_REGION,
|
|
210
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
211
|
+
credentials: AWS_CREDENTIALS,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const command = new DeleteQueueCommand({
|
|
215
|
+
QueueUrl: queueUrl,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
await client.send(command);
|
|
219
|
+
client.destroy();
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
describe('SNS to SQS Integration Tests', () => {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
223
|
+
it('should publish to SNS and receive via SQS subscription', async () => {
|
|
224
|
+
const topicName = uniqueTopicName();
|
|
225
|
+
const queueName = uniqueQueueName();
|
|
226
|
+
|
|
227
|
+
const topicArn = await createTopic(topicName);
|
|
228
|
+
const queueUrl = await createQueue(queueName);
|
|
229
|
+
const queueArn = await getQueueArn(queueUrl);
|
|
230
|
+
|
|
231
|
+
// Set queue policy to allow SNS
|
|
232
|
+
await setQueuePolicy(queueUrl, queueArn, topicArn);
|
|
233
|
+
|
|
234
|
+
// Subscribe queue to topic
|
|
235
|
+
const subscriptionArn = await subscribeQueueToTopic(topicArn, queueArn);
|
|
236
|
+
|
|
237
|
+
try {
|
|
238
|
+
// Wait a moment for subscription to be ready
|
|
239
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
240
|
+
|
|
241
|
+
// Create SNS publisher
|
|
242
|
+
const snsConnection = new SNSConnection({
|
|
243
|
+
topicArn,
|
|
244
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
245
|
+
region: AWS_REGION,
|
|
246
|
+
credentials: AWS_CREDENTIALS,
|
|
247
|
+
});
|
|
248
|
+
await snsConnection.connect();
|
|
249
|
+
|
|
250
|
+
const snsPublisher = new SNSPublisher<TestMessage>(snsConnection);
|
|
251
|
+
|
|
252
|
+
// Create SQS subscriber
|
|
253
|
+
const sqsConnection = new SQSConnection({
|
|
254
|
+
queueUrl,
|
|
255
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
256
|
+
region: AWS_REGION,
|
|
257
|
+
credentials: AWS_CREDENTIALS,
|
|
258
|
+
});
|
|
259
|
+
await sqsConnection.connect();
|
|
260
|
+
|
|
261
|
+
const sqsSubscriber = new SQSSubscriber<TestMessage>(sqsConnection, {
|
|
262
|
+
waitTimeSeconds: 1,
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
const receivedMessages: TestMessage[] = [];
|
|
266
|
+
|
|
267
|
+
await sqsSubscriber.subscribe(['user.created'], async (message) => {
|
|
268
|
+
receivedMessages.push(message);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Publish via SNS
|
|
272
|
+
await snsPublisher.publish([
|
|
273
|
+
{ type: 'user.created', payload: { userId: '123' } },
|
|
274
|
+
]);
|
|
275
|
+
|
|
276
|
+
// Wait for message to be delivered (SNS to SQS is nearly instant)
|
|
277
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
278
|
+
|
|
279
|
+
sqsSubscriber.stop();
|
|
280
|
+
|
|
281
|
+
expect(receivedMessages).toHaveLength(1);
|
|
282
|
+
expect(receivedMessages[0].type).toBe('user.created');
|
|
283
|
+
expect(receivedMessages[0].payload.userId).toBe('123');
|
|
284
|
+
|
|
285
|
+
await snsConnection.close();
|
|
286
|
+
await sqsConnection.close();
|
|
287
|
+
} finally {
|
|
288
|
+
await unsubscribe(subscriptionArn);
|
|
289
|
+
await deleteQueue(queueUrl);
|
|
290
|
+
await deleteTopic(topicArn);
|
|
291
|
+
}
|
|
292
|
+
}, 15000);
|
|
293
|
+
|
|
294
|
+
it('should fan out to multiple SQS queues', async () => {
|
|
295
|
+
const topicName = uniqueTopicName();
|
|
296
|
+
const queue1Name = uniqueQueueName();
|
|
297
|
+
const queue2Name = uniqueQueueName();
|
|
298
|
+
|
|
299
|
+
const topicArn = await createTopic(topicName);
|
|
300
|
+
const queue1Url = await createQueue(queue1Name);
|
|
301
|
+
const queue2Url = await createQueue(queue2Name);
|
|
302
|
+
const queue1Arn = await getQueueArn(queue1Url);
|
|
303
|
+
const queue2Arn = await getQueueArn(queue2Url);
|
|
304
|
+
|
|
305
|
+
await setQueuePolicy(queue1Url, queue1Arn, topicArn);
|
|
306
|
+
await setQueuePolicy(queue2Url, queue2Arn, topicArn);
|
|
307
|
+
|
|
308
|
+
const subscription1Arn = await subscribeQueueToTopic(topicArn, queue1Arn);
|
|
309
|
+
const subscription2Arn = await subscribeQueueToTopic(topicArn, queue2Arn);
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
313
|
+
|
|
314
|
+
// Create SNS publisher
|
|
315
|
+
const snsConnection = new SNSConnection({
|
|
316
|
+
topicArn,
|
|
317
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
318
|
+
region: AWS_REGION,
|
|
319
|
+
credentials: AWS_CREDENTIALS,
|
|
320
|
+
});
|
|
321
|
+
await snsConnection.connect();
|
|
322
|
+
|
|
323
|
+
const snsPublisher = new SNSPublisher<TestMessage>(snsConnection);
|
|
324
|
+
|
|
325
|
+
// Create SQS subscribers for both queues
|
|
326
|
+
const sqsConnection1 = new SQSConnection({
|
|
327
|
+
queueUrl: queue1Url,
|
|
328
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
329
|
+
region: AWS_REGION,
|
|
330
|
+
credentials: AWS_CREDENTIALS,
|
|
331
|
+
});
|
|
332
|
+
await sqsConnection1.connect();
|
|
333
|
+
|
|
334
|
+
const sqsConnection2 = new SQSConnection({
|
|
335
|
+
queueUrl: queue2Url,
|
|
336
|
+
endpoint: LOCALSTACK_ENDPOINT,
|
|
337
|
+
region: AWS_REGION,
|
|
338
|
+
credentials: AWS_CREDENTIALS,
|
|
339
|
+
});
|
|
340
|
+
await sqsConnection2.connect();
|
|
341
|
+
|
|
342
|
+
const sqsSubscriber1 = new SQSSubscriber<TestMessage>(sqsConnection1, {
|
|
343
|
+
waitTimeSeconds: 1,
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
const sqsSubscriber2 = new SQSSubscriber<TestMessage>(sqsConnection2, {
|
|
347
|
+
waitTimeSeconds: 1,
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
const queue1Messages: TestMessage[] = [];
|
|
351
|
+
const queue2Messages: TestMessage[] = [];
|
|
352
|
+
|
|
353
|
+
await sqsSubscriber1.subscribe(['user.created'], async (message) => {
|
|
354
|
+
queue1Messages.push(message);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
await sqsSubscriber2.subscribe(['user.created'], async (message) => {
|
|
358
|
+
queue2Messages.push(message);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// Publish via SNS
|
|
362
|
+
await snsPublisher.publish([
|
|
363
|
+
{ type: 'user.created', payload: { userId: '456' } },
|
|
364
|
+
]);
|
|
365
|
+
|
|
366
|
+
// Wait for messages
|
|
367
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
368
|
+
|
|
369
|
+
sqsSubscriber1.stop();
|
|
370
|
+
sqsSubscriber2.stop();
|
|
371
|
+
|
|
372
|
+
// Both queues should receive the message
|
|
373
|
+
expect(queue1Messages).toHaveLength(1);
|
|
374
|
+
expect(queue2Messages).toHaveLength(1);
|
|
375
|
+
expect(queue1Messages[0].payload.userId).toBe('456');
|
|
376
|
+
expect(queue2Messages[0].payload.userId).toBe('456');
|
|
377
|
+
|
|
378
|
+
await snsConnection.close();
|
|
379
|
+
await sqsConnection1.close();
|
|
380
|
+
await sqsConnection2.close();
|
|
381
|
+
} finally {
|
|
382
|
+
await unsubscribe(subscription1Arn);
|
|
383
|
+
await unsubscribe(subscription2Arn);
|
|
384
|
+
await deleteQueue(queue1Url);
|
|
385
|
+
await deleteQueue(queue2Url);
|
|
386
|
+
await deleteTopic(topicArn);
|
|
387
|
+
}
|
|
388
|
+
}, 20000);
|
|
389
389
|
});
|