diff --git a/src/vs/platform/download/common/download.ts b/src/vs/platform/download/common/download.ts index 9856da753ee..83bd30bdaa5 100644 --- a/src/vs/platform/download/common/download.ts +++ b/src/vs/platform/download/common/download.ts @@ -13,6 +13,6 @@ export interface IDownloadService { _serviceBrand: any; - download(uri: URI, to: string, cancellationToken?: CancellationToken): Promise; + download(uri: URI, to?: string, cancellationToken?: CancellationToken): Promise; -} \ No newline at end of file +} diff --git a/src/vs/platform/download/node/downloadIpc.ts b/src/vs/platform/download/node/downloadIpc.ts index 53144c3f1db..52ca30256fe 100644 --- a/src/vs/platform/download/node/downloadIpc.ts +++ b/src/vs/platform/download/node/downloadIpc.ts @@ -11,6 +11,8 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IDownloadService } from 'vs/platform/download/common/download'; import { mkdirp } from 'vs/base/node/pfs'; import { IURITransformer } from 'vs/base/common/uriIpc'; +import { tmpdir } from 'os'; +import { generateUuid } from 'vs/base/common/uuid'; export type UploadResponse = Buffer | string | undefined; @@ -46,21 +48,21 @@ export class DownloadServiceChannelClient implements IDownloadService { constructor(private channel: IChannel, private getUriTransformer: () => IURITransformer) { } - download(from: URI, to: string): Promise { + download(from: URI, to: string = path.join(tmpdir(), generateUuid())): Promise { from = this.getUriTransformer().transformOutgoingURI(from); const dirName = path.dirname(to); let out: fs.WriteStream; - return new Promise((c, e) => { + return new Promise((c, e) => { return mkdirp(dirName) .then(() => { out = fs.createWriteStream(to); - out.once('close', () => c()); + out.once('close', () => c(to)); out.once('error', e); const uploadStream = this.channel.listen('upload', from); const disposable = uploadStream(result => { if (result === undefined) { disposable.dispose(); - out.end(c); + out.end(() => c(to)); } else if (Buffer.isBuffer(result)) { out.write(result); } else if (typeof result === 'string') { @@ -71,4 +73,4 @@ export class DownloadServiceChannelClient implements IDownloadService { }); }); } -} \ No newline at end of file +} diff --git a/src/vs/platform/download/node/downloadService.ts b/src/vs/platform/download/node/downloadService.ts index c20cbd1a8d5..7822ed2253d 100644 --- a/src/vs/platform/download/node/downloadService.ts +++ b/src/vs/platform/download/node/downloadService.ts @@ -10,6 +10,9 @@ import { copy } from 'vs/base/node/pfs'; import { IRequestService } from 'vs/platform/request/node/request'; import { asText, download } from 'vs/base/node/request'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { join } from 'vs/base/common/path'; +import { tmpdir } from 'os'; +import { generateUuid } from 'vs/base/common/uuid'; export class DownloadService implements IDownloadService { @@ -19,18 +22,18 @@ export class DownloadService implements IDownloadService { @IRequestService private readonly requestService: IRequestService ) { } - download(uri: URI, target: string, cancellationToken: CancellationToken = CancellationToken.None): Promise { + download(uri: URI, target: string = join(tmpdir(), generateUuid()), cancellationToken: CancellationToken = CancellationToken.None): Promise { if (uri.scheme === Schemas.file) { - return copy(uri.fsPath, target); + return copy(uri.fsPath, target).then(() => target); } const options = { type: 'GET', url: uri.toString() }; return this.requestService.request(options, cancellationToken) .then(context => { if (context.res.statusCode === 200) { - return download(target, context); + return download(target, context).then(() => target); } return asText(context) .then(message => Promise.reject(new Error(`Expected 200, got back ${context.res.statusCode} instead.\n\n${message}`))); }); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/node/apiCommands.ts b/src/vs/workbench/api/node/apiCommands.ts index f2cc8adc5a6..8f748f3efb6 100644 --- a/src/vs/workbench/api/node/apiCommands.ts +++ b/src/vs/workbench/api/node/apiCommands.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { tmpdir } from 'os'; -import { join } from 'vs/base/common/path'; import * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; import { isMalformedFileUri } from 'vs/base/common/resources'; @@ -17,7 +15,6 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IDownloadService } from 'vs/platform/download/common/download'; -import { generateUuid } from 'vs/base/common/uuid'; // ----------------------------------------------------------------- // The following commands are registered on both sides separately. @@ -158,7 +155,5 @@ CommandsRegistry.registerCommand({ CommandsRegistry.registerCommand('_workbench.downloadResource', function (accessor: ServicesAccessor, resource: URI) { const downloadService = accessor.get(IDownloadService); - const location = join(tmpdir(), generateUuid()); - - return downloadService.download(resource, location).then(() => URI.file(location)); -}); \ No newline at end of file + return downloadService.download(resource).then(location => URI.file(location)); +});