Skip to content

Commit f77d676

Browse files
author
Benjamin Pasero
committed
files - 💄
1 parent bef1b60 commit f77d676

6 files changed

Lines changed: 49 additions & 48 deletions

File tree

src/vs/platform/files/common/fileService.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ import { TernarySearchTree } from 'vs/base/common/map';
1313
import { isNonEmptyArray, coalesce } from 'vs/base/common/arrays';
1414
import { getBaseLabel } from 'vs/base/common/labels';
1515
import { ILogService } from 'vs/platform/log/common/log';
16-
import { VSBuffer, VSBufferReadable, readableToBuffer, bufferToReadable, streamToBuffer, bufferToStream, VSBufferReadableStream, VSBufferReadableBufferedStream, bufferedStreamToBuffer } from 'vs/base/common/buffer';
16+
import { VSBuffer, VSBufferReadable, readableToBuffer, bufferToReadable, streamToBuffer, bufferToStream, VSBufferReadableStream, VSBufferReadableBufferedStream, bufferedStreamToBuffer, newWriteableBufferStream } from 'vs/base/common/buffer';
1717
import { isReadableStream, transform, peekReadable, peekStream, isReadableBufferedStream } from 'vs/base/common/stream';
1818
import { Queue } from 'vs/base/common/async';
1919
import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cancellation';
2020
import { Schemas } from 'vs/base/common/network';
21-
import { createVSBufferReadStream } from 'vs/platform/files/common/io';
21+
import { readFileIntoStream } from 'vs/platform/files/common/io';
2222

