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