/** * The `v8` module exposes APIs that are specific to the version of [V8](https://developers.google.com/v8/) built into the Node.js binary. It can be accessed using: * * ```js * const v8 = require('v8'); * ``` * @see [source](https://github.com/nodejs/node/blob/v18.0.0/lib/v8.js) */ declare module 'v8' { import { Readable } from 'node:stream'; interface HeapSpaceInfo { space_name: string; space_size: number; space_used_size: number; space_available_size: number; physical_space_size: number; } // ** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ type DoesZapCodeSpaceFlag = 0 | 1; interface HeapInfo { total_heap_size: number; total_heap_size_executable: number; total_physical_size: number; total_available_size: number; used_heap_size: number; heap_size_limit: number; malloced_memory: number; peak_malloced_memory: number; does_zap_garbage: DoesZapCodeSpaceFlag; number_of_native_contexts: number; number_of_detached_contexts: number; } interface HeapCodeStatistics { code_and_metadata_size: number; bytecode_and_metadata_size: number; external_script_source_size: number; } /** * Returns an integer representing a version tag derived from the V8 version, * command-line flags, and detected CPU features. This is useful for determining * whether a `vm.Script` `cachedData` buffer is compatible with this instance * of V8. * * ```js * console.log(v8.cachedDataVersionTag()); // 3947234607 * // The value returned by v8.cachedDataVersionTag() is derived from the V8 * // version, command-line flags, and detected CPU features. Test that the value * // does indeed update when flags are toggled. * v8.setFlagsFromString('--allow_natives_syntax'); * console.log(v8.cachedDataVersionTag()); // 183726201 * ``` * @since v8.0.0 */ function cachedDataVersionTag(): number; /** * Returns an object with the following properties: * * `does_zap_garbage` is a 0/1 boolean, which signifies whether the`--zap_code_space` option is enabled or not. This makes V8 overwrite heap * garbage with a bit pattern. The RSS footprint (resident set size) gets bigger * because it continuously touches all heap pages and that makes them less likely * to get swapped out by the operating system. * * `number_of_native_contexts` The value of native\_context is the number of the * top-level contexts currently active. Increase of this number over time indicates * a memory leak. * * `number_of_detached_contexts` The value of detached\_context is the number * of contexts that were detached and not yet garbage collected. This number * being non-zero indicates a potential memory leak. * * ```js * { * total_heap_size: 7326976, * total_heap_size_executable: 4194304, * total_physical_size: 7326976, * total_available_size: 1152656, * used_heap_size: 3476208, * heap_size_limit: 1535115264, * malloced_memory: 16384, * peak_malloced_memory: 1127496, * does_zap_garbage: 0, * number_of_native_contexts: 1, * number_of_detached_contexts: 0 * } * ``` * @since v1.0.0 */ function getHeapStatistics(): HeapInfo; /** * Returns statistics about the V8 heap spaces, i.e. the segments which make up * the V8 heap. Neither the ordering of heap spaces, nor the availability of a * heap space can be guaranteed as the statistics are provided via the * V8[`GetHeapSpaceStatistics`](https://v8docs.nodesource.com/node-13.2/d5/dda/classv8_1_1_isolate.html#ac673576f24fdc7a33378f8f57e1d13a4) function and may change from one V8 version to the * next. * * The value returned is an array of objects containing the following properties: * * ```json * [ * { * "space_name": "new_space", * "space_size": 2063872, * "space_used_size": 951112, * "space_available_size": 80824, * "physical_space_size": 2063872 * }, * { * "space_name": "old_space", * "space_size": 3090560, * "space_used_size": 2493792, * "space_available_size": 0, * "physical_space_size": 3090560 * }, * { * "space_name": "code_space", * "space_size": 1260160, * "space_used_size": 644256, * "space_available_size": 960, * "physical_space_size": 1260160 * }, * { * "space_name": "map_space", * "space_size": 1094160, * "space_used_size": 201608, * "space_available_size": 0, * "physical_space_size": 1094160 * }, * { * "space_name": "large_object_space", * "space_size": 0, * "space_used_size": 0, * "space_available_size": 1490980608, * "physical_space_size": 0 * } * ] * ``` * @since v6.0.0 */ function getHeapSpaceStatistics(): HeapSpaceInfo[]; /** * The `v8.setFlagsFromString()` method can be used to programmatically set * V8 command-line flags. This method should be used with care. Changing settings * after the VM has started may result in unpredictable behavior, including * crashes and data loss; or it may simply do nothing. * * The V8 options available for a version of Node.js may be determined by running`node --v8-options`. * * Usage: * * ```js * // Print GC events to stdout for one minute. * const v8 = require('v8'); * v8.setFlagsFromString('--trace_gc'); * setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3); * ``` * @since v1.0.0 */ function setFlagsFromString(flags: string): void; /** * Generates a snapshot of the current V8 heap and returns a Readable * Stream that may be used to read the JSON serialized representation. * This JSON stream format is intended to be used with tools such as * Chrome DevTools. The JSON schema is undocumented and specific to the * V8 engine. Therefore, the schema may change from one version of V8 to the next. * * Creating a heap snapshot requires memory about twice the size of the heap at * the time the snapshot is created. This results in the risk of OOM killers * terminating the process. * * Generating a snapshot is a synchronous operation which blocks the event loop * for a duration depending on the heap size. * * ```js * // Print heap snapshot to the console * const v8 = require('v8'); * const stream = v8.getHeapSnapshot(); * stream.pipe(process.stdout); * ``` * @since v11.13.0 * @return A Readable Stream containing the V8 heap snapshot */ function getHeapSnapshot(): Readable; /** * Generates a snapshot of the current V8 heap and writes it to a JSON * file. This file is intended to be used with tools such as Chrome * DevTools. The JSON schema is undocumented and specific to the V8 * engine, and may change from one version of V8 to the next. * * A heap snapshot is specific to a single V8 isolate. When using `worker threads`, a heap snapshot generated from the main thread will * not contain any information about the workers, and vice versa. * * Creating a heap snapshot requires memory about twice the size of the heap at * the time the snapshot is created. This results in the risk of OOM killers * terminating the process. * * Generating a snapshot is a synchronous operation which blocks the event loop * for a duration depending on the heap size. * * ```js * const { writeHeapSnapshot } = require('v8'); * const { * Worker, * isMainThread, * parentPort * } = require('worker_threads'); * * if (isMainThread) { * const worker = new Worker(__filename); * * worker.once('message', (filename) => { * console.log(`worker heapdump: ${filename}`); * // Now get a heapdump for the main thread. * console.log(`main thread heapdump: ${writeHeapSnapshot()}`); * }); * * // Tell the worker to create a heapdump. * worker.postMessage('heapdump'); * } else { * parentPort.once('message', (message) => { * if (message === 'heapdump') { * // Generate a heapdump for the worker * // and return the filename to the parent. * parentPort.postMessage(writeHeapSnapshot()); * } * }); * } * ``` * @since v11.13.0 * @param filename The file path where the V8 heap snapshot is to be saved. If not specified, a file name with the pattern `'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot'` will be * generated, where `{pid}` will be the PID of the Node.js process, `{thread_id}` will be `0` when `writeHeapSnapshot()` is called from the main Node.js thread or the id of a * worker thread. * @return The filename where the snapshot was saved. */ function writeHeapSnapshot(filename?: string): string; /** * Returns an object with the following properties: * * ```js * { * code_and_metadata_size: 212208, * bytecode_and_metadata_size: 161368, * external_script_source_size: 1410794 * } * ``` * @since v12.8.0 */ function getHeapCodeStatistics(): HeapCodeStatistics; /** * @since v8.0.0 */ class Serializer { /** * Writes out a header, which includes the serialization format version. */ writeHeader(): void; /** * Serializes a JavaScript value and adds the serialized representation to the * internal buffer. * * This throws an error if `value` cannot be serialized. */ writeValue(val: any): boolean; /** * Returns the stored internal buffer. This serializer should not be used once * the buffer is released. Calling this method results in undefined behavior * if a previous write has failed. */ releaseBuffer(): Buffer; /** * Marks an `ArrayBuffer` as having its contents transferred out of band. * Pass the corresponding `ArrayBuffer` in the deserializing context to `deserializer.transferArrayBuffer()`. * @param id A 32-bit unsigned integer. * @param arrayBuffer An `ArrayBuffer` instance. */ transferArrayBuffer(id: number, arrayBuffer: ArrayBuffer): void; /** * Write a raw 32-bit unsigned integer. * For use inside of a custom `serializer._writeHostObject()`. */ writeUint32(value: number): void; /** * Write a raw 64-bit unsigned integer, split into high and low 32-bit parts. * For use inside of a custom `serializer._writeHostObject()`. */ writeUint64(hi: number, lo: number): void; /** * Write a JS `number` value. * For use inside of a custom `serializer._writeHostObject()`. */ writeDouble(value: number): void; /** * Write raw bytes into the serializer’s internal buffer. The deserializer * will require a way to compute the length of the buffer. * For use inside of a custom `serializer._writeHostObject()`. */ writeRawBytes(buffer: NodeJS.TypedArray): void; } /** * A subclass of `Serializer` that serializes `TypedArray`(in particular `Buffer`) and `DataView` objects as host objects, and only * stores the part of their underlying `ArrayBuffer`s that they are referring to. * @since v8.0.0 */ class DefaultSerializer extends Serializer {} /** * @since v8.0.0 */ class Deserializer { constructor(data: NodeJS.TypedArray); /** * Reads and validates a header (including the format version). * May, for example, reject an invalid or unsupported wire format. In that case, * an `Error` is thrown. */ readHeader(): boolean; /** * Deserializes a JavaScript value from the buffer and returns it. */ readValue(): any; /** * Marks an `ArrayBuffer` as having its contents transferred out of band. * Pass the corresponding `ArrayBuffer` in the serializing context to `serializer.transferArrayBuffer()` (or return the `id` from `serializer._getSharedArrayBufferId()` in the case of * `SharedArrayBuffer`s). * @param id A 32-bit unsigned integer. * @param arrayBuffer An `ArrayBuffer` instance. */ transferArrayBuffer(id: number, arrayBuffer: ArrayBuffer): void; /** * Reads the underlying wire format version. Likely mostly to be useful to * legacy code reading old wire format versions. May not be called before`.readHeader()`. */ getWireFormatVersion(): number; /** * Read a raw 32-bit unsigned integer and return it. * For use inside of a custom `deserializer._readHostObject()`. */ readUint32(): number; /** * Read a raw 64-bit unsigned integer and return it as an array `[hi, lo]`with two 32-bit unsigned integer entries. * For use inside of a custom `deserializer._readHostObject()`. */ readUint64(): [number, number]; /** * Read a JS `number` value. * For use inside of a custom `deserializer._readHostObject()`. */ readDouble(): number; /** * Read raw bytes from the deserializer’s internal buffer. The `length` parameter * must correspond to the length of the buffer that was passed to `serializer.writeRawBytes()`. * For use inside of a custom `deserializer._readHostObject()`. */ readRawBytes(length: number): Buffer; } /** * A subclass of `Deserializer` corresponding to the format written by `DefaultSerializer`. * @since v8.0.0 */ class DefaultDeserializer extends Deserializer {} /** * Uses a `DefaultSerializer` to serialize `value` into a buffer. * * `ERR_BUFFER_TOO_LARGE` will be thrown when trying to * serialize a huge object which requires buffer * larger than `buffer.constants.MAX_LENGTH`. * @since v8.0.0 */ function serialize(value: any): Buffer; /** * Uses a `DefaultDeserializer` with default options to read a JS value * from a buffer. * @since v8.0.0 * @param buffer A buffer returned by {@link serialize}. */ function deserialize(buffer: NodeJS.TypedArray): any; /** * The `v8.takeCoverage()` method allows the user to write the coverage started by `NODE_V8_COVERAGE` to disk on demand. This method can be invoked multiple * times during the lifetime of the process. Each time the execution counter will * be reset and a new coverage report will be written to the directory specified * by `NODE_V8_COVERAGE`. * * When the process is about to exit, one last coverage will still be written to * disk unless {@link stopCoverage} is invoked before the process exits. * @since v15.1.0, v14.18.0, v12.22.0 */ function takeCoverage(): void; /** * The `v8.stopCoverage()` method allows the user to stop the coverage collection * started by `NODE_V8_COVERAGE`, so that V8 can release the execution count * records and optimize code. This can be used in conjunction with {@link takeCoverage} if the user wants to collect the coverage on demand. * @since v15.1.0, v14.18.0, v12.22.0 */ function stopCoverage(): void; } declare module 'node:v8' { export * from 'v8'; }