@@ -33,8 +33,6 @@ export class LanguageServerResolver {
3333 * @throws ToolkitError if no compatible version can be found
3434 */
3535 async resolve ( ) {
36- const timeout = new Timeout ( 5000 )
37- await showMessageWithCancel ( `Downloading '${ this . lsName } ' language server` , timeout )
3836 function getServerVersion ( result : LspResult ) {
3937 return {
4038 languageServerVersion : result . version ,
@@ -63,7 +61,6 @@ export class LanguageServerResolver {
6361 return await tryStageResolvers ( 'getServer' , serverResolvers , getServerVersion )
6462 } finally {
6563 logger . info ( `Finished setting up LSP server` )
66- timeout . cancel ( )
6764 }
6865 }
6966
@@ -87,19 +84,37 @@ export class LanguageServerResolver {
8784 }
8885 }
8986
87+ /**
88+ * Show a toast notification with progress bar for lsp remote downlaod
89+ * Returns a timeout to be passed down into httpFetcher to handle user cancellation
90+ */
91+ private async showDownloadProgress ( ) {
92+ const timeout = new Timeout ( 5000 )
93+ timeout ?. token . onCancellationRequested ( ( event ) => {
94+ logger . info ( 'Remote download cancelled by user' )
95+ } )
96+ await showMessageWithCancel ( `Downloading '${ this . lsName } ' language server` , timeout )
97+ return timeout
98+ }
99+
90100 private async fetchRemoteServer (
91101 cacheDirectory : string ,
92102 latestVersion : LspVersion ,
93103 targetContents : TargetContent [ ]
94104 ) : Promise < LspResult > {
95- if ( await this . downloadRemoteTargetContent ( targetContents , latestVersion . serverVersion ) ) {
96- return {
97- location : 'remote' ,
98- version : latestVersion . serverVersion ,
99- assetDirectory : cacheDirectory ,
105+ const timeout = await this . showDownloadProgress ( )
106+ try {
107+ if ( await this . downloadRemoteTargetContent ( targetContents , latestVersion . serverVersion , timeout ) ) {
108+ return {
109+ location : 'remote' ,
110+ version : latestVersion . serverVersion ,
111+ assetDirectory : cacheDirectory ,
112+ }
113+ } else {
114+ throw new ToolkitError ( 'Failed to download server from remote' , { code : 'RemoteDownloadFailed' } )
100115 }
101- } else {
102- throw new ToolkitError ( 'Failed to download server from remote' , { code : 'RemoteDownloadFailed' } )
116+ } finally {
117+ timeout . dispose ( )
103118 }
104119 }
105120
@@ -193,7 +208,7 @@ export class LanguageServerResolver {
193208 * true, if all of the contents were successfully downloaded and unzipped
194209 * false, if any of the contents failed to download or unzip
195210 */
196- private async downloadRemoteTargetContent ( contents : TargetContent [ ] , version : string ) {
211+ private async downloadRemoteTargetContent ( contents : TargetContent [ ] , version : string , timeout : Timeout ) {
197212 const downloadDirectory = this . getDownloadDirectory ( version )
198213
199214 if ( ! ( await fs . existsDir ( downloadDirectory ) ) ) {
@@ -202,7 +217,7 @@ export class LanguageServerResolver {
202217
203218 const fetchTasks = contents . map ( async ( content ) => {
204219 return {
205- res : await new HttpResourceFetcher ( content . url , { showUrl : true } ) . get ( ) ,
220+ res : await new HttpResourceFetcher ( content . url , { showUrl : true , timeout : timeout } ) . get ( ) ,
206221 hash : content . hashes [ 0 ] ,
207222 filename : content . filename ,
208223 }
0 commit comments