1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Fix terminal freezing self and whole app when internet is disconnected (#5870)

- Remove uses to navigator.onLine as not needed and because that value
  cannot be trusted (see several bug reports on chromium)

- Fix infinite loop when socket is not connected in flush

- Add some simple tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-07-24 22:34:54 -07:00 committed by GitHub
parent 2a141767df
commit f7f41cab79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 15 deletions

View File

@ -0,0 +1,37 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { WebSocketEvents } from "../websocket-api";
import { WebSocketApi } from "../websocket-api";
class TestWebSocketApi extends WebSocketApi<WebSocketEvents> {
flush(): void {
super.flush();
}
}
describe("WebsocketApi tests", () => {
let api: TestWebSocketApi;
beforeEach(() => {
api = new TestWebSocketApi({});
});
describe("before connection", () => {
it("does not hang when flush is called", () => {
api.flush();
});
describe("when a message has been sent", () => {
beforeEach(() => {
api.send("a command");
});
it("does not hang when flush is called", () => {
api.flush();
});
});
});
});

View File

@ -94,16 +94,8 @@ export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter
} }
} }
protected getIsConnected(): this is (WebSocketApi<Events> & { socket: WebSocket }) { isConnected(): this is (WebSocketApi<Events> & { socket: WebSocket }) {
return this.socket?.readyState === WebSocket.OPEN && this.isOnline; return this.socket?.readyState === WebSocket.OPEN;
}
get isConnected() {
return this.getIsConnected();
}
get isOnline() {
return navigator.onLine;
} }
connect(url: string) { connect(url: string) {
@ -120,7 +112,7 @@ export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter
} }
ping() { ping() {
if (this.isConnected) { if (this.isConnected()) {
this.send(this.params.pingMessage); this.send(this.params.pingMessage);
} }
} }
@ -151,7 +143,7 @@ export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter
} }
send(command: string) { send(command: string) {
if (this.getIsConnected()) { if (this.isConnected()) {
this.socket.send(command); this.socket.send(command);
} else { } else {
this.pendingCommands.push(command); this.pendingCommands.push(command);
@ -159,11 +151,13 @@ export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter
} }
protected flush() { protected flush() {
for (const command of this.pendingCommands) { const commands = this.pendingCommands;
this.pendingCommands = [];
for (const command of commands) {
this.send(command); this.send(command);
} }
this.pendingCommands.length = 0;
} }
protected _onOpen(evt: Event) { protected _onOpen(evt: Event) {