1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-29 16:30:56 -05:00
denoland-deno/runtime/js/40_read_file.js
Aaron O'Mullan 8b8b21b553
perf(runtime): read entire files in single ops (#14261)
Co-authored-by: Divy Srivastava <dj.srivastava23@gmail.com>
2022-04-27 16:03:44 +02:00

77 lines
1.9 KiB
JavaScript

// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
"use strict";
((window) => {
const core = window.Deno.core;
const { pathFromURL } = window.__bootstrap.util;
const { abortSignal } = window.__bootstrap;
function readFileSync(path) {
return core.opSync("op_readfile_sync", pathFromURL(path));
}
async function readFile(path, 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 {
const read = await core.opAsync(
"op_readfile_async",
pathFromURL(path),
cancelRid,
);
return read;
} finally {
if (options?.signal) {
options.signal[abortSignal.remove](abortHandler);
// always throw the abort error when aborted
options.signal.throwIfAborted();
}
}
}
function readTextFileSync(path) {
return core.opSync("op_readfile_text_sync", pathFromURL(path));
}
async function readTextFile(path, 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 {
const read = await core.opAsync(
"op_readfile_text_async",
pathFromURL(path),
cancelRid,
);
return read;
} finally {
if (options?.signal) {
options.signal[abortSignal.remove](abortHandler);
// always throw the abort error when aborted
options.signal.throwIfAborted();
}
}
}
window.__bootstrap.readFile = {
readFile,
readFileSync,
readTextFileSync,
readTextFile,
};
})(this);