You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
"use strict";
|
|
|
|
const createBitmaskArithmeticCoder = require("../../packages/arithmetic-coder-bitmask");
|
|
const bigintBuffer = require("../bigint/buffer");
|
|
|
|
module.exports = function createDateEncoder(withTimezone) {
|
|
// 8.25 bytes with timezone, 7 bytes without
|
|
// NOTE: Maximums are exclusive!
|
|
let baseFields = [
|
|
{ name: "millisecond", minimum: 0, maximum: 1000 },
|
|
{ name: "second", minimum: 0, maximum: 64 }, // No, this is not a typo; leap seconds are a thing
|
|
{ name: "minute", minimum: 0, maximum: 60 },
|
|
{ name: "hour", minimum: 0, maximum: 25 },
|
|
{ name: "day", minimum: 1, maximum: 32 },
|
|
{ name: "month", minimum: 1, maximum: 13 },
|
|
{ name: "year", minimum: -5000, maximum: 10000 },
|
|
];
|
|
|
|
let extraFields = (withTimezone === true)
|
|
? [{ name: "timezone", minimum: 0, maximum: 1000 }]
|
|
: [];
|
|
|
|
// FIXME: Pre-pad with zeroes for correct sortability
|
|
// FIXME: Add back the buffer conversion here
|
|
let coder = createBitmaskArithmeticCoder([
|
|
... extraFields,
|
|
... baseFields
|
|
]);
|
|
|
|
// TODO: Assert that bits is not higher than max safe integer?
|
|
let coderBytes = Math.ceil(Number(coder.bits) / 8);
|
|
|
|
return {
|
|
encode: function (data) {
|
|
// console.log({ coderBytes, coderBits: coder.bits });
|
|
// console.log(bigintBuffer.toBuffer(coder.encode(data)));
|
|
return {
|
|
value: bigintBuffer.toBuffer(coder.encode(data)),
|
|
auxiliaryBlob: undefined
|
|
};
|
|
},
|
|
decode: function (buffer, offset) {
|
|
let encoded = buffer.slice(offset, offset + coderBytes);
|
|
|
|
return {
|
|
bytesRead: coderBytes,
|
|
value: coder.decode(bigintBuffer.toBigint(encoded)),
|
|
auxiliaryBlob: undefined
|
|
};
|
|
}
|
|
};
|
|
};
|
|
|
|
// console.log(Number(module.exports(true).bits) / 8);
|
|
// console.log(Number(module.exports(false).bits) / 8);
|
|
|
|
// let coder = module.exports(true);
|
|
// let coder_ = module.exports(false);
|
|
|
|
// console.log(coder.encode({
|
|
// year: 9999,
|
|
// month: 11,
|
|
// day: 31,
|
|
// hour: 24,
|
|
// minute: 59,
|
|
// second: 60,
|
|
// millisecond: 999,
|
|
// timezone: 499
|
|
// }));
|
|
|
|
// let encoded = coder.encode({
|
|
// year: 9999,
|
|
// month: 11,
|
|
// day: 23
|
|
// });
|
|
|
|
// let buffer = bigintToBuffer(encoded);
|
|
// let bigintAgain = bufferToBigint(buffer);
|
|
|
|
// console.log(coder.decode(bigintAgain));
|
|
|
|
|
|
|
|
// let buffer = Buffer.from(encoded.toString(16), "hex");
|
|
|
|
// console.log(encoded);
|
|
// console.log(buffer);
|
|
|
|
// console.log(BigInt("0x" + buffer.toString("hex")));
|
|
|
|
// let decoded = coder.decode(encoded);
|
|
// let decodedFromBuffer = coder.decode(BigInt("0x" + buffer.toString("hex")));
|
|
|
|
// console.log(decoded);
|
|
// console.log(decodedFromBuffer);
|