123 lines
3.4 KiB
JavaScript
123 lines
3.4 KiB
JavaScript
"use strict";
|
|
var common_vendor = require("../common/vendor.js");
|
|
class webSocketClass {
|
|
constructor(url, time) {
|
|
this.url = url;
|
|
this.data = null;
|
|
this.isCreate = false;
|
|
this.isConnect = false;
|
|
this.isInitiative = false;
|
|
this.timeoutNumber = time;
|
|
this.heartbeatTimer = null;
|
|
this.reconnectTimer = null;
|
|
this.socketExamples = null;
|
|
this.againTime = 3;
|
|
}
|
|
initSocket() {
|
|
const _this = this;
|
|
return new Promise((resolve, reject) => {
|
|
this.socketExamples = common_vendor.index.connectSocket({
|
|
url: _this.url,
|
|
header: {
|
|
"content-type": "application/json"
|
|
},
|
|
success: (res) => {
|
|
_this.isCreate = true;
|
|
console.log(res);
|
|
resolve(res);
|
|
},
|
|
fail: (rej) => {
|
|
console.error(rej);
|
|
_this.isCreate = false;
|
|
reject(rej);
|
|
}
|
|
});
|
|
this.createSocket();
|
|
});
|
|
}
|
|
createSocket() {
|
|
if (this.isCreate) {
|
|
console.log("WebSocket \u5F00\u59CB\u521D\u59CB\u5316");
|
|
try {
|
|
this.socketExamples.onOpen(() => {
|
|
console.log("WebSocket \u8FDE\u63A5\u6210\u529F");
|
|
this.isConnect = true;
|
|
clearInterval(this.heartbeatTimer);
|
|
clearTimeout(this.reconnectTimer);
|
|
this.heartbeatCheck();
|
|
});
|
|
this.socketExamples.onMessage((res) => {
|
|
console.log("\u6536\u5230\u6D88\u606F", res);
|
|
common_vendor.index.$emit("message", res);
|
|
});
|
|
this.socketExamples.onClose(() => {
|
|
console.log("WebSocket \u5173\u95ED\u4E86");
|
|
this.isConnect = false;
|
|
this.reconnect();
|
|
});
|
|
this.socketExamples.onError((res) => {
|
|
console.log("WebSocket \u51FA\u9519\u4E86");
|
|
console.log(res);
|
|
this.isInitiative = false;
|
|
});
|
|
} catch (error) {
|
|
console.warn(error);
|
|
}
|
|
} else {
|
|
console.warn("WebSocket \u521D\u59CB\u5316\u5931\u8D25!");
|
|
}
|
|
}
|
|
sendMsg(value) {
|
|
const param = JSON.stringify(value);
|
|
return new Promise((resolve, reject) => {
|
|
this.socketExamples.send({
|
|
data: param,
|
|
success() {
|
|
console.log("\u6D88\u606F\u53D1\u9001\u6210\u529F");
|
|
resolve(true);
|
|
},
|
|
fail(error) {
|
|
console.log("\u6D88\u606F\u53D1\u9001\u5931\u8D25");
|
|
reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
heartbeatCheck() {
|
|
console.log("\u5F00\u542F\u5FC3\u8DF3");
|
|
this.data = { state: 1, method: "heartbeat" };
|
|
this.heartbeatTimer = setInterval(() => {
|
|
this.sendMsg(this.data);
|
|
}, this.timeoutNumber * 1e3);
|
|
}
|
|
reconnect() {
|
|
clearTimeout(this.reconnectTimer);
|
|
clearInterval(this.heartbeatTimer);
|
|
if (!this.isInitiative) {
|
|
this.reconnectTimer = setTimeout(() => {
|
|
this.initSocket();
|
|
}, this.againTime * 1e3);
|
|
}
|
|
}
|
|
closeSocket(reason = "\u5173\u95ED") {
|
|
const _this = this;
|
|
this.socketExamples.close({
|
|
reason,
|
|
success() {
|
|
_this.data = null;
|
|
_this.isCreate = false;
|
|
_this.isConnect = false;
|
|
_this.isInitiative = true;
|
|
_this.socketExamples = null;
|
|
clearInterval(_this.heartbeatTimer);
|
|
clearTimeout(_this.reconnectTimer);
|
|
console.log("\u5173\u95ED WebSocket \u6210\u529F");
|
|
},
|
|
fail() {
|
|
console.log("\u5173\u95ED WebSocket \u5931\u8D25");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
exports.webSocketClass = webSocketClass;
|