/** * @author jdiaz5513 */ import { AnyArena } from "./arena"; import { Pointer, StructCtor, Struct } from "./pointers"; import { Segment } from "./segment"; export interface _Message { readonly arena: AnyArena; segments: Segment[]; traversalLimit: number; } export declare class Message { static readonly allocateSegment: typeof allocateSegment; static readonly dump: typeof dump; static readonly getRoot: typeof getRoot; static readonly getSegment: typeof getSegment; static readonly initRoot: typeof initRoot; static readonly readRawPointer: typeof readRawPointer; static readonly toArrayBuffer: typeof toArrayBuffer; static readonly toPackedArrayBuffer: typeof toPackedArrayBuffer; readonly _capnp: _Message; /** * A Cap'n Proto message. * * SECURITY WARNING: In nodejs do not pass a Buffer's internal array buffer into this constructor. Pass the buffer * directly and everything will be fine. If not, your message will potentially be initialized with random memory * contents! * * The constructor method creates a new Message, optionally using a provided arena for segment allocation, or a buffer * to read from. * * @constructor {Message} * * @param {AnyArena|ArrayBufferView|ArrayBuffer} [src] The source for the message. * A value of `undefined` will cause the message to initialize with a single segment arena only big enough for the * root pointer; it will expand as you go. This is a reasonable choice for most messages. * * Passing an arena will cause the message to use that arena for its segment allocation. Contents will be accepted * as-is. * * Passing an array buffer view (like `DataView`, `Uint8Array` or `Buffer`) will create a **copy** of the source * buffer; beware of the potential performance cost! * * @param {boolean} [packed] Whether or not the message is packed. If `true` (the default), the message will be * unpacked. * * @param {boolean} [singleSegment] If true, `src` will be treated as a message consisting of a single segment without * a framing header. * */ constructor(src?: AnyArena | ArrayBufferView | ArrayBuffer, packed?: boolean, singleSegment?: boolean); allocateSegment(byteLength: number): Segment; /** * Create a pretty-printed string dump of this message; incredibly useful for debugging. * * WARNING: Do not call this method on large messages! * * @returns {string} A big steaming pile of pretty hex digits. */ dump(): string; /** * Get a struct pointer for the root of this message. This is primarily used when reading a message; it will not * overwrite existing data. * * @template T * @param {StructCtor} RootStruct The struct type to use as the root. * @returns {T} A struct representing the root of the message. */ getRoot(RootStruct: StructCtor): T; /** * Get a segment by its id. * * This will lazily allocate the first segment if it doesn't already exist. * * @param {number} id The segment id. * @returns {Segment} The requested segment. */ getSegment(id: number): Segment; /** * Initialize a new message using the provided struct type as the root. * * @template T * @param {StructCtor} RootStruct The struct type to use as the root. * @returns {T} An initialized struct pointing to the root of the message. */ initRoot(RootStruct: StructCtor): T; /** * Set the root of the message to a copy of the given pointer. Used internally * to make copies of pointers for default values. * * @param {Pointer} src The source pointer to copy. * @returns {void} */ setRoot(src: Pointer): void; /** * Combine the contents of this message's segments into a single array buffer and prepend a stream framing header * containing information about the following segment data. * * @returns {ArrayBuffer} An ArrayBuffer with the contents of this message. */ toArrayBuffer(): ArrayBuffer; /** * Like `toArrayBuffer()`, but also applies the packing algorithm to the output. This is typically what you want to * use if you're sending the message over a network link or other slow I/O interface where size matters. * * @returns {ArrayBuffer} A packed message. */ toPackedArrayBuffer(): ArrayBuffer; toString(): string; } export interface CreateMessageOptions { packed?: boolean; singleSegment?: boolean; } export declare function initMessage(src?: AnyArena | ArrayBufferView | ArrayBuffer, packed?: boolean, singleSegment?: boolean): _Message; /** * Given an _unpacked_ message with a segment framing header, this will generate an ArrayBuffer for each segment in * the message. * * This method is not typically called directly, but can be useful in certain cases. * * @static * @param {ArrayBuffer} message An unpacked message with a framing header. * @returns {ArrayBuffer[]} An array of buffers containing the segment data. */ export declare function getFramedSegments(message: ArrayBuffer): ArrayBuffer[]; /** * This method is called on messages that were constructed with existing data to prepopulate the segments array with * everything we can find in the arena. Each segment will have it's `byteLength` set to the size of its buffer. * * Technically speaking, the message's segments will be "full" after calling this function. Calling this on your own * may void your warranty. * * @param {Message} m The message to allocate. * @returns {void} */ export declare function preallocateSegments(m: Message): void; export declare function allocateSegment(byteLength: number, m: Message): Segment; export declare function dump(m: Message): string; export declare function getRoot(RootStruct: StructCtor, m: Message): T; export declare function getSegment(id: number, m: Message): Segment; export declare function initRoot(RootStruct: StructCtor, m: Message): T; /** * Read a pointer in raw form (a packed message with framing headers). Does not * care or attempt to validate the input beyond parsing the message * segments. * * This is typically used by the compiler to load default values, but can be * useful to work with messages with an unknown schema. * * @param {ArrayBuffer} data The raw data to read. * @returns {Pointer} A root pointer. */ export declare function readRawPointer(data: ArrayBuffer): Pointer; export declare function setRoot(src: Pointer, m: Message): void; export declare function toArrayBuffer(m: Message): ArrayBuffer; export declare function toPackedArrayBuffer(m: Message): ArrayBuffer; export declare function getStreamFrame(m: Message): ArrayBuffer;