Skip to content

Commit 07ec9b2

Browse files
author
tomzu
committed
feat(amazonq): user cancellable lsp download
1 parent 79ab9f8 commit 07ec9b2

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

packages/core/src/shared/lsp/lspResolver.ts

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)