You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tty-server/frontend/tty-receiver/tty-receiver.ts

115 lines
4.3 KiB
TypeScript

4 years ago
import { Terminal, IEvent, IDisposable } from "xterm";
import base64 from './base64';
interface IRectSize {
width: number;
height: number;
}
class TTYReceiver {
private xterminal: Terminal;
private containerElement: HTMLElement;
constructor(wsAddress: string, container: HTMLDivElement) {
const connection = new WebSocket(wsAddress);
this.xterminal = new Terminal({
cursorBlink: true,
macOptionIsMeta: true,
scrollback: 0,
fontSize: 12,
letterSpacing: 0,
Use nerd font patched Source Code Pro as default font for better rendering of glyphs (#16) * Squashed commit of the following: (Done for a cleaner merge) commit 3f2ef96c66a23a6afe043ccc54a4911373eec730 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 05:23:23 2020 +0000 Completely remove devDependencies commit 5b7b34c86c8faec9cc99c2f6f548f650b43878f5 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 05:22:05 2020 +0000 Change install deps from dev to production commit 2b23f00d7d621df32b9c00a776d3bf176aba2d31 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 05:08:30 2020 +0000 Oops add more detail to Sauce Code Pro provenance commit 56696b2bcbc9594bee0bb39f155b7024456b8ea0 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 05:07:54 2020 +0000 Acknowledge SauceCodePro provenence/license commit bfb93f49826843f2c4f0e2a8325cc660b272f41c Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 05:00:53 2020 +0000 Revert "Regen assets_bundle.go" This reverts commit 51f189421b26078367c8354de6ee0a43e3def32b. This is because I don't want this diff in the squash just yet commit ac15b25af6270ff22a43281639f3870b572c243b Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 04:57:49 2020 +0000 Resolve unnecessary diffs commit 8a274365dcfb83952ab211e6fd185701ad0b8649 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 04:50:07 2020 +0000 Add some fallback fonts if SauceCodePro is loading commit 8ff2901bc79a0d3eec452f5a945ec5d3bb6a0cab Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 04:30:36 2020 +0000 Remove SO comment ( wasnt relevant ) commit aa29bf232e3faf3c277df2ad5b62d33405d79604 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Fri Sep 25 04:29:47 2020 +0000 Finally fix font pathing commit 86a5ec20cdf8f98b57854849a29d047387e64a4f Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 10:38:48 2020 +0000 Use publicPath ? commit d225edb5f9c8e5e8ddbbe7d2de38ba0703b61995 Merge: 492a835 81295b8 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 10:28:19 2020 +0000 Merge branch 'fonts' of https://github.com/mstr3336/tty-server into fonts commit 492a83589d672c3922a8bdf94813af7df096a5ea Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 10:26:59 2020 +0000 Comment stack overflow link in webpack config commit 81295b8689f218f695a6e214cb4f2d7d1f31b269 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 20:26:22 2020 +1000 Move stuff to static i guess? commit a3a2238d3548f95dc9ddcf71d18f90f8f16f0c74 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:49:58 2020 +1000 Specify esmodule false for font loader commit be7cc94ade9bd7e8d247148ac8f09111899c677e Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:39:03 2020 +1000 Hopefully make webpack load fonts? commit 97e76cee0be5d29fa796a7fb239410b1d915dd98 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:31:28 2020 +1000 Add file-loader npm module commit 913ce076fb41146f37a98296fbdb8cee5b14d044 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:25:40 2020 +1000 Change font setting in tty-reciever.ts to new font commit 2387c0132b5fb4f61d7a7b3f3fa70d0b6f07c2b4 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:24:44 2020 +1000 Add nerd font rules commit 622d834bf9f0025ea3c03380e904a1a7c9ec5147 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:23:43 2020 +1000 Fix format spec for fonts commit 6df46eacf7da99ad2eba2c56ad8d36209bdd616c Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:20:50 2020 +1000 Finish script for building stylesheet commit e47d0de28b7becc2f16d6ba4814fd1307282710f Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 19:15:58 2020 +1000 Add python script for building css commit b38526cca7eda401ff49a42f2646bde4fe64c841 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 18:35:54 2020 +1000 Remove _Nerd_Font suffix commit cfd461ad7e331b1a25894c1513197c422b338422 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 18:34:40 2020 +1000 Remove _Complete_Mono_Windows_Compatible suffix from new fonts commit 2333f1bf61e0a2672e87f2b5687bf179f41832b2 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 24 18:28:48 2020 +1000 Add sauce code pro fonts from nerdfonts commit 778f2194c975a7fdd99dda4ab33eba8864420933 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 22:20:32 2020 +1000 Remove unnessary css rule commit c86e17f9ed55cf0901a81133c30d8c65a5a4fc52 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 12:11:44 2020 +0000 Remove vagrantfile for clean feature branch commit 51f189421b26078367c8354de6ee0a43e3def32b Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 12:07:03 2020 +0000 Regen assets_bundle.go commit 3e0462604b49af18df1f52c0129ea177db74302e Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 12:06:39 2020 +0000 Set the fontFamily of the tty-reciever to SourceCodePro commit cd06e4b0135ce73a4469ed4f7c06e7494bf5a0b7 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 12:04:18 2020 +0000 Rename font family string for source code pro commit 87a50edcafb35ef5363d0048bf48e14d4ba91266 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 20:46:07 2020 +1000 Update css to include source code pro for font family commit a036043573330da5d8792416543570c0204e3f38 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 19:59:51 2020 +1000 Finally fixed env escapes commit ed7dc41c466ad803ca00358531c67d0848fce7f5 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 19:24:27 2020 +1000 Fix heredoc commit a9ad5583162430e98e6b821871b64e2fd3ec4bf5 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 18:56:25 2020 +1000 Add serve script to vagrantfile commit 433353c70f964ea1749cfb316e7ffe191a432fc3 Author: Matthew Strasiotto <mstr3336@uni.sydney.edu.au> Date: Thu Sep 17 18:33:11 2020 +1000 added vagrantfile * Regen frontend/package-lock.json after merging upstream into feature
4 years ago
fontFamily: 'SauceCodePro, courier-new, monospace'
4 years ago
});
this.containerElement = container;
this.xterminal.open(container);
connection.onclose = (evt: CloseEvent) => {
this.xterminal.blur();
this.xterminal.setOption('cursorBlink', false);
this.xterminal.clear();
this.xterminal.write('Session closed');
}
this.xterminal.focus();
const containerPixSize = this.getElementPixelsSize(container);
const newFontSize = this.guessNewFontSize(this.xterminal.cols, this.xterminal.rows, containerPixSize.width, containerPixSize.height);
this.xterminal.setOption('fontSize', newFontSize);
connection.onmessage = (ev: MessageEvent) => {
let message = JSON.parse(ev.data)
let msgData = base64.decode(message.Data)
if (message.Type === "Write") {
let writeMsg = JSON.parse(msgData)
this.xterminal.writeUtf8(base64.base64ToArrayBuffer(writeMsg.Data));
}
if (message.Type == "WinSize") {
let winSizeMsg = JSON.parse(msgData)
const containerPixSize = this.getElementPixelsSize(container);
const newFontSize = this.guessNewFontSize(winSizeMsg.Cols, winSizeMsg.Rows, containerPixSize.width, containerPixSize.height);
this.xterminal.setOption('fontSize', newFontSize);
// Now set the new size.
this.xterminal.resize(winSizeMsg.Cols, winSizeMsg.Rows)
}
}
this.xterminal.onData(function (data:string) {
4 years ago
let writeMessage = {
Type: "Write",
Data: base64.encode(JSON.stringify({ Size: data.length, Data: base64.encode(data)})),
}
let dataToSend = JSON.stringify(writeMessage)
connection.send(dataToSend);
});
}
// Get the pixels size of the element, after all CSS was applied. This will be used in an ugly
// hack to guess what fontSize to set on the xterm object. Horrible hack, but I feel less bad
// about it seeing that VSV does it too:
// https://github.com/microsoft/vscode/blob/d14ee7613fcead91c5c3c2bddbf288c0462be876/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts#L363
private getElementPixelsSize(element: HTMLElement): IRectSize {
const defView = this.containerElement.ownerDocument.defaultView;
let width = parseInt(defView.getComputedStyle(element).getPropertyValue('width').replace('px', ''), 10);
let height = parseInt(defView.getComputedStyle(element).getPropertyValue('height').replace('px', ''), 10);
return {
width,
height,
}
}
// Tries to guess the new font size, for the new terminal size, so that the rendered terminal
// will have the newWidth and newHeight dimensions
private guessNewFontSize(newCols: number, newRows: number, targetWidth: number, targetHeight: number): number {
const cols = this.xterminal.cols;
const rows = this.xterminal.rows;
const fontSize = this.xterminal.getOption('fontSize');
const xtermPixelsSize = this.getElementPixelsSize(this.containerElement.querySelector(".xterm-screen"));
const newHFontSizeMultiplier = (cols / newCols) * (targetWidth / xtermPixelsSize.width);
const newVFontSizeMultiplier = (rows / newRows) * (targetHeight / xtermPixelsSize.height);
let newFontSize;
if (newHFontSizeMultiplier > newVFontSizeMultiplier) {
newFontSize = Math.floor(fontSize * newVFontSizeMultiplier);
} else {
newFontSize = Math.floor(fontSize * newHFontSizeMultiplier);
}
return newFontSize;
}
}
export {
TTYReceiver
}