wx-web/utils/wsRequest.js

123 lines
3.4 KiB
JavaScript
Raw Normal View History

2024-05-22 10:14:19 +08:00
"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;