union Any { Start, StartRes, CodeFetch, CodeFetchRes, CodeCache, SetTimeout, Exit, Environ, EnvironRes, FetchReq, FetchRes, MakeTempDir, MakeTempDirRes, Mkdir, Remove, ReadFile, ReadFileRes, ReadDir, ReadDirRes, WriteFile, CopyFile, Rename, Readlink, ReadlinkRes, Symlink, Stat, StatRes, SetEnv, Truncate, Open, OpenRes, Read, ReadRes, Write, WriteRes, Close, Shutdown, Listen, ListenRes, Accept, Dial, NewConn, Chdir, Cwd, CwdRes, Metrics, MetricsRes, } enum ErrorKind: byte { NoError = 0, // io errors NotFound, PermissionDenied, ConnectionRefused, ConnectionReset, ConnectionAborted, NotConnected, AddrInUse, AddrNotAvailable, BrokenPipe, AlreadyExists, WouldBlock, InvalidInput, InvalidData, TimedOut, Interrupted, WriteZero, Other, UnexpectedEof, BadResource, // url errors EmptyHost, IdnaError, InvalidPort, InvalidIpv4Address, InvalidIpv6Address, InvalidDomainCharacter, RelativeUrlWithoutBase, RelativeUrlWithCannotBeABaseBase, SetHostOnCannotBeABaseUrl, Overflow, // hyper errors HttpUser, HttpClosed, HttpCanceled, HttpParse, HttpOther, } table Cwd {} table CwdRes { cwd: string; } table Base { cmd_id: uint32; sync: bool = true; // TODO(ry) Change default to false. error_kind: ErrorKind = NoError; error: string; inner: Any; } table Start { unused: int8; } table StartRes { cwd: string; argv: [string]; debug_flag: bool; deps_flag: bool; recompile_flag: bool; types_flag: bool; } table CodeFetch { module_specifier: string; containing_file: string; } table CodeFetchRes { // If it's a non-http module, moduleName and filename will be the same. // For http modules, moduleName is its resolved http URL, and filename // is the location of the locally downloaded source code. module_name: string; filename: string; source_code: string; output_code: string; // Non-empty only if cached. } table CodeCache { filename: string; source_code: string; output_code: string; } table Chdir { directory: string; } table SetTimeout { timeout: double; } table Exit { code: int; } table Environ {} table SetEnv { key: string; value: string; } table EnvironRes { map: [EnvPair]; } table EnvPair { key: string; value: string; } table FetchReq { id: uint; url: string; // header_line: [string]; } table FetchRes { id: uint; status: int; header_key: [string]; header_value: [string]; body: [ubyte]; } table MakeTempDir { dir: string; prefix: string; suffix: string; } table MakeTempDirRes { path: string; } table Mkdir { path: string; mode: uint; // mode specified by https://godoc.org/os#FileMode } table Remove { path: string; recursive: bool; } table ReadFile { filename: string; } table ReadFileRes { data: [ubyte]; } table ReadDir { path: string; } table ReadDirRes { entries: [StatRes]; } table WriteFile { filename: string; data: [ubyte]; perm: uint; // perm specified by https://godoc.org/os#FileMode } table CopyFile { from: string; to: string; } table Rename { oldpath: string; newpath: string; } table Readlink { name: string; } table ReadlinkRes { path: string; } table Symlink { oldname: string; newname: string; } table Stat { filename: string; lstat: bool; } table StatRes { is_file: bool; is_symlink: bool; len: ulong; modified:ulong; accessed:ulong; created:ulong; mode: uint; has_mode: bool; // false on windows name: string; path: string; } table Truncate { name: string; len: uint; } table Open { filename: string; perm: uint; } table OpenRes { rid: int; } table Read { rid: int; // (ptr, len) is passed as second parameter to libdeno.send(). } table ReadRes { nread: uint; eof: bool; } table Write { rid: int; } table WriteRes { nbyte: uint; } table Close { rid: int; } table Shutdown { rid: int; how: uint; } table Listen { network: string; address: string; } table ListenRes { rid: int; } table Accept { rid: int; } table Dial { network: string; address: string; } // Response to Accept and Dial. table NewConn { rid: int; remote_addr: string; local_addr: string; } table Metrics {} table MetricsRes { ops_dispatched: uint64; ops_completed: uint64; bytes_sent_control: uint64; bytes_sent_data: uint64; bytes_received: uint64; } root_type Base;