recker 1.0.26 → 1.0.27

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 (171) hide show
  1. package/dist/browser/browser/cache.d.ts +40 -0
  2. package/dist/browser/browser/cache.js +199 -0
  3. package/dist/browser/browser/crypto.d.ts +24 -0
  4. package/dist/browser/browser/crypto.js +80 -0
  5. package/dist/browser/browser/index.d.ts +31 -0
  6. package/dist/browser/browser/index.js +31 -0
  7. package/dist/browser/browser/recker.d.ts +26 -0
  8. package/dist/browser/browser/recker.js +61 -0
  9. package/dist/browser/cache/basic-file-storage.d.ts +12 -0
  10. package/dist/browser/cache/basic-file-storage.js +50 -0
  11. package/dist/browser/cache/memory-limits.d.ts +20 -0
  12. package/dist/browser/cache/memory-limits.js +96 -0
  13. package/dist/browser/cache/memory-storage.d.ts +132 -0
  14. package/dist/browser/cache/memory-storage.js +454 -0
  15. package/dist/browser/cache.d.ts +40 -0
  16. package/dist/browser/cache.js +199 -0
  17. package/dist/browser/constants/http-status.d.ts +73 -0
  18. package/dist/browser/constants/http-status.js +156 -0
  19. package/dist/browser/cookies/memory-cookie-jar.d.ts +30 -0
  20. package/dist/browser/cookies/memory-cookie-jar.js +210 -0
  21. package/dist/browser/core/client.d.ts +118 -0
  22. package/dist/browser/core/client.js +667 -0
  23. package/dist/browser/core/errors.d.ts +142 -0
  24. package/dist/browser/core/errors.js +308 -0
  25. package/dist/browser/core/index.d.ts +5 -0
  26. package/dist/browser/core/index.js +5 -0
  27. package/dist/browser/core/request-promise.d.ts +23 -0
  28. package/dist/browser/core/request-promise.js +82 -0
  29. package/dist/browser/core/request.d.ts +20 -0
  30. package/dist/browser/core/request.js +76 -0
  31. package/dist/browser/core/response.d.ts +34 -0
  32. package/dist/browser/core/response.js +178 -0
  33. package/dist/browser/crypto.d.ts +24 -0
  34. package/dist/browser/crypto.js +80 -0
  35. package/dist/browser/index.d.ts +31 -0
  36. package/dist/browser/index.js +31 -0
  37. package/dist/browser/plugins/auth/api-key.d.ts +8 -0
  38. package/dist/browser/plugins/auth/api-key.js +27 -0
  39. package/dist/browser/plugins/auth/auth0.d.ts +33 -0
  40. package/dist/browser/plugins/auth/auth0.js +94 -0
  41. package/dist/browser/plugins/auth/aws-sigv4.d.ts +10 -0
  42. package/dist/browser/plugins/auth/aws-sigv4.js +88 -0
  43. package/dist/browser/plugins/auth/azure-ad.d.ts +48 -0
  44. package/dist/browser/plugins/auth/azure-ad.js +152 -0
  45. package/dist/browser/plugins/auth/basic.d.ts +7 -0
  46. package/dist/browser/plugins/auth/basic.js +13 -0
  47. package/dist/browser/plugins/auth/bearer.d.ts +8 -0
  48. package/dist/browser/plugins/auth/bearer.js +17 -0
  49. package/dist/browser/plugins/auth/cognito.d.ts +45 -0
  50. package/dist/browser/plugins/auth/cognito.js +208 -0
  51. package/dist/browser/plugins/auth/digest.d.ts +8 -0
  52. package/dist/browser/plugins/auth/digest.js +100 -0
  53. package/dist/browser/plugins/auth/firebase.d.ts +32 -0
  54. package/dist/browser/plugins/auth/firebase.js +195 -0
  55. package/dist/browser/plugins/auth/github-app.d.ts +36 -0
  56. package/dist/browser/plugins/auth/github-app.js +170 -0
  57. package/dist/browser/plugins/auth/google-service-account.d.ts +49 -0
  58. package/dist/browser/plugins/auth/google-service-account.js +172 -0
  59. package/dist/browser/plugins/auth/index.d.ts +15 -0
  60. package/dist/browser/plugins/auth/index.js +15 -0
  61. package/dist/browser/plugins/auth/mtls.d.ts +37 -0
  62. package/dist/browser/plugins/auth/mtls.js +140 -0
  63. package/dist/browser/plugins/auth/oauth2.d.ts +8 -0
  64. package/dist/browser/plugins/auth/oauth2.js +26 -0
  65. package/dist/browser/plugins/auth/oidc.d.ts +55 -0
  66. package/dist/browser/plugins/auth/oidc.js +222 -0
  67. package/dist/browser/plugins/auth/okta.d.ts +47 -0
  68. package/dist/browser/plugins/auth/okta.js +157 -0
  69. package/dist/browser/plugins/auth.d.ts +1 -0
  70. package/dist/browser/plugins/auth.js +1 -0
  71. package/dist/browser/plugins/cache.d.ts +15 -0
  72. package/dist/browser/plugins/cache.js +486 -0
  73. package/dist/browser/plugins/circuit-breaker.d.ts +13 -0
  74. package/dist/browser/plugins/circuit-breaker.js +100 -0
  75. package/dist/browser/plugins/compression.d.ts +4 -0
  76. package/dist/browser/plugins/compression.js +130 -0
  77. package/dist/browser/plugins/cookie-jar.d.ts +5 -0
  78. package/dist/browser/plugins/cookie-jar.js +72 -0
  79. package/dist/browser/plugins/dedup.d.ts +5 -0
  80. package/dist/browser/plugins/dedup.js +35 -0
  81. package/dist/browser/plugins/graphql.d.ts +13 -0
  82. package/dist/browser/plugins/graphql.js +58 -0
  83. package/dist/browser/plugins/grpc-web.d.ts +79 -0
  84. package/dist/browser/plugins/grpc-web.js +261 -0
  85. package/dist/browser/plugins/hls.d.ts +105 -0
  86. package/dist/browser/plugins/hls.js +395 -0
  87. package/dist/browser/plugins/jsonrpc.d.ts +75 -0
  88. package/dist/browser/plugins/jsonrpc.js +143 -0
  89. package/dist/browser/plugins/logger.d.ts +13 -0
  90. package/dist/browser/plugins/logger.js +108 -0
  91. package/dist/browser/plugins/odata.d.ts +181 -0
  92. package/dist/browser/plugins/odata.js +564 -0
  93. package/dist/browser/plugins/pagination.d.ts +16 -0
  94. package/dist/browser/plugins/pagination.js +105 -0
  95. package/dist/browser/plugins/rate-limit.d.ts +15 -0
  96. package/dist/browser/plugins/rate-limit.js +162 -0
  97. package/dist/browser/plugins/retry.d.ts +14 -0
  98. package/dist/browser/plugins/retry.js +116 -0
  99. package/dist/browser/plugins/scrape.d.ts +21 -0
  100. package/dist/browser/plugins/scrape.js +82 -0
  101. package/dist/browser/plugins/server-timing.d.ts +7 -0
  102. package/dist/browser/plugins/server-timing.js +24 -0
  103. package/dist/browser/plugins/soap.d.ts +72 -0
  104. package/dist/browser/plugins/soap.js +347 -0
  105. package/dist/browser/plugins/xml.d.ts +9 -0
  106. package/dist/browser/plugins/xml.js +194 -0
  107. package/dist/browser/plugins/xsrf.d.ts +9 -0
  108. package/dist/browser/plugins/xsrf.js +48 -0
  109. package/dist/browser/recker.d.ts +26 -0
  110. package/dist/browser/recker.js +61 -0
  111. package/dist/browser/runner/request-runner.d.ts +46 -0
  112. package/dist/browser/runner/request-runner.js +89 -0
  113. package/dist/browser/scrape/document.d.ts +44 -0
  114. package/dist/browser/scrape/document.js +210 -0
  115. package/dist/browser/scrape/element.d.ts +49 -0
  116. package/dist/browser/scrape/element.js +176 -0
  117. package/dist/browser/scrape/extractors.d.ts +16 -0
  118. package/dist/browser/scrape/extractors.js +356 -0
  119. package/dist/browser/scrape/types.d.ts +107 -0
  120. package/dist/browser/scrape/types.js +1 -0
  121. package/dist/browser/transport/fetch.d.ts +11 -0
  122. package/dist/browser/transport/fetch.js +143 -0
  123. package/dist/browser/transport/undici.d.ts +38 -0
  124. package/dist/browser/transport/undici.js +897 -0
  125. package/dist/browser/types/ai.d.ts +267 -0
  126. package/dist/browser/types/ai.js +1 -0
  127. package/dist/browser/types/index.d.ts +351 -0
  128. package/dist/browser/types/index.js +1 -0
  129. package/dist/browser/types/logger.d.ts +16 -0
  130. package/dist/browser/types/logger.js +66 -0
  131. package/dist/browser/types/udp.d.ts +138 -0
  132. package/dist/browser/types/udp.js +1 -0
  133. package/dist/browser/utils/agent-manager.d.ts +29 -0
  134. package/dist/browser/utils/agent-manager.js +160 -0
  135. package/dist/browser/utils/body.d.ts +10 -0
  136. package/dist/browser/utils/body.js +148 -0
  137. package/dist/browser/utils/charset.d.ts +15 -0
  138. package/dist/browser/utils/charset.js +169 -0
  139. package/dist/browser/utils/concurrency.d.ts +20 -0
  140. package/dist/browser/utils/concurrency.js +120 -0
  141. package/dist/browser/utils/dns.d.ts +6 -0
  142. package/dist/browser/utils/dns.js +26 -0
  143. package/dist/browser/utils/header-parser.d.ts +94 -0
  144. package/dist/browser/utils/header-parser.js +617 -0
  145. package/dist/browser/utils/html-cleaner.d.ts +1 -0
  146. package/dist/browser/utils/html-cleaner.js +21 -0
  147. package/dist/browser/utils/link-header.d.ts +69 -0
  148. package/dist/browser/utils/link-header.js +190 -0
  149. package/dist/browser/utils/optional-require.d.ts +19 -0
  150. package/dist/browser/utils/optional-require.js +105 -0
  151. package/dist/browser/utils/progress.d.ts +8 -0
  152. package/dist/browser/utils/progress.js +82 -0
  153. package/dist/browser/utils/request-pool.d.ts +22 -0
  154. package/dist/browser/utils/request-pool.js +101 -0
  155. package/dist/browser/utils/sse.d.ts +7 -0
  156. package/dist/browser/utils/sse.js +67 -0
  157. package/dist/browser/utils/streaming.d.ts +17 -0
  158. package/dist/browser/utils/streaming.js +84 -0
  159. package/dist/browser/utils/try-fn.d.ts +3 -0
  160. package/dist/browser/utils/try-fn.js +59 -0
  161. package/dist/browser/utils/user-agent.d.ts +44 -0
  162. package/dist/browser/utils/user-agent.js +100 -0
  163. package/dist/browser/utils/whois.d.ts +32 -0
  164. package/dist/browser/utils/whois.js +246 -0
  165. package/dist/browser/websocket/client.d.ts +65 -0
  166. package/dist/browser/websocket/client.js +313 -0
  167. package/dist/cli/index.d.ts +1 -0
  168. package/dist/cli/index.js +1 -0
  169. package/dist/transport/fetch.d.ts +7 -1
  170. package/dist/transport/fetch.js +58 -76
  171. package/package.json +34 -2
