summaryrefslogtreecommitdiff
path: root/runtime/js/30_fs.js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js/30_fs.js')
-rw-r--r--runtime/js/30_fs.js251
1 files changed, 174 insertions, 77 deletions
diff --git a/runtime/js/30_fs.js b/runtime/js/30_fs.js
index 2457713e6..4a78ebcad 100644
--- a/runtime/js/30_fs.js
+++ b/runtime/js/30_fs.js
@@ -11,16 +11,19 @@
ObjectPrototypeIsPrototypeOf,
SymbolAsyncIterator,
SymbolIterator,
+ Function,
+ ObjectEntries,
+ Uint32Array,
} = window.__bootstrap.primordials;
const { pathFromURL } = window.__bootstrap.util;
const build = window.__bootstrap.build.build;
function chmodSync(path, mode) {
- ops.op_chmod_sync({ path: pathFromURL(path), mode });
+ ops.op_chmod_sync(pathFromURL(path), mode);
}
async function chmod(path, mode) {
- await core.opAsync("op_chmod_async", { path: pathFromURL(path), mode });
+ await core.opAsync("op_chmod_async", pathFromURL(path), mode);
}
function chownSync(
@@ -28,7 +31,7 @@
uid,
gid,
) {
- ops.op_chown_sync({ path: pathFromURL(path), uid, gid });
+ ops.op_chown_sync(pathFromURL(path), uid, gid);
}
async function chown(
@@ -38,7 +41,9 @@
) {
await core.opAsync(
"op_chown_async",
- { path: pathFromURL(path), uid, gid },
+ pathFromURL(path),
+ uid,
+ gid,
);
}
@@ -46,20 +51,21 @@
fromPath,
toPath,
) {
- ops.op_copy_file_sync({
- from: pathFromURL(fromPath),
- to: pathFromURL(toPath),
- });
+ ops.op_copy_file_sync(
+ pathFromURL(fromPath),
+ pathFromURL(toPath),
+ );
}
async function copyFile(
fromPath,
toPath,
) {
- await core.opAsync("op_copy_file_async", {
- from: pathFromURL(fromPath),
- to: pathFromURL(toPath),
- });
+ await core.opAsync(
+ "op_copy_file_async",
+ pathFromURL(fromPath),
+ pathFromURL(toPath),
+ );
}
function cwd() {
@@ -148,36 +154,111 @@
path,
options = {},
) {
- ops.op_remove_sync({
- path: pathFromURL(path),
- recursive: !!options.recursive,
- });
+ ops.op_remove_sync(
+ pathFromURL(path),
+ !!options.recursive,
+ );
}
async function remove(
path,
options = {},
) {
- await core.opAsync("op_remove_async", {
- path: pathFromURL(path),
- recursive: !!options.recursive,
- });
+ await core.opAsync(
+ "op_remove_async",
+ pathFromURL(path),
+ !!options.recursive,
+ );
}
function renameSync(oldpath, newpath) {
- ops.op_rename_sync({
- oldpath: pathFromURL(oldpath),
- newpath: pathFromURL(newpath),
- });
+ ops.op_rename_sync(
+ pathFromURL(oldpath),
+ pathFromURL(newpath),
+ );
}
async function rename(oldpath, newpath) {
- await core.opAsync("op_rename_async", {
- oldpath: pathFromURL(oldpath),
- newpath: pathFromURL(newpath),
- });
+ await core.opAsync(
+ "op_rename_async",
+ pathFromURL(oldpath),
+ pathFromURL(newpath),
+ );
}
+ // Extract the FsStat object from the encoded buffer.
+ // See `runtime/ops/fs.rs` for the encoder.
+ //
+ // This is not a general purpose decoder. There are 4 types:
+ //
+ // 1. date
+ // offset += 4
+ // 1/0 | extra padding | high u32 | low u32
+ // if date[0] == 1, new Date(u64) else null
+ //
+ // 2. bool
+ // offset += 2
+ // 1/0 | extra padding
+ //
+ // 3. u64
+ // offset += 2
+ // high u32 | low u32
+ //
+ // 4. ?u64 converts a zero u64 value to JS null on Windows.
+ function createByteStruct(types) {
+ // types can be "date", "bool" or "u64".
+ // `?` prefix means optional on windows.
+ let offset = 0;
+ let str =
+ 'const unix = Deno.build.os === "darwin" || Deno.build.os === "linux"; return {';
+ for (let [name, type] of ObjectEntries(types)) {
+ const optional = type.startsWith("?");
+ if (optional) type = type.slice(1);
+
+ if (type == "u64") {
+ if (!optional) {
+ str += `${name}: view[${offset}] + view[${offset + 1}] * 2**32,`;
+ } else {
+ str += `${name}: (unix ? (view[${offset}] + view[${
+ offset + 1
+ }] * 2**32) : (view[${offset}] + view[${
+ offset + 1
+ }] * 2**32) || null),`;
+ }
+ } else if (type == "date") {
+ str += `${name}: view[${offset}] === 0 ? null : new Date(view[${
+ offset + 2
+ }] + view[${offset + 3}] * 2**32),`;
+ offset += 2;
+ } else {
+ str += `${name}: !!(view[${offset}] + view[${offset + 1}] * 2**32),`;
+ }
+ offset += 2;
+ }
+ str += "};";
+ // ...so you don't like eval huh? don't worry, it only executes during snapshot :)
+ return [new Function("view", str), new Uint32Array(offset)];
+ }
+
+ const [statStruct, statBuf] = createByteStruct({
+ isFile: "bool",
+ isDirectory: "bool",
+ isSymlink: "bool",
+ size: "u64",
+ mtime: "date",
+ atime: "date",
+ birthtime: "date",
+ dev: "?u64",
+ ino: "?u64",
+ mode: "?u64",
+ nlink: "?u64",
+ uid: "?u64",
+ gid: "?u64",
+ rdev: "?u64",
+ blksize: "?u64",
+ blocks: "?u64",
+ });
+
function parseFileInfo(response) {
const unix = build.os === "darwin" || build.os === "linux";
return {
@@ -185,9 +266,9 @@
isDirectory: response.isDirectory,
isSymlink: response.isSymlink,
size: response.size,
- mtime: response.mtime != null ? new Date(response.mtime) : null,
- atime: response.atime != null ? new Date(response.atime) : null,
- birthtime: response.birthtime != null
+ mtime: response.mtimeSet !== null ? new Date(response.mtime) : null,
+ atime: response.atimeSet !== null ? new Date(response.atime) : null,
+ birthtime: response.birthtimeSet !== null
? new Date(response.birthtime)
: null,
// Only non-null if on Unix
@@ -204,7 +285,8 @@
}
function fstatSync(rid) {
- return parseFileInfo(ops.op_fstat_sync(rid));
+ ops.op_fstat_sync(rid, statBuf);
+ return statStruct(statBuf);
}
async function fstat(rid) {
@@ -220,11 +302,12 @@
}
function lstatSync(path) {
- const res = ops.op_stat_sync({
- path: pathFromURL(path),
- lstat: true,
- });
- return parseFileInfo(res);
+ ops.op_stat_sync(
+ pathFromURL(path),
+ true,
+ statBuf,
+ );
+ return statStruct(statBuf);
}
async function stat(path) {
@@ -236,11 +319,12 @@
}
function statSync(path) {
- const res = ops.op_stat_sync({
- path: pathFromURL(path),
- lstat: false,
- });
- return parseFileInfo(res);
+ ops.op_stat_sync(
+ pathFromURL(path),
+ false,
+ statBuf,
+ );
+ return statStruct(statBuf);
}
function coerceLen(len) {
@@ -252,19 +336,19 @@
}
function ftruncateSync(rid, len) {
- ops.op_ftruncate_sync({ rid, len: coerceLen(len) });
+ ops.op_ftruncate_sync(rid, coerceLen(len));
}
async function ftruncate(rid, len) {
- await core.opAsync("op_ftruncate_async", { rid, len: coerceLen(len) });
+ await core.opAsync("op_ftruncate_async", rid, coerceLen(len));
}
function truncateSync(path, len) {
- ops.op_truncate_sync({ path, len: coerceLen(len) });
+ ops.op_truncate_sync(path, coerceLen(len));
}
async function truncate(path, len) {
- await core.opAsync("op_truncate_async", { path, len: coerceLen(len) });
+ await core.opAsync("op_truncate_async", path, coerceLen(len));
}
function umask(mask) {
@@ -272,11 +356,11 @@
}
function linkSync(oldpath, newpath) {
- ops.op_link_sync({ oldpath, newpath });
+ ops.op_link_sync(oldpath, newpath);
}
async function link(oldpath, newpath) {
- await core.opAsync("op_link_async", { oldpath, newpath });
+ await core.opAsync("op_link_async", oldpath, newpath);
}
function toUnixTimeFromEpoch(value) {
@@ -305,11 +389,9 @@
atime,
mtime,
) {
- ops.op_futime_sync({
- rid,
- atime: toUnixTimeFromEpoch(atime),
- mtime: toUnixTimeFromEpoch(mtime),
- });
+ const [atimeSec, atimeNsec] = toUnixTimeFromEpoch(atime);
+ const [mtimeSec, mtimeNsec] = toUnixTimeFromEpoch(mtime);
+ ops.op_futime_sync(rid, atimeSec, atimeNsec, mtimeSec, mtimeNsec);
}
async function futime(
@@ -317,11 +399,16 @@
atime,
mtime,
) {
- await core.opAsync("op_futime_async", {
+ const [atimeSec, atimeNsec] = toUnixTimeFromEpoch(atime);
+ const [mtimeSec, mtimeNsec] = toUnixTimeFromEpoch(mtime);
+ await core.opAsync(
+ "op_futime_async",
rid,
- atime: toUnixTimeFromEpoch(atime),
- mtime: toUnixTimeFromEpoch(mtime),
- });
+ atimeSec,
+ atimeNsec,
+ mtimeSec,
+ mtimeNsec,
+ );
}
function utimeSync(
@@ -329,11 +416,15 @@
atime,
mtime,
) {
- ops.op_utime_sync({
- path: pathFromURL(path),
- atime: toUnixTimeFromEpoch(atime),
- mtime: toUnixTimeFromEpoch(mtime),
- });
+ const [atimeSec, atimeNsec] = toUnixTimeFromEpoch(atime);
+ const [mtimeSec, mtimeNsec] = toUnixTimeFromEpoch(mtime);
+ ops.op_utime_sync(
+ pathFromURL(path),
+ atimeSec,
+ atimeNsec,
+ mtimeSec,
+ mtimeNsec,
+ );
}
async function utime(
@@ -341,11 +432,16 @@
atime,
mtime,
) {
- await core.opAsync("op_utime_async", {
- path: pathFromURL(path),
- atime: toUnixTimeFromEpoch(atime),
- mtime: toUnixTimeFromEpoch(mtime),
- });
+ const [atimeSec, atimeNsec] = toUnixTimeFromEpoch(atime);
+ const [mtimeSec, mtimeNsec] = toUnixTimeFromEpoch(mtime);
+ await core.opAsync(
+ "op_utime_async",
+ pathFromURL(path),
+ atimeSec,
+ atimeNsec,
+ mtimeSec,
+ mtimeNsec,
+ );
}
function symlinkSync(
@@ -353,11 +449,11 @@
newpath,
options,
) {
- ops.op_symlink_sync({
- oldpath: pathFromURL(oldpath),
- newpath: pathFromURL(newpath),
- options,
- });
+ ops.op_symlink_sync(
+ pathFromURL(oldpath),
+ pathFromURL(newpath),
+ options?.type,
+ );
}
async function symlink(
@@ -365,11 +461,12 @@
newpath,
options,
) {
- await core.opAsync("op_symlink_async", {
- oldpath: pathFromURL(oldpath),
- newpath: pathFromURL(newpath),
- options,
- });
+ await core.opAsync(
+ "op_symlink_async",
+ pathFromURL(oldpath),
+ pathFromURL(newpath),
+ options?.type,
+ );
}
function fdatasyncSync(rid) {