diff options
author | Casper Beyer <caspervonb@pm.me> | 2021-04-12 19:33:05 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-12 13:33:05 +0200 |
commit | da9219341fe8bcf080d3ebdd03d35cec1268875e (patch) | |
tree | 75f21430ff33cdcbe071caaa7b18e2063cb75538 /runtime/js/40_files.js | |
parent | 5c2a8cdbdcc3ae74a4c2d8fb704a331986f49a95 (diff) |
feat(runtime): add stat and statSync methods to Deno.File (#10107)
Diffstat (limited to 'runtime/js/40_files.js')
-rw-r--r-- | runtime/js/40_files.js | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/runtime/js/40_files.js b/runtime/js/40_files.js new file mode 100644 index 000000000..2ce495f8e --- /dev/null +++ b/runtime/js/40_files.js @@ -0,0 +1,219 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +"use strict"; + +((window) => { + const core = window.Deno.core; + const { read, readSync, write, writeSync } = window.__bootstrap.io; + const { fstat, fstatSync } = window.__bootstrap.fs; + const { pathFromURL } = window.__bootstrap.util; + + function seekSync( + rid, + offset, + whence, + ) { + return core.jsonOpSync("op_seek_sync", { rid, offset, whence }); + } + + function seek( + rid, + offset, + whence, + ) { + return core.jsonOpAsync("op_seek_async", { rid, offset, whence }); + } + + function openSync( + path, + options = { read: true }, + ) { + checkOpenOptions(options); + const mode = options?.mode; + const rid = core.jsonOpSync( + "op_open_sync", + { path: pathFromURL(path), options, mode }, + ); + + return new File(rid); + } + + async function open( + path, + options = { read: true }, + ) { + checkOpenOptions(options); + const mode = options?.mode; + const rid = await core.jsonOpAsync( + "op_open_async", + { path: pathFromURL(path), options, mode }, + ); + + return new File(rid); + } + + function createSync(path) { + return openSync(path, { + read: true, + write: true, + truncate: true, + create: true, + }); + } + + function create(path) { + return open(path, { + read: true, + write: true, + truncate: true, + create: true, + }); + } + + class File { + #rid = 0; + + constructor(rid) { + this.#rid = rid; + } + + get rid() { + return this.#rid; + } + + write(p) { + return write(this.rid, p); + } + + writeSync(p) { + return writeSync(this.rid, p); + } + + read(p) { + return read(this.rid, p); + } + + readSync(p) { + return readSync(this.rid, p); + } + + seek(offset, whence) { + return seek(this.rid, offset, whence); + } + + seekSync(offset, whence) { + return seekSync(this.rid, offset, whence); + } + + stat() { + return fstat(this.rid); + } + + statSync() { + return fstatSync(this.rid); + } + + close() { + core.close(this.rid); + } + } + + class Stdin { + constructor() { + } + + get rid() { + return 0; + } + + read(p) { + return read(this.rid, p); + } + + readSync(p) { + return readSync(this.rid, p); + } + + close() { + core.close(this.rid); + } + } + + class Stdout { + constructor() { + } + + get rid() { + return 1; + } + + write(p) { + return write(this.rid, p); + } + + writeSync(p) { + return writeSync(this.rid, p); + } + + close() { + core.close(this.rid); + } + } + + class Stderr { + constructor() { + } + + get rid() { + return 2; + } + + write(p) { + return write(this.rid, p); + } + + writeSync(p) { + return writeSync(this.rid, p); + } + + close() { + core.close(this.rid); + } + } + + const stdin = new Stdin(); + const stdout = new Stdout(); + const stderr = new Stderr(); + + function checkOpenOptions(options) { + if (Object.values(options).filter((val) => val === true).length === 0) { + throw new Error("OpenOptions requires at least one option to be true"); + } + + if (options.truncate && !options.write) { + throw new Error("'truncate' option requires 'write' option"); + } + + const createOrCreateNewWithoutWriteOrAppend = + (options.create || options.createNew) && + !(options.write || options.append); + + if (createOrCreateNewWithoutWriteOrAppend) { + throw new Error( + "'create' or 'createNew' options require 'write' or 'append' option", + ); + } + } + + window.__bootstrap.files = { + stdin, + stdout, + stderr, + File, + create, + createSync, + open, + openSync, + seek, + seekSync, + }; +})(this); |