390
}
391
}
393
>
try {
394
>
395
>
// validate write (this may already return a peeked-at buffer)
396
>
let { stat, buffer: bufferOrReadableOrStreamOrBufferedStream } = await this.validateWriteFile(provider, resource, bufferOrReadableOrStream, writeFileOptions);
397
>
398
>
// mkdir recursively as needed
399
>
if (!stat) {
400
await this.mkdirp(provider, providerExtUri.dirname(resource));
401
}
403
>
// optimization: if the provider has unbuffered write capability and the data
404
>
// to write is not a buffer, we consume up to 3 chunks and try to write the data
405
>
// unbuffered to reduce the overhead. If the stream or readable has more data
406
>
// to provide we continue to write buffered.
407
>
if (!bufferOrReadableOrStreamOrBufferedStream) {
408
>
bufferOrReadableOrStreamOrBufferedStream = await this.peekBufferForWriting(provider, bufferOrReadableOrStream);
409
>
}
410
>
411
>
// write file: unbuffered
412
>
if (
413
>
!hasOpenReadWriteCloseCapability(provider) || // buffered writing is unsupported
414
>
(hasReadWriteCapability(provider) && bufferOrReadableOrStreamOrBufferedStream instanceof VSBuffer) || // data is a full buffer already
415
(hasReadWriteCapability(provider) && hasFileAtomicWriteCapability(provider) && writeFileOptions?.atomic) // atomic write forces unbuffered write if the provider supports it
417
>
await this.doWriteUnbuffered(provider, resource, writeFileOptions, bufferOrReadableOrStreamOrBufferedStream);
418
>
}
419
420
// write file: buffered