@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
@@ -0,0 +1,463 @@
1
+ /**
2
+ * `scrape` — zero-dependency string/JSON extraction primitives for
3
+ * server-rendered pages.
4
+ *
5
+ * Consolidates the SSR JSON-store extraction stack the fleet re-implemented at
6
+ * least five times: musescore's `store.ts` (entity recovery + string-aware
7
+ * bracket matching), tock's `redux-state.ts` (top-level slice extraction +
8
+ * JS-literal repair) and `parse.ts` (cycle-guarded deep walkers), zillow's
9
+ * `page-props.ts` (`findArrayByShape`), etix's `parse.ts` (JSON-LD / OpenGraph
10
+ * / dataLayer readers), plus the entity-decode/strip-tags helpers duplicated in
11
+ * alltrails / musescore / signupgenius and the anti-XSSI guard strippers in
12
+ * workday / canvas / redfin.
13
+ *
14
+ * Everything here is pure string/JSON work — NO `node-html-parser`. DOM-level
15
+ * scraping (tables, link lists) lives in `@chrischall/mcp-utils/html`, which
16
+ * carries that optional peer dep; this module is safe for the core barrel.
17
+ */
18
+ // ---------------------------------------------------------------------------
19
+ // Entity decoding / tag stripping
20
+ // ---------------------------------------------------------------------------
21
+ /** The named entities the fleet's scraped content actually contains. */
22
+ const NAMED_ENTITIES = {
23
+ nbsp: ' ',
24
+ lt: '<',
25
+ gt: '>',
26
+ quot: '"',
27
+ apos: "'",
28
+ };
29
+ /**
30
+ * Decode HTML character references: decimal (`&#65;`) and hex (`&#x41;`)
31
+ * numerics plus the common named entities. `&amp;` is decoded **last** so a
32
+ * double-escaped entity survives exactly one level (`&amp;lt;` → `&lt;`, not
33
+ * `<`) — the ordering both alltrails' `stripHtml` and musescore's `decodeText`
34
+ * depend on when recovering attribute-escaped JSON. Unknown entities pass
35
+ * through untouched.
36
+ */
37
+ export function decodeHtmlEntities(text) {
38
+ return text
39
+ .replace(/&#(\d+);/g, (whole, d) => codePointOr(Number(d), whole))
40
+ .replace(/&#x([0-9a-fA-F]+);/g, (whole, h) => codePointOr(parseInt(h, 16), whole))
41
+ .replace(/&(nbsp|lt|gt|quot|apos);/gi, (whole, name) => {
42
+ return NAMED_ENTITIES[name.toLowerCase()] ?? whole;
43
+ })
44
+ .replace(/&amp;/gi, '&');
45
+ }
46
+ /**
47
+ * `String.fromCodePoint` for a scraped numeric entity, but SAFE: an out-of-range
48
+ * code point (negative or > 0x10FFFF, e.g. `&#999999999999;`) throws
49
+ * `RangeError`, which on hostile input would crash the extractor — the guard
50
+ * returns the raw entity text unchanged instead, preserving the module's
51
+ * never-throw contract. (Lone surrogates, 0xD800–0xDFFF, do NOT throw and pass
52
+ * the guard; `String.fromCodePoint` yields a lone-surrogate string for them,
53
+ * which is harmless here. The `try/catch` is belt-and-suspenders.)
54
+ */
55
+ function codePointOr(code, raw) {
56
+ if (!Number.isInteger(code) || code < 0 || code > 0x10ffff)
57
+ return raw;
58
+ try {
59
+ return String.fromCodePoint(code);
60
+ }
61
+ catch {
62
+ return raw;
63
+ }
64
+ }
65
+ /**
66
+ * Strip an HTML **fragment** to readable text: tags → spaces, entities decoded
67
+ * (via {@link decodeHtmlEntities}), whitespace collapsed and trimmed.
68
+ *
69
+ * For a full document where inline `<script>`/`<style>` *content* must not leak
70
+ * into the output, use `extractPlainTextFromHtml` from
71
+ * `@chrischall/mcp-utils/html` — this fragment-level helper does not remove
72
+ * element content, only markup.
73
+ */
74
+ export function stripHtml(html) {
75
+ if (!html)
76
+ return '';
77
+ return decodeHtmlEntities(html.replace(/<[^>]+>/g, ' '))
78
+ .replace(/\s+/g, ' ')
79
+ .trim();
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Balanced-structure matching / marker extraction / JS-literal repair
83
+ // ---------------------------------------------------------------------------
84
+ const IDENT_CHAR = /[A-Za-z0-9_$]/;
85
+ /**
86
+ * Replace bare JS `undefined` literals with `null` so a scraped JS object
87
+ * literal becomes parseable JSON. String-aware: occurrences inside single- or
88
+ * double-quoted strings are left alone, as are identifiers that merely contain
89
+ * the word. Consolidates tock's `sanitizeJsLiterals`.
90
+ */
91
+ export function sanitizeJsLiterals(text) {
92
+ let out = '';
93
+ let inString = null;
94
+ let escape = false;
95
+ for (let i = 0; i < text.length; i++) {
96
+ const ch = text[i];
97
+ if (inString) {
98
+ out += ch;
99
+ if (escape)
100
+ escape = false;
101
+ else if (ch === '\\')
102
+ escape = true;
103
+ else if (ch === inString)
104
+ inString = null;
105
+ continue;
106
+ }
107
+ if (ch === '"' || ch === "'") {
108
+ inString = ch;
109
+ out += ch;
110
+ continue;
111
+ }
112
+ if (ch === 'u' &&
113
+ text.startsWith('undefined', i) &&
114
+ (i === 0 || !IDENT_CHAR.test(text[i - 1])) &&
115
+ (i + 9 >= text.length || !IDENT_CHAR.test(text[i + 9]))) {
116
+ out += 'null';
117
+ i += 8;
118
+ continue;
119
+ }
120
+ out += ch;
121
+ }
122
+ return out;
123
+ }
124
+ /**
125
+ * Given `text[start]` on a `{` or `[`, walk the balanced structure — tracking
126
+ * double- AND single-quoted strings and backslash escapes so brackets inside
127
+ * string literals don't terminate it early — and return the **exclusive** end
128
+ * index. Returns `-1` when `start` isn't on an opener or the structure never
129
+ * closes. Consolidates musescore's `matchBracket` and the brace-walk inside
130
+ * tock's `extractReduxSlice` (regex can't do this: the stores nest and escape).
131
+ */
132
+ export function matchBalanced(text, start) {
133
+ const opener = text[start];
134
+ if (opener !== '{' && opener !== '[')
135
+ return -1;
136
+ const stack = [];
137
+ let inString = null;
138
+ let escape = false;
139
+ for (let i = start; i < text.length; i++) {
140
+ const ch = text[i];
141
+ if (inString) {
142
+ if (escape)
143
+ escape = false;
144
+ else if (ch === '\\')
145
+ escape = true;
146
+ else if (ch === inString)
147
+ inString = null;
148
+ continue;
149
+ }
150
+ if (ch === '"' || ch === "'") {
151
+ inString = ch;
152
+ }
153
+ else if (ch === '{' || ch === '[') {
154
+ stack.push(ch);
155
+ }
156
+ else if (ch === '}' || ch === ']') {
157
+ const open = stack.pop();
158
+ if ((ch === '}' && open !== '{') || (ch === ']' && open !== '['))
159
+ return -1;
160
+ if (stack.length === 0)
161
+ return i + 1;
162
+ }
163
+ }
164
+ return -1;
165
+ }
166
+ /**
167
+ * Find the first of `markers` in `text`, skip to the next `{` or `[`, walk the
168
+ * balanced structure ({@link matchBalanced}), and `JSON.parse` it. Returns
169
+ * `null` on any failure — marker absent, no opener, unbalanced, or invalid
170
+ * JSON — so callers can branch without a try/catch.
171
+ *
172
+ * The array-capable, multi-marker, JS-literal-tolerant generalization of the
173
+ * `/html` subpath's `extractJsonFromHtml` (which is object-only and marker-form
174
+ * fixed). Use this for `window.$REDUX_STATE` slices (tock), `__NEXT_DATA__`
175
+ * analogues, and attribute-escaped stores (run the text through
176
+ * {@link decodeHtmlEntities} first when the blob is entity-escaped).
177
+ */
178
+ export function extractJsonAfterMarker(text, markers, opts = {}) {
179
+ const list = Array.isArray(markers) ? markers : [markers];
180
+ let idx = -1;
181
+ let markerLen = 0;
182
+ for (const m of list) {
183
+ const i = text.indexOf(m);
184
+ if (i >= 0) {
185
+ idx = i;
186
+ markerLen = m.length;
187
+ break;
188
+ }
189
+ }
190
+ if (idx < 0)
191
+ return null;
192
+ let start = idx + markerLen;
193
+ while (start < text.length && text[start] !== '{' && text[start] !== '[')
194
+ start++;
195
+ if (start >= text.length)
196
+ return null;
197
+ const end = matchBalanced(text, start);
198
+ if (end < 0)
199
+ return null;
200
+ let raw = text.slice(start, end);
201
+ if (opts.sanitize)
202
+ raw = sanitizeJsLiterals(raw);
203
+ try {
204
+ return JSON.parse(raw);
205
+ }
206
+ catch {
207
+ return null;
208
+ }
209
+ }
210
+ // ---------------------------------------------------------------------------
211
+ // JSON-LD / OpenGraph readers
212
+ // ---------------------------------------------------------------------------
213
+ const LD_JSON_ATTR_RE = /type\s*=\s*["']application\/ld\+json["']/i;
214
+ /**
215
+ * Find the next opening tag `<name` in `html` at or after `from`, respecting a
216
+ * tag-name boundary (so `<scriptish` doesn't match `<script`) and returning the
217
+ * index of the `<`, or `-1`. `lowerHtml` is the pre-lowercased haystack; `name`
218
+ * must be lowercase. Uses `indexOf` (linear) — the string primitives don't
219
+ * backtrack, unlike a `/<name\b[^>]*>/g` regex which is O(n²) across many
220
+ * openers when the closing `>` is withheld.
221
+ */
222
+ function nextTagOpen(lowerHtml, name, from) {
223
+ const needle = `<${name}`;
224
+ for (let i = lowerHtml.indexOf(needle, from); i >= 0; i = lowerHtml.indexOf(needle, i + 1)) {
225
+ const after = lowerHtml[i + needle.length];
226
+ // A real tag boundary: end, `>`, whitespace, or self-close/slash.
227
+ if (after === undefined || after === '>' || after === '/' || after === ' ' || after === '\t' || after === '\n' || after === '\r' || after === '\f') {
228
+ return i;
229
+ }
230
+ }
231
+ return -1;
232
+ }
233
+ /**
234
+ * Parse every `<script type="application/ld+json">` block in the page,
235
+ * skipping malformed ones. Returns the parsed values in document order.
236
+ * Consolidates etix's / tripadvisor's ld+json block iteration.
237
+ *
238
+ * Linear-time by construction: `indexOf`-driven tag scanning (find `<script`,
239
+ * find its `>`, find `</script>`), never a `[^>]*>` regex — the previous
240
+ * single mega-regex was O(n³) and its `[^>]*>`-per-opener replacement is still
241
+ * O(n²); string `indexOf` doesn't backtrack, so an unterminated
242
+ * `<script type="application/ld+json"` flood can't pin the event loop.
243
+ */
244
+ export function extractJsonLdBlocks(html) {
245
+ const out = [];
246
+ const lower = html.toLowerCase();
247
+ let i = 0;
248
+ for (;;) {
249
+ const open = nextTagOpen(lower, 'script', i);
250
+ if (open < 0)
251
+ break;
252
+ const tagEnd = html.indexOf('>', open);
253
+ if (tagEnd < 0)
254
+ break; // unterminated opening tag — nothing more to extract
255
+ const attrs = html.slice(open + '<script'.length, tagEnd);
256
+ const bodyStart = tagEnd + 1;
257
+ const bodyEnd = lower.indexOf('</script>', bodyStart);
258
+ if (bodyEnd < 0)
259
+ break; // no closing tag
260
+ i = bodyEnd + '</script>'.length;
261
+ if (!LD_JSON_ATTR_RE.test(attrs))
262
+ continue;
263
+ try {
264
+ out.push(JSON.parse(html.slice(bodyStart, bodyEnd).trim()));
265
+ }
266
+ catch {
267
+ // Malformed block — skip, per every donor.
268
+ }
269
+ }
270
+ return out;
271
+ }
272
+ /** True when a JSON-LD node's `@type` (string or array) includes `type`. */
273
+ function typeMatches(node, type) {
274
+ if (node === null || typeof node !== 'object')
275
+ return false;
276
+ const t = node['@type'];
277
+ return t === type || (Array.isArray(t) && t.includes(type));
278
+ }
279
+ /**
280
+ * Find the first schema.org entity of `@type === type` across the page's
281
+ * JSON-LD blocks — checking each block itself, its array items, its `@graph`
282
+ * items, and each candidate's `mainEntity` (the etix pattern: the Event often
283
+ * hides inside a `WebPage.mainEntity`). Returns the matching node, or `null`.
284
+ */
285
+ export function findJsonLdEntity(html, type) {
286
+ for (const block of extractJsonLdBlocks(html)) {
287
+ const roots = Array.isArray(block) ? block : [block];
288
+ for (const root of roots) {
289
+ if (root === null || typeof root !== 'object')
290
+ continue;
291
+ const graph = root['@graph'];
292
+ const candidates = [root, ...(Array.isArray(graph) ? graph : [])];
293
+ for (const candidate of candidates) {
294
+ if (typeMatches(candidate, type))
295
+ return candidate;
296
+ const main = candidate?.['mainEntity'];
297
+ if (typeMatches(main, type))
298
+ return main;
299
+ }
300
+ }
301
+ }
302
+ return null;
303
+ }
304
+ // These run only on a SINGLE bounded `<meta …>` tag's attribute text, so they
305
+ // carry no ReDoS risk (input is one tag, not the whole document).
306
+ const META_CONTENT_RE = /\bcontent\s*=\s*["']([^"']*)["']/i;
307
+ const META_PROP_RE = /\b(?:property|name)\s*=\s*["']([^"']*)["']/i;
308
+ /**
309
+ * Read a `<meta property="og:…" content="…">` value, tolerant of either
310
+ * attribute order (both occur in the wild — etix's `ogContent`) and of
311
+ * `name=`-keyed OpenGraph. The content is entity-decoded. Returns `undefined`
312
+ * when the property is absent.
313
+ *
314
+ * Linear-time by construction: `indexOf`-driven `<meta …>` scanning, reading
315
+ * the `property`/`content` attributes WITHIN each single (bounded) tag — never
316
+ * a `<meta\s[^>]*PROP[^>]*content…` regex, which backtracked quadratically on a
317
+ * flood of unterminated `<meta property=…` (a ReDoS on hostile scraped HTML).
318
+ */
319
+ export function ogContent(html, property) {
320
+ const want = property.toLowerCase();
321
+ const lower = html.toLowerCase();
322
+ let i = 0;
323
+ for (;;) {
324
+ const open = nextTagOpen(lower, 'meta', i);
325
+ if (open < 0)
326
+ return undefined;
327
+ const tagEnd = html.indexOf('>', open);
328
+ if (tagEnd < 0)
329
+ return undefined; // unterminated tag — nothing more to read
330
+ const attrs = html.slice(open + '<meta'.length, tagEnd);
331
+ i = tagEnd + 1;
332
+ const prop = META_PROP_RE.exec(attrs);
333
+ if (!prop || prop[1]?.toLowerCase() !== want)
334
+ continue;
335
+ const content = META_CONTENT_RE.exec(attrs);
336
+ if (content?.[1] !== undefined)
337
+ return decodeHtmlEntities(content[1]);
338
+ }
339
+ }
340
+ // ---------------------------------------------------------------------------
341
+ // Shape-directed JSON walking
342
+ // ---------------------------------------------------------------------------
343
+ /**
344
+ * Locate an array inside a drifting JSON container (a `pageProps` /
345
+ * `__NEXT_DATA__` blob): try `directKeys` first, then scan the container's
346
+ * top-level array values and return the first whose FIRST element passes
347
+ * `looksRight`. An empty array at a direct key is trusted (there is no first
348
+ * element to test). Returns `[]` on a miss — never `undefined` — so projections
349
+ * degrade to "no rows" instead of crashing when the upstream renames a key.
350
+ * Consolidates zillow's `page-props.ts#findArrayByShape`.
351
+ */
352
+ export function findArrayByShape(container, directKeys, looksRight) {
353
+ for (const key of directKeys) {
354
+ const v = container[key];
355
+ if (Array.isArray(v) && (v.length === 0 || looksRight(v[0])))
356
+ return v;
357
+ }
358
+ for (const v of Object.values(container)) {
359
+ if (Array.isArray(v) && v.length > 0 && looksRight(v[0]))
360
+ return v;
361
+ }
362
+ return [];
363
+ }
364
+ /**
365
+ * Depth-first, cycle-guarded walk collecting every array whose FIRST element
366
+ * passes `pred`. Recurses into matched arrays too (nested hits are collected).
367
+ * Consolidates tock's `collectArrays` — the "walk for the shape, don't
368
+ * hard-code the path" discipline for SSR stores.
369
+ */
370
+ export function deepCollectArrays(root, pred) {
371
+ const found = [];
372
+ const seen = new WeakSet();
373
+ const walk = (node) => {
374
+ if (node === null || typeof node !== 'object')
375
+ return;
376
+ if (seen.has(node))
377
+ return;
378
+ seen.add(node);
379
+ if (Array.isArray(node)) {
380
+ if (node.length > 0 && pred(node[0]))
381
+ found.push(node);
382
+ for (const item of node)
383
+ walk(item);
384
+ return;
385
+ }
386
+ for (const v of Object.values(node))
387
+ walk(v);
388
+ };
389
+ walk(root);
390
+ return found;
391
+ }
392
+ /**
393
+ * Depth-first, cycle-guarded search for the first non-array object passing
394
+ * `pred`. Returns `null` when nothing matches. Consolidates tock's
395
+ * `findObject`.
396
+ */
397
+ export function deepFindObject(root, pred) {
398
+ const seen = new WeakSet();
399
+ const walk = (node) => {
400
+ if (node === null || typeof node !== 'object')
401
+ return null;
402
+ if (seen.has(node))
403
+ return null;
404
+ seen.add(node);
405
+ if (Array.isArray(node)) {
406
+ for (const item of node) {
407
+ const hit = walk(item);
408
+ if (hit)
409
+ return hit;
410
+ }
411
+ return null;
412
+ }
413
+ const obj = node;
414
+ if (pred(obj))
415
+ return obj;
416
+ for (const v of Object.values(obj)) {
417
+ const hit = walk(v);
418
+ if (hit)
419
+ return hit;
420
+ }
421
+ return null;
422
+ };
423
+ return walk(root);
424
+ }
425
+ // ---------------------------------------------------------------------------
426
+ // Interstitial / guard detection
427
+ // ---------------------------------------------------------------------------
428
+ /**
429
+ * Detect a Cloudflare challenge interstitial by its DEFINITIVE markers only:
430
+ * the `_cf_chl_opt` bootstrap object or a `<title>Just a moment` page title.
431
+ * Deliberately does NOT match `cdn-cgi/challenge-platform` or
432
+ * `challenges.cloudflare.com` references — Cloudflare inlines those on CLEARED
433
+ * pages too, and matching them false-positives on legit pages (the musescore
434
+ * "search works but detail pages fail" bug). Consolidates the byte-identical
435
+ * predicates in musescore and tock.
436
+ */
437
+ export function isCloudflareChallenge(html) {
438
+ return /_cf_chl_opt/.test(html) || /<title[^>]*>\s*Just a moment/i.test(html);
439
+ }
440
+ // Known anti-XSSI guard prefixes, each anchored to the string start:
441
+ // Google-style `)]}'`, Facebook-style `for(;;);`, the classic `while(1);`,
442
+ // and redfin's stingray `{}&&`.
443
+ const GUARD_RES = [/^\)\]\}'/, /^while\s*\(\s*1\s*\)\s*;?/, /^for\s*\(\s*;;\s*\)\s*;?/, /^\{\}&&/];
444
+ /**
445
+ * Strip anti-XSSI / anti-JSON-hijacking guard prefixes from a response body so
446
+ * it parses as JSON: `)]}'`, `while(1);`, `for(;;);`, and `{}&&` (redfin's
447
+ * stingray envelope), plus surrounding whitespace, applied repeatedly until no
448
+ * guard remains. Unguarded input passes through unchanged. Consolidates
449
+ * workday's `stripJsonGuard`, canvas-parent's `while(1);` strip, and redfin's
450
+ * `stripStingrayPrefix`.
451
+ */
452
+ export function stripJsonGuard(text) {
453
+ let out = text.trimStart();
454
+ for (;;) {
455
+ const before = out;
456
+ for (const re of GUARD_RES) {
457
+ out = out.replace(re, '').trimStart();
458
+ }
459
+ if (out === before)
460
+ return out;
461
+ }
462
+ }
463
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scrape/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,GAAG;IACT,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;CACV,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzE,OAAO,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;SACzF,OAAO,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7D,OAAO,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;IACrD,CAAC,CAAC;SACD,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,GAAW;IAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC;IACvE,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SACrD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAE9E,MAAM,UAAU,GAAG,eAAe,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,QAAQ,GAAqB,IAAI,CAAC;IACtC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,IAAI,EAAE,CAAC;YACV,IAAI,MAAM;gBAAE,MAAM,GAAG,KAAK,CAAC;iBACtB,IAAI,EAAE,KAAK,IAAI;gBAAE,MAAM,GAAG,IAAI,CAAC;iBAC/B,IAAI,EAAE,KAAK,QAAQ;gBAAE,QAAQ,GAAG,IAAI,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,QAAQ,GAAG,EAAE,CAAC;YACd,GAAG,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,IACE,EAAE,KAAK,GAAG;YACV,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;YAC3C,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,EACxD,CAAC;YACD,GAAG,IAAI,MAAM,CAAC;YACd,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,GAAG,IAAI,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAqB,IAAI,CAAC;IACtC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,MAAM;gBAAE,MAAM,GAAG,KAAK,CAAC;iBACtB,IAAI,EAAE,KAAK,IAAI;gBAAE,MAAM,GAAG,IAAI,CAAC;iBAC/B,IAAI,EAAE,KAAK,QAAQ;gBAAE,QAAQ,GAAG,IAAI,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC;YAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAQD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,OAA0B,EAC1B,OAA2B,EAAE;IAE7B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,GAAG,GAAG,CAAC,CAAC;YACR,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,KAAK,GAAG,GAAG,GAAG,SAAS,CAAC;IAC5B,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;QAAE,KAAK,EAAE,CAAC;IAClF,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,QAAQ;QAAE,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,eAAe,GAAG,2CAA2C,CAAC;AAEpE;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,SAAiB,EAAE,IAAY,EAAE,IAAY;IAChE,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,kEAAkE;QAClE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnJ,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,CAAC;YAAE,MAAM;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,qDAAqD;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,CAAC,iBAAiB;QACzC,CAAC,GAAG,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAY,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4EAA4E;AAC5E,SAAS,WAAW,CAAC,IAAa,EAAE,IAAY;IAC9C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,CAAC,GAAI,IAAgC,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAY;IACzD,KAAK,MAAM,KAAK,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACxD,MAAM,KAAK,GAAI,IAAgC,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAc,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;oBAAE,OAAO,SAAS,CAAC;gBACnD,MAAM,IAAI,GAAI,SAA4C,EAAE,CAAC,YAAY,CAAC,CAAC;gBAC3E,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAC5D,MAAM,YAAY,GAAG,6CAA6C,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAgB;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC,CAAC,0CAA0C;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,IAAI;YAAE,SAAS;QACvD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAkC,EAClC,UAAoB,EACpB,UAAuC;IAEvC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAQ,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAQ,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa,EAAE,IAAiC;IAChF,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,IAAa,EAAQ,EAAE;QACnC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO;QACtD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,KAAK,MAAM,IAAI,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAa,EACb,IAA+C;IAE/C,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,IAAa,EAAkC,EAAE;QAC7D,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAC;YACtB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,qEAAqE;AACrE,2EAA2E;AAC3E,gCAAgC;AAChC,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;AAEnG;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3B,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,GAAG,CAAC;QACnB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACxC,CAAC;QACD,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -307,6 +307,28 @@ export interface CookieSessionManagerOptions<S, R = Response> {
307
307
  * (always retry) — the safe default for sites with no config/transient split.
308
308
  */
309
309
  isPermanentError?: (err: unknown) => boolean;
310
+ /**
311
+ * Proactive session TTL, in milliseconds. A session older than this (by
312
+ * login/seed time) is treated as stale: the next {@link ensure} invalidates
313
+ * and re-logs-in (single-flight — a stale burst coalesces onto ONE login).
314
+ * Omit for reactive-only expiry via {@link isExpired}. Mirrors
315
+ * infinitecampus's 5-hour `SESSION_TTL_MS` (which hand-rolled an
316
+ * `ensureFresh` wrapper for exactly this) and {@link TokenManager}'s
317
+ * proactive-refresh discipline.
318
+ */
319
+ maxAgeMs?: number;
320
+ /** Injectable clock for {@link maxAgeMs} staleness (defaults to `Date.now`) — for tests. */
321
+ now?: () => number;
322
+ /**
323
+ * Called when {@link CookieSessionManager.withSession}'s expiry-replay
324
+ * re-login FAILS — by default that failure is swallowed and the original
325
+ * expired-looking response is returned, which hides an actionable login
326
+ * error (e.g. "fetchproxy bridge down — open a signed-in tab") behind a
327
+ * generic 401. Use this hook to record the error (infinitecampus's
328
+ * `lastLoginError` bookkeeping) or `throw err` inside it to surface the
329
+ * login failure to the caller instead of the stale response.
330
+ */
331
+ onReplayLoginError?: (err: unknown) => void;
310
332
  }
311
333
  /**
312
334
  * Cookie-session analog of {@link TokenManager}: owns a site's cookie-session
@@ -352,12 +374,19 @@ export declare class CookieSessionManager<S = CookieSession, R = Response> {
352
374
  private inFlight;
353
375
  /** A cached *permanent* config error: once set, every `ensure` rethrows it. */
354
376
  private permanentError;
377
+ /** When the current session was minted (login) or installed (seed) — for maxAgeMs. */
378
+ private sessionAt;
355
379
  private readonly loginFn;
356
380
  private readonly isExpiredFn;
357
381
  private readonly isPermanentErrorFn;
382
+ private readonly maxAgeMs;
383
+ private readonly now;
384
+ private readonly onReplayLoginErrorFn;
358
385
  constructor(opts: CookieSessionManagerOptions<S, R>);
359
386
  /** The current session, or `undefined` before the first successful login. */
360
387
  get current(): S | undefined;
388
+ /** True when {@link CookieSessionManagerOptions.maxAgeMs} says the session is too old. */
389
+ private isStale;
361
390
  /**
362
391
  * Return the current session, or single-flight a login if there is none.
363
392
  *
@@ -366,8 +395,22 @@ export declare class CookieSessionManager<S = CookieSession, R = Response> {
366
395
  * the next call retries. A login error classified permanent by
367
396
  * {@link CookieSessionManagerOptions.isPermanentError} is cached and rethrown
368
397
  * on every later call; a transient error is not cached (next call retries).
398
+ * With {@link CookieSessionManagerOptions.maxAgeMs} set, a session past its
399
+ * TTL is invalidated first, so the call falls through to a (single-flight)
400
+ * re-login.
369
401
  */
370
402
  ensure(): Promise<S>;
403
+ /**
404
+ * Install an externally-minted session (e.g. infinitecampus's CUPS linked-
405
+ * district discovery, which mints sessions outside {@link
406
+ * CookieSessionManagerOptions.login}). The seed becomes the current session
407
+ * with a fresh {@link CookieSessionManagerOptions.maxAgeMs} clock, and any
408
+ * in-flight login is DETACHED: its waiters still receive its result, but a
409
+ * late resolution will not overwrite the seed. A cached permanent config
410
+ * error is left intact — the login path is still misconfigured, and the next
411
+ * post-seed re-login should keep saying so.
412
+ */
413
+ seed(session: S): void;
371
414
  /**
372
415
  * One login attempt. Self-clears `inFlight` on settle so a rejected login
373
416
  * never sticks, and stamps the resulting session only while it's still the
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAaH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,4EAA4E;AAC5E,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAErE,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,2FAA2F;IAC3F,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,QAAQ,CAAC;IACpB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAOD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;IA6B1C,uEAAuE;IACvE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAMrC,2DAA2D;IAC3D,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAK3C,wDAAwD;IACxD,UAAU,IAAI,cAAc;IAO5B,qCAAqC;IACrC,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,qCAAqC;IACrC,IAAI,IAAI,MAAM;IAId;;;;;;OAMG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;IAYrD,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAId;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAED,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,2BAA2B,GAChC,IAAI,CA8FN;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED;;;;;;;;;GASG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;gBAE3C,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAOxC,OAAO,CAAC,YAAY;IA0BpB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAe3B,6EAA6E;IAC7E,SAAS,IAAI,MAAM;IAInB,8EAA8E;IAC9E,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,UAAU;IA0BlB,6EAA6E;IAC7E,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI;IAOrB,6EAA6E;IAC7E,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAM3B,kDAAkD;IAClD,gBAAgB,IAAI,CAAC,GAAG,IAAI;IAI5B,uCAAuC;IACvC,IAAI,IAAI,CAAC,EAAE;IAIX,iFAAiF;IACjF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAa5B,gEAAgE;IAChE,YAAY,IAAI,IAAI;CAIrB;AAMD,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,QAAgB,CAAC;AAEnD,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,OAAO,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqD;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,IAAI,EAAE,mBAAmB;IAQrC,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,+EAA+E;IACzE,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAKvC,0CAA0C;IAC1C,YAAY,IAAI,MAAM;IAItB;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;CASpF;AAMD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ;IAC1D;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,oBAAoB,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ;IAC/D,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAyB;IACzC,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyC;IACrE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;gBAEnD,IAAI,EAAE,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC;IAQnD,6EAA6E;IAC7E,IAAI,OAAO,IAAI,CAAC,GAAG,SAAS,CAE3B;IAED;;;;;;;;OAQG;IACG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC;IAS1B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;;;;OAKG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;;;;;;;;;;OAaG;IACG,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAwBhE;AAED,gDAAgD;AAChD,wBAAgB,0BAA0B,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,GAAG,QAAQ,EACxE,IAAI,EAAE,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,GACtC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAE5B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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"}