import { Binary, BinarySizes } from "./binary.ts";import { Code } from "./code.ts";import { DBRef } from "./db_ref.ts";import { Decimal128 } from "./decimal128.ts";import { Double } from "./double.ts";import { Int32 } from "./int_32.ts";import { Long } from "./long.ts";import { MinKey } from "./min_key.ts";import { MaxKey } from "./max_key.ts";import { ObjectId } from "./objectid.ts";import { calculateObjectSize as internalCalculateObjectSize } from "./parser/calculate_size.ts";import { deserialize as internalDeserialize, DeserializeOptions,} from "./parser/deserializer.ts";import { serializeInto as internalSerialize, SerializeOptions,} from "./parser/serializer.ts";import { BSONRegExp } from "./regexp.ts";import { BSONSymbol } from "./symbol.ts";import { Timestamp } from "./timestamp.ts";import { UUID } from "./uuid.ts";import { bytesCopy } from "./parser/utils.ts";export * from "./constants.ts";export * as EJSON from "./extended_json.ts";export type { DBRefLike } from "./db_ref.ts";export { LongWithoutOverridesClass } from "./timestamp.ts";export type { LongWithoutOverrides } from "./timestamp.ts";export type { DeserializeOptions, SerializeOptions };export { Binary, BinarySizes, BSONRegExp, BSONSymbol, Code, DBRef, Decimal128, Double, Int32, Long, MaxKey, MinKey, ObjectId, Timestamp, UUID,};export * from "./error.ts";
export interface Document { [key: string]: any;}
const MAXSIZE = 1024 * 1024 * 17;
let buffer = new Uint8Array(MAXSIZE);
export function setInternalBufferSize(size: number): void { if (buffer.length < size) { buffer = new Uint8Array(size); }}
export function serialize( object: Document, options: SerializeOptions = {},): Uint8Array { const checkKeys = typeof options.checkKeys === "boolean" ? options.checkKeys : false; const serializeFunctions = typeof options.serializeFunctions === "boolean" ? options.serializeFunctions : false; const ignoreUndefined = typeof options.ignoreUndefined === "boolean" ? options.ignoreUndefined : true;
const serializationIndex = internalSerialize( buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, [], );
const finishedBuffer = new Uint8Array(serializationIndex);
bytesCopy(finishedBuffer, 0, buffer, 0, finishedBuffer.length);
return finishedBuffer;}
export function serializeWithBufferAndIndex( object: Document, finalBuffer: Uint8Array, options: SerializeOptions = {},): number { const checkKeys = typeof options.checkKeys === "boolean" ? options.checkKeys : false; const serializeFunctions = typeof options.serializeFunctions === "boolean" ? options.serializeFunctions : false; const ignoreUndefined = typeof options.ignoreUndefined === "boolean" ? options.ignoreUndefined : true; const startIndex = typeof options.index === "number" ? options.index : 0;
const serializationIndex = internalSerialize( buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, ); bytesCopy(finalBuffer, startIndex, buffer, 0, serializationIndex);
return startIndex + serializationIndex - 1;}
export function deserialize( buffer: Uint8Array | ArrayBuffer, options: DeserializeOptions = {},): Document { return internalDeserialize( buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), options, );}
export type CalculateObjectSizeOptions = Pick< SerializeOptions, "serializeFunctions" | "ignoreUndefined">;
export function calculateObjectSize( object: Document, options: CalculateObjectSizeOptions = {},): number { options = options || {};
const serializeFunctions = typeof options.serializeFunctions === "boolean" ? options.serializeFunctions : false; const ignoreUndefined = typeof options.ignoreUndefined === "boolean" ? options.ignoreUndefined : true;
return internalCalculateObjectSize( object, serializeFunctions, ignoreUndefined, );}
export function deserializeStream( data: Uint8Array | ArrayBufferView | ArrayBuffer, startIndex: number, numberOfDocuments: number, documents: Document[], docStartIndex: number, options?: DeserializeOptions,): number { const internalOptions = Object.assign( { allowObjectSmallerThanBufferSize: true, index: 0 }, options, ); const bufferData: Uint8Array = data instanceof Uint8Array ? data : data instanceof ArrayBuffer ? new Uint8Array(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
let index = startIndex; for (let i = 0; i < numberOfDocuments; i++) { const size = bufferData[index] | (bufferData[index + 1] << 8) | (bufferData[index + 2] << 16) | (bufferData[index + 3] << 24); internalOptions.index = index; documents[docStartIndex + i] = internalDeserialize( bufferData, internalOptions, ); index += size; }
return index;}