UNPKG

@noggin/elastic-noggin-sdk

Version:
128 lines (127 loc) 4.25 kB
"use strict"; 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;