升级一些第三方包

This commit is contained in:
CounterFire2023 2024-10-16 13:16:53 +08:00
parent cf4af92b81
commit 86bad22ee2
30 changed files with 1306 additions and 2142 deletions

View File

@ -32,8 +32,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
let taskPromise = new DeferredPromise();
if (dedupeConcurrent) {
queue = [];
if (nextPromise.started)
nextPromise = new DeferredPromise();
if (nextPromise.started) nextPromise = new DeferredPromise();
taskPromise = nextPromise;
}
queue.push(() => {
@ -41,8 +40,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
task().then(taskPromise.resolve).catch(taskPromise.reject);
return taskPromise.promise;
});
if (!running)
running = start();
if (!running) running = start();
return taskPromise.promise;
};
const start = async () => {
@ -64,13 +62,11 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
var createAsyncQueues = (opts = { dedupeConcurrent: false }) => {
const queues = {};
const push = (queueId, task) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].push(task);
};
const flush = (queueId) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].flush();
};
return { push, flush };

View File

@ -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"],"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,QAAS,eAAc,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,QAAS,WAAU,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,EAAG,QAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,YAAoB;AACjC,QAAI,CAAC,OAAO,OAAO,EAAG,QAAO,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":[]}

View File

@ -8,8 +8,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
let taskPromise = new DeferredPromise();
if (dedupeConcurrent) {
queue = [];
if (nextPromise.started)
nextPromise = new DeferredPromise();
if (nextPromise.started) nextPromise = new DeferredPromise();
taskPromise = nextPromise;
}
queue.push(() => {
@ -17,8 +16,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
task().then(taskPromise.resolve).catch(taskPromise.reject);
return taskPromise.promise;
});
if (!running)
running = start();
if (!running) running = start();
return taskPromise.promise;
};
const start = async () => {
@ -40,13 +38,11 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
var createAsyncQueues = (opts = { dedupeConcurrent: false }) => {
const queues = {};
const push = (queueId, task) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].push(task);
};
const flush = (queueId) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].flush();
};
return { push, flush };

View File

@ -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"],"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,QAAS,eAAc,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,QAAS,WAAU,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,EAAG,QAAO,OAAO,IAAI,iBAAoB,IAAI;AAChE,WAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,YAAoB;AACjC,QAAI,CAAC,OAAO,OAAO,EAAG,QAAO,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":[]}

View File

@ -20,8 +20,7 @@ var __decorateClass = (decorators, target, key, kind) => {
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result)
__defProp(target, key, result);
if (kind && result) __defProp(target, key, result);
return result;
};

View File

@ -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 * 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":[]}
{"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":[]}

View File

@ -5,8 +5,7 @@ var __decorateClass = (decorators, target, key, kind) => {
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result)
__defProp(target, key, result);
if (kind && result) __defProp(target, key, result);
return result;
};

View File

@ -1 +1 @@
{"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":[]}
{"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":[]}

15
dist/index.cjs vendored
View File

@ -20,8 +20,7 @@ var __decorateClass = (decorators, target, key, kind) => {
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result)
__defProp(target, key, result);
if (kind && result) __defProp(target, key, result);
return result;
};
@ -118,8 +117,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
let taskPromise = new DeferredPromise();
if (dedupeConcurrent) {
queue = [];
if (nextPromise.started)
nextPromise = new DeferredPromise();
if (nextPromise.started) nextPromise = new DeferredPromise();
taskPromise = nextPromise;
}
queue.push(() => {
@ -127,8 +125,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
task().then(taskPromise.resolve).catch(taskPromise.reject);
return taskPromise.promise;
});
if (!running)
running = start();
if (!running) running = start();
return taskPromise.promise;
};
const start = async () => {
@ -150,13 +147,11 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
var createAsyncQueues = (opts = { dedupeConcurrent: false }) => {
const queues = {};
const push = (queueId, task) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].push(task);
};
const flush = (queueId) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].flush();
};
return { push, flush };

2
dist/index.cjs.map vendored

File diff suppressed because one or more lines are too long

15
dist/index.js vendored
View File

