From faf868edf46e2dd8c50b71f78ede45c523b64c37 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 Oct 2018 12:20:05 +0200 Subject: [PATCH] propagate error when it happens very early, make sure to throw meaningful error on ext host side, #61182 --- src/vs/base/node/encoding.ts | 3 +++ .../workbench/api/node/extHostFileSystem.ts | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index 8f9b63fa30b..3b7c4235f67 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -30,6 +30,9 @@ export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions } return new Promise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }>((resolve, reject) => { + + readable.on('error', reject); + readable.pipe(new class extends Writable { private _decodeStream: NodeJS.ReadWriteStream; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 982fccfd7b4..60ad98ac297 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -153,41 +153,59 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return { type, ctime, mtime, size }; } + private _checkProviderExists(handle: number): void { + if (!this._fsProvider.has(handle)) { + const err = new Error(); + err.name = 'ENOPRO'; + err.message = `no provider`; + throw err; + } + } + $stat(handle: number, resource: UriComponents): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).stat(URI.revive(resource))).then(ExtHostFileSystem._asIStat); } $readdir(handle: number, resource: UriComponents): Promise<[string, files.FileType][]> { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).readDirectory(URI.revive(resource))); } $readFile(handle: number, resource: UriComponents): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).readFile(URI.revive(resource))).then(data => { return Buffer.isBuffer(data) ? data : Buffer.from(data.buffer, data.byteOffset, data.byteLength); }); } $writeFile(handle: number, resource: UriComponents, content: Buffer, opts: files.FileWriteOptions): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).writeFile(URI.revive(resource), content, opts)); } $delete(handle: number, resource: UriComponents, opts: files.FileDeleteOptions): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).delete(URI.revive(resource), opts)); } $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts)); } $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts)); } $mkdir(handle: number, resource: UriComponents): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).createDirectory(URI.revive(resource))); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { + this._checkProviderExists(handle); let subscription = this._fsProvider.get(handle).watch(URI.revive(resource), opts); this._watches.set(session, subscription); } @@ -201,18 +219,22 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $open(handle: number, resource: UriComponents): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).open(URI.revive(resource))); } $close(handle: number, fd: number): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).close(fd)); } $read(handle: number, fd: number, pos: number, data: Buffer, offset: number, length: number): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).read(fd, pos, data, offset, length)); } $write(handle: number, fd: number, pos: number, data: Buffer, offset: number, length: number): Promise { + this._checkProviderExists(handle); return Promise.resolve(this._fsProvider.get(handle).write(fd, pos, data, offset, length)); }