12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- export var Snowflake = /** @class */ (function() {
- function Snowflake(_workerId, _dataCenterId, _sequence) {
- this.twepoch = 1288834974657n;
- //this.twepoch = 0n;
- this.workerIdBits = 5n;
- this.dataCenterIdBits = 5n;
- this.maxWrokerId = -1n ^ (-1n << this.workerIdBits); // 值为:31
- this.maxDataCenterId = -1n ^ (-1n << this.dataCenterIdBits); // 值为:31
- this.sequenceBits = 12n;
- this.workerIdShift = this.sequenceBits; // 值为:12
- this.dataCenterIdShift = this.sequenceBits + this.workerIdBits; // 值为:17
- this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.dataCenterIdBits; // 值为:22
- this.sequenceMask = -1n ^ (-1n << this.sequenceBits); // 值为:4095
- this.lastTimestamp = -1n;
- //设置默认值,从环境变量取
- this.workerId = 1n;
- this.dataCenterId = 1n;
- this.sequence = 0n;
- if (this.workerId > this.maxWrokerId || this.workerId < 0) {
- throw new Error('_workerId must max than 0 and small than maxWrokerId-[' + this.maxWrokerId + ']');
- }
- if (this.dataCenterId > this.maxDataCenterId || this.dataCenterId < 0) {
- throw new Error('_dataCenterId must max than 0 and small than maxDataCenterId-[' + this.maxDataCenterId + ']');
- }
-
- this.workerId = BigInt(_workerId);
- this.dataCenterId = BigInt(_dataCenterId);
- this.sequence = BigInt(_sequence);
- }
- Snowflake.prototype.tilNextMillis = function(lastTimestamp) {
- var timestamp = this.timeGen();
- while (timestamp <= lastTimestamp) {
- timestamp = this.timeGen();
- }
- return BigInt(timestamp);
- };
- Snowflake.prototype.timeGen = function() {
- return BigInt(Date.now());
- };
- Snowflake.prototype.nextId = function() {
- var timestamp = this.timeGen();
- if (timestamp < this.lastTimestamp) {
- throw new Error('Clock moved backwards. Refusing to generate id for ' +
- (this.lastTimestamp - timestamp));
- }
- if (this.lastTimestamp === timestamp) {
- this.sequence = (this.sequence + 1n) & this.sequenceMask;
- if (this.sequence === 0n) {
- timestamp = this.tilNextMillis(this.lastTimestamp);
- }
- } else {
- this.sequence = 0n;
- }
- this.lastTimestamp = timestamp;
- return ((timestamp - this.twepoch) << this.timestampLeftShift) |
- (this.dataCenterId << this.dataCenterIdShift) |
- (this.workerId << this.workerIdShift) |
- this.sequence;
- };
- return Snowflake;
- }());
|