migme-ferry
Version:
Ferry transports packets to and from fusion/fission
176 lines (133 loc) • 5.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Transporter;
var _ferryEvent = require('../events/ferry-event');
var _ferryEvent2 = _interopRequireDefault(_ferryEvent);
var _packet = require('../packets/packet');
var _packet2 = _interopRequireDefault(_packet);
var _packetType = require('../packets/packet-type');
var _packetType2 = _interopRequireDefault(_packetType);
var _lighthouse = require('./lighthouse');
var _lighthouse2 = _interopRequireDefault(_lighthouse);
var _socket = require('./socket');
var _socket2 = _interopRequireDefault(_socket);
var _config = require('../config/config');
var _config2 = _interopRequireDefault(_config);
var _dispatcher = require('../events/dispatcher');
var _dispatcher2 = _interopRequireDefault(_dispatcher);
var _checkOnlineStatus = require('../utils/check-online-status');
var _checkOnlineStatus2 = _interopRequireDefault(_checkOnlineStatus);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-use-before-define */
function Transporter() {
var state = {
isReady: false,
sender: null,
lighthouse: null,
timeout: null
};
var _connect = function _connect() {
state.sender = state.sender || (0, _socket2.default)(_config2.default.socket_path);
_dispatcher2.default.once(_ferryEvent2.default.CONNECTED, _createSession);
_dispatcher2.default.on(_ferryEvent2.default.PACKET_RECEIVED, _processPacket);
_dispatcher2.default.once(_ferryEvent2.default.CONNECTION_CLOSED, function () {
_dispatcher2.default.removeListener(_ferryEvent2.default.PACKET_RECEIVED, _processPacket);
if ((0, _checkOnlineStatus2.default)()) _connect();
});
_onlineEvents(true);
clearTimeout(state.timeout);
state.timeout = setTimeout(function () {
state.sender.connect();
}, 500);
};
var _disconnect = function _disconnect() {
_dispatcher2.default.removeListener(_ferryEvent2.default.PACKET_RECEIVED, _processPacket);
if (state.sender) state.sender.close();
if (state.lighthouse) state.lighthouse.stop();
_onlineEvents(false);
};
var _onlineEvents = function _onlineEvents(online) {
if (typeof window !== 'undefined') {
window[online ? 'removeEventListener' : 'addEventListener']('online', _connect);
window[online ? 'addEventListener' : 'removeEventListener']('offline', _disconnect);
}
};
var _createSession = function _createSession() {
// Send connect packet packet
var packet = new _packet2.default(_packetType2.default.CREATE_SESSION, {
client_type: 5,
client_version: 5,
session_id: _config2.default.session_id,
access_token: _config2.default.access_token,
// Next 3 variables are temporary.
font_height: 16,
sticker_pixel_size: 200,
virtual_gift_pixel_size: 64
});
transporter.sendPacket(packet);
};
var _processPacket = function _processPacket(packet) {
if (packet.T === _packetType2.default.LOGIN_OK || packet.T === _packetType2.default.OK) {
state.isReady = true;
var userpacket = new _packet2.default();
userpacket.fromJSON(packet);
_dispatcher2.default.emit(_ferryEvent2.default.READY, userpacket.fields);
_dispatcher2.default.removeListener(_ferryEvent2.default.PACKET_RECEIVED, _processPacket);
}
};
var _keepConnectionAlive = function _keepConnectionAlive() {
var packet = new _packet2.default(_packetType2.default.PING);
transporter.sendPacket(packet);
};
var transporter = {
connect: function connect() {
((0, _checkOnlineStatus2.default)() ? _connect : _disconnect)();
},
close: _disconnect,
keepAlive: function keepAlive() {
state.lighthouse = state.lighthouse || new _lighthouse2.default(_config2.default.keep_alive, _keepConnectionAlive);
state.lighthouse.start();
},
get isReady() {
return state.isReady;
},
set isReady(ready) {
state.isReady = ready;
},
get sender() {
return state.sender;
},
set sender(val) {
state.sender = val;
},
get lighthouse() {
return state.lighthouse;
},
sendPacket: function sendPacket(packet) {
if (!(packet instanceof _packet2.default)) {
throw new Error('packet must be an instance of Packet');
}
if (!state.isReady && packet.type !== _packetType2.default.CREATE_SESSION) {
throw new Error('Ferry hasn\'t connected yet');
} else if (state.lighthouse) {
state.lighthouse.restart();
}
packet.setSentTime(Date.now());
return state.sender.send(packet);
},
packetSendFailed: function packetSendFailed(packet) {
var MAX_RETRIES = 3;
if (packet.retryCount < MAX_RETRIES) {
packet.updateRetryCount();
this.sendPacket(packet);
} else {
_dispatcher2.default.emit(_ferryEvent2.default.PACKET_MAX_RETRY, packet.toJSON());
}
}
};
return transporter;
}
/* eslint-enable no-use-before-define */
module.exports = exports['default'];