UNPKG

tiinyrpc

Version:

An small rpc server base on tinyrpc protocol

144 lines (143 loc) 6.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TrimId = void 0; /** * Author: JCloudYu * Create: 2020/06/28 **/ exports.TrimId = (() => { "use strict"; // See http://www.isthe.com/chongo/tech/comp/fnv/#FNV-param for the definition of these parameters; const FNV_PRIME_HIGH = 0x0100, FNV_PRIME_LOW = 0x0193; // 16777619 0x01000193 const OFFSET_BASIS = new Uint8Array([0xC5, 0x9D, 0x1C, 0x81]); // 2166136261 [0x81, 0x1C, 0x9D, 0xC5] const BASE32_MAP = "0123456789abcdefghijklmnopqrstuv".split(''); const ENV = { SEQ: Math.floor(Math.random() * 0xFFFFFFFF), PID: 0, PPID: 0, MACHINE_ID: new Uint8Array(0) }; if (typeof Buffer !== "undefined" && typeof process !== undefined) { ENV.MACHINE_ID = fnv1a32(UTF8Encode(require('os').hostname())); ENV.PID = process.pid; ENV.PPID = process.ppid; } else { let hostname = ''; if (typeof window !== undefined) { hostname = window.location.host; } else { const HOSTNAME_CANDIDATES = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZYZ_-"; let count = 30; while (count-- > 0) hostname += HOSTNAME_CANDIDATES[(Math.random() * HOSTNAME_CANDIDATES.length) | 0]; } ENV.MACHINE_ID = fnv1a32(UTF8Encode(hostname)); ENV.PID = (Math.random() * 65535) | 0; ENV.PPID = (Math.random() * 65535) | 0; } return function GenTrimId() { const time = Date.now(); const time_lower = time % 0xFFFFFFFF; const inc = (ENV.SEQ = (ENV.SEQ + 1) % 0xFFFFFFFF); const buff = new Uint8Array(14); const view = new DataView(buff.buffer); view.setUint32(0, time_lower, false); // [0-3] epoch time upper buff.set(ENV.MACHINE_ID, 4); // [4-7] machine id view.setUint16(8, ENV.PID, false); // [8-9] pid view.setUint32(10, inc, false); // [10-13] seq return Base32Encode(buff); }; function Base32Encode(bytes) { if (bytes.length < 1) return ''; // Run complete bundles let encoded = ''; let begin, loop = Math.floor(bytes.length / 5); for (let run = 0; run < loop; run++) { begin = run * 5; encoded += BASE32_MAP[bytes[begin] >> 3]; // 0 encoded += BASE32_MAP[(bytes[begin] & 0x07) << 2 | (bytes[begin + 1] >> 6)]; // 1 encoded += BASE32_MAP[(bytes[begin + 1] & 0x3E) >> 1]; // 2 encoded += BASE32_MAP[(bytes[begin + 1] & 0x01) << 4 | (bytes[begin + 2] >> 4)]; // 3 encoded += BASE32_MAP[(bytes[begin + 2] & 0x0F) << 1 | (bytes[begin + 3] >> 7)]; // 4 encoded += BASE32_MAP[(bytes[begin + 3] & 0x7C) >> 2]; // 5 encoded += BASE32_MAP[(bytes[begin + 3] & 0x03) << 3 | (bytes[begin + 4] >> 5)]; // 6 encoded += BASE32_MAP[bytes[begin + 4] & 0x1F]; // 7 } // Run remains let remain = bytes.length % 5; if (remain === 0) { return encoded; } begin = loop * 5; if (remain === 1) { encoded += BASE32_MAP[bytes[begin] >> 3]; // 0 encoded += BASE32_MAP[(bytes[begin] & 0x07) << 2]; // 1 } else if (remain === 2) { encoded += BASE32_MAP[bytes[begin] >> 3]; // 0 encoded += BASE32_MAP[(bytes[begin] & 0x07) << 2 | (bytes[begin + 1] >> 6)]; // 1 encoded += BASE32_MAP[(bytes[begin + 1] & 0x3E) >> 1]; // 2 encoded += BASE32_MAP[(bytes[begin + 1] & 0x01) << 4]; // 3 } else if (remain === 3) { encoded += BASE32_MAP[bytes[begin] >> 3]; // 0 encoded += BASE32_MAP[(bytes[begin] & 0x07) << 2 | (bytes[begin + 1] >> 6)]; // 1 encoded += BASE32_MAP[(bytes[begin + 1] & 0x3E) >> 1]; // 2 encoded += BASE32_MAP[(bytes[begin + 1] & 0x01) << 4 | (bytes[begin + 2] >> 4)]; // 3 encoded += BASE32_MAP[(bytes[begin + 2] & 0x0F) << 1]; // 4 } else if (remain === 4) { encoded += BASE32_MAP[bytes[begin] >> 3]; // 0 encoded += BASE32_MAP[(bytes[begin] & 0x07) << 2 | (bytes[begin + 1] >> 6)]; // 1 encoded += BASE32_MAP[(bytes[begin + 1] & 0x3E) >> 1]; // 2 encoded += BASE32_MAP[(bytes[begin + 1] & 0x01) << 4 | (bytes[begin + 2] >> 4)]; // 3 encoded += BASE32_MAP[(bytes[begin + 2] & 0x0F) << 1 | (bytes[begin + 3] >> 7)]; // 4 encoded += BASE32_MAP[(bytes[begin + 3] & 0x7C) >> 2]; // 5 encoded += BASE32_MAP[(bytes[begin + 3] & 0x03) << 3]; // 6 } return encoded; } function UTF8Encode(str) { if (typeof str !== "string") { throw new TypeError("Given input argument must be a js string!"); } let codePoints = []; let i = 0; while (i < str.length) { let codePoint = str.codePointAt(i); if (codePoint === undefined) throw new RangeError("Given string cannot be encoded into utf8!"); // 1-byte sequence if ((codePoint & 0xffffff80) === 0) { codePoints.push(codePoint); } // 2-byte sequence else if ((codePoint & 0xfffff800) === 0) { codePoints.push(0xc0 | (0x1f & (codePoint >> 6)), 0x80 | (0x3f & codePoint)); } // 3-byte sequence else if ((codePoint & 0xffff0000) === 0) { codePoints.push(0xe0 | (0x0f & (codePoint >> 12)), 0x80 | (0x3f & (codePoint >> 6)), 0x80 | (0x3f & codePoint)); } // 4-byte sequence else if ((codePoint & 0xffe00000) === 0) { codePoints.push(0xf0 | (0x07 & (codePoint >> 18)), 0x80 | (0x3f & (codePoint >> 12)), 0x80 | (0x3f & (codePoint >> 6)), 0x80 | (0x3f & codePoint)); } i += (codePoint > 0xFFFF) ? 2 : 1; } return new Uint8Array(codePoints); } function fnv1a32(octets) { const U8RESULT = OFFSET_BASIS.slice(0); const U32RESULT = new Uint32Array(U8RESULT.buffer); const RESULT_PROC = new Uint16Array(U8RESULT.buffer); for (let i = 0; i < octets.length; i += 1) { U32RESULT[0] = U32RESULT[0] ^ octets[i]; let hash_low = RESULT_PROC[0], hash_high = RESULT_PROC[1]; RESULT_PROC[0] = hash_low * FNV_PRIME_LOW; RESULT_PROC[1] = hash_low * FNV_PRIME_HIGH + hash_high * FNV_PRIME_LOW + (RESULT_PROC[0] >>> 16); } return U8RESULT; } })();