From 23985dbcb2e6ee2d9b323e44e0bd35846a408baa Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Tue, 31 Dec 2019 19:03:46 -0600 Subject: [PATCH] :sparkles: Add SSE Trigger-Node --- packages/editor-ui/src/main.ts | 2 + packages/nodes-base/nodes/SseTrigger.node.ts | 57 ++++++++++++++++++++ packages/nodes-base/package.json | 3 ++ 3 files changed, 62 insertions(+) create mode 100644 packages/nodes-base/nodes/SseTrigger.node.ts diff --git a/packages/editor-ui/src/main.ts b/packages/editor-ui/src/main.ts index 048a718d96..f9a7f879a0 100644 --- a/packages/editor-ui/src/main.ts +++ b/packages/editor-ui/src/main.ts @@ -33,6 +33,7 @@ import { faCogs, faClone, faCloud, + faCloudDownloadAlt, faCopy, faCut, faDotCircle, @@ -106,6 +107,7 @@ library.add(faCog); library.add(faCogs); library.add(faClone); library.add(faCloud); +library.add(faCloudDownloadAlt); library.add(faCopy); library.add(faCut); library.add(faDotCircle); diff --git a/packages/nodes-base/nodes/SseTrigger.node.ts b/packages/nodes-base/nodes/SseTrigger.node.ts new file mode 100644 index 0000000000..c31e08c321 --- /dev/null +++ b/packages/nodes-base/nodes/SseTrigger.node.ts @@ -0,0 +1,57 @@ +import * as EventSource from 'eventsource'; +import { ITriggerFunctions } from 'n8n-core'; +import { + INodeType, + INodeTypeDescription, + ITriggerResponse, +} from 'n8n-workflow'; + + +export class SseTrigger implements INodeType { + description: INodeTypeDescription = { + displayName: 'SSE Trigger', + name: 'sseTrigger', + icon: 'fa:cloud-download-alt', + group: ['trigger'], + version: 1, + description: 'Triggers worklfow on a new Server-Sent Event', + defaults: { + name: 'SSE Trigger', + color: '#225577', + }, + inputs: [], + outputs: ['main'], + properties: [ + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + placeholder: 'http://example.com', + description: 'The URL to receive the SSE from.', + required: true, + }, + ] + }; + + + async trigger(this: ITriggerFunctions): Promise { + const url = this.getNodeParameter('url') as string; + + const eventSource = new EventSource(url); + + eventSource.onmessage = (event) => { + const eventData = JSON.parse(event.data); + this.emit([this.helpers.returnJsonArray([eventData])]); + }; + + async function closeFunction() { + eventSource.close(); + } + + return { + closeFunction, + }; + + } +} diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 8280bf53e7..fbf1738c61 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -143,6 +143,7 @@ "dist/nodes/RenameKeys.node.js", "dist/nodes/RssFeedRead.node.js", "dist/nodes/Set.node.js", + "dist/nodes/SseTrigger.node.js", "dist/nodes/SplitInBatches.node.js", "dist/nodes/Slack/Slack.node.js", "dist/nodes/SpreadsheetFile.node.js", @@ -172,6 +173,7 @@ "@types/basic-auth": "^1.1.2", "@types/cheerio": "^0.22.15", "@types/cron": "^1.6.1", + "@types/eventsource": "^1.1.2", "@types/express": "^4.16.1", "@types/gm": "^1.18.2", "@types/imap-simple": "^4.2.0", @@ -195,6 +197,7 @@ "basic-auth": "^2.0.1", "cheerio": "^1.0.0-rc.3", "cron": "^1.7.2", + "eventsource": "^1.0.7", "glob-promise": "^3.4.0", "gm": "^1.23.1", "googleapis": "^46.0.0",