ltws
Version:
Less Than Websocket
244 lines (243 loc) • 9.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.connectAsync = exports.connect = exports.ReadyState = void 0;
var _lodash = _interopRequireDefault(require("lodash"));
var _ws = _interopRequireDefault(require("ws"));
var _bluebird = _interopRequireDefault(require("bluebird"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
var ReadyState = exports.ReadyState = {
CONNECTING: _ws.default.CONNECTING,
OPEN: _ws.default.OPEN,
CLOSING: _ws.default.CLOSING,
CLOSED: _ws.default.CLOSED
};
var onOpen = manager => (/*#__PURE__*/function () {
var _ref = _asyncToGenerator(function* (_raw) {
clearTimeout(manager.connCreatingTimeoutScheduler);
manager.connReadyCount++;
manager.connRetries = 0;
if (manager.config.pingInterval !== -1) {
manager.pingScheduler = setInterval(() => {
if (manager.pingTimeoutScheduler) {
return;
}
if (!manager.ws) {
manager.out_error('[ping-scheduler] no ws to ping');
return;
}
if (manager.ws.readyState === _ws.default.OPEN) {
manager.out_debug('[ping-scheduler] sending ping');
if (manager.pingTimeoutScheduler === null) {
manager.pingTimeoutScheduler = setTimeout(() => onClose(manager)('PingTimeout'), manager.config.pingTimeout);
}
manager.ws.ping();
} else {
manager.out_warn('[ping-scheduler] readyState failed', manager.ws.readyState);
}
}, manager.config.pingInterval);
} else {
manager.out_info('[ping-scheduler] disabled');
}
if (manager.connReadyCount > 1 && manager.config.useReconnectEvent) {
manager.out_debug('[on-open] socket re-connected', manager.config.useReconnectEvent);
yield manager.on_reconnect(_raw);
} else {
manager.out_debug('[on-open] socket connected', manager.connReadyCount);
yield manager.on_connect(_raw);
}
});
return function (_x) {
return _ref.apply(this, arguments);
};
}());
var onPing = manager => (/*#__PURE__*/function () {
var _ref2 = _asyncToGenerator(function* (_raw) {
manager.out_debug('[on-ping] received');
var result = yield manager.on_ping(_raw);
if (result !== false) {
if (manager.ws) {
manager.out_debug('[on-ping] sending pong');
manager.ws.pong();
} else {
manager.out_debug('[on-ping] no ws to pong');
}
} else {
manager.out_debug('[on-ping] sending ignored');
}
});
return function (_x2) {
return _ref2.apply(this, arguments);
};
}());
var onPong = manager => (/*#__PURE__*/function () {
var _ref3 = _asyncToGenerator(function* (_raw) {
manager.out_debug('[on-pong] received');
clearTimeout(manager.pingTimeoutScheduler);
manager.pingTimeoutScheduler = null;
yield manager.on_pong(_raw);
});
return function (_x3) {
return _ref3.apply(this, arguments);
};
}());
var checkAndReconnect = /*#__PURE__*/function () {
var _ref4 = _asyncToGenerator(function* (manager, closeCode) {
if (manager.reconnectScheluder) {
return;
}
if (manager.autoReconnect && (manager.config.maxRetries === Number.MAX_SAFE_INTEGER || manager.connRetries < manager.config.maxRetries)) {
manager.connRetries++;
manager.reconnectScheluder = setTimeout(/*#__PURE__*/_asyncToGenerator(function* () {
manager.reconnectScheluder = null;
manager.out_debug('[on-close] socket delay re-connect', manager.config.reconnectDelay);
yield manager.on_reconnecting(closeCode, manager.connRetries);
reconnect(manager);
}), manager.config.reconnectDelay);
} else {
yield manager.on_disconnect(closeCode);
}
});
return function checkAndReconnect(_x4, _x5) {
return _ref4.apply(this, arguments);
};
}();
var onClose = manager => (/*#__PURE__*/function () {
var _ref6 = _asyncToGenerator(function* (closeCode) {
if (!manager.connReadyCount) {
closeCode = closeCode || 'ConnectError';
}
manager.out_info('[on-close] socket closed', closeCode);
destroy(manager, closeCode);
var result = yield manager.on_disconnecting(closeCode);
if (result === false) {
manager.out_warn('[on-close] abort re-connect', _lodash.default.get(manager, 'ws.readyState', null));
yield manager.on_disconnect(closeCode);
return;
}
yield checkAndReconnect(manager, closeCode);
});
return function (_x6) {
return _ref6.apply(this, arguments);
};
}());
var onMessage = manager => (/*#__PURE__*/function () {
var _ref7 = _asyncToGenerator(function* (_raw) {
manager.out_debug('[on-message] received');
yield manager.on_message(_raw);
});
return function (_x7) {
return _ref7.apply(this, arguments);
};
}());
var onJson = manager => (/*#__PURE__*/function () {
var _ref8 = _asyncToGenerator(function* (_raw) {
manager.out_debug('[on-json] received');
try {
var json = JSON.parse(_raw);
yield manager.on_json(json, _raw);
} catch (err) {
yield manager.on_json(null, _raw);
}
});
return function (_x8) {
return _ref8.apply(this, arguments);
};
}());
var onError = manager => (/*#__PURE__*/function () {
var _ref9 = _asyncToGenerator(function* (_raw) {
manager.out_debug('[on-error] error thrown', _raw);
yield manager.on_error(_raw);
});
return function (_x9) {
return _ref9.apply(this, arguments);
};
}());
var onUnexpectedResponse = manager => (/*#__PURE__*/function () {
var _ref10 = _asyncToGenerator(function* (_raw) {
manager.out_debug('[on-unexpected-response] error thrown', _raw);
yield manager.on_error(_raw);
});
return function (_x10) {
return _ref10.apply(this, arguments);
};
}());
var destroy = (manager, reason) => {
clearInterval(manager.pingScheduler);
clearTimeout(manager.pingTimeoutScheduler);
clearTimeout(manager.connCreatingTimeoutScheduler);
manager.pingTimeoutScheduler = null;
if (manager.ws) {
manager.ws._events = {};
}
if (manager.ws && manager.ws.readyState === _ws.default.OPEN) {
manager.ws.close();
}
manager.ws = null;
manager.destroyReason = reason;
};
var bindListeners = manager => {
manager.ws.on('open', onOpen(manager));
manager.ws.on('close', onClose(manager));
manager.ws.on('ping', onPing(manager));
manager.ws.on('pong', onPong(manager));
manager.ws.on('message', onMessage(manager));
manager.ws.on('message', onJson(manager));
manager.ws.on('error', onError(manager));
manager.ws.on('unexpected-response', onUnexpectedResponse(manager));
};
var reconnect = manager => {
manager.connCreatingTimeoutScheduler = setTimeout(/*#__PURE__*/_asyncToGenerator(function* () {
destroy(manager, 'ReconnectTimeout');
manager.out_warn('[reconnect] timeout');
if (manager.connRetries < manager.config.maxRetries) {
manager.connRetries++;
yield manager.on_reconnecting('ReconnectTimeout', manager.connRetries);
connect(manager);
} else {
yield manager.on_disconnect('ReconnectTimeout');
}
}), manager.config.reconnectTimeout);
manager.ws = new _ws.default(manager.origin, manager.baseConfig);
bindListeners(manager);
};
var connect = manager => {
manager.connCreatingTimeoutScheduler = setTimeout(/*#__PURE__*/_asyncToGenerator(function* () {
destroy(manager, 'ConnectTimeout');
manager.out_warn('[connect] timeout');
yield manager.on_connectError('ConnectTimeout');
yield checkAndReconnect(manager, 'ConnectTimeout');
}), manager.config.connectTimeout);
manager.ws = new _ws.default(manager.origin, manager.baseConfig);
bindListeners(manager);
};
exports.connect = connect;
var connectAsync = manager => {
return new _bluebird.default((resolve, reject) => {
var doResolve = () => {
clearTimeout(manager.connCreatingTimeoutScheduler);
manager.ws && manager.ws.off('open', doResolve);
manager.ws && manager.ws.off('close', doReject);
resolve();
};
var doReject = reason => {
clearTimeout(manager.connCreatingTimeoutScheduler);
manager.ws && manager.ws.off('open', doResolve);
manager.ws && manager.ws.off('close', doReject);
reject(reason);
};
manager.connCreatingTimeoutScheduler = setTimeout(/*#__PURE__*/_asyncToGenerator(function* () {
destroy(manager, 'ConnectTimeout');
manager.out_warn('[connect] timeout');
doReject('ConnectTimeout');
}), manager.config.connectTimeout);
manager.ws = new _ws.default(manager.origin, manager.baseConfig);
manager.ws.on('open', () => doResolve());
manager.ws.on('close', reason => doReject(reason));
bindListeners(manager);
});
};
exports.connectAsync = connectAsync;