@@ -28,7 +28,8 @@ export class PortForward {
2828 output : stream . Writable ,
2929 err : stream . Writable | null ,
3030 input : stream . Readable ,
31- ) : Promise < WebSocket > {
31+ retryCount : number = 0 ,
32+ ) : Promise < WebSocket | ( ( ) => WebSocket | null ) > {
3233 if ( targetPorts . length === 0 ) {
3334 throw new Error ( 'You must provide at least one port to forward to.' ) ;
3435 }
@@ -45,29 +46,37 @@ export class PortForward {
4546 needsToReadPortNumber [ index * 2 + 1 ] = true ;
4647 } ) ;
4748 const path = `/api/v1/namespaces/${ namespace } /pods/${ podName } /portforward?${ queryStr } ` ;
48- const conn = await this . handler . connect (
49- path ,
50- null ,
51- ( streamNum : number , buff : Buffer | string ) : boolean => {
52- if ( streamNum >= targetPorts . length * 2 ) {
53- return ! this . disconnectOnErr ;
54- }
55- // First two bytes of each stream are the port number
56- if ( needsToReadPortNumber [ streamNum ] ) {
57- buff = buff . slice ( 2 ) ;
58- needsToReadPortNumber [ streamNum ] = false ;
59- }
60- if ( streamNum % 2 === 1 ) {
61- if ( err ) {
62- err . write ( buff ) ;
49+ const createWebSocket = ( ) : Promise < WebSocket > => {
50+ return this . handler . connect (
51+ path ,
52+ null ,
53+ ( streamNum : number , buff : Buffer | string ) : boolean => {
54+ if ( streamNum >= targetPorts . length * 2 ) {
55+ return ! this . disconnectOnErr ;
6356 }
64- } else {
65- output . write ( buff ) ;
66- }
67- return true ;
68- } ,
69- ) ;
70- WebSocketHandler . handleStandardInput ( conn , input , 0 ) ;
71- return conn ;
57+ // First two bytes of each stream are the port number
58+ if ( needsToReadPortNumber [ streamNum ] ) {
59+ buff = buff . slice ( 2 ) ;
60+ needsToReadPortNumber [ streamNum ] = false ;
61+ }
62+ if ( streamNum % 2 === 1 ) {
63+ if ( err ) {
64+ err . write ( buff ) ;
65+ }
66+ } else {
67+ output . write ( buff ) ;
68+ }
69+ return true ;
70+ } ,
71+ ) ;
72+ } ;
73+
74+ if ( retryCount < 1 ) {
75+ const ws = await createWebSocket ( ) ;
76+ WebSocketHandler . handleStandardInput ( ws , input , 0 ) ;
77+ return ws ;
78+ }
79+
80+ return WebSocketHandler . restartableHandleStandardInput ( createWebSocket , input , 0 , retryCount ) ;
7281 }
7382}
0 commit comments