@tanstack/solid-pacer 0.8.0 → 0.9.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/dist/cjs/async-batcher/createAsyncBatcher.cjs +14 -0
- package/dist/cjs/async-batcher/createAsyncBatcher.cjs.map +1 -0
- package/dist/cjs/async-batcher/createAsyncBatcher.d.cts +72 -0
- package/dist/cjs/async-batcher/index.cjs +12 -0
- package/dist/cjs/{compare → async-batcher}/index.cjs.map +1 -1
- package/dist/cjs/async-batcher/index.d.cts +2 -0
- package/dist/cjs/async-debouncer/createAsyncDebouncer.cjs +9 -36
- package/dist/cjs/async-debouncer/createAsyncDebouncer.cjs.map +1 -1
- package/dist/cjs/async-debouncer/createAsyncDebouncer.d.cts +10 -9
- package/dist/cjs/async-queuer/createAsyncQueuer.cjs +5 -73
- package/dist/cjs/async-queuer/createAsyncQueuer.cjs.map +1 -1
- package/dist/cjs/async-queuer/createAsyncQueuer.d.cts +7 -53
- package/dist/cjs/async-rate-limiter/createAsyncRateLimiter.cjs +5 -52
- package/dist/cjs/async-rate-limiter/createAsyncRateLimiter.cjs.map +1 -1
- package/dist/cjs/async-rate-limiter/createAsyncRateLimiter.d.cts +4 -9
- package/dist/cjs/async-throttler/createAsyncThrottler.cjs +5 -55
- package/dist/cjs/async-throttler/createAsyncThrottler.cjs.map +1 -1
- package/dist/cjs/async-throttler/createAsyncThrottler.d.cts +9 -11
- package/dist/cjs/batcher/createBatcher.cjs +5 -49
- package/dist/cjs/batcher/createBatcher.cjs.map +1 -1
- package/dist/cjs/batcher/createBatcher.d.cts +9 -27
- package/dist/cjs/debouncer/createDebouncedSignal.cjs +2 -2
- package/dist/cjs/debouncer/createDebouncedSignal.cjs.map +1 -1
- package/dist/cjs/debouncer/createDebouncedSignal.d.cts +6 -2
- package/dist/cjs/debouncer/createDebouncedValue.cjs +3 -2
- package/dist/cjs/debouncer/createDebouncedValue.cjs.map +1 -1
- package/dist/cjs/debouncer/createDebouncedValue.d.cts +2 -2
- package/dist/cjs/debouncer/createDebouncer.cjs +7 -24
- package/dist/cjs/debouncer/createDebouncer.cjs.map +1 -1
- package/dist/cjs/debouncer/createDebouncer.d.cts +9 -8
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -0
- package/dist/cjs/queuer/createQueuer.cjs +5 -59
- package/dist/cjs/queuer/createQueuer.cjs.map +1 -1
- package/dist/cjs/queuer/createQueuer.d.cts +7 -37
- package/dist/cjs/rate-limiter/createRateLimitedSignal.cjs +7 -3
- package/dist/cjs/rate-limiter/createRateLimitedSignal.cjs.map +1 -1
- package/dist/cjs/rate-limiter/createRateLimitedSignal.d.cts +6 -2
- package/dist/cjs/rate-limiter/createRateLimitedValue.cjs +2 -2
- package/dist/cjs/rate-limiter/createRateLimitedValue.cjs.map +1 -1
- package/dist/cjs/rate-limiter/createRateLimitedValue.d.cts +2 -2
- package/dist/cjs/rate-limiter/createRateLimiter.cjs +5 -43
- package/dist/cjs/rate-limiter/createRateLimiter.cjs.map +1 -1
- package/dist/cjs/rate-limiter/createRateLimiter.d.cts +9 -7
- package/dist/cjs/throttler/createThrottledSignal.cjs +2 -2
- package/dist/cjs/throttler/createThrottledSignal.cjs.map +1 -1
- package/dist/cjs/throttler/createThrottledSignal.d.cts +6 -2
- package/dist/cjs/throttler/createThrottledValue.cjs +3 -2
- package/dist/cjs/throttler/createThrottledValue.cjs.map +1 -1
- package/dist/cjs/throttler/createThrottledValue.d.cts +2 -2
- package/dist/cjs/throttler/createThrottler.cjs +7 -34
- package/dist/cjs/throttler/createThrottler.cjs.map +1 -1
- package/dist/cjs/throttler/createThrottler.d.cts +9 -10
- package/dist/esm/async-batcher/createAsyncBatcher.d.ts +72 -0
- package/dist/esm/async-batcher/createAsyncBatcher.js +14 -0
- package/dist/esm/async-batcher/createAsyncBatcher.js.map +1 -0
- package/dist/esm/async-batcher/index.d.ts +2 -0
- package/dist/esm/async-batcher/index.js +6 -0
- package/dist/esm/{compare → async-batcher}/index.js.map +1 -1
- package/dist/esm/async-debouncer/createAsyncDebouncer.d.ts +10 -9
- package/dist/esm/async-debouncer/createAsyncDebouncer.js +10 -37
- package/dist/esm/async-debouncer/createAsyncDebouncer.js.map +1 -1
- package/dist/esm/async-queuer/createAsyncQueuer.d.ts +7 -53
- package/dist/esm/async-queuer/createAsyncQueuer.js +5 -73
- package/dist/esm/async-queuer/createAsyncQueuer.js.map +1 -1
- package/dist/esm/async-rate-limiter/createAsyncRateLimiter.d.ts +4 -9
- package/dist/esm/async-rate-limiter/createAsyncRateLimiter.js +5 -52
- package/dist/esm/async-rate-limiter/createAsyncRateLimiter.js.map +1 -1
- package/dist/esm/async-throttler/createAsyncThrottler.d.ts +9 -11
- package/dist/esm/async-throttler/createAsyncThrottler.js +5 -55
- package/dist/esm/async-throttler/createAsyncThrottler.js.map +1 -1
- package/dist/esm/batcher/createBatcher.d.ts +9 -27
- package/dist/esm/batcher/createBatcher.js +5 -49
- package/dist/esm/batcher/createBatcher.js.map +1 -1
- package/dist/esm/debouncer/createDebouncedSignal.d.ts +6 -2
- package/dist/esm/debouncer/createDebouncedSignal.js +2 -2
- package/dist/esm/debouncer/createDebouncedSignal.js.map +1 -1
- package/dist/esm/debouncer/createDebouncedValue.d.ts +2 -2
- package/dist/esm/debouncer/createDebouncedValue.js +3 -2
- package/dist/esm/debouncer/createDebouncedValue.js.map +1 -1
- package/dist/esm/debouncer/createDebouncer.d.ts +9 -8
- package/dist/esm/debouncer/createDebouncer.js +8 -25
- package/dist/esm/debouncer/createDebouncer.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/queuer/createQueuer.d.ts +7 -37
- package/dist/esm/queuer/createQueuer.js +5 -59
- package/dist/esm/queuer/createQueuer.js.map +1 -1
- package/dist/esm/rate-limiter/createRateLimitedSignal.d.ts +6 -2
- package/dist/esm/rate-limiter/createRateLimitedSignal.js +7 -3
- package/dist/esm/rate-limiter/createRateLimitedSignal.js.map +1 -1
- package/dist/esm/rate-limiter/createRateLimitedValue.d.ts +2 -2
- package/dist/esm/rate-limiter/createRateLimitedValue.js +2 -2
- package/dist/esm/rate-limiter/createRateLimitedValue.js.map +1 -1
- package/dist/esm/rate-limiter/createRateLimiter.d.ts +9 -7
- package/dist/esm/rate-limiter/createRateLimiter.js +5 -43
- package/dist/esm/rate-limiter/createRateLimiter.js.map +1 -1
- package/dist/esm/throttler/createThrottledSignal.d.ts +6 -2
- package/dist/esm/throttler/createThrottledSignal.js +2 -2
- package/dist/esm/throttler/createThrottledSignal.js.map +1 -1
- package/dist/esm/throttler/createThrottledValue.d.ts +2 -2
- package/dist/esm/throttler/createThrottledValue.js +3 -2
- package/dist/esm/throttler/createThrottledValue.js.map +1 -1
- package/dist/esm/throttler/createThrottler.d.ts +9 -10
- package/dist/esm/throttler/createThrottler.js +8 -35
- package/dist/esm/throttler/createThrottler.js.map +1 -1
- package/package.json +14 -3
- package/src/async-batcher/createAsyncBatcher.ts +98 -0
- package/src/async-batcher/index.ts +3 -0
- package/src/async-debouncer/createAsyncDebouncer.ts +31 -56
- package/src/async-queuer/createAsyncQueuer.ts +18 -141
- package/src/async-rate-limiter/createAsyncRateLimiter.ts +20 -75
- package/src/async-throttler/createAsyncThrottler.ts +25 -81
- package/src/batcher/createBatcher.ts +17 -94
- package/src/debouncer/createDebouncedSignal.ts +15 -4
- package/src/debouncer/createDebouncedValue.ts +11 -3
- package/src/debouncer/createDebouncer.ts +28 -38
- package/src/index.ts +3 -0
- package/src/queuer/createQueuer.ts +15 -115
- package/src/rate-limiter/createRateLimitedSignal.ts +17 -5
- package/src/rate-limiter/createRateLimitedValue.ts +8 -4
- package/src/rate-limiter/createRateLimiter.ts +25 -62
- package/src/throttler/createThrottledSignal.ts +15 -4
- package/src/throttler/createThrottledValue.ts +11 -3
- package/src/throttler/createThrottler.ts +28 -56
- package/dist/cjs/compare/index.cjs +0 -10
- package/dist/cjs/compare/index.d.cts +0 -1
- package/dist/esm/compare/index.d.ts +0 -1
- package/dist/esm/compare/index.js +0 -2
- package/src/compare/index.ts +0 -1
|
@@ -1,57 +1,16 @@
|
|
|
1
1
|
import { Queuer } from '@tanstack/pacer/queuer'
|
|
2
|
-
import {
|
|
3
|
-
import { bindInstanceMethods } from '@tanstack/pacer/utils'
|
|
2
|
+
import { useStore } from '@tanstack/solid-store'
|
|
4
3
|
import type { Accessor } from 'solid-js'
|
|
5
|
-
import type { QueuerOptions } from '@tanstack/pacer/queuer'
|
|
4
|
+
import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer'
|
|
6
5
|
|
|
7
|
-
export interface SolidQueuer<TValue
|
|
8
|
-
extends Omit<
|
|
9
|
-
Queuer<TValue>,
|
|
10
|
-
| 'getExecutionCount'
|
|
11
|
-
| 'getIsEmpty'
|
|
12
|
-
| 'getIsFull'
|
|
13
|
-
| 'getIsIdle'
|
|
14
|
-
| 'getIsRunning'
|
|
15
|
-
| 'getSize'
|
|
16
|
-
| 'peekAllItems'
|
|
17
|
-
| 'peekNextItem'
|
|
18
|
-
> {
|
|
6
|
+
export interface SolidQueuer<TValue, TSelected = QueuerState<TValue>>
|
|
7
|
+
extends Omit<Queuer<TValue>, 'store'> {
|
|
19
8
|
/**
|
|
20
|
-
*
|
|
9
|
+
* Reactive state that will be updated when the queuer state changes
|
|
10
|
+
*
|
|
11
|
+
* Use this instead of `queuer.store.state`
|
|
21
12
|
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Signal version of `getExecutionCount`
|
|
25
|
-
*/
|
|
26
|
-
executionCount: Accessor<number>
|
|
27
|
-
/**
|
|
28
|
-
* Signal version of `getIsEmpty`
|
|
29
|
-
*/
|
|
30
|
-
isEmpty: Accessor<boolean>
|
|
31
|
-
/**
|
|
32
|
-
* Signal version of `getIsFull`
|
|
33
|
-
*/
|
|
34
|
-
isFull: Accessor<boolean>
|
|
35
|
-
/**
|
|
36
|
-
* Signal version of `getIsIdle`
|
|
37
|
-
*/
|
|
38
|
-
isIdle: Accessor<boolean>
|
|
39
|
-
/**
|
|
40
|
-
* Signal version of `getIsRunning`
|
|
41
|
-
*/
|
|
42
|
-
isRunning: Accessor<boolean>
|
|
43
|
-
/**
|
|
44
|
-
* Signal version of `peekNextItem`
|
|
45
|
-
*/
|
|
46
|
-
nextItem: Accessor<TValue | undefined>
|
|
47
|
-
/**
|
|
48
|
-
* Signal version of `getRejectionCount`
|
|
49
|
-
*/
|
|
50
|
-
rejectionCount: Accessor<number>
|
|
51
|
-
/**
|
|
52
|
-
* Signal version of `getSize`
|
|
53
|
-
*/
|
|
54
|
-
size: Accessor<number>
|
|
13
|
+
readonly state: Accessor<Readonly<TSelected>>
|
|
55
14
|
}
|
|
56
15
|
|
|
57
16
|
/**
|
|
@@ -105,76 +64,17 @@ export interface SolidQueuer<TValue>
|
|
|
105
64
|
* console.log('Next item:', queue.nextItem());
|
|
106
65
|
* ```
|
|
107
66
|
*/
|
|
108
|
-
export function createQueuer<TValue
|
|
67
|
+
export function createQueuer<TValue, TSelected = QueuerState<TValue>>(
|
|
109
68
|
fn: (item: TValue) => void,
|
|
110
69
|
initialOptions: QueuerOptions<TValue> = {},
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const [allItems, setAllItems] = createSignal<Array<TValue>>(
|
|
115
|
-
queuer.peekAllItems(),
|
|
116
|
-
)
|
|
117
|
-
const [executionCount, setExecutionCount] = createSignal(
|
|
118
|
-
queuer.getExecutionCount(),
|
|
119
|
-
)
|
|
120
|
-
const [rejectionCount, setRejectionCount] = createSignal(
|
|
121
|
-
queuer.getRejectionCount(),
|
|
122
|
-
)
|
|
123
|
-
const [isEmpty, setIsEmpty] = createSignal(queuer.getIsEmpty())
|
|
124
|
-
const [isFull, setIsFull] = createSignal(queuer.getIsFull())
|
|
125
|
-
const [isIdle, setIsIdle] = createSignal(queuer.getIsIdle())
|
|
126
|
-
const [isRunning, setIsRunning] = createSignal(queuer.getIsRunning())
|
|
127
|
-
const [nextItem, setNextItem] = createSignal<TValue | undefined>(
|
|
128
|
-
queuer.peekNextItem(),
|
|
129
|
-
)
|
|
130
|
-
const [size, setSize] = createSignal(queuer.getSize())
|
|
131
|
-
|
|
132
|
-
function setOptions(newOptions: Partial<QueuerOptions<TValue>>) {
|
|
133
|
-
queuer.setOptions({
|
|
134
|
-
...newOptions,
|
|
135
|
-
onItemsChange: (queuer) => {
|
|
136
|
-
setAllItems(queuer.peekAllItems())
|
|
137
|
-
setExecutionCount(queuer.getExecutionCount())
|
|
138
|
-
setIsEmpty(queuer.getIsEmpty())
|
|
139
|
-
setIsFull(queuer.getIsFull())
|
|
140
|
-
setIsIdle(queuer.getIsIdle())
|
|
141
|
-
setNextItem(() => queuer.peekNextItem())
|
|
142
|
-
setSize(queuer.getSize())
|
|
143
|
-
|
|
144
|
-
const onItemsChange =
|
|
145
|
-
newOptions.onItemsChange ?? initialOptions.onItemsChange
|
|
146
|
-
onItemsChange?.(queuer)
|
|
147
|
-
},
|
|
148
|
-
onIsRunningChange: (queuer) => {
|
|
149
|
-
setIsRunning(queuer.getIsRunning())
|
|
150
|
-
setIsIdle(queuer.getIsIdle())
|
|
151
|
-
|
|
152
|
-
const onIsRunningChange =
|
|
153
|
-
newOptions.onIsRunningChange ?? initialOptions.onIsRunningChange
|
|
154
|
-
onIsRunningChange?.(queuer)
|
|
155
|
-
},
|
|
156
|
-
onReject: (item, queuer) => {
|
|
157
|
-
setRejectionCount(queuer.getRejectionCount())
|
|
158
|
-
|
|
159
|
-
const onReject = newOptions.onReject ?? initialOptions.onReject
|
|
160
|
-
onReject?.(item, queuer)
|
|
161
|
-
},
|
|
162
|
-
})
|
|
163
|
-
}
|
|
70
|
+
selector?: (state: QueuerState<TValue>) => TSelected,
|
|
71
|
+
): SolidQueuer<TValue, TSelected> {
|
|
72
|
+
const queuer = new Queuer(fn, initialOptions)
|
|
164
73
|
|
|
165
|
-
|
|
74
|
+
const state = useStore(queuer.store, selector)
|
|
166
75
|
|
|
167
76
|
return {
|
|
168
77
|
...queuer,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
isEmpty,
|
|
172
|
-
isFull,
|
|
173
|
-
isIdle,
|
|
174
|
-
isRunning,
|
|
175
|
-
nextItem,
|
|
176
|
-
rejectionCount,
|
|
177
|
-
size,
|
|
178
|
-
setOptions,
|
|
179
|
-
} as SolidQueuer<TValue>
|
|
78
|
+
state,
|
|
79
|
+
} as unknown as SolidQueuer<TValue, TSelected> // omit `store` in favor of `state`
|
|
180
80
|
}
|
|
@@ -2,7 +2,10 @@ import { createSignal } from 'solid-js'
|
|
|
2
2
|
import { createRateLimiter } from './createRateLimiter'
|
|
3
3
|
import type { SolidRateLimiter } from './createRateLimiter'
|
|
4
4
|
import type { Accessor, Setter } from 'solid-js'
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
RateLimiterOptions,
|
|
7
|
+
RateLimiterState,
|
|
8
|
+
} from '@tanstack/pacer/rate-limiter'
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* A Solid hook that creates a rate-limited state value that enforces a hard limit on state updates within a time window.
|
|
@@ -62,17 +65,26 @@ import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
|
|
|
62
65
|
* };
|
|
63
66
|
* ```
|
|
64
67
|
*/
|
|
65
|
-
export function createRateLimitedSignal<TValue>(
|
|
68
|
+
export function createRateLimitedSignal<TValue, TSelected = RateLimiterState>(
|
|
66
69
|
value: TValue,
|
|
67
70
|
initialOptions: RateLimiterOptions<Setter<TValue>>,
|
|
68
|
-
|
|
71
|
+
selector?: (state: RateLimiterState) => TSelected,
|
|
72
|
+
): [
|
|
73
|
+
Accessor<TValue>,
|
|
74
|
+
Setter<TValue>,
|
|
75
|
+
SolidRateLimiter<Setter<TValue>, TSelected>,
|
|
76
|
+
] {
|
|
69
77
|
const [rateLimitedValue, setRateLimitedValue] = createSignal<TValue>(value)
|
|
70
78
|
|
|
71
|
-
const rateLimiter = createRateLimiter(
|
|
79
|
+
const rateLimiter = createRateLimiter(
|
|
80
|
+
setRateLimitedValue,
|
|
81
|
+
initialOptions,
|
|
82
|
+
selector,
|
|
83
|
+
)
|
|
72
84
|
|
|
73
85
|
return [
|
|
74
86
|
rateLimitedValue,
|
|
75
|
-
rateLimiter.maybeExecute
|
|
87
|
+
rateLimiter.maybeExecute as Setter<TValue>,
|
|
76
88
|
rateLimiter,
|
|
77
89
|
]
|
|
78
90
|
}
|
|
@@ -2,7 +2,10 @@ import { createEffect } from 'solid-js'
|
|
|
2
2
|
import { createRateLimitedSignal } from './createRateLimitedSignal'
|
|
3
3
|
import type { SolidRateLimiter } from './createRateLimiter'
|
|
4
4
|
import type { Accessor, Setter } from 'solid-js'
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
RateLimiterOptions,
|
|
7
|
+
RateLimiterState,
|
|
8
|
+
} from '@tanstack/pacer/rate-limiter'
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* A high-level Solid hook that creates a rate-limited version of a value that updates at most a certain number of times within a time window.
|
|
@@ -47,12 +50,13 @@ import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
|
|
|
47
50
|
* rateLimiter.reset(); // Reset the rate limit window
|
|
48
51
|
* ```
|
|
49
52
|
*/
|
|
50
|
-
export function createRateLimitedValue<TValue>(
|
|
53
|
+
export function createRateLimitedValue<TValue, TSelected = RateLimiterState>(
|
|
51
54
|
value: Accessor<TValue>,
|
|
52
55
|
initialOptions: RateLimiterOptions<Setter<TValue>>,
|
|
53
|
-
|
|
56
|
+
selector?: (state: RateLimiterState) => TSelected,
|
|
57
|
+
): [Accessor<TValue>, SolidRateLimiter<Setter<TValue>, TSelected>] {
|
|
54
58
|
const [rateLimitedValue, setRateLimitedValue, rateLimiter] =
|
|
55
|
-
createRateLimitedSignal(value(), initialOptions)
|
|
59
|
+
createRateLimitedSignal(value(), initialOptions, selector)
|
|
56
60
|
|
|
57
61
|
createEffect(() => {
|
|
58
62
|
setRateLimitedValue(value() as any)
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { RateLimiter } from '@tanstack/pacer/rate-limiter'
|
|
2
|
-
import {
|
|
3
|
-
import { bindInstanceMethods } from '@tanstack/pacer/utils'
|
|
2
|
+
import { useStore } from '@tanstack/solid-store'
|
|
4
3
|
import type { Accessor } from 'solid-js'
|
|
5
4
|
import type { AnyFunction } from '@tanstack/pacer/types'
|
|
6
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
RateLimiterOptions,
|
|
7
|
+
RateLimiterState,
|
|
8
|
+
} from '@tanstack/pacer/rate-limiter'
|
|
7
9
|
|
|
8
|
-
export interface SolidRateLimiter<
|
|
9
|
-
extends
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
rejectionCount: Accessor<number>
|
|
19
|
-
remainingInWindow: Accessor<number>
|
|
10
|
+
export interface SolidRateLimiter<
|
|
11
|
+
TFn extends AnyFunction,
|
|
12
|
+
TSelected = RateLimiterState,
|
|
13
|
+
> extends Omit<RateLimiter<TFn>, 'store'> {
|
|
14
|
+
/**
|
|
15
|
+
* Reactive state that will be updated when the rate limiter state changes
|
|
16
|
+
*
|
|
17
|
+
* Use this instead of `rateLimiter.store.state`
|
|
18
|
+
*/
|
|
19
|
+
readonly state: Accessor<Readonly<TSelected>>
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -59,57 +59,20 @@ export interface SolidRateLimiter<TFn extends AnyFunction>
|
|
|
59
59
|
* console.log('Next window in:', rateLimiter.msUntilNextWindow());
|
|
60
60
|
* ```
|
|
61
61
|
*/
|
|
62
|
-
export function createRateLimiter<
|
|
62
|
+
export function createRateLimiter<
|
|
63
|
+
TFn extends AnyFunction,
|
|
64
|
+
TSelected = RateLimiterState,
|
|
65
|
+
>(
|
|
63
66
|
fn: TFn,
|
|
64
67
|
initialOptions: RateLimiterOptions<TFn>,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
)
|
|
68
|
+
selector?: (state: RateLimiterState) => TSelected,
|
|
69
|
+
): SolidRateLimiter<TFn, TSelected> {
|
|
70
|
+
const rateLimiter = new RateLimiter<TFn>(fn, initialOptions)
|
|
69
71
|
|
|
70
|
-
const
|
|
71
|
-
rateLimiter.getExecutionCount(),
|
|
72
|
-
)
|
|
73
|
-
const [rejectionCount, setRejectionCount] = createSignal(
|
|
74
|
-
rateLimiter.getRejectionCount(),
|
|
75
|
-
)
|
|
76
|
-
const [remainingInWindow, setRemainingInWindow] = createSignal(
|
|
77
|
-
rateLimiter.getRemainingInWindow(),
|
|
78
|
-
)
|
|
79
|
-
const [msUntilNextWindow, setMsUntilNextWindow] = createSignal(
|
|
80
|
-
rateLimiter.getMsUntilNextWindow(),
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
function setOptions(newOptions: Partial<RateLimiterOptions<TFn>>) {
|
|
84
|
-
rateLimiter.setOptions({
|
|
85
|
-
...newOptions,
|
|
86
|
-
onExecute: (rateLimiter) => {
|
|
87
|
-
setExecutionCount(rateLimiter.getExecutionCount())
|
|
88
|
-
setRemainingInWindow(rateLimiter.getRemainingInWindow())
|
|
89
|
-
setMsUntilNextWindow(rateLimiter.getMsUntilNextWindow())
|
|
90
|
-
|
|
91
|
-
const onExecute = newOptions.onExecute ?? initialOptions.onExecute
|
|
92
|
-
onExecute?.(rateLimiter)
|
|
93
|
-
},
|
|
94
|
-
onReject: (rateLimiter) => {
|
|
95
|
-
setRejectionCount(rateLimiter.getRejectionCount())
|
|
96
|
-
setRemainingInWindow(rateLimiter.getRemainingInWindow())
|
|
97
|
-
setMsUntilNextWindow(rateLimiter.getMsUntilNextWindow())
|
|
98
|
-
|
|
99
|
-
const onReject = newOptions.onReject ?? initialOptions.onReject
|
|
100
|
-
onReject?.(rateLimiter)
|
|
101
|
-
},
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
setOptions(initialOptions)
|
|
72
|
+
const state = useStore(rateLimiter.store, selector)
|
|
106
73
|
|
|
107
74
|
return {
|
|
108
75
|
...rateLimiter,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
remainingInWindow,
|
|
112
|
-
msUntilNextWindow,
|
|
113
|
-
setOptions,
|
|
114
|
-
} as SolidRateLimiter<TFn>
|
|
76
|
+
state,
|
|
77
|
+
} as unknown as SolidRateLimiter<TFn, TSelected> // omit `store` in favor of `state`
|
|
115
78
|
}
|
|
@@ -2,7 +2,10 @@ import { createSignal } from 'solid-js'
|
|
|
2
2
|
import { createThrottler } from './createThrottler'
|
|
3
3
|
import type { SolidThrottler } from './createThrottler'
|
|
4
4
|
import type { Accessor, Setter } from 'solid-js'
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
ThrottlerOptions,
|
|
7
|
+
ThrottlerState,
|
|
8
|
+
} from '@tanstack/pacer/throttler'
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* A Solid hook that creates a throttled state value that updates at most once within a specified time window.
|
|
@@ -38,11 +41,19 @@ import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
|
|
|
38
41
|
* console.log('Next execution:', throttler.nextExecutionTime());
|
|
39
42
|
* ```
|
|
40
43
|
*/
|
|
41
|
-
export function createThrottledSignal<
|
|
44
|
+
export function createThrottledSignal<
|
|
45
|
+
TValue,
|
|
46
|
+
TSelected = ThrottlerState<Setter<TValue>>,
|
|
47
|
+
>(
|
|
42
48
|
value: TValue,
|
|
43
49
|
initialOptions: ThrottlerOptions<Setter<TValue>>,
|
|
44
|
-
|
|
50
|
+
selector?: (state: ThrottlerState<Setter<TValue>>) => TSelected,
|
|
51
|
+
): [
|
|
52
|
+
Accessor<TValue>,
|
|
53
|
+
Setter<TValue>,
|
|
54
|
+
SolidThrottler<Setter<TValue>, TSelected>,
|
|
55
|
+
] {
|
|
45
56
|
const [throttledValue, setThrottledValue] = createSignal<TValue>(value)
|
|
46
|
-
const throttler = createThrottler(setThrottledValue, initialOptions)
|
|
57
|
+
const throttler = createThrottler(setThrottledValue, initialOptions, selector)
|
|
47
58
|
return [throttledValue, throttler.maybeExecute as Setter<TValue>, throttler]
|
|
48
59
|
}
|
|
@@ -2,7 +2,10 @@ import { createEffect } from 'solid-js'
|
|
|
2
2
|
import { createThrottledSignal } from './createThrottledSignal'
|
|
3
3
|
import type { SolidThrottler } from './createThrottler'
|
|
4
4
|
import type { Accessor, Setter } from 'solid-js'
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
ThrottlerOptions,
|
|
7
|
+
ThrottlerState,
|
|
8
|
+
} from '@tanstack/pacer/throttler'
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* A high-level Solid hook that creates a throttled version of a value that updates at most once within a specified time window.
|
|
@@ -32,13 +35,18 @@ import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
|
|
|
32
35
|
* throttler.cancel(); // Cancel any pending updates
|
|
33
36
|
* ```
|
|
34
37
|
*/
|
|
35
|
-
export function createThrottledValue<
|
|
38
|
+
export function createThrottledValue<
|
|
39
|
+
TValue,
|
|
40
|
+
TSelected = ThrottlerState<Setter<TValue>>,
|
|
41
|
+
>(
|
|
36
42
|
value: Accessor<TValue>,
|
|
37
43
|
initialOptions: ThrottlerOptions<Setter<TValue>>,
|
|
38
|
-
|
|
44
|
+
selector?: (state: ThrottlerState<Setter<TValue>>) => TSelected,
|
|
45
|
+
): [Accessor<TValue>, SolidThrottler<Setter<TValue>, TSelected>] {
|
|
39
46
|
const [throttledValue, setThrottledValue, throttler] = createThrottledSignal(
|
|
40
47
|
value(),
|
|
41
48
|
initialOptions,
|
|
49
|
+
selector,
|
|
42
50
|
)
|
|
43
51
|
|
|
44
52
|
createEffect(() => {
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
import { Throttler } from '@tanstack/pacer/throttler'
|
|
2
|
-
import { createEffect,
|
|
3
|
-
import {
|
|
2
|
+
import { createEffect, onCleanup } from 'solid-js'
|
|
3
|
+
import { useStore } from '@tanstack/solid-store'
|
|
4
4
|
import type { Accessor } from 'solid-js'
|
|
5
5
|
import type { AnyFunction } from '@tanstack/pacer/types'
|
|
6
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
ThrottlerOptions,
|
|
8
|
+
ThrottlerState,
|
|
9
|
+
} from '@tanstack/pacer/throttler'
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
> {
|
|
19
|
-
executionCount: Accessor<number>
|
|
20
|
-
isPending: Accessor<boolean>
|
|
21
|
-
lastExecutionTime: Accessor<number>
|
|
22
|
-
nextExecutionTime: Accessor<number>
|
|
11
|
+
export interface SolidThrottler<
|
|
12
|
+
TFn extends AnyFunction,
|
|
13
|
+
TSelected = ThrottlerState<TFn>,
|
|
14
|
+
> extends Omit<Throttler<TFn>, 'store'> {
|
|
15
|
+
/**
|
|
16
|
+
* Reactive state that will be updated when the throttler state changes
|
|
17
|
+
*
|
|
18
|
+
* Use this instead of `throttler.store.state`
|
|
19
|
+
*/
|
|
20
|
+
readonly state: Accessor<Readonly<TSelected>>
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
/**
|
|
@@ -56,52 +54,26 @@ export interface SolidThrottler<TFn extends AnyFunction>
|
|
|
56
54
|
* console.log(throttler.nextExecutionTime()); // timestamp of next allowed execution
|
|
57
55
|
* ```
|
|
58
56
|
*/
|
|
59
|
-
export function createThrottler<
|
|
57
|
+
export function createThrottler<
|
|
58
|
+
TFn extends AnyFunction,
|
|
59
|
+
TSelected = ThrottlerState<TFn>,
|
|
60
|
+
>(
|
|
60
61
|
fn: TFn,
|
|
61
62
|
initialOptions: ThrottlerOptions<TFn>,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const [executionCount, setExecutionCount] = createSignal(
|
|
66
|
-
throttler.getExecutionCount(),
|
|
67
|
-
)
|
|
68
|
-
const [isPending, setIsPending] = createSignal(throttler.getIsPending())
|
|
69
|
-
const [lastExecutionTime, setLastExecutionTime] = createSignal(
|
|
70
|
-
throttler.getLastExecutionTime(),
|
|
71
|
-
)
|
|
72
|
-
const [nextExecutionTime, setNextExecutionTime] = createSignal(
|
|
73
|
-
throttler.getNextExecutionTime(),
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
function setOptions(newOptions: Partial<ThrottlerOptions<TFn>>) {
|
|
77
|
-
throttler.setOptions({
|
|
78
|
-
...newOptions,
|
|
79
|
-
onExecute: (throttler) => {
|
|
80
|
-
setExecutionCount(throttler.getExecutionCount())
|
|
81
|
-
setIsPending(throttler.getIsPending())
|
|
82
|
-
setLastExecutionTime(throttler.getLastExecutionTime())
|
|
83
|
-
setNextExecutionTime(throttler.getNextExecutionTime())
|
|
84
|
-
|
|
85
|
-
const onExecute = newOptions.onExecute ?? initialOptions.onExecute
|
|
86
|
-
onExecute?.(throttler)
|
|
87
|
-
},
|
|
88
|
-
})
|
|
89
|
-
}
|
|
63
|
+
selector?: (state: ThrottlerState<TFn>) => TSelected,
|
|
64
|
+
): SolidThrottler<TFn, TSelected> {
|
|
65
|
+
const asyncThrottler = new Throttler<TFn>(fn, initialOptions)
|
|
90
66
|
|
|
91
|
-
|
|
67
|
+
const state = useStore(asyncThrottler.store, selector)
|
|
92
68
|
|
|
93
69
|
createEffect(() => {
|
|
94
70
|
onCleanup(() => {
|
|
95
|
-
|
|
71
|
+
asyncThrottler.cancel()
|
|
96
72
|
})
|
|
97
73
|
})
|
|
98
74
|
|
|
99
75
|
return {
|
|
100
|
-
...
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
lastExecutionTime,
|
|
104
|
-
nextExecutionTime,
|
|
105
|
-
setOptions,
|
|
106
|
-
} as SolidThrottler<TFn>
|
|
76
|
+
...asyncThrottler,
|
|
77
|
+
state,
|
|
78
|
+
} as SolidThrottler<TFn, TSelected> // omit `store` in favor of `state`
|
|
107
79
|
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const compare = require("@tanstack/pacer/compare");
|
|
4
|
-
Object.keys(compare).forEach((k) => {
|
|
5
|
-
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: () => compare[k]
|
|
8
|
-
});
|
|
9
|
-
});
|
|
10
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@tanstack/pacer/compare';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@tanstack/pacer/compare';
|
package/src/compare/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@tanstack/pacer/compare'
|