{"version":3,"sources":["meteor://💻app/packages/random/random.js"],"names":["Meteor","isServer","nodeCrypto","Npm","require","Alea","Mash","n","mash","data","toString","i","length","charCodeAt","h","version","args","s0","s1","s2","c","Date","random","t","uint32","fract53","Array","prototype","slice","call","arguments","UNMISTAKABLE_CHARS","BASE64_CHARS","RandomGenerator","type","options","self","Type","Error","ALEA","seeds","alea","apply","NODE_CRYPTO","BROWSER_CRYPTO","fraction","numerator","parseInt","hexString","array","Uint32Array","window","crypto","getRandomValues","digits","numBytes","Math","ceil","bytes","randomBytes","e","pseudoRandomBytes","result","substring","_randomString","charsCount","alphabet","choice","join","id","undefined","secret","arrayOrString","index","floor","substr","height","innerHeight","document","documentElement","clientHeight","body","width","innerWidth","clientWidth","agent","navigator","userAgent","createAleaGeneratorWithGeneratedSeed","Random","createWithSeeds","insecure"],"mappings":"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","file":"/packages/random.js","sourcesContent":["// We use cryptographically strong PRNGs (crypto.getRandomBytes() on the server,\n// window.crypto.getRandomValues() in the browser) when available. If these\n// PRNGs fail, we fall back to the Alea PRNG, which is not cryptographically\n// strong, and we seed it with various sources such as the date, Math.random,\n// and window size on the client. When using crypto.getRandomValues(), our\n// primitive is hexString(), from which we construct fraction(). When using\n// window.crypto.getRandomValues() or alea, the primitive is fraction and we use\n// that to construct hex string.\n\nif (Meteor.isServer)\n var nodeCrypto = Npm.require('crypto');\n\n// see http://baagoe.org/en/wiki/Better_random_numbers_for_javascript\n// for a full discussion and Alea implementation.\nvar Alea = function () {\n function Mash() {\n var n = 0xefc8249d;\n\n var mash = function(data) {\n data = data.toString();\n for (var i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n var h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n\n mash.version = 'Mash 0.9';\n return mash;\n }\n\n return (function (args) {\n var s0 = 0;\n var s1 = 0;\n var s2 = 0;\n var c = 1;\n\n if (args.length == 0) {\n args = [+new Date];\n }\n var mash = Mash();\n s0 = mash(' ');\n s1 = mash(' ');\n s2 = mash(' ');\n\n for (var i = 0; i < args.length; i++) {\n s0 -= mash(args[i]);\n if (s0 < 0) {\n s0 += 1;\n }\n s1 -= mash(args[i]);\n if (s1 < 0) {\n s1 += 1;\n }\n s2 -= mash(args[i]);\n if (s2 < 0) {\n s2 += 1;\n }\n }\n mash = null;\n\n var random = function() {\n var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32\n s0 = s1;\n s1 = s2;\n return s2 = t - (c = t | 0);\n };\n random.uint32 = function() {\n return random() * 0x100000000; // 2^32\n };\n random.fract53 = function() {\n return random() +\n (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n };\n random.version = 'Alea 0.9';\n random.args = args;\n return random;\n\n } (Array.prototype.slice.call(arguments)));\n};\n\nvar UNMISTAKABLE_CHARS = \"23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz\";\nvar BASE64_CHARS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\" +\n \"0123456789-_\";\n\n// `type` is one of `RandomGenerator.Type` as defined below.\n//\n// options:\n// - seeds: (required, only for RandomGenerator.Type.ALEA) an array\n// whose items will be `toString`ed and used as the seed to the Alea\n// algorithm\nvar RandomGenerator = function (type, options) {\n var self = this;\n self.type = type;\n\n if (!RandomGenerator.Type[type]) {\n throw new Error(\"Unknown random generator type: \" + type);\n }\n\n if (type === RandomGenerator.Type.ALEA) {\n if (!options.seeds) {\n throw new Error(\"No seeds were provided for Alea PRNG\");\n }\n self.alea = Alea.apply(null, options.seeds);\n }\n};\n\n// Types of PRNGs supported by the `RandomGenerator` class\nRandomGenerator.Type = {\n // Use Node's built-in `crypto.getRandomBytes` (cryptographically\n // secure but not seedable, runs only on the server). Reverts to\n // `crypto.getPseudoRandomBytes` in the extremely uncommon case that\n // there isn't enough entropy yet\n NODE_CRYPTO: \"NODE_CRYPTO\",\n\n // Use non-IE browser's built-in `window.crypto.getRandomValues`\n // (cryptographically secure but not seedable, runs only in the\n // browser).\n BROWSER_CRYPTO: \"BROWSER_CRYPTO\",\n\n // Use the *fast*, seedaable and not cryptographically secure\n // Alea algorithm\n ALEA: \"ALEA\",\n};\n\n/**\n * @name Random.fraction\n * @summary Return a number between 0 and 1, like `Math.random`.\n * @locus Anywhere\n */\nRandomGenerator.prototype.fraction = function () {\n var self = this;\n if (self.type === RandomGenerator.Type.ALEA) {\n return self.alea();\n } else if (self.type === RandomGenerator.Type.NODE_CRYPTO) {\n var numerator = parseInt(self.hexString(8), 16);\n return numerator * 2.3283064365386963e-10; // 2^-32\n } else if (self.type === RandomGenerator.Type.BROWSER_CRYPTO) {\n var array = new Uint32Array(1);\n window.crypto.getRandomValues(array);\n return array[0] * 2.3283064365386963e-10; // 2^-32\n } else {\n throw new Error('Unknown random generator type: ' + self.type);\n }\n};\n\n/**\n * @name Random.hexString\n * @summary Return a random string of `n` hexadecimal digits.\n * @locus Anywhere\n * @param {Number} n Length of the string\n */\nRandomGenerator.prototype.hexString = function (digits) {\n var self = this;\n if (self.type === RandomGenerator.Type.NODE_CRYPTO) {\n var numBytes = Math.ceil(digits / 2);\n var bytes;\n // Try to get cryptographically strong randomness. Fall back to\n // non-cryptographically strong if not available.\n try {\n bytes = nodeCrypto.randomBytes(numBytes);\n } catch (e) {\n // XXX should re-throw any error except insufficient entropy\n bytes = nodeCrypto.pseudoRandomBytes(numBytes);\n }\n var result = bytes.toString(\"hex\");\n // If the number of digits is odd, we'll have generated an extra 4 bits\n // of randomness, so we need to trim the last digit.\n return result.substring(0, digits);\n } else {\n return this._randomString(digits, \"0123456789abcdef\");\n }\n};\n\nRandomGenerator.prototype._randomString = function (charsCount,\n alphabet) {\n var self = this;\n var digits = [];\n for (var i = 0; i < charsCount; i++) {\n digits[i] = self.choice(alphabet);\n }\n return digits.join(\"\");\n};\n\n/**\n * @name Random.id\n * @summary Return a unique identifier, such as `\"Jjwjg6gouWLXhMGKW\"`, that is\n * likely to be unique in the whole world.\n * @locus Anywhere\n * @param {Number} [n] Optional length of the identifier in characters\n * (defaults to 17)\n */\nRandomGenerator.prototype.id = function (charsCount) {\n var self = this;\n // 17 characters is around 96 bits of entropy, which is the amount of\n // state in the Alea PRNG.\n if (charsCount === undefined)\n charsCount = 17;\n\n return self._randomString(charsCount, UNMISTAKABLE_CHARS);\n};\n\n/**\n * @name Random.secret\n * @summary Return a random string of printable characters with 6 bits of\n * entropy per character. Use `Random.secret` for security-critical secrets\n * that are intended for machine, rather than human, consumption.\n * @locus Anywhere\n * @param {Number} [n] Optional length of the secret string (defaults to 43\n * characters, or 256 bits of entropy)\n */\nRandomGenerator.prototype.secret = function (charsCount) {\n var self = this;\n // Default to 256 bits of entropy, or 43 characters at 6 bits per\n // character.\n if (charsCount === undefined)\n charsCount = 43;\n return self._randomString(charsCount, BASE64_CHARS);\n};\n\n/**\n * @name Random.choice\n * @summary Return a random element of the given array or string.\n * @locus Anywhere\n * @param {Array|String} arrayOrString Array or string to choose from\n */\nRandomGenerator.prototype.choice = function (arrayOrString) {\n var index = Math.floor(this.fraction() * arrayOrString.length);\n if (typeof arrayOrString === \"string\")\n return arrayOrString.substr(index, 1);\n else\n return arrayOrString[index];\n};\n\n// instantiate RNG. Heuristically collect entropy from various sources when a\n// cryptographic PRNG isn't available.\n\n// client sources\nvar height = (typeof window !== 'undefined' && window.innerHeight) ||\n (typeof document !== 'undefined'\n && document.documentElement\n && document.documentElement.clientHeight) ||\n (typeof document !== 'undefined'\n && document.body\n && document.body.clientHeight) ||\n 1;\n\nvar width = (typeof window !== 'undefined' && window.innerWidth) ||\n (typeof document !== 'undefined'\n && document.documentElement\n && document.documentElement.clientWidth) ||\n (typeof document !== 'undefined'\n && document.body\n && document.body.clientWidth) ||\n 1;\n\nvar agent = (typeof navigator !== 'undefined' && navigator.userAgent) || \"\";\n\nfunction createAleaGeneratorWithGeneratedSeed() {\n return new RandomGenerator(\n RandomGenerator.Type.ALEA,\n {seeds: [new Date, height, width, agent, Math.random()]});\n};\n\nif (Meteor.isServer) {\n Random = new RandomGenerator(RandomGenerator.Type.NODE_CRYPTO);\n} else {\n if (typeof window !== \"undefined\" && window.crypto &&\n window.crypto.getRandomValues) {\n Random = new RandomGenerator(RandomGenerator.Type.BROWSER_CRYPTO);\n } else {\n // On IE 10 and below, there's no browser crypto API\n // available. Fall back to Alea\n //\n // XXX looks like at the moment, we use Alea in IE 11 as well,\n // which has `window.msCrypto` instead of `window.crypto`.\n Random = createAleaGeneratorWithGeneratedSeed();\n }\n}\n\n// Create a non-cryptographically secure PRNG with a given seed (using\n// the Alea algorithm)\nRandom.createWithSeeds = function (...seeds) {\n if (seeds.length === 0) {\n throw new Error(\"No seeds were provided\");\n }\n return new RandomGenerator(RandomGenerator.Type.ALEA, {seeds: seeds});\n};\n\n// Used like `Random`, but much faster and not cryptographically\n// secure\nRandom.insecure = createAleaGeneratorWithGeneratedSeed();\n"]}