ai-uuid-v7
Version:
Library to generate uuidv7 with javascript
32 lines (29 loc) • 1.74 kB
JavaScript
;
var crypto = require('crypto');
exports.uuidv7 = void 0;
((uuidv72) => {
function generate() {
const value = new Uint8Array(16);
crypto.getRandomValues(value);
const timestamp = BigInt(Date.now());
value[0] = Number(timestamp >> 40n & 0xffn);
value[1] = Number(timestamp >> 32n & 0xffn);
value[2] = Number(timestamp >> 24n & 0xffn);
value[3] = Number(timestamp >> 16n & 0xffn);
value[4] = Number(timestamp >> 8n & 0xffn);
value[5] = Number(timestamp & 0xffn);
value[6] = value[6] & 15 | 112;
value[8] = value[8] & 63 | 128;
return `${value[0].toString(16).padStart(2, "0")}${value[1].toString(16).padStart(2, "0")}${value[2].toString(16).padStart(2, "0")}${value[3].toString(16).padStart(2, "0")}-${value[4].toString(16).padStart(2, "0")}${value[5].toString(16).padStart(2, "0")}-${value[6].toString(16).padStart(2, "0")}${value[7].toString(16).padStart(2, "0")}-${value[8].toString(16).padStart(2, "0")}${value[9].toString(16).padStart(2, "0")}-${value[10].toString(16).padStart(2, "0")}${value[11].toString(16).padStart(2, "0")}${value[12].toString(16).padStart(2, "0")}${value[13].toString(16).padStart(2, "0")}${value[14].toString(16).padStart(2, "0")}${value[15].toString(16).padStart(2, "0")}`;
}
uuidv72.generate = generate;
function getDate(uuid) {
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
if (!regex.test(uuid)) throw new Error("Invalid UUID, not v7");
const cleanUuid = uuid.replace(/-/g, "");
const timestampHex = cleanUuid.slice(0, 12);
const timestamp = parseInt(timestampHex, 16);
return new Date(timestamp);
}
uuidv72.getDate = getDate;
})(exports.uuidv7 || (exports.uuidv7 = {}));