node-red-contrib-chatbot
Version:
REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required
87 lines (81 loc) • 1.95 kB
JavaScript
import Sockette from 'sockette';
import _ from 'lodash';
const SocketListener = function({
url,
maxAttempts = 10,
timeout = 5e3,
payloadField = 'payload'
}) {
let listeners = {};
const execute = (name, ...params) => {
if (listeners[name] != null) {
listeners[name].forEach(callback => callback(...params));
}
};
const ws = new Sockette(url, {
timeout,
maxAttempts,
onmessage: e => {
let message;
try {
message = JSON.parse(e.data);
} catch(e) {
// do nothing
}
if (Array.isArray(message)) {
message.forEach(msg => execute('message', msg.topic, msg[payloadField]))
} else {
execute('message', message.topic, message[payloadField]);
}
},
onerror: e => {
// eslint-disable-next-line no-console
console.log('connect error', e)
},
onmaximum: e => {
// eslint-disable-next-line no-console
console.log('connect error', e)
},
onreconnect: () => execute('reconnect'),
onclose: () => execute('close'),
onopen: () => {
const raw = localStorage.getItem('auth-tokens');
let json;
try {
json = JSON.parse(raw)
} catch(e) {
// do nothing
}
if (json != null && !_.isEmpty(json.access_token)) {
ws.send(`{"auth":"${json.access_token}"}`);
}
execute('open');
}
});
const obj = {
on(name, callback) {
if (listeners[name] == null) {
listeners[name] = [];
}
listeners[name].push(callback);
return obj;
},
off(name, callback) {
if (listeners[name] != null) {
listeners[name] = listeners[name].filter(current => current !== callback);
}
return obj;
},
close() {
listeners = {};
ws.close();
return obj;
},
send(str) {
ws.send(str);
return obj;
}
};
return obj;
};
export default SocketListener;