1 |
- import bigInt from"big-integer";const Snowflake=function(){function t(t,e,i){if(this.twepoch=new Date("2021-05-01 00:00:01").getTime(),this.workerIdBits=5,this.dataCenterIdBits=5,this.maxWrokerId=-1^-1<<this.workerIdBits,this.maxDataCenterId=-1^-1<<this.dataCenterIdBits,this.sequenceBits=12,this.workerIdShift=this.sequenceBits,this.dataCenterIdShift=this.sequenceBits+this.workerIdBits,this.timestampLeftShift=this.sequenceBits+this.workerIdBits+this.dataCenterIdBits,this.sequenceMask=-1^-1<<this.sequenceBits,this.lastTimestamp=-1,this.workerId=1,this.dataCenterId=1,this.sequence=0,this.workerId>this.maxWrokerId||this.workerId<0)throw new Error(`config.worker_id must max than 0 and small than maxWrokerId-[${this.maxWrokerId}]`);if(this.dataCenterId>this.maxDataCenterId||this.dataCenterId<0)throw new Error(`config.data_center_id must max than 0 and small than maxDataCenterId-[${this.maxDataCenterId}]`);this.workerId=t,this.dataCenterId=e,this.sequence=i}return t.prototype.tilNextMillis=function(t){let e=this.timeGen();for(;e<=t;)e=this.timeGen();return e},t.prototype.timeGen=function(){return Date.now()},t.prototype.nextId=function(){let t=this.timeGen();if(t<this.lastTimestamp)throw new Error(`Clock moved backwards. Refusing to generate id for ${this.lastTimestamp-t}`);this.lastTimestamp===t?(this.sequence=this.sequence+1&this.sequenceMask,0===this.sequence&&(t=this.tilNextMillis(this.lastTimestamp))):this.sequence=0,this.lastTimestamp=t;let e=this.dataCenterId<<this.dataCenterIdShift|this.workerId<<this.workerIdShift|this.sequence,i=new bigInt(String(t-this.twepoch),10);i=i.shiftLeft(this.timestampLeftShift);let s=i.or(new bigInt(String(e),10)).toString(10);return s},t}();export default Snowflake;
|