| var r; |
| |
| module.exports = function rand(len) { |
| if (!r) |
| r = new Rand(null); |
| |
| return r.generate(len); |
| }; |
| |
| function Rand(rand) { |
| this.rand = rand; |
| } |
| module.exports.Rand = Rand; |
| |
| Rand.prototype.generate = function generate(len) { |
| return this._rand(len); |
| }; |
| |
| // Emulate crypto API using randy |
| Rand.prototype._rand = function _rand(n) { |
| if (this.rand.getBytes) |
| return this.rand.getBytes(n); |
| |
| var res = new Uint8Array(n); |
| for (var i = 0; i < res.length; i++) |
| res[i] = this.rand.getByte(); |
| return res; |
| }; |
| |
| if (typeof self === 'object') { |
| if (self.crypto && self.crypto.getRandomValues) { |
| // Modern browsers |
| Rand.prototype._rand = function _rand(n) { |
| var arr = new Uint8Array(n); |
| self.crypto.getRandomValues(arr); |
| return arr; |
| }; |
| } else if (self.msCrypto && self.msCrypto.getRandomValues) { |
| // IE |
| Rand.prototype._rand = function _rand(n) { |
| var arr = new Uint8Array(n); |
| self.msCrypto.getRandomValues(arr); |
| return arr; |
| }; |
| |
| // Safari's WebWorkers do not have `crypto` |
| } else if (typeof window === 'object') { |
| // Old junk |
| Rand.prototype._rand = function() { |
| throw new Error('Not implemented yet'); |
| }; |
| } |
| } else { |
| // Node.js or Web worker with no crypto support |
| try { |
| var crypto = require('crypto'); |
| if (typeof crypto.randomBytes !== 'function') |
| throw new Error('Not supported'); |
| |
| Rand.prototype._rand = function _rand(n) { |
| return crypto.randomBytes(n); |
| }; |
| } catch (e) { |
| } |
| } |