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

"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);