From 4284c8b5675def76af8b140e1073bf69840c9283 Mon Sep 17 00:00:00 2001 From: Louis Chatriot Date: Fri, 12 Jul 2013 16:59:55 +0200 Subject: [PATCH] Browser-specific customUtils module --- .gitignore | 2 + .../browser-specific/customUtils.js | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 browser-version/browser-specific/customUtils.js diff --git a/.gitignore b/.gitignore index f6d5264..8b3ab2f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ results npm-debug.log workspace node_modules + +browser-version/src diff --git a/browser-version/browser-specific/customUtils.js b/browser-version/browser-specific/customUtils.js new file mode 100644 index 0000000..e1dfeeb --- /dev/null +++ b/browser-version/browser-specific/customUtils.js @@ -0,0 +1,78 @@ +/** + * Specific customUtils for the browser, where we don't have access to the Crypto and Buffer modules + */ + +/** + * Taken from the crypto-browserify module + * https://github.com/dominictarr/crypto-browserify + * NOTE: Math.random() does not guarantee "cryptographic quality" but we actually don't need it + */ +function randomBytes (size) { + var bytes = new Array(size); + var r; + + for (var i = 0, r; i < size; i++) { + if ((i & 0x03) == 0) r = Math.random() * 0x100000000; + bytes[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return bytes; +} + + +/** + * Taken from the base64-js module + * https://github.com/beatgammit/base64-js/ + */ +function byteArrayToBase64 (uint8) { + var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + , extraBytes = uint8.length % 3 // if we have 1 byte left, pad 2 bytes + , output = "" + , temp, length, i; + + function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]; + }; + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); + output += tripletToBase64(temp); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1]; + output += lookup[temp >> 2]; + output += lookup[(temp << 4) & 0x3F]; + output += '=='; + break; + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]); + output += lookup[temp >> 10]; + output += lookup[(temp >> 4) & 0x3F]; + output += lookup[(temp << 2) & 0x3F]; + output += '='; + break; + } + + return output; +} + + +/** + * Return a random alphanumerical string of length len + * There is a very small probability (less than 1/1,000,000) for the length to be less than len + * (il the base64 conversion yields too many pluses and slashes) but + * that's not an issue here + * The probability of a collision is extremely small (need 3*10^12 documents to have one chance in a million of a collision) + * See http://en.wikipedia.org/wiki/Birthday_problem + */ +function uid (len) { + return byteArrayToBase64(randomBytes(Math.ceil(Math.max(8, len * 2)))).replace(/[+\/]/g, '').slice(0, len); +} + + + +module.exports.uid = uid;