recker 1.0.2-0 → 1.0.4

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 (287) hide show
  1. package/LICENSE +0 -2
  2. package/README.md +121 -72
  3. package/dist/cache/memory-storage.d.ts.map +1 -1
  4. package/dist/cache/memory-storage.js +7 -1
  5. package/dist/constants/http-status.d.ts +74 -0
  6. package/dist/constants/http-status.d.ts.map +1 -0
  7. package/dist/constants/http-status.js +156 -0
  8. package/dist/constants.d.ts.map +1 -1
  9. package/dist/constants.js +6 -6
  10. package/dist/cookies/memory-cookie-jar.d.ts +31 -0
  11. package/dist/cookies/memory-cookie-jar.d.ts.map +1 -0
  12. package/dist/cookies/memory-cookie-jar.js +210 -0
  13. package/dist/core/client.d.ts +9 -0
  14. package/dist/core/client.d.ts.map +1 -1
  15. package/dist/core/client.js +252 -53
  16. package/dist/core/errors.d.ts +18 -2
  17. package/dist/core/errors.d.ts.map +1 -1
  18. package/dist/core/errors.js +66 -5
  19. package/dist/core/index.d.ts +6 -0
  20. package/dist/core/index.d.ts.map +1 -0
  21. package/dist/core/index.js +5 -0
  22. package/dist/core/request-promise.d.ts.map +1 -1
  23. package/dist/core/request-promise.js +8 -2
  24. package/dist/core/request.d.ts +7 -1
  25. package/dist/core/request.d.ts.map +1 -1
  26. package/dist/core/request.js +32 -0
  27. package/dist/core/response.d.ts +2 -0
  28. package/dist/core/response.d.ts.map +1 -1
  29. package/dist/core/response.js +44 -19
  30. package/dist/events/request-events.d.ts +48 -0
  31. package/dist/events/request-events.d.ts.map +1 -0
  32. package/dist/events/request-events.js +85 -0
  33. package/dist/index.d.ts +28 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +28 -2
  36. package/dist/mcp/client.d.ts.map +1 -1
  37. package/dist/mcp/client.js +16 -5
  38. package/dist/mcp/contract.d.ts +77 -0
  39. package/dist/mcp/contract.d.ts.map +1 -0
  40. package/dist/mcp/contract.js +278 -0
  41. package/dist/mcp/types.d.ts +1 -0
  42. package/dist/mcp/types.d.ts.map +1 -1
  43. package/dist/plugins/auth.d.ts +45 -0
  44. package/dist/plugins/auth.d.ts.map +1 -0
  45. package/dist/plugins/auth.js +268 -0
  46. package/dist/plugins/cache.d.ts +7 -1
  47. package/dist/plugins/cache.d.ts.map +1 -1
  48. package/dist/plugins/cache.js +470 -49
  49. package/dist/plugins/circuit-breaker.js +1 -1
  50. package/dist/plugins/compression.d.ts.map +1 -1
  51. package/dist/plugins/compression.js +3 -3
  52. package/dist/plugins/dedup.d.ts.map +1 -1
  53. package/dist/plugins/dedup.js +2 -1
  54. package/dist/plugins/graphql.d.ts +4 -3
  55. package/dist/plugins/graphql.d.ts.map +1 -1
  56. package/dist/plugins/graphql.js +24 -5
  57. package/dist/plugins/grpc-web.d.ts +80 -0
  58. package/dist/plugins/grpc-web.d.ts.map +1 -0
  59. package/dist/plugins/grpc-web.js +261 -0
  60. package/dist/plugins/har-player.d.ts.map +1 -1
  61. package/dist/plugins/har-player.js +11 -2
  62. package/dist/plugins/hls.d.ts +33 -0
  63. package/dist/plugins/hls.d.ts.map +1 -0
  64. package/dist/plugins/hls.js +225 -0
  65. package/dist/plugins/http2-push.d.ts +64 -0
  66. package/dist/plugins/http2-push.d.ts.map +1 -0
  67. package/dist/plugins/http2-push.js +274 -0
  68. package/dist/plugins/http3.d.ts +76 -0
  69. package/dist/plugins/http3.d.ts.map +1 -0
  70. package/dist/plugins/http3.js +231 -0
  71. package/dist/plugins/interface-rotator.d.ts +10 -0
  72. package/dist/plugins/interface-rotator.d.ts.map +1 -0
  73. package/dist/plugins/interface-rotator.js +57 -0
  74. package/dist/plugins/jsonrpc.d.ts +76 -0
  75. package/dist/plugins/jsonrpc.d.ts.map +1 -0
  76. package/dist/plugins/jsonrpc.js +143 -0
  77. package/dist/plugins/logger.d.ts +8 -5
  78. package/dist/plugins/logger.d.ts.map +1 -1
  79. package/dist/plugins/logger.js +66 -30
  80. package/dist/plugins/odata.d.ts +182 -0
  81. package/dist/plugins/odata.d.ts.map +1 -0
  82. package/dist/plugins/odata.js +561 -0
  83. package/dist/plugins/retry.d.ts +1 -0
  84. package/dist/plugins/retry.d.ts.map +1 -1
  85. package/dist/plugins/retry.js +26 -2
  86. package/dist/plugins/scrape.d.ts +22 -0
  87. package/dist/plugins/scrape.d.ts.map +1 -0
  88. package/dist/plugins/scrape.js +87 -0
  89. package/dist/plugins/soap.d.ts +73 -0
  90. package/dist/plugins/soap.d.ts.map +1 -0
  91. package/dist/plugins/soap.js +347 -0
  92. package/dist/plugins/user-agent.d.ts +8 -0
  93. package/dist/plugins/user-agent.d.ts.map +1 -0
  94. package/dist/plugins/user-agent.js +46 -0
  95. package/dist/plugins/xml.d.ts +10 -0
  96. package/dist/plugins/xml.d.ts.map +1 -0
  97. package/dist/plugins/xml.js +194 -0
  98. package/dist/presets/anthropic.d.ts +7 -0
  99. package/dist/presets/anthropic.d.ts.map +1 -0
  100. package/dist/presets/anthropic.js +17 -0
  101. package/dist/presets/azure-openai.d.ts +9 -0
  102. package/dist/presets/azure-openai.d.ts.map +1 -0
  103. package/dist/presets/azure-openai.js +25 -0
  104. package/dist/presets/cloudflare.d.ts +13 -0
  105. package/dist/presets/cloudflare.d.ts.map +1 -0
  106. package/dist/presets/cloudflare.js +39 -0
  107. package/dist/presets/cohere.d.ts +6 -0
  108. package/dist/presets/cohere.d.ts.map +1 -0
  109. package/dist/presets/cohere.js +16 -0
  110. package/dist/presets/deepseek.d.ts +6 -0
  111. package/dist/presets/deepseek.d.ts.map +1 -0
  112. package/dist/presets/deepseek.js +16 -0
  113. package/dist/presets/digitalocean.d.ts +6 -0
  114. package/dist/presets/digitalocean.d.ts.map +1 -0
  115. package/dist/presets/digitalocean.js +16 -0
  116. package/dist/presets/discord.d.ts +7 -0
  117. package/dist/presets/discord.d.ts.map +1 -0
  118. package/dist/presets/discord.js +17 -0
  119. package/dist/presets/fireworks.d.ts +6 -0
  120. package/dist/presets/fireworks.d.ts.map +1 -0
  121. package/dist/presets/fireworks.js +16 -0
  122. package/dist/presets/gemini.d.ts +6 -0
  123. package/dist/presets/gemini.d.ts.map +1 -0
  124. package/dist/presets/gemini.js +16 -0
  125. package/dist/presets/github.d.ts +7 -0
  126. package/dist/presets/github.d.ts.map +1 -0
  127. package/dist/presets/github.js +17 -0
  128. package/dist/presets/gitlab.d.ts +7 -0
  129. package/dist/presets/gitlab.d.ts.map +1 -0
  130. package/dist/presets/gitlab.js +16 -0
  131. package/dist/presets/groq.d.ts +6 -0
  132. package/dist/presets/groq.d.ts.map +1 -0
  133. package/dist/presets/groq.js +16 -0
  134. package/dist/presets/huggingface.d.ts +6 -0
  135. package/dist/presets/huggingface.d.ts.map +1 -0
  136. package/dist/presets/huggingface.js +16 -0
  137. package/dist/presets/index.d.ts +28 -0
  138. package/dist/presets/index.d.ts.map +1 -0
  139. package/dist/presets/index.js +27 -0
  140. package/dist/presets/linear.d.ts +6 -0
  141. package/dist/presets/linear.d.ts.map +1 -0
  142. package/dist/presets/linear.js +16 -0
  143. package/dist/presets/mistral.d.ts +6 -0
  144. package/dist/presets/mistral.d.ts.map +1 -0
  145. package/dist/presets/mistral.js +16 -0
  146. package/dist/presets/notion.d.ts +7 -0
  147. package/dist/presets/notion.d.ts.map +1 -0
  148. package/dist/presets/notion.js +17 -0
  149. package/dist/presets/openai.d.ts +8 -0
  150. package/dist/presets/openai.d.ts.map +1 -0
  151. package/dist/presets/openai.js +23 -0
  152. package/dist/presets/perplexity.d.ts +6 -0
  153. package/dist/presets/perplexity.d.ts.map +1 -0
  154. package/dist/presets/perplexity.js +16 -0
  155. package/dist/presets/registry.d.ts +20 -0
  156. package/dist/presets/registry.d.ts.map +1 -0
  157. package/dist/presets/registry.js +311 -0
  158. package/dist/presets/replicate.d.ts +6 -0
  159. package/dist/presets/replicate.d.ts.map +1 -0
  160. package/dist/presets/replicate.js +16 -0
  161. package/dist/presets/slack.d.ts +6 -0
  162. package/dist/presets/slack.d.ts.map +1 -0
  163. package/dist/presets/slack.js +16 -0
  164. package/dist/presets/stripe.d.ts +8 -0
  165. package/dist/presets/stripe.d.ts.map +1 -0
  166. package/dist/presets/stripe.js +23 -0
  167. package/dist/presets/supabase.d.ts +7 -0
  168. package/dist/presets/supabase.d.ts.map +1 -0
  169. package/dist/presets/supabase.js +18 -0
  170. package/dist/presets/together.d.ts +6 -0
  171. package/dist/presets/together.d.ts.map +1 -0
  172. package/dist/presets/together.js +16 -0
  173. package/dist/presets/twilio.d.ts +7 -0
  174. package/dist/presets/twilio.d.ts.map +1 -0
  175. package/dist/presets/twilio.js +17 -0
  176. package/dist/presets/vercel.d.ts +7 -0
  177. package/dist/presets/vercel.d.ts.map +1 -0
  178. package/dist/presets/vercel.js +23 -0
  179. package/dist/presets/xai.d.ts +7 -0
  180. package/dist/presets/xai.d.ts.map +1 -0
  181. package/dist/presets/xai.js +17 -0
  182. package/dist/protocols/ftp.d.ts +63 -0
  183. package/dist/protocols/ftp.d.ts.map +1 -0
  184. package/dist/protocols/ftp.js +388 -0
  185. package/dist/protocols/index.d.ts +4 -0
  186. package/dist/protocols/index.d.ts.map +1 -0
  187. package/dist/protocols/index.js +3 -0
  188. package/dist/protocols/sftp.d.ts +65 -0
  189. package/dist/protocols/sftp.d.ts.map +1 -0
  190. package/dist/protocols/sftp.js +346 -0
  191. package/dist/protocols/telnet.d.ts +50 -0
  192. package/dist/protocols/telnet.d.ts.map +1 -0
  193. package/dist/protocols/telnet.js +139 -0
  194. package/dist/runner/request-runner.d.ts.map +1 -1
  195. package/dist/runner/request-runner.js +1 -0
  196. package/dist/scrape/document.d.ts +44 -0
  197. package/dist/scrape/document.d.ts.map +1 -0
  198. package/dist/scrape/document.js +198 -0
  199. package/dist/scrape/element.d.ts +50 -0
  200. package/dist/scrape/element.d.ts.map +1 -0
  201. package/dist/scrape/element.js +176 -0
  202. package/dist/scrape/extractors.d.ts +17 -0
  203. package/dist/scrape/extractors.d.ts.map +1 -0
  204. package/dist/scrape/extractors.js +356 -0
  205. package/dist/scrape/index.d.ts +5 -0
  206. package/dist/scrape/index.d.ts.map +1 -0
  207. package/dist/scrape/index.js +3 -0
  208. package/dist/scrape/types.d.ts +108 -0
  209. package/dist/scrape/types.d.ts.map +1 -0
  210. package/dist/scrape/types.js +1 -0
  211. package/dist/testing/index.d.ts +3 -0
  212. package/dist/testing/index.d.ts.map +1 -0
  213. package/dist/testing/index.js +1 -0
  214. package/dist/testing/mock.d.ts +58 -0
  215. package/dist/testing/mock.d.ts.map +1 -0
  216. package/dist/testing/mock.js +252 -0
  217. package/dist/transport/fetch.d.ts.map +1 -1
  218. package/dist/transport/fetch.js +12 -4
  219. package/dist/transport/undici.d.ts +17 -1
  220. package/dist/transport/undici.d.ts.map +1 -1
  221. package/dist/transport/undici.js +708 -47
  222. package/dist/types/index.d.ts +111 -10
  223. package/dist/types/index.d.ts.map +1 -1
  224. package/dist/types/index.js +1 -1
  225. package/dist/types/logger.d.ts +17 -0
  226. package/dist/types/logger.d.ts.map +1 -0
  227. package/dist/types/logger.js +66 -0
  228. package/dist/utils/agent-manager.d.ts.map +1 -1
  229. package/dist/utils/agent-manager.js +20 -4
  230. package/dist/utils/body.d.ts.map +1 -1
  231. package/dist/utils/body.js +14 -2
  232. package/dist/utils/charset.d.ts +16 -0
  233. package/dist/utils/charset.d.ts.map +1 -0
  234. package/dist/utils/charset.js +169 -0
  235. package/dist/utils/client-pool.d.ts +21 -0
  236. package/dist/utils/client-pool.d.ts.map +1 -0
  237. package/dist/utils/client-pool.js +49 -0
  238. package/dist/utils/concurrency.d.ts.map +1 -1
  239. package/dist/utils/concurrency.js +8 -4
  240. package/dist/utils/dns-toolkit.d.ts +13 -0
  241. package/dist/utils/dns-toolkit.d.ts.map +1 -0
  242. package/dist/utils/dns-toolkit.js +48 -0
  243. package/dist/utils/doh.d.ts.map +1 -1
  244. package/dist/utils/doh.js +16 -3
  245. package/dist/utils/download.d.ts +15 -0
  246. package/dist/utils/download.d.ts.map +1 -0
  247. package/dist/utils/download.js +44 -0
  248. package/dist/utils/env-proxy.d.ts +13 -0
  249. package/dist/utils/env-proxy.d.ts.map +1 -0
  250. package/dist/utils/env-proxy.js +105 -0
  251. package/dist/utils/header-parser.d.ts +15 -1
  252. package/dist/utils/header-parser.d.ts.map +1 -1
  253. package/dist/utils/header-parser.js +161 -1
  254. package/dist/utils/link-header.d.ts +70 -0
  255. package/dist/utils/link-header.d.ts.map +1 -0
  256. package/dist/utils/link-header.js +190 -0
  257. package/dist/utils/progress.d.ts +7 -2
  258. package/dist/utils/progress.d.ts.map +1 -1
  259. package/dist/utils/progress.js +48 -15
  260. package/dist/utils/rdap.d.ts +17 -0
  261. package/dist/utils/rdap.d.ts.map +1 -0
  262. package/dist/utils/rdap.js +32 -0
  263. package/dist/utils/request-pool.d.ts.map +1 -1
  264. package/dist/utils/request-pool.js +4 -3
  265. package/dist/utils/sse.d.ts.map +1 -1
  266. package/dist/utils/sse.js +8 -2
  267. package/dist/utils/status-codes.d.ts +84 -0
  268. package/dist/utils/status-codes.d.ts.map +1 -0
  269. package/dist/utils/status-codes.js +204 -0
  270. package/dist/utils/streaming.d.ts.map +1 -1
  271. package/dist/utils/streaming.js +1 -0
  272. package/dist/utils/tls-inspector.d.ts +21 -0
  273. package/dist/utils/tls-inspector.d.ts.map +1 -0
  274. package/dist/utils/tls-inspector.js +39 -0
  275. package/dist/utils/try-fn.d.ts.map +1 -1
  276. package/dist/utils/try-fn.js +11 -5
  277. package/dist/utils/upload.d.ts +1 -0
  278. package/dist/utils/upload.d.ts.map +1 -1
  279. package/dist/utils/upload.js +20 -3
  280. package/dist/utils/user-agent.d.ts +9 -9
  281. package/dist/utils/user-agent.js +9 -9
  282. package/dist/utils/whois.d.ts.map +1 -1
  283. package/dist/utils/whois.js +11 -2
  284. package/dist/websocket/client.d.ts +29 -1
  285. package/dist/websocket/client.d.ts.map +1 -1
  286. package/dist/websocket/client.js +145 -13
  287. package/package.json +45 -8
