botpress
Version:
The world's first CMS for bots. Easily create, manage and extend chatbots.
97 lines (75 loc) • 3.07 kB
JavaScript
;
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _socket = require('socket.io');
var _socket2 = _interopRequireDefault(_socket);
var _socketioJwt = require('socketio-jwt');
var _socketioJwt2 = _interopRequireDefault(_socketioJwt);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
module.exports = bp => {
const install = (() => {
var _ref = _asyncToGenerator(function* (server) {
const io = (0, _socket2.default)(server);
const admin = io.of('/admin');
const guest = io.of('/guest');
if (bp.botfile.login.enabled) {
admin.use(_socketioJwt2.default.authorize({
secret: yield bp.security.getJWTSecretOrCertificate(),
handshake: true
}));
}
admin.on('connection', function (socket) {
const visitorId = _lodash2.default.get(socket, 'handshake.query.visitorId');
bp.stats.track('socket', 'connected');
socket.on('event', function (event) {
bp.events.emit(event.name, event.data, 'client', {
visitorId: visitorId,
socketId: socket.id,
guest: false,
admin: true
});
});
});
guest.on('connection', function (socket) {
const visitorId = _lodash2.default.get(socket, 'handshake.query.visitorId');
bp.stats.track('socket', 'connected');
if (visitorId && visitorId.length > 0) {
socket.join('visitor:' + visitorId);
}
socket.on('event', function (event) {
bp.events.emit(event.name, event.data, 'client', {
socketId: socket.id,
visitorId: visitorId,
guest: true,
admin: false
});
});
});
bp.events.onAny(function (event, data, from) {
if (from === 'client') {
return; // we sent this ourselves
}
// TODO: use more meaningful name
const c = event.startsWith('guest.') ? guest : admin;
if (data && (data.__socketId || data.__room)) {
// Send only to this socketId or room
return c.to(data.__socketId || data.__room).emit('event', {
name: event,
data: data
});
}
// broadcast event to the front-end clients
c.emit('event', {
name: event,
data: data
});
});
});
return function install(_x) {
return _ref.apply(this, arguments);
};
})();
return { install };
};
//# sourceMappingURL=socket.js.map