jsonbinpack
Version:
A space-efficient schema-driven binary JSON serialization format based on JSON Schema
226 lines (225 loc) • 9.24 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.URL_PROTOCOL_HOST_REST = exports.STRING_UNBOUNDED_SCOPED_PREFIX_LENGTH = exports.FLOOR_PREFIX_LENGTH_ENUM_VARINT = exports.SHARED_STRING_POINTER_RELATIVE_OFFSET = exports.UTF8_STRING_NO_LENGTH = exports.ROOF_PREFIX_LENGTH_ENUM_VARINT = exports.BOUNDED_PREFIX_LENGTH_8BIT_FIXED = exports.RFC3339_DATE_INTEGER_TRIPLET = exports.STRING_DICTIONARY_COMPRESSOR = exports.STRING_BROTLI = void 0;
var assert_1 = require("assert");
var zlib_1 = require("zlib");
var decode_1 = require("../integer/decode");
var limits_1 = require("../../utils/limits");
var types_1 = require("../any/types");
var STRING_ENCODING = 'utf8';
var readSharedString = function (buffer, offset, prefix, length, delta) {
var pointerOffset = offset + prefix.bytes + length.bytes;
var pointer = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, pointerOffset, {
minimum: 0,
multiplier: 1
});
var stringOffset = pointerOffset - pointer.value;
return {
value: buffer.toString(STRING_ENCODING, stringOffset, stringOffset + length.value + delta),
bytes: prefix.bytes + length.bytes + pointer.bytes
};
};
var STRING_BROTLI = function (buffer, offset, _options) {
var length = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, offset, {
minimum: 0,
multiplier: 1
});
var slice = buffer.slice(offset + length.bytes, offset + length.bytes + length.value);
return {
value: zlib_1.brotliDecompressSync(slice).toString(STRING_ENCODING),
bytes: length.bytes + length.value
};
};
exports.STRING_BROTLI = STRING_BROTLI;
var STRING_DICTIONARY_COMPRESSOR = function (buffer, offset, options) {
var length = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, offset, {
minimum: 0,
multiplier: 1
});
var cursor = offset + length.bytes;
var result = '';
while (Buffer.byteLength(result, STRING_ENCODING) < length.value) {
var prefix = result.length === 0 ? '' : ' ';
var markerResult = decode_1.ARBITRARY_MULTIPLE_ZIGZAG_VARINT(buffer, cursor, { multiplier: 1 });
cursor += markerResult.bytes;
if (markerResult.value > 0) {
var fragment = options.index[markerResult.value - 1];
assert_1.strict(typeof fragment === 'string');
result += prefix + fragment;
}
else if (markerResult.value < 0) {
var fragmentLength = -markerResult.value - 1;
assert_1.strict(fragmentLength >= 0);
var fragment = buffer.toString(STRING_ENCODING, cursor, cursor + fragmentLength);
result += prefix + fragment;
cursor += fragmentLength;
}
else {
var lengthMarker = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, cursor, {
minimum: 0,
multiplier: 1
});
var fragment = readSharedString(buffer, cursor - markerResult.bytes, markerResult, lengthMarker, 0);
result += prefix + fragment.value;
cursor += fragment.bytes - 1;
}
}
return {
value: result,
bytes: cursor - offset
};
};
exports.STRING_DICTIONARY_COMPRESSOR = STRING_DICTIONARY_COMPRESSOR;
var RFC3339_DATE_INTEGER_TRIPLET = function (buffer, offset, _options) {
var year = buffer.readUInt16LE(offset);
var month = buffer.readUInt8(offset + 2);
var day = buffer.readUInt8(offset + 3);
assert_1.strict(year <= 9999);
assert_1.strict(month >= 1 && month <= 12);
assert_1.strict(day >= 1 && day <= 31);
var yearString = String(year).padStart(4, '0');
var monthString = String(month).padStart(2, '0');
var dayString = String(day).padStart(2, '0');
return {
value: yearString + "-" + monthString + "-" + dayString,
bytes: 4
};
};
exports.RFC3339_DATE_INTEGER_TRIPLET = RFC3339_DATE_INTEGER_TRIPLET;
var BOUNDED_PREFIX_LENGTH_8BIT_FIXED = function (buffer, offset, options) {
assert_1.strict(options.minimum >= 0);
assert_1.strict(options.maximum >= options.minimum);
assert_1.strict(options.maximum - options.minimum <= limits_1.UINT8_MAX);
var prefix = decode_1.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED(buffer, offset, {
minimum: options.minimum,
maximum: options.maximum + 1,
multiplier: 1
});
if (prefix.value === types_1.Type.SharedString) {
var length_1 = decode_1.BOUNDED_MULTIPLE_8BITS_ENUM_FIXED(buffer, offset + prefix.bytes, {
minimum: options.minimum,
maximum: options.maximum + 1,
multiplier: 1
});
return readSharedString(buffer, offset, prefix, length_1, -1);
}
return {
value: buffer.toString(STRING_ENCODING, offset + prefix.bytes, offset + prefix.bytes + prefix.value - 1),
bytes: prefix.bytes + prefix.value - 1
};
};
exports.BOUNDED_PREFIX_LENGTH_8BIT_FIXED = BOUNDED_PREFIX_LENGTH_8BIT_FIXED;
var ROOF_PREFIX_LENGTH_ENUM_VARINT = function (buffer, offset, options) {
assert_1.strict(options.maximum >= 0);
var prefix = decode_1.ROOF_MULTIPLE_MIRROR_ENUM_VARINT(buffer, offset, {
maximum: options.maximum,
multiplier: 1
});
if (prefix.value === options.maximum) {
var length_2 = decode_1.ROOF_MULTIPLE_MIRROR_ENUM_VARINT(buffer, offset + prefix.bytes, {
maximum: options.maximum,
multiplier: 1
});
return readSharedString(buffer, offset, prefix, length_2, 1);
}
return {
value: buffer.toString(STRING_ENCODING, offset + prefix.bytes, offset + prefix.bytes + prefix.value + 1),
bytes: prefix.bytes + prefix.value + 1
};
};
exports.ROOF_PREFIX_LENGTH_ENUM_VARINT = ROOF_PREFIX_LENGTH_ENUM_VARINT;
var UTF8_STRING_NO_LENGTH = function (buffer, offset, options) {
assert_1.strict(options.size >= 0);
return {
value: buffer.toString(STRING_ENCODING, offset, offset + options.size),
bytes: options.size
};
};
exports.UTF8_STRING_NO_LENGTH = UTF8_STRING_NO_LENGTH;
var SHARED_STRING_POINTER_RELATIVE_OFFSET = function (buffer, offset, options) {
return readSharedString(buffer, offset, {
value: 0,
bytes: 0
}, {
value: options.size,
bytes: 0
}, 0);
};
exports.SHARED_STRING_POINTER_RELATIVE_OFFSET = SHARED_STRING_POINTER_RELATIVE_OFFSET;
var FLOOR_PREFIX_LENGTH_ENUM_VARINT = function (buffer, offset, options) {
assert_1.strict(options.minimum >= 0);
var prefix = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, offset, {
minimum: options.minimum,
multiplier: 1
});
if (prefix.value === options.minimum) {
var length_3 = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, offset + prefix.bytes, {
minimum: options.minimum,
multiplier: 1
});
return readSharedString(buffer, offset, prefix, length_3, -1);
}
var result = exports.UTF8_STRING_NO_LENGTH(buffer, offset + prefix.bytes, {
size: prefix.value - 1
});
return {
value: result.value,
bytes: result.bytes + prefix.bytes
};
};
exports.FLOOR_PREFIX_LENGTH_ENUM_VARINT = FLOOR_PREFIX_LENGTH_ENUM_VARINT;
var STRING_UNBOUNDED_SCOPED_PREFIX_LENGTH = function (buffer, offset, options) {
var prefix = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, offset, {
minimum: 0,
multiplier: 1
});
if (prefix.value === 0) {
var pointer = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, offset + prefix.bytes, {
minimum: 0,
multiplier: 1
});
var cursor = offset + prefix.bytes - pointer.value;
var length_4 = decode_1.FLOOR_MULTIPLE_ENUM_VARINT(buffer, cursor, {
minimum: 0,
multiplier: 1
});
if (length_4.value === 0) {
var result_1 = exports.STRING_UNBOUNDED_SCOPED_PREFIX_LENGTH(buffer, cursor, options);
return {
value: result_1.value,
bytes: prefix.bytes + pointer.bytes
};
}
var result_2 = exports.UTF8_STRING_NO_LENGTH(buffer, cursor + length_4.bytes, {
size: length_4.value - 1
});
return {
value: result_2.value,
bytes: prefix.bytes + pointer.bytes
};
}
var result = exports.UTF8_STRING_NO_LENGTH(buffer, offset + prefix.bytes, {
size: prefix.value - 1
});
return {
value: result.value,
bytes: result.bytes + prefix.bytes
};
};
exports.STRING_UNBOUNDED_SCOPED_PREFIX_LENGTH = STRING_UNBOUNDED_SCOPED_PREFIX_LENGTH;
var URL_PROTOCOL_HOST_REST = function (buffer, offset, _options) {
var protocol = exports.FLOOR_PREFIX_LENGTH_ENUM_VARINT(buffer, offset, {
minimum: 0
});
var host = exports.FLOOR_PREFIX_LENGTH_ENUM_VARINT(buffer, offset + protocol.bytes, {
minimum: 0
});
var rest = exports.FLOOR_PREFIX_LENGTH_ENUM_VARINT(buffer, offset + protocol.bytes + host.bytes, {
minimum: 0
});
return {
value: protocol.value + "://" + host.value + rest.value,
bytes: protocol.bytes + host.bytes + rest.bytes
};
};
exports.URL_PROTOCOL_HOST_REST = URL_PROTOCOL_HOST_REST;