@agentsean/crawler 1.0.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 (70) hide show
  1. package/LICENSE +661 -0
  2. package/dist/adaptive.d.ts +9 -0
  3. package/dist/adaptive.d.ts.map +1 -0
  4. package/dist/adaptive.js +43 -0
  5. package/dist/adaptive.js.map +1 -0
  6. package/dist/crawl.d.ts +4 -0
  7. package/dist/crawl.d.ts.map +1 -0
  8. package/dist/crawl.js +348 -0
  9. package/dist/crawl.js.map +1 -0
  10. package/dist/decode.d.ts +7 -0
  11. package/dist/decode.d.ts.map +1 -0
  12. package/dist/decode.js +53 -0
  13. package/dist/decode.js.map +1 -0
  14. package/dist/extract.d.ts +4 -0
  15. package/dist/extract.d.ts.map +1 -0
  16. package/dist/extract.js +268 -0
  17. package/dist/extract.js.map +1 -0
  18. package/dist/hash.d.ts +4 -0
  19. package/dist/hash.d.ts.map +1 -0
  20. package/dist/hash.js +11 -0
  21. package/dist/hash.js.map +1 -0
  22. package/dist/http.d.ts +38 -0
  23. package/dist/http.d.ts.map +1 -0
  24. package/dist/http.js +207 -0
  25. package/dist/http.js.map +1 -0
  26. package/dist/index.d.ts +14 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +13 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/persist.d.ts +20 -0
  31. package/dist/persist.d.ts.map +1 -0
  32. package/dist/persist.js +186 -0
  33. package/dist/persist.js.map +1 -0
  34. package/dist/probe.d.ts +4 -0
  35. package/dist/probe.d.ts.map +1 -0
  36. package/dist/probe.js +132 -0
  37. package/dist/probe.js.map +1 -0
  38. package/dist/readability.d.ts +9 -0
  39. package/dist/readability.d.ts.map +1 -0
  40. package/dist/readability.js +60 -0
  41. package/dist/readability.js.map +1 -0
  42. package/dist/render.d.ts +15 -0
  43. package/dist/render.d.ts.map +1 -0
  44. package/dist/render.js +87 -0
  45. package/dist/render.js.map +1 -0
  46. package/dist/robots.d.ts +13 -0
  47. package/dist/robots.d.ts.map +1 -0
  48. package/dist/robots.js +187 -0
  49. package/dist/robots.js.map +1 -0
  50. package/dist/simhash.d.ts +9 -0
  51. package/dist/simhash.d.ts.map +1 -0
  52. package/dist/simhash.js +58 -0
  53. package/dist/simhash.js.map +1 -0
  54. package/dist/sitemap.d.ts +3 -0
  55. package/dist/sitemap.d.ts.map +1 -0
  56. package/dist/sitemap.js +165 -0
  57. package/dist/sitemap.js.map +1 -0
  58. package/dist/types.d.ts +251 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/ua.d.ts +3 -0
  63. package/dist/ua.d.ts.map +1 -0
  64. package/dist/ua.js +3 -0
  65. package/dist/ua.js.map +1 -0
  66. package/dist/url.d.ts +11 -0
  67. package/dist/url.d.ts.map +1 -0
  68. package/dist/url.js +114 -0
  69. package/dist/url.js.map +1 -0
  70. package/package.json +60 -0
