diff --git a/src/rng-browser.js b/src/rng-browser.js index 1af1e4c9..38ed20ba 100644 --- a/src/rng-browser.js +++ b/src/rng-browser.js @@ -2,23 +2,27 @@ // require the crypto API and do not support built-in fallback to lower quality random number // generators (like Math.random()). -// getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, -// find the complete implementation of crypto (msCrypto) on IE11. -const getRandomValues = - (typeof crypto !== 'undefined' && - crypto.getRandomValues && - crypto.getRandomValues.bind(crypto)) || - (typeof msCrypto !== 'undefined' && - typeof msCrypto.getRandomValues === 'function' && - msCrypto.getRandomValues.bind(msCrypto)); +let getRandomValues; const rnds8 = new Uint8Array(16); export default function rng() { + // lazy load so that environments that need to polyfill have a chance to do so if (!getRandomValues) { - throw new Error( - 'crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported' - ); + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = + (typeof crypto !== 'undefined' && + crypto.getRandomValues && + crypto.getRandomValues.bind(crypto)) || + (typeof msCrypto !== 'undefined' && + typeof msCrypto.getRandomValues === 'function' && + msCrypto.getRandomValues.bind(msCrypto)); + if (!getRandomValues) { + throw new Error( + 'crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported' + ); + } } return getRandomValues(rnds8);