diff --git a/plugins/client-resources/src/connection.ts b/plugins/client-resources/src/connection.ts index 137740fa35..bb7b158ded 100644 --- a/plugins/client-resources/src/connection.ts +++ b/plugins/client-resources/src/connection.ts @@ -205,6 +205,13 @@ class Connection implements ClientConnection { websocket.onmessage = (event: MessageEvent) => { const resp = readResponse(event.data, binaryResponse) if (resp.id === -1 && resp.result === 'hello') { + if ((resp as HelloResponse).alreadyConnected === true) { + this.sessionId = generateId() + if (typeof sessionStorage !== 'undefined') { + sessionStorage.setItem('session.id.' + this.url, this.sessionId) + } + reject(new Error('alreadyConnected')) + } if ((resp as HelloResponse).binary) { binaryResponse = true } diff --git a/server/rpc/src/rpc.ts b/server/rpc/src/rpc.ts index f6e5b12516..55845dd05c 100644 --- a/server/rpc/src/rpc.ts +++ b/server/rpc/src/rpc.ts @@ -46,6 +46,7 @@ export interface HelloRequest extends Request { export interface HelloResponse extends Response { binary: boolean reconnect?: boolean + alreadyConnected?: boolean } /** diff --git a/server/ws/src/server.ts b/server/ws/src/server.ts index e9e1f749e2..a230c86326 100644 --- a/server/ws/src/server.ts +++ b/server/ws/src/server.ts @@ -214,6 +214,17 @@ class TSessionManager implements SessionManager { let workspace = this.workspaces.get(wsString) await workspace?.closing workspace = this.workspaces.get(wsString) + if (sessionId !== undefined && workspace?.sessions?.has(sessionId) === true) { + const helloResponse: HelloResponse = { + id: -1, + result: 'hello', + binary: false, + reconnect: false, + alreadyConnected: true + } + await ws.send(ctx, helloResponse, false, false) + return { error: new Error('Session already exists') } + } const workspaceName = workspaceInfo.workspaceName ?? workspaceInfo.workspaceUrl ?? workspaceInfo.workspace if (workspace === undefined) {