feat(app) support multi-tabs

This commit is contained in:
kerms 2024-08-02 21:28:03 +08:00
parent 6b2d195faf
commit 8e0d8234e5
4 changed files with 49 additions and 8 deletions

View File

@ -50,6 +50,7 @@ onMounted(() => {
} }
websocketService = getWebsocketService(); websocketService = getWebsocketService();
websocketService.init(host, onServerMsg, onClientCtrl); websocketService.init(host, onServerMsg, onClientCtrl);
websocketService.getSocketStatus();
changeFavicon(); changeFavicon();
useSystemModule(); useSystemModule();

View File

@ -2,7 +2,7 @@ import MyWorker from '@/composables/websocket/ws.sharedworker?sharedworker'
import {WebsocketWrapper} from "@/composables/websocket/websocketWrapper"; import {WebsocketWrapper} from "@/composables/websocket/websocketWrapper";
import {toClient, toClientCtrl, toServer} from "@/composables/broadcastChannelDef"; import {toClient, toClientCtrl, toServer} from "@/composables/broadcastChannelDef";
import type {ControlMsg, ServerMsg} from "@/api"; import type {ControlMsg, ServerMsg} from "@/api";
import {ControlEvent, ControlMsgType} from "@/api"; import {ControlMsgType} from "@/api";
import {isDevMode} from "@/composables/buildMode"; import {isDevMode} from "@/composables/buildMode";
export interface IWebsocketService { export interface IWebsocketService {
@ -14,6 +14,7 @@ export interface IWebsocketService {
deinit(): void; deinit(): void;
send(msg: ServerMsg): void; send(msg: ServerMsg): void;
getSocketStatus(): void;
} }
/** /**
@ -82,6 +83,10 @@ class WebsocketShared implements IWebsocketService{
this.ctrlCallback(ev.data); this.ctrlCallback(ev.data);
} }
getSocketStatus() {
this.worker.port.postMessage({type: ControlMsgType.WS_GET_STATE} as ControlMsg)
}
} }
class WebsocketClassic implements IWebsocketService{ class WebsocketClassic implements IWebsocketService{
@ -115,6 +120,10 @@ class WebsocketClassic implements IWebsocketService{
send(msg: ServerMsg): void { send(msg: ServerMsg): void {
this.socket.send(msg); this.socket.send(msg);
} }
getSocketStatus(): void {
this.socket.getSocketStatus();
}
} }
export function getWebsocketService(): IWebsocketService { export function getWebsocketService(): IWebsocketService {

View File

@ -1,5 +1,4 @@
import type {ControlMsg, ServerMsg} from "@/api";
import type {ApiJsonMsg, ControlMsg, ServerMsg} from "@/api";
import {ControlEvent, ControlMsgType} from "@/api"; import {ControlEvent, ControlMsgType} from "@/api";
import {isDevMode} from "@/composables/buildMode"; import {isDevMode} from "@/composables/buildMode";
@ -9,6 +8,8 @@ interface IWebsocket {
close(): void; close(): void;
send(msg: ServerMsg): void; send(msg: ServerMsg): void;
getSocketStatus(): void;
} }
class WebsocketDummy implements IWebsocket { class WebsocketDummy implements IWebsocket {
@ -20,6 +21,9 @@ class WebsocketDummy implements IWebsocket {
send(msg: ServerMsg) { send(msg: ServerMsg) {
} }
getSocketStatus(): void {
}
} }
class OneTimeWebsocket implements IWebsocket { class OneTimeWebsocket implements IWebsocket {
@ -61,6 +65,8 @@ class OneTimeWebsocket implements IWebsocket {
console.log("No heart beat, break connection"); console.log("No heart beat, break connection");
this.close(); this.close();
this.clear(); this.clear();
// } else if (this.socket.readyState === this.socket.CONNECTING) {
// this.close();
} }
if (isDevMode()) { if (isDevMode()) {
console.log("interval: ", this.heartBeatTimeCount, "state: ", this.socket.readyState); console.log("interval: ", this.heartBeatTimeCount, "state: ", this.socket.readyState);
@ -159,6 +165,26 @@ class OneTimeWebsocket implements IWebsocket {
this.ctrlCallback(msg); this.ctrlCallback(msg);
this.closeCallback(); this.closeCallback();
} }
getSocketStatus() {
let type: ControlEvent;
switch (this.socket.readyState) {
case WebSocket.CONNECTING:
type = ControlEvent.CONNECTING;
break;
case WebSocket.OPEN:
type = ControlEvent.CONNECTED;
break;
default:
type = ControlEvent.DISCONNECTED;
break;
}
const msg: ControlMsg = {
type: ControlMsgType.WS_EVENT,
data: type,
};
this.ctrlCallback(msg);
}
} }
export class WebsocketWrapper { export class WebsocketWrapper {
@ -219,4 +245,8 @@ export class WebsocketWrapper {
send(msg: ServerMsg) { send(msg: ServerMsg) {
this.socket.send(msg) this.socket.send(msg)
} }
getSocketStatus() {
this.socket.getSocketStatus();
}
} }

View File

@ -1,12 +1,11 @@
import type {ControlMsg, ServerMsg} from "@/api"; import type {ControlMsg, ServerMsg} from "@/api";
import {ControlEvent, ControlMsgType} from "@/api";
declare const self: SharedWorkerGlobalScope;
import {WebsocketWrapper} from "@/composables/websocket/websocketWrapper"; import {WebsocketWrapper} from "@/composables/websocket/websocketWrapper";
import {toClient, toClientCtrl, toServer} from "@/composables/broadcastChannelDef"; import {toClient, toClientCtrl, toServer} from "@/composables/broadcastChannelDef";
import {ControlEvent, ControlMsgType} from "@/api";
import {isDevMode} from "@/composables/buildMode"; import {isDevMode} from "@/composables/buildMode";
declare const self: SharedWorkerGlobalScope;
const websocket = new WebsocketWrapper(); const websocket = new WebsocketWrapper();
let host = ""; let host = "";
@ -30,6 +29,8 @@ self.onconnect = function(event) {
host = e.data.data; host = e.data.data;
websocket.init(host, msgBroadcast, ctrlBroadcast); websocket.init(host, msgBroadcast, ctrlBroadcast);
} }
} else if (e.data.type === ControlMsgType.WS_GET_STATE) {
websocket.getSocketStatus();
} }
}; };
const msg: ControlMsg = { const msg: ControlMsg = {