29 lines
709 B
JavaScript
29 lines
709 B
JavaScript
|
/* eslint-env browser */
|
||
|
const perf = typeof performance === 'undefined' ? null : performance
|
||
|
|
||
|
const isoCrypto = typeof crypto === 'undefined' ? null : crypto
|
||
|
|
||
|
/**
|
||
|
* @type {function(number):ArrayBuffer}
|
||
|
*/
|
||
|
const cryptoRandomBuffer = isoCrypto !== null
|
||
|
? len => {
|
||
|
// browser
|
||
|
const buf = new ArrayBuffer(len)
|
||
|
const arr = new Uint8Array(buf)
|
||
|
isoCrypto.getRandomValues(arr)
|
||
|
return buf
|
||
|
}
|
||
|
: len => {
|
||
|
// polyfill
|
||
|
const buf = new ArrayBuffer(len)
|
||
|
const arr = new Uint8Array(buf)
|
||
|
for (let i = 0; i < len; i++) {
|
||
|
arr[i] = Math.ceil((Math.random() * 0xFFFFFFFF) >>> 0)
|
||
|
}
|
||
|
return buf
|
||
|
}
|
||
|
|
||
|
exports.performance = perf
|
||
|
exports.cryptoRandomBuffer = cryptoRandomBuffer
|