snowflake-id
Version:
Time based 64-bit unique id generator, inspired by Twitter snowflakes
73 lines (54 loc) • 1.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _hex2dec = require("./hex2dec");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Snowflake = function () {
function Snowflake(options) {
(0, _classCallCheck3.default)(this, Snowflake);
options = options || {};
this.seq = 0;
this.mid = (options.mid || 1) % 1023;
this.offset = options.offset || 0;
this.lastTime = 0;
}
(0, _createClass3.default)(Snowflake, [{
key: "generate",
value: function generate() {
var time = Date.now(),
bTime = (time - this.offset).toString(2);
// get the sequence number
if (this.lastTime == time) {
this.seq++;
if (this.seq > 4095) {
this.seq = 0;
// make system wait till time is been shifted by one millisecond
while (Date.now() <= time) {}
}
} else {
this.seq = 0;
}
this.lastTime = time;
var bSeq = this.seq.toString(2),
bMid = this.mid.toString(2);
// create sequence binary bit
while (bSeq.length < 12) {
bSeq = "0" + bSeq;
}while (bMid.length < 10) {
bMid = "0" + bMid;
}var bid = bTime + bMid + bSeq;
var id = "";
for (var i = bid.length; i > 0; i -= 4) {
id = parseInt(bid.substring(i - 4, i), 2).toString(16) + id;
}
return (0, _hex2dec.hexToDec)(id);
}
}]);
return Snowflake;
}();
exports.default = Snowflake;