From 16c8f6df2f6b09b4d6235602d6a591188320a82e Mon Sep 17 00:00:00 2001 From: Drew Thaler Date: Sat, 21 Nov 2020 04:38:48 -0800 Subject: [PATCH] fix: lazy load getRandomValues (#537) Without this change, React Native projects must manage an implicit dependency on `react-native-get-random-values`, and try to ensure that it gets loaded before `uuid` does. With this change, the React Native polyfill simply needs to be installed sometime before the first uuid is created. Fixes #536 --- src/rng-browser.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) 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);