@@ -0,0 +1,21 @@
1
+ import { Client } from '../core/client.js';
2
+ import type { ExtendedClientOptions } from '../core/client.js';
3
+ export declare class ClientPool {
4
+ private pool;
5
+ private defaultOptions;
6
+ constructor(options?: Omit<ExtendedClientOptions, 'baseUrl'>);
7
+ get(baseUrl: string): Client;
8
+ has(baseUrl: string): boolean;
9
+ get size(): number;
10
+ clear(): void;
11
+ remove(baseUrl: string): boolean;
12
+ multi<T = unknown>(requests: Array<{
13
+ baseUrl: string;
14
+ path: string;
15
+ method?: string;
16
+ options?: Record<string, unknown>;
17
+ }>): Promise<T[]>;
18
+ }
19
+ export declare const globalPool: ClientPool;
20
+ export declare function createDedupPool(options?: Omit<ExtendedClientOptions, 'baseUrl' | 'dedup'>): ClientPool;
21
+ //# sourceMappingURL=client-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-pool.d.ts","sourceRoot":"","sources":["../../src/utils/client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAwB/D,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,cAAc,CAAyC;gBAEnD,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAM;IAQhE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAiB5B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,KAAK,IAAI,IAAI;IAOb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAmB1B,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC,GACD,OAAO,CAAC,CAAC,EAAE,CAAC;CAchB;AAcD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAW3C,wBAAgB,eAAe,CAAC,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,CAAM,GAAG,UAAU,CAK1G"}
@@ -0,0 +1,49 @@
1
+ import { Client } from '../core/client.js';
2
+ export class ClientPool {
3
+ pool = new Map();
4
+ defaultOptions;
5
+ constructor(options = {}) {
6
+ this.defaultOptions = options;
7
+ }
8
+ get(baseUrl) {
9
+ let client = this.pool.get(baseUrl);
10
+ if (!client) {
11
+ client = new Client({
12
+ ...this.defaultOptions,
13
+ baseUrl,
14
+ });
15
+ this.pool.set(baseUrl, client);
16
+ }
17
+ return client;
18
+ }
19
+ has(baseUrl) {
20
+ return this.pool.has(baseUrl);
21
+ }
22
+ get size() {
23
+ return this.pool.size;
24
+ }
25
+ clear() {
26
+ this.pool.clear();
27
+ }
28
+ remove(baseUrl) {
29
+ return this.pool.delete(baseUrl);
30
+ }
31
+ async multi(requests) {
32
+ const promises = requests.map(({ baseUrl, path, method = 'GET', options = {} }) => {
33
+ const client = this.get(baseUrl);
34
+ const methodFn = client[method.toLowerCase()];
35
+ if (typeof methodFn !== 'function') {
36
+ throw new Error(`Unknown HTTP method: ${method}`);
37
+ }
38
+ return methodFn.call(client, path, options).json();
39
+ });
40
+ return Promise.all(promises);
41
+ }
42
+ }
43
+ export const globalPool = new ClientPool();
44
+ export function createDedupPool(options = {}) {
45
+ return new ClientPool({
46
+ ...options,
47
+ dedup: {},
48
+ });
49
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,YAAY,EAEZ,aAAa,EACd,MAAM,mBAAmB,CAAC;AAK3B,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,YAAY,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,KAAK,EAAE;QACL,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AA+BD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,GACpD,2BAA2B,CAuE7B;AAiED,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,OAAO,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,UAAU,GAAE,MAAU,GACrB,MAAM,CAaR;AA4BD,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,2BAA2B,EAC5C,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,GACnB,2BAA2B,CA6B7B"}
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,YAAY,EAEZ,aAAa,EACd,MAAM,mBAAmB,CAAC;AAK3B,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,YAAY,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,KAAK,EAAE;QACL,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AA8BD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,GACpD,2BAA2B,CAuE7B;AAqED,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,OAAO,EACrB,eAAe,CAAC,EAAE,MAAM,EACxB,UAAU,GAAE,MAAU,GACrB,MAAM,CAaR;AA4BD,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,2BAA2B,EAC5C,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,GACnB,2BAA2B,CA6B7B"}
@@ -1,4 +1,4 @@
1
- const DEFAULT_INTERVAL = 1000;
1
+ const DEFAULT_INTERVAL = 1 * 1000;
2
2
  export function normalizeConcurrency(options) {
3
3
  let config;
4
4
  if (typeof options.concurrency === 'number') {
@@ -57,10 +57,14 @@ function normalizeAgentConfig(agentConfig, maxConcurrent, http2Enabled, http2Max
57
57
  const defaults = {
58
58
  pipelining: 1,
59
59
  keepAlive: true,
60
- keepAliveTimeout: 4000,
61
- keepAliveMaxTimeout: 600000,
62
- connectTimeout: 10000,
60
+ keepAliveTimeout: 4 * 1000,
61
+ keepAliveMaxTimeout: 10 * 60 * 1000,
62
+ keepAliveTimeoutThreshold: 1 * 1000,
63
+ connectTimeout: 10 * 1000,
63
64
  perDomainPooling: true,
65
+ maxCachedSessions: 100,
66
+ maxRequestsPerClient: 0,
67
+ clientTtl: null,
64
68
  };
65
69
  const merged = { ...defaults, ...agentConfig };
66
70
  let connections;
@@ -0,0 +1,13 @@
1
+ export interface DnsSecurityRecords {
2
+ spf?: string[];
3
+ dmarc?: string;
4
+ caa?: {
5
+ issue?: string[];
6
+ issuewild?: string[];
7
+ iodef?: string;
8
+ };
9
+ mx?: string[];
10
+ txt?: string[];
11
+ }
12
+ export declare function getSecurityRecords(domain: string): Promise<DnsSecurityRecords>;
13
+ //# sourceMappingURL=dns-toolkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-toolkit.d.ts","sourceRoot":"","sources":["../../src/utils/dns-toolkit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+DpF"}
@@ -0,0 +1,48 @@
1
+ import { promises as dns } from 'node:dns';
2
+ export async function getSecurityRecords(domain) {
3
+ const results = { txt: [] };
4
+ try {
5
+ const txtRecords = await dns.resolveTxt(domain);
6
+ const flatTxt = txtRecords.map(chunks => chunks.join(''));
7
+ results.txt = flatTxt;
8
+ results.spf = flatTxt.filter(txt => txt.startsWith('v=spf1'));
9
+ try {
10
+ const dmarcRecords = await dns.resolveTxt(`_dmarc.${domain}`);
11
+ const dmarcTxt = dmarcRecords.map(chunks => chunks.join(''))[0];
12
+ if (dmarcTxt && dmarcTxt.startsWith('v=DMARC1')) {
13
+ results.dmarc = dmarcTxt;
14
+ }
15
+ }
16
+ catch {
17
+ }
18
+ try {
19
+ const caaRecords = await dns.resolveCaa(domain);
20
+ results.caa = {};
21
+ caaRecords.forEach(r => {
22
+ if (!results.caa[r.issue]) {
23
+ }
24
+ if (r.issue) {
25
+ results.caa.issue = [...(results.caa.issue || []), r.issue];
26
+ }
27
+ if (r.issuewild) {
28
+ results.caa.issuewild = [...(results.caa.issuewild || []), r.issuewild];
29
+ }
30
+ if (r.iodef) {
31
+ results.caa.iodef = r.iodef;
32
+ }
33
+ });
34
+ }
35
+ catch {
36
+ }
37
+ try {
38
+ const mx = await dns.resolveMx(domain);
39
+ results.mx = mx.map(r => r.exchange);
40
+ }
41
+ catch {
42
+ }
43
+ }
44
+ catch (error) {
45
+ throw new Error(`Failed to resolve DNS for ${domain}: ${error}`);
46
+ }
47
+ return results;
48
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/utils/doh.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAsBrE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAA0B,IAGpD,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,mBAqClH"}
1
+ {"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/utils/doh.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAsBrE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAA0B,IAGpD,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,mBAwElH"}
package/dist/utils/doh.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { request } from 'undici';
2
+ import { ReckerError } from '../core/errors.js';
2
3
  const PROVIDERS = {
3
4
  cloudflare: 'https://1.1.1.1/dns-query',
4
5
  google: 'https://8.8.8.8/resolve',
@@ -16,17 +17,29 @@ export function createDoHLookup(provider = 'cloudflare') {
16
17
  headers: { 'Accept': 'application/dns-json' }
17
18
  });
18
19
  if (statusCode !== 200) {
19
- throw new Error(`DoH request failed with status ${statusCode}`);
20
+ throw new ReckerError(`DoH request failed with status ${statusCode}`, undefined, undefined, [
21
+ 'Verify the DNS-over-HTTPS endpoint URL.',
22
+ 'Check network connectivity and TLS settings for the DoH provider.',
23
+ 'Retry the request; some providers throttle bursts.'
24
+ ]);
20
25
  }
21
26
  const data = await body.json();
22
27
  if (data.Status !== 0 || !data.Answer || data.Answer.length === 0) {
23
- return callback(new Error(`DNS lookup failed for ${hostname}`), '', 4);
28
+ return callback(new ReckerError(`DNS lookup failed for ${hostname}`, undefined, undefined, [
29
+ 'Confirm the hostname is correct.',
30
+ 'Check that the DoH provider is reachable.',
31
+ 'Retry or fall back to system DNS if the provider is down.'
32
+ ]), '', 4);
24
33
  }
25
34
  const record = data.Answer.find(r => r.type === 1);
26
35
  if (record) {
27
36
  return callback(null, record.data, 4);
28
37
  }
29
- callback(new Error(`No A record found for ${hostname}`), '', 4);
38
+ callback(new ReckerError(`No A record found for ${hostname}`, undefined, undefined, [
39
+ 'Verify the domain has an A record (or use AAAA for IPv6).',
40
+ 'Check DNS propagation if the record was recently added.',
41
+ 'Try an alternate resolver to rule out stale caches.'
42
+ ]), '', 4);
30
43
  }
31
44
  catch (err) {
32
45
  callback(err, '', 0);
@@ -0,0 +1,15 @@
1
+ import { Client } from '../core/client.js';
2
+ import type { ProgressCallback, RequestOptions } from '../types/index.js';
3
+ export interface DownloadToFileOptions {
4
+ resume?: boolean;
5
+ headers?: Record<string, string> | Headers | [string, string][];
6
+ onProgress?: ProgressCallback;
7
+ request?: Omit<RequestOptions, 'headers' | 'onDownloadProgress'>;
8
+ }
9
+ export interface DownloadResult {
10
+ resumed: boolean;
11
+ status: number;
12
+ bytesWritten: number;
13
+ }
14
+ export declare function downloadToFile(client: Client, url: string, destination: string, options?: DownloadToFileOptions): Promise<DownloadResult>;
15
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,WAAW,qBAAqB;IAKpC,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAKhE,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAK9B,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
@@ -0,0 +1,44 @@
1
+ import { createWriteStream, existsSync, statSync } from 'node:fs';
2
+ import { pipeline } from 'node:stream/promises';
3
+ import { ReckerError } from '../core/errors.js';
4
+ export async function downloadToFile(client, url, destination, options = {}) {
5
+ const resumeEnabled = options.resume === true;
6
+ const existingSize = resumeEnabled && existsSync(destination) ? statSync(destination).size : 0;
7
+ const headers = new Headers(options.headers || {});
8
+ if (resumeEnabled && existingSize > 0 && !headers.has('Range')) {
9
+ headers.set('Range', `bytes=${existingSize}-`);
10
+ }
11
+ const response = await client.get(url, {
12
+ ...(options.request || {}),
13
+ headers,
14
+ onDownloadProgress: options.onProgress,
15
+ });
16
+ const shouldAppend = resumeEnabled && existingSize > 0 && response.status === 206;
17
+ if (resumeEnabled && existingSize > 0 && response.status === 416) {
18
+ throw new ReckerError('Requested range not satisfiable for resume download.', undefined, response, [
19
+ 'Verify the destination file size matches the server content.',
20
+ 'Delete the local file and retry without resume.',
21
+ 'Ensure the server supports Range requests for this resource.'
22
+ ]);
23
+ }
24
+ const bytesWritten = await streamToFile(response, destination, shouldAppend);
25
+ return {
26
+ resumed: shouldAppend,
27
+ status: response.status,
28
+ bytesWritten,
29
+ };
30
+ }
31
+ async function streamToFile(response, destination, append) {
32
+ const nodeStream = response.toNodeStream();
33
+ if (!nodeStream) {
34
+ throw new ReckerError('Response has no body to write', undefined, response, [
35
+ 'Ensure the request returned a body (avoid HEAD/204).',
36
+ 'Check upstream for empty responses or errors.',
37
+ 'Retry the download if the connection was interrupted.'
38
+ ]);
39
+ }
40
+ const writer = createWriteStream(destination, { flags: append ? 'a' : 'w' });
41
+ await pipeline(nodeStream, writer);
42
+ const written = writer.bytesWritten;
43
+ return written;
44
+ }
@@ -0,0 +1,13 @@
1
+ export interface EnvProxyOptions {
2
+ url?: string;
3
+ httpProxy?: string;
4
+ httpsProxy?: string;
5
+ noProxy?: string;
6
+ }
7
+ export declare function getProxyForUrl(url: string, options?: EnvProxyOptions): string | undefined;
8
+ export declare function shouldBypassProxy(hostname: string, port: string, noProxy: string): boolean;
9
+ export declare function getProxyEnv(): Record<string, string | undefined>;
10
+ export declare function createProxyConfig(url: string): {
11
+ url: string;
12
+ } | undefined;
13
+ //# sourceMappingURL=env-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-proxy.d.ts","sourceRoot":"","sources":["../../src/utils/env-proxy.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAI9B,GAAG,CAAC,EAAE,MAAM,CAAC;IAKb,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAKpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+BD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,GAAG,SAAS,CAkC7F;AAiBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAyD1F;AAgCD,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAWhE;AAoBD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI1E"}
@@ -0,0 +1,105 @@
1
+ export function getProxyForUrl(url, options = {}) {
2
+ let parsedUrl;
3
+ try {
4
+ parsedUrl = new URL(url);
5
+ }
6
+ catch {
7
+ return undefined;
8
+ }
9
+ const protocol = parsedUrl.protocol.replace(':', '').toLowerCase();
10
+ const noProxy = options.noProxy ?? process.env.NO_PROXY ?? process.env.no_proxy ?? '';
11
+ if (shouldBypassProxy(parsedUrl.hostname, parsedUrl.port, noProxy)) {
12
+ return undefined;
13
+ }
14
+ let proxy;
15
+ if (protocol === 'https') {
16
+ proxy = options.httpsProxy ??
17
+ process.env.HTTPS_PROXY ??
18
+ process.env.https_proxy ??
19
+ process.env.ALL_PROXY ??
20
+ process.env.all_proxy;
21
+ }
22
+ else {
23
+ proxy = options.httpProxy ??
24
+ process.env.HTTP_PROXY ??
25
+ process.env.http_proxy ??
26
+ process.env.ALL_PROXY ??
27
+ process.env.all_proxy;
28
+ }
29
+ return proxy || undefined;
30
+ }
31
+ export function shouldBypassProxy(hostname, port, noProxy) {
32
+ if (!noProxy || noProxy.trim() === '') {
33
+ return false;
34
+ }
35
+ hostname = hostname.toLowerCase();
36
+ const rules = noProxy.split(/[\s,]+/).filter(Boolean);
37
+ for (const rule of rules) {
38
+ const normalizedRule = rule.toLowerCase().trim();
39
+ if (normalizedRule === '*') {
40
+ return true;
41
+ }
42
+ if (normalizedRule.includes('/') && !normalizedRule.includes(':')) {
43
+ if (matchesCIDR(hostname, normalizedRule)) {
44
+ return true;
45
+ }
46
+ continue;
47
+ }
48
+ if (normalizedRule.includes(':') && !normalizedRule.startsWith('[')) {
49
+ const [ruleHost, rulePort] = normalizedRule.split(':');
50
+ if (hostname === ruleHost && (!rulePort || port === rulePort)) {
51
+ return true;
52
+ }
53
+ continue;
54
+ }
55
+ if (normalizedRule.startsWith('.')) {
56
+ if (hostname.endsWith(normalizedRule) || hostname === normalizedRule.slice(1)) {
57
+ return true;
58
+ }
59
+ continue;
60
+ }
61
+ if (hostname === normalizedRule) {
62
+ return true;
63
+ }
64
+ if (hostname.endsWith('.' + normalizedRule)) {
65
+ return true;
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ function matchesCIDR(ip, cidr) {
71
+ const [range, bits] = cidr.split('/');
72
+ if (!bits)
73
+ return ip === range;
74
+ const mask = parseInt(bits, 10);
75
+ if (isNaN(mask))
76
+ return false;
77
+ const ipParts = ip.split('.').map(Number);
78
+ const rangeParts = range.split('.').map(Number);
79
+ if (ipParts.length !== 4 || rangeParts.length !== 4)
80
+ return false;
81
+ if (ipParts.some(isNaN) || rangeParts.some(isNaN))
82
+ return false;
83
+ const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
84
+ const rangeNum = (rangeParts[0] << 24) | (rangeParts[1] << 16) | (rangeParts[2] << 8) | rangeParts[3];
85
+ const maskNum = ~((1 << (32 - mask)) - 1);
86
+ return (ipNum & maskNum) === (rangeNum & maskNum);
87
+ }
88
+ export function getProxyEnv() {
89
+ return {
90
+ HTTP_PROXY: process.env.HTTP_PROXY,
91
+ http_proxy: process.env.http_proxy,
92
+ HTTPS_PROXY: process.env.HTTPS_PROXY,
93
+ https_proxy: process.env.https_proxy,
94
+ ALL_PROXY: process.env.ALL_PROXY,
95
+ all_proxy: process.env.all_proxy,
96
+ NO_PROXY: process.env.NO_PROXY,
97
+ no_proxy: process.env.no_proxy,
98
+ };
99
+ }
100
+ export function createProxyConfig(url) {
101
+ const proxyUrl = getProxyForUrl(url);
102
+ if (!proxyUrl)
103
+ return undefined;
104
+ return { url: proxyUrl };
105
+ }
@@ -7,7 +7,7 @@ export interface CacheInfo {
7
7
  }
8
8
  export interface PlatformInfo {
9
9
  provider?: string;
10
- category?: 'cdn' | 'cloud' | 'hosting' | 'server' | 'proxy' | 'unknown';
10
+ category?: 'cdn' | 'cloud' | 'hosting' | 'server' | 'proxy' | 'security' | 'framework' | 'unknown';
11
11
  region?: string;
12
12
  server?: string;
13
13
  metadata?: {
@@ -68,6 +68,18 @@ export interface AcceptInfo {
68
68
  }>;
69
69
  }
70
70
  export declare function parseAcceptInfo(headers: Headers): AcceptInfo;
71
+ export interface AuthInfo {
72
+ methods: string[];
73
+ realm?: string;
74
+ error?: string;
75
+ errorDescription?: string;
76
+ }
77
+ export declare function parseAuthInfo(headers: Headers): AuthInfo;
78
+ export interface ClockSkewInfo {
79
+ serverTime?: Date;
80
+ skewMs?: number;
81
+ }
82
+ export declare function parseClockSkew(headers: Headers): ClockSkewInfo;
71
83
  export interface HeaderInfo {
72
84
  cache: CacheInfo;
73
85
  platform: PlatformInfo;
@@ -76,6 +88,8 @@ export interface HeaderInfo {
76
88
  csp: CSPInfo;
77
89
  contentType: ContentTypeInfo;
78
90
  accept: AcceptInfo;
91
+ auth: AuthInfo;
92
+ clockSkew: ClockSkewInfo;
79
93
  }
80
94
  export declare function parseHeaders(headers: Headers, status: number): HeaderInfo;
81
95
  //# sourceMappingURL=header-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"header-parser.d.ts","sourceRoot":"","sources":["../../src/utils/header-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"header-parser.d.ts","sourceRoot":"","sources":["../../src/utils/header-parser.ts"],"names":[],"mappings":"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"}
@@ -189,6 +189,123 @@ const PLATFORM_DETECTORS = [
189
189
  origin: headers.get('x-render-origin-server')
190
190
  }
191
191
  })
192
+ },
193
+ {
194
+ name: 'datadome',
195
+ category: 'security',
196
+ headers: ['x-datadome', 'x-datadome-cid'],
197
+ detect: (headers) => headers.get('x-datadome') !== null || headers.get('x-datadome-cid') !== null,
198
+ extract: (headers) => ({
199
+ metadata: { cid: headers.get('x-datadome-cid') }
200
+ })
201
+ },
202
+ {
203
+ name: 'incapsula',
204
+ category: 'security',
205
+ headers: ['x-iinfo', 'x-cdn'],
206
+ detect: (headers) => headers.get('x-iinfo') !== null || (headers.get('x-cdn') || '').includes('Incapsula'),
207
+ extract: (headers) => ({
208
+ metadata: { iinfo: headers.get('x-iinfo') }
209
+ })
210
+ },
211
+ {
212
+ name: 'imperva',
213
+ category: 'security',
214
+ headers: ['x-imperva-uuid'],
215
+ detect: (headers) => headers.get('x-imperva-uuid') !== null,
216
+ extract: (headers) => ({
217
+ metadata: { uuid: headers.get('x-imperva-uuid') }
218
+ })
219
+ },
220
+ {
221
+ name: 'aws-waf',
222
+ category: 'security',
223
+ headers: ['x-amzn-waf-action'],
224
+ detect: (headers) => headers.get('server') === 'awselb/2.0',
225
+ extract: (headers) => ({})
226
+ },
227
+ {
228
+ name: 'envoy',
229
+ category: 'proxy',
230
+ headers: ['x-envoy-upstream-service-time'],
231
+ detect: (headers) => headers.get('x-envoy-upstream-service-time') !== null || headers.get('server') === 'envoy',
232
+ extract: (headers) => ({})
233
+ },
234
+ {
235
+ name: 'traefik',
236
+ category: 'proxy',
237
+ headers: [],
238
+ detect: (headers) => (headers.get('server') || '').toLowerCase().includes('traefik'),
239
+ extract: (headers) => ({})
240
+ },
241
+ {
242
+ name: 'caddy',
243
+ category: 'server',
244
+ headers: [],
245
+ detect: (headers) => (headers.get('server') || '').toLowerCase().includes('caddy'),
246
+ extract: (headers) => ({})
247
+ },
248
+ {
249
+ name: 'haproxy',
250
+ category: 'proxy',
251
+ headers: [],
252
+ detect: (headers) => (headers.get('server') || '').toLowerCase().includes('haproxy'),
253
+ extract: (headers) => ({})
254
+ },
255
+ {
256
+ name: 'iis',
257
+ category: 'server',
258
+ headers: ['x-powered-by'],
259
+ detect: (headers) => (headers.get('server') || '').toLowerCase().includes('iis'),
260
+ extract: (headers) => ({})
261
+ },
262
+ {
263
+ name: 'kestrel',
264
+ category: 'server',
265
+ headers: [],
266
+ detect: (headers) => (headers.get('server') || '').toLowerCase().includes('kestrel'),
267
+ extract: (headers) => ({})
268
+ },
269
+ {
270
+ name: 'express',
271
+ category: 'framework',
272
+ headers: ['x-powered-by'],
273
+ detect: (headers) => (headers.get('x-powered-by') || '').toLowerCase().includes('express'),
274
+ extract: (headers) => ({})
275
+ },
276
+ {
277
+ name: 'rails',
278
+ category: 'framework',
279
+ headers: ['x-runtime', 'x-request-id'],
280
+ detect: (headers) => headers.get('x-runtime') !== null && !(headers.get('x-powered-by') || '').includes('Express'),
281
+ extract: (headers) => ({
282
+ metadata: { runtime: headers.get('x-runtime') }
283
+ })
284
+ },
285
+ {
286
+ name: 'django',
287
+ category: 'framework',
288
+ headers: [],
289
+ detect: (headers) => (headers.get('server') || '').toLowerCase().includes('wsgi'),
290
+ extract: (headers) => ({})
291
+ },
292
+ {
293
+ name: 'aspnet',
294
+ category: 'framework',
295
+ headers: ['x-aspnet-version', 'x-powered-by'],
296
+ detect: (headers) => headers.get('x-aspnet-version') !== null || (headers.get('x-powered-by') || '').includes('ASP.NET'),
297
+ extract: (headers) => ({
298
+ metadata: { version: headers.get('x-aspnet-version') }
299
+ })
300
+ },
301
+ {
302
+ name: 'php',
303
+ category: 'framework',
304
+ headers: ['x-powered-by'],
305
+ detect: (headers) => (headers.get('x-powered-by') || '').toLowerCase().includes('php'),
306
+ extract: (headers) => ({
307
+ metadata: { version: headers.get('x-powered-by') }
308
+ })
192
309
  }
193
310
  ];
194
311
  export function parsePlatformInfo(headers) {
@@ -444,6 +561,47 @@ export function parseAcceptInfo(headers) {
444
561
  }
445
562
  return info;
446
563
  }
564
+ export function parseAuthInfo(headers) {
565
+ const info = { methods: [] };
566
+ const wwwAuth = headers.get('www-authenticate');
567
+ if (wwwAuth) {
568
+ if (wwwAuth.toLowerCase().includes('basic'))
569
+ info.methods.push('Basic');
570
+ if (wwwAuth.toLowerCase().includes('bearer'))
571
+ info.methods.push('Bearer');
572
+ if (wwwAuth.toLowerCase().includes('digest'))
573
+ info.methods.push('Digest');
574
+ if (wwwAuth.toLowerCase().includes('negotiate'))
575
+ info.methods.push('Negotiate');
576
+ if (wwwAuth.toLowerCase().includes('aws4-hmac-sha256'))
577
+ info.methods.push('AWS4');
578
+ const realmMatch = wwwAuth.match(/realm="([^"]+)"/);
579
+ if (realmMatch)
580
+ info.realm = realmMatch[1];
581
+ const errorMatch = wwwAuth.match(/error="([^"]+)"/);
582
+ if (errorMatch)
583
+ info.error = errorMatch[1];
584
+ const descMatch = wwwAuth.match(/error_description="([^"]+)"/);
585
+ if (descMatch)
586
+ info.errorDescription = descMatch[1];
587
+ }
588
+ const xAuthError = headers.get('x-auth-error') || headers.get('x-authentication-error');
589
+ if (xAuthError) {
590
+ if (!info.error)
591
+ info.error = xAuthError;
592
+ }
593
+ return info;
594
+ }
595
+ export function parseClockSkew(headers) {
596
+ const dateHeader = headers.get('date');
597
+ if (!dateHeader)
598
+ return {};
599
+ const serverTime = new Date(dateHeader);
600
+ if (isNaN(serverTime.getTime()))
601
+ return {};
602
+ const skewMs = serverTime.getTime() - Date.now();
603
+ return { serverTime, skewMs };
604
+ }
447
605
  export function parseHeaders(headers, status) {
448
606
  return {
449
607
  cache: parseCacheInfo(headers),
@@ -452,6 +610,8 @@ export function parseHeaders(headers, status) {
452
610
  compression: parseCompressionInfo(headers),
453
611
  csp: parseCSPInfo(headers),
454
612
  contentType: parseContentType(headers),
455
- accept: parseAcceptInfo(headers)
613
+ accept: parseAcceptInfo(headers),
614
+ auth: parseAuthInfo(headers),
615
+ clockSkew: parseClockSkew(headers)
456
616
  };
457
617
  }