UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.

202 lines (201 loc) 7.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._numToHex = _numToHex; exports._stringToNumbers = _stringToNumbers; exports._md5cycle = _md5cycle; exports._uuidTimestamp = _uuidTimestamp; exports._randomNode48 = _randomNode48; exports._bytesToRandomHex = _bytesToRandomHex; exports._clockSeq14 = _clockSeq14; exports._formatUUID = _formatUUID; exports._isOptionV3V5 = _isOptionV3V5; exports._checkUUIDVersion = _checkUUIDVersion; exports._constantTimeEquals = _constantTimeEquals; exports._splitByCharLength = _splitByCharLength; exports._padStartWith0 = _padStartWith0; const non_primitives_1 = require("../guards/non-primitives"); const primitives_1 = require("../guards/primitives"); const specials_1 = require("../guards/specials"); const utils_1 = require("./utils"); function _add32(x, y) { return (x + y) & 0xffffffff; } function _numToHex(n) { return [0, 8, 16, 24] .map((shift) => ((n >> shift) & 0xff).toString(16).padStart(2, '0')) .join(''); } function _stringToNumbers(s) { return Array.from({ length: 16 }, (_, i) => { const x = i << 2; return (s.charCodeAt(x) | (s.charCodeAt(x + 1) << 8) | (s.charCodeAt(x + 2) << 16) | (s.charCodeAt(x + 3) << 24)); }); } function _transform(q, a, b, x, s, t) { const a1 = _add32(_add32(a, q), _add32(x, t)); return _add32((a1 << s) | (a1 >>> (32 - s)), b); } const ff = (a, b, c, d, x, s, t) => { return _transform((b & c) | (~b & d), a, b, x, s, t); }; const gg = (a, b, c, d, x, s, t) => { return _transform((b & d) | (c & ~d), a, b, x, s, t); }; const hh = (a, b, c, d, x, s, t) => { return _transform(b ^ c ^ d, a, b, x, s, t); }; const ii = (a, b, c, d, x, s, t) => { return _transform(c ^ (b | ~d), a, b, x, s, t); }; function _md5cycle(x, k) { let a = x[0]; let b = x[1]; let c = x[2]; let d = x[3]; a = ff(a, b, c, d, k[0], 7, -680876936); d = ff(d, a, b, c, k[1], 12, -389564586); c = ff(c, d, a, b, k[2], 17, 606105819); b = ff(b, c, d, a, k[3], 22, -1044525330); a = ff(a, b, c, d, k[4], 7, -176418897); d = ff(d, a, b, c, k[5], 12, 1200080426); c = ff(c, d, a, b, k[6], 17, -1473231341); b = ff(b, c, d, a, k[7], 22, -45705983); a = ff(a, b, c, d, k[8], 7, 1770035416); d = ff(d, a, b, c, k[9], 12, -1958414417); c = ff(c, d, a, b, k[10], 17, -42063); b = ff(b, c, d, a, k[11], 22, -1990404162); a = ff(a, b, c, d, k[12], 7, 1804603682); d = ff(d, a, b, c, k[13], 12, -40341101); c = ff(c, d, a, b, k[14], 17, -1502002290); b = ff(b, c, d, a, k[15], 22, 1236535329); a = gg(a, b, c, d, k[1], 5, -165796510); d = gg(d, a, b, c, k[6], 9, -1069501632); c = gg(c, d, a, b, k[11], 14, 643717713); b = gg(b, c, d, a, k[0], 20, -373897302); a = gg(a, b, c, d, k[5], 5, -701558691); d = gg(d, a, b, c, k[10], 9, 38016083); c = gg(c, d, a, b, k[15], 14, -660478335); b = gg(b, c, d, a, k[4], 20, -405537848); a = gg(a, b, c, d, k[9], 5, 568446438); d = gg(d, a, b, c, k[14], 9, -1019803690); c = gg(c, d, a, b, k[3], 14, -187363961); b = gg(b, c, d, a, k[8], 20, 1163531501); a = gg(a, b, c, d, k[13], 5, -1444681467); d = gg(d, a, b, c, k[2], 9, -51403784); c = gg(c, d, a, b, k[7], 14, 1735328473); b = gg(b, c, d, a, k[12], 20, -1926607734); a = hh(a, b, c, d, k[5], 4, -378558); d = hh(d, a, b, c, k[8], 11, -2022574463); c = hh(c, d, a, b, k[11], 16, 1839030562); b = hh(b, c, d, a, k[14], 23, -35309556); a = hh(a, b, c, d, k[1], 4, -1530992060); d = hh(d, a, b, c, k[4], 11, 1272893353); c = hh(c, d, a, b, k[7], 16, -155497632); b = hh(b, c, d, a, k[10], 23, -1094730640); a = hh(a, b, c, d, k[13], 4, 681279174); d = hh(d, a, b, c, k[0], 11, -358537222); c = hh(c, d, a, b, k[3], 16, -722521979); b = hh(b, c, d, a, k[6], 23, 76029189); a = hh(a, b, c, d, k[9], 4, -640364487); d = hh(d, a, b, c, k[12], 11, -421815835); c = hh(c, d, a, b, k[15], 16, 530742520); b = hh(b, c, d, a, k[2], 23, -995338651); a = ii(a, b, c, d, k[0], 6, -198630844); d = ii(d, a, b, c, k[7], 10, 1126891415); c = ii(c, d, a, b, k[14], 15, -1416354905); b = ii(b, c, d, a, k[5], 21, -57434055); a = ii(a, b, c, d, k[12], 6, 1700485571); d = ii(d, a, b, c, k[3], 10, -1894986606); c = ii(c, d, a, b, k[10], 15, -1051523); b = ii(b, c, d, a, k[1], 21, -2054922799); a = ii(a, b, c, d, k[8], 6, 1873313359); d = ii(d, a, b, c, k[15], 10, -30611744); c = ii(c, d, a, b, k[6], 15, -1560198380); b = ii(b, c, d, a, k[13], 21, 1309151649); a = ii(a, b, c, d, k[4], 6, -145523070); d = ii(d, a, b, c, k[11], 10, -1120210379); c = ii(c, d, a, b, k[2], 15, 718787259); b = ii(b, c, d, a, k[9], 21, -343485551); x[0] = _add32(a, x[0]); x[1] = _add32(b, x[1]); x[2] = _add32(c, x[2]); x[3] = _add32(d, x[3]); } function _uuidTimestamp() { const UUID_EPOCH_DIFF = 12219292800000n; const unixMs = BigInt(Date.now()); const uuidMs = unixMs + UUID_EPOCH_DIFF; return uuidMs * 10000n; } function _randomNode48() { const node = (0, utils_1.randomHex)(12).split(''); const firstByte = parseInt(node.slice(0, 2).join(''), 16); const modified = (firstByte | 0b00000001).toString(16).padStart(2, '0'); return modified + node.slice(2).join(''); } function _bytesToRandomHex(bytes) { if (crypto?.getRandomValues) { crypto.getRandomValues(bytes); } else { for (let i = 0; i < bytes.length; i++) { bytes[i] = Math.floor(Math.random() * 256); } } let hex = ''; for (let i = 0; i < bytes.length; i++) { hex += bytes[i].toString(16).padStart(2, '0'); } return hex; } function _clockSeq14() { const seq = parseInt((0, utils_1.randomHex)(4), 16) & 0x3fff; return seq.toString(16).padStart(4, '0'); } function _formatUUID(h, v, up) { const part3 = String(v) + h.slice(13, 16); const part4 = _hexVariant(h.slice(16, 18)) + h.slice(18, 20); const formatted = [h.slice(0, 8), h.slice(8, 12), part3, part4, h.slice(20, 32)].join('-'); return (up ? formatted.toUpperCase() : formatted); } function _hexVariant(hex) { const v = parseInt(hex, 16); return ((v & 0x3f) | 0x80).toString(16).padStart(2, '0'); } function _isOptionV3V5(opt) { if ((0, non_primitives_1.isObjectWithKeys)(opt, ['name', 'namespace'])) { return (0, specials_1.isUUID)(opt?.namespace) && (0, primitives_1.isNonEmptyString)(opt?.name); } return false; } function _checkUUIDVersion(value, v) { return (0, specials_1.isUUID)(value) && value[14] === v; } function _constantTimeEquals(a, b) { if (a.length !== b.length) return false; const _getRes = (x, idx) => { return (0, primitives_1.isString)(x) ? x.charCodeAt(idx) : x[idx]; }; let res = 0; for (let i = 0; i < a.length; i++) { res |= _getRes(a, i) ^ _getRes(b, i); } return res === 0; } function _splitByCharLength(str, splitByChars = 2) { if (!(0, primitives_1.isNonEmptyString)(str)) return []; const sanitized = str.replace(/\s+/g, ''); const result = []; for (let i = 0; i < sanitized.length; i += splitByChars) { result.push(sanitized.slice(i, i + splitByChars)); } return result; } function _padStartWith0(byte, type) { return byte.toString(type === 'hex' ? 16 : 2).padStart(type === 'hex' ? 2 : 8, '0'); }