333 lines
9.1 KiB
JavaScript
333 lines
9.1 KiB
JavaScript
|
"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
|