@molecule/app-http 1.5.1 → 1.5.4

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
@@ -3,7 +3,7 @@ AUTO-GENERATED — DO NOT EDIT THIS FILE.
3
3
  Generated by `mlcl sync-docs` from the package's src/index.ts JSDoc + mlcl/registry.json.
4
4
  Edits here are overwritten on the next commit (molecule's pre-commit hook regenerates).
5
5
  To change this document, edit the module-level JSDoc in src/index.ts.
6
- Generated: 2026-10-26T04:25:37.661Z
6
+ Generated: 2026-11-03T16:51:02.612Z
7
7
  -->
8
8
 
9
9
  # @molecule/app-http
@@ -394,8 +394,8 @@ interface AuthGateRequest {
394
394
  method?: string
395
395
 
396
396
  /**
397
- * The request's URL, for the message logged when the gate never settles. A URL may carry
398
- * an id; it never carries a credential (tokens travel in headers).
397
+ * The request's URL, for the message logged when the gate never settles. Any userinfo or
398
+ * credential query/fragment values are redacted from that report; non-secret parts remain.
399
399
  */
400
400
  url?: string
401
401
  }
@@ -519,6 +519,12 @@ type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTION
519
519
 
520
520
  HTTP error with response details.
521
521
 
522
+ Request metadata on `config` and `response.config` is limited to method, a
523
+ credential-redacted URL, and the two boolean notification-suppression controls
524
+ (`molSilentErrorNotification` and `molSilentRateLimitNotification`). Request bodies,
525
+ headers, params and all other provider options are omitted, as are credential-bearing
526
+ response headers, because errors are routinely serialized by logging transports.
527
+
522
528
  **`status` is an HTTP status when the server answered, and `0` when it did not.**
523
529
  A `0` means NO response exists: the request was aborted (an `AbortController`, a
524
530
  component's effect cleanup, a route change tearing the request down) or the
@@ -530,13 +536,22 @@ session. The correct check is {@link isAuthFailure} (`status === 401 || status =
530
536
 
531
537
  ```typescript
532
538
  class HttpError extends Error {
539
+ /**
540
+ * Redacts URL userinfo and credential query/fragment values while preserving the path and
541
+ * non-secret parameters. Shared by compatible HTTP and auth error/log views.
542
+ */
543
+ static readonly redactUrlCredentials = redactUrlCredentials
544
+
533
545
  /**
534
546
  * Builds a failed-request error.
535
547
  *
536
- * @param message - Human-readable message (already translated where a key exists).
548
+ * @param message - Human-readable message (already translated where a key exists);
549
+ * credentials in any URL it contains are redacted.
537
550
  * @param status - HTTP status, or `0` when no response was received (aborted / network failure).
538
- * @param response - Parsed response when the server answered, otherwise undefined.
539
- * @param config - The request config that failed.
551
+ * @param response - Parsed response when the server answered, otherwise undefined;
552
+ * its request config and headers are sanitized for safe logging.
553
+ * @param config - The request config that failed; only its method, redacted URL and
554
+ * boolean notification-suppression controls are retained.
540
555
  * @param errorKey - Translation key for the failure (`http.error.aborted` for an
541
556
  * aborted request, `http.error.networkError` for a real network failure).
542
557
  * @param aborted - Whether the request was aborted before a response: an
@@ -552,8 +567,11 @@ class HttpError extends Error {
552
567
  public errorKey?: string,
553
568
  public aborted = false,
554
569
  ) {
555
- super(message)
570
+ super(snapshotCredentials(message))
556
571
  this.name = 'HttpError'
572
+ this.response = response ? errorResponse(response) : undefined
573
+ this.config = config ? errorRequestConfig(config) : undefined
574
+ Object.defineProperty(this, HTTP_ERROR_BRAND, { value: true })
557
575
  }
558
576
  }
559
577
  ```
@@ -612,7 +630,10 @@ function awaitAuthGate(request?: AuthGateRequest): Promise<void>
612
630
 
613
631
  #### `isHttpError(err)`
614
632
 
615
- Whether `err` is an {@link HttpError} from this package.
633
+ Whether `err` is an {@link HttpError} or a compatible branded request failure.
634
+ `@molecule/app-auth` uses the same global brand for its non-ok responses, so
635
+ this also recognizes them across realms and duplicated package copies without
636
+ either package depending on the other.
616
637
 
617
638
  ```typescript
618
639
  function isHttpError(err: unknown): err is HttpError
@@ -620,7 +641,7 @@ function isHttpError(err: unknown): err is HttpError
620
641
 
621
642
  - `err` — Any thrown value.
622
643
 
623
- **Returns:** True for an `HttpError`.
644
+ **Returns:** True for an `HttpError` or a compatibly branded request failure.
624
645
 
625
646
  #### `isAuthFailure(err)`
626
647
 
@@ -763,6 +784,35 @@ function retryDelayMs(
763
784
 
764
785
  **Returns:** Milliseconds to wait before retrying.
765
786
 
787
+ #### `snapshotHttpErrorBody(body)`
788
+
789
+ Materialize a failed response body before the synchronous HttpError capture. Unchanged bytes
790
+ are cloned directly, including a Blob's BOM and every typed-array kind. Changed textual bytes
791
+ retain the BOM and use a Uint8Array fallback if the original view's alignment no longer fits.
792
+ Successful responses never pass through this helper.
793
+
794
+ ```typescript
795
+ function snapshotHttpErrorBody<T>(body: T): Promise<T>
796
+ ```
797
+
798
+ - `body` — A response body about to be retained on a failed request.
799
+
800
+ **Returns:** A scrubbed body with unchanged binary content preserved byte-for-byte.
801
+
802
+ #### `snapshotHttpErrorResponse(response)`
803
+
804
+ Read and scrub a failed response once for a retained-error reconstruction. The detached capture
805
+ carries the original body kind, safe response metadata, and minimal request config, so callers
806
+ such as auth never need to read the source response or its body again.
807
+
808
+ ```typescript
809
+ function snapshotHttpErrorResponse<T extends HttpResponse>(response: T): Promise<T>
810
+ ```
811
+
812
+ - `response` — The failed HTTP response to capture.
813
+
814
+ **Returns:** A detached, credential-scrubbed response preserving binary body bytes where safe.
815
+
766
816
  #### `unwrapList(res)`
767
817
 
768
818
  Normalize an unknown response body into a typed array.
@@ -1008,7 +1058,7 @@ Peer dependencies:
1008
1058
 
1009
1059
  - `@molecule/app-bond` ^1.0.1
1010
1060
  - `@molecule/app-i18n` ^1.0.1
1011
- - `@molecule/app-logger` ^1.0.1
1061
+ - `@molecule/app-logger` ^1.0.4
1012
1062
 
1013
1063
  ### Runtime Dependencies
1014
1064
 
@@ -1030,7 +1080,7 @@ Two mistakes that break in preview/production (seen in real imported apps):
1030
1080
  the author's machine, then fails cross-origin (CORS) in the preview and points at the wrong
1031
1081
  server in production. The base URL is configured ONCE (via `setClient`), not per call.
1032
1082
  - **`getClient()` itself knows no baseURL.** The fallback client it mints when nothing is
1033
- bonded has `baseURL: ''`, so `getClient().get('/articles')` requests the PAGE origin — in
1083
+ bonded has `baseURL: ''`, so `getClient().get('/items')` requests the PAGE origin — in
1034
1084
  dev the Vite server answers its own `index.html` with a 200, and the HTML arrives as
1035
1085
  `data`, and the API then validates none of the fields it was sent. A scaffold bonds
1036
1086
  `'/api'`; an app that builds its own client must pass `{ baseURL }`.
@@ -1049,9 +1099,16 @@ authScheme: 'Token' }))`, or the bonded provider's constructor
1049
1099
  `getClient()`'s result: that is a built client, and `client.authScheme = 'Token'` is a type
1050
1100
  error (TS2339) that changes no header. Do not hand-write a fetch wrapper for the scheme either.
1051
1101
 
1102
+ Header names are case-insensitive: request headers replace defaults with the same name.
1103
+ `createFetchClient` applies a nonempty static or resolved auth token AFTER request
1104
+ interceptors, replacing any default, request or interceptor `Authorization` header in any
1105
+ spelling. Clear the token (and any token resolver) or use a separate client to send another
1106
+ credential. The Axios bond retains Axios's precedence: explicit default/request headers and
1107
+ request interceptors can override the client's token.
1108
+
1052
1109
  A request made while the session is still being restored WAITS for that restore, so a page
1053
- that fetches viewer-dependent data on mount (a profile's `following` flag, a feed, a
1054
- `favorited` state) cannot go out unauthenticated and answer for an anonymous viewer. The auth
1110
+ that fetches viewer-dependent data on mount (account settings, a dashboard, or a
1111
+ saved-item state) cannot go out unauthenticated and answer for an anonymous viewer. The auth
1055
1112
  bond registers that wait with `setAuthGate`; apps that bond auth through
1056
1113
  `@molecule/app-bonds-default-react` get it without doing anything. An app with its own session
1057
1114
  module registers its own: `setAuthGate(() => session.whenRestored())`.
@@ -1085,6 +1142,10 @@ case so a caller can stay silent instead of reporting an outage. **Do not write
1085
1142
  `err instanceof HttpError && err.status < 500` as a sign-out check** — it clears
1086
1143
  the session on every aborted navigation request.
1087
1144
 
1145
+ Every non-ok response rejected by `@molecule/app-auth` also satisfies
1146
+ `isHttpError(err)`: its `status` and `response.data` are the same HTTP status
1147
+ and parsed body exposed as `AuthError.status` and `AuthError.body`.
1148
+
1088
1149
  ## Translations
1089
1150
 
1090
1151
  Translation strings are provided by `@molecule/app-locales-http`.
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * The one gate every HTTP request awaits before it is sent.
3
3
  *
4
- * A page that fetches viewer-dependent data on mount (`GET /profiles/:user`,
5
- * a feed, a "favorited" flag) can fire BEFORE the stored session has been
4
+ * A page that fetches viewer-dependent data on mount (`GET /accounts/:user`,
5
+ * a dashboard, a saved-item flag) can fire BEFORE the stored session has been
6
6
  * restored, so the request leaves with no `Authorization` header and the server
7
- * answers for an anonymous viewer — `following: false` on a user you follow.
7
+ * answers for an anonymous viewer — `saved: false` on an item you saved.
8
8
  * It is invisible on localhost, where the restore wins the race against the
9
9
  * first effect, and appears over the network as soon as the restore takes one
10
10
  * round trip: on a deployed URL it reads as stale server data rather than as a
package/dist/auth-gate.js CHANGED
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * The one gate every HTTP request awaits before it is sent.
3
3
  *
4
- * A page that fetches viewer-dependent data on mount (`GET /profiles/:user`,
5
- * a feed, a "favorited" flag) can fire BEFORE the stored session has been
4
+ * A page that fetches viewer-dependent data on mount (`GET /accounts/:user`,
5
+ * a dashboard, a saved-item flag) can fire BEFORE the stored session has been
6
6
  * restored, so the request leaves with no `Authorization` header and the server
7
- * answers for an anonymous viewer — `following: false` on a user you follow.
7
+ * answers for an anonymous viewer — `saved: false` on an item you saved.
8
8
  * It is invisible on localhost, where the restore wins the race against the
9
9
  * first effect, and appears over the network as soon as the restore takes one
10
10
  * round trip: on a deployed URL it reads as stale server data rather than as a
package/dist/errors.d.ts CHANGED
@@ -25,10 +25,13 @@
25
25
  */
26
26
  import { HttpError } from './types.js';
27
27
  /**
28
- * Whether `err` is an {@link HttpError} from this package.
28
+ * Whether `err` is an {@link HttpError} or a compatible branded request failure.
29
+ * `@molecule/app-auth` uses the same global brand for its non-ok responses, so
30
+ * this also recognizes them across realms and duplicated package copies without
31
+ * either package depending on the other.
29
32
  *
30
33
  * @param err - Any thrown value.
31
- * @returns True for an `HttpError`.
34
+ * @returns True for an `HttpError` or a compatibly branded request failure.
32
35
  */
33
36
  export declare function isHttpError(err: unknown): err is HttpError;
34
37
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAE1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAE/C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAItC;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAO1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAE/C"}
package/dist/errors.js CHANGED
@@ -24,14 +24,21 @@
24
24
  * @module
25
25
  */
26
26
  import { HttpError } from './types.js';
27
+ const HTTP_ERROR_BRAND = Symbol.for('@molecule/app-http/HttpError');
27
28
  /**
28
- * Whether `err` is an {@link HttpError} from this package.
29
+ * Whether `err` is an {@link HttpError} or a compatible branded request failure.
30
+ * `@molecule/app-auth` uses the same global brand for its non-ok responses, so
31
+ * this also recognizes them across realms and duplicated package copies without
32
+ * either package depending on the other.
29
33
  *
30
34
  * @param err - Any thrown value.
31
- * @returns True for an `HttpError`.
35
+ * @returns True for an `HttpError` or a compatibly branded request failure.
32
36
  */
33
37
  export function isHttpError(err) {
34
- return err instanceof HttpError;
38
+ return (err instanceof HttpError ||
39
+ (typeof err === 'object' &&
40
+ err !== null &&
41
+ err[HTTP_ERROR_BRAND] === true));
35
42
  }
36
43
  /**
37
44
  * Whether the server REJECTED the request's credential — the only failure that
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,GAAG,YAAY,SAAS,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAA;AACxC,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;AAEnE;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,CACL,GAAG,YAAY,SAAS;QACxB,CAAC,OAAO,GAAG,KAAK,QAAQ;YACtB,GAAG,KAAK,IAAI;YACX,GAA+B,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,CAC/D,CAAA;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAA;AACxC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -47,7 +47,7 @@
47
47
  * the author's machine, then fails cross-origin (CORS) in the preview and points at the wrong
48
48
  * server in production. The base URL is configured ONCE (via `setClient`), not per call.
49
49
  * - **`getClient()` itself knows no baseURL.** The fallback client it mints when nothing is
50
- * bonded has `baseURL: ''`, so `getClient().get('/articles')` requests the PAGE origin — in
50
+ * bonded has `baseURL: ''`, so `getClient().get('/items')` requests the PAGE origin — in
51
51
  * dev the Vite server answers its own `index.html` with a 200, and the HTML arrives as
52
52
  * `data`, and the API then validates none of the fields it was sent. A scaffold bonds
53
53
  * `'/api'`; an app that builds its own client must pass `{ baseURL }`.
@@ -66,9 +66,16 @@
66
66
  * `getClient()`'s result: that is a built client, and `client.authScheme = 'Token'` is a type
67
67
  * error (TS2339) that changes no header. Do not hand-write a fetch wrapper for the scheme either.
68
68
  *
69
+ * Header names are case-insensitive: request headers replace defaults with the same name.
70
+ * `createFetchClient` applies a nonempty static or resolved auth token AFTER request
71
+ * interceptors, replacing any default, request or interceptor `Authorization` header in any
72
+ * spelling. Clear the token (and any token resolver) or use a separate client to send another
73
+ * credential. The Axios bond retains Axios's precedence: explicit default/request headers and
74
+ * request interceptors can override the client's token.
75
+ *
69
76
  * A request made while the session is still being restored WAITS for that restore, so a page
70
- * that fetches viewer-dependent data on mount (a profile's `following` flag, a feed, a
71
- * `favorited` state) cannot go out unauthenticated and answer for an anonymous viewer. The auth
77
+ * that fetches viewer-dependent data on mount (account settings, a dashboard, or a
78
+ * saved-item state) cannot go out unauthenticated and answer for an anonymous viewer. The auth
72
79
  * bond registers that wait with `setAuthGate`; apps that bond auth through
73
80
  * `@molecule/app-bonds-default-react` get it without doing anything. An app with its own session
74
81
  * module registers its own: `setAuthGate(() => session.whenRestored())`.
@@ -102,6 +109,10 @@
102
109
  * `err instanceof HttpError && err.status < 500` as a sign-out check** — it clears
103
110
  * the session on every aborted navigation request.
104
111
  *
112
+ * Every non-ok response rejected by `@molecule/app-auth` also satisfies
113
+ * `isHttpError(err)`: its `status` and `response.data` are the same HTTP status
114
+ * and parsed body exposed as `AuthError.status` and `AuthError.body`.
115
+ *
105
116
  * @module
106
117
  */
107
118
  export * from './auth-gate.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -47,7 +47,7 @@
47
47
  * the author's machine, then fails cross-origin (CORS) in the preview and points at the wrong
48
48
  * server in production. The base URL is configured ONCE (via `setClient`), not per call.
49
49
  * - **`getClient()` itself knows no baseURL.** The fallback client it mints when nothing is
50
- * bonded has `baseURL: ''`, so `getClient().get('/articles')` requests the PAGE origin — in
50
+ * bonded has `baseURL: ''`, so `getClient().get('/items')` requests the PAGE origin — in
51
51
  * dev the Vite server answers its own `index.html` with a 200, and the HTML arrives as
52
52
  * `data`, and the API then validates none of the fields it was sent. A scaffold bonds
53
53
  * `'/api'`; an app that builds its own client must pass `{ baseURL }`.
@@ -66,9 +66,16 @@
66
66
  * `getClient()`'s result: that is a built client, and `client.authScheme = 'Token'` is a type
67
67
  * error (TS2339) that changes no header. Do not hand-write a fetch wrapper for the scheme either.
68
68
  *
69
+ * Header names are case-insensitive: request headers replace defaults with the same name.
70
+ * `createFetchClient` applies a nonempty static or resolved auth token AFTER request
71
+ * interceptors, replacing any default, request or interceptor `Authorization` header in any
72
+ * spelling. Clear the token (and any token resolver) or use a separate client to send another
73
+ * credential. The Axios bond retains Axios's precedence: explicit default/request headers and
74
+ * request interceptors can override the client's token.
75
+ *
69
76
  * A request made while the session is still being restored WAITS for that restore, so a page
70
- * that fetches viewer-dependent data on mount (a profile's `following` flag, a feed, a
71
- * `favorited` state) cannot go out unauthenticated and answer for an anonymous viewer. The auth
77
+ * that fetches viewer-dependent data on mount (account settings, a dashboard, or a
78
+ * saved-item state) cannot go out unauthenticated and answer for an anonymous viewer. The auth
72
79
  * bond registers that wait with `setAuthGate`; apps that bond auth through
73
80
  * `@molecule/app-bonds-default-react` get it without doing anything. An app with its own session
74
81
  * module registers its own: `setAuthGate(() => session.whenRestored())`.
@@ -102,6 +109,10 @@
102
109
  * `err instanceof HttpError && err.status < 500` as a sign-out check** — it clears
103
110
  * the session on every aborted navigation request.
104
111
  *
112
+ * Every non-ok response rejected by `@molecule/app-auth` also satisfies
113
+ * `isHttpError(err)`: its `status` and `response.data` are the same HTTP status
114
+ * and parsed body exposed as `AuthError.status` and `AuthError.body`.
115
+ *
105
116
  * @module
106
117
  */
107
118
  export * from './auth-gate.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAqB,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AA4ClF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAQ,gBAAqB,KAAG,UAqbjE,CAAA"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAqB,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAoElF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAQ,gBAAqB,KAAG,UA6bjE,CAAA"}
package/dist/provider.js CHANGED
@@ -9,11 +9,34 @@ import { t } from '@molecule/app-i18n';
9
9
  import { getLogger } from '@molecule/app-logger';
10
10
  import { awaitAuthGate } from './auth-gate.js';
11
11
  import { retryDelayMs, shouldRetryRequest } from './retry.js';
12
- import { HttpError } from './types.js';
12
+ import { HttpError, snapshotHttpErrorBody } from './types.js';
13
13
  /** Wait for a retry backoff. */
14
14
  function sleep(ms) {
15
15
  return new Promise((resolve) => setTimeout(resolve, ms));
16
16
  }
17
+ /**
18
+ * Remove every spelling of a header name. Header names are case-insensitive, and fetch joins a
19
+ * `content-type` and a `Content-Type` key into one `application/json, application/json` value,
20
+ * which JSON body parsers reject — the server then sees no body.
21
+ */
22
+ function deleteHeader(headers, name) {
23
+ const lower = name.toLowerCase();
24
+ for (const key of Object.keys(headers))
25
+ if (key.toLowerCase() === lower)
26
+ delete headers[key];
27
+ }
28
+ /** Set a header, replacing it under any spelling. */
29
+ function setHeader(headers, name, value) {
30
+ deleteHeader(headers, name);
31
+ // This valid header must avoid both Object.prototype's setter and native Headers' record
32
+ // conversion, which can discard the exact `__proto__` spelling. Its case is immaterial to HTTP.
33
+ headers[name === '__proto__' ? '__PROTO__' : name] = value;
34
+ }
35
+ /** Whether a header is present under any spelling. */
36
+ function hasHeader(headers, name) {
37
+ const lower = name.toLowerCase();
38
+ return Object.keys(headers).some((key) => key.toLowerCase() === lower);
39
+ }
17
40
  /** A response whose body is an HTML document, not JSON. */
18
41
  const HTML_CONTENT_TYPE = /^text\/html\b/i;
19
42
  /** A URL that names its own host: a scheme (`https://`) or protocol-relative (`//cdn…`). */
@@ -120,18 +143,21 @@ export const createFetchClient = (config = {}) => {
120
143
  }
121
144
  }
122
145
  // Build headers
123
- const headers = {
124
- ...client.defaultHeaders,
125
- ...finalConfig.headers,
126
- };
146
+ // A request header replaces a default one of the same name in any spelling.
147
+ const headers = {};
148
+ for (const [name, value] of [
149
+ ...Object.entries(client.defaultHeaders),
150
+ ...Object.entries(finalConfig.headers ?? {}),
151
+ ])
152
+ setHeader(headers, name, value);
127
153
  // Add auth token. Resolved HERE, after the gate: the session this request belongs to is
128
154
  // the one the restore settled on, and it cannot have changed since a copy was taken.
129
155
  const token = resolveAuthToken();
130
156
  if (token) {
131
- headers['Authorization'] = `${config.authScheme ?? 'Bearer'} ${token}`;
157
+ setHeader(headers, 'Authorization', `${config.authScheme ?? 'Bearer'} ${token}`);
132
158
  }
133
159
  // Add content-type for JSON
134
- if (finalConfig.data && !headers['Content-Type']) {
160
+ if (finalConfig.data && !hasHeader(headers, 'Content-Type')) {
135
161
  headers['Content-Type'] = 'application/json';
136
162
  }
137
163
  // Build fetch options
@@ -147,7 +173,7 @@ export const createFetchClient = (config = {}) => {
147
173
  fetchOptions.body = finalConfig.data;
148
174
  // Remove Content-Type for FormData (browser sets it with boundary)
149
175
  if (finalConfig.data instanceof FormData) {
150
- delete headers['Content-Type'];
176
+ deleteHeader(headers, 'Content-Type');
151
177
  }
152
178
  }
153
179
  else {
@@ -208,8 +234,7 @@ export const createFetchClient = (config = {}) => {
208
234
  // server answering a request that expected JSON — the Vite dev server's
209
235
  // SPA fallback when a relative URL had no API baseURL. Resolving with the
210
236
  // HTML as `data` turns that into a `Cannot read properties of undefined`
211
- // crash far from the call (xr-molecule-flash-m126: 6.5 minutes and 22
212
- // probe scripts to discover `getClient().baseURL` was `''`).
237
+ // crash far from the call, obscuring the missing API base URL.
213
238
  const contentType = fetchResponse.headers.get('content-type') ?? '';
214
239
  if (fetchResponse.ok && HTML_CONTENT_TYPE.test(contentType)) {
215
240
  throw new HttpError(`${finalConfig.method} ${url} answered ${contentType.split(';')[0]} instead of ` +
@@ -237,6 +262,7 @@ export const createFetchClient = (config = {}) => {
237
262
  };
238
263
  // Handle error status codes
239
264
  if (!fetchResponse.ok) {
265
+ response.data = await snapshotHttpErrorBody(response.data);
240
266
  logger.warn('HTTP error', finalConfig.method, url, fetchResponse.status);
241
267
  const error = new HttpError(t('http.error.requestFailed', { status: fetchResponse.status }, { defaultValue: `Request failed with status ${fetchResponse.status}` }), fetchResponse.status, response, finalConfig, 'http.error.requestFailed');
242
268
  // Handle auth errors
@@ -308,7 +334,7 @@ export const createFetchClient = (config = {}) => {
308
334
  logger.warn('Network request cancelled by navigation', finalConfig.method, url);
309
335
  }
310
336
  else {
311
- logger.error('Network error', finalConfig.method, url, err);
337
+ logger.error('Network error', finalConfig.method, url, err instanceof Error ? err.message : String(err));
312
338
  }
313
339
  // An abort and a navigation cancellation are the SAME fact to a caller —
314
340
  // the request was cancelled before any response — and neither is a network
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -101,8 +101,8 @@ export interface AuthGateRequest {
101
101
  */
102
102
  method?: string;
103
103
  /**
104
- * The request's URL, for the message logged when the gate never settles. A URL may carry
105
- * an id; it never carries a credential (tokens travel in headers).
104
+ * The request's URL, for the message logged when the gate never settles. Any userinfo or
105
+ * credential query/fragment values are redacted from that report; non-secret parts remain.
106
106
  */
107
107
  url?: string;
108
108
  }
@@ -148,9 +148,34 @@ export interface HttpResponse<T = unknown> {
148
148
  */
149
149
  config: FullRequestConfig;
150
150
  }
151
+ /**
152
+ * Materialize a failed response body before the synchronous HttpError capture. Unchanged bytes
153
+ * are cloned directly, including a Blob's BOM and every typed-array kind. Changed textual bytes
154
+ * retain the BOM and use a Uint8Array fallback if the original view's alignment no longer fits.
155
+ * Successful responses never pass through this helper.
156
+ *
157
+ * @param body - A response body about to be retained on a failed request.
158
+ * @returns A scrubbed body with unchanged binary content preserved byte-for-byte.
159
+ */
160
+ export declare const snapshotHttpErrorBody: <T>(body: T) => Promise<T>;
161
+ /**
162
+ * Read and scrub a failed response once for a retained-error reconstruction. The detached capture
163
+ * carries the original body kind, safe response metadata, and minimal request config, so callers
164
+ * such as auth never need to read the source response or its body again.
165
+ *
166
+ * @param response - The failed HTTP response to capture.
167
+ * @returns A detached, credential-scrubbed response preserving binary body bytes where safe.
168
+ */
169
+ export declare const snapshotHttpErrorResponse: <T extends HttpResponse>(response: T) => Promise<T>;
151
170
  /**
152
171
  * HTTP error with response details.
153
172
  *
173
+ * Request metadata on `config` and `response.config` is limited to method, a
174
+ * credential-redacted URL, and the two boolean notification-suppression controls
175
+ * (`molSilentErrorNotification` and `molSilentRateLimitNotification`). Request bodies,
176
+ * headers, params and all other provider options are omitted, as are credential-bearing
177
+ * response headers, because errors are routinely serialized by logging transports.
178
+ *
154
179
  * **`status` is an HTTP status when the server answered, and `0` when it did not.**
155
180
  * A `0` means NO response exists: the request was aborted (an `AbortController`, a
156
181
  * component's effect cleanup, a route change tearing the request down) or the
@@ -177,13 +202,21 @@ export declare class HttpError extends Error {
177
202
  config?: FullRequestConfig | undefined;
178
203
  errorKey?: string | undefined;
179
204
  aborted: boolean;
205
+ /**
206
+ * Redacts URL userinfo and credential query/fragment values while preserving the path and
207
+ * non-secret parameters. Shared by compatible HTTP and auth error/log views.
208
+ */
209
+ static readonly redactUrlCredentials: (value: string) => string;
180
210
  /**
181
211
  * Builds a failed-request error.
182
212
  *
183
- * @param message - Human-readable message (already translated where a key exists).
213
+ * @param message - Human-readable message (already translated where a key exists);
214
+ * credentials in any URL it contains are redacted.
184
215
  * @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.
216
+ * @param response - Parsed response when the server answered, otherwise undefined;
217
+ * its request config and headers are sanitized for safe logging.
218
+ * @param config - The request config that failed; only its method, redacted URL and
219
+ * boolean notification-suppression controls are retained.
187
220
  * @param errorKey - Translation key for the failure (`http.error.aborted` for an
188
221
  * aborted request, `http.error.networkError` for a real network failure).
189
222
  * @param aborted - Whether the request was aborted before a response: an
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -3,9 +3,179 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { snapshotCredentials } from '@molecule/app-logger';
7
+ import { redactUrlCredentials } from './url.js';
8
+ // A global brand keeps failed-request classification working across realms and
9
+ // duplicated package copies. It is deliberately not an exported runtime key.
10
+ const HTTP_ERROR_BRAND = Symbol.for('@molecule/app-http/HttpError');
11
+ /** The boolean-only notification controls an error interceptor may read. */
12
+ const ERROR_INTERCEPTOR_OPTIONS = [
13
+ 'molSilentErrorNotification',
14
+ 'molSilentRateLimitNotification',
15
+ ];
16
+ /** Keep notification suppression without retaining arbitrary provider options. */
17
+ const errorInterceptorOptions = (options) => {
18
+ if (!options)
19
+ return undefined;
20
+ const safe = Object.fromEntries(ERROR_INTERCEPTOR_OPTIONS.flatMap((key) => (options[key] === true ? [[key, true]] : [])));
21
+ return Object.keys(safe).length > 0 ? safe : undefined;
22
+ };
23
+ /** Keep only non-credential request metadata on an error that may be logged. */
24
+ const errorRequestConfig = (config) => {
25
+ const url = redactUrlCredentials(config.url);
26
+ const options = errorInterceptorOptions(config.options);
27
+ // Even the minimal public form is detached: a later caller mutation must not
28
+ // introduce credentials into the error's retained config or response.config.
29
+ return { method: config.method, url, ...(options ? { options } : {}) };
30
+ };
31
+ /** Fresh Blobs already materialized by the async failure boundary; no native property is written. */
32
+ const retainedErrorBlobs = new WeakSet();
33
+ const isBuffer = (value) => value instanceof ArrayBuffer ||
34
+ (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer);
35
+ const sharedBuffer = (bytes) => {
36
+ const copy = new SharedArrayBuffer(bytes.byteLength);
37
+ new Uint8Array(copy).set(bytes);
38
+ return copy;
39
+ };
40
+ /** Clone a view over its exact bytes, retaining element width, offset-independent length and kind. */
41
+ const cloneBinaryBody = (original, bytes) => {
42
+ if (typeof SharedArrayBuffer !== 'undefined' && original instanceof SharedArrayBuffer) {
43
+ return sharedBuffer(bytes);
44
+ }
45
+ if (original instanceof ArrayBuffer)
46
+ return original.slice(0);
47
+ const copy = bytes.slice();
48
+ if (original instanceof DataView)
49
+ return new DataView(copy.buffer);
50
+ if (typeof Buffer !== 'undefined' && original instanceof Buffer)
51
+ return Buffer.from(copy);
52
+ const View = original.constructor;
53
+ return new View(copy.buffer);
54
+ };
55
+ /** Rebuild only changed textual bytes; unchanged and non-text bodies are cloned byte-for-byte. */
56
+ const retainedBinaryBody = (original, snapshot) => {
57
+ if (!isBuffer(original) && !ArrayBuffer.isView(original))
58
+ return snapshot;
59
+ let bytes;
60
+ try {
61
+ bytes = isBuffer(original)
62
+ ? new Uint8Array(original)
63
+ : new Uint8Array(original.buffer, original.byteOffset, original.byteLength);
64
+ }
65
+ catch (_detached) {
66
+ return snapshot;
67
+ }
68
+ let decoded;
69
+ try {
70
+ decoded = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
71
+ }
72
+ catch (_error) {
73
+ // A genuine non-text body is retained byte-for-byte below.
74
+ }
75
+ if (decoded === undefined || snapshot === decoded || typeof snapshot !== 'string') {
76
+ return cloneBinaryBody(original, bytes);
77
+ }
78
+ // snapshotCredentials decodes without a BOM. Restore one on changed text too,
79
+ // then construct typed/BigInt views over bytes rather than numeric elements.
80
+ const hasUtf8Bom = bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;
81
+ const encoded = new TextEncoder().encode(hasUtf8Bom ? `\uFEFF${snapshot}` : snapshot);
82
+ if (typeof SharedArrayBuffer !== 'undefined' && original instanceof SharedArrayBuffer) {
83
+ return sharedBuffer(encoded);
84
+ }
85
+ if (original instanceof ArrayBuffer)
86
+ return encoded.buffer;
87
+ if (original instanceof DataView)
88
+ return new DataView(encoded.buffer);
89
+ if (typeof Buffer !== 'undefined' && original instanceof Buffer)
90
+ return Buffer.from(encoded);
91
+ const View = original.constructor;
92
+ const width = View.BYTES_PER_ELEMENT ?? 1;
93
+ return encoded.byteLength % width === 0 ? new View(encoded.buffer) : encoded;
94
+ };
95
+ /** Scrub response headers/body into a new tree and project safe request metadata onto it. */
96
+ const errorResponse = (response) => {
97
+ const config = errorRequestConfig(response.config);
98
+ const scrubbed = snapshotCredentials(response);
99
+ return {
100
+ ...scrubbed,
101
+ data: typeof Blob !== 'undefined' &&
102
+ response.data instanceof Blob &&
103
+ retainedErrorBlobs.has(response.data)
104
+ ? response.data
105
+ : retainedBinaryBody(response.data, scrubbed.data),
106
+ config,
107
+ };
108
+ };
109
+ /**
110
+ * Materialize a failed response body before the synchronous HttpError capture. Unchanged bytes
111
+ * are cloned directly, including a Blob's BOM and every typed-array kind. Changed textual bytes
112
+ * retain the BOM and use a Uint8Array fallback if the original view's alignment no longer fits.
113
+ * Successful responses never pass through this helper.
114
+ *
115
+ * @param body - A response body about to be retained on a failed request.
116
+ * @returns A scrubbed body with unchanged binary content preserved byte-for-byte.
117
+ */
118
+ export const snapshotHttpErrorBody = async (body) => {
119
+ if (isBuffer(body) || ArrayBuffer.isView(body)) {
120
+ return retainedBinaryBody(body, snapshotCredentials(body));
121
+ }
122
+ if (typeof Blob === 'undefined' || !(body instanceof Blob))
123
+ return body;
124
+ try {
125
+ const bytes = new Uint8Array(await body.arrayBuffer());
126
+ let snapshot;
127
+ try {
128
+ const text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
129
+ const scrubbed = snapshotCredentials(text);
130
+ if (scrubbed === text) {
131
+ snapshot = new Blob([bytes], { type: body.type });
132
+ }
133
+ else {
134
+ const hasUtf8Bom = bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf;
135
+ const encoded = new TextEncoder().encode(hasUtf8Bom ? `\uFEFF${scrubbed}` : scrubbed);
136
+ snapshot = new Blob([encoded], { type: body.type });
137
+ }
138
+ }
139
+ catch (_nonText) {
140
+ snapshot = new Blob([bytes], { type: body.type });
141
+ }
142
+ retainedErrorBlobs.add(snapshot);
143
+ return snapshot;
144
+ }
145
+ catch (_unreadable) {
146
+ retainedErrorBlobs.add(body);
147
+ return body;
148
+ }
149
+ };
150
+ /**
151
+ * Read and scrub a failed response once for a retained-error reconstruction. The detached capture
152
+ * carries the original body kind, safe response metadata, and minimal request config, so callers
153
+ * such as auth never need to read the source response or its body again.
154
+ *
155
+ * @param response - The failed HTTP response to capture.
156
+ * @returns A detached, credential-scrubbed response preserving binary body bytes where safe.
157
+ */
158
+ export const snapshotHttpErrorResponse = async (response) => {
159
+ const captured = {
160
+ ...response,
161
+ data: response.data,
162
+ status: response.status,
163
+ statusText: response.statusText,
164
+ headers: response.headers,
165
+ config: response.config,
166
+ };
167
+ captured.data = await snapshotHttpErrorBody(captured.data);
168
+ return errorResponse(captured);
169
+ };
6
170
  /**
7
171
  * HTTP error with response details.
8
172
  *
173
+ * Request metadata on `config` and `response.config` is limited to method, a
174
+ * credential-redacted URL, and the two boolean notification-suppression controls
175
+ * (`molSilentErrorNotification` and `molSilentRateLimitNotification`). Request bodies,
176
+ * headers, params and all other provider options are omitted, as are credential-bearing
177
+ * response headers, because errors are routinely serialized by logging transports.
178
+ *
9
179
  * **`status` is an HTTP status when the server answered, and `0` when it did not.**
10
180
  * A `0` means NO response exists: the request was aborted (an `AbortController`, a
11
181
  * component's effect cleanup, a route change tearing the request down) or the
@@ -32,13 +202,21 @@ export class HttpError extends Error {
32
202
  config;
33
203
  errorKey;
34
204
  aborted;
205
+ /**
206
+ * Redacts URL userinfo and credential query/fragment values while preserving the path and
207
+ * non-secret parameters. Shared by compatible HTTP and auth error/log views.
208
+ */
209
+ static redactUrlCredentials = redactUrlCredentials;
35
210
  /**
36
211
  * Builds a failed-request error.
37
212
  *
38
- * @param message - Human-readable message (already translated where a key exists).
213
+ * @param message - Human-readable message (already translated where a key exists);
214
+ * credentials in any URL it contains are redacted.
39
215
  * @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.
216
+ * @param response - Parsed response when the server answered, otherwise undefined;
217
+ * its request config and headers are sanitized for safe logging.
218
+ * @param config - The request config that failed; only its method, redacted URL and
219
+ * boolean notification-suppression controls are retained.
42
220
  * @param errorKey - Translation key for the failure (`http.error.aborted` for an
43
221
  * aborted request, `http.error.networkError` for a real network failure).
44
222
  * @param aborted - Whether the request was aborted before a response: an
@@ -47,13 +225,16 @@ export class HttpError extends Error {
47
225
  * from a network outage on the same `status === 0`, without parsing the message.
48
226
  */
49
227
  constructor(message, status, response, config, errorKey, aborted = false) {
50
- super(message);
228
+ super(snapshotCredentials(message));
51
229
  this.status = status;
52
230
  this.response = response;
53
231
  this.config = config;
54
232
  this.errorKey = errorKey;
55
233
  this.aborted = aborted;
56
234
  this.name = 'HttpError';
235
+ this.response = response ? errorResponse(response) : undefined;
236
+ this.config = config ? errorRequestConfig(config) : undefined;
237
+ Object.defineProperty(this, HTTP_ERROR_BRAND, { value: true });
57
238
  }
58
239
  }
59
240
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/url.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * URL sanitization for errors and logs.
3
+ *
4
+ * @module
5
+ */
6
+ /**
7
+ * Redacts credentials from a URL or from text containing one, while preserving its scheme,
8
+ * host, path and non-credential parameters. Both absolute and relative URLs are supported;
9
+ * userinfo is replaced as a whole and credential-valued query/fragment parameters keep their
10
+ * names with `[REDACTED]` as their value. A string without URL credentials is returned unchanged.
11
+ *
12
+ * The implementation is the logger core's shared deep scrubber; this named view keeps the
13
+ * existing `HttpError.redactUrlCredentials` API without maintaining a second classification rule.
14
+ *
15
+ * @param value - A URL, error message or log argument that may contain a credential URL.
16
+ * @returns The input with URL userinfo and credential parameter values redacted.
17
+ */
18
+ export declare const redactUrlCredentials: (value: string) => string;
19
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,MAAkC,CAAA"}
package/dist/url.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * URL sanitization for errors and logs.
3
+ *
4
+ * @module
5
+ */
6
+ import { redactCredentials } from '@molecule/app-logger';
7
+ /**
8
+ * Redacts credentials from a URL or from text containing one, while preserving its scheme,
9
+ * host, path and non-credential parameters. Both absolute and relative URLs are supported;
10
+ * userinfo is replaced as a whole and credential-valued query/fragment parameters keep their
11
+ * names with `[REDACTED]` as their value. A string without URL credentials is returned unchanged.
12
+ *
13
+ * The implementation is the logger core's shared deep scrubber; this named view keeps the
14
+ * existing `HttpError.redactUrlCredentials` API without maintaining a second classification rule.
15
+ *
16
+ * @param value - A URL, error message or log argument that may contain a credential URL.
17
+ * @returns The input with URL userinfo and credential parameter values redacted.
18
+ */
19
+ export const redactUrlCredentials = (value) => redactCredentials(value);
20
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@molecule/app-http",
3
- "version": "1.5.1",
3
+ "version": "1.5.4",
4
4
  "description": "Client HTTP interface for molecule.dev",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -30,12 +30,12 @@
30
30
  "peerDependencies": {
31
31
  "@molecule/app-bond": "^1.0.1",
32
32
  "@molecule/app-i18n": "^1.0.1",
33
- "@molecule/app-logger": "^1.0.1"
33
+ "@molecule/app-logger": "^1.0.4"
34
34
  },
35
35
  "devDependencies": {
36
- "@molecule/app-bond": "1.0.4",
37
- "@molecule/app-i18n": "1.1.1",
38
- "@molecule/app-logger": "1.0.3",
36
+ "@molecule/app-bond": "1.0.5",
37
+ "@molecule/app-i18n": "1.1.2",
38
+ "@molecule/app-logger": "1.0.5",
39
39
  "@types/node": "26.6.5",
40
40
  "typescript": "6.0.3",
41
41
  "vitest": "4.1.12"