@taraflex/debounce
Advanced tools
+21
| MIT License | ||
| Copyright (c) 2017 Alexander Taratin | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| SOFTWARE. |
+16
-7
@@ -1,7 +0,17 @@ | ||
| declare function trottle<Args extends any[], P extends PromiseLike<any>>(f: (...args: Args) => P, timeout: number, trottleAfterError?: boolean): (...rest: Args) => P | Promise<Awaited<P>>; | ||
| interface IAbortController<IAbortSignal extends AbortSignal> extends AbortController { | ||
| declare function trottle<Self, P extends PromiseLike<any>, Args extends unknown[]>(fn: (...args: Args) => P, { timeout, resetQueueOnError, self }: { | ||
| timeout: number; | ||
| resetQueueOnError?: boolean; | ||
| self?: Self; | ||
| }): (...rest: Args) => P | Promise<Awaited<P>>; | ||
| interface IAbortController<IAbortSignal extends AbortSignal> { | ||
| readonly signal: IAbortSignal; | ||
| abort(reason?: unknown): void; | ||
| } | ||
| declare function trottleAbortable<Args extends any[], P extends PromiseLike<any>, IAbortSignal extends AbortSignal>(f: (signal: IAbortSignal, ...args: Args) => P, timeout: number, trottleAfterError?: boolean, AbortControllerClass?: { | ||
| new (): IAbortController<IAbortSignal>; | ||
| declare function trottleAbortable<Self, IAbortSignal extends AbortSignal, P extends PromiseLike<any>, Args extends unknown[]>(fn: (signal: IAbortSignal, ...args: Args) => P, { timeout, resetQueueOnError, self, AbortControllerClass }: { | ||
| timeout: number; | ||
| resetQueueOnError?: boolean; | ||
| self?: Self; | ||
| AbortControllerClass?: { | ||
| new (): IAbortController<IAbortSignal>; | ||
| }; | ||
| }): ((...rest: Args) => P | Promise<Awaited<P>>) & { | ||
@@ -11,7 +21,6 @@ now: (...rest: Args) => P | Promise<Awaited<P>>; | ||
| }; | ||
| declare function debounceSync<Args extends any[], R>(f: (...args: Args) => R, time: number): ((...args: Args) => void) & { | ||
| declare function debounceSync<R, Args extends unknown[]>(f: (...args: Args) => R, time: number): ((...args: Args) => void) & { | ||
| dispose(): void; | ||
| now(...args: Args): R; | ||
| }; | ||
| export { debounceSync, trottle, trottleAbortable }; | ||
| export { trottle, trottleAbortable, debounceSync }; |
+144
-166
@@ -1,181 +0,159 @@ | ||
| "use strict"; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __export = (target, all) => { | ||
| for (var name in all) | ||
| __defProp(target, name, { get: all[name], enumerable: true }); | ||
| }; | ||
| var __copyProps = (to, from, except, desc) => { | ||
| if (from && typeof from === "object" || typeof from === "function") { | ||
| for (let key of __getOwnPropNames(from)) | ||
| if (!__hasOwnProp.call(to, key) && key !== except) | ||
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
| } | ||
| return to; | ||
| }; | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
| 'use strict'; | ||
| // index.ts | ||
| var debounce_exports = {}; | ||
| __export(debounce_exports, { | ||
| debounceSync: () => debounceSync, | ||
| trottle: () => trottle, | ||
| trottleAbortable: () => trottleAbortable | ||
| }); | ||
| module.exports = __toCommonJS(debounce_exports); | ||
| function trottle(f, timeout, trottleAfterError) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| const pause = (resolve) => { | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| resolve(); | ||
| } else { | ||
| setTimeout(resolve, timeout - diff); | ||
| } | ||
| }; | ||
| async function process() { | ||
| while (lastArgs) { | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = f.apply(this, args); | ||
| try { | ||
| await lastPromise; | ||
| } catch { | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| } | ||
| Object.defineProperty(exports, '__esModule', { value: true }); | ||
| function trottle(fn, { timeout, resetQueueOnError = false, self = null }) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| const pause = (resolve) => { | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| resolve(); | ||
| } | ||
| } catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| else { | ||
| setTimeout(resolve, timeout - diff); | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| }; | ||
| async function process() { | ||
| while (lastArgs) { | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = fn.apply(self, args); | ||
| try { | ||
| await lastPromise; | ||
| } | ||
| catch (_a) { | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| } | ||
| catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| } | ||
| started = 0; | ||
| } | ||
| started = 0; | ||
| } | ||
| return { | ||
| [f.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(); | ||
| } | ||
| return lastPromise; | ||
| } | ||
| }[f.name]; | ||
| return { | ||
| [fn.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(); | ||
| } | ||
| return lastPromise; | ||
| } | ||
| }[fn.name]; | ||
| } | ||
| function trottleAbortable(f, timeout, trottleAfterError, AbortControllerClass = AbortController) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| async function process(signal) { | ||
| let timer = null; | ||
| let fulfill = null; | ||
| function clearTimer(_) { | ||
| if (fulfill) { | ||
| clearTimeout(timer); | ||
| fulfill(); | ||
| fulfill = null; | ||
| } | ||
| } | ||
| try { | ||
| signal.addEventListener("abort", clearTimer); | ||
| const pause = (resolve) => { | ||
| if (signal.aborted) { | ||
| return resolve(); | ||
| function trottleAbortable(fn, { timeout, resetQueueOnError = false, self = null, AbortControllerClass = AbortController }) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| async function process(signal) { | ||
| let timer = null; | ||
| let fulfill = null; | ||
| function clearTimer(_) { | ||
| if (fulfill) { | ||
| clearTimeout(timer); | ||
| fulfill(); | ||
| fulfill = null; | ||
| } | ||
| } | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| return resolve(); | ||
| } | ||
| fulfill = resolve; | ||
| timer = setTimeout(resolve, timeout - diff); | ||
| }; | ||
| while (lastArgs) { | ||
| if (signal.aborted) | ||
| return; | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = f.call(this, signal, ...args); | ||
| try { | ||
| await lastPromise; | ||
| } catch { | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| signal.addEventListener('abort', clearTimer); | ||
| const pause = (resolve) => { | ||
| if (signal.aborted) { | ||
| return resolve(); | ||
| } | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| return resolve(); | ||
| } | ||
| fulfill = resolve; | ||
| timer = setTimeout(resolve, timeout - diff); | ||
| }; | ||
| while (lastArgs) { | ||
| if (signal.aborted) | ||
| return; | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = fn.call(self, signal, ...args); | ||
| try { | ||
| await lastPromise; | ||
| } | ||
| catch (_a) { | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| } | ||
| catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| } | ||
| } | ||
| } catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| } | ||
| } finally { | ||
| signal.removeEventListener("abort", clearTimer); | ||
| if (!signal.aborted) { | ||
| started = 0; | ||
| } | ||
| finally { | ||
| signal.removeEventListener('abort', clearTimer); | ||
| if (!signal.aborted) { | ||
| started = 0; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| let ctrl = new AbortControllerClass(); | ||
| return Object.assign( | ||
| { | ||
| [f.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(ctrl.signal); | ||
| let ctrl = new AbortControllerClass(); | ||
| return Object.assign({ | ||
| [fn.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(ctrl.signal); | ||
| } | ||
| return lastPromise; | ||
| } | ||
| return lastPromise; | ||
| } | ||
| }[f.name], | ||
| { | ||
| now: { | ||
| [f.name](...rest) { | ||
| ctrl.abort(); | ||
| ctrl = new AbortControllerClass(); | ||
| lastArgs = rest; | ||
| process(ctrl.signal); | ||
| return lastPromise; | ||
| }[fn.name], { | ||
| now: { | ||
| [fn.name](...rest) { | ||
| ctrl.abort(); | ||
| ctrl = new AbortControllerClass(); | ||
| lastArgs = rest; | ||
| process(ctrl.signal); | ||
| return lastPromise; | ||
| } | ||
| }[fn.name], | ||
| stop() { | ||
| ctrl.abort(); | ||
| } | ||
| }[f.name], | ||
| stop() { | ||
| ctrl.abort(); | ||
| } | ||
| } | ||
| ); | ||
| }); | ||
| } | ||
| function debounceSync(f, time) { | ||
| let t; | ||
| return Object.assign({ | ||
| [f.name](...args) { | ||
| clearTimeout(t); | ||
| t = setTimeout(f, time, ...args); | ||
| } | ||
| }[f.name], { | ||
| dispose() { | ||
| clearTimeout(t); | ||
| }, | ||
| now(...args) { | ||
| clearTimeout(t); | ||
| return f(...args); | ||
| } | ||
| }); | ||
| let timer; | ||
| return Object.assign({ | ||
| [f.name](...args) { | ||
| clearTimeout(timer); | ||
| timer = setTimeout(f, time, ...args); | ||
| } | ||
| }[f.name], { | ||
| dispose() { | ||
| clearTimeout(timer); | ||
| }, | ||
| now(...args) { | ||
| clearTimeout(timer); | ||
| return f(...args); | ||
| } | ||
| }); | ||
| } | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
| 0 && (module.exports = { | ||
| debounceSync, | ||
| trottle, | ||
| trottleAbortable | ||
| }); | ||
| //# sourceMappingURL=index.js.map | ||
| exports.debounceSync = debounceSync; | ||
| exports.trottle = trottle; | ||
| exports.trottleAbortable = trottleAbortable; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../index.ts"],"sourcesContent":["export function trottle<Args extends any[], P extends PromiseLike<any>>(f: (...args: Args) => P, timeout: number, trottleAfterError?: boolean) {\r\n let started = 0;\r\n let lastArgs: null | Args = null;\r\n let lastPromise: P | Promise<Awaited<P>> = null;\r\n\r\n const pause = (resolve: () => void) => {\r\n const diff = Date.now() - started;\r\n if (timeout <= diff) {\r\n resolve();\r\n } else {\r\n setTimeout(resolve, timeout - diff);\r\n }\r\n }\r\n\r\n async function process() {\r\n while (lastArgs) {\r\n started = Date.now();\r\n const args = lastArgs;\r\n lastArgs = null;\r\n try {\r\n lastPromise = f.apply(this, args);\r\n try {\r\n await lastPromise;\r\n } catch {\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n } catch (e) {\r\n lastPromise = Promise.reject(e);\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n await new Promise<void>(pause);\r\n }\r\n started = 0;\r\n }\r\n\r\n return {\r\n [f.name](...rest: Args) {\r\n lastArgs = rest;\r\n if (!started) {\r\n process();\r\n }\r\n return lastPromise;\r\n }\r\n }[f.name];\r\n}\r\n\r\ninterface IAbortController<IAbortSignal extends AbortSignal> extends AbortController {\r\n readonly signal: IAbortSignal\r\n}\r\n\r\nexport function trottleAbortable<\r\n Args extends any[],\r\n P extends PromiseLike<any>,\r\n IAbortSignal extends AbortSignal,\r\n>(\r\n f: (signal: IAbortSignal, ...args: Args) => P,\r\n timeout: number,\r\n trottleAfterError?: boolean,\r\n AbortControllerClass: { new(): IAbortController<IAbortSignal> } = AbortController as any\r\n) {\r\n let started = 0;\r\n let lastArgs: null | Args = null;\r\n let lastPromise: P | Promise<Awaited<P>> = null;\r\n\r\n async function process(signal: IAbortSignal) {\r\n let timer: ReturnType<typeof setTimeout> = null;\r\n let fulfill: () => void = null;\r\n function clearTimer(_: Event) {\r\n if (fulfill) {\r\n clearTimeout(timer);\r\n fulfill();\r\n fulfill = null;\r\n }\r\n }\r\n try {\r\n signal.addEventListener('abort', clearTimer);\r\n\r\n const pause = (resolve: () => void) => {\r\n if (signal.aborted) {\r\n return resolve();\r\n }\r\n const diff = Date.now() - started;\r\n if (timeout <= diff) {\r\n return resolve();\r\n }\r\n fulfill = resolve;\r\n timer = setTimeout(resolve, timeout - diff);\r\n }\r\n\r\n while (lastArgs) {\r\n if (signal.aborted) return;\r\n\r\n started = Date.now();\r\n const args = lastArgs;\r\n lastArgs = null;\r\n\r\n try {\r\n lastPromise = f.call(this, signal, ...args)\r\n try {\r\n await lastPromise;\r\n } catch {\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n } catch (e) {\r\n lastPromise = Promise.reject(e);\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n\r\n await new Promise<void>(pause);\r\n }\r\n } finally {\r\n signal.removeEventListener('abort', clearTimer);\r\n if (!signal.aborted) {\r\n started = 0;\r\n }\r\n }\r\n }\r\n\r\n let ctrl = new AbortControllerClass();\r\n\r\n return Object.assign(\r\n {\r\n [f.name](...rest: Args) {\r\n lastArgs = rest;\r\n if (!started) {\r\n process(ctrl.signal);\r\n }\r\n return lastPromise;\r\n }\r\n }[f.name],\r\n {\r\n now: {\r\n [f.name](...rest: Args) {\r\n ctrl.abort();\r\n ctrl = new AbortControllerClass();\r\n\r\n lastArgs = rest;\r\n process(ctrl.signal);\r\n return lastPromise;\r\n }\r\n }[f.name],\r\n stop() {\r\n ctrl.abort();\r\n }\r\n }\r\n );\r\n}\r\n\r\nexport function debounceSync<Args extends any[], R>(f: (...args: Args) => R, time: number) {\r\n let t: any;\r\n return Object.assign({\r\n [f.name](...args: Args) {\r\n clearTimeout(t);\r\n t = setTimeout(f, time, ...args)\r\n }\r\n }[f.name], {\r\n dispose() {\r\n clearTimeout(t);\r\n },\r\n now(...args: Args) {\r\n clearTimeout(t);\r\n return f(...args);\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":[]} | ||
| {"version":3,"file":"index.js","sources":["../index.ts"],"sourcesContent":["export function trottle<Self, P extends PromiseLike<any>, Args extends unknown[]>(\n fn: (...args: Args) => P,\n {\n timeout,\n resetQueueOnError = false,\n self = null\n }: {\n timeout: number;\n resetQueueOnError?: boolean;\n self?: Self;\n }\n) {\n let started = 0;\n let lastArgs: null | Args = null;\n let lastPromise: P | Promise<Awaited<P>> = null;\n\n const pause = (resolve: () => void) => {\n const diff = Date.now() - started;\n if (timeout <= diff) {\n resolve();\n } else {\n setTimeout(resolve, timeout - diff);\n }\n };\n\n async function process() {\n while (lastArgs) {\n started = Date.now();\n const args = lastArgs;\n lastArgs = null;\n try {\n lastPromise = fn.apply(self, args);\n try {\n await lastPromise;\n } catch {\n if (!resetQueueOnError) {\n continue;\n }\n }\n } catch (e) {\n lastPromise = Promise.reject(e);\n if (!resetQueueOnError) {\n continue;\n }\n }\n await new Promise<void>(pause);\n }\n started = 0;\n }\n\n return {\n [fn.name](...rest: Args) {\n lastArgs = rest;\n if (!started) {\n process();\n }\n return lastPromise;\n }\n }[fn.name];\n}\n\ninterface IAbortController<IAbortSignal extends AbortSignal> {\n readonly signal: IAbortSignal;\n abort(reason?: unknown): void;\n}\n\nexport function trottleAbortable<\n Self,\n IAbortSignal extends AbortSignal,\n P extends PromiseLike<any>,\n Args extends unknown[]\n>(\n fn: (signal: IAbortSignal, ...args: Args) => P,\n {\n timeout,\n resetQueueOnError = false,\n self = null,\n AbortControllerClass = AbortController as any\n }: {\n timeout: number;\n resetQueueOnError?: boolean;\n self?: Self;\n AbortControllerClass?: { new (): IAbortController<IAbortSignal> };\n }\n) {\n let started = 0;\n let lastArgs: Args = null;\n let lastPromise: P | Promise<Awaited<P>> = null;\n\n async function process(signal: IAbortSignal) {\n let timer: ReturnType<typeof setTimeout> = null;\n let fulfill: () => void = null;\n function clearTimer(_: Event) {\n if (fulfill) {\n clearTimeout(timer);\n fulfill();\n fulfill = null;\n }\n }\n try {\n signal.addEventListener('abort', clearTimer);\n\n const pause = (resolve: () => void) => {\n if (signal.aborted) {\n return resolve();\n }\n const diff = Date.now() - started;\n if (timeout <= diff) {\n return resolve();\n }\n fulfill = resolve;\n timer = setTimeout(resolve, timeout - diff);\n };\n\n while (lastArgs) {\n if (signal.aborted) return;\n\n started = Date.now();\n const args = lastArgs;\n lastArgs = null;\n\n try {\n lastPromise = fn.call(self, signal, ...args);\n try {\n await lastPromise;\n } catch {\n if (!resetQueueOnError) {\n continue;\n }\n }\n } catch (e) {\n lastPromise = Promise.reject(e);\n if (!resetQueueOnError) {\n continue;\n }\n }\n\n await new Promise<void>(pause);\n }\n } finally {\n signal.removeEventListener('abort', clearTimer);\n if (!signal.aborted) {\n started = 0;\n }\n }\n }\n\n let ctrl = new AbortControllerClass();\n\n return Object.assign(\n {\n [fn.name](...rest: Args) {\n lastArgs = rest;\n if (!started) {\n process(ctrl.signal);\n }\n return lastPromise;\n }\n }[fn.name],\n {\n now: {\n [fn.name](...rest: Args) {\n ctrl.abort();\n ctrl = new AbortControllerClass();\n\n lastArgs = rest;\n process(ctrl.signal);\n return lastPromise;\n }\n }[fn.name],\n stop() {\n ctrl.abort();\n }\n }\n );\n}\n\nexport function debounceSync<R, Args extends unknown[]>(f: (...args: Args) => R, time: number) {\n let timer: ReturnType<typeof setTimeout>;\n return Object.assign(\n {\n [f.name](...args: Args) {\n clearTimeout(timer);\n timer = setTimeout(f, time, ...args);\n }\n }[f.name],\n {\n dispose() {\n clearTimeout(timer);\n },\n now(...args: Args) {\n clearTimeout(timer);\n return f(...args);\n }\n }\n );\n}\n"],"names":[],"mappings":"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"} |
+139
-140
@@ -1,154 +0,153 @@ | ||
| // index.ts | ||
| function trottle(f, timeout, trottleAfterError) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| const pause = (resolve) => { | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| resolve(); | ||
| } else { | ||
| setTimeout(resolve, timeout - diff); | ||
| } | ||
| }; | ||
| async function process() { | ||
| while (lastArgs) { | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = f.apply(this, args); | ||
| try { | ||
| await lastPromise; | ||
| } catch { | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| } | ||
| function trottle(fn, { timeout, resetQueueOnError = false, self = null }) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| const pause = (resolve) => { | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| resolve(); | ||
| } | ||
| } catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| else { | ||
| setTimeout(resolve, timeout - diff); | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| }; | ||
| async function process() { | ||
| while (lastArgs) { | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = fn.apply(self, args); | ||
| try { | ||
| await lastPromise; | ||
| } | ||
| catch (_a) { | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| } | ||
| catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| } | ||
| started = 0; | ||
| } | ||
| started = 0; | ||
| } | ||
| return { | ||
| [f.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(); | ||
| } | ||
| return lastPromise; | ||
| } | ||
| }[f.name]; | ||
| return { | ||
| [fn.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(); | ||
| } | ||
| return lastPromise; | ||
| } | ||
| }[fn.name]; | ||
| } | ||
| function trottleAbortable(f, timeout, trottleAfterError, AbortControllerClass = AbortController) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| async function process(signal) { | ||
| let timer = null; | ||
| let fulfill = null; | ||
| function clearTimer(_) { | ||
| if (fulfill) { | ||
| clearTimeout(timer); | ||
| fulfill(); | ||
| fulfill = null; | ||
| } | ||
| } | ||
| try { | ||
| signal.addEventListener("abort", clearTimer); | ||
| const pause = (resolve) => { | ||
| if (signal.aborted) { | ||
| return resolve(); | ||
| function trottleAbortable(fn, { timeout, resetQueueOnError = false, self = null, AbortControllerClass = AbortController }) { | ||
| let started = 0; | ||
| let lastArgs = null; | ||
| let lastPromise = null; | ||
| async function process(signal) { | ||
| let timer = null; | ||
| let fulfill = null; | ||
| function clearTimer(_) { | ||
| if (fulfill) { | ||
| clearTimeout(timer); | ||
| fulfill(); | ||
| fulfill = null; | ||
| } | ||
| } | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| return resolve(); | ||
| } | ||
| fulfill = resolve; | ||
| timer = setTimeout(resolve, timeout - diff); | ||
| }; | ||
| while (lastArgs) { | ||
| if (signal.aborted) | ||
| return; | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = f.call(this, signal, ...args); | ||
| try { | ||
| await lastPromise; | ||
| } catch { | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| signal.addEventListener('abort', clearTimer); | ||
| const pause = (resolve) => { | ||
| if (signal.aborted) { | ||
| return resolve(); | ||
| } | ||
| const diff = Date.now() - started; | ||
| if (timeout <= diff) { | ||
| return resolve(); | ||
| } | ||
| fulfill = resolve; | ||
| timer = setTimeout(resolve, timeout - diff); | ||
| }; | ||
| while (lastArgs) { | ||
| if (signal.aborted) | ||
| return; | ||
| started = Date.now(); | ||
| const args = lastArgs; | ||
| lastArgs = null; | ||
| try { | ||
| lastPromise = fn.call(self, signal, ...args); | ||
| try { | ||
| await lastPromise; | ||
| } | ||
| catch (_a) { | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| } | ||
| catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!resetQueueOnError) { | ||
| continue; | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| } | ||
| } | ||
| } catch (e) { | ||
| lastPromise = Promise.reject(e); | ||
| if (!trottleAfterError) { | ||
| continue; | ||
| } | ||
| } | ||
| await new Promise(pause); | ||
| } | ||
| } finally { | ||
| signal.removeEventListener("abort", clearTimer); | ||
| if (!signal.aborted) { | ||
| started = 0; | ||
| } | ||
| finally { | ||
| signal.removeEventListener('abort', clearTimer); | ||
| if (!signal.aborted) { | ||
| started = 0; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| let ctrl = new AbortControllerClass(); | ||
| return Object.assign( | ||
| { | ||
| [f.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(ctrl.signal); | ||
| let ctrl = new AbortControllerClass(); | ||
| return Object.assign({ | ||
| [fn.name](...rest) { | ||
| lastArgs = rest; | ||
| if (!started) { | ||
| process(ctrl.signal); | ||
| } | ||
| return lastPromise; | ||
| } | ||
| return lastPromise; | ||
| } | ||
| }[f.name], | ||
| { | ||
| now: { | ||
| [f.name](...rest) { | ||
| ctrl.abort(); | ||
| ctrl = new AbortControllerClass(); | ||
| lastArgs = rest; | ||
| process(ctrl.signal); | ||
| return lastPromise; | ||
| }[fn.name], { | ||
| now: { | ||
| [fn.name](...rest) { | ||
| ctrl.abort(); | ||
| ctrl = new AbortControllerClass(); | ||
| lastArgs = rest; | ||
| process(ctrl.signal); | ||
| return lastPromise; | ||
| } | ||
| }[fn.name], | ||
| stop() { | ||
| ctrl.abort(); | ||
| } | ||
| }[f.name], | ||
| stop() { | ||
| ctrl.abort(); | ||
| } | ||
| } | ||
| ); | ||
| }); | ||
| } | ||
| function debounceSync(f, time) { | ||
| let t; | ||
| return Object.assign({ | ||
| [f.name](...args) { | ||
| clearTimeout(t); | ||
| t = setTimeout(f, time, ...args); | ||
| } | ||
| }[f.name], { | ||
| dispose() { | ||
| clearTimeout(t); | ||
| }, | ||
| now(...args) { | ||
| clearTimeout(t); | ||
| return f(...args); | ||
| } | ||
| }); | ||
| let timer; | ||
| return Object.assign({ | ||
| [f.name](...args) { | ||
| clearTimeout(timer); | ||
| timer = setTimeout(f, time, ...args); | ||
| } | ||
| }[f.name], { | ||
| dispose() { | ||
| clearTimeout(timer); | ||
| }, | ||
| now(...args) { | ||
| clearTimeout(timer); | ||
| return f(...args); | ||
| } | ||
| }); | ||
| } | ||
| export { | ||
| debounceSync, | ||
| trottle, | ||
| trottleAbortable | ||
| }; | ||
| //# sourceMappingURL=index.mjs.map | ||
| export { debounceSync, trottle, trottleAbortable }; | ||
| //# sourceMappingURL=index.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../index.ts"],"sourcesContent":["export function trottle<Args extends any[], P extends PromiseLike<any>>(f: (...args: Args) => P, timeout: number, trottleAfterError?: boolean) {\r\n let started = 0;\r\n let lastArgs: null | Args = null;\r\n let lastPromise: P | Promise<Awaited<P>> = null;\r\n\r\n const pause = (resolve: () => void) => {\r\n const diff = Date.now() - started;\r\n if (timeout <= diff) {\r\n resolve();\r\n } else {\r\n setTimeout(resolve, timeout - diff);\r\n }\r\n }\r\n\r\n async function process() {\r\n while (lastArgs) {\r\n started = Date.now();\r\n const args = lastArgs;\r\n lastArgs = null;\r\n try {\r\n lastPromise = f.apply(this, args);\r\n try {\r\n await lastPromise;\r\n } catch {\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n } catch (e) {\r\n lastPromise = Promise.reject(e);\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n await new Promise<void>(pause);\r\n }\r\n started = 0;\r\n }\r\n\r\n return {\r\n [f.name](...rest: Args) {\r\n lastArgs = rest;\r\n if (!started) {\r\n process();\r\n }\r\n return lastPromise;\r\n }\r\n }[f.name];\r\n}\r\n\r\ninterface IAbortController<IAbortSignal extends AbortSignal> extends AbortController {\r\n readonly signal: IAbortSignal\r\n}\r\n\r\nexport function trottleAbortable<\r\n Args extends any[],\r\n P extends PromiseLike<any>,\r\n IAbortSignal extends AbortSignal,\r\n>(\r\n f: (signal: IAbortSignal, ...args: Args) => P,\r\n timeout: number,\r\n trottleAfterError?: boolean,\r\n AbortControllerClass: { new(): IAbortController<IAbortSignal> } = AbortController as any\r\n) {\r\n let started = 0;\r\n let lastArgs: null | Args = null;\r\n let lastPromise: P | Promise<Awaited<P>> = null;\r\n\r\n async function process(signal: IAbortSignal) {\r\n let timer: ReturnType<typeof setTimeout> = null;\r\n let fulfill: () => void = null;\r\n function clearTimer(_: Event) {\r\n if (fulfill) {\r\n clearTimeout(timer);\r\n fulfill();\r\n fulfill = null;\r\n }\r\n }\r\n try {\r\n signal.addEventListener('abort', clearTimer);\r\n\r\n const pause = (resolve: () => void) => {\r\n if (signal.aborted) {\r\n return resolve();\r\n }\r\n const diff = Date.now() - started;\r\n if (timeout <= diff) {\r\n return resolve();\r\n }\r\n fulfill = resolve;\r\n timer = setTimeout(resolve, timeout - diff);\r\n }\r\n\r\n while (lastArgs) {\r\n if (signal.aborted) return;\r\n\r\n started = Date.now();\r\n const args = lastArgs;\r\n lastArgs = null;\r\n\r\n try {\r\n lastPromise = f.call(this, signal, ...args)\r\n try {\r\n await lastPromise;\r\n } catch {\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n } catch (e) {\r\n lastPromise = Promise.reject(e);\r\n if (!trottleAfterError) {\r\n continue;\r\n }\r\n }\r\n\r\n await new Promise<void>(pause);\r\n }\r\n } finally {\r\n signal.removeEventListener('abort', clearTimer);\r\n if (!signal.aborted) {\r\n started = 0;\r\n }\r\n }\r\n }\r\n\r\n let ctrl = new AbortControllerClass();\r\n\r\n return Object.assign(\r\n {\r\n [f.name](...rest: Args) {\r\n lastArgs = rest;\r\n if (!started) {\r\n process(ctrl.signal);\r\n }\r\n return lastPromise;\r\n }\r\n }[f.name],\r\n {\r\n now: {\r\n [f.name](...rest: Args) {\r\n ctrl.abort();\r\n ctrl = new AbortControllerClass();\r\n\r\n lastArgs = rest;\r\n process(ctrl.signal);\r\n return lastPromise;\r\n }\r\n }[f.name],\r\n stop() {\r\n ctrl.abort();\r\n }\r\n }\r\n );\r\n}\r\n\r\nexport function debounceSync<Args extends any[], R>(f: (...args: Args) => R, time: number) {\r\n let t: any;\r\n return Object.assign({\r\n [f.name](...args: Args) {\r\n clearTimeout(t);\r\n t = setTimeout(f, time, ...args)\r\n }\r\n }[f.name], {\r\n dispose() {\r\n clearTimeout(t);\r\n },\r\n now(...args: Args) {\r\n clearTimeout(t);\r\n return f(...args);\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":[]} | ||
| {"version":3,"file":"index.mjs","sources":["../index.ts"],"sourcesContent":["export function trottle<Self, P extends PromiseLike<any>, Args extends unknown[]>(\n fn: (...args: Args) => P,\n {\n timeout,\n resetQueueOnError = false,\n self = null\n }: {\n timeout: number;\n resetQueueOnError?: boolean;\n self?: Self;\n }\n) {\n let started = 0;\n let lastArgs: null | Args = null;\n let lastPromise: P | Promise<Awaited<P>> = null;\n\n const pause = (resolve: () => void) => {\n const diff = Date.now() - started;\n if (timeout <= diff) {\n resolve();\n } else {\n setTimeout(resolve, timeout - diff);\n }\n };\n\n async function process() {\n while (lastArgs) {\n started = Date.now();\n const args = lastArgs;\n lastArgs = null;\n try {\n lastPromise = fn.apply(self, args);\n try {\n await lastPromise;\n } catch {\n if (!resetQueueOnError) {\n continue;\n }\n }\n } catch (e) {\n lastPromise = Promise.reject(e);\n if (!resetQueueOnError) {\n continue;\n }\n }\n await new Promise<void>(pause);\n }\n started = 0;\n }\n\n return {\n [fn.name](...rest: Args) {\n lastArgs = rest;\n if (!started) {\n process();\n }\n return lastPromise;\n }\n }[fn.name];\n}\n\ninterface IAbortController<IAbortSignal extends AbortSignal> {\n readonly signal: IAbortSignal;\n abort(reason?: unknown): void;\n}\n\nexport function trottleAbortable<\n Self,\n IAbortSignal extends AbortSignal,\n P extends PromiseLike<any>,\n Args extends unknown[]\n>(\n fn: (signal: IAbortSignal, ...args: Args) => P,\n {\n timeout,\n resetQueueOnError = false,\n self = null,\n AbortControllerClass = AbortController as any\n }: {\n timeout: number;\n resetQueueOnError?: boolean;\n self?: Self;\n AbortControllerClass?: { new (): IAbortController<IAbortSignal> };\n }\n) {\n let started = 0;\n let lastArgs: Args = null;\n let lastPromise: P | Promise<Awaited<P>> = null;\n\n async function process(signal: IAbortSignal) {\n let timer: ReturnType<typeof setTimeout> = null;\n let fulfill: () => void = null;\n function clearTimer(_: Event) {\n if (fulfill) {\n clearTimeout(timer);\n fulfill();\n fulfill = null;\n }\n }\n try {\n signal.addEventListener('abort', clearTimer);\n\n const pause = (resolve: () => void) => {\n if (signal.aborted) {\n return resolve();\n }\n const diff = Date.now() - started;\n if (timeout <= diff) {\n return resolve();\n }\n fulfill = resolve;\n timer = setTimeout(resolve, timeout - diff);\n };\n\n while (lastArgs) {\n if (signal.aborted) return;\n\n started = Date.now();\n const args = lastArgs;\n lastArgs = null;\n\n try {\n lastPromise = fn.call(self, signal, ...args);\n try {\n await lastPromise;\n } catch {\n if (!resetQueueOnError) {\n continue;\n }\n }\n } catch (e) {\n lastPromise = Promise.reject(e);\n if (!resetQueueOnError) {\n continue;\n }\n }\n\n await new Promise<void>(pause);\n }\n } finally {\n signal.removeEventListener('abort', clearTimer);\n if (!signal.aborted) {\n started = 0;\n }\n }\n }\n\n let ctrl = new AbortControllerClass();\n\n return Object.assign(\n {\n [fn.name](...rest: Args) {\n lastArgs = rest;\n if (!started) {\n process(ctrl.signal);\n }\n return lastPromise;\n }\n }[fn.name],\n {\n now: {\n [fn.name](...rest: Args) {\n ctrl.abort();\n ctrl = new AbortControllerClass();\n\n lastArgs = rest;\n process(ctrl.signal);\n return lastPromise;\n }\n }[fn.name],\n stop() {\n ctrl.abort();\n }\n }\n );\n}\n\nexport function debounceSync<R, Args extends unknown[]>(f: (...args: Args) => R, time: number) {\n let timer: ReturnType<typeof setTimeout>;\n return Object.assign(\n {\n [f.name](...args: Args) {\n clearTimeout(timer);\n timer = setTimeout(f, time, ...args);\n }\n }[f.name],\n {\n dispose() {\n clearTimeout(timer);\n },\n now(...args: Args) {\n clearTimeout(timer);\n return f(...args);\n }\n }\n );\n}\n"],"names":[],"mappings":"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"} |
+16
-15
| { | ||
| "name": "@taraflex/debounce", | ||
| "version": "0.2.2", | ||
| "version": "0.2.3", | ||
| "description": "", | ||
| "license": "ISC", | ||
| "author": "taraflex", | ||
| "main": "./dist/index.js", | ||
| "module": "./dist/index.mjs", | ||
| "types": "./dist/index.d.ts", | ||
| "license": "MIT", | ||
| "author": { | ||
| "name": "taraflex" | ||
| }, | ||
| "sideEffects": false, | ||
| "exports": { | ||
@@ -17,12 +17,13 @@ ".": { | ||
| }, | ||
| "main": "./dist/index.js", | ||
| "module": "./dist/index.mjs", | ||
| "types": "./dist/index.d.ts", | ||
| "engines": { | ||
| "node": ">=18.0.0" | ||
| }, | ||
| "scripts": { | ||
| "build": "npx tsup ./index.ts --sourcemap --format esm,cjs --dts", | ||
| "watch": "npx tsup ./playground.ts --sourcemap --format esm --watch", | ||
| "playground": "node ./dist/playground.mjs", | ||
| "publish-library": "npm run build && npm publish --registry=https://registry.npmjs.org/ --access=public" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/node": "^18.11.18", | ||
| "tsup": "^6.5.0" | ||
| "dev": "rollup -c ../../rollup.config.mjs --watch", | ||
| "dev:index": "node ./dist/index.mjs", | ||
| "prod": "rollup -c ../../rollup.config.mjs" | ||
| } | ||
| } | ||
| } |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
31077
22.43%0
-100%7
16.67%1
-50%333
-4.03%