aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bunfig.toml3
-rw-r--r--packages/bun-types/images/README.md15
-rw-r--r--packages/bun-types/index.d.ts41
-rw-r--r--packages/bun-types/net.d.ts20
-rw-r--r--packages/bun-types/readline.d.ts699
-rw-r--r--packages/bun-types/readline/promises.d.ts149
-rw-r--r--packages/bun-types/tests/net.test-d.ts11
-rw-r--r--packages/bun-types/tests/tls.test-d.ts6
-rw-r--r--packages/bun-types/tls.d.ts1261
9 files changed, 2160 insertions, 45 deletions
diff --git a/bunfig.toml b/bunfig.toml
index 6d9b1c272..8c6c75190 100644
--- a/bunfig.toml
+++ b/bunfig.toml
@@ -1,6 +1,3 @@
-
-
-
[test]
# Large monorepos (like Bun) may want to specify the test directory more specifically
# By default, `bun wiptest` scans every single folder recurisvely which, if you
diff --git a/packages/bun-types/images/README.md b/packages/bun-types/images/README.md
deleted file mode 100644
index c300d46cf..000000000
--- a/packages/bun-types/images/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Can reference images included here in code comments, ex
-
-```ts
-/**
- * ## Large headline
- *
- *
- * **Images** are relative to images/ directory
- *![image_description](media://image_filehere.gif)
- *
- */
-export class MyUtil<T = { BOT_TOKEN: string }> {
- constructor(public config: T) {}
-}
-```
diff --git a/packages/bun-types/index.d.ts b/packages/bun-types/index.d.ts
index ea734ffef..c13e64289 100644
--- a/packages/bun-types/index.d.ts
+++ b/packages/bun-types/index.d.ts
@@ -5,32 +5,39 @@
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// <reference no-default-lib="true" />
/// <reference lib="esnext" />
-/// <reference path="./bun.d.ts" />
+/// <reference path="./assert.d.ts" />
/// <reference path="./buffer.d.ts" />
-/// <reference path="./sqlite.d.ts" />
+/// <reference path="./bun-test.d.ts" />
+/// <reference path="./bun.d.ts" />
+/// <reference path="./child_process.d.ts" />
+/// <reference path="./constants.d.ts" />
+/// <reference path="./crypto.d.ts" />
+/// <reference path="./dns.d.ts" />
+/// <reference path="./dns/promises.d.ts" />
+/// <reference path="./domain.d.ts" />
+/// <reference path="./events.d.ts" />
/// <reference path="./ffi.d.ts" />
/// <reference path="./fs.d.ts" />
/// <reference path="./fs/promises.d.ts" />
-/// <reference path="./html-rewriter.d.ts" />
/// <reference path="./globals.d.ts" />
-/// <reference path="./path.d.ts" />
-/// <reference path="./bun-test.d.ts" />
+/// <reference path="./html-rewriter.d.ts" />
+/// <reference path="./http.d.ts" />
/// <reference path="./jsc.d.ts" />
-/// <reference path="./assert.d.ts" />
-/// <reference path="./events.d.ts" />
+/// <reference path="./module.d.ts" />
+/// <reference path="./net.d.ts" />
/// <reference path="./os.d.ts" />
-/// <reference path="./domain.d.ts" />
-/// <reference path="./util.d.ts" />
+/// <reference path="./path.d.ts" />
+/// <reference path="./punycode.d.ts" />
/// <reference path="./querystring.d.ts" />
+/// <reference path="./readline.d.ts" />
+/// <reference path="./readline/promises.d.ts" />
+/// <reference path="./sqlite.d.ts" />
+/// <reference path="./stream.d.ts" />
/// <reference path="./string_decoder.d.ts" />
+/// <reference path="./supports-color.d.ts" />
/// <reference path="./timers.d.ts" />
-/// <reference path="./stream.d.ts" />
-/// <reference path="./crypto.d.ts" />
-/// <reference path="./child_process.d.ts" />
-/// <reference path="./constants.d.ts" />
-/// <reference path="./url.d.ts" />
+/// <reference path="./tls.d.ts" />
/// <reference path="./tty.d.ts" />
-/// <reference path="./http.d.ts" />
-/// <reference path="./punycode.d.ts" />
+/// <reference path="./url.d.ts" />
+/// <reference path="./util.d.ts" />
/// <reference path="./zlib.d.ts" />
-/// <reference path="./supports-color.d.ts" />
diff --git a/packages/bun-types/net.d.ts b/packages/bun-types/net.d.ts
index 1e373f4ba..8459fe685 100644
--- a/packages/bun-types/net.d.ts
+++ b/packages/bun-types/net.d.ts
@@ -18,16 +18,16 @@ declare module "net" {
Abortable,
// EventEmitter
} from "node:events";
- // import * as dns from "node:dns";
- // type LookupFunction = (
- // hostname: string,
- // options: dns.LookupOneOptions,
- // callback: (
- // err: NodeJS.ErrnoException | null,
- // address: string,
- // family: number,
- // ) => void,
- // ) => void;
+ import * as dns from "node:dns";
+ type LookupFunction = (
+ hostname: string,
+ options: dns.LookupOneOptions,
+ callback: (
+ err: ErrnoException | null,
+ address: string,
+ family: number,
+ ) => void,
+ ) => void;
interface AddressInfo {
address: string;
family: string;
diff --git a/packages/bun-types/readline.d.ts b/packages/bun-types/readline.d.ts
new file mode 100644
index 000000000..d0ef34741
--- /dev/null
+++ b/packages/bun-types/readline.d.ts
@@ -0,0 +1,699 @@
+/**
+ * The `readline` module provides an interface for reading data from a `Readable` stream (such as `process.stdin`) one line at a time.
+ *
+ * To use the promise-based APIs:
+ *
+ * ```js
+ * import * as readline from 'node:readline/promises';
+ * ```
+ *
+ * To use the callback and sync APIs:
+ *
+ * ```js
+ * import * as readline from 'node:readline';
+ * ```
+ *
+ * The following simple example illustrates the basic use of the `readline` module.
+ *
+ * ```js
+ * import * as readline from 'node:readline/promises';
+ * import { stdin as input, stdout as output } from 'node:process';
+ *
+ * const rl = readline.createInterface({ input, output });
+ *
+ * const answer = await rl.question('What do you think of Node.js? ');
+ *
+ * console.log(`Thank you for your valuable feedback: ${answer}`);
+ *
+ * rl.close();
+ * ```
+ *
+ * Once this code is invoked, the Node.js application will not terminate until the`readline.Interface` is closed because the interface waits for data to be
+ * received on the `input` stream.
+ * @see [source](https://github.com/nodejs/node/blob/v18.0.0/lib/readline.js)
+ */
+declare module "readline" {
+ import { Abortable, EventEmitter } from "node:events";
+ import * as promises from "node:readline/promises";
+
+ export { promises };
+ export interface Key {
+ sequence?: string | undefined;
+ name?: string | undefined;
+ ctrl?: boolean | undefined;
+ meta?: boolean | undefined;
+ shift?: boolean | undefined;
+ }
+ /**
+ * Instances of the `readline.Interface` class are constructed using the`readline.createInterface()` method. Every instance is associated with a
+ * single `input` `Readable` stream and a single `output` `Writable` stream.
+ * The `output` stream is used to print prompts for user input that arrives on,
+ * and is read from, the `input` stream.
+ * @since v0.1.104
+ */
+ export class Interface extends EventEmitter {
+ readonly terminal: boolean;
+ /**
+ * The current input data being processed by node.
+ *
+ * This can be used when collecting input from a TTY stream to retrieve the
+ * current value that has been processed thus far, prior to the `line` event
+ * being emitted. Once the `line` event has been emitted, this property will
+ * be an empty string.
+ *
+ * Be aware that modifying the value during the instance runtime may have
+ * unintended consequences if `rl.cursor` is not also controlled.
+ *
+ * **If not using a TTY stream for input, use the `'line'` event.**
+ *
+ * One possible use case would be as follows:
+ *
+ * ```js
+ * const values = ['lorem ipsum', 'dolor sit amet'];
+ * const rl = readline.createInterface(process.stdin);
+ * const showResults = debounce(() => {
+ * console.log(
+ * '\n',
+ * values.filter((val) => val.startsWith(rl.line)).join(' ')
+ * );
+ * }, 300);
+ * process.stdin.on('keypress', (c, k) => {
+ * showResults();
+ * });
+ * ```
+ * @since v0.1.98
+ */
+ readonly line: string;
+ /**
+ * The cursor position relative to `rl.line`.
+ *
+ * This will track where the current cursor lands in the input string, when
+ * reading input from a TTY stream. The position of cursor determines the
+ * portion of the input string that will be modified as input is processed,
+ * as well as the column where the terminal caret will be rendered.
+ * @since v0.1.98
+ */
+ readonly cursor: number;
+ /**
+ * NOTE: According to the documentation:
+ *
+ * > Instances of the `readline.Interface` class are constructed using the
+ * > `readline.createInterface()` method.
+ *
+ * @see https://nodejs.org/dist/latest-v10.x/docs/api/readline.html#readline_class_interface
+ */
+ protected constructor(
+ input: ReadableStream,
+ output?: WritableStream,
+ completer?: Completer | AsyncCompleter,
+ terminal?: boolean,
+ );
+ /**
+ * NOTE: According to the documentation:
+ *
+ * > Instances of the `readline.Interface` class are constructed using the
+ * > `readline.createInterface()` method.
+ *
+ * @see https://nodejs.org/dist/latest-v10.x/docs/api/readline.html#readline_class_interface
+ */
+ protected constructor(options: ReadLineOptions);
+ /**
+ * The `rl.getPrompt()` method returns the current prompt used by `rl.prompt()`.
+ * @since v15.3.0
+ * @return the current prompt string
+ */
+ getPrompt(): string;
+ /**
+ * The `rl.setPrompt()` method sets the prompt that will be written to `output`whenever `rl.prompt()` is called.
+ * @since v0.1.98
+ */
+ setPrompt(prompt: string): void;
+ /**
+ * The `rl.prompt()` method writes the `readline.Interface` instances configured`prompt` to a new line in `output` in order to provide a user with a new
+ * location at which to provide input.
+ *
+ * When called, `rl.prompt()` will resume the `input` stream if it has been
+ * paused.
+ *
+ * If the `readline.Interface` was created with `output` set to `null` or`undefined` the prompt is not written.
+ * @since v0.1.98
+ * @param preserveCursor If `true`, prevents the cursor placement from being reset to `0`.
+ */
+ prompt(preserveCursor?: boolean): void;
+ /**
+ * The `rl.question()` method displays the `query` by writing it to the `output`,
+ * waits for user input to be provided on `input`, then invokes the `callback`function passing the provided input as the first argument.
+ *
+ * When called, `rl.question()` will resume the `input` stream if it has been
+ * paused.
+ *
+ * If the `readline.Interface` was created with `output` set to `null` or`undefined` the `query` is not written.
+ *
+ * The `callback` function passed to `rl.question()` does not follow the typical
+ * pattern of accepting an `Error` object or `null` as the first argument.
+ * The `callback` is called with the provided answer as the only argument.
+ *
+ * Example usage:
+ *
+ * ```js
+ * rl.question('What is your favorite food? ', (answer) => {
+ * console.log(`Oh, so your favorite food is ${answer}`);
+ * });
+ * ```
+ *
+ * Using an `AbortController` to cancel a question.
+ *
+ * ```js
+ * const ac = new AbortController();
+ * const signal = ac.signal;
+ *
+ * rl.question('What is your favorite food? ', { signal }, (answer) => {
+ * console.log(`Oh, so your favorite food is ${answer}`);
+ * });
+ *
+ * signal.addEventListener('abort', () => {
+ * console.log('The food question timed out');
+ * }, { once: true });
+ *
+ * setTimeout(() => ac.abort(), 10000);
+ * ```
+ *
+ * If this method is invoked as it's util.promisify()ed version, it returns a
+ * Promise that fulfills with the answer. If the question is canceled using
+ * an `AbortController` it will reject with an `AbortError`.
+ *
+ * ```js
+ * const util = require('util');
+ * const question = util.promisify(rl.question).bind(rl);
+ *
+ * async function questionExample() {
+ * try {
+ * const answer = await question('What is you favorite food? ');
+ * console.log(`Oh, so your favorite food is ${answer}`);
+ * } catch (err) {
+ * console.error('Question rejected', err);
+ * }
+ * }
+ * questionExample();
+ * ```
+ * @since v0.3.3
+ * @param query A statement or query to write to `output`, prepended to the prompt.
+ * @param callback A callback function that is invoked with the user's input in response to the `query`.
+ */
+ question(query: string, callback: (answer: string) => void): void;
+ question(
+ query: string,
+ options: Abortable,
+ callback: (answer: string) => void,
+ ): void;
+ /**
+ * The `rl.pause()` method pauses the `input` stream, allowing it to be resumed
+ * later if necessary.
+ *
+ * Calling `rl.pause()` does not immediately pause other events (including`'line'`) from being emitted by the `readline.Interface` instance.
+ * @since v0.3.4
+ */
+ pause(): this;
+ /**
+ * The `rl.resume()` method resumes the `input` stream if it has been paused.
+ * @since v0.3.4
+ */
+ resume(): this;
+ /**
+ * The `rl.close()` method closes the `readline.Interface` instance and
+ * relinquishes control over the `input` and `output` streams. When called,
+ * the `'close'` event will be emitted.
+ *
+ * Calling `rl.close()` does not immediately stop other events (including `'line'`)
+ * from being emitted by the `readline.Interface` instance.
+ * @since v0.1.98
+ */
+ close(): void;
+ /**
+ * The `rl.write()` method will write either `data` or a key sequence identified
+ * by `key` to the `output`. The `key` argument is supported only if `output` is
+ * a `TTY` text terminal. See `TTY keybindings` for a list of key
+ * combinations.
+ *
+ * If `key` is specified, `data` is ignored.
+ *
+ * When called, `rl.write()` will resume the `input` stream if it has been
+ * paused.
+ *
+ * If the `readline.Interface` was created with `output` set to `null` or`undefined` the `data` and `key` are not written.
+ *
+ * ```js
+ * rl.write('Delete this!');
+ * // Simulate Ctrl+U to delete the line written previously
+ * rl.write(null, { ctrl: true, name: 'u' });
+ * ```
+ *
+ * The `rl.write()` method will write the data to the `readline` `Interface`'s`input`_as if it were provided by the user_.
+ * @since v0.1.98
+ */
+ write(data: string | Buffer, key?: Key): void;
+ write(data: undefined | null | string | Buffer, key: Key): void;
+ /**
+ * Returns the real position of the cursor in relation to the input
+ * prompt + string. Long input (wrapping) strings, as well as multiple
+ * line prompts are included in the calculations.
+ * @since v13.5.0, v12.16.0
+ */
+ getCursorPos(): CursorPos;
+ /**
+ * events.EventEmitter
+ * 1. close
+ * 2. line
+ * 3. pause
+ * 4. resume
+ * 5. SIGCONT
+ * 6. SIGINT
+ * 7. SIGTSTP
+ * 8. history
+ */
+ addListener(event: string, listener: (...args: any[]) => void): this;
+ addListener(event: "close", listener: () => void): this;
+ addListener(event: "line", listener: (input: string) => void): this;
+ addListener(event: "pause", listener: () => void): this;
+ addListener(event: "resume", listener: () => void): this;
+ addListener(event: "SIGCONT", listener: () => void): this;
+ addListener(event: "SIGINT", listener: () => void): this;
+ addListener(event: "SIGTSTP", listener: () => void): this;
+ addListener(event: "history", listener: (history: string[]) => void): this;
+ emit(event: string | symbol, ...args: any[]): boolean;
+ emit(event: "close"): boolean;
+ emit(event: "line", input: string): boolean;
+ emit(event: "pause"): boolean;
+ emit(event: "resume"): boolean;
+ emit(event: "SIGCONT"): boolean;
+ emit(event: "SIGINT"): boolean;
+ emit(event: "SIGTSTP"): boolean;
+ emit(event: "history", history: string[]): boolean;
+ on(event: string, listener: (...args: any[]) => void): this;
+ on(event: "close", listener: () => void): this;
+ on(event: "line", listener: (input: string) => void): this;
+ on(event: "pause", listener: () => void): this;
+ on(event: "resume", listener: () => void): this;
+ on(event: "SIGCONT", listener: () => void): this;
+ on(event: "SIGINT", listener: () => void): this;
+ on(event: "SIGTSTP", listener: () => void): this;
+ on(event: "history", listener: (history: string[]) => void): this;
+ once(event: string, listener: (...args: any[]) => void): this;
+ once(event: "close", listener: () => void): this;
+ once(event: "line", listener: (input: string) => void): this;
+ once(event: "pause", listener: () => void): this;
+ once(event: "resume", listener: () => void): this;
+ once(event: "SIGCONT", listener: () => void): this;
+ once(event: "SIGINT", listener: () => void): this;
+ once(event: "SIGTSTP", listener: () => void): this;
+ once(event: "history", listener: (history: string[]) => void): this;
+ prependListener(event: string, listener: (...args: any[]) => void): this;
+ prependListener(event: "close", listener: () => void): this;
+ prependListener(event: "line", listener: (input: string) => void): this;
+ prependListener(event: "pause", listener: () => void): this;
+ prependListener(event: "resume", listener: () => void): this;
+ prependListener(event: "SIGCONT", listener: () => void): this;
+ prependListener(event: "SIGINT", listener: () => void): this;
+ prependListener(event: "SIGTSTP", listener: () => void): this;
+ prependListener(
+ event: "history",
+ listener: (history: string[]) => void,
+ ): this;
+ prependOnceListener(
+ event: string,
+ listener: (...args: any[]) => void,
+ ): this;
+ prependOnceListener(event: "close", listener: () => void): this;
+ prependOnceListener(event: "line", listener: (input: string) => void): this;
+ prependOnceListener(event: "pause", listener: () => void): this;
+ prependOnceListener(event: "resume", listener: () => void): this;
+ prependOnceListener(event: "SIGCONT", listener: () => void): this;
+ prependOnceListener(event: "SIGINT", listener: () => void): this;
+ prependOnceListener(event: "SIGTSTP", listener: () => void): this;
+ prependOnceListener(
+ event: "history",
+ listener: (history: string[]) => void,
+ ): this;
+ [Symbol.asyncIterator](): AsyncIterableIterator<string>;
+ }
+ export type ReadLine = Interface; // type forwarded for backwards compatibility
+ export type Completer = (line: string) => CompleterResult;
+ export type AsyncCompleter = (
+ line: string,
+ callback: (err?: null | Error, result?: CompleterResult) => void,
+ ) => void;
+ export type CompleterResult = [string[], string];
+ export interface ReadLineOptions {
+ input: ReadableStream;
+ output?: WritableStream | undefined;
+ completer?: Completer | AsyncCompleter | undefined;
+ terminal?: boolean | undefined;
+ /**
+ * Initial list of history lines. This option makes sense
+ * only if `terminal` is set to `true` by the user or by an internal `output`
+ * check, otherwise the history caching mechanism is not initialized at all.
+ * @default []
+ */
+ history?: string[] | undefined;
+ historySize?: number | undefined;
+ prompt?: string | undefined;
+ crlfDelay?: number | undefined;
+ /**
+ * If `true`, when a new input line added
+ * to the history list duplicates an older one, this removes the older line
+ * from the list.
+ * @default false
+ */
+ removeHistoryDuplicates?: boolean | undefined;
+ escapeCodeTimeout?: number | undefined;
+ tabSize?: number | undefined;
+ }
+ /**
+ * The `readline.createInterface()` method creates a new `readline.Interface`instance.
+ *
+ * ```js
+ * const readline = require('readline');
+ * const rl = readline.createInterface({
+ * input: process.stdin,
+ * output: process.stdout
+ * });
+ * ```
+ *
+ * Once the `readline.Interface` instance is created, the most common case is to
+ * listen for the `'line'` event:
+ *
+ * ```js
+ * rl.on('line', (line) => {
+ * console.log(`Received: ${line}`);
+ * });
+ * ```
+ *
+ * If `terminal` is `true` for this instance then the `output` stream will get
+ * the best compatibility if it defines an `output.columns` property and emits
+ * a `'resize'` event on the `output` if or when the columns ever change
+ * (`process.stdout` does this automatically when it is a TTY).
+ *
+ * When creating a `readline.Interface` using `stdin` as input, the program
+ * will not terminate until it receives `EOF` (Ctrl+D on
+ * Linux/macOS, Ctrl+Z followed by Return on
+ * Windows).
+ * If you want your application to exit without waiting for user input, you can `unref()` the standard input stream:
+ *
+ * ```js
+ * process.stdin.unref();
+ * ```
+ * @since v0.1.98
+ */
+ export function createInterface(
+ input: ReadableStream,
+ output?: WritableStream,
+ completer?: Completer | AsyncCompleter,
+ terminal?: boolean,
+ ): Interface;
+ export function createInterface(options: ReadLineOptions): Interface;
+ /**
+ * The `readline.emitKeypressEvents()` method causes the given `Readable` stream to begin emitting `'keypress'` events corresponding to received input.
+ *
+ * Optionally, `interface` specifies a `readline.Interface` instance for which
+ * autocompletion is disabled when copy-pasted input is detected.
+ *
+ * If the `stream` is a `TTY`, then it must be in raw mode.
+ *
+ * This is automatically called by any readline instance on its `input` if the`input` is a terminal. Closing the `readline` instance does not stop
+ * the `input` from emitting `'keypress'` events.
+ *
+ * ```js
+ * readline.emitKeypressEvents(process.stdin);
+ * if (process.stdin.isTTY)
+ * process.stdin.setRawMode(true);
+ * ```
+ *
+ * ## Example: Tiny CLI
+ *
+ * The following example illustrates the use of `readline.Interface` class to
+ * implement a small command-line interface:
+ *
+ * ```js
+ * const readline = require('readline');
+ * const rl = readline.createInterface({
+ * input: process.stdin,
+ * output: process.stdout,
+ * prompt: 'OHAI> '
+ * });
+ *
+ * rl.prompt();
+ *
+ * rl.on('line', (line) => {
+ * switch (line.trim()) {
+ * case 'hello':
+ * console.log('world!');
+ * break;
+ * default:
+ * console.log(`Say what? I might have heard '${line.trim()}'`);
+ * break;
+ * }
+ * rl.prompt();
+ * }).on('close', () => {
+ * console.log('Have a great day!');
+ * process.exit(0);
+ * });
+ * ```
+ *
+ * ## Example: Read file stream line-by-Line
+ *
+ * A common use case for `readline` is to consume an input file one line at a
+ * time. The easiest way to do so is leveraging the `fs.ReadStream` API as
+ * well as a `for await...of` loop:
+ *
+ * ```js
+ * const fs = require('fs');
+ * const readline = require('readline');
+ *
+ * async function processLineByLine() {
+ * const fileStream = fs.createReadStream('input.txt');
+ *
+ * const rl = readline.createInterface({
+ * input: fileStream,
+ * crlfDelay: Infinity
+ * });
+ * // Note: we use the crlfDelay option to recognize all instances of CR LF
+ * // ('\r\n') in input.txt as a single line break.
+ *
+ * for await (const line of rl) {
+ * // Each line in input.txt will be successively available here as `line`.
+ * console.log(`Line from file: ${line}`);
+ * }
+ * }
+ *
+ * processLineByLine();
+ * ```
+ *
+ * Alternatively, one could use the `'line'` event:
+ *
+ * ```js
+ * const fs = require('fs');
+ * const readline = require('readline');
+ *
+ * const rl = readline.createInterface({
+ * input: fs.createReadStream('sample.txt'),
+ * crlfDelay: Infinity
+ * });
+ *
+ * rl.on('line', (line) => {
+ * console.log(`Line from file: ${line}`);
+ * });
+ * ```
+ *
+ * Currently, `for await...of` loop can be a bit slower. If `async` / `await`flow and speed are both essential, a mixed approach can be applied:
+ *
+ * ```js
+ * const { once } = require('events');
+ * const { createReadStream } = require('fs');
+ * const { createInterface } = require('readline');
+ *
+ * (async function processLineByLine() {
+ * try {
+ * const rl = createInterface({
+ * input: createReadStream('big-file.txt'),
+ * crlfDelay: Infinity
+ * });
+ *
+ * rl.on('line', (line) => {
+ * // Process the line.
+ * });
+ *
+ * await once(rl, 'close');
+ *
+ * console.log('File processed.');
+ * } catch (err) {
+ * console.error(err);
+ * }
+ * })();
+ * ```
+ * @since v0.7.7
+ */
+ export function emitKeypressEvents(
+ stream: ReadableStream,
+ readlineInterface?: Interface,
+ ): void;
+ export type Direction = -1 | 0 | 1;
+ export interface CursorPos {
+ rows: number;
+ cols: number;
+ }
+ /**
+ * The `readline.clearLine()` method clears current line of given `TTY` stream
+ * in a specified direction identified by `dir`.
+ * @since v0.7.7
+ * @param callback Invoked once the operation completes.
+ * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
+ */
+ export function clearLine(
+ stream: WritableStream,
+ dir: Direction,
+ callback?: () => void,
+ ): boolean;
+ /**
+ * The `readline.clearScreenDown()` method clears the given `TTY` stream from
+ * the current position of the cursor down.
+ * @since v0.7.7
+ * @param callback Invoked once the operation completes.
+ * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
+ */
+ export function clearScreenDown(
+ stream: WritableStream,
+ callback?: () => void,
+ ): boolean;
+ /**
+ * The `readline.cursorTo()` method moves cursor to the specified position in a
+ * given `TTY` `stream`.
+ * @since v0.7.7
+ * @param callback Invoked once the operation completes.
+ * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
+ */
+ export function cursorTo(
+ stream: WritableStream,
+ x: number,
+ y?: number,
+ callback?: () => void,
+ ): boolean;
+ /**
+ * The `readline.moveCursor()` method moves the cursor _relative_ to its current
+ * position in a given `TTY` `stream`.
+ *
+ * ## Example: Tiny CLI
+ *
+ * The following example illustrates the use of `readline.Interface` class to
+ * implement a small command-line interface:
+ *
+ * ```js
+ * const readline = require('readline');
+ * const rl = readline.createInterface({
+ * input: process.stdin,
+ * output: process.stdout,
+ * prompt: 'OHAI> '
+ * });
+ *
+ * rl.prompt();
+ *
+ * rl.on('line', (line) => {
+ * switch (line.trim()) {
+ * case 'hello':
+ * console.log('world!');
+ * break;
+ * default:
+ * console.log(`Say what? I might have heard '${line.trim()}'`);
+ * break;
+ * }
+ * rl.prompt();
+ * }).on('close', () => {
+ * console.log('Have a great day!');
+ * process.exit(0);
+ * });
+ * ```
+ *
+ * ## Example: Read file stream line-by-Line
+ *
+ * A common use case for `readline` is to consume an input file one line at a
+ * time. The easiest way to do so is leveraging the `fs.ReadStream` API as
+ * well as a `for await...of` loop:
+ *
+ * ```js
+ * const fs = require('fs');
+ * const readline = require('readline');
+ *
+ * async function processLineByLine() {
+ * const fileStream = fs.createReadStream('input.txt');
+ *
+ * const rl = readline.createInterface({
+ * input: fileStream,
+ * crlfDelay: Infinity
+ * });
+ * // Note: we use the crlfDelay option to recognize all instances of CR LF
+ * // ('\r\n') in input.txt as a single line break.
+ *
+ * for await (const line of rl) {
+ * // Each line in input.txt will be successively available here as `line`.
+ * console.log(`Line from file: ${line}`);
+ * }
+ * }
+ *
+ * processLineByLine();
+ * ```
+ *
+ * Alternatively, one could use the `'line'` event:
+ *
+ * ```js
+ * const fs = require('fs');
+ * const readline = require('readline');
+ *
+ * const rl = readline.createInterface({
+ * input: fs.createReadStream('sample.txt'),
+ * crlfDelay: Infinity
+ * });
+ *
+ * rl.on('line', (line) => {
+ * console.log(`Line from file: ${line}`);
+ * });
+ * ```
+ *
+ * Currently, `for await...of` loop can be a bit slower. If `async` / `await`flow and speed are both essential, a mixed approach can be applied:
+ *
+ * ```js
+ * const { once } = require('events');
+ * const { createReadStream } = require('fs');
+ * const { createInterface } = require('readline');
+ *
+ * (async function processLineByLine() {
+ * try {
+ * const rl = createInterface({
+ * input: createReadStream('big-file.txt'),
+ * crlfDelay: Infinity
+ * });
+ *
+ * rl.on('line', (line) => {
+ * // Process the line.
+ * });
+ *
+ * await once(rl, 'close');
+ *
+ * console.log('File processed.');
+ * } catch (err) {
+ * console.error(err);
+ * }
+ * })();
+ * ```
+ * @since v0.7.7
+ * @param callback Invoked once the operation completes.
+ * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
+ */
+ export function moveCursor(
+ stream: WritableStream,
+ dx: number,
+ dy: number,
+ callback?: () => void,
+ ): boolean;
+}
+declare module "node:readline" {
+ export * from "readline";
+}
diff --git a/packages/bun-types/readline/promises.d.ts b/packages/bun-types/readline/promises.d.ts
new file mode 100644
index 000000000..160dd41af
--- /dev/null
+++ b/packages/bun-types/readline/promises.d.ts
@@ -0,0 +1,149 @@
+/**
+ * The `readline/promise` module provides an API for reading lines of input from a Readable stream one line at a time.
+ *
+ * @see [source](https://github.com/nodejs/node/blob/v18.0.0/lib/readline/promises.js)
+ * @since v17.0.0
+ */
+declare module "readline/promises" {
+ import {
+ Interface as _Interface,
+ ReadLineOptions,
+ Completer,
+ AsyncCompleter,
+ Direction,
+ } from "node:readline";
+ import { Abortable } from "node:events";
+
+ class Interface extends _Interface {
+ /**
+ * The rl.question() method displays the query by writing it to the output, waits for user input to be provided on input,
+ * then invokes the callback function passing the provided input as the first argument.
+ *
+ * When called, rl.question() will resume the input stream if it has been paused.
+ *
+ * If the readlinePromises.Interface was created with output set to null or undefined the query is not written.
+ *
+ * If the question is called after rl.close(), it returns a rejected promise.
+ *
+ * Example usage:
+ *
+ * ```js
+ * const answer = await rl.question('What is your favorite food? ');
+ * console.log(`Oh, so your favorite food is ${answer}`);
+ * ```
+ *
+ * Using an AbortSignal to cancel a question.
+ *
+ * ```js
+ * const signal = AbortSignal.timeout(10_000);
+ *
+ * signal.addEventListener('abort', () => {
+ * console.log('The food question timed out');
+ * }, { once: true });
+ *
+ * const answer = await rl.question('What is your favorite food? ', { signal });
+ * console.log(`Oh, so your favorite food is ${answer}`);
+ * ```
+ *
+ * @since v17.0.0
+ * @param query A statement or query to write to output, prepended to the prompt.
+ */
+ question(query: string): Promise<string>;
+ question(query: string, options: Abortable): Promise<string>;
+ }
+
+ class Readline {
+ /**
+ * @param stream A TTY stream.
+ */
+ constructor(stream: WritableStream, options?: { autoCommit?: boolean });
+ /**
+ * The `rl.clearLine()` method adds to the internal list of pending action an action that clears current line of the associated `stream` in a specified direction identified by `dir`.
+ * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true` was passed to the constructor.
+ */
+ clearLine(dir: Direction): this;
+ /**
+ * The `rl.clearScreenDown()` method adds to the internal list of pending action an action that clears the associated `stream` from the current position of the cursor down.
+ * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true` was passed to the constructor.
+ */
+ clearScreenDown(): this;
+ /**
+ * The `rl.commit()` method sends all the pending actions to the associated `stream` and clears the internal list of pending actions.
+ */
+ commit(): Promise<void>;
+ /**
+ * The `rl.cursorTo()` method adds to the internal list of pending action an action that moves cursor to the specified position in the associated `stream`.
+ * Call `rl.commit()` to see the effect of this method, unless `autoCommit: true` was passed to the constructor.
+ */
+ cursorTo(x: number, y?: number): this;
+ /**
+ * The `rl.moveCursor()` method adds to the internal list of pending action an action that moves the cursor relative to its current position in the associated `stream`.
+ * Call `rl.commit()` to see the effect of this method, unless autoCommit: true was passed to the constructor.
+ */
+ moveCursor(dx: number, dy: number): this;
+ /**
+ * The `rl.rollback()` method clears the internal list of pending actions without sending it to the associated `stream`.
+ */
+ rollback(): this;
+ }
+
+ /**
+ * The `readlinePromises.createInterface()` method creates a new `readlinePromises.Interface` instance.
+ *
+ * ```js
+ * const readlinePromises = require('node:readline/promises');
+ * const rl = readlinePromises.createInterface({
+ * input: process.stdin,
+ * output: process.stdout
+ * });
+ * ```
+ *
+ * Once the `readlinePromises.Interface` instance is created, the most common case is to listen for the `'line'` event:
+ *
+ * ```js
+ * rl.on('line', (line) => {
+ * console.log(`Received: ${line}`);
+ * });
+ * ```
+ *
+ * If `terminal` is `true` for this instance then the `output` stream will get the best compatibility if it defines an `output.columns` property,
+ * and emits a `'resize'` event on the `output`, if or when the columns ever change (`process.stdout` does this automatically when it is a TTY).
+ *
+ * ## Use of the `completer` function
+ *
+ * The `completer` function takes the current line entered by the user as an argument, and returns an `Array` with 2 entries:
+ *
+ * - An Array with matching entries for the completion.
+ * - The substring that was used for the matching.
+ *
+ * For instance: `[[substr1, substr2, ...], originalsubstring]`.
+ *
+ * ```js
+ * function completer(line) {
+ * const completions = '.help .error .exit .quit .q'.split(' ');
+ * const hits = completions.filter((c) => c.startsWith(line));
+ * // Show all completions if none found
+ * return [hits.length ? hits : completions, line];
+ * }
+ * ```
+ *
+ * The `completer` function can also returns a `Promise`, or be asynchronous:
+ *
+ * ```js
+ * async function completer(linePartial) {
+ * await someAsyncWork();
+ * return [['123'], linePartial];
+ * }
+ * ```
+ */
+ function createInterface(
+ input: ReadableStream,
+ output?: WritableStream,
+ completer?: Completer | AsyncCompleter,
+ terminal?: boolean,
+ ): Interface;
+ function createInterface(options: ReadLineOptions): Interface;
+}
+declare module "node:readline/promises" {
+ export * from "readline/promises";
+}
diff --git a/packages/bun-types/tests/net.test-d.ts b/packages/bun-types/tests/net.test-d.ts
new file mode 100644
index 000000000..76ad4b015
--- /dev/null
+++ b/packages/bun-types/tests/net.test-d.ts
@@ -0,0 +1,11 @@
+import * as net from "node:net";
+
+const socket = net.connect({
+ port: 80,
+ host: "localhost",
+});
+
+socket.connect({
+ port: 80,
+ host: "localhost",
+});
diff --git a/packages/bun-types/tests/tls.test-d.ts b/packages/bun-types/tests/tls.test-d.ts
new file mode 100644
index 000000000..5cf243e6c
--- /dev/null
+++ b/packages/bun-types/tests/tls.test-d.ts
@@ -0,0 +1,6 @@
+import tls from "node:tls";
+
+tls.connect({
+ host: "localhost",
+ port: 80,
+});
diff --git a/packages/bun-types/tls.d.ts b/packages/bun-types/tls.d.ts
new file mode 100644
index 000000000..42c1b2174
--- /dev/null
+++ b/packages/bun-types/tls.d.ts
@@ -0,0 +1,1261 @@
+/**
+ * The `tls` module provides an implementation of the Transport Layer Security
+ * (TLS) and Secure Socket Layer (SSL) protocols that is built on top of OpenSSL.
+ * The module can be accessed using:
+ *
+ * ```js
+ * const tls = require('tls');
+ * ```
+ * @see [source](https://github.com/nodejs/node/blob/v18.0.0/lib/tls.js)
+ */
+declare module "tls" {
+ // import { X509Certificate } from "node:crypto";
+ import * as net from "node:net";
+ import * as stream from "stream";
+ const CLIENT_RENEG_LIMIT: number;
+ const CLIENT_RENEG_WINDOW: number;
+ interface Certificate {
+ /**
+ * Country code.
+ */
+ C: string;
+ /**
+ * Street.
+ */
+ ST: string;
+ /**
+ * Locality.
+ */
+ L: string;
+ /**
+ * Organization.
+ */
+ O: string;
+ /**
+ * Organizational unit.
+ */
+ OU: string;
+ /**
+ * Common name.
+ */
+ CN: string;
+ }
+ interface PeerCertificate {
+ subject: Certificate;
+ issuer: Certificate;
+ subjectaltname: string;
+ infoAccess: Dict<string[]>;
+ modulus: string;
+ exponent: string;
+ valid_from: string;
+ valid_to: string;
+ fingerprint: string;
+ fingerprint256: string;
+ ext_key_usage: string[];
+ serialNumber: string;
+ raw: Buffer;
+ }
+ interface DetailedPeerCertificate extends PeerCertificate {
+ issuerCertificate: DetailedPeerCertificate;
+ }
+ interface CipherNameAndProtocol {
+ /**
+ * The cipher name.
+ */
+ name: string;
+ /**
+ * SSL/TLS protocol version.
+ */
+ version: string;
+ /**
+ * IETF name for the cipher suite.
+ */
+ standardName: string;
+ }
+ interface EphemeralKeyInfo {
+ /**
+ * The supported types are 'DH' and 'ECDH'.
+ */
+ type: string;
+ /**
+ * The name property is available only when type is 'ECDH'.
+ */
+ name?: string | undefined;
+ /**
+ * The size of parameter of an ephemeral key exchange.
+ */
+ size: number;
+ }
+ interface KeyObject {
+ /**
+ * Private keys in PEM format.
+ */
+ pem: string | Buffer;
+ /**
+ * Optional passphrase.
+ */
+ passphrase?: string | undefined;
+ }
+ interface PxfObject {
+ /**
+ * PFX or PKCS12 encoded private key and certificate chain.
+ */
+ buf: string | Buffer;
+ /**
+ * Optional passphrase.
+ */
+ passphrase?: string | undefined;
+ }
+ interface TLSSocketOptions
+ extends SecureContextOptions,
+ CommonConnectionOptions {
+ /**
+ * If true the TLS socket will be instantiated in server-mode.
+ * Defaults to false.
+ */
+ isServer?: boolean | undefined;
+ /**
+ * An optional net.Server instance.
+ */
+ // server?: net.Server | undefined;
+ /**
+ * An optional Buffer instance containing a TLS session.
+ */
+ session?: Buffer | undefined;
+ /**
+ * If true, specifies that the OCSP status request extension will be
+ * added to the client hello and an 'OCSPResponse' event will be
+ * emitted on the socket before establishing a secure communication
+ */
+ requestOCSP?: boolean | undefined;
+ }
+ /**
+ * Performs transparent encryption of written data and all required TLS
+ * negotiation.
+ *
+ * Instances of `tls.TLSSocket` implement the duplex `Stream` interface.
+ *
+ * Methods that return TLS connection metadata (e.g.{@link TLSSocket.getPeerCertificate} will only return data while the
+ * connection is open.
+ * @since v0.11.4
+ */
+ class TLSSocket extends net.Socket {
+ /**
+ * Construct a new tls.TLSSocket object from an existing TCP socket.
+ */
+ constructor(socket: net.Socket, options?: TLSSocketOptions);
+ /**
+ * This property is `true` if the peer certificate was signed by one of the CAs
+ * specified when creating the `tls.TLSSocket` instance, otherwise `false`.
+ * @since v0.11.4
+ */
+ authorized: boolean;
+ /**
+ * Returns the reason why the peer's certificate was not been verified. This
+ * property is set only when `tlsSocket.authorized === false`.
+ * @since v0.11.4
+ */
+ authorizationError: Error;
+ /**
+ * Always returns `true`. This may be used to distinguish TLS sockets from regular`net.Socket` instances.
+ * @since v0.11.4
+ */
+ encrypted: true;
+ /**
+ * String containing the selected ALPN protocol.
+ * Before a handshake has completed, this value is always null.
+ * When a handshake is completed but not ALPN protocol was selected, tlsSocket.alpnProtocol equals false.
+ */
+ alpnProtocol: string | false | null;
+ /**
+ * Returns an object representing the local certificate. The returned object has
+ * some properties corresponding to the fields of the certificate.
+ *
+ * See {@link TLSSocket.getPeerCertificate} for an example of the certificate
+ * structure.
+ *
+ * If there is no local certificate, an empty object will be returned. If the
+ * socket has been destroyed, `null` will be returned.
+ * @since v11.2.0
+ */
+ // getCertificate(): PeerCertificate | object | null;
+ /**
+ * Returns an object containing information on the negotiated cipher suite.
+ *
+ * For example:
+ *
+ * ```json
+ * {
+ * "name": "AES128-SHA256",
+ * "standardName": "TLS_RSA_WITH_AES_128_CBC_SHA256",
+ * "version": "TLSv1.2"
+ * }
+ * ```
+ *
+ * See [SSL\_CIPHER\_get\_name](https://www.openssl.org/docs/man1.1.1/man3/SSL_CIPHER_get_name.html) for more information.
+ * @since v0.11.4
+ */
+ // getCipher(): CipherNameAndProtocol;
+ /**
+ * Returns an object representing the type, name, and size of parameter of
+ * an ephemeral key exchange in `perfect forward secrecy` on a client
+ * connection. It returns an empty object when the key exchange is not
+ * ephemeral. As this is only supported on a client socket; `null` is returned
+ * if called on a server socket. The supported types are `'DH'` and `'ECDH'`. The`name` property is available only when type is `'ECDH'`.
+ *
+ * For example: `{ type: 'ECDH', name: 'prime256v1', size: 256 }`.
+ * @since v5.0.0
+ */
+ // getEphemeralKeyInfo(): EphemeralKeyInfo | object | null;
+ /**
+ * As the `Finished` messages are message digests of the complete handshake
+ * (with a total of 192 bits for TLS 1.0 and more for SSL 3.0), they can
+ * be used for external authentication procedures when the authentication
+ * provided by SSL/TLS is not desired or is not enough.
+ *
+ * Corresponds to the `SSL_get_finished` routine in OpenSSL and may be used
+ * to implement the `tls-unique` channel binding from [RFC 5929](https://tools.ietf.org/html/rfc5929).
+ * @since v9.9.0
+ * @return The latest `Finished` message that has been sent to the socket as part of a SSL/TLS handshake, or `undefined` if no `Finished` message has been sent yet.
+ */
+ // getFinished(): Buffer | undefined;
+ /**
+ * Returns an object representing the peer's certificate. If the peer does not
+ * provide a certificate, an empty object will be returned. If the socket has been
+ * destroyed, `null` will be returned.
+ *
+ * If the full certificate chain was requested, each certificate will include an`issuerCertificate` property containing an object representing its issuer's
+ * certificate.
+ * @since v0.11.4
+ * @param detailed Include the full certificate chain if `true`, otherwise include just the peer's certificate.
+ * @return A certificate object.
+ */
+ // getPeerCertificate(detailed: true): DetailedPeerCertificate;
+ // getPeerCertificate(detailed?: false): PeerCertificate;
+ // getPeerCertificate(
+ // detailed?: boolean,
+ // ): PeerCertificate | DetailedPeerCertificate;
+ /**
+ * As the `Finished` messages are message digests of the complete handshake
+ * (with a total of 192 bits for TLS 1.0 and more for SSL 3.0), they can
+ * be used for external authentication procedures when the authentication
+ * provided by SSL/TLS is not desired or is not enough.
+ *
+ * Corresponds to the `SSL_get_peer_finished` routine in OpenSSL and may be used
+ * to implement the `tls-unique` channel binding from [RFC 5929](https://tools.ietf.org/html/rfc5929).
+ * @since v9.9.0
+ * @return The latest `Finished` message that is expected or has actually been received from the socket as part of a SSL/TLS handshake, or `undefined` if there is no `Finished` message so
+ * far.
+ */
+ // getPeerFinished(): Buffer | undefined;
+ /**
+ * Returns a string containing the negotiated SSL/TLS protocol version of the
+ * current connection. The value `'unknown'` will be returned for connected
+ * sockets that have not completed the handshaking process. The value `null` will
+ * be returned for server sockets or disconnected client sockets.
+ *
+ * Protocol versions are:
+ *
+ * * `'SSLv3'`
+ * * `'TLSv1'`
+ * * `'TLSv1.1'`
+ * * `'TLSv1.2'`
+ * * `'TLSv1.3'`
+ *
+ * See the OpenSSL [`SSL_get_version`](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html) documentation for more information.
+ * @since v5.7.0
+ */
+ // getProtocol(): string | null;
+ /**
+ * Returns the TLS session data or `undefined` if no session was
+ * negotiated. On the client, the data can be provided to the `session` option of {@link connect} to resume the connection. On the server, it may be useful
+ * for debugging.
+ *
+ * See `Session Resumption` for more information.
+ *
+ * Note: `getSession()` works only for TLSv1.2 and below. For TLSv1.3, applications
+ * must use the `'session'` event (it also works for TLSv1.2 and below).
+ * @since v0.11.4
+ */
+ // getSession(): Buffer | undefined;
+ /**
+ * See [SSL\_get\_shared\_sigalgs](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_shared_sigalgs.html) for more information.
+ * @since v12.11.0
+ * @return List of signature algorithms shared between the server and the client in the order of decreasing preference.
+ */
+ // getSharedSigalgs(): string[];
+ /**
+ * For a client, returns the TLS session ticket if one is available, or`undefined`. For a server, always returns `undefined`.
+ *
+ * It may be useful for debugging.
+ *
+ * See `Session Resumption` for more information.
+ * @since v0.11.4
+ */
+ // getTLSTicket(): Buffer | undefined;
+ /**
+ * See `Session Resumption` for more information.
+ * @since v0.5.6
+ * @return `true` if the session was reused, `false` otherwise.
+ */
+ // isSessionReused(): boolean;
+ /**
+ * The `tlsSocket.renegotiate()` method initiates a TLS renegotiation process.
+ * Upon completion, the `callback` function will be passed a single argument
+ * that is either an `Error` (if the request failed) or `null`.
+ *
+ * This method can be used to request a peer's certificate after the secure
+ * connection has been established.
+ *
+ * When running as the server, the socket will be destroyed with an error after`handshakeTimeout` timeout.
+ *
+ * For TLSv1.3, renegotiation cannot be initiated, it is not supported by the
+ * protocol.
+ * @since v0.11.8
+ * @param callback If `renegotiate()` returned `true`, callback is attached once to the `'secure'` event. If `renegotiate()` returned `false`, `callback` will be called in the next tick with
+ * an error, unless the `tlsSocket` has been destroyed, in which case `callback` will not be called at all.
+ * @return `true` if renegotiation was initiated, `false` otherwise.
+ */
+ // renegotiate(
+ // options: {
+ // rejectUnauthorized?: boolean | undefined;
+ // requestCert?: boolean | undefined;
+ // },
+ // callback: (err: Error | null) => void,
+ // ): undefined | boolean;
+ /**
+ * The `tlsSocket.setMaxSendFragment()` method sets the maximum TLS fragment size.
+ * Returns `true` if setting the limit succeeded; `false` otherwise.
+ *
+ * Smaller fragment sizes decrease the buffering latency on the client: larger
+ * fragments are buffered by the TLS layer until the entire fragment is received
+ * and its integrity is verified; large fragments can span multiple roundtrips
+ * and their processing can be delayed due to packet loss or reordering. However,
+ * smaller fragments add extra TLS framing bytes and CPU overhead, which may
+ * decrease overall server throughput.
+ * @since v0.11.11
+ * @param [size=16384] The maximum TLS fragment size. The maximum value is `16384`.
+ */
+ // setMaxSendFragment(size: number): boolean;
+ /**
+ * Disables TLS renegotiation for this `TLSSocket` instance. Once called, attempts
+ * to renegotiate will trigger an `'error'` event on the `TLSSocket`.
+ * @since v8.4.0
+ */
+ // disableRenegotiation(): void;
+ /**
+ * When enabled, TLS packet trace information is written to `stderr`. This can be
+ * used to debug TLS connection problems.
+ *
+ * The format of the output is identical to the output of`openssl s_client -trace` or `openssl s_server -trace`. While it is produced by
+ * OpenSSL's `SSL_trace()` function, the format is undocumented, can change
+ * without notice, and should not be relied on.
+ * @since v12.2.0
+ */
+ // enableTrace(): void;
+ /**
+ * Returns the peer certificate as an `X509Certificate` object.
+ *
+ * If there is no peer certificate, or the socket has been destroyed,`undefined` will be returned.
+ * @since v15.9.0
+ */
+ // getPeerX509Certificate(): X509Certificate | undefined;
+ /**
+ * Returns the local certificate as an `X509Certificate` object.
+ *
+ * If there is no local certificate, or the socket has been destroyed,`undefined` will be returned.
+ * @since v15.9.0
+ */
+ // getX509Certificate(): X509Certificate | undefined;
+ /**
+ * Keying material is used for validations to prevent different kind of attacks in
+ * network protocols, for example in the specifications of IEEE 802.1X.
+ *
+ * Example
+ *
+ * ```js
+ * const keyingMaterial = tlsSocket.exportKeyingMaterial(
+ * 128,
+ * 'client finished');
+ *
+ * /*
+ * Example return value of keyingMaterial:
+ * <Buffer 76 26 af 99 c5 56 8e 42 09 91 ef 9f 93 cb ad 6c 7b 65 f8 53 f1 d8 d9
+ * 12 5a 33 b8 b5 25 df 7b 37 9f e0 e2 4f b8 67 83 a3 2f cd 5d 41 42 4c 91
+ * 74 ef 2c ... 78 more bytes>
+ *
+ * ```
+ *
+ * See the OpenSSL [`SSL_export_keying_material`](https://www.openssl.org/docs/man1.1.1/man3/SSL_export_keying_material.html) documentation for more
+ * information.
+ * @since v13.10.0, v12.17.0
+ * @param length number of bytes to retrieve from keying material
+ * @param label an application specific label, typically this will be a value from the [IANA Exporter Label
+ * Registry](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#exporter-labels).
+ * @param context Optionally provide a context.
+ * @return requested bytes of the keying material
+ */
+ // exportKeyingMaterial(
+ // length: number,
+ // label: string,
+ // context: Buffer,
+ // ): Buffer;
+ addListener(event: string, listener: (...args: any[]) => void): this;
+ addListener(
+ event: "OCSPResponse",
+ listener: (response: Buffer) => void,
+ ): this;
+ addListener(event: "secureConnect", listener: () => void): this;
+ addListener(event: "session", listener: (session: Buffer) => void): this;
+ addListener(event: "keylog", listener: (line: Buffer) => void): this;
+ emit(event: string | symbol, ...args: any[]): boolean;
+ emit(event: "OCSPResponse", response: Buffer): boolean;
+ emit(event: "secureConnect"): boolean;
+ emit(event: "session", session: Buffer): boolean;
+ emit(event: "keylog", line: Buffer): boolean;
+ on(event: string, listener: (...args: any[]) => void): this;
+ on(event: "OCSPResponse", listener: (response: Buffer) => void): this;
+ on(event: "secureConnect", listener: () => void): this;
+ on(event: "session", listener: (session: Buffer) => void): this;
+ on(event: "keylog", listener: (line: Buffer) => void): this;
+ once(event: string, listener: (...args: any[]) => void): this;
+ once(event: "OCSPResponse", listener: (response: Buffer) => void): this;
+ once(event: "secureConnect", listener: () => void): this;
+ once(event: "session", listener: (session: Buffer) => void): this;
+ once(event: "keylog", listener: (line: Buffer) => void): this;
+ prependListener(event: string, listener: (...args: any[]) => void): this;
+ prependListener(
+ event: "OCSPResponse",
+ listener: (response: Buffer) => void,
+ ): this;
+ prependListener(event: "secureConnect", listener: () => void): this;
+ prependListener(
+ event: "session",
+ listener: (session: Buffer) => void,
+ ): this;
+ prependListener(event: "keylog", listener: (line: Buffer) => void): this;
+ prependOnceListener(
+ event: string,
+ listener: (...args: any[]) => void,
+ ): this;
+ prependOnceListener(
+ event: "OCSPResponse",
+ listener: (response: Buffer) => void,
+ ): this;
+ prependOnceListener(event: "secureConnect", listener: () => void): this;
+ prependOnceListener(
+ event: "session",
+ listener: (session: Buffer) => void,
+ ): this;
+ prependOnceListener(
+ event: "keylog",
+ listener: (line: Buffer) => void,
+ ): this;
+ }
+ interface CommonConnectionOptions {
+ /**
+ * An optional TLS context object from tls.createSecureContext()
+ */
+ secureContext?: SecureContext | undefined;
+ /**
+ * When enabled, TLS packet trace information is written to `stderr`. This can be
+ * used to debug TLS connection problems.
+ * @default false
+ */
+ enableTrace?: boolean | undefined;
+ /**
+ * If true the server will request a certificate from clients that
+ * connect and attempt to verify that certificate. Defaults to
+ * false.
+ */
+ requestCert?: boolean | undefined;
+ /**
+ * An array of strings or a Buffer naming possible ALPN protocols.
+ * (Protocols should be ordered by their priority.)
+ */
+ ALPNProtocols?: string[] | Uint8Array[] | Uint8Array | undefined;
+ /**
+ * SNICallback(servername, cb) <Function> A function that will be
+ * called if the client supports SNI TLS extension. Two arguments
+ * will be passed when called: servername and cb. SNICallback should
+ * invoke cb(null, ctx), where ctx is a SecureContext instance.
+ * (tls.createSecureContext(...) can be used to get a proper
+ * SecureContext.) If SNICallback wasn't provided the default callback
+ * with high-level API will be used (see below).
+ */
+ SNICallback?:
+ | ((
+ servername: string,
+ cb: (err: Error | null, ctx?: SecureContext) => void,
+ ) => void)
+ | undefined;
+ /**
+ * If true the server will reject any connection which is not
+ * authorized with the list of supplied CAs. This option only has an
+ * effect if requestCert is true.
+ * @default true
+ */
+ rejectUnauthorized?: boolean | undefined;
+ }
+ interface TlsOptions
+ extends SecureContextOptions,
+ CommonConnectionOptions,
+ net.ServerOpts {
+ /**
+ * Abort the connection if the SSL/TLS handshake does not finish in the
+ * specified number of milliseconds. A 'tlsClientError' is emitted on
+ * the tls.Server object whenever a handshake times out. Default:
+ * 120000 (120 seconds).
+ */
+ handshakeTimeout?: number | undefined;
+ /**
+ * The number of seconds after which a TLS session created by the
+ * server will no longer be resumable. See Session Resumption for more
+ * information. Default: 300.
+ */
+ sessionTimeout?: number | undefined;
+ /**
+ * 48-bytes of cryptographically strong pseudo-random data.
+ */
+ ticketKeys?: Buffer | undefined;
+ /**
+ *
+ * @param socket
+ * @param identity identity parameter sent from the client.
+ * @return pre-shared key that must either be
+ * a buffer or `null` to stop the negotiation process. Returned PSK must be
+ * compatible with the selected cipher's digest.
+ *
+ * When negotiating TLS-PSK (pre-shared keys), this function is called
+ * with the identity provided by the client.
+ * If the return value is `null` the negotiation process will stop and an
+ * "unknown_psk_identity" alert message will be sent to the other party.
+ * If the server wishes to hide the fact that the PSK identity was not known,
+ * the callback must provide some random data as `psk` to make the connection
+ * fail with "decrypt_error" before negotiation is finished.
+ * PSK ciphers are disabled by default, and using TLS-PSK thus
+ * requires explicitly specifying a cipher suite with the `ciphers` option.
+ * More information can be found in the RFC 4279.
+ */
+ pskCallback?(
+ socket: TLSSocket,
+ identity: string,
+ ): DataView | TypedArray | null;
+ /**
+ * hint to send to a client to help
+ * with selecting the identity during TLS-PSK negotiation. Will be ignored
+ * in TLS 1.3. Upon failing to set pskIdentityHint `tlsClientError` will be
+ * emitted with `ERR_TLS_PSK_SET_IDENTIY_HINT_FAILED` code.
+ */
+ pskIdentityHint?: string | undefined;
+ }
+ interface PSKCallbackNegotation {
+ psk: DataView | TypedArray;
+ identity: string;
+ }
+ interface ConnectionOptions
+ extends SecureContextOptions,
+ CommonConnectionOptions {
+ host?: string | undefined;
+ port?: number | undefined;
+ path?: string | undefined; // Creates unix socket connection to path. If this option is specified, `host` and `port` are ignored.
+ socket?: stream.Duplex | undefined; // Establish secure connection on a given socket rather than creating a new socket
+ // checkServerIdentity?: typeof checkServerIdentity | undefined;
+ servername?: string | undefined; // SNI TLS Extension
+ session?: Buffer | undefined;
+ minDHSize?: number | undefined;
+ lookup?: net.LookupFunction | undefined;
+ timeout?: number | undefined;
+ /**
+ * When negotiating TLS-PSK (pre-shared keys), this function is called
+ * with optional identity `hint` provided by the server or `null`
+ * in case of TLS 1.3 where `hint` was removed.
+ * It will be necessary to provide a custom `tls.checkServerIdentity()`
+ * for the connection as the default one will try to check hostname/IP
+ * of the server against the certificate but that's not applicable for PSK
+ * because there won't be a certificate present.
+ * More information can be found in the RFC 4279.
+ *
+ * @param hint message sent from the server to help client
+ * decide which identity to use during negotiation.
+ * Always `null` if TLS 1.3 is used.
+ * @returns Return `null` to stop the negotiation process. `psk` must be
+ * compatible with the selected cipher's digest.
+ * `identity` must use UTF-8 encoding.
+ */
+ pskCallback?(hint: string | null): PSKCallbackNegotation | null;
+ }
+ /**
+ * Accepts encrypted connections using TLS or SSL.
+ * @since v0.3.2
+ */
+ // class Server extends net.Server {
+ // constructor(secureConnectionListener?: (socket: TLSSocket) => void);
+ // constructor(
+ // options: TlsOptions,
+ // secureConnectionListener?: (socket: TLSSocket) => void,
+ // );
+ // /**
+ // * The `server.addContext()` method adds a secure context that will be used if
+ // * the client request's SNI name matches the supplied `hostname` (or wildcard).
+ // *
+ // * When there are multiple matching contexts, the most recently added one is
+ // * used.
+ // * @since v0.5.3
+ // * @param hostname A SNI host name or wildcard (e.g. `'*'`)
+ // * @param context An object containing any of the possible properties from the {@link createSecureContext} `options` arguments (e.g. `key`, `cert`, `ca`, etc).
+ // */
+ // addContext(hostname: string, context: SecureContextOptions): void;
+ // /**
+ // * Returns the session ticket keys.
+ // *
+ // * See `Session Resumption` for more information.
+ // * @since v3.0.0
+ // * @return A 48-byte buffer containing the session ticket keys.
+ // */
+ // getTicketKeys(): Buffer;
+ // /**
+ // * The `server.setSecureContext()` method replaces the secure context of an
+ // * existing server. Existing connections to the server are not interrupted.
+ // * @since v11.0.0
+ // * @param options An object containing any of the possible properties from the {@link createSecureContext} `options` arguments (e.g. `key`, `cert`, `ca`, etc).
+ // */
+ // setSecureContext(options: SecureContextOptions): void;
+ // /**
+ // * Sets the session ticket keys.
+ // *
+ // * Changes to the ticket keys are effective only for future server connections.
+ // * Existing or currently pending server connections will use the previous keys.
+ // *
+ // * See `Session Resumption` for more information.
+ // * @since v3.0.0
+ // * @param keys A 48-byte buffer containing the session ticket keys.
+ // */
+ // setTicketKeys(keys: Buffer): void;
+ // /**
+ // * events.EventEmitter
+ // * 1. tlsClientError
+ // * 2. newSession
+ // * 3. OCSPRequest
+ // * 4. resumeSession
+ // * 5. secureConnection
+ // * 6. keylog
+ // */
+ // addListener(event: string, listener: (...args: any[]) => void): this;
+ // addListener(
+ // event: "tlsClientError",
+ // listener: (err: Error, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // addListener(
+ // event: "newSession",
+ // listener: (
+ // sessionId: Buffer,
+ // sessionData: Buffer,
+ // callback: () => void,
+ // ) => void,
+ // ): this;
+ // addListener(
+ // event: "OCSPRequest",
+ // listener: (
+ // certificate: Buffer,
+ // issuer: Buffer,
+ // callback: (err: Error | null, resp: Buffer) => void,
+ // ) => void,
+ // ): this;
+ // addListener(
+ // event: "resumeSession",
+ // listener: (
+ // sessionId: Buffer,
+ // callback: (err: Error | null, sessionData: Buffer | null) => void,
+ // ) => void,
+ // ): this;
+ // addListener(
+ // event: "secureConnection",
+ // listener: (tlsSocket: TLSSocket) => void,
+ // ): this;
+ // addListener(
+ // event: "keylog",
+ // listener: (line: Buffer, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // emit(event: string | symbol, ...args: any[]): boolean;
+ // emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean;
+ // emit(
+ // event: "newSession",
+ // sessionId: Buffer,
+ // sessionData: Buffer,
+ // callback: () => void,
+ // ): boolean;
+ // emit(
+ // event: "OCSPRequest",
+ // certificate: Buffer,
+ // issuer: Buffer,
+ // callback: (err: Error | null, resp: Buffer) => void,
+ // ): boolean;
+ // emit(
+ // event: "resumeSession",
+ // sessionId: Buffer,
+ // callback: (err: Error | null, sessionData: Buffer | null) => void,
+ // ): boolean;
+ // emit(event: "secureConnection", tlsSocket: TLSSocket): boolean;
+ // emit(event: "keylog", line: Buffer, tlsSocket: TLSSocket): boolean;
+ // on(event: string, listener: (...args: any[]) => void): this;
+ // on(
+ // event: "tlsClientError",
+ // listener: (err: Error, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // on(
+ // event: "newSession",
+ // listener: (
+ // sessionId: Buffer,
+ // sessionData: Buffer,
+ // callback: () => void,
+ // ) => void,
+ // ): this;
+ // on(
+ // event: "OCSPRequest",
+ // listener: (
+ // certificate: Buffer,
+ // issuer: Buffer,
+ // callback: (err: Error | null, resp: Buffer) => void,
+ // ) => void,
+ // ): this;
+ // on(
+ // event: "resumeSession",
+ // listener: (
+ // sessionId: Buffer,
+ // callback: (err: Error | null, sessionData: Buffer | null) => void,
+ // ) => void,
+ // ): this;
+ // on(
+ // event: "secureConnection",
+ // listener: (tlsSocket: TLSSocket) => void,
+ // ): this;
+ // on(
+ // event: "keylog",
+ // listener: (line: Buffer, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // once(event: string, listener: (...args: any[]) => void): this;
+ // once(
+ // event: "tlsClientError",
+ // listener: (err: Error, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // once(
+ // event: "newSession",
+ // listener: (
+ // sessionId: Buffer,
+ // sessionData: Buffer,
+ // callback: () => void,
+ // ) => void,
+ // ): this;
+ // once(
+ // event: "OCSPRequest",
+ // listener: (
+ // certificate: Buffer,
+ // issuer: Buffer,
+ // callback: (err: Error | null, resp: Buffer) => void,
+ // ) => void,
+ // ): this;
+ // once(
+ // event: "resumeSession",
+ // listener: (
+ // sessionId: Buffer,
+ // callback: (err: Error | null, sessionData: Buffer | null) => void,
+ // ) => void,
+ // ): this;
+ // once(
+ // event: "secureConnection",
+ // listener: (tlsSocket: TLSSocket) => void,
+ // ): this;
+ // once(
+ // event: "keylog",
+ // listener: (line: Buffer, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // prependListener(event: string, listener: (...args: any[]) => void): this;
+ // prependListener(
+ // event: "tlsClientError",
+ // listener: (err: Error, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // prependListener(
+ // event: "newSession",
+ // listener: (
+ // sessionId: Buffer,
+ // sessionData: Buffer,
+ // callback: () => void,
+ // ) => void,
+ // ): this;
+ // prependListener(
+ // event: "OCSPRequest",
+ // listener: (
+ // certificate: Buffer,
+ // issuer: Buffer,
+ // callback: (err: Error | null, resp: Buffer) => void,
+ // ) => void,
+ // ): this;
+ // prependListener(
+ // event: "resumeSession",
+ // listener: (
+ // sessionId: Buffer,
+ // callback: (err: Error | null, sessionData: Buffer | null) => void,
+ // ) => void,
+ // ): this;
+ // prependListener(
+ // event: "secureConnection",
+ // listener: (tlsSocket: TLSSocket) => void,
+ // ): this;
+ // prependListener(
+ // event: "keylog",
+ // listener: (line: Buffer, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: string,
+ // listener: (...args: any[]) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: "tlsClientError",
+ // listener: (err: Error, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: "newSession",
+ // listener: (
+ // sessionId: Buffer,
+ // sessionData: Buffer,
+ // callback: () => void,
+ // ) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: "OCSPRequest",
+ // listener: (
+ // certificate: Buffer,
+ // issuer: Buffer,
+ // callback: (err: Error | null, resp: Buffer) => void,
+ // ) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: "resumeSession",
+ // listener: (
+ // sessionId: Buffer,
+ // callback: (err: Error | null, sessionData: Buffer | null) => void,
+ // ) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: "secureConnection",
+ // listener: (tlsSocket: TLSSocket) => void,
+ // ): this;
+ // prependOnceListener(
+ // event: "keylog",
+ // listener: (line: Buffer, tlsSocket: TLSSocket) => void,
+ // ): this;
+ // }
+ /**
+ * @deprecated since v0.11.3 Use `tls.TLSSocket` instead.
+ */
+ interface SecurePair {
+ encrypted: TLSSocket;
+ cleartext: TLSSocket;
+ }
+ type SecureVersion = "TLSv1.3" | "TLSv1.2" | "TLSv1.1" | "TLSv1";
+ interface SecureContextOptions {
+ /**
+ * Optionally override the trusted CA certificates. Default is to trust
+ * the well-known CAs curated by Mozilla. Mozilla's CAs are completely
+ * replaced when CAs are explicitly specified using this option.
+ */
+ // ca?: string | Buffer | Array<string | Buffer> | undefined;
+ /**
+ * Cert chains in PEM format. One cert chain should be provided per
+ * private key. Each cert chain should consist of the PEM formatted
+ * certificate for a provided private key, followed by the PEM
+ * formatted intermediate certificates (if any), in order, and not
+ * including the root CA (the root CA must be pre-known to the peer,
+ * see ca). When providing multiple cert chains, they do not have to
+ * be in the same order as their private keys in key. If the
+ * intermediate certificates are not provided, the peer will not be
+ * able to validate the certificate, and the handshake will fail.
+ */
+ // cert?: string | Buffer | Array<string | Buffer> | undefined;
+ /**
+ * Colon-separated list of supported signature algorithms. The list
+ * can contain digest algorithms (SHA256, MD5 etc.), public key
+ * algorithms (RSA-PSS, ECDSA etc.), combination of both (e.g
+ * 'RSA+SHA384') or TLS v1.3 scheme names (e.g. rsa_pss_pss_sha512).
+ */
+ // sigalgs?: string | undefined;
+ /**
+ * Cipher suite specification, replacing the default. For more
+ * information, see modifying the default cipher suite. Permitted
+ * ciphers can be obtained via tls.getCiphers(). Cipher names must be
+ * uppercased in order for OpenSSL to accept them.
+ */
+ // ciphers?: string | undefined;
+ /**
+ * Name of an OpenSSL engine which can provide the client certificate.
+ */
+ // clientCertEngine?: string | undefined;
+ /**
+ * PEM formatted CRLs (Certificate Revocation Lists).
+ */
+ // crl?: string | Buffer | Array<string | Buffer> | undefined;
+ /**
+ * Diffie Hellman parameters, required for Perfect Forward Secrecy. Use
+ * openssl dhparam to create the parameters. The key length must be
+ * greater than or equal to 1024 bits or else an error will be thrown.
+ * Although 1024 bits is permissible, use 2048 bits or larger for
+ * stronger security. If omitted or invalid, the parameters are
+ * silently discarded and DHE ciphers will not be available.
+ */
+ // dhparam?: string | Buffer | undefined;
+ /**
+ * A string describing a named curve or a colon separated list of curve
+ * NIDs or names, for example P-521:P-384:P-256, to use for ECDH key
+ * agreement. Set to auto to select the curve automatically. Use
+ * crypto.getCurves() to obtain a list of available curve names. On
+ * recent releases, openssl ecparam -list_curves will also display the
+ * name and description of each available elliptic curve. Default:
+ * tls.DEFAULT_ECDH_CURVE.
+ */
+ // ecdhCurve?: string | undefined;
+ /**
+ * Attempt to use the server's cipher suite preferences instead of the
+ * client's. When true, causes SSL_OP_CIPHER_SERVER_PREFERENCE to be
+ * set in secureOptions
+ */
+ // honorCipherOrder?: boolean | undefined;
+ /**
+ * Private keys in PEM format. PEM allows the option of private keys
+ * being encrypted. Encrypted keys will be decrypted with
+ * options.passphrase. Multiple keys using different algorithms can be
+ * provided either as an array of unencrypted key strings or buffers,
+ * or an array of objects in the form {pem: <string|buffer>[,
+ * passphrase: <string>]}. The object form can only occur in an array.
+ * object.passphrase is optional. Encrypted keys will be decrypted with
+ * object.passphrase if provided, or options.passphrase if it is not.
+ */
+ // key?: string | Buffer | Array<string | Buffer | KeyObject> | undefined;
+ /**
+ * Name of an OpenSSL engine to get private key from. Should be used
+ * together with privateKeyIdentifier.
+ */
+ // privateKeyEngine?: string | undefined;
+ /**
+ * Identifier of a private key managed by an OpenSSL engine. Should be
+ * used together with privateKeyEngine. Should not be set together with
+ * key, because both options define a private key in different ways.
+ */
+ // privateKeyIdentifier?: string | undefined;
+ /**
+ * Optionally set the maximum TLS version to allow. One
+ * of `'TLSv1.3'`, `'TLSv1.2'`, `'TLSv1.1'`, or `'TLSv1'`. Cannot be specified along with the
+ * `secureProtocol` option, use one or the other.
+ * **Default:** `'TLSv1.3'`, unless changed using CLI options. Using
+ * `--tls-max-v1.2` sets the default to `'TLSv1.2'`. Using `--tls-max-v1.3` sets the default to
+ * `'TLSv1.3'`. If multiple of the options are provided, the highest maximum is used.
+ */
+ // maxVersion?: SecureVersion | undefined;
+ /**
+ * Optionally set the minimum TLS version to allow. One
+ * of `'TLSv1.3'`, `'TLSv1.2'`, `'TLSv1.1'`, or `'TLSv1'`. Cannot be specified along with the
+ * `secureProtocol` option, use one or the other. It is not recommended to use
+ * less than TLSv1.2, but it may be required for interoperability.
+ * **Default:** `'TLSv1.2'`, unless changed using CLI options. Using
+ * `--tls-v1.0` sets the default to `'TLSv1'`. Using `--tls-v1.1` sets the default to
+ * `'TLSv1.1'`. Using `--tls-min-v1.3` sets the default to
+ * 'TLSv1.3'. If multiple of the options are provided, the lowest minimum is used.
+ */
+ // minVersion?: SecureVersion | undefined;
+ /**
+ * Shared passphrase used for a single private key and/or a PFX.
+ */
+ // passphrase?: string | undefined;
+ /**
+ * PFX or PKCS12 encoded private key and certificate chain. pfx is an
+ * alternative to providing key and cert individually. PFX is usually
+ * encrypted, if it is, passphrase will be used to decrypt it. Multiple
+ * PFX can be provided either as an array of unencrypted PFX buffers,
+ * or an array of objects in the form {buf: <string|buffer>[,
+ * passphrase: <string>]}. The object form can only occur in an array.
+ * object.passphrase is optional. Encrypted PFX will be decrypted with
+ * object.passphrase if provided, or options.passphrase if it is not.
+ */
+ // pfx?: string | Buffer | Array<string | Buffer | PxfObject> | undefined;
+ /**
+ * Optionally affect the OpenSSL protocol behavior, which is not
+ * usually necessary. This should be used carefully if at all! Value is
+ * a numeric bitmask of the SSL_OP_* options from OpenSSL Options
+ */
+ // secureOptions?: number | undefined; // Value is a numeric bitmask of the `SSL_OP_*` options
+ /**
+ * Legacy mechanism to select the TLS protocol version to use, it does
+ * not support independent control of the minimum and maximum version,
+ * and does not support limiting the protocol to TLSv1.3. Use
+ * minVersion and maxVersion instead. The possible values are listed as
+ * SSL_METHODS, use the function names as strings. For example, use
+ * 'TLSv1_1_method' to force TLS version 1.1, or 'TLS_method' to allow
+ * any TLS protocol version up to TLSv1.3. It is not recommended to use
+ * TLS versions less than 1.2, but it may be required for
+ * interoperability. Default: none, see minVersion.
+ */
+ // secureProtocol?: string | undefined;
+ /**
+ * Opaque identifier used by servers to ensure session state is not
+ * shared between applications. Unused by clients.
+ */
+ // sessionIdContext?: string | undefined;
+ /**
+ * 48-bytes of cryptographically strong pseudo-random data.
+ * See Session Resumption for more information.
+ */
+ // ticketKeys?: Buffer | undefined;
+ /**
+ * The number of seconds after which a TLS session created by the
+ * server will no longer be resumable. See Session Resumption for more
+ * information. Default: 300.
+ */
+ // sessionTimeout?: number | undefined;
+ }
+ interface SecureContext {
+ context: any;
+ }
+ /**
+ * Verifies the certificate `cert` is issued to `hostname`.
+ *
+ * Returns [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object, populating it with `reason`, `host`, and `cert` on
+ * failure. On success, returns [undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Undefined_type).
+ *
+ * This function is intended to be used in combination with the`checkServerIdentity` option that can be passed to {@link connect} and as
+ * such operates on a `certificate object`. For other purposes, consider using `x509.checkHost()` instead.
+ *
+ * This function can be overwritten by providing an alternative function as the`options.checkServerIdentity` option that is passed to `tls.connect()`. The
+ * overwriting function can call `tls.checkServerIdentity()` of course, to augment
+ * the checks done with additional verification.
+ *
+ * This function is only called if the certificate passed all other checks, such as
+ * being issued by trusted CA (`options.ca`).
+ *
+ * Earlier versions of Node.js incorrectly accepted certificates for a given`hostname` if a matching `uniformResourceIdentifier` subject alternative name
+ * was present (see [CVE-2021-44531](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44531)). Applications that wish to accept`uniformResourceIdentifier` subject alternative names can use
+ * a custom`options.checkServerIdentity` function that implements the desired behavior.
+ * @since v0.8.4
+ * @param hostname The host name or IP address to verify the certificate against.
+ * @param cert A `certificate object` representing the peer's certificate.
+ */
+ // function checkServerIdentity(
+ // hostname: string,
+ // cert: PeerCertificate,
+ // ): Error | undefined;
+ /**
+ * Creates a new {@link Server}. The `secureConnectionListener`, if provided, is
+ * automatically set as a listener for the `'secureConnection'` event.
+ *
+ * The `ticketKeys` options is automatically shared between `cluster` module
+ * workers.
+ *
+ * The following illustrates a simple echo server:
+ *
+ * ```js
+ * const tls = require('tls');
+ * const fs = require('fs');
+ *
+ * const options = {
+ * key: fs.readFileSync('server-key.pem'),
+ * cert: fs.readFileSync('server-cert.pem'),
+ *
+ * // This is necessary only if using client certificate authentication.
+ * requestCert: true,
+ *
+ * // This is necessary only if the client uses a self-signed certificate.
+ * ca: [ fs.readFileSync('client-cert.pem') ]
+ * };
+ *
+ * const server = tls.createServer(options, (socket) => {
+ * console.log('server connected',
+ * socket.authorized ? 'authorized' : 'unauthorized');
+ * socket.write('welcome!\n');
+ * socket.setEncoding('utf8');
+ * socket.pipe(socket);
+ * });
+ * server.listen(8000, () => {
+ * console.log('server bound');
+ * });
+ * ```
+ *
+ * The server can be tested by connecting to it using the example client from {@link connect}.
+ * @since v0.3.2
+ */
+ // function createServer(
+ // secureConnectionListener?: (socket: TLSSocket) => void,
+ // ): Server;
+ // function createServer(
+ // options: TlsOptions,
+ // secureConnectionListener?: (socket: TLSSocket) => void,
+ // ): Server;
+ /**
+ * The `callback` function, if specified, will be added as a listener for the `'secureConnect'` event.
+ *
+ * `tls.connect()` returns a {@link TLSSocket} object.
+ *
+ * Unlike the `https` API, `tls.connect()` does not enable the
+ * SNI (Server Name Indication) extension by default, which may cause some
+ * servers to return an incorrect certificate or reject the connection
+ * altogether. To enable SNI, set the `servername` option in addition
+ * to `host`.
+ *
+ * The following illustrates a client for the echo server example from {@link createServer}:
+ *
+ * ```js
+ * // Assumes an echo server that is listening on port 8000.
+ * const tls = require('tls');
+ * const fs = require('fs');
+ *
+ * const options = {
+ * // Necessary only if the server requires client certificate authentication.
+ * key: fs.readFileSync('client-key.pem'),
+ * cert: fs.readFileSync('client-cert.pem'),
+ *
+ * // Necessary only if the server uses a self-signed certificate.
+ * ca: [ fs.readFileSync('server-cert.pem') ],
+ *
+ * // Necessary only if the server's cert isn't for "localhost".
+ * checkServerIdentity: () => { return null; },
+ * };
+ *
+ * const socket = tls.connect(8000, options, () => {
+ * console.log('client connected',
+ * socket.authorized ? 'authorized' : 'unauthorized');
+ * process.stdin.pipe(socket);
+ * process.stdin.resume();
+ * });
+ * socket.setEncoding('utf8');
+ * socket.on('data', (data) => {
+ * console.log(data);
+ * });
+ * socket.on('end', () => {
+ * console.log('server ends connection');
+ * });
+ * ```
+ * @since v0.11.3
+ */
+ function connect(
+ options: ConnectionOptions,
+ secureConnectListener?: () => void,
+ ): TLSSocket;
+ function connect(
+ port: number,
+ host?: string,
+ options?: ConnectionOptions,
+ secureConnectListener?: () => void,
+ ): TLSSocket;
+ function connect(
+ port: number,
+ options?: ConnectionOptions,
+ secureConnectListener?: () => void,
+ ): TLSSocket;
+ /**
+ * Creates a new secure pair object with two streams, one of which reads and writes
+ * the encrypted data and the other of which reads and writes the cleartext data.
+ * Generally, the encrypted stream is piped to/from an incoming encrypted data
+ * stream and the cleartext one is used as a replacement for the initial encrypted
+ * stream.
+ *
+ * `tls.createSecurePair()` returns a `tls.SecurePair` object with `cleartext` and`encrypted` stream properties.
+ *
+ * Using `cleartext` has the same API as {@link TLSSocket}.
+ *
+ * The `tls.createSecurePair()` method is now deprecated in favor of`tls.TLSSocket()`. For example, the code:
+ *
+ * ```js
+ * pair = tls.createSecurePair(// ... );
+ * pair.encrypted.pipe(socket);
+ * socket.pipe(pair.encrypted);
+ * ```
+ *
+ * can be replaced by:
+ *
+ * ```js
+ * secureSocket = tls.TLSSocket(socket, options);
+ * ```
+ *
+ * where `secureSocket` has the same API as `pair.cleartext`.
+ * @since v0.3.2
+ * @deprecated Since v0.11.3 - Use {@link TLSSocket} instead.
+ * @param context A secure context object as returned by `tls.createSecureContext()`
+ * @param isServer `true` to specify that this TLS connection should be opened as a server.
+ * @param requestCert `true` to specify whether a server should request a certificate from a connecting client. Only applies when `isServer` is `true`.
+ * @param rejectUnauthorized If not `false` a server automatically reject clients with invalid certificates. Only applies when `isServer` is `true`.
+ */
+ function createSecurePair(
+ context?: SecureContext,
+ isServer?: boolean,
+ requestCert?: boolean,
+ rejectUnauthorized?: boolean,
+ ): SecurePair;
+ /**
+ * {@link createServer} sets the default value of the `honorCipherOrder` option
+ * to `true`, other APIs that create secure contexts leave it unset.
+ *
+ * {@link createServer} uses a 128 bit truncated SHA1 hash value generated
+ * from `process.argv` as the default value of the `sessionIdContext` option, other
+ * APIs that create secure contexts have no default value.
+ *
+ * The `tls.createSecureContext()` method creates a `SecureContext` object. It is
+ * usable as an argument to several `tls` APIs, such as {@link createServer} and `server.addContext()`, but has no public methods.
+ *
+ * A key is _required_ for ciphers that use certificates. Either `key` or`pfx` can be used to provide it.
+ *
+ * If the `ca` option is not given, then Node.js will default to using [Mozilla's publicly trusted list of
+ * CAs](https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt).
+ * @since v0.11.13
+ */
+ function createSecureContext(options?: SecureContextOptions): SecureContext;
+ /**
+ * Returns an array with the names of the supported TLS ciphers. The names are
+ * lower-case for historical reasons, but must be uppercased to be used in
+ * the `ciphers` option of {@link createSecureContext}.
+ *
+ * Not all supported ciphers are enabled by default. See `Modifying the default TLS cipher suite`.
+ *
+ * Cipher names that start with `'tls_'` are for TLSv1.3, all the others are for
+ * TLSv1.2 and below.
+ *
+ * ```js
+ * console.log(tls.getCiphers()); // ['aes128-gcm-sha256', 'aes128-sha', ...]
+ * ```
+ * @since v0.10.2
+ */
+ function getCiphers(): string[];
+ /**
+ * The default curve name to use for ECDH key agreement in a tls server.
+ * The default value is 'auto'. See tls.createSecureContext() for further
+ * information.
+ */
+ let DEFAULT_ECDH_CURVE: string;
+ /**
+ * The default value of the maxVersion option of
+ * tls.createSecureContext(). It can be assigned any of the supported TLS
+ * protocol versions, 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Default:
+ * 'TLSv1.3', unless changed using CLI options. Using --tls-max-v1.2 sets
+ * the default to 'TLSv1.2'. Using --tls-max-v1.3 sets the default to
+ * 'TLSv1.3'. If multiple of the options are provided, the highest maximum
+ * is used.
+ */
+ let DEFAULT_MAX_VERSION: SecureVersion;
+ /**
+ * The default value of the minVersion option of tls.createSecureContext().
+ * It can be assigned any of the supported TLS protocol versions,
+ * 'TLSv1.3', 'TLSv1.2', 'TLSv1.1', or 'TLSv1'. Default: 'TLSv1.2', unless
+ * changed using CLI options. Using --tls-min-v1.0 sets the default to
+ * 'TLSv1'. Using --tls-min-v1.1 sets the default to 'TLSv1.1'. Using
+ * --tls-min-v1.3 sets the default to 'TLSv1.3'. If multiple of the options
+ * are provided, the lowest minimum is used.
+ */
+ let DEFAULT_MIN_VERSION: SecureVersion;
+ let DEFAULT_CIPHERS: string;
+ /**
+ * An immutable array of strings representing the root certificates (in PEM
+ * format) used for verifying peer certificates. This is the default value
+ * of the ca option to tls.createSecureContext().
+ */
+ // const rootCertificates: ReadonlyArray<string>;
+}
+declare module "node:tls" {
+ export * from "tls";
+}