diff --git a/dist/common/SyncLocker.cjs.map b/dist/common/SyncLocker.cjs.map index fbcdf47..c1037c7 100644 --- a/dist/common/SyncLocker.cjs.map +++ b/dist/common/SyncLocker.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/common/SyncLocker.ts","../../src/decorators/singleton.ts","../../src/common/ZError.ts"],"sourcesContent":["import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWO,IAAM,gBAAgB,OAAO;AAK7B,IAAM,YAAY,CAAwC,gBAC/D,IAAI,MAAM,aAAa;AAAA,EACrB,UAAU,QAAsB,eAAe,WAAW;AAExD,QAAI,OAAO,cAAc,UAAU,WAAW;AAC5C,aAAO,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,aAAa,GAAG;AAC1B,aAAO,aAAa,IAAI,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC5E;AACA,WAAO,OAAO,aAAa;AAAA,EAC7B;AACF,CAAC;;;AC3BI,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;;;AFCO,IAAM,aAAN,MAAiB;AAAA,EAAjB;AACL,eAA4B,oBAAI,IAAI;AAAA;AAAA,EAE7B,KAAK,KAAe;AACzB,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,IAAI,KAAK,IAAI;AACtB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,KAAe;AAC3B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,SAAK,IAAI,OAAO,GAAG;AAAA,EACrB;AAAA,EAEO,UAAU,KAAe;AAC9B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,YAAM,IAAI,OAAO,KAAK,kBAAkB;AAAA,IAC1C;AACA,SAAK,KAAK,GAAG;AACb,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,KAAe;AAC7B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACzB;AACF;AA9Ba,aAAN;AAAA,EADN;AAAA,GACY;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/common/SyncLocker.ts","../../src/decorators/singleton.ts","../../src/common/ZError.ts"],"sourcesContent":["import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWO,IAAM,gBAAgB,OAAO;AAK7B,IAAM,YAAY,CAAwC,gBAC/D,IAAI,MAAM,aAAa;AAAA,EACrB,UAAU,QAAsB,eAAe,WAAW;AAExD,QAAI,OAAO,cAAc,UAAU,WAAW;AAC5C,aAAO,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,aAAa,GAAG;AAC1B,aAAO,aAAa,IAAI,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC5E;AACA,WAAO,OAAO,aAAa;AAAA,EAC7B;AACF,CAAC;;;AC5BI,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;;;AFEO,IAAM,aAAN,MAAiB;AAAA,EAAjB;AACL,eAA4B,oBAAI,IAAI;AAAA;AAAA,EAE7B,KAAK,KAAe;AACzB,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,IAAI,KAAK,IAAI;AACtB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,KAAe;AAC3B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,SAAK,IAAI,OAAO,GAAG;AAAA,EACrB;AAAA,EAEO,UAAU,KAAe;AAC9B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,YAAM,IAAI,OAAO,KAAK,kBAAkB;AAAA,IAC1C;AACA,SAAK,KAAK,GAAG;AACb,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,KAAe;AAC7B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACzB;AACF;AA9Ba,aAAN;AAAA,EADN;AAAA,GACY;","names":[]} \ No newline at end of file diff --git a/dist/common/SyncLocker.js.map b/dist/common/SyncLocker.js.map index d2ba8c9..a06559d 100644 --- a/dist/common/SyncLocker.js.map +++ b/dist/common/SyncLocker.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/decorators/singleton.ts","../../src/common/ZError.ts","../../src/common/SyncLocker.ts"],"sourcesContent":["/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAWO,IAAM,gBAAgB,OAAO;AAK7B,IAAM,YAAY,CAAwC,gBAC/D,IAAI,MAAM,aAAa;AAAA,EACrB,UAAU,QAAsB,eAAe,WAAW;AAExD,QAAI,OAAO,cAAc,UAAU,WAAW;AAC5C,aAAO,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,aAAa,GAAG;AAC1B,aAAO,aAAa,IAAI,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC5E;AACA,WAAO,OAAO,aAAa;AAAA,EAC7B;AACF,CAAC;;;AC3BI,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;;;ACCO,IAAM,aAAN,MAAiB;AAAA,EAAjB;AACL,eAA4B,oBAAI,IAAI;AAAA;AAAA,EAE7B,KAAK,KAAe;AACzB,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,IAAI,KAAK,IAAI;AACtB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,KAAe;AAC3B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,SAAK,IAAI,OAAO,GAAG;AAAA,EACrB;AAAA,EAEO,UAAU,KAAe;AAC9B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,YAAM,IAAI,OAAO,KAAK,kBAAkB;AAAA,IAC1C;AACA,SAAK,KAAK,GAAG;AACb,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,KAAe;AAC7B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACzB;AACF;AA9Ba,aAAN;AAAA,EADN;AAAA,GACY;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/decorators/singleton.ts","../../src/common/ZError.ts","../../src/common/SyncLocker.ts"],"sourcesContent":["/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAWO,IAAM,gBAAgB,OAAO;AAK7B,IAAM,YAAY,CAAwC,gBAC/D,IAAI,MAAM,aAAa;AAAA,EACrB,UAAU,QAAsB,eAAe,WAAW;AAExD,QAAI,OAAO,cAAc,UAAU,WAAW;AAC5C,aAAO,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,aAAa,GAAG;AAC1B,aAAO,aAAa,IAAI,QAAQ,UAAU,QAAQ,eAAe,SAAS;AAAA,IAC5E;AACA,WAAO,OAAO,aAAa;AAAA,EAC7B;AACF,CAAC;;;AC5BI,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;;;ACEO,IAAM,aAAN,MAAiB;AAAA,EAAjB;AACL,eAA4B,oBAAI,IAAI;AAAA;AAAA,EAE7B,KAAK,KAAe;AACzB,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,IAAI,KAAK,IAAI;AACtB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,KAAe;AAC3B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,SAAK,IAAI,OAAO,GAAG;AAAA,EACrB;AAAA,EAEO,UAAU,KAAe;AAC9B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,QAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AACrB,YAAM,IAAI,OAAO,KAAK,kBAAkB;AAAA,IAC1C;AACA,SAAK,KAAK,GAAG;AACb,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,KAAe;AAC7B,UAAM,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;AAC1D,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACzB;AACF;AA9Ba,aAAN;AAAA,EADN;AAAA,GACY;","names":[]} \ No newline at end of file diff --git a/dist/common/ZError.cjs.map b/dist/common/ZError.cjs.map index c098a9b..fe80282 100644 --- a/dist/common/ZError.cjs.map +++ b/dist/common/ZError.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/common/ZError.ts"],"sourcesContent":["\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/common/ZError.ts"],"sourcesContent":["export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]} \ No newline at end of file diff --git a/dist/common/ZError.js.map b/dist/common/ZError.js.map index e08920c..7a0c139 100644 --- a/dist/common/ZError.js.map +++ b/dist/common/ZError.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/common/ZError.ts"],"sourcesContent":["\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":";AACO,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/common/ZError.ts"],"sourcesContent":["export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":";AAAO,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]} \ No newline at end of file diff --git a/dist/common/base.controller.cjs.map b/dist/common/base.controller.cjs.map index 77a3195..3d64ec3 100644 --- a/dist/common/base.controller.cjs.map +++ b/dist/common/base.controller.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["\nexport const ROLE_ANON = 'anon'\nexport class BaseController {\n\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,IAAM,YAAY;AAClB,IAAM,iBAAN,MAAqB;AAE5B;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["export const ROLE_ANON = 'anon'\nexport class BaseController {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,YAAY;AAClB,IAAM,iBAAN,MAAqB;AAAC;","names":[]} \ No newline at end of file diff --git a/dist/common/base.controller.js.map b/dist/common/base.controller.js.map index 8e7ead4..bff3292 100644 --- a/dist/common/base.controller.js.map +++ b/dist/common/base.controller.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["\nexport const ROLE_ANON = 'anon'\nexport class BaseController {\n\n}\n\n"],"mappings":";AACO,IAAM,YAAY;AAClB,IAAM,iBAAN,MAAqB;AAE5B;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/common/base.controller.ts"],"sourcesContent":["export const ROLE_ANON = 'anon'\nexport class BaseController {}\n"],"mappings":";AAAO,IAAM,YAAY;AAClB,IAAM,iBAAN,MAAqB;AAAC;","names":[]} \ No newline at end of file diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 47b1947..3c704ca 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export * from './common/ZError'\nexport * from './common/SyncLocker'\nexport * from './common/base.controller'\nexport * from './common/AsyncQueue'\n\nexport * from './redis/ZRedisClient'\n\nexport * from './decorators/router'\nexport * from './decorators/singleton'","\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","\nexport const ROLE_ANON = 'anon'\nexport class BaseController {\n\n}\n\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from \"util\";\n\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('路由中只允许一个空格')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * 有dept修饰器的, 需要验证部门id是否存在\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export * from './common/ZError'\nexport * from './common/SyncLocker'\nexport * from './common/base.controller'\nexport * from './common/AsyncQueue'\n\nexport * from './redis/ZRedisClient'\n\nexport * from './decorators/router'\nexport * from './decorators/singleton'\n","export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","export const ROLE_ANON = 'anon'\nexport class BaseController {}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('路由中只允许一个空格')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * 有dept修饰器的, 需要验证部门id是否存在\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index d57adab..e114dce 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","\nexport const ROLE_ANON = 'anon'\nexport class BaseController {\n\n}\n\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from \"util\";\n\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('路由中只允许一个空格')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * 有dept修饰器的, 需要验证部门id是否存在\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * 单例化一个class\n * 使用方法:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * 也可以不使用 decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() //returns 'true'\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","export const ROLE_ANON = 'anon'\nexport class BaseController {}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n\n// function main() {\n// const queue = createAsyncQueue()\n// queue.push(async () => {\n// console.log(0)\n// }) // returns 0\n// queue.push(async () => {\n// console.log(1)\n\n// return new Promise((resolve, reject) => {\n// setTimeout(() => {\n// console.log('12')\n// resolve()\n// }, 1000)\n// })\n// }) // returns 3\n// queue.push(async () => console.log(2)) // returns 3\n// queue.push(async () => console.log(3)) // returns 3\n// console.log('hi')\n// }\n\n// main()\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('路由中只允许一个空格')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * 有dept修饰器的, 需要验证部门id是否存在\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/dist/utils/date.util.cjs.map b/dist/utils/date.util.cjs.map index f85983e..4e896d2 100644 --- a/dist/utils/date.util.cjs.map +++ b/dist/utils/date.util.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/date.util.ts"],"sourcesContent":["export const ONE_DAY = 24 * 60 * 60 * 1000\n\n// format the date to the format we want\nexport const formatDate = (date: Date): string => {\n const year = date.getFullYear()\n const month = (date.getMonth() + 1 + '').padStart(2, '0')\n const day = (date.getDate() + '').padStart(2, '0')\n return `${year}${month}${day}`\n}\n\n// get formated datestring of yesterday\nexport const yesterday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() - 1)\n return date\n}\n\nexport const nextday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() + 1)\n return date\n}\n\n// calc days between two Date\nexport function daysBetween(date1: Date, date2: Date) {\n // hours*minutes*seconds*milliseconds\n const diffInMs = Math.abs(date1.getTime() - date2.getTime())\n const diffInDays = Math.round(diffInMs / ONE_DAY)\n return diffInDays\n}"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,UAAU,KAAK,KAAK,KAAK;AAG/B,IAAM,aAAa,CAAC,SAAuB;AAChD,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,SAAS,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,GAAG;AACxD,QAAM,OAAO,KAAK,QAAQ,IAAI,IAAI,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;AAC9B;AAGO,IAAM,YAAY,CAAC,SAAgB;AACxC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,SAAgB;AACtC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAGO,SAAS,YAAY,OAAa,OAAa;AAEpD,QAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC3D,QAAM,aAAa,KAAK,MAAM,WAAW,OAAO;AAChD,SAAO;AACT;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/date.util.ts"],"sourcesContent":["export const ONE_DAY = 24 * 60 * 60 * 1000\n\n// format the date to the format we want\nexport const formatDate = (date: Date): string => {\n const year = date.getFullYear()\n const month = (date.getMonth() + 1 + '').padStart(2, '0')\n const day = (date.getDate() + '').padStart(2, '0')\n return `${year}${month}${day}`\n}\n\n// get formated datestring of yesterday\nexport const yesterday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() - 1)\n return date\n}\n\nexport const nextday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() + 1)\n return date\n}\n\n// calc days between two Date\nexport function daysBetween(date1: Date, date2: Date) {\n // hours*minutes*seconds*milliseconds\n const diffInMs = Math.abs(date1.getTime() - date2.getTime())\n const diffInDays = Math.round(diffInMs / ONE_DAY)\n return diffInDays\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,UAAU,KAAK,KAAK,KAAK;AAG/B,IAAM,aAAa,CAAC,SAAuB;AAChD,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,SAAS,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,GAAG;AACxD,QAAM,OAAO,KAAK,QAAQ,IAAI,IAAI,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;AAC9B;AAGO,IAAM,YAAY,CAAC,SAAgB;AACxC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,SAAgB;AACtC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAGO,SAAS,YAAY,OAAa,OAAa;AAEpD,QAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC3D,QAAM,aAAa,KAAK,MAAM,WAAW,OAAO;AAChD,SAAO;AACT;","names":[]} \ No newline at end of file diff --git a/dist/utils/date.util.js.map b/dist/utils/date.util.js.map index 82cf3fe..df36732 100644 --- a/dist/utils/date.util.js.map +++ b/dist/utils/date.util.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/date.util.ts"],"sourcesContent":["export const ONE_DAY = 24 * 60 * 60 * 1000\n\n// format the date to the format we want\nexport const formatDate = (date: Date): string => {\n const year = date.getFullYear()\n const month = (date.getMonth() + 1 + '').padStart(2, '0')\n const day = (date.getDate() + '').padStart(2, '0')\n return `${year}${month}${day}`\n}\n\n// get formated datestring of yesterday\nexport const yesterday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() - 1)\n return date\n}\n\nexport const nextday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() + 1)\n return date\n}\n\n// calc days between two Date\nexport function daysBetween(date1: Date, date2: Date) {\n // hours*minutes*seconds*milliseconds\n const diffInMs = Math.abs(date1.getTime() - date2.getTime())\n const diffInDays = Math.round(diffInMs / ONE_DAY)\n return diffInDays\n}"],"mappings":";AAAO,IAAM,UAAU,KAAK,KAAK,KAAK;AAG/B,IAAM,aAAa,CAAC,SAAuB;AAChD,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,SAAS,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,GAAG;AACxD,QAAM,OAAO,KAAK,QAAQ,IAAI,IAAI,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;AAC9B;AAGO,IAAM,YAAY,CAAC,SAAgB;AACxC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,SAAgB;AACtC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAGO,SAAS,YAAY,OAAa,OAAa;AAEpD,QAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC3D,QAAM,aAAa,KAAK,MAAM,WAAW,OAAO;AAChD,SAAO;AACT;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/date.util.ts"],"sourcesContent":["export const ONE_DAY = 24 * 60 * 60 * 1000\n\n// format the date to the format we want\nexport const formatDate = (date: Date): string => {\n const year = date.getFullYear()\n const month = (date.getMonth() + 1 + '').padStart(2, '0')\n const day = (date.getDate() + '').padStart(2, '0')\n return `${year}${month}${day}`\n}\n\n// get formated datestring of yesterday\nexport const yesterday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() - 1)\n return date\n}\n\nexport const nextday = (date?: Date) => {\n date = date || new Date()\n date.setDate(date.getDate() + 1)\n return date\n}\n\n// calc days between two Date\nexport function daysBetween(date1: Date, date2: Date) {\n // hours*minutes*seconds*milliseconds\n const diffInMs = Math.abs(date1.getTime() - date2.getTime())\n const diffInDays = Math.round(diffInMs / ONE_DAY)\n return diffInDays\n}\n"],"mappings":";AAAO,IAAM,UAAU,KAAK,KAAK,KAAK;AAG/B,IAAM,aAAa,CAAC,SAAuB;AAChD,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,SAAS,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,GAAG;AACxD,QAAM,OAAO,KAAK,QAAQ,IAAI,IAAI,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;AAC9B;AAGO,IAAM,YAAY,CAAC,SAAgB;AACxC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,SAAgB;AACtC,SAAO,QAAQ,oBAAI,KAAK;AACxB,OAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,SAAO;AACT;AAGO,SAAS,YAAY,OAAa,OAAa;AAEpD,QAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC3D,QAAM,aAAa,KAAK,MAAM,WAAW,OAAO;AAChD,SAAO;AACT;","names":[]} \ No newline at end of file diff --git a/dist/utils/net.util.cjs b/dist/utils/net.util.cjs index 53cd357..320ef82 100644 --- a/dist/utils/net.util.cjs +++ b/dist/utils/net.util.cjs @@ -22,7 +22,9 @@ __export(net_util_exports, { checkParamsNeeded: () => checkParamsNeeded, fetchWithErrorHandling: () => fetchWithErrorHandling, generateHeader: () => generateHeader, + generateKVStr: () => generateKVStr, handleFetch: () => handleFetch, + keyValToObject: () => keyValToObject, successfulFetch: () => successfulFetch, timeoutFetch: () => timeoutFetch }); @@ -124,12 +126,57 @@ var checkParamsNeeded = (...args) => { } }); }; +function generateKVStr({ + data = {}, + sort = false, + encode = false, + ignoreNull = true, + splitChar = "&", + equalChar = "=", + uri = "" +}) { + const keys = Object.keys(data); + sort && keys.sort(); + let result = ""; + let i = 0; + for (let key of keys) { + if (ignoreNull && !data[key]) { + continue; + } + if (i++ > 0) + result += splitChar; + if (encode) { + result += `${key}${equalChar}${encodeURIComponent(data[key])}`; + } else { + result += `${key}${equalChar}${data[key]}`; + } + } + if (uri) { + const joinChar = uri.search(/\?/) === -1 ? "?" : "&"; + result = uri + joinChar + result; + } + return result; +} +function keyValToObject(str, splitChar = "&", equalChar = "=") { + let result = {}; + if (!str) { + return result; + } + let arrs = str.split(splitChar); + for (let sub of arrs) { + let subArr = sub.split(equalChar); + result[subArr[0]] = subArr[1]; + } + return result; +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { checkParamsNeeded, fetchWithErrorHandling, generateHeader, + generateKVStr, handleFetch, + keyValToObject, successfulFetch, timeoutFetch }); diff --git a/dist/utils/net.util.cjs.map b/dist/utils/net.util.cjs.map index 7dcbcac..106a90f 100644 --- a/dist/utils/net.util.cjs.map +++ b/dist/utils/net.util.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/net.util.ts","../../src/common/ZError.ts"],"sourcesContent":["import { ZError } from 'common/ZError'\n\nconst TIMEOUT_ERROR = new Error('timeout')\n\nconst hexRe = /^[0-9A-Fa-f]+$/gu\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options)\n if (!response.ok) {\n throw new Error(`Fetch failed with status '${response.status}' for request '${request}'`)\n }\n return response\n}\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await successfulFetch(request, options)\n const object = await response.json()\n return object\n}\n\n/**\n * Execute fetch and return object response, log if known error thrown, otherwise rethrow error.\n *\n * @param request - the request options object\n * @param request.url - The request url to query.\n * @param request.options - The fetch options.\n * @param request.timeout - Timeout to fail request\n * @param request.errorCodesToCatch - array of error codes for errors we want to catch in a particular context\n * @returns The fetch response JSON data or undefined (if error occurs).\n */\nexport async function fetchWithErrorHandling({\n url,\n options,\n timeout,\n errorCodesToCatch,\n}: {\n url: string\n options?: RequestInit\n timeout?: number\n errorCodesToCatch?: number[]\n}) {\n let result\n try {\n if (timeout) {\n result = Promise.race([\n await handleFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n } else {\n result = await handleFetch(url, options)\n }\n } catch (e) {\n logOrRethrowError(e, errorCodesToCatch)\n }\n return result\n}\n\n/**\n * Fetch that fails after timeout.\n *\n * @param url - Url to fetch.\n * @param options - Options to send with the request.\n * @param timeout - Timeout to fail request.\n * @returns Promise resolving the request.\n */\nexport async function timeoutFetch(url: string, options?: RequestInit, timeout = 500): Promise {\n return Promise.race([\n successfulFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n}\n\n/**\n * Utility method to log if error is a common fetch error and otherwise rethrow it.\n *\n * @param error - Caught error that we should either rethrow or log to console\n * @param codesToCatch - array of error codes for errors we want to catch and log in a particular context\n */\nfunction logOrRethrowError(error: any, codesToCatch: number[] = []) {\n if (!error) {\n return\n }\n\n const includesErrorCodeToCatch = codesToCatch.some(code =>\n error.message.includes(`Fetch failed with status '${code}'`),\n )\n\n if (\n error instanceof Error &&\n (includesErrorCodeToCatch || error.message.includes('Failed to fetch') || error === TIMEOUT_ERROR)\n ) {\n console.error(error)\n } else {\n throw error\n }\n}\n\nexport function generateHeader() {\n let random = function (start, end) {\n return (Math.random() * (end - start) + start) | 0\n }\n let getIp = function () {\n return `${random(1, 254)}.${random(1, 254)}.${random(1, 254)}.${random(1, 254)}`\n }\n let time = Date.now()\n let useragent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${\n (70 + Math.random() * 10) | 0\n }.0.4324.${(Math.random() * 100) | 0} Safari/537.36`\n const ip = getIp()\n return {\n 'Refresh-Token': (time -= 5000),\n 'Cache-Control': 'no-cache',\n 'User-Agent': useragent,\n 'X-Forwarded-For': ip,\n 'X-Real-IP': ip,\n 'Content-Type': 'application/json',\n }\n}\n\nexport const checkParamsNeeded = (...args) => {\n args.forEach(arg => {\n if (!arg) {\n throw new ZError(10, 'params mismatch')\n }\n })\n}\n","\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/net.util.ts","../../src/common/ZError.ts"],"sourcesContent":["import { ZError } from 'common/ZError'\n\nconst TIMEOUT_ERROR = new Error('timeout')\n\nconst hexRe = /^[0-9A-Fa-f]+$/gu\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options)\n if (!response.ok) {\n throw new Error(`Fetch failed with status '${response.status}' for request '${request}'`)\n }\n return response\n}\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await successfulFetch(request, options)\n const object = await response.json()\n return object\n}\n\n/**\n * Execute fetch and return object response, log if known error thrown, otherwise rethrow error.\n *\n * @param request - the request options object\n * @param request.url - The request url to query.\n * @param request.options - The fetch options.\n * @param request.timeout - Timeout to fail request\n * @param request.errorCodesToCatch - array of error codes for errors we want to catch in a particular context\n * @returns The fetch response JSON data or undefined (if error occurs).\n */\nexport async function fetchWithErrorHandling({\n url,\n options,\n timeout,\n errorCodesToCatch,\n}: {\n url: string\n options?: RequestInit\n timeout?: number\n errorCodesToCatch?: number[]\n}) {\n let result\n try {\n if (timeout) {\n result = Promise.race([\n await handleFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n } else {\n result = await handleFetch(url, options)\n }\n } catch (e) {\n logOrRethrowError(e, errorCodesToCatch)\n }\n return result\n}\n\n/**\n * Fetch that fails after timeout.\n *\n * @param url - Url to fetch.\n * @param options - Options to send with the request.\n * @param timeout - Timeout to fail request.\n * @returns Promise resolving the request.\n */\nexport async function timeoutFetch(url: string, options?: RequestInit, timeout = 500): Promise {\n return Promise.race([\n successfulFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n}\n\n/**\n * Utility method to log if error is a common fetch error and otherwise rethrow it.\n *\n * @param error - Caught error that we should either rethrow or log to console\n * @param codesToCatch - array of error codes for errors we want to catch and log in a particular context\n */\nfunction logOrRethrowError(error: any, codesToCatch: number[] = []) {\n if (!error) {\n return\n }\n\n const includesErrorCodeToCatch = codesToCatch.some(code =>\n error.message.includes(`Fetch failed with status '${code}'`),\n )\n\n if (\n error instanceof Error &&\n (includesErrorCodeToCatch || error.message.includes('Failed to fetch') || error === TIMEOUT_ERROR)\n ) {\n console.error(error)\n } else {\n throw error\n }\n}\n\nexport function generateHeader() {\n let random = function (start, end) {\n return (Math.random() * (end - start) + start) | 0\n }\n let getIp = function () {\n return `${random(1, 254)}.${random(1, 254)}.${random(1, 254)}.${random(1, 254)}`\n }\n let time = Date.now()\n let useragent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${\n (70 + Math.random() * 10) | 0\n }.0.4324.${(Math.random() * 100) | 0} Safari/537.36`\n const ip = getIp()\n return {\n 'Refresh-Token': (time -= 5000),\n 'Cache-Control': 'no-cache',\n 'User-Agent': useragent,\n 'X-Forwarded-For': ip,\n 'X-Real-IP': ip,\n 'Content-Type': 'application/json',\n }\n}\n\nexport const checkParamsNeeded = (...args) => {\n args.forEach(arg => {\n if (!arg) {\n throw new ZError(10, 'params mismatch')\n }\n })\n}\n\n/**\n * 生成 key1=val1&key2=val2的字符串\n * @param {object} data 需要处理的对象\n * @param {boolean} sort 是否按key生序重排\n * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接)\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function generateKVStr({\n data = {},\n sort = false,\n encode = false,\n ignoreNull = true,\n splitChar = '&',\n equalChar = '=',\n uri = '',\n}: {\n data?: any\n sort?: boolean\n encode?: boolean\n ignoreNull?: boolean\n splitChar?: string\n equalChar?: string\n uri?: string\n}) {\n const keys = Object.keys(data)\n sort && keys.sort()\n let result = ''\n let i = 0\n for (let key of keys) {\n if (ignoreNull && !data[key]) {\n continue\n }\n if (i++ > 0) result += splitChar\n if (encode) {\n result += `${key}${equalChar}${encodeURIComponent(data[key])}`\n } else {\n result += `${key}${equalChar}${data[key]}`\n }\n }\n if (uri) {\n const joinChar = uri.search(/\\?/) === -1 ? '?' : '&'\n result = uri + joinChar + result\n }\n return result\n}\n\n/**\n * 将key1=val&key2=val的字符串组装成对象\n * @param str key1=val&key2=val的字符串\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function keyValToObject(str: string, splitChar: string = '&', equalChar = '='): {} {\n let result: any = {}\n if (!str) {\n return result\n }\n let arrs = str.split(splitChar)\n for (let sub of arrs) {\n let subArr = sub.split(equalChar)\n result[subArr[0]] = subArr[1]\n }\n return result\n}\n","export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/dist/utils/net.util.d.cts b/dist/utils/net.util.d.cts index c552deb..b8b2f01 100644 --- a/dist/utils/net.util.d.cts +++ b/dist/utils/net.util.d.cts @@ -48,5 +48,29 @@ declare function generateHeader(): { 'Content-Type': string; }; declare const checkParamsNeeded: (...args: any[]) => void; +/** + * 生成 key1=val1&key2=val2的字符串 + * @param {object} data 需要处理的对象 + * @param {boolean} sort 是否按key生序重排 + * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接) + * @param splitChar 连接的字符, 默认是& + * @param equalChar = + */ +declare function generateKVStr({ data, sort, encode, ignoreNull, splitChar, equalChar, uri, }: { + data?: any; + sort?: boolean; + encode?: boolean; + ignoreNull?: boolean; + splitChar?: string; + equalChar?: string; + uri?: string; +}): string; +/** + * 将key1=val&key2=val的字符串组装成对象 + * @param str key1=val&key2=val的字符串 + * @param splitChar 连接的字符, 默认是& + * @param equalChar = + */ +declare function keyValToObject(str: string, splitChar?: string, equalChar?: string): {}; -export { checkParamsNeeded, fetchWithErrorHandling, generateHeader, handleFetch, successfulFetch, timeoutFetch }; +export { checkParamsNeeded, fetchWithErrorHandling, generateHeader, generateKVStr, handleFetch, keyValToObject, successfulFetch, timeoutFetch }; diff --git a/dist/utils/net.util.d.ts b/dist/utils/net.util.d.ts index c552deb..b8b2f01 100644 --- a/dist/utils/net.util.d.ts +++ b/dist/utils/net.util.d.ts @@ -48,5 +48,29 @@ declare function generateHeader(): { 'Content-Type': string; }; declare const checkParamsNeeded: (...args: any[]) => void; +/** + * 生成 key1=val1&key2=val2的字符串 + * @param {object} data 需要处理的对象 + * @param {boolean} sort 是否按key生序重排 + * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接) + * @param splitChar 连接的字符, 默认是& + * @param equalChar = + */ +declare function generateKVStr({ data, sort, encode, ignoreNull, splitChar, equalChar, uri, }: { + data?: any; + sort?: boolean; + encode?: boolean; + ignoreNull?: boolean; + splitChar?: string; + equalChar?: string; + uri?: string; +}): string; +/** + * 将key1=val&key2=val的字符串组装成对象 + * @param str key1=val&key2=val的字符串 + * @param splitChar 连接的字符, 默认是& + * @param equalChar = + */ +declare function keyValToObject(str: string, splitChar?: string, equalChar?: string): {}; -export { checkParamsNeeded, fetchWithErrorHandling, generateHeader, handleFetch, successfulFetch, timeoutFetch }; +export { checkParamsNeeded, fetchWithErrorHandling, generateHeader, generateKVStr, handleFetch, keyValToObject, successfulFetch, timeoutFetch }; diff --git a/dist/utils/net.util.js b/dist/utils/net.util.js index 4c7ed78..5f17998 100644 --- a/dist/utils/net.util.js +++ b/dist/utils/net.util.js @@ -94,11 +94,56 @@ var checkParamsNeeded = (...args) => { } }); }; +function generateKVStr({ + data = {}, + sort = false, + encode = false, + ignoreNull = true, + splitChar = "&", + equalChar = "=", + uri = "" +}) { + const keys = Object.keys(data); + sort && keys.sort(); + let result = ""; + let i = 0; + for (let key of keys) { + if (ignoreNull && !data[key]) { + continue; + } + if (i++ > 0) + result += splitChar; + if (encode) { + result += `${key}${equalChar}${encodeURIComponent(data[key])}`; + } else { + result += `${key}${equalChar}${data[key]}`; + } + } + if (uri) { + const joinChar = uri.search(/\?/) === -1 ? "?" : "&"; + result = uri + joinChar + result; + } + return result; +} +function keyValToObject(str, splitChar = "&", equalChar = "=") { + let result = {}; + if (!str) { + return result; + } + let arrs = str.split(splitChar); + for (let sub of arrs) { + let subArr = sub.split(equalChar); + result[subArr[0]] = subArr[1]; + } + return result; +} export { checkParamsNeeded, fetchWithErrorHandling, generateHeader, + generateKVStr, handleFetch, + keyValToObject, successfulFetch, timeoutFetch }; diff --git a/dist/utils/net.util.js.map b/dist/utils/net.util.js.map index 8de4905..efdddfb 100644 --- a/dist/utils/net.util.js.map +++ b/dist/utils/net.util.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/common/ZError.ts","../../src/utils/net.util.ts"],"sourcesContent":["\nexport class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","import { ZError } from 'common/ZError'\n\nconst TIMEOUT_ERROR = new Error('timeout')\n\nconst hexRe = /^[0-9A-Fa-f]+$/gu\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options)\n if (!response.ok) {\n throw new Error(`Fetch failed with status '${response.status}' for request '${request}'`)\n }\n return response\n}\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await successfulFetch(request, options)\n const object = await response.json()\n return object\n}\n\n/**\n * Execute fetch and return object response, log if known error thrown, otherwise rethrow error.\n *\n * @param request - the request options object\n * @param request.url - The request url to query.\n * @param request.options - The fetch options.\n * @param request.timeout - Timeout to fail request\n * @param request.errorCodesToCatch - array of error codes for errors we want to catch in a particular context\n * @returns The fetch response JSON data or undefined (if error occurs).\n */\nexport async function fetchWithErrorHandling({\n url,\n options,\n timeout,\n errorCodesToCatch,\n}: {\n url: string\n options?: RequestInit\n timeout?: number\n errorCodesToCatch?: number[]\n}) {\n let result\n try {\n if (timeout) {\n result = Promise.race([\n await handleFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n } else {\n result = await handleFetch(url, options)\n }\n } catch (e) {\n logOrRethrowError(e, errorCodesToCatch)\n }\n return result\n}\n\n/**\n * Fetch that fails after timeout.\n *\n * @param url - Url to fetch.\n * @param options - Options to send with the request.\n * @param timeout - Timeout to fail request.\n * @returns Promise resolving the request.\n */\nexport async function timeoutFetch(url: string, options?: RequestInit, timeout = 500): Promise {\n return Promise.race([\n successfulFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n}\n\n/**\n * Utility method to log if error is a common fetch error and otherwise rethrow it.\n *\n * @param error - Caught error that we should either rethrow or log to console\n * @param codesToCatch - array of error codes for errors we want to catch and log in a particular context\n */\nfunction logOrRethrowError(error: any, codesToCatch: number[] = []) {\n if (!error) {\n return\n }\n\n const includesErrorCodeToCatch = codesToCatch.some(code =>\n error.message.includes(`Fetch failed with status '${code}'`),\n )\n\n if (\n error instanceof Error &&\n (includesErrorCodeToCatch || error.message.includes('Failed to fetch') || error === TIMEOUT_ERROR)\n ) {\n console.error(error)\n } else {\n throw error\n }\n}\n\nexport function generateHeader() {\n let random = function (start, end) {\n return (Math.random() * (end - start) + start) | 0\n }\n let getIp = function () {\n return `${random(1, 254)}.${random(1, 254)}.${random(1, 254)}.${random(1, 254)}`\n }\n let time = Date.now()\n let useragent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${\n (70 + Math.random() * 10) | 0\n }.0.4324.${(Math.random() * 100) | 0} Safari/537.36`\n const ip = getIp()\n return {\n 'Refresh-Token': (time -= 5000),\n 'Cache-Control': 'no-cache',\n 'User-Agent': useragent,\n 'X-Forwarded-For': ip,\n 'X-Real-IP': ip,\n 'Content-Type': 'application/json',\n }\n}\n\nexport const checkParamsNeeded = (...args) => {\n args.forEach(arg => {\n if (!arg) {\n throw new ZError(10, 'params mismatch')\n }\n })\n}\n"],"mappings":";AACO,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;;;ACTA,IAAM,gBAAgB,IAAI,MAAM,SAAS;AAWzC,eAAsB,gBAAgB,SAAiB,SAAuB;AAC5E,QAAM,WAAW,MAAM,MAAM,SAAS,OAAO;AAC7C,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,kBAAkB,OAAO,GAAG;AAAA,EAC1F;AACA,SAAO;AACT;AASA,eAAsB,YAAY,SAAiB,SAAuB;AACxE,QAAM,WAAW,MAAM,gBAAgB,SAAS,OAAO;AACvD,QAAM,SAAS,MAAM,SAAS,KAAK;AACnC,SAAO;AACT;AAYA,eAAsB,uBAAuB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI;AACJ,MAAI;AACF,QAAI,SAAS;AACX,eAAS,QAAQ,KAAK;AAAA,QACpB,MAAM,YAAY,KAAK,OAAO;AAAA,QAC9B,IAAI;AAAA,UAAkB,CAAC,GAAG,WACxB,WAAW,MAAM;AACf,mBAAO,aAAa;AAAA,UACtB,GAAG,OAAO;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,eAAS,MAAM,YAAY,KAAK,OAAO;AAAA,IACzC;AAAA,EACF,SAAS,GAAG;AACV,sBAAkB,GAAG,iBAAiB;AAAA,EACxC;AACA,SAAO;AACT;AAUA,eAAsB,aAAa,KAAa,SAAuB,UAAU,KAAwB;AACvG,SAAO,QAAQ,KAAK;AAAA,IAClB,gBAAgB,KAAK,OAAO;AAAA,IAC5B,IAAI;AAAA,MAAkB,CAAC,GAAG,WACxB,WAAW,MAAM;AACf,eAAO,aAAa;AAAA,MACtB,GAAG,OAAO;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAQA,SAAS,kBAAkB,OAAY,eAAyB,CAAC,GAAG;AAClE,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,QAAM,2BAA2B,aAAa;AAAA,IAAK,UACjD,MAAM,QAAQ,SAAS,6BAA6B,IAAI,GAAG;AAAA,EAC7D;AAEA,MACE,iBAAiB,UAChB,4BAA4B,MAAM,QAAQ,SAAS,iBAAiB,KAAK,UAAU,gBACpF;AACA,YAAQ,MAAM,KAAK;AAAA,EACrB,OAAO;AACL,UAAM;AAAA,EACR;AACF;AAEO,SAAS,iBAAiB;AAC/B,MAAI,SAAS,SAAU,OAAO,KAAK;AACjC,WAAQ,KAAK,OAAO,KAAK,MAAM,SAAS,QAAS;AAAA,EACnD;AACA,MAAI,QAAQ,WAAY;AACtB,WAAO,GAAG,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC;AAAA,EAChF;AACA,MAAI,OAAO,KAAK,IAAI;AACpB,MAAI,YAAY,gGACb,KAAK,KAAK,OAAO,IAAI,KAAM,CAC9B,WAAY,KAAK,OAAO,IAAI,MAAO,CAAC;AACpC,QAAM,KAAK,MAAM;AACjB,SAAO;AAAA,IACL,iBAAkB,QAAQ;AAAA,IAC1B,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AACF;AAEO,IAAM,oBAAoB,IAAI,SAAS;AAC5C,OAAK,QAAQ,SAAO;AAClB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,OAAO,IAAI,iBAAiB;AAAA,IACxC;AAAA,EACF,CAAC;AACH;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/common/ZError.ts","../../src/utils/net.util.ts"],"sourcesContent":["export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","import { ZError } from 'common/ZError'\n\nconst TIMEOUT_ERROR = new Error('timeout')\n\nconst hexRe = /^[0-9A-Fa-f]+$/gu\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options)\n if (!response.ok) {\n throw new Error(`Fetch failed with status '${response.status}' for request '${request}'`)\n }\n return response\n}\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await successfulFetch(request, options)\n const object = await response.json()\n return object\n}\n\n/**\n * Execute fetch and return object response, log if known error thrown, otherwise rethrow error.\n *\n * @param request - the request options object\n * @param request.url - The request url to query.\n * @param request.options - The fetch options.\n * @param request.timeout - Timeout to fail request\n * @param request.errorCodesToCatch - array of error codes for errors we want to catch in a particular context\n * @returns The fetch response JSON data or undefined (if error occurs).\n */\nexport async function fetchWithErrorHandling({\n url,\n options,\n timeout,\n errorCodesToCatch,\n}: {\n url: string\n options?: RequestInit\n timeout?: number\n errorCodesToCatch?: number[]\n}) {\n let result\n try {\n if (timeout) {\n result = Promise.race([\n await handleFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n } else {\n result = await handleFetch(url, options)\n }\n } catch (e) {\n logOrRethrowError(e, errorCodesToCatch)\n }\n return result\n}\n\n/**\n * Fetch that fails after timeout.\n *\n * @param url - Url to fetch.\n * @param options - Options to send with the request.\n * @param timeout - Timeout to fail request.\n * @returns Promise resolving the request.\n */\nexport async function timeoutFetch(url: string, options?: RequestInit, timeout = 500): Promise {\n return Promise.race([\n successfulFetch(url, options),\n new Promise((_, reject) =>\n setTimeout(() => {\n reject(TIMEOUT_ERROR)\n }, timeout),\n ),\n ])\n}\n\n/**\n * Utility method to log if error is a common fetch error and otherwise rethrow it.\n *\n * @param error - Caught error that we should either rethrow or log to console\n * @param codesToCatch - array of error codes for errors we want to catch and log in a particular context\n */\nfunction logOrRethrowError(error: any, codesToCatch: number[] = []) {\n if (!error) {\n return\n }\n\n const includesErrorCodeToCatch = codesToCatch.some(code =>\n error.message.includes(`Fetch failed with status '${code}'`),\n )\n\n if (\n error instanceof Error &&\n (includesErrorCodeToCatch || error.message.includes('Failed to fetch') || error === TIMEOUT_ERROR)\n ) {\n console.error(error)\n } else {\n throw error\n }\n}\n\nexport function generateHeader() {\n let random = function (start, end) {\n return (Math.random() * (end - start) + start) | 0\n }\n let getIp = function () {\n return `${random(1, 254)}.${random(1, 254)}.${random(1, 254)}.${random(1, 254)}`\n }\n let time = Date.now()\n let useragent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${\n (70 + Math.random() * 10) | 0\n }.0.4324.${(Math.random() * 100) | 0} Safari/537.36`\n const ip = getIp()\n return {\n 'Refresh-Token': (time -= 5000),\n 'Cache-Control': 'no-cache',\n 'User-Agent': useragent,\n 'X-Forwarded-For': ip,\n 'X-Real-IP': ip,\n 'Content-Type': 'application/json',\n }\n}\n\nexport const checkParamsNeeded = (...args) => {\n args.forEach(arg => {\n if (!arg) {\n throw new ZError(10, 'params mismatch')\n }\n })\n}\n\n/**\n * 生成 key1=val1&key2=val2的字符串\n * @param {object} data 需要处理的对象\n * @param {boolean} sort 是否按key生序重排\n * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接)\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function generateKVStr({\n data = {},\n sort = false,\n encode = false,\n ignoreNull = true,\n splitChar = '&',\n equalChar = '=',\n uri = '',\n}: {\n data?: any\n sort?: boolean\n encode?: boolean\n ignoreNull?: boolean\n splitChar?: string\n equalChar?: string\n uri?: string\n}) {\n const keys = Object.keys(data)\n sort && keys.sort()\n let result = ''\n let i = 0\n for (let key of keys) {\n if (ignoreNull && !data[key]) {\n continue\n }\n if (i++ > 0) result += splitChar\n if (encode) {\n result += `${key}${equalChar}${encodeURIComponent(data[key])}`\n } else {\n result += `${key}${equalChar}${data[key]}`\n }\n }\n if (uri) {\n const joinChar = uri.search(/\\?/) === -1 ? '?' : '&'\n result = uri + joinChar + result\n }\n return result\n}\n\n/**\n * 将key1=val&key2=val的字符串组装成对象\n * @param str key1=val&key2=val的字符串\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function keyValToObject(str: string, splitChar: string = '&', equalChar = '='): {} {\n let result: any = {}\n if (!str) {\n return result\n }\n let arrs = str.split(splitChar)\n for (let sub of arrs) {\n let subArr = sub.split(equalChar)\n result[subArr[0]] = subArr[1]\n }\n return result\n}\n"],"mappings":";AAAO,IAAM,SAAN,MAA8B;AAAA,EAMnC,YAAY,YAAoB,SAAiB;AAC/C,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACjB;AACF;;;ACRA,IAAM,gBAAgB,IAAI,MAAM,SAAS;AAWzC,eAAsB,gBAAgB,SAAiB,SAAuB;AAC5E,QAAM,WAAW,MAAM,MAAM,SAAS,OAAO;AAC7C,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,kBAAkB,OAAO,GAAG;AAAA,EAC1F;AACA,SAAO;AACT;AASA,eAAsB,YAAY,SAAiB,SAAuB;AACxE,QAAM,WAAW,MAAM,gBAAgB,SAAS,OAAO;AACvD,QAAM,SAAS,MAAM,SAAS,KAAK;AACnC,SAAO;AACT;AAYA,eAAsB,uBAAuB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI;AACJ,MAAI;AACF,QAAI,SAAS;AACX,eAAS,QAAQ,KAAK;AAAA,QACpB,MAAM,YAAY,KAAK,OAAO;AAAA,QAC9B,IAAI;AAAA,UAAkB,CAAC,GAAG,WACxB,WAAW,MAAM;AACf,mBAAO,aAAa;AAAA,UACtB,GAAG,OAAO;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,eAAS,MAAM,YAAY,KAAK,OAAO;AAAA,IACzC;AAAA,EACF,SAAS,GAAG;AACV,sBAAkB,GAAG,iBAAiB;AAAA,EACxC;AACA,SAAO;AACT;AAUA,eAAsB,aAAa,KAAa,SAAuB,UAAU,KAAwB;AACvG,SAAO,QAAQ,KAAK;AAAA,IAClB,gBAAgB,KAAK,OAAO;AAAA,IAC5B,IAAI;AAAA,MAAkB,CAAC,GAAG,WACxB,WAAW,MAAM;AACf,eAAO,aAAa;AAAA,MACtB,GAAG,OAAO;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAQA,SAAS,kBAAkB,OAAY,eAAyB,CAAC,GAAG;AAClE,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,QAAM,2BAA2B,aAAa;AAAA,IAAK,UACjD,MAAM,QAAQ,SAAS,6BAA6B,IAAI,GAAG;AAAA,EAC7D;AAEA,MACE,iBAAiB,UAChB,4BAA4B,MAAM,QAAQ,SAAS,iBAAiB,KAAK,UAAU,gBACpF;AACA,YAAQ,MAAM,KAAK;AAAA,EACrB,OAAO;AACL,UAAM;AAAA,EACR;AACF;AAEO,SAAS,iBAAiB;AAC/B,MAAI,SAAS,SAAU,OAAO,KAAK;AACjC,WAAQ,KAAK,OAAO,KAAK,MAAM,SAAS,QAAS;AAAA,EACnD;AACA,MAAI,QAAQ,WAAY;AACtB,WAAO,GAAG,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC;AAAA,EAChF;AACA,MAAI,OAAO,KAAK,IAAI;AACpB,MAAI,YAAY,gGACb,KAAK,KAAK,OAAO,IAAI,KAAM,CAC9B,WAAY,KAAK,OAAO,IAAI,MAAO,CAAC;AACpC,QAAM,KAAK,MAAM;AACjB,SAAO;AAAA,IACL,iBAAkB,QAAQ;AAAA,IAC1B,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AACF;AAEO,IAAM,oBAAoB,IAAI,SAAS;AAC5C,OAAK,QAAQ,SAAO;AAClB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,OAAO,IAAI,iBAAiB;AAAA,IACxC;AAAA,EACF,CAAC;AACH;AAUO,SAAS,cAAc;AAAA,EAC5B,OAAO,CAAC;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,MAAM;AACR,GAQG;AACD,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,UAAQ,KAAK,KAAK;AAClB,MAAI,SAAS;AACb,MAAI,IAAI;AACR,WAAS,OAAO,MAAM;AACpB,QAAI,cAAc,CAAC,KAAK,GAAG,GAAG;AAC5B;AAAA,IACF;AACA,QAAI,MAAM;AAAG,gBAAU;AACvB,QAAI,QAAQ;AACV,gBAAU,GAAG,GAAG,GAAG,SAAS,GAAG,mBAAmB,KAAK,GAAG,CAAC,CAAC;AAAA,IAC9D,OAAO;AACL,gBAAU,GAAG,GAAG,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,KAAK;AACP,UAAM,WAAW,IAAI,OAAO,IAAI,MAAM,KAAK,MAAM;AACjD,aAAS,MAAM,WAAW;AAAA,EAC5B;AACA,SAAO;AACT;AAQO,SAAS,eAAe,KAAa,YAAoB,KAAK,YAAY,KAAS;AACxF,MAAI,SAAc,CAAC;AACnB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI,OAAO,IAAI,MAAM,SAAS;AAC9B,WAAS,OAAO,MAAM;AACpB,QAAI,SAAS,IAAI,MAAM,SAAS;AAChC,WAAO,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;","names":[]} \ No newline at end of file diff --git a/dist/utils/security.util.cjs b/dist/utils/security.util.cjs index 4df79c1..b404c4b 100644 --- a/dist/utils/security.util.cjs +++ b/dist/utils/security.util.cjs @@ -31,21 +31,49 @@ var security_util_exports = {}; __export(security_util_exports, { aesDecrypt: () => aesDecrypt, aesEncrypt: () => aesEncrypt, - base58ToHex: () => base58ToHex, checkSign: () => checkSign, createSign: () => createSign, genRandomString: () => genRandomString, - hexToBase32: () => hexToBase32, - hexToBase58: () => hexToBase58, hmac: () => hmac, hmacSha256: () => hmacSha256, md5: () => md5, sha1: () => sha1, - sha512: () => sha512 + sha3_256: () => sha3_256, + sha512: () => sha512, + shortUuid: () => shortUuid, + uuid: () => uuid }); module.exports = __toCommonJS(security_util_exports); var import_crypto = __toESM(require("crypto"), 1); var import_crypto_js = __toESM(require("crypto-js"), 1); + +// src/utils/string.util.ts +var reNormalUUID = /^[0-9a-fA-F-]{36}$/; +var reLongUUID = /^[0-9a-fA-F]{32}$/; +var n = /-/g; +function compressUuid(e, t = false) { + if (reNormalUUID.test(e)) { + e = e.replace(n, ""); + } else if (!reLongUUID.test(e)) { + return e; + } + var r = true === t ? 2 : 5; + return compressHex(e, r); +} +var CHARS_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +function compressHex(e, r) { + var i, n2 = e.length; + i = void 0 !== r ? r : n2 % 3; + for (var s = e.slice(0, i), o = []; i < n2; ) { + var u = parseInt(e[i], 16), a = parseInt(e[i + 1], 16), c = parseInt(e[i + 2], 16); + o.push(CHARS_BASE64[u << 2 | a >> 2]); + o.push(CHARS_BASE64[(3 & a) << 4 | c]); + i += 3; + } + return s + o.join(""); +} + +// src/utils/security.util.ts function hmac(input, key, out) { return out ? import_crypto.default.createHmac("sha1", key).update(input).digest(out) : import_crypto.default.createHmac("sha1", key).update(input).digest("hex"); } @@ -122,57 +150,32 @@ var aesDecrypt = (encryptedDataHexStr, key) => { }); return decryptedData.toString(import_crypto_js.default.enc.Utf8); }; -var base58Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; -var hexToBase58 = (hexString) => { - const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); - let base58String = ""; - let num = BigInt("0x" + hexString); - while (num > BigInt(0)) { - const remainder = num % BigInt(58); - num = num / BigInt(58); - base58String = base58Alphabet[Number(remainder)] + base58String; - } - return base58String; -}; -var base58ToHex = (base58String) => { - const base58Length = base58String.length; - let num = BigInt(0); - let leadingZeros = 0; - for (let i = 0; i < base58Length; i++) { - const charIndex = base58Alphabet.indexOf(base58String[i]); - if (charIndex === -1) { - throw new Error("Invalid Base58 string"); - } - num = num * BigInt(58) + BigInt(charIndex); - } - return num.toString(16); -}; -var hexToBase32 = (hexString) => { - const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); - const base32Alphabet = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; - let base32String = ""; - let num = BigInt("0x" + hexString); - while (num > BigInt(0)) { - const remainder = num % BigInt(32); - num = num / BigInt(32); - base32String = base32Alphabet[Number(remainder)] + base32String; - } - return base32String; -}; +function sha3_256(str) { + let hash = import_crypto.default.createHash("sha3-256"); + hash.update(str); + return hash.digest("hex"); +} +function uuid() { + return import_crypto.default.randomUUID(); +} +function shortUuid() { + let uid = uuid(); + return compressUuid(uid); +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { aesDecrypt, aesEncrypt, - base58ToHex, checkSign, createSign, genRandomString, - hexToBase32, - hexToBase58, hmac, hmacSha256, md5, sha1, - sha512 + sha3_256, + sha512, + shortUuid, + uuid }); //# sourceMappingURL=security.util.cjs.map \ No newline at end of file diff --git a/dist/utils/security.util.cjs.map b/dist/utils/security.util.cjs.map index 133267d..f1ca7e4 100644 --- a/dist/utils/security.util.cjs.map +++ b/dist/utils/security.util.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/security.util.ts"],"sourcesContent":["import crypto from 'crypto'\nimport CryptoJS from 'crypto-js'\n\nexport function hmac(input, key, out) {\n return out\n ? crypto.createHmac('sha1', key).update(input).digest(out)\n : crypto.createHmac('sha1', key).update(input).digest('hex')\n}\n\nexport function genRandomString(length) {\n return crypto\n .randomBytes(Math.ceil(length / 2))\n .toString('hex')\n .slice(0, length)\n}\n\nexport function sha512(password: string, salt: string) {\n let hash = crypto.createHmac('sha512', salt)\n hash.update(password)\n let value = hash.digest('hex')\n return {\n salt: salt,\n passwordHash: value,\n }\n}\n\nexport function sha1(str: string) {\n const md5sum = crypto.createHash('sha1')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function hmacSha256(str: string, key: any) {\n const md5sum = crypto.createHmac('sha256', key)\n md5sum.update(str)\n const data = md5sum.digest('hex')\n console.log(`HmacSHA256 rawContent is [${str}], key is [${key}], hash result is [${data}]`)\n return data\n}\n\nexport function md5(str: string) {\n const md5sum = crypto.createHash('md5')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function createSign(secretKey: string, paramStr: string, timestamp: number) {\n paramStr = `${paramStr}:${timestamp}:${secretKey}`\n return sha1(paramStr)\n}\n\nexport function checkSign({\n secretKey,\n data,\n sign,\n signKeys,\n}: {\n secretKey: string\n data: {}\n sign: string\n signKeys: string[]\n}) {\n signKeys.sort()\n let signStr = ''\n for (let key of signKeys) {\n if (signStr.length > 0) {\n signStr += '&'\n }\n signStr += `${key}=${data[key]}`\n }\n console.log(signStr)\n let sign1 = hmacSha256(signStr, secretKey)\n return sign1 === sign\n}\n\n// export function aesDecrypt(encrypted: string, key: string) {\n// let bytes = aes.decrypt(encrypted, key)\n// var originalText = bytes.toString(enc.Utf8);\n// return originalText\n// }\n\nexport const aesEncrypt = (plaintText, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedData = CryptoJS.AES.encrypt(plaintText, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return encryptedData.toString(CryptoJS.format.Hex)\n}\n\nexport const aesDecrypt = (encryptedDataHexStr, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedHex = CryptoJS.enc.Hex.parse(encryptedDataHexStr)\n let encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHex)\n\n var decryptedData = CryptoJS.AES.decrypt(encryptedBase64, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return decryptedData.toString(CryptoJS.enc.Utf8)\n}\n\nconst base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nexport const hexToBase58 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n let base58String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(58)\n num = num / BigInt(58)\n base58String = base58Alphabet[Number(remainder)] + base58String\n }\n\n return base58String\n}\n\nexport const base58ToHex = (base58String: string) => {\n const base58Length = base58String.length\n let num = BigInt(0)\n let leadingZeros = 0\n for (let i = 0; i < base58Length; i++) {\n const charIndex = base58Alphabet.indexOf(base58String[i])\n if (charIndex === -1) {\n throw new Error('Invalid Base58 string')\n }\n\n num = num * BigInt(58) + BigInt(charIndex)\n }\n return num.toString(16)\n}\n\nexport const hexToBase32 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'\n let base32String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(32)\n num = num / BigInt(32)\n base32String = base32Alphabet[Number(remainder)] + base32String\n }\n\n return base32String\n}\n"],"mappings":"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","names":["crypto","CryptoJS"]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/security.util.ts","../../src/utils/string.util.ts"],"sourcesContent":["import crypto from 'crypto'\nimport CryptoJS from 'crypto-js'\nimport { compressUuid } from './string.util'\n\nexport function hmac(input, key, out) {\n return out\n ? crypto.createHmac('sha1', key).update(input).digest(out)\n : crypto.createHmac('sha1', key).update(input).digest('hex')\n}\n\nexport function genRandomString(length) {\n return crypto\n .randomBytes(Math.ceil(length / 2))\n .toString('hex')\n .slice(0, length)\n}\n\nexport function sha512(password: string, salt: string) {\n let hash = crypto.createHmac('sha512', salt)\n hash.update(password)\n let value = hash.digest('hex')\n return {\n salt: salt,\n passwordHash: value,\n }\n}\n\nexport function sha1(str: string) {\n const md5sum = crypto.createHash('sha1')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function hmacSha256(str: string, key: any) {\n const md5sum = crypto.createHmac('sha256', key)\n md5sum.update(str)\n const data = md5sum.digest('hex')\n console.log(`HmacSHA256 rawContent is [${str}], key is [${key}], hash result is [${data}]`)\n return data\n}\n\nexport function md5(str: string) {\n const md5sum = crypto.createHash('md5')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function createSign(secretKey: string, paramStr: string, timestamp: number) {\n paramStr = `${paramStr}:${timestamp}:${secretKey}`\n return sha1(paramStr)\n}\n\nexport function checkSign({\n secretKey,\n data,\n sign,\n signKeys,\n}: {\n secretKey: string\n data: {}\n sign: string\n signKeys: string[]\n}) {\n signKeys.sort()\n let signStr = ''\n for (let key of signKeys) {\n if (signStr.length > 0) {\n signStr += '&'\n }\n signStr += `${key}=${data[key]}`\n }\n console.log(signStr)\n let sign1 = hmacSha256(signStr, secretKey)\n return sign1 === sign\n}\n\n// export function aesDecrypt(encrypted: string, key: string) {\n// let bytes = aes.decrypt(encrypted, key)\n// var originalText = bytes.toString(enc.Utf8);\n// return originalText\n// }\n\nexport const aesEncrypt = (plaintText, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedData = CryptoJS.AES.encrypt(plaintText, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return encryptedData.toString(CryptoJS.format.Hex)\n}\n\nexport const aesDecrypt = (encryptedDataHexStr, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedHex = CryptoJS.enc.Hex.parse(encryptedDataHexStr)\n let encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHex)\n\n var decryptedData = CryptoJS.AES.decrypt(encryptedBase64, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return decryptedData.toString(CryptoJS.enc.Utf8)\n}\n\n\n\nexport function sha3_256(str: string) {\n let hash = crypto.createHash('sha3-256')\n hash.update(str)\n return hash.digest('hex')\n}\n\nexport function uuid() {\n return crypto.randomUUID()\n}\n\nexport function shortUuid() {\n let uid = uuid()\n return compressUuid(uid)\n}","\n/**\n * 判断传入的值是否为true\n * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false\n * @return {boolean}\n */\nexport function isTrue(obj) {\n return (\n obj === 'true' ||\n obj === 'TRUE' ||\n obj === 'True' ||\n obj === 'on' ||\n obj === 'ON' ||\n obj === true ||\n obj === 1 ||\n obj === '1' ||\n obj === 'YES' ||\n obj === 'yes'\n )\n}\n\n/**\n * 验证ObjectId格式是否正确\n * @param {string} id\n * @return {boolean}\n */\nexport function isObjectId(id: string): boolean {\n //mongoose.Types.ObjectId.isValid(id)\n return /^[a-fA-F0-9]{24}$/.test(id)\n}\n\n/**\n * 10进制 -> 62进制\n * @param {string | number} number\n * @return {string}\n */\nexport function string10to62(number: string | number) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split('')\n const radix = chars.length\n let qutient = +number\n const arr = []\n do {\n const mod = qutient % radix\n qutient = (qutient - mod) / radix\n arr.unshift(chars[mod])\n } while (qutient)\n return arr.join('')\n}\n\n/**\n * 62进制 -> 10 进制\n * @param {string} numberCode\n * @return {number}\n */\nexport function string62to10(numberCode: string) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n const radix = chars.length\n numberCode = numberCode + ''\n const len = numberCode.length\n let i = 0\n let originNumber = 0\n while (i < len) {\n originNumber += Math.pow(radix, i++) * (chars.indexOf(numberCode.charAt(len - i)) || 0)\n }\n return originNumber\n}\n\nconst base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nexport const hexToBase58 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n let base58String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(58)\n num = num / BigInt(58)\n base58String = base58Alphabet[Number(remainder)] + base58String\n }\n\n return base58String\n}\n\nexport const base58ToHex = (base58String: string) => {\n const base58Length = base58String.length\n let num = BigInt(0)\n let leadingZeros = 0\n for (let i = 0; i < base58Length; i++) {\n const charIndex = base58Alphabet.indexOf(base58String[i])\n if (charIndex === -1) {\n throw new Error('Invalid Base58 string')\n }\n\n num = num * BigInt(58) + BigInt(charIndex)\n }\n return num.toString(16)\n}\n\nexport const hexToBase32 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'\n let base32String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(32)\n num = num / BigInt(32)\n base32String = base32Alphabet[Number(remainder)] + base32String\n }\n\n return base32String\n}\n\n\nconst reNormalUUID = /^[0-9a-fA-F-]{36}$/\nconst reLongUUID = /^[0-9a-fA-F]{32}$/\nconst reShortUUID = /^[0-9a-zA-Z+/]{22,23}$/\nconst n = /-/g\n\nexport function compressUuid(e: string, t: boolean = false) {\n if (reNormalUUID.test(e)) {\n e = e.replace(n, '')\n } else if (!reLongUUID.test(e)) {\n return e\n }\n var r = !0 === t ? 2 : 5\n return compressHex(e, r)\n}\n\nconst CHARS_BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nexport function compressHex(e: string, r: number) {\n var i,\n n = e.length\n i = void 0 !== r ? r : n % 3\n for (var s = e.slice(0, i), o = []; i < n; ) {\n var u = parseInt(e[i], 16),\n a = parseInt(e[i + 1], 16),\n c = parseInt(e[i + 2], 16)\n o.push(CHARS_BASE64[(u << 2) | (a >> 2)])\n o.push(CHARS_BASE64[((3 & a) << 4) | c])\n i += 3\n }\n return s + o.join('')\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AACnB,uBAAqB;;;ACiHrB,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAM,IAAI;AAEH,SAAS,aAAa,GAAW,IAAa,OAAO;AAC1D,MAAI,aAAa,KAAK,CAAC,GAAG;AACxB,QAAI,EAAE,QAAQ,GAAG,EAAE;AAAA,EACrB,WAAW,CAAC,WAAW,KAAK,CAAC,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,IAAI,SAAO,IAAI,IAAI;AACvB,SAAO,YAAY,GAAG,CAAC;AACzB;AAEA,IAAM,eAAe;AACd,SAAS,YAAY,GAAW,GAAW;AAChD,MAAI,GACFA,KAAI,EAAE;AACR,MAAI,WAAW,IAAI,IAAIA,KAAI;AAC3B,WAAS,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAIA,MAAK;AAC3C,QAAI,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,GACvB,IAAI,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GACzB,IAAI,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AAC3B,MAAE,KAAK,aAAc,KAAK,IAAM,KAAK,CAAE,CAAC;AACxC,MAAE,KAAK,cAAe,IAAI,MAAM,IAAK,CAAC,CAAC;AACvC,SAAK;AAAA,EACP;AACA,SAAO,IAAI,EAAE,KAAK,EAAE;AACtB;;;AD3IO,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,SAAO,MACH,cAAAC,QAAO,WAAW,QAAQ,GAAG,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,IACvD,cAAAA,QAAO,WAAW,QAAQ,GAAG,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAC/D;AAEO,SAAS,gBAAgB,QAAQ;AACtC,SAAO,cAAAA,QACJ,YAAY,KAAK,KAAK,SAAS,CAAC,CAAC,EACjC,SAAS,KAAK,EACd,MAAM,GAAG,MAAM;AACpB;AAEO,SAAS,OAAO,UAAkB,MAAc;AACrD,MAAI,OAAO,cAAAA,QAAO,WAAW,UAAU,IAAI;AAC3C,OAAK,OAAO,QAAQ;AACpB,MAAI,QAAQ,KAAK,OAAO,KAAK;AAC7B,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,KAAK,KAAa;AAChC,QAAM,SAAS,cAAAA,QAAO,WAAW,MAAM;AACvC,SAAO,OAAO,GAAG;AACjB,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO;AACT;AAEO,SAAS,WAAW,KAAa,KAAU;AAChD,QAAM,SAAS,cAAAA,QAAO,WAAW,UAAU,GAAG;AAC9C,SAAO,OAAO,GAAG;AACjB,QAAM,OAAO,OAAO,OAAO,KAAK;AAChC,UAAQ,IAAI,6BAA6B,GAAG,cAAc,GAAG,sBAAsB,IAAI,GAAG;AAC1F,SAAO;AACT;AAEO,SAAS,IAAI,KAAa;AAC/B,QAAM,SAAS,cAAAA,QAAO,WAAW,KAAK;AACtC,SAAO,OAAO,GAAG;AACjB,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO;AACT;AAEO,SAAS,WAAW,WAAmB,UAAkB,WAAmB;AACjF,aAAW,GAAG,QAAQ,IAAI,SAAS,IAAI,SAAS;AAChD,SAAO,KAAK,QAAQ;AACtB;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,WAAS,KAAK;AACd,MAAI,UAAU;AACd,WAAS,OAAO,UAAU;AACxB,QAAI,QAAQ,SAAS,GAAG;AACtB,iBAAW;AAAA,IACb;AACA,eAAW,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;AAAA,EAChC;AACA,UAAQ,IAAI,OAAO;AACnB,MAAI,QAAQ,WAAW,SAAS,SAAS;AACzC,SAAO,UAAU;AACnB;AAQO,IAAM,aAAa,CAAC,YAAY,QAAQ;AAC7C,QAAM,iBAAAC,QAAS,KAAK,GAAG,EAAE,SAAS,EAAE,UAAU,GAAG,EAAE;AACnD,QAAM,iBAAAA,QAAS,IAAI,OAAO,MAAM,GAAG;AACnC,MAAI,gBAAgB,iBAAAA,QAAS,IAAI,QAAQ,YAAY,KAAK;AAAA,IACxD,MAAM,iBAAAA,QAAS,KAAK;AAAA,IACpB,SAAS,iBAAAA,QAAS,IAAI;AAAA,EACxB,CAAC;AAED,SAAO,cAAc,SAAS,iBAAAA,QAAS,OAAO,GAAG;AACnD;AAEO,IAAM,aAAa,CAAC,qBAAqB,QAAQ;AACtD,QAAM,iBAAAA,QAAS,KAAK,GAAG,EAAE,SAAS,EAAE,UAAU,GAAG,EAAE;AACnD,QAAM,iBAAAA,QAAS,IAAI,OAAO,MAAM,GAAG;AACnC,MAAI,eAAe,iBAAAA,QAAS,IAAI,IAAI,MAAM,mBAAmB;AAC7D,MAAI,kBAAkB,iBAAAA,QAAS,IAAI,OAAO,UAAU,YAAY;AAEhE,MAAI,gBAAgB,iBAAAA,QAAS,IAAI,QAAQ,iBAAiB,KAAK;AAAA,IAC7D,MAAM,iBAAAA,QAAS,KAAK;AAAA,IACpB,SAAS,iBAAAA,QAAS,IAAI;AAAA,EACxB,CAAC;AAED,SAAO,cAAc,SAAS,iBAAAA,QAAS,IAAI,IAAI;AACjD;AAIO,SAAS,SAAS,KAAa;AACpC,MAAI,OAAO,cAAAD,QAAO,WAAW,UAAU;AACvC,OAAK,OAAO,GAAG;AACf,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,OAAO;AACrB,SAAO,cAAAA,QAAO,WAAW;AAC3B;AAEO,SAAS,YAAY;AAC1B,MAAI,MAAM,KAAK;AACf,SAAO,aAAa,GAAG;AACzB;","names":["n","crypto","CryptoJS"]} \ No newline at end of file diff --git a/dist/utils/security.util.d.cts b/dist/utils/security.util.d.cts index b69cdd0..1eda548 100644 --- a/dist/utils/security.util.d.cts +++ b/dist/utils/security.util.d.cts @@ -16,8 +16,8 @@ declare function checkSign({ secretKey, data, sign, signKeys, }: { }): boolean; declare const aesEncrypt: (plaintText: any, key: any) => any; declare const aesDecrypt: (encryptedDataHexStr: any, key: any) => any; -declare const hexToBase58: (hexString: string) => string; -declare const base58ToHex: (base58String: string) => string; -declare const hexToBase32: (hexString: string) => string; +declare function sha3_256(str: string): string; +declare function uuid(): `${string}-${string}-${string}-${string}-${string}`; +declare function shortUuid(): string; -export { aesDecrypt, aesEncrypt, base58ToHex, checkSign, createSign, genRandomString, hexToBase32, hexToBase58, hmac, hmacSha256, md5, sha1, sha512 }; +export { aesDecrypt, aesEncrypt, checkSign, createSign, genRandomString, hmac, hmacSha256, md5, sha1, sha3_256, sha512, shortUuid, uuid }; diff --git a/dist/utils/security.util.d.ts b/dist/utils/security.util.d.ts index b69cdd0..1eda548 100644 --- a/dist/utils/security.util.d.ts +++ b/dist/utils/security.util.d.ts @@ -16,8 +16,8 @@ declare function checkSign({ secretKey, data, sign, signKeys, }: { }): boolean; declare const aesEncrypt: (plaintText: any, key: any) => any; declare const aesDecrypt: (encryptedDataHexStr: any, key: any) => any; -declare const hexToBase58: (hexString: string) => string; -declare const base58ToHex: (base58String: string) => string; -declare const hexToBase32: (hexString: string) => string; +declare function sha3_256(str: string): string; +declare function uuid(): `${string}-${string}-${string}-${string}-${string}`; +declare function shortUuid(): string; -export { aesDecrypt, aesEncrypt, base58ToHex, checkSign, createSign, genRandomString, hexToBase32, hexToBase58, hmac, hmacSha256, md5, sha1, sha512 }; +export { aesDecrypt, aesEncrypt, checkSign, createSign, genRandomString, hmac, hmacSha256, md5, sha1, sha3_256, sha512, shortUuid, uuid }; diff --git a/dist/utils/security.util.js b/dist/utils/security.util.js index 6bd1bdf..8b48a40 100644 --- a/dist/utils/security.util.js +++ b/dist/utils/security.util.js @@ -1,6 +1,34 @@ // src/utils/security.util.ts import crypto from "crypto"; import CryptoJS from "crypto-js"; + +// src/utils/string.util.ts +var reNormalUUID = /^[0-9a-fA-F-]{36}$/; +var reLongUUID = /^[0-9a-fA-F]{32}$/; +var n = /-/g; +function compressUuid(e, t = false) { + if (reNormalUUID.test(e)) { + e = e.replace(n, ""); + } else if (!reLongUUID.test(e)) { + return e; + } + var r = true === t ? 2 : 5; + return compressHex(e, r); +} +var CHARS_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +function compressHex(e, r) { + var i, n2 = e.length; + i = void 0 !== r ? r : n2 % 3; + for (var s = e.slice(0, i), o = []; i < n2; ) { + var u = parseInt(e[i], 16), a = parseInt(e[i + 1], 16), c = parseInt(e[i + 2], 16); + o.push(CHARS_BASE64[u << 2 | a >> 2]); + o.push(CHARS_BASE64[(3 & a) << 4 | c]); + i += 3; + } + return s + o.join(""); +} + +// src/utils/security.util.ts function hmac(input, key, out) { return out ? crypto.createHmac("sha1", key).update(input).digest(out) : crypto.createHmac("sha1", key).update(input).digest("hex"); } @@ -77,56 +105,31 @@ var aesDecrypt = (encryptedDataHexStr, key) => { }); return decryptedData.toString(CryptoJS.enc.Utf8); }; -var base58Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; -var hexToBase58 = (hexString) => { - const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); - let base58String = ""; - let num = BigInt("0x" + hexString); - while (num > BigInt(0)) { - const remainder = num % BigInt(58); - num = num / BigInt(58); - base58String = base58Alphabet[Number(remainder)] + base58String; - } - return base58String; -}; -var base58ToHex = (base58String) => { - const base58Length = base58String.length; - let num = BigInt(0); - let leadingZeros = 0; - for (let i = 0; i < base58Length; i++) { - const charIndex = base58Alphabet.indexOf(base58String[i]); - if (charIndex === -1) { - throw new Error("Invalid Base58 string"); - } - num = num * BigInt(58) + BigInt(charIndex); - } - return num.toString(16); -}; -var hexToBase32 = (hexString) => { - const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); - const base32Alphabet = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; - let base32String = ""; - let num = BigInt("0x" + hexString); - while (num > BigInt(0)) { - const remainder = num % BigInt(32); - num = num / BigInt(32); - base32String = base32Alphabet[Number(remainder)] + base32String; - } - return base32String; -}; +function sha3_256(str) { + let hash = crypto.createHash("sha3-256"); + hash.update(str); + return hash.digest("hex"); +} +function uuid() { + return crypto.randomUUID(); +} +function shortUuid() { + let uid = uuid(); + return compressUuid(uid); +} export { aesDecrypt, aesEncrypt, - base58ToHex, checkSign, createSign, genRandomString, - hexToBase32, - hexToBase58, hmac, hmacSha256, md5, sha1, - sha512 + sha3_256, + sha512, + shortUuid, + uuid }; //# sourceMappingURL=security.util.js.map \ No newline at end of file diff --git a/dist/utils/security.util.js.map b/dist/utils/security.util.js.map index ebbe44d..ccf3dd6 100644 --- a/dist/utils/security.util.js.map +++ b/dist/utils/security.util.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/security.util.ts"],"sourcesContent":["import crypto from 'crypto'\nimport CryptoJS from 'crypto-js'\n\nexport function hmac(input, key, out) {\n return out\n ? crypto.createHmac('sha1', key).update(input).digest(out)\n : crypto.createHmac('sha1', key).update(input).digest('hex')\n}\n\nexport function genRandomString(length) {\n return crypto\n .randomBytes(Math.ceil(length / 2))\n .toString('hex')\n .slice(0, length)\n}\n\nexport function sha512(password: string, salt: string) {\n let hash = crypto.createHmac('sha512', salt)\n hash.update(password)\n let value = hash.digest('hex')\n return {\n salt: salt,\n passwordHash: value,\n }\n}\n\nexport function sha1(str: string) {\n const md5sum = crypto.createHash('sha1')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function hmacSha256(str: string, key: any) {\n const md5sum = crypto.createHmac('sha256', key)\n md5sum.update(str)\n const data = md5sum.digest('hex')\n console.log(`HmacSHA256 rawContent is [${str}], key is [${key}], hash result is [${data}]`)\n return data\n}\n\nexport function md5(str: string) {\n const md5sum = crypto.createHash('md5')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function createSign(secretKey: string, paramStr: string, timestamp: number) {\n paramStr = `${paramStr}:${timestamp}:${secretKey}`\n return sha1(paramStr)\n}\n\nexport function checkSign({\n secretKey,\n data,\n sign,\n signKeys,\n}: {\n secretKey: string\n data: {}\n sign: string\n signKeys: string[]\n}) {\n signKeys.sort()\n let signStr = ''\n for (let key of signKeys) {\n if (signStr.length > 0) {\n signStr += '&'\n }\n signStr += `${key}=${data[key]}`\n }\n console.log(signStr)\n let sign1 = hmacSha256(signStr, secretKey)\n return sign1 === sign\n}\n\n// export function aesDecrypt(encrypted: string, key: string) {\n// let bytes = aes.decrypt(encrypted, key)\n// var originalText = bytes.toString(enc.Utf8);\n// return originalText\n// }\n\nexport const aesEncrypt = (plaintText, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedData = CryptoJS.AES.encrypt(plaintText, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return encryptedData.toString(CryptoJS.format.Hex)\n}\n\nexport const aesDecrypt = (encryptedDataHexStr, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedHex = CryptoJS.enc.Hex.parse(encryptedDataHexStr)\n let encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHex)\n\n var decryptedData = CryptoJS.AES.decrypt(encryptedBase64, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return decryptedData.toString(CryptoJS.enc.Utf8)\n}\n\nconst base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nexport const hexToBase58 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n let base58String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(58)\n num = num / BigInt(58)\n base58String = base58Alphabet[Number(remainder)] + base58String\n }\n\n return base58String\n}\n\nexport const base58ToHex = (base58String: string) => {\n const base58Length = base58String.length\n let num = BigInt(0)\n let leadingZeros = 0\n for (let i = 0; i < base58Length; i++) {\n const charIndex = base58Alphabet.indexOf(base58String[i])\n if (charIndex === -1) {\n throw new Error('Invalid Base58 string')\n }\n\n num = num * BigInt(58) + BigInt(charIndex)\n }\n return num.toString(16)\n}\n\nexport const hexToBase32 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'\n let base32String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(32)\n num = num / BigInt(32)\n base32String = base32Alphabet[Number(remainder)] + base32String\n }\n\n return base32String\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/security.util.ts","../../src/utils/string.util.ts"],"sourcesContent":["import crypto from 'crypto'\nimport CryptoJS from 'crypto-js'\nimport { compressUuid } from './string.util'\n\nexport function hmac(input, key, out) {\n return out\n ? crypto.createHmac('sha1', key).update(input).digest(out)\n : crypto.createHmac('sha1', key).update(input).digest('hex')\n}\n\nexport function genRandomString(length) {\n return crypto\n .randomBytes(Math.ceil(length / 2))\n .toString('hex')\n .slice(0, length)\n}\n\nexport function sha512(password: string, salt: string) {\n let hash = crypto.createHmac('sha512', salt)\n hash.update(password)\n let value = hash.digest('hex')\n return {\n salt: salt,\n passwordHash: value,\n }\n}\n\nexport function sha1(str: string) {\n const md5sum = crypto.createHash('sha1')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function hmacSha256(str: string, key: any) {\n const md5sum = crypto.createHmac('sha256', key)\n md5sum.update(str)\n const data = md5sum.digest('hex')\n console.log(`HmacSHA256 rawContent is [${str}], key is [${key}], hash result is [${data}]`)\n return data\n}\n\nexport function md5(str: string) {\n const md5sum = crypto.createHash('md5')\n md5sum.update(str)\n str = md5sum.digest('hex')\n return str\n}\n\nexport function createSign(secretKey: string, paramStr: string, timestamp: number) {\n paramStr = `${paramStr}:${timestamp}:${secretKey}`\n return sha1(paramStr)\n}\n\nexport function checkSign({\n secretKey,\n data,\n sign,\n signKeys,\n}: {\n secretKey: string\n data: {}\n sign: string\n signKeys: string[]\n}) {\n signKeys.sort()\n let signStr = ''\n for (let key of signKeys) {\n if (signStr.length > 0) {\n signStr += '&'\n }\n signStr += `${key}=${data[key]}`\n }\n console.log(signStr)\n let sign1 = hmacSha256(signStr, secretKey)\n return sign1 === sign\n}\n\n// export function aesDecrypt(encrypted: string, key: string) {\n// let bytes = aes.decrypt(encrypted, key)\n// var originalText = bytes.toString(enc.Utf8);\n// return originalText\n// }\n\nexport const aesEncrypt = (plaintText, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedData = CryptoJS.AES.encrypt(plaintText, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return encryptedData.toString(CryptoJS.format.Hex)\n}\n\nexport const aesDecrypt = (encryptedDataHexStr, key) => {\n key = CryptoJS.SHA1(key).toString().substring(0, 16)\n key = CryptoJS.enc.Base64.parse(key)\n let encryptedHex = CryptoJS.enc.Hex.parse(encryptedDataHexStr)\n let encryptedBase64 = CryptoJS.enc.Base64.stringify(encryptedHex)\n\n var decryptedData = CryptoJS.AES.decrypt(encryptedBase64, key, {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7,\n })\n\n return decryptedData.toString(CryptoJS.enc.Utf8)\n}\n\n\n\nexport function sha3_256(str: string) {\n let hash = crypto.createHash('sha3-256')\n hash.update(str)\n return hash.digest('hex')\n}\n\nexport function uuid() {\n return crypto.randomUUID()\n}\n\nexport function shortUuid() {\n let uid = uuid()\n return compressUuid(uid)\n}","\n/**\n * 判断传入的值是否为true\n * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false\n * @return {boolean}\n */\nexport function isTrue(obj) {\n return (\n obj === 'true' ||\n obj === 'TRUE' ||\n obj === 'True' ||\n obj === 'on' ||\n obj === 'ON' ||\n obj === true ||\n obj === 1 ||\n obj === '1' ||\n obj === 'YES' ||\n obj === 'yes'\n )\n}\n\n/**\n * 验证ObjectId格式是否正确\n * @param {string} id\n * @return {boolean}\n */\nexport function isObjectId(id: string): boolean {\n //mongoose.Types.ObjectId.isValid(id)\n return /^[a-fA-F0-9]{24}$/.test(id)\n}\n\n/**\n * 10进制 -> 62进制\n * @param {string | number} number\n * @return {string}\n */\nexport function string10to62(number: string | number) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split('')\n const radix = chars.length\n let qutient = +number\n const arr = []\n do {\n const mod = qutient % radix\n qutient = (qutient - mod) / radix\n arr.unshift(chars[mod])\n } while (qutient)\n return arr.join('')\n}\n\n/**\n * 62进制 -> 10 进制\n * @param {string} numberCode\n * @return {number}\n */\nexport function string62to10(numberCode: string) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n const radix = chars.length\n numberCode = numberCode + ''\n const len = numberCode.length\n let i = 0\n let originNumber = 0\n while (i < len) {\n originNumber += Math.pow(radix, i++) * (chars.indexOf(numberCode.charAt(len - i)) || 0)\n }\n return originNumber\n}\n\nconst base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nexport const hexToBase58 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n let base58String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(58)\n num = num / BigInt(58)\n base58String = base58Alphabet[Number(remainder)] + base58String\n }\n\n return base58String\n}\n\nexport const base58ToHex = (base58String: string) => {\n const base58Length = base58String.length\n let num = BigInt(0)\n let leadingZeros = 0\n for (let i = 0; i < base58Length; i++) {\n const charIndex = base58Alphabet.indexOf(base58String[i])\n if (charIndex === -1) {\n throw new Error('Invalid Base58 string')\n }\n\n num = num * BigInt(58) + BigInt(charIndex)\n }\n return num.toString(16)\n}\n\nexport const hexToBase32 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'\n let base32String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(32)\n num = num / BigInt(32)\n base32String = base32Alphabet[Number(remainder)] + base32String\n }\n\n return base32String\n}\n\n\nconst reNormalUUID = /^[0-9a-fA-F-]{36}$/\nconst reLongUUID = /^[0-9a-fA-F]{32}$/\nconst reShortUUID = /^[0-9a-zA-Z+/]{22,23}$/\nconst n = /-/g\n\nexport function compressUuid(e: string, t: boolean = false) {\n if (reNormalUUID.test(e)) {\n e = e.replace(n, '')\n } else if (!reLongUUID.test(e)) {\n return e\n }\n var r = !0 === t ? 2 : 5\n return compressHex(e, r)\n}\n\nconst CHARS_BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nexport function compressHex(e: string, r: number) {\n var i,\n n = e.length\n i = void 0 !== r ? r : n % 3\n for (var s = e.slice(0, i), o = []; i < n; ) {\n var u = parseInt(e[i], 16),\n a = parseInt(e[i + 1], 16),\n c = parseInt(e[i + 2], 16)\n o.push(CHARS_BASE64[(u << 2) | (a >> 2)])\n o.push(CHARS_BASE64[((3 & a) << 4) | c])\n i += 3\n }\n return s + o.join('')\n}"],"mappings":"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","names":["n"]} \ No newline at end of file diff --git a/dist/utils/string.util.cjs b/dist/utils/string.util.cjs index 9b10750..ecd506e 100644 --- a/dist/utils/string.util.cjs +++ b/dist/utils/string.util.cjs @@ -19,41 +19,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru // src/utils/string.util.ts var string_util_exports = {}; __export(string_util_exports, { - generateKeyValStr: () => generateKeyValStr, + base58ToHex: () => base58ToHex, + compressHex: () => compressHex, + compressUuid: () => compressUuid, + hexToBase32: () => hexToBase32, + hexToBase58: () => hexToBase58, isObjectId: () => isObjectId, isTrue: () => isTrue, - keyValToObject: () => keyValToObject, string10to62: () => string10to62, string62to10: () => string62to10 }); module.exports = __toCommonJS(string_util_exports); -function generateKeyValStr(data, ignoreNull = true, splitChar = "&", equalChar = "=") { - const keys = Object.keys(data); - keys.sort(); - let result = ""; - let i = 0; - for (let key of keys) { - if (ignoreNull && !data[key]) { - return; - } - if (i++ > 0) - result += splitChar; - result += `${key}${equalChar}${data[key]}`; - } - return result; -} -function keyValToObject(str, splitChar = "&", equalChar = "=") { - let result = {}; - if (!str) { - return result; - } - let arrs = str.split(splitChar); - for (let sub of arrs) { - let subArr = sub.split(equalChar); - result[subArr[0]] = subArr[1]; - } - return result; -} function isTrue(obj) { return obj === "true" || obj === "TRUE" || obj === "True" || obj === "on" || obj === "ON" || obj === true || obj === 1 || obj === "1" || obj === "YES" || obj === "yes"; } @@ -84,12 +60,76 @@ function string62to10(numberCode) { } return originNumber; } +var base58Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; +var hexToBase58 = (hexString) => { + const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); + let base58String = ""; + let num = BigInt("0x" + hexString); + while (num > BigInt(0)) { + const remainder = num % BigInt(58); + num = num / BigInt(58); + base58String = base58Alphabet[Number(remainder)] + base58String; + } + return base58String; +}; +var base58ToHex = (base58String) => { + const base58Length = base58String.length; + let num = BigInt(0); + let leadingZeros = 0; + for (let i = 0; i < base58Length; i++) { + const charIndex = base58Alphabet.indexOf(base58String[i]); + if (charIndex === -1) { + throw new Error("Invalid Base58 string"); + } + num = num * BigInt(58) + BigInt(charIndex); + } + return num.toString(16); +}; +var hexToBase32 = (hexString) => { + const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); + const base32Alphabet = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; + let base32String = ""; + let num = BigInt("0x" + hexString); + while (num > BigInt(0)) { + const remainder = num % BigInt(32); + num = num / BigInt(32); + base32String = base32Alphabet[Number(remainder)] + base32String; + } + return base32String; +}; +var reNormalUUID = /^[0-9a-fA-F-]{36}$/; +var reLongUUID = /^[0-9a-fA-F]{32}$/; +var n = /-/g; +function compressUuid(e, t = false) { + if (reNormalUUID.test(e)) { + e = e.replace(n, ""); + } else if (!reLongUUID.test(e)) { + return e; + } + var r = true === t ? 2 : 5; + return compressHex(e, r); +} +var CHARS_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +function compressHex(e, r) { + var i, n2 = e.length; + i = void 0 !== r ? r : n2 % 3; + for (var s = e.slice(0, i), o = []; i < n2; ) { + var u = parseInt(e[i], 16), a = parseInt(e[i + 1], 16), c = parseInt(e[i + 2], 16); + o.push(CHARS_BASE64[u << 2 | a >> 2]); + o.push(CHARS_BASE64[(3 & a) << 4 | c]); + i += 3; + } + return s + o.join(""); +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { - generateKeyValStr, + base58ToHex, + compressHex, + compressUuid, + hexToBase32, + hexToBase58, isObjectId, isTrue, - keyValToObject, string10to62, string62to10 }); diff --git a/dist/utils/string.util.cjs.map b/dist/utils/string.util.cjs.map index cdb4b81..914e610 100644 --- a/dist/utils/string.util.cjs.map +++ b/dist/utils/string.util.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/string.util.ts"],"sourcesContent":["/**\n * 根据key升序生成 key1=val1&key2=val2的字符串\n * @param {object} data 需要处理的对象\n * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接)\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function generateKeyValStr(data: {}, ignoreNull = true, splitChar: string = '&', equalChar = '=') {\n const keys = Object.keys(data)\n keys.sort()\n let result = ''\n let i = 0\n for (let key of keys) {\n if (ignoreNull && !data[key]) {\n return\n }\n if (i++ > 0) result += splitChar\n result += `${key}${equalChar}${data[key]}`\n }\n return result\n}\n\n/**\n * 将key1=val&key2=val的字符串组装成对象\n * @param str key1=val&key2=val的字符串\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function keyValToObject(str: string, splitChar: string = '&', equalChar = '='): {} {\n let result = {}\n if (!str) {\n return result\n }\n let arrs = str.split(splitChar)\n for (let sub of arrs) {\n let subArr = sub.split(equalChar)\n result[subArr[0]] = subArr[1]\n }\n return result\n}\n\n/**\n * 判断传入的值是否为true\n * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false\n * @return {boolean}\n */\nexport function isTrue(obj) {\n return (\n obj === 'true' ||\n obj === 'TRUE' ||\n obj === 'True' ||\n obj === 'on' ||\n obj === 'ON' ||\n obj === true ||\n obj === 1 ||\n obj === '1' ||\n obj === 'YES' ||\n obj === 'yes'\n )\n}\n\n/**\n * 验证ObjectId格式是否正确\n * @param {string} id\n * @return {boolean}\n */\nexport function isObjectId(id: string): boolean {\n //mongoose.Types.ObjectId.isValid(id)\n return /^[a-fA-F0-9]{24}$/.test(id)\n}\n\n/**\n * 10进制 -> 62进制\n * @param {string | number} number\n * @return {string}\n */\nexport function string10to62(number: string | number) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split('')\n const radix = chars.length\n let qutient = +number\n const arr = []\n do {\n const mod = qutient % radix\n qutient = (qutient - mod) / radix\n arr.unshift(chars[mod])\n } while (qutient)\n return arr.join('')\n}\n\n/**\n * 62进制 -> 10 进制\n * @param {string} numberCode\n * @return {number}\n */\nexport function string62to10(numberCode: string) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n const radix = chars.length\n numberCode = numberCode + ''\n const len = numberCode.length\n let i = 0\n let originNumber = 0\n while (i < len) {\n originNumber += Math.pow(radix, i++) * (chars.indexOf(numberCode.charAt(len - i)) || 0)\n }\n return originNumber\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,kBAAkB,MAAU,aAAa,MAAM,YAAoB,KAAK,YAAY,KAAK;AACvG,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,OAAK,KAAK;AACV,MAAI,SAAS;AACb,MAAI,IAAI;AACR,WAAS,OAAO,MAAM;AACpB,QAAI,cAAc,CAAC,KAAK,GAAG,GAAG;AAC5B;AAAA,IACF;AACA,QAAI,MAAM;AAAG,gBAAU;AACvB,cAAU,GAAG,GAAG,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAQO,SAAS,eAAe,KAAa,YAAoB,KAAK,YAAY,KAAS;AACxF,MAAI,SAAS,CAAC;AACd,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI,OAAO,IAAI,MAAM,SAAS;AAC9B,WAAS,OAAO,MAAM;AACpB,QAAI,SAAS,IAAI,MAAM,SAAS;AAChC,WAAO,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAOO,SAAS,OAAO,KAAK;AAC1B,SACE,QAAQ,UACR,QAAQ,UACR,QAAQ,UACR,QAAQ,QACR,QAAQ,QACR,QAAQ,QACR,QAAQ,KACR,QAAQ,OACR,QAAQ,SACR,QAAQ;AAEZ;AAOO,SAAS,WAAW,IAAqB;AAE9C,SAAO,oBAAoB,KAAK,EAAE;AACpC;AAOO,SAAS,aAAa,QAAyB;AACpD,QAAM,QAAQ,iEAAiE,MAAM,EAAE;AACvF,QAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,CAAC;AACf,QAAM,MAAM,CAAC;AACb,KAAG;AACD,UAAM,MAAM,UAAU;AACtB,eAAW,UAAU,OAAO;AAC5B,QAAI,QAAQ,MAAM,GAAG,CAAC;AAAA,EACxB,SAAS;AACT,SAAO,IAAI,KAAK,EAAE;AACpB;AAOO,SAAS,aAAa,YAAoB;AAC/C,QAAM,QAAQ;AACd,QAAM,QAAQ,MAAM;AACpB,eAAa,aAAa;AAC1B,QAAM,MAAM,WAAW;AACvB,MAAI,IAAI;AACR,MAAI,eAAe;AACnB,SAAO,IAAI,KAAK;AACd,oBAAgB,KAAK,IAAI,OAAO,GAAG,KAAK,MAAM,QAAQ,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK;AAAA,EACvF;AACA,SAAO;AACT;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/string.util.ts"],"sourcesContent":["\n/**\n * 判断传入的值是否为true\n * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false\n * @return {boolean}\n */\nexport function isTrue(obj) {\n return (\n obj === 'true' ||\n obj === 'TRUE' ||\n obj === 'True' ||\n obj === 'on' ||\n obj === 'ON' ||\n obj === true ||\n obj === 1 ||\n obj === '1' ||\n obj === 'YES' ||\n obj === 'yes'\n )\n}\n\n/**\n * 验证ObjectId格式是否正确\n * @param {string} id\n * @return {boolean}\n */\nexport function isObjectId(id: string): boolean {\n //mongoose.Types.ObjectId.isValid(id)\n return /^[a-fA-F0-9]{24}$/.test(id)\n}\n\n/**\n * 10进制 -> 62进制\n * @param {string | number} number\n * @return {string}\n */\nexport function string10to62(number: string | number) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split('')\n const radix = chars.length\n let qutient = +number\n const arr = []\n do {\n const mod = qutient % radix\n qutient = (qutient - mod) / radix\n arr.unshift(chars[mod])\n } while (qutient)\n return arr.join('')\n}\n\n/**\n * 62进制 -> 10 进制\n * @param {string} numberCode\n * @return {number}\n */\nexport function string62to10(numberCode: string) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n const radix = chars.length\n numberCode = numberCode + ''\n const len = numberCode.length\n let i = 0\n let originNumber = 0\n while (i < len) {\n originNumber += Math.pow(radix, i++) * (chars.indexOf(numberCode.charAt(len - i)) || 0)\n }\n return originNumber\n}\n\nconst base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nexport const hexToBase58 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n let base58String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(58)\n num = num / BigInt(58)\n base58String = base58Alphabet[Number(remainder)] + base58String\n }\n\n return base58String\n}\n\nexport const base58ToHex = (base58String: string) => {\n const base58Length = base58String.length\n let num = BigInt(0)\n let leadingZeros = 0\n for (let i = 0; i < base58Length; i++) {\n const charIndex = base58Alphabet.indexOf(base58String[i])\n if (charIndex === -1) {\n throw new Error('Invalid Base58 string')\n }\n\n num = num * BigInt(58) + BigInt(charIndex)\n }\n return num.toString(16)\n}\n\nexport const hexToBase32 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'\n let base32String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(32)\n num = num / BigInt(32)\n base32String = base32Alphabet[Number(remainder)] + base32String\n }\n\n return base32String\n}\n\n\nconst reNormalUUID = /^[0-9a-fA-F-]{36}$/\nconst reLongUUID = /^[0-9a-fA-F]{32}$/\nconst reShortUUID = /^[0-9a-zA-Z+/]{22,23}$/\nconst n = /-/g\n\nexport function compressUuid(e: string, t: boolean = false) {\n if (reNormalUUID.test(e)) {\n e = e.replace(n, '')\n } else if (!reLongUUID.test(e)) {\n return e\n }\n var r = !0 === t ? 2 : 5\n return compressHex(e, r)\n}\n\nconst CHARS_BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nexport function compressHex(e: string, r: number) {\n var i,\n n = e.length\n i = void 0 !== r ? r : n % 3\n for (var s = e.slice(0, i), o = []; i < n; ) {\n var u = parseInt(e[i], 16),\n a = parseInt(e[i + 1], 16),\n c = parseInt(e[i + 2], 16)\n o.push(CHARS_BASE64[(u << 2) | (a >> 2)])\n o.push(CHARS_BASE64[((3 & a) << 4) | c])\n i += 3\n }\n return s + o.join('')\n}"],"mappings":"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","names":["n"]} \ No newline at end of file diff --git a/dist/utils/string.util.d.cts b/dist/utils/string.util.d.cts index 0d69afb..932ac91 100644 --- a/dist/utils/string.util.d.cts +++ b/dist/utils/string.util.d.cts @@ -1,18 +1,3 @@ -/** - * 根据key升序生成 key1=val1&key2=val2的字符串 - * @param {object} data 需要处理的对象 - * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接) - * @param splitChar 连接的字符, 默认是& - * @param equalChar = - */ -declare function generateKeyValStr(data: {}, ignoreNull?: boolean, splitChar?: string, equalChar?: string): string; -/** - * 将key1=val&key2=val的字符串组装成对象 - * @param str key1=val&key2=val的字符串 - * @param splitChar 连接的字符, 默认是& - * @param equalChar = - */ -declare function keyValToObject(str: string, splitChar?: string, equalChar?: string): {}; /** * 判断传入的值是否为true * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false @@ -37,5 +22,10 @@ declare function string10to62(number: string | number): string; * @return {number} */ declare function string62to10(numberCode: string): number; +declare const hexToBase58: (hexString: string) => string; +declare const base58ToHex: (base58String: string) => string; +declare const hexToBase32: (hexString: string) => string; +declare function compressUuid(e: string, t?: boolean): string; +declare function compressHex(e: string, r: number): string; -export { generateKeyValStr, isObjectId, isTrue, keyValToObject, string10to62, string62to10 }; +export { base58ToHex, compressHex, compressUuid, hexToBase32, hexToBase58, isObjectId, isTrue, string10to62, string62to10 }; diff --git a/dist/utils/string.util.d.ts b/dist/utils/string.util.d.ts index 0d69afb..932ac91 100644 --- a/dist/utils/string.util.d.ts +++ b/dist/utils/string.util.d.ts @@ -1,18 +1,3 @@ -/** - * 根据key升序生成 key1=val1&key2=val2的字符串 - * @param {object} data 需要处理的对象 - * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接) - * @param splitChar 连接的字符, 默认是& - * @param equalChar = - */ -declare function generateKeyValStr(data: {}, ignoreNull?: boolean, splitChar?: string, equalChar?: string): string; -/** - * 将key1=val&key2=val的字符串组装成对象 - * @param str key1=val&key2=val的字符串 - * @param splitChar 连接的字符, 默认是& - * @param equalChar = - */ -declare function keyValToObject(str: string, splitChar?: string, equalChar?: string): {}; /** * 判断传入的值是否为true * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false @@ -37,5 +22,10 @@ declare function string10to62(number: string | number): string; * @return {number} */ declare function string62to10(numberCode: string): number; +declare const hexToBase58: (hexString: string) => string; +declare const base58ToHex: (base58String: string) => string; +declare const hexToBase32: (hexString: string) => string; +declare function compressUuid(e: string, t?: boolean): string; +declare function compressHex(e: string, r: number): string; -export { generateKeyValStr, isObjectId, isTrue, keyValToObject, string10to62, string62to10 }; +export { base58ToHex, compressHex, compressUuid, hexToBase32, hexToBase58, isObjectId, isTrue, string10to62, string62to10 }; diff --git a/dist/utils/string.util.js b/dist/utils/string.util.js index 99a29a7..dd530bc 100644 --- a/dist/utils/string.util.js +++ b/dist/utils/string.util.js @@ -1,31 +1,4 @@ // src/utils/string.util.ts -function generateKeyValStr(data, ignoreNull = true, splitChar = "&", equalChar = "=") { - const keys = Object.keys(data); - keys.sort(); - let result = ""; - let i = 0; - for (let key of keys) { - if (ignoreNull && !data[key]) { - return; - } - if (i++ > 0) - result += splitChar; - result += `${key}${equalChar}${data[key]}`; - } - return result; -} -function keyValToObject(str, splitChar = "&", equalChar = "=") { - let result = {}; - if (!str) { - return result; - } - let arrs = str.split(splitChar); - for (let sub of arrs) { - let subArr = sub.split(equalChar); - result[subArr[0]] = subArr[1]; - } - return result; -} function isTrue(obj) { return obj === "true" || obj === "TRUE" || obj === "True" || obj === "on" || obj === "ON" || obj === true || obj === 1 || obj === "1" || obj === "YES" || obj === "yes"; } @@ -56,11 +29,75 @@ function string62to10(numberCode) { } return originNumber; } +var base58Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; +var hexToBase58 = (hexString) => { + const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); + let base58String = ""; + let num = BigInt("0x" + hexString); + while (num > BigInt(0)) { + const remainder = num % BigInt(58); + num = num / BigInt(58); + base58String = base58Alphabet[Number(remainder)] + base58String; + } + return base58String; +}; +var base58ToHex = (base58String) => { + const base58Length = base58String.length; + let num = BigInt(0); + let leadingZeros = 0; + for (let i = 0; i < base58Length; i++) { + const charIndex = base58Alphabet.indexOf(base58String[i]); + if (charIndex === -1) { + throw new Error("Invalid Base58 string"); + } + num = num * BigInt(58) + BigInt(charIndex); + } + return num.toString(16); +}; +var hexToBase32 = (hexString) => { + const bytes = hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)); + const base32Alphabet = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; + let base32String = ""; + let num = BigInt("0x" + hexString); + while (num > BigInt(0)) { + const remainder = num % BigInt(32); + num = num / BigInt(32); + base32String = base32Alphabet[Number(remainder)] + base32String; + } + return base32String; +}; +var reNormalUUID = /^[0-9a-fA-F-]{36}$/; +var reLongUUID = /^[0-9a-fA-F]{32}$/; +var n = /-/g; +function compressUuid(e, t = false) { + if (reNormalUUID.test(e)) { + e = e.replace(n, ""); + } else if (!reLongUUID.test(e)) { + return e; + } + var r = true === t ? 2 : 5; + return compressHex(e, r); +} +var CHARS_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +function compressHex(e, r) { + var i, n2 = e.length; + i = void 0 !== r ? r : n2 % 3; + for (var s = e.slice(0, i), o = []; i < n2; ) { + var u = parseInt(e[i], 16), a = parseInt(e[i + 1], 16), c = parseInt(e[i + 2], 16); + o.push(CHARS_BASE64[u << 2 | a >> 2]); + o.push(CHARS_BASE64[(3 & a) << 4 | c]); + i += 3; + } + return s + o.join(""); +} export { - generateKeyValStr, + base58ToHex, + compressHex, + compressUuid, + hexToBase32, + hexToBase58, isObjectId, isTrue, - keyValToObject, string10to62, string62to10 }; diff --git a/dist/utils/string.util.js.map b/dist/utils/string.util.js.map index fd63cff..dc461d7 100644 --- a/dist/utils/string.util.js.map +++ b/dist/utils/string.util.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/utils/string.util.ts"],"sourcesContent":["/**\n * 根据key升序生成 key1=val1&key2=val2的字符串\n * @param {object} data 需要处理的对象\n * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接)\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function generateKeyValStr(data: {}, ignoreNull = true, splitChar: string = '&', equalChar = '=') {\n const keys = Object.keys(data)\n keys.sort()\n let result = ''\n let i = 0\n for (let key of keys) {\n if (ignoreNull && !data[key]) {\n return\n }\n if (i++ > 0) result += splitChar\n result += `${key}${equalChar}${data[key]}`\n }\n return result\n}\n\n/**\n * 将key1=val&key2=val的字符串组装成对象\n * @param str key1=val&key2=val的字符串\n * @param splitChar 连接的字符, 默认是&\n * @param equalChar =\n */\nexport function keyValToObject(str: string, splitChar: string = '&', equalChar = '='): {} {\n let result = {}\n if (!str) {\n return result\n }\n let arrs = str.split(splitChar)\n for (let sub of arrs) {\n let subArr = sub.split(equalChar)\n result[subArr[0]] = subArr[1]\n }\n return result\n}\n\n/**\n * 判断传入的值是否为true\n * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false\n * @return {boolean}\n */\nexport function isTrue(obj) {\n return (\n obj === 'true' ||\n obj === 'TRUE' ||\n obj === 'True' ||\n obj === 'on' ||\n obj === 'ON' ||\n obj === true ||\n obj === 1 ||\n obj === '1' ||\n obj === 'YES' ||\n obj === 'yes'\n )\n}\n\n/**\n * 验证ObjectId格式是否正确\n * @param {string} id\n * @return {boolean}\n */\nexport function isObjectId(id: string): boolean {\n //mongoose.Types.ObjectId.isValid(id)\n return /^[a-fA-F0-9]{24}$/.test(id)\n}\n\n/**\n * 10进制 -> 62进制\n * @param {string | number} number\n * @return {string}\n */\nexport function string10to62(number: string | number) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split('')\n const radix = chars.length\n let qutient = +number\n const arr = []\n do {\n const mod = qutient % radix\n qutient = (qutient - mod) / radix\n arr.unshift(chars[mod])\n } while (qutient)\n return arr.join('')\n}\n\n/**\n * 62进制 -> 10 进制\n * @param {string} numberCode\n * @return {number}\n */\nexport function string62to10(numberCode: string) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n const radix = chars.length\n numberCode = numberCode + ''\n const len = numberCode.length\n let i = 0\n let originNumber = 0\n while (i < len) {\n originNumber += Math.pow(radix, i++) * (chars.indexOf(numberCode.charAt(len - i)) || 0)\n }\n return originNumber\n}\n"],"mappings":";AAOO,SAAS,kBAAkB,MAAU,aAAa,MAAM,YAAoB,KAAK,YAAY,KAAK;AACvG,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,OAAK,KAAK;AACV,MAAI,SAAS;AACb,MAAI,IAAI;AACR,WAAS,OAAO,MAAM;AACpB,QAAI,cAAc,CAAC,KAAK,GAAG,GAAG;AAC5B;AAAA,IACF;AACA,QAAI,MAAM;AAAG,gBAAU;AACvB,cAAU,GAAG,GAAG,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAQO,SAAS,eAAe,KAAa,YAAoB,KAAK,YAAY,KAAS;AACxF,MAAI,SAAS,CAAC;AACd,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI,OAAO,IAAI,MAAM,SAAS;AAC9B,WAAS,OAAO,MAAM;AACpB,QAAI,SAAS,IAAI,MAAM,SAAS;AAChC,WAAO,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAOO,SAAS,OAAO,KAAK;AAC1B,SACE,QAAQ,UACR,QAAQ,UACR,QAAQ,UACR,QAAQ,QACR,QAAQ,QACR,QAAQ,QACR,QAAQ,KACR,QAAQ,OACR,QAAQ,SACR,QAAQ;AAEZ;AAOO,SAAS,WAAW,IAAqB;AAE9C,SAAO,oBAAoB,KAAK,EAAE;AACpC;AAOO,SAAS,aAAa,QAAyB;AACpD,QAAM,QAAQ,iEAAiE,MAAM,EAAE;AACvF,QAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,CAAC;AACf,QAAM,MAAM,CAAC;AACb,KAAG;AACD,UAAM,MAAM,UAAU;AACtB,eAAW,UAAU,OAAO;AAC5B,QAAI,QAAQ,MAAM,GAAG,CAAC;AAAA,EACxB,SAAS;AACT,SAAO,IAAI,KAAK,EAAE;AACpB;AAOO,SAAS,aAAa,YAAoB;AAC/C,QAAM,QAAQ;AACd,QAAM,QAAQ,MAAM;AACpB,eAAa,aAAa;AAC1B,QAAM,MAAM,WAAW;AACvB,MAAI,IAAI;AACR,MAAI,eAAe;AACnB,SAAO,IAAI,KAAK;AACd,oBAAgB,KAAK,IAAI,OAAO,GAAG,KAAK,MAAM,QAAQ,WAAW,OAAO,MAAM,CAAC,CAAC,KAAK;AAAA,EACvF;AACA,SAAO;AACT;","names":[]} \ No newline at end of file +{"version":3,"sources":["../../src/utils/string.util.ts"],"sourcesContent":["\n/**\n * 判断传入的值是否为true\n * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false\n * @return {boolean}\n */\nexport function isTrue(obj) {\n return (\n obj === 'true' ||\n obj === 'TRUE' ||\n obj === 'True' ||\n obj === 'on' ||\n obj === 'ON' ||\n obj === true ||\n obj === 1 ||\n obj === '1' ||\n obj === 'YES' ||\n obj === 'yes'\n )\n}\n\n/**\n * 验证ObjectId格式是否正确\n * @param {string} id\n * @return {boolean}\n */\nexport function isObjectId(id: string): boolean {\n //mongoose.Types.ObjectId.isValid(id)\n return /^[a-fA-F0-9]{24}$/.test(id)\n}\n\n/**\n * 10进制 -> 62进制\n * @param {string | number} number\n * @return {string}\n */\nexport function string10to62(number: string | number) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'.split('')\n const radix = chars.length\n let qutient = +number\n const arr = []\n do {\n const mod = qutient % radix\n qutient = (qutient - mod) / radix\n arr.unshift(chars[mod])\n } while (qutient)\n return arr.join('')\n}\n\n/**\n * 62进制 -> 10 进制\n * @param {string} numberCode\n * @return {number}\n */\nexport function string62to10(numberCode: string) {\n const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n const radix = chars.length\n numberCode = numberCode + ''\n const len = numberCode.length\n let i = 0\n let originNumber = 0\n while (i < len) {\n originNumber += Math.pow(radix, i++) * (chars.indexOf(numberCode.charAt(len - i)) || 0)\n }\n return originNumber\n}\n\nconst base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nexport const hexToBase58 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n let base58String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(58)\n num = num / BigInt(58)\n base58String = base58Alphabet[Number(remainder)] + base58String\n }\n\n return base58String\n}\n\nexport const base58ToHex = (base58String: string) => {\n const base58Length = base58String.length\n let num = BigInt(0)\n let leadingZeros = 0\n for (let i = 0; i < base58Length; i++) {\n const charIndex = base58Alphabet.indexOf(base58String[i])\n if (charIndex === -1) {\n throw new Error('Invalid Base58 string')\n }\n\n num = num * BigInt(58) + BigInt(charIndex)\n }\n return num.toString(16)\n}\n\nexport const hexToBase32 = (hexString: string) => {\n const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))\n const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'\n let base32String = ''\n\n let num = BigInt('0x' + hexString)\n while (num > BigInt(0)) {\n const remainder = num % BigInt(32)\n num = num / BigInt(32)\n base32String = base32Alphabet[Number(remainder)] + base32String\n }\n\n return base32String\n}\n\n\nconst reNormalUUID = /^[0-9a-fA-F-]{36}$/\nconst reLongUUID = /^[0-9a-fA-F]{32}$/\nconst reShortUUID = /^[0-9a-zA-Z+/]{22,23}$/\nconst n = /-/g\n\nexport function compressUuid(e: string, t: boolean = false) {\n if (reNormalUUID.test(e)) {\n e = e.replace(n, '')\n } else if (!reLongUUID.test(e)) {\n return e\n }\n var r = !0 === t ? 2 : 5\n return compressHex(e, r)\n}\n\nconst CHARS_BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nexport function compressHex(e: string, r: number) {\n var i,\n n = e.length\n i = void 0 !== r ? r : n % 3\n for (var s = e.slice(0, i), o = []; i < n; ) {\n var u = parseInt(e[i], 16),\n a = parseInt(e[i + 1], 16),\n c = parseInt(e[i + 2], 16)\n o.push(CHARS_BASE64[(u << 2) | (a >> 2)])\n o.push(CHARS_BASE64[((3 & a) << 4) | c])\n i += 3\n }\n return s + o.join('')\n}"],"mappings":"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","names":["n"]} \ No newline at end of file diff --git a/src/utils/net.util.ts b/src/utils/net.util.ts index aa83981..e44b113 100644 --- a/src/utils/net.util.ts +++ b/src/utils/net.util.ts @@ -146,3 +146,69 @@ export const checkParamsNeeded = (...args) => { } }) } + +/** + * 生成 key1=val1&key2=val2的字符串 + * @param {object} data 需要处理的对象 + * @param {boolean} sort 是否按key生序重排 + * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接) + * @param splitChar 连接的字符, 默认是& + * @param equalChar = + */ +export function generateKVStr({ + data = {}, + sort = false, + encode = false, + ignoreNull = true, + splitChar = '&', + equalChar = '=', + uri = '', +}: { + data?: any + sort?: boolean + encode?: boolean + ignoreNull?: boolean + splitChar?: string + equalChar?: string + uri?: string +}) { + const keys = Object.keys(data) + sort && keys.sort() + let result = '' + let i = 0 + for (let key of keys) { + if (ignoreNull && !data[key]) { + continue + } + if (i++ > 0) result += splitChar + if (encode) { + result += `${key}${equalChar}${encodeURIComponent(data[key])}` + } else { + result += `${key}${equalChar}${data[key]}` + } + } + if (uri) { + const joinChar = uri.search(/\?/) === -1 ? '?' : '&' + result = uri + joinChar + result + } + return result +} + +/** + * 将key1=val&key2=val的字符串组装成对象 + * @param str key1=val&key2=val的字符串 + * @param splitChar 连接的字符, 默认是& + * @param equalChar = + */ +export function keyValToObject(str: string, splitChar: string = '&', equalChar = '='): {} { + let result: any = {} + if (!str) { + return result + } + let arrs = str.split(splitChar) + for (let sub of arrs) { + let subArr = sub.split(equalChar) + result[subArr[0]] = subArr[1] + } + return result +} diff --git a/src/utils/security.util.ts b/src/utils/security.util.ts index 57f1e61..647d514 100644 --- a/src/utils/security.util.ts +++ b/src/utils/security.util.ts @@ -1,5 +1,6 @@ import crypto from 'crypto' import CryptoJS from 'crypto-js' +import { compressUuid } from './string.util' export function hmac(input, key, out) { return out @@ -106,48 +107,17 @@ export const aesDecrypt = (encryptedDataHexStr, key) => { return decryptedData.toString(CryptoJS.enc.Utf8) } -const base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' - -export const hexToBase58 = (hexString: string) => { - const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)) - let base58String = '' - - let num = BigInt('0x' + hexString) - while (num > BigInt(0)) { - const remainder = num % BigInt(58) - num = num / BigInt(58) - base58String = base58Alphabet[Number(remainder)] + base58String - } - - return base58String +export function sha3_256(str: string) { + let hash = crypto.createHash('sha3-256') + hash.update(str) + return hash.digest('hex') } -export const base58ToHex = (base58String: string) => { - const base58Length = base58String.length - let num = BigInt(0) - let leadingZeros = 0 - for (let i = 0; i < base58Length; i++) { - const charIndex = base58Alphabet.indexOf(base58String[i]) - if (charIndex === -1) { - throw new Error('Invalid Base58 string') - } - - num = num * BigInt(58) + BigInt(charIndex) - } - return num.toString(16) +export function uuid() { + return crypto.randomUUID() } -export const hexToBase32 = (hexString: string) => { - const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)) - const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' - let base32String = '' - - let num = BigInt('0x' + hexString) - while (num > BigInt(0)) { - const remainder = num % BigInt(32) - num = num / BigInt(32) - base32String = base32Alphabet[Number(remainder)] + base32String - } - - return base32String +export function shortUuid() { + let uid = uuid() + return compressUuid(uid) } diff --git a/src/utils/string.util.ts b/src/utils/string.util.ts index 62dba1b..3582ee8 100644 --- a/src/utils/string.util.ts +++ b/src/utils/string.util.ts @@ -1,44 +1,3 @@ -/** - * 根据key升序生成 key1=val1&key2=val2的字符串 - * @param {object} data 需要处理的对象 - * @param {boolean} ignoreNull 是否过滤空值(空格或者null值不参与拼接) - * @param splitChar 连接的字符, 默认是& - * @param equalChar = - */ -export function generateKeyValStr(data: {}, ignoreNull = true, splitChar: string = '&', equalChar = '=') { - const keys = Object.keys(data) - keys.sort() - let result = '' - let i = 0 - for (let key of keys) { - if (ignoreNull && !data[key]) { - return - } - if (i++ > 0) result += splitChar - result += `${key}${equalChar}${data[key]}` - } - return result -} - -/** - * 将key1=val&key2=val的字符串组装成对象 - * @param str key1=val&key2=val的字符串 - * @param splitChar 连接的字符, 默认是& - * @param equalChar = - */ -export function keyValToObject(str: string, splitChar: string = '&', equalChar = '='): {} { - let result = {} - if (!str) { - return result - } - let arrs = str.split(splitChar) - for (let sub of arrs) { - let subArr = sub.split(equalChar) - result[subArr[0]] = subArr[1] - } - return result -} - /** * 判断传入的值是否为true * @param {Object} obj 传入值为'true','TRUE',1,'1','on','ON','YES','yes'时,返回true,其他值均返回false @@ -104,3 +63,80 @@ export function string62to10(numberCode: string) { } return originNumber } + +const base58Alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' + +export const hexToBase58 = (hexString: string) => { + const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)) + let base58String = '' + + let num = BigInt('0x' + hexString) + while (num > BigInt(0)) { + const remainder = num % BigInt(58) + num = num / BigInt(58) + base58String = base58Alphabet[Number(remainder)] + base58String + } + + return base58String +} + +export const base58ToHex = (base58String: string) => { + const base58Length = base58String.length + let num = BigInt(0) + let leadingZeros = 0 + for (let i = 0; i < base58Length; i++) { + const charIndex = base58Alphabet.indexOf(base58String[i]) + if (charIndex === -1) { + throw new Error('Invalid Base58 string') + } + + num = num * BigInt(58) + BigInt(charIndex) + } + return num.toString(16) +} + +export const hexToBase32 = (hexString: string) => { + const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)) + const base32Alphabet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' + let base32String = '' + + let num = BigInt('0x' + hexString) + while (num > BigInt(0)) { + const remainder = num % BigInt(32) + num = num / BigInt(32) + base32String = base32Alphabet[Number(remainder)] + base32String + } + + return base32String +} + +const reNormalUUID = /^[0-9a-fA-F-]{36}$/ +const reLongUUID = /^[0-9a-fA-F]{32}$/ +const reShortUUID = /^[0-9a-zA-Z+/]{22,23}$/ +const n = /-/g + +export function compressUuid(e: string, t: boolean = false) { + if (reNormalUUID.test(e)) { + e = e.replace(n, '') + } else if (!reLongUUID.test(e)) { + return e + } + var r = !0 === t ? 2 : 5 + return compressHex(e, r) +} + +const CHARS_BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +export function compressHex(e: string, r: number) { + var i, + n = e.length + i = void 0 !== r ? r : n % 3 + for (var s = e.slice(0, i), o = []; i < n; ) { + var u = parseInt(e[i], 16), + a = parseInt(e[i + 1], 16), + c = parseInt(e[i + 2], 16) + o.push(CHARS_BASE64[(u << 2) | (a >> 2)]) + o.push(CHARS_BASE64[((3 & a) << 4) | c]) + i += 3 + } + return s + o.join('') +}