diff --git a/agent/cli.go b/agent/cli.go index 0bc285573d..6c114dc37a 100644 --- a/agent/cli.go +++ b/agent/cli.go @@ -26,9 +26,9 @@ func init() { setupCmd.Flags().String("auth-token-hash", "", "Auth token hash") setupCmd.Flags().String("wireguard-private-key", "", "Wireguard private key") - setupCmd.Flags().String("wireguard-address", "", "Wireguard address") - setupCmd.Flags().String("docker-network-gateway-address", "", "Docker network gateway address") - setupCmd.Flags().String("docker-network-subnet", "", "Docker network subnet") + setupCmd.Flags().String("wireguard-address", "", "Wireguard address ip/cidr") + setupCmd.Flags().String("docker-network-gateway-address", "", "Docker network gateway address (ip)") + setupCmd.Flags().String("docker-network-subnet", "", "Docker network subnet ip/cidr") setupCmd.Flags().String("swiftwave-service-address", "", "Swiftwave service address ip:port") setupCmd.Flags().Bool("enable-haproxy", false, "Enable haproxy") diff --git a/swiftwave_service/cmd/root.go b/swiftwave_service/cmd/root.go index 2ed7e7f4cc..6876943a43 100644 --- a/swiftwave_service/cmd/root.go +++ b/swiftwave_service/cmd/root.go @@ -3,11 +3,12 @@ package cmd import ( _ "embed" "fmt" + "os" + swiftwave_config "github.com/swiftwave-org/swiftwave/swiftwave_service/config" "github.com/swiftwave-org/swiftwave/swiftwave_service/config/local_config" "github.com/swiftwave-org/swiftwave/swiftwave_service/config/system_config/bootstrap" "github.com/swiftwave-org/swiftwave/swiftwave_service/db" - "os" "github.com/spf13/cobra" ) @@ -15,10 +16,12 @@ import ( var config *swiftwave_config.Config func init() { + rootCmd.Flags().SortFlags = false rootCmd.AddCommand(initCmd) rootCmd.AddCommand(configCmd) rootCmd.AddCommand(dbMigrateCmd) rootCmd.AddCommand(tlsCmd) + rootCmd.AddCommand(serverManagementCmd) rootCmd.AddCommand(userManagementCmd) rootCmd.AddCommand(startCmd) rootCmd.AddCommand(serviceCmd) diff --git a/swiftwave_service/cmd/server.go b/swiftwave_service/cmd/server.go new file mode 100644 index 0000000000..4b64cfd10c --- /dev/null +++ b/swiftwave_service/cmd/server.go @@ -0,0 +1,144 @@ +package cmd + +import ( + "fmt" + "os" + "text/tabwriter" + + "github.com/spf13/cobra" + "github.com/swiftwave-org/swiftwave/swiftwave_service/core" + "github.com/swiftwave-org/swiftwave/swiftwave_service/db" +) + +func init() { + serverManagementCmd.Flags().SortFlags = false + serverManagementCmd.AddCommand(createServerCmd) + serverManagementCmd.AddCommand(deleteServerCmd) + serverManagementCmd.AddCommand(listServerCmd) + serverManagementCmd.AddCommand(getSetupAgentCmd) + + createServerCmd.Flags().String("name", "", "Server Name") + createServerCmd.Flags().String("ip", "", "Server IP") + createServerCmd.MarkFlagRequired("name") + createServerCmd.MarkFlagRequired("ip") + + deleteServerCmd.Flags().String("name", "", "Server Name") + deleteServerCmd.MarkFlagRequired("name") +} + +var serverManagementCmd = &cobra.Command{ + Use: "server", + Short: "Manage servers", + Run: func(cmd *cobra.Command, args []string) { + err := cmd.Help() + if err != nil { + return + } + }, +} + +var createServerCmd = &cobra.Command{ + Use: "create", + Short: "Create a new server", + Long: "Create a new server", + Run: func(cmd *cobra.Command, args []string) { + server_name := cmd.Flag("name").Value.String() + server_ip := cmd.Flag("ip").Value.String() + if server_name == "" || server_ip == "" { + printError("server name and ip are required") + err := cmd.Help() + if err != nil { + return + } + return + } + // Initiating database client + dbClient, err := db.GetClient(config.LocalConfig, 10) + if err != nil { + printError("Failed to connect to database") + return + } + // Create server + server := core.Server{ + Name: server_name, + PublicIP: server_ip, + } + err = core.CreateServer(dbClient, &server) + if err != nil { + printError("Failed to create server") + return + } + printSuccess("Created server > " + server_name) + }, +} + +var deleteServerCmd = &cobra.Command{ + Use: "delete", + Short: "Delete a server", + Long: "Delete a server", + Run: func(cmd *cobra.Command, args []string) { + server_name := cmd.Flag("name").Value.String() + if server_name == "" { + printError("server name is required") + err := cmd.Help() + if err != nil { + return + } + return + } + // Initiating database client + dbClient, err := db.GetClient(config.LocalConfig, 10) + if err != nil { + printError("Failed to connect to database") + return + } + server, err := core.FetchServerByName(dbClient, server_name) + if err != nil { + printError("Failed to fetch server") + return + } + // Delete server + err = core.DeleteServer(dbClient, server.ID) + if err != nil { + printError("Failed to delete server") + return + } + }, +} + +var listServerCmd = &cobra.Command{ + Use: "list", + Short: "List servers", + Long: "List servers", + Run: func(cmd *cobra.Command, args []string) { + dbClient, err := db.GetClient(config.LocalConfig, 10) + if err != nil { + printError("Failed to connect to database") + return + } + servers, err := core.FetchAllServers(dbClient) + if err != nil { + printError("Failed to fetch servers") + return + } + // Create a tab writer + w := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', tabwriter.AlignRight) + w.Write([]byte("ID\tName\tIP\tWireguard IP\tDeployment\tProxy\tStatus\tLast Ping\n")) + for _, server := range servers { + w.Write([]byte(fmt.Sprintf("%d\t%s\t%s\t%s\t%s\t%v\t%s\t%s\n", server.ID, server.Name, server.PublicIP, server.WireguardConfig.IP, server.Status, server.ProxyEnabled, server.Status, server.LastPing.Format("2006-01-02 15:04:05")))) + } + w.Flush() + }, +} + +var getSetupAgentCmd = &cobra.Command{ + Use: "setup-agent", + Short: "Setup agent on server", + Long: "Setup agent on server", + Run: func(cmd *cobra.Command, args []string) { + err := cmd.Help() + if err != nil { + return + } + }, +} diff --git a/swiftwave_service/console/assets/index.html b/swiftwave_service/console/assets/index.html deleted file mode 100644 index 4444be730b..0000000000 --- a/swiftwave_service/console/assets/index.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - Virtual Console - - - - - - - -
-
-
-
-
- []  - [Host] - [Logged in as user] - -
-
- - - - \ No newline at end of file diff --git a/swiftwave_service/console/assets/main.js b/swiftwave_service/console/assets/main.js deleted file mode 100644 index 936c655545..0000000000 --- a/swiftwave_service/console/assets/main.js +++ /dev/null @@ -1,210 +0,0 @@ -// Utility -function hideStatus() { - document.getElementById('status_text').style.display = 'none'; - document.getElementById('loader_container').style.display = 'none'; -} - -function showStatus(text) { - document.getElementById('status_text').getElementsByTagName("span")[0].innerText = text; - document.getElementById('status_text').style.display = 'block'; - document.getElementById('loader_container').style.display = 'flex'; -} - -function hideInfoPanel() { - document.getElementById('info_section_container').style.display = 'none'; -} - -function showInfoPanel() { - document.getElementById('info_section_container').style.display = 'block'; -} - -function getAuthorizationHeader() { - return "Bearer " + localStorage.getItem("token"); -} - - -// Initiate terminal -const term = new Terminal({ - cursorBlink: true, -}); - -const fitAddon = new FitAddon.FitAddon(); -term.loadAddon(fitAddon); -term.open(document.getElementById('terminal')); -fitAddon.fit(); - -// Handle copy from terminal -term.attachCustomKeyEventHandler(function (e) { - // Ctrl + Shift + C - if (e.ctrlKey && e.shiftKey && (e.keyCode === 67)) { - e.preventDefault() - navigator.clipboard.writeText(term.getSelection()).catch(() => console.log(e.message)); - return false; - } -}); - -// Terminal SSH initialization -async function init() { - // check if not on localhost and not secure - if ((location.hostname !== "localhost" && location.hostname !== "127.0.0.1" && location.hostname.endsWith(".local")) && location.protocol !== "https:") { - showStatus("Please use a secure connection (https)"); - return; - } - const urlParams = new URLSearchParams(window.location.search); - let data = {} - let targetType = "unknown" - if (urlParams.has('server')) { - targetType = "server" - // fetch server id - const serverId = urlParams.get('server'); - showStatus("Authenticating..."); - // generate a console request - const response = await fetch(`/console/token/server/${serverId}`, { - method: "POST", headers: { - 'Content-Type': 'application/json', - 'Authorization': getAuthorizationHeader() - } - }); - if (!response.ok) { - showStatus("Error: " + response.statusText); - return; - } - data = await response.json(); - } else if (urlParams.has('application')) { - targetType = "application" - // fetch application id - const applicationId = urlParams.get('application'); - showStatus("Fetching available servers..."); - // find servers - const response = await fetch(`/console/application/${applicationId}/servers`, { - method: "GET", headers: { - 'Content-Type': 'application/json', - 'Authorization': getAuthorizationHeader() - } - }); - if (!response.ok) { - showStatus("Error: " + response.statusText); - return; - } - const servers = await response.json(); - if (servers.length === 0) { - showStatus("Error: No servers available"); - return; - } - showStatus("Select preferred server to connect for application console"); - const serverList = Object.keys(servers); - let serverListString = "Available Servers:\n"; - for (let i = 0; i < serverList.length; i++) { - serverListString += `[${i + 1}] ${serverList[i]}\n` - } - serverListString = serverListString + "[x] Cancel" - serverListString = serverListString + "\n\nEnter serial no of server :"; - let serverSrNo = 0; - while (serverSrNo < 1 || serverSrNo > serverList.length) { - serverSrNo = prompt(serverListString); - if (!serverSrNo) { - showStatus("Error: No server selected"); - } - if (serverSrNo === "x") { - showStatus("Aborted ! Refresh to try again") - return; - } - } - // send request to server - showStatus("Authenticating..."); - // /console/token/application/:id/:server_id - const response2 = await fetch(`/console/token/application/${applicationId}/${servers[serverList[parseInt(serverSrNo) - 1]]}`, { - method: "POST", - headers: { - 'Content-Type': 'application/json', - 'Authorization': getAuthorizationHeader() - } - }); - if (!response2.ok) { - showStatus("Error: " + response2.statusText); - return; - } - data = await response2.json(); - } else { - showStatus("Console Info not found"); - return - } - - // fetch request_id and token - const requestId = data.request_id; - const token = data.token; - if (!requestId || !token) { - showStatus("Error: Some error occurred"); - return; - } - let target, host_info, host_user; - if (targetType === "server") { - target = data.target.hostname; - host_info = `${data.target.ip} (${data.target.hostname})` - host_user = data.target.user - } else if (targetType === "application") { - target = data.target.application; - host_info = `${data.target.server.ip} (${data.target.server.hostname})` - host_user = data.target.server.user - } else { - showStatus("Unknown configuration"); - return; - } - document.title = `[${targetType}] ${target}`; - // Set all the info - document.getElementById('target_type').innerText = targetType; - document.getElementById('target_name').innerText = target; - document.getElementById('host_info').innerText = host_info; - document.getElementById('host_user').innerText = host_user; - showInfoPanel() - - // connect to websocket using the request_id and token - let protocol = "ws"; - if (location.protocol === "https:") { - protocol = "wss"; - } - showStatus("Connecting to server..."); - const ws = new WebSocket(`${protocol}://${location.host}/console/ws/${requestId}/${token}/${term.rows}/${term.cols}`); - ws.binaryType = "arraybuffer"; - - // error handler - ws.onerror = function (e) { - showStatus("Error: " + e.message); - } - ws.onopen = function () { - hideStatus(); - // handle data received from server - ws.onmessage = function (evt) { - if (evt.data instanceof ArrayBuffer) { - term.write(new Uint8Array(evt.data)) - } else { - console.log("invalid data received") - } - } - // handle data sent from terminal - term.onData((e) => ws.send(new TextEncoder().encode(e))) - // handle terminal resize - window.addEventListener('resize', () => { - fitAddon.fit(); - const payload = { - cols: term.cols, rows: term.rows - } - let payloadStr = JSON.stringify(payload); - payloadStr = "\x04" + payloadStr; - ws.send(new TextEncoder().encode(payloadStr)) - }); - } - // handle connection close - ws.onclose = function () { - showStatus("Connection lost. Refresh to reconnect.") - } -} - -// Initiate the connection -init() - .then(() => { - console.log("console init done") - }) - .catch((e) => { - showStatus("Error: " + e.message); - }) \ No newline at end of file diff --git a/swiftwave_service/console/assets/xterm-addon-fit.js b/swiftwave_service/console/assets/xterm-addon-fit.js deleted file mode 100644 index 7384f10466..0000000000 --- a/swiftwave_service/console/assets/xterm-addon-fit.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Skipped minification because the original files appears to be already minified. - * Original file: /npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js - * - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(self,(()=>(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue("height")),s=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),a=s-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})())); -//# sourceMappingURL=xterm-addon-fit.js.map \ No newline at end of file diff --git a/swiftwave_service/console/assets/xterm.css b/swiftwave_service/console/assets/xterm.css deleted file mode 100644 index edbf0c8107..0000000000 --- a/swiftwave_service/console/assets/xterm.css +++ /dev/null @@ -1,222 +0,0 @@ -/* -v5.4.0 -*/ - -/** - * Copyright (c) 2014 The xterm.js authors. All rights reserved. - * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) - * https://github.com/chjj/term.js - * @license MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Originally forked from (with the author's permission): - * Fabrice Bellard's javascript vt100 for jslinux: - * http://bellard.org/jslinux/ - * Copyright (c) 2011 Fabrice Bellard - * The original design remains. The terminal itself - * has been extended to include xterm CSI codes, among - * other features. - */ - -/** - * Default styles for xterm.js - */ - -.xterm { - cursor: text; - position: relative; - user-select: none; - -ms-user-select: none; - -webkit-user-select: none; -} - -.xterm.focus, -.xterm:focus { - outline: none; -} - -.xterm .xterm-helpers { - position: absolute; - top: 0; - /** - * The z-index of the helpers must be higher than the canvases in order for - * IMEs to appear on top. - */ - z-index: 5; -} - -.xterm .xterm-helper-textarea { - padding: 0; - border: 0; - margin: 0; - /* Move textarea out of the screen to the far left, so that the cursor is not visible */ - position: absolute; - opacity: 0; - left: -9999em; - top: 0; - width: 0; - height: 0; - z-index: -5; - /** Prevent wrapping so the IME appears against the textarea at the correct position */ - white-space: nowrap; - overflow: hidden; - resize: none; -} - -.xterm .composition-view { - /* TODO: Composition position got messed up somewhere */ - background: #000; - color: #FFF; - display: none; - position: absolute; - white-space: nowrap; - z-index: 1; -} - -.xterm .composition-view.active { - display: block; -} - -.xterm .xterm-viewport { - /* On OS X this is required in order for the scroll bar to appear fully opaque */ - background-color: #000; - overflow-y: auto; - cursor: default; - position: absolute; - right: 0; - left: 0; - top: 0; - bottom: 0; -} - -.xterm .xterm-screen { - position: relative; -} - -.xterm .xterm-screen canvas { - position: absolute; - left: 0; - top: 0; -} - -.xterm .xterm-scroll-area { - visibility: hidden; -} - -.xterm-char-measure-element { - display: inline-block; - visibility: hidden; - position: absolute; - top: 0; - left: -9999em; - line-height: normal; -} - -.xterm.enable-mouse-events { - /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ - cursor: default; -} - -.xterm.xterm-cursor-pointer, -.xterm .xterm-cursor-pointer { - cursor: pointer; -} - -.xterm.column-select.focus { - /* Column selection mode */ - cursor: crosshair; -} - -.xterm .xterm-accessibility:not(.debug), -.xterm .xterm-message { - position: absolute; - left: 0; - top: 0; - bottom: 0; - right: 0; - z-index: 10; - color: transparent; - pointer-events: none; -} - -.xterm .xterm-accessibility-tree:not(.debug) *::selection { - color: transparent; -} - -.xterm .xterm-accessibility-tree { - user-select: text; - white-space: pre; -} - -.xterm .live-region { - position: absolute; - left: -9999px; - width: 1px; - height: 1px; - overflow: hidden; -} - -.xterm-dim { - /* Dim should not apply to background, so the opacity of the foreground color is applied - * explicitly in the generated class and reset to 1 here */ - opacity: 1 !important; -} - -.xterm-underline-1 { text-decoration: underline; } -.xterm-underline-2 { text-decoration: double underline; } -.xterm-underline-3 { text-decoration: wavy underline; } -.xterm-underline-4 { text-decoration: dotted underline; } -.xterm-underline-5 { text-decoration: dashed underline; } - -.xterm-overline { - text-decoration: overline; -} - -.xterm-overline.xterm-underline-1 { text-decoration: overline underline; } -.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; } -.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; } -.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; } -.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; } - -.xterm-strikethrough { - text-decoration: line-through; -} - -.xterm-screen .xterm-decoration-container .xterm-decoration { - z-index: 6; - position: absolute; -} - -.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { - z-index: 7; -} - -.xterm-decoration-overview-ruler { - z-index: 8; - position: absolute; - top: 0; - right: 0; - pointer-events: none; -} - -.xterm-decoration-top { - z-index: 2; - position: relative; -} \ No newline at end of file diff --git a/swiftwave_service/console/assets/xterm.js b/swiftwave_service/console/assets/xterm.js deleted file mode 100644 index bb50e25072..0000000000 --- a/swiftwave_service/console/assets/xterm.js +++ /dev/null @@ -1,3 +0,0 @@ -// v5.4.0 -!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var s in i)("object"==typeof exports?exports:e)[s]=i[s]}}(globalThis,(()=>(()=>{"use strict";var e={4567:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityManager=void 0;const n=i(9042),o=i(9924),a=i(844),h=i(4725),c=i(2585),l=i(3656);let d=t.AccessibilityManager=class extends a.Disposable{constructor(e,t,i,s){super(),this._terminal=e,this._coreBrowserService=i,this._renderService=s,this._rowColumns=new WeakMap,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=this._coreBrowserService.mainDocument.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=this._coreBrowserService.mainDocument.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let e=0;ethis._handleBoundaryFocus(e,0),this._bottomBoundaryFocusListener=e=>this._handleBoundaryFocus(e,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=this._coreBrowserService.mainDocument.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new o.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this.register(this._terminal.onResize((e=>this._handleResize(e.rows)))),this.register(this._terminal.onRender((e=>this._refreshRows(e.start,e.end)))),this.register(this._terminal.onScroll((()=>this._refreshRows()))),this.register(this._terminal.onA11yChar((e=>this._handleChar(e)))),this.register(this._terminal.onLineFeed((()=>this._handleChar("\n")))),this.register(this._terminal.onA11yTab((e=>this._handleTab(e)))),this.register(this._terminal.onKey((e=>this._handleKey(e.key)))),this.register(this._terminal.onBlur((()=>this._clearLiveRegion()))),this.register(this._renderService.onDimensionsChange((()=>this._refreshRowsDimensions()))),this.register((0,l.addDisposableDomListener)(document,"selectionchange",(()=>this._handleSelectionChange()))),this.register(this._coreBrowserService.onDprChange((()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,a.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,"\n"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){const i=this._terminal.buffer,s=i.lines.length.toString();for(let r=e;r<=t;r++){const e=i.lines.get(i.ydisp+r),t=[],n=e?.translateToString(!0,void 0,void 0,t)||"",o=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===n.length?(a.innerText=" ",this._rowColumns.set(a,[0,1])):(a.textContent=n,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",o),a.setAttribute("aria-setsize",s))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){const i=e.target,s=this._rowElements[0===t?1:this._rowElements.length-2];if(i.getAttribute("aria-posinset")===(0===t?"1":`${this._terminal.buffer.lines.length}`))return;if(e.relatedTarget!==s)return;let r,n;if(0===t?(r=i,n=this._rowElements.pop(),this._rowContainer.removeChild(n)):(r=this._rowElements.shift(),n=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),n.removeEventListener("focus",this._bottomBoundaryFocusListener),0===t){const e=this._createAccessibilityTreeNode();this._rowElements.unshift(e),this._rowContainer.insertAdjacentElement("afterbegin",e)}else{const e=this._createAccessibilityTreeNode();this._rowElements.push(e),this._rowContainer.appendChild(e)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(0===this._rowElements.length)return;const e=document.getSelection();if(!e)return;if(e.isCollapsed)return void(this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection());if(!e.anchorNode||!e.focusNode)return void console.error("anchorNode and/or focusNode are null");let t={node:e.anchorNode,offset:e.anchorOffset},i={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(i.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===i.node&&t.offset>i.offset)&&([t,i]=[i,t]),t.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(t={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(t.node))return;const s=this._rowElements.slice(-1)[0];if(i.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(i={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(i.node))return;const r=({node:e,offset:t})=>{const i=e instanceof Text?e.parentNode:e;let s=parseInt(i?.getAttribute("aria-posinset"),10)-1;if(isNaN(s))return console.warn("row is invalid. Race condition?"),null;const r=this._rowColumns.get(i);if(!r)return console.warn("columns is null. Race condition?"),null;let n=t=this._terminal.cols&&(++s,n=0),{row:s,column:n}},n=r(t),o=r(i);if(n&&o){if(n.row>o.row||n.row===o.row&&n.column>=o.column)throw new Error("invalid range");this._terminal.select(n.column,n.row,(o.row-n.row)*this._terminal.cols-n.column+o.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;ee;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=this._coreBrowserService.mainDocument.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{function i(e){return e.replace(/\r?\n/g,"\r")}function s(e,t){return t?"[200~"+e+"[201~":e}function r(e,t,r,n){e=s(e=i(e),r.decPrivateModes.bracketedPasteMode&&!0!==n.rawOptions.ignoreBracketedPasteMode),r.triggerDataEvent(e,!0),t.value=""}function n(e,t,i){const s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}Object.defineProperty(t,"__esModule",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=i,t.bracketTextForPaste=s,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,i,s){e.stopPropagation(),e.clipboardData&&r(e.clipboardData.getData("text/plain"),t,i,s)},t.paste=r,t.moveTextAreaUnderMouseCursor=n,t.rightClickHandler=function(e,t,i,s,r){n(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}},7239:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorContrastCache=void 0;const s=i(1505);t.ColorContrastCache=class{constructor(){this._color=new s.TwoKeyMap,this._css=new s.TwoKeyMap}setCss(e,t,i){this._css.set(e,t,i)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,i){this._color.set(e,t,i)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},3656:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},3551:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585),c=i(4725);let l=t.Linkifier=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseService=t,this._renderService=i,this._bufferService=s,this._linkProviderService=r,this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new o.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new o.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,a.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,a.toDisposable)((()=>{this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0}))),this.register((0,n.addDisposableDomListener)(this._element,"mouseleave",(()=>{this._isMouseOut=!0,this._clearCurrentLink()}))),this.register((0,n.addDisposableDomListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e{e?.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let i=!1;for(const[s,r]of this._linkProviderService.linkProviders.entries())if(t){const t=this._activeProviderReplies?.get(s);t&&(i=this._checkLinkProviderResult(s,e,i))}else r.provideLinks(e.y,(t=>{if(this._isMouseOut)return;const r=t?.map((e=>({link:e})));this._activeProviderReplies?.set(s,r),i=this._checkLinkProviderResult(s,e,i),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;se?this._bufferService.cols:s.link.range.end.x;for(let e=n;e<=o;e++){if(i.has(e)){r.splice(t--,1);break}i.add(e)}}}}_checkLinkProviderResult(e,t,i){if(!this._activeProviderReplies)return i;const s=this._activeProviderReplies.get(e);let r=!1;for(let t=0;tthis._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!i)for(let e=0;ethis._linkAtPosition(e.link,t)));if(s){i=!0,this._handleNewLink(s);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,t){this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,a.disposeArray)(this._linkCacheDisposables))}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:()=>this._currentLink?.state?.decorations.pointerCursor,set:e=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",e))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:t=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e=>{if(!this._currentLink)return;const t=0===e.start?0:e.start+1+this._bufferService.buffer.ydisp,i=this._bufferService.buffer.ydisp+1+e.end;if(this._currentLink.link.range.start.y>=t&&this._currentLink.link.range.end.y<=i&&(this._clearCurrentLink(t,i),this._lastMouseEvent)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){this._currentLink?.state&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),t.hover&&t.hover(i,t.text)}_fireUnderlineEvent(e,t){const i=e.range,s=this._bufferService.buffer.ydisp,r=this._createLinkUnderlineEvent(i.start.x-1,i.start.y-s-1,i.end.x,i.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(r)}_linkLeave(e,t,i){this._currentLink?.state&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),t.leave&&t.leave(i,t.text)}_linkAtPosition(e,t){const i=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,r=t.y*this._bufferService.cols+t.x;return i<=r&&r<=s}_positionFromMouseEvent(e,t,i){const s=i.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(s)return{x:s[0],y:s[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,i,s,r){return{x1:e,y1:t,x2:i,y2:s,cols:this._bufferService.cols,fg:r}}};t.Linkifier=l=s([r(1,c.IMouseService),r(2,c.IRenderService),r(3,h.IBufferService),r(4,c.ILinkProviderService)],l)},9042:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel="Terminal input",t.tooMuchOutput="Too much output to announce, navigate to rows manually to read"},3730:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const n=i(511),o=i(2585);let a=t.OscLinkProvider=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){const i=this._bufferService.buffer.lines.get(e-1);if(!i)return void t(void 0);const s=[],r=this._optionsService.rawOptions.linkHandler,o=new n.CellData,a=i.getTrimmedLength();let c=-1,l=-1,d=!1;for(let t=0;tr?r.activate(e,t,n):h(0,t),hover:(e,t)=>r?.hover?.(e,t,n),leave:(e,t)=>r?.leave?.(e,t,n)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,c=o.extended.urlId):(l=-1,c=-1)}}t(s)}};function h(e,t){if(confirm(`Do you want to navigate to ${t}?\n\nWARNING: This link could potentially be dangerous`)){const e=window.open();if(e){try{e.opener=null}catch{}e.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}t.OscLinkProvider=a=s([r(0,o.IBufferService),r(1,o.IOptionsService),r(2,o.IOscLinkService)],a)},6193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderDebouncer=void 0,t.RenderDebouncer=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh()))),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._animationFrame=void 0,void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return void this._runRefreshCallbacks();const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const e of this._refreshCallbacks)e(0);this._refreshCallbacks=[]}}},3236:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(3551),o=i(9042),a=i(3730),h=i(1680),c=i(3107),l=i(5744),d=i(2950),_=i(1296),u=i(428),f=i(4269),v=i(5114),p=i(8934),g=i(3230),m=i(9312),S=i(4725),C=i(6731),b=i(8055),w=i(8969),y=i(8460),E=i(844),k=i(6114),L=i(8437),D=i(2584),R=i(7399),x=i(5941),A=i(9074),B=i(2585),T=i(5435),M=i(4567),O=i(779);class P extends w.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(e={}){super(e),this.browser=k,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new E.MutableDisposable),this._onCursorMove=this.register(new y.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new y.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new y.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new y.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new y.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new y.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new y.EventEmitter),this._onBlur=this.register(new y.EventEmitter),this._onA11yCharEmitter=this.register(new y.EventEmitter),this._onA11yTabEmitter=this.register(new y.EventEmitter),this._onWillOpen=this.register(new y.EventEmitter),this._setup(),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this._linkProviderService=this._instantiationService.createInstance(O.LinkProviderService),this._instantiationService.setService(S.ILinkProviderService,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),this.register(this._inputHandler.onRequestBell((()=>this._onBell.fire()))),this.register(this._inputHandler.onRequestRefreshRows(((e,t)=>this.refresh(e,t)))),this.register(this._inputHandler.onRequestSendFocus((()=>this._reportFocus()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register(this._inputHandler.onRequestWindowsOptionsReport((e=>this._reportWindowsOptions(e)))),this.register(this._inputHandler.onColor((e=>this._handleColorEvent(e)))),this.register((0,y.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,y.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)})))}_handleColorEvent(e){if(this._themeService)for(const t of e){let e,i="";switch(t.index){case 256:e="foreground",i="10";break;case 257:e="background",i="11";break;case 258:e="cursor",i="12";break;default:e="ansi",i="4;"+t.index}switch(t.type){case 0:const s=b.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`${D.C0.ESC}]${i};${(0,x.toRgbString)(s)}${D.C1_ESCAPED.ST}`);break;case 1:if("ansi"===e)this._themeService.modifyColors((e=>e.ansi[t.index]=b.channels.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.channels.toColor(...t.color)))}break;case 2:this._themeService.restoreColor(t.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(e){e?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[I"),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){return this.textarea?.blur()}_handleTextAreaBlur(){this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[O"),this.element.classList.remove("focus"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(!t)return;const i=Math.min(this.buffer.x,this.cols-1),s=this._renderService.dimensions.css.cell.height,r=t.getWidth(i),n=this._renderService.dimensions.css.cell.width*r,o=this.buffer.y*this._renderService.dimensions.css.cell.height,a=i*this._renderService.dimensions.css.cell.width;this.textarea.style.left=a+"px",this.textarea.style.top=o+"px",this.textarea.style.width=n+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this.register((0,r.addDisposableDomListener)(this.element,"copy",(e=>{this.hasSelection()&&(0,s.copyHandler)(e,this._selectionService)})));const e=e=>(0,s.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this.register((0,r.addDisposableDomListener)(this.textarea,"paste",e)),this.register((0,r.addDisposableDomListener)(this.element,"paste",e)),k.isFirefox?this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>{2===e.button&&(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))):this.register((0,r.addDisposableDomListener)(this.element,"contextmenu",(e=>{(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))),k.isLinux&&this.register((0,r.addDisposableDomListener)(this.element,"auxclick",(e=>{1===e.button&&(0,s.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)})))}_bindKeys(){this.register((0,r.addDisposableDomListener)(this.textarea,"keyup",(e=>this._keyUp(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keydown",(e=>this._keyDown(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keypress",(e=>this._keyPress(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionstart",(()=>this._compositionHelper.compositionstart()))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionupdate",(e=>this._compositionHelper.compositionupdate(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionend",(()=>this._compositionHelper.compositionend()))),this.register((0,r.addDisposableDomListener)(this.textarea,"input",(e=>this._inputEvent(e)),!0)),this.register(this.onRender((()=>this._compositionHelper.updateCompositionElements())))}open(e){if(!e)throw new Error("Terminal requires a parent element.");if(e.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this.element?.ownerDocument.defaultView&&this._coreBrowserService)return void(this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView));this._document=e.ownerDocument,this.options.documentOverride&&this.options.documentOverride instanceof Document&&(this._document=this.optionsService.rawOptions.documentOverride),this.element=this._document.createElement("div"),this.element.dir="ltr",this.element.classList.add("terminal"),this.element.classList.add("xterm"),e.appendChild(this.element);const t=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),t.appendChild(this._viewportElement),this._viewportScrollArea=this._document.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this.register((0,r.addDisposableDomListener)(this.screenElement,"mousemove",(e=>this.updateCursorStyle(e)))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),t.appendChild(this.screenElement),this.textarea=this._document.createElement("textarea"),this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",o.promptLabel),k.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._coreBrowserService=this.register(this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??"undefined"!=typeof window?window.document:null)),this._instantiationService.setService(S.ICoreBrowserService,this._coreBrowserService),this.register((0,r.addDisposableDomListener)(this.textarea,"focus",(e=>this._handleTextAreaFocus(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"blur",(()=>this._handleTextAreaBlur()))),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(u.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(S.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(C.ThemeService),this._instantiationService.setService(S.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(f.CharacterJoinerService),this._instantiationService.setService(S.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(g.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(S.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange((e=>this._onRender.fire(e)))),this.onResize((e=>this._renderService.resize(e.cols,e.rows))),this._compositionView=this._document.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(d.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.linkifier=this.register(this._instantiationService.createInstance(n.Linkifier,this.screenElement)),this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch{}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this.viewport=this._instantiationService.createInstance(h.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent,1))),this.register(this._inputHandler.onRequestSyncScrollBar((()=>this.viewport.syncScrollArea()))),this.register(this.viewport),this.register(this.onCursorMove((()=>{this._renderService.handleCursorMove(),this._syncTextArea()}))),this.register(this.onResize((()=>this._renderService.handleResize(this.cols,this.rows)))),this.register(this.onBlur((()=>this._renderService.handleBlur()))),this.register(this.onFocus((()=>this._renderService.handleFocus()))),this.register(this._renderService.onDimensionsChange((()=>this.viewport.syncScrollArea()))),this._selectionService=this.register(this._instantiationService.createInstance(m.SelectionService,this.element,this.screenElement,this.linkifier)),this._instantiationService.setService(S.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent)))),this.register(this._selectionService.onSelectionChange((()=>this._onSelectionChange.fire()))),this.register(this._selectionService.onRequestRedraw((e=>this._renderService.handleSelectionChanged(e.start,e.end,e.columnSelectMode)))),this.register(this._selectionService.onLinuxMouseSelection((e=>{this.textarea.value=e,this.textarea.focus(),this.textarea.select()}))),this.register(this._onScroll.event((e=>{this.viewport.syncScrollArea(),this._selectionService.refresh()}))),this.register((0,r.addDisposableDomListener)(this._viewportElement,"scroll",(()=>this._selectionService.refresh()))),this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer,this.screenElement)),this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>this._selectionService.handleMouseDown(e)))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange("screenReaderMode",(e=>this._handleScreenReaderModeOptionChange(e)))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("overviewRulerWidth",(e=>{!this._overviewRulerRenderer&&e&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement)))})),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(_.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}bindMouse(){const e=this,t=this.element;function i(t){const i=e._mouseService.getMouseReportCoords(t,e.screenElement);if(!i)return!1;let s,r;switch(t.overrideType||t.type){case"mousemove":r=32,void 0===t.buttons?(s=3,void 0!==t.button&&(s=t.button<3?t.button:3)):s=1&t.buttons?0:4&t.buttons?1:2&t.buttons?2:3;break;case"mouseup":r=0,s=t.button<3?t.button:3;break;case"mousedown":r=1,s=t.button<3?t.button:3;break;case"wheel":if(e._customWheelEventHandler&&!1===e._customWheelEventHandler(t))return!1;if(0===e.viewport.getLinesScrolled(t))return!1;r=t.deltaY<0?0:1,s=4;break;default:return!1}return!(void 0===r||void 0===s||s>4)&&e.coreMouseService.triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey})}const s={mouseup:null,wheel:null,mousedrag:null,mousemove:null},n={mouseup:e=>(i(e),e.buttons||(this._document.removeEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.removeEventListener("mousemove",s.mousedrag)),this.cancel(e)),wheel:e=>(i(e),this.cancel(e,!0)),mousedrag:e=>{e.buttons&&i(e)},mousemove:e=>{e.buttons||i(e)}};this.register(this.coreMouseService.onProtocolChange((e=>{e?("debug"===this.optionsService.rawOptions.logLevel&&this._logService.debug("Binding to mouse events:",this.coreMouseService.explainEvents(e)),this.element.classList.add("enable-mouse-events"),this._selectionService.disable()):(this._logService.debug("Unbinding from mouse events."),this.element.classList.remove("enable-mouse-events"),this._selectionService.enable()),8&e?s.mousemove||(t.addEventListener("mousemove",n.mousemove),s.mousemove=n.mousemove):(t.removeEventListener("mousemove",s.mousemove),s.mousemove=null),16&e?s.wheel||(t.addEventListener("wheel",n.wheel,{passive:!1}),s.wheel=n.wheel):(t.removeEventListener("wheel",s.wheel),s.wheel=null),2&e?s.mouseup||(s.mouseup=n.mouseup):(this._document.removeEventListener("mouseup",s.mouseup),s.mouseup=null),4&e?s.mousedrag||(s.mousedrag=n.mousedrag):(this._document.removeEventListener("mousemove",s.mousedrag),s.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,r.addDisposableDomListener)(t,"mousedown",(e=>{if(e.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(e))return i(e),s.mouseup&&this._document.addEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.addEventListener("mousemove",s.mousedrag),this.cancel(e)}))),this.register((0,r.addDisposableDomListener)(t,"wheel",(e=>{if(!s.wheel){if(this._customWheelEventHandler&&!1===this._customWheelEventHandler(e))return!1;if(!this.buffer.hasScrollback){const t=this.viewport.getLinesScrolled(e);if(0===t)return;const i=D.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");let s="";for(let e=0;e{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(e),this.cancel(e)}),{passive:!0})),this.register((0,r.addDisposableDomListener)(t,"touchmove",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(e)?void 0:this.cancel(e)}),{passive:!1}))}refresh(e,t){this._renderService?.refreshRows(e,t)}updateCursorStyle(e){this._selectionService?.shouldColumnSelect(e)?this.element.classList.add("column-select"):this.element.classList.remove("column-select")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(e,t,i=0){1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):this.viewport?.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this._customWheelEventHandler=e}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");const t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t}deregisterCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(e){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}registerDecoration(e){return this._decorationService.registerDecoration(e)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(e,t,i){this._selectionService.setSelection(e,t,i)}getSelection(){return this._selectionService?this._selectionService.selectionText:""}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){this._selectionService?.clearSelection()}selectAll(){this._selectionService?.selectAll()}selectLines(e,t){this._selectionService?.selectLines(e,t)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;const t=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!t&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=(0,R.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),this.cancel(e,!0)}return 1===i.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(i.cancel&&this.cancel(e,!0),!i.key||!!(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(i.key!==D.C0.ETX&&i.key!==D.C0.CR||(this.textarea.value=""),this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!0),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey?this.cancel(e,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(e,t){const i=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState("AltGraph");return"keypress"===t.type?i:i&&(!t.keyCode||t.keyCode>47)}_keyUp(e){this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1}resize(e,t){e!==this.cols||t!==this.rows?super.resize(e,t):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(e,t){this._charSizeService?.measure(),this.viewport?.syncScrollArea(!0)}clear(){if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e{Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;const s=Date.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=s,this._innerRefresh();else if(!this._additionalRefreshRequested){const e=s-this._lastRefreshMs,t=this._debounceThresholdMS-e;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0}),t)}}_innerRefresh(){if(void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return;const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}}},1680:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const n=i(3656),o=i(4725),a=i(8460),h=i(844),c=i(2585);let l=t.Viewport=class extends h.Disposable{constructor(e,t,i,s,r,o,h,c){super(),this._viewportElement=e,this._scrollArea=t,this._bufferService=i,this._optionsService=s,this._charSizeService=r,this._renderService=o,this._coreBrowserService=h,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new a.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,n.addDisposableDomListener)(this._viewportElement,"scroll",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange((e=>this._renderDimensions=e))),this._handleThemeChange(c.colors),this.register(c.onChangeColors((e=>this._handleThemeChange(e)))),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.syncScrollArea()))),setTimeout((()=>this.syncScrollArea()))}_handleThemeChange(e){this._viewportElement.style.backgroundColor=e.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame((()=>this.syncScrollArea()))}_refresh(e){if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderDimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderDimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderDimensions.css.canvas.height);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+"px")}const e=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==e&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=e),this._refreshAnimationFrame=null}syncScrollArea(e=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(e)}_handleScroll(e){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:t,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||-1===this._smoothScrollState.origin||-1===this._smoothScrollState.target)return;const e=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(e*(this._smoothScrollState.target-this._smoothScrollState.origin)),e<1?this._coreBrowserService.window.requestAnimationFrame((()=>this._smoothScroll())):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(e,t){const i=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&i0&&(i=e),s=""}}return{bufferElements:r,cursorElement:i}}getLinesScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t}_applyScrollModifier(e,t){const i=this._optionsService.rawOptions.fastScrollModifier;return"alt"===i&&t.altKey||"ctrl"===i&&t.ctrlKey||"shift"===i&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(e){this._lastTouchY=e.touches[0].pageY}handleTouchMove(e){const t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}};t.Viewport=l=s([r(2,c.IBufferService),r(3,c.IOptionsService),r(4,o.ICharSizeService),r(5,o.IRenderService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],l)},3107:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const n=i(4725),o=i(844),a=i(2585);let h=t.BufferDecorationRenderer=class extends o.Disposable{constructor(e,t,i,s,r){super(),this._screenElement=e,this._bufferService=t,this._coreBrowserService=i,this._decorationService=s,this._renderService=r,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange((()=>this._doRefreshDecorations()))),this.register(this._renderService.onDimensionsChange((()=>{this._dimensionsChanged=!0,this._queueRefresh()}))),this.register(this._coreBrowserService.onDprChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt}))),this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh()))),this.register(this._decorationService.onDecorationRemoved((e=>this._removeDecoration(e)))),this.register((0,o.toDisposable)((()=>{this._container.remove(),this._decorationElements.clear()})))}_queueRefresh(){void 0===this._animationFrame&&(this._animationFrame=this._renderService.addRefreshCallback((()=>{this._doRefreshDecorations(),this._animationFrame=void 0})))}_doRefreshDecorations(){for(const e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){const t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer","top"===e?.options?.layer),t.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,t.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",t.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",t.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const i=e.options.x??0;return i&&i>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_refreshStyle(e){const t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let i=this._decorationElements.get(e);i||(i=this._createElement(e),e.element=i,this._decorationElements.set(e,i),this._container.appendChild(i),e.onDispose((()=>{this._decorationElements.delete(e),i.remove()}))),i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.display=this._altBufferIsActive?"none":"block",e.onRenderEmitter.fire(i)}}_refreshXPosition(e,t=e.element){if(!t)return;const i=e.options.x??0;"right"===(e.options.anchor||"left")?t.style.right=i?i*this._renderService.dimensions.css.cell.width+"px":"":t.style.left=i?i*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,n.ICoreBrowserService),r(3,a.IDecorationService),r(4,n.IRenderService)],h)},5871:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorZoneStore=void 0,t.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(e){if(e.options.overviewRulerOptions){for(const t of this._zones)if(t.color===e.options.overviewRulerOptions.color&&t.position===e.options.overviewRulerOptions.position){if(this._lineIntersectsZone(t,e.marker.line))return;if(this._lineAdjacentToZone(t,e.marker.line,e.options.overviewRulerOptions.position))return void this._addLineToZone(t,e.marker.line)}if(this._zonePoolIndex=e.startBufferLine&&t<=e.endBufferLine}_lineAdjacentToZone(e,t,i){return t>=e.startBufferLine-this._linePadding[i||"full"]&&t<=e.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(e,t){e.startBufferLine=Math.min(e.startBufferLine,t),e.endBufferLine=Math.max(e.endBufferLine,t)}}},5744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const n=i(5871),o=i(4725),a=i(844),h=i(2585),c={full:0,left:0,center:0,right:0},l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=t.OverviewRulerRenderer=class extends a.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,h){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowserService=h,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),this._viewportElement.parentElement?.insertBefore(this._canvas,this._viewportElement);const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,a.toDisposable)((()=>{this._canvas?.remove()})))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh(void 0,!0)))),this.register(this._decorationService.onDecorationRemoved((()=>this._queueRefresh(void 0,!0))))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?"none":"block"}))),this.register(this._bufferService.onScroll((()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())})))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender((()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)}))),this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth",(()=>this._queueRefresh(!0)))),this.register(this._coreBrowserService.onDprChange((()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);l.full=this._canvas.width,l.left=e,l.center=t,l.right=e,this._refreshDrawHeightConstants(),d.full=0,d.left=0,d.center=l.left,d.right=l.left+l.center}_refreshDrawHeightConstants(){c.full=Math.round(2*this._coreBrowserService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);c.left=t,c.center=t,c.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowserService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const e of this._decorationService.decorations)this._colorZoneStore.addDecoration(e);this._ctx.lineWidth=1;const e=this._colorZoneStore.zones;for(const t of e)"full"!==t.position&&this._renderColorZone(t);for(const t of e)"full"===t.position&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect(d[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-c[e.position||"full"]/2),l[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+c[e.position||"full"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,o.IRenderService),r(5,h.IOptionsService),r(6,o.ICoreBrowserService)],_)},2950:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const n=i(4725),o=i(2585),a=i(2584);let h=t.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=n,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((()=>{this._compositionPosition.end=this._textarea.value.length}),0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){const e={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((()=>{if(this._isSendingComposition){let t;this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,t=this._isComposing?this._textarea.value.substring(e.start,e.end):this._textarea.value.substring(e.start),t.length>0&&this._coreService.triggerDataEvent(t,!0)}}),0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){const e=this._textarea.value;setTimeout((()=>{if(!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.lengththis.updateCompositionElements(!0)),0)}}};t.CompositionHelper=h=s([r(2,o.IBufferService),r(3,o.IOptionsService),r(4,o.ICoreService),r(5,n.IRenderService)],h)},9806:(e,t)=>{function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),n=parseInt(r.getPropertyValue("padding-left")),o=parseInt(r.getPropertyValue("padding-top"));return[t.clientX-s.left-n,t.clientY-s.top-o]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,n,o,a,h,c){if(!o)return;const l=i(e,t,s);return l?(l[0]=Math.ceil((l[0]+(c?a/2:0))/a),l[1]=Math.ceil(l[1]/h),l[0]=Math.min(Math.max(l[0],1),r+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l):void 0}},9504:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.moveToCellSequence=void 0;const s=i(2584);function r(e,t,i,s){const r=e-n(e,i),a=t-n(t,i),l=Math.abs(r-a)-function(e,t,i){let s=0;const r=e-n(e,i),a=t-n(t,i);for(let n=0;n=0&&et?"A":"B"}function a(e,t,i,s,r,n){let o=e,a=t,h="";for(;o!==i||a!==s;)o+=r?1:-1,r&&o>n.cols-1?(h+=n.buffer.translateBufferLineToString(a,!1,e,o),o=0,e=0,a++):!r&&o<0&&(h+=n.buffer.translateBufferLineToString(a,!1,0,e+1),o=n.cols-1,e=o,a--);return h+n.buffer.translateBufferLineToString(a,!1,e,o)}function h(e,t){const i=t?"O":"[";return s.C0.ESC+i+e}function c(e,t){e=Math.floor(e);let i="";for(let s=0;s0?s-n(s,o):t;const _=s,u=function(e,t,i,s,o,a){let h;return h=r(i,s,o,a).length>0?s-n(s,o):t,e=i&&he?"D":"C",c(Math.abs(o-e),h(d,s));d=l>t?"D":"C";const _=Math.abs(l-t);return c(function(e,t){return t.cols-e}(l>t?e:o,i)+(_-1)*i.cols+1+((l>t?o:e)-1),h(d,s))}},1296:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const n=i(3787),o=i(2550),a=i(2223),h=i(6171),c=i(6052),l=i(4725),d=i(8055),_=i(8460),u=i(844),f=i(2585),v="xterm-dom-renderer-owner-",p="xterm-rows",g="xterm-fg-",m="xterm-bg-",S="xterm-focus",C="xterm-selection";let b=1,w=t.DomRenderer=class extends u.Disposable{constructor(e,t,i,s,r,a,l,d,f,g,m,S,w){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=l,this._charSizeService=f,this._optionsService=g,this._bufferService=m,this._coreBrowserService=S,this._themeService=w,this._terminalClass=b++,this._rowElements=[],this._selectionRenderModel=(0,c.createSelectionRenderModel)(),this.onRequestRedraw=this.register(new _.EventEmitter).event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add(p),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=this._document.createElement("div"),this._selectionContainer.classList.add(C),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=(0,h.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._themeService.onChangeColors((e=>this._injectCss(e)))),this._injectCss(this._themeService.colors),this._rowFactory=d.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(v+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline((e=>this._handleLinkHover(e)))),this.register(this._linkifier2.onHideLinkUnderline((e=>this._handleLinkLeave(e)))),this.register((0,u.toDisposable)((()=>{this._element.classList.remove(v+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(this._document,this._helperContainer),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const e=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*e,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*e),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/e),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/e),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const e of this._rowElements)e.style.width=`${this.dimensions.css.canvas.width}px`,e.style.height=`${this.dimensions.css.cell.height}px`,e.style.lineHeight=`${this.dimensions.css.cell.height}px`,e.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${p} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=t,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(e){this._themeStyleElement||(this._themeStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${p} { color: ${e.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;t+=`${this._terminalSelector} .${p} .xterm-dim { color: ${d.color.multiplyOpacity(e.foreground,.5).css};}`,t+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`,t+="@keyframes blink_box_shadow_"+this._terminalClass+" { 50% { border-bottom-style: hidden; }}",t+="@keyframes blink_block_"+this._terminalClass+" { 0% {"+` background-color: ${e.cursor.css};`+` color: ${e.cursorAccent.css}; } 50% { background-color: inherit;`+` color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink:not(.xterm-cursor-block) { animation: blink_box_shadow_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: blink_block_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block {`+` background-color: ${e.cursor.css} !important;`+` color: ${e.cursorAccent.css} !important;}`+`${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-outline {`+` outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}`+`${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-bar {`+` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}`+`${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-underline {`+` border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${C} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${C} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${C} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${g}${i} { color: ${s.css}; }${this._terminalSelector} .${g}${i}.xterm-dim { color: ${d.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${m}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { color: ${d.color.opaque(e.background).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${d.color.multiplyOpacity(d.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${m}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){const e=this.dimensions.css.cell.width-this._widthCache.get("W",!1,!1);this._rowContainer.style.letterSpacing=`${e}px`,this._rowFactory.defaultSpacing=e}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(e,t){for(let e=this._rowElements.length;e<=t;e++){const e=this._document.createElement("div");this._rowContainer.appendChild(e),this._rowElements.push(e)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(e,t){this._refreshRowElements(e,t),this._updateDimensions(),this.handleSelectionChanged(this._selectionRenderModel.selectionStart,this._selectionRenderModel.selectionEnd,this._selectionRenderModel.columnSelectMode)}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(S),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add(S),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(e,t,i){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i),this.renderRows(0,this._bufferService.rows-1),!e||!t)return;this._selectionRenderModel.update(this._terminal,e,t,i);const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,n=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow;if(n>=this._bufferService.rows||o<0)return;const a=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];a.appendChild(this._createSelectionElement(n,i?t[0]:e[0],i?e[0]:t[0],o-n+1))}else{const i=s===n?e[0]:0,h=n===r?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(n,i,h));const c=o-n-1;if(a.appendChild(this._createSelectionElement(n+1,0,this._bufferService.cols,c)),n!==o){const e=r===o?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,0,e))}}this._selectionContainer.appendChild(a)}_createSelectionElement(e,t,i,s=1){const r=this._document.createElement("div"),n=t*this.dimensions.css.cell.width;let o=this.dimensions.css.cell.width*(i-t);return n+o>this.dimensions.css.canvas.width&&(o=this.dimensions.css.canvas.width-n),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${n}px`,r.style.width=`${o}px`,r}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const e of this._rowElements)e.replaceChildren()}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle;for(let h=e;h<=t;h++){const e=h+i.ydisp,t=this._rowElements[h],c=i.lines.get(e);if(!t||!c)break;t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,o,a,r,n,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${v}${this._terminalClass}`}_handleLinkHover(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)}_handleLinkLeave(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)}_setCellUnderline(e,t,i,s,r,n){i<0&&(e=0),s<0&&(t=0);const o=this._bufferService.rows-1;i=Math.max(Math.min(i,o),0),s=Math.max(Math.min(s,o),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,c=Math.min(a.x,r-1),l=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle;for(let o=i;o<=s;++o){const u=o+a.ydisp,f=this._rowElements[o],v=a.lines.get(u);if(!f||!v)break;f.replaceChildren(...this._rowFactory.createRow(v,u,u===h,d,_,c,l,this.dimensions.css.cell.width,this._widthCache,n?o===i?e:0:-1,n?(o===s?t:r)-1:-1))}}};t.DomRenderer=w=s([r(7,f.IInstantiationService),r(8,l.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,l.ICoreBrowserService),r(12,l.IThemeService)],w)},3787:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const n=i(2223),o=i(643),a=i(511),h=i(2585),c=i(8055),l=i(4725),d=i(4269),_=i(6171),u=i(3734);let f=t.DomRendererRowFactory=class{constructor(e,t,i,s,r,n,o){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=n,this._themeService=o,this._workCell=new a.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(e,t,i){this._selectionStart=e,this._selectionEnd=t,this._columnSelectMode=i}createRow(e,t,i,s,r,a,h,l,_,f,p){const g=[],m=this._characterJoinerService.getJoinedCharacters(t),S=this._themeService.colors;let C,b=e.getNoBgTrimmedLength();i&&b0&&M===m[0][0]){O=!0;const t=m.shift();I=new d.JoinedCellData(this._workCell,e.translateToString(!0,t[0],t[1]),t[1]-t[0]),P=t[1]-1,b=I.getWidth()}const H=this._isCellInSelection(M,t),F=i&&M===a,W=T&&M>=f&&M<=p;let U=!1;this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{U=!0}));let N=I.getChars()||o.WHITESPACE_CELL_CHAR;if(" "===N&&(I.isUnderline()||I.isOverline())&&(N=" "),A=b*l-_.get(N,I.isBold(),I.isItalic()),C){if(w&&(H&&x||!H&&!x&&I.bg===E)&&(H&&x&&S.selectionForeground||I.fg===k)&&I.extended.ext===L&&W===D&&A===R&&!F&&!O&&!U){I.isInvisible()?y+=o.WHITESPACE_CELL_CHAR:y+=N,w++;continue}w&&(C.textContent=y),C=this._document.createElement("span"),w=0,y=""}else C=this._document.createElement("span");if(E=I.bg,k=I.fg,L=I.extended.ext,D=W,R=A,x=H,O&&a>=M&&a<=P&&(a=M),!this._coreService.isCursorHidden&&F&&this._coreService.isCursorInitialized)if(B.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&B.push("xterm-cursor-blink"),B.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":B.push("xterm-cursor-outline");break;case"block":B.push("xterm-cursor-block");break;case"bar":B.push("xterm-cursor-bar");break;case"underline":B.push("xterm-cursor-underline")}if(I.isBold()&&B.push("xterm-bold"),I.isItalic()&&B.push("xterm-italic"),I.isDim()&&B.push("xterm-dim"),y=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`)," "===y&&(y=" "),!I.isUnderlineColorDefault()))if(I.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`;else{let e=I.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&I.isBold()&&e<8&&(e+=8),C.style.textDecorationColor=S.ansi[e].css}I.isOverline()&&(B.push("xterm-overline")," "===y&&(y=" ")),I.isStrikethrough()&&B.push("xterm-strikethrough"),W&&(C.style.textDecoration="underline");let $=I.getFgColor(),j=I.getFgColorMode(),z=I.getBgColor(),K=I.getBgColorMode();const q=!!I.isInverse();if(q){const e=$;$=z,z=e;const t=j;j=K,K=t}let V,G,X,J=!1;switch(this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{"top"!==e.options.layer&&J||(e.backgroundColorRGB&&(K=50331648,z=e.backgroundColorRGB.rgba>>8&16777215,V=e.backgroundColorRGB),e.foregroundColorRGB&&(j=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,G=e.foregroundColorRGB),J="top"===e.options.layer)})),!J&&H&&(V=this._coreBrowserService.isFocused?S.selectionBackgroundOpaque:S.selectionInactiveBackgroundOpaque,z=V.rgba>>8&16777215,K=50331648,J=!0,S.selectionForeground&&(j=50331648,$=S.selectionForeground.rgba>>8&16777215,G=S.selectionForeground)),J&&B.push("xterm-decoration-top"),K){case 16777216:case 33554432:X=S.ansi[z],B.push(`xterm-bg-${z}`);break;case 50331648:X=c.channels.toColor(z>>16,z>>8&255,255&z),this._addStyle(C,`background-color:#${v((z>>>0).toString(16),"0",6)}`);break;default:q?(X=S.foreground,B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)):X=S.background}switch(V||I.isDim()&&(V=c.color.multiplyOpacity(X,.5)),j){case 16777216:case 33554432:I.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(C,X,S.ansi[$],I,V,void 0)||B.push(`xterm-fg-${$}`);break;case 50331648:const e=c.channels.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(C,X,e,I,V,G)||this._addStyle(C,`color:#${v($.toString(16),"0",6)}`);break;default:this._applyMinimumContrast(C,X,S.foreground,I,V,G)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(" "),B.length=0),F||O||U?C.textContent=y:w++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&w&&(C.textContent=y),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const o=this._getContrastCache(s);let a;if(r||n||(a=o.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=c.color.ensureContrastRatio(r||t,n||i,e),o.setColor((r||t).rgba,(n||i).rgba,a??null)}return!!a&&(this._addStyle(e,`color:${a.css}`),!0)}_getContrastCache(e){return e.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(e,t){e.setAttribute("style",`${e.getAttribute("style")||""}${t};`)}_isCellInSelection(e,t){const i=this._selectionStart,s=this._selectionEnd;return!(!i||!s)&&(this._columnSelectMode?i[0]<=s[0]?e>=i[0]&&t>=i[1]&&e=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t=i[0]&&e=i[0])}};function v(e,t,i){for(;e.length{Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e,t){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._measureElements=[],this._container=e.createElement("div"),this._container.classList.add("xterm-width-cache-measure-container"),this._container.setAttribute("aria-hidden","true"),this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const i=e.createElement("span");i.classList.add("xterm-char-measure-element");const s=e.createElement("span");s.classList.add("xterm-char-measure-element"),s.style.fontWeight="bold";const r=e.createElement("span");r.classList.add("xterm-char-measure-element"),r.style.fontStyle="italic";const n=e.createElement("span");n.classList.add("xterm-char-measure-element"),n.style.fontWeight="bold",n.style.fontStyle="italic",this._measureElements=[i,s,r,n],this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),this._container.appendChild(n),t.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(e,t,i,s){e===this._font&&t===this._fontSize&&i===this._weight&&s===this._weightBold||(this._font=e,this._fontSize=t,this._weight=i,this._weightBold=s,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${i}`,this._measureElements[1].style.fontWeight=`${s}`,this._measureElements[2].style.fontWeight=`${i}`,this._measureElements[3].style.fontWeight=`${s}`,this.clear())}get(e,t,i){let s=0;if(!t&&!i&&1===e.length&&(s=e.charCodeAt(0))<256){if(-9999!==this._flat[s])return this._flat[s];const t=this._measure(e,0);return t>0&&(this._flat[s]=t),t}let r=e;t&&(r+="B"),i&&(r+="I");let n=this._holey.get(r);if(void 0===n){let s=0;t&&(s|=1),i&&(s|=2),n=this._measure(e,s),n>0&&this._holey.set(r,n)}return n}_measure(e,t){const i=this._measureElements[t];return i.textContent=e.repeat(32),i.offsetWidth/32}}},2223:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},6171:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.computeNextVariantOffset=t.createRenderDimensions=t.treatGlyphAsBackgroundColor=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.treatGlyphAsBackgroundColor=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}},t.computeNextVariantOffset=function(e,t,i=0){return(e-(2*Math.round(t)-i))%(2*Math.round(t))}},6052:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=e.buffers.active.ydisp,n=t[1]-r,o=i[1]-r,a=Math.max(n,0),h=Math.min(o,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=n,this.viewportEndRow=o,this.viewportCappedStartRow=a,this.viewportCappedEndRow=h,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&t=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},456:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionModel=void 0,t.SelectionModel=class{constructor(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[Math.max(e,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])}handleTrim(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const n=i(2585),o=i(8460),a=i(844);let h=t.CharSizeService=class extends a.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(e,t,i){super(),this._optionsService=i,this.width=0,this.height=0,this._onCharSizeChange=this.register(new o.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this.register(new d(this._optionsService))}catch{this._measureStrategy=this.register(new l(e,t,this._optionsService))}this.register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],(()=>this.measure())))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h=s([r(2,n.IOptionsService)],h);class c extends a.Disposable{constructor(){super(...arguments),this._result={width:0,height:0}}_validateAndSet(e,t){void 0!==e&&e>0&&void 0!==t&&t>0&&(this._result.width=e,this._result.height=t)}}class l extends c{constructor(e,t,i){super(),this._document=e,this._parentElement=t,this._optionsService=i,this._measureElement=this._document.createElement("span"),this._measureElement.classList.add("xterm-char-measure-element"),this._measureElement.textContent="W".repeat(32),this._measureElement.setAttribute("aria-hidden","true"),this._measureElement.style.whiteSpace="pre",this._measureElement.style.fontKerning="none",this._parentElement.appendChild(this._measureElement)}measure(){return this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`,this._validateAndSet(Number(this._measureElement.offsetWidth)/32,Number(this._measureElement.offsetHeight)),this._result}}class d extends c{constructor(e){super(),this._optionsService=e,this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");const t=this._ctx.measureText("W");if(!("width"in t&&"fontBoundingBoxAscent"in t&&"fontBoundingBoxDescent"in t))throw new Error("Required font metrics not supported")}measure(){this._ctx.font=`${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;const e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}}},4269:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;const n=i(3734),o=i(643),a=i(511),h=i(2585);class c extends n.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.JoinedCellData=c;let l=t.CharacterJoinerService=class e{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new a.CellData}register(e){const t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id}deregister(e){for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreBrowserService=void 0;const s=i(844),r=i(8460),n=i(3656);class o extends s.Disposable{constructor(e,t,i){super(),this._textarea=e,this._window=t,this.mainDocument=i,this._isFocused=!1,this._cachedIsFocused=void 0,this._screenDprMonitor=new a(this._window),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._onWindowChange=this.register(new r.EventEmitter),this.onWindowChange=this._onWindowChange.event,this.register(this.onWindowChange((e=>this._screenDprMonitor.setWindow(e)))),this.register((0,r.forwardEvent)(this._screenDprMonitor.onDprChange,this._onDprChange)),this._textarea.addEventListener("focus",(()=>this._isFocused=!0)),this._textarea.addEventListener("blur",(()=>this._isFocused=!1))}get window(){return this._window}set window(e){this._window!==e&&(this._window=e,this._onWindowChange.fire(this._window))}get dpr(){return this.window.devicePixelRatio}get isFocused(){return void 0===this._cachedIsFocused&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask((()=>this._cachedIsFocused=void 0))),this._cachedIsFocused}}t.CoreBrowserService=o;class a extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this.register(new s.MutableDisposable),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this.register((0,s.toDisposable)((()=>this.clearListener())))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,n.addDisposableDomListener)(this._parentWindow,"resize",(()=>this._setDprAndFireIfDiffers()))}_setDprAndFireIfDiffers(){this._parentWindow.devicePixelRatio!==this._currentDevicePixelRatio&&this._onDprChange.fire(this._parentWindow.devicePixelRatio),this._updateDpr()}_updateDpr(){this._outerListener&&(this._resolutionMediaMatchList?.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._outerListener=void 0)}}},779:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(844);class r extends s.Disposable{constructor(){super(),this.linkProviders=[],this.register((0,s.toDisposable)((()=>this.linkProviders.length=0)))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{const t=this.linkProviders.indexOf(e);-1!==t&&this.linkProviders.splice(t,1)}}}}t.LinkProviderService=r},8934:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseService=void 0;const n=i(4725),o=i(9806);let a=t.MouseService=class{constructor(e,t){this._renderService=e,this._charSizeService=t}getCoords(e,t,i,s,r){return(0,o.getCoords)(window,e,t,i,s,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,r)}getMouseReportCoords(e,t){const i=(0,o.getCoordsRelativeToElement)(window,e,t);if(this._charSizeService.hasValidSize)return i[0]=Math.min(Math.max(i[0],0),this._renderService.dimensions.css.canvas.width-1),i[1]=Math.min(Math.max(i[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(i[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(i[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(i[0]),y:Math.floor(i[1])}}};t.MouseService=a=s([r(0,n.IRenderService),r(1,n.ICharSizeService)],a)},3230:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const n=i(6193),o=i(4725),a=i(8460),h=i(844),c=i(7226),l=i(2585);let d=t.RenderService=class extends h.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,o,l,d){super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new h.MutableDisposable),this._pausedResizeTask=new c.DebouncedIdleTask,this._observerDisposable=this.register(new h.MutableDisposable),this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new a.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new a.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new a.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new a.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new n.RenderDebouncer(((e,t)=>this._renderRows(e,t)),l),this.register(this._renderDebouncer),this.register(l.onDprChange((()=>this.handleDevicePixelRatioChange()))),this.register(o.onResize((()=>this._fullRefresh()))),this.register(o.buffers.onBufferActivate((()=>this._renderer.value?.clear()))),this.register(i.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._charSizeService.onCharSizeChange((()=>this.handleCharSizeChanged()))),this.register(r.onDecorationRegistered((()=>this._fullRefresh()))),this.register(r.onDecorationRemoved((()=>this._fullRefresh()))),this.register(i.onMultipleOptionChange(["customGlyphs","drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio"],(()=>{this.clear(),this.handleResize(o.cols,o.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange(["cursorBlink","cursorStyle"],(()=>this.refreshRows(o.buffer.y,o.buffer.y,!0)))),this.register(d.onChangeColors((()=>this._fullRefresh()))),this._registerIntersectionObserver(l.window,t),this.register(l.onWindowChange((e=>this._registerIntersectionObserver(e,t))))}_registerIntersectionObserver(e,t){if("IntersectionObserver"in e){const i=new e.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});i.observe(t),this._observerDisposable.value=(0,h.toDisposable)((()=>i.disconnect()))}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(e,t,i=!1){this._isPaused?this._needsFullRefresh=!0:(i||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))}_renderRows(e,t){this._renderer.value&&(e=Math.min(e,this._rowCount-1),t=Math.min(t,this._rowCount-1),this._renderer.value.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:e,end:t}),this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0)}resize(e,t){this._rowCount=t,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(e){this._renderer.value=e,this._renderer.value&&(this._renderer.value.onRequestRedraw((e=>this.refreshRows(e.start,e.end,!0))),this._needsSelectionRefresh=!0,this._fullRefresh())}addRefreshCallback(e){return this._renderDebouncer.addRefreshCallback(e)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){this._renderer.value&&(this._renderer.value.clearTextureAtlas?.(),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(e,t){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set((()=>this._renderer.value?.handleResize(e,t))):this._renderer.value.handleResize(e,t),this._fullRefresh())}handleCharSizeChanged(){this._renderer.value?.handleCharSizeChanged()}handleBlur(){this._renderer.value?.handleBlur()}handleFocus(){this._renderer.value?.handleFocus()}handleSelectionChanged(e,t,i){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,this._renderer.value?.handleSelectionChanged(e,t,i)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};t.RenderService=d=s([r(2,l.IOptionsService),r(3,o.ICharSizeService),r(4,l.IDecorationService),r(5,l.IBufferService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],d)},9312:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionService=void 0;const n=i(9806),o=i(9504),a=i(456),h=i(4725),c=i(8460),l=i(844),d=i(6114),_=i(4841),u=i(511),f=i(2585),v=String.fromCharCode(160),p=new RegExp(v,"g");let g=t.SelectionService=class extends l.Disposable{constructor(e,t,i,s,r,n,o,h,d){super(),this._element=e,this._screenElement=t,this._linkifier=i,this._bufferService=s,this._coreService=r,this._mouseService=n,this._optionsService=o,this._renderService=h,this._coreBrowserService=d,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new u.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new c.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new c.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new c.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=e=>this._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput((()=>{this.hasSelection&&this.clearSelection()})),this._trimListener=this._bufferService.buffer.lines.onTrim((e=>this._handleTrim(e))),this.register(this._bufferService.buffers.onBufferActivate((e=>this._handleBufferActivate(e)))),this.enable(),this._model=new a.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,l.toDisposable)((()=>{this._removeMouseDownListeners()})))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])}get selectionText(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";const i=this._bufferService.buffer,s=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return"";const r=e[0]e.replace(p," "))).join(d.isWindows?"\r\n":"\n")}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._refresh()))),d.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})}_isClickInSelection(e){const t=this._getMouseBufferCoords(e),i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!!(i&&s&&t)&&this._areCoordsInSelection(t,i,s)}isCellInSelection(e,t){const i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!(!i||!s)&&this._areCoordsInSelection([e,t],i,s)}_areCoordsInSelection(e,t,i){return e[1]>t[1]&&e[1]=t[0]&&e[0]=t[0]}_selectWordAtCursor(e,t){const i=this._linkifier.currentLink?.link?.range;if(i)return this._model.selectionStart=[i.start.x-1,i.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const s=this._getMouseBufferCoords(e);return!!s&&(this._selectWordAt(s,t),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){const t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=(0,n.getCoordsRelativeToElement)(this._coreBrowserService.window,e,this._screenElement)[1];const i=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=i?0:(t>i&&(t-=i),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(14*t))}shouldForceSelection(e){return d.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):1===e.detail?this._handleSingleClick(e):2===e.detail?this._handleDoubleClick(e):3===e.detail&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval((()=>this._dragScroll()),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){const t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(d.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;const t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd)return void this.refresh(!0);2===this._activeSelectionMode?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const i=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){const t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const t=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,o.moveToCellSequence)(t[0]-1,t[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(e,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,i=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);i?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,i)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,i)}_fireOnSelectionChange(e,t,i){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=i,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((e=>this._handleTrim(e)))}_convertViewportColToCharacterIndex(e,t){let i=t;for(let s=0;t>=s;s++){const r=e.loadCell(s,this._workCell).getChars().length;0===this._workCell.getWidth()?i--:r>1&&t!==s&&(i+=r-1)}return i}setSelection(e,t,i){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=i,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,i=!0,s=!0){if(e[0]>=this._bufferService.cols)return;const r=this._bufferService.buffer,n=r.lines.get(e[1]);if(!n)return;const o=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(n,e[0]),h=a;const c=e[0]-a;let l=0,d=0,_=0,u=0;if(" "===o.charAt(a)){for(;a>0&&" "===o.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(n.loadCell(t-1,this._workCell));){n.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(l++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+c-l+_,v=Math.min(this._bufferService.cols,h-a+l+d-_-u);if(t||""!==o.slice(a,h).trim()){if(i&&0===f&&32!==n.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&n.isWrapped&&32!==t.getCodePoint(this._bufferService.cols-1)){const t=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(t){const e=this._bufferService.cols-t.start;f-=e,v+=e}}}if(s&&f+v===this._bufferService.cols&&32!==n.getCodePoint(this._bufferService.cols-1)){const t=r.lines.get(e[1]+1);if(t?.isWrapped&&32!==t.getCodePoint(0)){const t=this._getWordAt([0,e[1]+1],!1,!1,!0);t&&(v+=t.length)}}return{start:f,length:v}}}_selectWordAt(e,t){const i=this._getWordAt(e,t);if(i){for(;i.start<0;)i.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[i.start,e[1]],this._model.selectionStartLength=i.length}}_selectToWordAt(e){const t=this._getWordAt(e,!0);if(t){let i=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,i--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,i++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,i]}}_isCharWordSeparator(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){const t=this._bufferService.buffer.getWrappedRangeForLine(e),i={start:{x:0,y:t.first},end:{x:this._bufferService.cols-1,y:t.last}};this._model.selectionStart=[0,t.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=g=s([r(3,f.IBufferService),r(4,f.ICoreService),r(5,h.IMouseService),r(6,f.IOptionsService),r(7,h.IRenderService),r(8,h.ICoreBrowserService)],g)},4725:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(8343);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseService=(0,s.createDecorator)("MouseService"),t.IRenderService=(0,s.createDecorator)("RenderService"),t.ISelectionService=(0,s.createDecorator)("SelectionService"),t.ICharacterJoinerService=(0,s.createDecorator)("CharacterJoinerService"),t.IThemeService=(0,s.createDecorator)("ThemeService"),t.ILinkProviderService=(0,s.createDecorator)("LinkProviderService")},6731:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const n=i(7239),o=i(8055),a=i(8460),h=i(844),c=i(2585),l=o.css.toColor("#ffffff"),d=o.css.toColor("#000000"),_=o.css.toColor("#ffffff"),u=o.css.toColor("#000000"),f={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[o.css.toColor("#2e3436"),o.css.toColor("#cc0000"),o.css.toColor("#4e9a06"),o.css.toColor("#c4a000"),o.css.toColor("#3465a4"),o.css.toColor("#75507b"),o.css.toColor("#06989a"),o.css.toColor("#d3d7cf"),o.css.toColor("#555753"),o.css.toColor("#ef2929"),o.css.toColor("#8ae234"),o.css.toColor("#fce94f"),o.css.toColor("#729fcf"),o.css.toColor("#ad7fa8"),o.css.toColor("#34e2e2"),o.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const s=t[i/36%6|0],r=t[i/6%6|0],n=t[i%6];e.push({css:o.channels.toCss(s,r,n),rgba:o.channels.toRgba(s,r,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:o.channels.toCss(i,i,i),rgba:o.channels.toRgba(i,i,i)})}return e})());let v=t.ThemeService=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new n.ColorContrastCache,this._halfContrastCache=new n.ColorContrastCache,this._onChangeColors=this.register(new a.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:l,background:d,cursor:_,cursorAccent:u,selectionForeground:void 0,selectionBackgroundTransparent:f,selectionBackgroundOpaque:o.color.blend(d,f),selectionInactiveBackgroundTransparent:f,selectionInactiveBackgroundOpaque:o.color.blend(d,f),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange("theme",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const i=this._colors;if(i.foreground=p(e.foreground,l),i.background=p(e.background,d),i.cursor=p(e.cursor,_),i.cursorAccent=p(e.cursorAccent,u),i.selectionBackgroundTransparent=p(e.selectionBackground,f),i.selectionBackgroundOpaque=o.color.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=p(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=o.color.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?p(e.selectionForeground,o.NULL_COLOR):void 0,i.selectionForeground===o.NULL_COLOR&&(i.selectionForeground=void 0),o.color.isOpaque(i.selectionBackgroundTransparent)){const e=.3;i.selectionBackgroundTransparent=o.color.opacity(i.selectionBackgroundTransparent,e)}if(o.color.isOpaque(i.selectionInactiveBackgroundTransparent)){const e=.3;i.selectionInactiveBackgroundTransparent=o.color.opacity(i.selectionInactiveBackgroundTransparent,e)}if(i.ansi=t.DEFAULT_ANSI_COLORS.slice(),i.ansi[0]=p(e.black,t.DEFAULT_ANSI_COLORS[0]),i.ansi[1]=p(e.red,t.DEFAULT_ANSI_COLORS[1]),i.ansi[2]=p(e.green,t.DEFAULT_ANSI_COLORS[2]),i.ansi[3]=p(e.yellow,t.DEFAULT_ANSI_COLORS[3]),i.ansi[4]=p(e.blue,t.DEFAULT_ANSI_COLORS[4]),i.ansi[5]=p(e.magenta,t.DEFAULT_ANSI_COLORS[5]),i.ansi[6]=p(e.cyan,t.DEFAULT_ANSI_COLORS[6]),i.ansi[7]=p(e.white,t.DEFAULT_ANSI_COLORS[7]),i.ansi[8]=p(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),i.ansi[9]=p(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),i.ansi[10]=p(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),i.ansi[11]=p(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),i.ansi[12]=p(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),i.ansi[13]=p(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),i.ansi[14]=p(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),i.ansi[15]=p(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const s=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;ithis._length)for(let t=this._length;t=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;tthis._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+i<0)throw new Error("Cannot shift elements in list beyond index 0");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s{Object.defineProperty(t,"__esModule",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if("object"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},8055:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(6114);let r=0,n=0,o=0,a=0;var h,c,l,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function f(e,t){return e>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,n,o]=_.toChannels(e.rgba),{css:h.toCss(r,n,o,a),rgba:h.toRgba(r,n,o,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=l+Math.round((i-l)*a),n=d+Math.round((s-d)*a),o=_+Math.round((c-_)*a),{css:h.toCss(r,n,o),rgba:h.toRgba(r,n,o)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return h.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,n,o]=_.toChannels(t),{css:h.toCss(r,n,o),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(c||(t.color=c={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),h.toColor(r,n,o);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),h.toColor(r,n,o,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),n=parseInt(s[2]),o=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),h.toColor(r,n,o,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,n,o,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,n,o,a),css:e}}}(l||(t.css=l={})),function(e){function t(e,t,i){const s=e/255,r=t/255,n=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c0||a>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c>>0}e.blend=function(e,t){if(a=(255&t)/255,1===a)return t;const i=t>>24&255,s=t>>16&255,c=t>>8&255,l=e>>24&255,d=e>>16&255,_=e>>8&255;return r=l+Math.round((i-l)*a),n=d+Math.round((s-d)*a),o=_+Math.round((c-_)*a),h.toRgba(r,n,o)},e.ensureContrastRatio=function(e,s,r){const n=d.relativeLuminance(e>>8),o=d.relativeLuminance(s>>8);if(f(n,o)>8));if(af(n,d.relativeLuminance(t>>8))?o:t}return o}const a=i(e,s,r),h=f(n,d.relativeLuminance(a>>8));if(hf(n,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=f},8969:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(2585),n=i(4348),o=i(7866),a=i(744),h=i(7302),c=i(6975),l=i(8460),d=i(1753),_=i(1480),u=i(7994),f=i(9282),v=i(5435),p=i(5981),g=i(2660);let m=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{this._onScrollApi?.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(a.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(d.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(_.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(u.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(g.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new v.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange(["windowsMode","windowsPty"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new p.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!m&&(this._logService.warn("writeSync is unreliable and will be removed soon."),m=!0),this._writeBuffer.writeSync(e,t)}input(e,t=!0){this.coreService.triggerDataEvent(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,a.MINIMUM_COLS),t=Math.max(t,a.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!("conpty"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},(()=>((0,f.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},8460:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;tt.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},5435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(2584),o=i(7116),a=i(2015),h=i(844),c=i(482),l=i(8437),d=i(8460),_=i(643),u=i(511),f=i(3734),v=i(2585),p=i(1480),g=i(6242),m=i(6351),S=i(5941),C={"(":0,")":1,"*":2,"+":3,"-":1,".":2},b=131072;function w(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var y;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(y||(t.WindowsOptionsReportType=y={}));let E=0;class k extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,_,f,v=new a.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=_,this._unicodeService=f,this._parser=v,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new u.CellData,this._windowTitle="",this._iconName="",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new d.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new d.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new d.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new d.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new d.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new d.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new d.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new d.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new d.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new d.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new d.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new d.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new d.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new L(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug("Unknown EXECUTE code: ",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug("Unknown OSC code: ",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{"HOOK"===t&&(i=i.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:"@"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:" ",final:"@"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:"A"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:" ",final:"A"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:"B"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:"C"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:"D"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:"E"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:"F"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:"G"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:"H"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:"I"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:"J"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"J"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:"K"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"K"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:"L"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:"M"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:"P"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:"S"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:"T"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:"X"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:"Z"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:"`"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:"a"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:"b"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:"c"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:">",final:"c"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:"d"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:"e"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:"f"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:"g"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:"h"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"h"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:"l"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"l"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:"m"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:"n"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:"?",final:"n"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:"!",final:"p"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:" ",final:"q"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:"r"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:"s"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:"t"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:"u"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:"'",final:"}"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:"'",final:"~"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'"',final:"q"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:"$",final:"p"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new g.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new g.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new g.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new g.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new g.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new g.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new g.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new g.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new g.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new g.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new g.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new g.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:"7"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:"8"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:"D"},(()=>this.index())),this._parser.registerEscHandler({final:"E"},(()=>this.nextLine())),this._parser.registerEscHandler({final:"H"},(()=>this.tabSet())),this._parser.registerEscHandler({final:"M"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:"="},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:">"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:"c"},(()=>this.fullReset())),this._parser.registerEscHandler({final:"n"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"o"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"|"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"}"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"~"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:"%",final:"@"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:"%",final:"G"},(()=>this.selectDefaultCharset()));for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},(()=>this.selectCharset("("+e))),this._parser.registerEscHandler({intermediates:")",final:e},(()=>this.selectCharset(")"+e))),this._parser.registerEscHandler({intermediates:"*",final:e},(()=>this.selectCharset("*"+e))),this._parser.registerEscHandler({intermediates:"+",final:e},(()=>this.selectCharset("+"+e))),this._parser.registerEscHandler({intermediates:"-",final:e},(()=>this.selectCharset("-"+e))),this._parser.registerEscHandler({intermediates:".",final:e},(()=>this.selectCharset("."+e))),this._parser.registerEscHandler({intermediates:"/",final:e},(()=>this.selectCharset("/"+e)));this._parser.registerEscHandler({intermediates:"#",final:"8"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error("Parsing error: ",e),e))),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new m.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=v.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t("#SLOW_TIMEOUT")),5e3)))]).catch((e=>{if("#SLOW_TIMEOUT"!==e)throw e;console.warn("async parser handler taking longer than 5000 ms")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const o=this._parseStack.paused;if(o){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>b&&(n=this._parseStack.position+b)}if(this._logService.logLevel<=v.LogLevelEnum.DEBUG&&this._logService.debug("parsing data"+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join("")}"`),"string"==typeof e?e.split("").map((e=>e.charCodeAt(0))):e),this._parseBuffer.lengthb)for(let t=n;t0&&2===f.getWidth(this._activeBuffer.x-1)&&f.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(h){const e=f;let t=this._activeBuffer.x-m;for(this._activeBuffer.x=m,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),m>0&&f instanceof l.BufferLine&&f.copyCellsFrom(e,t,0,m,!1);t=0;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}else if(d&&(f.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===f.getWidth(a-1)&&f.setCellFromCodepoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,u)),f.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===f.getWidth(this._activeBuffer.x)&&!f.hasContent(this._activeBuffer.x)&&f.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return"t"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!w(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new m.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new g.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)?.isWrapped){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.y65535?2:1}let h=a;for(let e=1;e0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent(n.C0.ESC+"[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent(n.C0.ESC+"[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent(n.C0.ESC+"[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent(n.C0.ESC+"[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent(n.C0.ESC+"[>83;40003;0c")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+"").indexOf(e)}setMode(e){for(let t=0;te?1:2,u=e.params[0];return f=u,v=t?2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(d.convertEol):0:1===u?_(i.applicationCursorKeys):3===u?d.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===u?_(i.origin):7===u?_(i.wraparound):8===u?3:9===u?_("X10"===s):12===u?_(d.cursorBlink):25===u?_(!o.isCursorHidden):45===u?_(i.reverseWraparound):66===u?_(i.applicationKeypad):67===u?4:1e3===u?_("VT200"===s):1002===u?_("DRAG"===s):1003===u?_("ANY"===s):1004===u?_(i.sendFocus):1005===u?4:1006===u?_("SGR"===r):1015===u?4:1016===u?_("SGR_PIXELS"===r):1048===u?1:47===u||1047===u||1049===u?_(c===l):2004===u?_(i.bracketedPasteMode):0,o.triggerDataEvent(`${n.C0.ESC}[${t?"":"?"}${f};${v}$y`),!0;var f,v}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=f.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let o=0;do{5===s[1]&&(r=1),s[n+o+1+r]=i[o]}while(++o=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle="block";break;case 3:case 4:this._optionsService.options.cursorStyle="underline";break;case 5:case 6:this._optionsService.options.cursorStyle="bar"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!w(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(";");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e);if(D(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,S.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(";");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(":");let s;const r=i.findIndex((e=>e.startsWith("id=")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(";");for(let e=0;e=this._specialColors.length);++e,++t)if("?"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,S.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new u.CellData;e.content=1<<22|"E".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\`),!0))('"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}"q`:'"p'===e?'P1$r61;1"p':"r"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:"m"===e?"P1$r0m":" q"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=k;let L=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){ethis.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(E=e,e=t,t=E),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function D(e){return 0<=e&&e<256}L=s([r(0,v.IBufferService)],L)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},1505:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,n){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,n)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},6114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"!=typeof process;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},6106:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;let i=0;t.SortedList=class{constructor(e){this._getKey=e,this._array=[]}clear(){this._array.length=0}insert(e){0!==this._array.length?(i=this._search(this._getKey(e)),this._array.splice(i,0,e)):this._array.push(e)}delete(e){if(0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(i=this._search(t),-1===i)return!1;if(this._getKey(this._array[i])!==t)return!1;do{if(this._array[i]===e)return this._array.splice(i,1),!0}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{yield this._array[i]}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r0&&this._getKey(this._array[s-1])===e;)s--;return s}t=s+1}}return t}}},7226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(6114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ir)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},9282:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=t?.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},9092:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(6349),r=i(7226),n=i(3734),o=i(8437),a=i(4634),h=i(511),c=i(643),l=i(4863),d=i(7116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=o.DEFAULT_ATTR_DATA.clone(),this.savedCharset=d.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new o.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&et.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=o.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new o.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&"conpty"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(o.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,a.reflowLargerCreateNewLayout)(this.lines,i);(0,a.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(o.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l0&&(s.push({start:n+c.length+r,newLines:v}),r+=v.length),c.push(...v);let p=_.length-1,g=_[p];0===g&&(p--,g=_[p]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[p])break;if(c[p].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(p--,g=_[p]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,a.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;c--)if(a&&a.start>n+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(c--,a.newLines[e]);c++,e.push({index:n+1,amount:a.newLines.length}),h+=a.newLines.length,a=s[++o]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):""}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.linee.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},8437:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(3734),r=i(511),n=i(643),o=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,o.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return a=3*e,t.content=this._data[a+0],t.fg=this._data[a+1],t.bg=this._data[a+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodepoint(e,t,i,s){268435456&s.bg&&(this._extendedAttrs[e]=s.extended),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s.fg,this._data[3*e+2]=s.bg}addCodepointToCell(e,t,i){let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,o.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&s)+(0,o.stringFromCodePoint)(t),s&=-2097152,s|=2097152):s=t|1<<22,i&&(s&=-12582913,s|=i<<22),this._data[3*e+0]=s}insertCells(e,t,i){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;sthis.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e,t,i,s){t=t??0,i=i??this.length,e&&(i=Math.min(i,this.getTrimmedLength())),s&&(s.length=0);let r="";for(;t>22||1}return s&&s.push(t),r}}t.BufferLine=h},4841:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(`Buffer range end (${e.end.x}, ${e.end.y}) cannot be before start (${e.start.x}, ${e.start.y})`);return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,"__esModule",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const o=[];for(let a=0;a=a&&r0&&(e>d||0===l[e].getTrimmedLength());e--)v++;v>0&&(o.push(a+l.length-v),o.push(v)),a+=l.length-1}return o},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let o=0;oi(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;hc&&(o-=c,a++);const l=2===e[a].getWidth(o-1);l&&o--;const d=l?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},5295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(8460),r=i(844),n=i(9092);class o extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange("tabStopWidth",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=o},511:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(3734);class o extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=o},643:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(8460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},7116:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={"`":"◆",a:"▒",b:"␉",c:"␌",d:"␍",e:"␊",f:"°",g:"±",h:"␤",i:"␋",j:"┘",k:"┐",l:"┌",m:"└",n:"┼",o:"⎺",p:"⎻",q:"─",r:"⎼",s:"⎽",t:"├",u:"┤",v:"┴",w:"┬",x:"│",y:"≤",z:"≥","{":"π","|":"≠","}":"£","~":"·"},t.CHARSETS.A={"#":"£"},t.CHARSETS.B=void 0,t.CHARSETS[4]={"#":"£","@":"¾","[":"ij","\\":"½","]":"|","{":"¨","|":"f","}":"¼","~":"´"},t.CHARSETS.C=t.CHARSETS[5]={"[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS.R={"#":"£","@":"à","[":"°","\\":"ç","]":"§","{":"é","|":"ù","}":"è","~":"¨"},t.CHARSETS.Q={"@":"à","[":"â","\\":"ç","]":"ê","^":"î","`":"ô","{":"é","|":"ù","}":"è","~":"û"},t.CHARSETS.K={"@":"§","[":"Ä","\\":"Ö","]":"Ü","{":"ä","|":"ö","}":"ü","~":"ß"},t.CHARSETS.Y={"#":"£","@":"§","[":"°","\\":"ç","]":"é","`":"ù","{":"à","|":"ò","}":"è","~":"ì"},t.CHARSETS.E=t.CHARSETS[6]={"@":"Ä","[":"Æ","\\":"Ø","]":"Å","^":"Ü","`":"ä","{":"æ","|":"ø","}":"å","~":"ü"},t.CHARSETS.Z={"#":"£","@":"§","[":"¡","\\":"Ñ","]":"¿","{":"°","|":"ñ","}":"ç"},t.CHARSETS.H=t.CHARSETS[7]={"@":"É","[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},2584:(e,t)=>{var i,s,r;Object.defineProperty(t,"__esModule",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL="\0",e.SOH="",e.STX="",e.ETX="",e.EOT="",e.ENQ="",e.ACK="",e.BEL="",e.BS="\b",e.HT="\t",e.LF="\n",e.VT="\v",e.FF="\f",e.CR="\r",e.SO="",e.SI="",e.DLE="",e.DC1="",e.DC2="",e.DC3="",e.DC4="",e.NAK="",e.SYN="",e.ETB="",e.CAN="",e.EM="",e.SUB="",e.ESC="",e.FS="",e.GS="",e.RS="",e.US="",e.SP=" ",e.DEL=""}(i||(t.C0=i={})),function(e){e.PAD="€",e.HOP="",e.BPH="‚",e.NBH="ƒ",e.IND="„",e.NEL="…",e.SSA="†",e.ESA="‡",e.HTS="ˆ",e.HTJ="‰",e.VTS="Š",e.PLD="‹",e.PLU="Œ",e.RI="",e.SS2="Ž",e.SS3="",e.DCS="",e.PU1="‘",e.PU2="’",e.STS="“",e.CCH="”",e.MW="•",e.SPA="–",e.EPA="—",e.SOS="˜",e.SGCI="™",e.SCI="š",e.CSI="›",e.ST="œ",e.OSC="",e.PM="ž",e.APC="Ÿ"}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\`}(r||(t.C1_ESCAPED=r={}))},7399:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=void 0;const s=i(2584),r={48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};t.evaluateKeyboardEvent=function(e,t,i,n){const o={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:"UIKeyInputUpArrow"===e.key?o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A":"UIKeyInputLeftArrow"===e.key?o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D":"UIKeyInputRightArrow"===e.key?o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C":"UIKeyInputDownArrow"===e.key&&(o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B");break;case 8:o.key=e.ctrlKey?"\b":s.C0.DEL,e.altKey&&(o.key=s.C0.ESC+o.key);break;case 9:if(e.shiftKey){o.key=s.C0.ESC+"[Z";break}o.key=s.C0.HT,o.cancel=!0;break;case 13:o.key=e.altKey?s.C0.ESC+s.C0.CR:s.C0.CR,o.cancel=!0;break;case 27:o.key=s.C0.ESC,e.altKey&&(o.key=s.C0.ESC+s.C0.ESC),o.cancel=!0;break;case 37:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"D",o.key===s.C0.ESC+"[1;3D"&&(o.key=s.C0.ESC+(i?"b":"[1;5D"))):o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D";break;case 39:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"C",o.key===s.C0.ESC+"[1;3C"&&(o.key=s.C0.ESC+(i?"f":"[1;5C"))):o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C";break;case 38:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"A",i||o.key!==s.C0.ESC+"[1;3A"||(o.key=s.C0.ESC+"[1;5A")):o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A";break;case 40:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"B",i||o.key!==s.C0.ESC+"[1;3B"||(o.key=s.C0.ESC+"[1;5B")):o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B";break;case 45:e.shiftKey||e.ctrlKey||(o.key=s.C0.ESC+"[2~");break;case 46:o.key=a?s.C0.ESC+"[3;"+(a+1)+"~":s.C0.ESC+"[3~";break;case 36:o.key=a?s.C0.ESC+"[1;"+(a+1)+"H":t?s.C0.ESC+"OH":s.C0.ESC+"[H";break;case 35:o.key=a?s.C0.ESC+"[1;"+(a+1)+"F":t?s.C0.ESC+"OF":s.C0.ESC+"[F";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key=s.C0.ESC+"[5;"+(a+1)+"~":o.key=s.C0.ESC+"[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key=s.C0.ESC+"[6;"+(a+1)+"~":o.key=s.C0.ESC+"[6~";break;case 112:o.key=a?s.C0.ESC+"[1;"+(a+1)+"P":s.C0.ESC+"OP";break;case 113:o.key=a?s.C0.ESC+"[1;"+(a+1)+"Q":s.C0.ESC+"OQ";break;case 114:o.key=a?s.C0.ESC+"[1;"+(a+1)+"R":s.C0.ESC+"OR";break;case 115:o.key=a?s.C0.ESC+"[1;"+(a+1)+"S":s.C0.ESC+"OS";break;case 116:o.key=a?s.C0.ESC+"[15;"+(a+1)+"~":s.C0.ESC+"[15~";break;case 117:o.key=a?s.C0.ESC+"[17;"+(a+1)+"~":s.C0.ESC+"[17~";break;case 118:o.key=a?s.C0.ESC+"[18;"+(a+1)+"~":s.C0.ESC+"[18~";break;case 119:o.key=a?s.C0.ESC+"[19;"+(a+1)+"~":s.C0.ESC+"[19~";break;case 120:o.key=a?s.C0.ESC+"[20;"+(a+1)+"~":s.C0.ESC+"[20~";break;case 121:o.key=a?s.C0.ESC+"[21;"+(a+1)+"~":s.C0.ESC+"[21~";break;case 122:o.key=a?s.C0.ESC+"[23;"+(a+1)+"~":s.C0.ESC+"[23~";break;case 123:o.key=a?s.C0.ESC+"[24;"+(a+1)+"~":s.C0.ESC+"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(i&&!n||!e.altKey||e.metaKey)!i||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?o.key=e.key:e.key&&e.ctrlKey&&("_"===e.key&&(o.key=s.C0.US),"@"===e.key&&(o.key=s.C0.NUL)):65===e.keyCode&&(o.type=1);else{const t=r[e.keyCode],i=t?.[e.shiftKey?1:0];if(i)o.key=s.C0.ESC+i;else if(e.keyCode>=65&&e.keyCode<=90){const t=e.ctrlKey?e.keyCode-64:e.keyCode+32;let i=String.fromCharCode(t);e.shiftKey&&(i=i.toUpperCase()),o.key=s.C0.ESC+i}else if(32===e.keyCode)o.key=s.C0.ESC+(e.ctrlKey?s.C0.NUL:" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=s.C0.ESC+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key=s.C0.NUL:e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key=s.C0.DEL:219===e.keyCode?o.key=s.C0.ESC:220===e.keyCode?o.key=s.C0.FS:221===e.keyCode&&(o.key=s.C0.GS)}return o}},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n=i)return this._interim=r,s;const o=e.charCodeAt(n);56320<=o&&o<=57343?t[s++]=1024*(r-55296)+o-56320+65536:(t[s++]=r,t[s++]=o)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,o,a=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,o=0;for(;(n=63&this.interim[++o])&&o<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-o;for(;c=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[o++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const l=i-4;let d=c;for(;d=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&o,h<65536||h>1114111)continue;t[a++]=h}}return a}}},225:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(1480),r=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],n=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let o;t.UnicodeV6=class{constructor(){if(this.version="6",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;et[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),r=0===i&&0!==t;if(r){const e=s.UnicodeService.extractWidth(t);0===e?r=!1:e>i&&(i=e)}return s.UnicodeService.createPropertyValue(0,i,r)}}},5981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error("write data discarded, use flow control to avoid losing data");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},5941:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/,s=/^[\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?"0"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf("rgb:")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf("#")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},5770:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(8742),n=i(5770),o=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=o}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=o,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||o,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,"HOOK",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,"PUT",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,"UNHOOK",e);this._active=o,this._ident=0}};const a=new r.Params;a.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data="",this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=a,this._data="",this._hitLimit=!1,e)));return this._params=a,this._data="",this._hitLimit=!1,t}}},2015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(8742),n=i(6242),o=i(6351);class a{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;rt)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let o;for(o in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],o,3,0),e.addMany(i(128,144),o,3,0),e.addMany(i(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new o.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error("prefix must be in range 0x3c .. 0x3f")}if(e.intermediates){if(e.intermediates.length>2)throw new Error("only two bytes as intermediates are supported");for(let t=0;ts||s>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");i<<=8,i|=s}}if(1!==e.final.length)throw new Error("final must be a single byte");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,o=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,o=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,o=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=15&this._parseStack.transition}for(let i=o;i>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=0&&(s=o[a](this._params),!0!==s);a--)if(s instanceof Promise)return this._preserveStack(3,o,a,n,i),s;a<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingJoinState=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingJoinState=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r=t||(r=e[s])<32||r>127&&r{Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(5770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,"START")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,"PUT",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,"END",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data="",this._hitLimit=!1}start(){this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data="",this._hitLimit=!1,e)));return this._data="",this._hitLimit=!1,t}}},8742:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},5741:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferApiView=void 0;const s=i(3785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},3785:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},8285:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(8771),r=i(8460),n=i(844);class o extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,"normal"),this._alternate=new s.BufferApiView(this._core.buffers.alt,"alternate"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error("Active buffer is neither normal nor alternate")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},7090:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(8460),o=i(844),a=i(5295),h=i(2585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new a.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},7994:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},1753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreMouseService=void 0;const n=i(2585),o=i(8460),a=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,d={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.x};${e.y}${t}`}};let _=t.CoreMouseService=class extends a.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._lastEvent=null,this._onProtocolChange=this.register(new o.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(d))this.addEncoding(e,d[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol "${e}"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding "${e}"`);this._activeEncoding=e}reset(){this.activeProtocol="NONE",this.activeEncoding="DEFAULT",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,"SGR_PIXELS"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&("DEFAULT"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=_=s([r(0,n.IBufferService),r(1,n.ICoreService)],_)},6975:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const n=i(1439),o=i(8460),a=i(844),h=i(2585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let d=t.CoreService=class extends a.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new o.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new o.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new o.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new o.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=d=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],d)},9074:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationService=void 0;const s=i(8055),r=i(8460),n=i(844),o=i(6106);let a=0,h=0;class c extends n.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new o.SortedList((e=>e?.marker.line)),this._onDecorationRegistered=this.register(new r.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new r.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,n.toDisposable)((()=>this.reset())))}registerDecoration(e){if(e.marker.isDisposed)return;const t=new l(e);if(t){const e=t.marker.onDispose((()=>t.dispose()));t.onDispose((()=>{t&&(this._decorations.delete(t)&&this._onDecorationRemoved.fire(t),e.dispose())})),this._decorations.insert(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear()}*getDecorationsAtCell(e,t,i){let s=0,r=0;for(const n of this._decorations.getKeyIterator(t))s=n.options.x??0,r=s+(n.options.width??1),e>=s&&e{a=t.options.x??0,h=a+(t.options.width??1),e>=a&&e{Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(2585),r=i(8343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),o=i(2585),a={trace:o.LogLevelEnum.TRACE,debug:o.LogLevelEnum.DEBUG,info:o.LogLevelEnum.INFO,warn:o.LogLevelEnum.WARN,error:o.LogLevelEnum.ERROR,off:o.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=o.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;tJSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},7302:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(8460),r=i(844),n=i(6114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",customGlyphs:!0,drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollModifier:"alt",fastScrollSensitivity:5,fontFamily:"courier-new, courier, monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",cancelEvents:!1,overviewRulerWidth:0};const o=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i={...t.DEFAULT_OPTIONS};for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options={...i},this._setupOptions(),this.register((0,r.toDisposable)((()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null})))}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return"block"===e||"underline"===e||"bar"===e}(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=t.DEFAULT_OPTIONS[e]);break;case"fontWeight":case"fontWeightBold":if("number"==typeof i&&1<=i&&i<=1e3)break;i=o.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"cursorWidth":i=Math.floor(i);case"lineHeight":case"tabStopWidth":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case"minimumContrastRatio":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case"scrollback":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case"rows":case"cols":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=i??{}}return i}}t.OptionsService=a},2660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const n=i(2585);let o=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),o={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(o,n))),this._entriesWithId.set(o.key,o),this._dataByLinkId.set(o.id,o),o.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){return this._dataByLinkId.get(e)?.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=o=s([r(0,n.IBufferService)],o)},8343:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},2585:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(8343);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")},1480:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8460),r=i(225);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let r=0;r=s)return t+this.wcwidth(o);const i=e.charCodeAt(r);56320<=i&&i<=57343?o=1024*(o-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(o,i);let h=n.extractWidth(a);n.extractShouldJoin(a)&&(h-=n.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.Terminal=void 0;const t=i(9042),r=i(3236),n=i(844),o=i(5741),a=i(8285),h=i(7975),c=i(7090),l=["cols","rows"];class d extends n.Disposable{constructor(e){super(),this._core=this.register(new r.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions={...this._core.options};const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(l.includes(e))throw new Error(`Option "${e}" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error("You must set the allowProposedApi option to true to use proposed API")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new h.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new c.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new a.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.coreMouseService.activeProtocol){case"X10":t="x10";break;case"VT200":t="vt200";break;case"DRAG":t="drag";break;case"ANY":t="any"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}blur(){this._core.blur()}focus(){this._core.focus()}input(e,t=!0){this._core.input(e,t)}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}attachCustomWheelEventHandler(e){this._core.attachCustomWheelEventHandler(e)}registerLinkProvider(e){return this._core.registerLinkProvider(e)}registerCharacterJoiner(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return this._checkProposedApi(),this._verifyPositiveIntegers(e.x??0,e.width??0,e.height??0),this._core.registerDecoration(e)}hasSelection(){return this._core.hasSelection()}select(e,t,i){this._verifyIntegers(e,t,i),this._core.select(e,t,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write("\r\n",t)}paste(e){this._core.paste(e)}refresh(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(e){this._addonManager.loadAddon(this,e)}static get strings(){return t}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(const t of e)if(t&&(t===1/0||isNaN(t)||t%1!=0||t<0))throw new Error("This API only accepts positive integers")}}e.Terminal=d})(),s})())); -//# sourceMappingURL=xterm.js.map \ No newline at end of file diff --git a/swiftwave_service/console/server.go b/swiftwave_service/console/server.go deleted file mode 100644 index 99e4762a54..0000000000 --- a/swiftwave_service/console/server.go +++ /dev/null @@ -1,455 +0,0 @@ -package console - -import ( - "context" - _ "embed" - "encoding/json" - "fmt" - "net/http" - "strconv" - - "github.com/labstack/echo/v4" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" - "golang.org/x/net/websocket" -) - -// Initialize : Initialize the server and its routes -func (server *Server) Initialize() { - server.initiateAssetRoutes() - server.EchoServer.POST("/console/token/server/:id", server.generateAuthTokenForServer) - server.EchoServer.POST("/console/token/application/:id/:server_id", server.generateAuthTokenForApplication) - server.EchoServer.GET("/console/application/:id/servers", server.fetchServersForApplication) - server.EchoServer.GET("/console/ws/:requestId/:token/:rows/:cols", server.consoleWebsocket) -} - -// Handler for generate auth token -func (server *Server) generateAuthTokenForServer(c echo.Context) error { - serverIdStr := c.Param("id") - serverId, err := strconv.Atoi(serverIdStr) - if err != nil { - return c.String(http.StatusBadRequest, "Invalid server id") - } - // try to convert to uint - serverIdUint := uint(serverId) - // fetch server - serverRecord, err := core.FetchServerByID(&server.ServiceManager.DbClient, serverIdUint) - if err != nil { - return c.String(http.StatusNotFound, "Server not found") - } - // generate token - token, err := core.GenerateConsoleTokenForServer(server.ServiceManager.DbClient, serverRecord.ID) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to generate token") - } - // return request id and token - resp := map[string]interface{}{ - "request_id": token.ID, - "token": token.Token, - "target": map[string]interface{}{ - "type": "server", - "ip": serverRecord.IP, - "user": serverRecord.User, - "hostname": serverRecord.HostName, - }, - } - return c.JSON(http.StatusOK, resp) -} - -// Handler to fetch servers where application is deployed -// so that user can select a server to connect to console -func (server *Server) fetchServersForApplication(c echo.Context) error { - // get application id - applicationIdStr := c.Param("id") - // fetch application - applicationRecord := &core.Application{} - var err error - err = applicationRecord.FindById(c.Request().Context(), server.ServiceManager.DbClient, applicationIdStr) - if err != nil { - return c.String(http.StatusNotFound, "Application not found") - } - // fetch a swarm manager - swarmManagerServer, err := core.FetchSwarmManager(&server.ServiceManager.DbClient) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to fetch swarm manager, maybe none online") - } - // fetch docker manager - dockerManager, err := manager.DockerClient(c.Request().Context(), swarmManagerServer) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to connect to docker") - } - // fetch servers hostname - serverHostnames, err := dockerManager.ServiceRunningServers(applicationRecord.Name) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to fetch servers") - } - // create a map of servers - serverHostnamesMap := make(map[string]uint) - for _, hostname := range serverHostnames { - serverId, err := core.FetchServerIDByHostName(&server.ServiceManager.DbClient, hostname) - if err != nil { - continue - } - serverHostnamesMap[hostname] = serverId - } - return c.JSON(http.StatusOK, serverHostnamesMap) -} - -// Handler for generate auth token for application -func (server *Server) generateAuthTokenForApplication(c echo.Context) error { - // get application id - applicationIdStr := c.Param("id") - targetServerIdStr := c.Param("server_id") - // try to convert to uint - targetServerId, err := strconv.Atoi(targetServerIdStr) - if err != nil { - return c.String(http.StatusBadRequest, "Invalid application id") - } - targetServerIdUint := uint(targetServerId) - // fetch application - applicationRecord := &core.Application{} - err = applicationRecord.FindById(c.Request().Context(), server.ServiceManager.DbClient, applicationIdStr) - if err != nil { - return c.String(http.StatusNotFound, "Application not found") - } - // check if target server id is provided - serverRecord, err := core.FetchServerByID(&server.ServiceManager.DbClient, targetServerIdUint) - if err != nil { - return c.String(http.StatusNotFound, "Server not found") - } - - // generate token - token, err := core.GenerateConsoleTokenForApplication(server.ServiceManager.DbClient, applicationRecord.ID, targetServerIdUint) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to generate token") - } - // return request id and token - resp := map[string]interface{}{ - "request_id": token.ID, - "token": token.Token, - "target": map[string]interface{}{ - "type": "application", - "application": applicationRecord.Name, - "server": map[string]interface{}{ - "ip": serverRecord.IP, - "user": serverRecord.User, - "hostname": serverRecord.HostName, - }, - }, - } - return c.JSON(http.StatusOK, resp) -} - -// Websocket handler for console -func (server *Server) consoleWebsocket(c echo.Context) error { - requestId := c.Param("requestId") - token := c.Param("token") - rowsStr := c.Param("rows") - colsStr := c.Param("cols") - rows, err := strconv.Atoi(rowsStr) - if err != nil { - return c.String(http.StatusBadRequest, "Invalid rows") - } - cols, err := strconv.Atoi(colsStr) - if err != nil { - return c.String(http.StatusBadRequest, "Invalid cols") - } - // find token - tokenRecord, err := core.FindConsoleToken(server.ServiceManager.DbClient, requestId, token) - if err != nil { - return c.String(http.StatusForbidden, "Invalid token") - } - - if tokenRecord.Target == core.ConsoleTargetTypeServer { - return server.handleSSHConsoleRequestToServer(c, rows, cols, tokenRecord) - } else if tokenRecord.Target == core.ConsoleTargetTypeApplication { - return server.handleSSHConsoleRequestToApplication(c, rows, cols, tokenRecord) - } else { - return c.String(http.StatusNotImplemented, "Not implemented") - } -} - -func (server *Server) handleSSHConsoleRequestToServer(c echo.Context, rows int, cols int, tokenRecord *core.ConsoleToken) error { - // fetch server - remoteServer, err := core.FetchServerByID(&server.ServiceManager.DbClient, *tokenRecord.ServerID) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - // create context with cancel - ctx, ctxCancel := context.WithCancel(context.Background()) - // create ssh - session, stdin, stdout, stderr, err := ssh_toolkit.DirectSSH(ctx, cols, rows, remoteServer.IP, remoteServer.SSHPort, remoteServer.User, server.Config.SystemConfig.SshPrivateKey) - if err != nil { - ctxCancel() - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - if stdin == nil || stdout == nil || stderr == nil { - ctxCancel() - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - // accept websocket - websocket.Handler(func(ws *websocket.Conn) { - defer func(ws *websocket.Conn) { - _ = ws.Close() - }(ws) - - // accept websocket connection - ws.PayloadType = websocket.BinaryFrame - - // write stdout to websocket - go func() { - for { - select { - case <-ctx.Done(): - return - default: - buf := make([]byte, 1024) - n, err := (*stdout).Read(buf) - if err != nil { - ctxCancel() - } - err = websocket.Message.Send(ws, buf[:n]) - if err != nil { - ctxCancel() - } - } - - } - }() - - // write stderr to websocket - go func() { - for { - select { - case <-ctx.Done(): - return - default: - buf := make([]byte, 1024) - n, err := (*stderr).Read(buf) - if err != nil { - ctxCancel() - return - } - err = websocket.Message.Send(ws, buf[:n]) - if err != nil { - ctxCancel() - } - } - } - }() - - // read until close in a go routine - go func() { - for { - select { - case <-ctx.Done(): - return - default: - var buf = make([]byte, 1024) - err := websocket.Message.Receive(ws, &buf) - if err != nil { - ctxCancel() - return - } - // check if starts with EOT (hacky way to get resize info from binary message) - isAnySysReq := false - if string(buf[:1]) == "\x04" { - // take other part of the buffer - buf = buf[1:] - dimension := PTYDimension{} - // marsha to json - err = json.Unmarshal(buf, &dimension) - if err == nil { - isAnySysReq = true - // resize terminal - _ = session.WindowChange(dimension.Rows, dimension.Cols) - } - } - if !isAnySysReq { - _, err = (*stdin).Write(buf) - if err != nil { - ctxCancel() - return - } - } - } - } - }() - // write until close - <-ctx.Done() - }).ServeHTTP(c.Response(), c.Request()) - // upgrade to websocket - return nil -} - -func (server *Server) handleSSHConsoleRequestToApplication(c echo.Context, rows int, cols int, tokenRecord *core.ConsoleToken) error { - // fetch server - remoteServer, err := core.FetchServerByID(&server.ServiceManager.DbClient, *tokenRecord.ServerID) - if err != nil { - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - // fetch application - applicationRecord := &core.Application{} - err = applicationRecord.FindById(c.Request().Context(), server.ServiceManager.DbClient, *tokenRecord.ApplicationID) - if err != nil { - return c.String(http.StatusNotFound, "Application not found") - } - // create context with cancel - ctx, ctxCancel := context.WithCancel(context.Background()) - // create docker manager - dockerManager, err := manager.DockerClient(ctx, *remoteServer) - if err != nil { - ctxCancel() - return c.String(http.StatusInternalServerError, "Failed to connect to docker") - } - // create exec id - containerId, err := dockerManager.RandomServiceContainerID(applicationRecord.Name) - if err != nil { - ctxCancel() - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - // create ssh - dockerHost := fmt.Sprintf("unix://%s", remoteServer.DockerUnixSocketPath) - session, stdin, stdout, stderr, err := ssh_toolkit.DirectSSHToContainer(ctx, cols, rows, containerId, dockerHost, remoteServer.IP, remoteServer.SSHPort, remoteServer.User, server.Config.SystemConfig.SshPrivateKey) - if err != nil { - ctxCancel() - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - if stdin == nil || stdout == nil || stderr == nil { - ctxCancel() - return c.String(http.StatusInternalServerError, "Failed to connect to server") - } - // accept websocket - websocket.Handler(func(ws *websocket.Conn) { - defer func(ws *websocket.Conn) { - _ = ws.Close() - }(ws) - - // accept websocket connection - ws.PayloadType = websocket.BinaryFrame - - // write stdout to websocket - go func() { - for { - select { - case <-ctx.Done(): - return - default: - buf := make([]byte, 1024) - n, err := (*stdout).Read(buf) - if err != nil { - ctxCancel() - } - err = websocket.Message.Send(ws, buf[:n]) - if err != nil { - ctxCancel() - } - } - - } - }() - - // write stderr to websocket - go func() { - for { - select { - case <-ctx.Done(): - return - default: - buf := make([]byte, 1024) - n, err := (*stderr).Read(buf) - if err != nil { - ctxCancel() - return - } - err = websocket.Message.Send(ws, buf[:n]) - if err != nil { - ctxCancel() - } - } - } - }() - - // read until close in a go routine - go func() { - for { - select { - case <-ctx.Done(): - return - default: - var buf = make([]byte, 1024) - err := websocket.Message.Receive(ws, &buf) - if err != nil { - ctxCancel() - return - } - // check if starts with EOT (hacky way to get resize info from binary message) - isAnySysReq := false - if string(buf[:1]) == "\x04" { - // take other part of the buffer - buf = buf[1:] - dimension := PTYDimension{} - // marsha to json - err = json.Unmarshal(buf, &dimension) - if err == nil { - isAnySysReq = true - // resize terminal - _ = session.WindowChange(dimension.Rows, dimension.Cols) - } - } - if !isAnySysReq { - _, err = (*stdin).Write(buf) - if err != nil { - ctxCancel() - return - } - } - } - } - }() - // write until close - <-ctx.Done() - }).ServeHTTP(c.Response(), c.Request()) - // upgrade to websocket - return nil -} - -//go:embed assets/index.html -var consoleHTML string - -//go:embed assets/main.js -var consoleJS string - -//go:embed assets/xterm.js -var xtermJS string - -//go:embed assets/xterm.css -var xtermCSS string - -//go:embed assets/xterm-addon-fit.js -var xtermAddonFit string - -// Initialize Routes for assets -func (server *Server) initiateAssetRoutes() { - server.EchoServer.GET("/console", func(c echo.Context) error { - return c.HTML(200, consoleHTML) - }) - server.EchoServer.GET("/console/main.js", func(c echo.Context) error { - c.Response().Header().Set("Content-Type", "text/javascript") - return c.String(200, consoleJS) - }) - server.EchoServer.GET("/console/xterm.js", func(c echo.Context) error { - c.Response().Header().Set("Content-Type", "text/javascript") - return c.String(200, xtermJS) - }) - server.EchoServer.GET("/console/xterm-addon-fit.js", func(c echo.Context) error { - c.Response().Header().Set("Content-Type", "text/javascript") - return c.String(200, xtermAddonFit) - }) - server.EchoServer.GET("/console/xterm.css", func(c echo.Context) error { - // set content type - c.Response().Header().Set("Content-Type", "text/css") - return c.String(200, xtermCSS) - }) -} diff --git a/swiftwave_service/console/types.go b/swiftwave_service/console/types.go deleted file mode 100644 index db4bbd4105..0000000000 --- a/swiftwave_service/console/types.go +++ /dev/null @@ -1,22 +0,0 @@ -package console - -import ( - "github.com/labstack/echo/v4" - "github.com/swiftwave-org/swiftwave/swiftwave_service/config" - "github.com/swiftwave-org/swiftwave/swiftwave_service/service_manager" - "github.com/swiftwave-org/swiftwave/swiftwave_service/worker" -) - -// Server : hold references to other components of service -type Server struct { - EchoServer *echo.Echo - Config *config.Config - ServiceManager *service_manager.ServiceManager - WorkerManager *worker.Manager -} - -// PTYDimension : struct to hold console dimension -type PTYDimension struct { - Cols int `json:"cols"` - Rows int `json:"rows"` -} diff --git a/swiftwave_service/core/analytics_service_token.operations.go b/swiftwave_service/core/analytics_service_token.operations.go deleted file mode 100644 index 1e3ad8b3ee..0000000000 --- a/swiftwave_service/core/analytics_service_token.operations.go +++ /dev/null @@ -1,79 +0,0 @@ -package core - -import ( - "context" - "errors" - "fmt" - "github.com/google/uuid" - "github.com/labstack/gommon/random" - "gorm.io/gorm" -) - -func ValidateAnalyticsServiceToken(ctx context.Context, db gorm.DB, id string, token string) (verified bool, serverHostName string, err error) { - // fetch token from database - var tokenData AnalyticsServiceToken - tx := db.Where("id = ? AND token = ?", id, token).First(&tokenData) - if tx.Error != nil { - return false, "", tx.Error - } - // fetch hostname from database - var server Server - tx = db.Select("host_name").Where("id = ?", tokenData.ServerID).First(&server) - if tx.Error != nil { - return false, "", tx.Error - } - return true, server.HostName, nil -} - -func FetchAnalyticsServiceToken(ctx context.Context, db gorm.DB, serverId uint) (*AnalyticsServiceToken, error) { - // check if token exists - var tokenData AnalyticsServiceToken - tx := db.Where("server_id = ?", serverId).First(&tokenData) - if tx.Error == nil { - return &tokenData, nil - } - // create a new token - tokenData = AnalyticsServiceToken{ - ID: uuid.NewString(), - Token: random.String(32), - ServerID: serverId, - } - tx = db.Create(&tokenData) - if tx.Error != nil { - return nil, tx.Error - } - return &tokenData, nil -} - -func (token *AnalyticsServiceToken) IDToken() (string, error) { - if token == nil { - return "", errors.New("token is nil") - } - return fmt.Sprintf("%s:%s", token.ID, token.Token), nil -} - -func DeleteAnalyticsServiceToken(ctx context.Context, db gorm.DB, serverId uint) error { - tx := db.Where("server_id = ?", serverId).Delete(&AnalyticsServiceToken{}) - if tx.Error != nil { - // don't return error if token does not exist - if errors.Is(tx.Error, gorm.ErrRecordNotFound) { - return nil - } else { - return tx.Error - } - } - return nil -} - -// RotateAnalyticsServiceToken : delete existing token and create a new token. [Recommended to use transaction] -func RotateAnalyticsServiceToken(ctx context.Context, db gorm.DB, serverId uint) (*AnalyticsServiceToken, error) { - // delete existing token - err := DeleteAnalyticsServiceToken(ctx, db, serverId) - if err != nil { - if !errors.Is(err, gorm.ErrRecordNotFound) { - return nil, err - } - } - // create a new token - return FetchAnalyticsServiceToken(ctx, db, serverId) -} diff --git a/swiftwave_service/core/console_token.operations.go b/swiftwave_service/core/console_token.operations.go deleted file mode 100644 index a3083b3e6d..0000000000 --- a/swiftwave_service/core/console_token.operations.go +++ /dev/null @@ -1,74 +0,0 @@ -package core - -import ( - "context" - "errors" - "github.com/google/uuid" - "github.com/labstack/gommon/random" - "gorm.io/gorm" - "time" -) - -func GenerateConsoleTokenForServer(db gorm.DB, serverId uint) (*ConsoleToken, error) { - // find server - server, err := FetchServerByID(&db, serverId) - if err != nil { - return nil, errors.New("failed to fetch server") - } - // generate token - record := &ConsoleToken{ - ID: uuid.NewString(), - Target: ConsoleTargetTypeServer, - ServerID: &server.ID, - ExpiresAt: time.Now().Add(time.Minute * 1), - Token: random.String(64), - } - // save record - tx := db.Create(record) - if tx.Error != nil { - return nil, tx.Error - } - return record, nil -} - -func GenerateConsoleTokenForApplication(db gorm.DB, applicationId string, targetServerId uint) (*ConsoleToken, error) { - // find application - application := &Application{} - err := application.FindById(context.TODO(), db, applicationId) - if err != nil { - return nil, errors.New("failed to fetch application") - } - // generate token - record := &ConsoleToken{ - ID: uuid.NewString(), - Target: ConsoleTargetTypeApplication, - ApplicationID: &application.ID, - ServerID: &targetServerId, - ExpiresAt: time.Now().Add(time.Minute * 1), - Token: random.String(64), - } - // save record - tx := db.Create(record) - if tx.Error != nil { - return nil, tx.Error - } - return record, nil -} - -func FindConsoleToken(db gorm.DB, id string, token string) (*ConsoleToken, error) { - // read from DB - record := &ConsoleToken{} - tx := db.First(record, "id = ? AND token = ?", id, token) - if tx.Error != nil { - return nil, tx.Error - } - // delete from DB (defer) - defer func() { - _ = db.Delete(record) - }() - // check if expired - if record.ExpiresAt.Before(time.Now()) { - return nil, errors.New("token expired") - } - return record, nil -} diff --git a/swiftwave_service/core/models.go b/swiftwave_service/core/models.go index b443116fb3..27269126cd 100644 --- a/swiftwave_service/core/models.go +++ b/swiftwave_service/core/models.go @@ -1,29 +1,25 @@ package core import ( + "time" + "github.com/lib/pq" "gorm.io/gorm" - "time" ) // Server hold information about server type Server struct { - ID uint `json:"id" gorm:"primaryKey"` - IP string `json:"ip" gorm:"unique"` - HostName string `json:"host_name"` - User string `json:"user"` - SSHPort int `json:"ssh_port" gorm:"default:22"` - MaintenanceMode bool `json:"maintenance_mode" gorm:"default:false"` - ScheduleDeployments bool `json:"schedule_deployments" gorm:"default:true"` - DockerUnixSocketPath string `json:"docker_unix_socket_path"` - SwarmMode SwarmMode `json:"swarm_mode"` - ProxyConfig ProxyConfig `json:"proxy_config" gorm:"embedded;embeddedPrefix:proxy_"` - Status ServerStatus `json:"status"` - LastPing time.Time `json:"last_ping"` - Logs []ServerLog `json:"logs" gorm:"foreignKey:ServerID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` - ConsoleTokens []ConsoleToken `json:"console_tokens" gorm:"foreignKey:ServerID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` - AnalyticsServiceToken *AnalyticsServiceToken `json:"analytics_service_token" gorm:"foreignKey:ServerID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` - ResourceStats []ServerResourceStat `json:"resource_stats" gorm:"foreignKey:ServerID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + ID uint `json:"id" gorm:"primaryKey"` + Name string `json:"name" gorm:"unique"` + PublicIP string `json:"public_ip" gorm:"not null"` + AgentToken string `json:"agent_token" gorm:"unique"` + WireguardConfig WireguardConfig `json:"wireguard_config" gorm:"embedded;embeddedPrefix:wireguard_"` + ScheduleDeployments bool `json:"schedule_deployments" gorm:"default:true"` + ProxyEnabled bool `json:"proxy_enabled" gorm:"default:false"` + Status ServerStatus `json:"status"` + LastPing time.Time `json:"last_ping"` + Logs []ServerLog `json:"logs" gorm:"foreignKey:ServerID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + ResourceStats []ServerResourceStat `json:"resource_stats" gorm:"foreignKey:ServerID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` } // ServerLog hold logs of server @@ -265,8 +261,6 @@ type Application struct { ResourceLimit ApplicationResourceLimit `json:"resource_limit" gorm:"embedded;embeddedPrefix:resource_limit_"` // Reserved Resource ReservedResource ApplicationReservedResource `json:"reserved_resource" gorm:"embedded;embeddedPrefix:reserved_resource_"` - // ConsoleTokens - ConsoleTokens []ConsoleToken `json:"console_tokens" gorm:"foreignKey:ApplicationID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` // Is deleted - soft delete - will be deleted from database in background IsDeleted bool `json:"is_deleted" gorm:"default:false"` // Webhook token @@ -324,28 +318,6 @@ type DeploymentLog struct { CreatedAt time.Time `json:"created_at"` } -// ConsoleToken hold information about console auth tokens, used in establishing websocket connection -// Note this -// If Target == ConsoleTargetTypeServer, ServerID denote which server to ssh into -// If Target == ConsoleTargetTypeApplication, ApplicationID denote which application to connect to and ServerID denote which server to connect to. -// In case of ConsoleTargetTypeApplication, we will connect to ServerID and try to ssh into the application container -// If ServerID server has no container for the application, we will return error -type ConsoleToken struct { - ID string `json:"id" gorm:"primaryKey"` - Target ConsoleTarget `json:"target_type"` - ServerID *uint `json:"server_id"` - ApplicationID *string `json:"application_id"` - Token string `json:"token" gorm:"unique"` - ExpiresAt time.Time `json:"expires_at"` -} - -type AnalyticsServiceToken struct { - ID string `json:"id" gorm:"primaryKey"` - Token string `json:"token" gorm:"unique"` - ServerID uint `json:"server_id"` - CreatedAt time.Time `json:"created_at"` -} - // ************************************************************************************* // // Server Related Stats // // ************************************************************************************* // diff --git a/swiftwave_service/core/pv.operations.go b/swiftwave_service/core/pv.operations.go index 757da1cf39..cad8fda2d5 100644 --- a/swiftwave_service/core/pv.operations.go +++ b/swiftwave_service/core/pv.operations.go @@ -73,7 +73,7 @@ func (persistentVolume *PersistentVolume) Create(ctx context.Context, db gorm.DB // check if any server is offline for _, server := range servers { if server.Status == ServerOffline { - return fmt.Errorf("server %s is offline", server.IP) + return fmt.Errorf("server %s [%d] is offline", server.Name, server.ID) } } // create docker manager for all servers @@ -84,7 +84,7 @@ func (persistentVolume *PersistentVolume) Create(ctx context.Context, db gorm.DB if err != nil { return err } - dockerManagers[server.IP] = *dockerManager + dockerManagers[server.Name] = *dockerManager } } diff --git a/swiftwave_service/core/server.operations.go b/swiftwave_service/core/server.operations.go index f95efaecb5..73ea69bc44 100644 --- a/swiftwave_service/core/server.operations.go +++ b/swiftwave_service/core/server.operations.go @@ -11,11 +11,29 @@ import ( // CreateServer creates a new server in the database func CreateServer(db *gorm.DB, server *Server) error { - if server.IP == "" { + if server.Name == "" { + return errors.New("name is required") + } + if server.PublicIP == "" { return errors.New("IP is required") } - if server.User == "" { - return errors.New("user is required") + token, err := GenerateToken(32) + if err != nil { + return fmt.Errorf("failed to generate token : %s", err.Error()) + } + server.AgentToken = token + wgPrivateKey, err := GenerateWGPrivateKey() + if err != nil { + return fmt.Errorf("failed to generate wg private key : %s", err.Error()) + } + server.WireguardConfig.PrivateKey = wgPrivateKey + wgPublicKey, err := GenerateWGPublicKey(wgPrivateKey) + if err != nil { + return fmt.Errorf("failed to generate wg public key : %s", err.Error()) + } + server.WireguardConfig = WireguardConfig{ + PrivateKey: wgPrivateKey, + PublicKey: wgPublicKey, } server.LastPing = time.Now() return db.Create(server).Error @@ -27,24 +45,25 @@ func DeleteServer(db *gorm.DB, id uint) error { if err != nil { return err } - var applications []Application - - tx := db.Raw("SELECT name FROM applications WHERE preferred_server_hostnames @> ARRAY[?]", server.HostName).Scan(&applications) - if tx.Error != nil { - return fmt.Errorf("failed to fetch linked apps : %s", tx.Error.Error()) - } - if len(applications) > 0 { - applicationString := "" - for i, application := range applications { - applicationString = applicationString + application.Name - if i != len(applications)-1 { - applicationString = applicationString + ", " - } else { - applicationString = applicationString + " " - } - } - return fmt.Errorf("server is linked to application(s) : %s\nPlease remove this server from preferred servers of the application(s) before deleting the server", applicationString) - } + // TODO handle later + //var applications []Application + // + //tx := db.Raw("SELECT name FROM applications WHERE preferred_server_hostnames @> ARRAY[?]", server.HostName).Scan(&applications) + //if tx.Error != nil { + // return fmt.Errorf("failed to fetch linked apps : %s", tx.Error.Error()) + //} + //if len(applications) > 0 { + // applicationString := "" + // for i, application := range applications { + // applicationString = applicationString + application.Name + // if i != len(applications)-1 { + // applicationString = applicationString + ", " + // } else { + // applicationString = applicationString + " " + // } + // } + // return fmt.Errorf("server is linked to application(s) : %s\nPlease remove this server from preferred servers of the application(s) before deleting the server", applicationString) + //} return db.Delete(server).Error } @@ -110,6 +129,16 @@ func FetchServerByID(db *gorm.DB, id uint) (*Server, error) { return &server, err } +// FetchServerByName fetches a server by its name from the database +func FetchServerByName(db *gorm.DB, name string) (*Server, error) { + var server Server + err := db.Where("name = ?", name).First(&server).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, errors.New("server not found") + } + return &server, err +} + // FetchServerByIP fetches a server by its IP from the database func FetchServerByIP(db *gorm.DB, ip string) (*Server, error) { var server Server @@ -134,24 +163,6 @@ func FetchAllOnlineServers(db *gorm.DB) ([]Server, error) { return servers, err } -// FetchSwarmManager fetches the swarm manager from the database -func FetchSwarmManager(db *gorm.DB) (Server, error) { - var server Server - // The reason behind using Order("RANDOM()") is - // if any swarm manager is down, the next one will be used - // so remove the possibility of complete failure - err := db.Where("status = ?", ServerOnline).Where("swarm_mode = ?", SwarmManager).Order("RANDOM()").First(&server).Error - return server, err -} - -// FetchSwarmManagerExceptServer fetches the swarm manager from the database except the given server -func FetchSwarmManagerExceptServer(db *gorm.DB, serverId uint) (Server, error) { - var swarmManager Server - err := db.Where("status = ?", ServerOnline).Where("swarm_mode = ?", SwarmManager).Where("id != ?", serverId).Order("RANDOM()").First(&swarmManager).Error - return swarmManager, err - -} - // FetchProxyActiveServers fetches all active servers from the database func FetchProxyActiveServers(db *gorm.DB) ([]Server, error) { isAnyActiveProxyServerOffline, err := IsAnyActiveProxyServerOffline(db) @@ -168,30 +179,37 @@ func FetchProxyActiveServers(db *gorm.DB) ([]Server, error) { return nil, errors.New("all proxy servers need to be online to perform this action") } var servers []Server - err = db.Where("status = ?", ServerOnline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", ActiveProxy).Find(&servers).Error + //TODO fix this + // err = db.Where("status = ?", ServerOnline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", ActiveProxy).Find(&servers).Error return servers, err } // IsAnyActiveProxyServerOffline checks if any active proxy server is offline func IsAnyActiveProxyServerOffline(db *gorm.DB) (bool, error) { - var count int64 - err := db.Model(&Server{}).Where("status = ?", ServerOffline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", ActiveProxy).Count(&count).Error - return count > 0, err + //TODO fix this + // var count int64 + // err := db.Model(&Server{}).Where("status = ?", ServerOffline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", ActiveProxy).Count(&count).Error + // return count > 0, err + return false, nil } // FetchRandomActiveProxyServer fetches a random active server from the database func FetchRandomActiveProxyServer(db *gorm.DB) (Server, error) { - var server Server - err := db.Where("status = ?", ServerOnline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", ActiveProxy).Order("RANDOM()").First(&server).Error - return server, err + //TODO fix this + // var server Server + // err := db.Where("status = ?", ServerOnline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", ActiveProxy).Order("RANDOM()").First(&server).Error + // return server, err + return Server{}, nil } // FetchBackupProxyServers fetches all backup servers from the database func FetchBackupProxyServers(db *gorm.DB) ([]Server, error) { - var servers []Server - err := db.Where("status = ?", ServerOnline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", BackupProxy).Find(&servers).Error - return servers, err + //TODO fix this + // var servers []Server + // err := db.Where("status = ?", ServerOnline).Where("proxy_enabled = ?", true).Where("proxy_type = ?", BackupProxy).Find(&servers).Error + // return servers, err + return nil, nil } // FetchAllProxyServers fetches all proxy servers from the database @@ -217,22 +235,3 @@ func MarkServerAsOnline(db *gorm.DB, server *Server) error { func MarkServerAsOffline(db *gorm.DB, server *Server) error { return db.Model(server).Update("status", ServerOffline).Error } - -// ChangeProxyType changes the proxy type of server in the database -func ChangeProxyType(db *gorm.DB, server *Server, proxyType ProxyType) error { - return db.Model(server).Update("proxy_type", proxyType).Error -} - -// FetchDisabledDeploymentServerHostNames fetches the hostnames of all servers that are not in deployment mode -func FetchDisabledDeploymentServerHostNames(db *gorm.DB) ([]string, error) { - var disabledServers []Server - err := db.Where("schedule_deployments = ?", false).Select("host_name").Distinct("host_name").Find(&disabledServers).Error - if err != nil { - return nil, err - } - var hostNames []string - for _, server := range disabledServers { - hostNames = append(hostNames, server.HostName) - } - return hostNames, nil -} diff --git a/swiftwave_service/core/types.go b/swiftwave_service/core/types.go index 7bd63513e3..8c7bec9eaa 100644 --- a/swiftwave_service/core/types.go +++ b/swiftwave_service/core/types.go @@ -30,27 +30,16 @@ const ( ServerOffline ServerStatus = "offline" ) -// SwarmMode : mode of the swarm -type SwarmMode string - -const ( - SwarmManager SwarmMode = "manager" - SwarmWorker SwarmMode = "worker" -) - -// ProxyType : type of the proxy -type ProxyType string - -const ( - BackupProxy ProxyType = "backup" - ActiveProxy ProxyType = "active" -) +// ************************************************************************************* // +// Wireguard Configuration // +// ************************************************************************************* // -// ProxyConfig : hold information about proxy configuration -type ProxyConfig struct { - Enabled bool `json:"enabled" gorm:"default:false"` - SetupRunning bool `json:"setup_running" gorm:"default:false"` // just to show warning to user, that's it - Type ProxyType `json:"type" gorm:"default:'active'"` +// WireguardConfig represents the configuration structure for a WireGuard VPN connection. +type WireguardConfig struct { + PublicKey string `json:"public_key"` + PrivateKey string `json:"private_key"` + IP string `json:"ip"` + Port int `json:"port"` } // ************************************************************************************* // @@ -279,14 +268,6 @@ var FedoraDependenciesInstallCommands = map[string]string{ "docker": "curl -fsSL get.docker.com | sh -", } -// ConsoleTarget : type of console target -type ConsoleTarget string - -const ( - ConsoleTargetTypeServer ConsoleTarget = "server" - ConsoleTargetTypeApplication ConsoleTarget = "application" -) - // ************************************************************************************* // // Server Related Stats // // ************************************************************************************* // diff --git a/swiftwave_service/core/utils.go b/swiftwave_service/core/utils.go index 83257ca151..78686de9c8 100644 --- a/swiftwave_service/core/utils.go +++ b/swiftwave_service/core/utils.go @@ -1,12 +1,16 @@ package core import ( + "crypto/rand" + "encoding/hex" "errors" - "github.com/golang-jwt/jwt/v5" - "golang.org/x/crypto/bcrypt" "regexp" "strings" "time" + + "github.com/golang-jwt/jwt/v5" + "golang.org/x/crypto/bcrypt" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) // SetPassword : set password for user @@ -58,7 +62,7 @@ func (domain *Domain) IsIPv4() bool { // IsLocalhost check if the domain is localhost func (server *Server) IsLocalhost() bool { // if `localhost` or `127.0.0.1` or `0.0.0.0` - return server.IP == "localhost" || server.IP == "127.0.0.1" || server.IP == "0.0.0.0" + return server.PublicIP == "localhost" || server.PublicIP == "127.0.0.1" || server.PublicIP == "0.0.0.0" } func (d *DockerProxyConfig) Equal(other *DockerProxyConfig) bool { @@ -101,3 +105,28 @@ func (c *ApplicationCustomHealthCheck) Equal(other *ApplicationCustomHealthCheck func (application *Application) DockerProxyServiceName() string { return application.ID + "-dp" } + +func GenerateToken(n int) (string, error) { + bytes := make([]byte, n) + _, err := rand.Read(bytes) + if err != nil { + return "", err + } + return hex.EncodeToString(bytes), nil +} + +func GenerateWGPrivateKey() (string, error) { + key, err := wgtypes.GeneratePrivateKey() + if err != nil { + return "", err + } + return key.String(), nil +} + +func GenerateWGPublicKey(privateKey string) (string, error) { + key, err := wgtypes.ParseKey(privateKey) + if err != nil { + return "", err + } + return key.PublicKey().String(), nil +} diff --git a/swiftwave_service/cronjob/server_status_monitor.go b/swiftwave_service/cronjob/server_status_monitor.go index f0aa601da8..11f50a635d 100644 --- a/swiftwave_service/cronjob/server_status_monitor.go +++ b/swiftwave_service/cronjob/server_status_monitor.go @@ -1,12 +1,9 @@ package cronjob import ( - "bytes" - "strings" "sync" "time" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" ) @@ -48,52 +45,54 @@ func (m Manager) monitorServerStatus() { } func (m Manager) checkAndUpdateServerStatus(server core.Server) { - if m.isServerOnline(server) { - if server.Status != core.ServerOnline { - err := core.MarkServerAsOnline(&m.ServiceManager.DbClient, &server) - if err != nil { - logger.CronJobLoggerError.Println("DB Error : Failed to mark server as online >", server.HostName, err) - } else { - logger.CronJobLogger.Println("Server marked as online >", server.HostName) - } - } - } else { - if server.Status != core.ServerOffline { - err := core.MarkServerAsOffline(&m.ServiceManager.DbClient, &server) - if err != nil { - logger.CronJobLoggerError.Println("DB Error : Failed to mark server as offline >", server.HostName, err) - } else { - logger.CronJobLogger.Println("Server marked as offline >", server.HostName) - } - } else { - logger.CronJobLogger.Println("Server already offline >", server.HostName) - } - } + // TODO fix + //if m.isServerOnline(server) { + // if server.Status != core.ServerOnline { + // err := core.MarkServerAsOnline(&m.ServiceManager.DbClient, &server) + // if err != nil { + // logger.CronJobLoggerError.Println("DB Error : Failed to mark server as online >", server.HostName, err) + // } else { + // logger.CronJobLogger.Println("Server marked as online >", server.HostName) + // } + // } + //} else { + // if server.Status != core.ServerOffline { + // err := core.MarkServerAsOffline(&m.ServiceManager.DbClient, &server) + // if err != nil { + // logger.CronJobLoggerError.Println("DB Error : Failed to mark server as offline >", server.HostName, err) + // } else { + // logger.CronJobLogger.Println("Server marked as offline >", server.HostName) + // } + // } else { + // logger.CronJobLogger.Println("Server already offline >", server.HostName) + // } + //} } func (m Manager) isServerOnline(server core.Server) bool { - retries := 3 // try for 3 times before giving up - if server.Status == core.ServerOffline { - /** - * If server is offline, try only once - * Else, it will take total 30 seconds (3 retries * 10 seconds of default SSH timeout) - */ - retries = 1 - } - // try for 3 times - for i := 0; i < retries; i++ { - cmd := "echo ok" - stdoutBuf := new(bytes.Buffer) - stderrBuf := new(bytes.Buffer) - err := ssh_toolkit.ExecCommandOverSSHWithOptions(cmd, stdoutBuf, stderrBuf, 3, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey, false) - if err != nil { - logger.CronJobLoggerError.Println("Error while checking if server is online", server.HostName, err.Error()) - time.Sleep(1 * time.Second) - continue - } - if strings.Compare(strings.TrimSpace(stdoutBuf.String()), "ok") == 0 { - return true - } - } + // TODO fix + //retries := 3 // try for 3 times before giving up + //if server.Status == core.ServerOffline { + // /** + // * If server is offline, try only once + // * Else, it will take total 30 seconds (3 retries * 10 seconds of default SSH timeout) + // */ + // retries = 1 + //} + //// try for 3 times + //for i := 0; i < retries; i++ { + // cmd := "echo ok" + // stdoutBuf := new(bytes.Buffer) + // stderrBuf := new(bytes.Buffer) + // err := ssh_toolkit.ExecCommandOverSSHWithOptions(cmd, stdoutBuf, stderrBuf, 3, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey, false) + // if err != nil { + // logger.CronJobLoggerError.Println("Error while checking if server is online", server.HostName, err.Error()) + // time.Sleep(1 * time.Second) + // continue + // } + // if strings.Compare(strings.TrimSpace(stdoutBuf.String()), "ok") == 0 { + // return true + // } + //} return false } diff --git a/swiftwave_service/cronjob/sync_backup_proxy_server.go b/swiftwave_service/cronjob/sync_backup_proxy_server.go index a8582c3ce5..aa35822f9e 100644 --- a/swiftwave_service/cronjob/sync_backup_proxy_server.go +++ b/swiftwave_service/cronjob/sync_backup_proxy_server.go @@ -1,12 +1,8 @@ package cronjob import ( - "context" "time" - containermanger "github.com/swiftwave-org/swiftwave/pkg/container_manager" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" ) @@ -19,85 +15,86 @@ func (m Manager) SyncBackupProxyServer() { } func (m Manager) syncBackupProxyServer() { - // Pick any active proxy server - activeProxyServer, err := core.FetchRandomActiveProxyServer(&m.ServiceManager.DbClient) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch random active proxy server", err.Error()) - return - } - // copy haproxy config to local server - err = ssh_toolkit.CopyFolderFromRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, activeProxyServer.IP, activeProxyServer.SSHPort, activeProxyServer.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("Failed to copy haproxy config from remote server", err.Error()) - return - } else { - logger.CronJobLogger.Println("Copied haproxy config from remote server", activeProxyServer.HostName) - } - // copy udpproxy config to local server - err = ssh_toolkit.CopyFolderFromRemoteServer(m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, activeProxyServer.IP, activeProxyServer.SSHPort, activeProxyServer.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("Failed to copy udpproxy config from remote server", err.Error()) - return - } else { - logger.CronJobLogger.Println("Copied udpproxy config from remote server", activeProxyServer.HostName) - } - // fetch all backup proxy servers - backupServers, err := core.FetchBackupProxyServers(&m.ServiceManager.DbClient) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch backup proxy servers", err.Error()) - return - } - // copy haproxy config to all backup proxy servers - for _, backupServer := range backupServers { - err = ssh_toolkit.CopyFolderToRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, backupServer.IP, backupServer.SSHPort, backupServer.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("Failed to copy haproxy config to remote server", backupServer.HostName, "\n", err.Error()) - } else { - logger.CronJobLogger.Println("Copied haproxy config to remote server", backupServer.HostName) - } - } - // copy udpproxy config to all backup proxy servers - for _, backupServer := range backupServers { - err = ssh_toolkit.CopyFolderToRemoteServer(m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, backupServer.IP, backupServer.SSHPort, backupServer.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("Failed to copy udpproxy config to remote server", backupServer.HostName, "\n", err.Error()) - } else { - logger.CronJobLogger.Println("Copied udpproxy config to remote server", backupServer.HostName) - } - } - - // reload proxies on backup server - for _, server := range backupServers { - // open ssh connection to backup proxy server for docker - conn, err := ssh_toolkit.NetConnOverSSH("unix", server.DockerUnixSocketPath, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("Failed to open ssh connection to backup proxy server", server.HostName, "\n", err.Error()) - continue - } - dockerManager, err := containermanger.New(context.Background(), conn) - if err != nil { - logger.CronJobLoggerError.Println("Failed to create docker manager for backup proxy server", server.HostName, "\n", err.Error()) - continue - } - // remove udpproxy containers from all backup proxy servers, to trigger reload - err = dockerManager.RemoveServiceContainers(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) - if err != nil { - logger.CronJobLoggerError.Println("Failed to remove udpproxy containers from backup proxy server", server.HostName, "\n", err.Error()) - } else { - logger.CronJobLogger.Println("Removed udpproxy containers from backup proxy server", server.HostName, " for a force reload") - } - // reload haproxy on backup proxy serverskill -SIGUSR2 1 - err = dockerManager.RunCommandInServiceContainers(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName, []string{"kill", "-SIGUSR2", "1"}) - if err != nil { - logger.CronJobLoggerError.Println("Failed to reload haproxy on backup proxy server", server.HostName, "\n", err.Error()) - } else { - logger.CronJobLogger.Println("Reloaded haproxy on backup proxy server", server.HostName) - } - err = conn.Close() - if err != nil { - logger.CronJobLoggerError.Println("Failed to close ssh connection to backup proxy server", server.HostName, "\n", err.Error()) - } else { - logger.CronJobLogger.Println("Closed ssh connection to backup proxy server", server.HostName) - } - } + // TODO fix + //// Pick any active proxy server + //activeProxyServer, err := core.FetchRandomActiveProxyServer(&m.ServiceManager.DbClient) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch random active proxy server", err.Error()) + // return + //} + //// copy haproxy config to local server + //err = ssh_toolkit.CopyFolderFromRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, activeProxyServer.IP, activeProxyServer.SSHPort, activeProxyServer.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to copy haproxy config from remote server", err.Error()) + // return + //} else { + // logger.CronJobLogger.Println("Copied haproxy config from remote server", activeProxyServer.HostName) + //} + //// copy udpproxy config to local server + //err = ssh_toolkit.CopyFolderFromRemoteServer(m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, activeProxyServer.IP, activeProxyServer.SSHPort, activeProxyServer.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to copy udpproxy config from remote server", err.Error()) + // return + //} else { + // logger.CronJobLogger.Println("Copied udpproxy config from remote server", activeProxyServer.HostName) + //} + //// fetch all backup proxy servers + //backupServers, err := core.FetchBackupProxyServers(&m.ServiceManager.DbClient) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch backup proxy servers", err.Error()) + // return + //} + //// copy haproxy config to all backup proxy servers + //for _, backupServer := range backupServers { + // err = ssh_toolkit.CopyFolderToRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, backupServer.IP, backupServer.SSHPort, backupServer.User, m.Config.SystemConfig.SshPrivateKey) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to copy haproxy config to remote server", backupServer.HostName, "\n", err.Error()) + // } else { + // logger.CronJobLogger.Println("Copied haproxy config to remote server", backupServer.HostName) + // } + //} + //// copy udpproxy config to all backup proxy servers + //for _, backupServer := range backupServers { + // err = ssh_toolkit.CopyFolderToRemoteServer(m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, backupServer.IP, backupServer.SSHPort, backupServer.User, m.Config.SystemConfig.SshPrivateKey) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to copy udpproxy config to remote server", backupServer.HostName, "\n", err.Error()) + // } else { + // logger.CronJobLogger.Println("Copied udpproxy config to remote server", backupServer.HostName) + // } + //} + // + //// reload proxies on backup server + //for _, server := range backupServers { + // // open ssh connection to backup proxy server for docker + // conn, err := ssh_toolkit.NetConnOverSSH("unix", server.DockerUnixSocketPath, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to open ssh connection to backup proxy server", server.HostName, "\n", err.Error()) + // continue + // } + // dockerManager, err := containermanger.New(context.Background(), conn) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to create docker manager for backup proxy server", server.HostName, "\n", err.Error()) + // continue + // } + // // remove udpproxy containers from all backup proxy servers, to trigger reload + // err = dockerManager.RemoveServiceContainers(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to remove udpproxy containers from backup proxy server", server.HostName, "\n", err.Error()) + // } else { + // logger.CronJobLogger.Println("Removed udpproxy containers from backup proxy server", server.HostName, " for a force reload") + // } + // // reload haproxy on backup proxy serverskill -SIGUSR2 1 + // err = dockerManager.RunCommandInServiceContainers(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName, []string{"kill", "-SIGUSR2", "1"}) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to reload haproxy on backup proxy server", server.HostName, "\n", err.Error()) + // } else { + // logger.CronJobLogger.Println("Reloaded haproxy on backup proxy server", server.HostName) + // } + // err = conn.Close() + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to close ssh connection to backup proxy server", server.HostName, "\n", err.Error()) + // } else { + // logger.CronJobLogger.Println("Closed ssh connection to backup proxy server", server.HostName) + // } + //} } diff --git a/swiftwave_service/cronjob/sync_proxy_state.go b/swiftwave_service/cronjob/sync_proxy_state.go index 3a0944a075..4cb86a6443 100644 --- a/swiftwave_service/cronjob/sync_proxy_state.go +++ b/swiftwave_service/cronjob/sync_proxy_state.go @@ -1,15 +1,10 @@ package cronjob import ( - "context" - "fmt" "strings" "time" "github.com/docker/docker/api/types/swarm" - containermanger "github.com/swiftwave-org/swiftwave/pkg/container_manager" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" ) @@ -22,239 +17,240 @@ func (m Manager) SyncProxy() { } func (m Manager) syncProxy() { - // create context - ctx := context.Background() - // fetch all servers hostnames - servers, err := core.FetchAllServers(&m.ServiceManager.DbClient) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch all proxy servers", err.Error()) - return - } - - // fetch a swarm manager - swarmManager, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch swarm manager", err.Error()) - return - } - // create conn over ssh - conn, err := ssh_toolkit.NetConnOverSSH("unix", swarmManager.DockerUnixSocketPath, 5, swarmManager.IP, swarmManager.SSHPort, "root", m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("Failed to create conn over ssh", err.Error()) - return - } - defer func() { - err := conn.Close() - if err != nil { - logger.CronJobLoggerError.Println("Failed to close conn", err.Error()) - } - }() - // create docker client - dockerClient, err := containermanger.New(ctx, conn) - if err != nil { - logger.CronJobLoggerError.Println("Failed to create docker client", err.Error()) - return - } - if len(servers) == 0 { - // delete haproxy and udpproxy services - err = dockerClient.RemoveService(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName) - if err != nil { - logger.CronJobLoggerError.Println("Failed to remove haproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Removed haproxy service") - } - err = dockerClient.RemoveService(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) - if err != nil { - logger.CronJobLoggerError.Println("Failed to remove udpproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Removed udpproxy service") - } - return - } - // prepare placement constraints - var placementConstraints []string - for _, proxyServer := range servers { - if !proxyServer.ProxyConfig.Enabled { - placementConstraints = append(placementConstraints, "node.hostname!="+proxyServer.HostName) - } - } - // haproxy - haProxyEnvironmentVariables := map[string]string{ - "ADMIN_USERNAME": m.Config.SystemConfig.HAProxyConfig.Username, - "ADMIN_PASSWORD": m.Config.SystemConfig.HAProxyConfig.Password, - "SWIFTWAVE_SERVICE_ENDPOINT": fmt.Sprintf("%s:%d", m.Config.LocalConfig.ManagementNodeAddressConsideringTunnelling(), m.Config.LocalConfig.ManagementNodePortConsideringTunnelling()), - "SWIFTWAVE_SERVICE_ADDRESS": m.Config.LocalConfig.ManagementNodeAddressConsideringTunnelling(), - } - // Try to fetch info about haproxy service - haproxyService, err := dockerClient.GetService(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName) - if err != nil { - // create haproxy service - err = dockerClient.CreateService(containermanger.Service{ - Name: m.Config.LocalConfig.ServiceConfig.HAProxyServiceName, - Image: m.Config.SystemConfig.HAProxyConfig.Image, - DeploymentMode: containermanger.DeploymentModeGlobal, - PlacementConstraints: placementConstraints, - Env: haProxyEnvironmentVariables, - Networks: []string{m.Config.SystemConfig.NetworkName}, - VolumeBinds: []containermanger.VolumeBind{ - { - Source: m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, - Target: "/etc/haproxy", - }, - { - Source: m.Config.LocalConfig.ServiceConfig.HAProxyUnixSocketDirectory, - Target: "/home", - }, - }, - }, "", "", true) - if err != nil { - logger.CronJobLoggerError.Println("Failed to create haproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Created haproxy service") - } - } else { - // check if env variables, image or placement constraints have changed - if !isSameMap(haproxyService.Env, haProxyEnvironmentVariables) || strings.Compare(getImageNameFromImageWithSHA(haproxyService.Image), m.Config.SystemConfig.HAProxyConfig.Image) != 0 || !isListSame(haproxyService.PlacementConstraints, placementConstraints) { - logger.CronJobLogger.Println("Updating haproxy service") - // update haproxy service - haproxyService.Env = haProxyEnvironmentVariables - haproxyService.Image = m.Config.SystemConfig.HAProxyConfig.Image - haproxyService.PlacementConstraints = placementConstraints - err = dockerClient.UpdateService(haproxyService, "", "", true) - if err != nil { - logger.CronJobLoggerError.Println("Failed to update haproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Updated haproxy service") - } - } else { - logger.CronJobLogger.Println("No change in haproxy service") - } - } - // udp proxy - udpProxyEnvironmentVariables := map[string]string{ - "SWIFTWAVE_SERVICE_ENDPOINT": fmt.Sprintf("%s:%d", m.Config.LocalConfig.ManagementNodeAddressConsideringTunnelling(), m.Config.LocalConfig.ManagementNodePortConsideringTunnelling()), - } - // Try to fetch info about udpproxy service - udpproxyService, err := dockerClient.GetService(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) - if err != nil { - // create udpproxy service - err = dockerClient.CreateService(containermanger.Service{ - Name: m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName, - Image: m.Config.SystemConfig.UDPProxyConfig.Image, - DeploymentMode: containermanger.DeploymentModeGlobal, - PlacementConstraints: placementConstraints, - Env: udpProxyEnvironmentVariables, - Networks: []string{m.Config.SystemConfig.NetworkName}, - VolumeBinds: []containermanger.VolumeBind{ - { - Source: m.Config.LocalConfig.ServiceConfig.UDPProxyUnixSocketDirectory, - Target: "/etc/udpproxy", - }, - { - Source: m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, - Target: "/var/lib/udpproxy", - }, - }, - }, "", "", true) - if err != nil { - logger.CronJobLoggerError.Println("Failed to create udpproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Created udpproxy service") - } - } else { - // check if env variables, image or placement constraints have changed - if !isSameMap(udpproxyService.Env, udpProxyEnvironmentVariables) || strings.Compare(getImageNameFromImageWithSHA(udpproxyService.Image), m.Config.SystemConfig.UDPProxyConfig.Image) != 0 || !isListSame(udpproxyService.PlacementConstraints, placementConstraints) { - // update udpproxy service - udpproxyService.Env = udpProxyEnvironmentVariables - udpproxyService.Image = m.Config.SystemConfig.UDPProxyConfig.Image - udpproxyService.PlacementConstraints = placementConstraints - err = dockerClient.UpdateService(udpproxyService, "", "", true) - if err != nil { - logger.CronJobLoggerError.Println("Failed to update udpproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Updated udpproxy service") - } - } else { - logger.CronJobLogger.Println("No change in udpproxy service") - } - } - - // PORT EXPOSER - - // fetch all exposed tcp ports - tcpPorts, err := core.FetchAllExposedTCPPorts(ctx, m.ServiceManager.DbClient) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch all exposed tcp ports", err.Error()) - return - } - // add port 80 and 443 - tcpPorts = append(tcpPorts, 80, 443) - tcpPorts = removeDuplicatesInt(tcpPorts) - tcpPortsRule := make([]swarm.PortConfig, 0) - for _, port := range tcpPorts { - tcpPortsRule = append(tcpPortsRule, swarm.PortConfig{ - Protocol: swarm.PortConfigProtocolTCP, - PublishMode: swarm.PortConfigPublishModeHost, - TargetPort: uint32(port), - PublishedPort: uint32(port), - }) - } - // fetch all exposed udp ports - udpPorts, err := core.FetchAllExposedUDPPorts(ctx, m.ServiceManager.DbClient) - udpPorts = removeDuplicatesInt(udpPorts) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch all exposed udp ports", err.Error()) - return - } - udpPortsRule := make([]swarm.PortConfig, 0) - for _, port := range udpPorts { - udpPortsRule = append(udpPortsRule, swarm.PortConfig{ - Protocol: swarm.PortConfigProtocolUDP, - PublishMode: swarm.PortConfigPublishModeHost, - TargetPort: uint32(port), - PublishedPort: uint32(port), - }) - } - - // fetch exposed tcp ports of haproxy service - existingTcpPortRules, err := dockerClient.FetchPublishedPortRules(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch exposed tcp ports of haproxy service", err.Error()) - return - } else { - // check if exposed tcp ports are changed - if !isPortListSame(existingTcpPortRules, tcpPortsRule) { - // update exposed tcp ports - err = dockerClient.UpdatePublishedHostPorts(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName, tcpPortsRule) - if err != nil { - logger.CronJobLoggerError.Println("Failed to update exposed tcp ports of haproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Updated exposed tcp ports of haproxy service") - } - } else { - logger.CronJobLogger.Println("No change in exposed tcp ports of haproxy service") - } - } - - // fetch exposed udp ports of udpproxy service - existingUdpPortRules, err := dockerClient.FetchPublishedPortRules(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) - if err != nil { - logger.CronJobLoggerError.Println("Failed to fetch exposed udp ports of udpproxy service", err.Error()) - return - } else { - // check if exposed udp ports are changed - if !isPortListSame(existingUdpPortRules, udpPortsRule) { - // update exposed udp ports - err = dockerClient.UpdatePublishedHostPorts(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName, udpPortsRule) - if err != nil { - logger.CronJobLoggerError.Println("Failed to update exposed udp ports of udpproxy service", err.Error()) - } else { - logger.CronJobLogger.Println("Updated exposed udp ports of udpproxy service") - } - } else { - logger.CronJobLogger.Println("No change in exposed udp ports of udpproxy service") - } - } + // TODO fix + //// create context + //ctx := context.Background() + //// fetch all servers hostnames + //servers, err := core.FetchAllServers(&m.ServiceManager.DbClient) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch all proxy servers", err.Error()) + // return + //} + // + //// fetch a swarm manager + //swarmManager, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch swarm manager", err.Error()) + // return + //} + //// create conn over ssh + //conn, err := ssh_toolkit.NetConnOverSSH("unix", swarmManager.DockerUnixSocketPath, 5, swarmManager.IP, swarmManager.SSHPort, "root", m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to create conn over ssh", err.Error()) + // return + //} + //defer func() { + // err := conn.Close() + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to close conn", err.Error()) + // } + //}() + //// create docker client + //dockerClient, err := containermanger.New(ctx, conn) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to create docker client", err.Error()) + // return + //} + //if len(servers) == 0 { + // // delete haproxy and udpproxy services + // err = dockerClient.RemoveService(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to remove haproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Removed haproxy service") + // } + // err = dockerClient.RemoveService(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to remove udpproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Removed udpproxy service") + // } + // return + //} + //// prepare placement constraints + //var placementConstraints []string + //for _, proxyServer := range servers { + // if !proxyServer.ProxyConfig.Enabled { + // placementConstraints = append(placementConstraints, "node.hostname!="+proxyServer.HostName) + // } + //} + //// haproxy + //haProxyEnvironmentVariables := map[string]string{ + // "ADMIN_USERNAME": m.Config.SystemConfig.HAProxyConfig.Username, + // "ADMIN_PASSWORD": m.Config.SystemConfig.HAProxyConfig.Password, + // "SWIFTWAVE_SERVICE_ENDPOINT": fmt.Sprintf("%s:%d", m.Config.LocalConfig.ManagementNodeAddressConsideringTunnelling(), m.Config.LocalConfig.ManagementNodePortConsideringTunnelling()), + // "SWIFTWAVE_SERVICE_ADDRESS": m.Config.LocalConfig.ManagementNodeAddressConsideringTunnelling(), + //} + //// Try to fetch info about haproxy service + //haproxyService, err := dockerClient.GetService(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName) + //if err != nil { + // // create haproxy service + // err = dockerClient.CreateService(containermanger.Service{ + // Name: m.Config.LocalConfig.ServiceConfig.HAProxyServiceName, + // Image: m.Config.SystemConfig.HAProxyConfig.Image, + // DeploymentMode: containermanger.DeploymentModeGlobal, + // PlacementConstraints: placementConstraints, + // Env: haProxyEnvironmentVariables, + // Networks: []string{m.Config.SystemConfig.NetworkName}, + // VolumeBinds: []containermanger.VolumeBind{ + // { + // Source: m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, + // Target: "/etc/haproxy", + // }, + // { + // Source: m.Config.LocalConfig.ServiceConfig.HAProxyUnixSocketDirectory, + // Target: "/home", + // }, + // }, + // }, "", "", true) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to create haproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Created haproxy service") + // } + //} else { + // // check if env variables, image or placement constraints have changed + // if !isSameMap(haproxyService.Env, haProxyEnvironmentVariables) || strings.Compare(getImageNameFromImageWithSHA(haproxyService.Image), m.Config.SystemConfig.HAProxyConfig.Image) != 0 || !isListSame(haproxyService.PlacementConstraints, placementConstraints) { + // logger.CronJobLogger.Println("Updating haproxy service") + // // update haproxy service + // haproxyService.Env = haProxyEnvironmentVariables + // haproxyService.Image = m.Config.SystemConfig.HAProxyConfig.Image + // haproxyService.PlacementConstraints = placementConstraints + // err = dockerClient.UpdateService(haproxyService, "", "", true) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to update haproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Updated haproxy service") + // } + // } else { + // logger.CronJobLogger.Println("No change in haproxy service") + // } + //} + //// udp proxy + //udpProxyEnvironmentVariables := map[string]string{ + // "SWIFTWAVE_SERVICE_ENDPOINT": fmt.Sprintf("%s:%d", m.Config.LocalConfig.ManagementNodeAddressConsideringTunnelling(), m.Config.LocalConfig.ManagementNodePortConsideringTunnelling()), + //} + //// Try to fetch info about udpproxy service + //udpproxyService, err := dockerClient.GetService(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) + //if err != nil { + // // create udpproxy service + // err = dockerClient.CreateService(containermanger.Service{ + // Name: m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName, + // Image: m.Config.SystemConfig.UDPProxyConfig.Image, + // DeploymentMode: containermanger.DeploymentModeGlobal, + // PlacementConstraints: placementConstraints, + // Env: udpProxyEnvironmentVariables, + // Networks: []string{m.Config.SystemConfig.NetworkName}, + // VolumeBinds: []containermanger.VolumeBind{ + // { + // Source: m.Config.LocalConfig.ServiceConfig.UDPProxyUnixSocketDirectory, + // Target: "/etc/udpproxy", + // }, + // { + // Source: m.Config.LocalConfig.ServiceConfig.UDPProxyDataDirectoryPath, + // Target: "/var/lib/udpproxy", + // }, + // }, + // }, "", "", true) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to create udpproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Created udpproxy service") + // } + //} else { + // // check if env variables, image or placement constraints have changed + // if !isSameMap(udpproxyService.Env, udpProxyEnvironmentVariables) || strings.Compare(getImageNameFromImageWithSHA(udpproxyService.Image), m.Config.SystemConfig.UDPProxyConfig.Image) != 0 || !isListSame(udpproxyService.PlacementConstraints, placementConstraints) { + // // update udpproxy service + // udpproxyService.Env = udpProxyEnvironmentVariables + // udpproxyService.Image = m.Config.SystemConfig.UDPProxyConfig.Image + // udpproxyService.PlacementConstraints = placementConstraints + // err = dockerClient.UpdateService(udpproxyService, "", "", true) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to update udpproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Updated udpproxy service") + // } + // } else { + // logger.CronJobLogger.Println("No change in udpproxy service") + // } + //} + // + //// PORT EXPOSER + // + //// fetch all exposed tcp ports + //tcpPorts, err := core.FetchAllExposedTCPPorts(ctx, m.ServiceManager.DbClient) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch all exposed tcp ports", err.Error()) + // return + //} + //// add port 80 and 443 + //tcpPorts = append(tcpPorts, 80, 443) + //tcpPorts = removeDuplicatesInt(tcpPorts) + //tcpPortsRule := make([]swarm.PortConfig, 0) + //for _, port := range tcpPorts { + // tcpPortsRule = append(tcpPortsRule, swarm.PortConfig{ + // Protocol: swarm.PortConfigProtocolTCP, + // PublishMode: swarm.PortConfigPublishModeHost, + // TargetPort: uint32(port), + // PublishedPort: uint32(port), + // }) + //} + //// fetch all exposed udp ports + //udpPorts, err := core.FetchAllExposedUDPPorts(ctx, m.ServiceManager.DbClient) + //udpPorts = removeDuplicatesInt(udpPorts) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch all exposed udp ports", err.Error()) + // return + //} + //udpPortsRule := make([]swarm.PortConfig, 0) + //for _, port := range udpPorts { + // udpPortsRule = append(udpPortsRule, swarm.PortConfig{ + // Protocol: swarm.PortConfigProtocolUDP, + // PublishMode: swarm.PortConfigPublishModeHost, + // TargetPort: uint32(port), + // PublishedPort: uint32(port), + // }) + //} + // + //// fetch exposed tcp ports of haproxy service + //existingTcpPortRules, err := dockerClient.FetchPublishedPortRules(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch exposed tcp ports of haproxy service", err.Error()) + // return + //} else { + // // check if exposed tcp ports are changed + // if !isPortListSame(existingTcpPortRules, tcpPortsRule) { + // // update exposed tcp ports + // err = dockerClient.UpdatePublishedHostPorts(m.Config.LocalConfig.ServiceConfig.HAProxyServiceName, tcpPortsRule) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to update exposed tcp ports of haproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Updated exposed tcp ports of haproxy service") + // } + // } else { + // logger.CronJobLogger.Println("No change in exposed tcp ports of haproxy service") + // } + //} + // + //// fetch exposed udp ports of udpproxy service + //existingUdpPortRules, err := dockerClient.FetchPublishedPortRules(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName) + //if err != nil { + // logger.CronJobLoggerError.Println("Failed to fetch exposed udp ports of udpproxy service", err.Error()) + // return + //} else { + // // check if exposed udp ports are changed + // if !isPortListSame(existingUdpPortRules, udpPortsRule) { + // // update exposed udp ports + // err = dockerClient.UpdatePublishedHostPorts(m.Config.LocalConfig.ServiceConfig.UDPProxyServiceName, udpPortsRule) + // if err != nil { + // logger.CronJobLoggerError.Println("Failed to update exposed udp ports of udpproxy service", err.Error()) + // } else { + // logger.CronJobLogger.Println("Updated exposed udp ports of udpproxy service") + // } + // } else { + // logger.CronJobLogger.Println("No change in exposed udp ports of udpproxy service") + // } + //} } diff --git a/swiftwave_service/db_models_loader/main.go b/swiftwave_service/db_models_loader/main.go index dcaa5a9ca3..44af9fcb0e 100644 --- a/swiftwave_service/db_models_loader/main.go +++ b/swiftwave_service/db_models_loader/main.go @@ -35,8 +35,6 @@ func main() { &SSL.KeyAuthorizationToken{}, &core.PersistentVolumeBackup{}, &core.PersistentVolumeRestore{}, - &core.ConsoleToken{}, - &core.AnalyticsServiceToken{}, &core.ServerResourceStat{}, &core.ApplicationServiceResourceStat{}, &core.AppBasicAuthAccessControlList{}, diff --git a/swiftwave_service/graphql/generated.go b/swiftwave_service/graphql/generated.go index 18e82be6c1..25b33f7448 100644 --- a/swiftwave_service/graphql/generated.go +++ b/swiftwave_service/graphql/generated.go @@ -346,7 +346,6 @@ type ComplexityRoot struct { DisableTotp func(childComplexity int) int EnableHTTPSRedirectIngressRule func(childComplexity int, id uint) int EnableTotp func(childComplexity int, totp string) int - FetchAnalyticsServiceToken func(childComplexity int, id uint, rotate bool) int IssueSsl func(childComplexity int, id uint) int Login func(childComplexity int, input model.UserCredential) int Logout func(childComplexity int) int @@ -663,7 +662,6 @@ type MutationResolver interface { DeleteRedirectRule(ctx context.Context, id uint) (bool, error) CreateServer(ctx context.Context, input model.NewServerInput) (*model.Server, error) DeleteServer(ctx context.Context, id uint) (bool, error) - FetchAnalyticsServiceToken(ctx context.Context, id uint, rotate bool) (string, error) ChangeServerIPAddress(ctx context.Context, id uint, ip string) (bool, error) CleanupStack(ctx context.Context, input model.StackInput) (string, error) VerifyStack(ctx context.Context, input model.StackInput) (*model.StackVerifyResult, error) @@ -2439,18 +2437,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.EnableTotp(childComplexity, args["totp"].(string)), true - case "Mutation.fetchAnalyticsServiceToken": - if e.complexity.Mutation.FetchAnalyticsServiceToken == nil { - break - } - - args, err := ec.field_Mutation_fetchAnalyticsServiceToken_args(context.TODO(), rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.FetchAnalyticsServiceToken(childComplexity, args["id"].(uint), args["rotate"].(bool)), true - case "Mutation.issueSSL": if e.complexity.Mutation.IssueSsl == nil { break @@ -4579,30 +4565,6 @@ func (ec *executionContext) field_Mutation_enableTotp_args(ctx context.Context, return args, nil } -func (ec *executionContext) field_Mutation_fetchAnalyticsServiceToken_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { - var err error - args := map[string]interface{}{} - var arg0 uint - if tmp, ok := rawArgs["id"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) - arg0, err = ec.unmarshalNUint2uint(ctx, tmp) - if err != nil { - return nil, err - } - } - args["id"] = arg0 - var arg1 bool - if tmp, ok := rawArgs["rotate"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("rotate")) - arg1, err = ec.unmarshalNBoolean2bool(ctx, tmp) - if err != nil { - return nil, err - } - } - args["rotate"] = arg1 - return args, nil -} - func (ec *executionContext) field_Mutation_issueSSL_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -17547,81 +17509,6 @@ func (ec *executionContext) fieldContext_Mutation_deleteServer(ctx context.Conte return fc, nil } -func (ec *executionContext) _Mutation_fetchAnalyticsServiceToken(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_fetchAnalyticsServiceToken(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - directive0 := func(rctx context.Context) (interface{}, error) { - ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().FetchAnalyticsServiceToken(rctx, fc.Args["id"].(uint), fc.Args["rotate"].(bool)) - } - directive1 := func(ctx context.Context) (interface{}, error) { - if ec.directives.IsAuthenticated == nil { - return nil, errors.New("directive isAuthenticated is not implemented") - } - return ec.directives.IsAuthenticated(ctx, nil, directive0) - } - - tmp, err := directive1(rctx) - if err != nil { - return nil, graphql.ErrorOnPath(ctx, err) - } - if tmp == nil { - return nil, nil - } - if data, ok := tmp.(string); ok { - return data, nil - } - return nil, fmt.Errorf(`unexpected type %T from directive, should be string`, tmp) - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(string) - fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_Mutation_fetchAnalyticsServiceToken(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_fetchAnalyticsServiceToken_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - func (ec *executionContext) _Mutation_changeServerIpAddress(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Mutation_changeServerIpAddress(ctx, field) if err != nil { @@ -32824,13 +32711,6 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { out.Invalids++ } - case "fetchAnalyticsServiceToken": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_fetchAnalyticsServiceToken(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } case "changeServerIpAddress": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_changeServerIpAddress(ctx, field) diff --git a/swiftwave_service/graphql/graphql_object_mapper.go b/swiftwave_service/graphql/graphql_object_mapper.go index be800658a3..3f212d3dab 100644 --- a/swiftwave_service/graphql/graphql_object_mapper.go +++ b/swiftwave_service/graphql/graphql_object_mapper.go @@ -809,39 +809,43 @@ func stackToApplicationsInput(applicationGroupID *string, record *stack_parser.S // newServerInputToDatabaseObject converts NewServerInput to ServerDatabaseObject func newServerInputToDatabaseObject(record *model.NewServerInput) *core.Server { - return &core.Server{ - IP: record.IP, - SSHPort: record.SSHPort, - HostName: "", - User: record.User, - ScheduleDeployments: false, - MaintenanceMode: false, - DockerUnixSocketPath: "", - SwarmMode: core.SwarmMode(model.SwarmModeWorker), - ProxyConfig: core.ProxyConfig{ - Enabled: false, - Type: core.ProxyType(model.ProxyTypeActive), - }, - Status: core.ServerStatus(model.ServerStatusNeedsSetup), - } + // TODO fix + //return &core.Server{ + // IP: record.IP, + // SSHPort: record.SSHPort, + // HostName: "", + // User: record.User, + // ScheduleDeployments: false, + // MaintenanceMode: false, + // DockerUnixSocketPath: "", + // SwarmMode: core.SwarmMode(model.SwarmModeWorker), + // ProxyConfig: core.ProxyConfig{ + // Enabled: false, + // Type: core.ProxyType(model.ProxyTypeActive), + // }, + // Status: core.ServerStatus(model.ServerStatusNeedsSetup), + //} + return nil } // serverToGraphqlObject converts Server to ServerGraphqlObject func serverToGraphqlObject(record *core.Server) *model.Server { - return &model.Server{ - ID: record.ID, - IP: record.IP, - SSHPort: record.SSHPort, - Hostname: record.HostName, - User: record.User, - ScheduleDeployments: record.ScheduleDeployments, - MaintenanceMode: record.MaintenanceMode, - DockerUnixSocketPath: record.DockerUnixSocketPath, - SwarmMode: model.SwarmMode(record.SwarmMode), - ProxyType: model.ProxyType(record.ProxyConfig.Type), - ProxyEnabled: record.ProxyConfig.Enabled, - Status: model.ServerStatus(record.Status), - } + // TODO fix + //return &model.Server{ + // ID: record.ID, + // IP: record.IP, + // SSHPort: record.SSHPort, + // Hostname: record.HostName, + // User: record.User, + // ScheduleDeployments: record.ScheduleDeployments, + // MaintenanceMode: record.MaintenanceMode, + // DockerUnixSocketPath: record.DockerUnixSocketPath, + // SwarmMode: model.SwarmMode(record.SwarmMode), + // ProxyType: model.ProxyType(record.ProxyConfig.Type), + // ProxyEnabled: record.ProxyConfig.Enabled, + // Status: model.ServerStatus(record.Status), + //} + return nil } // serverLogToGraphqlObject converts ServerLog to ServerLogGraphqlObject diff --git a/swiftwave_service/graphql/helpers.go b/swiftwave_service/graphql/helpers.go index 8b501000ed..58338ed941 100644 --- a/swiftwave_service/graphql/helpers.go +++ b/swiftwave_service/graphql/helpers.go @@ -17,7 +17,6 @@ import ( haproxymanager "github.com/swiftwave-org/swiftwave/pkg/haproxy_manager" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/graphql/model" - "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" "gorm.io/gorm" ) @@ -56,22 +55,24 @@ func sanitizeFileName(fileName string) string { } func FetchDockerManager(ctx context.Context, db *gorm.DB) (*containermanger.Manager, error) { - // Fetch a random swarm manager - swarmManagerServer, err := core.FetchSwarmManager(db) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - // no online swarm manager - logger.GraphQLLogger.Println("failed to fetch docker manager due to no online swarm manager") - return nil, errors.New("failed to fetch docker manager due to no online swarm manager") - } - return nil, errors.New("failed to fetch swarm manager") - } - // Fetch docker manager - dockerManager, err := manager.DockerClient(ctx, swarmManagerServer) - if err != nil { - return nil, errors.New("failed to fetch docker manager") - } - return dockerManager, nil + return nil, nil + // TODO fix + //// Fetch a random swarm manager + //swarmManagerServer, err := core.FetchSwarmManager(db) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // // no online swarm manager + // logger.GraphQLLogger.Println("failed to fetch docker manager due to no online swarm manager") + // return nil, errors.New("failed to fetch docker manager due to no online swarm manager") + // } + // return nil, errors.New("failed to fetch swarm manager") + //} + //// Fetch docker manager + //dockerManager, err := manager.DockerClient(ctx, swarmManagerServer) + //if err != nil { + // return nil, errors.New("failed to fetch docker manager") + //} + //return dockerManager, nil } func AppendPublicSSHKeyLocally(pubKey string) error { diff --git a/swiftwave_service/graphql/persistent_volume.resolvers.go b/swiftwave_service/graphql/persistent_volume.resolvers.go index 2349486d5e..5e85fc3bbe 100644 --- a/swiftwave_service/graphql/persistent_volume.resolvers.go +++ b/swiftwave_service/graphql/persistent_volume.resolvers.go @@ -6,7 +6,6 @@ package graphql import ( "context" - "errors" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/graphql/model" @@ -111,28 +110,30 @@ func (r *queryResolver) PersistentVolume(ctx context.Context, id uint) (*model.P // PersistentVolumeSizeMb is the resolver for the persistentVolumeSizeMb field. func (r *queryResolver) PersistentVolumeSizeMb(ctx context.Context, id uint) (float64, error) { - // fetch record - var record core.PersistentVolume - err := record.FindById(ctx, r.ServiceManager.DbClient, id) - if err != nil { - return 0, err - } - // Fetch a random swarm manager - swarmManagerServer, err := core.FetchSwarmManager(&r.ServiceManager.DbClient) - if err != nil { - return 0, errors.New("failed to fetch swarm manager") - } - // Fetch docker manager - dockerManager, err := manager.DockerClient(ctx, swarmManagerServer) - if err != nil { - return 0, errors.New("failed to fetch docker manager") - } - // fetch size - size, err := dockerManager.SizeVolume(record.Name, swarmManagerServer.IP, swarmManagerServer.SSHPort, swarmManagerServer.User, r.Config.SystemConfig.SshPrivateKey) - if err != nil { - return 0, err - } - return size, nil + // TODO fix + //// fetch record + //var record core.PersistentVolume + //err := record.FindById(ctx, r.ServiceManager.DbClient, id) + //if err != nil { + // return 0, err + //} + //// Fetch a random swarm manager + //swarmManagerServer, err := core.FetchSwarmManager(&r.ServiceManager.DbClient) + //if err != nil { + // return 0, errors.New("failed to fetch swarm manager") + //} + //// Fetch docker manager + //dockerManager, err := manager.DockerClient(ctx, swarmManagerServer) + //if err != nil { + // return 0, errors.New("failed to fetch docker manager") + //} + //// fetch size + //size, err := dockerManager.SizeVolume(record.Name, swarmManagerServer.IP, swarmManagerServer.SSHPort, swarmManagerServer.User, r.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // return 0, err + //} + //return size, nil + return 0, nil } // IsExistPersistentVolume is the resolver for the isExistPersistentVolume field. diff --git a/swiftwave_service/graphql/schema/server.graphqls b/swiftwave_service/graphql/schema/server.graphqls index b81776ad00..68c0ad0d3a 100644 --- a/swiftwave_service/graphql/schema/server.graphqls +++ b/swiftwave_service/graphql/schema/server.graphqls @@ -104,6 +104,5 @@ extend type Query { extend type Mutation { createServer(input: NewServerInput!): Server! @isAuthenticated deleteServer(id: Uint!): Boolean! @isAuthenticated - fetchAnalyticsServiceToken(id: Uint!, rotate:Boolean!): String! @isAuthenticated changeServerIpAddress(id: Uint!, ip: String!): Boolean! @isAuthenticated } \ No newline at end of file diff --git a/swiftwave_service/graphql/server.resolvers.go b/swiftwave_service/graphql/server.resolvers.go index 4c7fdf4464..c031596ec7 100644 --- a/swiftwave_service/graphql/server.resolvers.go +++ b/swiftwave_service/graphql/server.resolvers.go @@ -16,8 +16,6 @@ import ( "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/graphql/model" "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" - swiftwaveServiceManagerDocker "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" - "gorm.io/gorm" ) // CreateServer is the resolver for the createServer field. @@ -54,82 +52,67 @@ func (r *mutationResolver) DeleteServer(ctx context.Context, id uint) (bool, err // 7. Remove from swarm cluster // 8. Remove from the database - server, err := core.FetchServerByID(&r.ServiceManager.DbClient, id) - if err != nil { - return false, err - } - // If `need_setup`, delete it from database - if server.Status == core.ServerNeedsSetup { - err = core.DeleteServer(&r.ServiceManager.DbClient, id) - if err != nil { - return false, err - } - return true, nil - } - // If `preparing`, it can't be deleted - if server.Status == core.ServerPreparing { - return false, errors.New("server is preparing, you can delete it only after it come out of `preparing` status") - } - // If it's the last server, then delete it from db - servers, err := core.FetchAllServers(&r.ServiceManager.DbClient) - if err != nil { - return false, err - } - if len(servers) == 1 { - err = core.DeleteServer(&r.ServiceManager.DbClient, id) - if err != nil { - return false, err - } - return true, nil - } - // if not the last server, then required additional steps - if server.SwarmMode == core.SwarmManager { - return false, errors.New("from 'Actions' menu, demote this server to 'Swarm Worker' mode to proceed for deletion") - } - if server.ProxyConfig.Enabled { - return false, errors.New("from 'Actions' menu, disable ingress proxy on this server to proceed for deletion") - } - // fetch another swarm manager - otherSwarmManager, err := core.FetchSwarmManagerExceptServer(&r.ServiceManager.DbClient, id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return false, errors.New("no other swarm manager found to proceed for deletion") - } - } - // fetch docker manager - dockerManager, err := swiftwaveServiceManagerDocker.DockerClient(ctx, otherSwarmManager) - if err != nil { - return false, err - } - // remove from swarm cluster - err = dockerManager.RemoveNode(server.HostName) - if err != nil { - return false, err - } - // remove from local database - err = core.DeleteServer(&r.ServiceManager.DbClient, id) - if err != nil { - return false, err - } + // TODO fix + //server, err := core.FetchServerByID(&r.ServiceManager.DbClient, id) + //if err != nil { + // return false, err + //} + //// If `need_setup`, delete it from database + //if server.Status == core.ServerNeedsSetup { + // err = core.DeleteServer(&r.ServiceManager.DbClient, id) + // if err != nil { + // return false, err + // } + // return true, nil + //} + //// If `preparing`, it can't be deleted + //if server.Status == core.ServerPreparing { + // return false, errors.New("server is preparing, you can delete it only after it come out of `preparing` status") + //} + //// If it's the last server, then delete it from db + //servers, err := core.FetchAllServers(&r.ServiceManager.DbClient) + //if err != nil { + // return false, err + //} + //if len(servers) == 1 { + // err = core.DeleteServer(&r.ServiceManager.DbClient, id) + // if err != nil { + // return false, err + // } + // return true, nil + //} + //// if not the last server, then required additional steps + //if server.SwarmMode == core.SwarmManager { + // return false, errors.New("from 'Actions' menu, demote this server to 'Swarm Worker' mode to proceed for deletion") + //} + //if server.ProxyConfig.Enabled { + // return false, errors.New("from 'Actions' menu, disable ingress proxy on this server to proceed for deletion") + //} + //// fetch another swarm manager + //otherSwarmManager, err := core.FetchSwarmManagerExceptServer(&r.ServiceManager.DbClient, id) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return false, errors.New("no other swarm manager found to proceed for deletion") + // } + //} + //// fetch docker manager + //dockerManager, err := swiftwaveServiceManagerDocker.DockerClient(ctx, otherSwarmManager) + //if err != nil { + // return false, err + //} + //// remove from swarm cluster + //err = dockerManager.RemoveNode(server.HostName) + //if err != nil { + // return false, err + //} + //// remove from local database + //err = core.DeleteServer(&r.ServiceManager.DbClient, id) + //if err != nil { + // return false, err + //} return true, nil } -// FetchAnalyticsServiceToken is the resolver for the fetchAnalyticsServiceToken field. -func (r *mutationResolver) FetchAnalyticsServiceToken(ctx context.Context, id uint, rotate bool) (string, error) { - var tokenRecord *core.AnalyticsServiceToken - var err error - if !rotate { - tokenRecord, err = core.FetchAnalyticsServiceToken(ctx, r.ServiceManager.DbClient, id) - } else { - tokenRecord, err = core.RotateAnalyticsServiceToken(ctx, r.ServiceManager.DbClient, id) - } - if err != nil { - return "", err - } else { - return tokenRecord.IDToken() - } -} - // ChangeServerIPAddress is the resolver for the changeServerIpAddress field. func (r *mutationResolver) ChangeServerIPAddress(ctx context.Context, id uint, ip string) (bool, error) { server, err := core.FetchServerByID(&r.ServiceManager.DbClient, id) @@ -140,15 +123,15 @@ func (r *mutationResolver) ChangeServerIPAddress(ctx context.Context, id uint, i if len(ip) == 0 { return false, errors.New("IP is required") } - if strings.Compare(server.IP, ip) == 0 { - return false, errors.New("IP is already " + server.IP) + if strings.Compare(server.PublicIP, ip) == 0 { + return false, errors.New("IP is already " + server.PublicIP) } err = core.ChangeServerIP(&r.ServiceManager.DbClient, server, ip) if err != nil { return false, err } // Exit process - logger.GraphQLLoggerError.Println("Server " + server.HostName + " IP changed to " + ip + "\nRestarting swiftwave in 2 seconds to take effect") + logger.GraphQLLoggerError.Println("Server " + server.Name + " IP changed to " + ip + "\nRestarting swiftwave in 2 seconds to take effect") // Restart swiftwave service go func() { <-time.After(2 * time.Second) @@ -267,23 +250,25 @@ func (r *queryResolver) ServerLatestDiskUsage(ctx context.Context, id uint) (*mo // SwarmNodeStatus is the resolver for the swarmNodeStatus field. func (r *serverResolver) SwarmNodeStatus(ctx context.Context, obj *model.Server) (string, error) { - server, err := core.FetchServerByID(&r.ServiceManager.DbClient, obj.ID) - if err != nil { - return "", nil - } - if server.Status != core.ServerOnline { - return "", nil - } - // Fetch any swarm manager - swarmManagerServer, err := core.FetchSwarmManager(&r.ServiceManager.DbClient) - if err != nil { - return "", nil - } - manager, err := swiftwaveServiceManagerDocker.DockerClient(ctx, swarmManagerServer) - if err != nil { - return "", nil - } - return manager.FetchNodeStatus(server.HostName) + // TODO fix + //server, err := core.FetchServerByID(&r.ServiceManager.DbClient, obj.ID) + //if err != nil { + // return "", nil + //} + //if server.Status != core.ServerOnline { + // return "", nil + //} + //// Fetch any swarm manager + //swarmManagerServer, err := core.FetchSwarmManager(&r.ServiceManager.DbClient) + //if err != nil { + // return "", nil + //} + //manager, err := swiftwaveServiceManagerDocker.DockerClient(ctx, swarmManagerServer) + //if err != nil { + // return "", nil + //} + //return manager.FetchNodeStatus(server.HostName) + return "hello", nil } // Logs is the resolver for the logs field. diff --git a/swiftwave_service/manager/docker.go b/swiftwave_service/manager/docker.go index fc8052e6fd..905e4f7446 100644 --- a/swiftwave_service/manager/docker.go +++ b/swiftwave_service/manager/docker.go @@ -4,26 +4,27 @@ import ( "context" containermanger "github.com/swiftwave-org/swiftwave/pkg/container_manager" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/config" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" ) func DockerClient(ctx context.Context, server core.Server) (*containermanger.Manager, error) { // Fetch config - c, err := config.Fetch() - if err != nil { - return nil, err - } + //c, err := config.Fetch() + //if err != nil { + // return nil, err + //} // Create Net.Conn over SSH - conn, err := ssh_toolkit.NetConnOverSSH("unix", server.DockerUnixSocketPath, 5, server.IP, server.SSHPort, server.User, c.SystemConfig.SshPrivateKey) - if err != nil { - return nil, err - } - // Create Docker client - manager, err := containermanger.New(ctx, conn) - if err != nil { - return nil, err - } - return manager, nil + // TODO fix + //conn, err := ssh_toolkit.NetConnOverSSH("unix", server.DockerUnixSocketPath, 5, server.IP, server.SSHPort, server.User, c.SystemConfig.SshPrivateKey) + //if err != nil { + // return nil, err + //} + //// Create Docker client + //manager, err := containermanger.New(ctx, conn) + //if err != nil { + // return nil, err + //} + //return manager, nil + + return nil, nil } diff --git a/swiftwave_service/manager/haproxy.go b/swiftwave_service/manager/haproxy.go index 509e895d59..d8a04f0285 100644 --- a/swiftwave_service/manager/haproxy.go +++ b/swiftwave_service/manager/haproxy.go @@ -3,23 +3,22 @@ package manager import ( "context" haproxymanager "github.com/swiftwave-org/swiftwave/pkg/haproxy_manager" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/config" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "net" ) func HAProxyClient(_ context.Context, server core.Server) (*haproxymanager.Manager, error) { // Fetch config - c, err := config.Fetch() - if err != nil { - return nil, err - } - // Create client - manager := haproxymanager.New(func() (net.Conn, error) { - return ssh_toolkit.NetConnOverSSH("unix", c.LocalConfig.ServiceConfig.HAProxyUnixSocketPath, 50, server.IP, server.SSHPort, server.User, c.SystemConfig.SshPrivateKey) - }, c.SystemConfig.HAProxyConfig.Username, c.SystemConfig.HAProxyConfig.Password) - return &manager, nil + //c, err := config.Fetch() + //if err != nil { + // return nil, err + //} + //// Create client + //manager := haproxymanager.New(func() (net.Conn, error) { + // return ssh_toolkit.NetConnOverSSH("unix", c.LocalConfig.ServiceConfig.HAProxyUnixSocketPath, 50, server.IP, server.SSHPort, server.User, c.SystemConfig.SshPrivateKey) + //}, c.SystemConfig.HAProxyConfig.Username, c.SystemConfig.HAProxyConfig.Password) + //return &manager, nil + + return nil, nil } func HAProxyClients(ctx context.Context, servers []core.Server) ([]*haproxymanager.Manager, error) { diff --git a/swiftwave_service/manager/udpproxy.go b/swiftwave_service/manager/udpproxy.go index bddab05f91..17e7fefb2b 100644 --- a/swiftwave_service/manager/udpproxy.go +++ b/swiftwave_service/manager/udpproxy.go @@ -2,24 +2,23 @@ package manager import ( "context" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/config" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/pkg/udp_proxy_manager" - "net" + "github.com/swiftwave-org/swiftwave/swiftwave_service/core" ) func UDPProxyClient(_ context.Context, server core.Server) (*udp_proxy_manager.Manager, error) { - // Fetch config - c, err := config.Fetch() - if err != nil { - return nil, err - } - // Create Net.Conn over SSH - manager := udp_proxy_manager.New(func() (net.Conn, error) { - return ssh_toolkit.NetConnOverSSH("unix", c.LocalConfig.ServiceConfig.UDPProxyUnixSocketPath, 20, server.IP, server.SSHPort, server.User, c.SystemConfig.SshPrivateKey) - }) - return &manager, nil + // TODO fix + //// Fetch config + //c, err := config.Fetch() + //if err != nil { + // return nil, err + //} + //// Create Net.Conn over SSH + //manager := udp_proxy_manager.New(func() (net.Conn, error) { + // return ssh_toolkit.NetConnOverSSH("unix", c.LocalConfig.ServiceConfig.UDPProxyUnixSocketPath, 20, server.IP, server.SSHPort, server.User, c.SystemConfig.SshPrivateKey) + //}) + //return &manager, nil + return nil, nil } func UDPProxyClients(ctx context.Context, servers []core.Server) ([]*udp_proxy_manager.Manager, error) { diff --git a/swiftwave_service/stack_parser/utils.go b/swiftwave_service/stack_parser/utils.go index ea91b3c12d..c8415fb108 100644 --- a/swiftwave_service/stack_parser/utils.go +++ b/swiftwave_service/stack_parser/utils.go @@ -1,11 +1,8 @@ package stack_parser import ( - "context" "errors" "fmt" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" "github.com/swiftwave-org/swiftwave/swiftwave_service/service_manager" "math/rand" "regexp" @@ -162,75 +159,76 @@ func (s *Stack) FillAndVerifyVariables(variableMapping *map[string]string, servi service.CustomHealthCheck.TestCommand = newHealthCheckTestCommand stackCopy.Services[serviceName] = service } - // check if docs present - if stackCopy.Docs != nil { - // fetch a swarm manager server - server, err := core.FetchSwarmManager(&serviceManager.DbClient) - if err != nil { - return nil, errors.New("error in fetching swarm manager") - } - // fetch docker manager - dockerManager, err := manager.DockerClient(context.Background(), server) - if err != nil { - return nil, errors.New("error in connecting to docker manager") - } - // verify the type of variables - for variableKey, variable := range stackCopy.Docs.Variables { - // check if variableKey is present in variableMapping - if _, ok := (*variableMapping)[variableKey]; ok { - if variable.Type == DocsVariableTypeInteger { - _, err := stringToInteger((*variableMapping)[variableKey]) - if err != nil { - return nil, errors.New("variable " + variableKey + " should be integer") - } - } else if variable.Type == DocsVariableTypeFloat { - _, err := strconv.ParseFloat((*variableMapping)[variableKey], 64) - if err != nil { - return nil, errors.New("variable " + variableKey + " should be float") - } - } else if variable.Type == DocsVariableTypeOptions { - isValid := false - for _, option := range variable.Options { - if option.Value == (*variableMapping)[variableKey] { - isValid = true - break - } - } - if !isValid { - return nil, errors.New("variable " + variableKey + " should be one of the provided options") - } - } else if variable.Type == DocsVariableTypeVolume { - val := (*variableMapping)[variableKey] - isExist, err := core.IsExistPersistentVolume(context.Background(), serviceManager.DbClient, val, *dockerManager) - if err != nil { - return nil, errors.New("error in checking volume " + val) - } - if !isExist { - return nil, errors.New("volume " + val + " doesn't exist. Create it or choose another volume") - } - } else if variable.Type == DocsVariableTypeText { - // do nothing, just for the sake of completeness - } else if variable.Type == DocsVariableTypeApplication { - val := (*variableMapping)[variableKey] - isExist, err := core.IsExistApplicationName(context.Background(), serviceManager.DbClient, *dockerManager, val) - if err != nil { - return nil, errors.New("error in checking application " + val) - } - if !isExist { - return nil, errors.New("application " + val + " doesn't exist. Create it or choose another application") - } - } else if variable.Type == DocsVariableTypeServer { - val := (*variableMapping)[variableKey] - _, err := core.FetchServerIDByHostName(&serviceManager.DbClient, val) - if err != nil { - return nil, errors.New("invalid server " + val + " provided") - } - } else { - return nil, errors.New("invalid variable type") - } - } - } - } + // TODO fix + //// check if docs present + //if stackCopy.Docs != nil { + // // fetch a swarm manager server + // server, err := core.FetchSwarmManager(&serviceManager.DbClient) + // if err != nil { + // return nil, errors.New("error in fetching swarm manager") + // } + // // fetch docker manager + // dockerManager, err := manager.DockerClient(context.Background(), server) + // if err != nil { + // return nil, errors.New("error in connecting to docker manager") + // } + // // verify the type of variables + // for variableKey, variable := range stackCopy.Docs.Variables { + // // check if variableKey is present in variableMapping + // if _, ok := (*variableMapping)[variableKey]; ok { + // if variable.Type == DocsVariableTypeInteger { + // _, err := stringToInteger((*variableMapping)[variableKey]) + // if err != nil { + // return nil, errors.New("variable " + variableKey + " should be integer") + // } + // } else if variable.Type == DocsVariableTypeFloat { + // _, err := strconv.ParseFloat((*variableMapping)[variableKey], 64) + // if err != nil { + // return nil, errors.New("variable " + variableKey + " should be float") + // } + // } else if variable.Type == DocsVariableTypeOptions { + // isValid := false + // for _, option := range variable.Options { + // if option.Value == (*variableMapping)[variableKey] { + // isValid = true + // break + // } + // } + // if !isValid { + // return nil, errors.New("variable " + variableKey + " should be one of the provided options") + // } + // } else if variable.Type == DocsVariableTypeVolume { + // val := (*variableMapping)[variableKey] + // isExist, err := core.IsExistPersistentVolume(context.Background(), serviceManager.DbClient, val, *dockerManager) + // if err != nil { + // return nil, errors.New("error in checking volume " + val) + // } + // if !isExist { + // return nil, errors.New("volume " + val + " doesn't exist. Create it or choose another volume") + // } + // } else if variable.Type == DocsVariableTypeText { + // // do nothing, just for the sake of completeness + // } else if variable.Type == DocsVariableTypeApplication { + // val := (*variableMapping)[variableKey] + // isExist, err := core.IsExistApplicationName(context.Background(), serviceManager.DbClient, *dockerManager, val) + // if err != nil { + // return nil, errors.New("error in checking application " + val) + // } + // if !isExist { + // return nil, errors.New("application " + val + " doesn't exist. Create it or choose another application") + // } + // } else if variable.Type == DocsVariableTypeServer { + // val := (*variableMapping)[variableKey] + // _, err := core.FetchServerIDByHostName(&serviceManager.DbClient, val) + // if err != nil { + // return nil, errors.New("invalid server " + val + " provided") + // } + // } else { + // return nil, errors.New("invalid variable type") + // } + // } + // } + //} return stackCopy, nil } diff --git a/swiftwave_service/worker/process_application_delete_request.go b/swiftwave_service/worker/process_application_delete_request.go index 846161d34d..965a23bd5f 100644 --- a/swiftwave_service/worker/process_application_delete_request.go +++ b/swiftwave_service/worker/process_application_delete_request.go @@ -2,59 +2,56 @@ package worker import ( "context" - "errors" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" - "gorm.io/gorm" - "log" ) func (m Manager) DeleteApplication(request DeleteApplicationRequest, ctx context.Context, _ context.CancelFunc) error { - dbWithoutTx := m.ServiceManager.DbClient - // fetch the swarm server - swarmManager, err := core.FetchSwarmManager(&dbWithoutTx) - if err != nil { - return err - } - // create docker manager - dockerManager, err := manager.DockerClient(context.Background(), swarmManager) - if err != nil { - return err - } - // find application - var application core.Application - err = application.FindById(ctx, m.ServiceManager.DbClient, request.Id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - // return nil as don't want to requeue the job - return nil - } else { - return err - } - } - // start a db transaction - tx := dbWithoutTx.Begin() - // delete application - err = application.HardDelete(ctx, *tx, *dockerManager) - if err != nil { - tx.Rollback() - return err - } - - // commit the transaction - err = tx.Commit().Error - if err != nil { - return err - } - - // delete application from swarm manager - err = dockerManager.RemoveService(application.Name) - if err != nil { - log.Println("[WARN] error deleting application from swarm manager : " + application.Name) - } - // remove docker proxy - dockerManager.RemoveDockerProxy(application.DockerProxyServiceName()) - // prune config mounts - dockerManager.PruneConfig(application.ID) return nil + // TODO fix + //dbWithoutTx := m.ServiceManager.DbClient + //// fetch the swarm server + //swarmManager, err := core.FetchSwarmManager(&dbWithoutTx) + //if err != nil { + // return err + //} + //// create docker manager + //dockerManager, err := manager.DockerClient(context.Background(), swarmManager) + //if err != nil { + // return err + //} + //// find application + //var application core.Application + //err = application.FindById(ctx, m.ServiceManager.DbClient, request.Id) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // // return nil as don't want to requeue the job + // return nil + // } else { + // return err + // } + //} + //// start a db transaction + //tx := dbWithoutTx.Begin() + //// delete application + //err = application.HardDelete(ctx, *tx, *dockerManager) + //if err != nil { + // tx.Rollback() + // return err + //} + // + //// commit the transaction + //err = tx.Commit().Error + //if err != nil { + // return err + //} + // + //// delete application from swarm manager + //err = dockerManager.RemoveService(application.Name) + //if err != nil { + // log.Println("[WARN] error deleting application from swarm manager : " + application.Name) + //} + //// remove docker proxy + //dockerManager.RemoveDockerProxy(application.DockerProxyServiceName()) + //// prune config mounts + //dockerManager.PruneConfig(application.ID) + //return nil } diff --git a/swiftwave_service/worker/process_application_deploy_request.go b/swiftwave_service/worker/process_application_deploy_request.go index bcd793c8ac..2f269eef05 100644 --- a/swiftwave_service/worker/process_application_deploy_request.go +++ b/swiftwave_service/worker/process_application_deploy_request.go @@ -5,7 +5,6 @@ import ( "errors" haproxymanager "github.com/swiftwave-org/swiftwave/pkg/haproxy_manager" "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" - "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" "log" "strings" @@ -15,43 +14,44 @@ import ( ) func (m Manager) DeployApplication(request DeployApplicationRequest, _ context.Context, _ context.CancelFunc) error { - // fetch the swarm server - swarmManager, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) - if err != nil { - return err - } - // create docker manager - dockerManager, err := manager.DockerClient(context.Background(), swarmManager) - if err != nil { - return err - } - // fetch all proxy servers - proxyServers := make([]core.Server, 0) - if !request.IgnoreProxyUpdate { - proxyServers, err = core.FetchProxyActiveServers(&m.ServiceManager.DbClient) - if err != nil { - return err - } - } - // fetch all haproxy managers - haproxyManagers, err := manager.HAProxyClients(context.Background(), proxyServers) - if err != nil { - return err - } - err = m.deployApplicationHelper(request, dockerManager, haproxyManagers) - if err != nil { - // mark as failed - ctx := context.Background() - addPersistentDeploymentLog(m.ServiceManager.DbClient, m.ServiceManager.PubSubClient, request.DeploymentId, "Deployment failed > \n"+err.Error()+"\n", false) - deployment := &core.Deployment{} - deployment.ID = request.DeploymentId - err = deployment.UpdateStatus(ctx, m.ServiceManager.DbClient, core.DeploymentStatusFailed) - if err != nil { - log.Println("failed to update deployment status to failed", err) - } - } - // prune config mounts - dockerManager.PruneConfig(request.AppId) + // TODO fix + //// fetch the swarm server + //swarmManager, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) + //if err != nil { + // return err + //} + //// create docker manager + //dockerManager, err := manager.DockerClient(context.Background(), swarmManager) + //if err != nil { + // return err + //} + //// fetch all proxy servers + //proxyServers := make([]core.Server, 0) + //if !request.IgnoreProxyUpdate { + // proxyServers, err = core.FetchProxyActiveServers(&m.ServiceManager.DbClient) + // if err != nil { + // return err + // } + //} + //// fetch all haproxy managers + //haproxyManagers, err := manager.HAProxyClients(context.Background(), proxyServers) + //if err != nil { + // return err + //} + //err = m.deployApplicationHelper(request, dockerManager, haproxyManagers) + //if err != nil { + // // mark as failed + // ctx := context.Background() + // addPersistentDeploymentLog(m.ServiceManager.DbClient, m.ServiceManager.PubSubClient, request.DeploymentId, "Deployment failed > \n"+err.Error()+"\n", false) + // deployment := &core.Deployment{} + // deployment.ID = request.DeploymentId + // err = deployment.UpdateStatus(ctx, m.ServiceManager.DbClient, core.DeploymentStatusFailed) + // if err != nil { + // log.Println("failed to update deployment status to failed", err) + // } + //} + //// prune config mounts + //dockerManager.PruneConfig(request.AppId) return nil } @@ -199,7 +199,10 @@ func (m Manager) deployApplicationHelper(request DeployApplicationRequest, docke } // prepare placement constraints var placementConstraints = make([]string, 0) - disabledServerHostnames, err := core.FetchDisabledDeploymentServerHostNames(&m.ServiceManager.DbClient) + // TODO fix + //disabledServerHostnames, err := core.FetchDisabledDeploymentServerHostNames(&m.ServiceManager.DbClient) + disabledServerHostnames := make([]string, 0) + err = nil if err != nil { addPersistentDeploymentLog(dbWithoutTx, pubSubClient, deployment.ID, "Failed to fetch disabled deployment servers\nPlease check database connection\n", false) return err diff --git a/swiftwave_service/worker/process_install_dependencies_on_server_request.go b/swiftwave_service/worker/process_install_dependencies_on_server_request.go index 5e6a3dac13..4fe32b562e 100644 --- a/swiftwave_service/worker/process_install_dependencies_on_server_request.go +++ b/swiftwave_service/worker/process_install_dependencies_on_server_request.go @@ -1,101 +1,96 @@ package worker import ( - "bytes" "context" - "errors" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "gorm.io/gorm" - "time" ) func (m Manager) InstallDependenciesOnServer(request InstallDependenciesOnServerRequest, ctx context.Context, _ context.CancelFunc) error { - // fetch server - server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - return err - } - // fetch server log - serverLog, err := core.FetchServerLogByID(&m.ServiceManager.DbClient, request.LogId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - return err - } - // log - logText := "Installing dependencies on server\n" - // spawn a goroutine to update server log each 5 seconds - go func() { - lastSent := time.Now() - for { - select { - case <-ctx.Done(): - return - default: - if time.Since(lastSent) > 5*time.Second { - serverLog.Content = logText - _ = serverLog.Update(&m.ServiceManager.DbClient) - lastSent = time.Now() - } - } - } - }() - // defer to push final log - defer func() { - serverLog.Content = logText - _ = serverLog.Update(&m.ServiceManager.DbClient) - }() - - detectedOS, err := ssh_toolkit.DetectOS(5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logText += "Error detecting OS: " + err.Error() + "\n" - return nil - } - - // command - var command string - for _, dependency := range core.RequiredServerDependencies { - isExists := false - // check if dependency is already installed [ignore init] - if dependency != "init" { - stdoutBuffer := new(bytes.Buffer) - err = ssh_toolkit.ExecCommandOverSSH(core.DependencyCheckCommands[dependency], stdoutBuffer, nil, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err == nil { - isExists = stdoutBuffer.String() != "" - } - } - // install dependency - if isExists { - logText += "Dependency " + dependency + " is already installed\n" - continue - } else { - logText += "Installing dependency " + dependency + "\n" - stdoutBuffer := new(bytes.Buffer) - stderrBuffer := new(bytes.Buffer) - if detectedOS == ssh_toolkit.DebianBased { - command = core.DebianDependenciesInstallCommands[dependency] - } else if detectedOS == ssh_toolkit.FedoraBased { - command = core.FedoraDependenciesInstallCommands[dependency] - } else { - logText += "Unknown OS: " + string(detectedOS) + "\n" - continue - } - err = ssh_toolkit.ExecCommandOverSSH(command, stdoutBuffer, stderrBuffer, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - logText += stdoutBuffer.String() + "\n" - logText += stderrBuffer.String() + "\n" - logText += "\n" - if err != nil { - logText += "Error installing dependency " + dependency + ": " + err.Error() + "\n" + stderrBuffer.String() + "\n" - return nil - } else { - logText += "Dependency " + dependency + " installed successfully\n" - } - } - } + // TODO fix + //// fetch server + //server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // return err + //} + //// fetch server log + //serverLog, err := core.FetchServerLogByID(&m.ServiceManager.DbClient, request.LogId) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // return err + //} + //// log + //logText := "Installing dependencies on server\n" + //// spawn a goroutine to update server log each 5 seconds + //go func() { + // lastSent := time.Now() + // for { + // select { + // case <-ctx.Done(): + // return + // default: + // if time.Since(lastSent) > 5*time.Second { + // serverLog.Content = logText + // _ = serverLog.Update(&m.ServiceManager.DbClient) + // lastSent = time.Now() + // } + // } + // } + //}() + //// defer to push final log + //defer func() { + // serverLog.Content = logText + // _ = serverLog.Update(&m.ServiceManager.DbClient) + //}() + // + //detectedOS, err := ssh_toolkit.DetectOS(5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logText += "Error detecting OS: " + err.Error() + "\n" + // return nil + //} + // + //// command + //var command string + //for _, dependency := range core.RequiredServerDependencies { + // isExists := false + // // check if dependency is already installed [ignore init] + // if dependency != "init" { + // stdoutBuffer := new(bytes.Buffer) + // err = ssh_toolkit.ExecCommandOverSSH(core.DependencyCheckCommands[dependency], stdoutBuffer, nil, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + // if err == nil { + // isExists = stdoutBuffer.String() != "" + // } + // } + // // install dependency + // if isExists { + // logText += "Dependency " + dependency + " is already installed\n" + // continue + // } else { + // logText += "Installing dependency " + dependency + "\n" + // stdoutBuffer := new(bytes.Buffer) + // stderrBuffer := new(bytes.Buffer) + // if detectedOS == ssh_toolkit.DebianBased { + // command = core.DebianDependenciesInstallCommands[dependency] + // } else if detectedOS == ssh_toolkit.FedoraBased { + // command = core.FedoraDependenciesInstallCommands[dependency] + // } else { + // logText += "Unknown OS: " + string(detectedOS) + "\n" + // continue + // } + // err = ssh_toolkit.ExecCommandOverSSH(command, stdoutBuffer, stderrBuffer, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + // logText += stdoutBuffer.String() + "\n" + // logText += stderrBuffer.String() + "\n" + // logText += "\n" + // if err != nil { + // logText += "Error installing dependency " + dependency + ": " + err.Error() + "\n" + stderrBuffer.String() + "\n" + // return nil + // } else { + // logText += "Dependency " + dependency + " installed successfully\n" + // } + // } + //} return nil } diff --git a/swiftwave_service/worker/process_pv_backup_request.go b/swiftwave_service/worker/process_pv_backup_request.go index 2ceeb03dd2..09c8db69d1 100644 --- a/swiftwave_service/worker/process_pv_backup_request.go +++ b/swiftwave_service/worker/process_pv_backup_request.go @@ -2,96 +2,92 @@ package worker import ( "context" - "github.com/google/uuid" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" - "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" - "github.com/swiftwave-org/swiftwave/swiftwave_service/uploader" "gorm.io/gorm" "log" "os" - "path/filepath" ) func (m Manager) PersistentVolumeBackup(request PersistentVolumeBackupRequest, ctx context.Context, _ context.CancelFunc) error { - dbWithoutTx := m.ServiceManager.DbClient - // fetch persistent volume backup - var persistentVolumeBackup core.PersistentVolumeBackup - err := persistentVolumeBackup.FindById(ctx, dbWithoutTx, request.Id) - if err != nil { - return nil - } - // check status should be pending - if persistentVolumeBackup.Status != core.BackupPending { - return nil - } - // fetch persistent volume - var persistentVolume core.PersistentVolume - err = persistentVolume.FindById(ctx, dbWithoutTx, persistentVolumeBackup.PersistentVolumeID) - if err != nil { - return nil - } - // fetch swarm server - server, err := core.FetchSwarmManager(&dbWithoutTx) - if err != nil { - return err - } - dockerManager, err := manager.DockerClient(ctx, server) - if err != nil { - return err - } - // generate a random filename - backupFileName := persistentVolume.Name + "_" + uuid.NewString() + ".tar.gz" - backupFilePath := filepath.Join(m.Config.LocalConfig.ServiceConfig.PVBackupDirectoryPath, backupFileName) - // create backup - err = dockerManager.BackupVolume(persistentVolume.Name, backupFilePath, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logger.CronJobLoggerError.Println("error while creating backup > " + err.Error()) - markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) - return nil - } - // fetch size - size, err := sizeOfFileInMB(backupFilePath) - if err != nil { - logger.CronJobLoggerError.Println("error while getting backup file size > " + err.Error()) - markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) - return nil - } - if persistentVolumeBackup.Type == core.S3Backup { - // upload to s3 - backupFileReader, err := os.Open(backupFilePath) - if err != nil { - logger.CronJobLoggerError.Println("error while opening backup file > " + err.Error()) - markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) - return nil - } - defer func() { - err := backupFileReader.Close() - if err != nil { - log.Println("failed to close backup file reader " + err.Error()) - } - }() - s3Config := m.Config.SystemConfig.PersistentVolumeBackupConfig.S3BackupConfig - err = uploader.UploadFileToS3(backupFileReader, backupFileName, s3Config.Bucket, s3Config) - if err != nil { - log.Println("error while uploading backup to s3 > " + err.Error()) - markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) - return nil - } - // remove the backup file - err = os.Remove(backupFilePath) - if err != nil { - log.Println("failed to remove backup file " + err.Error()) - } - } - // update status - persistentVolumeBackup.Status = core.BackupSuccess - persistentVolumeBackup.File = backupFileName - persistentVolumeBackup.FileSizeMB = size - err = persistentVolumeBackup.Update(ctx, dbWithoutTx) - if err != nil { - return err - } + // TODO fix + //dbWithoutTx := m.ServiceManager.DbClient + //// fetch persistent volume backup + //var persistentVolumeBackup core.PersistentVolumeBackup + //err := persistentVolumeBackup.FindById(ctx, dbWithoutTx, request.Id) + //if err != nil { + // return nil + //} + //// check status should be pending + //if persistentVolumeBackup.Status != core.BackupPending { + // return nil + //} + //// fetch persistent volume + //var persistentVolume core.PersistentVolume + //err = persistentVolume.FindById(ctx, dbWithoutTx, persistentVolumeBackup.PersistentVolumeID) + //if err != nil { + // return nil + //} + //// fetch swarm server + //server, err := core.FetchSwarmManager(&dbWithoutTx) + //if err != nil { + // return err + //} + //dockerManager, err := manager.DockerClient(ctx, server) + //if err != nil { + // return err + //} + //// generate a random filename + //backupFileName := persistentVolume.Name + "_" + uuid.NewString() + ".tar.gz" + //backupFilePath := filepath.Join(m.Config.LocalConfig.ServiceConfig.PVBackupDirectoryPath, backupFileName) + //// create backup + //err = dockerManager.BackupVolume(persistentVolume.Name, backupFilePath, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logger.CronJobLoggerError.Println("error while creating backup > " + err.Error()) + // markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) + // return nil + //} + //// fetch size + //size, err := sizeOfFileInMB(backupFilePath) + //if err != nil { + // logger.CronJobLoggerError.Println("error while getting backup file size > " + err.Error()) + // markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) + // return nil + //} + //if persistentVolumeBackup.Type == core.S3Backup { + // // upload to s3 + // backupFileReader, err := os.Open(backupFilePath) + // if err != nil { + // logger.CronJobLoggerError.Println("error while opening backup file > " + err.Error()) + // markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) + // return nil + // } + // defer func() { + // err := backupFileReader.Close() + // if err != nil { + // log.Println("failed to close backup file reader " + err.Error()) + // } + // }() + // s3Config := m.Config.SystemConfig.PersistentVolumeBackupConfig.S3BackupConfig + // err = uploader.UploadFileToS3(backupFileReader, backupFileName, s3Config.Bucket, s3Config) + // if err != nil { + // log.Println("error while uploading backup to s3 > " + err.Error()) + // markPVBackupRequestAsFailed(dbWithoutTx, persistentVolumeBackup) + // return nil + // } + // // remove the backup file + // err = os.Remove(backupFilePath) + // if err != nil { + // log.Println("failed to remove backup file " + err.Error()) + // } + //} + //// update status + //persistentVolumeBackup.Status = core.BackupSuccess + //persistentVolumeBackup.File = backupFileName + //persistentVolumeBackup.FileSizeMB = size + //err = persistentVolumeBackup.Update(ctx, dbWithoutTx) + //if err != nil { + // return err + //} return nil } diff --git a/swiftwave_service/worker/process_pv_restore_request.go b/swiftwave_service/worker/process_pv_restore_request.go index 9f1dd5c385..1decc44e85 100644 --- a/swiftwave_service/worker/process_pv_restore_request.go +++ b/swiftwave_service/worker/process_pv_restore_request.go @@ -3,55 +3,53 @@ package worker import ( "context" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "github.com/swiftwave-org/swiftwave/swiftwave_service/manager" "gorm.io/gorm" - "os" - "path/filepath" ) func (m Manager) PersistentVolumeRestore(request PersistentVolumeRestoreRequest, ctx context.Context, _ context.CancelFunc) error { - dbWithoutTx := m.ServiceManager.DbClient - // fetch persistent volume restore - var persistentVolumeRestore core.PersistentVolumeRestore - err := persistentVolumeRestore.FindById(ctx, dbWithoutTx, request.Id) - if err != nil { - return nil - } - // check status should be uploaded - if persistentVolumeRestore.Status != core.RestorePending { - return nil - } - // fetch persistent volume - var persistentVolume core.PersistentVolume - err = persistentVolume.FindById(ctx, dbWithoutTx, persistentVolumeRestore.PersistentVolumeID) - if err != nil { - return nil - } - // fetch swarm server - server, err := core.FetchSwarmManager(&dbWithoutTx) - if err != nil { - return err - } - dockerManager, err := manager.DockerClient(ctx, server) - if err != nil { - return err - } - // restore backup - localRestoreFilePath := filepath.Join(m.Config.LocalConfig.ServiceConfig.PVRestoreDirectoryPath, persistentVolumeRestore.File) - err = dockerManager.RestoreVolume(persistentVolume.Name, localRestoreFilePath, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - markPVRestoreRequestAsFailed(dbWithoutTx, persistentVolumeRestore) - _ = os.RemoveAll(localRestoreFilePath) - return nil - } - // update status - persistentVolumeRestore.Status = core.RestoreSuccess - err = persistentVolumeRestore.Update(ctx, dbWithoutTx, m.Config.LocalConfig.ServiceConfig.PVRestoreDirectoryPath) - if err != nil { - return err - } - // remove local file - _ = os.RemoveAll(localRestoreFilePath) + // TODO fix + //dbWithoutTx := m.ServiceManager.DbClient + //// fetch persistent volume restore + //var persistentVolumeRestore core.PersistentVolumeRestore + //err := persistentVolumeRestore.FindById(ctx, dbWithoutTx, request.Id) + //if err != nil { + // return nil + //} + //// check status should be uploaded + //if persistentVolumeRestore.Status != core.RestorePending { + // return nil + //} + //// fetch persistent volume + //var persistentVolume core.PersistentVolume + //err = persistentVolume.FindById(ctx, dbWithoutTx, persistentVolumeRestore.PersistentVolumeID) + //if err != nil { + // return nil + //} + //// fetch swarm server + //server, err := core.FetchSwarmManager(&dbWithoutTx) + //if err != nil { + // return err + //} + //dockerManager, err := manager.DockerClient(ctx, server) + //if err != nil { + // return err + //} + //// restore backup + //localRestoreFilePath := filepath.Join(m.Config.LocalConfig.ServiceConfig.PVRestoreDirectoryPath, persistentVolumeRestore.File) + //err = dockerManager.RestoreVolume(persistentVolume.Name, localRestoreFilePath, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // markPVRestoreRequestAsFailed(dbWithoutTx, persistentVolumeRestore) + // _ = os.RemoveAll(localRestoreFilePath) + // return nil + //} + //// update status + //persistentVolumeRestore.Status = core.RestoreSuccess + //err = persistentVolumeRestore.Update(ctx, dbWithoutTx, m.Config.LocalConfig.ServiceConfig.PVRestoreDirectoryPath) + //if err != nil { + // return err + //} + //// remove local file + //_ = os.RemoveAll(localRestoreFilePath) return nil } diff --git a/swiftwave_service/worker/process_setup_proxy_request.go b/swiftwave_service/worker/process_setup_proxy_request.go index 2d94c714b1..2d95e7a68b 100644 --- a/swiftwave_service/worker/process_setup_proxy_request.go +++ b/swiftwave_service/worker/process_setup_proxy_request.go @@ -4,11 +4,7 @@ import ( "context" "errors" "fmt" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" "github.com/swiftwave-org/swiftwave/swiftwave_service/config" - "github.com/swiftwave-org/swiftwave/swiftwave_service/core" - "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" - "gorm.io/gorm" "io" "log" "net/http" @@ -16,115 +12,116 @@ import ( "os/exec" "strconv" "strings" - "time" ) func (m Manager) SetupAndEnableProxy(request SetupAndEnableProxyRequest, ctx context.Context, cancelCtx context.CancelFunc) error { - // fetch server - server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - return err - } - err = m.setupAndEnableProxy(request, ctx, cancelCtx) - if err == nil { - // mark server as proxy enabled - server.ProxyConfig.Enabled = true - server.ProxyConfig.SetupRunning = false - err = core.UpdateServer(&m.ServiceManager.DbClient, server) - if err != nil { - logger.WorkerLoggerError.Println("Failed to update server "+server.HostName+" proxy config", err.Error()) - } else { - logger.WorkerLogger.Println("Proxy config updated for server " + server.HostName) - } - } + // TODO fix + //// fetch server + //server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // return err + //} + //err = m.setupAndEnableProxy(request, ctx, cancelCtx) + //if err == nil { + // // mark server as proxy enabled + // server.ProxyConfig.Enabled = true + // server.ProxyConfig.SetupRunning = false + // err = core.UpdateServer(&m.ServiceManager.DbClient, server) + // if err != nil { + // logger.WorkerLoggerError.Println("Failed to update server "+server.HostName+" proxy config", err.Error()) + // } else { + // logger.WorkerLogger.Println("Proxy config updated for server " + server.HostName) + // } + //} return nil } func (m Manager) setupAndEnableProxy(request SetupAndEnableProxyRequest, ctx context.Context, _ context.CancelFunc) error { - // fetch server - server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - return err - } - // fetch server log - serverLog, err := core.FetchServerLogByID(&m.ServiceManager.DbClient, request.LogId) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil - } - return err - } - // log - logText := "Starting proxy setup on server " + server.HostName + "\n" - // spawn a goroutine to update server log each 5 seconds - go func() { - lastSent := time.Now() - for { - select { - case <-ctx.Done(): - return - default: - if time.Since(lastSent) > 5*time.Second { - serverLog.Content = logText - _ = serverLog.Update(&m.ServiceManager.DbClient) - lastSent = time.Now() - } - } - } - }() - // defer to push final log - defer func() { - serverLog.Content = logText - _ = serverLog.Update(&m.ServiceManager.DbClient) - }() - // fill local haproxy configuration (will be skipped anyhow if already exists) - err = generateDefaultHAProxyConfiguration(m.Config) - if err != nil { - logText += "Failed to generate default haproxy configuration: " + err.Error() + "\n" - return err - } - // check if any proxy server is already running - servers, err := core.FetchAllProxyServers(&m.ServiceManager.DbClient) - if err != nil { - logText += "Failed to fetch all proxy servers: " + err.Error() + "\n" - return err - } - - if len(servers) > 0 { - var chosenServer core.Server - // try to find out an active proxy server - activeProxyServer, err := core.FetchRandomActiveProxyServer(&m.ServiceManager.DbClient) - if err == nil { - chosenServer = activeProxyServer - } else { - // if no active proxy server found, choose a random one - chosenServer = servers[0] - } - // copy haproxy directory to the management server - logText += "Copying haproxy config from server " + chosenServer.HostName + " to local\n" - err = ssh_toolkit.CopyFolderFromRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, chosenServer.IP, chosenServer.SSHPort, chosenServer.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logText += "Failed to copy haproxy config from server " + chosenServer.HostName + " to " + server.HostName + "\n" - logText += "Error: " + err.Error() + "\n" - return err - } - } - // copy haproxy directory to the server - logText += "Copying haproxy config from local to server " + server.HostName + "\n" - err = ssh_toolkit.CopyFolderToRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logText += "Failed to copy haproxy config from local to server " + server.HostName + "\n" - logText += "Error: " + err.Error() + "\n" - return err - } - - logText += "Copied haproxy config from local to server " + server.HostName + "\n" - log.Println("Copied haproxy config from local to server " + server.HostName) + // TODO fix + //// fetch server + //server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // return err + //} + //// fetch server log + //serverLog, err := core.FetchServerLogByID(&m.ServiceManager.DbClient, request.LogId) + //if err != nil { + // if errors.Is(err, gorm.ErrRecordNotFound) { + // return nil + // } + // return err + //} + //// log + //logText := "Starting proxy setup on server " + server.HostName + "\n" + //// spawn a goroutine to update server log each 5 seconds + //go func() { + // lastSent := time.Now() + // for { + // select { + // case <-ctx.Done(): + // return + // default: + // if time.Since(lastSent) > 5*time.Second { + // serverLog.Content = logText + // _ = serverLog.Update(&m.ServiceManager.DbClient) + // lastSent = time.Now() + // } + // } + // } + //}() + //// defer to push final log + //defer func() { + // serverLog.Content = logText + // _ = serverLog.Update(&m.ServiceManager.DbClient) + //}() + //// fill local haproxy configuration (will be skipped anyhow if already exists) + //err = generateDefaultHAProxyConfiguration(m.Config) + //if err != nil { + // logText += "Failed to generate default haproxy configuration: " + err.Error() + "\n" + // return err + //} + //// check if any proxy server is already running + //servers, err := core.FetchAllProxyServers(&m.ServiceManager.DbClient) + //if err != nil { + // logText += "Failed to fetch all proxy servers: " + err.Error() + "\n" + // return err + //} + // + //if len(servers) > 0 { + // var chosenServer core.Server + // // try to find out an active proxy server + // activeProxyServer, err := core.FetchRandomActiveProxyServer(&m.ServiceManager.DbClient) + // if err == nil { + // chosenServer = activeProxyServer + // } else { + // // if no active proxy server found, choose a random one + // chosenServer = servers[0] + // } + // // copy haproxy directory to the management server + // logText += "Copying haproxy config from server " + chosenServer.HostName + " to local\n" + // err = ssh_toolkit.CopyFolderFromRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, chosenServer.IP, chosenServer.SSHPort, chosenServer.User, m.Config.SystemConfig.SshPrivateKey) + // if err != nil { + // logText += "Failed to copy haproxy config from server " + chosenServer.HostName + " to " + server.HostName + "\n" + // logText += "Error: " + err.Error() + "\n" + // return err + // } + //} + //// copy haproxy directory to the server + //logText += "Copying haproxy config from local to server " + server.HostName + "\n" + //err = ssh_toolkit.CopyFolderToRemoteServer(m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, m.Config.LocalConfig.ServiceConfig.HAProxyDataDirectoryPath, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logText += "Failed to copy haproxy config from local to server " + server.HostName + "\n" + // logText += "Error: " + err.Error() + "\n" + // return err + //} + // + //logText += "Copied haproxy config from local to server " + server.HostName + "\n" + //log.Println("Copied haproxy config from local to server " + server.HostName) return nil } diff --git a/swiftwave_service/worker/process_setup_server_request.go b/swiftwave_service/worker/process_setup_server_request.go index dee8fb950d..171ab8abe0 100644 --- a/swiftwave_service/worker/process_setup_server_request.go +++ b/swiftwave_service/worker/process_setup_server_request.go @@ -1,12 +1,8 @@ package worker import ( - "bytes" "context" "errors" - "fmt" - containermanger "github.com/swiftwave-org/swiftwave/pkg/container_manager" - "github.com/swiftwave-org/swiftwave/pkg/ssh_toolkit" "github.com/swiftwave-org/swiftwave/swiftwave_service/core" "github.com/swiftwave-org/swiftwave/swiftwave_service/logger" "gorm.io/gorm" @@ -36,6 +32,7 @@ func (m Manager) SetupServer(request SetupServerRequest, ctx context.Context, _ func (m Manager) setupServerHelper(request SetupServerRequest, ctx context.Context, _ context.CancelFunc) error { // fetch server server, err := core.FetchServerByID(&m.ServiceManager.DbClient, request.ServerId) + _ = server if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil @@ -93,167 +90,170 @@ func (m Manager) setupServerHelper(request SetupServerRequest, ctx context.Conte } for _, dir := range directories { - stdoutBuf := bytes.Buffer{} - stderrBuf := bytes.Buffer{} - err := ssh_toolkit.ExecCommandOverSSH(fmt.Sprintf("mkdir -p %s && chmod -R 0711 %s", dir, dir), &stdoutBuf, &stderrBuf, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logText += "Failed to create folder " + dir + "\n" - logText += stdoutBuf.String() + "\n" + stderrBuf.String() + "\n" - return err - } else { - logText += "Folder created > " + dir + "\n" - } + _ = dir + // TODO fix + //stdoutBuf := bytes.Buffer{} + //stderrBuf := bytes.Buffer{} + //err := ssh_toolkit.ExecCommandOverSSH(fmt.Sprintf("mkdir -p %s && chmod -R 0711 %s", dir, dir), &stdoutBuf, &stderrBuf, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logText += "Failed to create folder " + dir + "\n" + // logText += stdoutBuf.String() + "\n" + stderrBuf.String() + "\n" + // return err + //} else { + // logText += "Folder created > " + dir + "\n" + //} } - // check docker socket - conn, err := ssh_toolkit.NetConnOverSSH("unix", server.DockerUnixSocketPath, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logText += "Failed to connect to docker socket\n" - logText += fmt.Sprintf("%s should have acess to %s\n", server.User, server.DockerUnixSocketPath) - logText += err.Error() + "\n" - return err - } + // TODO fix + //// check docker socket + //conn, err := ssh_toolkit.NetConnOverSSH("unix", server.DockerUnixSocketPath, 5, server.IP, server.SSHPort, server.User, m.Config.SystemConfig.SshPrivateKey) + //if err != nil { + // logText += "Failed to connect to docker socket\n" + // logText += fmt.Sprintf("%s should have acess to %s\n", server.User, server.DockerUnixSocketPath) + // logText += err.Error() + "\n" + // return err + //} - // create a docker client - dockerClient, err := containermanger.New(ctx, conn) - if err != nil { - logText += "Failed to create docker client\n" - logText += err.Error() + "\n" - return err - } + //// create a docker client + //dockerClient, err := containermanger.New(ctx, conn) + //if err != nil { + // logText += "Failed to create docker client\n" + // logText += err.Error() + "\n" + // return err + //} + // + //defer func() { + // _ = dockerClient.Close() + //}() + // + //// Try to list volume [just to check if the docker client is working] + //_, err = dockerClient.FetchVolumes() + //if err != nil { + // logText += "Failed to connect to docker daemon\n" + // logText += err.Error() + "\n" + // return err + //} else { + // logText += "Docker client connected\n" + //} + // + //// Proceed request logic (reject in any other case) + //// - if, want to be manager + //// - if, there are some managers already, need to be online any of them + //// - if, no servers, then it will be the first manager + //// - if, want to be worker + //// - there need to be at least one manager + //var swarmManagerServer *core.Server + //if server.SwarmMode == core.SwarmManager { + // // Check if there are some servers already + // exists, err := core.IsPreparedServerExists(&m.ServiceManager.DbClient) + // if err != nil { + // logText += "Failed to check if there are some servers already\n" + // logText += err.Error() + "\n" + // return err + // } + // if exists { + // // Try to find out if there is any manager online + // r, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) + // if err != nil { + // logText += "Failed to find out if there is any swarm manager online\n" + // logText += err.Error() + "\n" + // return err + // } + // swarmManagerServer = &r + // } + //} else { + // // Check if there is any manager + // r, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) + // if err != nil { + // logText += "Failed to find out if there is any swarm manager\n" + // logText += err.Error() + "\n" + // return err + // } + // swarmManagerServer = &r + //} - defer func() { - _ = dockerClient.Close() - }() + //if swarmManagerServer == nil && server.SwarmMode == core.SwarmWorker { + // logText += "No manager found\n" + // logText += "At least one active swarm manager is required in cluster to add a worker\n" + // return err + //} - // Try to list volume [just to check if the docker client is working] - _, err = dockerClient.FetchVolumes() - if err != nil { - logText += "Failed to connect to docker daemon\n" - logText += err.Error() + "\n" - return err - } else { - logText += "Docker client connected\n" - } + //// NOTE: From here, if `swarmManagerServer` is nil, then this new server can be initialized as first swarm manager + //if swarmManagerServer == nil { + // // Initialize as first swarm manager + // err = dockerClient.InitializeAsManager(request.AdvertiseIP) + // if err != nil { + // logText += "Failed to initialize as first swarm manager\n" + // logText += err.Error() + "\n" + // return err + // } + //} else { + // // Get docker client of swarm manager + // swarmManagerConn, err := ssh_toolkit.NetConnOverSSH("unix", swarmManagerServer.DockerUnixSocketPath, 5, swarmManagerServer.IP, swarmManagerServer.SSHPort, swarmManagerServer.User, m.Config.SystemConfig.SshPrivateKey) + // if err != nil { + // logText += "Failed to connect to swarm manager\n" + // logText += err.Error() + "\n" + // return err + // } + // swarmManagerDockerClient, err := containermanger.New(ctx, swarmManagerConn) + // if err != nil { + // logText += "Failed to create docker client for swarm manager\n" + // logText += err.Error() + "\n" + // return err + // } + // // Fetch cluster join token from swarm manager + // var joinToken string + // if server.SwarmMode == core.SwarmManager { + // token, err := swarmManagerDockerClient.GenerateManagerJoinToken() + // if err != nil { + // logText += "Failed to generate manager join token\n" + // logText += err.Error() + "\n" + // return err + // } + // joinToken = token + // } else { + // token, err := swarmManagerDockerClient.GenerateWorkerJoinToken() + // if err != nil { + // logText += "Failed to generate worker join token\n" + // logText += err.Error() + "\n" + // return err + // } + // joinToken = token + // } + // // Add node to swarm cluster + // err = dockerClient.JoinSwarm(fmt.Sprintf("%s:2377", swarmManagerServer.IP), joinToken, request.AdvertiseIP) + // if err != nil { + // logText += "Failed to join swarm cluster\n" + // logText += err.Error() + "\n" + // return err + // } + //} - // Proceed request logic (reject in any other case) - // - if, want to be manager - // - if, there are some managers already, need to be online any of them - // - if, no servers, then it will be the first manager - // - if, want to be worker - // - there need to be at least one manager - var swarmManagerServer *core.Server - if server.SwarmMode == core.SwarmManager { - // Check if there are some servers already - exists, err := core.IsPreparedServerExists(&m.ServiceManager.DbClient) - if err != nil { - logText += "Failed to check if there are some servers already\n" - logText += err.Error() + "\n" - return err - } - if exists { - // Try to find out if there is any manager online - r, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) - if err != nil { - logText += "Failed to find out if there is any swarm manager online\n" - logText += err.Error() + "\n" - return err - } - swarmManagerServer = &r - } - } else { - // Check if there is any manager - r, err := core.FetchSwarmManager(&m.ServiceManager.DbClient) - if err != nil { - logText += "Failed to find out if there is any swarm manager\n" - logText += err.Error() + "\n" - return err - } - swarmManagerServer = &r - } - - if swarmManagerServer == nil && server.SwarmMode == core.SwarmWorker { - logText += "No manager found\n" - logText += "At least one active swarm manager is required in cluster to add a worker\n" - return err - } - - // NOTE: From here, if `swarmManagerServer` is nil, then this new server can be initialized as first swarm manager - if swarmManagerServer == nil { - // Initialize as first swarm manager - err = dockerClient.InitializeAsManager(request.AdvertiseIP) - if err != nil { - logText += "Failed to initialize as first swarm manager\n" - logText += err.Error() + "\n" - return err - } - } else { - // Get docker client of swarm manager - swarmManagerConn, err := ssh_toolkit.NetConnOverSSH("unix", swarmManagerServer.DockerUnixSocketPath, 5, swarmManagerServer.IP, swarmManagerServer.SSHPort, swarmManagerServer.User, m.Config.SystemConfig.SshPrivateKey) - if err != nil { - logText += "Failed to connect to swarm manager\n" - logText += err.Error() + "\n" - return err - } - swarmManagerDockerClient, err := containermanger.New(ctx, swarmManagerConn) - if err != nil { - logText += "Failed to create docker client for swarm manager\n" - logText += err.Error() + "\n" - return err - } - // Fetch cluster join token from swarm manager - var joinToken string - if server.SwarmMode == core.SwarmManager { - token, err := swarmManagerDockerClient.GenerateManagerJoinToken() - if err != nil { - logText += "Failed to generate manager join token\n" - logText += err.Error() + "\n" - return err - } - joinToken = token - } else { - token, err := swarmManagerDockerClient.GenerateWorkerJoinToken() - if err != nil { - logText += "Failed to generate worker join token\n" - logText += err.Error() + "\n" - return err - } - joinToken = token - } - // Add node to swarm cluster - err = dockerClient.JoinSwarm(fmt.Sprintf("%s:2377", swarmManagerServer.IP), joinToken, request.AdvertiseIP) - if err != nil { - logText += "Failed to join swarm cluster\n" - logText += err.Error() + "\n" - return err - } - } - - // create all the volume in the server - pvVolumes, err := core.FindAllPersistentVolumes(ctx, m.ServiceManager.DbClient) - if err != nil { - logText += "Failed to find all persistent volumes\nUser may need to create them manually\n" - logText += err.Error() + "\n" - } - for _, persistentVolume := range pvVolumes { - // remove volume (try) - _ = dockerClient.RemoveVolume(persistentVolume.Name) - // create volume - var err error - if persistentVolume.Type == core.PersistentVolumeTypeLocal { - err = dockerClient.CreateLocalVolume(persistentVolume.Name) - } else if persistentVolume.Type == core.PersistentVolumeTypeNFS { - err = dockerClient.CreateNFSVolume(persistentVolume.Name, persistentVolume.NFSConfig.Host, persistentVolume.NFSConfig.Path, persistentVolume.NFSConfig.Version) - } else if persistentVolume.Type == core.PersistentVolumeTypeCIFS { - err = dockerClient.CreateCIFSVolume(persistentVolume.Name, persistentVolume.CIFSConfig.Host, persistentVolume.CIFSConfig.Share, persistentVolume.CIFSConfig.Username, persistentVolume.CIFSConfig.Password, persistentVolume.CIFSConfig.FileMode, persistentVolume.CIFSConfig.DirMode, persistentVolume.CIFSConfig.Uid, persistentVolume.CIFSConfig.Gid) - } - if err != nil { - logText += "Failed to add persistent volume " + persistentVolume.Name + "\n" - logText += err.Error() + "\n" - } else { - logText += "Persistent volume " + persistentVolume.Name + " added successfully\n" - } - } + //// create all the volume in the server + //pvVolumes, err := core.FindAllPersistentVolumes(ctx, m.ServiceManager.DbClient) + //if err != nil { + // logText += "Failed to find all persistent volumes\nUser may need to create them manually\n" + // logText += err.Error() + "\n" + //} + //for _, persistentVolume := range pvVolumes { + // // remove volume (try) + // _ = dockerClient.RemoveVolume(persistentVolume.Name) + // // create volume + // var err error + // if persistentVolume.Type == core.PersistentVolumeTypeLocal { + // err = dockerClient.CreateLocalVolume(persistentVolume.Name) + // } else if persistentVolume.Type == core.PersistentVolumeTypeNFS { + // err = dockerClient.CreateNFSVolume(persistentVolume.Name, persistentVolume.NFSConfig.Host, persistentVolume.NFSConfig.Path, persistentVolume.NFSConfig.Version) + // } else if persistentVolume.Type == core.PersistentVolumeTypeCIFS { + // err = dockerClient.CreateCIFSVolume(persistentVolume.Name, persistentVolume.CIFSConfig.Host, persistentVolume.CIFSConfig.Share, persistentVolume.CIFSConfig.Username, persistentVolume.CIFSConfig.Password, persistentVolume.CIFSConfig.FileMode, persistentVolume.CIFSConfig.DirMode, persistentVolume.CIFSConfig.Uid, persistentVolume.CIFSConfig.Gid) + // } + // if err != nil { + // logText += "Failed to add persistent volume " + persistentVolume.Name + "\n" + // logText += err.Error() + "\n" + // } else { + // logText += "Persistent volume " + persistentVolume.Name + " added successfully\n" + // } + //} // set log logText += "Server is ready for deployment\n"