Remove all manual uses of v8 serialization (#5548)

* Remove all manual uses of v8 serialization

- Seems that sometimes the is a versioning mismatch within the binary
  format causes cluster screen the go grey

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* handle ping

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton authored and GitHub committed 2022-06-06 07:34:03 -04:00
1 parent 327978dbc8
commit fae6bff6fb
8 files changed
+58 -50

No files matched your search

+4 -30
View File
@@ -10,31 +10,8 @@ import url from "url";
import { makeObservable, observable } from "mobx";
import { ipcRenderer } from "electron";
import logger from "../../common/logger";
import { deserialize, serialize } from "v8";
import { once } from "lodash";
export enum TerminalChannels {
STDIN = "stdin",
STDOUT = "stdout",
CONNECTED = "connected",
RESIZE = "resize",
}
export type TerminalMessage = {
type: TerminalChannels.STDIN;
data: string;
} | {
type: TerminalChannels.STDOUT;
data: string;
} | {
type: TerminalChannels.CONNECTED;
} | {
type: TerminalChannels.RESIZE;
data: {
width: number;
height: number;
};
};
import { type TerminalMessage, TerminalChannels } from "../../common/terminal/channels";
enum TerminalColor {
RED = "\u001b[31m",
@@ -133,13 +110,10 @@ export class TerminalApi extends WebSocketApi<TerminalEvents> {
this.prependListener("connected", onReady);
super.connect(socketUrl);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this.socket!.binaryType = "arraybuffer";
}
sendMessage(message: TerminalMessage) {
return this.send(serialize(message));
return this.send(JSON.stringify(message));
}
sendTerminalSize(cols: number, rows: number) {
@@ -154,9 +128,9 @@ export class TerminalApi extends WebSocketApi<TerminalEvents> {
}
}
protected _onMessage({ data, ...evt }: MessageEvent<ArrayBuffer>): void {
protected _onMessage({ data, ...evt }: MessageEvent<string>): void {
try {
const message: TerminalMessage = deserialize(new Uint8Array(data));
const message = JSON.parse(data) as TerminalMessage;
switch (message.type) {
case TerminalChannels.STDOUT:
+6 -5
View File
@@ -9,6 +9,7 @@ import type TypedEventEmitter from "typed-emitter";
import type { Arguments } from "typed-emitter";
import { isDevelopment } from "../../common/vars";
import type { Defaulted } from "../utils";
import { TerminalChannels, type TerminalMessage } from "../../common/terminal/channels";
interface WebsocketApiParams {
/**
@@ -30,9 +31,9 @@ interface WebsocketApiParams {
/**
* The message for pinging the websocket
*
* @default "PING"
* @default "{type: \"ping\"}"
*/
pingMessage?: string | ArrayBufferLike | Blob | ArrayBufferView;
pingMessage?: string;
/**
* If set to a number > 0, then the API will ping the socket on that interval.
@@ -65,7 +66,7 @@ export interface WebSocketEvents {
export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter as { new<T>(): TypedEventEmitter<T> })<Events> {
protected socket: WebSocket | null = null;
protected pendingCommands: (string | ArrayBufferLike | Blob | ArrayBufferView)[] = [];
protected pendingCommands: string[] = [];
protected reconnectTimer?: number;
protected pingTimer?: number;
protected params: Defaulted<WebsocketApiParams, keyof typeof WebSocketApi["defaultParams"]>;
@@ -76,7 +77,7 @@ export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter
logging: isDevelopment,
reconnectDelay: 10,
flushOnOpen: true,
pingMessage: "PING",
pingMessage: JSON.stringify({ type: TerminalChannels.PING } as TerminalMessage),
};
constructor(params: WebsocketApiParams) {
@@ -149,7 +150,7 @@ export class WebSocketApi<Events extends WebSocketEvents> extends (EventEmitter
}
}
send(command: string | ArrayBufferLike | Blob | ArrayBufferView) {
send(command: string) {
if (this.getIsConnected()) {
this.socket.send(command);
} else {
@@ -4,9 +4,9 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { when } from "mobx";
import { TerminalChannels } from "../../../../common/terminal/channels";
import { waitUntilDefined } from "../../../../common/utils/wait";
import type { TerminalApi } from "../../../api/terminal-api";
import { TerminalChannels } from "../../../api/terminal-api";
import { noop } from "../../../utils";
import { Notifications } from "../../notifications";
import selectDockTabInjectable from "../dock/select-dock-tab.injectable";
@@ -10,7 +10,6 @@ import { Terminal as XTerm } from "xterm";
import { FitAddon } from "xterm-addon-fit";
import type { TabId } from "../dock/store";
import type { TerminalApi } from "../../../api/terminal-api";
import { TerminalChannels } from "../../../api/terminal-api";
import type { ThemeStore } from "../../../themes/store";
import { disposer } from "../../../utils";
import { isMac } from "../../../../common/vars";
@@ -19,6 +18,7 @@ import { clipboard } from "electron";
import logger from "../../../../common/logger";
import type { TerminalConfig } from "../../../../common/user-store/preferences-helpers";
import assert from "assert";
import { TerminalChannels } from "../../../../common/terminal/channels";
export interface TerminalDependencies {
readonly spawningPool: HTMLElement;