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