summaryrefslogtreecommitdiff
path: root/js/stat.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/stat.ts')
-rw-r--r--js/stat.ts143
1 files changed, 143 insertions, 0 deletions
diff --git a/js/stat.ts b/js/stat.ts
new file mode 100644
index 000000000..49902b396
--- /dev/null
+++ b/js/stat.ts
@@ -0,0 +1,143 @@
+// Copyright 2018 the Deno authors. All rights reserved. MIT license.
+import * as fbs from "gen/msg_generated";
+import { flatbuffers } from "flatbuffers";
+import * as dispatch from "./dispatch";
+import { assert } from "./util";
+
+/**
+ * A FileInfo describes a file and is returned by `stat`, `lstat`,
+ * `statSync`, `lstatSync`.
+ */
+export class FileInfo {
+ private readonly _isFile: boolean;
+ private readonly _isSymlink: boolean;
+ /** The size of the file, in bytes. */
+ len: number;
+ /**
+ * The last modification time of the file. This corresponds to the `mtime`
+ * field from `stat` on Unix and `ftLastWriteTime` on Windows. This may not
+ * be available on all platforms.
+ */
+ modified: number | null;
+ /**
+ * The last access time of the file. This corresponds to the `atime`
+ * field from `stat` on Unix and `ftLastAccessTime` on Windows. This may not
+ * be available on all platforms.
+ */
+ accessed: number | null;
+ /**
+ * The last access time of the file. This corresponds to the `birthtime`
+ * field from `stat` on Unix and `ftCreationTime` on Windows. This may not
+ * be available on all platforms.
+ */
+ created: number | null;
+
+ /* @internal */
+ constructor(private _msg: fbs.StatRes) {
+ const modified = this._msg.modified().toFloat64();
+ const accessed = this._msg.accessed().toFloat64();
+ const created = this._msg.created().toFloat64();
+
+ this._isFile = this._msg.isFile();
+ this._isSymlink = this._msg.isSymlink();
+ this.len = this._msg.len().toFloat64();
+ this.modified = modified ? modified : null;
+ this.accessed = accessed ? accessed : null;
+ this.created = created ? created : null;
+ }
+
+ /**
+ * Returns whether this is info for a regular file. This result is mutually
+ * exclusive to `FileInfo.isDirectory` and `FileInfo.isSymlink`.
+ */
+ isFile() {
+ return this._isFile;
+ }
+
+ /**
+ * Returns whether this is info for a regular directory. This result is
+ * mutually exclusive to `FileInfo.isFile` and `FileInfo.isSymlink`.
+ */
+ isDirectory() {
+ return !this._isFile && !this._isSymlink;
+ }
+
+ /**
+ * Returns whether this is info for a symlink. This result is
+ * mutually exclusive to `FileInfo.isFile` and `FileInfo.isDirectory`.
+ */
+ isSymlink() {
+ return this._isSymlink;
+ }
+}
+
+/**
+ * Queries the file system for information on the path provided.
+ * If the given path is a symlink information about the symlink will
+ * be returned.
+ *
+ * import { lstat } from "deno";
+ * const fileInfo = await deno.lstat("hello.txt");
+ * assert(fileInfo.isFile());
+ */
+export async function lstat(filename: string): Promise<FileInfo> {
+ return res(await dispatch.sendAsync(...req(filename, true)));
+}
+
+/**
+ * Queries the file system for information on the path provided synchronously.
+ * If the given path is a symlink information about the symlink will
+ * be returned.
+ *
+ * import { lstatSync } from "deno";
+ * const fileInfo = deno.lstatSync("hello.txt");
+ * assert(fileInfo.isFile());
+ */
+export function lstatSync(filename: string): FileInfo {
+ return res(dispatch.sendSync(...req(filename, true)));
+}
+
+/**
+ * Queries the file system for information on the path provided.
+ * `stat` Will always follow symlinks.
+ *
+ * import { stat } from "deno";
+ * const fileInfo = await deno.stat("hello.txt");
+ * assert(fileInfo.isFile());
+ */
+export async function stat(filename: string): Promise<FileInfo> {
+ return res(await dispatch.sendAsync(...req(filename, false)));
+}
+
+/**
+ * Queries the file system for information on the path provided synchronously.
+ * `statSync` Will always follow symlinks.
+ *
+ * import { statSync } from "deno";
+ * const fileInfo = deno.statSync("hello.txt");
+ * assert(fileInfo.isFile());
+ */
+export function statSync(filename: string): FileInfo {
+ return res(dispatch.sendSync(...req(filename, false)));
+}
+
+function req(
+ filename: string,
+ lstat: boolean
+): [flatbuffers.Builder, fbs.Any, flatbuffers.Offset] {
+ const builder = new flatbuffers.Builder();
+ const filename_ = builder.createString(filename);
+ fbs.Stat.startStat(builder);
+ fbs.Stat.addFilename(builder, filename_);
+ fbs.Stat.addLstat(builder, lstat);
+ const msg = fbs.Stat.endStat(builder);
+ return [builder, fbs.Any.Stat, msg];
+}
+
+function res(baseRes: null | fbs.Base): FileInfo {
+ assert(baseRes != null);
+ assert(fbs.Any.StatRes === baseRes!.msgType());
+ const res = new fbs.StatRes();
+ assert(baseRes!.msg(res) != null);
+ return new FileInfo(res);
+}