webtty 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- import{FitAddon as L,init as M,Terminal as y}from"/dist/ghostty-web.js";var B=new RegExp("\x1B\\[(\\d*) q","g");function W(j,G){let Q=j.options.cursorStyle,P=j.options.cursorBlink;B.lastIndex=0;let K=B.exec(G);while(K!==null){let J=K[1]===""?0:Number(K[1]);if(!Number.isNaN(J)&&J>=0&&J<=6)j.options.cursorStyle=J===0||J===1||J===2?"block":J===3||J===4?"underline":"bar",j.options.cursorBlink=J===0||J===1||J===3||J===5;K=B.exec(G)}if((j.options.cursorStyle!==Q||j.options.cursorBlink!==P)&&j.renderer&&j.wasmTerm)j.renderer.render(j.wasmTerm,!0,j.viewportY)}var O=window.location.pathname.split("/s/")[1]??"main",N=await fetch("/api/config").then((j)=>j.json());document.title=`${O} | webtty`;await M();var z=new y({cols:N.cols,rows:N.rows,cursorStyle:N.cursorStyle,cursorBlink:N.cursorStyleBlink,fontSize:N.fontSize,fontFamily:N.fontFamily,scrollback:Math.ceil(N.scrollback/80),theme:N.theme}),_=new L;z.loadAddon(_);var $=document.getElementById("terminal");await z.open($);_.fit();_.observeResize();var U=window.location.protocol==="https:"?"wss:":"ws:",H;function q(){let j=`${U}//${window.location.host}/ws/${O}?cols=${z.cols}&rows=${z.rows}`;H=new WebSocket(j);let G="\x1B[2m",Q="\x1B[1;33m",P="\x1B[3m",K="\x1B[0m",J=`${G}[${K} ${Q}webtty${K} ${G}]${K}`,V=(X)=>`\r
2
- ${J} ${G}${P}${X}${K}\r
3
- `;H.onopen=()=>{H.send(JSON.stringify({type:"resize",cols:z.cols,rows:z.rows}))},H.onmessage=(X)=>{W(z,X.data),z.write(X.data)},H.onclose=(X)=>{if(X.code===4001){z.write(V("Session removed.")),setTimeout(()=>window.close(),500);return}if(X.code===1001){z.write(V("Server stopped.")),setTimeout(()=>window.close(),500);return}z.write(V("Connection lost. Reconnecting in 2s...")),setTimeout(q,2000)},H.onerror=()=>{z.write(V("WebSocket error."))}}q();var Z=0,Y=0;z.attachCustomWheelEventHandler((j)=>{if(!z.hasMouseTracking())return!1;let G=z.renderer?.getMetrics();if(!G)return!1;let Q=j.deltaY<0?-1:1;if(Q!==Y)Z=0,Y=Q;Z+=N.mouseScrollSpeed;let P=Math.trunc(Z);if(P===0)return!0;Z-=P;let K=j.target.getBoundingClientRect(),J=Math.max(1,Math.floor((j.clientX-K.left)/G.width)+1),V=Math.max(1,Math.floor((j.clientY-K.top)/G.height)+1),x=`\x1B[<${Q<0?64:65};${J};${V}M`;if(H&&H.readyState===WebSocket.OPEN)for(let F=0;F<P;F++)H.send(x);return!0});$.addEventListener("keydown",(j)=>{let G=j.key.toLowerCase(),Q=new Set([...j.shiftKey?["shift"]:[],...j.ctrlKey?["ctrl"]:[],...j.altKey?["alt"]:[],...j.metaKey?["meta"]:[]]),P=N.keyboardBindings.find((K)=>{if(K.key.toLowerCase()!==G)return!1;let J=new Set((Array.isArray(K.mods)?K.mods:[]).map((V)=>V.toLowerCase()));if(J.size!==Q.size)return!1;for(let V of J)if(!Q.has(V))return!1;return!0});if(!P)return;if(j.preventDefault(),j.stopPropagation(),P.chars&&H.readyState===WebSocket.OPEN)H.send(P.chars)},{capture:!0});z.onData((j)=>{if(H&&H.readyState===WebSocket.OPEN)H.send(j)});z.onResize(({cols:j,rows:G})=>{if(H&&H.readyState===WebSocket.OPEN)H.send(JSON.stringify({type:"resize",cols:j,rows:G}))});window.addEventListener("resize",()=>{_.fit()});if(N.copyOnSelect)z.onSelectionChange(()=>{let j=z.getSelection();if(!j)return;navigator.clipboard.writeText(j).catch(()=>{})});if(N.rightClickBehavior==="copyPaste")$.addEventListener("contextmenu",(j)=>{let G=z.getSelection();if(!G)return;j.preventDefault(),navigator.clipboard.writeText(G).catch(()=>{}),z.clearSelection()});$.addEventListener("paste",(j)=>{let G=j.clipboardData;if(!G)return;if(G.getData("text/plain"))return;if(j.preventDefault(),j.stopImmediatePropagation(),H&&H.readyState===WebSocket.OPEN)H.send("\x16")},{capture:!0});
1
+ import{FitAddon as G,init as y,Terminal as U}from"/dist/ghostty-web.js";var B=new RegExp("\x1B\\[(\\d*) q","g");function W(j,z){let V=j.options.cursorStyle,X=j.options.cursorBlink;B.lastIndex=0;let N=B.exec(z);while(N!==null){let K=N[1]===""?0:Number(N[1]);if(!Number.isNaN(K)&&K>=0&&K<=6)j.options.cursorStyle=K===0||K===1||K===2?"block":K===3||K===4?"underline":"bar",j.options.cursorBlink=K===0||K===1||K===3||K===5;N=B.exec(z)}if((j.options.cursorStyle!==V||j.options.cursorBlink!==X)&&j.renderer&&j.wasmTerm)j.renderer.render(j.wasmTerm,!0,j.viewportY)}var O=window.location.pathname.split("/s/")[1]??"main",P=await fetch("/api/config").then((j)=>j.json());document.title=`${O} | webtty`;await y();var H=new U({cols:P.cols,rows:P.rows,cursorStyle:P.cursorStyle,cursorBlink:P.cursorStyleBlink,fontSize:P.fontSize,fontFamily:P.fontFamily,scrollback:Math.ceil(P.scrollback/80),theme:P.theme}),q=new G;H.loadAddon(q);var Q=document.getElementById("terminal");if(P.theme?.background)Q.style.background=P.theme.background;await H.open(Q);function x(){Q.style.padding="0",q.fit();let j=Q.querySelector("canvas");if(!j)return;let z=Math.max(0,Q.clientWidth-j.offsetWidth),V=Math.max(0,Q.clientHeight-j.offsetHeight);Q.style.paddingLeft=`${Math.floor(z/2)}px`,Q.style.paddingRight=`${Math.ceil(z/2)}px`,Q.style.paddingTop=`${Math.floor(V/2)}px`,Q.style.paddingBottom=`${Math.ceil(V/2)}px`}x();new ResizeObserver(()=>x()).observe(Q,{box:"border-box"});var k=window.location.protocol==="https:"?"wss:":"ws:",J;function L(){let j=`${k}//${window.location.host}/ws/${O}?cols=${H.cols}&rows=${H.rows}`;J=new WebSocket(j);let z="\x1B[2m",V="\x1B[1;33m",X="\x1B[3m",N="\x1B[0m",K=`${z}[${N} ${V}webtty${N} ${z}]${N}`,Z=(_)=>`\r
2
+ ${K} ${z}${X}${_}${N}\r
3
+ `;J.onopen=()=>{J.send(JSON.stringify({type:"resize",cols:H.cols,rows:H.rows}))},J.onmessage=(_)=>{W(H,_.data),H.write(_.data)},J.onclose=(_)=>{if(_.code===4001){H.write(Z("Session removed.")),setTimeout(()=>window.close(),500);return}if(_.code===1001){H.write(Z("Server stopped.")),setTimeout(()=>window.close(),500);return}H.write(Z("Connection lost. Reconnecting in 2s...")),setTimeout(L,2000)},J.onerror=()=>{H.write(Z("WebSocket error."))}}L();var $=0,Y=0;H.attachCustomWheelEventHandler((j)=>{if(!H.hasMouseTracking())return!1;let z=H.renderer?.getMetrics();if(!z)return!1;let V=j.deltaY<0?-1:1;if(V!==Y)$=0,Y=V;$+=P.mouseScrollSpeed;let X=Math.trunc($);if(X===0)return!0;$-=X;let N=j.target.getBoundingClientRect(),K=Math.max(1,Math.floor((j.clientX-N.left)/z.width)+1),Z=Math.max(1,Math.floor((j.clientY-N.top)/z.height)+1),M=`\x1B[<${V<0?64:65};${K};${Z}M`;if(J&&J.readyState===WebSocket.OPEN)for(let F=0;F<X;F++)J.send(M);return!0});Q.addEventListener("keydown",(j)=>{let z=j.key.toLowerCase(),V=new Set([...j.shiftKey?["shift"]:[],...j.ctrlKey?["ctrl"]:[],...j.altKey?["alt"]:[],...j.metaKey?["meta"]:[]]),X=P.keyboardBindings.find((N)=>{if(N.key.toLowerCase()!==z)return!1;let K=new Set((Array.isArray(N.mods)?N.mods:[]).map((Z)=>Z.toLowerCase()));if(K.size!==V.size)return!1;for(let Z of K)if(!V.has(Z))return!1;return!0});if(!X)return;if(j.preventDefault(),j.stopPropagation(),X.chars&&J.readyState===WebSocket.OPEN)J.send(X.chars)},{capture:!0});H.onData((j)=>{if(J&&J.readyState===WebSocket.OPEN)J.send(j)});H.onResize(({cols:j,rows:z})=>{if(J&&J.readyState===WebSocket.OPEN)J.send(JSON.stringify({type:"resize",cols:j,rows:z}))});if(P.copyOnSelect)H.onSelectionChange(()=>{let j=H.getSelection();if(!j)return;navigator.clipboard.writeText(j).catch(()=>{})});if(P.rightClickBehavior==="copyPaste")Q.addEventListener("contextmenu",(j)=>{let z=H.getSelection();if(!z)return;j.preventDefault(),navigator.clipboard.writeText(z).catch(()=>{}),H.clearSelection()});Q.addEventListener("paste",(j)=>{let z=j.clipboardData;if(!z)return;if(z.getData("text/plain"))return;if(j.preventDefault(),j.stopImmediatePropagation(),J&&J.readyState===WebSocket.OPEN)J.send("\x16")},{capture:!0});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webtty",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "Web TTY for running CLI/TUI applications in a browser tab, across platforms",
5
5
  "license": "MIT",
6
6
  "bin": {