129 lines
5.6 KiB
JavaScript
129 lines
5.6 KiB
JavaScript
"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
|