You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							65 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							65 lines
						
					
					
						
							1.5 KiB
						
					
					
				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) { | 
						|
  } | 
						|
}
 | 
						|
 |