You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

100 lines
2.7 KiB

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