framework4js
Version:
Framework-for-js is a better Javascript's framework
362 lines (345 loc) • 11.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
/**
* WebSocket封装
* 快速使用WS进行开发
* ws单例和多例模式
*/
var WebSocketClient = /*#__PURE__*/function () {
function WebSocketClient() {
(0, _classCallCheck2["default"])(this, WebSocketClient);
// ws模式
this.mode = 'single';
// ws单例名称
this.wsInstanceName = '';
// ws多例
this.wsInstances = new Map();
// 多例心跳频率
this.heartRates = new Map();
// 多例心跳定时器
this.heartRateTimers = new Map();
// 多例重启次数
this.restarts = new Map();
}
/**
* WebSocketClient初始化
* @param ws 服务器网址(非加密)
* @param wss 服务器网址(SSL)
* @param insName {String} 多例名称
* @param heartRate {Number} 心跳频率 毫秒
* @param restart {Number} 重启次数
* @param heartbeat {Function} 心跳执行函数 send {Function} 消息发送函数
*/
(0, _createClass2["default"])(WebSocketClient, null, [{
key: "init",
value: function init(_ref, heartbeat) {
var ws = _ref.ws,
wss = _ref.wss,
insName = _ref.insName,
_ref$heartRate = _ref.heartRate,
heartRate = _ref$heartRate === void 0 ? 0 : _ref$heartRate,
_ref$restart = _ref.restart,
restart = _ref$restart === void 0 ? 0 : _ref$restart;
if (!ws && !wss) {
throw new Error('WebSocketClient未添加ws或wss地址');
}
try {
// 一个项目中ws只能有一个单例,其余必须走多例
WebSocketClient.getInstance().wsInstanceName = WebSocketClient.getInstance().wsInstanceName || WebSocketClient.randomString(16);
// 格式化心跳频率 ms
var heartRateFormat = Number(heartRate).toString() !== 'NaN' ? Number(heartRate) : 0;
// 创建ws实例
var wsInstance = new WebSocket(ws || wss);
// 存入状态
WebSocketClient.getInstance().wsInstances.set(WebSocketClient.getWsInstanceName(insName), wsInstance);
// 心跳频率
WebSocketClient.getInstance().heartRates.set(WebSocketClient.getWsInstanceName(insName), heartRateFormat);
// 存在心跳执行业务函数
if (typeof heartbeat === 'function') {
WebSocketClient.heartbeat(function () {
var send = function send(msg) {
WebSocketClient.sendMessage(msg, WebSocketClient.getWsInstanceName(insName));
};
heartbeat(send, WebSocketClient.getWsInstanceName(insName));
}, WebSocketClient.getWsInstanceName(insName));
}
} catch (e) {
console.log(e);
}
}
/**
* 销毁ws实例
* @param insName
*/
}, {
key: "destroy",
value: function destroy(insName) {
var wsInstanceName = WebSocketClient.getWsInstanceName(insName);
var timers = WebSocketClient.getHeartRateTimer(wsInstanceName);
// 销毁完毕
if (!wsInstanceName && !timers) {
return;
}
if (Array.isArray(timers)) {
timers.map(function (timer) {
clearInterval(timer);
});
}
try {
WebSocketClient.getInstance().heartRates["delete"](wsInstanceName);
WebSocketClient.getInstance().wsInstances["delete"](wsInstanceName);
} catch (e) {
console.warn("".concat(wsInstanceName, "\u9500\u6BC1\u5931\u8D25").concat(e));
}
}
/**
* 返回当前ws实例名称
* @param insName
* @return {string|*}
*/
}, {
key: "getWsInstanceName",
value: function getWsInstanceName(insName) {
return insName || WebSocketClient.getInstance().wsInstanceName;
}
/**
* 返回ws实例
* @param {String} insName 实例名称
* @return {WebSocketClient}
*/
}, {
key: "getWsInstance",
value: function getWsInstance(insName) {
// 多例实例名称
var wsInstanceName = WebSocketClient.getWsInstanceName(WebSocketClient.getWsInstanceName(insName));
// 存在实例
if (WebSocketClient.getInstance().wsInstances.has(wsInstanceName)) {
return WebSocketClient.getInstance().wsInstances.get(wsInstanceName);
}
// WebSocketClient.destroy(wsInstanceName)
// throw new Error(`${wsInstanceName}实例已销毁,不可获取`)
}
/**
* 获取ws实例连接状态
* @param {String} insName 实例名称
* @return {string} CONNECTING OPEN CLOSING CLOSED
*/
}, {
key: "getWsState",
value: function getWsState(insName) {
var instance = WebSocketClient.getWsInstance(insName);
if (instance.readyState === WebSocket.CONNECTING) {
return 'CONNECTING';
}
if (instance.readyState === WebSocket.OPEN) {
return 'OPEN';
}
if (instance.readyState === WebSocket.CLOSING) {
return 'CLOSING';
}
if (instance.readyState === WebSocket.CLOSED) {
return 'CLOSED';
}
return 'FAIL';
}
/**
* 监听ws报错
* @param {Function} callback 监听ws报错的回调函数
* @param {String} insName insName 实例名称
*/
}, {
key: "wsErrorEventListener",
value: function wsErrorEventListener(callback, insName) {
try {
WebSocketClient.getWsInstance(insName).onerror = function (event) {
if (typeof callback === 'function') {
callback(event);
} else {
console.warn('监听ws报错的回调函数wsError不存在');
}
};
} catch (e) {
console.warn("".concat(e));
}
}
/**
* 监听ws关闭
* @param {Function} callback 监听ws关闭的回调函数
* @param {String} insName insName 实例名称
*/
}, {
key: "wsCloseEventListener",
value: function wsCloseEventListener(callback, insName) {
try {
WebSocketClient.getWsInstance(insName).onclose = function (event) {
if (typeof callback === 'function') {
callback(event);
} else {
console.warn('监听ws关闭的回调函数wsClose不存在');
}
};
} catch (e) {
console.warn("".concat(e));
}
}
/**
* 监听ws打开
* @param {Function} callback 监听ws打开的回调函数
* @param {String} insName insName 实例名称
*/
}, {
key: "wsOpenEventListener",
value: function wsOpenEventListener(callback, insName) {
try {
WebSocketClient.getWsInstance(insName).onopen = function (event) {
if (typeof callback === 'function') {
callback(event);
} else {
console.warn('监听ws打开的回调函数wsOpen不存在');
}
};
} catch (e) {
console.warn("".concat(e));
}
}
/**
* 消息发送
* @param {String} msg 消息
* @param {String} insName insName 实例名称
* @param {Boolean} isCloseWarn 是否关闭警告
*/
}, {
key: "sendMessage",
value: function sendMessage() {
var msg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var insName = arguments.length > 1 ? arguments[1] : undefined;
var isCloseWarn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
// 当ws状态处于 CONNECTING CLOSING CLOSED 禁止消息发送
if (!['CONNECTING', 'CLOSING', 'CLOSED'].includes(WebSocketClient.getWsState(insName))) {
try {
WebSocketClient.getWsInstance(insName).send(msg);
} catch (e) {
console.warn("".concat(e));
}
} else if (!isCloseWarn) {
console.warn('ws当前状态处于CONNECTING、CLOSING、CLOSED禁止消息发送');
}
}
/**
* 消息接收
* @param {Function} callback 接收消息的回调函数
* @param {String} insName insName 实例名称
*/
}, {
key: "receiveMessage",
value: function receiveMessage(callback, insName) {
try {
WebSocketClient.getWsInstance(insName).onmessage = function (event) {
if (typeof callback === 'function') {
callback(event);
} else {
console.warn('接收ws消息的回调函数receiveMessage不存在');
}
};
} catch (e) {
console.warn("".concat(e));
}
}
/**
* 处理心跳频率数据
* @param {String} name 实例名称
* @return {number|number}
*/
}, {
key: "getHeartRate",
value: function getHeartRate(name) {
var heartRate = WebSocketClient.getInstance().heartRates.get(name);
return Number(heartRate).toString() === 'NaN' ? 0 : Number(heartRate);
}
/**
* 获取心跳定时器
* @param name
* @return {any|*[]}
*/
}, {
key: "getHeartRateTimer",
value: function getHeartRateTimer(name) {
return WebSocketClient.getInstance().heartRateTimers.get(name) || [];
}
/**
* 获设置心跳定时器
* @param name
* @param val
* @return {Map<any, any>}
*/
}, {
key: "setHeartRateTimer",
value: function setHeartRateTimer(name, val) {
return WebSocketClient.getInstance().heartRateTimers.set(name, val);
}
/**
* 心跳函数
* @param {Function} callback 心跳执行函数
* @param {String} insName insName 实例名称
*/
}, {
key: "heartbeat",
value: function heartbeat(callback, insName) {
var wsInstanceName = WebSocketClient.getWsInstanceName(insName);
var heartRate = WebSocketClient.getHeartRate(wsInstanceName);
// 心跳频率未设置
if (!heartRate) {
return;
}
// ws多例回调
var timer = setInterval(function () {
callback(WebSocketClient);
}, heartRate);
var timers = WebSocketClient.getHeartRateTimer(wsInstanceName);
// 加入队列
timers.push(timer);
WebSocketClient.setHeartRateTimer(wsInstanceName, timers);
}
/**
* Singleton
* @return {null}
*/
}, {
key: "getInstance",
value: function getInstance() {
var instance = WebSocketClient.instance;
if (!instance || !(instance instanceof WebSocketClient)) {
instance = WebSocketClient.instance = new WebSocketClient();
}
return instance;
}
/**
* 生成随机字符串
* @param len
* @return {string}
*/
}, {
key: "randomString",
value: function randomString() {
var len = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 32;
// 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
var maxNum = chars.length;
var str = '';
for (var i = 0; i < len; i++) {
str += chars.charAt(Math.floor(Math.random() * maxNum));
}
return str;
}
}]);
return WebSocketClient;
}();
exports["default"] = WebSocketClient;
(0, _defineProperty2["default"])(WebSocketClient, "instance", null);