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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jrx",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "prepublishOnly": "npx tsc",
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
+ }