-import crypto, { webcrypto } from 'crypto'
+import { getRandomValues, randomBytes, randomInt } from 'node:crypto'
/**
* Generate a cryptographically secure random number in the [0,1[ range
* @returns
*/
export function secureRandom () {
- return crypto.randomBytes(4).readUInt32LE() / 0x100000000
+ return randomBytes(4).readUInt32LE() / 0x100000000
}
/**
* @returns
*/
export function secureRandomWithRandomValues () {
- return webcrypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000
-}
-
-/**
- * @param max
- * @param min
- * @returns
- */
-export function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
- if (max < min || max < 0 || min < 0) {
- throw new RangeError('Invalid interval')
- }
- max = Math.floor(max)
- if (min != null && min !== 0) {
- min = Math.ceil(min)
- return Math.floor(secureRandom() * (max - min + 1)) + min
- }
- return Math.floor(secureRandom() * (max + 1))
+ return getRandomValues(new Uint32Array(1))[0] / 0x100000000
}
/**
if (max < min) {
throw new RangeError('Invalid interval')
}
- if (max - min === Infinity) {
+ if (max - min === Number.POSITIVE_INFINITY) {
throw new RangeError('Invalid interval')
}
- return (crypto.randomBytes(4).readUInt32LE() / 0xffffffff) * (max - min) + min
+ return (randomBytes(4).readUInt32LE() / 0xffffffff) * (max - min) + min
}
/**
numberMax = Number.MAX_VALUE,
numberGenerator = generateRandomFloat
) {
- const size = generateRandomInteger(sizeMax)
+ const size = randomInt(sizeMax)
const object = {}
for (let i = 0; i < size; i++) {
object[i.toString()] = numberGenerator(numberMax)
* @returns
*/
export async function sleep (ms) {
- return new Promise(resolve => setTimeout(resolve, ms))
+ return await new Promise(resolve => setTimeout(resolve, ms))
}