@@ -4,18 +4,19 @@ import type { IDEFrontendState } from '@gitpod/gitpod-protocol/lib/ide-frontend-
4
4
5
5
import type ReconnectingWebSocket from "reconnecting-websocket" ;
6
6
import fetchBuilder from "fetch-retry" ;
7
- import type { Terminal , ITerminalOptions , ITerminalAddon } from "xterm" ;
7
+ import type { Terminal , ITerminalOptions , ITerminalAddon } from "@xterm/ xterm" ;
8
8
9
- import { AttachAddon } from "xterm- addon-attach" ;
10
- import { FitAddon } from "xterm- addon-fit" ;
9
+ import { AttachAddon } from "@ xterm/ addon-attach" ;
10
+ import { FitAddon } from "@ xterm/ addon-fit" ;
11
11
12
12
import { resizeRemoteTerminal } from "./lib/remote" ;
13
13
import { IXtermWindow } from "./lib/types" ;
14
14
import { webLinksHandler } from "./lib/addons" ;
15
15
import { initiateRemoteCommunicationChannelSocket } from "./lib/remote" ;
16
16
import { Emitter } from '@gitpod/gitpod-protocol/lib/util/event' ;
17
17
import { DisposableCollection } from '@gitpod/gitpod-protocol/lib/util/disposable' ;
18
- import { debounce , isWindows } from './lib/helpers' ;
18
+ import { isWindows } from './lib/helpers' ;
19
+ import debounce from "lodash/debounce"
19
20
20
21
const onDidChangeState = new Emitter < void > ( ) ;
21
22
let state : IDEFrontendState = "initializing" as IDEFrontendState ;
@@ -24,11 +25,11 @@ const maxReconnectionRetries = 50;
24
25
25
26
const fetchOptions = {
26
27
retries : maxReconnectionRetries ,
27
- retryDelay : ( attempt : number , _error : Error , _response : Response ) => {
28
+ retryDelay : ( attempt : number , _error : Error | null , _response : Response | null ) => {
28
29
return Math . pow ( 1.25 , attempt ) * 200 ;
29
30
} ,
30
- retryOn : ( attempt : number , error : Error , response : Response ) => {
31
- if ( error !== null || response . status >= 400 ) {
31
+ retryOn : ( attempt : number , error : Error | null , response : Response | null ) => {
32
+ if ( error !== null || ( response ? .status ?? 0 ) >= 400 ) {
32
33
console . log ( `retrying, attempt number ${ attempt + 1 } , ${ ( Math . pow ( 1.25 , attempt ) * 300 ) / 1000 } ` ) ;
33
34
return true ;
34
35
} else {
@@ -59,17 +60,17 @@ export const webSocketSettings: ReconnectingWebSocket['_options'] = {
59
60
const extraTerminalAddons : { [ key : string ] : ITerminalAddon } = { } ;
60
61
61
62
( async ( ) => {
62
- extraTerminalAddons [ 'ligatures' ] = new ( await import ( "xterm- addon-ligatures" ) ) . LigaturesAddon ( ) ;
63
- extraTerminalAddons [ 'unicode' ] = new ( await import ( "xterm- addon-unicode11" ) ) . Unicode11Addon ( ) ;
64
- extraTerminalAddons [ 'webLinks' ] = new ( await import ( "xterm- addon-web-links" ) ) . WebLinksAddon ( webLinksHandler ) ;
63
+ extraTerminalAddons [ 'ligatures' ] = new ( await import ( "@ xterm/ addon-ligatures" ) ) . LigaturesAddon ( ) ;
64
+ extraTerminalAddons [ 'unicode' ] = new ( await import ( "@ xterm/ addon-unicode11" ) ) . Unicode11Addon ( ) ;
65
+ extraTerminalAddons [ 'webLinks' ] = new ( await import ( "@ xterm/ addon-web-links" ) ) . WebLinksAddon ( webLinksHandler ) ;
65
66
} ) ( )
66
67
67
68
async function initAddons ( term : Terminal ) : Promise < void > {
68
69
for ( const addon of Object . values ( extraTerminalAddons ) ) {
69
70
term . loadAddon ( addon ) ;
70
71
}
71
72
72
- const webglRenderer = new ( await import ( "xterm- addon-webgl" ) ) . WebglAddon ;
73
+ const webglRenderer = new ( await import ( "@ xterm/ addon-webgl" ) ) . WebglAddon ;
73
74
try {
74
75
term . loadAddon ( webglRenderer ) ;
75
76
console . debug ( "Loaded webgl renderer" ) ;
@@ -79,7 +80,7 @@ async function initAddons(term: Terminal): Promise<void> {
79
80
} catch ( e ) {
80
81
console . warn ( `Webgl renderer could not be loaded. Falling back to the canvas renderer type.` , e ) ;
81
82
webglRenderer . dispose ( ) ;
82
- const canvasRenderer = new ( await import ( "xterm- addon-canvas" ) ) . CanvasAddon ;
83
+ const canvasRenderer = new ( await import ( "@ xterm/ addon-canvas" ) ) . CanvasAddon ;
83
84
term . loadAddon ( canvasRenderer ) ;
84
85
}
85
86
@@ -133,7 +134,7 @@ async function createTerminal(element: HTMLElement, toDispose: DisposableCollect
133
134
element . removeChild ( element . children [ 0 ] ) ;
134
135
}
135
136
136
- const { Terminal } = ( await import ( "xterm" ) ) ;
137
+ const { Terminal } = ( await import ( "@xterm/ xterm" ) ) ;
137
138
138
139
term = new Terminal ( {
139
140
windowsMode : isWindows ,
@@ -191,7 +192,7 @@ async function createTerminal(element: HTMLElement, toDispose: DisposableCollect
191
192
throw new Error ( "Couldn't set up a remote connection to the terminal process" ) ;
192
193
}
193
194
194
- const debouncedUpdateTerminalSize = debounce ( ( ) => updateTerminalSize ( term ) , 200 , true ) ;
195
+ const debouncedUpdateTerminalSize = debounce ( ( ) => updateTerminalSize ( term ) , 200 , { trailing : true } ) ;
195
196
window . onresize = ( ) => debouncedUpdateTerminalSize ( ) ;
196
197
197
198
return { terminal : term , socket : terminalSocket } ;
0 commit comments