Merge branch 'renovate/all-minor-patch' into 'main'
[ProtonMail-WebClient.git] / packages / testing / lib / mockRandomValues.ts
blob0e6b1dae249275757d4deee72791d735b5bcfff4
1 type TypedArray =
2     | Int8Array
3     | Uint8Array
4     | Uint8ClampedArray
5     | Int16Array
6     | Uint16Array
7     | Int32Array
8     | Uint32Array
9     | Float32Array
10     | Float64Array;
11 let original: undefined | typeof crypto.getRandomValues;
13 /**
14  * Mock crypto.getRandomValues using the mocked implementation (if given). Otherwise,
15  * a deterministic function will fill the buffer with consecutive values from 0 up to 254.
16  */
17 export const initRandomMock = <T extends TypedArray>(mockedImplementation?: (buf: T) => T) => {
18     if (!original) {
19         original = crypto.getRandomValues;
20     }
22     if (mockedImplementation) {
23         // @ts-ignore DataView not supported
24         crypto.getRandomValues = mockedImplementation;
25     } else {
26         const staticMockRandomValues = (buf: TypedArray) => {
27             for (let i = 0; i < Math.min(buf.length, 255); ++i) {
28                 // values wrap around automatically based on the provided typed array
29                 buf[i] = i;
30             }
31             return buf;
32         };
33         // @ts-ignore DataView not supported
34         crypto.getRandomValues = staticMockRandomValues;
35     }
38 export const disableRandomMock = () => {
39     if (!original) {
40         throw new Error('mock was not initialized');
41     }
42     crypto.getRandomValues = original;
43     original = undefined;