UNPKG

11.8 kBJavaScriptView Raw
1'use strict';
2
3var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
4
5var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
6
7var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
8
9var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
10
11var _toArray2 = require('babel-runtime/helpers/toArray');
12
13var _toArray3 = _interopRequireDefault(_toArray2);
14
15var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
16
17var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
18
19var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
20
21var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
22
23var _createClass2 = require('babel-runtime/helpers/createClass');
24
25var _createClass3 = _interopRequireDefault(_createClass2);
26
27var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
28
29var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
30
31var _get4 = require('babel-runtime/helpers/get');
32
33var _get5 = _interopRequireDefault(_get4);
34
35var _inherits2 = require('babel-runtime/helpers/inherits');
36
37var _inherits3 = _interopRequireDefault(_inherits2);
38
39function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
40
41var Promise = require('bluebird');
42var _ = require('lodash');
43var hasBinary = require('has-binary');
44
45var _require = require('events');
46
47var EventEmitter = _require.EventEmitter;
48
49// from socket.io-protocol v4
50
51var EVENT = 2;
52var BINARY_EVENT = 5;
53
54// Instances communication via a socket.io-adapter implementation.
55
56var SocketIOClusterBus = function (_EventEmitter) {
57 (0, _inherits3.default)(SocketIOClusterBus, _EventEmitter);
58
59 function SocketIOClusterBus(server, adapter) {
60 (0, _classCallCheck3.default)(this, SocketIOClusterBus);
61
62 var _this = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(SocketIOClusterBus).call(this));
63
64 _this.server = server;
65 _this.adapter = adapter;
66 _this.channel = 'cluster:bus';
67 _this.intenalEvents = ['roomLeaveSocket', 'socketRoomLeft', 'disconnectUserSockets'];
68 _this.types = [EVENT, BINARY_EVENT];
69 _this.injectBusHook();
70 return _this;
71 }
72
73 (0, _createClass3.default)(SocketIOClusterBus, [{
74 key: 'listen',
75 value: function listen() {
76 var _this2 = this;
77
78 return Promise.fromCallback(function (cb) {
79 return _this2.adapter.add(_this2.server.instanceUID, _this2.channel, cb);
80 });
81 }
82 }, {
83 key: 'makeSocketRoomLeftName',
84 value: function makeSocketRoomLeftName(id, roomName) {
85 return 'socketRoomLeft:' + id + ':' + roomName;
86 }
87 }, {
88 key: 'mergeEventName',
89 value: function mergeEventName(ev, args) {
90 switch (ev) {
91 case 'socketRoomLeft':
92 var _args = (0, _toArray3.default)(args);
93
94 var id = _args[0];
95 var roomName = _args[1];
96
97 var nargs = _args.slice(2);
98
99 var nev = this.makeSocketRoomLeftName(id, roomName);
100 return [nev, nargs];
101 default:
102 return [ev, args];
103 }
104 }
105
106 // TODO: Use an API from socket.io if(when) it will be available.
107
108 }, {
109 key: 'emit',
110 value: function emit(ev) {
111 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
112 args[_key - 1] = arguments[_key];
113 }
114
115 var data = [ev].concat(args);
116 var packet = { type: hasBinary(args) ? BINARY_EVENT : EVENT, data: data };
117 var opts = { rooms: [this.channel] };
118 this.adapter.broadcast(packet, opts, false);
119 }
120 }, {
121 key: 'onPacket',
122 value: function onPacket(packet) {
123 var _packet$data = (0, _toArray3.default)(packet.data);
124
125 var ev = _packet$data[0];
126
127 var args = _packet$data.slice(1);
128
129 if (_.includes(this.intenalEvents, ev)) {
130 var _get2;
131
132 var _mergeEventName = this.mergeEventName(ev, args);
133
134 var _mergeEventName2 = (0, _slicedToArray3.default)(_mergeEventName, 2);
135
136 var nev = _mergeEventName2[0];
137 var nargs = _mergeEventName2[1];
138
139 return (_get2 = (0, _get5.default)((0, _getPrototypeOf2.default)(SocketIOClusterBus.prototype), 'emit', this)).call.apply(_get2, [this, nev].concat((0, _toConsumableArray3.default)(nargs)));
140 } else {
141 var _get3;
142
143 return (_get3 = (0, _get5.default)((0, _getPrototypeOf2.default)(SocketIOClusterBus.prototype), 'emit', this)).call.apply(_get3, [this, ev].concat((0, _toConsumableArray3.default)(args)));
144 }
145 }
146 }, {
147 key: 'broadcastHook',
148 value: function broadcastHook(packet, opts) {
149 var isBusCahnnel = _.includes(opts.rooms, this.channel);
150 var isBusType = _.includes(this.types, packet.type);
151 if (isBusCahnnel && isBusType) {
152 this.onPacket(packet);
153 }
154 }
155
156 // TODO: Use an API from socket.io if(when) it will be available.
157
158 }, {
159 key: 'injectBusHook',
160 value: function injectBusHook() {
161 var broadcastHook = this.broadcastHook.bind(this);
162 var adapter = this.adapter;
163 var orig = this.adapter.broadcast;
164 adapter.broadcast = function () {
165 for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
166 args[_key2] = arguments[_key2];
167 }
168
169 broadcastHook.apply(undefined, args);
170 orig.apply(adapter, args);
171 };
172 }
173 }]);
174 return SocketIOClusterBus;
175}(EventEmitter);
176
177module.exports = SocketIOClusterBus;
178//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Tb2NrZXRJT0NsdXN0ZXJCdXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNLFVBQVUsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTSxJQUFJLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTSxZQUFZLFFBQVEsWUFBUixDQUFsQjs7ZUFDeUIsUUFBUSxRQUFSLEM7O0lBQWpCLFksWUFBQSxZOztBQUVSOztBQUNBLElBQU0sUUFBUSxDQUFkO0FBQ0EsSUFBTSxlQUFlLENBQXJCOztBQUVBOztJQUNNLGtCOzs7QUFFSiw4QkFBYSxNQUFiLEVBQXFCLE9BQXJCLEVBQThCO0FBQUE7O0FBQUE7O0FBRTVCLFVBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxVQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0EsVUFBSyxPQUFMLEdBQWUsYUFBZjtBQUNBLFVBQUssYUFBTCxHQUFxQixDQUFFLGlCQUFGLEVBQ0UsZ0JBREYsRUFFRSx1QkFGRixDQUFyQjtBQUdBLFVBQUssS0FBTCxHQUFhLENBQUUsS0FBRixFQUFTLFlBQVQsQ0FBYjtBQUNBLFVBQUssYUFBTDtBQVQ0QjtBQVU3Qjs7Ozs2QkFFUztBQUFBOztBQUNSLGFBQU8sUUFBUSxZQUFSLENBQXFCLGNBQU07QUFDaEMsZUFBTyxPQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCLE9BQUssTUFBTCxDQUFZLFdBQTdCLEVBQTBDLE9BQUssT0FBL0MsRUFBd0QsRUFBeEQsQ0FBUDtBQUNELE9BRk0sQ0FBUDtBQUdEOzs7MkNBRXVCLEUsRUFBSSxRLEVBQVU7QUFDcEMsaUNBQXlCLEVBQXpCLFNBQStCLFFBQS9CO0FBQ0Q7OzttQ0FFZSxFLEVBQUksSSxFQUFNO0FBQ3hCLGNBQVEsRUFBUjtBQUNFLGFBQUssZ0JBQUw7QUFBQSw2Q0FDaUMsSUFEakM7O0FBQUEsY0FDTyxFQURQO0FBQUEsY0FDVyxRQURYOztBQUFBLGNBQ3dCLEtBRHhCOztBQUVFLGNBQUksTUFBTSxLQUFLLHNCQUFMLENBQTRCLEVBQTVCLEVBQWdDLFFBQWhDLENBQVY7QUFDQSxpQkFBTyxDQUFDLEdBQUQsRUFBTSxLQUFOLENBQVA7QUFDRjtBQUNFLGlCQUFPLENBQUMsRUFBRCxFQUFLLElBQUwsQ0FBUDtBQU5KO0FBUUQ7O0FBRUQ7Ozs7eUJBQ00sRSxFQUFhO0FBQUEsd0NBQU4sSUFBTTtBQUFOLFlBQU07QUFBQTs7QUFDakIsVUFBSSxRQUFTLEVBQVQsU0FBZ0IsSUFBaEIsQ0FBSjtBQUNBLFVBQUksU0FBUyxFQUFFLE1BQU8sVUFBVSxJQUFWLElBQWtCLFlBQWxCLEdBQWlDLEtBQTFDLEVBQWtELFVBQWxELEVBQWI7QUFDQSxVQUFJLE9BQU8sRUFBRSxPQUFPLENBQUUsS0FBSyxPQUFQLENBQVQsRUFBWDtBQUNBLFdBQUssT0FBTCxDQUFhLFNBQWIsQ0FBdUIsTUFBdkIsRUFBK0IsSUFBL0IsRUFBcUMsS0FBckM7QUFDRDs7OzZCQUVTLE0sRUFBUTtBQUFBLGdEQUNJLE9BQU8sSUFEWDs7QUFBQSxVQUNYLEVBRFc7O0FBQUEsVUFDSixJQURJOztBQUVoQixVQUFJLEVBQUUsUUFBRixDQUFXLEtBQUssYUFBaEIsRUFBK0IsRUFBL0IsQ0FBSixFQUF3QztBQUFBOztBQUFBLDhCQUNuQixLQUFLLGNBQUwsQ0FBb0IsRUFBcEIsRUFBd0IsSUFBeEIsQ0FEbUI7O0FBQUE7O0FBQUEsWUFDakMsR0FEaUM7QUFBQSxZQUM1QixLQUQ0Qjs7QUFFdEMsZ0pBQWtCLEdBQWxCLDBDQUEwQixLQUExQjtBQUNELE9BSEQsTUFHTztBQUFBOztBQUNMLGdKQUFrQixFQUFsQiwwQ0FBeUIsSUFBekI7QUFDRDtBQUNGOzs7a0NBRWMsTSxFQUFRLEksRUFBTTtBQUMzQixVQUFJLGVBQWUsRUFBRSxRQUFGLENBQVcsS0FBSyxLQUFoQixFQUF1QixLQUFLLE9BQTVCLENBQW5CO0FBQ0EsVUFBSSxZQUFZLEVBQUUsUUFBRixDQUFXLEtBQUssS0FBaEIsRUFBdUIsT0FBTyxJQUE5QixDQUFoQjtBQUNBLFVBQUksZ0JBQWdCLFNBQXBCLEVBQStCO0FBQzdCLGFBQUssUUFBTCxDQUFjLE1BQWQ7QUFDRDtBQUNGOztBQUVEOzs7O29DQUNpQjtBQUNmLFVBQUksZ0JBQWdCLEtBQUssYUFBTCxDQUFtQixJQUFuQixDQUF3QixJQUF4QixDQUFwQjtBQUNBLFVBQUksVUFBVSxLQUFLLE9BQW5CO0FBQ0EsVUFBSSxPQUFPLEtBQUssT0FBTCxDQUFhLFNBQXhCO0FBQ0EsY0FBUSxTQUFSLEdBQW9CLFlBQW1CO0FBQUEsMkNBQU4sSUFBTTtBQUFOLGNBQU07QUFBQTs7QUFDckMsdUNBQWlCLElBQWpCO0FBQ0EsYUFBSyxLQUFMLENBQVcsT0FBWCxFQUFvQixJQUFwQjtBQUNELE9BSEQ7QUFJRDs7O0VBdEU4QixZOztBQTBFakMsT0FBTyxPQUFQLEdBQWlCLGtCQUFqQiIsImZpbGUiOiJTb2NrZXRJT0NsdXN0ZXJCdXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoJ2JsdWViaXJkJylcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKVxuY29uc3QgaGFzQmluYXJ5ID0gcmVxdWlyZSgnaGFzLWJpbmFyeScpXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJylcblxuLy8gZnJvbSBzb2NrZXQuaW8tcHJvdG9jb2wgdjRcbmNvbnN0IEVWRU5UID0gMlxuY29uc3QgQklOQVJZX0VWRU5UID0gNVxuXG4vLyBJbnN0YW5jZXMgY29tbXVuaWNhdGlvbiB2aWEgYSBzb2NrZXQuaW8tYWRhcHRlciBpbXBsZW1lbnRhdGlvbi5cbmNsYXNzIFNvY2tldElPQ2x1c3RlckJ1cyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgY29uc3RydWN0b3IgKHNlcnZlciwgYWRhcHRlcikge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlclxuICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXJcbiAgICB0aGlzLmNoYW5uZWwgPSAnY2x1c3RlcjpidXMnXG4gICAgdGhpcy5pbnRlbmFsRXZlbnRzID0gWyAncm9vbUxlYXZlU29ja2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb2NrZXRSb29tTGVmdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzY29ubmVjdFVzZXJTb2NrZXRzJyBdXG4gICAgdGhpcy50eXBlcyA9IFsgRVZFTlQsIEJJTkFSWV9FVkVOVCBdXG4gICAgdGhpcy5pbmplY3RCdXNIb29rKClcbiAgfVxuXG4gIGxpc3RlbiAoKSB7XG4gICAgcmV0dXJuIFByb21pc2UuZnJvbUNhbGxiYWNrKGNiID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuYWRkKHRoaXMuc2VydmVyLmluc3RhbmNlVUlELCB0aGlzLmNoYW5uZWwsIGNiKVxuICAgIH0pXG4gIH1cblxuICBtYWtlU29ja2V0Um9vbUxlZnROYW1lIChpZCwgcm9vbU5hbWUpIHtcbiAgICByZXR1cm4gYHNvY2tldFJvb21MZWZ0OiR7aWR9OiR7cm9vbU5hbWV9YFxuICB9XG5cbiAgbWVyZ2VFdmVudE5hbWUgKGV2LCBhcmdzKSB7XG4gICAgc3dpdGNoIChldikge1xuICAgICAgY2FzZSAnc29ja2V0Um9vbUxlZnQnOlxuICAgICAgICBsZXQgW2lkLCByb29tTmFtZSwgLi4ubmFyZ3NdID0gYXJnc1xuICAgICAgICBsZXQgbmV2ID0gdGhpcy5tYWtlU29ja2V0Um9vbUxlZnROYW1lKGlkLCByb29tTmFtZSlcbiAgICAgICAgcmV0dXJuIFtuZXYsIG5hcmdzXVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtldiwgYXJnc11cbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBVc2UgYW4gQVBJIGZyb20gc29ja2V0LmlvIGlmKHdoZW4pIGl0IHdpbGwgYmUgYXZhaWxhYmxlLlxuICBlbWl0IChldiwgLi4uYXJncykge1xuICAgIGxldCBkYXRhID0gWyBldiwgLi4uYXJncyBdXG4gICAgbGV0IHBhY2tldCA9IHsgdHlwZTogKGhhc0JpbmFyeShhcmdzKSA/IEJJTkFSWV9FVkVOVCA6IEVWRU5UKSwgZGF0YSB9XG4gICAgbGV0IG9wdHMgPSB7IHJvb21zOiBbIHRoaXMuY2hhbm5lbCBdIH1cbiAgICB0aGlzLmFkYXB0ZXIuYnJvYWRjYXN0KHBhY2tldCwgb3B0cywgZmFsc2UpXG4gIH1cblxuICBvblBhY2tldCAocGFja2V0KSB7XG4gICAgbGV0IFtldiwgLi4uYXJnc10gPSBwYWNrZXQuZGF0YVxuICAgIGlmIChfLmluY2x1ZGVzKHRoaXMuaW50ZW5hbEV2ZW50cywgZXYpKSB7XG4gICAgICBsZXQgW25ldiwgbmFyZ3NdID0gdGhpcy5tZXJnZUV2ZW50TmFtZShldiwgYXJncylcbiAgICAgIHJldHVybiBzdXBlci5lbWl0KG5ldiwgLi4ubmFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdXBlci5lbWl0KGV2LCAuLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIGJyb2FkY2FzdEhvb2sgKHBhY2tldCwgb3B0cykge1xuICAgIGxldCBpc0J1c0NhaG5uZWwgPSBfLmluY2x1ZGVzKG9wdHMucm9vbXMsIHRoaXMuY2hhbm5lbClcbiAgICBsZXQgaXNCdXNUeXBlID0gXy5pbmNsdWRlcyh0aGlzLnR5cGVzLCBwYWNrZXQudHlwZSlcbiAgICBpZiAoaXNCdXNDYWhubmVsICYmIGlzQnVzVHlwZSkge1xuICAgICAgdGhpcy5vblBhY2tldChwYWNrZXQpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogVXNlIGFuIEFQSSBmcm9tIHNvY2tldC5pbyBpZih3aGVuKSBpdCB3aWxsIGJlIGF2YWlsYWJsZS5cbiAgaW5qZWN0QnVzSG9vayAoKSB7XG4gICAgbGV0IGJyb2FkY2FzdEhvb2sgPSB0aGlzLmJyb2FkY2FzdEhvb2suYmluZCh0aGlzKVxuICAgIGxldCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyXG4gICAgbGV0IG9yaWcgPSB0aGlzLmFkYXB0ZXIuYnJvYWRjYXN0XG4gICAgYWRhcHRlci5icm9hZGNhc3QgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgYnJvYWRjYXN0SG9vayguLi5hcmdzKVxuICAgICAgb3JpZy5hcHBseShhZGFwdGVyLCBhcmdzKVxuICAgIH1cbiAgfVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU29ja2V0SU9DbHVzdGVyQnVzXG4iXX0=
\No newline at end of file