@@ -56,7 +56,7 @@ import { BrowserElevatedFileService } from 'vs/workbench/services/files/browser/
5656import { IElevatedFileService } from 'vs/workbench/services/files/common/elevatedFileService.service'
5757import * as resources from 'vs/base/common/resources'
5858import { VSBuffer } from 'vs/base/common/buffer'
59- import { type ReadableStreamEvents , newWriteableStream } from 'vs/base/common/stream'
59+ import { type ReadableStreamEvents , listenStream , newWriteableStream } from 'vs/base/common/stream'
6060import { CancellationToken } from 'vs/base/common/cancellation'
6161import { checkServicesNotInitialized , registerServiceInitializePreParticipant } from '../lifecycle'
6262import { logsPath } from '../workbench'
@@ -762,8 +762,8 @@ class OverlayFileSystemProvider
762762 FileSystemProviderCapabilities . FileReadStream |
763763 FileSystemProviderCapabilities . FileAppend
764764
765- private readFromDelegates < T > (
766- caller : ( delegate : IFileSystemProviderWithFileReadWriteCapability ) => T ,
765+ private async readFromDelegates < T > (
766+ caller : ( delegate : IFileSystemProviderWithFileReadWriteCapability ) => Promise < T > ,
767767 token ?: CancellationToken
768768 ) {
769769 if ( this . delegates . length === 0 ) {
@@ -775,7 +775,7 @@ class OverlayFileSystemProvider
775775 throw new Error ( 'Cancelled' )
776776 }
777777 try {
778- return caller ( delegate )
778+ return await caller ( delegate )
779779 } catch ( err ) {
780780 errors . push ( err )
781781 if ( err instanceof FileSystemProviderError ) {
@@ -859,29 +859,48 @@ class OverlayFileSystemProvider
859859 opts : IFileReadStreamOptions ,
860860 token : CancellationToken
861861 ) : ReadableStreamEvents < Uint8Array > {
862- return this . readFromDelegates < ReadableStreamEvents < Uint8Array > > ( ( delegate ) => {
862+ const writableStream = newWriteableStream < Uint8Array > (
863+ ( data ) => VSBuffer . concat ( data . map ( ( data ) => VSBuffer . wrap ( data ) ) ) . buffer
864+ )
865+ this . readFromDelegates ( async ( delegate ) => {
863866 if ( hasFileReadStreamCapability ( delegate ) ) {
864- return delegate . readFileStream ( resource , opts , token )
867+ const stream = delegate . readFileStream ( resource , opts , token )
868+ await new Promise < void > ( ( resolve , reject ) => {
869+ let dataReceived = false
870+ listenStream (
871+ stream ,
872+ {
873+ onData ( data ) {
874+ dataReceived = true
875+ void writableStream . write ( data )
876+ } ,
877+ onEnd ( ) {
878+ writableStream . end ( )
879+ resolve ( )
880+ } ,
881+ onError ( err ) {
882+ if ( ! dataReceived ) {
883+ reject ( err )
884+ } else {
885+ writableStream . error ( err )
886+ }
887+ }
888+ } ,
889+ token
890+ )
891+ } )
865892 } else {
866- const writableStream = newWriteableStream < Uint8Array > (
867- ( data ) => VSBuffer . concat ( data . map ( ( data ) => VSBuffer . wrap ( data ) ) ) . buffer
868- )
869- ; ( async ( ) => {
870- try {
871- let data = await this . readFile ( resource )
872- if ( typeof opts . position === 'number' || typeof opts . length === 'number' ) {
873- data = data . slice ( opts . position ?? 0 , opts . length )
874- }
875-
876- writableStream . end ( data )
877- } catch ( err ) {
878- writableStream . error ( err as Error )
879- }
880- } ) ( )
881-
882- return writableStream
893+ let data = await this . readFile ( resource )
894+ if ( typeof opts . position === 'number' || typeof opts . length === 'number' ) {
895+ data = data . slice ( opts . position ?? 0 , opts . length )
896+ }
897+ return writableStream . end ( data )
883898 }
884- } , token )
899+ } , token ) . catch ( ( err ) => {
900+ writableStream . error ( err )
901+ } )
902+
903+ return writableStream
885904 }
886905
887906 async readdir ( resource : URI ) : Promise < [ string , FileType ] [ ] > {
0 commit comments