Como corrigir / shim crypto.getRandomValues for React Native

Estou portando alguns pacotes criados para o NodeJS reagir ao Native usandoReactNativify reescrever dependências de objetos da API do Nó para seus equivalentes no navegador.

Um deles écrypto. Notransformer.js (ou.babelrc) Eu tenho:

// The following plugin will rewrite imports. Reimplementations of node
// libraries such as `assert`, `buffer`, etc. will be picked up
// automatically by the React Native packager.  All other built-in node
// libraries get rewritten to their browserify counterpart.

[require('babel-plugin-rewrite-require'), {
  aliases: {
    crypto: 'crypto-browserify',
    // ...
  },
  throwForNonStringLiteral: true,
}],

Em ReactNativifyglobal.js existe este código (que eu excluí, porque não se destina à produção):

// Don't do this in production. You're going to want to patch in
// https://github.com/mvayngrib/react-native-randombytes or similar.
global.crypto = {
  getRandomValues(byteArray) {
    for (let i = 0; i < byteArray.length; i++) {
      byteArray[i] = Math.floor(256 * Math.random());
    }
  },
};

.

Minha primeira pergunta: Como égetRandomValues corrigido corretamente para produção?

Existe uma segunda opção, que está usandoreact-native-crypto (um clone decrypto-browserify)

Idealmente, eu deveria ser capaz de fazer isso emtransformer.js:

  aliases: {
    crypto: 'react-native-crypto', // instead of 'crypto-browserify'
    // ...
  },

Masreact-native-crypto usarn-nodeify em vez de ReactNativify, que gera umshim.js para ser importado emindex.android.js / index.ios.js com código semelhante a este:

if (require('./package.json').dependencies['react-native-crypto']) {
    const algos = require('browserify-sign/algos')
    if (!algos.sha256) {
        algos.sha256 = {
        "sign": "ecdsa",
        "hash": "sha256",
        "id": new Buffer("")
        }
    }

    if (typeof window === 'object') {
        const wCrypto = window.crypto = window.crypto || {}
        wCrypto.getRandomValues = wCrypto.getRandomValues || getRandomValues
    }

    const crypto = require('crypto')
    const randomBytes = crypto.randomBytes
    crypto.randomBytes = function (size, cb) {
        if (cb) return randomBytes.apply(crypto, arguments)

        const arr = new Buffer(size)
        getRandomValues(arr)
        return arr
    }

    crypto.getRandomValues = crypto.getRandomValues || getRandomValues

    function getRandomValues (arr) {
        // console.warn('WARNING: generating insecure psuedorandom number')
        for (var i = 0; i < arr.length; i++) {
        arr[i] = Math.random() * 256 | 0
        }

        return arr
    }
}

Não sei se todo esse código de calço é necessário ao usar o ReactNativify e não conseguiu encontrar boas fontes, então ...

Minha segunda pergunta: Como usarreact-native-crypto da 'maneira adequada de ReactNativify'?

Eu criei problemas no github no ReactNativify e nos repositórios react-native-crypto:

Como usar o getRandomValues na produção?Usando ReactNativify em vez de rn-nodeify?

Versões:

node               7.10.1       /usr/local/bin/node  
npm                4.2.0        /usr/local/bin/npm   
yarn               0.24.6       /usr/bin/yarn        
react-native-cli   2.0.1       
app rn version     0.45.1      
ignite             2.0.0        /usr/local/bin/ignite

questionAnswers(0)

yourAnswerToTheQuestion