0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-10-29 08:58:01 -04:00
denoland-deno/runtime/js/40_write_file.js
David Sherret a64e63c361
perf: move Deno.writeTextFile and like functions to Rust (#14221)
Co-authored-by: Luca Casonato <hello@lcas.dev>
2022-04-18 18:00:14 -04:00

79 lines
1.8 KiB
JavaScript

// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
"use strict";
((window) => {
const core = window.__bootstrap.core;
const { abortSignal } = window.__bootstrap;
const { pathFromURL } = window.__bootstrap.util;
function writeFileSync(
path,
data,
options = {},
) {
options.signal?.throwIfAborted();
core.opSync("op_write_file_sync", {
path: pathFromURL(path),
data,
mode: options.mode,
append: options.append ?? false,
create: options.create ?? true,
});
}
async function writeFile(
path,
data,
options = {},
) {
let cancelRid;
let abortHandler;
if (options.signal) {
options.signal.throwIfAborted();
cancelRid = core.opSync("op_cancel_handle");
abortHandler = () => core.tryClose(cancelRid);
options.signal[abortSignal.add](abortHandler);
}
try {
await core.opAsync("op_write_file_async", {
path: pathFromURL(path),
data,
mode: options.mode,
append: options.append ?? false,
create: options.create ?? true,
cancelRid,
});
} finally {
if (options.signal) {
options.signal[abortSignal.remove](abortHandler);
// always throw the abort error when aborted
options.signal.throwIfAborted();
}
}
}
function writeTextFileSync(
path,
data,
options = {},
) {
const encoder = new TextEncoder();
return writeFileSync(path, encoder.encode(data), options);
}
function writeTextFile(
path,
data,
options = {},
) {
const encoder = new TextEncoder();
return writeFile(path, encoder.encode(data), options);
}
window.__bootstrap.writeFile = {
writeTextFile,
writeTextFileSync,
writeFile,
writeFileSync,
};
})(this);