@deepkit/bson
Version:
Deepkit BSON parser
92 lines • 3.09 kB
JavaScript
;
/*
* Deepkit Framework
* Copyright (C) 2021 Deepkit UG, Marc J. Schmidt
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the MIT License.
*
* You should have received a copy of the MIT License along with this program.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.findValueInObject = exports.seekElementSize = void 0;
const utils_1 = require("./utils");
const model_1 = require("./model");
function seekElementSize(elementType, parser) {
switch (elementType) {
case utils_1.BSON_DATA_STRING: {
return parser.seek(parser.eatUInt32());
}
case utils_1.BSON_DATA_OID: {
return parser.seek(12);
}
case utils_1.BSON_DATA_INT: {
return parser.seek(4);
}
case utils_1.BSON_DATA_NUMBER: {
return parser.seek(8);
}
case utils_1.BSON_DATA_DATE: {
return parser.seek(8);
}
case utils_1.BSON_DATA_BOOLEAN: {
return parser.seek(1);
}
case utils_1.BSON_DATA_OBJECT: {
return parser.seek(parser.peekUInt32());
}
case utils_1.BSON_DATA_ARRAY: {
return parser.seek(parser.peekUInt32());
}
case utils_1.BSON_DATA_NULL: {
return;
}
case utils_1.BSON_DATA_LONG:
case utils_1.BSON_DATA_TIMESTAMP: {
return parser.seek(8);
}
case utils_1.BSON_DATA_UNDEFINED:
return;
case utils_1.BSON_DATA_BINARY:
let size = parser.eatUInt32();
const subType = parser.eatByte();
if (subType === utils_1.BSON_BINARY_SUBTYPE_BYTE_ARRAY) {
size = parser.eatUInt32();
}
return parser.seek(size);
case utils_1.BSON_DATA_DECIMAL128:
case utils_1.BSON_DATA_REGEXP:
case utils_1.BSON_DATA_SYMBOL:
case utils_1.BSON_DATA_MIN_KEY:
case utils_1.BSON_DATA_MAX_KEY:
case utils_1.BSON_DATA_CODE:
case utils_1.BSON_DATA_CODE_W_SCOPE:
case utils_1.BSON_DATA_DBPOINTER:
throw new model_1.BSONError('Unsupported BSON type ' + elementType);
default:
throw new model_1.BSONError('Unknown BSON type ' + elementType);
}
}
exports.seekElementSize = seekElementSize;
function findValueInObject(parser, checker) {
const offset = parser.offset;
const end = parser.eatUInt32() + parser.offset;
while (parser.offset < end) {
const elementType = parser.eatByte();
if (elementType === 0)
break;
const name = parser.eatObjectPropertyName();
if (checker(elementType, name)) {
const v = parser.parse(elementType);
parser.offset = offset;
return v;
}
else {
seekElementSize(elementType, parser);
}
}
parser.offset = offset;
return undefined;
}
exports.findValueInObject = findValueInObject;
//# sourceMappingURL=continuation.js.map