add check address method
This commit is contained in:
parent
374889ad07
commit
c1946bbe7d
2
dist/common/AsyncQueue.cjs.map
vendored
2
dist/common/AsyncQueue.cjs.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"sources":["../../src/common/AsyncQueue.ts"],"sourcesContent":["type Callback<T> = () => Promise<T>\n\nexport type AsyncQueue<T = void> = {\n push: (task: Callback<T>) => Promise<T>\n flush: () => Promise<void>\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<T = void>(opts = { dedupeConcurrent: false }): AsyncQueue<T> {\n const { dedupeConcurrent } = opts\n let queue: Callback<T>[] = []\n let running: Promise<void> | undefined\n let nextPromise = new DeferredPromise<T>()\n const push = (task: Callback<T>) => {\n let taskPromise = new DeferredPromise<T>()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise<T>()\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 = <T = void>(opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue<T> } = {}\n const push = (queueId: string, task: Callback<T>) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise<T = void, E = any> {\n started = false\n resolve: (x: T | PromiseLike<T>) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((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"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBO,SAAS,iBAA2B,OAAO,EAAE,kBAAkB,MAAM,GAAkB;AAC5F,QAAM,EAAE,iBAAiB,IAAI;AAC7B,MAAI,QAAuB,CAAC;AAC5B,MAAI;AACJ,MAAI,cAAc,IAAI,gBAAmB;AACzC,QAAM,OAAO,CAAC,SAAsB;AAClC,QAAI,cAAc,IAAI,gBAAmB;AACzC,QAAI,kBAAkB;AACpB,cAAQ,CAAC;AACT,UAAI,YAAY;AAAS,sBAAc,IAAI,gBAAmB;AAC9D,oBAAc;AAAA,IAChB;AACA,UAAM,KAAK,MAAM;AACf,kBAAY,UAAU;AACtB,WAAK,EAAE,KAAK,YAAY,OAAO,EAAE,MAAM,YAAY,MAAM;AACzD,aAAO,YAAY;AAAA,IACrB,CAAC;AACD,QAAI,CAAC;AAAS,gBAAU,MAAM;AAC9B,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,QAAQ,YAAY;AACxB,WAAO,MAAM,QAAQ;AACnB,YAAM,OAAO,MAAM,MAAM;AACzB,YAAM,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7B;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACxC,IAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAW,OAAO,EAAE,kBAAkB,MAAM,MAAM;AACjF,QAAM,SAA+C,CAAC;AACtD,QAAM,OAAO,CAAC,SAAiB,SAAsB;AACnD,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,YAAoB;AACjC,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,MAAM;AAAA,EAC/B;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,IAAM,kBAAN,MAAyC;AAAA,EAMvC,cAAc;AALd,mBAAU;AACV,mBAA2C,MAAM;AAAA,IAAC;AAClD,kBAAyB,MAAM;AAAA,IAAC;AAI9B,SAAK,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AACF;","names":[]}
|
||||
{"version":3,"sources":["../../src/common/AsyncQueue.ts"],"sourcesContent":["type Callback<T> = () => Promise<T>\n\nexport type AsyncQueue<T = void> = {\n push: (task: Callback<T>) => Promise<T>\n flush: () => Promise<void>\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<T = void>(opts = { dedupeConcurrent: false }): AsyncQueue<T> {\n const { dedupeConcurrent } = opts\n let queue: Callback<T>[] = []\n let running: Promise<void> | undefined\n let nextPromise = new DeferredPromise<T>()\n const push = (task: Callback<T>) => {\n let taskPromise = new DeferredPromise<T>()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise<T>()\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 = <T = void>(opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue<T> } = {}\n const push = (queueId: string, task: Callback<T>) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise<T = void, E = any> {\n started = false\n resolve: (x: T | PromiseLike<T>) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBO,SAAS,iBAA2B,OAAO,EAAE,kBAAkB,MAAM,GAAkB;AAC5F,QAAM,EAAE,iBAAiB,IAAI;AAC7B,MAAI,QAAuB,CAAC;AAC5B,MAAI;AACJ,MAAI,cAAc,IAAI,gBAAmB;AACzC,QAAM,OAAO,CAAC,SAAsB;AAClC,QAAI,cAAc,IAAI,gBAAmB;AACzC,QAAI,kBAAkB;AACpB,cAAQ,CAAC;AACT,UAAI,YAAY;AAAS,sBAAc,IAAI,gBAAmB;AAC9D,oBAAc;AAAA,IAChB;AACA,UAAM,KAAK,MAAM;AACf,kBAAY,UAAU;AACtB,WAAK,EAAE,KAAK,YAAY,OAAO,EAAE,MAAM,YAAY,MAAM;AACzD,aAAO,YAAY;AAAA,IACrB,CAAC;AACD,QAAI,CAAC;AAAS,gBAAU,MAAM;AAC9B,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,QAAQ,YAAY;AACxB,WAAO,MAAM,QAAQ;AACnB,YAAM,OAAO,MAAM,MAAM;AACzB,YAAM,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7B;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACxC,IAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAW,OAAO,EAAE,kBAAkB,MAAM,MAAM;AACjF,QAAM,SAA+C,CAAC;AACtD,QAAM,OAAO,CAAC,SAAiB,SAAsB;AACnD,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,YAAoB;AACjC,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,MAAM;AAAA,EAC/B;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,IAAM,kBAAN,MAAyC;AAAA,EAMvC,cAAc;AALd,mBAAU;AACV,mBAA2C,MAAM;AAAA,IAAC;AAClD,kBAAyB,MAAM;AAAA,IAAC;AAI9B,SAAK,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AACF;","names":[]}
|
2
dist/common/AsyncQueue.js.map
vendored
2
dist/common/AsyncQueue.js.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"sources":["../../src/common/AsyncQueue.ts"],"sourcesContent":["type Callback<T> = () => Promise<T>\n\nexport type AsyncQueue<T = void> = {\n push: (task: Callback<T>) => Promise<T>\n flush: () => Promise<void>\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<T = void>(opts = { dedupeConcurrent: false }): AsyncQueue<T> {\n const { dedupeConcurrent } = opts\n let queue: Callback<T>[] = []\n let running: Promise<void> | undefined\n let nextPromise = new DeferredPromise<T>()\n const push = (task: Callback<T>) => {\n let taskPromise = new DeferredPromise<T>()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise<T>()\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 = <T = void>(opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue<T> } = {}\n const push = (queueId: string, task: Callback<T>) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise<T = void, E = any> {\n started = false\n resolve: (x: T | PromiseLike<T>) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((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"],"mappings":";AAuBO,SAAS,iBAA2B,OAAO,EAAE,kBAAkB,MAAM,GAAkB;AAC5F,QAAM,EAAE,iBAAiB,IAAI;AAC7B,MAAI,QAAuB,CAAC;AAC5B,MAAI;AACJ,MAAI,cAAc,IAAI,gBAAmB;AACzC,QAAM,OAAO,CAAC,SAAsB;AAClC,QAAI,cAAc,IAAI,gBAAmB;AACzC,QAAI,kBAAkB;AACpB,cAAQ,CAAC;AACT,UAAI,YAAY;AAAS,sBAAc,IAAI,gBAAmB;AAC9D,oBAAc;AAAA,IAChB;AACA,UAAM,KAAK,MAAM;AACf,kBAAY,UAAU;AACtB,WAAK,EAAE,KAAK,YAAY,OAAO,EAAE,MAAM,YAAY,MAAM;AACzD,aAAO,YAAY;AAAA,IACrB,CAAC;AACD,QAAI,CAAC;AAAS,gBAAU,MAAM;AAC9B,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,QAAQ,YAAY;AACxB,WAAO,MAAM,QAAQ;AACnB,YAAM,OAAO,MAAM,MAAM;AACzB,YAAM,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7B;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACxC,IAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAW,OAAO,EAAE,kBAAkB,MAAM,MAAM;AACjF,QAAM,SAA+C,CAAC;AACtD,QAAM,OAAO,CAAC,SAAiB,SAAsB;AACnD,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,YAAoB;AACjC,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,MAAM;AAAA,EAC/B;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,IAAM,kBAAN,MAAyC;AAAA,EAMvC,cAAc;AALd,mBAAU;AACV,mBAA2C,MAAM;AAAA,IAAC;AAClD,kBAAyB,MAAM;AAAA,IAAC;AAI9B,SAAK,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AACF;","names":[]}
|
||||
{"version":3,"sources":["../../src/common/AsyncQueue.ts"],"sourcesContent":["type Callback<T> = () => Promise<T>\n\nexport type AsyncQueue<T = void> = {\n push: (task: Callback<T>) => Promise<T>\n flush: () => Promise<void>\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<T = void>(opts = { dedupeConcurrent: false }): AsyncQueue<T> {\n const { dedupeConcurrent } = opts\n let queue: Callback<T>[] = []\n let running: Promise<void> | undefined\n let nextPromise = new DeferredPromise<T>()\n const push = (task: Callback<T>) => {\n let taskPromise = new DeferredPromise<T>()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise<T>()\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 = <T = void>(opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue<T> } = {}\n const push = (queueId: string, task: Callback<T>) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue<T>(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise<T = void, E = any> {\n started = false\n resolve: (x: T | PromiseLike<T>) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n"],"mappings":";AAuBO,SAAS,iBAA2B,OAAO,EAAE,kBAAkB,MAAM,GAAkB;AAC5F,QAAM,EAAE,iBAAiB,IAAI;AAC7B,MAAI,QAAuB,CAAC;AAC5B,MAAI;AACJ,MAAI,cAAc,IAAI,gBAAmB;AACzC,QAAM,OAAO,CAAC,SAAsB;AAClC,QAAI,cAAc,IAAI,gBAAmB;AACzC,QAAI,kBAAkB;AACpB,cAAQ,CAAC;AACT,UAAI,YAAY;AAAS,sBAAc,IAAI,gBAAmB;AAC9D,oBAAc;AAAA,IAChB;AACA,UAAM,KAAK,MAAM;AACf,kBAAY,UAAU;AACtB,WAAK,EAAE,KAAK,YAAY,OAAO,EAAE,MAAM,YAAY,MAAM;AACzD,aAAO,YAAY;AAAA,IACrB,CAAC;AACD,QAAI,CAAC;AAAS,gBAAU,MAAM;AAC9B,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,QAAQ,YAAY;AACxB,WAAO,MAAM,QAAQ;AACnB,YAAM,OAAO,MAAM,MAAM;AACzB,YAAM,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7B;AACA,cAAU;AAAA,EACZ;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACxC,IAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAW,OAAO,EAAE,kBAAkB,MAAM,MAAM;AACjF,QAAM,SAA+C,CAAC;AACtD,QAAM,OAAO,CAAC,SAAiB,SAAsB;AACnD,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,YAAoB;AACjC,QAAI,CAAC,OAAO,OAAO;AAAG,aAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,MAAM;AAAA,EAC/B;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,IAAM,kBAAN,MAAyC;AAAA,EAMvC,cAAc;AALd,mBAAU;AACV,mBAA2C,MAAM;AAAA,IAAC;AAClD,kBAAyB,MAAM;AAAA,IAAC;AAI9B,SAAK,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC1C,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AACF;","names":[]}
|
2
dist/common/SyncLocker.cjs.map
vendored
2
dist/common/SyncLocker.cjs.map
vendored
@ -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<string, boolean> = 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<T extends new (...args: any[]) => any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = <T extends new (...args: any[]) => any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton<T>, 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":[]}
|
||||
{"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<string, boolean> = 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 * Singletonize a class\n * Usage:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * It can also be used without a decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() // returns `true`\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton<T extends new (...args: any[]) => any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = <T extends new (...args: any[]) => any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton<T>, 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":[]}
|
2
dist/common/SyncLocker.js.map
vendored
2
dist/common/SyncLocker.js.map
vendored
@ -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<T extends new (...args: any[]) => any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = <T extends new (...args: any[]) => any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton<T>, 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<string, boolean> = 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":[]}
|
||||
{"version":3,"sources":["../../src/decorators/singleton.ts","../../src/common/ZError.ts","../../src/common/SyncLocker.ts"],"sourcesContent":["/**\n * Singletonize a class\n * Usage:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * It can also be used without a decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() // returns `true`\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton<T extends new (...args: any[]) => any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = <T extends new (...args: any[]) => any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton<T>, 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<string, boolean> = 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":[]}
|
2
dist/index.cjs
vendored
2
dist/index.cjs
vendored
@ -439,7 +439,7 @@ function router(route) {
|
||||
}
|
||||
const split = route.split(" ");
|
||||
if (split.length > 2) {
|
||||
throw new Error("\u8DEF\u7531\u4E2D\u53EA\u5141\u8BB8\u4E00\u4E2A\u7A7A\u683C");
|
||||
throw new Error("Only one space is allowed in @router()");
|
||||
}
|
||||
const [method, path] = split;
|
||||
const key = target[name];
|
||||
|
2
dist/index.cjs.map
vendored
2
dist/index.cjs.map
vendored
File diff suppressed because one or more lines are too long
10
dist/index.d.cts
vendored
10
dist/index.d.cts
vendored
@ -78,19 +78,19 @@ declare function router(route?: string): (target: BaseController, name: string,
|
||||
declare function role(roles?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||
declare function permission(permissions?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||
/**
|
||||
* 有dept修饰器的, 需要验证部门id是否存在
|
||||
* If there is a dept modifier, you need to verify whether the department id exists.
|
||||
*/
|
||||
declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||
|
||||
/**
|
||||
* 单例化一个class
|
||||
* 使用方法:
|
||||
* Singletonize a class
|
||||
* Usage:
|
||||
* @singleton
|
||||
* class Test {}
|
||||
* new Test() === new Test() // returns `true`
|
||||
* 也可以不使用 decorator
|
||||
* It can also be used without a decorator
|
||||
* const TestSingleton = singleton(Test)
|
||||
* new TestSingleton() === new TestSingleton() //returns 'true'
|
||||
* new TestSingleton() === new TestSingleton() // returns `true`
|
||||
*/
|
||||
declare const SINGLETON_KEY: unique symbol;
|
||||
type Singleton<T extends new (...args: any[]) => any> = T & {
|
||||
|
10
dist/index.d.ts
vendored
10
dist/index.d.ts
vendored
@ -78,19 +78,19 @@ declare function router(route?: string): (target: BaseController, name: string,
|
||||
declare function role(roles?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||
declare function permission(permissions?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||
/**
|
||||
* 有dept修饰器的, 需要验证部门id是否存在
|
||||
* If there is a dept modifier, you need to verify whether the department id exists.
|
||||
*/
|
||||
declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void;
|
||||
|
||||
/**
|
||||
* 单例化一个class
|
||||
* 使用方法:
|
||||
* Singletonize a class
|
||||
* Usage:
|
||||
* @singleton
|
||||
* class Test {}
|
||||
* new Test() === new Test() // returns `true`
|
||||
* 也可以不使用 decorator
|
||||
* It can also be used without a decorator
|
||||
* const TestSingleton = singleton(Test)
|
||||
* new TestSingleton() === new TestSingleton() //returns 'true'
|
||||
* new TestSingleton() === new TestSingleton() // returns `true`
|
||||
*/
|
||||
declare const SINGLETON_KEY: unique symbol;
|
||||
type Singleton<T extends new (...args: any[]) => any> = T & {
|
||||
|
2
dist/index.js
vendored
2
dist/index.js
vendored
@ -403,7 +403,7 @@ function router(route) {
|
||||
}
|
||||
const split = route.split(" ");
|
||||
if (split.length > 2) {
|
||||
throw new Error("\u8DEF\u7531\u4E2D\u53EA\u5141\u8BB8\u4E00\u4E2A\u7A7A\u683C");
|
||||
throw new Error("Only one space is allowed in @router()");
|
||||
}
|
||||
const [method, path] = split;
|
||||
const key = target[name];
|
||||
|
2
dist/index.js.map
vendored
2
dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/chain.util.cjs.map
vendored
2
dist/utils/chain.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/chain.util.js.map
vendored
2
dist/utils/chain.util.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/curry.util.cjs.map
vendored
2
dist/utils/curry.util.cjs.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"sources":["../../src/utils/curry.util.ts"],"sourcesContent":["/**\n * 柯里化一个函数\n * @param func\n * @returns\n */\nexport function curry(func: (...args0: any[]) => any) {\n return function curried(this: unknown, ...args: any[]) {\n if (args.length >= func.length) {\n return func.apply(this, args);\n } else {\n return function (this: unknown, ...args2: any[]) {\n return curried.apply(this, args.concat(args2));\n };\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,SAAS,MAAM,MAAgC;AACpD,SAAO,SAAS,WAA0B,MAAa;AACrD,QAAI,KAAK,UAAU,KAAK,QAAQ;AAC9B,aAAO,KAAK,MAAM,MAAM,IAAI;AAAA,IAC9B,OAAO;AACL,aAAO,YAA4B,OAAc;AAC/C,eAAO,QAAQ,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
||||
{"version":3,"sources":["../../src/utils/curry.util.ts"],"sourcesContent":["/**\n * Currying a function\n * @param func\n * @returns\n */\nexport function curry(func: (...args0: any[]) => any) {\n return function curried(this: unknown, ...args: any[]) {\n if (args.length >= func.length) {\n return func.apply(this, args)\n } else {\n return function (this: unknown, ...args2: any[]) {\n return curried.apply(this, args.concat(args2))\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,SAAS,MAAM,MAAgC;AACpD,SAAO,SAAS,WAA0B,MAAa;AACrD,QAAI,KAAK,UAAU,KAAK,QAAQ;AAC9B,aAAO,KAAK,MAAM,MAAM,IAAI;AAAA,IAC9B,OAAO;AACL,aAAO,YAA4B,OAAc;AAC/C,eAAO,QAAQ,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
2
dist/utils/curry.util.d.cts
vendored
2
dist/utils/curry.util.d.cts
vendored
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 柯里化一个函数
|
||||
* Currying a function
|
||||
* @param func
|
||||
* @returns
|
||||
*/
|
||||
|
2
dist/utils/curry.util.d.ts
vendored
2
dist/utils/curry.util.d.ts
vendored
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 柯里化一个函数
|
||||
* Currying a function
|
||||
* @param func
|
||||
* @returns
|
||||
*/
|
||||
|
2
dist/utils/curry.util.js.map
vendored
2
dist/utils/curry.util.js.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"sources":["../../src/utils/curry.util.ts"],"sourcesContent":["/**\n * 柯里化一个函数\n * @param func\n * @returns\n */\nexport function curry(func: (...args0: any[]) => any) {\n return function curried(this: unknown, ...args: any[]) {\n if (args.length >= func.length) {\n return func.apply(this, args);\n } else {\n return function (this: unknown, ...args2: any[]) {\n return curried.apply(this, args.concat(args2));\n };\n }\n };\n}\n"],"mappings":";AAKO,SAAS,MAAM,MAAgC;AACpD,SAAO,SAAS,WAA0B,MAAa;AACrD,QAAI,KAAK,UAAU,KAAK,QAAQ;AAC9B,aAAO,KAAK,MAAM,MAAM,IAAI;AAAA,IAC9B,OAAO;AACL,aAAO,YAA4B,OAAc;AAC/C,eAAO,QAAQ,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
||||
{"version":3,"sources":["../../src/utils/curry.util.ts"],"sourcesContent":["/**\n * Currying a function\n * @param func\n * @returns\n */\nexport function curry(func: (...args0: any[]) => any) {\n return function curried(this: unknown, ...args: any[]) {\n if (args.length >= func.length) {\n return func.apply(this, args)\n } else {\n return function (this: unknown, ...args2: any[]) {\n return curried.apply(this, args.concat(args2))\n }\n }\n }\n}\n"],"mappings":";AAKO,SAAS,MAAM,MAAgC;AACpD,SAAO,SAAS,WAA0B,MAAa;AACrD,QAAI,KAAK,UAAU,KAAK,QAAQ;AAC9B,aAAO,KAAK,MAAM,MAAM,IAAI;AAAA,IAC9B,OAAO;AACL,aAAO,YAA4B,OAAc;AAC/C,eAAO,QAAQ,MAAM,MAAM,KAAK,OAAO,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
2
dist/utils/date.util.cjs.map
vendored
2
dist/utils/date.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
14
dist/utils/date.util.d.cts
vendored
14
dist/utils/date.util.d.cts
vendored
@ -15,7 +15,7 @@ declare const getMonthBegin: (date: Date) => Date;
|
||||
declare function timeBeforeDay(day: number): number;
|
||||
declare function calcBetweenDays(time1: number, time2: number): number;
|
||||
/**
|
||||
* 判断是否是今天
|
||||
* check if the time is today
|
||||
* @param {number} time
|
||||
* @return {boolean}
|
||||
*/
|
||||
@ -39,8 +39,8 @@ declare function getThisWeekData(): {
|
||||
endDay: string;
|
||||
};
|
||||
/**
|
||||
* 获取前后n周的周一和周日的日期
|
||||
* @param {number} n 0为当前周, 1为下一周, -1为上周
|
||||
* Get the start and end dates of the Monday and Sunday of the previous or next n weeks.
|
||||
* @param {number} n 0 for the current week, 1 for the next week, -1 for the previous week
|
||||
* @return {{startDay: string, endDay: string}}
|
||||
*/
|
||||
declare function weekData(n: number): {
|
||||
@ -48,10 +48,10 @@ declare function weekData(n: number): {
|
||||
endDay: string;
|
||||
};
|
||||
/**
|
||||
* 将秒格式化成 hh:mm:ss的字符串
|
||||
* @param {number} sec
|
||||
* @param {boolean} showSeconds 是否显示秒
|
||||
*/
|
||||
* Format seconds into a string in the format hh:mm:ss
|
||||
* @param {number} sec
|
||||
* @param {boolean} showSeconds Whether to display seconds
|
||||
*/
|
||||
declare const second2str: (sec: number, showSeconds: boolean) => string;
|
||||
|
||||
export { ONE_DAY, ONE_DAY_SECONDS, calcBetweenDays, daysBetween, formatDate, getDayBegin, getMonthBegin, getNDayAgo, getThisWeekData, isToday, nextday, second2str, timeBeforeDay, todayEnd, todayStart, weekData, yesterday };
|
||||
|
14
dist/utils/date.util.d.ts
vendored
14
dist/utils/date.util.d.ts
vendored
@ -15,7 +15,7 @@ declare const getMonthBegin: (date: Date) => Date;
|
||||
declare function timeBeforeDay(day: number): number;
|
||||
declare function calcBetweenDays(time1: number, time2: number): number;
|
||||
/**
|
||||
* 判断是否是今天
|
||||
* check if the time is today
|
||||
* @param {number} time
|
||||
* @return {boolean}
|
||||
*/
|
||||
@ -39,8 +39,8 @@ declare function getThisWeekData(): {
|
||||
endDay: string;
|
||||
};
|
||||
/**
|
||||
* 获取前后n周的周一和周日的日期
|
||||
* @param {number} n 0为当前周, 1为下一周, -1为上周
|
||||
* Get the start and end dates of the Monday and Sunday of the previous or next n weeks.
|
||||
* @param {number} n 0 for the current week, 1 for the next week, -1 for the previous week
|
||||
* @return {{startDay: string, endDay: string}}
|
||||
*/
|
||||
declare function weekData(n: number): {
|
||||
@ -48,10 +48,10 @@ declare function weekData(n: number): {
|
||||
endDay: string;
|
||||
};
|
||||
/**
|
||||
* 将秒格式化成 hh:mm:ss的字符串
|
||||
* @param {number} sec
|
||||
* @param {boolean} showSeconds 是否显示秒
|
||||
*/
|
||||
* Format seconds into a string in the format hh:mm:ss
|
||||
* @param {number} sec
|
||||
* @param {boolean} showSeconds Whether to display seconds
|
||||
*/
|
||||
declare const second2str: (sec: number, showSeconds: boolean) => string;
|
||||
|
||||
export { ONE_DAY, ONE_DAY_SECONDS, calcBetweenDays, daysBetween, formatDate, getDayBegin, getMonthBegin, getNDayAgo, getThisWeekData, isToday, nextday, second2str, timeBeforeDay, todayEnd, todayStart, weekData, yesterday };
|
||||
|
2
dist/utils/date.util.js.map
vendored
2
dist/utils/date.util.js.map
vendored
File diff suppressed because one or more lines are too long
6
dist/utils/net.util.cjs
vendored
6
dist/utils/net.util.cjs
vendored
@ -194,11 +194,7 @@ function findUrlScheme(url) {
|
||||
function decodeJWT(token) {
|
||||
let strings = token.split(".");
|
||||
var userinfo = JSON.parse(
|
||||
decodeURIComponent(
|
||||
encodeURIComponent(
|
||||
window.atob(strings[1].replace(/-/g, "+").replace(/_/g, "/"))
|
||||
)
|
||||
)
|
||||
decodeURIComponent(encodeURIComponent(window.atob(strings[1].replace(/-/g, "+").replace(/_/g, "/"))))
|
||||
);
|
||||
return userinfo;
|
||||
}
|
||||
|
2
dist/utils/net.util.cjs.map
vendored
2
dist/utils/net.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
6
dist/utils/net.util.js
vendored
6
dist/utils/net.util.js
vendored
@ -149,11 +149,7 @@ function findUrlScheme(url) {
|
||||
function decodeJWT(token) {
|
||||
let strings = token.split(".");
|
||||
var userinfo = JSON.parse(
|
||||
decodeURIComponent(
|
||||
encodeURIComponent(
|
||||
window.atob(strings[1].replace(/-/g, "+").replace(/_/g, "/"))
|
||||
)
|
||||
)
|
||||
decodeURIComponent(encodeURIComponent(window.atob(strings[1].replace(/-/g, "+").replace(/_/g, "/"))))
|
||||
);
|
||||
return userinfo;
|
||||
}
|
||||
|
2
dist/utils/net.util.js.map
vendored
2
dist/utils/net.util.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/number.util.cjs.map
vendored
2
dist/utils/number.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
10
dist/utils/number.util.d.cts
vendored
10
dist/utils/number.util.d.cts
vendored
@ -74,11 +74,11 @@ declare function fastSplit(value: any, divider?: string): any;
|
||||
declare function stripHexPrefix(str: string): string;
|
||||
declare function numberToBN(arg: any): BN;
|
||||
/**
|
||||
* 将num从base进制转为to指定的进制
|
||||
* @param {string} numStr 要转换的数字字符串
|
||||
* @param {number} base num的进制
|
||||
* @param {number} to 转换后的进制
|
||||
* @return {string}
|
||||
* Converts a number from the base specified by `base` to the base specified by `to`.
|
||||
* @param {string} numStr - The number string to be converted.
|
||||
* @param {number} base - The base of the number.
|
||||
* @param {number} to - The target base for the conversion.
|
||||
* @return {string} - The converted number string.
|
||||
*/
|
||||
declare function convert({ numStr, base, to, alphabet, }: {
|
||||
numStr: string;
|
||||
|
10
dist/utils/number.util.d.ts
vendored
10
dist/utils/number.util.d.ts
vendored
@ -74,11 +74,11 @@ declare function fastSplit(value: any, divider?: string): any;
|
||||
declare function stripHexPrefix(str: string): string;
|
||||
declare function numberToBN(arg: any): BN;
|
||||
/**
|
||||
* 将num从base进制转为to指定的进制
|
||||
* @param {string} numStr 要转换的数字字符串
|
||||
* @param {number} base num的进制
|
||||
* @param {number} to 转换后的进制
|
||||
* @return {string}
|
||||
* Converts a number from the base specified by `base` to the base specified by `to`.
|
||||
* @param {string} numStr - The number string to be converted.
|
||||
* @param {number} base - The base of the number.
|
||||
* @param {number} to - The target base for the conversion.
|
||||
* @return {string} - The converted number string.
|
||||
*/
|
||||
declare function convert({ numStr, base, to, alphabet, }: {
|
||||
numStr: string;
|
||||
|
2
dist/utils/number.util.js.map
vendored
2
dist/utils/number.util.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/promise.util.cjs.map
vendored
2
dist/utils/promise.util.cjs.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"sources":["../../src/utils/promise.util.ts"],"sourcesContent":["type RetryOptions = {\n maxRetries: number\n whitelistErrors: Error[]\n}\n/**\n * 使用:\n * retry(() => fetch(\"https://example.com\"), { maxRetries: 3, whitelistErrors: [] })\n * .then((response) => console.log(response))\n * .catch((error) => console.error(error));\n * @param promiseFn\n * @param options\n * @returns\n */\nexport function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T> {\n let retries = 0\n let defaultOptions = {\n maxRetries: 3,\n whitelistErrors: [],\n }\n Object.assign(defaultOptions, options)\n const { maxRetries, whitelistErrors } = options\n\n const retryPromise = async (): Promise<T> => {\n try {\n return await promiseFn()\n } catch (err) {\n if (\n retries < maxRetries &&\n whitelistErrors.some(whitelistedError => err instanceof whitelistedError.constructor)\n ) {\n retries++\n return retryPromise()\n }\n throw err\n }\n }\n\n return retryPromise()\n}\n/**\n * 构建一个promise, 在\n * usage:\n * function delay(ms: number): Promise<void> {\n const deferred = new Deferred<void>();\n\n setTimeout(() => {\n deferred.resolve();\n }, ms);\n\n return deferred.promise;\n }\n\n console.log(\"start\");\n\n delay(1000).then(() => {\n console.log(\"after 1 second\");\n });\n\n console.log(\"end\");\n */\nexport class Deferred<T = any> {\n private _resolve!: (value: T | PromiseLike<T>) => void\n private _reject!: (reason?: any) => void\n\n public readonly promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n public resolve(value: T | PromiseLike<T>): void {\n this._resolve(value)\n }\n\n public reject(reason?: any): void {\n this._reject(reason)\n }\n\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n ): Promise<TResult1 | TResult2> {\n return this.promise.then(onfulfilled, onrejected)\n }\n\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n ): Promise<T | TResult> {\n return this.promise.catch(onrejected)\n }\n}\n\n/**\n * 简单限流的 Promise 队列\n * usage:\n const q = new PromiseQueue();\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {\n q.add(\n () =>\n new Promise((resolve) => {\n setTimeout(() => {\n console.log(v);\n resolve();\n }, 1000);\n })\n );\n});\n */\nexport class PromiseQueue {\n private readonly concurrency: number\n private _current: number = 0\n private _list: (() => Promise<any>)[] = []\n\n constructor({ concurrency = 2 }: { concurrency: number }) {\n this.concurrency = concurrency\n }\n\n add(promiseFn: () => Promise<any>) {\n this._list.push(promiseFn)\n this.loadNext()\n }\n\n loadNext() {\n if (this._list.length === 0 || this.concurrency === this._current) return\n this._current++\n const fn = this._list.shift()!\n const promise = fn.call(this)\n promise.then(this.onLoaded.bind(this)).catch(this.onLoaded.bind(this))\n }\n\n onLoaded() {\n this._current--\n this.loadNext()\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,MAAS,WAA6B,SAAmC;AACvF,MAAI,UAAU;AACd,MAAI,iBAAiB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB,CAAC;AAAA,EACpB;AACA,SAAO,OAAO,gBAAgB,OAAO;AACrC,QAAM,EAAE,YAAY,gBAAgB,IAAI;AAExC,QAAM,eAAe,YAAwB;AAC3C,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,KAAK;AACZ,UACE,UAAU,cACV,gBAAgB,KAAK,sBAAoB,eAAe,iBAAiB,WAAW,GACpF;AACA;AACA,eAAO,aAAa;AAAA,MACtB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAsBO,IAAM,WAAN,MAAwB;AAAA,EAM7B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEO,QAAQ,OAAiC;AAC9C,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEO,OAAO,QAAoB;AAChC,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEO,KACL,aACA,YAC8B;AAC9B,WAAO,KAAK,QAAQ,KAAK,aAAa,UAAU;AAAA,EAClD;AAAA,EAEO,MACL,YACsB;AACtB,WAAO,KAAK,QAAQ,MAAM,UAAU;AAAA,EACtC;AACF;AAkBO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,EAAE,cAAc,EAAE,GAA4B;AAH1D,SAAQ,WAAmB;AAC3B,SAAQ,QAAgC,CAAC;AAGvC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,SAAK,MAAM,KAAK,SAAS;AACzB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,MAAM,WAAW,KAAK,KAAK,gBAAgB,KAAK;AAAU;AACnE,SAAK;AACL,UAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAM,UAAU,GAAG,KAAK,IAAI;AAC5B,YAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,WAAW;AACT,SAAK;AACL,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]}
|
||||
{"version":3,"sources":["../../src/utils/promise.util.ts"],"sourcesContent":["type RetryOptions = {\n maxRetries: number\n whitelistErrors: Error[]\n}\n/**\n * Usage:\n * retry(() => fetch(\"https://example.com\"), { maxRetries: 3, whitelistErrors: [] })\n * .then((response) => console.log(response))\n * .catch((error) => console.error(error));\n * @param promiseFn\n * @param options\n * @returns\n */\nexport function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T> {\n let retries = 0\n let defaultOptions = {\n maxRetries: 3,\n whitelistErrors: [],\n }\n Object.assign(defaultOptions, options)\n const { maxRetries, whitelistErrors } = options\n\n const retryPromise = async (): Promise<T> => {\n try {\n return await promiseFn()\n } catch (err) {\n if (\n retries < maxRetries &&\n whitelistErrors.some(whitelistedError => err instanceof whitelistedError.constructor)\n ) {\n retries++\n return retryPromise()\n }\n throw err\n }\n }\n\n return retryPromise()\n}\n/**\n * 构建一个promise, 可以在任意时刻resolve或reject\n * Usage:\n * function delay(ms: number): Promise<void> {\n const deferred = new Deferred<void>();\n\n setTimeout(() => {\n deferred.resolve();\n }, ms);\n\n return deferred.promise;\n }\n\n console.log(\"start\");\n\n delay(1000).then(() => {\n console.log(\"after 1 second\");\n });\n\n console.log(\"end\");\n */\nexport class Deferred<T = any> {\n private _resolve!: (value: T | PromiseLike<T>) => void\n private _reject!: (reason?: any) => void\n\n public readonly promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n public resolve(value: T | PromiseLike<T>): void {\n this._resolve(value)\n }\n\n public reject(reason?: any): void {\n this._reject(reason)\n }\n\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n ): Promise<TResult1 | TResult2> {\n return this.promise.then(onfulfilled, onrejected)\n }\n\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n ): Promise<T | TResult> {\n return this.promise.catch(onrejected)\n }\n}\n\n/**\n * 简单限流的 Promise 队列\n * Usage:\n const q = new PromiseQueue();\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {\n q.add(\n () =>\n new Promise((resolve) => {\n setTimeout(() => {\n console.log(v);\n resolve();\n }, 1000);\n })\n );\n});\n */\nexport class PromiseQueue {\n private readonly concurrency: number\n private _current: number = 0\n private _list: (() => Promise<any>)[] = []\n\n constructor({ concurrency = 2 }: { concurrency: number }) {\n this.concurrency = concurrency\n }\n\n add(promiseFn: () => Promise<any>) {\n this._list.push(promiseFn)\n this.loadNext()\n }\n\n loadNext() {\n if (this._list.length === 0 || this.concurrency === this._current) return\n this._current++\n const fn = this._list.shift()!\n const promise = fn.call(this)\n promise.then(this.onLoaded.bind(this)).catch(this.onLoaded.bind(this))\n }\n\n onLoaded() {\n this._current--\n this.loadNext()\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,MAAS,WAA6B,SAAmC;AACvF,MAAI,UAAU;AACd,MAAI,iBAAiB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB,CAAC;AAAA,EACpB;AACA,SAAO,OAAO,gBAAgB,OAAO;AACrC,QAAM,EAAE,YAAY,gBAAgB,IAAI;AAExC,QAAM,eAAe,YAAwB;AAC3C,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,KAAK;AACZ,UACE,UAAU,cACV,gBAAgB,KAAK,sBAAoB,eAAe,iBAAiB,WAAW,GACpF;AACA;AACA,eAAO,aAAa;AAAA,MACtB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAsBO,IAAM,WAAN,MAAwB;AAAA,EAM7B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEO,QAAQ,OAAiC;AAC9C,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEO,OAAO,QAAoB;AAChC,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEO,KACL,aACA,YAC8B;AAC9B,WAAO,KAAK,QAAQ,KAAK,aAAa,UAAU;AAAA,EAClD;AAAA,EAEO,MACL,YACsB;AACtB,WAAO,KAAK,QAAQ,MAAM,UAAU;AAAA,EACtC;AACF;AAkBO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,EAAE,cAAc,EAAE,GAA4B;AAH1D,SAAQ,WAAmB;AAC3B,SAAQ,QAAgC,CAAC;AAGvC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,SAAK,MAAM,KAAK,SAAS;AACzB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,MAAM,WAAW,KAAK,KAAK,gBAAgB,KAAK;AAAU;AACnE,SAAK;AACL,UAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAM,UAAU,GAAG,KAAK,IAAI;AAC5B,YAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,WAAW;AACT,SAAK;AACL,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]}
|
8
dist/utils/promise.util.d.cts
vendored
8
dist/utils/promise.util.d.cts
vendored
@ -3,7 +3,7 @@ type RetryOptions = {
|
||||
whitelistErrors: Error[];
|
||||
};
|
||||
/**
|
||||
* 使用:
|
||||
* Usage:
|
||||
* retry(() => fetch("https://example.com"), { maxRetries: 3, whitelistErrors: [] })
|
||||
* .then((response) => console.log(response))
|
||||
* .catch((error) => console.error(error));
|
||||
@ -13,8 +13,8 @@ type RetryOptions = {
|
||||
*/
|
||||
declare function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T>;
|
||||
/**
|
||||
* 构建一个promise, 在
|
||||
* usage:
|
||||
* 构建一个promise, 可以在任意时刻resolve或reject
|
||||
* Usage:
|
||||
* function delay(ms: number): Promise<void> {
|
||||
const deferred = new Deferred<void>();
|
||||
|
||||
@ -45,7 +45,7 @@ declare class Deferred<T = any> {
|
||||
}
|
||||
/**
|
||||
* 简单限流的 Promise 队列
|
||||
* usage:
|
||||
* Usage:
|
||||
const q = new PromiseQueue();
|
||||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {
|
||||
q.add(
|
||||
|
8
dist/utils/promise.util.d.ts
vendored
8
dist/utils/promise.util.d.ts
vendored
@ -3,7 +3,7 @@ type RetryOptions = {
|
||||
whitelistErrors: Error[];
|
||||
};
|
||||
/**
|
||||
* 使用:
|
||||
* Usage:
|
||||
* retry(() => fetch("https://example.com"), { maxRetries: 3, whitelistErrors: [] })
|
||||
* .then((response) => console.log(response))
|
||||
* .catch((error) => console.error(error));
|
||||
@ -13,8 +13,8 @@ type RetryOptions = {
|
||||
*/
|
||||
declare function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T>;
|
||||
/**
|
||||
* 构建一个promise, 在
|
||||
* usage:
|
||||
* 构建一个promise, 可以在任意时刻resolve或reject
|
||||
* Usage:
|
||||
* function delay(ms: number): Promise<void> {
|
||||
const deferred = new Deferred<void>();
|
||||
|
||||
@ -45,7 +45,7 @@ declare class Deferred<T = any> {
|
||||
}
|
||||
/**
|
||||
* 简单限流的 Promise 队列
|
||||
* usage:
|
||||
* Usage:
|
||||
const q = new PromiseQueue();
|
||||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {
|
||||
q.add(
|
||||
|
2
dist/utils/promise.util.js.map
vendored
2
dist/utils/promise.util.js.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"sources":["../../src/utils/promise.util.ts"],"sourcesContent":["type RetryOptions = {\n maxRetries: number\n whitelistErrors: Error[]\n}\n/**\n * 使用:\n * retry(() => fetch(\"https://example.com\"), { maxRetries: 3, whitelistErrors: [] })\n * .then((response) => console.log(response))\n * .catch((error) => console.error(error));\n * @param promiseFn\n * @param options\n * @returns\n */\nexport function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T> {\n let retries = 0\n let defaultOptions = {\n maxRetries: 3,\n whitelistErrors: [],\n }\n Object.assign(defaultOptions, options)\n const { maxRetries, whitelistErrors } = options\n\n const retryPromise = async (): Promise<T> => {\n try {\n return await promiseFn()\n } catch (err) {\n if (\n retries < maxRetries &&\n whitelistErrors.some(whitelistedError => err instanceof whitelistedError.constructor)\n ) {\n retries++\n return retryPromise()\n }\n throw err\n }\n }\n\n return retryPromise()\n}\n/**\n * 构建一个promise, 在\n * usage:\n * function delay(ms: number): Promise<void> {\n const deferred = new Deferred<void>();\n\n setTimeout(() => {\n deferred.resolve();\n }, ms);\n\n return deferred.promise;\n }\n\n console.log(\"start\");\n\n delay(1000).then(() => {\n console.log(\"after 1 second\");\n });\n\n console.log(\"end\");\n */\nexport class Deferred<T = any> {\n private _resolve!: (value: T | PromiseLike<T>) => void\n private _reject!: (reason?: any) => void\n\n public readonly promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n public resolve(value: T | PromiseLike<T>): void {\n this._resolve(value)\n }\n\n public reject(reason?: any): void {\n this._reject(reason)\n }\n\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n ): Promise<TResult1 | TResult2> {\n return this.promise.then(onfulfilled, onrejected)\n }\n\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n ): Promise<T | TResult> {\n return this.promise.catch(onrejected)\n }\n}\n\n/**\n * 简单限流的 Promise 队列\n * usage:\n const q = new PromiseQueue();\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {\n q.add(\n () =>\n new Promise((resolve) => {\n setTimeout(() => {\n console.log(v);\n resolve();\n }, 1000);\n })\n );\n});\n */\nexport class PromiseQueue {\n private readonly concurrency: number\n private _current: number = 0\n private _list: (() => Promise<any>)[] = []\n\n constructor({ concurrency = 2 }: { concurrency: number }) {\n this.concurrency = concurrency\n }\n\n add(promiseFn: () => Promise<any>) {\n this._list.push(promiseFn)\n this.loadNext()\n }\n\n loadNext() {\n if (this._list.length === 0 || this.concurrency === this._current) return\n this._current++\n const fn = this._list.shift()!\n const promise = fn.call(this)\n promise.then(this.onLoaded.bind(this)).catch(this.onLoaded.bind(this))\n }\n\n onLoaded() {\n this._current--\n this.loadNext()\n }\n}\n"],"mappings":";AAaO,SAAS,MAAS,WAA6B,SAAmC;AACvF,MAAI,UAAU;AACd,MAAI,iBAAiB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB,CAAC;AAAA,EACpB;AACA,SAAO,OAAO,gBAAgB,OAAO;AACrC,QAAM,EAAE,YAAY,gBAAgB,IAAI;AAExC,QAAM,eAAe,YAAwB;AAC3C,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,KAAK;AACZ,UACE,UAAU,cACV,gBAAgB,KAAK,sBAAoB,eAAe,iBAAiB,WAAW,GACpF;AACA;AACA,eAAO,aAAa;AAAA,MACtB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAsBO,IAAM,WAAN,MAAwB;AAAA,EAM7B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEO,QAAQ,OAAiC;AAC9C,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEO,OAAO,QAAoB;AAChC,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEO,KACL,aACA,YAC8B;AAC9B,WAAO,KAAK,QAAQ,KAAK,aAAa,UAAU;AAAA,EAClD;AAAA,EAEO,MACL,YACsB;AACtB,WAAO,KAAK,QAAQ,MAAM,UAAU;AAAA,EACtC;AACF;AAkBO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,EAAE,cAAc,EAAE,GAA4B;AAH1D,SAAQ,WAAmB;AAC3B,SAAQ,QAAgC,CAAC;AAGvC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,SAAK,MAAM,KAAK,SAAS;AACzB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,MAAM,WAAW,KAAK,KAAK,gBAAgB,KAAK;AAAU;AACnE,SAAK;AACL,UAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAM,UAAU,GAAG,KAAK,IAAI;AAC5B,YAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,WAAW;AACT,SAAK;AACL,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]}
|
||||
{"version":3,"sources":["../../src/utils/promise.util.ts"],"sourcesContent":["type RetryOptions = {\n maxRetries: number\n whitelistErrors: Error[]\n}\n/**\n * Usage:\n * retry(() => fetch(\"https://example.com\"), { maxRetries: 3, whitelistErrors: [] })\n * .then((response) => console.log(response))\n * .catch((error) => console.error(error));\n * @param promiseFn\n * @param options\n * @returns\n */\nexport function retry<T>(promiseFn: () => Promise<T>, options: RetryOptions): Promise<T> {\n let retries = 0\n let defaultOptions = {\n maxRetries: 3,\n whitelistErrors: [],\n }\n Object.assign(defaultOptions, options)\n const { maxRetries, whitelistErrors } = options\n\n const retryPromise = async (): Promise<T> => {\n try {\n return await promiseFn()\n } catch (err) {\n if (\n retries < maxRetries &&\n whitelistErrors.some(whitelistedError => err instanceof whitelistedError.constructor)\n ) {\n retries++\n return retryPromise()\n }\n throw err\n }\n }\n\n return retryPromise()\n}\n/**\n * 构建一个promise, 可以在任意时刻resolve或reject\n * Usage:\n * function delay(ms: number): Promise<void> {\n const deferred = new Deferred<void>();\n\n setTimeout(() => {\n deferred.resolve();\n }, ms);\n\n return deferred.promise;\n }\n\n console.log(\"start\");\n\n delay(1000).then(() => {\n console.log(\"after 1 second\");\n });\n\n console.log(\"end\");\n */\nexport class Deferred<T = any> {\n private _resolve!: (value: T | PromiseLike<T>) => void\n private _reject!: (reason?: any) => void\n\n public readonly promise: Promise<T>\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n public resolve(value: T | PromiseLike<T>): void {\n this._resolve(value)\n }\n\n public reject(reason?: any): void {\n this._reject(reason)\n }\n\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n ): Promise<TResult1 | TResult2> {\n return this.promise.then(onfulfilled, onrejected)\n }\n\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n ): Promise<T | TResult> {\n return this.promise.catch(onrejected)\n }\n}\n\n/**\n * 简单限流的 Promise 队列\n * Usage:\n const q = new PromiseQueue();\n [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((v) => {\n q.add(\n () =>\n new Promise((resolve) => {\n setTimeout(() => {\n console.log(v);\n resolve();\n }, 1000);\n })\n );\n});\n */\nexport class PromiseQueue {\n private readonly concurrency: number\n private _current: number = 0\n private _list: (() => Promise<any>)[] = []\n\n constructor({ concurrency = 2 }: { concurrency: number }) {\n this.concurrency = concurrency\n }\n\n add(promiseFn: () => Promise<any>) {\n this._list.push(promiseFn)\n this.loadNext()\n }\n\n loadNext() {\n if (this._list.length === 0 || this.concurrency === this._current) return\n this._current++\n const fn = this._list.shift()!\n const promise = fn.call(this)\n promise.then(this.onLoaded.bind(this)).catch(this.onLoaded.bind(this))\n }\n\n onLoaded() {\n this._current--\n this.loadNext()\n }\n}\n"],"mappings":";AAaO,SAAS,MAAS,WAA6B,SAAmC;AACvF,MAAI,UAAU;AACd,MAAI,iBAAiB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB,CAAC;AAAA,EACpB;AACA,SAAO,OAAO,gBAAgB,OAAO;AACrC,QAAM,EAAE,YAAY,gBAAgB,IAAI;AAExC,QAAM,eAAe,YAAwB;AAC3C,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,KAAK;AACZ,UACE,UAAU,cACV,gBAAgB,KAAK,sBAAoB,eAAe,iBAAiB,WAAW,GACpF;AACA;AACA,eAAO,aAAa;AAAA,MACtB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAsBO,IAAM,WAAN,MAAwB;AAAA,EAM7B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,WAAW;AAChB,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEO,QAAQ,OAAiC;AAC9C,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEO,OAAO,QAAoB;AAChC,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEO,KACL,aACA,YAC8B;AAC9B,WAAO,KAAK,QAAQ,KAAK,aAAa,UAAU;AAAA,EAClD;AAAA,EAEO,MACL,YACsB;AACtB,WAAO,KAAK,QAAQ,MAAM,UAAU;AAAA,EACtC;AACF;AAkBO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,EAAE,cAAc,EAAE,GAA4B;AAH1D,SAAQ,WAAmB;AAC3B,SAAQ,QAAgC,CAAC;AAGvC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,SAAK,MAAM,KAAK,SAAS;AACzB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,MAAM,WAAW,KAAK,KAAK,gBAAgB,KAAK;AAAU;AACnE,SAAK;AACL,UAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAM,UAAU,GAAG,KAAK,IAAI;AAC5B,YAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,WAAW;AACT,SAAK;AACL,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]}
|
2
dist/utils/security.util.cjs.map
vendored
2
dist/utils/security.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/security.util.js.map
vendored
2
dist/utils/security.util.js.map
vendored
File diff suppressed because one or more lines are too long
5
dist/utils/string.util.cjs
vendored
5
dist/utils/string.util.cjs
vendored
@ -21,6 +21,7 @@ var string_util_exports = {};
|
||||
__export(string_util_exports, {
|
||||
base58ToHex: () => base58ToHex,
|
||||
checkAccountId: () => checkAccountId,
|
||||
checkAddress: () => checkAddress,
|
||||
compressHex: () => compressHex,
|
||||
compressUuid: () => compressUuid,
|
||||
hexToBase32: () => hexToBase32,
|
||||
@ -159,10 +160,14 @@ function parseGameAccountId(accountId) {
|
||||
const openId = arr[2];
|
||||
return { gameId, channel, openId };
|
||||
}
|
||||
function checkAddress(address) {
|
||||
return /^0x[0-9a-fA-F]{40}$/.test(address);
|
||||
}
|
||||
// Annotate the CommonJS export names for ESM import in node:
|
||||
0 && (module.exports = {
|
||||
base58ToHex,
|
||||
checkAccountId,
|
||||
checkAddress,
|
||||
compressHex,
|
||||
compressUuid,
|
||||
hexToBase32,
|
||||
|
2
dist/utils/string.util.cjs.map
vendored
2
dist/utils/string.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
3
dist/utils/string.util.d.cts
vendored
3
dist/utils/string.util.d.cts
vendored
@ -53,5 +53,6 @@ declare function parseGameAccountId(accountId: string): {
|
||||
channel: string;
|
||||
openId: string;
|
||||
};
|
||||
declare function checkAddress(address: string): boolean;
|
||||
|
||||
export { base58ToHex, checkAccountId, compressHex, compressUuid, hexToBase32, hexToBase58, hexToUtf8, isJsonString, isObjectId, isTrue, isUUID, parseGameAccountId, string10to62, string62to10, utf8ToHex };
|
||||
export { base58ToHex, checkAccountId, checkAddress, compressHex, compressUuid, hexToBase32, hexToBase58, hexToUtf8, isJsonString, isObjectId, isTrue, isUUID, parseGameAccountId, string10to62, string62to10, utf8ToHex };
|
||||
|
3
dist/utils/string.util.d.ts
vendored
3
dist/utils/string.util.d.ts
vendored
@ -53,5 +53,6 @@ declare function parseGameAccountId(accountId: string): {
|
||||
channel: string;
|
||||
openId: string;
|
||||
};
|
||||
declare function checkAddress(address: string): boolean;
|
||||
|
||||
export { base58ToHex, checkAccountId, compressHex, compressUuid, hexToBase32, hexToBase58, hexToUtf8, isJsonString, isObjectId, isTrue, isUUID, parseGameAccountId, string10to62, string62to10, utf8ToHex };
|
||||
export { base58ToHex, checkAccountId, checkAddress, compressHex, compressUuid, hexToBase32, hexToBase58, hexToUtf8, isJsonString, isObjectId, isTrue, isUUID, parseGameAccountId, string10to62, string62to10, utf8ToHex };
|
||||
|
4
dist/utils/string.util.js
vendored
4
dist/utils/string.util.js
vendored
@ -122,9 +122,13 @@ function parseGameAccountId(accountId) {
|
||||
const openId = arr[2];
|
||||
return { gameId, channel, openId };
|
||||
}
|
||||
function checkAddress(address) {
|
||||
return /^0x[0-9a-fA-F]{40}$/.test(address);
|
||||
}
|
||||
export {
|
||||
base58ToHex,
|
||||
checkAccountId,
|
||||
checkAddress,
|
||||
compressHex,
|
||||
compressUuid,
|
||||
hexToBase32,
|
||||
|
2
dist/utils/string.util.js.map
vendored
2
dist/utils/string.util.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/wallet.util.cjs.map
vendored
2
dist/utils/wallet.util.cjs.map
vendored
File diff suppressed because one or more lines are too long
2
dist/utils/wallet.util.js.map
vendored
2
dist/utils/wallet.util.js.map
vendored
File diff suppressed because one or more lines are too long
@ -196,3 +196,7 @@ export function parseGameAccountId(accountId: string) {
|
||||
const openId = arr[2]
|
||||
return { gameId, channel, openId }
|
||||
}
|
||||
|
||||
export function checkAddress(address: string) {
|
||||
return /^0x[0-9a-fA-F]{40}$/.test(address)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user