|
|
'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;
|