@chrischall/mcp-utils 0.10.5 → 0.12.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 +124 -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 +39 -1
  35. package/dist/fetchproxy/index.d.ts.map +1 -1
  36. package/dist/fetchproxy/index.js +41 -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 +60 -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 +463 -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 +5 -1
package/README.md CHANGED
@@ -31,10 +31,11 @@ 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`) |
38
+ | `@chrischall/mcp-utils/scrape` | convenience alias for the zero-dep `scrape` module (also in the core barrel) |
38
39
  | `@chrischall/mcp-utils/test` | in-memory test harness for tool registration |
39
40
 
40
41
  ```ts
@@ -69,7 +70,13 @@ the server instance without connecting a transport.
69
70
  ### `response` — tool-result formatting
70
71
 
71
72
  `textResult` / `jsonResult` (alias), `rawTextResult`, `imageResult`,
72
- `errorResult`, `flattenJsonApi`, `deepMapStringField`.
73
+ `errorResult`, `flattenJsonApi`, `deepMapStringField`, `pruneUndefined`,
74
+ `toArray`.
75
+
76
+ `pruneUndefined(obj)` shallow-copies an object dropping `undefined`-valued keys
77
+ (the compact-projection idiom: skylight's `compact`, viator/alltrails' `prune`);
78
+ `toArray(v)` coerces `T | T[] | null | undefined` to `T[]` (the XML→JSON
79
+ single-item guard from canvas-parent / infinitecampus).
73
80
 
74
81
  ```ts
75
82
  import { textResult, errorResult, flattenJsonApi, deepMapStringField } from '@chrischall/mcp-utils';
@@ -87,7 +94,10 @@ deepMapStringField(payload, 'eventDate', dmyToIso);
87
94
  `McpToolError` and its subclasses (`SessionNotAuthenticatedError`,
88
95
  `BotWallError`, `RateLimitError`, `UnreachableError`, `ModeMismatchError`),
89
96
  plus `createHelpfulError`, `wrapToolError`, `truncateErrorMessage`,
90
- `redactSecrets`, and `messageOf`. `redactSecrets` scrubs `Bearer`/`Basic` auth
97
+ `redactSecrets`, `maskSecret`, and `messageOf`. `BotWallError` takes an optional
98
+ `{ vendor }` (e.g. `'DataDome'`) woven into the message and exposed as a field;
99
+ `maskSecret(value)` renders a `first8…last4` fingerprint for set-credential
100
+ confirmations (short values are fully hidden). `redactSecrets` scrubs `Bearer`/`Basic` auth
91
101
  headers, `Cookie`/`Set-Cookie` values (cookie names stay visible), JWTs,
92
102
  well-known API-key shapes (`sk-…`, `ghp_…`, `xox?-…`, `AIza…`, `AKIA…`,
93
103
  `whsec_…`), and secret-bearing URL query params; `truncateErrorMessage` applies
@@ -113,8 +123,13 @@ tool surface can show the user.
113
123
 
114
124
  ### `config` — hardened env/config
115
125
 
116
- `readEnvVar`, `requireEnvVar`, `parseBoolEnv`, `readPortEnv`, `expandPath`,
117
- `loadDotenvSafely`, `createCachedJsonArrayLoader`.
126
+ `readEnvVar`, `requireEnvVar`, `parseBoolEnv`, `readPortEnv`, `readIntEnv`,
127
+ `readTtlMsEnv`, `expandPath`, `loadDotenvSafely`, `createCachedJsonArrayLoader`.
128
+
129
+ `readIntEnv` is the general hardened integer reader (strict parse + optional
130
+ `min`/`max`); `readTtlMsEnv(key, defaultMs)` reads a TTL in **seconds** and
131
+ returns **milliseconds**, honoring an explicit `0` as "disabled" — the
132
+ `<SVC>_CACHE_TTL` reader shared by the response-cache consumers.
118
133
 
119
134
  ```ts
120
135
  import { requireEnvVar, parseBoolEnv, readPortEnv, expandPath } from '@chrischall/mcp-utils';
@@ -153,9 +168,17 @@ A successful parse is cached; a missing/unreadable file, invalid JSON, or a
153
168
  non-string-array logs one stderr warning and negative-caches (returns defaults
154
169
  without re-reading). Pass `readFile` to inject a reader in tests.
155
170
 
156
- ### `fs` — streaming file helpers (uploads)
171
+ ### `fs` — streaming file helpers (uploads) & binary output
172
+
173
+ `fileBlob`, `readFileHead`, `resolveOutputDir`, `uniquePath`,
174
+ `writeBinaryOutput`, `sniffMimeBytes`.
157
175
 
158
- `fileBlob`, `readFileHead`.
176
+ The binary-output kit (hoisted from gemini + flightaware) is the fleet
177
+ convention for tools that generate bytes: `resolveOutputDir(perCall,
178
+ '<SVC>_OUTPUT_DIR')` resolves arg → env → cwd (creating the dir),
179
+ `writeBinaryOutput({ dir, baseName, base64, mimeType })` writes to a
180
+ **non-overwriting** path (`name.png`, `name-2.png`, …) and returns it, and
181
+ `sniffMimeBytes` magic-byte-detects PNG/JPEG/WebP/GIF.
159
182
 
160
183
  ```ts
161
184
  import { fileBlob, readFileHead } from '@chrischall/mcp-utils';
@@ -177,9 +200,11 @@ constant memory instead of a 20 MB Buffer.
177
200
 
178
201
  `createApiClient` plus building blocks: `buildQueryString`, `buildOptionalBody`,
179
202
  `formatApiError`, `parseLinkHeader`, `parseCookieJar`, `parseCookieHeader`,
180
- `runBoundedBatch`, JWT helpers (`decodeJwtExp`, `decodeJwtSessionId`,
181
- `decodeJwtClaim`, `validateJwtExpiry`), and the `ApiError` / `UpstreamHttpError` /
182
- `UnauthorizedError` / `RateLimitedError` / `RequestTimeoutError` classes.
203
+ `runBoundedBatch`, `createThrottle`, `createResponseCache`, `parseRetryAfterMs`,
204
+ `splitHost`, `buildUserAgent`, `parseContentDispositionFilename`, JWT helpers
205
+ (`decodeJwtExp`, `decodeJwtSessionId`, `decodeJwtClaim`, `validateJwtExpiry`),
206
+ and the `ApiError` / `UpstreamHttpError` / `UnauthorizedError` /
207
+ `RateLimitedError` / `RequestTimeoutError` classes.
183
208
 
184
209
  `decodeJwtClaim(token, claim)` is the generic single-claim reader — returns the
185
210
  raw claim value (`unknown`) or `undefined` for an undecodable token / absent
@@ -203,6 +228,23 @@ const data = await api.get('/v1/things', { query: { page: 2 } });
203
228
  `RequestTimeoutError` instead of hanging the tool call. A 429 retry gets a fresh
204
229
  timeout. Omit it to keep the previous unbounded behavior.
205
230
 
231
+ `retry` also accepts `statuses` (e.g. `[429, 503]`), `honorRetryAfter: true`
232
+ (sleep the response's `Retry-After` instead of the fixed `delayMs`, bounded by
233
+ `maxRetryAfterMs`, default 30 s — hoisted from getyourguide / musicbrainz /
234
+ viator / tripadvisor), and the standalone `parseRetryAfterMs(header)` for custom
235
+ clients.
236
+
237
+ `api.fetchRaw(method, path)` is the binary path `fetchJson` can't express —
238
+ returns `{ status, contentType, headers, bytes }` with the same 401/429/error
239
+ mapping (gzip sales reports, PNG maps, attachment downloads).
240
+
241
+ `createResponseCache({ ttlMs: { dynamic, static }, maxEntries })` is the bounded
242
+ tiered-TTL response cache for billed / rate-limited reads (flightaware / viator
243
+ / tripadvisor): key on the request path (and body for POST-reads), route
244
+ reference data through the long `static` tier via
245
+ `fetchThrough(key, load, 'static')`, and pair the TTLs with `readTtlMsEnv`.
246
+ Writes are never cached.
247
+
206
248
  `parseCookieHeader(header)` parses an inbound *request* `Cookie:` header
207
249
  (`name=value; name2=value2`) into a `Record<string, string>` (first `=` splits,
208
250
  so values may contain `=`; last value wins on a duplicate name). It's the
@@ -234,10 +276,18 @@ a single hung row can't wedge the call. It always returns a full-length,
234
276
  input-ordered array. `setTimer`/`clearTimer` are injectable for tests. This
235
277
  hoists zillow's bulk-tool deadline + `pending`-backfill primitive.
236
278
 
237
- ### `concurrency` — bounded async map
279
+ ### `concurrency` — bounded async map & single-flight
238
280
 
239
- `mapWithConcurrency` — a zero-dependency bounded-fan-out map that preserves
240
- **input order**.
281
+ `mapWithConcurrency`, `singleFlight`, `memoizeAsync` — zero-dependency async
282
+ primitives.
283
+
284
+ `singleFlight(fn)` shares ONE in-flight invocation across concurrent callers
285
+ (cleared on settle; a rejection doesn't poison the next call) — the
286
+ login/refresh/bridge-ready guard hand-rolled in honeybook / infinitecampus /
287
+ onehome / vibo / alltrails / tripadvisor / artsonia. `memoizeAsync(loader)` is
288
+ the keyed variant: a promise cache that coalesces concurrent loads per key and
289
+ evicts rejected loads so the next `get` retries (redfin's `LocalityPoolCache`),
290
+ with `delete`/`clear` for invalidation and test hooks.
241
291
 
242
292
  ```ts
243
293
  import { mapWithConcurrency } from '@chrischall/mcp-utils';
@@ -256,7 +306,8 @@ plus per-item backfill rather than a plain all-or-nothing map.
256
306
 
257
307
  ### `dates` — date-format converters
258
308
 
259
- `isoToDmy`, `dmyToIso`, `isoToCompactTimestamp`. For upstreams that don't speak
309
+ `isoToDmy`, `dmyToIso`, `isoToCompactTimestamp`, `todayIso`, `toIsoDateUtc`,
310
+ `shiftIsoDate`, `ensureSeconds`. For upstreams that don't speak
260
311
  ISO 8601, so a server can keep its surface ISO (`yyyy-MM-dd`) and translate at
261
312
  the API boundary. Pair with `deepMapStringField` to normalize a date field
262
313
  across a whole response.
@@ -268,13 +319,56 @@ const apiDate = isoToDmy('2025-08-28'); // '28-08-2025' (request
268
319
  deepMapStringField(payload, 'eventDate', dmyToIso); // '28-08-2025' → '2025-08-28' (response)
269
320
  ```
270
321
 
322
+ ### `scrape` — SSR JSON-store & page extraction (zero-dep)
323
+
324
+ `decodeHtmlEntities`, `stripHtml`, `sanitizeJsLiterals`, `matchBalanced`,
325
+ `extractJsonAfterMarker`, `extractJsonLdBlocks`, `findJsonLdEntity`,
326
+ `ogContent`, `findArrayByShape`, `deepCollectArrays`, `deepFindObject`,
327
+ `isCloudflareChallenge`, `stripJsonGuard`.
328
+
329
+ Pure string/JSON primitives for server-rendered pages — no `node-html-parser`
330
+ (DOM-level scraping stays in the [`/html`](#html) subpath). Consolidates the SSR
331
+ JSON-store stack re-implemented across musescore / tock / zillow / opentable /
332
+ tripadvisor / etix:
333
+
334
+ ```ts
335
+ import {
336
+ extractJsonAfterMarker, findJsonLdEntity, ogContent,
337
+ findArrayByShape, isCloudflareChallenge, stripJsonGuard,
338
+ } from '@chrischall/mcp-utils';
339
+
340
+ // A redux/__NEXT_DATA__-style store (JS literals repaired via sanitize):
341
+ const store = extractJsonAfterMarker(html, ['window.$REDUX_STATE', '"appState"'], { sanitize: true });
342
+
343
+ // schema.org / OpenGraph readers:
344
+ const event = findJsonLdEntity(html, 'Event'); // checks blocks, @graph, mainEntity
345
+ const title = ogContent(html, 'og:title');
346
+
347
+ // Drift-tolerant array location + anti-XSSI guard stripping:
348
+ const homes = findArrayByShape(pageProps, ['savedHomesList'], (f) => !!f && typeof f === 'object');
349
+ const data = JSON.parse(stripJsonGuard(body)); // )]}' while(1); for(;;); {}&&
350
+ ```
351
+
352
+ `isCloudflareChallenge` matches the DEFINITIVE interstitial markers only
353
+ (`_cf_chl_opt`, `<title>Just a moment`) — never `cdn-cgi/challenge-platform`,
354
+ which Cloudflare inlines on cleared pages too. `decodeHtmlEntities` decodes
355
+ `&amp;` LAST so attribute-escaped JSON survives one level; `matchBalanced` is
356
+ the string/escape-aware bracket walker regex can't replace.
357
+
271
358
  ### `zod` — schema atoms
272
359
 
273
360
  Reusable schemas (`PositiveInt`, `NonNegInt`, `NonEmptyString`, `IsoDate`,
274
361
  `IsoTime`, `NumericIdString`, `SafePathSegment`, `schemaOrigin`,
275
362
  `schemaConfirm`), pagination helpers
276
363
  (`paginationSchema`, `pageSchema`, `calculateOffset`), tool-annotation builders
277
- (`toolAnnotations`), and time normalizers (`extractTime`, `normalizeTime`).
364
+ (`toolAnnotations`), time normalizers (`extractTime`, `normalizeTime`), and the
365
+ lenient response validator `parseLenient`.
366
+
367
+ `parseLenient(schema, raw, { label, context, mode? })` is the degrade-never-break
368
+ validator for reverse-engineered APIs (alltrails' `parseAllTrails`, ofw's
369
+ `parseOFW`, getyourguide's `parseGYG`): on success it returns the parsed data;
370
+ on drift it warns to **stderr** with the precise issue paths and returns the
371
+ RAW response (or throws an `McpToolError` in `mode: 'strict'` for write paths).
278
372
 
279
373
  ```ts
280
374
  import { paginationSchema, calculateOffset, toolAnnotations } from '@chrischall/mcp-utils';
@@ -292,8 +386,15 @@ injection.
292
386
  ### `auth` — auth resolver skeletons
293
387
 
294
388
  `createAuthResolver`, `resolveAuthPattern`, `sessionLoginFlow`,
295
- `createOAuth2Refresher`, and the supporting `FetchproxySession` /
296
- `AuthPattern` types.
389
+ `createOAuth2Refresher`, `createCachedTokenSource`, `signEs256Jwt`, and the
390
+ supporting `FetchproxySession` / `AuthPattern` types.
391
+
392
+ `createCachedTokenSource({ mint, bufferMs })` caches any minted token until
393
+ shortly before expiry with a single-flight mint and an `invalidate()` hook for
394
+ 401-replay — wrap it around `createOAuth2Refresher` (musicbrainz), an ES256
395
+ self-mint (app-store-connect), or a login exchange (zola). `signEs256Jwt(pem,
396
+ payload, { header: { kid } })` is the P-256/`ieee-p1363` JWS signer those
397
+ self-minted-JWT APIs need (the decode counterparts live in `http`).
297
398
 
298
399
  ```ts
299
400
  import { createAuthResolver, createOAuth2Refresher } from '@chrischall/mcp-utils';
@@ -462,6 +563,12 @@ registerBridgeHealthcheckTool({
462
563
  });
463
564
  ```
464
565
 
566
+ Two optional hooks absorb the site-specific healthchecks workday / zillow /
567
+ etix hand-rolled: `classifyThrown(err)` maps the probe's thrown error to a
568
+ custom `{ kind, hint }` (e.g. an SSO bounce → `session_expired` with re-sign-in
569
+ copy; its hint wins the result hint), and `hints` overrides the default copy
570
+ per ladder arm (`{ timeout: 'DataDome may be challenging the tab — …' }`).
571
+
465
572
  ### `html` — scraping helpers *(subpath, optional peer)*
466
573
 
467
574
  ```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"}