@tanstack/preact-pacer 0.0.1 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +165 -45
- package/dist/async-batcher/index.cjs +12 -0
- package/dist/async-batcher/index.d.cts +4 -0
- package/dist/async-batcher/index.d.ts +4 -0
- package/dist/async-batcher/index.js +6 -0
- package/dist/async-batcher/useAsyncBatchedCallback.cjs +51 -0
- package/dist/async-batcher/useAsyncBatchedCallback.cjs.map +1 -0
- package/dist/async-batcher/useAsyncBatchedCallback.d.cts +46 -0
- package/dist/async-batcher/useAsyncBatchedCallback.d.ts +46 -0
- package/dist/async-batcher/useAsyncBatchedCallback.js +51 -0
- package/dist/async-batcher/useAsyncBatchedCallback.js.map +1 -0
- package/dist/async-batcher/useAsyncBatcher.cjs +165 -0
- package/dist/async-batcher/useAsyncBatcher.cjs.map +1 -0
- package/dist/async-batcher/useAsyncBatcher.d.cts +163 -0
- package/dist/async-batcher/useAsyncBatcher.d.ts +163 -0
- package/dist/async-batcher/useAsyncBatcher.js +165 -0
- package/dist/async-batcher/useAsyncBatcher.js.map +1 -0
- package/dist/async-debouncer/index.cjs +12 -0
- package/dist/async-debouncer/index.d.cts +4 -0
- package/dist/async-debouncer/index.d.ts +4 -0
- package/dist/async-debouncer/index.js +6 -0
- package/dist/async-debouncer/useAsyncDebouncedCallback.cjs +50 -0
- package/dist/async-debouncer/useAsyncDebouncedCallback.cjs.map +1 -0
- package/dist/async-debouncer/useAsyncDebouncedCallback.d.cts +47 -0
- package/dist/async-debouncer/useAsyncDebouncedCallback.d.ts +47 -0
- package/dist/async-debouncer/useAsyncDebouncedCallback.js +50 -0
- package/dist/async-debouncer/useAsyncDebouncedCallback.js.map +1 -0
- package/dist/async-debouncer/useAsyncDebouncer.cjs +149 -0
- package/dist/async-debouncer/useAsyncDebouncer.cjs.map +1 -0
- package/dist/async-debouncer/useAsyncDebouncer.d.cts +143 -0
- package/dist/async-debouncer/useAsyncDebouncer.d.ts +143 -0
- package/dist/async-debouncer/useAsyncDebouncer.js +149 -0
- package/dist/async-debouncer/useAsyncDebouncer.js.map +1 -0
- package/dist/async-queuer/index.cjs +12 -0
- package/dist/async-queuer/index.d.cts +4 -0
- package/dist/async-queuer/index.d.ts +4 -0
- package/dist/async-queuer/index.js +6 -0
- package/dist/async-queuer/useAsyncQueuedState.cjs +154 -0
- package/dist/async-queuer/useAsyncQueuedState.cjs.map +1 -0
- package/dist/async-queuer/useAsyncQueuedState.d.cts +152 -0
- package/dist/async-queuer/useAsyncQueuedState.d.ts +152 -0
- package/dist/async-queuer/useAsyncQueuedState.js +154 -0
- package/dist/async-queuer/useAsyncQueuedState.js.map +1 -0
- package/dist/async-queuer/useAsyncQueuer.cjs +165 -0
- package/dist/async-queuer/useAsyncQueuer.cjs.map +1 -0
- package/dist/async-queuer/useAsyncQueuer.d.cts +163 -0
- package/dist/async-queuer/useAsyncQueuer.d.ts +163 -0
- package/dist/async-queuer/useAsyncQueuer.js +165 -0
- package/dist/async-queuer/useAsyncQueuer.js.map +1 -0
- package/dist/async-rate-limiter/index.cjs +12 -0
- package/dist/async-rate-limiter/index.d.cts +4 -0
- package/dist/async-rate-limiter/index.d.ts +4 -0
- package/dist/async-rate-limiter/index.js +6 -0
- package/dist/async-rate-limiter/useAsyncRateLimitedCallback.cjs +65 -0
- package/dist/async-rate-limiter/useAsyncRateLimitedCallback.cjs.map +1 -0
- package/dist/async-rate-limiter/useAsyncRateLimitedCallback.d.cts +62 -0
- package/dist/async-rate-limiter/useAsyncRateLimitedCallback.d.ts +62 -0
- package/dist/async-rate-limiter/useAsyncRateLimitedCallback.js +65 -0
- package/dist/async-rate-limiter/useAsyncRateLimitedCallback.js.map +1 -0
- package/dist/async-rate-limiter/useAsyncRateLimiter.cjs +173 -0
- package/dist/async-rate-limiter/useAsyncRateLimiter.cjs.map +1 -0
- package/dist/async-rate-limiter/useAsyncRateLimiter.d.cts +172 -0
- package/dist/async-rate-limiter/useAsyncRateLimiter.d.ts +172 -0
- package/dist/async-rate-limiter/useAsyncRateLimiter.js +173 -0
- package/dist/async-rate-limiter/useAsyncRateLimiter.js.map +1 -0
- package/dist/async-retryer/index.cjs +9 -0
- package/dist/async-retryer/index.d.cts +1 -0
- package/dist/async-retryer/index.d.ts +1 -0
- package/dist/async-retryer/index.js +3 -0
- package/dist/async-throttler/index.cjs +12 -0
- package/dist/async-throttler/index.d.cts +4 -0
- package/dist/async-throttler/index.d.ts +4 -0
- package/dist/async-throttler/index.js +6 -0
- package/dist/async-throttler/useAsyncThrottledCallback.cjs +48 -0
- package/dist/async-throttler/useAsyncThrottledCallback.cjs.map +1 -0
- package/dist/async-throttler/useAsyncThrottledCallback.d.cts +45 -0
- package/dist/async-throttler/useAsyncThrottledCallback.d.ts +45 -0
- package/dist/async-throttler/useAsyncThrottledCallback.js +48 -0
- package/dist/async-throttler/useAsyncThrottledCallback.js.map +1 -0
- package/dist/async-throttler/useAsyncThrottler.cjs +158 -0
- package/dist/async-throttler/useAsyncThrottler.cjs.map +1 -0
- package/dist/async-throttler/useAsyncThrottler.d.cts +154 -0
- package/dist/async-throttler/useAsyncThrottler.d.ts +154 -0
- package/dist/async-throttler/useAsyncThrottler.js +158 -0
- package/dist/async-throttler/useAsyncThrottler.js.map +1 -0
- package/dist/batcher/index.cjs +12 -0
- package/dist/batcher/index.d.cts +4 -0
- package/dist/batcher/index.d.ts +4 -0
- package/dist/batcher/index.js +6 -0
- package/dist/batcher/useBatchedCallback.cjs +47 -0
- package/dist/batcher/useBatchedCallback.cjs.map +1 -0
- package/dist/batcher/useBatchedCallback.d.cts +44 -0
- package/dist/batcher/useBatchedCallback.d.ts +44 -0
- package/dist/batcher/useBatchedCallback.js +47 -0
- package/dist/batcher/useBatchedCallback.js.map +1 -0
- package/dist/batcher/useBatcher.cjs +122 -0
- package/dist/batcher/useBatcher.cjs.map +1 -0
- package/dist/batcher/useBatcher.d.cts +120 -0
- package/dist/batcher/useBatcher.d.ts +120 -0
- package/dist/batcher/useBatcher.js +122 -0
- package/dist/batcher/useBatcher.js.map +1 -0
- package/dist/debouncer/index.cjs +16 -0
- package/dist/debouncer/index.d.cts +6 -0
- package/dist/debouncer/index.d.ts +6 -0
- package/dist/debouncer/index.js +8 -0
- package/dist/debouncer/useDebouncedCallback.cjs +48 -0
- package/dist/debouncer/useDebouncedCallback.cjs.map +1 -0
- package/dist/debouncer/useDebouncedCallback.d.cts +45 -0
- package/dist/debouncer/useDebouncedCallback.d.ts +45 -0
- package/dist/debouncer/useDebouncedCallback.js +48 -0
- package/dist/debouncer/useDebouncedCallback.js.map +1 -0
- package/dist/debouncer/useDebouncedState.cjs +89 -0
- package/dist/debouncer/useDebouncedState.cjs.map +1 -0
- package/dist/debouncer/useDebouncedState.d.cts +82 -0
- package/dist/debouncer/useDebouncedState.d.ts +82 -0
- package/dist/debouncer/useDebouncedState.js +89 -0
- package/dist/debouncer/useDebouncedState.js.map +1 -0
- package/dist/debouncer/useDebouncedValue.cjs +96 -0
- package/dist/debouncer/useDebouncedValue.cjs.map +1 -0
- package/dist/debouncer/useDebouncedValue.d.cts +91 -0
- package/dist/debouncer/useDebouncedValue.d.ts +91 -0
- package/dist/debouncer/useDebouncedValue.js +96 -0
- package/dist/debouncer/useDebouncedValue.js.map +1 -0
- package/dist/debouncer/useDebouncer.cjs +104 -0
- package/dist/debouncer/useDebouncer.cjs.map +1 -0
- package/dist/debouncer/useDebouncer.d.cts +98 -0
- package/dist/debouncer/useDebouncer.d.ts +98 -0
- package/dist/debouncer/useDebouncer.js +104 -0
- package/dist/debouncer/useDebouncer.js.map +1 -0
- package/dist/index.cjs +66 -0
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +32 -0
- package/dist/provider/PacerProvider.cjs +26 -0
- package/dist/provider/PacerProvider.cjs.map +1 -0
- package/dist/provider/PacerProvider.d.cts +33 -0
- package/dist/provider/PacerProvider.d.ts +33 -0
- package/dist/provider/PacerProvider.js +24 -0
- package/dist/provider/PacerProvider.js.map +1 -0
- package/dist/provider/index.cjs +5 -0
- package/dist/provider/index.d.cts +2 -0
- package/dist/provider/index.d.ts +2 -0
- package/dist/provider/index.js +3 -0
- package/dist/queuer/index.cjs +14 -0
- package/dist/queuer/index.d.cts +5 -0
- package/dist/queuer/index.d.ts +5 -0
- package/dist/queuer/index.js +7 -0
- package/dist/queuer/useQueuedState.cjs +129 -0
- package/dist/queuer/useQueuedState.cjs.map +1 -0
- package/dist/queuer/useQueuedState.d.cts +123 -0
- package/dist/queuer/useQueuedState.d.ts +123 -0
- package/dist/queuer/useQueuedState.js +129 -0
- package/dist/queuer/useQueuedState.js.map +1 -0
- package/dist/queuer/useQueuedValue.cjs +115 -0
- package/dist/queuer/useQueuedValue.cjs.map +1 -0
- package/dist/queuer/useQueuedValue.d.cts +106 -0
- package/dist/queuer/useQueuedValue.d.ts +106 -0
- package/dist/queuer/useQueuedValue.js +115 -0
- package/dist/queuer/useQueuedValue.js.map +1 -0
- package/dist/queuer/useQueuer.cjs +133 -0
- package/dist/queuer/useQueuer.cjs.map +1 -0
- package/dist/queuer/useQueuer.d.cts +131 -0
- package/dist/queuer/useQueuer.d.ts +131 -0
- package/dist/queuer/useQueuer.js +133 -0
- package/dist/queuer/useQueuer.js.map +1 -0
- package/dist/rate-limiter/index.cjs +16 -0
- package/dist/rate-limiter/index.d.cts +6 -0
- package/dist/rate-limiter/index.d.ts +6 -0
- package/dist/rate-limiter/index.js +8 -0
- package/dist/rate-limiter/useRateLimitedCallback.cjs +65 -0
- package/dist/rate-limiter/useRateLimitedCallback.cjs.map +1 -0
- package/dist/rate-limiter/useRateLimitedCallback.d.cts +62 -0
- package/dist/rate-limiter/useRateLimitedCallback.d.ts +62 -0
- package/dist/rate-limiter/useRateLimitedCallback.js +65 -0
- package/dist/rate-limiter/useRateLimitedCallback.js.map +1 -0
- package/dist/rate-limiter/useRateLimitedState.cjs +115 -0
- package/dist/rate-limiter/useRateLimitedState.cjs.map +1 -0
- package/dist/rate-limiter/useRateLimitedState.d.cts +108 -0
- package/dist/rate-limiter/useRateLimitedState.d.ts +108 -0
- package/dist/rate-limiter/useRateLimitedState.js +115 -0
- package/dist/rate-limiter/useRateLimitedState.js.map +1 -0
- package/dist/rate-limiter/useRateLimitedValue.cjs +102 -0
- package/dist/rate-limiter/useRateLimitedValue.cjs.map +1 -0
- package/dist/rate-limiter/useRateLimitedValue.d.cts +97 -0
- package/dist/rate-limiter/useRateLimitedValue.d.ts +97 -0
- package/dist/rate-limiter/useRateLimitedValue.js +102 -0
- package/dist/rate-limiter/useRateLimitedValue.js.map +1 -0
- package/dist/rate-limiter/useRateLimiter.cjs +138 -0
- package/dist/rate-limiter/useRateLimiter.cjs.map +1 -0
- package/dist/rate-limiter/useRateLimiter.d.cts +137 -0
- package/dist/rate-limiter/useRateLimiter.d.ts +137 -0
- package/dist/rate-limiter/useRateLimiter.js +138 -0
- package/dist/rate-limiter/useRateLimiter.js.map +1 -0
- package/dist/throttler/index.cjs +16 -0
- package/dist/throttler/index.d.cts +6 -0
- package/dist/throttler/index.d.ts +6 -0
- package/dist/throttler/index.js +8 -0
- package/dist/throttler/useThrottledCallback.cjs +49 -0
- package/dist/throttler/useThrottledCallback.cjs.map +1 -0
- package/dist/throttler/useThrottledCallback.d.cts +46 -0
- package/dist/throttler/useThrottledCallback.d.ts +46 -0
- package/dist/throttler/useThrottledCallback.js +49 -0
- package/dist/throttler/useThrottledCallback.js.map +1 -0
- package/dist/throttler/useThrottledState.cjs +100 -0
- package/dist/throttler/useThrottledState.cjs.map +1 -0
- package/dist/throttler/useThrottledState.d.cts +93 -0
- package/dist/throttler/useThrottledState.d.ts +93 -0
- package/dist/throttler/useThrottledState.js +100 -0
- package/dist/throttler/useThrottledState.js.map +1 -0
- package/dist/throttler/useThrottledValue.cjs +91 -0
- package/dist/throttler/useThrottledValue.cjs.map +1 -0
- package/dist/throttler/useThrottledValue.d.cts +86 -0
- package/dist/throttler/useThrottledValue.d.ts +86 -0
- package/dist/throttler/useThrottledValue.js +91 -0
- package/dist/throttler/useThrottledValue.js.map +1 -0
- package/dist/throttler/useThrottler.cjs +109 -0
- package/dist/throttler/useThrottler.cjs.map +1 -0
- package/dist/throttler/useThrottler.d.cts +103 -0
- package/dist/throttler/useThrottler.d.ts +103 -0
- package/dist/throttler/useThrottler.js +109 -0
- package/dist/throttler/useThrottler.js.map +1 -0
- package/dist/types/index.cjs +9 -0
- package/dist/types/index.d.cts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +3 -0
- package/dist/utils/index.cjs +9 -0
- package/dist/utils/index.d.cts +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +3 -0
- package/package.json +118 -7
- package/src/async-batcher/index.ts +4 -0
- package/src/async-batcher/useAsyncBatchedCallback.ts +54 -0
- package/src/async-batcher/useAsyncBatcher.ts +198 -0
- package/src/async-debouncer/index.ts +5 -0
- package/src/async-debouncer/useAsyncDebouncedCallback.ts +54 -0
- package/src/async-debouncer/useAsyncDebouncer.ts +184 -0
- package/src/async-queuer/index.ts +4 -0
- package/src/async-queuer/useAsyncQueuedState.ts +165 -0
- package/src/async-queuer/useAsyncQueuer.ts +198 -0
- package/src/async-rate-limiter/index.ts +5 -0
- package/src/async-rate-limiter/useAsyncRateLimitedCallback.ts +69 -0
- package/src/async-rate-limiter/useAsyncRateLimiter.ts +210 -0
- package/src/async-retryer/index.ts +2 -0
- package/src/async-throttler/index.ts +5 -0
- package/src/async-throttler/useAsyncThrottledCallback.ts +52 -0
- package/src/async-throttler/useAsyncThrottler.ts +193 -0
- package/src/batcher/index.ts +4 -0
- package/src/batcher/useBatchedCallback.ts +50 -0
- package/src/batcher/useBatcher.ts +150 -0
- package/src/debouncer/index.ts +7 -0
- package/src/debouncer/useDebouncedCallback.ts +51 -0
- package/src/debouncer/useDebouncedState.ts +109 -0
- package/src/debouncer/useDebouncedValue.ts +112 -0
- package/src/debouncer/useDebouncer.ts +136 -0
- package/src/index.ts +56 -0
- package/src/provider/PacerProvider.tsx +70 -0
- package/src/provider/index.ts +1 -0
- package/src/queuer/index.ts +5 -0
- package/src/queuer/useQueuedState.ts +133 -0
- package/src/queuer/useQueuedValue.ts +129 -0
- package/src/queuer/useQueuer.ts +160 -0
- package/src/rate-limiter/index.ts +6 -0
- package/src/rate-limiter/useRateLimitedCallback.ts +68 -0
- package/src/rate-limiter/useRateLimitedState.ts +124 -0
- package/src/rate-limiter/useRateLimitedValue.ts +110 -0
- package/src/rate-limiter/useRateLimiter.ts +169 -0
- package/src/throttler/index.ts +7 -0
- package/src/throttler/useThrottledCallback.ts +52 -0
- package/src/throttler/useThrottledState.ts +121 -0
- package/src/throttler/useThrottledValue.ts +107 -0
- package/src/throttler/useThrottler.ts +141 -0
- package/src/types/index.ts +1 -0
- package/src/utils/index.ts +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Tanner Linsley
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,45 +1,165 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="./media/header_pacer.png" >
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<br />
|
|
6
|
+
|
|
7
|
+
<div align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@tanstack/pacer" target="\_parent">
|
|
9
|
+
<img alt="" src="https://img.shields.io/npm/dm/@tanstack/pacer.svg" alt="npm downloads" />
|
|
10
|
+
</a>
|
|
11
|
+
- <a href="https://github.com/TanStack/pacer" target="\_parent">
|
|
12
|
+
<img alt="" src="https://img.shields.io/github/stars/TanStack/pacer.svg?style=social&label=Star" alt="GitHub stars" />
|
|
13
|
+
</a>
|
|
14
|
+
<a href="https://bundlephobia.com/result?p=@tanstack/preact-pacer@latest" target="\_parent">
|
|
15
|
+
<img alt="" src="https://badgen.net/bundlephobia/minzip/@tanstack/preact-pacer@latest" alt="Bundle size" />
|
|
16
|
+
</a>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<div align="center">
|
|
20
|
+
<a href="#badge">
|
|
21
|
+
<img alt="semantic-release" src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg">
|
|
22
|
+
</a>
|
|
23
|
+
<a href="#badge">
|
|
24
|
+
<img src="https://img.shields.io/github/v/release/tanstack/pacer" alt="Release"/>
|
|
25
|
+
</a>
|
|
26
|
+
<a href="https://twitter.com/tan_stack">
|
|
27
|
+
<img src="https://img.shields.io/twitter/follow/tan_stack.svg?style=social" alt="Follow @TanStack"/>
|
|
28
|
+
</a>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div align="center">
|
|
32
|
+
|
|
33
|
+
### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/)
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
# TanStack Pacer
|
|
37
|
+
|
|
38
|
+
A lightweight timing and scheduling library for debouncing, throttling, rate limiting, queuing, and batching.
|
|
39
|
+
|
|
40
|
+
> [!NOTE]
|
|
41
|
+
> TanStack Pacer is currently mostly a client-side only library, but it is being designed to be able to potentially be used on the server-side as well.
|
|
42
|
+
|
|
43
|
+
- **Debouncing**
|
|
44
|
+
- Delay execution until after a period of inactivity for when you only care about the last execution in a sequence.
|
|
45
|
+
- Synchronous or Asynchronous Debounce utilities with promise support and error handling
|
|
46
|
+
- Control of leading, trailing, and enabled options
|
|
47
|
+
- **Throttling**
|
|
48
|
+
- Smoothly limit the rate at which a function can fire
|
|
49
|
+
- Synchronous or Asynchronous Throttle utilities with promise support and error handling
|
|
50
|
+
- Control of leading, trailing, and enabled options.
|
|
51
|
+
- **Rate Limiting**
|
|
52
|
+
- Limit the rate at which a function can fire over a period of time
|
|
53
|
+
- Synchronous or Asynchronous Rate Limiting utilities with promise support and error handling
|
|
54
|
+
- Fixed or Sliding Window variations of Rate Limiting
|
|
55
|
+
- **Queuing**
|
|
56
|
+
- Queue functions to be executed in a specific order
|
|
57
|
+
- Choose from FIFO, LIFO, and Priority queue implementations
|
|
58
|
+
- Control processing speed with configurable wait times or concurrency limits
|
|
59
|
+
- Manage queue execution with start/stop capabilities
|
|
60
|
+
- Expire items from the queue after a configurable duration
|
|
61
|
+
- **Batching**
|
|
62
|
+
- Chunk up multiple operations into larger batches to reduce total back-and-forth operations
|
|
63
|
+
- Batch by time period, batch size, whichever comes first, or a custom condition to trigger batch executions
|
|
64
|
+
- **Async or Sync Variations**
|
|
65
|
+
- Choose between synchronous and asynchronous versions of each utility
|
|
66
|
+
- Optional error, success, and settled handling for async variations
|
|
67
|
+
- Retry and Abort support for async variations
|
|
68
|
+
- **State Management**
|
|
69
|
+
- Uses TanStack Store under the hood for state management with fine-grained reactivity
|
|
70
|
+
- Easily integrate with your own state management library of choice
|
|
71
|
+
- Persist state to local or session storage for some utilities like rate limiting and queuing
|
|
72
|
+
- **Convenient Hooks**
|
|
73
|
+
- Reduce boilerplate code with pre-built hooks like `useDebouncedCallback`, `useThrottledValue`, and `useQueuedState`, and more.
|
|
74
|
+
- Multiple layers of abstraction to choose from depending on your use case.
|
|
75
|
+
- Works with each framework's default state management solutions, or with whatever custom state management library that you prefer.
|
|
76
|
+
- **Type Safety**
|
|
77
|
+
- Full type safety with TypeScript that makes sure that your functions will always be called with the correct arguments
|
|
78
|
+
- Generics for flexible and reusable utilities
|
|
79
|
+
- **Framework Adapters**
|
|
80
|
+
- React, Solid, and more
|
|
81
|
+
- **Tree Shaking**
|
|
82
|
+
- We, of course, get tree-shaking right for your applications by default, but we also provide extra deep imports for each utility, making it easier to embed these utilities into your libraries without increasing the bundle-phobia reports of your library.
|
|
83
|
+
|
|
84
|
+
### <a href="https://tanstack.com/pacer">Read the docs →</b></a>
|
|
85
|
+
|
|
86
|
+
<br />
|
|
87
|
+
|
|
88
|
+
> [!NOTE]
|
|
89
|
+
> You may know **TanSack Pacer** by our adapter names, too!
|
|
90
|
+
>
|
|
91
|
+
> - [**React Pacer**](https://tanstack.com/pacer/latest/docs/framework/react/react-pacer)
|
|
92
|
+
> - [**Solid Pacer**](https://tanstack.com/pacer/latest/docs/framework/solid/solid-pacer)
|
|
93
|
+
> - Angular Pacer - needs a contributor!
|
|
94
|
+
> - Preact Pacer - Coming soon! (After React Pacer is more fleshed out)
|
|
95
|
+
> - Svelte Pacer - needs a contributor!
|
|
96
|
+
> - Vue Pacer - needs a contributor!
|
|
97
|
+
|
|
98
|
+
## Get Involved
|
|
99
|
+
|
|
100
|
+
- We welcome issues and pull requests!
|
|
101
|
+
- Participate in [GitHub discussions](https://github.com/TanStack/pacer/discussions)
|
|
102
|
+
- Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ)
|
|
103
|
+
- See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions
|
|
104
|
+
|
|
105
|
+
## Partners
|
|
106
|
+
|
|
107
|
+
<table align="center">
|
|
108
|
+
<tr>
|
|
109
|
+
<td>
|
|
110
|
+
<a href="https://www.coderabbit.ai/?via=tanstack&dub_id=aCcEEdAOqqutX6OS" >
|
|
111
|
+
<picture>
|
|
112
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://tanstack.com/assets/coderabbit-dark-CMcuvjEy.svg" height="40" />
|
|
113
|
+
<source media="(prefers-color-scheme: light)" srcset="https://tanstack.com/assets/coderabbit-light-DVMJ2jHi.svg" height="40" />
|
|
114
|
+
<img src="https://tanstack.com/assets/coderabbit-light-DVMJ2jHi.svg" height="40" alt="CodeRabbit" />
|
|
115
|
+
</picture>
|
|
116
|
+
</a>
|
|
117
|
+
</td>
|
|
118
|
+
<td>
|
|
119
|
+
<a href="https://www.cloudflare.com?utm_source=tanstack">
|
|
120
|
+
<picture>
|
|
121
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://tanstack.com/assets/cloudflare-white-DQDB7UaL.svg" height="60" />
|
|
122
|
+
<source media="(prefers-color-scheme: light)" srcset="https://tanstack.com/assets/cloudflare-black-CPufaW0B.svg" height="60" />
|
|
123
|
+
<img src="https://tanstack.com/assets/cloudflare-black-CPufaW0B.svg" height="60" alt="Cloudflare" />
|
|
124
|
+
</picture>
|
|
125
|
+
</a>
|
|
126
|
+
</td>
|
|
127
|
+
<td>
|
|
128
|
+
<a href="https://www.unkey.com/?utm_source=tanstack">
|
|
129
|
+
<picture>
|
|
130
|
+
<source media="(prefers-color-scheme: dark)" srcset="./media/unkey_dark.svg" height="60" />
|
|
131
|
+
<source media="(prefers-color-scheme: light)" srcset="./media/unkey_logo.svg" height="60" />
|
|
132
|
+
<img src="./media/unkey_logo.svg" height="60" alt="Unkey"/>
|
|
133
|
+
</picture>
|
|
134
|
+
</a>
|
|
135
|
+
</td>
|
|
136
|
+
</tr>
|
|
137
|
+
</table>
|
|
138
|
+
|
|
139
|
+
<div align="center">
|
|
140
|
+
<img src="./media/partner_logo.svg" alt="Pacer & you?" height="65">
|
|
141
|
+
<p>
|
|
142
|
+
We're looking for TanStack Pacer Partners to join our mission! Partner with us to push the boundaries of TanStack Pacer and build amazing things together.
|
|
143
|
+
</p>
|
|
144
|
+
<a href="mailto:partners@tanstack.com?subject=TanStack Pacer Partnership"><b>LET'S CHAT</b></a>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
## Explore the TanStack Ecosystem
|
|
150
|
+
|
|
151
|
+
- <a href="https://github.com/tanstack/config"><b>TanStack Config</b></a> – Tooling for JS/TS packages
|
|
152
|
+
- <a href="https://github.com/tanstack/db"><b>TanStack DB</b></a> – Reactive sync client store
|
|
153
|
+
- <a href="https://github.com/tanstack/devtools"><b>TanStack DevTools</b></a> – Unified devtools panel
|
|
154
|
+
- <a href="https://github.com/tanstack/form"><b>TanStack Form</b></a> – Type‑safe form state
|
|
155
|
+
- <a href="https://github.com/tanstack/query"><b>TanStack Query</b></a> – Async state & caching
|
|
156
|
+
- <a href="https://github.com/tanstack/ranger"><b>TanStack Ranger</b></a> – Range & slider primitives
|
|
157
|
+
- <a href="https://github.com/tanstack/router"><b>TanStack Router</b></a> – Type‑safe routing, caching & URL state
|
|
158
|
+
- <a href="https://github.com/tanstack/router"><b>TanStack Start</b></a> – Full‑stack SSR & streaming
|
|
159
|
+
- <a href="https://github.com/tanstack/store"><b>TanStack Store</b></a> – Reactive data store
|
|
160
|
+
- <a href="https://github.com/tanstack/table"><b>TanStack Table</b></a> – Headless datagrids
|
|
161
|
+
- <a href="https://github.com/tanstack/virtual"><b>TanStack Virtual</b></a> – Virtualized rendering
|
|
162
|
+
|
|
163
|
+
… and more at <a href="https://tanstack.com"><b>TanStack.com »</b></a>
|
|
164
|
+
|
|
165
|
+
<!-- USE THE FORCE LUKE -->
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const require_useAsyncBatcher = require('./useAsyncBatcher.cjs');
|
|
2
|
+
const require_useAsyncBatchedCallback = require('./useAsyncBatchedCallback.cjs');
|
|
3
|
+
|
|
4
|
+
exports.useAsyncBatchedCallback = require_useAsyncBatchedCallback.useAsyncBatchedCallback;
|
|
5
|
+
exports.useAsyncBatcher = require_useAsyncBatcher.useAsyncBatcher;
|
|
6
|
+
var __tanstack_pacer_async_batcher = require("@tanstack/pacer/async-batcher");
|
|
7
|
+
Object.keys(__tanstack_pacer_async_batcher).forEach(function (k) {
|
|
8
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return __tanstack_pacer_async_batcher[k]; }
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const require_useAsyncBatcher = require('./useAsyncBatcher.cjs');
|
|
2
|
+
let preact_hooks = require("preact/hooks");
|
|
3
|
+
|
|
4
|
+
//#region src/async-batcher/useAsyncBatchedCallback.ts
|
|
5
|
+
/**
|
|
6
|
+
* A Preact hook that creates a batched version of an async callback function.
|
|
7
|
+
* This hook is a convenient wrapper around the `useAsyncBatcher` hook,
|
|
8
|
+
* providing a stable, batched async function reference for use in Preact components.
|
|
9
|
+
*
|
|
10
|
+
* The batched async function will collect individual calls into batches and execute them
|
|
11
|
+
* when batch conditions are met (max size reached, wait time elapsed, or custom logic).
|
|
12
|
+
* The returned function always returns a promise that resolves with undefined (since the
|
|
13
|
+
* batch function processes multiple items together).
|
|
14
|
+
*
|
|
15
|
+
* This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic
|
|
16
|
+
* async batching needs. However, it does not expose the underlying AsyncBatcher instance.
|
|
17
|
+
*
|
|
18
|
+
* For advanced usage requiring features like:
|
|
19
|
+
* - Manual batch execution
|
|
20
|
+
* - Access to batch results and state
|
|
21
|
+
* - Custom useCallback dependencies
|
|
22
|
+
*
|
|
23
|
+
* Consider using the `useAsyncBatcher` hook instead.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // Batch API requests
|
|
28
|
+
* const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {
|
|
29
|
+
* const results = await Promise.all(requests.map(req => fetch(req.url)));
|
|
30
|
+
* return results.map(res => res.json());
|
|
31
|
+
* }, {
|
|
32
|
+
* maxSize: 10, // Process when 10 requests collected
|
|
33
|
+
* wait: 1000 // Or after 1 second
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Use in event handlers
|
|
37
|
+
* <button onClick={() => batchApiCall({ url: '/api/analytics', data: eventData })}>
|
|
38
|
+
* Track Event
|
|
39
|
+
* </button>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function useAsyncBatchedCallback(fn, options) {
|
|
43
|
+
const asyncBatchedFn = require_useAsyncBatcher.useAsyncBatcher(fn, options).addItem;
|
|
44
|
+
return (0, preact_hooks.useCallback)(async (...args) => {
|
|
45
|
+
asyncBatchedFn(args[0]);
|
|
46
|
+
}, [asyncBatchedFn]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
exports.useAsyncBatchedCallback = useAsyncBatchedCallback;
|
|
51
|
+
//# sourceMappingURL=useAsyncBatchedCallback.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAsyncBatchedCallback.cjs","names":["useAsyncBatcher"],"sources":["../../src/async-batcher/useAsyncBatchedCallback.ts"],"sourcesContent":["import { useCallback } from 'preact/hooks'\nimport { useAsyncBatcher } from './useAsyncBatcher'\nimport type { AsyncBatcherOptions } from '@tanstack/pacer/async-batcher'\nimport type { AnyAsyncFunction } from '@tanstack/pacer/types'\n\n/**\n * A Preact hook that creates a batched version of an async callback function.\n * This hook is a convenient wrapper around the `useAsyncBatcher` hook,\n * providing a stable, batched async function reference for use in Preact components.\n *\n * The batched async function will collect individual calls into batches and execute them\n * when batch conditions are met (max size reached, wait time elapsed, or custom logic).\n * The returned function always returns a promise that resolves with undefined (since the\n * batch function processes multiple items together).\n *\n * This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic\n * async batching needs. However, it does not expose the underlying AsyncBatcher instance.\n *\n * For advanced usage requiring features like:\n * - Manual batch execution\n * - Access to batch results and state\n * - Custom useCallback dependencies\n *\n * Consider using the `useAsyncBatcher` hook instead.\n *\n * @example\n * ```tsx\n * // Batch API requests\n * const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {\n * const results = await Promise.all(requests.map(req => fetch(req.url)));\n * return results.map(res => res.json());\n * }, {\n * maxSize: 10, // Process when 10 requests collected\n * wait: 1000 // Or after 1 second\n * });\n *\n * // Use in event handlers\n * <button onClick={() => batchApiCall({ url: '/api/analytics', data: eventData })}>\n * Track Event\n * </button>\n * ```\n */\nexport function useAsyncBatchedCallback<TFn extends AnyAsyncFunction>(\n fn: (items: Array<Parameters<TFn>[0]>) => Promise<any>,\n options: AsyncBatcherOptions<Parameters<TFn>[0]>,\n): (...args: Parameters<TFn>) => Promise<void> {\n const asyncBatchedFn = useAsyncBatcher(fn, options).addItem\n return useCallback(\n async (...args: Parameters<TFn>) => {\n asyncBatchedFn(args[0])\n },\n [asyncBatchedFn],\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,wBACd,IACA,SAC6C;CAC7C,MAAM,iBAAiBA,wCAAgB,IAAI,QAAQ,CAAC;AACpD,sCACE,OAAO,GAAG,SAA0B;AAClC,iBAAe,KAAK,GAAG;IAEzB,CAAC,eAAe,CACjB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AsyncBatcherOptions } from "@tanstack/pacer/async-batcher";
|
|
2
|
+
import { AnyAsyncFunction } from "@tanstack/pacer/types";
|
|
3
|
+
|
|
4
|
+
//#region src/async-batcher/useAsyncBatchedCallback.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A Preact hook that creates a batched version of an async callback function.
|
|
8
|
+
* This hook is a convenient wrapper around the `useAsyncBatcher` hook,
|
|
9
|
+
* providing a stable, batched async function reference for use in Preact components.
|
|
10
|
+
*
|
|
11
|
+
* The batched async function will collect individual calls into batches and execute them
|
|
12
|
+
* when batch conditions are met (max size reached, wait time elapsed, or custom logic).
|
|
13
|
+
* The returned function always returns a promise that resolves with undefined (since the
|
|
14
|
+
* batch function processes multiple items together).
|
|
15
|
+
*
|
|
16
|
+
* This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic
|
|
17
|
+
* async batching needs. However, it does not expose the underlying AsyncBatcher instance.
|
|
18
|
+
*
|
|
19
|
+
* For advanced usage requiring features like:
|
|
20
|
+
* - Manual batch execution
|
|
21
|
+
* - Access to batch results and state
|
|
22
|
+
* - Custom useCallback dependencies
|
|
23
|
+
*
|
|
24
|
+
* Consider using the `useAsyncBatcher` hook instead.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* // Batch API requests
|
|
29
|
+
* const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {
|
|
30
|
+
* const results = await Promise.all(requests.map(req => fetch(req.url)));
|
|
31
|
+
* return results.map(res => res.json());
|
|
32
|
+
* }, {
|
|
33
|
+
* maxSize: 10, // Process when 10 requests collected
|
|
34
|
+
* wait: 1000 // Or after 1 second
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Use in event handlers
|
|
38
|
+
* <button onClick={() => batchApiCall({ url: '/api/analytics', data: eventData })}>
|
|
39
|
+
* Track Event
|
|
40
|
+
* </button>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function useAsyncBatchedCallback<TFn extends AnyAsyncFunction>(fn: (items: Array<Parameters<TFn>[0]>) => Promise<any>, options: AsyncBatcherOptions<Parameters<TFn>[0]>): (...args: Parameters<TFn>) => Promise<void>;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { useAsyncBatchedCallback };
|
|
46
|
+
//# sourceMappingURL=useAsyncBatchedCallback.d.cts.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AsyncBatcherOptions } from "@tanstack/pacer/async-batcher";
|
|
2
|
+
import { AnyAsyncFunction } from "@tanstack/pacer/types";
|
|
3
|
+
|
|
4
|
+
//#region src/async-batcher/useAsyncBatchedCallback.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A Preact hook that creates a batched version of an async callback function.
|
|
8
|
+
* This hook is a convenient wrapper around the `useAsyncBatcher` hook,
|
|
9
|
+
* providing a stable, batched async function reference for use in Preact components.
|
|
10
|
+
*
|
|
11
|
+
* The batched async function will collect individual calls into batches and execute them
|
|
12
|
+
* when batch conditions are met (max size reached, wait time elapsed, or custom logic).
|
|
13
|
+
* The returned function always returns a promise that resolves with undefined (since the
|
|
14
|
+
* batch function processes multiple items together).
|
|
15
|
+
*
|
|
16
|
+
* This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic
|
|
17
|
+
* async batching needs. However, it does not expose the underlying AsyncBatcher instance.
|
|
18
|
+
*
|
|
19
|
+
* For advanced usage requiring features like:
|
|
20
|
+
* - Manual batch execution
|
|
21
|
+
* - Access to batch results and state
|
|
22
|
+
* - Custom useCallback dependencies
|
|
23
|
+
*
|
|
24
|
+
* Consider using the `useAsyncBatcher` hook instead.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* // Batch API requests
|
|
29
|
+
* const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {
|
|
30
|
+
* const results = await Promise.all(requests.map(req => fetch(req.url)));
|
|
31
|
+
* return results.map(res => res.json());
|
|
32
|
+
* }, {
|
|
33
|
+
* maxSize: 10, // Process when 10 requests collected
|
|
34
|
+
* wait: 1000 // Or after 1 second
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Use in event handlers
|
|
38
|
+
* <button onClick={() => batchApiCall({ url: '/api/analytics', data: eventData })}>
|
|
39
|
+
* Track Event
|
|
40
|
+
* </button>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function useAsyncBatchedCallback<TFn extends AnyAsyncFunction>(fn: (items: Array<Parameters<TFn>[0]>) => Promise<any>, options: AsyncBatcherOptions<Parameters<TFn>[0]>): (...args: Parameters<TFn>) => Promise<void>;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { useAsyncBatchedCallback };
|
|
46
|
+
//# sourceMappingURL=useAsyncBatchedCallback.d.ts.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useAsyncBatcher } from "./useAsyncBatcher.js";
|
|
2
|
+
import { useCallback } from "preact/hooks";
|
|
3
|
+
|
|
4
|
+
//#region src/async-batcher/useAsyncBatchedCallback.ts
|
|
5
|
+
/**
|
|
6
|
+
* A Preact hook that creates a batched version of an async callback function.
|
|
7
|
+
* This hook is a convenient wrapper around the `useAsyncBatcher` hook,
|
|
8
|
+
* providing a stable, batched async function reference for use in Preact components.
|
|
9
|
+
*
|
|
10
|
+
* The batched async function will collect individual calls into batches and execute them
|
|
11
|
+
* when batch conditions are met (max size reached, wait time elapsed, or custom logic).
|
|
12
|
+
* The returned function always returns a promise that resolves with undefined (since the
|
|
13
|
+
* batch function processes multiple items together).
|
|
14
|
+
*
|
|
15
|
+
* This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic
|
|
16
|
+
* async batching needs. However, it does not expose the underlying AsyncBatcher instance.
|
|
17
|
+
*
|
|
18
|
+
* For advanced usage requiring features like:
|
|
19
|
+
* - Manual batch execution
|
|
20
|
+
* - Access to batch results and state
|
|
21
|
+
* - Custom useCallback dependencies
|
|
22
|
+
*
|
|
23
|
+
* Consider using the `useAsyncBatcher` hook instead.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // Batch API requests
|
|
28
|
+
* const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {
|
|
29
|
+
* const results = await Promise.all(requests.map(req => fetch(req.url)));
|
|
30
|
+
* return results.map(res => res.json());
|
|
31
|
+
* }, {
|
|
32
|
+
* maxSize: 10, // Process when 10 requests collected
|
|
33
|
+
* wait: 1000 // Or after 1 second
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Use in event handlers
|
|
37
|
+
* <button onClick={() => batchApiCall({ url: '/api/analytics', data: eventData })}>
|
|
38
|
+
* Track Event
|
|
39
|
+
* </button>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function useAsyncBatchedCallback(fn, options) {
|
|
43
|
+
const asyncBatchedFn = useAsyncBatcher(fn, options).addItem;
|
|
44
|
+
return useCallback(async (...args) => {
|
|
45
|
+
asyncBatchedFn(args[0]);
|
|
46
|
+
}, [asyncBatchedFn]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
export { useAsyncBatchedCallback };
|
|
51
|
+
//# sourceMappingURL=useAsyncBatchedCallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAsyncBatchedCallback.js","names":[],"sources":["../../src/async-batcher/useAsyncBatchedCallback.ts"],"sourcesContent":["import { useCallback } from 'preact/hooks'\nimport { useAsyncBatcher } from './useAsyncBatcher'\nimport type { AsyncBatcherOptions } from '@tanstack/pacer/async-batcher'\nimport type { AnyAsyncFunction } from '@tanstack/pacer/types'\n\n/**\n * A Preact hook that creates a batched version of an async callback function.\n * This hook is a convenient wrapper around the `useAsyncBatcher` hook,\n * providing a stable, batched async function reference for use in Preact components.\n *\n * The batched async function will collect individual calls into batches and execute them\n * when batch conditions are met (max size reached, wait time elapsed, or custom logic).\n * The returned function always returns a promise that resolves with undefined (since the\n * batch function processes multiple items together).\n *\n * This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic\n * async batching needs. However, it does not expose the underlying AsyncBatcher instance.\n *\n * For advanced usage requiring features like:\n * - Manual batch execution\n * - Access to batch results and state\n * - Custom useCallback dependencies\n *\n * Consider using the `useAsyncBatcher` hook instead.\n *\n * @example\n * ```tsx\n * // Batch API requests\n * const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {\n * const results = await Promise.all(requests.map(req => fetch(req.url)));\n * return results.map(res => res.json());\n * }, {\n * maxSize: 10, // Process when 10 requests collected\n * wait: 1000 // Or after 1 second\n * });\n *\n * // Use in event handlers\n * <button onClick={() => batchApiCall({ url: '/api/analytics', data: eventData })}>\n * Track Event\n * </button>\n * ```\n */\nexport function useAsyncBatchedCallback<TFn extends AnyAsyncFunction>(\n fn: (items: Array<Parameters<TFn>[0]>) => Promise<any>,\n options: AsyncBatcherOptions<Parameters<TFn>[0]>,\n): (...args: Parameters<TFn>) => Promise<void> {\n const asyncBatchedFn = useAsyncBatcher(fn, options).addItem\n return useCallback(\n async (...args: Parameters<TFn>) => {\n asyncBatchedFn(args[0])\n },\n [asyncBatchedFn],\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,wBACd,IACA,SAC6C;CAC7C,MAAM,iBAAiB,gBAAgB,IAAI,QAAQ,CAAC;AACpD,QAAO,YACL,OAAO,GAAG,SAA0B;AAClC,iBAAe,KAAK,GAAG;IAEzB,CAAC,eAAe,CACjB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const require_PacerProvider = require('../provider/PacerProvider.cjs');
|
|
2
|
+
let preact_hooks = require("preact/hooks");
|
|
3
|
+
let __tanstack_pacer_async_batcher = require("@tanstack/pacer/async-batcher");
|
|
4
|
+
let __tanstack_preact_store = require("@tanstack/preact-store");
|
|
5
|
+
|
|
6
|
+
//#region src/async-batcher/useAsyncBatcher.ts
|
|
7
|
+
/**
|
|
8
|
+
* A Preact hook that creates an `AsyncBatcher` instance for managing asynchronous batches of items.
|
|
9
|
+
*
|
|
10
|
+
* This is the async version of the useBatcher hook. Unlike the sync version, this async batcher:
|
|
11
|
+
* - Handles promises and returns results from batch executions
|
|
12
|
+
* - Provides error handling with configurable error behavior
|
|
13
|
+
* - Tracks success, error, and settle counts separately
|
|
14
|
+
* - Has state tracking for when batches are executing
|
|
15
|
+
* - Returns the result of the batch function execution
|
|
16
|
+
*
|
|
17
|
+
* Features:
|
|
18
|
+
* - Configurable batch size and wait time
|
|
19
|
+
* - Custom batch processing logic via getShouldExecute
|
|
20
|
+
* - Event callbacks for monitoring batch operations
|
|
21
|
+
* - Error handling for failed batch operations
|
|
22
|
+
* - Automatic or manual batch processing
|
|
23
|
+
*
|
|
24
|
+
* The batcher collects items and processes them in batches based on:
|
|
25
|
+
* - Maximum batch size (number of items per batch)
|
|
26
|
+
* - Time-based batching (process after X milliseconds)
|
|
27
|
+
* - Custom batch processing logic via getShouldExecute
|
|
28
|
+
*
|
|
29
|
+
* Error Handling:
|
|
30
|
+
* - If an `onError` handler is provided, it will be called with the error and batcher instance
|
|
31
|
+
* - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown
|
|
32
|
+
* - If `throwOnError` is false (default when onError handler is provided), the error will be swallowed
|
|
33
|
+
* - Both onError and throwOnError can be used together - the handler will be called before any error is thrown
|
|
34
|
+
* - The error state can be checked using the underlying AsyncBatcher instance
|
|
35
|
+
*
|
|
36
|
+
* ## State Management and Selector
|
|
37
|
+
*
|
|
38
|
+
* The hook uses TanStack Store for reactive state management. The `selector` parameter allows you
|
|
39
|
+
* to specify which state changes will trigger a re-render, optimizing performance by preventing
|
|
40
|
+
* unnecessary re-renders when irrelevant state changes occur.
|
|
41
|
+
*
|
|
42
|
+
* **By default, there will be no reactive state subscriptions** and you must opt-in to state
|
|
43
|
+
* tracking by providing a selector function. This prevents unnecessary re-renders and gives you
|
|
44
|
+
* full control over when your component updates. Only when you provide a selector will the
|
|
45
|
+
* component re-render when the selected state values change.
|
|
46
|
+
*
|
|
47
|
+
* Available state properties:
|
|
48
|
+
* - `errorCount`: Number of batch executions that have resulted in errors
|
|
49
|
+
* - `failedItems`: Array of items that failed during batch processing
|
|
50
|
+
* - `isEmpty`: Whether the batcher has no items to process
|
|
51
|
+
* - `isExecuting`: Whether a batch is currently being processed asynchronously
|
|
52
|
+
* - `isPending`: Whether the batcher is waiting for the timeout to trigger batch processing
|
|
53
|
+
* - `isRunning`: Whether the batcher is active and will process items automatically
|
|
54
|
+
* - `items`: Array of items currently queued for batch processing
|
|
55
|
+
* - `lastResult`: The result from the most recent batch execution
|
|
56
|
+
* - `settleCount`: Number of batch executions that have completed (success or error)
|
|
57
|
+
* - `size`: Number of items currently in the batch queue
|
|
58
|
+
* - `status`: Current processing status ('idle' | 'pending' | 'executing' | 'populated')
|
|
59
|
+
* - `successCount`: Number of batch executions that have completed successfully
|
|
60
|
+
* - `totalItemsProcessed`: Total number of items processed across all batches
|
|
61
|
+
* - `totalItemsFailed`: Total number of items that have failed processing
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```tsx
|
|
65
|
+
* // Basic async batcher for API requests - no reactive state subscriptions
|
|
66
|
+
* const asyncBatcher = useAsyncBatcher(
|
|
67
|
+
* async (items) => {
|
|
68
|
+
* const results = await Promise.all(items.map(item => processItem(item)));
|
|
69
|
+
* return results;
|
|
70
|
+
* },
|
|
71
|
+
* { maxSize: 10, wait: 2000 }
|
|
72
|
+
* );
|
|
73
|
+
*
|
|
74
|
+
* // Opt-in to re-render when execution state changes (optimized for loading indicators)
|
|
75
|
+
* const asyncBatcher = useAsyncBatcher(
|
|
76
|
+
* async (items) => {
|
|
77
|
+
* const results = await Promise.all(items.map(item => processItem(item)));
|
|
78
|
+
* return results;
|
|
79
|
+
* },
|
|
80
|
+
* { maxSize: 10, wait: 2000 },
|
|
81
|
+
* (state) => ({
|
|
82
|
+
* isExecuting: state.isExecuting,
|
|
83
|
+
* isPending: state.isPending,
|
|
84
|
+
* status: state.status
|
|
85
|
+
* })
|
|
86
|
+
* );
|
|
87
|
+
*
|
|
88
|
+
* // Opt-in to re-render when results are available (optimized for data display)
|
|
89
|
+
* const asyncBatcher = useAsyncBatcher(
|
|
90
|
+
* async (items) => {
|
|
91
|
+
* const results = await Promise.all(items.map(item => processItem(item)));
|
|
92
|
+
* return results;
|
|
93
|
+
* },
|
|
94
|
+
* { maxSize: 10, wait: 2000 },
|
|
95
|
+
* (state) => ({
|
|
96
|
+
* lastResult: state.lastResult,
|
|
97
|
+
* successCount: state.successCount,
|
|
98
|
+
* totalItemsProcessed: state.totalItemsProcessed
|
|
99
|
+
* })
|
|
100
|
+
* );
|
|
101
|
+
*
|
|
102
|
+
* // Opt-in to re-render when error state changes (optimized for error handling)
|
|
103
|
+
* const asyncBatcher = useAsyncBatcher(
|
|
104
|
+
* async (items) => {
|
|
105
|
+
* const results = await Promise.all(items.map(item => processItem(item)));
|
|
106
|
+
* return results;
|
|
107
|
+
* },
|
|
108
|
+
* {
|
|
109
|
+
* maxSize: 10,
|
|
110
|
+
* wait: 2000,
|
|
111
|
+
* onError: (error) => console.error('Batch processing failed:', error)
|
|
112
|
+
* },
|
|
113
|
+
* (state) => ({
|
|
114
|
+
* errorCount: state.errorCount,
|
|
115
|
+
* failedItems: state.failedItems,
|
|
116
|
+
* totalItemsFailed: state.totalItemsFailed
|
|
117
|
+
* })
|
|
118
|
+
* );
|
|
119
|
+
*
|
|
120
|
+
* // Complete example with all callbacks
|
|
121
|
+
* const asyncBatcher = useAsyncBatcher(
|
|
122
|
+
* async (items) => {
|
|
123
|
+
* const results = await Promise.all(items.map(item => processItem(item)));
|
|
124
|
+
* return results;
|
|
125
|
+
* },
|
|
126
|
+
* {
|
|
127
|
+
* maxSize: 10,
|
|
128
|
+
* wait: 2000,
|
|
129
|
+
* onSuccess: (result) => {
|
|
130
|
+
* console.log('Batch processed successfully:', result);
|
|
131
|
+
* },
|
|
132
|
+
* onError: (error) => {
|
|
133
|
+
* console.error('Batch processing failed:', error);
|
|
134
|
+
* }
|
|
135
|
+
* }
|
|
136
|
+
* );
|
|
137
|
+
*
|
|
138
|
+
* // Add items to batch
|
|
139
|
+
* asyncBatcher.addItem(newItem);
|
|
140
|
+
*
|
|
141
|
+
* // Manually execute batch
|
|
142
|
+
* const result = await asyncBatcher.execute();
|
|
143
|
+
*
|
|
144
|
+
* // Access the selected state (will be empty object {} unless selector provided)
|
|
145
|
+
* const { isExecuting, lastResult, size } = asyncBatcher.state;
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
function useAsyncBatcher(fn, options = {}, selector = () => ({})) {
|
|
149
|
+
const mergedOptions = {
|
|
150
|
+
...require_PacerProvider.useDefaultPacerOptions().asyncBatcher,
|
|
151
|
+
...options
|
|
152
|
+
};
|
|
153
|
+
const [asyncBatcher] = (0, preact_hooks.useState)(() => new __tanstack_pacer_async_batcher.AsyncBatcher(fn, mergedOptions));
|
|
154
|
+
asyncBatcher.fn = fn;
|
|
155
|
+
asyncBatcher.setOptions(mergedOptions);
|
|
156
|
+
const state = (0, __tanstack_preact_store.useStore)(asyncBatcher.store, selector);
|
|
157
|
+
return (0, preact_hooks.useMemo)(() => ({
|
|
158
|
+
...asyncBatcher,
|
|
159
|
+
state
|
|
160
|
+
}), [asyncBatcher, state]);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
exports.useAsyncBatcher = useAsyncBatcher;
|
|
165
|
+
//# sourceMappingURL=useAsyncBatcher.cjs.map
|