@chrischall/mcp-utils 0.7.0 → 0.8.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.
@@ -9,7 +9,13 @@
9
9
  *
10
10
  * - {@link createFetchproxyTransport} wraps a `FetchproxyServer` in the
11
11
  * `start` / `close` / `status` lifecycle every MCP's transport interface
12
- * expects, with optional debug-gated role logging.
12
+ * expects, with optional debug-gated role logging, PLUS the opt-in verb
13
+ * passthroughs (`fetch` / `requestJson` / `runProbe`) that redfin / homes /
14
+ * compass / musescore had each hand-rolled over the server.
15
+ * - {@link registerBridgeHealthcheckTool} registers a `<prefix>_healthcheck`
16
+ * tool that round-trips a probe path through the bridge and surfaces the
17
+ * actionable hint ladder compass + musescore had each copied (with drifted
18
+ * internals + a hardcoded-port bug) into `src/tools/healthcheck.ts`.
13
19
  * - {@link createBootstrapOpts} assembles a multi-domain / capture-header /
14
20
  * storage-pointer declaration fragment of `FetchproxyServerOpts`, deriving
15
21
  * the required `capabilities` from the declared bootstrap so callers can't
@@ -18,6 +24,15 @@
18
24
  * The adapter shape is identical across 12+ fetchproxy MCPs; collapsing it here
19
25
  * keeps the per-row / concurrency / deadline helpers as re-exports rather than
20
26
  * re-rolled code.
27
+ *
28
+ * Lazy-import note: this whole subpath is gated behind the OPTIONAL
29
+ * `@fetchproxy/server` peer dep — a consumer only resolves it by importing
30
+ * `@chrischall/mcp-utils/fetchproxy`, never via the core barrel. The eager
31
+ * top-level import below therefore never reaches a `.mcpb` bundle that
32
+ * externalizes `@fetchproxy/server` unless that consumer actually opted into
33
+ * the bridge. Everything added here routes through that same already-imported
34
+ * `FetchproxyServer` instance (no NEW top-level `@fetchproxy/server` import),
35
+ * so the bundle-load smoke posture is unchanged.
21
36
  */
22
37
  import { FetchproxyServer, FetchproxyBridgeDownError, classifyBridgeError as classifyBridgeErrorKind, } from '@fetchproxy/server';
23
38
  import { truncateErrorMessage, messageOf } from '../errors/index.js';
@@ -70,7 +85,7 @@ function envFlagEnabled(key, env = process.env) {
70
85
  * });
71
86
  */
