@nexigen/entity-normalizer 0.3.1 → 0.4.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/async/async-duck.d.ts +9 -1
- package/dist/async/async-duck.js +98 -30
- package/dist/async/async-duck.js.map +1 -1
- package/dist/async/cancel.d.ts +4 -0
- package/dist/async/cancel.js +32 -0
- package/dist/async/cancel.js.map +1 -0
- package/dist/async/execution-context.d.ts +6 -2
- package/dist/async/execution-context.js +36 -7
- package/dist/async/execution-context.js.map +1 -1
- package/dist/async/public.d.ts +4 -2
- package/package.json +1 -1
|
@@ -5,22 +5,30 @@ export declare class AsyncDuck<TParams, TResult> {
|
|
|
5
5
|
private _error;
|
|
6
6
|
private _data;
|
|
7
7
|
private _hasEverRun;
|
|
8
|
+
private _inFlight;
|
|
9
|
+
private _lastSuccessParams?;
|
|
10
|
+
private _lastRunSucceeded;
|
|
8
11
|
private fn;
|
|
9
12
|
private _keyed;
|
|
10
13
|
private _proxy?;
|
|
11
|
-
private _pendingPromise;
|
|
12
14
|
private _lastRunParams?;
|
|
15
|
+
private _abortController;
|
|
16
|
+
private _tokenCounter;
|
|
17
|
+
private _activeToken;
|
|
13
18
|
constructor(fn: (params?: TParams) => Promise<TResult>);
|
|
14
19
|
getKeyed(key: string): AsyncDuck<TParams, TResult>;
|
|
15
20
|
private setLoading;
|
|
16
21
|
private setSuccess;
|
|
17
22
|
private setError;
|
|
23
|
+
private abortAndInvalidate;
|
|
18
24
|
reset(): void;
|
|
25
|
+
cancel(): void;
|
|
19
26
|
private sleep;
|
|
20
27
|
private runWithRetry;
|
|
21
28
|
run(options?: RunOptions<TParams, TResult>): Promise<TResult | undefined>;
|
|
22
29
|
refresh(): Promise<TResult | undefined>;
|
|
23
30
|
get isLoading(): boolean;
|
|
31
|
+
get isInFlight(): boolean;
|
|
24
32
|
get isRetrying(): boolean;
|
|
25
33
|
get isError(): boolean;
|
|
26
34
|
get isSuccess(): boolean;
|
package/dist/async/async-duck.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { makeObservable, observable, action } from 'mobx';
|
|
1
|
+
import { makeObservable, observable, action, runInAction } from 'mobx';
|
|
2
|
+
import { CanceledError, isCanceled } from './cancel';
|
|
2
3
|
import { executionAsyncContext } from './execution-context';
|
|
3
4
|
import { DUCK_TAG } from './marker';
|
|
4
5
|
import { defaultRetryStrategy } from './retry';
|
|
@@ -9,8 +10,12 @@ export class AsyncDuck {
|
|
|
9
10
|
this._error = null;
|
|
10
11
|
this._data = null;
|
|
11
12
|
this._hasEverRun = false;
|
|
13
|
+
this._inFlight = false;
|
|
14
|
+
this._lastRunSucceeded = false;
|
|
12
15
|
this._keyed = new Map();
|
|
13
|
-
this.
|
|
16
|
+
this._abortController = null;
|
|
17
|
+
this._tokenCounter = 0;
|
|
18
|
+
this._activeToken = 0;
|
|
14
19
|
this.fn = fn;
|
|
15
20
|
this._proxy = new Proxy(this, {
|
|
16
21
|
get: (target, prop) => {
|
|
@@ -35,6 +40,7 @@ export class AsyncDuck {
|
|
|
35
40
|
setSuccess: action,
|
|
36
41
|
setError: action,
|
|
37
42
|
reset: action,
|
|
43
|
+
cancel: action,
|
|
38
44
|
});
|
|
39
45
|
}
|
|
40
46
|
// -------------------------------------
|
|
@@ -60,6 +66,8 @@ export class AsyncDuck {
|
|
|
60
66
|
this._isLoading = false;
|
|
61
67
|
this._isRetrying = false;
|
|
62
68
|
this._hasEverRun = true;
|
|
69
|
+
this._lastRunSucceeded = true;
|
|
70
|
+
this._lastSuccessParams = this._lastRunParams;
|
|
63
71
|
onSuccess?.(data);
|
|
64
72
|
}
|
|
65
73
|
setError(err, onError) {
|
|
@@ -68,43 +76,86 @@ export class AsyncDuck {
|
|
|
68
76
|
this._isLoading = false;
|
|
69
77
|
this._isRetrying = false;
|
|
70
78
|
this._hasEverRun = true;
|
|
79
|
+
this._lastRunSucceeded = false;
|
|
71
80
|
onError?.(normalized);
|
|
72
81
|
}
|
|
82
|
+
abortAndInvalidate() {
|
|
83
|
+
if (this._abortController && (this._isLoading || this._isRetrying)) {
|
|
84
|
+
this._abortController.abort();
|
|
85
|
+
}
|
|
86
|
+
this._abortController = null;
|
|
87
|
+
this._activeToken = ++this._tokenCounter;
|
|
88
|
+
}
|
|
73
89
|
reset() {
|
|
74
|
-
this.
|
|
75
|
-
this._isRetrying = false;
|
|
90
|
+
this.cancel();
|
|
76
91
|
this._error = null;
|
|
77
92
|
this._data = null;
|
|
78
93
|
this._hasEverRun = false;
|
|
79
|
-
this.
|
|
94
|
+
this._lastSuccessParams = undefined;
|
|
80
95
|
this._lastRunParams = undefined;
|
|
81
96
|
}
|
|
97
|
+
cancel() {
|
|
98
|
+
this.abortAndInvalidate();
|
|
99
|
+
this.setLoading(false);
|
|
100
|
+
}
|
|
82
101
|
// -------------------------------------
|
|
83
102
|
// UTILS
|
|
84
103
|
// -------------------------------------
|
|
85
|
-
sleep(ms) {
|
|
86
|
-
return new Promise(
|
|
104
|
+
sleep(ms, signal) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
if (!signal) {
|
|
107
|
+
setTimeout(resolve, ms);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (signal.aborted) {
|
|
111
|
+
reject(new CanceledError());
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
let timer = null;
|
|
115
|
+
const onAbort = () => {
|
|
116
|
+
if (timer) {
|
|
117
|
+
clearTimeout(timer);
|
|
118
|
+
}
|
|
119
|
+
reject(new CanceledError());
|
|
120
|
+
};
|
|
121
|
+
timer = setTimeout(() => {
|
|
122
|
+
signal.removeEventListener('abort', onAbort);
|
|
123
|
+
resolve();
|
|
124
|
+
}, ms);
|
|
125
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
126
|
+
});
|
|
87
127
|
}
|
|
88
128
|
// -------------------------------------
|
|
89
129
|
// RETRY ENGINE
|
|
90
130
|
// -------------------------------------
|
|
91
|
-
async runWithRetry(params, retryStrategy) {
|
|
131
|
+
async runWithRetry(params, retryStrategy, signal) {
|
|
92
132
|
const retry = { ...defaultRetryStrategy, ...retryStrategy };
|
|
93
133
|
const max = retry.retries ?? 0;
|
|
94
134
|
for (let attempt = 1; attempt <= max + 1; attempt++) {
|
|
135
|
+
if (signal?.aborted) {
|
|
136
|
+
throw new CanceledError();
|
|
137
|
+
}
|
|
95
138
|
try {
|
|
96
139
|
return await this.fn(params);
|
|
97
140
|
}
|
|
98
141
|
catch (error) {
|
|
142
|
+
if (isCanceled(error, signal)) {
|
|
143
|
+
throw new CanceledError();
|
|
144
|
+
}
|
|
99
145
|
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
100
146
|
const should = retry.shouldRetry?.(normalized) ?? false;
|
|
101
147
|
const isLast = attempt > max;
|
|
102
148
|
if (!should || isLast) {
|
|
103
149
|
throw normalized;
|
|
104
150
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
151
|
+
runInAction(() => {
|
|
152
|
+
this._isRetrying = true;
|
|
153
|
+
});
|
|
154
|
+
const baseDelay = retry.delayMs ?? 0;
|
|
155
|
+
const delay = retry.backoff ? baseDelay * attempt : baseDelay;
|
|
156
|
+
if (delay > 0) {
|
|
157
|
+
await this.sleep(delay, signal);
|
|
158
|
+
}
|
|
108
159
|
}
|
|
109
160
|
}
|
|
110
161
|
throw new Error('Unexpected retry exit');
|
|
@@ -113,8 +164,12 @@ export class AsyncDuck {
|
|
|
113
164
|
// PUBLIC RUN
|
|
114
165
|
// -------------------------------------
|
|
115
166
|
async run(options) {
|
|
167
|
+
if (this._inFlight) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
this._inFlight = true;
|
|
116
171
|
if (options?.skip) {
|
|
117
|
-
return;
|
|
172
|
+
return undefined;
|
|
118
173
|
}
|
|
119
174
|
if (options?.key) {
|
|
120
175
|
return this.getKeyed(options.key).run({
|
|
@@ -122,41 +177,51 @@ export class AsyncDuck {
|
|
|
122
177
|
key: undefined,
|
|
123
178
|
});
|
|
124
179
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (this._isLoading || this._isRetrying) {
|
|
129
|
-
return this._pendingPromise;
|
|
130
|
-
}
|
|
180
|
+
const token = this._activeToken;
|
|
181
|
+
const controller = new AbortController();
|
|
182
|
+
this._abortController = controller;
|
|
131
183
|
const { params, onSuccess, onError, retryStrategy } = options ?? {};
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const isRetry = !!retryStrategy;
|
|
136
|
-
this.setLoading(isRetry);
|
|
137
|
-
this._pendingPromise = (async () => {
|
|
184
|
+
this._lastRunParams = params;
|
|
185
|
+
this.setLoading(!!retryStrategy);
|
|
186
|
+
return executionAsyncContext.withAbort(controller.signal, async () => {
|
|
138
187
|
try {
|
|
188
|
+
const signal = executionAsyncContext.currentSignal();
|
|
139
189
|
const result = retryStrategy
|
|
140
|
-
? await this.runWithRetry(params, retryStrategy)
|
|
190
|
+
? await this.runWithRetry(params, retryStrategy, signal)
|
|
141
191
|
: await this.fn(params);
|
|
192
|
+
if (this._activeToken !== token) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
if (controller.signal.aborted) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
142
198
|
this.setSuccess(result, onSuccess);
|
|
143
199
|
return result;
|
|
144
200
|
}
|
|
145
201
|
catch (err) {
|
|
202
|
+
if (this._activeToken !== token) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
if (isCanceled(err, controller.signal)) {
|
|
206
|
+
this._isLoading = false;
|
|
207
|
+
this._isRetrying = false;
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
146
210
|
this.setError(err, onError);
|
|
147
211
|
return undefined;
|
|
148
212
|
}
|
|
149
213
|
finally {
|
|
150
|
-
this.
|
|
214
|
+
this._inFlight = false;
|
|
151
215
|
}
|
|
152
|
-
})
|
|
153
|
-
return this._pendingPromise;
|
|
216
|
+
});
|
|
154
217
|
}
|
|
155
218
|
refresh() {
|
|
156
|
-
if (!this.
|
|
219
|
+
if (!this._lastRunSucceeded) {
|
|
157
220
|
return Promise.resolve(undefined);
|
|
158
221
|
}
|
|
159
|
-
|
|
222
|
+
this._inFlight = false;
|
|
223
|
+
this.abortAndInvalidate();
|
|
224
|
+
return executionAsyncContext.withIntent('refresh', () => this.run({ params: this._lastSuccessParams }));
|
|
160
225
|
}
|
|
161
226
|
// -------------------------------------
|
|
162
227
|
// GETTERS
|
|
@@ -164,6 +229,9 @@ export class AsyncDuck {
|
|
|
164
229
|
get isLoading() {
|
|
165
230
|
return this._isLoading;
|
|
166
231
|
}
|
|
232
|
+
get isInFlight() {
|
|
233
|
+
return this._inFlight;
|
|
234
|
+
}
|
|
167
235
|
get isRetrying() {
|
|
168
236
|
return this._isRetrying;
|
|
169
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-duck.js","sourceRoot":"","sources":["../../src/async/async-duck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"async-duck.js","sourceRoot":"","sources":["../../src/async/async-duck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class CanceledError extends Error {
|
|
2
|
+
constructor(message = 'canceled') {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'CanceledError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export function isCanceled(err, signal) {
|
|
8
|
+
if (signal?.aborted) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
if (!err || typeof err !== 'object') {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const anyErr = err;
|
|
15
|
+
// DOM / fetch
|
|
16
|
+
if (anyErr?.name === 'AbortError') {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
// axios v1
|
|
20
|
+
if (anyErr?.name === 'CanceledError') {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if (anyErr?.code === 'ERR_CANCELED') {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
// internal
|
|
27
|
+
if (err instanceof CanceledError) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=cancel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../src/async/cancel.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,GAAG,UAAU;QAC9B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,MAA2B;IAClE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,GAAU,CAAC;IAE1B,cAAc;IACd,IAAI,MAAM,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW;IACX,IAAI,MAAM,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW;IACX,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -2,9 +2,13 @@ import { type ExecutionIntent } from './types';
|
|
|
2
2
|
import type { PublicExecutionContext } from './public';
|
|
3
3
|
export declare class ExecutionContext {
|
|
4
4
|
private stack;
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
private push;
|
|
6
|
+
private pop;
|
|
7
|
+
private current;
|
|
8
|
+
withIntent<T>(intent: ExecutionIntent, fn: () => Promise<T>): Promise<T>;
|
|
7
9
|
is(intent: ExecutionIntent): boolean;
|
|
10
|
+
withAbort<T>(signal: AbortSignal, fn: () => Promise<T>): Promise<T>;
|
|
11
|
+
currentSignal(): AbortSignal | null;
|
|
8
12
|
}
|
|
9
13
|
export declare function createExecutionContext(): PublicExecutionContext;
|
|
10
14
|
export declare const executionAsyncContext: PublicExecutionContext;
|
|
@@ -2,20 +2,49 @@ export class ExecutionContext {
|
|
|
2
2
|
constructor() {
|
|
3
3
|
this.stack = [];
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
this.stack.push(
|
|
5
|
+
push(frame) {
|
|
6
|
+
this.stack.push(frame);
|
|
7
|
+
}
|
|
8
|
+
pop() {
|
|
9
|
+
this.stack.pop();
|
|
10
|
+
}
|
|
11
|
+
current() {
|
|
12
|
+
return (this.stack[this.stack.length - 1] ?? {
|
|
13
|
+
intent: 'normal',
|
|
14
|
+
signal: null,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async withIntent(intent, fn) {
|
|
18
|
+
const parent = this.current();
|
|
19
|
+
this.push({
|
|
20
|
+
intent,
|
|
21
|
+
signal: parent.signal,
|
|
22
|
+
});
|
|
7
23
|
try {
|
|
8
24
|
return await fn();
|
|
9
25
|
}
|
|
10
26
|
finally {
|
|
11
|
-
this.
|
|
27
|
+
this.pop();
|
|
12
28
|
}
|
|
13
29
|
}
|
|
14
|
-
current() {
|
|
15
|
-
return this.stack[this.stack.length - 1] ?? 'normal';
|
|
16
|
-
}
|
|
17
30
|
is(intent) {
|
|
18
|
-
return this.current() === intent;
|
|
31
|
+
return this.current().intent === intent;
|
|
32
|
+
}
|
|
33
|
+
async withAbort(signal, fn) {
|
|
34
|
+
const parent = this.current();
|
|
35
|
+
this.push({
|
|
36
|
+
intent: parent.intent,
|
|
37
|
+
signal,
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
return await fn();
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
this.pop();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
currentSignal() {
|
|
47
|
+
return this.current().signal;
|
|
19
48
|
}
|
|
20
49
|
}
|
|
21
50
|
export function createExecutionContext() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/async/execution-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/async/execution-context.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,gBAAgB;IAA7B;QACU,UAAK,GAAqB,EAAE,CAAC;IA2DvC,CAAC;IAzDS,IAAI,CAAC,KAAqB;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAEO,GAAG;QACT,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAEO,OAAO;QACb,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI;YACnC,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,IAAI;SACb,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAuB,EACvB,EAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE9B,IAAI,CAAC,IAAI,CAAC;YACR,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,EAAE,CAAC,MAAuB;QACxB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,SAAS,CAAI,MAAmB,EAAE,EAAoB;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE9B,IAAI,CAAC,IAAI,CAAC;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAChC,sBAAsB,EAAE,CAAC"}
|
package/dist/async/public.d.ts
CHANGED
|
@@ -14,13 +14,15 @@ export type RunOptions<TParams, TResult> = {
|
|
|
14
14
|
retryStrategy?: RetryStrategy;
|
|
15
15
|
};
|
|
16
16
|
export interface PublicExecutionContext {
|
|
17
|
-
|
|
18
|
-
current(): ExecutionIntent;
|
|
17
|
+
withIntent<T>(intent: ExecutionIntent, fn: () => Promise<T>): Promise<T>;
|
|
19
18
|
is(intent: ExecutionIntent): boolean;
|
|
19
|
+
withAbort<T>(signal: AbortSignal, fn: () => Promise<T>): Promise<T>;
|
|
20
|
+
currentSignal(): AbortSignal | null;
|
|
20
21
|
}
|
|
21
22
|
export interface PublicAsyncDuck<TParams, TResult> {
|
|
22
23
|
run(options?: RunOptions<TParams, TResult>): Promise<TResult | undefined>;
|
|
23
24
|
refresh(): Promise<TResult | undefined>;
|
|
25
|
+
cancel(): void;
|
|
24
26
|
readonly isLoading: boolean;
|
|
25
27
|
readonly isRetrying: boolean;
|
|
26
28
|
readonly isError: boolean;
|