From 24867aa2ba4fc25a6edb19cb65379e6db948c12a Mon Sep 17 00:00:00 2001 From: Utkarsh Srivastava Date: Wed, 27 May 2020 00:24:46 +0530 Subject: [PATCH] Removed macid and added feature to retrieve the machine id from the generated ids, irrespective of the machine the id was generated on --- .gitignore | 3 ++- lib/generateUniqueID.d.ts | 14 ++++------ lib/generateUniqueID.d.ts.map | 2 +- lib/generateUniqueID.js | 51 +++++++++++++++-------------------- lib/generateUniqueID.js.map | 2 +- lib/test.js | 17 +++++++++--- lib/test.js.map | 2 +- package-lock.json | 2 +- package.json | 2 +- src/generateUniqueID.ts | 45 ++++++++++++++++--------------- src/getMacID.ts | 40 --------------------------- src/test.ts | 15 ++++++++--- 12 files changed, 80 insertions(+), 115 deletions(-) delete mode 100644 src/getMacID.ts diff --git a/.gitignore b/.gitignore index 90b366a..a3bef58 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .vscode -build \ No newline at end of file +build +log \ No newline at end of file diff --git a/lib/generateUniqueID.d.ts b/lib/generateUniqueID.d.ts index 9342e63..287edbc 100644 --- a/lib/generateUniqueID.d.ts +++ b/lib/generateUniqueID.d.ts @@ -1,28 +1,27 @@ interface Config { customEpoch?: number; returnNumber?: boolean; + machineID?: number; } /** * Constructs a UniqueID object which stores method for generation * of a unique 64 bit time sortable id and a method for retreiving * time of creation for the ids * - * @param {config} [customEpoch = 1546300800000] A 42 bit long custom epoch + * @param {config} [customEpoch = 1546300800000] A 32 bit long custom epoch * in ms, defaults to 1546300800000 (01-01-2019) * * ``` * const uid = new UniqueID(); * const ID = uid.getUniqueID(); * const IDCreateAt = uid.getTimestampFromID(ID); - * const currentMacID = uid.getMacID(); * ``` */ export declare class UniqueID { private _CUSTOM_EPOCH; - private _MACID; - private _FORMATTEDMACID; private _snowflake; - private _nextID; + private _MACHINE_ID?; + private returnNumber; constructor(config?: Config); /** * Generates a unique time sortable 64 bit number using native code @@ -42,10 +41,7 @@ export declare class UniqueID { * @returns {number} timestamp of id creations */ getTimestampFromID(id: bigint | string): number; - /** - * @returns MAC address being used internally - */ - get macID(): string; + getMachineIDFromID(id: bigint | string): number; } export {}; //# sourceMappingURL=generateUniqueID.d.ts.map \ No newline at end of file diff --git a/lib/generateUniqueID.d.ts.map b/lib/generateUniqueID.d.ts.map index fb65e0f..b4904b7 100644 --- a/lib/generateUniqueID.d.ts.map +++ b/lib/generateUniqueID.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"generateUniqueID.d.ts","sourceRoot":"","sources":["../src/generateUniqueID.ts"],"names":[],"mappings":"AAKA,UAAU,MAAM;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;CACzB;AAOD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,QAAQ;IACjB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,OAAO,CAAW;gBAEd,MAAM,GAAE,MAAmB;IAYvC;;;OAGG;IACH,WAAW,IAAI,MAAM,GAAG,MAAM;IAI9B;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAIlD;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAI/C;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;CACJ"} \ No newline at end of file +{"version":3,"file":"generateUniqueID.d.ts","sourceRoot":"","sources":["../src/generateUniqueID.ts"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAQ;IACjB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAQ;gBAEhB,MAAM,GAAE,MAAmB;IAevC;;;OAGG;IACH,WAAW,IAAI,MAAM,GAAG,MAAM;IAO9B;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAIlD;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAI/C,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;CAGlD"} \ No newline at end of file diff --git a/lib/generateUniqueID.js b/lib/generateUniqueID.js index 0b6c35c..cb2ed1e 100644 --- a/lib/generateUniqueID.js +++ b/lib/generateUniqueID.js @@ -35,12 +35,8 @@ var __generator = (this && this.__generator) || function (thisArg, body) { if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", { value: true }); var Snowflake = require('../build/Release/snowflake').Snowflake; -var getMacID_1 = __importDefault(require("./getMacID")); var CUSTOM_EPOCH = 1546300800000; // 01-01-2019 var initConfig = { customEpoch: CUSTOM_EPOCH, @@ -51,39 +47,41 @@ var initConfig = { * of a unique 64 bit time sortable id and a method for retreiving * time of creation for the ids * - * @param {config} [customEpoch = 1546300800000] A 42 bit long custom epoch + * @param {config} [customEpoch = 1546300800000] A 32 bit long custom epoch * in ms, defaults to 1546300800000 (01-01-2019) * * ``` * const uid = new UniqueID(); * const ID = uid.getUniqueID(); * const IDCreateAt = uid.getTimestampFromID(ID); - * const currentMacID = uid.getMacID(); * ``` */ var UniqueID = /** @class */ (function () { function UniqueID(config) { - var _this = this; if (config === void 0) { config = initConfig; } - this._MACID = ''; - this._FORMATTEDMACID = ''; + this.returnNumber = true; this._CUSTOM_EPOCH = config.customEpoch || CUSTOM_EPOCH; - var _a = getMacID_1.default(), macIDString = _a.macIDString, macID = _a.macID; - this._MACID = macIDString; - this._FORMATTEDMACID = macID; - if (!this._MACID) - throw new Error('No MAC ADDRESS found to initialise'); - this._snowflake = new Snowflake(this._MACID, this._CUSTOM_EPOCH); - this._nextID = config.returnNumber - ? function () { return _this._snowflake.getUniqueIDBigInt(); } - : function () { return _this._snowflake.getUniqueID(); }; + this._MACHINE_ID = config.machineID; + this.returnNumber = !!config.returnNumber; + if ((this._MACHINE_ID !== undefined) && !isNaN(this._MACHINE_ID)) { + if (!Number.isInteger(this._MACHINE_ID)) + throw Error("Machine Id should be a decimal number"); + if (this._MACHINE_ID > (1 << 12) - 1) + throw Error("Maximum value of machine id can be 2^12 - 1 (4095)"); + this._snowflake = new Snowflake(this._CUSTOM_EPOCH, this._MACHINE_ID); + return; + } + this._snowflake = new Snowflake(this._CUSTOM_EPOCH); } /** * Generates a unique time sortable 64 bit number using native code * @returns {string | bigint} the unique id */ UniqueID.prototype.getUniqueID = function () { - return this._nextID(); + var val = this._snowflake.getUniqueID(); + if (!this.returnNumber) + return val.toString(); + return val; }; /** * Promisified unique id function @@ -105,18 +103,11 @@ var UniqueID = /** @class */ (function () { * @returns {number} timestamp of id creations */ UniqueID.prototype.getTimestampFromID = function (id) { - return this._snowflake.getTimestampFromID(id) + this._CUSTOM_EPOCH; + return this._snowflake.getTimestampFromID(id); + }; + UniqueID.prototype.getMachineIDFromID = function (id) { + return this._snowflake.getNodeIDFromID(id); }; - Object.defineProperty(UniqueID.prototype, "macID", { - /** - * @returns MAC address being used internally - */ - get: function () { - return this._FORMATTEDMACID; - }, - enumerable: true, - configurable: true - }); return UniqueID; }()); exports.UniqueID = UniqueID; diff --git a/lib/generateUniqueID.js.map b/lib/generateUniqueID.js.map index 4c3281b..4da53ab 100644 --- a/lib/generateUniqueID.js.map +++ b/lib/generateUniqueID.js.map @@ -1 +1 @@ -{"version":3,"file":"generateUniqueID.js","sourceRoot":"","sources":["../src/generateUniqueID.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAQ,IAAA,2DAAS,CAA2C;AAC5D,wDAAkC;AAElC,IAAM,YAAY,GAAG,aAAa,CAAC,CAAC,aAAa;AAOjD,IAAM,UAAU,GAAW;IACvB,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,KAAK;CACtB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH;IAOI,kBAAY,MAA2B;QAAvC,iBAUC;QAVW,uBAAA,EAAA,mBAA2B;QAL/B,WAAM,GAAW,EAAE,CAAC;QACpB,oBAAe,GAAW,EAAE,CAAC;QAKjC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,IAAI,YAAY,CAAC;QAClD,IAAA,yBAAmC,EAAjC,4BAAW,EAAE,gBAAoB,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY;YAC9B,CAAC,CAAC,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAnC,CAAmC;YAC3C,CAAC,CAAC,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAA7B,CAA6B,CAAA;IAC7C,CAAC;IAED;;;OAGG;IACH,8BAAW,GAAX;QACI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACG,mCAAgB,GAAtB;;;;gBACI,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO,IAAI,OAAA,OAAO,CAAC,KAAI,CAAC,WAAW,EAAE,CAAC,EAA3B,CAA2B,CAAC,EAAA;;;KAC7D;IAED;;;;;;OAMG;IACH,qCAAkB,GAAlB,UAAmB,EAAmB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;IACvE,CAAC;IAKD,sBAAI,2BAAK;QAHT;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,eAAe,CAAC;QAChC,CAAC;;;OAAA;IACL,eAAC;AAAD,CAAC,AApDD,IAoDC;AApDY,4BAAQ"} \ No newline at end of file +{"version":3,"file":"generateUniqueID.js","sourceRoot":"","sources":["../src/generateUniqueID.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAQ,IAAA,2DAAS,CAA2C;AAE5D,IAAM,YAAY,GAAG,aAAa,CAAC,CAAC,aAAa;AAQjD,IAAM,UAAU,GAAW;IACvB,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,KAAK;CACtB,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH;IAMI,kBAAY,MAA2B;QAA3B,uBAAA,EAAA,mBAA2B;QAF/B,iBAAY,GAAG,IAAI,CAAC;QAGxB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,IAAI,YAAY,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAE1C,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,MAAM,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC9F,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;gBAAE,MAAM,KAAK,CAAC,oDAAoD,CAAC,CAAA;YACvG,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACtE,OAAO;SACV;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,8BAAW,GAAX;QACI,IAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAA;QACzC,IAAI,CAAC,IAAI,CAAC,YAAY;YAClB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAA;IACd,CAAC;IAED;;;OAGG;IACG,mCAAgB,GAAtB;;;;gBACI,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO,IAAI,OAAA,OAAO,CAAC,KAAI,CAAC,WAAW,EAAE,CAAC,EAA3B,CAA2B,CAAC,EAAA;;;KAC7D;IAED;;;;;;OAMG;IACH,qCAAkB,GAAlB,UAAmB,EAAmB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,qCAAkB,GAAlB,UAAmB,EAAmB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACL,eAAC;AAAD,CAAC,AAtDD,IAsDC;AAtDY,4BAAQ"} \ No newline at end of file diff --git a/lib/test.js b/lib/test.js index 8024609..60678c9 100644 --- a/lib/test.js +++ b/lib/test.js @@ -6,16 +6,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); var index_1 = __importDefault(require("./index")); var nanotimer_1 = __importDefault(require("nanotimer")); var minimist_1 = __importDefault(require("minimist")); -var _a = minimist_1.default(process.argv.slice(2)), type = _a.type, time = _a.time, interval = _a.interval, verbose = _a.v; +var _a = minimist_1.default(process.argv.slice(2)), type = _a.type, time = _a.time, interval = _a.interval, verbose = _a.v, metadata = _a.metadata, demoonly = _a.demoonly; var timer = new nanotimer_1.default(); var uid = new index_1.default({ - returnNumber: type === "number" || type === "num" + returnNumber: type === "number" || type === "num", + machineID: Number(process.env.MACHINE_ID) }); var benchmark = function (totalTime, Function) { console.log('[STARTING]'); var times = 0; timer.setInterval(function () { - times++; + times += 1; Function(); }, '', interval || '1u'); timer.setTimeout(function (timer) { @@ -29,5 +30,13 @@ var benchmarkFunction = function () { else return function () { return uid.getUniqueID(); }; }; -benchmark(time || '1s', benchmarkFunction()); +if (demoonly) { + console.log(uid.getUniqueID()); +} +else if (metadata) { + console.log(uid.getMachineIDFromID(metadata), uid.getTimestampFromID(metadata)); +} +else { + benchmark(time || '1s', benchmarkFunction()); +} //# sourceMappingURL=test.js.map \ No newline at end of file diff --git a/lib/test.js.map b/lib/test.js.map index 7ad78a0..f371e1e 100644 --- a/lib/test.js.map +++ b/lib/test.js.map @@ -1 +1 @@ -{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;AAAA,kDAA+B;AAC/B,wDAAkC;AAClC,sDAA8B;AAExB,IAAA,8CAAoE,EAAlE,cAAI,EAAE,cAAI,EAAE,sBAAQ,EAAE,cAA4C,CAAC;AAC3E,IAAM,KAAK,GAAG,IAAI,mBAAS,EAAE,CAAC;AAC9B,IAAM,GAAG,GAAG,IAAI,eAAQ,CAAC;IACrB,YAAY,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK;CACpD,CAAC,CAAC;AAEH,IAAM,SAAS,GAAG,UAAC,SAAiB,EAAE,QAAkB;IACpD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,CAAC,WAAW,CAAC;QACd,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,CAAC;IACf,CAAC,EAAE,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,UAAU,CAAC,UAAC,KAAU;QACxB,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAA;AAC1B,CAAC,CAAA;AAED,IAAM,iBAAiB,GAAG;IACtB,IAAI,OAAO;QAAE,OAAO,cAAM,OAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAA9B,CAA8B,CAAC;;QACpD,OAAO,cAAM,OAAA,GAAG,CAAC,WAAW,EAAE,EAAjB,CAAiB,CAAA;AACvC,CAAC,CAAA;AAED,SAAS,CAAC,IAAI,IAAI,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;AAAA,kDAA+B;AAC/B,wDAAkC;AAClC,sDAA8B;AAExB,IAAA,8CAAwF,EAAtF,cAAI,EAAE,cAAI,EAAE,sBAAQ,EAAE,cAAU,EAAE,sBAAQ,EAAE,sBAA0C,CAAC;AAC/F,IAAM,KAAK,GAAG,IAAI,mBAAS,EAAE,CAAC;AAC9B,IAAM,GAAG,GAAG,IAAI,eAAQ,CAAC;IACrB,YAAY,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK;IACjD,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;CAC5C,CAAC,CAAC;AAEH,IAAM,SAAS,GAAG,UAAC,SAAiB,EAAE,QAAkB;IACpD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,CAAC,WAAW,CAAC;QACd,KAAK,IAAI,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;IACf,CAAC,EAAE,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,UAAU,CAAC,UAAC,KAAU;QACxB,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAA;AAC1B,CAAC,CAAA;AAED,IAAM,iBAAiB,GAAG;IACtB,IAAI,OAAO;QAAE,OAAO,cAAM,OAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAA9B,CAA8B,CAAC;;QACpD,OAAO,cAAM,OAAA,GAAG,CAAC,WAAW,EAAE,EAAjB,CAAiB,CAAA;AACvC,CAAC,CAAA;AAED,IAAI,QAAQ,EAAE;IACV,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;CACjC;KAAM,IAAI,QAAQ,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;CAClF;KAAM;IACH,SAAS,CAAC,IAAI,IAAI,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;CAChD"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 28cafed..5af17b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "nodejs-snowflake", - "version": "1.0.5", + "version": "1.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 499d18c..96c0a91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nodejs-snowflake", - "version": "1.4.1", + "version": "1.5.0", "description": "Generate time sortable 64 bits unique ids for distributed systems (inspired from twitter snowflake)", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/generateUniqueID.ts b/src/generateUniqueID.ts index 87fbd96..68feb01 100644 --- a/src/generateUniqueID.ts +++ b/src/generateUniqueID.ts @@ -1,11 +1,11 @@ const { Snowflake } = require('../build/Release/snowflake'); -import getMacID from './getMacID'; const CUSTOM_EPOCH = 1546300800000; // 01-01-2019 interface Config { customEpoch?: number; - returnNumber?: boolean + returnNumber?: boolean; + machineID?: number; } const initConfig: Config = { @@ -18,33 +18,34 @@ const initConfig: Config = { * of a unique 64 bit time sortable id and a method for retreiving * time of creation for the ids * - * @param {config} [customEpoch = 1546300800000] A 42 bit long custom epoch + * @param {config} [customEpoch = 1546300800000] A 32 bit long custom epoch * in ms, defaults to 1546300800000 (01-01-2019) * * ``` * const uid = new UniqueID(); * const ID = uid.getUniqueID(); * const IDCreateAt = uid.getTimestampFromID(ID); - * const currentMacID = uid.getMacID(); * ``` */ export class UniqueID { private _CUSTOM_EPOCH: number; - private _MACID: string = ''; - private _FORMATTEDMACID: string = ''; private _snowflake: any; - private _nextID: Function; + private _MACHINE_ID?: number; + private returnNumber = true; constructor(config: Config = initConfig) { this._CUSTOM_EPOCH = config.customEpoch || CUSTOM_EPOCH; - const { macIDString, macID } = getMacID(); - this._MACID = macIDString; - this._FORMATTEDMACID = macID; - if (!this._MACID) throw new Error('No MAC ADDRESS found to initialise'); - this._snowflake = new Snowflake(this._MACID, this._CUSTOM_EPOCH); - this._nextID = config.returnNumber - ? () => this._snowflake.getUniqueIDBigInt() - : () => this._snowflake.getUniqueID() + this._MACHINE_ID = config.machineID; + this.returnNumber = !!config.returnNumber; + + if ((this._MACHINE_ID !== undefined) && !isNaN(this._MACHINE_ID)) { + if (!Number.isInteger(this._MACHINE_ID)) throw Error("Machine Id should be a decimal number"); + if (this._MACHINE_ID > (1 << 12) - 1) throw Error("Maximum value of machine id can be 2^12 - 1 (4095)") + this._snowflake = new Snowflake(this._CUSTOM_EPOCH, this._MACHINE_ID); + return; + } + + this._snowflake = new Snowflake(this._CUSTOM_EPOCH); } /** @@ -52,7 +53,10 @@ export class UniqueID { * @returns {string | bigint} the unique id */ getUniqueID(): string | bigint { - return this._nextID(); + const val = this._snowflake.getUniqueID() + if (!this.returnNumber) + return val.toString(); + return val } /** @@ -71,13 +75,10 @@ export class UniqueID { * @returns {number} timestamp of id creations */ getTimestampFromID(id: bigint | string): number { - return this._snowflake.getTimestampFromID(id) + this._CUSTOM_EPOCH; + return this._snowflake.getTimestampFromID(id); } - /** - * @returns MAC address being used internally - */ - get macID(): string { - return this._FORMATTEDMACID; + getMachineIDFromID(id: bigint | string): number { + return this._snowflake.getNodeIDFromID(id); } } \ No newline at end of file diff --git a/src/getMacID.ts b/src/getMacID.ts deleted file mode 100644 index 06d0432..0000000 --- a/src/getMacID.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { networkInterfaces, platform } from 'os'; -const macRegex = /(?:[a-z0-9]{1,2}[:-]){5}[a-z0-9]{1,2}/i; - -function getMac(): string { - const interfaces = networkInterfaces() - for (const key in interfaces) { - for (const val of interfaces[key]) { - if (!val.internal && macRegex.test(val.mac)) return val.mac; - } - } - throw new Error('failed to get the MAC address'); -} - -interface MacID { - /** - * MACID of the machine - */ - macID: string; - /** - * Special format of MACID without colons - * @example - * MACID -> "02:aa:43:56:a4:67" -> "02aa4356a467" - */ - macIDString: string; -} - -/** - * Asynchronous function returns mac address of the machine - * @returns {MacID} An object containing macID and - * special representation of it - */ -const getMacID = (): MacID => { - const macID = getMac(); - const splitCharacter = platform() === 'win32' ? '-' : ':'; - return { macID, macIDString: macID.split(splitCharacter).join('') } -} - -export { getMacID }; - -export default getMacID; \ No newline at end of file diff --git a/src/test.ts b/src/test.ts index a993e0f..acd1afe 100644 --- a/src/test.ts +++ b/src/test.ts @@ -2,17 +2,18 @@ import UniqueID from './index'; import NanoTimer from 'nanotimer'; import parser from 'minimist'; -const { type, time, interval, v: verbose } = parser(process.argv.slice(2)); +const { type, time, interval, v: verbose, metadata, demoonly } = parser(process.argv.slice(2)); const timer = new NanoTimer(); const uid = new UniqueID({ - returnNumber: type === "number" || type === "num" + returnNumber: type === "number" || type === "num", + machineID: Number(process.env.MACHINE_ID) }); const benchmark = (totalTime: string, Function: Function) => { console.log('[STARTING]') let times = 0; timer.setInterval(() => { - times++; + times += 1; Function(); }, '', interval || '1u'); timer.setTimeout((timer: any) => { @@ -26,4 +27,10 @@ const benchmarkFunction = () => { else return () => uid.getUniqueID() } -benchmark(time || '1s', benchmarkFunction()); \ No newline at end of file +if (demoonly) { + console.log(uid.getUniqueID()) +} else if (metadata) { + console.log(uid.getMachineIDFromID(metadata), uid.getTimestampFromID(metadata)) +} else { + benchmark(time || '1s', benchmarkFunction()); +} \ No newline at end of file