diff --git a/flow/slack_connector.js b/flow/slack_connector.js
new file mode 100644
index 0000000..8c073a6
--- /dev/null
+++ b/flow/slack_connector.js
@@ -0,0 +1,124 @@
+exports.id = 'slack_connector';
+exports.title = 'Slack_Connector';
+exports.version = '1.0.0';
+exports.group = 'Worksys';
+exports.color = '#888600';
+exports.input = 1;
+exports.output = 1;
+exports.click = false;
+exports.author = 'Jakub Klena';
+exports.icon = 'sign-out';
+exports.options = { slack_channel: "C071KN2Q8SK", api_key: "", bot_name: "Flow DEMO", bot_icon: ":totaljs:" };
+// Slack channel - where to post the messages, can be name like "backend-alerts"
+// Bot Name - Name of the "user" that will post these messages, it should be based on which server it is running on.
+// Bot Icon - We can use any slack icon (even custom ones uploaded by us) as the "user" profile picture
+
+exports.html = `
`;
+
+exports.readme = `Sends any string received on input to Slack Channel.`;
+
+var log4js = require("log4js");
+var path = require('path');
+
+log4js.configure({
+ appenders: {
+ errLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../", 'err.txt') },
+ monitorLogs: { type: 'file', compress:true, daysToKeep: 2, maxLogSize: 1048576, backups: 1, keepFileExt: true, filename: path.join(__dirname + "/../", 'monitor.txt') },
+ console: { type: 'console' }
+ },
+ categories: {
+ errLogs: { appenders: ['console', 'errLogs'], level: 'error' },
+ monitorLogs: { appenders: ['console', 'monitorLogs'], level: 'trace' },
+ //another: { appenders: ['console'], level: 'trace' },
+ default: { appenders: ['console'], level: 'trace' }
+ }
+});
+
+const errLogger = log4js.getLogger("errLogs");
+const logger = log4js.getLogger();
+const monitor = log4js.getLogger("monitorLogs");
+
+exports.install = function(instance) {
+ var can = false;
+
+ process.on('uncaughtException', function (err) {
+ errLogger.error('uncaughtException:', err.message);
+ errLogger.error(err.stack);
+ instance.error(err);
+ });
+
+ instance.on('data', function(data) {
+ if (!can) return;
+
+ let str = String(data.data); // Ensuring data get converted to string
+ let message = {
+ 'channel': instance.options.slack_channel,
+ 'username': instance.options.bot_name,
+ 'icon_emoji': instance.options.bot_icon,
+ 'text': str
+ };
+ let headers = {
+ 'Content-type': `application/json`,
+ 'Authorization': `Bearer ${instance.options.api_key}`
+ };
+
+ if (F.is4) {
+ let opt = {
+ 'method': 'post',
+ 'url': 'https://slack.com/api/chat.postMessage',
+ 'headers': headers,
+ 'body': JSON.stringify(message),
+ 'type': 'json',
+ 'callback': function(err, response) {
+ if (response && !err) {
+ var msg = { data: response.body, status: response.status, headers: response.headers, host: response.host, cookies: response.cookies };
+ instance.send2(msg);
+ } else if (err) {
+ errLogger.error('Slack post failed - err:', err, '\n - response was:', response);
+ instance.error(err, response);
+ }
+ }
+ };
+ REQUEST(opt);
+
+ } else {
+ U.request('https://slack.com/api/chat.postMessage', ['json', 'post'], JSON.stringify(message), function(err, data, status, headers, host) {
+ if (response && !err) {
+ response.data = { data: data, status: status, headers: headers, host: host };
+ instance.send2(response);
+ } else if (err) {
+ errLogger.error('Slack post failed - err:', err, '\n - response was:', response);
+ instance.error(err, response);
+ }
+ }, null, headers);
+ }
+ });
+
+ instance.reconfigure = function() {
+ var options = instance.options;
+ can = options.slack_channel && options.bot_name && options.bot_icon && options.api_key ? true : false;
+ instance.status(can ? '' : 'Not configured', can ? undefined : 'red');
+ };
+
+ instance.on('options', instance.reconfigure);
+ instance.reconfigure();
+}