diff --git a/cli/js/compiler_host.ts b/cli/js/compiler_host.ts index 585a7833ec..b89c7163c0 100644 --- a/cli/js/compiler_host.ts +++ b/cli/js/compiler_host.ts @@ -2,7 +2,7 @@ import { ASSETS, MediaType, SourceFile } from "./compiler_sourcefile.ts"; import { OUT_DIR, WriteFileCallback, getAsset } from "./compiler_util.ts"; -import { cwd } from "./dir.ts"; +import { cwd } from "./ops/fs/dir.ts"; import { assert, notImplemented } from "./util.ts"; import * as util from "./util.ts"; diff --git a/cli/js/compiler_imports.ts b/cli/js/compiler_imports.ts index 377df4098d..a5f3cd17e1 100644 --- a/cli/js/compiler_imports.ts +++ b/cli/js/compiler_imports.ts @@ -6,7 +6,7 @@ import { SourceFileJson } from "./compiler_sourcefile.ts"; import { normalizeString, CHAR_FORWARD_SLASH } from "./compiler_util.ts"; -import { cwd } from "./dir.ts"; +import { cwd } from "./ops/fs/dir.ts"; import { assert } from "./util.ts"; import * as util from "./util.ts"; import * as compilerOps from "./ops/compiler.ts"; diff --git a/cli/js/deno.ts b/cli/js/deno.ts index a4b524f8df..23fcfda5d8 100644 --- a/cli/js/deno.ts +++ b/cli/js/deno.ts @@ -9,18 +9,18 @@ export { writeAllSync } from "./buffer.ts"; export { build, OperatingSystem, Arch } from "./build.ts"; -export { chmodSync, chmod } from "./chmod.ts"; -export { chownSync, chown } from "./chown.ts"; +export { chmodSync, chmod } from "./ops/fs/chmod.ts"; +export { chownSync, chown } from "./ops/fs/chown.ts"; export { transpileOnly, compile, bundle } from "./compiler_api.ts"; export { inspect } from "./console.ts"; -export { copyFileSync, copyFile } from "./copy_file.ts"; +export { copyFileSync, copyFile } from "./ops/fs/copy_file.ts"; export { Diagnostic, DiagnosticCategory, DiagnosticItem, DiagnosticMessageChain } from "./diagnostics.ts"; -export { chdir, cwd } from "./dir.ts"; +export { chdir, cwd } from "./ops/fs/dir.ts"; export { applySourceMap, formatDiagnostics } from "./ops/errors.ts"; export { errors } from "./errors.ts"; export { FileInfo } from "./file_info.ts"; @@ -59,16 +59,16 @@ export { ReadWriteCloser, ReadWriteSeeker } from "./io.ts"; -export { linkSync, link } from "./link.ts"; +export { linkSync, link } from "./ops/fs/link.ts"; export { makeTempDirSync, makeTempDir, makeTempFileSync, makeTempFile, MakeTempOptions -} from "./make_temp.ts"; +} from "./ops/fs/make_temp.ts"; export { metrics, Metrics } from "./ops/runtime.ts"; -export { mkdirSync, mkdir, MkdirOptions } from "./mkdir.ts"; +export { mkdirSync, mkdir, MkdirOptions } from "./ops/fs/mkdir.ts"; export { Addr, connect, @@ -100,20 +100,20 @@ export { export { openPlugin } from "./plugins.ts"; export { kill } from "./ops/process.ts"; export { run, RunOptions, Process, ProcessStatus, Signal } from "./process.ts"; -export { readdirSync, readdir } from "./read_dir.ts"; +export { readdirSync, readdir } from "./ops/fs/read_dir.ts"; export { readFileSync, readFile } from "./read_file.ts"; -export { readlinkSync, readlink } from "./read_link.ts"; -export { realpathSync, realpath } from "./realpath.ts"; -export { removeSync, remove, RemoveOptions } from "./remove.ts"; -export { renameSync, rename } from "./rename.ts"; +export { readlinkSync, readlink } from "./ops/fs/read_link.ts"; +export { realpathSync, realpath } from "./ops/fs/realpath.ts"; +export { removeSync, remove, RemoveOptions } from "./ops/fs/remove.ts"; +export { renameSync, rename } from "./ops/fs/rename.ts"; export { resources, close } from "./ops/resources.ts"; export { signal, signals, SignalStream } from "./signals.ts"; -export { statSync, lstatSync, stat, lstat } from "./stat.ts"; -export { symlinkSync, symlink } from "./symlink.ts"; +export { statSync, lstatSync, stat, lstat } from "./ops/fs/stat.ts"; +export { symlinkSync, symlink } from "./ops/fs/symlink.ts"; export { connectTLS, listenTLS } from "./tls.ts"; -export { truncateSync, truncate } from "./truncate.ts"; +export { truncateSync, truncate } from "./ops/fs/truncate.ts"; export { isatty, setRaw } from "./ops/tty.ts"; -export { utimeSync, utime } from "./utime.ts"; +export { utimeSync, utime } from "./ops/fs/utime.ts"; export { version } from "./version.ts"; export { writeFileSync, writeFile, WriteFileOptions } from "./write_file.ts"; export const args: string[] = []; diff --git a/cli/js/file_info.ts b/cli/js/file_info.ts index 5e4da2a771..884f850d20 100644 --- a/cli/js/file_info.ts +++ b/cli/js/file_info.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { StatResponse } from "./stat.ts"; +import { StatResponse } from "./ops/fs/stat.ts"; import { build } from "./build.ts"; /** A FileInfo describes a file and is returned by `stat`, `lstat`, diff --git a/cli/js/files.ts b/cli/js/files.ts index 9103ab60bb..945390ca0c 100644 --- a/cli/js/files.ts +++ b/cli/js/files.ts @@ -10,12 +10,17 @@ import { SyncWriter, SyncSeeker } from "./io.ts"; -import { - sendSync as sendSyncJson, - sendAsync as sendAsyncJson -} from "./ops/dispatch_json.ts"; import { close } from "./ops/resources.ts"; import { read, readSync, write, writeSync } from "./ops/io.ts"; +import { seek, seekSync } from "./ops/fs/seek.ts"; +export { seek, seekSync } from "./ops/fs/seek.ts"; +import { + open as opOpen, + openSync as opOpenSync, + OpenOptions, + OpenMode +} from "./ops/fs/open.ts"; +export { OpenOptions, OpenMode } from "./ops/fs/open.ts"; /** Synchronously open a file and return an instance of the `File` object. * @@ -24,31 +29,22 @@ import { read, readSync, write, writeSync } from "./ops/io.ts"; * Requires `allow-read` and `allow-write` permissions depending on mode. */ export function openSync(path: string, mode?: OpenOptions): File; - -/** Synchronously open a file and return an instance of the `File` object. - * - * const file = Deno.openSync("/foo/bar.txt", "r"); - * - * Requires `allow-read` and `allow-write` permissions depending on mode. - */ export function openSync(path: string, mode?: OpenMode): File; - -/**@internal*/ export function openSync( path: string, modeOrOptions: OpenOptions | OpenMode = "r" ): File { - let mode = null; - let options = null; + let mode = undefined; + let options = undefined; if (typeof modeOrOptions === "string") { mode = modeOrOptions; } else { checkOpenOptions(modeOrOptions); - options = modeOrOptions; + options = modeOrOptions as OpenOptions; } - const rid = sendSyncJson("op_open", { path, options, mode }); + const rid = opOpenSync(path, mode as OpenMode, options); return new File(rid); } @@ -59,35 +55,22 @@ export function openSync( * Requires `allow-read` and `allow-write` permissions depending on mode. */ export async function open(path: string, options?: OpenOptions): Promise; - -/** Open a file and resolves to an instance of `Deno.File`. - * - * const file = await Deno.open("/foo/bar.txt, "w+"); - * - * Requires `allow-read` and `allow-write` permissions depending on mode. - */ export async function open(path: string, mode?: OpenMode): Promise; - -/**@internal*/ export async function open( path: string, modeOrOptions: OpenOptions | OpenMode = "r" ): Promise { - let mode = null; - let options = null; + let mode = undefined; + let options = undefined; if (typeof modeOrOptions === "string") { mode = modeOrOptions; } else { checkOpenOptions(modeOrOptions); - options = modeOrOptions; + options = modeOrOptions as OpenOptions; } - const rid = await sendAsyncJson("op_open", { - path, - options, - mode - }); + const rid = await opOpen(path, mode as OpenMode, options); return new File(rid); } @@ -113,36 +96,6 @@ export function create(path: string): Promise { return open(path, "w+"); } -/** Synchronously seek a file ID to the given offset under mode given by `whence`. - * - * Returns the number of cursor position. - * - * const file = Deno.openSync("/foo/bar.txt"); - * const position = Deno.seekSync(file.rid, 0, 0); - */ -export function seekSync( - rid: number, - offset: number, - whence: SeekMode -): number { - return sendSyncJson("op_seek", { rid, offset, whence }); -} - -/** Seek a file ID to the given offset under mode given by `whence`. - * - * Resolves with the number of cursor position. - * - * const file = await Deno.open("/foo/bar.txt"); - * const position = await Deno.seek(file.rid, 0, 0); - */ -export async function seek( - rid: number, - offset: number, - whence: SeekMode -): Promise { - return await sendAsyncJson("op_seek", { rid, offset, whence }); -} - /** The Deno abstraction for reading and writing files. */ export class File implements @@ -191,51 +144,6 @@ export const stdout = new File(1); /** An instance of `Deno.File` for `stderr`. */ export const stderr = new File(2); -export interface OpenOptions { - /** Sets the option for read access. This option, when `true`, means that the - * file should be read-able if opened. */ - read?: boolean; - /** Sets the option for write access. This option, when `true`, means that - * the file should be write-able if opened. If the file already exists, - * any write calls on it will overwrite its contents, by default without - * truncating it. */ - write?: boolean; - /**Sets the option for the append mode. This option, when `true`, means that - * writes will append to a file instead of overwriting previous contents. - * Note that setting `{ write: true, append: true }` has the same effect as - * setting only `{ append: true }`. */ - append?: boolean; - /** Sets the option for truncating a previous file. If a file is - * successfully opened with this option set it will truncate the file to `0` - * length if it already exists. The file must be opened with write access - * for truncate to work. */ - truncate?: boolean; - /** Sets the option to allow creating a new file, if one doesn't already - * exist at the specified path. Requires write or append access to be - * used. */ - create?: boolean; - /** Defaults to `false`. If set to `true`, no file, directory, or symlink is - * allowed to exist at the target location. Requires write or append - * access to be used. When createNew is set to `true`, create and truncate - * are ignored. */ - createNew?: boolean; -} - -/** A set of string literals which specify the open mode of a file. - * - * |Value |Description | - * |------|--------------------------------------------------------------------------------------------------| - * |`"r"` |Read-only. Default. Starts at beginning of file. | - * |`"r+"`|Read-write. Start at beginning of file. | - * |`"w"` |Write-only. Opens and truncates existing file or creates new one for writing only. | - * |`"w+"`|Read-write. Opens and truncates existing file or creates new one for writing and reading. | - * |`"a"` |Write-only. Opens existing file or creates new one. Each write appends content to the end of file.| - * |`"a+"`|Read-write. Behaves like `"a"` and allows to read from file. | - * |`"x"` |Write-only. Exclusive create - creates new file only if one doesn't exist already. | - * |`"x+"`|Read-write. Behaves like `x` and allows reading from file. | - */ -export type OpenMode = "r" | "r+" | "w" | "w+" | "a" | "a+" | "x" | "x+"; - /** Check if OpenOptions is set to valid combination of options. * @returns Tuple representing if openMode is valid and error message if it's not * @internal diff --git a/cli/js/net.ts b/cli/js/net.ts index 3b0525096d..ccc5bf89ea 100644 --- a/cli/js/net.ts +++ b/cli/js/net.ts @@ -2,11 +2,9 @@ import { EOF, Reader, Writer, Closer } from "./io.ts"; import { read, write } from "./ops/io.ts"; import { close } from "./ops/resources.ts"; -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; - -export type Transport = "tcp" | "udp"; -// TODO support other types: -// export type Transport = "tcp" | "tcp4" | "tcp6" | "unix" | "unixpacket"; +import * as netOps from "./ops/net.ts"; +import { Transport } from "./ops/net.ts"; +export { ShutdownMode, shutdown, Transport } from "./ops/net.ts"; export interface Addr { transport: Transport; @@ -55,26 +53,6 @@ export interface Listener extends AsyncIterator { [Symbol.asyncIterator](): AsyncIterator; } -export enum ShutdownMode { - // See http://man7.org/linux/man-pages/man2/shutdown.2.html - // Corresponding to SHUT_RD, SHUT_WR, SHUT_RDWR - Read = 0, - Write, - ReadWrite // unused -} - -/** Shut down socket send and receive operations. - * - * Matches behavior of POSIX shutdown(3). - * - * const listener = Deno.listen({ port: 80 }); - * const conn = await listener.accept(); - * Deno.shutdown(conn.rid, Deno.ShutdownMode.Write); - */ -export function shutdown(rid: number, how: ShutdownMode): void { - sendSync("op_shutdown", { rid, how }); -} - export class ConnImpl implements Conn { constructor( readonly rid: number, @@ -98,14 +76,14 @@ export class ConnImpl implements Conn { * Most callers should just use close(). */ closeRead(): void { - shutdown(this.rid, ShutdownMode.Read); + netOps.shutdown(this.rid, netOps.ShutdownMode.Read); } /** closeWrite shuts down (shutdown(2)) the writing side of the TCP * connection. Most callers should just use close(). */ closeWrite(): void { - shutdown(this.rid, ShutdownMode.Write); + netOps.shutdown(this.rid, netOps.ShutdownMode.Write); } } @@ -117,7 +95,7 @@ export class ListenerImpl implements Listener { ) {} async accept(): Promise { - const res = await sendAsync("op_accept", { rid: this.rid }); + const res = await netOps.accept(this.rid); return new ConnImpl(res.rid, res.remoteAddr, res.localAddr); } @@ -152,7 +130,7 @@ export async function recvfrom( rid: number, p: Uint8Array ): Promise<[number, Addr]> { - const { size, remoteAddr } = await sendAsync("op_receive", { rid }, p); + const { size, remoteAddr } = await netOps.receive(rid, p); return [size, remoteAddr]; } @@ -175,7 +153,7 @@ export class UDPConnImpl implements UDPConn { const remote = { hostname: "127.0.0.1", transport: "udp", ...addr }; if (remote.transport !== "udp") throw Error("Remote transport must be UDP"); const args = { ...remote, rid: this.rid }; - await sendAsync("op_send", args, p); + await netOps.send(args as netOps.SendRequest, p); } close(): void { @@ -253,7 +231,7 @@ export function listen( export function listen(options: ListenOptions & { transport: "udp" }): UDPConn; export function listen(options: ListenOptions): Listener | UDPConn { const args = { ...listenDefaults, ...options }; - const res = sendSync("op_listen", args); + const res = netOps.listen(args as netOps.ListenRequest); if (args.transport === "tcp") { return new ListenerImpl(res.rid, res.localAddr); @@ -289,6 +267,6 @@ const connectDefaults = { hostname: "127.0.0.1", transport: "tcp" }; */ export async function connect(options: ConnectOptions): Promise { options = Object.assign(connectDefaults, options); - const res = await sendAsync("op_connect", options); + const res = await netOps.connect(options as netOps.ConnectRequest); return new ConnImpl(res.rid, res.remoteAddr!, res.localAddr!); } diff --git a/cli/js/chmod.ts b/cli/js/ops/fs/chmod.ts similarity index 92% rename from cli/js/chmod.ts rename to cli/js/ops/fs/chmod.ts index b6238f02db..9e748672f5 100644 --- a/cli/js/chmod.ts +++ b/cli/js/ops/fs/chmod.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Synchronously changes the permission of a specific file/directory of * specified path. Ignores the process's umask. diff --git a/cli/js/chown.ts b/cli/js/ops/fs/chown.ts similarity index 93% rename from cli/js/chown.ts rename to cli/js/ops/fs/chown.ts index a89c58f5b0..6f871f3133 100644 --- a/cli/js/chown.ts +++ b/cli/js/ops/fs/chown.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Synchronously change owner of a regular file or directory. Linux/Mac OS * only at the moment. diff --git a/cli/js/copy_file.ts b/cli/js/ops/fs/copy_file.ts similarity index 94% rename from cli/js/copy_file.ts rename to cli/js/ops/fs/copy_file.ts index 6c9bf6b031..6bd49fe2c4 100644 --- a/cli/js/copy_file.ts +++ b/cli/js/ops/fs/copy_file.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Synchronously copies the contents and permissions of one file to another * specified path, by default creating a new file if needed, else overwriting. diff --git a/cli/js/dir.ts b/cli/js/ops/fs/dir.ts similarity index 93% rename from cli/js/dir.ts rename to cli/js/ops/fs/dir.ts index 7a809a6646..e9e95005b9 100644 --- a/cli/js/dir.ts +++ b/cli/js/ops/fs/dir.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync } from "./ops/dispatch_json.ts"; +import { sendSync } from "../dispatch_json.ts"; /** * **UNSTABLE**: maybe needs permissions. diff --git a/cli/js/link.ts b/cli/js/ops/fs/link.ts similarity index 91% rename from cli/js/link.ts rename to cli/js/ops/fs/link.ts index a2ce33d9f3..0f083dd7b9 100644 --- a/cli/js/link.ts +++ b/cli/js/ops/fs/link.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Creates `newname` as a hard link to `oldname`. * diff --git a/cli/js/make_temp.ts b/cli/js/ops/fs/make_temp.ts similarity index 98% rename from cli/js/make_temp.ts rename to cli/js/ops/fs/make_temp.ts index 87c6942048..1fbff41d00 100644 --- a/cli/js/make_temp.ts +++ b/cli/js/ops/fs/make_temp.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; export interface MakeTempOptions { /** Directory where the temporary directory should be created (defaults to diff --git a/cli/js/mkdir.ts b/cli/js/ops/fs/mkdir.ts similarity index 97% rename from cli/js/mkdir.ts rename to cli/js/ops/fs/mkdir.ts index 3f4a18b19f..4df33a29f2 100644 --- a/cli/js/mkdir.ts +++ b/cli/js/ops/fs/mkdir.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; // TODO(ry) The complexity in argument parsing is to support deprecated forms of // mkdir and mkdirSync. diff --git a/cli/js/ops/fs/open.ts b/cli/js/ops/fs/open.ts new file mode 100644 index 0000000000..e166ef16b4 --- /dev/null +++ b/cli/js/ops/fs/open.ts @@ -0,0 +1,67 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { sendSync, sendAsync } from "../dispatch_json.ts"; + +export interface OpenOptions { + /** Sets the option for read access. This option, when `true`, means that the + * file should be read-able if opened. */ + read?: boolean; + /** Sets the option for write access. This option, when `true`, means that + * the file should be write-able if opened. If the file already exists, + * any write calls on it will overwrite its contents, by default without + * truncating it. */ + write?: boolean; + /**Sets the option for the append mode. This option, when `true`, means that + * writes will append to a file instead of overwriting previous contents. + * Note that setting `{ write: true, append: true }` has the same effect as + * setting only `{ append: true }`. */ + append?: boolean; + /** Sets the option for truncating a previous file. If a file is + * successfully opened with this option set it will truncate the file to `0` + * length if it already exists. The file must be opened with write access + * for truncate to work. */ + truncate?: boolean; + /** Sets the option to allow creating a new file, if one doesn't already + * exist at the specified path. Requires write or append access to be + * used. */ + create?: boolean; + /** Defaults to `false`. If set to `true`, no file, directory, or symlink is + * allowed to exist at the target location. Requires write or append + * access to be used. When createNew is set to `true`, create and truncate + * are ignored. */ + createNew?: boolean; +} + +/** A set of string literals which specify the open mode of a file. + * + * |Value |Description | + * |------|--------------------------------------------------------------------------------------------------| + * |`"r"` |Read-only. Default. Starts at beginning of file. | + * |`"r+"`|Read-write. Start at beginning of file. | + * |`"w"` |Write-only. Opens and truncates existing file or creates new one for writing only. | + * |`"w+"`|Read-write. Opens and truncates existing file or creates new one for writing and reading. | + * |`"a"` |Write-only. Opens existing file or creates new one. Each write appends content to the end of file.| + * |`"a+"`|Read-write. Behaves like `"a"` and allows to read from file. | + * |`"x"` |Write-only. Exclusive create - creates new file only if one doesn't exist already. | + * |`"x+"`|Read-write. Behaves like `x` and allows reading from file. | + */ +export type OpenMode = "r" | "r+" | "w" | "w+" | "a" | "a+" | "x" | "x+"; + +export function openSync( + path: string, + mode: OpenMode | undefined, + options: OpenOptions | undefined +): number { + return sendSync("op_open", { path, options, mode }); +} + +export async function open( + path: string, + mode: OpenMode | undefined, + options: OpenOptions | undefined +): Promise { + return await sendAsync("op_open", { + path, + options, + mode + }); +} diff --git a/cli/js/read_dir.ts b/cli/js/ops/fs/read_dir.ts similarity index 89% rename from cli/js/read_dir.ts rename to cli/js/ops/fs/read_dir.ts index 975f5d8b41..75c821c338 100644 --- a/cli/js/read_dir.ts +++ b/cli/js/ops/fs/read_dir.ts @@ -1,6 +1,6 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; -import { FileInfo, FileInfoImpl } from "./file_info.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; +import { FileInfo, FileInfoImpl } from "../../file_info.ts"; import { StatResponse } from "./stat.ts"; interface ReadDirResponse { diff --git a/cli/js/read_link.ts b/cli/js/ops/fs/read_link.ts similarity index 91% rename from cli/js/read_link.ts rename to cli/js/ops/fs/read_link.ts index 3ff56b9909..b5ac82cd7e 100644 --- a/cli/js/read_link.ts +++ b/cli/js/ops/fs/read_link.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Returns the destination of the named symbolic link. * diff --git a/cli/js/realpath.ts b/cli/js/ops/fs/realpath.ts similarity index 90% rename from cli/js/realpath.ts rename to cli/js/ops/fs/realpath.ts index 5a0c1cbf31..c8070edea4 100644 --- a/cli/js/realpath.ts +++ b/cli/js/ops/fs/realpath.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Returns absolute normalized path with symbolic links resolved synchronously. * diff --git a/cli/js/remove.ts b/cli/js/ops/fs/remove.ts similarity index 94% rename from cli/js/remove.ts rename to cli/js/ops/fs/remove.ts index 37603bd0c5..5650357938 100644 --- a/cli/js/remove.ts +++ b/cli/js/ops/fs/remove.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; export interface RemoveOptions { /** Defaults to `false`. If set to `true`, path will be removed even if diff --git a/cli/js/rename.ts b/cli/js/ops/fs/rename.ts similarity index 94% rename from cli/js/rename.ts rename to cli/js/ops/fs/rename.ts index eaa236336c..016ebc2d76 100644 --- a/cli/js/rename.ts +++ b/cli/js/ops/fs/rename.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; /** Synchronously renames (moves) `oldpath` to `newpath`. If `newpath` already * exists and is not a directory, `renameSync()` replaces it. OS-specific diff --git a/cli/js/ops/fs/seek.ts b/cli/js/ops/fs/seek.ts new file mode 100644 index 0000000000..313d365c60 --- /dev/null +++ b/cli/js/ops/fs/seek.ts @@ -0,0 +1,33 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { sendSync, sendAsync } from "../dispatch_json.ts"; +import { SeekMode } from "../../io.ts"; + +/** Synchronously seek a file ID to the given offset under mode given by `whence`. + * + * Returns the number of cursor position. + * + * const file = Deno.openSync("/foo/bar.txt"); + * const position = Deno.seekSync(file.rid, 0, 0); + */ +export function seekSync( + rid: number, + offset: number, + whence: SeekMode +): number { + return sendSync("op_seek", { rid, offset, whence }); +} + +/** Seek a file ID to the given offset under mode given by `whence`. + * + * Resolves with the number of cursor position. + * + * const file = await Deno.open("/foo/bar.txt"); + * const position = await Deno.seek(file.rid, 0, 0); + */ +export async function seek( + rid: number, + offset: number, + whence: SeekMode +): Promise { + return await sendAsync("op_seek", { rid, offset, whence }); +} diff --git a/cli/js/stat.ts b/cli/js/ops/fs/stat.ts similarity index 94% rename from cli/js/stat.ts rename to cli/js/ops/fs/stat.ts index a00a62d0cb..6a764a8bb6 100644 --- a/cli/js/stat.ts +++ b/cli/js/ops/fs/stat.ts @@ -1,6 +1,6 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; -import { FileInfo, FileInfoImpl } from "./file_info.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; +import { FileInfo, FileInfoImpl } from "../../file_info.ts"; /** @internal */ export interface StatResponse { diff --git a/cli/js/symlink.ts b/cli/js/ops/fs/symlink.ts similarity index 90% rename from cli/js/symlink.ts rename to cli/js/ops/fs/symlink.ts index 9a63fca9f3..3bb7c3335a 100644 --- a/cli/js/symlink.ts +++ b/cli/js/ops/fs/symlink.ts @@ -1,7 +1,7 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; -import * as util from "./util.ts"; -import { build } from "./build.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; +import * as util from "../../util.ts"; +import { build } from "../../build.ts"; /** **UNSTABLE**: `type` argument type may be changed to `"dir" | "file"`. * diff --git a/cli/js/truncate.ts b/cli/js/ops/fs/truncate.ts similarity index 93% rename from cli/js/truncate.ts rename to cli/js/ops/fs/truncate.ts index b43c88f60c..578e37aa36 100644 --- a/cli/js/truncate.ts +++ b/cli/js/ops/fs/truncate.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; function coerceLen(len?: number): number { if (!len) { diff --git a/cli/js/utime.ts b/cli/js/ops/fs/utime.ts similarity index 96% rename from cli/js/utime.ts rename to cli/js/ops/fs/utime.ts index 9224a3ffa2..f684ac80a0 100644 --- a/cli/js/utime.ts +++ b/cli/js/ops/fs/utime.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync, sendAsync } from "./ops/dispatch_json.ts"; +import { sendSync, sendAsync } from "../dispatch_json.ts"; function toSecondsFromEpoch(v: number | Date): number { return v instanceof Date ? v.valueOf() / 1000 : v; diff --git a/cli/js/ops/net.ts b/cli/js/ops/net.ts new file mode 100644 index 0000000000..a026189d27 --- /dev/null +++ b/cli/js/ops/net.ts @@ -0,0 +1,117 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { sendSync, sendAsync } from "./dispatch_json.ts"; + +export type Transport = "tcp" | "udp"; +// TODO support other types: +// export type Transport = "tcp" | "tcp4" | "tcp6" | "unix" | "unixpacket"; + +export enum ShutdownMode { + // See http://man7.org/linux/man-pages/man2/shutdown.2.html + // Corresponding to SHUT_RD, SHUT_WR, SHUT_RDWR + Read = 0, + Write, + ReadWrite // unused +} + +/** Shut down socket send and receive operations. + * + * Matches behavior of POSIX shutdown(3). + * + * const listener = Deno.listen({ port: 80 }); + * const conn = await listener.accept(); + * Deno.shutdown(conn.rid, Deno.ShutdownMode.Write); + */ +export function shutdown(rid: number, how: ShutdownMode): void { + sendSync("op_shutdown", { rid, how }); +} + +interface AcceptResponse { + rid: number; + localAddr: { + hostname: string; + port: number; + transport: Transport; + }; + remoteAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export async function accept(rid: number): Promise { + return await sendAsync("op_accept", { rid }); +} + +export interface ListenRequest { + transport: Transport; + hostname: string; + port: number; +} + +interface ListenResponse { + rid: number; + localAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export function listen(args: ListenRequest): ListenResponse { + return sendSync("op_listen", args); +} + +interface ConnectResponse { + rid: number; + localAddr: { + hostname: string; + port: number; + transport: Transport; + }; + remoteAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export interface ConnectRequest { + transport: Transport; + hostname: string; + port: number; +} + +export async function connect(args: ConnectRequest): Promise { + return await sendAsync("op_connect", args); +} + +interface ReceiveResponse { + size: number; + remoteAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export async function receive( + rid: number, + zeroCopy: Uint8Array +): Promise { + return await sendAsync("op_receive", { rid }, zeroCopy); +} + +export interface SendRequest { + rid: number; + hostname: string; + port: number; + transport: Transport; +} + +export async function send( + args: SendRequest, + zeroCopy: Uint8Array +): Promise { + await sendAsync("op_send", args, zeroCopy); +} diff --git a/cli/js/ops/timers.ts b/cli/js/ops/timers.ts index bc7fe6453e..1a7081df03 100644 --- a/cli/js/ops/timers.ts +++ b/cli/js/ops/timers.ts @@ -8,3 +8,12 @@ export function stopGlobalTimer(): void { export async function startGlobalTimer(timeout: number): Promise { await sendAsync("op_global_timer", { timeout }); } + +interface NowResponse { + seconds: number; + subsecNanos: number; +} + +export function now(): NowResponse { + return sendSync("op_now"); +} diff --git a/cli/js/ops/tls.ts b/cli/js/ops/tls.ts new file mode 100644 index 0000000000..3a9d70385d --- /dev/null +++ b/cli/js/ops/tls.ts @@ -0,0 +1,69 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { sendAsync, sendSync } from "./dispatch_json.ts"; +import { Transport } from "./net.ts"; + +export interface ConnectTLSRequest { + transport: Transport; + hostname: string; + port: number; + cert_file?: string; +} + +interface ConnectTLSResponse { + rid: number; + localAddr: { + hostname: string; + port: number; + transport: Transport; + }; + remoteAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export async function connectTLS( + args: ConnectTLSRequest +): Promise { + return await sendAsync("op_connect_tls", args); +} + +interface AcceptTLSResponse { + rid: number; + localAddr: { + hostname: string; + port: number; + transport: Transport; + }; + remoteAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export async function acceptTLS(rid: number): Promise { + return await sendAsync("op_accept_tls", { rid }); +} + +export interface ListenTLSRequest { + port: number; + hostname: string; + transport: Transport; + certFile: string; + keyFile: string; +} + +interface ListenTLSResponse { + rid: number; + localAddr: { + hostname: string; + port: number; + transport: Transport; + }; +} + +export function listenTLS(args: ListenTLSRequest): ListenTLSResponse { + return sendSync("op_listen_tls", args); +} diff --git a/cli/js/performance.ts b/cli/js/performance.ts index 9d49e6a4cd..7aaa359520 100644 --- a/cli/js/performance.ts +++ b/cli/js/performance.ts @@ -1,10 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendSync } from "./ops/dispatch_json.ts"; - -interface NowResponse { - seconds: number; - subsecNanos: number; -} +import { now as opNow } from "./ops/timers.ts"; export class Performance { /** Returns a current time from Deno's start in milliseconds. @@ -15,7 +10,7 @@ export class Performance { * console.log(`${t} ms since start!`); */ now(): number { - const res = sendSync("op_now") as NowResponse; + const res = opNow(); return res.seconds * 1e3 + res.subsecNanos / 1e6; } } diff --git a/cli/js/tls.ts b/cli/js/tls.ts index 98a6586bb8..8fff562d28 100644 --- a/cli/js/tls.ts +++ b/cli/js/tls.ts @@ -1,5 +1,5 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { sendAsync, sendSync } from "./ops/dispatch_json.ts"; +import * as tlsOps from "./ops/tls.ts"; import { Listener, Transport, Conn, ConnImpl, ListenerImpl } from "./net.ts"; // TODO(ry) There are many configuration options to add... @@ -17,13 +17,13 @@ const connectTLSDefaults = { hostname: "127.0.0.1", transport: "tcp" }; */ export async function connectTLS(options: ConnectTLSOptions): Promise { options = Object.assign(connectTLSDefaults, options); - const res = await sendAsync("op_connect_tls", options); + const res = await tlsOps.connectTLS(options as tlsOps.ConnectTLSRequest); return new ConnImpl(res.rid, res.remoteAddr!, res.localAddr!); } class TLSListenerImpl extends ListenerImpl { async accept(): Promise { - const res = await sendAsync("op_accept_tls", { rid: this.rid }); + const res = await tlsOps.acceptTLS(this.rid); return new ConnImpl(res.rid, res.remoteAddr, res.localAddr); } } @@ -52,7 +52,7 @@ export interface ListenTLSOptions { export function listenTLS(options: ListenTLSOptions): Listener { const hostname = options.hostname || "0.0.0.0"; const transport = options.transport || "tcp"; - const res = sendSync("op_listen_tls", { + const res = tlsOps.listenTLS({ hostname, port: options.port, transport, diff --git a/cli/js/write_file.ts b/cli/js/write_file.ts index d57274228c..995335f574 100644 --- a/cli/js/write_file.ts +++ b/cli/js/write_file.ts @@ -1,7 +1,7 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { stat, statSync } from "./stat.ts"; +import { stat, statSync } from "./ops/fs/stat.ts"; import { open, openSync } from "./files.ts"; -import { chmod, chmodSync } from "./chmod.ts"; +import { chmod, chmodSync } from "./ops/fs/chmod.ts"; import { writeAll, writeAllSync } from "./buffer.ts"; /** Options for writing to a file. */