@@ -0,0 +1,356 @@
1
+ function resolveUrl(url, baseUrl) {
2
+ if (!url)
3
+ return '';
4
+ if (!baseUrl)
5
+ return url;
6
+ try {
7
+ if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')) {
8
+ return url;
9
+ }
10
+ return new URL(url, baseUrl).href;
11
+ }
12
+ catch {
13
+ return url;
14
+ }
15
+ }
16
+ function classifyLinkType(href, baseUrl) {
17
+ if (!href)
18
+ return undefined;
19
+ if (href.startsWith('mailto:'))
20
+ return 'mailto';
21
+ if (href.startsWith('tel:'))
22
+ return 'tel';
23
+ if (href.startsWith('#'))
24
+ return 'anchor';
25
+ if (baseUrl) {
26
+ try {
27
+ const base = new URL(baseUrl);
28
+ const link = new URL(href, baseUrl);
29
+ return link.hostname === base.hostname ? 'internal' : 'external';
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ }
35
+ if (href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//')) {
36
+ return 'external';
37
+ }
38
+ return 'internal';
39
+ }
40
+ export function extractLinks($, options) {
41
+ const selector = options?.selector || 'a[href]';
42
+ const links = [];
43
+ $(selector).each((_, element) => {
44
+ const $el = $(element);
45
+ let href = $el.attr('href') || '';
46
+ if (options?.absolute && options?.baseUrl) {
47
+ href = resolveUrl(href, options.baseUrl);
48
+ }
49
+ links.push({
50
+ href,
51
+ text: $el.text().trim(),
52
+ rel: $el.attr('rel'),
53
+ target: $el.attr('target'),
54
+ title: $el.attr('title'),
55
+ type: classifyLinkType(href, options?.baseUrl),
56
+ });
57
+ });
58
+ return links;
59
+ }
60
+ export function extractImages($, options) {
61
+ const selector = options?.selector || 'img[src]';
62
+ const images = [];
63
+ $(selector).each((_, element) => {
64
+ const $el = $(element);
65
+ let src = $el.attr('src') || '';
66
+ if (options?.absolute && options?.baseUrl) {
67
+ src = resolveUrl(src, options.baseUrl);
68
+ }
69
+ const width = $el.attr('width');
70
+ const height = $el.attr('height');
71
+ images.push({
72
+ src,
73
+ alt: $el.attr('alt'),
74
+ title: $el.attr('title'),
75
+ width: width ? parseInt(width, 10) : undefined,
76
+ height: height ? parseInt(height, 10) : undefined,
77
+ srcset: $el.attr('srcset'),
78
+ loading: $el.attr('loading'),
79
+ });
80
+ });
81
+ return images;
82
+ }
83
+ export function extractMeta($) {
84
+ const meta = {};
85
+ meta.title = $('title').first().text().trim() || undefined;
86
+ const charsetMeta = $('meta[charset]').attr('charset');
87
+ if (charsetMeta) {
88
+ meta.charset = charsetMeta;
89
+ }
90
+ else {
91
+ const contentType = $('meta[http-equiv="Content-Type"]').attr('content');
92
+ if (contentType) {
93
+ const charsetMatch = contentType.match(/charset=([^;]+)/i);
94
+ if (charsetMatch) {
95
+ meta.charset = charsetMatch[1].trim();
96
+ }
97
+ }
98
+ }
99
+ const canonical = $('link[rel="canonical"]').attr('href');
100
+ if (canonical) {
101
+ meta.canonical = canonical;
102
+ }
103
+ $('meta[name]').each((_, element) => {
104
+ const $el = $(element);
105
+ const name = $el.attr('name')?.toLowerCase();
106
+ const content = $el.attr('content');
107
+ if (!name || !content)
108
+ return;
109
+ switch (name) {
110
+ case 'description':
111
+ meta.description = content;
112
+ break;
113
+ case 'keywords':
114
+ meta.keywords = content.split(',').map((k) => k.trim()).filter(Boolean);
115
+ break;
116
+ case 'author':
117
+ meta.author = content;
118
+ break;
119
+ case 'robots':
120
+ meta.robots = content;
121
+ break;
122
+ case 'viewport':
123
+ meta.viewport = content;
124
+ break;
125
+ default:
126
+ meta[name] = content;
127
+ }
128
+ });
129
+ return meta;
130
+ }
131
+ export function extractOpenGraph($) {
132
+ const og = {};
133
+ const images = [];
134
+ $('meta[property^="og:"]').each((_, element) => {
135
+ const $el = $(element);
136
+ const property = $el.attr('property');
137
+ const content = $el.attr('content');
138
+ if (!property || !content)
139
+ return;
140
+ const key = property.replace('og:', '');
141
+ switch (key) {
142
+ case 'title':
143
+ og.title = content;
144
+ break;
145
+ case 'type':
146
+ og.type = content;
147
+ break;
148
+ case 'url':
149
+ og.url = content;
150
+ break;
151
+ case 'image':
152
+ images.push(content);
153
+ break;
154
+ case 'description':
155
+ og.description = content;
156
+ break;
157
+ case 'site_name':
158
+ og.siteName = content;
159
+ break;
160
+ case 'locale':
161
+ og.locale = content;
162
+ break;
163
+ default:
164
+ og[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = content;
165
+ }
166
+ });
167
+ if (images.length === 1) {
168
+ og.image = images[0];
169
+ }
170
+ else if (images.length > 1) {
171
+ og.image = images;
172
+ }
173
+ return og;
174
+ }
175
+ export function extractTwitterCard($) {
176
+ const twitter = {};
177
+ $('meta[name^="twitter:"]').each((_, element) => {
178
+ const $el = $(element);
179
+ const name = $el.attr('name');
180
+ const content = $el.attr('content');
181
+ if (!name || !content)
182
+ return;
183
+ const key = name.replace('twitter:', '');
184
+ switch (key) {
185
+ case 'card':
186
+ twitter.card = content;
187
+ break;
188
+ case 'site':
189
+ twitter.site = content;
190
+ break;
191
+ case 'creator':
192
+ twitter.creator = content;
193
+ break;
194
+ case 'title':
195
+ twitter.title = content;
196
+ break;
197
+ case 'description':
198
+ twitter.description = content;
199
+ break;
200
+ case 'image':
201
+ twitter.image = content;
202
+ break;
203
+ default:
204
+ twitter[key] = content;
205
+ }
206
+ });
207
+ return twitter;
208
+ }
209
+ export function extractJsonLd($) {
210
+ const results = [];
211
+ $('script[type="application/ld+json"]').each((_, element) => {
212
+ const content = $(element).html();
213
+ if (!content)
214
+ return;
215
+ try {
216
+ const data = JSON.parse(content);
217
+ if (data['@graph'] && Array.isArray(data['@graph'])) {
218
+ results.push(...data['@graph']);
219
+ }
220
+ else if (Array.isArray(data)) {
221
+ results.push(...data);
222
+ }
223
+ else {
224
+ results.push(data);
225
+ }
226
+ }
227
+ catch {
228
+ }
229
+ });
230
+ return results;
231
+ }
232
+ export function extractForms($, selector) {
233
+ const forms = [];
234
+ const formSelector = selector || 'form';
235
+ $(formSelector).each((_, formElement) => {
236
+ const $form = $(formElement);
237
+ const fields = [];
238
+ $form.find('input, select, textarea').each((_, fieldElement) => {
239
+ const $field = $(fieldElement);
240
+ const tagName = fieldElement.tagName?.toLowerCase();
241
+ const type = $field.attr('type') || (tagName === 'textarea' ? 'textarea' : tagName === 'select' ? 'select' : 'text');
242
+ const field = {
243
+ name: $field.attr('name'),
244
+ type,
245
+ value: $field.val(),
246
+ placeholder: $field.attr('placeholder'),
247
+ required: $field.attr('required') !== undefined,
248
+ };
249
+ if (tagName === 'select') {
250
+ field.options = [];
251
+ $field.find('option').each((_, optionElement) => {
252
+ const $option = $(optionElement);
253
+ field.options.push({
254
+ value: $option.attr('value') || $option.text(),
255
+ text: $option.text().trim(),
256
+ });
257
+ });
258
+ }
259
+ fields.push(field);
260
+ });
261
+ forms.push({
262
+ action: $form.attr('action'),
263
+ method: $form.attr('method')?.toUpperCase(),
264
+ name: $form.attr('name'),
265
+ id: $form.attr('id'),
266
+ fields,
267
+ });
268
+ });
269
+ return forms;
270
+ }
271
+ export function extractTables($, selector) {
272
+ const tables = [];
273
+ const tableSelector = selector || 'table';
274
+ $(tableSelector).each((_, tableElement) => {
275
+ const $table = $(tableElement);
276
+ const headers = [];
277
+ const rows = [];
278
+ const caption = $table.find('caption').first().text().trim() || undefined;
279
+ const $headerCells = $table.find('thead th, thead td, tr:first-child th');
280
+ if ($headerCells.length > 0) {
281
+ $headerCells.each((_, th) => {
282
+ headers.push($(th).text().trim());
283
+ });
284
+ }
285
+ const $rows = $table.find('tbody tr, tr').not(':has(th):not(:first-child)');
286
+ $rows.each((_, tr) => {
287
+ const row = [];
288
+ $(tr).find('td').each((_, td) => {
289
+ row.push($(td).text().trim());
290
+ });
291
+ if (row.length > 0) {
292
+ rows.push(row);
293
+ }
294
+ });
295
+ if (headers.length === 0 && rows.length > 0) {
296
+ const $firstRowCells = $table.find('tr:first-child td, tr:first-child th');
297
+ if ($firstRowCells.length > 0) {
298
+ $firstRowCells.each((_, cell) => {
299
+ headers.push($(cell).text().trim());
300
+ });
301
+ if ($table.find('tr:first-child th').length > 0) {
302
+ }
303
+ else {
304
+ const firstRow = [];
305
+ $table.find('tr:first-child td').each((_, td) => {
306
+ firstRow.push($(td).text().trim());
307
+ });
308
+ if (firstRow.length > 0 && !rows.some(r => r.join('') === firstRow.join(''))) {
309
+ rows.unshift(firstRow);
310
+ }
311
+ }
312
+ }
313
+ }
314
+ tables.push({ headers, rows, caption });
315
+ });
316
+ return tables;
317
+ }
318
+ export function extractScripts($) {
319
+ const scripts = [];
320
+ $('script').each((_, element) => {
321
+ const $el = $(element);
322
+ const src = $el.attr('src');
323
+ const inline = !src ? $el.html()?.trim() : undefined;
324
+ if (!src && !inline)
325
+ return;
326
+ scripts.push({
327
+ src,
328
+ type: $el.attr('type'),
329
+ async: $el.attr('async') !== undefined,
330
+ defer: $el.attr('defer') !== undefined,
331
+ inline,
332
+ });
333
+ });
334
+ return scripts;
335
+ }
336
+ export function extractStyles($) {
337
+ const styles = [];
338
+ $('link[rel="stylesheet"]').each((_, element) => {
339
+ const $el = $(element);
340
+ styles.push({
341
+ href: $el.attr('href'),
342
+ media: $el.attr('media'),
343
+ });
344
+ });
345
+ $('style').each((_, element) => {
346
+ const $el = $(element);
347
+ const inline = $el.html()?.trim();
348
+ if (inline) {
349
+ styles.push({
350
+ media: $el.attr('media'),
351
+ inline,
352
+ });
353
+ }
354
+ });
355
+ return styles;
356
+ }
@@ -0,0 +1,107 @@
1
+ export interface ExtractedLink {
2
+ href: string;
3
+ text: string;
4
+ rel?: string;
5
+ target?: string;
6
+ title?: string;
7
+ type?: 'internal' | 'external' | 'anchor' | 'mailto' | 'tel';
8
+ }
9
+ export interface ExtractedImage {
10
+ src: string;
11
+ alt?: string;
12
+ title?: string;
13
+ width?: number;
14
+ height?: number;
15
+ srcset?: string;
16
+ loading?: 'lazy' | 'eager';
17
+ }
18
+ export interface ExtractedMeta {
19
+ title?: string;
20
+ description?: string;
21
+ keywords?: string[];
22
+ author?: string;
23
+ robots?: string;
24
+ canonical?: string;
25
+ viewport?: string;
26
+ charset?: string;
27
+ [key: string]: string | string[] | undefined;
28
+ }
29
+ export interface OpenGraphData {
30
+ title?: string;
31
+ type?: string;
32
+ url?: string;
33
+ image?: string | string[];
34
+ description?: string;
35
+ siteName?: string;
36
+ locale?: string;
37
+ [key: string]: string | string[] | undefined;
38
+ }
39
+ export interface TwitterCardData {
40
+ card?: 'summary' | 'summary_large_image' | 'app' | 'player';
41
+ site?: string;
42
+ creator?: string;
43
+ title?: string;
44
+ description?: string;
45
+ image?: string;
46
+ [key: string]: string | undefined;
47
+ }
48
+ export interface JsonLdData {
49
+ '@context'?: string;
50
+ '@type'?: string;
51
+ [key: string]: unknown;
52
+ }
53
+ export interface ExtractedForm {
54
+ action?: string;
55
+ method?: string;
56
+ name?: string;
57
+ id?: string;
58
+ fields: ExtractedFormField[];
59
+ }
60
+ export interface ExtractedFormField {
61
+ name?: string;
62
+ type?: string;
63
+ value?: string;
64
+ placeholder?: string;
65
+ required?: boolean;
66
+ options?: {
67
+ value: string;
68
+ text: string;
69
+ }[];
70
+ }
71
+ export interface ExtractedTable {
72
+ headers: string[];
73
+ rows: string[][];
74
+ caption?: string;
75
+ }
76
+ export interface ExtractedScript {
77
+ src?: string;
78
+ type?: string;
79
+ async?: boolean;
80
+ defer?: boolean;
81
+ inline?: string;
82
+ }
83
+ export interface ExtractedStyle {
84
+ href?: string;
85
+ media?: string;
86
+ inline?: string;
87
+ }
88
+ export type ExtractionSchemaField = string | {
89
+ selector: string;
90
+ attribute?: string;
91
+ multiple?: boolean;
92
+ transform?: (value: string) => unknown;
93
+ };
94
+ export interface ExtractionSchema {
95
+ [key: string]: ExtractionSchemaField;
96
+ }
97
+ export interface ScrapeOptions {
98
+ baseUrl?: string;
99
+ }
100
+ export interface LinkExtractionOptions {
101
+ selector?: string;
102
+ absolute?: boolean;
103
+ }
104
+ export interface ImageExtractionOptions {
105
+ selector?: string;
106
+ absolute?: boolean;
107
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { ReckerRequest, ReckerResponse, Transport } from '../types/index.js';
2
+ export interface FetchTransportOptions {
3
+ credentials?: RequestCredentials;
4
+ cache?: RequestCache;
5
+ keepalive?: boolean;
6
+ }
7
+ export declare class FetchTransport implements Transport {
8
+ private options;
9
+ constructor(options?: FetchTransportOptions);
10
+ dispatch(req: ReckerRequest): Promise<ReckerResponse>;
11
+ }
@@ -0,0 +1,143 @@
1
+ export class FetchTransport {
2
+ options;
3
+ constructor(options = {}) {
4
+ this.options = options;
5
+ }
6
+ async dispatch(req) {
7
+ const start = performance.now();
8
+ let timeoutId;
9
+ let abortController;
10
+ const timeoutMs = typeof req.timeout === 'number'
11
+ ? req.timeout
12
+ : req.timeout?.request;
13
+ let signal = req.signal;
14
+ if (timeoutMs && !signal) {
15
+ abortController = new AbortController();
16
+ signal = abortController.signal;
17
+ timeoutId = setTimeout(() => abortController.abort(), timeoutMs);
18
+ }
19
+ const requestInit = {
20
+ method: req.method,
21
+ headers: req.headers,
22
+ body: req.body,
23
+ signal,
24
+ credentials: this.options.credentials,
25
+ cache: this.options.cache,
26
+ keepalive: this.options.keepalive ?? true,
27
+ duplex: req.body ? 'half' : undefined
28
+ };
29
+ try {
30
+ const response = await globalThis.fetch(req.url, requestInit);
31
+ const totalTime = performance.now() - start;
32
+ const timings = {
33
+ total: totalTime,
34
+ firstByte: totalTime,
35
+ };
36
+ return new FetchResponseWrapper(response, timings);
37
+ }
38
+ catch (error) {
39
+ if (error.name === 'AbortError' && abortController) {
40
+ const timeoutError = new Error(`Request timeout after ${timeoutMs}ms`);
41
+ timeoutError.name = 'TimeoutError';
42
+ throw timeoutError;
43
+ }
44
+ throw error;
45
+ }
46
+ finally {
47
+ if (timeoutId)
48
+ clearTimeout(timeoutId);
49
+ }
50
+ }
51
+ }
52
+ class FetchResponseWrapper {
53
+ raw;
54
+ timings;
55
+ constructor(raw, timings) {
56
+ this.raw = raw;
57
+ this.timings = timings;
58
+ }
59
+ get status() { return this.raw.status; }
60
+ get statusText() { return this.raw.statusText; }
61
+ get headers() { return this.raw.headers; }
62
+ get ok() { return this.raw.ok; }
63
+ get url() { return this.raw.url; }
64
+ get connection() { return {}; }
65
+ json() { return this.raw.json(); }
66
+ text() { return this.raw.text(); }
67
+ blob() { return this.raw.blob(); }
68
+ async cleanText() { return (await this.text()).replace(/<[^>]*>?/gm, ''); }
69
+ read() { return this.raw.body; }
70
+ clone() { return new FetchResponseWrapper(this.raw.clone(), this.timings); }
71
+ async *sse() {
72
+ if (!this.raw.body)
73
+ return;
74
+ const stream = this.raw.body.pipeThrough(new TextDecoderStream());
75
+ const reader = stream.getReader();
76
+ let buffer = '';
77
+ while (true) {
78
+ const { done, value } = await reader.read();
79
+ if (done)
80
+ break;
81
+ buffer += value;
82
+ const events = buffer.split('\n\n');
83
+ buffer = events.pop() || '';
84
+ for (const event of events) {
85
+ if (!event.trim())
86
+ continue;
87
+ let data = '';
88
+ let eventType;
89
+ let id;
90
+ let retry;
91
+ const lines = event.split('\n');
92
+ for (const line of lines) {
93
+ if (line.startsWith('data: ')) {
94
+ data = data ? data + '\n' + line.slice(6) : line.slice(6);
95
+ }
96
+ else if (line.startsWith('event: ')) {
97
+ eventType = line.slice(7);
98
+ }
99
+ else if (line.startsWith('id: ')) {
100
+ id = line.slice(4);
101
+ }
102
+ else if (line.startsWith('retry: ')) {
103
+ retry = parseInt(line.slice(7), 10);
104
+ }
105
+ }
106
+ if (data) {
107
+ yield { data, event: eventType, id, retry };
108
+ }
109
+ }
110
+ }
111
+ }
112
+ async *download() {
113
+ if (!this.raw.body)
114
+ return;
115
+ const reader = this.raw.body.getReader();
116
+ let loaded = 0;
117
+ const total = Number(this.raw.headers.get('content-length')) || undefined;
118
+ while (true) {
119
+ const { done, value } = await reader.read();
120
+ if (done)
121
+ break;
122
+ loaded += value.length;
123
+ yield {
124
+ loaded,
125
+ transferred: loaded,
126
+ total,
127
+ percent: total ? (loaded / total) * 100 : undefined,
128
+ direction: 'download'
129
+ };
130
+ }
131
+ }
132
+ async *[Symbol.asyncIterator]() {
133
+ if (!this.raw.body)
134
+ return;
135
+ const reader = this.raw.body.getReader();
136
+ while (true) {
137
+ const { done, value } = await reader.read();
138
+ if (done)
139
+ break;
140
+ yield value;
141
+ }
142
+ }
143
+ }
@@ -0,0 +1,38 @@
1
+ import { ReckerRequest, ReckerResponse, Transport, ProxyOptions, HTTP2Options, DNSOptions, TLSOptions } from '../types/index.js';
2
+ import { AgentManager } from '../utils/agent-manager.js';
3
+ interface UndiciTransportOptions {
4
+ connectTimeout?: number;
5
+ headersTimeout?: number;
6
+ bodyTimeout?: number;
7
+ maxRedirections?: number;
8
+ proxy?: ProxyOptions | string;
9
+ http2?: HTTP2Options;
10
+ dns?: DNSOptions;
11
+ agent?: AgentManager;
12
+ tls?: TLSOptions;
13
+ socketPath?: string;
14
+ connections?: number;
15
+ pipelining?: number;
16
+ keepAlive?: boolean;
17
+ keepAliveTimeout?: number;
18
+ keepAliveMaxTimeout?: number;
19
+ perDomainPooling?: boolean;
20
+ localAddress?: string;
21
+ observability?: boolean;
22
+ }
23
+ export declare class UndiciTransport implements Transport {
24
+ private static requestCounter;
25
+ private baseUrl;
26
+ private options;
27
+ private proxyAgent?;
28
+ private dnsAgent?;
29
+ private agentManager?;
30
+ private proxyBypassList?;
31
+ private tlsOptions?;
32
+ private socketClient?;
33
+ private observability;
34
+ constructor(baseUrl?: string, options?: UndiciTransportOptions);
35
+ dispatch(req: ReckerRequest): Promise<ReckerResponse>;
36
+ private dispatchFast;
37
+ }
38
+ export {};