@deepkit/bson
Version:
Deepkit BSON parser
36 lines • 1.76 kB
JavaScript
import { executeTemplates, getTypeJitContainer, JitStack, NamingStrategy, resolveReceiveType, TemplateState } from '@deepkit/type';
import { CompilerContext, toFastProperties } from '@deepkit/core';
import { seekElementSize } from './continuation';
import { bsonBinarySerializer } from './bson-serializer';
import { ParserV2 } from './bson-parser';
function createBSONDeserializer(type, serializer, namingStrategy = new NamingStrategy(), path = '', jitStack = new JitStack()) {
const compiler = new CompilerContext();
compiler.context.set('seekElementSize', seekElementSize);
const state = new TemplateState('result', '', compiler, serializer.bsonDeserializeRegistry, namingStrategy, jitStack, [path]);
state.target = 'deserialize';
const code = `
let result;
state = state || {};
state.parser = data;
${executeTemplates(state, type)}
return result;
`;
return compiler.build(code, 'data', 'state');
}
export function getBSONDeserializer(serializer = bsonBinarySerializer, receiveType) {
const type = resolveReceiveType(receiveType);
const jit = getTypeJitContainer(type);
if (jit[serializer.deserializeId])
return jit[serializer.deserializeId];
const deserializer = createBSONDeserializer(type, bsonBinarySerializer);
jit[serializer.deserializeId] = function (bson, offset = 0) {
const parser = new ParserV2(bson, offset);
return deserializer(parser);
};
toFastProperties(jit);
return jit[serializer.deserializeId];
}
export function deserializeBSON(data, offset, serializer = bsonBinarySerializer, receiveType) {
return getBSONDeserializer(serializer, receiveType)(data, offset);
}
//# sourceMappingURL=bson-deserializer.js.map