UNPKG

@jsonjoy.com/json-pack

Version:

High-performance JSON serialization library

257 lines 7.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonEncoder = void 0; const toBase64Bin_1 = require("@jsonjoy.com/base64/lib/toBase64Bin"); class JsonEncoder { 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: if (value instanceof Uint8Array) return this.writeBin(value); if (Array.isArray(value)) return this.writeArr(value); return this.writeUnknown(value); } } case 'undefined': { return this.writeUndef(); } default: return this.writeUnknown(value); } } writeNull() { this.writer.u32(0x6e756c6c); } writeUndef() { const writer = this.writer; const length = 35; writer.ensureCapacity(length); const view = writer.view; let x = writer.x; view.setUint32(x, 577003892); x += 4; view.setUint32(x, 1631215984); x += 4; view.setUint32(x, 1886153059); x += 4; view.setUint32(x, 1635019119); x += 4; view.setUint32(x, 1848599394); x += 4; view.setUint32(x, 1869753442); x += 4; view.setUint32(x, 1634952502); x += 4; view.setUint32(x, 876296567); x += 4; view.setUint16(x, 15677); x += 2; writer.uint8[x++] = 0x22; writer.x = x; } writeBoolean(bool) { if (bool) this.writer.u32(0x74727565); else this.writer.u8u32(0x66, 0x616c7365); } writeNumber(num) { const str = num.toString(); this.writer.ascii(str); } writeInteger(int) { this.writeNumber(int >> 0 === int ? int : Math.trunc(int)); } writeUInteger(uint) { this.writeInteger(uint < 0 ? -uint : uint); } writeFloat(float) { this.writeNumber(float); } writeBin(buf) { const writer = this.writer; const length = buf.length; writer.ensureCapacity(38 + 3 + (length << 1)); const view = writer.view; let x = writer.x; view.setUint32(x, 577003892); x += 4; view.setUint32(x, 1631215984); x += 4; view.setUint32(x, 1886153059); x += 4; view.setUint32(x, 1635019119); x += 4; view.setUint32(x, 1848602467); x += 4; view.setUint32(x, 1952805933); x += 4; view.setUint32(x, 1937011301); x += 4; view.setUint32(x, 1634548578); x += 4; view.setUint32(x, 1634952502); x += 4; view.setUint16(x, 13356); x += 2; x = (0, toBase64Bin_1.toBase64Bin)(buf, 0, length, view, x); writer.uint8[x++] = 0x22; writer.x = x; } writeStr(str) { const writer = this.writer; const length = str.length; writer.ensureCapacity(length * 4 + 2); if (length < 256) { let x = writer.x; const uint8 = writer.uint8; uint8[x++] = 0x22; for (let i = 0; i < length; i++) { const code = str.charCodeAt(i); switch (code) { case 34: case 92: uint8[x++] = 0x5c; break; } if (code < 32 || code > 126) { writer.utf8(JSON.stringify(str)); return; } else uint8[x++] = code; } uint8[x++] = 0x22; writer.x = x; return; } writer.utf8(JSON.stringify(str)); } writeAsciiStr(str) { const length = str.length; const writer = this.writer; writer.ensureCapacity(length * 2 + 2); const uint8 = writer.uint8; let x = writer.x; uint8[x++] = 0x22; for (let i = 0; i < length; i++) { const code = str.charCodeAt(i); switch (code) { case 34: case 92: uint8[x++] = 0x5c; break; } uint8[x++] = code; } uint8[x++] = 0x22; writer.x = x; } writeArr(arr) { const writer = this.writer; writer.u8(0x5b); const length = arr.length; const last = length - 1; for (let i = 0; i < last; i++) { this.writeAny(arr[i]); writer.u8(0x2c); } if (last >= 0) this.writeAny(arr[last]); writer.u8(0x5d); } writeArrSeparator() { this.writer.u8(0x2c); } writeObj(obj) { const writer = this.writer; const keys = Object.keys(obj); const length = keys.length; if (!length) return writer.u16(0x7b7d); writer.u8(0x7b); for (let i = 0; i < length; i++) { const key = keys[i]; const value = obj[key]; this.writeStr(key); writer.u8(0x3a); this.writeAny(value); writer.u8(0x2c); } writer.uint8[writer.x - 1] = 0x7d; } writeObjSeparator() { this.writer.u8(0x2c); } writeObjKeySeparator() { this.writer.u8(0x3a); } writeStartStr() { throw new Error('Method not implemented.'); } writeStrChunk(str) { throw new Error('Method not implemented.'); } writeEndStr() { throw new Error('Method not implemented.'); } writeStartBin() { throw new Error('Method not implemented.'); } writeBinChunk(buf) { throw new Error('Method not implemented.'); } writeEndBin() { throw new Error('Method not implemented.'); } writeStartArr() { this.writer.u8(0x5b); } writeArrChunk(item) { throw new Error('Method not implemented.'); } writeEndArr() { this.writer.u8(0x5d); } writeStartObj() { this.writer.u8(0x7b); } writeObjChunk(key, value) { throw new Error('Method not implemented.'); } writeEndObj() { this.writer.u8(0x7d); } } exports.JsonEncoder = JsonEncoder; //# sourceMappingURL=JsonEncoder.js.map