From d5fa5b845f9f251173cd13d1b68a6a02fa97e46f Mon Sep 17 00:00:00 2001 From: Rory& Date: Sun, 27 Jul 2025 15:38:16 +0200 Subject: [PATCH] Some cleanup --- src/bundle/start.ts | 107 +- src/util/util/KittyLogo.ts | 53 +- src/util/util/Logo.ts | 61 +- src/util/util/os-utils/OsUtils.ts | 21 - src/util/util/os-utils/TermInfo/Constants.ts | 964 ------------------ src/util/util/os-utils/TermInfo/TermInfo.ts | 50 - .../os-utils/TermInfo/openTerminfoBuffer.ts | 104 -- .../util/os-utils/TermInfo/parseTerminfo.ts | 159 --- 8 files changed, 77 insertions(+), 1442 deletions(-) delete mode 100644 src/util/util/os-utils/OsUtils.ts delete mode 100644 src/util/util/os-utils/TermInfo/Constants.ts delete mode 100644 src/util/util/os-utils/TermInfo/TermInfo.ts delete mode 100644 src/util/util/os-utils/TermInfo/openTerminfoBuffer.ts delete mode 100644 src/util/util/os-utils/TermInfo/parseTerminfo.ts diff --git a/src/bundle/start.ts b/src/bundle/start.ts index fb844f2f..c14487a9 100644 --- a/src/bundle/start.ts +++ b/src/bundle/start.ts @@ -44,65 +44,66 @@ function getCommitOrFail() { if (cluster.isPrimary) { const commit = getCommitOrFail(); - // Logo.printLogo(); - const unformatted = `spacebar-server | ! Pre-release build !`; - const formatted = `${blueBright("spacebar-server")} | ${redBright("⚠️ Pre-release build ⚠️")}`; - console.log( - bold(centerString(unformatted, 64).replace(unformatted, formatted)), - ); + Logo.printLogo().then(()=>{ + const unformatted = `spacebar-server | !! Pre-release build !!`; + const formatted = `${blueBright("spacebar-server")} | ${redBright("⚠️ Pre-release build ⚠️")}`; + console.log( + bold(centerString(unformatted, 86).replace(unformatted, formatted)), + ); - const unformattedGitHeader = `Commit Hash: ${commit !== null ? commit : "Unknown (Git cannot be found)"}`; - const formattedGitHeader = `Commit Hash: ${commit !== null ? `${cyan(commit)} (${yellow(commit.slice(0, 7))})` : "Unknown (Git cannot be found)"}`; - console.log( - bold( - centerString(unformattedGitHeader, 64).replace( - unformattedGitHeader, - formattedGitHeader, + const unformattedGitHeader = `Commit Hash: ${commit !== null ? `${commit} (${commit.slice(0, 7)})` : "Unknown (Git cannot be found)"}`; + const formattedGitHeader = `Commit Hash: ${commit !== null ? `${cyan(commit)} (${yellow(commit.slice(0, 7))})` : "Unknown (Git cannot be found)"}`; + console.log( + bold( + centerString(unformattedGitHeader, 86).replace( + unformattedGitHeader, + formattedGitHeader, + ), ), - ), - ); - console.log(`Cores: ${cyan(os.cpus().length)} (Using ${cores} thread(s).)`); + ); + console.log(`Cores: ${cyan(os.cpus().length)} (Using ${cores} thread(s).)`); - if (commit == null) { - console.log(yellow(`Warning: Git is not installed or not in PATH.`)); - } - - initStats(); - - console.log(`[Process] Starting with ${cores} threads`); - - if (cores === 1) { - require("./Server"); - } else { - process.env.EVENT_TRANSMISSION = "process"; - - // Fork workers. - for (let i = 0; i < cores; i++) { - // Delay each worker start if using sqlite database to prevent locking it - const delay = process.env.DATABASE?.includes("://") ? 0 : i * 1000; - setTimeout(() => { - cluster.fork(); - console.log(`[Process] Worker ${cyan(i)} started.`); - }, delay); + if (commit == null) { + console.log(yellow(`Warning: Git is not installed or not in PATH.`)); } - cluster.on("message", (sender: Worker, message) => { - for (const id in cluster.workers) { - const worker = cluster.workers[id]; - if (worker === sender || !worker) continue; - worker.send(message); - } - }); + initStats(); - cluster.on("exit", (worker) => { - console.log( - `[Worker] ${red( - `PID ${worker.process.pid} died, restarting ...`, - )}`, - ); - cluster.fork(); - }); - } + console.log(`[Process] Starting with ${cores} threads`); + + if (cores === 1) { + require("./Server"); + } else { + process.env.EVENT_TRANSMISSION = "process"; + + // Fork workers. + for (let i = 0; i < cores; i++) { + // Delay each worker start if using sqlite database to prevent locking it + const delay = process.env.DATABASE?.includes("://") ? 0 : i * 1000; + setTimeout(() => { + cluster.fork(); + console.log(`[Process] Worker ${cyan(i)} started.`); + }, delay); + } + + cluster.on("message", (sender: Worker, message) => { + for (const id in cluster.workers) { + const worker = cluster.workers[id]; + if (worker === sender || !worker) continue; + worker.send(message); + } + }); + + cluster.on("exit", (worker) => { + console.log( + `[Worker] ${red( + `PID ${worker.process.pid} died, restarting ...`, + )}`, + ); + cluster.fork(); + }); + } + }); } else { require("./Server"); } diff --git a/src/util/util/KittyLogo.ts b/src/util/util/KittyLogo.ts index 7bbed607..5b5e2da2 100644 --- a/src/util/util/KittyLogo.ts +++ b/src/util/util/KittyLogo.ts @@ -1,23 +1,6 @@ import { readFileSync } from "node:fs"; -import fs from "fs"; import "missing-native-js-functions"; -var util = require("util"); - -// noinspection ES6ConvertRequireIntoImport -// const ioctl = require("ioctl"); -// import ref from "ref"; -// import ArrayType from "ref-array"; -// import StructType from "ref-struct"; -// import os from "os"; - -// const winsize = StructType({ -// ws_row : ref.types.ushort, -// ws_col : ref.types.ushort, -// ws_xpixel : ref.types.ushort, -// ws_ypixel : ref.types.ushort -// }); - // const originalConsoleLog = console.log; // console.error = // console.log = @@ -27,14 +10,18 @@ var util = require("util"); // }; export class KittyLogo { - private static isSupported = false; + static isSupported = false; private static iconCache: string; public static async initialise() { this.isSupported = await this.checkSupport(); - this.iconCache = readFileSync(__dirname + "/../../../assets/icon.png", { - encoding: "base64", - }); + if (this.isSupported) + this.iconCache = readFileSync( + __dirname + "/../../../assets/icon.png", + { + encoding: "base64", + }, + ); } public static printLogo(): void { @@ -43,7 +30,7 @@ export class KittyLogo { }); KittyLogo.writeImage({ base64Data: data, - width: 70, + width: 86, addNewline: true, }); } @@ -88,7 +75,7 @@ export class KittyLogo { process.stdin.setRawMode(false); process.stdin.pause(); resp = key.toString(); - if (resp == "\x1B_Gi=31;OK\x1B\\\x1B[?62;c") resolve(true); + if (resp.startsWith("\x1B_Gi=31;OK")) resolve(true); else resolve(false); }); process.stdout.write( @@ -145,23 +132,3 @@ export interface KittyImageMetadata { heightPixels?: number; addNewline?: boolean; } - -(async () => { - await KittyLogo.initialise(); - KittyLogo.printLogo(); - - for (let i = 0; i < 1000; i++) { - console.time("meow"); - KittyLogo.printWithIcon("meow"); - console.timeEnd("meow"); - } -})(); - -// -// for (let i = 0; i < 10; i++) { -// KittyLogo.printLogo(); -// } -// for (let i = 0; i < 10; i++) { -// -// console.log(" ".repeat(i)+"meow"); -// } diff --git a/src/util/util/Logo.ts b/src/util/util/Logo.ts index f6febb06..c6299480 100644 --- a/src/util/util/Logo.ts +++ b/src/util/util/Logo.ts @@ -1,55 +1,20 @@ -import { execSync } from "child_process"; -import findOnPath from "./os-utils/OsUtils"; -// noinspection ES6ConvertRequireIntoImport -import terminfo from "./os-utils/TermInfo/TermInfo"; import { KittyLogo } from "./KittyLogo"; - +import { blueBright } from "picocolors"; export class Logo { public static async printLogo() { - await KittyLogo.printLogo(); - // const chafaPath = findOnPath("chafa"); - // console.log("Chafa path: " + chafaPath); - // const info = terminfo.parse({debug: true}); - // process.exit(0); - return; - // console.log(info); - // if (chafaPath) - // return execSync( - // "chafa Spacebar__Logo-Blue.png -s 70", - // { - // env: process.env, - // encoding: "utf-8", - // stdio: "inherit" - // } - // ); - // else console.log(Logo.logoVersions["1"] as string); + await KittyLogo.initialise(); + if (KittyLogo.isSupported) KittyLogo.printLogo(); + else console.log(this.AsciiLogo); } - private static getConsoleColors(): number { - return 1; - if (!process.env.TERM) return 1; - else { - switch (process.env.TERM) { - case "": - break; - - default: - break; - } - } - return 1; - } - private static logoVersions: any = { - "1": ` - ███████╗██████╗ █████╗ ██████╗███████╗██████╗ █████╗ ██████╗ - ██╔════╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗██╔══██╗ - ███████╗██████╔╝███████║██║ █████╗ ██████╔╝███████║██████╔╝ - ╚════██║██╔═══╝ ██╔══██║██║ ██╔══╝ ██╔══██╗██╔══██║██╔══██╗ - ███████║██║ ██║ ██║╚██████╗███████╗██████╔╝██║ ██║██║ ██║ - ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝`, - "2": `` - }; + private static AsciiLogo = blueBright( + ` + ████ ████ ███████╗██████╗ █████╗ ██████╗███████╗██████╗ █████╗ ██████╗ + ███████ ███████ ██╔════╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗██╔══██╗ + ████████████████ ███████╗██████╔╝███████║██║ █████╗ ██████╔╝███████║██████╔╝ +█████ ██ █████ ╚════██║██╔═══╝ ██╔══██║██║ ██╔══╝ ██╔══██╗██╔══██║██╔══██╗ +██████████████████ ███████║██║ ██║ ██║╚██████╗███████╗██████╔╝██║ ██║██║ ██║ + ████████████████ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝`.substring(1), + ); } - -Logo.printLogo(); \ No newline at end of file diff --git a/src/util/util/os-utils/OsUtils.ts b/src/util/util/os-utils/OsUtils.ts deleted file mode 100644 index babc99a1..00000000 --- a/src/util/util/os-utils/OsUtils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { existsSync, statSync } from "fs"; -import os from "os"; - -export default function findOnPath(binary: string): string | null { - const paths = - (os.platform() == "win32" - ? process.env.PATH?.split(";") - : process.env.PATH?.split(":")) || []; - - if (os.platform() == "win32") { - binary += ".exe"; - } - - for (const path of paths) { - if (existsSync(`${path}/${binary}`)) { - const stat = statSync(`${path}/${binary}`); - if (stat.isFile() && stat.mode & 0o111) return `${path}/${binary}`; - } - } - return null; -} diff --git a/src/util/util/os-utils/TermInfo/Constants.ts b/src/util/util/os-utils/TermInfo/Constants.ts deleted file mode 100644 index 34f6e4a6..00000000 --- a/src/util/util/os-utils/TermInfo/Constants.ts +++ /dev/null @@ -1,964 +0,0 @@ -"use strict"; - -/* ========================================================================= - * Copyright (c) 2016 Eivind Storm Aarnæs - * Licensed under the MIT license - * (see https://github.com/eistaa/parse-terminfo/blob/master/LICENSE) - * ========================================================================= */ - -/* - * the variable names and capnames are from the terminfo(5) man page - */ - -export const ALL_VARS: Record = { - // ============== - // == BOOLEANS == - // ============== - AUTO_LEFT_MARGIN: "bw", - AUTO_RIGHT_MARGIN: "am", - BACK_COLOR_ERASE: "bce", - CAN_CHANGE: "ccc", - CEOL_STANDOUT_GLITCH: "xhp", - COL_ADDR_GLITCH: "xhpa", - CPI_CHANGES_RES: "cpix", - CR_CANCELS_MICRO_MODE: "crxm", - DEST_TABS_MAGIC_SMSO: "xt", - EAT_NEWLINE_GLITCH: "xenl", - ERASE_OVERSTRIKE: "eo", - GENERIC_TYPE: "gn", - HARD_COPY: "hc", - HARD_CURSOR: "chts", - HAS_META_KEY: "km", - HAS_PRINT_WHEEL: "daisy", - HAS_STATUS_LINE: "hs", - HUE_LIGHTNESS_SATURATION: "hls", - INSERT_NULL_GLITCH: "in", - LPI_CHANGES_RES: "lpix", - MEMORY_ABOVE: "da", - MEMORY_BELOW: "db", - MOVE_INSERT_MODE: "mir", - MOVE_STANDOUT_MODE: "msgr", - NEEDS_XON_XOFF: "nxon", - NO_ESC_CTLC: "xsb", - NO_PAD_CHAR: "npc", - NON_DEST_SCROLL_REGION: "ndscr", - NON_REV_RMCUP: "nrrmc", - OVER_STRIKE: "os", - PRTR_SILENT: "mc5i", - ROW_ADDR_GLITCH: "xvpa", - SEMI_AUTO_RIGHT_MARGIN: "sam", - STATUS_LINE_ESC_OK: "eslok", - TILDE_GLITCH: "hz", - TRANSPARENT_UNDERLINE: "ul", - XON_XOFF: "xon", - // ============= - // == NUMBERS == - // ============= - COLUMNS: "cols", - INIT_TABS: "it", - LABEL_HEIGHT: "lh", - LABEL_WIDTH: "lw", - LINES: "lines", - LINES_OF_MEMORY: "lm", - MAGIC_COOKIE_GLITCH: "xmc", - MAX_ATTRIBUTES: "ma", - MAX_COLORS: "colors", - MAX_PAIRS: "pairs", - MAXIMUM_WINDOWS: "wnum", - NO_COLOR_VIDEO: "ncv", - NUM_LABELS: "nlab", - PADDING_BAUD_RATE: "pb", - VIRTUAL_TERMINAL: "vt", - WIDTH_STATUS_LINE: "wsl", - BIT_IMAGE_ENTWINING: "bitwin", - BIT_IMAGE_TYPE: "bitype", - BUFFER_CAPACITY: "bufsz", - BUTTONS: "btns", - DOT_HORZ_SPACING: "spinh", - DOT_VERT_SPACING: "spinv", - MAX_MICRO_ADDRESS: "maddr", - MAX_MICRO_JUMP: "mjump", - MICRO_COL_SIZE: "mcs", - MICRO_LINE_SIZE: "mls", - NUMBER_OF_PINS: "npins", - OUTPUT_RES_CHAR: "orc", - OUTPUT_RES_HORZ_INCH: "orhi", - OUTPUT_RES_LINE: "orl", - OUTPUT_RES_VERT_INCH: "orvi", - PRINT_RATE: "cps", - WIDE_CHAR_SIZE: "widcs", - // ============= - // == STRINGS == - // ============= - ACS_CHARS: "acsc", - BACK_TAB: "cbt", - BELL: "bel", - CARRIAGE_RETURN: "cr", - CHANGE_CHAR_PITCH: "cpi", - CHANGE_LINE_PITCH: "lpi", - CHANGE_RES_HORZ: "chr", - CHANGE_RES_VERT: "cvr", - CHANGE_SCROLL_REGION: "csr", - CHAR_PADDING: "rmp", - CLEAR_ALL_TABS: "tbc", - CLEAR_MARGINS: "mgc", - CLEAR_SCREEN: "clear", - CLR_BOL: "el1", - CLR_EOL: "el", - CLR_EOS: "ed", - COLUMN_ADDRESS: "hpa", - COMMAND_CHARACTER: "cmdch", - CREATE_WINDOW: "cwin", - CURSOR_ADDRESS: "cup", - CURSOR_DOWN: "cud1", - CURSOR_HOME: "home", - CURSOR_INVISIBLE: "civis", - CURSOR_LEFT: "cub1", - CURSOR_MEM_ADDRESS: "mrcup", - CURSOR_NORMAL: "cnorm", - CURSOR_RIGHT: "cuf1", - CURSOR_TO_LL: "ll", - CURSOR_UP: "cuu1", - CURSOR_VISIBLE: "cvvis", - DEFINE_CHAR: "defc", - DELETE_CHARACTER: "dch1", - DELETE_LINE: "dl1", - DIAL_PHONE: "dial", - DIS_STATUS_LINE: "dsl", - DISPLAY_CLOCK: "dclk", - DOWN_HALF_LINE: "hd", - ENA_ACS: "enacs", - ENTER_ALT_CHARSET_MODE: "smacs", - ENTER_AM_MODE: "smam", - ENTER_BLINK_MODE: "blink", - ENTER_BOLD_MODE: "bold", - ENTER_CA_MODE: "smcup", - ENTER_DELETE_MODE: "smdc", - ENTER_DIM_MODE: "dim", - ENTER_DOUBLEWIDE_MODE: "swidm", - ENTER_DRAFT_QUALITY: "sdrfq", - ENTER_INSERT_MODE: "smir", - ENTER_ITALICS_MODE: "sitm", - ENTER_LEFTWARD_MODE: "slm", - ENTER_MICRO_MODE: "smicm", - ENTER_NEAR_LETTER_QUALITY: "snlq", - ENTER_NORMAL_QUALITY: "snrmq", - ENTER_PROTECTED_MODE: "prot", - ENTER_REVERSE_MODE: "rev", - ENTER_SECURE_MODE: "invis", - ENTER_SHADOW_MODE: "sshm", - ENTER_STANDOUT_MODE: "smso", - ENTER_SUBSCRIPT_MODE: "ssubm", - ENTER_SUPERSCRIPT_MODE: "ssupm", - ENTER_UNDERLINE_MODE: "smul", - ENTER_UPWARD_MODE: "sum", - ENTER_XON_MODE: "smxon", - ERASE_CHARS: "ech", - EXIT_ALT_CHARSET_MODE: "rmacs", - EXIT_AM_MODE: "rmam", - EXIT_ATTRIBUTE_MODE: "sgr0", - EXIT_CA_MODE: "rmcup", - EXIT_DELETE_MODE: "rmdc", - EXIT_DOUBLEWIDE_MODE: "rwidm", - EXIT_INSERT_MODE: "rmir", - EXIT_ITALICS_MODE: "ritm", - EXIT_LEFTWARD_MODE: "rlm", - EXIT_MICRO_MODE: "rmicm", - EXIT_SHADOW_MODE: "rshm", - EXIT_STANDOUT_MODE: "rmso", - EXIT_SUBSCRIPT_MODE: "rsubm", - EXIT_SUPERSCRIPT_MODE: "rsupm", - EXIT_UNDERLINE_MODE: "rmul", - EXIT_UPWARD_MODE: "rum", - EXIT_XON_MODE: "rmxon", - FIXED_PAUSE: "pause", - FLASH_HOOK: "hook", - FLASH_SCREEN: "flash", - FORM_FEED: "ff", - FROM_STATUS_LINE: "fsl", - GOTO_WINDOW: "wingo", - HANGUP: "hup", - INIT_1STRING: "is1", - INIT_2STRING: "is2", - INIT_3STRING: "is3", - INIT_FILE: "if", - INIT_PROG: "iprog", - INITIALIZE_COLOR: "initc", - INITIALIZE_PAIR: "initp", - INSERT_CHARACTER: "ich1", - INSERT_LINE: "il1", - INSERT_PADDING: "ip", - KEY_A1: "ka1", - KEY_A3: "ka3", - KEY_B2: "kb2", - KEY_BACKSPACE: "kbs", - KEY_BEG: "kbeg", - KEY_BTAB: "kcbt", - KEY_C1: "kc1", - KEY_C3: "kc3", - KEY_CANCEL: "kcan", - KEY_CATAB: "ktbc", - KEY_CLEAR: "kclr", - KEY_CLOSE: "kclo", - KEY_COMMAND: "kcmd", - KEY_COPY: "kcpy", - KEY_CREATE: "kcrt", - KEY_CTAB: "kctab", - KEY_DC: "kdch1", - KEY_DL: "kdl1", - KEY_DOWN: "kcud1", - KEY_EIC: "krmir", - KEY_END: "kend", - KEY_ENTER: "kent", - KEY_EOL: "kel", - KEY_EOS: "ked", - KEY_EXIT: "kext", - KEY_F0: "kf0", - KEY_F1: "kf1", - KEY_F10: "kf10", - KEY_F11: "kf11", - KEY_F12: "kf12", - KEY_F13: "kf13", - KEY_F14: "kf14", - KEY_F15: "kf15", - KEY_F16: "kf16", - KEY_F17: "kf17", - KEY_F18: "kf18", - KEY_F19: "kf19", - KEY_F2: "kf2", - KEY_F20: "kf20", - KEY_F21: "kf21", - KEY_F22: "kf22", - KEY_F23: "kf23", - KEY_F24: "kf24", - KEY_F25: "kf25", - KEY_F26: "kf26", - KEY_F27: "kf27", - KEY_F28: "kf28", - KEY_F29: "kf29", - KEY_F3: "kf3", - KEY_F30: "kf30", - KEY_F31: "kf31", - KEY_F32: "kf32", - KEY_F33: "kf33", - KEY_F34: "kf34", - KEY_F35: "kf35", - KEY_F36: "kf36", - KEY_F37: "kf37", - KEY_F38: "kf38", - KEY_F39: "kf39", - KEY_F4: "kf4", - KEY_F40: "kf40", - KEY_F41: "kf41", - KEY_F42: "kf42", - KEY_F43: "kf43", - KEY_F44: "kf44", - KEY_F45: "kf45", - KEY_F46: "kf46", - KEY_F47: "kf47", - KEY_F48: "kf48", - KEY_F49: "kf49", - KEY_F5: "kf5", - KEY_F50: "kf50", - KEY_F51: "kf51", - KEY_F52: "kf52", - KEY_F53: "kf53", - KEY_F54: "kf54", - KEY_F55: "kf55", - KEY_F56: "kf56", - KEY_F57: "kf57", - KEY_F58: "kf58", - KEY_F59: "kf59", - KEY_F6: "kf6", - KEY_F60: "kf60", - KEY_F61: "kf61", - KEY_F62: "kf62", - KEY_F63: "kf63", - KEY_F7: "kf7", - KEY_F8: "kf8", - KEY_F9: "kf9", - KEY_FIND: "kfnd", - KEY_HELP: "khlp", - KEY_HOME: "khome", - KEY_IC: "kich1", - KEY_IL: "kil1", - KEY_LEFT: "kcub1", - KEY_LL: "kll", - KEY_MARK: "kmrk", - KEY_MESSAGE: "kmsg", - KEY_MOVE: "kmov", - KEY_NEXT: "knxt", - KEY_NPAGE: "knp", - KEY_OPEN: "kopn", - KEY_OPTIONS: "kopt", - KEY_PPAGE: "kpp", - KEY_PREVIOUS: "kprv", - KEY_PRINT: "kprt", - KEY_REDO: "krdo", - KEY_REFERENCE: "kref", - KEY_REFRESH: "krfr", - KEY_REPLACE: "krpl", - KEY_RESTART: "krst", - KEY_RESUME: "kres", - KEY_RIGHT: "kcuf1", - KEY_SAVE: "ksav", - KEY_SBEG: "kBEG", - KEY_SCANCEL: "kCAN", - KEY_SCOMMAND: "kCMD", - KEY_SCOPY: "kCPY", - KEY_SCREATE: "kCRT", - KEY_SDC: "kDC", - KEY_SDL: "kDL", - KEY_SELECT: "kslt", - KEY_SEND: "kEND", - KEY_SEOL: "kEOL", - KEY_SEXIT: "kEXT", - KEY_SF: "kind", - KEY_SFIND: "kFND", - KEY_SHELP: "kHLP", - KEY_SHOME: "kHOM", - KEY_SIC: "kIC", - KEY_SLEFT: "kLFT", - KEY_SMESSAGE: "kMSG", - KEY_SMOVE: "kMOV", - KEY_SNEXT: "kNXT", - KEY_SOPTIONS: "kOPT", - KEY_SPREVIOUS: "kPRV", - KEY_SPRINT: "kPRT", - KEY_SR: "kri", - KEY_SREDO: "kRDO", - KEY_SREPLACE: "kRPL", - KEY_SRIGHT: "kRIT", - KEY_SRSUME: "kRES", - KEY_SSAVE: "kSAV", - KEY_SSUSPEND: "kSPD", - KEY_STAB: "khts", - KEY_SUNDO: "kUND", - KEY_SUSPEND: "kspd", - KEY_UNDO: "kund", - KEY_UP: "kcuu1", - KEYPAD_LOCAL: "rmkx", - KEYPAD_XMIT: "smkx", - LAB_F0: "lf0", - LAB_F1: "lf1", - LAB_F10: "lf10", - LAB_F2: "lf2", - LAB_F3: "lf3", - LAB_F4: "lf4", - LAB_F5: "lf5", - LAB_F6: "lf6", - LAB_F7: "lf7", - LAB_F8: "lf8", - LAB_F9: "lf9", - LABEL_FORMAT: "fln", - LABEL_OFF: "rmln", - LABEL_ON: "smln", - META_OFF: "rmm", - META_ON: "smm", - MICRO_COLUMN_ADDRESS: "mhpa", - MICRO_DOWN: "mcud1", - MICRO_LEFT: "mcub1", - MICRO_RIGHT: "mcuf1", - MICRO_ROW_ADDRESS: "mvpa", - MICRO_UP: "mcuu1", - NEWLINE: "nel", - ORDER_OF_PINS: "porder", - ORIG_COLORS: "oc", - ORIG_PAIR: "op", - PAD_CHAR: "pad", - PARM_DCH: "dch", - PARM_DELETE_LINE: "dl", - PARM_DOWN_CURSOR: "cud", - PARM_DOWN_MICRO: "mcud", - PARM_ICH: "ich", - PARM_INDEX: "indn", - PARM_INSERT_LINE: "il", - PARM_LEFT_CURSOR: "cub", - PARM_LEFT_MICRO: "mcub", - PARM_RIGHT_CURSOR: "cuf", - PARM_RIGHT_MICRO: "mcuf", - PARM_RINDEX: "rin", - PARM_UP_CURSOR: "cuu", - PARM_UP_MICRO: "mcuu", - PKEY_KEY: "pfkey", - PKEY_LOCAL: "pfloc", - PKEY_XMIT: "pfx", - PLAB_NORM: "pln", - PRINT_SCREEN: "mc0", - PRTR_NON: "mc5p", - PRTR_OFF: "mc4", - PRTR_ON: "mc5", - PULSE: "pulse", - QUICK_DIAL: "qdial", - REMOVE_CLOCK: "rmclk", - REPEAT_CHAR: "rep", - REQ_FOR_INPUT: "rfi", - RESET_1STRING: "rs1", - RESET_2STRING: "rs2", - RESET_3STRING: "rs3", - RESET_FILE: "rf", - RESTORE_CURSOR: "rc", - ROW_ADDRESS: "vpa", - SAVE_CURSOR: "sc", - SCROLL_FORWARD: "ind", - SCROLL_REVERSE: "ri", - SELECT_CHAR_SET: "scs", - SET_ATTRIBUTES: "sgr", - SET_BACKGROUND: "setb", - SET_BOTTOM_MARGIN: "smgb", - SET_BOTTOM_MARGIN_PARM: "smgbp", - SET_CLOCK: "sclk", - SET_COLOR_PAIR: "scp", - SET_FOREGROUND: "setf", - SET_LEFT_MARGIN: "smgl", - SET_LEFT_MARGIN_PARM: "smglp", - SET_RIGHT_MARGIN: "smgr", - SET_RIGHT_MARGIN_PARM: "smgrp", - SET_TAB: "hts", - SET_TOP_MARGIN: "smgt", - SET_TOP_MARGIN_PARM: "smgtp", - SET_WINDOW: "wind", - START_BIT_IMAGE: "sbim", - START_CHAR_SET_DEF: "scsd", - STOP_BIT_IMAGE: "rbim", - STOP_CHAR_SET_DEF: "rcsd", - SUBSCRIPT_CHARACTERS: "subcs", - SUPERSCRIPT_CHARACTERS: "supcs", - TAB: "ht", - THESE_CAUSE_CR: "docr", - TO_STATUS_LINE: "tsl", - TONE: "tone", - UNDERLINE_CHAR: "uc", - UP_HALF_LINE: "hu", - USER0: "u0", - USER1: "u1", - USER2: "u2", - USER3: "u3", - USER4: "u4", - USER5: "u5", - USER6: "u6", - USER7: "u7", - USER8: "u8", - USER9: "u9", - WAIT_TONE: "wait", - XOFF_CHARACTER: "xoffc", - XON_CHARACTER: "xonc", - ZERO_MOTION: "zerom", - ALT_SCANCODE_ESC: "scesa", - BIT_IMAGE_CARRIAGE_RETURN: "bicr", - BIT_IMAGE_NEWLINE: "binel", - BIT_IMAGE_REPEAT: "birep", - CHAR_SET_NAMES: "csnm", - CODE_SET_INIT: "csin", - COLOR_NAMES: "colornm", - DEFINE_BIT_IMAGE_REGION: "defbi", - DEVICE_TYPE: "devt", - DISPLAY_PC_CHAR: "dispc", - END_BIT_IMAGE_REGION: "endbi", - ENTER_PC_CHARSET_MODE: "smpch", - ENTER_SCANCODE_MODE: "smsc", - EXIT_PC_CHARSET_MODE: "rmpch", - EXIT_SCANCODE_MODE: "rmsc", - GET_MOUSE: "getm", - KEY_MOUSE: "kmous", - MOUSE_INFO: "minfo", - PC_TERM_OPTIONS: "pctrm", - PKEY_PLAB: "pfxl", - REQ_MOUSE_POS: "reqmp", - SCANCODE_ESCAPE: "scesc", - SET0_DES_SEQ: "s0ds", - SET1_DES_SEQ: "s1ds", - SET2_DES_SEQ: "s2ds", - SET3_DES_SEQ: "s3ds", - SET_A_BACKGROUND: "setab", - SET_A_FOREGROUND: "setaf", - SET_COLOR_BAND: "setcolor", - SET_LR_MARGIN: "smglr", - SET_PAGE_LENGTH: "slines", - SET_TB_MARGIN: "smgtb", - ENTER_HORIZONTAL_HL_MODE: "ehhlm", - ENTER_LEFT_HL_MODE: "elhlm", - ENTER_LOW_HL_MODE: "elohlm", - ENTER_RIGHT_HL_MODE: "erhlm", - ENTER_TOP_HL_MODE: "ethlm", - ENTER_VERTICAL_HL_MODE: "evhlm", - SET_A_ATTRIBUTES: "sgr1", - SET_PGLEN_INCH: "slength", -}; - -/* - * the order of the variables are from the header file - */ - -export const VARORDER: Record<"booleans" | "numbers" | "strings", string[]> = { - booleans: [ - "AUTO_LEFT_MARGIN", - "AUTO_RIGHT_MARGIN", - "NO_ESC_CTLC", - "CEOL_STANDOUT_GLITCH", - "EAT_NEWLINE_GLITCH", - "ERASE_OVERSTRIKE", - "GENERIC_TYPE", - "HARD_COPY", - "HAS_META_KEY", - "HAS_STATUS_LINE", - "INSERT_NULL_GLITCH", - "MEMORY_ABOVE", - "MEMORY_BELOW", - "MOVE_INSERT_MODE", - "MOVE_STANDOUT_MODE", - "OVER_STRIKE", - "STATUS_LINE_ESC_OK", - "DEST_TABS_MAGIC_SMSO", - "TILDE_GLITCH", - "TRANSPARENT_UNDERLINE", - "XON_XOFF", - "NEEDS_XON_XOFF", - "PRTR_SILENT", - "HARD_CURSOR", - "NON_REV_RMCUP", - "NO_PAD_CHAR", - "NON_DEST_SCROLL_REGION", - "CAN_CHANGE", - "BACK_COLOR_ERASE", - "HUE_LIGHTNESS_SATURATION", - "COL_ADDR_GLITCH", - "CR_CANCELS_MICRO_MODE", - "HAS_PRINT_WHEEL", - "ROW_ADDR_GLITCH", - "SEMI_AUTO_RIGHT_MARGIN", - "CPI_CHANGES_RES", - "LPI_CHANGES_RES", - ], - numbers: [ - "COLUMNS", - "INIT_TABS", - "LINES", - "LINES_OF_MEMORY", - "MAGIC_COOKIE_GLITCH", - "PADDING_BAUD_RATE", - "VIRTUAL_TERMINAL", - "WIDTH_STATUS_LINE", - "NUM_LABELS", - "LABEL_HEIGHT", - "LABEL_WIDTH", - "MAX_ATTRIBUTES", - "MAXIMUM_WINDOWS", - "MAX_COLORS", - "MAX_PAIRS", - "NO_COLOR_VIDEO", - "BUFFER_CAPACITY", - "DOT_VERT_SPACING", - "DOT_HORZ_SPACING", - "MAX_MICRO_ADDRESS", - "MAX_MICRO_JUMP", - "MICRO_COL_SIZE", - "MICRO_LINE_SIZE", - "NUMBER_OF_PINS", - "OUTPUT_RES_CHAR", - "OUTPUT_RES_LINE", - "OUTPUT_RES_HORZ_INCH", - "OUTPUT_RES_VERT_INCH", - "PRINT_RATE", - "WIDE_CHAR_SIZE", - "BUTTONS", - "BIT_IMAGE_ENTWINING", - "BIT_IMAGE_TYPE", - ], - strings: [ - "BACK_TAB", - "BELL", - "CARRIAGE_RETURN", - "CHANGE_SCROLL_REGION", - "CLEAR_ALL_TABS", - "CLEAR_SCREEN", - "CLR_EOL", - "CLR_EOS", - "COLUMN_ADDRESS", - "COMMAND_CHARACTER", - "CURSOR_ADDRESS", - "CURSOR_DOWN", - "CURSOR_HOME", - "CURSOR_INVISIBLE", - "CURSOR_LEFT", - "CURSOR_MEM_ADDRESS", - "CURSOR_NORMAL", - "CURSOR_RIGHT", - "CURSOR_TO_LL", - "CURSOR_UP", - "CURSOR_VISIBLE", - "DELETE_CHARACTER", - "DELETE_LINE", - "DIS_STATUS_LINE", - "DOWN_HALF_LINE", - "ENTER_ALT_CHARSET_MODE", - "ENTER_BLINK_MODE", - "ENTER_BOLD_MODE", - "ENTER_CA_MODE", - "ENTER_DELETE_MODE", - "ENTER_DIM_MODE", - "ENTER_INSERT_MODE", - "ENTER_SECURE_MODE", - "ENTER_PROTECTED_MODE", - "ENTER_REVERSE_MODE", - "ENTER_STANDOUT_MODE", - "ENTER_UNDERLINE_MODE", - "ERASE_CHARS", - "EXIT_ALT_CHARSET_MODE", - "EXIT_ATTRIBUTE_MODE", - "EXIT_CA_MODE", - "EXIT_DELETE_MODE", - "EXIT_INSERT_MODE", - "EXIT_STANDOUT_MODE", - "EXIT_UNDERLINE_MODE", - "FLASH_SCREEN", - "FORM_FEED", - "FROM_STATUS_LINE", - "INIT_1STRING", - "INIT_2STRING", - "INIT_3STRING", - "INIT_FILE", - "INSERT_CHARACTER", - "INSERT_LINE", - "INSERT_PADDING", - "KEY_BACKSPACE", - "KEY_CATAB", - "KEY_CLEAR", - "KEY_CTAB", - "KEY_DC", - "KEY_DL", - "KEY_DOWN", - "KEY_EIC", - "KEY_EOL", - "KEY_EOS", - "KEY_F0", - "KEY_F1", - "KEY_F10", - "KEY_F2", - "KEY_F3", - "KEY_F4", - "KEY_F5", - "KEY_F6", - "KEY_F7", - "KEY_F8", - "KEY_F9", - "KEY_HOME", - "KEY_IC", - "KEY_IL", - "KEY_LEFT", - "KEY_LL", - "KEY_NPAGE", - "KEY_PPAGE", - "KEY_RIGHT", - "KEY_SF", - "KEY_SR", - "KEY_STAB", - "KEY_UP", - "KEYPAD_LOCAL", - "KEYPAD_XMIT", - "LAB_F0", - "LAB_F1", - "LAB_F10", - "LAB_F2", - "LAB_F3", - "LAB_F4", - "LAB_F5", - "LAB_F6", - "LAB_F7", - "LAB_F8", - "LAB_F9", - "META_OFF", - "META_ON", - "NEWLINE", - "PAD_CHAR", - "PARM_DCH", - "PARM_DELETE_LINE", - "PARM_DOWN_CURSOR", - "PARM_ICH", - "PARM_INDEX", - "PARM_INSERT_LINE", - "PARM_LEFT_CURSOR", - "PARM_RIGHT_CURSOR", - "PARM_RINDEX", - "PARM_UP_CURSOR", - "PKEY_KEY", - "PKEY_LOCAL", - "PKEY_XMIT", - "PRINT_SCREEN", - "PRTR_OFF", - "PRTR_ON", - "REPEAT_CHAR", - "RESET_1STRING", - "RESET_2STRING", - "RESET_3STRING", - "RESET_FILE", - "RESTORE_CURSOR", - "ROW_ADDRESS", - "SAVE_CURSOR", - "SCROLL_FORWARD", - "SCROLL_REVERSE", - "SET_ATTRIBUTES", - "SET_TAB", - "SET_WINDOW", - "TAB", - "TO_STATUS_LINE", - "UNDERLINE_CHAR", - "UP_HALF_LINE", - "INIT_PROG", - "KEY_A1", - "KEY_A3", - "KEY_B2", - "KEY_C1", - "KEY_C3", - "PRTR_NON", - "CHAR_PADDING", - "ACS_CHARS", - "PLAB_NORM", - "KEY_BTAB", - "ENTER_XON_MODE", - "EXIT_XON_MODE", - "ENTER_AM_MODE", - "EXIT_AM_MODE", - "XON_CHARACTER", - "XOFF_CHARACTER", - "ENA_ACS", - "LABEL_ON", - "LABEL_OFF", - "KEY_BEG", - "KEY_CANCEL", - "KEY_CLOSE", - "KEY_COMMAND", - "KEY_COPY", - "KEY_CREATE", - "KEY_END", - "KEY_ENTER", - "KEY_EXIT", - "KEY_FIND", - "KEY_HELP", - "KEY_MARK", - "KEY_MESSAGE", - "KEY_MOVE", - "KEY_NEXT", - "KEY_OPEN", - "KEY_OPTIONS", - "KEY_PREVIOUS", - "KEY_PRINT", - "KEY_REDO", - "KEY_REFERENCE", - "KEY_REFRESH", - "KEY_REPLACE", - "KEY_RESTART", - "KEY_RESUME", - "KEY_SAVE", - "KEY_SUSPEND", - "KEY_UNDO", - "KEY_SBEG", - "KEY_SCANCEL", - "KEY_SCOMMAND", - "KEY_SCOPY", - "KEY_SCREATE", - "KEY_SDC", - "KEY_SDL", - "KEY_SELECT", - "KEY_SEND", - "KEY_SEOL", - "KEY_SEXIT", - "KEY_SFIND", - "KEY_SHELP", - "KEY_SHOME", - "KEY_SIC", - "KEY_SLEFT", - "KEY_SMESSAGE", - "KEY_SMOVE", - "KEY_SNEXT", - "KEY_SOPTIONS", - "KEY_SPREVIOUS", - "KEY_SPRINT", - "KEY_SREDO", - "KEY_SREPLACE", - "KEY_SRIGHT", - "KEY_SRSUME", - "KEY_SSAVE", - "KEY_SSUSPEND", - "KEY_SUNDO", - "REQ_FOR_INPUT", - "KEY_F11", - "KEY_F12", - "KEY_F13", - "KEY_F14", - "KEY_F15", - "KEY_F16", - "KEY_F17", - "KEY_F18", - "KEY_F19", - "KEY_F20", - "KEY_F21", - "KEY_F22", - "KEY_F23", - "KEY_F24", - "KEY_F25", - "KEY_F26", - "KEY_F27", - "KEY_F28", - "KEY_F29", - "KEY_F30", - "KEY_F31", - "KEY_F32", - "KEY_F33", - "KEY_F34", - "KEY_F35", - "KEY_F36", - "KEY_F37", - "KEY_F38", - "KEY_F39", - "KEY_F40", - "KEY_F41", - "KEY_F42", - "KEY_F43", - "KEY_F44", - "KEY_F45", - "KEY_F46", - "KEY_F47", - "KEY_F48", - "KEY_F49", - "KEY_F50", - "KEY_F51", - "KEY_F52", - "KEY_F53", - "KEY_F54", - "KEY_F55", - "KEY_F56", - "KEY_F57", - "KEY_F58", - "KEY_F59", - "KEY_F60", - "KEY_F61", - "KEY_F62", - "KEY_F63", - "CLR_BOL", - "CLEAR_MARGINS", - "SET_LEFT_MARGIN", - "SET_RIGHT_MARGIN", - "LABEL_FORMAT", - "SET_CLOCK", - "DISPLAY_CLOCK", - "REMOVE_CLOCK", - "CREATE_WINDOW", - "GOTO_WINDOW", - "HANGUP", - "DIAL_PHONE", - "QUICK_DIAL", - "TONE", - "PULSE", - "FLASH_HOOK", - "FIXED_PAUSE", - "WAIT_TONE", - "USER0", - "USER1", - "USER2", - "USER3", - "USER4", - "USER5", - "USER6", - "USER7", - "USER8", - "USER9", - "ORIG_PAIR", - "ORIG_COLORS", - "INITIALIZE_COLOR", - "INITIALIZE_PAIR", - "SET_COLOR_PAIR", - "SET_FOREGROUND", - "SET_BACKGROUND", - "CHANGE_CHAR_PITCH", - "CHANGE_LINE_PITCH", - "CHANGE_RES_HORZ", - "CHANGE_RES_VERT", - "DEFINE_CHAR", - "ENTER_DOUBLEWIDE_MODE", - "ENTER_DRAFT_QUALITY", - "ENTER_ITALICS_MODE", - "ENTER_LEFTWARD_MODE", - "ENTER_MICRO_MODE", - "ENTER_NEAR_LETTER_QUALITY", - "ENTER_NORMAL_QUALITY", - "ENTER_SHADOW_MODE", - "ENTER_SUBSCRIPT_MODE", - "ENTER_SUPERSCRIPT_MODE", - "ENTER_UPWARD_MODE", - "EXIT_DOUBLEWIDE_MODE", - "EXIT_ITALICS_MODE", - "EXIT_LEFTWARD_MODE", - "EXIT_MICRO_MODE", - "EXIT_SHADOW_MODE", - "EXIT_SUBSCRIPT_MODE", - "EXIT_SUPERSCRIPT_MODE", - "EXIT_UPWARD_MODE", - "MICRO_COLUMN_ADDRESS", - "MICRO_DOWN", - "MICRO_LEFT", - "MICRO_RIGHT", - "MICRO_ROW_ADDRESS", - "MICRO_UP", - "ORDER_OF_PINS", - "PARM_DOWN_MICRO", - "PARM_LEFT_MICRO", - "PARM_RIGHT_MICRO", - "PARM_UP_MICRO", - "SELECT_CHAR_SET", - "SET_BOTTOM_MARGIN", - "SET_BOTTOM_MARGIN_PARM", - "SET_LEFT_MARGIN_PARM", - "SET_RIGHT_MARGIN_PARM", - "SET_TOP_MARGIN", - "SET_TOP_MARGIN_PARM", - "START_BIT_IMAGE", - "START_CHAR_SET_DEF", - "STOP_BIT_IMAGE", - "STOP_CHAR_SET_DEF", - "SUBSCRIPT_CHARACTERS", - "SUPERSCRIPT_CHARACTERS", - "THESE_CAUSE_CR", - "ZERO_MOTION", - "CHAR_SET_NAMES", - "KEY_MOUSE", - "MOUSE_INFO", - "REQ_MOUSE_POS", - "GET_MOUSE", - "SET_A_FOREGROUND", - "SET_A_BACKGROUND", - "PKEY_PLAB", - "DEVICE_TYPE", - "CODE_SET_INIT", - "SET0_DES_SEQ", - "SET1_DES_SEQ", - "SET2_DES_SEQ", - "SET3_DES_SEQ", - "SET_LR_MARGIN", - "SET_TB_MARGIN", - "BIT_IMAGE_REPEAT", - "BIT_IMAGE_NEWLINE", - "BIT_IMAGE_CARRIAGE_RETURN", - "COLOR_NAMES", - "DEFINE_BIT_IMAGE_REGION", - "END_BIT_IMAGE_REGION", - "SET_COLOR_BAND", - "SET_PAGE_LENGTH", - "DISPLAY_PC_CHAR", - "ENTER_PC_CHARSET_MODE", - "EXIT_PC_CHARSET_MODE", - "ENTER_SCANCODE_MODE", - "EXIT_SCANCODE_MODE", - "PC_TERM_OPTIONS", - "SCANCODE_ESCAPE", - "ALT_SCANCODE_ESC", - "ENTER_HORIZONTAL_HL_MODE", - "ENTER_LEFT_HL_MODE", - "ENTER_LOW_HL_MODE", - "ENTER_RIGHT_HL_MODE", - "ENTER_TOP_HL_MODE", - "ENTER_VERTICAL_HL_MODE", - "SET_A_ATTRIBUTES", - "SET_PGLEN_INCH", - ], -}; diff --git a/src/util/util/os-utils/TermInfo/TermInfo.ts b/src/util/util/os-utils/TermInfo/TermInfo.ts deleted file mode 100644 index bc669960..00000000 --- a/src/util/util/os-utils/TermInfo/TermInfo.ts +++ /dev/null @@ -1,50 +0,0 @@ -// SOURCE: https://github.com/eistaa/parse-terminfo -/* ========================================================================= - * Copyright (c) 2016 Eivind Storm Aarnæs - * Licensed under the MIT license - * (see https://github.com/eistaa/parse-terminfo/blob/master/LICENSE) - * ========================================================================= */ - -import { openTerminfoBuffer } from "./openTerminfoBuffer"; -import { parseTerminfo, TermInfo } from "./parseTerminfo"; - -export class ParseOptions { - term?: string; - directories?: string[]; - debug: boolean = false; -} - -export function parse(opts?: ParseOptions): TermInfo { - let term; - - if (process.platform === "win32") - throw new Error("no terminfo for windows..."); - - // get term - if (opts?.term) { - term = String(opts.term); - } else { - if (process.env.TERM && process.env.TERM !== "") { - term = process.env.TERM; - } else { - throw new Error( - "No terminal specified (`opts.term`) and TERM is undefined", - ); - } - } - - if(opts?.debug) console.log("Parsing terminfo for", term); - - const bufferData = openTerminfoBuffer(term, opts); - const capabilities = parseTerminfo(bufferData.buffer, term, opts); - capabilities.path = bufferData.path; - - if(opts?.debug) console.log("Parsed terminfo for", term, ":", capabilities); - - return capabilities; -} - -export default { - VARIABLES: require("./Constants").ALL_VARS, - parse -}; diff --git a/src/util/util/os-utils/TermInfo/openTerminfoBuffer.ts b/src/util/util/os-utils/TermInfo/openTerminfoBuffer.ts deleted file mode 100644 index 6e71510c..00000000 --- a/src/util/util/os-utils/TermInfo/openTerminfoBuffer.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* ========================================================================= - * Copyright (c) 2016 Eivind Storm Aarnæs - * Licensed under the MIT license - * (see https://github.com/eistaa/parse-terminfo/blob/master/LICENSE) - * ========================================================================= */ - -import fs from "fs"; -import path from "path"; -import { ParseOptions } from "./TermInfo"; - -const DEFAULT_DB_DIRECTORIES = [ - "/etc/terminfo", - "/lib/terminfo", - "/usr/share/terminfo", -]; - -function isDirectory(directory: string) { - try { - return fs.statSync(path.normalize(directory.trim())).isDirectory(); - } catch (err) { - return false; - } -} - -function constructDBDirectories(dirs?: string[] | string) { - /* - * the ordering comes from manpage 'terminfo(5)' - */ - - const directories: string[] = []; - - // argument can be array or string - if (dirs) { - if (Array.isArray(dirs)) { - dirs.filter(isDirectory).forEach((dir) => directories.push(dir)); - } else { - if (isDirectory(dirs)) directories.push(dirs); - } - } - - // TERMINFO may exist - if (process.env.TERMINFO && isDirectory(process.env.TERMINFO)) - directories.push(process.env.TERMINFO); - - // there may be a local terminfo directory - if ( - process.env.HOME && - isDirectory(path.normalize(path.join(process.env.HOME, ".terminfo"))) - ) - directories.push(path.join(process.env.HOME, ".terminfo")); - - // TERMINFO_DIRS can contain a :-separated list of directories - if (process.env.TERMINFO_DIRS) { - const terminfoDirectories = process.env.TERMINFO_DIRS.split(":"); - terminfoDirectories - .filter(isDirectory) - .forEach((dir) => directories.push(dir)); - } - - // default to hardcoded directories - DEFAULT_DB_DIRECTORIES.filter(isDirectory).forEach((dir) => - directories.push(dir), - ); - - return directories; -} - -export function openTerminfoBuffer( - term: string, - opts: ParseOptions | undefined, -) { - // determine directories - const directories = constructDBDirectories(opts?.directories); - - if (opts?.debug) console.log("Directories:", directories); - - let filepath; - - if (directories.length === 0) - throw new Error("No terminfo database directories exist"); - - // use first valid directory - for (let i = 0; i < directories.length; i++) { - try { - filepath = path.join(directories[i], term.charAt(0), term); - if (fs.statSync(filepath).isFile()) { - if (opts?.debug) - console.log("Found terminfo data at", filepath); - break; - } - } catch (err) { - filepath = undefined; - } - } - - if (filepath === undefined) - throw new Error("Found no terminfo database for " + term); - - // read to buffer - return { - path: filepath, - buffer: fs.readFileSync(filepath), - }; -} diff --git a/src/util/util/os-utils/TermInfo/parseTerminfo.ts b/src/util/util/os-utils/TermInfo/parseTerminfo.ts deleted file mode 100644 index 71a4b933..00000000 --- a/src/util/util/os-utils/TermInfo/parseTerminfo.ts +++ /dev/null @@ -1,159 +0,0 @@ -"use strict"; - -/* ========================================================================= - * Copyright (c) 2016 Eivind Storm Aarnæs - * Licensed under the MIT license - * (see https://github.com/eistaa/parse-terminfo/blob/master/LICENSE) - * ========================================================================= */ - -import { ALL_VARS, VARORDER } from "./Constants"; - -/* - * based of on the format description in the term(5) manual page. - */ - -export class TermInfo { - description?: string; - term?: string[]; - capabilities: { - booleans: Record; - numbers: Record; - strings: Record; - }; - path: string; - integerSize: number; -} - -export function parseTerminfo( - buffer: Buffer, - term: string, - opts?: { debug: boolean }, -): TermInfo { - let offset = 0; - - function readInt() { - const result = buffer.readInt16LE(offset); - console.log("Read int @", offset, ":", result); - offset += 2; - return result; - } - - /// @type {{ description: string | undefined; term: string[] | undefined; capabilities: { booleans: {}; numbers: {}; strings: {}; }; }} - const result: TermInfo = { - capabilities: { - booleans: {}, - numbers: {}, - strings: {}, - }, - path: "", - description: undefined, - term: undefined, - integerSize: 0, - }; - - // check the magic number - const magic = readInt(); - - // if (magic !== 0x011a) - // throw new Error("invalid magic number in buffer for " + term + ": " + magic.toString(16)); - switch (magic) { - case 0x011a: - result.integerSize = 16; - break; - case 0x21e: - result.integerSize = 32; - break; - default: - throw new Error( - "invalid magic number in buffer for " + - term + - ": " + - magic.toString(16), - ); - } - - if (opts?.debug) console.log("Magic number:", magic, "Integer size:", result.integerSize); - - //offset += 2; - - // parse section sizes - const sizes = { - names: readInt(), - booleans: readInt(), - numbers: readInt(), - strings: readInt(), - table: readInt(), - }; - - if (opts?.debug) console.log("Section sizes:", sizes); - - //offset += 10; - - // parse names section - const names = buffer - .toString("ascii", offset, offset + sizes.names - 1) - .split("|"); - result.term = names[0].split("|"); - result.description = names[1]; - if (opts?.debug) - console.log("Got info:", { - term: result.term, - description: result.description, - }); - offset += sizes.names; - - // parse booleans - let boolean; - const numBools = Math.min(VARORDER.booleans.length, sizes.booleans); - for (let i = 0; i < numBools; i++) { - if (i >= VARORDER.booleans.length) { - if (opts?.debug) console.log("Read boolean overran length"); - continue; - } // doesn't (yet) support extended terminfo - - const data = buffer.readInt8(offset + i); - if (opts?.debug && data != 0 && data != 1) - console.log("Invalid boolean data:", data.toString(16)); - - boolean = !!data; - if (boolean) - result.capabilities.booleans[ALL_VARS[VARORDER.booleans[i]]] = true; - } - offset += sizes.booleans + ((offset + sizes.booleans) % 2); // padded to short boundary - - // parse numbers - let number; - const numNumbers = Math.min(VARORDER.numbers.length, sizes.numbers); - for (let i = 0; i < numNumbers; i++) { - if (i >= VARORDER.numbers.length) continue; // doesn't (yet) support extended terminfo - - number = buffer.readInt16LE(offset + 2 * i); - if (number !== -1) - result.capabilities.numbers[ALL_VARS[VARORDER.numbers[i]]] = number; - } - offset += 2 * sizes.numbers; - if (opts?.debug) - console.log("Read numbers up to", offset, ":", result.capabilities.numbers); - - // parse strings - let tableOffset, valueEnd; - const tableStart = offset + 2 * sizes.strings; - const numStrings = Math.min(VARORDER.strings.length, sizes.strings); - for (let i = 0; i < numStrings; i++) { - if (i >= VARORDER.strings.length) continue; // doesn't (yet) support extended terminfo - - tableOffset = buffer.readInt16LE(offset + 2 * i); - if (tableOffset !== -1) { - valueEnd = tableStart + tableOffset; - while (buffer[valueEnd++] !== 0); // string values are null terminated - result.capabilities.strings[ALL_VARS[VARORDER.strings[i]]] = - buffer.toString( - "ascii", - tableStart + tableOffset, - valueEnd - 1, - ); - } - } - - return result; -}