mmjs-core
Version:
mmjs-core hooks component vue
82 lines (81 loc) • 3.43 kB
JavaScript
var n = Object.defineProperty;
var o = (c, r, e) => r in c ? n(c, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[r] = e;
var s = (c, r, e) => o(c, typeof r != "symbol" ? r + "" : r, e);
import { EventEmitter as i } from "../event/emitter.js";
class l extends i {
constructor(e, t) {
super();
s(this, "socket");
s(this, "url");
s(this, "heartbeatInterval");
s(this, "heartbeatTimer");
s(this, "maxReconnectAttempts");
s(this, "reconnectDelay");
s(this, "reconnectTimer");
s(this, "reconnectAttempts");
this.url = e, this.socket = null, this.heartbeatInterval = (t == null ? void 0 : t.heartbeatInterval) ?? 3e4, this.heartbeatTimer = null, this.reconnectTimer = null, this.reconnectAttempts = 0, this.maxReconnectAttempts = (t == null ? void 0 : t.maxReconnectAttempts) ?? 5, this.reconnectDelay = (t == null ? void 0 : t.reconnectDelay) ?? 5e3, this.connect();
}
connect() {
this.socket = new WebSocket(this.url), this.socket.onopen = (e) => {
console.log("WebSocket连接已建立"), this.reconnectAttempts = 0, this.startHeartbeat(), this.onOpen && this.onOpen(e), this.emit("open", e);
}, this.socket.onmessage = (e) => {
this.resetHeartbeat();
try {
const t = JSON.parse(e.data ?? "{}");
if (t.type === "pong") {
console.log("收到心跳响应");
return;
}
this.onMessage && this.onMessage(t), this.emit("message", t, e);
} catch (t) {
console.error("消息解析错误:", {
error: t,
event: e
});
}
}, this.socket.onclose = (e) => {
var t;
console.log("WebSocket连接关闭"), this.stopHeartbeat(), (t = this.onClose) == null || t.call(this, e), this.emit("close", e);
}, this.socket.onerror = (e) => {
console.error("WebSocket错误:", e), this.emit("error", e), this.reconnectAttempts < this.maxReconnectAttempts && (this.reconnectAttempts++, console.log(
`尝试重新连接 (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`
), this.reconnectTimer = setTimeout(
() => this.connect(),
this.reconnectDelay
)), this.onError && this.onError(e);
};
}
send(e) {
this.socket && this.socket.readyState === WebSocket.OPEN ? typeof e == "string" ? this.socket.send(e) : e instanceof Blob ? this.socket.send(e) : e instanceof ArrayBuffer || ArrayBuffer.isView(e) ? this.socket.send(e) : this.socket.send(JSON.stringify(e)) : console.error("WebSocket未连接,无法发送消息");
}
startHeartbeat() {
this.stopHeartbeat(), this.heartbeatTimer = setInterval(() => {
var e;
((e = this.socket) == null ? void 0 : e.readyState) === WebSocket.OPEN && (console.log("发送心跳"), this.send({ type: "ping", timestamp: Date.now() }));
}, this.heartbeatInterval);
}
resetHeartbeat() {
this.stopReconnect(), this.stopHeartbeat(), this.startHeartbeat();
}
stopHeartbeat() {
this.heartbeatTimer && (clearInterval(this.heartbeatTimer), this.heartbeatTimer = null);
}
stopReconnect() {
this.reconnectTimer && (clearTimeout(this.reconnectTimer), this.reconnectTimer = null);
}
close() {
this.stopReconnect(), this.stopHeartbeat(), this.socket && this.socket.close();
}
// 回调函数
onOpen(e) {
}
onMessage(e) {
}
onClose(e) {
}
onError(e) {
}
}
export {
l as WebSocketClient
};