node-ejs-renderer/node_modules/@jsonjoy.com/json-pack/lib/json-binary/codec.js

129 lines
5.6 KiB
JavaScript
Raw Permalink Normal View History

2024-06-09 13:55:01 -04:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.stringify = exports.wrapBinary = exports.stringifyBinary = exports.parse = exports.unwrapBinary = void 0;
const msgpack_1 = require("../msgpack");
const fromBase64_1 = require("@jsonjoy.com/base64/lib/fromBase64");
const toBase64_1 = require("@jsonjoy.com/base64/lib/toBase64");
const isUint8Array_1 = require("@jsonjoy.com/util/lib/buffers/isUint8Array");
const constants_1 = require("./constants");
const binUriStartLength = constants_1.binUriStart.length;
const msgPackUriStartLength = constants_1.msgPackUriStart.length;
const msgPackExtStartLength = constants_1.msgPackExtStart.length;
const minDataUri = Math.min(binUriStartLength, msgPackUriStartLength);
const parseExtDataUri = (uri) => {
uri = uri.substring(msgPackExtStartLength);
const commaIndex = uri.indexOf(',');
if (commaIndex === -1)
throw new Error('INVALID_EXT_DATA_URI');
const typeString = uri.substring(0, commaIndex);
const buf = (0, fromBase64_1.fromBase64)(uri.substring(commaIndex + 1));
return new msgpack_1.JsonPackExtension(Number(typeString), buf);
};
const unwrapBinary = (value) => {
if (!value)
return value;
if (value instanceof Array) {
const len = value.length;
for (let i = 0; i < len; i++) {
const item = value[i];
switch (typeof item) {
case 'object': {
(0, exports.unwrapBinary)(item);
continue;
}
case 'string': {
if (item.length < minDataUri)
continue;
if (item.substring(0, binUriStartLength) === constants_1.binUriStart)
value[i] = (0, fromBase64_1.fromBase64)(item.substring(binUriStartLength));
else if (item.substring(0, msgPackUriStartLength) === constants_1.msgPackUriStart)
value[i] = new msgpack_1.JsonPackValue((0, fromBase64_1.fromBase64)(item.substring(msgPackUriStartLength)));
else if (item.substring(0, msgPackExtStartLength) === constants_1.msgPackExtStart)
value[i] = parseExtDataUri(item);
}
}
}
return value;
}
if (typeof value === 'object') {
for (const key in value) {
const item = value[key];
switch (typeof item) {
case 'object': {
(0, exports.unwrapBinary)(item);
continue;
}
case 'string': {
if (item.length < minDataUri)
continue;
if (item.substring(0, binUriStartLength) === constants_1.binUriStart) {
const buf = (0, fromBase64_1.fromBase64)(item.substring(binUriStartLength));
value[key] = buf;
}
else if (item.substring(0, msgPackUriStartLength) === constants_1.msgPackUriStart) {
value[key] = new msgpack_1.JsonPackValue((0, fromBase64_1.fromBase64)(item.substring(msgPackUriStartLength)));
}
else if (item.substring(0, msgPackExtStartLength) === constants_1.msgPackExtStart)
value[key] = parseExtDataUri(item);
}
}
}
return value;
}
if (typeof value === 'string') {
if (value.length < minDataUri)
return value;
if (value.substring(0, binUriStartLength) === constants_1.binUriStart)
return (0, fromBase64_1.fromBase64)(value.substring(binUriStartLength));
if (value.substring(0, msgPackUriStartLength) === constants_1.msgPackUriStart)
return new msgpack_1.JsonPackValue((0, fromBase64_1.fromBase64)(value.substring(msgPackUriStartLength)));
if (value.substring(0, msgPackExtStartLength) === constants_1.msgPackExtStart)
return parseExtDataUri(value);
else
return value;
}
return value;
};
exports.unwrapBinary = unwrapBinary;
const parse = (json) => {
const parsed = JSON.parse(json);
return (0, exports.unwrapBinary)(parsed);
};
exports.parse = parse;
const stringifyBinary = (value) => (constants_1.binUriStart + (0, toBase64_1.toBase64)(value));
exports.stringifyBinary = stringifyBinary;
const wrapBinary = (value) => {
if (!value)
return value;
if ((0, isUint8Array_1.isUint8Array)(value))
return (0, exports.stringifyBinary)(value);
if (value instanceof Array) {
const out = [];
const len = value.length;
for (let i = 0; i < len; i++) {
const item = value[i];
out.push(!item || typeof item !== 'object' ? item : (0, exports.wrapBinary)(item));
}
return out;
}
if (value instanceof msgpack_1.JsonPackValue)
return constants_1.msgPackUriStart + (0, toBase64_1.toBase64)(value.val);
if (value instanceof msgpack_1.JsonPackExtension)
return constants_1.msgPackExtStart + value.tag + ',' + (0, toBase64_1.toBase64)(value.val);
if (typeof value === 'object') {
const out = {};
for (const key in value) {
const item = value[key];
out[key] = !item || typeof item !== 'object' ? item : (0, exports.wrapBinary)(item);
}
return out;
}
return value;
};
exports.wrapBinary = wrapBinary;
const stringify = (value, replacer, space) => {
const wrapped = (0, exports.wrapBinary)(value);
return JSON.stringify(wrapped, replacer, space);
};
exports.stringify = stringify;
//# sourceMappingURL=codec.js.map