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,199 @@
1
+ export class IndexedDBStorage {
2
+ dbName;
3
+ storeName;
4
+ defaultTTL;
5
+ maxEntries;
6
+ db = null;
7
+ initPromise = null;
8
+ constructor(options = {}) {
9
+ this.dbName = options.dbName ?? 'recker-cache';
10
+ this.storeName = options.storeName ?? 'responses';
11
+ this.defaultTTL = options.defaultTTL ?? 5 * 60 * 1000;
12
+ this.maxEntries = options.maxEntries ?? 1000;
13
+ }
14
+ async init() {
15
+ if (this.db)
16
+ return;
17
+ if (this.initPromise)
18
+ return this.initPromise;
19
+ this.initPromise = new Promise((resolve, reject) => {
20
+ const request = indexedDB.open(this.dbName, 1);
21
+ request.onerror = () => {
22
+ reject(new Error(`Failed to open IndexedDB: ${request.error?.message}`));
23
+ };
24
+ request.onsuccess = () => {
25
+ this.db = request.result;
26
+ resolve();
27
+ };
28
+ request.onupgradeneeded = (event) => {
29
+ const db = event.target.result;
30
+ if (!db.objectStoreNames.contains(this.storeName)) {
31
+ const store = db.createObjectStore(this.storeName, { keyPath: 'key' });
32
+ store.createIndex('expiresAt', 'expiresAt', { unique: false });
33
+ }
34
+ };
35
+ });
36
+ return this.initPromise;
37
+ }
38
+ async get(key) {
39
+ await this.init();
40
+ return new Promise((resolve, reject) => {
41
+ const transaction = this.db.transaction(this.storeName, 'readonly');
42
+ const store = transaction.objectStore(this.storeName);
43
+ const request = store.get(key);
44
+ request.onerror = () => reject(request.error);
45
+ request.onsuccess = () => {
46
+ const entry = request.result;
47
+ if (!entry) {
48
+ resolve(null);
49
+ return;
50
+ }
51
+ if (entry.expiresAt && entry.expiresAt < Date.now()) {
52
+ this.delete(key).catch(() => { });
53
+ resolve(null);
54
+ return;
55
+ }
56
+ resolve(entry);
57
+ };
58
+ });
59
+ }
60
+ async set(key, value, ttl, metadata) {
61
+ await this.init();
62
+ const entry = {
63
+ key,
64
+ value,
65
+ createdAt: Date.now(),
66
+ expiresAt: ttl !== undefined ? Date.now() + ttl : undefined,
67
+ etag: metadata?.etag,
68
+ lastModified: metadata?.lastModified,
69
+ };
70
+ return new Promise((resolve, reject) => {
71
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
72
+ const store = transaction.objectStore(this.storeName);
73
+ const request = store.put(entry);
74
+ request.onerror = () => reject(request.error);
75
+ request.onsuccess = () => resolve();
76
+ transaction.oncomplete = () => {
77
+ this.enforceMaxEntries().catch(() => { });
78
+ };
79
+ });
80
+ }
81
+ async delete(key) {
82
+ await this.init();
83
+ return new Promise((resolve, reject) => {
84
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
85
+ const store = transaction.objectStore(this.storeName);
86
+ const request = store.delete(key);
87
+ request.onerror = () => reject(request.error);
88
+ request.onsuccess = () => resolve(true);
89
+ });
90
+ }
91
+ async has(key) {
92
+ const entry = await this.get(key);
93
+ return entry !== null;
94
+ }
95
+ async clear() {
96
+ await this.init();
97
+ return new Promise((resolve, reject) => {
98
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
99
+ const store = transaction.objectStore(this.storeName);
100
+ const request = store.clear();
101
+ request.onerror = () => reject(request.error);
102
+ request.onsuccess = () => resolve();
103
+ });
104
+ }
105
+ async keys() {
106
+ await this.init();
107
+ return new Promise((resolve, reject) => {
108
+ const transaction = this.db.transaction(this.storeName, 'readonly');
109
+ const store = transaction.objectStore(this.storeName);
110
+ const request = store.getAllKeys();
111
+ request.onerror = () => reject(request.error);
112
+ request.onsuccess = () => resolve(request.result);
113
+ });
114
+ }
115
+ async size() {
116
+ await this.init();
117
+ return new Promise((resolve, reject) => {
118
+ const transaction = this.db.transaction(this.storeName, 'readonly');
119
+ const store = transaction.objectStore(this.storeName);
120
+ const request = store.count();
121
+ request.onerror = () => reject(request.error);
122
+ request.onsuccess = () => resolve(request.result);
123
+ });
124
+ }
125
+ async cleanup() {
126
+ await this.init();
127
+ const now = Date.now();
128
+ let removed = 0;
129
+ return new Promise((resolve, reject) => {
130
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
131
+ const store = transaction.objectStore(this.storeName);
132
+ const index = store.index('expiresAt');
133
+ const range = IDBKeyRange.upperBound(now);
134
+ const request = index.openCursor(range);
135
+ request.onerror = () => reject(request.error);
136
+ request.onsuccess = (event) => {
137
+ const cursor = event.target.result;
138
+ if (cursor) {
139
+ cursor.delete();
140
+ removed++;
141
+ cursor.continue();
142
+ }
143
+ };
144
+ transaction.oncomplete = () => resolve(removed);
145
+ });
146
+ }
147
+ async enforceMaxEntries() {
148
+ const currentSize = await this.size();
149
+ if (currentSize <= this.maxEntries)
150
+ return;
151
+ const toRemove = currentSize - this.maxEntries;
152
+ return new Promise((resolve, reject) => {
153
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
154
+ const store = transaction.objectStore(this.storeName);
155
+ const index = store.index('expiresAt');
156
+ let removed = 0;
157
+ const request = index.openCursor();
158
+ request.onerror = () => reject(request.error);
159
+ request.onsuccess = (event) => {
160
+ const cursor = event.target.result;
161
+ if (cursor && removed < toRemove) {
162
+ cursor.delete();
163
+ removed++;
164
+ cursor.continue();
165
+ }
166
+ };
167
+ transaction.oncomplete = () => resolve();
168
+ });
169
+ }
170
+ close() {
171
+ if (this.db) {
172
+ this.db.close();
173
+ this.db = null;
174
+ this.initPromise = null;
175
+ }
176
+ }
177
+ async destroy() {
178
+ this.close();
179
+ return new Promise((resolve, reject) => {
180
+ const request = indexedDB.deleteDatabase(this.dbName);
181
+ request.onerror = () => reject(request.error);
182
+ request.onsuccess = () => resolve();
183
+ });
184
+ }
185
+ }
186
+ export function isIndexedDBAvailable() {
187
+ try {
188
+ return typeof indexedDB !== 'undefined' && indexedDB !== null;
189
+ }
190
+ catch {
191
+ return false;
192
+ }
193
+ }
194
+ export function getBrowserCacheStorage(options) {
195
+ if (isIndexedDBAvailable()) {
196
+ return new IndexedDBStorage(options);
197
+ }
198
+ return null;
199
+ }
@@ -0,0 +1,73 @@
1
+ export declare const HttpStatus: {
2
+ readonly CONTINUE: 100;
3
+ readonly SWITCHING_PROTOCOLS: 101;
4
+ readonly PROCESSING: 102;
5
+ readonly EARLY_HINTS: 103;
6
+ readonly OK: 200;
7
+ readonly CREATED: 201;
8
+ readonly ACCEPTED: 202;
9
+ readonly NON_AUTHORITATIVE_INFORMATION: 203;
10
+ readonly NO_CONTENT: 204;
11
+ readonly RESET_CONTENT: 205;
12
+ readonly PARTIAL_CONTENT: 206;
13
+ readonly MULTI_STATUS: 207;
14
+ readonly ALREADY_REPORTED: 208;
15
+ readonly IM_USED: 226;
16
+ readonly MULTIPLE_CHOICES: 300;
17
+ readonly MOVED_PERMANENTLY: 301;
18
+ readonly FOUND: 302;
19
+ readonly SEE_OTHER: 303;
20
+ readonly NOT_MODIFIED: 304;
21
+ readonly USE_PROXY: 305;
22
+ readonly TEMPORARY_REDIRECT: 307;
23
+ readonly PERMANENT_REDIRECT: 308;
24
+ readonly BAD_REQUEST: 400;
25
+ readonly UNAUTHORIZED: 401;
26
+ readonly PAYMENT_REQUIRED: 402;
27
+ readonly FORBIDDEN: 403;
28
+ readonly NOT_FOUND: 404;
29
+ readonly METHOD_NOT_ALLOWED: 405;
30
+ readonly NOT_ACCEPTABLE: 406;
31
+ readonly PROXY_AUTHENTICATION_REQUIRED: 407;
32
+ readonly REQUEST_TIMEOUT: 408;
33
+ readonly CONFLICT: 409;
34
+ readonly GONE: 410;
35
+ readonly LENGTH_REQUIRED: 411;
36
+ readonly PRECONDITION_FAILED: 412;
37
+ readonly PAYLOAD_TOO_LARGE: 413;
38
+ readonly URI_TOO_LONG: 414;
39
+ readonly UNSUPPORTED_MEDIA_TYPE: 415;
40
+ readonly RANGE_NOT_SATISFIABLE: 416;
41
+ readonly EXPECTATION_FAILED: 417;
42
+ readonly IM_A_TEAPOT: 418;
43
+ readonly MISDIRECTED_REQUEST: 421;
44
+ readonly UNPROCESSABLE_ENTITY: 422;
45
+ readonly LOCKED: 423;
46
+ readonly FAILED_DEPENDENCY: 424;
47
+ readonly TOO_EARLY: 425;
48
+ readonly UPGRADE_REQUIRED: 426;
49
+ readonly PRECONDITION_REQUIRED: 428;
50
+ readonly TOO_MANY_REQUESTS: 429;
51
+ readonly REQUEST_HEADER_FIELDS_TOO_LARGE: 431;
52
+ readonly UNAVAILABLE_FOR_LEGAL_REASONS: 451;
53
+ readonly INTERNAL_SERVER_ERROR: 500;
54
+ readonly NOT_IMPLEMENTED: 501;
55
+ readonly BAD_GATEWAY: 502;
56
+ readonly SERVICE_UNAVAILABLE: 503;
57
+ readonly GATEWAY_TIMEOUT: 504;
58
+ readonly HTTP_VERSION_NOT_SUPPORTED: 505;
59
+ readonly VARIANT_ALSO_NEGOTIATES: 506;
60
+ readonly INSUFFICIENT_STORAGE: 507;
61
+ readonly LOOP_DETECTED: 508;
62
+ readonly NOT_EXTENDED: 510;
63
+ readonly NETWORK_AUTHENTICATION_REQUIRED: 511;
64
+ };
65
+ export type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];
66
+ export declare const HttpStatusText: Record<HttpStatusCode, string>;
67
+ export declare function isSuccess(status: number): boolean;
68
+ export declare function isRedirect(status: number): boolean;
69
+ export declare function isClientError(status: number): boolean;
70
+ export declare function isServerError(status: number): boolean;
71
+ export declare function isError(status: number): boolean;
72
+ export declare function isRetryable(status: number): boolean;
73
+ export declare function getStatusText(status: number): string;
@@ -0,0 +1,156 @@
1
+ export const HttpStatus = {
2
+ CONTINUE: 100,
3
+ SWITCHING_PROTOCOLS: 101,
4
+ PROCESSING: 102,
5
+ EARLY_HINTS: 103,
6
+ OK: 200,
7
+ CREATED: 201,
8
+ ACCEPTED: 202,
9
+ NON_AUTHORITATIVE_INFORMATION: 203,
10
+ NO_CONTENT: 204,
11
+ RESET_CONTENT: 205,
12
+ PARTIAL_CONTENT: 206,
13
+ MULTI_STATUS: 207,
14
+ ALREADY_REPORTED: 208,
15
+ IM_USED: 226,
16
+ MULTIPLE_CHOICES: 300,
17
+ MOVED_PERMANENTLY: 301,
18
+ FOUND: 302,
19
+ SEE_OTHER: 303,
20
+ NOT_MODIFIED: 304,
21
+ USE_PROXY: 305,
22
+ TEMPORARY_REDIRECT: 307,
23
+ PERMANENT_REDIRECT: 308,
24
+ BAD_REQUEST: 400,
25
+ UNAUTHORIZED: 401,
26
+ PAYMENT_REQUIRED: 402,
27
+ FORBIDDEN: 403,
28
+ NOT_FOUND: 404,
29
+ METHOD_NOT_ALLOWED: 405,
30
+ NOT_ACCEPTABLE: 406,
31
+ PROXY_AUTHENTICATION_REQUIRED: 407,
32
+ REQUEST_TIMEOUT: 408,
33
+ CONFLICT: 409,
34
+ GONE: 410,
35
+ LENGTH_REQUIRED: 411,
36
+ PRECONDITION_FAILED: 412,
37
+ PAYLOAD_TOO_LARGE: 413,
38
+ URI_TOO_LONG: 414,
39
+ UNSUPPORTED_MEDIA_TYPE: 415,
40
+ RANGE_NOT_SATISFIABLE: 416,
41
+ EXPECTATION_FAILED: 417,
42
+ IM_A_TEAPOT: 418,
43
+ MISDIRECTED_REQUEST: 421,
44
+ UNPROCESSABLE_ENTITY: 422,
45
+ LOCKED: 423,
46
+ FAILED_DEPENDENCY: 424,
47
+ TOO_EARLY: 425,
48
+ UPGRADE_REQUIRED: 426,
49
+ PRECONDITION_REQUIRED: 428,
50
+ TOO_MANY_REQUESTS: 429,
51
+ REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
52
+ UNAVAILABLE_FOR_LEGAL_REASONS: 451,
53
+ INTERNAL_SERVER_ERROR: 500,
54
+ NOT_IMPLEMENTED: 501,
55
+ BAD_GATEWAY: 502,
56
+ SERVICE_UNAVAILABLE: 503,
57
+ GATEWAY_TIMEOUT: 504,
58
+ HTTP_VERSION_NOT_SUPPORTED: 505,
59
+ VARIANT_ALSO_NEGOTIATES: 506,
60
+ INSUFFICIENT_STORAGE: 507,
61
+ LOOP_DETECTED: 508,
62
+ NOT_EXTENDED: 510,
63
+ NETWORK_AUTHENTICATION_REQUIRED: 511,
64
+ };
65
+ export const HttpStatusText = {
66
+ 100: 'Continue',
67
+ 101: 'Switching Protocols',
68
+ 102: 'Processing',
69
+ 103: 'Early Hints',
70
+ 200: 'OK',
71
+ 201: 'Created',
72
+ 202: 'Accepted',
73
+ 203: 'Non-Authoritative Information',
74
+ 204: 'No Content',
75
+ 205: 'Reset Content',
76
+ 206: 'Partial Content',
77
+ 207: 'Multi-Status',
78
+ 208: 'Already Reported',
79
+ 226: 'IM Used',
80
+ 300: 'Multiple Choices',
81
+ 301: 'Moved Permanently',
82
+ 302: 'Found',
83
+ 303: 'See Other',
84
+ 304: 'Not Modified',
85
+ 305: 'Use Proxy',
86
+ 307: 'Temporary Redirect',
87
+ 308: 'Permanent Redirect',
88
+ 400: 'Bad Request',
89
+ 401: 'Unauthorized',
90
+ 402: 'Payment Required',
91
+ 403: 'Forbidden',
92
+ 404: 'Not Found',
93
+ 405: 'Method Not Allowed',
94
+ 406: 'Not Acceptable',
95
+ 407: 'Proxy Authentication Required',
96
+ 408: 'Request Timeout',
97
+ 409: 'Conflict',
98
+ 410: 'Gone',
99
+ 411: 'Length Required',
100
+ 412: 'Precondition Failed',
101
+ 413: 'Payload Too Large',
102
+ 414: 'URI Too Long',
103
+ 415: 'Unsupported Media Type',
104
+ 416: 'Range Not Satisfiable',
105
+ 417: 'Expectation Failed',
106
+ 418: "I'm a Teapot",
107
+ 421: 'Misdirected Request',
108
+ 422: 'Unprocessable Entity',
109
+ 423: 'Locked',
110
+ 424: 'Failed Dependency',
111
+ 425: 'Too Early',
112
+ 426: 'Upgrade Required',
113
+ 428: 'Precondition Required',
114
+ 429: 'Too Many Requests',
115
+ 431: 'Request Header Fields Too Large',
116
+ 451: 'Unavailable For Legal Reasons',
117
+ 500: 'Internal Server Error',
118
+ 501: 'Not Implemented',
119
+ 502: 'Bad Gateway',
120
+ 503: 'Service Unavailable',
121
+ 504: 'Gateway Timeout',
122
+ 505: 'HTTP Version Not Supported',
123
+ 506: 'Variant Also Negotiates',
124
+ 507: 'Insufficient Storage',
125
+ 508: 'Loop Detected',
126
+ 510: 'Not Extended',
127
+ 511: 'Network Authentication Required',
128
+ };
129
+ export function isSuccess(status) {
130
+ return status >= 200 && status < 300;
131
+ }
132
+ export function isRedirect(status) {
133
+ return status >= 300 && status < 400;
134
+ }
135
+ export function isClientError(status) {
136
+ return status >= 400 && status < 500;
137
+ }
138
+ export function isServerError(status) {
139
+ return status >= 500 && status < 600;
140
+ }
141
+ export function isError(status) {
142
+ return status >= 400;
143
+ }
144
+ export function isRetryable(status) {
145
+ const retryableCodes = [
146
+ HttpStatus.TOO_MANY_REQUESTS,
147
+ HttpStatus.INTERNAL_SERVER_ERROR,
148
+ HttpStatus.BAD_GATEWAY,
149
+ HttpStatus.SERVICE_UNAVAILABLE,
150
+ HttpStatus.GATEWAY_TIMEOUT,
151
+ ];
152
+ return retryableCodes.includes(status);
153
+ }
154
+ export function getStatusText(status) {
155
+ return HttpStatusText[status] || 'Unknown Status';
156
+ }
@@ -0,0 +1,30 @@
1
+ import type { CookieJar } from '../types/index.js';
2
+ interface ParsedCookie {
3
+ name: string;
4
+ value: string;
5
+ domain: string;
6
+ path: string;
7
+ expires?: Date;
8
+ maxAge?: number;
9
+ secure: boolean;
10
+ httpOnly: boolean;
11
+ sameSite?: 'Strict' | 'Lax' | 'None';
12
+ partitioned?: boolean;
13
+ priority?: 'Low' | 'Medium' | 'High';
14
+ createdAt: number;
15
+ }
16
+ export declare class MemoryCookieJar implements CookieJar {
17
+ private cookies;
18
+ getCookieString(url: string): string;
19
+ setCookie(rawCookie: string, url: string): void;
20
+ clear(): void;
21
+ clearDomain(domain: string): void;
22
+ getAllCookies(): ParsedCookie[];
23
+ private parseCookie;
24
+ private decode;
25
+ private domainMatches;
26
+ private pathMatches;
27
+ private defaultPath;
28
+ private isExpired;
29
+ }
30
+ export {};
@@ -0,0 +1,210 @@
1
+ const cookieNameRegExp = /^[\u0021-\u003A\u003C\u003E-\u007E]+$/;
2
+ const cookieValueRegExp = /^[\u0021-\u003A\u003C-\u007E]*$/;
3
+ const domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
4
+ const pathValueRegExp = /^[\u0020-\u003A\u003D-\u007E]*$/;
5
+ export class MemoryCookieJar {
6
+ cookies = new Map();
7
+ getCookieString(url) {
8
+ const parsedUrl = new URL(url);
9
+ const hostname = parsedUrl.hostname;
10
+ const pathname = parsedUrl.pathname || '/';
11
+ const isSecure = parsedUrl.protocol === 'https:';
12
+ const now = Date.now();
13
+ const matchingCookies = [];
14
+ for (const [domain, pathMap] of this.cookies.entries()) {
15
+ if (!this.domainMatches(hostname, domain))
16
+ continue;
17
+ for (const [path, nameMap] of pathMap.entries()) {
18
+ if (!this.pathMatches(pathname, path))
19
+ continue;
20
+ for (const cookie of nameMap.values()) {
21
+ if (this.isExpired(cookie, now)) {
22
+ nameMap.delete(cookie.name);
23
+ continue;
24
+ }
25
+ if (cookie.secure && !isSecure)
26
+ continue;
27
+ matchingCookies.push(cookie);
28
+ }
29
+ }
30
+ }
31
+ matchingCookies.sort((a, b) => {
32
+ const pathDiff = b.path.length - a.path.length;
33
+ if (pathDiff !== 0)
34
+ return pathDiff;
35
+ return a.createdAt - b.createdAt;
36
+ });
37
+ return matchingCookies.map(c => `${c.name}=${c.value}`).join('; ');
38
+ }
39
+ setCookie(rawCookie, url) {
40
+ const parsedUrl = new URL(url);
41
+ const hostname = parsedUrl.hostname;
42
+ const pathname = parsedUrl.pathname || '/';
43
+ const cookie = this.parseCookie(rawCookie, hostname, pathname);
44
+ if (!cookie)
45
+ return;
46
+ if (!this.domainMatches(hostname, cookie.domain)) {
47
+ return;
48
+ }
49
+ if (!this.cookies.has(cookie.domain)) {
50
+ this.cookies.set(cookie.domain, new Map());
51
+ }
52
+ const domainMap = this.cookies.get(cookie.domain);
53
+ if (!domainMap.has(cookie.path)) {
54
+ domainMap.set(cookie.path, new Map());
55
+ }
56
+ const pathMap = domainMap.get(cookie.path);
57
+ pathMap.set(cookie.name, cookie);
58
+ }
59
+ clear() {
60
+ this.cookies.clear();
61
+ }
62
+ clearDomain(domain) {
63
+ this.cookies.delete(domain);
64
+ }
65
+ getAllCookies() {
66
+ const all = [];
67
+ for (const domainMap of this.cookies.values()) {
68
+ for (const pathMap of domainMap.values()) {
69
+ for (const cookie of pathMap.values()) {
70
+ all.push(cookie);
71
+ }
72
+ }
73
+ }
74
+ return all;
75
+ }
76
+ parseCookie(setCookieStr, requestDomain, requestPath) {
77
+ const parts = setCookieStr.split(';').map(p => p.trim());
78
+ if (parts.length === 0 || !parts[0])
79
+ return null;
80
+ const [nameValue, ...attributes] = parts;
81
+ const eqIndex = nameValue.indexOf('=');
82
+ if (eqIndex === -1)
83
+ return null;
84
+ const name = nameValue.substring(0, eqIndex).trim();
85
+ const rawValue = nameValue.substring(eqIndex + 1).trim();
86
+ if (!name)
87
+ return null;
88
+ const value = this.decode(rawValue);
89
+ const cookie = {
90
+ name,
91
+ value,
92
+ domain: requestDomain,
93
+ path: this.defaultPath(requestPath),
94
+ secure: false,
95
+ httpOnly: false,
96
+ createdAt: Date.now()
97
+ };
98
+ for (const attr of attributes) {
99
+ const lowerAttr = attr.toLowerCase();
100
+ if (lowerAttr === 'secure') {
101
+ cookie.secure = true;
102
+ }
103
+ else if (lowerAttr === 'httponly') {
104
+ cookie.httpOnly = true;
105
+ }
106
+ else if (lowerAttr === 'partitioned') {
107
+ cookie.partitioned = true;
108
+ }
109
+ else if (lowerAttr.startsWith('domain=')) {
110
+ let domain = attr.substring(7).trim();
111
+ if (domain.startsWith('.')) {
112
+ domain = domain.substring(1);
113
+ }
114
+ if (domainValueRegExp.test(domain)) {
115
+ cookie.domain = domain.toLowerCase();
116
+ }
117
+ }
118
+ else if (lowerAttr.startsWith('path=')) {
119
+ const path = attr.substring(5).trim();
120
+ if (!path || pathValueRegExp.test(path)) {
121
+ cookie.path = path || '/';
122
+ }
123
+ }
124
+ else if (lowerAttr.startsWith('expires=')) {
125
+ const expiresStr = attr.substring(8).trim();
126
+ const expires = new Date(expiresStr);
127
+ if (Number.isFinite(expires.valueOf())) {
128
+ cookie.expires = expires;
129
+ }
130
+ }
131
+ else if (lowerAttr.startsWith('max-age=')) {
132
+ const maxAgeStr = attr.substring(8).trim();
133
+ if (/^-?\d+$/.test(maxAgeStr)) {
134
+ cookie.maxAge = parseInt(maxAgeStr, 10);
135
+ }
136
+ }
137
+ else if (lowerAttr.startsWith('samesite=')) {
138
+ const samesite = attr.substring(9).trim().toLowerCase();
139
+ if (samesite === 'strict')
140
+ cookie.sameSite = 'Strict';
141
+ else if (samesite === 'lax')
142
+ cookie.sameSite = 'Lax';
143
+ else if (samesite === 'none')
144
+ cookie.sameSite = 'None';
145
+ }
146
+ else if (lowerAttr.startsWith('priority=')) {
147
+ const priority = attr.substring(9).trim().toLowerCase();
148
+ if (priority === 'low')
149
+ cookie.priority = 'Low';
150
+ else if (priority === 'medium')
151
+ cookie.priority = 'Medium';
152
+ else if (priority === 'high')
153
+ cookie.priority = 'High';
154
+ }
155
+ }
156
+ return cookie;
157
+ }
158
+ decode(str) {
159
+ if (str.indexOf('%') === -1)
160
+ return str;
161
+ try {
162
+ return decodeURIComponent(str);
163
+ }
164
+ catch {
165
+ return str;
166
+ }
167
+ }
168
+ domainMatches(requestDomain, cookieDomain) {
169
+ const reqLower = requestDomain.toLowerCase();
170
+ const cookieLower = cookieDomain.toLowerCase();
171
+ if (reqLower === cookieLower)
172
+ return true;
173
+ if (reqLower.endsWith('.' + cookieLower))
174
+ return true;
175
+ return false;
176
+ }
177
+ pathMatches(requestPath, cookiePath) {
178
+ if (requestPath === cookiePath)
179
+ return true;
180
+ if (requestPath.startsWith(cookiePath)) {
181
+ if (cookiePath.endsWith('/'))
182
+ return true;
183
+ if (requestPath[cookiePath.length] === '/')
184
+ return true;
185
+ }
186
+ return false;
187
+ }
188
+ defaultPath(requestPath) {
189
+ if (!requestPath || !requestPath.startsWith('/')) {
190
+ return '/';
191
+ }
192
+ const lastSlash = requestPath.lastIndexOf('/');
193
+ if (lastSlash === 0) {
194
+ return '/';
195
+ }
196
+ return requestPath.substring(0, lastSlash);
197
+ }
198
+ isExpired(cookie, now) {
199
+ if (cookie.maxAge !== undefined) {
200
+ if (cookie.maxAge <= 0)
201
+ return true;
202
+ const expiresAt = cookie.createdAt + (cookie.maxAge * 1000);
203
+ return now >= expiresAt;
204
+ }
205
+ if (cookie.expires) {
206
+ return now >= cookie.expires.getTime();
207
+ }
208
+ return false;
209
+ }
210
+ }