snowflake-id-maker
Version:
Snowflake.io, generates k-ordered, conflict-free snowflake IDs in a distributed environment.
3 lines (2 loc) • 5.41 kB
JavaScript
function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,o(r.key),r)}}function r(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function i(t,n){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,n){if(t){if("string"==typeof t)return e(t,n);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?e(t,n):void 0}}(t))||n&&t&&"number"==typeof t.length){r&&(t=r);var i=0,a=function(){};return{s:a,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var e=r.next();return s=e.done,e},e:function(e){u=!0,o=e},f:function(){try{s||null==r.return||r.return()}finally{if(u)throw o}}}}function a(e,t,n){return(t=o(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}var s=function(){return r((function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(t(this,e),a(this,"id",void 0),a(this,"genId",void 0),a(this,"epoch",void 0),a(this,"seqMask",void 0),a(this,"seq",0),a(this,"lastTime",0),a(this,"overflow",!1),"number"==typeof n.id)this.id=1023&n.id;else{var r=(n.datacenter||0)&e.MAX_DATACENTER,i=(n.worker||0)&e.MAX_WORKER;this.id=r<<5|i}this.genId=this.id<<12,this.epoch=n.epoch||0,this.seqMask=n.seqMask||e.MAX_SEQUENCE}),[{key:"next",value:function(e){var t=Date.now()-this.epoch,n=Buffer.alloc(8);if(t<this.lastTime)return this.handleClockBackwards(t,e);if(t===this.lastTime){if(this.overflow)return this.handleOverflow(e);this.seq=this.seq+1&this.seqMask,0===this.seq&&(this.overflow=!0)}else this.overflow=!1,this.seq=0;if(this.lastTime=t,this.generateId(n,t),!e)return n;process.nextTick((function(){return e(null,n)}))}},{key:"handleClockBackwards",value:function(e,t){var n=this,r=this.lastTime-e;if(!t)throw new Error("Clock moved backwards. Refusing to generate id for ".concat(r,"ms"));setTimeout((function(){return n.next(t)}),r)}},{key:"handleOverflow",value:function(e){var t=this;if(!e)throw new Error("Sequence overflow. Use callback for async handling");setTimeout((function(){return t.next(e)}),1)}},{key:"generateId",value:function(e,t){e.writeUInt32BE(Math.floor(t/4)>>>0,0);var n=(3&t)<<22|this.genId|this.seq;e.writeUInt32BE(n>>>0,4)}}])}();function u(e){var t=8n;ArrayBuffer.isView(e)?t=BigInt(8*e.BYTES_PER_ELEMENT):e=new Uint8Array(e);var n,r=0n,a=i(e.values());try{for(a.s();!(n=a.n()).done;){var o=n.value;r=(r<<t)+BigInt(o)}}catch(e){a.e(e)}finally{a.f()}return r}a(s,"MAX_DATACENTER",31),a(s,"MAX_WORKER",31),a(s,"MAX_SEQUENCE",4095);var f=Object.prototype.toString;function c(e){return"[object Object]"===f.call(e)}function l(e){return!e&&0!==e||function(e){return c(e)&&0===Object.keys(e).length}(e)}function h(e,t){if(l(e))return{};if(c(e)){var n={};return t.map((function(t){t in e&&(n[t]=e[t])})),n}return Array.isArray(e)?e.map((function(e){return h(e,t)})):{}}var v=function(){function e(){t(this,e),a(this,"instances",new Map)}return r(e,[{key:"maker",value:function(){return new s(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{})}},{key:"setOptions",value:function(e){var t={};c(e)&&(e=h(e,["datacenter","worker","id","epoch","seqMask"]),Reflect.has(e,"datacenter")&&(t.datacenter=e.datacenter),Reflect.has(e,"worker")&&(t.worker=e.worker),Reflect.has(e,"id")&&(t.id=e.id),Reflect.has(e,"epoch")&&(t.epoch=e.epoch),Reflect.has(e,"seqMask")&&(t.seqMask=e.seqMask));var n=JSON.stringify(t);return this.instances.has(n)||this.instances.set(n,this.maker(t)),this.instances.get(n)}}],[{key:"generate",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.getInstance().setOptions(e).next()}},{key:"generateSnowflakeIdBuffer",value:function(e){return this.generate(e)}},{key:"generateSnowflakeIdBigint",value:function(e){return u(this.generateSnowflakeIdBuffer(e))}},{key:"generateSnowflakeIdString",value:function(e){return String(this.generateSnowflakeIdBigint(e))}},{key:"getInstance",value:function(){var t=this.instance;return t&&t instanceof this||(t=this.instance=new e),t}}])}();a(v,"instance",void 0);var d=function(e){return c(e)?v.generate(e):v.generate()},y=function(e){return u(d(e))},g=function(e){return String(y(e))},w=function(e){return g(e)};export{v as Snowflake,y as generateSnowflakeIdBigint,d as generateSnowflakeIdBuffer,g as generateSnowflakeIdString,w as snowflakeId};
//# sourceMappingURL=snowflake-id-maker.js.map