UNPKG

@dishuostec/llrt-types

Version:

Type definitions for LLRT, Low Latency Runtime

489 lines (461 loc) 18.6 kB
/** * The `net` module provides an asynchronous network API for creating stream-based * TCP or `IPC` servers ({@link createServer}) and clients ({@link createConnection}). * * It can be accessed using: * * ```js * import * as net from 'net'; * ``` */ declare module "net" { import { Buffer } from "buffer"; import { EventEmitter } from "events"; import { DefaultDuplexStream as Duplex } from "stream"; interface AddressInfo { address: string; family: string; port: number; } interface SocketConstructorOpts { allowHalfOpen?: boolean | undefined; } interface TcpSocketConnectOpts { port: number; host?: string | undefined; } interface IpcSocketConnectOpts { path: string; } type SocketConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; type SocketReadyState = | "opening" | "open" | "readOnly" | "writeOnly" | "closed"; /** * This class is an abstraction of a TCP socket or a streaming `IPC` endpoint (only available on Unix with domain sockets). * It is also an `EventEmitter`. * * A `net.Socket` can be created by the user and used directly to interact with a server. For example, it is returned by {@link createConnection}, * so the user can use it to talk to the server. * * It can also be created by LLRT and passed to the user when a connection is received. * For example, it is passed to the listeners of a `'connection'` event emitted on a {@link Server}, so the user can use it to interact with the client. */ class Socket extends Duplex { constructor(options?: SocketConstructorOpts); /** * Initiate a connection on a given socket. * * Possible signatures: * * * `socket.connect(options[, connectListener])` * * `socket.connect(path[, connectListener])` for `IPC` connections. * * `socket.connect(port[, host][, connectListener])` for TCP connections. * * Returns: `net.Socket` The socket itself. * * This function is asynchronous. When the connection is established, the `'connect'` event will be emitted. If there is a problem connecting, * instead of a `'connect'` event, an `'error'` event will be emitted with * the error passed to the `'error'` listener. * The last parameter `connectListener`, if supplied, will be added as a listener * for the `'connect'` event **once**. * * This function should only be used for reconnecting a socket after`'close'` has been emitted or otherwise it may lead to undefined * behavior. */ connect(options: SocketConnectOpts, connectionListener?: () => void): this; connect(port: number, host: string, connectionListener?: () => void): this; connect(port: number, connectionListener?: () => void): this; connect(path: string, connectionListener?: () => void): this; /** * Returns the bound `address`, the address `family` name and `port` of the * socket as reported by the operating system:`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }` * @since v0.1.90 */ address(): AddressInfo | {}; /** * If `true`, `socket.connect(options[, connectListener])` was * called and has not yet finished. It will stay `true` until the socket becomes * connected, then it is set to `false` and the `'connect'` event is emitted. Note * that the `socket.connect(options[, connectListener])` callback is a listener for the `'connect'` event. */ readonly connecting: boolean; /** * This is `true` if the socket is not connected yet, either because `.connect()`has not yet been called or because it is still in the process of connecting * (see `socket.connecting`). */ readonly pending: boolean; /** * The string representation of the local IP address the remote client is * connecting on. For example, in a server listening on `'0.0.0.0'`, if a client * connects on `'192.168.1.1'`, the value of `socket.localAddress` would be`'192.168.1.1'`. */ readonly localAddress?: string; /** * The numeric representation of the local port. For example, `80` or `21`. */ readonly localPort?: number; /** * The string representation of the local IP family. `'IPv4'` or `'IPv6'`. */ readonly localFamily?: string; /** * This property represents the state of the connection as a string. * * * If the stream is connecting `socket.readyState` is `opening`. * * If the stream is readable and writable, it is `open`. * * If the stream is readable and not writable, it is `readOnly`. * * If the stream is not readable and writable, it is `writeOnly`. */ readonly readyState: SocketReadyState; /** * The string representation of the remote IP address. For example,`'74.125.127.100'` or `'2001:4860:a005::68'`. Value may be `undefined` if * the socket is destroyed (for example, if the client disconnected). */ readonly remoteAddress?: string; /** * The string representation of the remote IP family. `'IPv4'` or `'IPv6'`. Value may be `undefined` if * the socket is destroyed (for example, if the client disconnected). */ readonly remoteFamily?: string; /** * The numeric representation of the remote port. For example, `80` or `21`. Value may be `undefined` if * the socket is destroyed (for example, if the client disconnected). */ readonly remotePort?: number | undefined; /** * Half-closes the socket. i.e., it sends a FIN packet. It is possible the server will still send some data. * * @param callback Optional callback for when the socket is finished. * @return The socket itself. */ end(callback?: () => void): this; /** * events.EventEmitter * 1. close * 2. connect * 3. data * 4. end * 5. error */ addListener(event: string, listener: (...args: any[]) => void): this; addListener(event: "close", listener: (hadError: boolean) => void): this; addListener(event: "connect", listener: () => void): this; addListener(event: "data", listener: (data: Buffer) => void): this; addListener(event: "drain", listener: () => void): this; addListener(event: "end", listener: () => void): this; addListener(event: "error", listener: (err: Error) => void): this; emit(event: string | symbol, ...args: any[]): boolean; emit(event: "close", hadError: boolean): boolean; emit(event: "connect"): boolean; emit(event: "data", data: Buffer): boolean; emit(event: "end"): boolean; emit(event: "error", err: Error): boolean; on(event: string, listener: (...args: any[]) => void): this; on(event: "close", listener: (hadError: boolean) => void): this; on(event: "connect", listener: () => void): this; on(event: "data", listener: (data: Buffer) => void): this; on(event: "end", listener: () => void): this; on(event: "error", listener: (err: Error) => void): this; once(event: string, listener: (...args: any[]) => void): this; once(event: "close", listener: (hadError: boolean) => void): this; once(event: "connect", listener: () => void): this; once(event: "data", listener: (data: Buffer) => void): this; once(event: "end", listener: () => void): this; once(event: "error", listener: (err: Error) => void): this; prependListener(event: string, listener: (...args: any[]) => void): this; prependListener( event: "close", listener: (hadError: boolean) => void ): this; prependListener(event: "connect", listener: () => void): this; prependListener(event: "data", listener: (data: Buffer) => void): this; prependListener(event: "end", listener: () => void): this; prependListener(event: "error", listener: (err: Error) => void): this; prependOnceListener( event: string, listener: (...args: any[]) => void ): this; prependOnceListener( event: "close", listener: (hadError: boolean) => void ): this; prependOnceListener(event: "connect", listener: () => void): this; prependOnceListener(event: "data", listener: (data: Buffer) => void): this; prependOnceListener(event: "end", listener: () => void): this; prependOnceListener(event: "error", listener: (err: Error) => void): this; } interface ListenOptions { port?: number | undefined; host?: string | undefined; backlog?: number | undefined; path?: string | undefined; } interface ServerOpts { /** * Indicates whether half-opened TCP connections are allowed. * @default false */ allowHalfOpen?: boolean | undefined; } /** * This class is used to create a TCP or `IPC` server. */ class Server extends EventEmitter { constructor(connectionListener?: (socket: Socket) => void); constructor( options?: ServerOpts, connectionListener?: (socket: Socket) => void ); /** * Start a server listening for connections. A `net.Server` can be a TCP or * an `IPC` server depending on what it listens to. * * Possible signatures: * * * `server.listen(options[, callback])` * * `server.listen(path[, backlog][, callback])` for `IPC` servers * * `server.listen([port[, host[, backlog]]][, callback])` for TCP servers * * This function is asynchronous. When the server starts listening, the `'listening'` event will be emitted. The last parameter `callback`will be added as a listener for the `'listening'` * event. * * All `listen()` methods can take a `backlog` parameter to specify the maximum length of the queue of pending connections. * Currently this parameter is IGNORED, support will be added in the future. * * All {@link Socket} are set to `SO_REUSEADDR` (see [`socket(7)`](https://man7.org/linux/man-pages/man7/socket.7.html) for details). * * The `server.listen()` method can be called again if and only if there was an error during the first `server.listen()` * call or `server.close()` has been called. Otherwise, an error will be thrown. */ listen(listeningListener?: () => void): void; listen( port?: number, hostname?: string, backlog?: number, listeningListener?: () => void ): void; listen( port?: number, hostname?: string, listeningListener?: () => void ): void; listen( port?: number, backlog?: number, listeningListener?: () => void ): void; listen(port?: number, listeningListener?: () => void): void; listen( path: string, backlog?: number, listeningListener?: () => void ): void; listen(path: string, listeningListener?: () => void): void; listen(options: ListenOptions, listeningListener?: () => void): void; /** * Stops the server from accepting new connections and keeps existing * connections. This function is asynchronous, the server is finally closed * when all connections are ended and the server emits a `'close'` event. * The optional `callback` will be called once the `'close'` event occurs. Unlike * that event, it will be called with an `Error` as its only argument if the server * was not open when it was closed. * @param callback Called when the server is closed. */ close(callback?: (err?: Error) => void): this; /** * Returns the bound `address`, the address `family` name, and `port` of the server * as reported by the operating system if listening on an IP socket * (useful to find which port was assigned when getting an OS-assigned address):`{ port: 12346, family: 'IPv4', address: '127.0.0.1' }`. * * For a server listening on a pipe or Unix domain socket, the name is returned * as a string. * * ```js * const server = net.createServer((socket) => { * socket.end('goodbye\n'); * }).on('error', (err) => { * // Handle errors here. * throw err; * }); * * // Grab an arbitrary unused port. * server.listen(() => { * console.log('opened server on', server.address()); * }); * ``` * * `server.address()` returns `null` before the `'listening'` event has been * emitted or after calling `server.close()`. */ address(): AddressInfo | string | null; /** * events.EventEmitter * 1. close * 2. connection * 3. error * 4. listening */ addListener(event: string, listener: (...args: any[]) => void): this; addListener(event: "close", listener: () => void): this; addListener(event: "connection", listener: (socket: Socket) => void): this; addListener(event: "error", listener: (err: Error) => void): this; addListener(event: "listening", listener: () => void): this; emit(event: string | symbol, ...args: any[]): boolean; emit(event: "close"): boolean; emit(event: "connection", socket: Socket): boolean; emit(event: "error", err: Error): boolean; emit(event: "listening"): boolean; on(event: string, listener: (...args: any[]) => void): this; on(event: "close", listener: () => void): this; on(event: "connection", listener: (socket: Socket) => void): this; on(event: "error", listener: (err: Error) => void): this; on(event: "listening", listener: () => void): this; once(event: string, listener: (...args: any[]) => void): this; once(event: "close", listener: () => void): this; once(event: "connection", listener: (socket: Socket) => void): this; once(event: "error", listener: (err: Error) => void): this; once(event: "listening", listener: () => void): this; prependListener(event: string, listener: (...args: any[]) => void): this; prependListener(event: "close", listener: () => void): this; prependListener( event: "connection", listener: (socket: Socket) => void ): this; prependListener(event: "error", listener: (err: Error) => void): this; prependListener(event: "listening", listener: () => void): this; prependOnceListener( event: string, listener: (...args: any[]) => void ): this; prependOnceListener(event: "close", listener: () => void): this; prependOnceListener( event: "connection", listener: (socket: Socket) => void ): this; prependOnceListener(event: "error", listener: (err: Error) => void): this; prependOnceListener(event: "listening", listener: () => void): this; } type NetConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; /** * Creates a new TCP or `IPC` server. * * If `allowHalfOpen` is set to `true`, when the other end of the socket * signals the end of transmission, the server will only send back the end of * transmission when `socket.end()` is explicitly called. For example, in the * context of TCP, when a FIN packed is received, a FIN packed is sent * back only when `socket.end()` is explicitly called. Until then the * connection is half-closed (non-readable but still writable). See `'end'` event and [RFC 1122](https://tools.ietf.org/html/rfc1122) (section 4.2.2.13) for more information. * * If `pauseOnConnect` is set to `true`, then the socket associated with each * incoming connection will be paused, and no data will be read from its handle. * This allows connections to be passed between processes without any data being * read by the original process. To begin reading data from a paused socket, call `socket.resume()`. * * The server can be a TCP server or an `IPC` server, depending on what it `listen()` to. * * Here is an example of a TCP echo server which listens for connections * on port 8124: * * ```js * import * as net from 'net'; * const server = net.createServer((c) => { * // 'connection' listener. * console.log('client connected'); * c.on('end', () => { * console.log('client disconnected'); * }); * c.write('hello\r\n'); * * }); * server.on('error', (err) => { * throw err; * }); * server.listen(8124, () => { * console.log('server bound'); * }); * ``` * * Test this by using `telnet`: * * ```bash * telnet localhost 8124 * ``` * * To listen on the socket `/tmp/echo.sock`: * * ```js * server.listen('/tmp/echo.sock', () => { * console.log('server bound'); * }); * ``` * * Use `nc` to connect to a Unix domain socket server: * * ```bash * nc -U /tmp/echo.sock * ``` * @param connectionListener Automatically set as a listener for the {@link 'connection'} event. */ function createServer(connectionListener?: (socket: Socket) => void): Server; function createServer( options?: ServerOpts, connectionListener?: (socket: Socket) => void ): Server; /** * Aliases to {@link createConnection}. * * Possible signatures: * * * {@link connect} * * {@link connect} for `IPC` connections. * * {@link connect} for TCP connections. */ function connect( options: NetConnectOpts, connectionListener?: () => void ): Socket; function connect( port: number, host: string, connectionListener?: () => void ): Socket; function connect(port: number, connectionListener?: () => void): Socket; function connect(path: string, connectionListener?: () => void): Socket; /** * A factory function, which creates a new {@link Socket}, * immediately initiates connection with `socket.connect()`, * then returns the `net.Socket` that starts the connection. * * When the connection is established, a `'connect'` event will be emitted * on the returned socket. The last parameter `connectListener`, if supplied, * will be added as a listener for the `'connect'` event **once**. * * Possible signatures: * * * {@link createConnection} * * {@link createConnection} for `IPC` connections. * * {@link createConnection} for TCP connections. * * The {@link connect} function is an alias to this function. */ function createConnection( options: NetConnectOpts, connectionListener?: () => void ): Socket; function createConnection( port: number, host: string, connectionListener?: () => void ): Socket; function createConnection( port: number, connectionListener?: () => void ): Socket; function createConnection( path: string, connectionListener?: () => void ): Socket; }