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