55
66import { localize } from 'vs/nls' ;
77import { URI } from 'vs/base/common/uri' ;
8- import { VSBuffer , VSBufferWriteableStream , newWriteableBufferStream , VSBufferReadableStream } from 'vs/base/common/buffer' ;
8+ import { VSBuffer , newWriteableBufferStream , VSBufferReadableStream } from 'vs/base/common/buffer' ;
99import { CancellationToken } from 'vs/base/common/cancellation' ;
1010import { IFileSystemProviderWithOpenReadWriteCloseCapability , FileReadStreamOptions , createFileSystemProviderError , FileSystemProviderErrorCode , ensureFileSystemProviderError } from 'vs/platform/files/common/files' ;
1111import { canceled } from 'vs/base/common/errors' ;
12+ import { IErrorTransformer , IDataTransformer , ReadableStream , WriteableStream , newWriteableStream } from 'vs/base/common/stream' ;
1213
1314export interface ICreateReadStreamOptions extends FileReadStreamOptions {
1415
1516 /**
1617 * The size of the buffer to use before sending to the stream.
1718 */
1819 bufferSize : number ;
20+
21+ /**
22+ * Allows to massage any possibly error that happens during reading.
23+ */
24+ errorTransformer ?: IErrorTransformer ;
1925}
2026
21- export function createReadStream ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , options : ICreateReadStreamOptions , token ?: CancellationToken ) : VSBufferReadableStream {
27+ export function createVSBufferReadStream ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , options : ICreateReadStreamOptions , token ?: CancellationToken ) : VSBufferReadableStream {
2228 const stream = newWriteableBufferStream ( ) ;
2329
24- // do not await reading but simply return the stream directly since it operates
25- // via events. finally end the stream and send through the possible error
26- let error : Error | undefined = undefined ;
30+ readFileIntoStream ( provider , resource , stream , data => data , options , token ) ;
2731
28- doReadFileIntoStream ( provider , resource , stream , options , token ) . then ( undefined , err => error = err ) . finally ( ( ) => stream . end ( error ) ) ;
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 ) ;
2939
3040 return stream ;
3141}
3242
33- async function doReadFileIntoStream ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , stream : VSBufferWriteableStream , options : ICreateReadStreamOptions , token ?: CancellationToken ) : Promise < void > {
43+ async function readFileIntoStream < T > ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , stream : WriteableStream < T > , transformer : IDataTransformer < VSBuffer , T > , options : ICreateReadStreamOptions , token ?: CancellationToken ) : Promise < void > {
44+ let error : Error | undefined = undefined ;
45+
46+ try {
47+ await doReadFileIntoStream ( provider , resource , stream , transformer , options , token ) ;
48+ } catch ( err ) {
49+ error = err ;
50+ } finally {
51+ if ( error && options . errorTransformer ) {
52+ error = options . errorTransformer ( error ) ;
53+ }
54+
55+ stream . end ( error ) ;
56+ }
57+ }
58+
59+ async function doReadFileIntoStream < T > ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , stream : WriteableStream < T > , transformer : IDataTransformer < VSBuffer , T > , options : ICreateReadStreamOptions , token ?: CancellationToken ) : Promise < void > {
3460
3561 // Check for cancellation
3662 throwIfCancelled ( token ) ;
@@ -65,7 +91,7 @@ async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWri
6591
6692 // when buffer full, create a new one and emit it through stream
6793 if ( posInBuffer === buffer . byteLength ) {
68- stream . write ( buffer ) ;
94+ stream . write ( transformer ( buffer ) ) ;
6995
7096 buffer = VSBuffer . alloc ( Math . min ( options . bufferSize , typeof allowedRemainingBytes === 'number' ? allowedRemainingBytes : options . bufferSize ) ) ;
7197
@@ -80,7 +106,7 @@ async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWri
80106 lastChunkLength = Math . min ( posInBuffer , allowedRemainingBytes ) ;
81107 }
82108
83- stream . write ( buffer . slice ( 0 , lastChunkLength ) ) ;
109+ stream . write ( transformer ( buffer . slice ( 0 , lastChunkLength ) ) ) ;
84110 }
85111 } catch ( error ) {
86112 throw ensureFileSystemProviderError ( error ) ;
0 commit comments