Skip to content

Commit

Permalink
fix: lazy load getRandomValues (#537)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
drewthaler authored Nov 21, 2020
1 parent f3bd455 commit 16c8f6d
Showing 1 changed file with 16 additions and 12 deletions.
28 changes: 16 additions & 12 deletions src/rng-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 16c8f6d

Please sign in to comment.