jrx 0.2.0 → 0.2.1
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/README.md +32 -0
- package/index.d.ts +2 -2
- package/index.js +2 -2
- package/package.json +1 -1
- package/retry.d.ts +5 -0
- package/retry.js +6 -1
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ npm i jrx
|
|
|
30
30
|
- [`addTransition(cb, durationMs)`](#addtransitioncb-durationms) - Progress-based animations
|
|
31
31
|
- [`computed(fn, getDeps?)`](#computedfn-getdeps) - Memoized computed values
|
|
32
32
|
- [`retry(cb, options?)`](#retrycb-options) - Async retry with exponential backoff
|
|
33
|
+
- [`addRetry(cb, options?)`](#addretrycb-options) - Fire-and-forget retry with disposal
|
|
33
34
|
|
|
34
35
|
## API
|
|
35
36
|
|
|
@@ -321,6 +322,37 @@ console.log(data) // T | undefined
|
|
|
321
322
|
- `disposer`: A disposer for the current retry attempt. Check `disposer.signal.aborted` to handle cancellation
|
|
322
323
|
- `info.resetBackoff()`: Call this to reset the backoff counter to the beginning (useful when making partial progress)
|
|
323
324
|
|
|
325
|
+
### `addRetry(cb, options?)`
|
|
326
|
+
|
|
327
|
+
Fire-and-forget version of `retry`. Starts the retry loop in the background and returns a dispose function to cancel it.
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
import {addRetry} from 'jrx'
|
|
331
|
+
|
|
332
|
+
// Start a retry loop in the background
|
|
333
|
+
const dispose = addRetry(async (disposer, { resetBackoff }) => {
|
|
334
|
+
const response = await fetch('/api/data')
|
|
335
|
+
if (!response.ok) throw new Error('Failed')
|
|
336
|
+
processData(await response.json())
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
// Cancel the retry loop
|
|
340
|
+
dispose()
|
|
341
|
+
|
|
342
|
+
// With custom backoff
|
|
343
|
+
const dispose2 = addRetry(
|
|
344
|
+
async (disposer) => {
|
|
345
|
+
await connectWebSocket()
|
|
346
|
+
},
|
|
347
|
+
{ backoffSec: [1, 2, 5, -1] }
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
dispose2()
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**Options:**
|
|
354
|
+
- `backoffSec`: Array of retry delays in seconds (same as `retry`)
|
|
355
|
+
|
|
324
356
|
## Cleanup Pattern
|
|
325
357
|
|
|
326
358
|
All functions return disposer functions that clean up resources:
|
package/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type Disposer } from 'jdisposer';
|
|
2
|
-
import retry from './retry.js';
|
|
2
|
+
import retry, { addRetry } from './retry.js';
|
|
3
3
|
import computed from './computed.js';
|
|
4
4
|
import addEvtListener from './addEvtListener.js';
|
|
5
|
-
export { retry, computed, addEvtListener };
|
|
5
|
+
export { retry, computed, addEvtListener, addRetry };
|
|
6
6
|
export declare function makeRenderLoop(): {
|
|
7
7
|
loop(this: void, time: DOMHighResTimeStamp): void;
|
|
8
8
|
setLoop(this: void, loop: (time: DOMHighResTimeStamp) => void | (() => void)): () => void;
|
package/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { makeDisposer, makeReset } from 'jdisposer';
|
|
2
|
-
import retry from './retry.js';
|
|
2
|
+
import retry, { addRetry } from './retry.js';
|
|
3
3
|
import computed from './computed.js';
|
|
4
4
|
import addEvtListener from './addEvtListener.js';
|
|
5
|
-
export { retry, computed, addEvtListener };
|
|
5
|
+
export { retry, computed, addEvtListener, addRetry };
|
|
6
6
|
export function makeRenderLoop() {
|
|
7
7
|
let loop_;
|
|
8
8
|
const reset = makeReset();
|
package/package.json
CHANGED
package/retry.d.ts
CHANGED
|
@@ -10,3 +10,8 @@ export default function retry<T>(cb: (disposer: Disposer, info: {
|
|
|
10
10
|
backoffSec?: number[];
|
|
11
11
|
disposer: Disposer;
|
|
12
12
|
}): Promise<T | undefined>;
|
|
13
|
+
export declare function addRetry<T>(cb: (disposer: Disposer, info: {
|
|
14
|
+
resetBackoff(): void;
|
|
15
|
+
}) => T | Promise<T>, options?: {
|
|
16
|
+
backoffSec?: number[];
|
|
17
|
+
}): (this: void) => void;
|
package/retry.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeReset } from 'jdisposer';
|
|
1
|
+
import { makeDisposer, makeReset } from 'jdisposer';
|
|
2
2
|
export default async function retry(cb, { backoffSec = [5, 5, 10, 10, 20, 20, 40, 40, 60, -1], // -1: retry forever with the last backoff . first element must not be -1
|
|
3
3
|
disposer, } = {}) {
|
|
4
4
|
const reset = makeReset();
|
|
@@ -30,3 +30,8 @@ disposer, } = {}) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
export function addRetry(cb, options) {
|
|
34
|
+
const disposer = makeDisposer();
|
|
35
|
+
void retry(cb, { ...options, disposer });
|
|
36
|
+
return disposer.dispose;
|
|
37
|
+
}
|