let canonicalBase32 = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; let canonicalBase32Rev = {}; for (let i = 0; i < canonicalBase32.length; ++i) { canonicalBase32Rev[canonicalBase32.charAt(i)] = i; } // Works on BigInt to support numbers larger than (1 << 31). function decodeCanonicalBase32(string) { let result = 0n; let cursor = 0b1n; for (let i = string.length - 1; i >= 0; --i) { result += cursor * BigInt(canonicalBase32Rev[string[i]]); cursor <<= 5n; } return result; } export function getTimestamp(ulid) { return new Date(Number(decodeCanonicalBase32(ulid.substring(0, 10)))); } export function isCanonicalUlid(id) { if (id.length != 26) { return false; } for (let i = 0; i < id.length; ++i) { if (!canonicalBase32.includes(id.charAt(i))) { return false; } } return true; }