72
87
  export function createFetchproxyTransport(opts) {
73
- const { debugEnvVar, env, ...serverOpts } = opts;
88
+ const { debugEnvVar, env, defaultSubdomain, ...serverOpts } = opts;
74
89
  if (!serverOpts.serverName || serverOpts.serverName.trim().length === 0) {
75
90
  throw new Error('createFetchproxyTransport: `serverName` is required.');
76
91
  }
@@ -79,6 +94,15 @@ export function createFetchproxyTransport(opts) {
79
94
  }
80
95
  const server = new FetchproxyServer(serverOpts);
81
96
  const debug = debugEnvVar !== undefined && envFlagEnabled(debugEnvVar, env ?? process.env);
97
+ // Apply `defaultSubdomain` only when the call didn't override it AND a
98
+ // default exists — so an apex-served MCP (no default) sends no `subdomain`
99
+ // and a per-call override always wins.
100
+ const withSubdomain = (callOpts) => {
101
+ if (callOpts.subdomain !== undefined || defaultSubdomain === undefined) {
102
+ return callOpts;
103
+ }
104
+ return { ...callOpts, subdomain: defaultSubdomain };
105
+ };
82
106
  const transport = {
83
107
  server,
84
108
  get role() {
@@ -98,6 +122,30 @@ export function createFetchproxyTransport(opts) {
98
122
  status() {
99
123
  return server.bridgeHealth();
100
124
  },
125
+ async fetch(init) {
126
+ const response = await server.request(init.method, init.path, withSubdomain({
127
+ ...(init.headers !== undefined ? { headers: init.headers } : {}),
128
+ ...(init.body !== undefined ? { body: init.body } : {}),
129
+ ...(init.subdomain !== undefined ? { subdomain: init.subdomain } : {}),
130
+ ...(init.domain !== undefined ? { domain: init.domain } : {}),
131
+ }));
132
+ return { status: response.status, body: response.body, url: response.url };
133
+ },
134
+ async requestJson(method, path, init = {}) {
135
+ const { data, result } = await server.requestJson(method, path, withSubdomain({
136
+ ...(init.headers !== undefined ? { headers: init.headers } : {}),
137
+ ...(init.body !== undefined ? { body: init.body } : {}),
138
+ ...(init.subdomain !== undefined ? { subdomain: init.subdomain } : {}),
139
+ ...(init.domain !== undefined ? { domain: init.domain } : {}),
140
+ }));
141
+ return {
142
+ data,
143
+ result: { status: result.status, body: result.body, url: result.url },
144
+ };
145
+ },
146
+ runProbe(fetchFn, probePath) {
147
+ return server.runProbe(fetchFn, probePath);
148
+ },
101
149
  };
102
150
  return transport;
103
151
  }
@@ -200,4 +248,133 @@ export function bridgeErrorInfo(err) {
200
248
  return { type: 'unknown', message };
201
249
  }
202
250
  }
251
+ /**
252
+ * Build the actionable next-step hint from a probe outcome. Order matters:
253
+ * the specific error kinds win over the generic role-based message, because a
254
+ * `bridge_down` can fire with `role === null` (the bridge can hand back the
255
+ * SW-eviction error before `listen()` resolves a role) and the specific hint
256
+ * must beat the "never bound a role" fallback.
257
+ *
258
+ * `port` is the ACTUAL configured bridge port (from `bridgeHealth()`), NOT a
259
+ * hardcoded literal — this is the audit-bug fix both copies shared.
260
+ */
261
+ function healthcheckHint(args) {
262
+ const { hostLabel, prefix, probePath, port } = args;
263
+ if (args.ok) {
264
+ return `Bridge round-tripped ${probePath} successfully. If real tools still fail, the problem is downstream of fetchproxy (${hostLabel} redirecting on login, a bot-wall / behavioral challenge, etc.) — not the bridge.`;
265
+ }
266
+ if (args.errorKind === 'bridge_down') {
267
+ const base = `The fetchproxy browser extension's service worker is not responding. Chrome evicts extension service workers after ~30s idle by default — this looks like that case. Wake it by clicking the fetchproxy extension icon (or opening any ${hostLabel} tab and reloading), then retry. If it keeps happening, reload the extension from chrome://extensions.`;
268
+ return args.bridgeHint ? `${args.bridgeHint} ${base}` : base;
269
+ }
270
+ if (args.role === null) {
271
+ return `The bridge never bound a role. listen() may have failed silently on startup. Check stderr from ${prefix}-mcp for an error during start, and confirm port ${port} isn't blocked.`;
272
+ }
273
+ if (args.errorKind === 'timeout') {
274
+ return `Bridge is alive (role=${args.role}), but the request didn't get a response in time. Either (a) the fetchproxy browser extension isn't connected to this MCP yet — open the extension popup and check for a green dot next to "${prefix}-mcp", or (b) the signed-in ${hostLabel} tab is sleeping / closed. Open ${hostLabel} in your browser, then retry.`;
275
+ }
276
+ if (args.errorKind === 'protocol' || args.errorKind === 'http') {
277
+ return `The bridge returned a protocol error before any HTTP response. Most commonly: no ${hostLabel} tab is open, or the extension declined the request. Open ${hostLabel}, sign in, and retry.`;
278
+ }
279
+ return `Unexpected error — see the error.message field for details.`;
280
+ }
281
+ /**
282
+ * Register a `<prefix>_healthcheck` MCP tool that round-trips `probePath`
283
+ * through the bridge and reports bridge status + role + timing, plus an
284
+ * actionable hint ladder on failure.
285
+ *
286
+ * The probe loop / error classification / post-probe bridge projection all live
287
+ * in `transport.runProbe` (the `@fetchproxy/server` primitive); this factory
288
+ * owns only the tool registration, the result shape, and the hint ladder. The
289
+ * per-site bits (`prefix`, `probePath`, `hostLabel`, the probe `fetchFn`) are
290
+ * options.
291
+ *
292
+ * @example
293
+ * registerBridgeHealthcheckTool({
294
+ * server, prefix: 'compass', probePath: '/robots.txt',
295
+ * hostLabel: 'compass.com', transport,
296
+ * probeFn: (p) => client.fetchHtml(p),
297
+ * });
298
+ */
299
+ export function registerBridgeHealthcheckTool(args) {
300
+ const { server, prefix, probePath, hostLabel, transport, probeFn } = args;
301
+ const probeUrl = `https://${hostLabel}${probePath}`;
302
+ server.registerTool(`${prefix}_healthcheck`, {
303
+ title: 'Verify the fetchproxy bridge end-to-end',
304
+ description: `Round-trips a small public ${hostLabel} URL (${probePath}) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real ${hostLabel}-side problem'. Call this when a real tool fails and you want to know which hop broke. Read-only, no auth required.`,
305
+ annotations: {
306
+ title: 'Verify the fetchproxy bridge end-to-end',
307
+ readOnlyHint: true,
308
+ idempotentHint: true,
309
+ openWorldHint: true,
310
+ },
311
+ inputSchema: {},
312
+ }, async () => {
313
+ let probeBody = '';
314
+ let thrown;
315
+ const probeResult = await transport.runProbe(async (path) => {
316
+ try {
317
+ probeBody = await probeFn(path);
318
+ return probeBody;
319
+ }
320
+ catch (e) {
321
+ thrown = e;
322
+ throw e;
323
+ }
324
+ }, probePath);
325
+ const ok = probeResult.ok;
326
+ const probe = ok
327
+ ? {
328
+ url: probeUrl,
329
+ elapsed_ms: probeResult.elapsed_ms,
330
+ status: 200,
331
+ body_length: probeBody.length,
332
+ }
333
+ : { url: probeUrl, elapsed_ms: probeResult.elapsed_ms };
334
+ let error;
335
+ let bridgeHint;
336
+ if (probeResult.error) {
337
+ // `runProbe` already classified the throw into `probeResult.error.kind`
338
+ // (fetchproxy's raw vocabulary). Trust that as the discriminator —
339
+ // mapping `'other'` → `'unknown'` to match the envelope — rather than
340
+ // re-classifying a plain `{kind,message}` object. Use the typed `thrown`
341
+ // (set by our probe wrapper) only to lift the server-authored
342
+ // `FetchproxyBridgeDownError.hint`.
343
+ const kind = probeResult.error.kind === 'other' ? 'unknown' : probeResult.error.kind;
344
+ bridgeHint =
345
+ thrown instanceof FetchproxyBridgeDownError ? thrown.hint : undefined;
346
+ error = {
347
+ kind,
348
+ message: probeResult.error.message,
349
+ ...(bridgeHint !== undefined ? { bridge_hint: bridgeHint } : {}),
350
+ };
351
+ }
352
+ // The post-probe bridge projection omits `lastExtensionMessageAt`; read it
353
+ // off the live status snapshot (same call, so it's current).
354
+ const lastExtensionMessageAt = transport.status().lastExtensionMessageAt;
355
+ const result = {
356
+ ok,
357
+ bridge: {
358
+ ...probeResult.bridge,
359
+ last_extension_message_at: lastExtensionMessageAt,
360
+ },
361
+ probe,
362
+ ...(error ? { error } : {}),
363
+ hint: healthcheckHint({
364
+ ok,
365
+ role: probeResult.bridge.role,
366
+ // FIX: the real configured port from bridgeHealth(), not a literal 37149.
367
+ port: probeResult.bridge.port,
368
+ hostLabel,
369
+ prefix,
370
+ probePath,
371
+ errorKind: error?.kind,
372
+ bridgeHint: error?.kind === 'bridge_down' ? bridgeHint : undefined,
373
+ }),
374
+ };
375
+ return {
376
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
377
+ };
378
+ });
379
+ }
203
380
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchproxy/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchproxy/index.ts"],"names":[],"mappings":"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"}
@@ -161,6 +161,22 @@ export declare class ApiError extends Error {
161
161
  readonly status: number;
162
162
  constructor(status: number, message: string);
163
163
  }
164
+ /**
165
+ * A status-carrying HTTP error consumers can `throw new` directly — the
166
+ * directly-constructible parallel to {@link ApiError} (which is only thrown
167
+ * *inside* {@link createApiClient}). Extends {@link ApiError} so the same
168
+ * `err instanceof ApiError && err.status === 404` branch works for both, while
169
+ * its own name/`instanceof UpstreamHttpError` distinguishes the manual throws.
170
+ *
171
+ * Consolidates opentable's local `HttpError` and musescore's
172
+ * `MusescoreHttpError` — structural twins (status-carrying, thrown from a
173
+ * transport/bridge code path that doesn't go through `createApiClient`, used to
174
+ * branch on a 404 fallback). Repos that DO route through `createApiClient`
175
+ * already get {@link ApiError} for free and don't need this.
176
+ */
177
+ export declare class UpstreamHttpError extends ApiError {
178
+ constructor(status: number, message: string);
179
+ }
164
180
  /**
165
181
  * Build a bearer-auth fetch client with one-shot 429 retry, 401 mapping, 204 /
166
182
  * empty-body handling, and redacted error formatting.
@@ -257,6 +273,27 @@ export interface ParsedCookieJar {
257
273
  * Consolidates the IC/signupgenius cookie-jar logic.
258
274
  */
259
275
  export declare function parseCookieJar(setCookieHeaders: string[] | string | null | undefined): ParsedCookieJar;
276
+ /**
277
+ * Parse a *request* `Cookie:` header (`name=value; name2=value2`) into a
278
+ * name→value map. This is the inbound counterpart to {@link parseCookieJar},
279
+ * which parses *response* `Set-Cookie` headers (with their attributes and
280
+ * deletion semantics) — a `Cookie` header has no attributes, just pairs.
281
+ *
282
+ * Semantics (matching creditkarma's hand-rolled `extractCookieValue` ×3):
283
+ * - splits on `;`, then on the FIRST `=` only, so a value containing `=`
284
+ * (e.g. base64 padding `ab==`, or `x=y=z`) is preserved verbatim,
285
+ * - trims surrounding whitespace from both name and value,
286
+ * - skips fragments with no `=` (bare attributes) or an empty name (`=v`),
287
+ * - keeps an empty value when the name is present (`a=` → `{ a: '' }`),
288
+ * - on a duplicate name, the last value wins.
289
+ *
290
+ * A missing / empty / whitespace-only header yields `{}`.
291
+ *
292
+ * Consolidates creditkarma's `extractCookieValue` (single-name lookup ×3) and
293
+ * the cookie-header pattern-matching in two other repos: `extractCookieValue(h,
294
+ * name)` is `parseCookieHeader(h)[name] ?? null`.
295
+ */
296
+ export declare function parseCookieHeader(header: string): Record<string, string>;
260
297
  /**
261
298
  * Anything {@link CookieJar.absorb} can read `Set-Cookie`s from: the array from
262
299
  * `Headers.getSetCookie()`, a single (possibly comma-joined) header string, or
@@ -304,6 +341,17 @@ export declare function decodeJwtExp(token: string): number;
304
341
  * header.
305
342
  */
306
343
  export declare function decodeJwtSessionId(token: string): string | null;
344
+ /**
345
+ * Generic single-claim extractor for a JWT payload. Returns the raw claim
346
+ * value (`unknown` — cast or narrow at the call site), or `undefined` for an
347
+ * undecodable token or an absent claim. Never throws.
348
+ *
349
+ * Generalizes the hand-rolled per-claim readers across the fleet (e.g.
350
+ * creditkarma's `extractGlidFromJwt`): `decodeJwtClaim(token, 'glid')` instead
351
+ * of a bespoke decode + payload-field pluck. Reuses the same base64url payload
352
+ * decode as {@link decodeJwtExp} / {@link decodeJwtSessionId}.
353
+ */
354
+ export declare function decodeJwtClaim(token: string, claim: string): unknown;
307
355
  /** Result of {@link validateJwtExpiry}. */
308
356
  export interface JwtExpiryStatus {
309
357
  /** True when the token is past its `exp` (or undecodable / lacks `exp`). */
@@ -323,4 +371,61 @@ export interface JwtExpiryStatus {
323
371
  * reporting `expired: false`, so callers can refresh proactively.
324
372
  */
325
373
  export declare function validateJwtExpiry(token: string, nowMs?: number): JwtExpiryStatus;
374
+ /** Options for {@link runBoundedBatch}. */
375
+ export interface RunBoundedBatchOptions<T, R> {
376
+ /**
377
+ * Overall hard deadline for the WHOLE batch, in milliseconds. When it fires,
378
+ * any item that hasn't settled is filled by {@link onTimeout} and the batch
379
+ * returns immediately — unsettled workers are abandoned (left to settle in
380
+ * the background, never awaited), so a permanently-hung item can't wedge the
381
+ * call past this bound.
382
+ */
383
+ deadlineMs: number;
384
+ /**
385
+ * Backfill for an item the deadline cut off before it settled. Receives the
386
+ * original `item` and its `index` so the placeholder stays identifiable and
387
+ * re-runnable (the zillow `pending`-row pattern). Called only for unsettled
388
+ * slots.
389
+ */
390
+ onTimeout: (item: T, index: number) => R;
391
+ /**
392
+ * Backfill for an item whose `worker` REJECTED (threw). A worker error is
393
+ * isolated to its own slot — it never rejects the batch or cascades onto
394
+ * other items. Defaults to `onTimeout(item, index)` (a rejected worker is
395
+ * treated like a timeout) so a caller that doesn't care needn't distinguish;
396
+ * supply `onError` to tell a genuine failure apart from a deadline cutoff.
397
+ */
398
+ onError?: (item: T, index: number, err: unknown) => R;
399
+ /**
400
+ * Max workers in flight at once. Defaults to unbounded (all items started
401
+ * immediately). Use it to bound fan-out against a rate-limited upstream.
402
+ */
403
+ concurrency?: number;
404
+ /**
405
+ * Injectable timer (for tests). Defaults to `setTimeout`. Must invoke `cb`
406
+ * after roughly `ms`, returning a handle passed to {@link clearTimer}.
407
+ */
408
+ setTimer?: (ms: number, cb: () => void) => unknown;
409
+ /** Injectable clear paired with {@link setTimer}. Defaults to `clearTimeout`. */
410
+ clearTimer?: (handle: unknown) => void;
411
+ }
412
+ /**
413
+ * Run `worker` over `items` with an overall hard deadline and a per-item
414
+ * timeout-backfill, returning a full-length, input-ordered array with exactly
415
+ * one result per item.
416
+ *
417
+ * Each item gets an index-addressable slot. Work is raced against `deadlineMs`;
418
+ * when the deadline fires first, every still-unsettled slot is filled by
419
+ * `onTimeout(item, index)` and the batch resolves immediately — the in-flight
420
+ * workers are abandoned (and signalled via their `AbortSignal`) rather than
421
+ * awaited, so a single hung row can't keep the whole call (and the MCP request
422
+ * deadline behind it) pinned open. When everything settles before the deadline,
423
+ * the timer is cleared and every slot holds its real result.
424
+ *
425
+ * Generalises zillow's bulk-tool `runWithDeadline` (`zillow_bulk_get` /
426
+ * `zillow_resolve_addresses`, issues #98/#78): the slot-array + overall-deadline
427
+ * + `pending`-backfill shape, now with the worker + concurrency folded in and an
428
+ * injectable timer for deterministic tests.
429
+ */
430
+ export declare function runBoundedBatch<T, R>(items: T[], worker: (item: T, signal?: AbortSignal) => Promise<R>, opts: RunBoundedBatchOptions<T, R>): Promise<R[]>;
326
431
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,cAAc,eAAe,CAAC;AAM9B,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,2CAA2C;AAC3C;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,KAAK,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC;IAC5B,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,SAAS,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5F,yFAAyF;IACzF,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrF;AAMD,uFAAuF;AACvF,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,OAAO;gBACV,OAAO,EAAE,MAAM;CAK5B;AAED,sEAAsE;AACtE,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,MAAM,OAAO;gBACV,OAAO,EAAE,MAAM;CAK5B;AAED,sEAAsE;AACtE,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAM/C;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAM5C;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CA6GjE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAcxE;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EACpF,IAAI,EAAE,CAAC,EACP,cAAc,EAAE,SAAS,CAAC,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAQrB;AAMD,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,qBAA0B,GAC/B,MAAM,CAKR;AAMD,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAQnF;AAMD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,oFAAoF;IACpF,YAAY,EAAE,MAAM,CAAC;CACtB;AAoCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,CAetG;AAED;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,EAAE,GACR,MAAM,GACN,IAAI,GACJ,SAAS,GACT;IAAE,YAAY,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAYxE;;;;;;;;;;;;GAYG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,8EAA8E;IAC9E,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAazC,yEAAyE;IACzE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIrC,4EAA4E;IAC5E,MAAM,IAAI,MAAM;IAIhB,8CAA8C;IAC9C,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AA8BD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAmB,GAAG,eAAe,CAmB5F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,26 @@ export class ApiError extends Error {
66
66
  Object.setPrototypeOf(this, new.target.prototype);
67
67
  }
68
68
  }
69
+ /**
70
+ * A status-carrying HTTP error consumers can `throw new` directly — the
71
+ * directly-constructible parallel to {@link ApiError} (which is only thrown
72
+ * *inside* {@link createApiClient}). Extends {@link ApiError} so the same
73
+ * `err instanceof ApiError && err.status === 404` branch works for both, while
74
+ * its own name/`instanceof UpstreamHttpError` distinguishes the manual throws.
75
+ *
76
+ * Consolidates opentable's local `HttpError` and musescore's
77
+ * `MusescoreHttpError` — structural twins (status-carrying, thrown from a
78
+ * transport/bridge code path that doesn't go through `createApiClient`, used to
79
+ * branch on a 404 fallback). Repos that DO route through `createApiClient`
80
+ * already get {@link ApiError} for free and don't need this.
81
+ */
82
+ export class UpstreamHttpError extends ApiError {
83
+ constructor(status, message) {
84
+ super(status, message);
85
+ this.name = 'UpstreamHttpError';
86
+ Object.setPrototypeOf(this, new.target.prototype);
87
+ }
88
+ }
69
89
  function hostOf(baseUrl) {
70
90
  try {
71
91
  return new URL(baseUrl).host;
@@ -336,6 +356,44 @@ export function parseCookieJar(setCookieHeaders) {
336
356
  const cookieHeader = [...jar.entries()].map(([k, v]) => `${k}=${v}`).join('; ');
337
357
  return { cookies, cookieHeader };
338
358
  }
359
+ // ---------------------------------------------------------------------------
360
+ // parseCookieHeader
361
+ // ---------------------------------------------------------------------------
362
+ /**
363
+ * Parse a *request* `Cookie:` header (`name=value; name2=value2`) into a
364
+ * name→value map. This is the inbound counterpart to {@link parseCookieJar},
365
+ * which parses *response* `Set-Cookie` headers (with their attributes and
366
+ * deletion semantics) — a `Cookie` header has no attributes, just pairs.
367
+ *
368
+ * Semantics (matching creditkarma's hand-rolled `extractCookieValue` ×3):
369
+ * - splits on `;`, then on the FIRST `=` only, so a value containing `=`
370
+ * (e.g. base64 padding `ab==`, or `x=y=z`) is preserved verbatim,
371
+ * - trims surrounding whitespace from both name and value,
372
+ * - skips fragments with no `=` (bare attributes) or an empty name (`=v`),
373
+ * - keeps an empty value when the name is present (`a=` → `{ a: '' }`),
374
+ * - on a duplicate name, the last value wins.
375
+ *
376
+ * A missing / empty / whitespace-only header yields `{}`.
377
+ *
378
+ * Consolidates creditkarma's `extractCookieValue` (single-name lookup ×3) and
379
+ * the cookie-header pattern-matching in two other repos: `extractCookieValue(h,
380
+ * name)` is `parseCookieHeader(h)[name] ?? null`.
381
+ */
382
+ export function parseCookieHeader(header) {
383
+ const out = {};
384
+ if (!header)
385
+ return out;
386
+ for (const part of header.split(';')) {
387
+ const eqIdx = part.indexOf('=');
388
+ if (eqIdx < 0)
389
+ continue; // bare attribute fragment, no `=`
390
+ const name = part.slice(0, eqIdx).trim();
391
+ if (name === '')
392
+ continue; // missing name (leading `=`)
393
+ out[name] = part.slice(eqIdx + 1).trim();
394
+ }
395
+ return out;
396
+ }
339
397
  /** Normalize a {@link SetCookieSource} to individual `Set-Cookie` strings. */
340
398
  function setCookieEntries(source) {
341
399
  if (source == null)
@@ -450,6 +508,22 @@ export function decodeJwtSessionId(token) {
450
508
  const sid = payload['session_id'] ?? payload['sid'];
451
509
  return typeof sid === 'string' ? sid : null;
452
510
  }
511
+ /**
512
+ * Generic single-claim extractor for a JWT payload. Returns the raw claim
513
+ * value (`unknown` — cast or narrow at the call site), or `undefined` for an
514
+ * undecodable token or an absent claim. Never throws.
515
+ *
516
+ * Generalizes the hand-rolled per-claim readers across the fleet (e.g.
517
+ * creditkarma's `extractGlidFromJwt`): `decodeJwtClaim(token, 'glid')` instead
518
+ * of a bespoke decode + payload-field pluck. Reuses the same base64url payload
519
+ * decode as {@link decodeJwtExp} / {@link decodeJwtSessionId}.
520
+ */
521
+ export function decodeJwtClaim(token, claim) {
522
+ const payload = decodeJwtPayload(token);
523
+ if (!payload)
524
+ return undefined;
525
+ return payload[claim];
526
+ }
453
527
  /** Tokens within this many seconds of `exp` are flagged as near-expiry. */
454
528
  const NEAR_EXPIRY_SKEW_SEC = 300;
455
529
  /**
@@ -481,4 +555,88 @@ export function validateJwtExpiry(token, nowMs = Date.now()) {
481
555
  }
482
556
  return { expired: false, expiresIn };
483
557
  }
558
+ /**
559
+ * Run `worker` over `items` with an overall hard deadline and a per-item
560
+ * timeout-backfill, returning a full-length, input-ordered array with exactly
561
+ * one result per item.
562
+ *
563
+ * Each item gets an index-addressable slot. Work is raced against `deadlineMs`;
564
+ * when the deadline fires first, every still-unsettled slot is filled by
565
+ * `onTimeout(item, index)` and the batch resolves immediately — the in-flight
566
+ * workers are abandoned (and signalled via their `AbortSignal`) rather than
567
+ * awaited, so a single hung row can't keep the whole call (and the MCP request
568
+ * deadline behind it) pinned open. When everything settles before the deadline,
569
+ * the timer is cleared and every slot holds its real result.
570
+ *
571
+ * Generalises zillow's bulk-tool `runWithDeadline` (`zillow_bulk_get` /
572
+ * `zillow_resolve_addresses`, issues #98/#78): the slot-array + overall-deadline
573
+ * + `pending`-backfill shape, now with the worker + concurrency folded in and an
574
+ * injectable timer for deterministic tests.
575
+ */
576
+ export function runBoundedBatch(items, worker, opts) {
577
+ const slots = Array.from({ length: items.length });
578
+ const settled = new Array(items.length).fill(false);
579
+ // An item whose worker threw: backfilled via onError (default onTimeout) at
580
+ // finish, distinct from a slot the deadline simply never reached.
581
+ const errored = new Array(items.length).fill(false);
582
+ const errorVals = new Array(items.length);
583
+ // Nothing to do — never arm a timer for an empty batch.
584
+ if (items.length === 0)
585
+ return Promise.resolve([]);
586
+ const setTimer = opts.setTimer ?? ((ms, cb) => setTimeout(cb, ms));
587
+ const clearTimer = opts.clearTimer ?? ((h) => clearTimeout(h));
588
+ const controller = new AbortController();
589
+ // Bounded fan-out: a pool of `limit` runners pulling the next index off a
590
+ // shared cursor. limit >= items.length (or unset) means "all at once".
591
+ const limit = opts.concurrency && opts.concurrency > 0
592
+ ? Math.min(opts.concurrency, items.length)
593
+ : items.length;
594
+ const runAll = async () => {
595
+ let cursor = 0;
596
+ const runner = async () => {
597
+ for (;;) {
598
+ const index = cursor;
599
+ cursor += 1;
600
+ if (index >= items.length)
601
+ return;
602
+ // Isolate a worker rejection to its own slot: record it and continue
603
+ // pulling the next item, so one bad row neither rejects the batch nor
604
+ // strands the items this runner hasn't reached yet.
605
+ try {
606
+ slots[index] = await worker(items[index], controller.signal);
607
+ settled[index] = true;
608
+ }
609
+ catch (err) {
610
+ errored[index] = true;
611
+ errorVals[index] = err;
612
+ }
613
+ }
614
+ };
615
+ await Promise.all(Array.from({ length: limit }, () => runner()));
616
+ };
617
+ return new Promise((resolve) => {
618
+ let done = false;
619
+ const finish = () => {
620
+ if (done)
621
+ return;
622
+ done = true;
623
+ clearTimer(handle);
624
+ // Signal abandoned workers so a cooperative worker can stop early.
625
+ if (!controller.signal.aborted)
626
+ controller.abort();
627
+ const onError = opts.onError ?? ((item, index) => opts.onTimeout(item, index));
628
+ resolve(items.map((item, index) => {
629
+ if (settled[index])
630
+ return slots[index];
631
+ if (errored[index])
632
+ return onError(item, index, errorVals[index]);
633
+ return opts.onTimeout(item, index);
634
+ }));
635
+ };
636
+ const handle = setTimer(opts.deadlineMs, finish);
637
+ // Abandon (never await) the fan-out on the deadline path; on full settle,
638
+ // finish() clears the timer and returns the real results.
639
+ void runAll().then(finish, finish);
640
+ });
641
+ }
484
642
  //# sourceMappingURL=index.js.map