@molecule/app-http 1.2.1 → 1.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/README.md +249 -1
- package/dist/client.d.ts +6 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/errors.d.ts +67 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +75 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +176 -131
- package/dist/provider.js.map +1 -1
- package/dist/retry.d.ts +105 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +144 -0
- package/dist/retry.js.map +1 -0
- package/dist/types.d.ts +47 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +37 -1
- package/dist/types.js.map +1 -1
- package/dist/unwrap.d.ts +5 -0
- package/dist/unwrap.d.ts.map +1 -1
- package/dist/unwrap.js +5 -0
- package/dist/unwrap.js.map +1 -1
- package/package.json +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
+
import type { RetryOptions } from './retry.js';
|
|
6
7
|
/**
|
|
7
8
|
* HTTP request method.
|
|
8
9
|
*/
|
|
@@ -71,6 +72,16 @@ export interface RequestConfig {
|
|
|
71
72
|
* Custom request options (implementation-specific).
|
|
72
73
|
*/
|
|
73
74
|
options?: Record<string, unknown>;
|
|
75
|
+
/**
|
|
76
|
+
* Retry policy for this request, or `false` to disable retries.
|
|
77
|
+
*
|
|
78
|
+
* The default policy retries only IDEMPOTENT requests (`GET`/`HEAD`/`PUT`/
|
|
79
|
+
* `DELETE`/`OPTIONS`, and `POST`/`PATCH` carrying an `Idempotency-Key`) on
|
|
80
|
+
* `502`/`503`/`504` or a reset/refused connection, twice, with exponential
|
|
81
|
+
* backoff and jitter, honoring `Retry-After`. See `@molecule/app-http`'s
|
|
82
|
+
* `shouldRetryRequest`.
|
|
83
|
+
*/
|
|
84
|
+
retry?: RetryOptions | false;
|
|
74
85
|
}
|
|
75
86
|
/**
|
|
76
87
|
* What the auth gate is told about the request it is about to hold: whether the request
|
|
@@ -139,12 +150,47 @@ export interface HttpResponse<T = unknown> {
|
|
|
139
150
|
}
|
|
140
151
|
/**
|
|
141
152
|
* HTTP error with response details.
|
|
153
|
+
*
|
|
154
|
+
* **`status` is an HTTP status when the server answered, and `0` when it did not.**
|
|
155
|
+
* A `0` means NO response exists: the request was aborted (an `AbortController`, a
|
|
156
|
+
* component's effect cleanup, a route change tearing the request down) or the
|
|
157
|
+
* network failed before anything came back. It is not an HTTP status at all, so it
|
|
158
|
+
* says nothing about the session — an app must never treat `status < 500` as
|
|
159
|
+
* "signed out", because every aborted request on a route change would clear the
|
|
160
|
+
* session. The correct check is {@link isAuthFailure} (`status === 401 || status === 403`);
|
|
161
|
+
* `isNoResponse` (`status === 0`) identifies this case.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* try {
|
|
166
|
+
* await http.get('/projects')
|
|
167
|
+
* } catch (err) {
|
|
168
|
+
* if (isAuthFailure(err)) clearSession() // 401/403: the server rejected the credential
|
|
169
|
+
* else if (isNoResponse(err)) return // aborted or offline — not a session decision
|
|
170
|
+
* else showError(err)
|
|
171
|
+
* }
|
|
172
|
+
* ```
|
|
142
173
|
*/
|
|
143
174
|
export declare class HttpError extends Error {
|
|
144
175
|
status: number;
|
|
145
176
|
response?: HttpResponse | undefined;
|
|
146
177
|
config?: FullRequestConfig | undefined;
|
|
147
178
|
errorKey?: string | undefined;
|
|
148
|
-
|
|
179
|
+
aborted: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Builds a failed-request error.
|
|
182
|
+
*
|
|
183
|
+
* @param message - Human-readable message (already translated where a key exists).
|
|
184
|
+
* @param status - HTTP status, or `0` when no response was received (aborted / network failure).
|
|
185
|
+
* @param response - Parsed response when the server answered, otherwise undefined.
|
|
186
|
+
* @param config - The request config that failed.
|
|
187
|
+
* @param errorKey - Translation key for the failure (`http.error.aborted` for an
|
|
188
|
+
* aborted request, `http.error.networkError` for a real network failure).
|
|
189
|
+
* @param aborted - Whether the request was aborted before a response: an
|
|
190
|
+
* `AbortController` signal (component cleanup, a cancelled request) or the
|
|
191
|
+
* browser tearing the fetch down during a navigation. Distinguishes an abort
|
|
192
|
+
* from a network outage on the same `status === 0`, without parsing the message.
|
|
193
|
+
*/
|
|
194
|
+
constructor(message: string, status: number, response?: HttpResponse | undefined, config?: FullRequestConfig | undefined, errorKey?: string | undefined, aborted?: boolean);
|
|
149
195
|
}
|
|
150
196
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAEzF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;IAE9D;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAA;IAEvD;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAEzF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;IAE9D;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAA;IAEvD;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEjC;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,YAAY,GAAG,KAAK,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAElB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC;;OAEG;IACH,IAAI,EAAE,CAAC,CAAA;IAEP;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE/B;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAiBzB,MAAM,EAAE,MAAM;IACd,QAAQ,CAAC,EAAE,YAAY;IACvB,MAAM,CAAC,EAAE,iBAAiB;IAC1B,QAAQ,CAAC,EAAE,MAAM;IACjB,OAAO;IApBhB;;;;;;;;;;;;;OAaG;gBAED,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,YAAY,YAAA,EACvB,MAAM,CAAC,EAAE,iBAAiB,YAAA,EAC1B,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,OAAO,UAAQ;CAKzB"}
|
package/dist/types.js
CHANGED
|
@@ -5,18 +5,54 @@
|
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
7
|
* HTTP error with response details.
|
|
8
|
+
*
|
|
9
|
+
* **`status` is an HTTP status when the server answered, and `0` when it did not.**
|
|
10
|
+
* A `0` means NO response exists: the request was aborted (an `AbortController`, a
|
|
11
|
+
* component's effect cleanup, a route change tearing the request down) or the
|
|
12
|
+
* network failed before anything came back. It is not an HTTP status at all, so it
|
|
13
|
+
* says nothing about the session — an app must never treat `status < 500` as
|
|
14
|
+
* "signed out", because every aborted request on a route change would clear the
|
|
15
|
+
* session. The correct check is {@link isAuthFailure} (`status === 401 || status === 403`);
|
|
16
|
+
* `isNoResponse` (`status === 0`) identifies this case.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* try {
|
|
21
|
+
* await http.get('/projects')
|
|
22
|
+
* } catch (err) {
|
|
23
|
+
* if (isAuthFailure(err)) clearSession() // 401/403: the server rejected the credential
|
|
24
|
+
* else if (isNoResponse(err)) return // aborted or offline — not a session decision
|
|
25
|
+
* else showError(err)
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
8
28
|
*/
|
|
9
29
|
export class HttpError extends Error {
|
|
10
30
|
status;
|
|
11
31
|
response;
|
|
12
32
|
config;
|
|
13
33
|
errorKey;
|
|
14
|
-
|
|
34
|
+
aborted;
|
|
35
|
+
/**
|
|
36
|
+
* Builds a failed-request error.
|
|
37
|
+
*
|
|
38
|
+
* @param message - Human-readable message (already translated where a key exists).
|
|
39
|
+
* @param status - HTTP status, or `0` when no response was received (aborted / network failure).
|
|
40
|
+
* @param response - Parsed response when the server answered, otherwise undefined.
|
|
41
|
+
* @param config - The request config that failed.
|
|
42
|
+
* @param errorKey - Translation key for the failure (`http.error.aborted` for an
|
|
43
|
+
* aborted request, `http.error.networkError` for a real network failure).
|
|
44
|
+
* @param aborted - Whether the request was aborted before a response: an
|
|
45
|
+
* `AbortController` signal (component cleanup, a cancelled request) or the
|
|
46
|
+
* browser tearing the fetch down during a navigation. Distinguishes an abort
|
|
47
|
+
* from a network outage on the same `status === 0`, without parsing the message.
|
|
48
|
+
*/
|
|
49
|
+
constructor(message, status, response, config, errorKey, aborted = false) {
|
|
15
50
|
super(message);
|
|
16
51
|
this.status = status;
|
|
17
52
|
this.response = response;
|
|
18
53
|
this.config = config;
|
|
19
54
|
this.errorKey = errorKey;
|
|
55
|
+
this.aborted = aborted;
|
|
20
56
|
this.name = 'HttpError';
|
|
21
57
|
}
|
|
22
58
|
}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0KH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAiBzB;IACA;IACA;IACA;IACA;IApBT;;;;;;;;;;;;;OAaG;IACH,YACE,OAAe,EACR,MAAc,EACd,QAAuB,EACvB,MAA0B,EAC1B,QAAiB,EACjB,UAAU,KAAK;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAA;QANP,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAe;QACvB,WAAM,GAAN,MAAM,CAAoB;QAC1B,aAAQ,GAAR,QAAQ,CAAS;QACjB,YAAO,GAAP,OAAO,CAAQ;QAGtB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;IACzB,CAAC;CACF"}
|
package/dist/unwrap.d.ts
CHANGED
|
@@ -38,6 +38,11 @@
|
|
|
38
38
|
* Both shapes are handled here so pages don't have to remember to call
|
|
39
39
|
* `unwrapList(res.data)` vs `unwrapList(res)`.
|
|
40
40
|
*
|
|
41
|
+
* A custom envelope such as `{ items: [...], count: 10 }` is not a `data`
|
|
42
|
+
* envelope and returns `[]`. Read its named array directly: `body.items` for
|
|
43
|
+
* raw JSON, or `response.data.items` for an `HttpResponse`. Passing that
|
|
44
|
+
* array to `unwrapList` is also valid; passing the enclosing object is not.
|
|
45
|
+
*
|
|
41
46
|
* @param res - Raw response body OR an `HttpResponse` envelope from `@molecule/app-http`.
|
|
42
47
|
* @returns A typed array `T[]`; never `null`/`undefined`.
|
|
43
48
|
*/
|
package/dist/unwrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../src/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH
|
|
1
|
+
{"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../src/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,CAmC/C;AAyED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,GAAG,IAAI,CAmDtD"}
|
package/dist/unwrap.js
CHANGED
|
@@ -38,6 +38,11 @@
|
|
|
38
38
|
* Both shapes are handled here so pages don't have to remember to call
|
|
39
39
|
* `unwrapList(res.data)` vs `unwrapList(res)`.
|
|
40
40
|
*
|
|
41
|
+
* A custom envelope such as `{ items: [...], count: 10 }` is not a `data`
|
|
42
|
+
* envelope and returns `[]`. Read its named array directly: `body.items` for
|
|
43
|
+
* raw JSON, or `response.data.items` for an `HttpResponse`. Passing that
|
|
44
|
+
* array to `unwrapList` is also valid; passing the enclosing object is not.
|
|
45
|
+
*
|
|
41
46
|
* @param res - Raw response body OR an `HttpResponse` envelope from `@molecule/app-http`.
|
|
42
47
|
* @returns A typed array `T[]`; never `null`/`undefined`.
|
|
43
48
|
*/
|
package/dist/unwrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../src/unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH
|
|
1
|
+
{"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../src/unwrap.ts"],"names":[],"mappings":"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"}
|