All files / src encode.ts

100% Statements 14/14
100% Branches 8/8
100% Functions 1/1
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62                                                      73x   73x   73x 73x 2x     73x 73x 2x     73x   73x   73x                   73x   73x   73x    
/* eslint-disable no-use-before-define */
import { BufferWriter, IBufferWriter } from '@xobj/buffer';
import { DetectMethod, DETECTORS } from './detectors/index';
import { EncodeMethod, ENCODERS, encodeValue } from './encoders/index';
import { encodeHeader } from './encoders/header';
import { FloatQuality, ValueType } from './types';
import { getReplacer, ReplacerMethod, ReplacerType } from './replacer';
 
export interface EncodeContext {
	readonly writer: IBufferWriter,
	readonly values: any[];
	readonly links: any[];
	readonly detectors: DetectMethod[];
	readonly encoders: Map<ValueType, EncodeMethod>,
	readonly floatQuality: FloatQuality;
	readonly replacer: ReplacerMethod;
}
 
export interface EncodeOptions {
	readonly bufferSize?: number;
	readonly customDetect?: DetectMethod;
	readonly customEncode?: EncodeMethod;
	readonly floatQuality?: FloatQuality;
	readonly replacer?: ReplacerType;
}
 
export function encode(value: any, options?: EncodeOptions): ArrayBuffer {
	const bufferSize = options?.bufferSize ?? 1024;
 
	const writer = new BufferWriter(bufferSize);
 
	const detectors = DETECTORS.slice();
	if (options?.customDetect) {
		detectors.unshift(options.customDetect);
	}
 
	const encoders = new Map(ENCODERS);
	if (options?.customEncode) {
		encoders.set(ValueType.CUSTOM, options?.customEncode);
	}
 
	const floatQuality = options?.floatQuality ?? 'double';
 
	const replacer = getReplacer(options?.replacer);
 
	const context: EncodeContext = {
		writer,
		values: [],
		links: [],
		detectors,
		encoders,
		floatQuality,
		replacer,
	};
 
	encodeHeader(context);
 
	encodeValue(value, context);
 
	return writer.buffer;
}