@chrischall/mcp-utils 0.10.4 → 0.11.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.
Files changed (85) hide show
  1. package/README.md +123 -17
  2. package/dist/auth/cached-token.d.ts +45 -0
  3. package/dist/auth/cached-token.d.ts.map +1 -0
  4. package/dist/auth/cached-token.js +53 -0
  5. package/dist/auth/cached-token.js.map +1 -0
  6. package/dist/auth/es256.d.ts +23 -0
  7. package/dist/auth/es256.d.ts.map +1 -0
  8. package/dist/auth/es256.js +27 -0
  9. package/dist/auth/es256.js.map +1 -0
  10. package/dist/auth/index.d.ts +2 -0
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/auth/index.js +2 -0
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/concurrency/index.d.ts +1 -0
  15. package/dist/concurrency/index.d.ts.map +1 -1
  16. package/dist/concurrency/index.js +1 -0
  17. package/dist/concurrency/index.js.map +1 -1
  18. package/dist/concurrency/single-flight.d.ts +48 -0
  19. package/dist/concurrency/single-flight.d.ts.map +1 -0
  20. package/dist/concurrency/single-flight.js +76 -0
  21. package/dist/concurrency/single-flight.js.map +1 -0
  22. package/dist/config/index.d.ts +36 -0
  23. package/dist/config/index.d.ts.map +1 -1
  24. package/dist/config/index.js +41 -0
  25. package/dist/config/index.js.map +1 -1
  26. package/dist/dates/index.d.ts +28 -0
  27. package/dist/dates/index.d.ts.map +1 -1
  28. package/dist/dates/index.js +48 -0
  29. package/dist/dates/index.js.map +1 -1
  30. package/dist/errors/index.d.ts +28 -3
  31. package/dist/errors/index.d.ts.map +1 -1
  32. package/dist/errors/index.js +52 -4
  33. package/dist/errors/index.js.map +1 -1
  34. package/dist/fetchproxy/index.d.ts +26 -1
  35. package/dist/fetchproxy/index.d.ts.map +1 -1
  36. package/dist/fetchproxy/index.js +38 -13
  37. package/dist/fetchproxy/index.js.map +1 -1
  38. package/dist/fs/index.d.ts +1 -0
  39. package/dist/fs/index.d.ts.map +1 -1
  40. package/dist/fs/index.js +1 -0
  41. package/dist/fs/index.js.map +1 -1
  42. package/dist/fs/output.d.ts +57 -0
  43. package/dist/fs/output.d.ts.map +1 -0
  44. package/dist/fs/output.js +106 -0
  45. package/dist/fs/output.js.map +1 -0
  46. package/dist/html/index.d.ts.map +1 -1
  47. package/dist/html/index.js +58 -6
  48. package/dist/html/index.js.map +1 -1
  49. package/dist/http/index.d.ts +35 -0
  50. package/dist/http/index.d.ts.map +1 -1
  51. package/dist/http/index.js +30 -2
  52. package/dist/http/index.js.map +1 -1
  53. package/dist/http/net-atoms.d.ts +54 -0
  54. package/dist/http/net-atoms.d.ts.map +1 -0
  55. package/dist/http/net-atoms.js +76 -0
  56. package/dist/http/net-atoms.js.map +1 -0
  57. package/dist/http/response-cache.d.ts +55 -0
  58. package/dist/http/response-cache.d.ts.map +1 -0
  59. package/dist/http/response-cache.js +84 -0
  60. package/dist/http/response-cache.js.map +1 -0
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/response/index.d.ts +17 -0
  66. package/dist/response/index.d.ts.map +1 -1
  67. package/dist/response/index.js +28 -0
  68. package/dist/response/index.js.map +1 -1
  69. package/dist/scrape/index.d.ts +144 -0
  70. package/dist/scrape/index.d.ts.map +1 -0
  71. package/dist/scrape/index.js +460 -0
  72. package/dist/scrape/index.js.map +1 -0
  73. package/dist/session/index.d.ts +43 -0
  74. package/dist/session/index.d.ts.map +1 -1
  75. package/dist/session/index.js +44 -6
  76. package/dist/session/index.js.map +1 -1
  77. package/dist/zod/index.d.ts +1 -0
  78. package/dist/zod/index.d.ts.map +1 -1
  79. package/dist/zod/index.js +1 -0
  80. package/dist/zod/index.js.map +1 -1
  81. package/dist/zod/parse-lenient.d.ts +36 -0
  82. package/dist/zod/parse-lenient.d.ts.map +1 -0
  83. package/dist/zod/parse-lenient.js +37 -0
  84. package/dist/zod/parse-lenient.js.map +1 -0
  85. package/package.json +1 -1
package/README.md CHANGED
@@ -31,7 +31,7 @@ import light:
31
31
 
32
32
  | Import | Contents |
33
33
  | --- | --- |
34
- | `@chrischall/mcp-utils` | core barrel: `server` + `response` + `errors` + `config` + `fs` + `http` + `zod` + `auth` |
34
+ | `@chrischall/mcp-utils` | core barrel: `server` + `response` + `errors` + `config` + `fs` + `http` + `concurrency` + `dates` + `zod` + `auth` + `scrape` |
35
35
  | `@chrischall/mcp-utils/session` | session registry, session store, token manager, cookie-session manager |
36
36
  | `@chrischall/mcp-utils/fetchproxy` | fetchproxy transport adapter, bot-wall / retry / concurrency helpers |
37
37
  | `@chrischall/mcp-utils/html` | opt-in HTML scraping helpers (needs `node-html-parser`) |
@@ -69,7 +69,13 @@ the server instance without connecting a transport.
69
69
  ### `response` — tool-result formatting
70
70
 
71
71
  `textResult` / `jsonResult` (alias), `rawTextResult`, `imageResult`,
72
- `errorResult`, `flattenJsonApi`, `deepMapStringField`.
72
+ `errorResult`, `flattenJsonApi`, `deepMapStringField`, `pruneUndefined`,
73
+ `toArray`.
74
+
75
+ `pruneUndefined(obj)` shallow-copies an object dropping `undefined`-valued keys
76
+ (the compact-projection idiom: skylight's `compact`, viator/alltrails' `prune`);
77
+ `toArray(v)` coerces `T | T[] | null | undefined` to `T[]` (the XML→JSON
78
+ single-item guard from canvas-parent / infinitecampus).
73
79
 
74
80
  ```ts
75
81
  import { textResult, errorResult, flattenJsonApi, deepMapStringField } from '@chrischall/mcp-utils';
@@ -87,7 +93,10 @@ deepMapStringField(payload, 'eventDate', dmyToIso);
87
93
  `McpToolError` and its subclasses (`SessionNotAuthenticatedError`,
88
94
  `BotWallError`, `RateLimitError`, `UnreachableError`, `ModeMismatchError`),
89
95
  plus `createHelpfulError`, `wrapToolError`, `truncateErrorMessage`,
90
- `redactSecrets`, and `messageOf`. `redactSecrets` scrubs `Bearer`/`Basic` auth
96
+ `redactSecrets`, `maskSecret`, and `messageOf`. `BotWallError` takes an optional
97
+ `{ vendor }` (e.g. `'DataDome'`) woven into the message and exposed as a field;
98
+ `maskSecret(value)` renders a `first8…last4` fingerprint for set-credential
99
+ confirmations (short values are fully hidden). `redactSecrets` scrubs `Bearer`/`Basic` auth
91
100
  headers, `Cookie`/`Set-Cookie` values (cookie names stay visible), JWTs,
92
101
  well-known API-key shapes (`sk-…`, `ghp_…`, `xox?-…`, `AIza…`, `AKIA…`,
93
102
  `whsec_…`), and secret-bearing URL query params; `truncateErrorMessage` applies
@@ -113,8 +122,13 @@ tool surface can show the user.
113
122
 
114
123
  ### `config` — hardened env/config
115
124
 
116
- `readEnvVar`, `requireEnvVar`, `parseBoolEnv`, `readPortEnv`, `expandPath`,
117
- `loadDotenvSafely`, `createCachedJsonArrayLoader`.
125
+ `readEnvVar`, `requireEnvVar`, `parseBoolEnv`, `readPortEnv`, `readIntEnv`,
126
+ `readTtlMsEnv`, `expandPath`, `loadDotenvSafely`, `createCachedJsonArrayLoader`.
127
+
128
+ `readIntEnv` is the general hardened integer reader (strict parse + optional
129
+ `min`/`max`); `readTtlMsEnv(key, defaultMs)` reads a TTL in **seconds** and
130
+ returns **milliseconds**, honoring an explicit `0` as "disabled" — the
131
+ `<SVC>_CACHE_TTL` reader shared by the response-cache consumers.
118
132
 
119
133
  ```ts
120
134
  import { requireEnvVar, parseBoolEnv, readPortEnv, expandPath } from '@chrischall/mcp-utils';
@@ -153,9 +167,17 @@ A successful parse is cached; a missing/unreadable file, invalid JSON, or a
153
167
  non-string-array logs one stderr warning and negative-caches (returns defaults
154
168
  without re-reading). Pass `readFile` to inject a reader in tests.
155
169
 
156
- ### `fs` — streaming file helpers (uploads)
170
+ ### `fs` — streaming file helpers (uploads) & binary output
171
+
172
+ `fileBlob`, `readFileHead`, `resolveOutputDir`, `uniquePath`,
173
+ `writeBinaryOutput`, `sniffMimeBytes`.
157
174
 
158
- `fileBlob`, `readFileHead`.
175
+ The binary-output kit (hoisted from gemini + flightaware) is the fleet
176
+ convention for tools that generate bytes: `resolveOutputDir(perCall,
177
+ '<SVC>_OUTPUT_DIR')` resolves arg → env → cwd (creating the dir),
178
+ `writeBinaryOutput({ dir, baseName, base64, mimeType })` writes to a
179
+ **non-overwriting** path (`name.png`, `name-2.png`, …) and returns it, and
180
+ `sniffMimeBytes` magic-byte-detects PNG/JPEG/WebP/GIF.
159
181
 
160
182
  ```ts
161
183
  import { fileBlob, readFileHead } from '@chrischall/mcp-utils';
@@ -177,9 +199,11 @@ constant memory instead of a 20 MB Buffer.
177
199
 
178
200
  `createApiClient` plus building blocks: `buildQueryString`, `buildOptionalBody`,
179
201
  `formatApiError`, `parseLinkHeader`, `parseCookieJar`, `parseCookieHeader`,
180
- `runBoundedBatch`, JWT helpers (`decodeJwtExp`, `decodeJwtSessionId`,
181
- `decodeJwtClaim`, `validateJwtExpiry`), and the `ApiError` / `UpstreamHttpError` /
182
- `UnauthorizedError` / `RateLimitedError` / `RequestTimeoutError` classes.
202
+ `runBoundedBatch`, `createThrottle`, `createResponseCache`, `parseRetryAfterMs`,
203
+ `splitHost`, `buildUserAgent`, `parseContentDispositionFilename`, JWT helpers
204
+ (`decodeJwtExp`, `decodeJwtSessionId`, `decodeJwtClaim`, `validateJwtExpiry`),
205
+ and the `ApiError` / `UpstreamHttpError` / `UnauthorizedError` /
206
+ `RateLimitedError` / `RequestTimeoutError` classes.
183
207
 
184
208
  `decodeJwtClaim(token, claim)` is the generic single-claim reader — returns the
185
209
  raw claim value (`unknown`) or `undefined` for an undecodable token / absent
@@ -203,6 +227,23 @@ const data = await api.get('/v1/things', { query: { page: 2 } });
203
227
  `RequestTimeoutError` instead of hanging the tool call. A 429 retry gets a fresh
204
228
  timeout. Omit it to keep the previous unbounded behavior.
205
229
 
230
+ `retry` also accepts `statuses` (e.g. `[429, 503]`), `honorRetryAfter: true`
231
+ (sleep the response's `Retry-After` instead of the fixed `delayMs`, bounded by
232
+ `maxRetryAfterMs`, default 30 s — hoisted from getyourguide / musicbrainz /
233
+ viator / tripadvisor), and the standalone `parseRetryAfterMs(header)` for custom
234
+ clients.
235
+
236
+ `api.fetchRaw(method, path)` is the binary path `fetchJson` can't express —
237
+ returns `{ status, contentType, headers, bytes }` with the same 401/429/error
238
+ mapping (gzip sales reports, PNG maps, attachment downloads).
239
+
240
+ `createResponseCache({ ttlMs: { dynamic, static }, maxEntries })` is the bounded
241
+ tiered-TTL response cache for billed / rate-limited reads (flightaware / viator
242
+ / tripadvisor): key on the request path (and body for POST-reads), route
243
+ reference data through the long `static` tier via
244
+ `fetchThrough(key, load, 'static')`, and pair the TTLs with `readTtlMsEnv`.
245
+ Writes are never cached.
246
+
206
247
  `parseCookieHeader(header)` parses an inbound *request* `Cookie:` header
207
248
  (`name=value; name2=value2`) into a `Record<string, string>` (first `=` splits,
208
249
  so values may contain `=`; last value wins on a duplicate name). It's the
@@ -234,10 +275,18 @@ a single hung row can't wedge the call. It always returns a full-length,
234
275
  input-ordered array. `setTimer`/`clearTimer` are injectable for tests. This
235
276
  hoists zillow's bulk-tool deadline + `pending`-backfill primitive.
236
277
 
237
- ### `concurrency` — bounded async map
278
+ ### `concurrency` — bounded async map & single-flight
238
279
 
239
- `mapWithConcurrency` — a zero-dependency bounded-fan-out map that preserves
240
- **input order**.
280
+ `mapWithConcurrency`, `singleFlight`, `memoizeAsync` — zero-dependency async
281
+ primitives.
282
+
283
+ `singleFlight(fn)` shares ONE in-flight invocation across concurrent callers
284
+ (cleared on settle; a rejection doesn't poison the next call) — the
285
+ login/refresh/bridge-ready guard hand-rolled in honeybook / infinitecampus /
286
+ onehome / vibo / alltrails / tripadvisor / artsonia. `memoizeAsync(loader)` is
287
+ the keyed variant: a promise cache that coalesces concurrent loads per key and
288
+ evicts rejected loads so the next `get` retries (redfin's `LocalityPoolCache`),
289
+ with `delete`/`clear` for invalidation and test hooks.
241
290
 
242
291
  ```ts
243
292
  import { mapWithConcurrency } from '@chrischall/mcp-utils';
@@ -256,7 +305,8 @@ plus per-item backfill rather than a plain all-or-nothing map.
256
305
 
257
306
  ### `dates` — date-format converters
258
307
 
259
- `isoToDmy`, `dmyToIso`, `isoToCompactTimestamp`. For upstreams that don't speak
308
+ `isoToDmy`, `dmyToIso`, `isoToCompactTimestamp`, `todayIso`, `toIsoDateUtc`,
309
+ `shiftIsoDate`, `ensureSeconds`. For upstreams that don't speak
260
310
  ISO 8601, so a server can keep its surface ISO (`yyyy-MM-dd`) and translate at
261
311
  the API boundary. Pair with `deepMapStringField` to normalize a date field
262
312
  across a whole response.
@@ -268,13 +318,56 @@ const apiDate = isoToDmy('2025-08-28'); // '28-08-2025' (request
268
318
  deepMapStringField(payload, 'eventDate', dmyToIso); // '28-08-2025' → '2025-08-28' (response)
269
319
  ```
270
320
 
321
+ ### `scrape` — SSR JSON-store & page extraction (zero-dep)
322
+
323
+ `decodeHtmlEntities`, `stripHtml`, `sanitizeJsLiterals`, `matchBalanced`,
324
+ `extractJsonAfterMarker`, `extractJsonLdBlocks`, `findJsonLdEntity`,
325
+ `ogContent`, `findArrayByShape`, `deepCollectArrays`, `deepFindObject`,
326
+ `isCloudflareChallenge`, `stripJsonGuard`.
327
+
328
+ Pure string/JSON primitives for server-rendered pages — no `node-html-parser`
329
+ (DOM-level scraping stays in the [`/html`](#html) subpath). Consolidates the SSR
330
+ JSON-store stack re-implemented across musescore / tock / zillow / opentable /
331
+ tripadvisor / etix:
332
+
333
+ ```ts
334
+ import {
335
+ extractJsonAfterMarker, findJsonLdEntity, ogContent,
336
+ findArrayByShape, isCloudflareChallenge, stripJsonGuard,
337
+ } from '@chrischall/mcp-utils';
338
+
339
+ // A redux/__NEXT_DATA__-style store (JS literals repaired via sanitize):
340
+ const store = extractJsonAfterMarker(html, ['window.$REDUX_STATE', '"appState"'], { sanitize: true });
341
+
342
+ // schema.org / OpenGraph readers:
343
+ const event = findJsonLdEntity(html, 'Event'); // checks blocks, @graph, mainEntity
344
+ const title = ogContent(html, 'og:title');
345
+
346
+ // Drift-tolerant array location + anti-XSSI guard stripping:
347
+ const homes = findArrayByShape(pageProps, ['savedHomesList'], (f) => !!f && typeof f === 'object');
348
+ const data = JSON.parse(stripJsonGuard(body)); // )]}' while(1); for(;;); {}&&
349
+ ```
350
+
351
+ `isCloudflareChallenge` matches the DEFINITIVE interstitial markers only
352
+ (`_cf_chl_opt`, `<title>Just a moment`) — never `cdn-cgi/challenge-platform`,
353
+ which Cloudflare inlines on cleared pages too. `decodeHtmlEntities` decodes
354
+ `&amp;` LAST so attribute-escaped JSON survives one level; `matchBalanced` is
355
+ the string/escape-aware bracket walker regex can't replace.
356
+
271
357
  ### `zod` — schema atoms
272
358
 
273
359
  Reusable schemas (`PositiveInt`, `NonNegInt`, `NonEmptyString`, `IsoDate`,
274
360
  `IsoTime`, `NumericIdString`, `SafePathSegment`, `schemaOrigin`,
275
361
  `schemaConfirm`), pagination helpers
276
362
  (`paginationSchema`, `pageSchema`, `calculateOffset`), tool-annotation builders
277
- (`toolAnnotations`), and time normalizers (`extractTime`, `normalizeTime`).
363
+ (`toolAnnotations`), time normalizers (`extractTime`, `normalizeTime`), and the
364
+ lenient response validator `parseLenient`.
365
+
366
+ `parseLenient(schema, raw, { label, context, mode? })` is the degrade-never-break
367
+ validator for reverse-engineered APIs (alltrails' `parseAllTrails`, ofw's
368
+ `parseOFW`, getyourguide's `parseGYG`): on success it returns the parsed data;
369
+ on drift it warns to **stderr** with the precise issue paths and returns the
370
+ RAW response (or throws an `McpToolError` in `mode: 'strict'` for write paths).
278
371
 
279
372
  ```ts
280
373
  import { paginationSchema, calculateOffset, toolAnnotations } from '@chrischall/mcp-utils';
@@ -292,8 +385,15 @@ injection.
292
385
  ### `auth` — auth resolver skeletons
293
386
 
294
387
  `createAuthResolver`, `resolveAuthPattern`, `sessionLoginFlow`,
295
- `createOAuth2Refresher`, and the supporting `FetchproxySession` /
296
- `AuthPattern` types.
388
+ `createOAuth2Refresher`, `createCachedTokenSource`, `signEs256Jwt`, and the
389
+ supporting `FetchproxySession` / `AuthPattern` types.
390
+
391
+ `createCachedTokenSource({ mint, bufferMs })` caches any minted token until
392
+ shortly before expiry with a single-flight mint and an `invalidate()` hook for
393
+ 401-replay — wrap it around `createOAuth2Refresher` (musicbrainz), an ES256
394
+ self-mint (app-store-connect), or a login exchange (zola). `signEs256Jwt(pem,
395
+ payload, { header: { kid } })` is the P-256/`ieee-p1363` JWS signer those
396
+ self-minted-JWT APIs need (the decode counterparts live in `http`).
297
397
 
298
398
  ```ts
299
399
  import { createAuthResolver, createOAuth2Refresher } from '@chrischall/mcp-utils';
@@ -462,6 +562,12 @@ registerBridgeHealthcheckTool({
462
562
  });
463
563
  ```
464
564
 
565
+ Two optional hooks absorb the site-specific healthchecks workday / zillow /
566
+ etix hand-rolled: `classifyThrown(err)` maps the probe's thrown error to a
567
+ custom `{ kind, hint }` (e.g. an SSO bounce → `session_expired` with re-sign-in
568
+ copy; its hint wins the result hint), and `hints` overrides the default copy
569
+ per ladder arm (`{ timeout: 'DataDome may be challenging the tab — …' }`).
570
+
465
571
  ### `html` — scraping helpers *(subpath, optional peer)*
466
572
 
467
573
  ```ts
@@ -0,0 +1,45 @@
1
+ /**
2
+ * `createCachedTokenSource` — a tiny in-memory cache around any token mint.
3
+ *
4
+ * Consolidates the "cache `{ token, expiresAt }`, refresh a bit before expiry,
5
+ * single-flight the mint" shape hand-rolled in app-store-connect
6
+ * (`ensureToken`, ES256 self-mint), musicbrainz (`accessToken` around
7
+ * `createOAuth2Refresher`), and zola (`ensureSession` JWT refresh). The mint is
8
+ * injected, so the same source fronts an OAuth refresher, a JWT signer, or a
9
+ * login exchange.
10
+ */
11
+ /** What a mint returns: the token plus (optionally) when it expires. */
12
+ export interface MintedToken {
13
+ /** The bearer/access token. */
14
+ token: string;
15
+ /** Absolute expiry (Date or epoch ms). Takes precedence over {@link ttlMs}. */
16
+ expiresAt?: Date | number;
17
+ /** Relative lifetime in ms, when the mint knows it (e.g. `expires_in * 1000`). */
18
+ ttlMs?: number;
19
+ }
20
+ /** Options for {@link createCachedTokenSource}. */
21
+ export interface CachedTokenSourceOptions {
22
+ /** Mint a fresh token (OAuth exchange, JWT sign, login…). */
23
+ mint: () => Promise<MintedToken>;
24
+ /** Refresh this many ms BEFORE the token's expiry. Defaults to 60 000. */
25
+ bufferMs?: number;
26
+ /** Lifetime assumed when the mint reports no expiry. Defaults to 3 600 000 (1 h). */
27
+ defaultTtlMs?: number;
28
+ /** Injectable clock (defaults to `Date.now`) — for tests. */
29
+ now?: () => number;
30
+ }
31
+ /** The token source returned by {@link createCachedTokenSource}. */
32
+ export interface CachedTokenSource {
33
+ /** A currently-valid token — cached, or freshly minted when absent/near expiry. */
34
+ getToken(): Promise<string>;
35
+ /** Drop the cached token so the next {@link getToken} re-mints (the 401-replay hook). */
36
+ invalidate(): void;
37
+ }
38
+ /**
39
+ * Build a race-safe cached token source. Concurrent `getToken`s share one
40
+ * in-flight mint; a rejected mint is not cached (the next call retries);
41
+ * `invalidate()` is the reactive hook to call after an upstream 401 before
42
+ * replaying the request.
43
+ */
44
+ export declare function createCachedTokenSource(opts: CachedTokenSourceOptions): CachedTokenSource;
45
+ //# sourceMappingURL=cached-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cached-token.d.ts","sourceRoot":"","sources":["../../src/auth/cached-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACvC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,yFAAyF;IACzF,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CAmCzF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `createCachedTokenSource` — a tiny in-memory cache around any token mint.
3
+ *
4
+ * Consolidates the "cache `{ token, expiresAt }`, refresh a bit before expiry,
5
+ * single-flight the mint" shape hand-rolled in app-store-connect
6
+ * (`ensureToken`, ES256 self-mint), musicbrainz (`accessToken` around
7
+ * `createOAuth2Refresher`), and zola (`ensureSession` JWT refresh). The mint is
8
+ * injected, so the same source fronts an OAuth refresher, a JWT signer, or a
9
+ * login exchange.
10
+ */
11
+ /**
12
+ * Build a race-safe cached token source. Concurrent `getToken`s share one
13
+ * in-flight mint; a rejected mint is not cached (the next call retries);
14
+ * `invalidate()` is the reactive hook to call after an upstream 401 before
15
+ * replaying the request.
16
+ */
17
+ export function createCachedTokenSource(opts) {
18
+ const now = opts.now ?? Date.now;
19
+ const bufferMs = opts.bufferMs ?? 60_000;
20
+ const defaultTtlMs = opts.defaultTtlMs ?? 3_600_000;
21
+ let cached = null;
22
+ let inFlight = null;
23
+ const expiryOf = (minted) => {
24
+ if (minted.expiresAt !== undefined) {
25
+ return minted.expiresAt instanceof Date ? minted.expiresAt.getTime() : minted.expiresAt;
26
+ }
27
+ return now() + (minted.ttlMs ?? defaultTtlMs);
28
+ };
29
+ return {
30
+ getToken() {
31
+ if (cached && cached.expiresAt - bufferMs > now())
32
+ return Promise.resolve(cached.token);
33
+ if (inFlight)
34
+ return inFlight;
35
+ const p = opts
36
+ .mint()
37
+ .then((minted) => {
38
+ cached = { token: minted.token, expiresAt: expiryOf(minted) };
39
+ return minted.token;
40
+ })
41
+ .finally(() => {
42
+ if (inFlight === p)
43
+ inFlight = null;
44
+ });
45
+ inFlight = p;
46
+ return p;
47
+ },
48
+ invalidate() {
49
+ cached = null;
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=cached-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cached-token.js","sourceRoot":"","sources":["../../src/auth/cached-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgCH;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA8B;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;IAEpD,IAAI,MAAM,GAAgD,IAAI,CAAC;IAC/D,IAAI,QAAQ,GAA2B,IAAI,CAAC;IAE5C,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAU,EAAE;QAC/C,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,MAAM,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QAC1F,CAAC;QACD,OAAO,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;YACN,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,GAAG,EAAE;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxF,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI;iBACX,IAAI,EAAE;iBACN,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9D,OAAO,MAAM,CAAC,KAAK,CAAC;YACtB,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,QAAQ,KAAK,CAAC;oBAAE,QAAQ,GAAG,IAAI,CAAC;YACtC,CAAC,CAAC,CAAC;YACL,QAAQ,GAAG,CAAC,CAAC;YACb,OAAO,CAAC,CAAC;QACX,CAAC;QACD,UAAU;YACR,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `signEs256Jwt` — minimal ES256 (P-256 / SHA-256) JWS signer for APIs that
3
+ * authenticate with a self-minted JWT (App Store Connect's `kid`/`iss`/`aud`
4
+ * scheme). mcp-utils already DECODES JWTs (`decodeJwtExp` and friends); this is
5
+ * the signing counterpart, hoisted from app-store-connect's `signES256` +
6
+ * `mintJwt`.
7
+ *
8
+ * Uses `dsaEncoding: 'ieee-p1363'` (raw `r||s`) — the JOSE signature format —
9
+ * NOT the DER default, which upstreams reject.
10
+ */
11
+ /** Options for {@link signEs256Jwt}. */
12
+ export interface SignEs256JwtOptions {
13
+ /** Extra header fields merged over `{ alg: 'ES256', typ: 'JWT' }` (e.g. `kid`). */
14
+ header?: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * Sign a JWT with ES256. `privateKeyPem` is a PEM-encoded P-256 private key
18
+ * (PKCS#8 `.p8` contents); the payload is serialized verbatim — the caller
19
+ * supplies `iss` / `iat` / `exp` / `aud` per its API's rules. Returns the
20
+ * compact `header.payload.signature` JWS.
21
+ */
22
+ export declare function signEs256Jwt(privateKeyPem: string, payload: Record<string, unknown>, opts?: SignEs256JwtOptions): string;
23
+ //# sourceMappingURL=es256.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es256.d.ts","sourceRoot":"","sources":["../../src/auth/es256.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,GAAE,mBAAwB,GAC7B,MAAM,CAOR"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `signEs256Jwt` — minimal ES256 (P-256 / SHA-256) JWS signer for APIs that
3
+ * authenticate with a self-minted JWT (App Store Connect's `kid`/`iss`/`aud`
4
+ * scheme). mcp-utils already DECODES JWTs (`decodeJwtExp` and friends); this is
5
+ * the signing counterpart, hoisted from app-store-connect's `signES256` +
6
+ * `mintJwt`.
7
+ *
8
+ * Uses `dsaEncoding: 'ieee-p1363'` (raw `r||s`) — the JOSE signature format —
9
+ * NOT the DER default, which upstreams reject.
10
+ */
11
+ import { createSign } from 'node:crypto';
12
+ const b64url = (data) => (typeof data === 'string' ? Buffer.from(data, 'utf8') : data).toString('base64url');
13
+ /**
14
+ * Sign a JWT with ES256. `privateKeyPem` is a PEM-encoded P-256 private key
15
+ * (PKCS#8 `.p8` contents); the payload is serialized verbatim — the caller
16
+ * supplies `iss` / `iat` / `exp` / `aud` per its API's rules. Returns the
17
+ * compact `header.payload.signature` JWS.
18
+ */
19
+ export function signEs256Jwt(privateKeyPem, payload, opts = {}) {
20
+ const header = { alg: 'ES256', typ: 'JWT', ...opts.header };
21
+ const signingInput = `${b64url(JSON.stringify(header))}.${b64url(JSON.stringify(payload))}`;
22
+ const signer = createSign('SHA256');
23
+ signer.update(signingInput);
24
+ const signature = signer.sign({ key: privateKeyPem, dsaEncoding: 'ieee-p1363' });
25
+ return `${signingInput}.${b64url(signature)}`;
26
+ }
27
+ //# sourceMappingURL=es256.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es256.js","sourceRoot":"","sources":["../../src/auth/es256.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,GAAG,CAAC,IAAqB,EAAU,EAAE,CAC/C,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAQtF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,aAAqB,EACrB,OAAgC,EAChC,OAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5D,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5F,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IACjF,OAAO,GAAG,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;AAChD,CAAC"}
@@ -234,4 +234,6 @@ export interface OAuth2RefreshResult {
234
234
  * blow up a tool result.
235
235
  */
236
236
  export declare function createOAuth2Refresher(opts: OAuth2RefresherOptions): () => Promise<OAuth2RefreshResult>;
237
+ export * from './cached-token.js';
238
+ export * from './es256.js';
237
239
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
@@ -311,4 +311,6 @@ export function createOAuth2Refresher(opts) {
311
311
  function messageOf(err) {
312
312
  return err instanceof Error ? err.message : String(err);
313
313
  }
314
+ export * from './cached-token.js';
315
+ export * from './es256.js';
314
316
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
@@ -39,4 +39,5 @@
39
39
  * @param fn Async mapper, called with each `item` and its input `index`.
40
40
  */
41
41
  export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
42
+ export * from './single-flight.js';
42
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/concurrency/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAad"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/concurrency/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAad;AAED,cAAc,oBAAoB,CAAC"}
@@ -50,4 +50,5 @@ export async function mapWithConcurrency(items, limit, fn) {
50
50
  }));
51
51
  return results;
52
52
  }
53
+ export * from './single-flight.js';
53
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/concurrency/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,EAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,EAAE;QAC1C,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/concurrency/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,EAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,EAAE;QAC1C,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `singleFlight` / `memoizeAsync` — in-flight promise coalescing.
3
+ *
4
+ * The fleet hand-rolls this shape at least nine times: honeybook's
5
+ * `apiVersionPromise` (self-clearing memoized fetch), infinitecampus's
6
+ * `loginInFlight`, onehome's `capturePromise`, vibo's `loginInFlight` +
7
+ * `reauthInFlight`, alltrails's `ensureApiKey`/`bridgeReady`, tripadvisor's
8
+ * `bridgeReady`, artsonia's `ensureStarted`, and redfin's promise-caching
9
+ * `LocalityPoolCache`. Two primitives cover all of them:
10
+ *
11
+ * - {@link singleFlight} — one shared in-flight promise, cleared on settle
12
+ * (the login/refresh/bridge-ready guard).
13
+ * - {@link memoizeAsync} — a keyed promise cache that coalesces concurrent
14
+ * loads and evicts a rejected load so the next call retries (the keyed
15
+ * loader cache).
16
+ */
17
+ /**
18
+ * Wrap an async `fn` so concurrent calls share ONE in-flight invocation. The
19
+ * in-flight promise is cleared once it settles, so the next call starts fresh
20
+ * and a rejection doesn't poison later callers (every waiter of the failed
21
+ * flight still sees the rejection).
22
+ *
23
+ * This is the guard `createOAuth2Refresher` embeds, exposed standalone for
24
+ * login flows, bridge-start, and API-version fetches.
25
+ */
26
+ export declare function singleFlight<T>(fn: () => Promise<T>): () => Promise<T>;
27
+ /** The keyed async cache returned by {@link memoizeAsync}. */
28
+ export interface AsyncMemo<K, V> {
29
+ /** Load (or return the cached/in-flight load of) the value for `key`. */
30
+ get(key: K): Promise<V>;
31
+ /** Drop one key so the next {@link get} reloads it. */
32
+ delete(key: K): void;
33
+ /** Drop everything. */
34
+ clear(): void;
35
+ /** Number of cached (or in-flight) keys. */
36
+ readonly size: number;
37
+ }
38
+ /**
39
+ * Memoize an async `loader` by key, caching the **promise** so concurrent
40
+ * `get`s of the same key coalesce onto one load. A load that REJECTS is
41
+ * evicted as it settles — the rejection reaches every coalesced waiter, but
42
+ * the next `get` retries instead of replaying the cached failure.
43
+ *
44
+ * `delete`/`clear` cover invalidation and the `_reset*` test hooks the donor
45
+ * repos (redfin, zola) exposed by hand.
46
+ */
47
+ export declare function memoizeAsync<K, V>(loader: (key: K) => Promise<V>): AsyncMemo<K, V>;
48
+ //# sourceMappingURL=single-flight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-flight.d.ts","sourceRoot":"","sources":["../../src/concurrency/single-flight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAUtE;AAED,8DAA8D;AAC9D,MAAM,WAAW,SAAS,CAAC,CAAC,EAAE,CAAC;IAC7B,yEAAyE;IACzE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,uDAAuD;IACvD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,uBAAuB;IACvB,KAAK,IAAI,IAAI,CAAC;IACd,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAyBlF"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * `singleFlight` / `memoizeAsync` — in-flight promise coalescing.
3
+ *
4
+ * The fleet hand-rolls this shape at least nine times: honeybook's
5
+ * `apiVersionPromise` (self-clearing memoized fetch), infinitecampus's
6
+ * `loginInFlight`, onehome's `capturePromise`, vibo's `loginInFlight` +
7
+ * `reauthInFlight`, alltrails's `ensureApiKey`/`bridgeReady`, tripadvisor's
8
+ * `bridgeReady`, artsonia's `ensureStarted`, and redfin's promise-caching
9
+ * `LocalityPoolCache`. Two primitives cover all of them:
10
+ *
11
+ * - {@link singleFlight} — one shared in-flight promise, cleared on settle
12
+ * (the login/refresh/bridge-ready guard).
13
+ * - {@link memoizeAsync} — a keyed promise cache that coalesces concurrent
14
+ * loads and evicts a rejected load so the next call retries (the keyed
15
+ * loader cache).
16
+ */
17
+ /**
18
+ * Wrap an async `fn` so concurrent calls share ONE in-flight invocation. The
19
+ * in-flight promise is cleared once it settles, so the next call starts fresh
20
+ * and a rejection doesn't poison later callers (every waiter of the failed
21
+ * flight still sees the rejection).
22
+ *
23
+ * This is the guard `createOAuth2Refresher` embeds, exposed standalone for
24
+ * login flows, bridge-start, and API-version fetches.
25
+ */
26
+ export function singleFlight(fn) {
27
+ let inFlight = null;
28
+ return function run() {
29
+ if (inFlight)
30
+ return inFlight;
31
+ const p = fn().finally(() => {
32
+ if (inFlight === p)
33
+ inFlight = null;
34
+ });
35
+ inFlight = p;
36
+ return p;
37
+ };
38
+ }
39
+ /**
40
+ * Memoize an async `loader` by key, caching the **promise** so concurrent
41
+ * `get`s of the same key coalesce onto one load. A load that REJECTS is
42
+ * evicted as it settles — the rejection reaches every coalesced waiter, but
43
+ * the next `get` retries instead of replaying the cached failure.
44
+ *
45
+ * `delete`/`clear` cover invalidation and the `_reset*` test hooks the donor
46
+ * repos (redfin, zola) exposed by hand.
47
+ */
48
+ export function memoizeAsync(loader) {
49
+ const cache = new Map();
50
+ return {
51
+ get(key) {
52
+ const hit = cache.get(key);
53
+ if (hit)
54
+ return hit;
55
+ const p = loader(key);
56
+ cache.set(key, p);
57
+ // Evict a failed load so the next get() retries; guard against the slot
58
+ // having been deleted/replaced while this load was in flight.
59
+ p.catch(() => {
60
+ if (cache.get(key) === p)
61
+ cache.delete(key);
62
+ });
63
+ return p;
64
+ },
65
+ delete(key) {
66
+ cache.delete(key);
67
+ },
68
+ clear() {
69
+ cache.clear();
70
+ },
71
+ get size() {
72
+ return cache.size;
73
+ },
74
+ };
75
+ }
76
+ //# sourceMappingURL=single-flight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../../src/concurrency/single-flight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAI,EAAoB;IAClD,IAAI,QAAQ,GAAsB,IAAI,CAAC;IACvC,OAAO,SAAS,GAAG;QACjB,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,QAAQ,KAAK,CAAC;gBAAE,QAAQ,GAAG,IAAI,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,QAAQ,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAcD;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAO,MAA8B;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACvC,OAAO;QACL,GAAG,CAAC,GAAM;YACR,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;YACpB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAClB,wEAAwE;YACxE,8DAA8D;YAC9D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACX,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,CAAC,GAAM;YACX,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,KAAK;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,IAAI,IAAI;YACN,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}