Commit | Line | Data |
---|---|---|
343cfe4f JB |
1 | const crypto = require('crypto') |
2 | ||
3 | /** | |
4 | * Generate a cryptographically secure random number in the [0,1[ range | |
5 | * | |
6 | * @returns | |
7 | */ | |
8 | function secureRandom () { | |
9 | return crypto.randomBytes(4).readUInt32LE() / 0x100000000 | |
10 | } | |
11 | ||
99d76a65 JB |
12 | /** |
13 | * Generate a cryptographically secure random number in the [0,1[ range | |
14 | * | |
483585cc | 15 | * @returns |
99d76a65 JB |
16 | */ |
17 | function secureRandomWithRandomValues () { | |
18 | return crypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000 | |
19 | } | |
20 | ||
e9bfc28e JB |
21 | /** |
22 | * @param max | |
23 | * @param min | |
7fd91296 | 24 | * @returns |
e9bfc28e | 25 | */ |
f10b1da0 | 26 | function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { |
aa418e78 | 27 | if (max < min || max < 0 || min < 0) { |
343cfe4f JB |
28 | throw new RangeError('Invalid interval') |
29 | } | |
30 | max = Math.floor(max) | |
da504870 | 31 | if (min != null && min !== 0) { |
343cfe4f JB |
32 | min = Math.ceil(min) |
33 | return Math.floor(secureRandom() * (max - min + 1)) + min | |
ed2968f2 | 34 | } |
343cfe4f | 35 | return Math.floor(secureRandom() * (max + 1)) |
ed2968f2 JB |
36 | } |
37 | ||
aa418e78 JB |
38 | /** |
39 | * | |
40 | * @param max | |
41 | * @param min | |
aa418e78 JB |
42 | * @returns |
43 | */ | |
768c0780 JB |
44 | function generateRandomFloat (max = Number.MAX_VALUE, min = 0) { |
45 | if (max < min) { | |
46 | throw new RangeError('Invalid interval') | |
47 | } | |
48 | if (max - min === Infinity) { | |
aa418e78 JB |
49 | throw new RangeError('Invalid interval') |
50 | } | |
768c0780 | 51 | return (crypto.randomBytes(4).readUInt32LE() / 0xffffffff) * (max - min) + min |
aa418e78 JB |
52 | } |
53 | ||
ed40d2b0 JB |
54 | /** |
55 | * | |
56 | * @param size | |
57 | * @param max | |
feb629fe | 58 | * @param numberGenerator |
67bc7194 | 59 | * @returns |
ed40d2b0 | 60 | */ |
feb629fe JB |
61 | function generateRandomNumberArray ( |
62 | size, | |
63 | max = Number.MAX_VALUE, | |
64 | numberGenerator = generateRandomFloat | |
65 | ) { | |
66 | const array = [] | |
ed40d2b0 | 67 | for (let i = 0; i < size; i++) { |
feb629fe | 68 | array.push(numberGenerator(max)) |
ed40d2b0 | 69 | } |
feb629fe JB |
70 | return array |
71 | } | |
72 | ||
5b907dbf JB |
73 | /** |
74 | * | |
75 | * @param sizeMax | |
76 | * @param numberMax | |
77 | * @param numberGenerator | |
78 | * @returns | |
79 | */ | |
80 | function generateRandomObject ( | |
81 | sizeMax = 500, | |
82 | numberMax = Number.MAX_VALUE, | |
83 | numberGenerator = generateRandomFloat | |
84 | ) { | |
85 | const size = generateRandomInteger(sizeMax) | |
86 | const object = {} | |
87 | for (let i = 0; i < size; i++) { | |
88 | object[i.toString()] = numberGenerator(numberMax) | |
89 | } | |
8e1fbc06 | 90 | return object |
5b907dbf JB |
91 | } |
92 | ||
a9c78d5d JB |
93 | /** |
94 | * @param ms | |
7fd91296 | 95 | * @returns |
a9c78d5d JB |
96 | */ |
97 | async function sleep (ms) { | |
98 | return new Promise(resolve => setTimeout(resolve, ms)) | |
99 | } | |
100 | ||
ed40d2b0 JB |
101 | module.exports = { |
102 | generateRandomInteger, | |
feb629fe JB |
103 | generateRandomFloat, |
104 | generateRandomNumberArray, | |
5b907dbf | 105 | generateRandomObject, |
ed40d2b0 | 106 | sleep, |
99d76a65 JB |
107 | secureRandom, |
108 | secureRandomWithRandomValues | |
ed40d2b0 | 109 | } |