webtty 1.11.2 → 1.11.4
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.
- package/dist/client-browser.js +3 -3
- package/package.json +1 -1
package/dist/client-browser.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{FitAddon as
|
|
2
|
-
${
|
|
3
|
-
`;r.onopen=()=>{r.send(JSON.stringify({type:"resize",cols:n.cols,rows:n.rows}))},r.onmessage=(d)=>{S(n,d.data),n.write(d.data)},r.onclose=(d)=>{if(d.code===4001){n.write(u("Session removed.")),setTimeout(()=>window.close(),500);return}if(d.code===1001){n.write(u("Server stopped.")),setTimeout(()=>window.close(),500);return}n.write(u("Connection lost. Reconnecting in 2s...")),setTimeout(
|
|
1
|
+
import{FitAddon as P,init as L,Terminal as W}from"/dist/ghostty-web.js";var m=new RegExp("\x1B\\[(\\d*) q","g");function S(e,t){let o=e.options.cursorStyle,l=e.options.cursorBlink;m.lastIndex=0;let a=m.exec(t);while(a!==null){let i=a[1]===""?0:Number(a[1]);if(!Number.isNaN(i)&&i>=0&&i<=6)e.options.cursorStyle=i===0||i===1||i===2?"block":i===3||i===4?"underline":"bar",e.options.cursorBlink=i===0||i===1||i===3||i===5;a=m.exec(t)}if((e.options.cursorStyle!==o||e.options.cursorBlink!==l)&&e.renderer&&e.wasmTerm)e.renderer.render(e.wasmTerm,!0,e.viewportY)}function v(e,t){if(t&&e.startsWith("\x1B[<32;"))return"\x1B[<35;"+e.slice(6);return e}function E(e,t){return e.startsWith("\x1B[<32;")&&e===t}var x=window.location.pathname.split("/s/")[1]??"main",c=await fetch("/api/config").then((e)=>e.json());document.title=`${x} | webtty`;await L();var n=new W({cols:c.cols,rows:c.rows,cursorStyle:c.cursorStyle,cursorBlink:c.cursorStyleBlink,fontSize:c.fontSize,fontFamily:c.fontFamily,scrollback:Math.ceil(c.scrollback/80),theme:c.theme}),M=new P;n.loadAddon(M);var s=document.getElementById("terminal");if(c.theme?.background)s.style.background=c.theme.background;await n.open(s);function T(){s.style.padding="0",M.fit();let e=s.querySelector("canvas");if(!e)return;let t=Math.max(0,s.clientWidth-e.offsetWidth),o=Math.max(0,s.clientHeight-e.offsetHeight);s.style.paddingLeft=`${Math.floor(t/2)}px`,s.style.paddingRight=`${Math.ceil(t/2)}px`,s.style.paddingTop=`${Math.floor(o/2)}px`,s.style.paddingBottom=`${Math.ceil(o/2)}px`}var p=null;function y(){if(p!==null)return;p=window.requestAnimationFrame(()=>{p=null,T()})}y();new ResizeObserver(()=>y()).observe(s,{box:"border-box"});window.addEventListener("resize",y);document.fonts.ready.then(()=>n.renderer?.remeasureFont());document.addEventListener("visibilitychange",()=>{if(document.visibilityState!=="visible")return;if(n.renderer&&n.wasmTerm)n.renderer.render(n.wasmTerm,!0,n.viewportY)});function D(e){if(e.style.cursor==="text")e.style.cursor="default"}D(s);new MutationObserver((e)=>{for(let t of e)D(t.target)}).observe(s,{attributes:!0,attributeFilter:["style"],subtree:!0});var z=window.location.protocol==="https:"?"wss:":"ws:",r;function C(){let e=`${z}//${window.location.host}/ws/${x}/pty?cols=${n.cols}&rows=${n.rows}`;r=new WebSocket(e);let t="\x1B[2m",o="\x1B[1;33m",l="\x1B[3m",a="\x1B[0m",i=`${t}[${a} ${o}webtty${a} ${t}]${a}`,u=(d)=>`\r
|
|
2
|
+
${i} ${t}${l}${d}${a}\r
|
|
3
|
+
`;r.onopen=()=>{r.send(JSON.stringify({type:"resize",cols:n.cols,rows:n.rows}))},r.onmessage=(d)=>{S(n,d.data),n.write(d.data)},r.onclose=(d)=>{if(d.code===4001){n.write(u("Session removed.")),setTimeout(()=>window.close(),500);return}if(d.code===1001){n.write(u("Server stopped.")),setTimeout(()=>window.close(),500);return}n.write(u("Connection lost. Reconnecting in 2s...")),setTimeout(C,2000)},r.onerror=()=>{n.write(u("WebSocket error."))}}C();var g=0,k=0;n.attachCustomWheelEventHandler((e)=>{if(!n.hasMouseTracking())return!1;let t=n.renderer?.getMetrics();if(!t)return!1;let o=e.deltaY<0?-1:1;if(o!==k)g=0,k=o;g+=c.mouseScrollSpeed;let l=Math.trunc(g);if(l===0)return!0;g-=l;let a=e.target.getBoundingClientRect(),i=Math.max(1,Math.floor((e.clientX-a.left)/t.width)+1),u=Math.max(1,Math.floor((e.clientY-a.top)/t.height)+1),R=`\x1B[<${o<0?64:65};${i};${u}M`;if(r&&r.readyState===WebSocket.OPEN)for(let w=0;w<l;w++)r.send(R);return!0});s.addEventListener("keydown",(e)=>{let t=e.key.toLowerCase(),o=new Set([...e.shiftKey?["shift"]:[],...e.ctrlKey?["ctrl"]:[],...e.altKey?["alt"]:[],...e.metaKey?["meta"]:[]]),l=c.keyboardBindings.find((a)=>{if(a.key.toLowerCase()!==t)return!1;let i=new Set((Array.isArray(a.mods)?a.mods:[]).map((u)=>u.toLowerCase()));if(i.size!==o.size)return!1;for(let u of i)if(!o.has(u))return!1;return!0});if(!l)return;if(e.preventDefault(),e.stopPropagation(),l.chars&&r.readyState===WebSocket.OPEN)r.send(l.chars)},{capture:!0});var f=Math.min(32,Math.max(6,c.fontSize));window.addEventListener("keydown",(e)=>{if(!e.ctrlKey&&!e.metaKey)return;let t=e.code==="Equal"||e.code==="NumpadAdd",o=e.code==="Minus"&&!e.shiftKey||e.code==="NumpadSubtract",l=e.code==="Digit0"&&!e.shiftKey||e.code==="Numpad0";if(!t&&!o&&!l)return;if(e.preventDefault(),e.stopPropagation(),t)f=Math.min(32,f+1);else if(o)f=Math.max(6,f-1);else f=Math.min(32,Math.max(6,c.fontSize));n.options.fontSize=f,T()},{capture:!0});var b=!1,h="";s.addEventListener("mousemove",(e)=>{if(b=n.hasMouseTracking()&&e.buttons===0,b)h=""},{capture:!0});n.onData((e)=>{let t=v(e,b);if(t!==e){if(r&&r.readyState===WebSocket.OPEN)r.send(t);return}if(E(e,h))return;if(h=e.startsWith("\x1B[<32;")?e:"",r&&r.readyState===WebSocket.OPEN)r.send(e)});n.onResize(({cols:e,rows:t})=>{if(r&&r.readyState===WebSocket.OPEN)r.send(JSON.stringify({type:"resize",cols:e,rows:t}))});if(c.copyOnSelect)n.onSelectionChange(()=>{let e=n.getSelection();if(!e)return;navigator.clipboard.writeText(e).catch(()=>{})});if(c.rightClickBehavior==="copyPaste")s.addEventListener("contextmenu",(e)=>{let t=n.getSelection();if(!t)return;e.preventDefault(),navigator.clipboard.writeText(t).catch(()=>{}),n.clearSelection()});s.addEventListener("paste",(e)=>{let t=e.clipboardData;if(!t)return;let o=t.getData("text/plain");if(!o){if(e.preventDefault(),e.stopImmediatePropagation(),r&&r.readyState===WebSocket.OPEN)r.send("\x16");return}e.preventDefault(),e.stopImmediatePropagation();let l=n.getMode(2004)?`\x1B[200~${o}\x1B[201~`:o;if(r&&r.readyState===WebSocket.OPEN)r.send(l)},{capture:!0});
|