mirror of https://github.com/MaxLeiter/Drift
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
export default function generateUUID() {
 | 
						|
	if (typeof crypto === "object") {
 | 
						|
		if (typeof crypto.randomUUID === "function") {
 | 
						|
			// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID
 | 
						|
			return crypto.randomUUID()
 | 
						|
		}
 | 
						|
		if (
 | 
						|
			typeof crypto.getRandomValues === "function" &&
 | 
						|
			typeof Uint8Array === "function"
 | 
						|
		) {
 | 
						|
			// https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid
 | 
						|
			const callback = (c: string) => {
 | 
						|
				const num = Number(c)
 | 
						|
				return (
 | 
						|
					num ^
 | 
						|
					(crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (num / 4)))
 | 
						|
				).toString(16)
 | 
						|
			}
 | 
						|
			return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, callback)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	let timestamp = new Date().getTime()
 | 
						|
	let perforNow =
 | 
						|
		(typeof performance !== "undefined" &&
 | 
						|
			performance.now &&
 | 
						|
			performance.now() * 1000) ||
 | 
						|
		0
 | 
						|
	return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
 | 
						|
		let random = Math.random() * 16
 | 
						|
		if (timestamp > 0) {
 | 
						|
			random = (timestamp + random) % 16 | 0
 | 
						|
			timestamp = Math.floor(timestamp / 16)
 | 
						|
		} else {
 | 
						|
			random = (perforNow + random) % 16 | 0
 | 
						|
			perforNow = Math.floor(perforNow / 16)
 | 
						|
		}
 | 
						|
		return (c === "x" ? random : (random & 0x3) | 0x8).toString(16)
 | 
						|
	})
 | 
						|
}
 |