Added shortid for server and unique id's for remote

This commit is contained in:
Kasper Rynning-Tønnesen
2015-06-19 19:43:58 +02:00
parent 8b4cb5964d
commit 7e96a1d0dc
19 changed files with 740 additions and 7 deletions

98
server/node_modules/shortid/lib/alphabet.js generated vendored Normal file
View File

@@ -0,0 +1,98 @@
'use strict';
var randomFromSeed = require('./random/random-from-seed');
var ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';
var alphabet;
var previousSeed;
var shuffled;
function reset() {
shuffled = false;
}
function setCharacters(_alphabet_) {
if (!_alphabet_) {
if (alphabet !== ORIGINAL) {
alphabet = ORIGINAL;
reset();
}
return;
}
if (_alphabet_ === alphabet) {
return;
}
if (_alphabet_.length !== ORIGINAL.length) {
throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);
}
var unique = _alphabet_.split('').filter(function(item, ind, arr){
return ind !== arr.lastIndexOf(item);
});
if (unique.length) {
throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));
}
alphabet = _alphabet_;
reset();
}
function characters(_alphabet_) {
setCharacters(_alphabet_);
return alphabet;
}
function setSeed(seed) {
randomFromSeed.seed(seed);
if (previousSeed !== seed) {
reset();
previousSeed = seed;
}
}
function shuffle() {
if (!alphabet) {
setCharacters(ORIGINAL);
}
var sourceArray = alphabet.split('');
var targetArray = [];
var r = randomFromSeed.nextValue();
var characterIndex;
while (sourceArray.length > 0) {
r = randomFromSeed.nextValue();
characterIndex = Math.floor(r * sourceArray.length);
targetArray.push(sourceArray.splice(characterIndex, 1)[0]);
}
return targetArray.join('');
}
function getShuffled() {
if (shuffled) {
return shuffled;
}
shuffled = shuffle();
return shuffled;
}
/**
* lookup shuffled letter
* @param index
* @returns {string}
*/
function lookup(index) {
var alphabetShuffled = getShuffled();
return alphabetShuffled[index];
}
module.exports = {
characters: characters,
seed: setSeed,
lookup: lookup,
shuffled: getShuffled
};

17
server/node_modules/shortid/lib/decode.js generated vendored Normal file
View File

@@ -0,0 +1,17 @@
'use strict';
var alphabet = require('./alphabet');
/**
* Decode the id to get the version and worker
* Mainly for debugging and testing.
* @param id - the shortid-generated id.
*/
function decode(id) {
var characters = alphabet.shuffled();
return {
version: characters.indexOf(id.substr(0, 1)) & 0x0f,
worker: characters.indexOf(id.substr(1, 1)) & 0x0f
};
}
module.exports = decode;

19
server/node_modules/shortid/lib/encode.js generated vendored Normal file
View File

@@ -0,0 +1,19 @@
'use strict';
var randomByte = require('./random/random-byte');
function encode(lookup, number) {
var loopCounter = 0;
var done;
var str = '';
while (!done) {
str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );
done = number < (Math.pow(16, loopCounter + 1 ) );
loopCounter++;
}
return str;
}
module.exports = encode;

100
server/node_modules/shortid/lib/index.js generated vendored Normal file
View File

@@ -0,0 +1,100 @@
'use strict';
var alphabet = require('./alphabet');
var encode = require('./encode');
var decode = require('./decode');
var isValid = require('./is-valid');
// Ignore all milliseconds before a certain time to reduce the size of the date entropy without sacrificing uniqueness.
// This number should be updated every year or so to keep the generated id short.
// To regenerate `new Date() - 0` and bump the version. Always bump the version!
var REDUCE_TIME = 1426452414093;
// don't change unless we change the algos or REDUCE_TIME
// must be an integer and less than 16
var version = 5;
// if you are using cluster or multiple servers use this to make each instance
// has a unique value for worker
// Note: I don't know if this is automatically set when using third
// party cluster solutions such as pm2.
var clusterWorkerId = require('./util/cluster-worker-id') || 0;
// Counter is used when shortid is called multiple times in one second.
var counter;
// Remember the last time shortid was called in case counter is needed.
var previousSeconds;
/**
* Generate unique id
* Returns string id
*/
function generate() {
var str = '';
var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);
if (seconds === previousSeconds) {
counter++;
} else {
counter = 0;
previousSeconds = seconds;
}
str = str + encode(alphabet.lookup, version);
str = str + encode(alphabet.lookup, clusterWorkerId);
if (counter > 0) {
str = str + encode(alphabet.lookup, counter);
}
str = str + encode(alphabet.lookup, seconds);
return str;
}
/**
* Set the seed.
* Highly recommended if you don't want people to try to figure out your id schema.
* exposed as shortid.seed(int)
* @param seed Integer value to seed the random alphabet. ALWAYS USE THE SAME SEED or you might get overlaps.
*/
function seed(seedValue) {
alphabet.seed(seedValue);
return module.exports;
}
/**
* Set the cluster worker or machine id
* exposed as shortid.worker(int)
* @param workerId worker must be positive integer. Number less than 16 is recommended.
* returns shortid module so it can be chained.
*/
function worker(workerId) {
clusterWorkerId = workerId;
return module.exports;
}
/**
*
* sets new characters to use in the alphabet
* returns the shuffled alphabet
*/
function characters(newCharacters) {
if (newCharacters !== undefined) {
alphabet.characters(newCharacters);
}
return alphabet.shuffled();
}
// Export all other functions as properties of the generate function
module.exports = generate;
module.exports.generate = generate;
module.exports.seed = seed;
module.exports.worker = worker;
module.exports.characters = characters;
module.exports.decode = decode;
module.exports.isValid = isValid;

19
server/node_modules/shortid/lib/is-valid.js generated vendored Normal file
View File

@@ -0,0 +1,19 @@
'use strict';
var alphabet = require('./alphabet');
function isShortId(id) {
if (!id || typeof id !== 'string' || id.length < 6 ) {
return false;
}
var characters = alphabet.characters();
var invalidCharacters = id.split('').map(function(char){
if (characters.indexOf(char) === -1) {
return char;
}
}).join('').split('').join('');
return invalidCharacters.length === 0;
}
module.exports = isShortId;

View File

@@ -0,0 +1,14 @@
'use strict';
var crypto = window.crypto || window.msCrypto; // IE 11 uses window.msCrypto
function randomByte() {
if (!crypto || !crypto.getRandomValues) {
return Math.floor(Math.random() * 256) & 0x30;
}
var dest = new Uint8Array(1);
crypto.getRandomValues(dest);
return dest[0] & 0x30;
}
module.exports = randomByte;

10
server/node_modules/shortid/lib/random/random-byte.js generated vendored Normal file
View File

@@ -0,0 +1,10 @@
'use strict';
var crypto = require('crypto');
var randomBytes = crypto.randomBytes;
function randomByte() {
return randomBytes(1)[0] & 0x30;
}
module.exports = randomByte;

View File

@@ -0,0 +1,25 @@
'use strict';
// Found this seed-based random generator somewhere
// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)
var seed = 1;
/**
* return a random number based on a seed
* @param seed
* @returns {number}
*/
function getNextValue() {
seed = (seed * 9301 + 49297) % 233280;
return seed/(233280.0);
}
function setSeed(_seed_) {
seed = _seed_;
}
module.exports = {
nextValue: getNextValue,
seed: setSeed
};

View File

@@ -0,0 +1,3 @@
'use strict';
module.exports = 0;

View File

@@ -0,0 +1,3 @@
'use strict';
module.exports = parseInt(process.env.NODE_UNIQUE_ID || 0, 10);