@ -5,8 +5,7 @@ var __decorateClass = (decorators, target, key, kind) => {
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result)
__defProp(target, key, result);
if (kind && result) __defProp(target, key, result);
return result;
};
@ -81,8 +80,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
let taskPromise = new DeferredPromise();
if (dedupeConcurrent) {
queue = [];
if (nextPromise.started)
nextPromise = new DeferredPromise();
if (nextPromise.started) nextPromise = new DeferredPromise();
taskPromise = nextPromise;
}
queue.push(() => {
@ -90,8 +88,7 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
task().then(taskPromise.resolve).catch(taskPromise.reject);
return taskPromise.promise;
});
if (!running)
running = start();
if (!running) running = start();
return taskPromise.promise;
};
const start = async () => {
@ -113,13 +110,11 @@ function createAsyncQueue(opts = { dedupeConcurrent: false }) {
var createAsyncQueues = (opts = { dedupeConcurrent: false }) => {
const queues = {};
const push = (queueId, task) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].push(task);
};
const flush = (queueId) => {
if (!queues[queueId])
queues[queueId] = createAsyncQueue(opts);
if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts);
return queues[queueId].flush();
};
return { push, flush };

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -157,8 +157,7 @@ function generateKVStr({
if (ignoreNull && !data[key]) {
continue;
}
if (i++ > 0)
result += splitChar;
if (i++ > 0) result += splitChar;
if (encode) {
result += `${key}${equalChar}${encodeURIComponent(data[key])}`;
} else {

File diff suppressed because one or more lines are too long

View File

@ -112,8 +112,7 @@ function generateKVStr({
if (ignoreNull && !data[key]) {
continue;
}
if (i++ > 0)
result += splitChar;
if (i++ > 0) result += splitChar;
if (encode) {
result += `${key}${equalChar}${encodeURIComponent(data[key])}`;
} else {

File diff suppressed because one or more lines are too long

View File

@ -76,8 +76,7 @@ var PromiseQueue = class {
this.loadNext();
}
loadNext() {
if (this._list.length === 0 || this.concurrency === this._current)
return;
if (this._list.length === 0 || this.concurrency === this._current) return;
this._current++;
const fn = this._list.shift();
const promise = fn.call(this);

View File

@ -1 +1 @@
{"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":[]}
{"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,SAAU;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":[]}

View File

@ -51,8 +51,7 @@ var PromiseQueue = class {
this.loadNext();
}
loadNext() {
if (this._list.length === 0 || this.concurrency === this._current)
return;
if (this._list.length === 0 || this.concurrency === this._current) return;
this._current++;
const fn = this._list.shift();
const promise = fn.call(this);

View File

@ -1 +1 @@
{"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":[]}
{"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,SAAU;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":[]}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -32,28 +32,28 @@
"author": "",
"license": "ISC",
"dependencies": {
"@metamask/eth-sig-util": "^4.0.1",
"@metamask/eth-sig-util": "^7.0.3",
"crypto-js": "^4.2.0",
"ethereumjs-util": "^7.1.5",
"node-fetch": "2",
"node-fetch": "3.3.2",
"redis": "^3.1.2",
"web3": "^1.7.4"
},
"devDependencies": {
"@jest/globals": "^29.7.0",
"@types/crypto-js": "^4.2.1",
"@types/jest": "^29.5.12",
"@types/crypto-js": "^4.2.2",
"@types/jest": "^29.5.13",
"@types/node-fetch": "^2.6.11",
"@types/redis": "^2.8.28",
"@typescript-eslint/eslint-plugin": "^6.19.0",
"@typescript-eslint/parser": "^6.19.0",
"@typescript-eslint/eslint-plugin": "^8.9.0",
"@typescript-eslint/parser": "^8.9.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-prettier": "^5.2.1",
"jest": "^29.7.0",
"prettier": "^3.2.3",
"ts-jest": "^29.1.2",
"prettier": "^3.3.3",
"ts-jest": "^29.2.5",
"ts-node": "^10.9.2",
"tsup": "^8.0.1",
"typescript": "^5.3.3"
"tsup": "^8.3.0",
"typescript": "^5.6.3"
}
}

1072
yarn.lock

File diff suppressed because it is too large Load Diff