1
1
import { bind } from 'decko' ;
2
- import { IDisposable , ITerminalOptions , Terminal } from '@xterm/xterm' ;
2
+ import type { IDisposable , ITerminalOptions } from '@xterm/xterm' ;
3
+ import { Terminal } from '@xterm/xterm' ;
3
4
import { CanvasAddon } from '@xterm/addon-canvas' ;
4
5
import { WebglAddon } from '@xterm/addon-webgl' ;
5
6
import { FitAddon } from '@xterm/addon-fit' ;
@@ -21,7 +22,7 @@ declare global {
21
22
}
22
23
}
23
24
24
- const enum Command {
25
+ enum Command {
25
26
// server side
26
27
OUTPUT = '0' ,
27
28
SET_WINDOW_TITLE = '1' ,
@@ -296,6 +297,40 @@ export class Xterm {
296
297
}
297
298
}
298
299
300
+ @bind
301
+ private parseOptsFromUrlQuery ( query : string ) : Preferences {
302
+ const { terminal } = this ;
303
+ const { clientOptions } = this . options ;
304
+ const prefs = { } as Preferences ;
305
+ const queryObj = Array . from ( new URLSearchParams ( query ) as unknown as Iterable < [ string , string ] > ) ;
306
+
307
+ for ( const [ k , queryVal ] of queryObj ) {
308
+ let v = clientOptions [ k ] ;
309
+ if ( v === undefined ) v = terminal . options [ k ] ;
310
+ switch ( typeof v ) {
311
+ case 'boolean' :
312
+ prefs [ k ] = queryVal === 'true' || queryVal === '1' ;
313
+ break ;
314
+ case 'number' :
315
+ case 'bigint' :
316
+ prefs [ k ] = Number . parseInt ( queryVal , 10 ) ;
317
+ break ;
318
+ case 'string' :
319
+ prefs [ k ] = queryVal ;
320
+ break ;
321
+ case 'object' :
322
+ prefs [ k ] = JSON . parse ( queryVal ) ;
323
+ break ;
324
+ default :
325
+ console . warn ( `[ttyd] maybe unknown option: ${ k } =${ queryVal } , treating as string` ) ;
326
+ prefs [ k ] = queryVal ;
327
+ break ;
328
+ }
329
+ }
330
+
331
+ return prefs ;
332
+ }
333
+
299
334
@bind
300
335
private onSocketData ( event : MessageEvent ) {
301
336
const { textDecoder } = this ;
@@ -315,6 +350,7 @@ export class Xterm {
315
350
this . applyPreferences ( {
316
351
...this . options . clientOptions ,
317
352
...JSON . parse ( textDecoder . decode ( data ) ) ,
353
+ ...this . parseOptsFromUrlQuery ( window . location . search ) ,
318
354
} as Preferences ) ;
319
355
break ;
320
356
default :
@@ -339,8 +375,8 @@ export class Xterm {
339
375
this . writeFunc = data => this . zmodemAddon ?. consume ( data ) ;
340
376
terminal . loadAddon ( register ( this . zmodemAddon ) ) ;
341
377
}
342
- Object . keys ( prefs ) . forEach ( key => {
343
- const value = prefs [ key ] ;
378
+
379
+ for ( const [ key , value ] of Object . entries ( prefs ) ) {
344
380
switch ( key ) {
345
381
case 'rendererType' :
346
382
this . setRendererType ( value ) ;
@@ -413,7 +449,7 @@ export class Xterm {
413
449
if ( key . indexOf ( 'font' ) === 0 ) fitAddon . fit ( ) ;
414
450
break ;
415
451
}
416
- } ) ;
452
+ }
417
453
}
418
454
419
455
@bind
0 commit comments