trzsz.js文件傳輸工具
trzsz ( trz / tsz ) 是一個兼容 tmux 的文件傳輸工具,和 lrzsz ( rz / sz ) 類似,并且有進度條,支持目錄傳輸,支持拖動上傳。
GitHub: https://github.com/trzsz/trzsz.js
有關 trzsz 更詳細的文檔,請查看 https://trzsz.github.io/cn。
trzsz.js 是 trzsz 的 js 版實現,支持在瀏覽器中運行的 webshell,支持用 electron 等實現的 js 語言的終端。
開發(fā)指引
-
添加依賴
npm install trzsz或者
yarn add trzsz -
在 Node.js 中引用
import { TrzszFilter } from "trzsz";或者
const { TrzszFilter } = require("trzsz"); -
或者在瀏覽器中引用
<script src="node_modules/trzsz/lib/trzsz.js"></script> -
創(chuàng)建
TrzszFilter對象( 每個登錄服務器的連接創(chuàng)建一個相應的 )const trzszFilter = new TrzszFilter({ // 這里設置 trzsz 的屬性,詳情請參考下文。 }); -
一般來說,服務器的輸出會轉發(fā)到終端進行顯示,創(chuàng)建
TrzszFilter過濾器,接受服務器的輸出,并轉發(fā)給終端。const trzszFilter = new TrzszFilter({ // 將服務器的輸出轉發(fā)給終端進行顯示,當用戶在服務器上執(zhí)行 trz / tsz 命令時,輸出則會被接管。 writeToTerminal: (data) => terminal.write(typeof data === "string" ? data : new Uint8Array(data)), }); // 將服務器的輸出轉發(fā)給 TrzszFilter 進行處理,一般會原樣轉發(fā)回上面定義的 writeToTerminal 函數。 webSocket.addEventListener("message", (ev) => trzszFilter.processServerOutput(ev.data)); -
一般來說,用戶的輸入會轉發(fā)到服務器上,創(chuàng)建
TrzszFilter過濾器,接受用戶的輸入,并轉發(fā)給服務器。const trzszFilter = new TrzszFilter({ // 將用戶的輸入轉發(fā)到服務器上,當 trz / tsz 上傳或下載時,輸入則會被忽略,ctrl + c 會停止傳輸。 sendToServer: (data) => webSocket.send(data), }); // 將用戶的輸入轉發(fā)給 TrzszFilter 進行處理,一般會原樣轉發(fā)回上面定義的 sendToServer 函數。 terminal.onData((data) => trzszFilter.processTerminalInput(data)); // 將用戶的鼠標事件轉發(fā)給 TrzszFilter 進行處理,一般會原樣轉發(fā)回上面定義的 sendToServer 函數。 terminal.onBinary((data) => trzszFilter.processBinaryInput(data)); -
需要告知
TrzszFilter終端的寬度,在顯示進度條時會使用到。const trzszFilter = new TrzszFilter({ // 終端的初始寬度 terminalColumns: terminal.cols, }); // 當終端寬度發(fā)生變化時,告知 TrzszFilter 最新的寬度。 terminal.onResize((size) => trzszFilter.setTerminalColumns(size.cols)); -
如果遠程服務器是 Windows 命令行, 例如
cmd和PowerShell。const trzszFilter = new TrzszFilter({ // 聲明遠程服務器是 Windows 的 cmd / PowerShell 等 isWindowsShell: true, }); -
如果是
Node.js運行環(huán)境,即能正常執(zhí)行require('fs'),那么chooseSendFilesandchooseSaveDirectory是必須的。如果是瀏覽器運行環(huán)境,則會忽略它們。注意是async函數。const trzszFilter = new TrzszFilter({ // 當用戶在服務器上執(zhí)行 trz 命令上傳文件時,require('fs') 不報錯,則會回調此函數,選擇要上傳的文件。 chooseSendFiles: async (directory) => { // 如果 `directory` 參數為 `true`,則應該允許用戶選擇目錄和文件( 多選 )。 // 如果 `directory` 參數為 `false`,則應該只允許用戶選擇文件( 多選 )。 // 返回 `undefined` 代表用戶取消選擇文件,終止上傳操作。 // 正常應該回一個數組,包含文件或目錄的絕對路徑,如下: return ["/path/to/file1", "/path/to/file2", "/path/to/directory3"]; }, // 當用戶在服務器上執(zhí)行 tsz 命令下載文件時,require('fs') 不報錯,則會回調此函數,選擇要保存的路徑。 chooseSaveDirectory: async () => { // 返回 `undefined` 代表用戶取消選擇保存路徑,終止下載操作。 // 正常應該回一個目錄的絕對路徑,如下: return "/path/to/directory"; }, }); -
支持拖拽文件和目錄上傳的功能。
terminalHtmlElement.addEventListener("dragover", (event) => event.preventDefault()); terminalHtmlElement.addEventListener("drop", (event) => { event.preventDefault(); trzszFilter .uploadFiles(event.dataTransfer.items) .then(() => console.log("upload success")) .catch((err) => console.log(err)); }); -
如果你在使用 xterm-addon-attach 插件,只將簡單地用
TrzszAddon替換AttachAddon即可。import { Terminal } from "xterm"; import { TrzszAddon } from "trzsz"; const terminal = new Terminal(); const trzszAddon = new TrzszAddon(webSocket); terminal.loadAddon(trzszAddon);
開發(fā)示例
-
瀏覽器 webshell 例子。
-
Electron 終端例子。
-
TrzszAddon xterm 插件例子。
錄屏演示
js 版的 trzsz.js,可以在 Chrome 瀏覽器中使用 trzsz ( trz / tsz ) 上傳和下載文件,如圖:
js 版的 trzsz.js,可以集成到 electron 開發(fā)的終端中,使用 trzsz ( trz / tsz ) 上傳和下載文件,如圖:
