UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

211 lines 9.45 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsSnsTrigger = void 0; const get_1 = __importDefault(require("lodash/get")); const n8n_workflow_1 = require("n8n-workflow"); const GenericFunctions_1 = require("./GenericFunctions"); const utils_1 = require("./utils"); class AwsSnsTrigger { description = { displayName: 'AWS SNS Trigger', subtitle: '={{$parameter["topic"].split(\':\')[5]}}', name: 'awsSnsTrigger', icon: 'file:sns.svg', group: ['trigger'], version: 1, description: 'Handle AWS SNS events via webhooks', defaults: { name: 'AWS SNS Trigger', }, inputs: [], outputs: [n8n_workflow_1.NodeConnectionTypes.Main], credentials: utils_1.awsNodeCredentials, webhooks: [ { name: 'default', httpMethod: 'POST', responseMode: 'onReceived', path: 'webhook', }, ], properties: [ utils_1.awsNodeAuthOptions, { displayName: 'Topic', name: 'topic', type: 'resourceLocator', default: { mode: 'list', value: '' }, required: true, modes: [ { displayName: 'From List', name: 'list', type: 'list', placeholder: 'Select a topic...', typeOptions: { searchListMethod: 'listTopics', searchable: true, }, }, { displayName: 'By URL', name: 'url', type: 'string', placeholder: 'https://us-east-1.console.aws.amazon.com/sns/v3/home?region=us-east-1#/topic/arn:aws:sns:us-east-1:777777777777:your_topic', validation: [ { type: 'regex', properties: { regex: 'https:\\/\\/[0-9a-zA-Z\\-_]+\\.console\\.aws\\.amazon\\.com\\/sns\\/v3\\/home\\?region\\=[0-9a-zA-Z\\-_]+\\#\\/topic\\/arn:aws:sns:[0-9a-zA-Z\\-_]+:[0-9]+:[0-9a-zA-Z\\-_]+(?:\\/.*|)', errorMessage: 'Not a valid AWS SNS Topic URL', }, }, ], extractValue: { type: 'regex', regex: 'https:\\/\\/[0-9a-zA-Z\\-_]+\\.console\\.aws\\.amazon\\.com\\/sns\\/v3\\/home\\?region\\=[0-9a-zA-Z\\-_]+\\#\\/topic\\/(arn:aws:sns:[0-9a-zA-Z\\-_]+:[0-9]+:[0-9a-zA-Z\\-_]+)(?:\\/.*|)', }, }, { displayName: 'ID', name: 'id', type: 'string', validation: [ { type: 'regex', properties: { regex: 'arn:aws:sns:[0-9a-zA-Z\\-_]+:[0-9]+:[0-9a-zA-Z\\-_]+', errorMessage: 'Not a valid AWS SNS Topic ARN', }, }, ], placeholder: 'arn:aws:sns:your-aws-region:777777777777:your_topic', }, ], }, ], }; methods = { listSearch: { async listTopics(filter, paginationToken) { const returnData = []; const params = paginationToken ? `NextToken=${encodeURIComponent(paginationToken)}` : ''; const data = await GenericFunctions_1.awsApiRequestSOAP.call(this, 'sns', 'GET', '/?Action=ListTopics&' + params); let topics = data.ListTopicsResponse.ListTopicsResult.Topics.member; const nextToken = data.ListTopicsResponse.ListTopicsResult.NextToken; if (nextToken) { paginationToken = nextToken; } else { paginationToken = undefined; } if (!Array.isArray(topics)) { topics = [topics]; } for (const topic of topics) { const topicArn = topic.TopicArn; const arnParsed = topicArn.split(':'); const topicName = arnParsed[5]; const awsRegion = arnParsed[3]; if (filter && !topicName.includes(filter)) { continue; } returnData.push({ name: topicName, value: topicArn, url: `https://${awsRegion}.console.aws.amazon.com/sns/v3/home?region=${awsRegion}#/topic/${topicArn}`, }); } return { results: returnData, paginationToken }; }, }, }; webhookMethods = { default: { async checkExists() { const webhookData = this.getWorkflowStaticData('node'); const topic = this.getNodeParameter('topic', undefined, { extractValue: true, }); if (webhookData.webhookId === undefined) { return false; } const params = [`TopicArn=${topic}`, 'Version=2010-03-31']; const data = await GenericFunctions_1.awsApiRequestSOAP.call(this, 'sns', 'GET', '/?Action=ListSubscriptionsByTopic&' + params.join('&')); const subscriptions = (0, get_1.default)(data, 'ListSubscriptionsByTopicResponse.ListSubscriptionsByTopicResult.Subscriptions'); if (!subscriptions?.member) { return false; } let subscriptionMembers = subscriptions.member; if (!Array.isArray(subscriptionMembers)) { subscriptionMembers = [subscriptionMembers]; } for (const subscription of subscriptionMembers) { if (webhookData.webhookId === subscription.SubscriptionArn) { return true; } } return false; }, async create() { const webhookData = this.getWorkflowStaticData('node'); const webhookUrl = this.getNodeWebhookUrl('default'); const topic = this.getNodeParameter('topic', undefined, { extractValue: true, }); if (webhookUrl.includes('%20')) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The name of the SNS Trigger Node is not allowed to contain any spaces!'); } const params = [ `TopicArn=${topic}`, `Endpoint=${webhookUrl}`, `Protocol=${webhookUrl?.split(':')[0]}`, 'ReturnSubscriptionArn=true', 'Version=2010-03-31', ]; const { SubscribeResponse } = await GenericFunctions_1.awsApiRequestSOAP.call(this, 'sns', 'GET', '/?Action=Subscribe&' + params.join('&')); webhookData.webhookId = SubscribeResponse.SubscribeResult.SubscriptionArn; return true; }, async delete() { const webhookData = this.getWorkflowStaticData('node'); const params = [`SubscriptionArn=${webhookData.webhookId}`, 'Version=2010-03-31']; try { await GenericFunctions_1.awsApiRequestSOAP.call(this, 'sns', 'GET', '/?Action=Unsubscribe&' + params.join('&')); } catch (error) { return false; } delete webhookData.webhookId; return true; }, }, }; async webhook() { const req = this.getRequestObject(); const topic = this.getNodeParameter('topic', undefined, { extractValue: true, }); const body = (0, n8n_workflow_1.jsonParse)(req.rawBody.toString()); if (body.Type === 'SubscriptionConfirmation' && body.TopicArn === topic) { const { Token } = body; const params = [`TopicArn=${topic}`, `Token=${Token}`, 'Version=2010-03-31']; await GenericFunctions_1.awsApiRequestSOAP.call(this, 'sns', 'GET', '/?Action=ConfirmSubscription&' + params.join('&')); return { noWebhookResponse: true, }; } if (body.Type === 'UnsubscribeConfirmation') { return {}; } //TODO verify message signature return { workflowData: [this.helpers.returnJsonArray(body)], }; } } exports.AwsSnsTrigger = AwsSnsTrigger; //# sourceMappingURL=AwsSnsTrigger.node.js.map