node-ejs-renderer/node_modules/@jsonjoy.com/json-pack/lib/cbor/CborEncoderFast.js

333 lines
9.1 KiB
JavaScript
Raw Permalink Normal View History

2024-06-09 13:55:01 -04:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CborEncoderFast = void 0;
const Writer_1 = require("@jsonjoy.com/util/lib/buffers/Writer");
const isSafeInteger = Number.isSafeInteger;
class CborEncoderFast {
constructor(writer = new Writer_1.Writer()) {
this.writer = writer;
}
encode(value) {
this.writeAny(value);
return this.writer.flush();
}
encodeToSlice(value) {
this.writeAny(value);
return this.writer.flushSlice();
}
writeAny(value) {
switch (typeof value) {
case 'number':
return this.writeNumber(value);
case 'string':
return this.writeStr(value);
case 'boolean':
return this.writer.u8(0xf4 + +value);
case 'object': {
if (!value)
return this.writer.u8(0xf6);
const constructor = value.constructor;
switch (constructor) {
case Array:
return this.writeArr(value);
default:
return this.writeObj(value);
}
}
}
}
writeCbor() {
this.writer.u8u16(0xd9, 0xd9f7);
}
writeEnd() {
this.writer.u8(255);
}
writeNull() {
this.writer.u8(0xf6);
}
writeBoolean(bool) {
if (bool)
this.writer.u8(0xf5);
else
this.writer.u8(0xf4);
}
writeNumber(num) {
if (isSafeInteger(num))
this.writeInteger(num);
else if (typeof num === 'bigint')
this.writeBigInt(num);
else
this.writeFloat(num);
}
writeBigInt(int) {
if (int >= 0)
this.writeBigUint(int);
else
this.writeBigSint(int);
}
writeBigUint(uint) {
if (uint <= Number.MAX_SAFE_INTEGER)
return this.writeUInteger(Number(uint));
this.writer.u8u64(0x1b, uint);
}
writeBigSint(int) {
if (int >= Number.MIN_SAFE_INTEGER)
return this.encodeNint(Number(int));
const uint = -BigInt(1) - int;
this.writer.u8u64(0x3b, uint);
}
writeInteger(int) {
if (int >= 0)
this.writeUInteger(int);
else
this.encodeNint(int);
}
writeUInteger(uint) {
const writer = this.writer;
writer.ensureCapacity(9);
const uint8 = writer.uint8;
let x = writer.x;
if (uint <= 23) {
uint8[x++] = 0 + uint;
}
else if (uint <= 0xff) {
uint8[x++] = 0x18;
uint8[x++] = uint;
}
else if (uint <= 0xffff) {
uint8[x++] = 0x19;
writer.view.setUint16(x, uint);
x += 2;
}
else if (uint <= 0xffffffff) {
uint8[x++] = 0x1a;
writer.view.setUint32(x, uint);
x += 4;
}
else {
uint8[x++] = 0x1b;
writer.view.setBigUint64(x, BigInt(uint));
x += 8;
}
writer.x = x;
}
encodeNumber(num) {
this.writeNumber(num);
}
encodeInteger(int) {
this.writeInteger(int);
}
encodeUint(uint) {
this.writeUInteger(uint);
}
encodeNint(int) {
const uint = -1 - int;
const writer = this.writer;
writer.ensureCapacity(9);
const uint8 = writer.uint8;
let x = writer.x;
if (uint < 24) {
uint8[x++] = 32 + uint;
}
else if (uint <= 0xff) {
uint8[x++] = 0x38;
uint8[x++] = uint;
}
else if (uint <= 0xffff) {
uint8[x++] = 0x39;
writer.view.setUint16(x, uint);
x += 2;
}
else if (uint <= 0xffffffff) {
uint8[x++] = 0x3a;
writer.view.setUint32(x, uint);
x += 4;
}
else {
uint8[x++] = 0x3b;
writer.view.setBigUint64(x, BigInt(uint));
x += 8;
}
writer.x = x;
}
writeFloat(float) {
this.writer.u8f64(0xfb, float);
}
writeBin(buf) {
const length = buf.length;
this.writeBinHdr(length);
this.writer.buf(buf, length);
}
writeBinHdr(length) {
const writer = this.writer;
if (length <= 23)
writer.u8(64 + length);
else if (length <= 0xff)
writer.u16((0x58 << 8) + length);
else if (length <= 0xffff)
writer.u8u16(0x59, length);
else if (length <= 0xffffffff)
writer.u8u32(0x5a, length);
else
writer.u8u64(0x5b, length);
}
writeStr(str) {
const writer = this.writer;
const length = str.length;
const maxSize = length * 4;
writer.ensureCapacity(5 + maxSize);
const uint8 = writer.uint8;
let lengthOffset = writer.x;
if (maxSize <= 23)
writer.x++;
else if (maxSize <= 0xff) {
uint8[writer.x++] = 0x78;
lengthOffset = writer.x;
writer.x++;
}
else if (maxSize <= 0xffff) {
uint8[writer.x++] = 0x79;
lengthOffset = writer.x;
writer.x += 2;
}
else {
uint8[writer.x++] = 0x7a;
lengthOffset = writer.x;
writer.x += 4;
}
const bytesWritten = writer.utf8(str);
if (maxSize <= 23)
uint8[lengthOffset] = 96 + bytesWritten;
else if (maxSize <= 0xff)
uint8[lengthOffset] = bytesWritten;
else if (maxSize <= 0xffff)
writer.view.setUint16(lengthOffset, bytesWritten);
else
writer.view.setUint32(lengthOffset, bytesWritten);
}
writeStrHdr(length) {
const writer = this.writer;
if (length <= 23)
writer.u8(96 + length);
else if (length <= 0xff)
writer.u16((0x78 << 8) + length);
else if (length <= 0xffff)
writer.u8u16(0x79, length);
else
writer.u8u32(0x7a, length);
}
writeAsciiStr(str) {
this.writeStrHdr(str.length);
this.writer.ascii(str);
}
writeArr(arr) {
const length = arr.length;
this.writeArrHdr(length);
for (let i = 0; i < length; i++)
this.writeAny(arr[i]);
}
writeArrHdr(length) {
const writer = this.writer;
if (length <= 23)
writer.u8(128 + length);
else if (length <= 0xff)
writer.u16((0x98 << 8) + length);
else if (length <= 0xffff)
writer.u8u16(0x99, length);
else if (length <= 0xffffffff)
writer.u8u32(0x9a, length);
else
writer.u8u64(0x9b, length);
}
writeObj(obj) {
const keys = Object.keys(obj);
const length = keys.length;
this.writeObjHdr(length);
for (let i = 0; i < length; i++) {
const key = keys[i];
this.writeStr(key);
this.writeAny(obj[key]);
}
}
writeObjHdr(length) {
const writer = this.writer;
if (length <= 23)
writer.u8(160 + length);
else if (length <= 0xff)
writer.u16((0xb8 << 8) + length);
else if (length <= 0xffff)
writer.u8u16(0xb9, length);
else if (length <= 0xffffffff)
writer.u8u32(0xba, length);
else
writer.u8u64(0xbb, length);
}
writeMapHdr(length) {
this.writeObjHdr(length);
}
writeStartMap() {
this.writer.u8(0xbf);
}
writeTag(tag, value) {
this.writeTagHdr(tag);
this.writeAny(value);
}
writeTagHdr(tag) {
const writer = this.writer;
if (tag <= 23)
writer.u8(192 + tag);
else if (tag <= 0xff)
writer.u16((0xd8 << 8) + tag);
else if (tag <= 0xffff)
writer.u8u16(0xd9, tag);
else if (tag <= 0xffffffff)
writer.u8u32(0xda, tag);
else
writer.u8u64(0xdb, tag);
}
writeTkn(value) {
const writer = this.writer;
if (value <= 23)
writer.u8(224 + value);
else if (value <= 0xff)
writer.u16((0xf8 << 8) + value);
}
writeStartStr() {
this.writer.u8(0x7f);
}
writeStrChunk(str) {
throw new Error('Not implemented');
}
writeEndStr() {
throw new Error('Not implemented');
}
writeStartBin() {
this.writer.u8(0x5f);
}
writeBinChunk(buf) {
throw new Error('Not implemented');
}
writeEndBin() {
throw new Error('Not implemented');
}
writeStartArr() {
this.writer.u8(0x9f);
}
writeArrChunk(item) {
throw new Error('Not implemented');
}
writeEndArr() {
this.writer.u8(255);
}
writeStartObj() {
this.writer.u8(0xbf);
}
writeObjChunk(key, value) {
throw new Error('Not implemented');
}
writeEndObj() {
this.writer.u8(255);
}
}
exports.CborEncoderFast = CborEncoderFast;
//# sourceMappingURL=CborEncoderFast.js.map