Created
February 17, 2023 08:08
-
-
Save eser/ec3195e3e38e09f14e46717251e54ab0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// taken from https://deno.land/[email protected]/node/internal/crypto/_randomBytes.ts?source | |
// licensed under MIT License | |
const MAX_RANDOM_VALUES = 65536; | |
const MAX_SIZE = 4294967295; | |
function generateRandomBytes(size: number) { | |
if (size > MAX_SIZE) { | |
throw new RangeError( | |
`The value of "size" is out of range. It must be >= 0 && <= ${MAX_SIZE}. Received ${size}`, | |
); | |
} | |
const bytes = Buffer.allocUnsafe(size); | |
//Work around for getRandomValues max generation | |
if (size > MAX_RANDOM_VALUES) { | |
for (let generated = 0; generated < size; generated += MAX_RANDOM_VALUES) { | |
globalThis.crypto.getRandomValues( | |
bytes.slice(generated, generated + MAX_RANDOM_VALUES), | |
); | |
} | |
} else { | |
globalThis.crypto.getRandomValues(bytes); | |
} | |
return bytes; | |
} | |
/** | |
* @param size Buffer length, must be equal or greater than zero | |
*/ | |
default function randomBytes( | |
size: number, | |
cb?: (err: Error | null, buf?: Buffer) => void, | |
): Buffer | void { | |
if (typeof cb === "function") { | |
let err: Error | null = null, bytes: Buffer; | |
try { | |
bytes = generateRandomBytes(size); | |
} catch (e) { | |
//NodeJS nonsense | |
//If the size is out of range it will throw sync, otherwise throw async | |
if ( | |
e instanceof RangeError && | |
e.message.includes('The value of "size" is out of range') | |
) { | |
throw e; | |
} else if (e instanceof Error) { | |
err = e; | |
} else { | |
err = new Error("[non-error thrown]"); | |
} | |
} | |
setTimeout(() => { | |
if (err) { | |
cb(err); | |
} else { | |
cb(null, bytes); | |
} | |
}, 0); | |
} else { | |
return generateRandomBytes(size); | |
} | |
} | |
const createMongoObjectIdFromClient = () => { | |
const timestamp = Math.floor(Date.now() / 1000).toString(16); | |
const machineId = randomBytes(3).toString('hex'); | |
const processId = randomBytes(2).toString('hex'); | |
const counter = randomBytes(3).toString('hex'); | |
return `${timestamp}${machineId}${processId}${counter}`; | |
} | |
createMongoObjectIdFromClient(); //? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment