mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.5 KiB
190 lines
5.5 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AvroEncoder = void 0;
|
|
class AvroEncoder {
|
|
constructor(writer) {
|
|
this.writer = writer;
|
|
}
|
|
encode(value) {
|
|
const writer = this.writer;
|
|
writer.reset();
|
|
this.writeAny(value);
|
|
return writer.flush();
|
|
}
|
|
writeUnknown(value) {
|
|
this.writeNull();
|
|
}
|
|
writeAny(value) {
|
|
switch (typeof value) {
|
|
case 'boolean':
|
|
return this.writeBoolean(value);
|
|
case 'number':
|
|
return this.writeNumber(value);
|
|
case 'string':
|
|
return this.writeStr(value);
|
|
case 'object': {
|
|
if (value === null)
|
|
return this.writeNull();
|
|
const constructor = value.constructor;
|
|
switch (constructor) {
|
|
case Object:
|
|
return this.writeObj(value);
|
|
case Array:
|
|
return this.writeArr(value);
|
|
case Uint8Array:
|
|
return this.writeBin(value);
|
|
default:
|
|
return this.writeUnknown(value);
|
|
}
|
|
}
|
|
case 'bigint':
|
|
return this.writeLong(value);
|
|
case 'undefined':
|
|
return this.writeNull();
|
|
default:
|
|
return this.writeUnknown(value);
|
|
}
|
|
}
|
|
writeNull() {
|
|
}
|
|
writeBoolean(bool) {
|
|
this.writer.u8(bool ? 1 : 0);
|
|
}
|
|
writeInt(int) {
|
|
this.writeVarIntSigned(this.encodeZigZag32(Math.trunc(int)));
|
|
}
|
|
writeLong(long) {
|
|
if (typeof long === 'bigint') {
|
|
this.writeVarLong(this.encodeZigZag64(long));
|
|
}
|
|
else {
|
|
this.writeVarLong(this.encodeZigZag64(BigInt(Math.trunc(long))));
|
|
}
|
|
}
|
|
writeFloatAvro(float) {
|
|
const writer = this.writer;
|
|
writer.ensureCapacity(4);
|
|
writer.view.setFloat32(writer.x, float, true);
|
|
writer.move(4);
|
|
}
|
|
writeDouble(double) {
|
|
const writer = this.writer;
|
|
writer.ensureCapacity(8);
|
|
writer.view.setFloat64(writer.x, double, true);
|
|
writer.move(8);
|
|
}
|
|
writeBin(bytes) {
|
|
this.writeVarIntUnsigned(bytes.length);
|
|
this.writer.buf(bytes, bytes.length);
|
|
}
|
|
writeStr(str) {
|
|
const writer = this.writer;
|
|
const maxSize = str.length * 4;
|
|
writer.ensureCapacity(5 + maxSize);
|
|
const lengthOffset = writer.x;
|
|
writer.x += 5;
|
|
const bytesWritten = writer.utf8(str);
|
|
const endPos = writer.x;
|
|
writer.x = lengthOffset;
|
|
this.writeVarIntUnsigned(bytesWritten);
|
|
const actualLengthSize = writer.x - lengthOffset;
|
|
if (actualLengthSize < 5) {
|
|
const stringStart = lengthOffset + 5;
|
|
const stringData = writer.uint8.slice(stringStart, endPos);
|
|
writer.x = lengthOffset + actualLengthSize;
|
|
writer.buf(stringData, stringData.length);
|
|
}
|
|
else {
|
|
writer.x = endPos;
|
|
}
|
|
}
|
|
writeArr(arr) {
|
|
this.writeVarIntUnsigned(arr.length);
|
|
const length = arr.length;
|
|
for (let i = 0; i < length; i++) {
|
|
this.writeAny(arr[i]);
|
|
}
|
|
this.writeVarIntUnsigned(0);
|
|
}
|
|
writeObj(obj) {
|
|
const entries = Object.entries(obj);
|
|
const length = entries.length;
|
|
this.writeVarIntUnsigned(length);
|
|
for (let i = 0; i < length; i++) {
|
|
const entry = entries[i];
|
|
this.writeStr(entry[0]);
|
|
this.writeAny(entry[1]);
|
|
}
|
|
this.writeVarIntUnsigned(0);
|
|
}
|
|
writeNumber(num) {
|
|
if (Number.isInteger(num)) {
|
|
if (num >= -2147483648 && num <= 2147483647) {
|
|
this.writeInt(num);
|
|
}
|
|
else {
|
|
this.writeLong(num);
|
|
}
|
|
}
|
|
else {
|
|
this.writeDouble(num);
|
|
}
|
|
}
|
|
writeInteger(int) {
|
|
this.writeInt(int);
|
|
}
|
|
writeUInteger(uint) {
|
|
this.writeInt(uint);
|
|
}
|
|
writeFloat(float) {
|
|
this.writeFloatValue(float);
|
|
}
|
|
writeFloatValue(float) {
|
|
const writer = this.writer;
|
|
writer.ensureCapacity(4);
|
|
writer.view.setFloat32(writer.x, float, true);
|
|
writer.move(4);
|
|
}
|
|
writeAsciiStr(str) {
|
|
const writer = this.writer;
|
|
this.writeVarIntUnsigned(str.length);
|
|
writer.ascii(str);
|
|
}
|
|
writeVarIntSigned(value) {
|
|
const writer = this.writer;
|
|
let n = value >>> 0;
|
|
while (n >= 0x80) {
|
|
writer.u8((n & 0x7f) | 0x80);
|
|
n >>>= 7;
|
|
}
|
|
writer.u8(n & 0x7f);
|
|
}
|
|
writeVarIntUnsigned(value) {
|
|
const writer = this.writer;
|
|
let n = value >>> 0;
|
|
while (n >= 0x80) {
|
|
writer.u8((n & 0x7f) | 0x80);
|
|
n >>>= 7;
|
|
}
|
|
writer.u8(n & 0x7f);
|
|
}
|
|
writeVarLong(value) {
|
|
const writer = this.writer;
|
|
let n = value;
|
|
const mask = BigInt(0x7f);
|
|
const shift = BigInt(7);
|
|
while (n >= BigInt(0x80)) {
|
|
writer.u8(Number((n & mask) | BigInt(0x80)));
|
|
n >>= shift;
|
|
}
|
|
writer.u8(Number(n & mask));
|
|
}
|
|
encodeZigZag32(value) {
|
|
return (value << 1) ^ (value >> 31);
|
|
}
|
|
encodeZigZag64(value) {
|
|
return (value << BigInt(1)) ^ (value >> BigInt(63));
|
|
}
|
|
}
|
|
exports.AvroEncoder = AvroEncoder;
|
|
//# sourceMappingURL=AvroEncoder.js.map
|