@@ -0,0 +1,268 @@
1
+ import { load } from "cheerio";
2
+ import { parseDocument } from "htmlparser2";
3
+ import { extractMainContent, loremIpsumIn, words } from "./readability.js";
4
+ import { absolutize, originOf, sameOrigin } from "./url.js";
5
+ const BODY_FORCING = /<(?:img|div|iframe|p|table|h[1-6]|section|article|header|footer)\b/i;
6
+ export function extractPage(html, pageUrl, headerCanonical = [], xRobots = null) {
7
+ const dom = parseDocument(html);
8
+ const $ = load(dom);
9
+ const origin = originOf(pageUrl);
10
+ const titles = $("title")
11
+ .toArray()
12
+ .map((el) => $(el).text().trim())
13
+ .filter(Boolean);
14
+ const titleInHead = $("head title").length > 0;
15
+ const metaDescs = $('meta[name="description" i]')
16
+ .toArray()
17
+ .map((el) => $(el).attr("content")?.trim() ?? "")
18
+ .filter(Boolean);
19
+ const metaDescInHead = $('head meta[name="description" i]').length > 0;
20
+ const headings = $("h1,h2,h3,h4,h5,h6")
21
+ .toArray()
22
+ .map((el) => ({
23
+ level: Number(el.tagName.slice(1)),
24
+ text: $(el).text().replace(/\s+/g, " ").trim(),
25
+ }));
26
+ const canonicalHtml = $('link[rel="canonical" i]')
27
+ .toArray()
28
+ .map((el) => $(el).attr("href")?.trim() ?? "")
29
+ .filter(Boolean);
30
+ const canonicalInHead = $('head link[rel="canonical" i]').length > 0;
31
+ const canonicalOutsideHead = $('link[rel="canonical" i]').length > 0 && !canonicalInHead;
32
+ const robotsMeta = $('meta[name="robots" i], meta[name="googlebot" i]')
33
+ .toArray()
34
+ .map((el) => $(el).attr("content")?.trim() ?? "")
35
+ .filter(Boolean);
36
+ const robotsMetaInHead = $('head meta[name="robots" i], head meta[name="googlebot" i]').length > 0;
37
+ const hreflang = $('link[rel="alternate" i][hreflang]')
38
+ .toArray()
39
+ .map((el) => {
40
+ const href = $(el).attr("href")?.trim() ?? "";
41
+ const lang = $(el).attr("hreflang")?.trim() ?? "";
42
+ const inHead = $(el).parents("head").length > 0;
43
+ return {
44
+ lang,
45
+ href,
46
+ absUrl: absolutize(href, pageUrl) ?? href,
47
+ inHead,
48
+ source: inHead ? "head" : "body",
49
+ };
50
+ });
51
+ const jsonLd = $('script[type="application/ld+json"]')
52
+ .toArray()
53
+ .map((el) => {
54
+ const raw = $(el).text();
55
+ const inHead = $(el).parents("head").length > 0;
56
+ try {
57
+ return { raw, parsed: JSON.parse(raw), error: null, inHead };
58
+ }
59
+ catch (e) {
60
+ return {
61
+ raw,
62
+ parsed: null,
63
+ error: e instanceof Error ? e.message : "invalid json",
64
+ inHead,
65
+ };
66
+ }
67
+ });
68
+ const openGraph = {};
69
+ $('meta[property^="og:"]').each((_, el) => {
70
+ const prop = $(el).attr("property");
71
+ const content = $(el).attr("content");
72
+ if (prop && content)
73
+ openGraph[prop] = content;
74
+ });
75
+ const twitterCard = {};
76
+ $('meta[name^="twitter:"]').each((_, el) => {
77
+ const name = $(el).attr("name");
78
+ const content = $(el).attr("content");
79
+ if (name && content)
80
+ twitterCard[name] = content;
81
+ });
82
+ const links = extractLinks($, pageUrl, origin);
83
+ const images = extractImages($, pageUrl);
84
+ const scripts = $("script")
85
+ .toArray()
86
+ .map((el) => {
87
+ const src = $(el).attr("src") ?? null;
88
+ return {
89
+ src,
90
+ absUrl: src ? absolutize(src, pageUrl) : null,
91
+ async: $(el).attr("async") !== undefined,
92
+ defer: $(el).attr("defer") !== undefined,
93
+ };
94
+ });
95
+ const stylesheets = $('link[rel="stylesheet" i]')
96
+ .toArray()
97
+ .map((el) => {
98
+ const href = $(el).attr("href") ?? null;
99
+ return { href, absUrl: href ? absolutize(href, pageUrl) : null };
100
+ });
101
+ const allText = $("body").text().replace(/\s+/g, " ").trim();
102
+ const main = extractMainContent(html, titles[0] ?? "");
103
+ const boilerplateRatio = allText.length === 0 ? 1 : 1 - Math.min(1, main.text.length / allText.length);
104
+ const forms = $("form")
105
+ .toArray()
106
+ .map((el) => {
107
+ const action = $(el).attr("action") ?? "";
108
+ return { action, absAction: absolutize(action || pageUrl, pageUrl) ?? action };
109
+ });
110
+ const mixedActive = [];
111
+ const mixedPassive = [];
112
+ if (pageUrl.startsWith("https:")) {
113
+ $("script[src], link[rel='stylesheet'][href], iframe[src]").each((_, el) => {
114
+ const v = $(el).attr("src") ?? $(el).attr("href") ?? "";
115
+ if (v.startsWith("http://"))
116
+ mixedActive.push(v);
117
+ });
118
+ $("img[src], video[src], audio[src]").each((_, el) => {
119
+ const v = $(el).attr("src") ?? "";
120
+ if (v.startsWith("http://"))
121
+ mixedPassive.push(v);
122
+ });
123
+ }
124
+ let unsafeTargetBlanks = 0;
125
+ $("a[target='_blank']").each((_, el) => {
126
+ const rel = ($(el).attr("rel") ?? "").toLowerCase();
127
+ if (!rel.includes("noopener") && !rel.includes("noreferrer"))
128
+ unsafeTargetBlanks++;
129
+ });
130
+ const next = $('link[rel="next" i]').attr("href") ?? null;
131
+ const prev = $('link[rel="prev" i]').attr("href") ?? null;
132
+ const charset = $("meta[charset]").attr("charset") ??
133
+ $('meta[http-equiv="content-type" i]').attr("content") ??
134
+ null;
135
+ const first1024 = html.slice(0, 1024);
136
+ const charsetInFirst1024 = /<meta[^>]+charset/i.test(first1024);
137
+ const spaRootEmpty = /<(?:div|app-root)[^>]+\b(?:id=["'](?:root|app|__next)["']|data-reactroot|ng-version)/i.test(html) && main.wordCount < 30;
138
+ return {
139
+ title: titles[0] ?? null,
140
+ titles,
141
+ titleInHead,
142
+ metaDescription: metaDescs[0] ?? null,
143
+ metaDescriptions: metaDescs,
144
+ metaDescInHead,
145
+ h1: headings.filter((h) => h.level === 1).map((h) => h.text),
146
+ h2: headings.filter((h) => h.level === 2).map((h) => h.text),
147
+ headings,
148
+ canonicalHtml,
149
+ canonicalHeader: headerCanonical,
150
+ canonicalInHead,
151
+ canonicalOutsideHead,
152
+ headBrokenEarly: detectHeadBroken(html),
153
+ robotsMeta,
154
+ robotsMetaInHead,
155
+ xRobotsTag: xRobots,
156
+ viewport: $('meta[name="viewport" i]').attr("content") ?? null,
157
+ lang: $("html").attr("lang") ?? null,
158
+ charset,
159
+ charsetInFirst1024,
160
+ hreflang,
161
+ jsonLd,
162
+ openGraph,
163
+ twitterCard,
164
+ links,
165
+ images,
166
+ scripts,
167
+ stylesheets,
168
+ wordCount: words(allText),
169
+ mainWordCount: main.wordCount,
170
+ mainText: main.text,
171
+ allText,
172
+ boilerplateRatio,
173
+ metaRefresh: $('meta[http-equiv="refresh" i]').attr("content") ?? null,
174
+ hasNoscriptJsWarning: /please enable javascript|enable js/i.test($("noscript").text()),
175
+ spaRootEmpty,
176
+ hashFragmentMeta: $('meta[name="fragment"]').attr("content") === "!",
177
+ forms,
178
+ mixedActive,
179
+ mixedPassive,
180
+ unsafeTargetBlanks,
181
+ plugins: $("object, embed").length > 0,
182
+ loremIpsum: loremIpsumIn(allText) || loremIpsumIn(main.text),
183
+ paginationRel: {
184
+ next: next ? (absolutize(next, pageUrl) ?? next) : null,
185
+ prev: prev ? (absolutize(prev, pageUrl) ?? prev) : null,
186
+ },
187
+ htmlLang: $("html").attr("lang") ?? null,
188
+ };
189
+ }
190
+ function detectHeadBroken(html) {
191
+ const m = html.match(/<head\b[^>]*>([\s\S]*?)<\/head>/i);
192
+ const head = m?.[1];
193
+ if (!head)
194
+ return false;
195
+ const canon = head.search(/<link\b[^>]*rel\s*=\s*["']?canonical/i);
196
+ const slice = canon >= 0 ? head.slice(0, canon) : head;
197
+ return BODY_FORCING.test(slice);
198
+ }
199
+ function extractLinks($, pageUrl, origin) {
200
+ const out = [];
201
+ $("a[href]").each((_, el) => {
202
+ const href = $(el).attr("href")?.trim() ?? "";
203
+ if (!href || href.startsWith("javascript:") || href.startsWith("mailto:"))
204
+ return;
205
+ const abs = absolutize(href, pageUrl);
206
+ if (!abs)
207
+ return;
208
+ const rel = ($(el).attr("rel") ?? "").toLowerCase().split(/\s+/).filter(Boolean);
209
+ const position = classifyPosition($(el));
210
+ out.push({
211
+ href,
212
+ absUrl: abs,
213
+ anchorText: $(el).text().replace(/\s+/g, " ").trim(),
214
+ rel,
215
+ target: $(el).attr("target") ?? null,
216
+ isNofollow: rel.includes("nofollow"),
217
+ isUgc: rel.includes("ugc"),
218
+ isSponsored: rel.includes("sponsored"),
219
+ isInternal: sameOrigin(abs, origin),
220
+ position,
221
+ });
222
+ });
223
+ return out;
224
+ }
225
+ function extractImages($, pageUrl) {
226
+ return $("img")
227
+ .toArray()
228
+ .map((el) => {
229
+ const src = $(el).attr("src") ?? "";
230
+ const attribs = "attribs" in el ? el.attribs : {};
231
+ return {
232
+ src,
233
+ absUrl: absolutize(src, pageUrl) ?? src,
234
+ alt: $(el).attr("alt") ?? null,
235
+ hasAltAttr: Object.prototype.hasOwnProperty.call(attribs, "alt"),
236
+ width: $(el).attr("width") ?? null,
237
+ height: $(el).attr("height") ?? null,
238
+ loading: $(el).attr("loading") ?? null,
239
+ srcset: $(el).attr("srcset") ?? null,
240
+ decoding: $(el).attr("decoding") ?? null,
241
+ };
242
+ });
243
+ }
244
+ function classifyPosition(node) {
245
+ if (node.closest("nav, [role='navigation']").length)
246
+ return "nav";
247
+ if (node.closest("header").length)
248
+ return "header";
249
+ if (node.closest("footer").length)
250
+ return "footer";
251
+ if (node.closest("aside").length)
252
+ return "aside";
253
+ if (node.closest("main, article, [role='main']").length)
254
+ return "main";
255
+ return "unknown";
256
+ }
257
+ export function parseLinkHeaderCanonicals(header) {
258
+ if (!header)
259
+ return [];
260
+ const out = [];
261
+ for (const part of header.split(",")) {
262
+ const m = part.match(/<([^>]+)>\s*;\s*rel\s*=\s*"?canonical"?/i);
263
+ if (m?.[1])
264
+ out.push(m[1]);
265
+ }
266
+ return out;
267
+ }
268
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
package/dist/hash.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function sha256Hex(input: string | Uint8Array): string;
2
+ export declare function contentHash(body: string | Uint8Array): string;
3
+ export declare function urlHash(url: string): string;
4
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE5D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE7D;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C"}
package/dist/hash.js ADDED
@@ -0,0 +1,11 @@
1
+ import { createHash } from "node:crypto";
2
+ export function sha256Hex(input) {
3
+ return createHash("sha256").update(input).digest("hex");
4
+ }
5
+ export function contentHash(body) {
6
+ return sha256Hex(body);
7
+ }
8
+ export function urlHash(url) {
9
+ return sha256Hex(url);
10
+ }
11
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,KAA0B;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAyB;IACnD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { Agent } from "undici";
2
+ import type { RedirectHop } from "./types.js";
3
+ export declare const MAX_BODY: number;
4
+ export declare const HTML_GOOGLE_CAP: number;
5
+ export declare const RESOURCE_GOOGLE_CAP: number;
6
+ export type FetchResult = {
7
+ url: string;
8
+ finalUrl: string;
9
+ statusCode: number | null;
10
+ error: string | null;
11
+ headers: Record<string, string>;
12
+ body: Buffer;
13
+ decoded: Buffer;
14
+ contentType: string;
15
+ ttfbMs: number;
16
+ totalMs: number;
17
+ wireBytes: number;
18
+ decodedBytes: number;
19
+ redirectChain: RedirectHop[];
20
+ redirectLoop: boolean;
21
+ exceedsGoogleRedirectLimit: boolean;
22
+ etag: string | null;
23
+ lastModified: string | null;
24
+ notModified: boolean;
25
+ };
26
+ export declare function createCrawlerAgent(connectionsPerOrigin?: number): Agent;
27
+ export declare function fetchUrl(url: string, opts: {
28
+ agent: Agent;
29
+ userAgent?: string | undefined;
30
+ timeoutMs?: number | undefined;
31
+ maxRedirects?: number | undefined;
32
+ method?: "GET" | "HEAD" | undefined;
33
+ etag?: string | undefined;
34
+ lastModified?: string | undefined;
35
+ accept?: string | undefined;
36
+ }): Promise<FetchResult>;
37
+ export declare const ROBOTS_MAX_REDIRECTS = 5;
38
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAW,MAAM,QAAQ,CAAC;AAGxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,QAAQ,QAAmB,CAAC;AACzC,eAAO,MAAM,eAAe,QAAkB,CAAC;AAC/C,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAKpD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,0BAA0B,EAAE,OAAO,CAAC;IACpC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,oBAAoB,SAAI,GAAG,KAAK,CAalE;AAID,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GACA,OAAO,CAAC,WAAW,CAAC,CAqGtB;AAwGD,eAAO,MAAM,oBAAoB,IAAuB,CAAC"}
package/dist/http.js ADDED
@@ -0,0 +1,207 @@
1
+ import { Agent, request } from "undici";
2
+ import { acceptEncodingHeader, decodeBody } from "./decode.js";
3
+ import { SEAN_UA } from "./ua.js";
4
+ export const MAX_BODY = 10 * 1024 * 1024;
5
+ export const HTML_GOOGLE_CAP = 2 * 1024 * 1024;
6
+ export const RESOURCE_GOOGLE_CAP = 15 * 1024 * 1024;
7
+ const PAGE_REDIRECT_HOPS = 5;
8
+ const GOOGLE_REDIRECT_HOPS = 10;
9
+ const ROBOTS_REDIRECT_HOPS = 5;
10
+ export function createCrawlerAgent(connectionsPerOrigin = 2) {
11
+ return new Agent({
12
+ connections: connectionsPerOrigin,
13
+ pipelining: 1,
14
+ keepAliveTimeout: 10_000,
15
+ keepAliveMaxTimeout: 600_000,
16
+ headersTimeout: 15_000,
17
+ bodyTimeout: 30_000,
18
+ allowH2: true,
19
+ maxResponseSize: MAX_BODY,
20
+ clientTtl: 60_000,
21
+ connect: { rejectUnauthorized: true },
22
+ });
23
+ }
24
+ const RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504, 522, 524]);
25
+ export async function fetchUrl(url, opts) {
26
+ const userAgent = opts.userAgent ?? SEAN_UA;
27
+ const timeoutMs = opts.timeoutMs ?? 20_000;
28
+ const maxRedirects = opts.maxRedirects ?? PAGE_REDIRECT_HOPS;
29
+ const chain = [];
30
+ const seen = new Set();
31
+ let current = url;
32
+ let loop = false;
33
+ let exceeds = false;
34
+ const t0 = performance.now();
35
+ let ttfbMs = 0;
36
+ for (let hop = 0; hop <= GOOGLE_REDIRECT_HOPS; hop++) {
37
+ if (seen.has(current)) {
38
+ loop = true;
39
+ break;
40
+ }
41
+ seen.add(current);
42
+ if (hop > maxRedirects) {
43
+ exceeds = hop > GOOGLE_REDIRECT_HOPS;
44
+ break;
45
+ }
46
+ const headers = {
47
+ "user-agent": userAgent,
48
+ accept: opts.accept ??
49
+ "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
50
+ "accept-encoding": acceptEncodingHeader(),
51
+ };
52
+ if (opts.etag)
53
+ headers["if-none-match"] = opts.etag;
54
+ if (opts.lastModified)
55
+ headers["if-modified-since"] = opts.lastModified;
56
+ const result = await attempt(current, {
57
+ agent: opts.agent,
58
+ method: opts.method ?? "GET",
59
+ headers,
60
+ timeoutMs,
61
+ });
62
+ if (ttfbMs === 0)
63
+ ttfbMs = result.ttfbMs;
64
+ const location = result.headers.location ?? null;
65
+ chain.push({ url: current, status: result.statusCode ?? 0, location });
66
+ if (result.statusCode !== null &&
67
+ result.statusCode >= 300 &&
68
+ result.statusCode < 400 &&
69
+ location) {
70
+ current = new URL(location, current).href;
71
+ if (hop + 1 > GOOGLE_REDIRECT_HOPS) {
72
+ exceeds = true;
73
+ break;
74
+ }
75
+ continue;
76
+ }
77
+ const totalMs = performance.now() - t0;
78
+ return {
79
+ url,
80
+ finalUrl: current,
81
+ statusCode: result.statusCode,
82
+ error: result.error,
83
+ headers: result.headers,
84
+ body: result.wire,
85
+ decoded: result.decoded,
86
+ contentType: result.headers["content-type"] ?? "",
87
+ ttfbMs,
88
+ totalMs,
89
+ wireBytes: result.wire.length,
90
+ decodedBytes: result.decoded.length,
91
+ redirectChain: chain,
92
+ redirectLoop: loop,
93
+ exceedsGoogleRedirectLimit: exceeds,
94
+ etag: result.headers.etag ?? null,
95
+ lastModified: result.headers["last-modified"] ?? null,
96
+ notModified: result.statusCode === 304,
97
+ };
98
+ }
99
+ return {
100
+ url,
101
+ finalUrl: current,
102
+ statusCode: chain.at(-1)?.status ?? null,
103
+ error: loop ? "redirect_loop" : exceeds ? "redirect_limit" : "redirect",
104
+ headers: {},
105
+ body: Buffer.alloc(0),
106
+ decoded: Buffer.alloc(0),
107
+ contentType: "",
108
+ ttfbMs,
109
+ totalMs: performance.now() - t0,
110
+ wireBytes: 0,
111
+ decodedBytes: 0,
112
+ redirectChain: chain,
113
+ redirectLoop: loop,
114
+ exceedsGoogleRedirectLimit: exceeds,
115
+ etag: null,
116
+ lastModified: null,
117
+ notModified: false,
118
+ };
119
+ }
120
+ async function attempt(url, opts) {
121
+ let lastError = null;
122
+ for (let attemptNo = 1; attemptNo <= 3; attemptNo++) {
123
+ const t0 = performance.now();
124
+ try {
125
+ const res = await request(url, {
126
+ method: opts.method,
127
+ dispatcher: opts.agent,
128
+ headers: opts.headers,
129
+ headersTimeout: opts.timeoutMs,
130
+ bodyTimeout: opts.timeoutMs,
131
+ });
132
+ const ttfbMs = performance.now() - t0;
133
+ const headers = {};
134
+ for (const [k, v] of Object.entries(res.headers)) {
135
+ if (typeof v === "string")
136
+ headers[k.toLowerCase()] = v;
137
+ else if (Array.isArray(v))
138
+ headers[k.toLowerCase()] = v.join(", ");
139
+ }
140
+ const wire = Buffer.from(new Uint8Array(await res.body.arrayBuffer()));
141
+ let decoded = wire;
142
+ try {
143
+ decoded = await decodeBody(wire, headers["content-encoding"]);
144
+ }
145
+ catch {
146
+ decoded = wire;
147
+ }
148
+ if (RETRYABLE_STATUS.has(res.statusCode) && attemptNo < 3) {
149
+ lastError = `http_${res.statusCode}`;
150
+ await backoff(attemptNo, headers["retry-after"]);
151
+ continue;
152
+ }
153
+ return {
154
+ statusCode: res.statusCode,
155
+ headers,
156
+ wire,
157
+ decoded,
158
+ error: null,
159
+ ttfbMs,
160
+ };
161
+ }
162
+ catch (e) {
163
+ lastError = e instanceof Error ? e.message : String(e);
164
+ if (attemptNo < 3) {
165
+ await backoff(attemptNo, undefined);
166
+ continue;
167
+ }
168
+ return {
169
+ statusCode: null,
170
+ headers: {},
171
+ wire: Buffer.alloc(0),
172
+ decoded: Buffer.alloc(0),
173
+ error: lastError,
174
+ ttfbMs: performance.now() - t0,
175
+ };
176
+ }
177
+ }
178
+ return {
179
+ statusCode: null,
180
+ headers: {},
181
+ wire: Buffer.alloc(0),
182
+ decoded: Buffer.alloc(0),
183
+ error: lastError,
184
+ ttfbMs: 0,
185
+ };
186
+ }
187
+ async function backoff(n, retryAfter) {
188
+ if (retryAfter) {
189
+ const seconds = Number(retryAfter);
190
+ if (Number.isFinite(seconds)) {
191
+ await sleep(Math.min(seconds * 1000, 300_000));
192
+ return;
193
+ }
194
+ const when = Date.parse(retryAfter);
195
+ if (!Number.isNaN(when)) {
196
+ await sleep(Math.min(Math.max(0, when - Date.now()), 300_000));
197
+ return;
198
+ }
199
+ }
200
+ const cap = Math.min(1000 * 2 ** (n - 1), 60_000);
201
+ await sleep(Math.random() * cap);
202
+ }
203
+ function sleep(ms) {
204
+ return new Promise((r) => setTimeout(r, ms));
205
+ }
206
+ export const ROBOTS_MAX_REDIRECTS = ROBOTS_REDIRECT_HOPS;
207
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { crawlSite, ramConcurrency } from "./crawl.js";
2
+ export { persistCrawl, persistFindings } from "./persist.js";
3
+ export { fetchUrl, createCrawlerAgent } from "./http.js";
4
+ export { decodeBody } from "./decode.js";
5
+ export { parseRobotsTxt, isAllowedByRobots, robotsFromFetch, matchRule, } from "./robots.js";
6
+ export { parseSitemapXml } from "./sitemap.js";
7
+ export { extractPage } from "./extract.js";
8
+ export { extractMainContent } from "./readability.js";
9
+ export { simhash64, simhashHex, hamming64, nearDuplicate } from "./simhash.js";
10
+ export { contentHash, sha256Hex, urlHash } from "./hash.js";
11
+ export { SEAN_UA } from "./ua.js";
12
+ export { decideRenderPolicy } from "./adaptive.js";
13
+ export type { CrawledPage, CrawlCheckpoint, CrawlOptions, CrawlResult, PageExtract, RobotsOutcome, ParsedSitemap, OriginProbe, ExtractedLink, ExtractedImage, JsonLdBlock, HreflangAlt, } from "./types.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { crawlSite, ramConcurrency } from "./crawl.js";
2
+ export { persistCrawl, persistFindings } from "./persist.js";
3
+ export { fetchUrl, createCrawlerAgent } from "./http.js";
4
+ export { decodeBody } from "./decode.js";
5
+ export { parseRobotsTxt, isAllowedByRobots, robotsFromFetch, matchRule, } from "./robots.js";
6
+ export { parseSitemapXml } from "./sitemap.js";
7
+ export { extractPage } from "./extract.js";
8
+ export { extractMainContent } from "./readability.js";
9
+ export { simhash64, simhashHex, hamming64, nearDuplicate } from "./simhash.js";
10
+ export { contentHash, sha256Hex, urlHash } from "./hash.js";
11
+ export { SEAN_UA } from "./ua.js";
12
+ export { decideRenderPolicy } from "./adaptive.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { SqliteDatabase } from "@agentsean/db";
2
+ import type { CrawlResult } from "./types.js";
3
+ export declare function persistCrawl(db: SqliteDatabase, result: CrawlResult, siteName?: string, opts?: {
4
+ crawlId?: string | undefined;
5
+ status?: string | undefined;
6
+ }): Promise<{
7
+ siteId: string;
8
+ crawlId: string;
9
+ }>;
10
+ export declare function persistFindings(db: SqliteDatabase, siteId: string, rows: {
11
+ pageUrl: string | null;
12
+ ruleId: string;
13
+ severity: string;
14
+ autonomyTier: string;
15
+ title: string;
16
+ explanation: string | null;
17
+ evidence: unknown;
18
+ fingerprint: string;
19
+ }[]): void;
20
+ //# sourceMappingURL=persist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAWpD,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACnE,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA8D9C;AA+FD,wBAAgB,eAAe,CAC7B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,EAAE,GACF,IAAI,CA0CN"}