2323
export class FileService extends Disposable implements IFileService {
2424

@@ -476,11 +476,15 @@ export class FileService extends Disposable implements IFileService {
476476
}
477477

478478
private readFileBuffered(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, token: CancellationToken, options: IReadFileOptions = Object.create(null)): VSBufferReadableStream {
479-
return createVSBufferReadStream(provider, resource, {
479+
const stream = newWriteableBufferStream();
480+
481+
readFileIntoStream(provider, resource, stream, data => data, {
480482
...options,
481483
bufferSize: this.BUFFER_SIZE,
482484
errorTransformer: error => new FileOperationError(localize('err.read', "Unable to read file '{0}' ({1})", this.resourceForError(resource), ensureFileSystemProviderError(error).toString()), toFileOperationResult(error), options)
483485
}, token);
486+
487+
return stream;
484488
}
485489

486490
private async readFileUnbuffered(provider: IFileSystemProviderWithFileReadWriteCapability, resource: URI, options?: IReadFileOptions): Promise<VSBufferReadableStream> {

src/vs/platform/files/common/files.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ export interface IFileSystemProvider {
283283
readFile?(resource: URI): Promise<Uint8Array>;
284284
writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void>;
285285

286-
readFileStream?(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents<Uint8Array>;
286+
readFileStream?(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array>;
287287

288288
open?(resource: URI, opts: FileOpenOptions): Promise<number>;
289289
close?(fd: number): Promise<void>;
@@ -320,7 +320,7 @@ export function hasOpenReadWriteCloseCapability(provider: IFileSystemProvider):
320320
}
321321

322322
export interface IFileSystemProviderWithFileReadStreamCapability extends IFileSystemProvider {
323-
readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents<Uint8Array>;
323+
readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array>;
324324
}
325325

326326
export function hasFileReadStreamCapability(provider: IFileSystemProvider): provider is IFileSystemProviderWithFileReadStreamCapability {

src/vs/platform/files/common/io.ts

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
import { localize } from 'vs/nls';
77
import { URI } from 'vs/base/common/uri';
8-
import { VSBuffer, newWriteableBufferStream, VSBufferReadableStream } from 'vs/base/common/buffer';
8+
import { VSBuffer } from 'vs/base/common/buffer';
99
import { CancellationToken } from 'vs/base/common/cancellation';
1010
import { IFileSystemProviderWithOpenReadWriteCloseCapability, FileReadStreamOptions, createFileSystemProviderError, FileSystemProviderErrorCode, ensureFileSystemProviderError } from 'vs/platform/files/common/files';
1111
import { canceled } from 'vs/base/common/errors';
12-
import { IErrorTransformer, IDataTransformer, ReadableStream, WriteableStream, newWriteableStream } from 'vs/base/common/stream';
12+
import { IErrorTransformer, IDataTransformer, WriteableStream } from 'vs/base/common/stream';
1313

1414
export interface ICreateReadStreamOptions extends FileReadStreamOptions {
1515

@@ -24,39 +24,33 @@ export interface ICreateReadStreamOptions extends FileReadStreamOptions {
2424
errorTransformer?: IErrorTransformer;
2525
}
2626

27-
export function createVSBufferReadStream(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, options: ICreateReadStreamOptions, token?: CancellationToken): VSBufferReadableStream {
28-
const stream = newWriteableBufferStream();
29-
30-
readFileIntoStream(provider, resource, stream, data => data, options, token);
31-
32-
return stream;
33-
}
34-
35-
export function createUint8ArrayReadStream(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, options: ICreateReadStreamOptions, token?: CancellationToken): ReadableStream<Uint8Array> {
36-
const stream = newWriteableStream<Uint8Array>(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer);
37-
38-
readFileIntoStream(provider, resource, stream, data => data.buffer, options, token);
39-
40-
return stream;
41-
}
42-
43-
async function readFileIntoStream<T>(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, stream: WriteableStream<T>, transformer: IDataTransformer<VSBuffer, T>, options: ICreateReadStreamOptions, token?: CancellationToken): Promise<void> {
27+
/**
28+
* A helper to read a file from a provider with open/read/close capability into a stream.
29+
*/
30+
export async function readFileIntoStream<T>(
31+
provider: IFileSystemProviderWithOpenReadWriteCloseCapability,
32+
resource: URI,
33+
target: WriteableStream<T>,
34+
transformer: IDataTransformer<VSBuffer, T>,
35+
options: ICreateReadStreamOptions,
36+
token: CancellationToken
37+
): Promise<void> {
4438
let error: Error | undefined = undefined;
4539

4640
try {
47-
await doReadFileIntoStream(provider, resource, stream, transformer, options, token);
41+
await doReadFileIntoStream(provider, resource, target, transformer, options, token);
4842
} catch (err) {
4943
error = err;
5044
} finally {
5145
if (error && options.errorTransformer) {
5246
error = options.errorTransformer(error);
5347
}
5448

55-
stream.end(error);
49+
target.end(error);
5650
}
5751
}
5852

59-
async function doReadFileIntoStream<T>(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, stream: WriteableStream<T>, transformer: IDataTransformer<VSBuffer, T>, options: ICreateReadStreamOptions, token?: CancellationToken): Promise<void> {
53+
async function doReadFileIntoStream<T>(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, target: WriteableStream<T>, transformer: IDataTransformer<VSBuffer, T>, options: ICreateReadStreamOptions, token: CancellationToken): Promise<void> {
6054

6155
// Check for cancellation
6256
throwIfCancelled(token);
@@ -91,7 +85,7 @@ async function doReadFileIntoStream<T>(provider: IFileSystemProviderWithOpenRead
9185

9286
// when buffer full, create a new one and emit it through stream
9387
if (posInBuffer === buffer.byteLength) {
94-
stream.write(transformer(buffer));
88+
target.write(transformer(buffer));
9589

9690
buffer = VSBuffer.alloc(Math.min(options.bufferSize, typeof allowedRemainingBytes === 'number' ? allowedRemainingBytes : options.bufferSize));
9791

@@ -106,7 +100,7 @@ async function doReadFileIntoStream<T>(provider: IFileSystemProviderWithOpenRead
106100
lastChunkLength = Math.min(posInBuffer, allowedRemainingBytes);
107101
}
108102

109-
stream.write(transformer(buffer.slice(0, lastChunkLength)));
103+
target.write(transformer(buffer.slice(0, lastChunkLength)));
110104
}
111105
} catch (error) {
112106
throw ensureFileSystemProviderError(error);
@@ -115,8 +109,8 @@ async function doReadFileIntoStream<T>(provider: IFileSystemProviderWithOpenRead
115109
}
116110
}
117111

118-
function throwIfCancelled(token?: CancellationToken): boolean {
119-
if (token && token.isCancellationRequested) {
112+
function throwIfCancelled(token: CancellationToken): boolean {
113+
if (token.isCancellationRequested) {
120114
throw canceled();
121115
}
122116

src/vs/platform/files/node/diskFileSystemProvider.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ import { FileWatcher as WindowsWatcherService } from 'vs/platform/files/node/wat
2323
import { FileWatcher as NsfwWatcherService } from 'vs/platform/files/node/watcher/nsfw/watcherService';
2424
import { FileWatcher as NodeJSWatcherService } from 'vs/platform/files/node/watcher/nodejs/watcherService';
2525
import { CancellationToken } from 'vs/base/common/cancellation';
26-
import { ReadableStreamEvents } from 'vs/base/common/stream';
27-
import { createUint8ArrayReadStream } from 'vs/platform/files/common/io';
26+
import { ReadableStreamEvents, newWriteableStream } from 'vs/base/common/stream';
27+
import { readFileIntoStream } from 'vs/platform/files/common/io';
2828
import { insert } from 'vs/base/common/arrays';
29+
import { VSBuffer } from 'vs/base/common/buffer';
2930

3031
export interface IWatcherOptions {
3132
pollingInterval?: number;
@@ -153,11 +154,15 @@ export class DiskFileSystemProvider extends Disposable implements
153154
}
154155
}
155156

156-
readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents<Uint8Array> {
157-
return createUint8ArrayReadStream(this, resource, {
157+
readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array> {
158+
const stream = newWriteableStream<Uint8Array>(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer);
159+
160+
readFileIntoStream(this, resource, stream, data => data.buffer, {
158161
...opts,
159162
bufferSize: this.BUFFER_SIZE
160163
}, token);
164+
165+
return stream;
161166
}
162167

163168
async writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void> {

src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export class RemoteFileSystemProvider extends Disposable implements
121121
return buff.buffer;
122122
}
123123

124-
readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents<Uint8Array> {
124+
readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array> {
125125
const stream = newWriteableStream<Uint8Array>(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer);
126126

127127
// Reading as file stream goes through an event to the remote side
@@ -156,19 +156,17 @@ export class RemoteFileSystemProvider extends Disposable implements
156156
});
157157

158158
// Support cancellation
159-
if (token) {
160-
token.onCancellationRequested(() => {
159+
token.onCancellationRequested(() => {
161160

162-
// Ensure to end the stream properly with an error
163-
// to indicate the cancellation.
164-
stream.end(canceled());
161+
// Ensure to end the stream properly with an error
162+
// to indicate the cancellation.
163+
stream.end(canceled());
165164

166-
// Ensure to dispose the listener upon cancellation. This will
167-
// bubble through the remote side as event and allows to stop
168-
// reading the file.
169-
listener.dispose();
170-
});
171-
}
165+
// Ensure to dispose the listener upon cancellation. This will
166+
// bubble through the remote side as event and allows to stop
167+
// reading the file.
168+
listener.dispose();
169+
});
172170

173171
return stream;
174172
}

src/vs/workbench/services/userData/common/fileUserDataProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class FileUserDataProvider extends Disposable implements
6767
throw new Error('not supported');
6868
}
6969

70-
readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents<Uint8Array> {
70+
readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array> {
7171
if (hasFileReadStreamCapability(this.fileSystemProvider)) {
7272
return this.fileSystemProvider.readFileStream(this.toFileSystemResource(resource), opts, token);
7373
}

0 commit comments

Comments
 (0)