feat: allow passing a ReadableStream to Deno.writeFile/Deno.writeTextFile (#17329)

Closes #13229
This commit is contained in:
Leo Kettmeir 2023-01-12 03:37:23 +01:00 committed by GitHub
parent 692f9af14a
commit a6b3910bdf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 70 additions and 14 deletions

View file

@ -5,6 +5,9 @@
const ops = core.ops;
const { abortSignal } = window.__bootstrap;
const { pathFromURL } = window.__bootstrap.util;
const { open } = window.__bootstrap.files;
const { ReadableStreamPrototype } = window.__bootstrap.streams;
const { ObjectPrototypeIsPrototypeOf } = window.__bootstrap.primordials;
function writeFileSync(
path,
@ -36,16 +39,29 @@
options.signal[abortSignal.add](abortHandler);
}
try {
await core.opAsync(
"op_write_file_async",
pathFromURL(path),
options.mode,
options.append ?? false,
options.create ?? true,
options.createNew ?? false,
data,
cancelRid,
);
if (ObjectPrototypeIsPrototypeOf(ReadableStreamPrototype, data)) {
const file = await open(path, {
mode: options.mode,
append: options.append ?? false,
create: options.create ?? true,
createNew: options.createNew ?? false,
write: true,
});
await data.pipeTo(file.writable, {
signal: options.signal,
});
} else {
await core.opAsync(
"op_write_file_async",
pathFromURL(path),
options.mode,
options.append ?? false,
options.create ?? true,
options.createNew ?? false,
data,
cancelRid,
);
}
} finally {
if (options.signal) {
options.signal[abortSignal.remove](abortHandler);
@ -70,8 +86,16 @@
data,
options = {},
) {
const encoder = new TextEncoder();
return writeFile(path, encoder.encode(data), options);
if (ObjectPrototypeIsPrototypeOf(ReadableStreamPrototype, data)) {
return writeFile(
path,
data.pipeThrough(new TextEncoderStream()),
options,
);
} else {
const encoder = new TextEncoder();
return writeFile(path, encoder.encode(data), options);
}
}
window.__bootstrap.writeFile = {