UNPKG

migme-ferry

Version:

Ferry transports packets to and from fusion/fission

176 lines (133 loc) 5.12 kB
'use strict'; 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'];