@message-queue-toolkit/sns 21.1.2 → 22.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/dist/errors/SnsConsumerErrorResolver.js +32 -0
- package/dist/errors/SnsConsumerErrorResolver.js.map +1 -0
- package/dist/index.d.ts +19 -19
- package/dist/index.js +15 -39
- package/dist/index.js.map +1 -1
- package/dist/{lib/sns → sns}/AbstractSnsPublisher.d.ts +2 -2
- package/dist/{lib/sns → sns}/AbstractSnsPublisher.js +12 -16
- package/dist/sns/AbstractSnsPublisher.js.map +1 -0
- package/dist/{lib/sns → sns}/AbstractSnsService.d.ts +1 -1
- package/dist/sns/AbstractSnsService.js +28 -0
- package/dist/sns/AbstractSnsService.js.map +1 -0
- package/dist/{lib/sns → sns}/AbstractSnsSqsConsumer.d.ts +2 -2
- package/dist/{lib/sns → sns}/AbstractSnsSqsConsumer.js +8 -12
- package/dist/sns/AbstractSnsSqsConsumer.js.map +1 -0
- package/dist/{lib/sns → sns}/CommonSnsPublisherFactory.d.ts +3 -3
- package/dist/sns/CommonSnsPublisherFactory.js +9 -0
- package/dist/sns/CommonSnsPublisherFactory.js.map +1 -0
- package/dist/{lib/sns → sns}/SnsPublisherManager.d.ts +4 -5
- package/dist/{lib/sns → sns}/SnsPublisherManager.js +4 -8
- package/dist/sns/SnsPublisherManager.js.map +1 -0
- package/dist/{lib/sns → sns}/fakes/FakeConsumer.d.ts +2 -2
- package/dist/{lib/sns → sns}/fakes/FakeConsumer.js +4 -8
- package/dist/sns/fakes/FakeConsumer.js.map +1 -0
- package/dist/types/MessageTypes.js +19 -0
- package/dist/types/MessageTypes.js.map +1 -0
- package/dist/{lib/types → types}/TopicTypes.d.ts +1 -1
- package/dist/types/TopicTypes.js +8 -0
- package/dist/types/TopicTypes.js.map +1 -0
- package/dist/{lib/utils → utils}/snsAttributeUtils.js +2 -7
- package/dist/utils/snsAttributeUtils.js.map +1 -0
- package/dist/{lib/utils → utils}/snsInitter.d.ts +3 -3
- package/dist/{lib/utils → utils}/snsInitter.js +33 -34
- package/dist/utils/snsInitter.js.map +1 -0
- package/dist/utils/snsMessageDeserializer.js +14 -0
- package/dist/utils/snsMessageDeserializer.js.map +1 -0
- package/dist/{lib/utils → utils}/snsMessageReader.js +1 -4
- package/dist/utils/snsMessageReader.js.map +1 -0
- package/dist/{lib/utils → utils}/snsSubscriber.d.ts +3 -4
- package/dist/{lib/utils → utils}/snsSubscriber.js +14 -17
- package/dist/utils/snsSubscriber.js.map +1 -0
- package/dist/{lib/utils → utils}/snsUtils.d.ts +1 -1
- package/dist/{lib/utils → utils}/snsUtils.js +30 -41
- package/dist/utils/snsUtils.js.map +1 -0
- package/dist/{lib/utils → utils}/stsUtils.js +5 -9
- package/dist/utils/stsUtils.js.map +1 -0
- package/package.json +77 -64
- package/dist/lib/errors/SnsConsumerErrorResolver.js +0 -36
- package/dist/lib/errors/SnsConsumerErrorResolver.js.map +0 -1
- package/dist/lib/sns/AbstractSnsPublisher.js.map +0 -1
- package/dist/lib/sns/AbstractSnsService.js +0 -32
- package/dist/lib/sns/AbstractSnsService.js.map +0 -1
- package/dist/lib/sns/AbstractSnsSqsConsumer.js.map +0 -1
- package/dist/lib/sns/CommonSnsPublisherFactory.js +0 -14
- package/dist/lib/sns/CommonSnsPublisherFactory.js.map +0 -1
- package/dist/lib/sns/SnsPublisherManager.js.map +0 -1
- package/dist/lib/sns/fakes/FakeConsumer.js.map +0 -1
- package/dist/lib/types/MessageTypes.js +0 -23
- package/dist/lib/types/MessageTypes.js.map +0 -1
- package/dist/lib/types/TopicTypes.js +0 -12
- package/dist/lib/types/TopicTypes.js.map +0 -1
- package/dist/lib/utils/snsAttributeUtils.js.map +0 -1
- package/dist/lib/utils/snsInitter.js.map +0 -1
- package/dist/lib/utils/snsMessageDeserializer.js +0 -18
- package/dist/lib/utils/snsMessageDeserializer.js.map +0 -1
- package/dist/lib/utils/snsMessageReader.js.map +0 -1
- package/dist/lib/utils/snsSubscriber.js.map +0 -1
- package/dist/lib/utils/snsUtils.js.map +0 -1
- package/dist/lib/utils/stsUtils.js.map +0 -1
- /package/dist/{lib/errors → errors}/SnsConsumerErrorResolver.d.ts +0 -0
- /package/dist/{lib/types → types}/MessageTypes.d.ts +0 -0
- /package/dist/{lib/utils → utils}/snsAttributeUtils.d.ts +0 -0
- /package/dist/{lib/utils → utils}/snsMessageDeserializer.d.ts +0 -0
- /package/dist/{lib/utils → utils}/snsMessageReader.d.ts +0 -0
- /package/dist/{lib/utils → utils}/stsUtils.d.ts +0 -0
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const core_1 = require("@message-queue-toolkit/core");
|
|
8
|
-
const sqs_1 = require("@message-queue-toolkit/sqs");
|
|
9
|
-
const sqs_2 = require("@message-queue-toolkit/sqs");
|
|
10
|
-
const TopicTypes_1 = require("../types/TopicTypes");
|
|
11
|
-
const snsSubscriber_1 = require("./snsSubscriber");
|
|
12
|
-
const snsUtils_1 = require("./snsUtils");
|
|
1
|
+
import { isProduction } from '@message-queue-toolkit/core';
|
|
2
|
+
import { resolveQueueUrlFromLocatorConfig, } from '@message-queue-toolkit/sqs';
|
|
3
|
+
import { deleteQueue, getQueueAttributes } from '@message-queue-toolkit/sqs';
|
|
4
|
+
import { isCreateTopicCommand } from "../types/TopicTypes.js";
|
|
5
|
+
import { subscribeToTopic } from "./snsSubscriber.js";
|
|
6
|
+
import { assertTopic, deleteSubscription, deleteTopic, getTopicArnByName, getTopicAttributes, } from "./snsUtils.js";
|
|
13
7
|
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>
|
|
14
|
-
async function initSnsSqs(sqsClient, snsClient, stsClient, locatorConfig, creationConfig, subscriptionConfig, extraParams) {
|
|
8
|
+
export async function initSnsSqs(sqsClient, snsClient, stsClient, locatorConfig, creationConfig, subscriptionConfig, extraParams) {
|
|
15
9
|
if (!locatorConfig?.subscriptionArn) {
|
|
16
10
|
if (!creationConfig?.topic && !locatorConfig?.topicArn && !locatorConfig?.topicName) {
|
|
17
11
|
throw new Error('If locatorConfig.subscriptionArn is not specified, creationConfig.topic is mandatory in order to attempt to create missing topic and subscribe to it OR locatorConfig.name or locatorConfig.topicArn parameter is mandatory, to create subscription for existing topic.');
|
|
@@ -29,7 +23,7 @@ async function initSnsSqs(sqsClient, snsClient, stsClient, locatorConfig, creati
|
|
|
29
23
|
...locatorConfig,
|
|
30
24
|
...creationConfig.topic,
|
|
31
25
|
};
|
|
32
|
-
const { subscriptionArn, topicArn, queueUrl } = await
|
|
26
|
+
const { subscriptionArn, topicArn, queueUrl } = await subscribeToTopic(sqsClient, snsClient, stsClient, creationConfig.queue, topicResolutionOptions, subscriptionConfig, {
|
|
33
27
|
updateAttributesIfExists: creationConfig.updateAttributesIfExists,
|
|
34
28
|
queueUrlsWithSubscribePermissionsPrefix: creationConfig.queueUrlsWithSubscribePermissionsPrefix,
|
|
35
29
|
allowedSourceOwner: creationConfig.allowedSourceOwner,
|
|
@@ -47,27 +41,29 @@ async function initSnsSqs(sqsClient, snsClient, stsClient, locatorConfig, creati
|
|
|
47
41
|
queueUrl,
|
|
48
42
|
};
|
|
49
43
|
}
|
|
50
|
-
const queueUrl = await
|
|
44
|
+
const queueUrl = await resolveQueueUrlFromLocatorConfig(sqsClient, locatorConfig);
|
|
51
45
|
const checkPromises = [];
|
|
52
46
|
// Check for existing resources, using the locators
|
|
53
|
-
const subscriptionTopicArn = locatorConfig.topicArn ?? (await
|
|
54
|
-
const topicPromise =
|
|
47
|
+
const subscriptionTopicArn = locatorConfig.topicArn ?? (await getTopicArnByName(snsClient, locatorConfig.topicName));
|
|
48
|
+
const topicPromise = getTopicAttributes(snsClient, subscriptionTopicArn);
|
|
55
49
|
checkPromises.push(topicPromise);
|
|
56
|
-
const queuePromise =
|
|
50
|
+
const queuePromise = getQueueAttributes(sqsClient, queueUrl);
|
|
57
51
|
checkPromises.push(queuePromise);
|
|
58
52
|
const [topicCheckResult, queueCheckResult] = await Promise.all(checkPromises);
|
|
59
53
|
if (queueCheckResult?.error === 'not_found') {
|
|
60
54
|
throw new Error(`Queue with queueUrl ${queueUrl} does not exist.`);
|
|
61
55
|
}
|
|
62
|
-
if (topicCheckResult
|
|
56
|
+
if (topicCheckResult?.error === 'not_found') {
|
|
63
57
|
throw new Error(`Topic with topicArn ${locatorConfig.topicArn} does not exist.`);
|
|
64
58
|
}
|
|
65
59
|
let queueName;
|
|
66
60
|
if (queueUrl) {
|
|
67
61
|
const splitUrl = queueUrl.split('/');
|
|
62
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
68
63
|
queueName = splitUrl[splitUrl.length - 1];
|
|
69
64
|
}
|
|
70
65
|
else {
|
|
66
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
71
67
|
queueName = creationConfig.queue.QueueName;
|
|
72
68
|
}
|
|
73
69
|
return {
|
|
@@ -77,47 +73,49 @@ async function initSnsSqs(sqsClient, snsClient, stsClient, locatorConfig, creati
|
|
|
77
73
|
queueName,
|
|
78
74
|
};
|
|
79
75
|
}
|
|
80
|
-
async function deleteSnsSqs(sqsClient, snsClient, stsClient, deletionConfig, queueConfiguration, topicConfiguration, subscriptionConfiguration, extraParams, topicLocator) {
|
|
76
|
+
export async function deleteSnsSqs(sqsClient, snsClient, stsClient, deletionConfig, queueConfiguration, topicConfiguration, subscriptionConfiguration, extraParams, topicLocator) {
|
|
81
77
|
if (!deletionConfig.deleteIfExists) {
|
|
82
78
|
return;
|
|
83
79
|
}
|
|
84
|
-
if (
|
|
80
|
+
if (isProduction() && !deletionConfig.forceDeleteInProduction) {
|
|
85
81
|
throw new Error('You are running autodeletion in production. This can and probably will cause a loss of data. If you are absolutely sure you want to do this, please set deletionConfig.forceDeleteInProduction to true');
|
|
86
82
|
}
|
|
87
|
-
const { subscriptionArn } = await
|
|
83
|
+
const { subscriptionArn } = await subscribeToTopic(sqsClient, snsClient, stsClient, queueConfiguration,
|
|
84
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
85
|
+
topicConfiguration ?? topicLocator, subscriptionConfiguration, extraParams);
|
|
88
86
|
if (!subscriptionArn) {
|
|
89
87
|
throw new Error('subscriptionArn must be set for automatic deletion');
|
|
90
88
|
}
|
|
91
|
-
await
|
|
92
|
-
//
|
|
89
|
+
await deleteQueue(sqsClient,
|
|
90
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
93
91
|
queueConfiguration.QueueName, deletionConfig.waitForConfirmation !== false);
|
|
94
92
|
if (topicConfiguration) {
|
|
95
|
-
const topicName =
|
|
93
|
+
const topicName = isCreateTopicCommand(topicConfiguration)
|
|
96
94
|
? topicConfiguration.Name
|
|
97
95
|
: 'undefined';
|
|
98
96
|
if (!topicName) {
|
|
99
97
|
throw new Error('Failed to resolve topic name');
|
|
100
98
|
}
|
|
101
|
-
await
|
|
99
|
+
await deleteTopic(snsClient, stsClient, topicName);
|
|
102
100
|
}
|
|
103
|
-
await
|
|
101
|
+
await deleteSubscription(snsClient, subscriptionArn);
|
|
104
102
|
}
|
|
105
|
-
async function deleteSns(snsClient, stsClient, deletionConfig, creationConfig) {
|
|
103
|
+
export async function deleteSns(snsClient, stsClient, deletionConfig, creationConfig) {
|
|
106
104
|
if (!deletionConfig.deleteIfExists) {
|
|
107
105
|
return;
|
|
108
106
|
}
|
|
109
|
-
if (
|
|
107
|
+
if (isProduction() && !deletionConfig.forceDeleteInProduction) {
|
|
110
108
|
throw new Error('You are running autodeletion in production. This can and probably will cause a loss of data. If you are absolutely sure you want to do this, please set deletionConfig.forceDeleteInProduction to true');
|
|
111
109
|
}
|
|
112
110
|
if (!creationConfig.topic?.Name) {
|
|
113
111
|
throw new Error('topic.Name must be set for automatic deletion');
|
|
114
112
|
}
|
|
115
|
-
await
|
|
113
|
+
await deleteTopic(snsClient, stsClient, creationConfig.topic.Name);
|
|
116
114
|
}
|
|
117
|
-
async function initSns(snsClient, stsClient, locatorConfig, creationConfig) {
|
|
115
|
+
export async function initSns(snsClient, stsClient, locatorConfig, creationConfig) {
|
|
118
116
|
if (locatorConfig) {
|
|
119
|
-
const topicArn = locatorConfig.topicArn ?? (await
|
|
120
|
-
const checkResult = await
|
|
117
|
+
const topicArn = locatorConfig.topicArn ?? (await getTopicArnByName(snsClient, locatorConfig.topicName));
|
|
118
|
+
const checkResult = await getTopicAttributes(snsClient, topicArn);
|
|
121
119
|
if (checkResult.error === 'not_found') {
|
|
122
120
|
throw new Error(`Topic with topicArn ${locatorConfig.topicArn} does not exist.`);
|
|
123
121
|
}
|
|
@@ -129,7 +127,8 @@ async function initSns(snsClient, stsClient, locatorConfig, creationConfig) {
|
|
|
129
127
|
if (!creationConfig) {
|
|
130
128
|
throw new Error('When locatorConfig for the topic is not specified, creationConfig of the topic is mandatory');
|
|
131
129
|
}
|
|
132
|
-
|
|
130
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
131
|
+
const topicArn = await assertTopic(snsClient, stsClient, creationConfig.topic, {
|
|
133
132
|
queueUrlsWithSubscribePermissionsPrefix: creationConfig.queueUrlsWithSubscribePermissionsPrefix,
|
|
134
133
|
allowedSourceOwner: creationConfig.allowedSourceOwner,
|
|
135
134
|
forceTagUpdate: creationConfig.forceTagUpdate,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snsInitter.js","sourceRoot":"","sources":["../../lib/utils/snsInitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { parseMessage } from '@message-queue-toolkit/core';
|
|
2
|
+
import { SNS_MESSAGE_BODY_SCHEMA } from "../types/MessageTypes.js";
|
|
3
|
+
export const deserializeSNSMessage = (message, type, errorProcessor) => {
|
|
4
|
+
try {
|
|
5
|
+
const snsMessage = SNS_MESSAGE_BODY_SCHEMA.parse(JSON.parse(message.Body));
|
|
6
|
+
return parseMessage(JSON.parse(snsMessage.Message), type, errorProcessor);
|
|
7
|
+
}
|
|
8
|
+
catch (exception) {
|
|
9
|
+
return {
|
|
10
|
+
error: errorProcessor.processError(exception),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=snsMessageDeserializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snsMessageDeserializer.js","sourceRoot":"","sources":["../../lib/utils/snsMessageDeserializer.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAI1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAmB,EACnB,IAAgB,EAChB,cAA6B,EACsD,EAAE;IACrF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAE1E,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;IAC3E,CAAC;IAAC,OAAO,SAAS,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC;SAC9C,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.readSnsMessage = readSnsMessage;
|
|
4
|
-
function readSnsMessage(message, errorProcessor) {
|
|
1
|
+
export function readSnsMessage(message, errorProcessor) {
|
|
5
2
|
try {
|
|
6
3
|
const snsMessage = JSON.parse(message.Body);
|
|
7
4
|
const messagePayload = JSON.parse(snsMessage.Message);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snsMessageReader.js","sourceRoot":"","sources":["../../lib/utils/snsMessageReader.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,cAAc,CAC5B,OAAmB,EACnB,cAA6B;IAE7B,IAAI,CAAC;QACH,MAAM,UAAU,GAA0B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAErD,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,UAAU,CAAC,iBAAiB;aACzC;SACF,CAAA;IACH,CAAC;IAAC,OAAO,SAAS,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC;SAC9C,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { SNSClient } from '@aws-sdk/client-sns';
|
|
2
|
-
import type { SubscribeCommandInput } from '@aws-sdk/client-sns/dist-types/commands/SubscribeCommand';
|
|
1
|
+
import type { SNSClient, SubscribeCommandInput } from '@aws-sdk/client-sns';
|
|
3
2
|
import type { CreateQueueCommandInput, SQSClient } from '@aws-sdk/client-sqs';
|
|
4
3
|
import type { ExtraParams } from '@message-queue-toolkit/core';
|
|
5
4
|
import type { ExtraSQSCreationParams } from '@message-queue-toolkit/sqs';
|
|
6
|
-
import type { ExtraSNSCreationParams } from '../sns/AbstractSnsService';
|
|
5
|
+
import type { ExtraSNSCreationParams } from '../sns/AbstractSnsService.ts';
|
|
7
6
|
import type { STSClient } from '@aws-sdk/client-sts';
|
|
8
|
-
import { type TopicResolutionOptions } from '../types/TopicTypes';
|
|
7
|
+
import { type TopicResolutionOptions } from '../types/TopicTypes.ts';
|
|
9
8
|
export type SNSSubscriptionOptions = Omit<SubscribeCommandInput, 'TopicArn' | 'Endpoint' | 'Protocol' | 'ReturnSubscriptionArn'> & {
|
|
10
9
|
updateAttributesIfExists: boolean;
|
|
11
10
|
};
|
|
@@ -1,34 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const sqs_1 = require("@message-queue-toolkit/sqs");
|
|
6
|
-
const TopicTypes_1 = require("../types/TopicTypes");
|
|
7
|
-
const snsUtils_1 = require("./snsUtils");
|
|
1
|
+
import { SetSubscriptionAttributesCommand, SubscribeCommand } from '@aws-sdk/client-sns';
|
|
2
|
+
import { assertQueue } from '@message-queue-toolkit/sqs';
|
|
3
|
+
import { isCreateTopicCommand, isSNSTopicLocatorType, } from "../types/TopicTypes.js";
|
|
4
|
+
import { assertTopic, findSubscriptionByTopicAndQueue, getTopicArnByName } from "./snsUtils.js";
|
|
8
5
|
async function resolveTopicArnToSubscribeTo(snsClient, stsClient, topicConfiguration, extraParams) {
|
|
9
6
|
//If topicArn is present, let's use it and return early.
|
|
10
|
-
if (
|
|
7
|
+
if (isSNSTopicLocatorType(topicConfiguration) && topicConfiguration.topicArn) {
|
|
11
8
|
return topicConfiguration.topicArn;
|
|
12
9
|
}
|
|
13
10
|
//If input configuration is capable of creating a topic, let's create it and return its ARN.
|
|
14
|
-
if (
|
|
15
|
-
return await
|
|
11
|
+
if (isCreateTopicCommand(topicConfiguration)) {
|
|
12
|
+
return await assertTopic(snsClient, stsClient, topicConfiguration, {
|
|
16
13
|
queueUrlsWithSubscribePermissionsPrefix: extraParams?.queueUrlsWithSubscribePermissionsPrefix,
|
|
17
14
|
allowedSourceOwner: extraParams?.allowedSourceOwner,
|
|
18
15
|
forceTagUpdate: extraParams?.forceTagUpdate,
|
|
19
16
|
});
|
|
20
17
|
}
|
|
21
18
|
//Last option: let's not create a topic but resolve a ARN based on the desired topic name.
|
|
22
|
-
return await
|
|
19
|
+
return await getTopicArnByName(snsClient, topicConfiguration.topicName);
|
|
23
20
|
}
|
|
24
|
-
async function subscribeToTopic(sqsClient, snsClient, stsClient, queueConfiguration, topicConfiguration, subscriptionConfiguration, extraParams) {
|
|
21
|
+
export async function subscribeToTopic(sqsClient, snsClient, stsClient, queueConfiguration, topicConfiguration, subscriptionConfiguration, extraParams) {
|
|
25
22
|
const topicArn = await resolveTopicArnToSubscribeTo(snsClient, stsClient, topicConfiguration, extraParams);
|
|
26
|
-
const { queueUrl, queueArn } = await
|
|
23
|
+
const { queueUrl, queueArn } = await assertQueue(sqsClient, queueConfiguration, {
|
|
27
24
|
topicArnsWithPublishPermissionsPrefix: extraParams?.topicArnsWithPublishPermissionsPrefix,
|
|
28
25
|
updateAttributesIfExists: extraParams?.updateAttributesIfExists,
|
|
29
26
|
forceTagUpdate: extraParams?.forceTagUpdate,
|
|
30
27
|
});
|
|
31
|
-
const subscribeCommand = new
|
|
28
|
+
const subscribeCommand = new SubscribeCommand({
|
|
32
29
|
TopicArn: topicArn,
|
|
33
30
|
Endpoint: queueArn,
|
|
34
31
|
Protocol: 'sqs',
|
|
@@ -47,7 +44,7 @@ async function subscribeToTopic(sqsClient, snsClient, stsClient, queueConfigurat
|
|
|
47
44
|
catch (err) {
|
|
48
45
|
const logger = extraParams?.logger ?? console;
|
|
49
46
|
// @ts-ignore
|
|
50
|
-
logger.error(`Error while creating subscription for queue "${queueConfiguration.QueueName}", topic "${
|
|
47
|
+
logger.error(`Error while creating subscription for queue "${queueConfiguration.QueueName}", topic "${isCreateTopicCommand(topicConfiguration)
|
|
51
48
|
? topicConfiguration.Name
|
|
52
49
|
: topicConfiguration.topicName}": ${err.message}`);
|
|
53
50
|
if (subscriptionConfiguration.updateAttributesIfExists &&
|
|
@@ -68,12 +65,12 @@ async function subscribeToTopic(sqsClient, snsClient, stsClient, queueConfigurat
|
|
|
68
65
|
}
|
|
69
66
|
}
|
|
70
67
|
async function tryToUpdateSubscription(snsClient, topicArn, queueArn, subscriptionConfiguration) {
|
|
71
|
-
const subscription = await
|
|
68
|
+
const subscription = await findSubscriptionByTopicAndQueue(snsClient, topicArn, queueArn);
|
|
72
69
|
if (!subscription || !subscriptionConfiguration.Attributes) {
|
|
73
70
|
return undefined;
|
|
74
71
|
}
|
|
75
72
|
const setSubscriptionAttributesCommands = Object.entries(subscriptionConfiguration.Attributes).map(([key, value]) => {
|
|
76
|
-
return new
|
|
73
|
+
return new SetSubscriptionAttributesCommand({
|
|
77
74
|
SubscriptionArn: subscription.SubscriptionArn,
|
|
78
75
|
AttributeName: key,
|
|
79
76
|
AttributeValue: value,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snsSubscriber.js","sourceRoot":"","sources":["../../lib/utils/snsSubscriber.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type CreateTopicCommandInput, type SNSClient } from '@aws-sdk/client-sns';
|
|
2
2
|
import { type Either } from '@lokalise/node-core';
|
|
3
|
-
import type { ExtraSNSCreationParams } from '../sns/AbstractSnsService';
|
|
3
|
+
import type { ExtraSNSCreationParams } from '../sns/AbstractSnsService.ts';
|
|
4
4
|
import type { STSClient } from '@aws-sdk/client-sts';
|
|
5
5
|
type AttributesResult = {
|
|
6
6
|
attributes?: Record<string, string>;
|
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
exports.findSubscriptionByTopicAndQueue = findSubscriptionByTopicAndQueue;
|
|
10
|
-
exports.getTopicArnByName = getTopicArnByName;
|
|
11
|
-
const client_sns_1 = require("@aws-sdk/client-sns");
|
|
12
|
-
const client_sns_2 = require("@aws-sdk/client-sns");
|
|
13
|
-
const node_core_1 = require("@lokalise/node-core");
|
|
14
|
-
const sqs_1 = require("@message-queue-toolkit/sqs");
|
|
15
|
-
const snsAttributeUtils_1 = require("./snsAttributeUtils");
|
|
16
|
-
const stsUtils_1 = require("./stsUtils");
|
|
17
|
-
async function getTopicAttributes(snsClient, topicArn) {
|
|
18
|
-
const command = new client_sns_2.GetTopicAttributesCommand({
|
|
1
|
+
import { ListTagsForResourceCommand, TagResourceCommand, paginateListTopics, } from '@aws-sdk/client-sns';
|
|
2
|
+
import { CreateTopicCommand, DeleteTopicCommand, GetSubscriptionAttributesCommand, GetTopicAttributesCommand, ListSubscriptionsByTopicCommand, SetTopicAttributesCommand, UnsubscribeCommand, } from '@aws-sdk/client-sns';
|
|
3
|
+
import { InternalError, isError } from '@lokalise/node-core';
|
|
4
|
+
import { calculateOutgoingMessageSize as sqsCalculateOutgoingMessageSize } from '@message-queue-toolkit/sqs';
|
|
5
|
+
import { generateTopicSubscriptionPolicy } from "./snsAttributeUtils.js";
|
|
6
|
+
import { buildTopicArn } from "./stsUtils.js";
|
|
7
|
+
export async function getTopicAttributes(snsClient, topicArn) {
|
|
8
|
+
const command = new GetTopicAttributesCommand({
|
|
19
9
|
TopicArn: topicArn,
|
|
20
10
|
});
|
|
21
11
|
try {
|
|
@@ -37,8 +27,8 @@ async function getTopicAttributes(snsClient, topicArn) {
|
|
|
37
27
|
throw err;
|
|
38
28
|
}
|
|
39
29
|
}
|
|
40
|
-
async function getSubscriptionAttributes(snsClient, subscriptionArn) {
|
|
41
|
-
const command = new
|
|
30
|
+
export async function getSubscriptionAttributes(snsClient, subscriptionArn) {
|
|
31
|
+
const command = new GetSubscriptionAttributesCommand({
|
|
42
32
|
SubscriptionArn: subscriptionArn,
|
|
43
33
|
});
|
|
44
34
|
try {
|
|
@@ -60,31 +50,31 @@ async function getSubscriptionAttributes(snsClient, subscriptionArn) {
|
|
|
60
50
|
throw err;
|
|
61
51
|
}
|
|
62
52
|
}
|
|
63
|
-
async function assertTopic(snsClient, stsClient, topicOptions, extraParams) {
|
|
53
|
+
export async function assertTopic(snsClient, stsClient, topicOptions, extraParams) {
|
|
64
54
|
let topicArn;
|
|
65
55
|
try {
|
|
66
|
-
const command = new
|
|
56
|
+
const command = new CreateTopicCommand(topicOptions);
|
|
67
57
|
const response = await snsClient.send(command);
|
|
68
58
|
if (!response.TopicArn)
|
|
69
59
|
throw new Error('No topic arn in response');
|
|
70
60
|
topicArn = response.TopicArn;
|
|
71
61
|
}
|
|
72
62
|
catch (error) {
|
|
73
|
-
if (!
|
|
63
|
+
if (!isError(error))
|
|
74
64
|
throw error;
|
|
75
65
|
// To build ARN we need topic name and error should be "topic already exist with different tags"
|
|
76
66
|
if (!topicOptions.Name || !isTopicAlreadyExistWithDifferentTagsError(error)) {
|
|
77
|
-
throw new
|
|
67
|
+
throw new InternalError({
|
|
78
68
|
message: `${topicOptions.Name} - ${error.message}`,
|
|
79
69
|
cause: error,
|
|
80
70
|
details: { topicName: topicOptions.Name },
|
|
81
71
|
errorCode: 'SNS_CREATE_TOPIC_COMMAND_UNEXPECTED_ERROR',
|
|
82
72
|
});
|
|
83
73
|
}
|
|
84
|
-
topicArn = await
|
|
74
|
+
topicArn = await buildTopicArn(stsClient, topicOptions.Name);
|
|
85
75
|
if (!extraParams?.forceTagUpdate) {
|
|
86
|
-
const currentTags = await snsClient.send(new
|
|
87
|
-
throw new
|
|
76
|
+
const currentTags = await snsClient.send(new ListTagsForResourceCommand({ ResourceArn: topicArn }));
|
|
77
|
+
throw new InternalError({
|
|
88
78
|
message: `${topicOptions.Name} - ${error.message}`,
|
|
89
79
|
details: {
|
|
90
80
|
topicName: topicOptions.Name,
|
|
@@ -97,10 +87,10 @@ async function assertTopic(snsClient, stsClient, topicOptions, extraParams) {
|
|
|
97
87
|
}
|
|
98
88
|
}
|
|
99
89
|
if (extraParams?.queueUrlsWithSubscribePermissionsPrefix || extraParams?.allowedSourceOwner) {
|
|
100
|
-
const setTopicAttributesCommand = new
|
|
90
|
+
const setTopicAttributesCommand = new SetTopicAttributesCommand({
|
|
101
91
|
TopicArn: topicArn,
|
|
102
92
|
AttributeName: 'Policy',
|
|
103
|
-
AttributeValue:
|
|
93
|
+
AttributeValue: generateTopicSubscriptionPolicy({
|
|
104
94
|
topicArn,
|
|
105
95
|
allowedSqsQueueUrlPrefix: extraParams.queueUrlsWithSubscribePermissionsPrefix,
|
|
106
96
|
allowedSourceOwner: extraParams.allowedSourceOwner,
|
|
@@ -109,7 +99,7 @@ async function assertTopic(snsClient, stsClient, topicOptions, extraParams) {
|
|
|
109
99
|
await snsClient.send(setTopicAttributesCommand);
|
|
110
100
|
}
|
|
111
101
|
if (extraParams?.forceTagUpdate && topicOptions.Tags) {
|
|
112
|
-
const tagTopicCommand = new
|
|
102
|
+
const tagTopicCommand = new TagResourceCommand({
|
|
113
103
|
ResourceArn: topicArn,
|
|
114
104
|
Tags: topicOptions.Tags,
|
|
115
105
|
});
|
|
@@ -117,12 +107,12 @@ async function assertTopic(snsClient, stsClient, topicOptions, extraParams) {
|
|
|
117
107
|
}
|
|
118
108
|
return topicArn;
|
|
119
109
|
}
|
|
120
|
-
async function deleteTopic(snsClient, stsClient, topicName) {
|
|
110
|
+
export async function deleteTopic(snsClient, stsClient, topicName) {
|
|
121
111
|
try {
|
|
122
112
|
const topicArn = await assertTopic(snsClient, stsClient, {
|
|
123
113
|
Name: topicName,
|
|
124
114
|
});
|
|
125
|
-
await snsClient.send(new
|
|
115
|
+
await snsClient.send(new DeleteTopicCommand({
|
|
126
116
|
TopicArn: topicArn,
|
|
127
117
|
}));
|
|
128
118
|
}
|
|
@@ -130,8 +120,8 @@ async function deleteTopic(snsClient, stsClient, topicName) {
|
|
|
130
120
|
// we don't care it operation has failed
|
|
131
121
|
}
|
|
132
122
|
}
|
|
133
|
-
async function deleteSubscription(client, subscriptionArn) {
|
|
134
|
-
const command = new
|
|
123
|
+
export async function deleteSubscription(client, subscriptionArn) {
|
|
124
|
+
const command = new UnsubscribeCommand({
|
|
135
125
|
SubscriptionArn: subscriptionArn,
|
|
136
126
|
});
|
|
137
127
|
try {
|
|
@@ -141,8 +131,8 @@ async function deleteSubscription(client, subscriptionArn) {
|
|
|
141
131
|
// we don't care it operation has failed
|
|
142
132
|
}
|
|
143
133
|
}
|
|
144
|
-
async function findSubscriptionByTopicAndQueue(snsClient, topicArn, queueArn) {
|
|
145
|
-
const listSubscriptionsCommand = new
|
|
134
|
+
export async function findSubscriptionByTopicAndQueue(snsClient, topicArn, queueArn) {
|
|
135
|
+
const listSubscriptionsCommand = new ListSubscriptionsByTopicCommand({
|
|
146
136
|
TopicArn: topicArn,
|
|
147
137
|
});
|
|
148
138
|
const listSubscriptionResult = await snsClient.send(listSubscriptionsCommand);
|
|
@@ -150,12 +140,12 @@ async function findSubscriptionByTopicAndQueue(snsClient, topicArn, queueArn) {
|
|
|
150
140
|
return entry.Endpoint === queueArn;
|
|
151
141
|
});
|
|
152
142
|
}
|
|
153
|
-
async function getTopicArnByName(snsClient, topicName) {
|
|
143
|
+
export async function getTopicArnByName(snsClient, topicName) {
|
|
154
144
|
if (!topicName) {
|
|
155
145
|
throw new Error('topicName is not provided');
|
|
156
146
|
}
|
|
157
147
|
// Use paginator to automatically handle NextToken
|
|
158
|
-
const paginator =
|
|
148
|
+
const paginator = paginateListTopics({ client: snsClient }, {});
|
|
159
149
|
for await (const page of paginator) {
|
|
160
150
|
for (const topic of page.Topics || []) {
|
|
161
151
|
if (topic.TopicArn?.includes(topicName)) {
|
|
@@ -176,10 +166,9 @@ async function getTopicArnByName(snsClient, topicName) {
|
|
|
176
166
|
*
|
|
177
167
|
* A wrapper around the equivalent function in the SQS package.
|
|
178
168
|
*/
|
|
179
|
-
const calculateOutgoingMessageSize = (message) => (
|
|
180
|
-
exports.calculateOutgoingMessageSize = calculateOutgoingMessageSize;
|
|
169
|
+
export const calculateOutgoingMessageSize = (message) => sqsCalculateOutgoingMessageSize(message);
|
|
181
170
|
const isTopicAlreadyExistWithDifferentTagsError = (error) => !!error &&
|
|
182
|
-
|
|
171
|
+
isError(error) &&
|
|
183
172
|
'Error' in error &&
|
|
184
173
|
!!error.Error &&
|
|
185
174
|
typeof error.Error === 'object' &&
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snsUtils.js","sourceRoot":"","sources":["../../lib/utils/snsUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.clearCachedCallerIdentity = exports.buildTopicArn = void 0;
|
|
4
|
-
const client_sts_1 = require("@aws-sdk/client-sts");
|
|
1
|
+
import { GetCallerIdentityCommand, } from '@aws-sdk/client-sts';
|
|
5
2
|
let callerIdentityPromise;
|
|
6
3
|
let callerIdentityCached;
|
|
7
4
|
/**
|
|
@@ -9,27 +6,26 @@ let callerIdentityCached;
|
|
|
9
6
|
* It follows the following pattern: arn:aws:sns:<region>:<account-id>:<topic-name>
|
|
10
7
|
* Doc -> https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html
|
|
11
8
|
*/
|
|
12
|
-
const buildTopicArn = async (client, topicName) => {
|
|
9
|
+
export const buildTopicArn = async (client, topicName) => {
|
|
13
10
|
const identityResponse = await getAndCacheCallerIdentity(client);
|
|
14
11
|
const region = typeof client.config.region === 'string' ? client.config.region : await client.config.region();
|
|
15
12
|
return `arn:aws:sns:${region}:${identityResponse.Account}:${topicName}`;
|
|
16
13
|
};
|
|
17
|
-
|
|
18
|
-
const clearCachedCallerIdentity = () => {
|
|
14
|
+
export const clearCachedCallerIdentity = () => {
|
|
19
15
|
callerIdentityPromise = undefined;
|
|
20
16
|
callerIdentityCached = undefined;
|
|
21
17
|
};
|
|
22
|
-
exports.clearCachedCallerIdentity = clearCachedCallerIdentity;
|
|
23
18
|
const getAndCacheCallerIdentity = async (client) => {
|
|
24
19
|
if (!callerIdentityCached) {
|
|
25
20
|
if (!callerIdentityPromise) {
|
|
26
|
-
callerIdentityPromise = client.send(new
|
|
21
|
+
callerIdentityPromise = client.send(new GetCallerIdentityCommand({})).then((response) => {
|
|
27
22
|
callerIdentityCached = response;
|
|
28
23
|
});
|
|
29
24
|
}
|
|
30
25
|
await callerIdentityPromise;
|
|
31
26
|
callerIdentityPromise = undefined;
|
|
32
27
|
}
|
|
28
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
33
29
|
return callerIdentityCached;
|
|
34
30
|
};
|
|
35
31
|
//# sourceMappingURL=stsUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stsUtils.js","sourceRoot":"","sources":["../../lib/utils/stsUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAGzB,MAAM,qBAAqB,CAAA;AAE5B,IAAI,qBAAgD,CAAA;AACpD,IAAI,oBAAgE,CAAA;AAEpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,MAAiB,EAAE,SAAiB,EAAE,EAAE;IAC1E,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAChE,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;IAEhG,OAAO,eAAe,MAAM,IAAI,gBAAgB,CAAC,OAAO,IAAI,SAAS,EAAE,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,qBAAqB,GAAG,SAAS,CAAA;IACjC,oBAAoB,GAAG,SAAS,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,yBAAyB,GAAG,KAAK,EACrC,MAAiB,EACwB,EAAE;IAC3C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACtF,oBAAoB,GAAG,QAAQ,CAAA;YACjC,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,qBAAqB,CAAA;QAC3B,qBAAqB,GAAG,SAAS,CAAA;IACnC,CAAC;IAED,4DAA4D;IAC5D,OAAO,oBAAqB,CAAA;AAC9B,CAAC,CAAA"}
|