@noggin/elastic-noggin-sdk
Version:
Elastic Noggin SDK
128 lines (127 loc) • 4.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.hashSidStringify = exports.sidStringify = void 0;
const sortArrays = {
field: comparisonFunctionFactory("tip"),
i18n: comparisonFunctionFactory("lang"),
parent: undefined,
};
function comparisonFunctionFactory(key) {
return function (a, b) {
if (typeof a === "object" &&
typeof b === "object" &&
a[key] !== undefined &&
b[key] !== undefined) {
return a[key] < b[key] ? -1 : a[key] > b[key] ? 1 : 0;
}
return 0;
};
}
function RFCJSONEncode(obj) {
const json = JSON.stringify(obj);
return json.replace(/[\u007F-\uFFFF]/g, function (chr) {
return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4);
});
}
function sidStringify(obj) {
if (obj === undefined || obj === null) {
return "null";
}
if (obj instanceof Array) {
return "[" + obj.map(sidStringify) + "]";
}
if (typeof obj === "object") {
return ("{" +
Object.keys(obj)
.filter(function (key) {
return !(obj[key] === undefined ||
obj[key] === null ||
(typeof obj[key] === "object" && Object.keys(obj[key]).length === 0));
})
.sort()
.map(function (key) {
if (obj[key] instanceof Array && sortArrays.hasOwnProperty(key)) {
return (RFCJSONEncode(key) +
":[" +
obj[key]
.slice()
.sort(sortArrays[key])
.map(sidStringify) +
"]");
}
return RFCJSONEncode(key) + ":" + sidStringify(obj[key]);
}) +
"}");
}
return RFCJSONEncode(obj);
}
exports.sidStringify = sidStringify;
const hashChunkSize = 1024;
const hashUnicodeRegExp = /[\u007F-\uFFFF]/g;
const hashUnicodeReplacer = (chr) => {
return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4);
};
function hashRFCJSONEncode(sha256, obj) {
if (typeof obj === "string") {
const l = obj.length;
sha256.update('"');
for (let i = 0; i < l; i += hashChunkSize) {
sha256.update(JSON.stringify(obj.substring(i, i + hashChunkSize))
.slice(1, -1)
.replace(hashUnicodeRegExp, hashUnicodeReplacer));
}
sha256.update('"');
return sha256;
}
return sha256.update(JSON.stringify(obj));
}
function hashSidStringify(sha256, obj) {
if (obj === undefined || obj === null) {
return sha256.update("null");
}
if (obj instanceof Array) {
sha256.update("[");
obj.forEach((elem, i) => {
if (i > 0) {
sha256.update(",");
}
hashSidStringify(sha256, elem);
});
return sha256.update("]");
}
if (typeof obj === "object") {
sha256.update("{");
Object.keys(obj)
.filter((key) => {
return !(obj[key] === undefined ||
obj[key] === null ||
(typeof obj[key] === "object" && Object.keys(obj[key]).length === 0));
})
.sort()
.forEach((key, i) => {
if (i > 0) {
sha256.update(",");
}
if (obj[key] instanceof Array && sortArrays.hasOwnProperty(key)) {
hashRFCJSONEncode(sha256, key);
sha256.update(":[");
obj[key]
.slice()
.sort(sortArrays[key])
.forEach((elem, i) => {
if (i > 0) {
sha256.update(",");
}
hashSidStringify(sha256, elem);
});
return sha256.update("]");
}
hashRFCJSONEncode(sha256, key);
sha256.update(":");
hashSidStringify(sha256, obj[key]);
});
return sha256.update("}");
}
return hashRFCJSONEncode(sha256, obj);
}
exports.hashSidStringify = hashSidStringify;