Files
opencode/packages/schema/src/identifier.ts

31 lines
838 B
TypeScript

const length = 26
const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
let lastTimestamp = 0
let counter = 0
export function ascending() {
return create(false)
}
export function descending() {
return create(true)
}
export function create(descending: boolean, timestamp = Date.now()) {
if (timestamp !== lastTimestamp) {
lastTimestamp = timestamp
counter = 0
}
counter++
const current = BigInt(timestamp) * 0x1000n + BigInt(counter)
const value = descending ? ~current : current
const time = Array.from({ length: 6 }, (_, index) =>
Number((value >> BigInt(40 - 8 * index)) & 0xffn)
.toString(16)
.padStart(2, "0"),
).join("")
const bytes = crypto.getRandomValues(new Uint8Array(length - 12))
return time + Array.from(bytes, (byte) => chars[byte % 62]).join("")
}