@irvinebroque/http-rfc-utils 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/dist/auth.d.ts +139 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +991 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cache-status.d.ts +15 -0
  8. package/dist/cache-status.d.ts.map +1 -0
  9. package/dist/cache-status.js +152 -0
  10. package/dist/cache-status.js.map +1 -0
  11. package/dist/cache.d.ts +94 -0
  12. package/dist/cache.d.ts.map +1 -0
  13. package/dist/cache.js +244 -0
  14. package/dist/cache.js.map +1 -0
  15. package/dist/client-hints.d.ts +23 -0
  16. package/dist/client-hints.d.ts.map +1 -0
  17. package/dist/client-hints.js +81 -0
  18. package/dist/client-hints.js.map +1 -0
  19. package/dist/conditional.d.ts +97 -0
  20. package/dist/conditional.d.ts.map +1 -0
  21. package/dist/conditional.js +300 -0
  22. package/dist/conditional.js.map +1 -0
  23. package/dist/content-disposition.d.ts +23 -0
  24. package/dist/content-disposition.d.ts.map +1 -0
  25. package/dist/content-disposition.js +122 -0
  26. package/dist/content-disposition.js.map +1 -0
  27. package/dist/cookie.d.ts +43 -0
  28. package/dist/cookie.d.ts.map +1 -0
  29. package/dist/cookie.js +472 -0
  30. package/dist/cookie.js.map +1 -0
  31. package/dist/cors.d.ts +53 -0
  32. package/dist/cors.d.ts.map +1 -0
  33. package/dist/cors.js +170 -0
  34. package/dist/cors.js.map +1 -0
  35. package/dist/datetime.d.ts +53 -0
  36. package/dist/datetime.d.ts.map +1 -0
  37. package/dist/datetime.js +205 -0
  38. package/dist/datetime.js.map +1 -0
  39. package/dist/digest.d.ts +220 -0
  40. package/dist/digest.d.ts.map +1 -0
  41. package/dist/digest.js +355 -0
  42. package/dist/digest.js.map +1 -0
  43. package/dist/encoding.d.ts +14 -0
  44. package/dist/encoding.d.ts.map +1 -0
  45. package/dist/encoding.js +86 -0
  46. package/dist/encoding.js.map +1 -0
  47. package/dist/etag.d.ts +55 -0
  48. package/dist/etag.d.ts.map +1 -0
  49. package/dist/etag.js +182 -0
  50. package/dist/etag.js.map +1 -0
  51. package/dist/ext-value.d.ts +40 -0
  52. package/dist/ext-value.d.ts.map +1 -0
  53. package/dist/ext-value.js +119 -0
  54. package/dist/ext-value.js.map +1 -0
  55. package/dist/forwarded.d.ts +14 -0
  56. package/dist/forwarded.d.ts.map +1 -0
  57. package/dist/forwarded.js +93 -0
  58. package/dist/forwarded.js.map +1 -0
  59. package/dist/header-utils.d.ts +71 -0
  60. package/dist/header-utils.d.ts.map +1 -0
  61. package/dist/header-utils.js +143 -0
  62. package/dist/header-utils.js.map +1 -0
  63. package/dist/headers.d.ts +71 -0
  64. package/dist/headers.d.ts.map +1 -0
  65. package/dist/headers.js +134 -0
  66. package/dist/headers.js.map +1 -0
  67. package/dist/hsts.d.ts +15 -0
  68. package/dist/hsts.d.ts.map +1 -0
  69. package/dist/hsts.js +106 -0
  70. package/dist/hsts.js.map +1 -0
  71. package/dist/http-signatures.d.ts +202 -0
  72. package/dist/http-signatures.d.ts.map +1 -0
  73. package/dist/http-signatures.js +720 -0
  74. package/dist/http-signatures.js.map +1 -0
  75. package/dist/index.d.ts +41 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +125 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/json-pointer.d.ts +97 -0
  80. package/dist/json-pointer.d.ts.map +1 -0
  81. package/dist/json-pointer.js +278 -0
  82. package/dist/json-pointer.js.map +1 -0
  83. package/dist/jsonpath.d.ts +98 -0
  84. package/dist/jsonpath.d.ts.map +1 -0
  85. package/dist/jsonpath.js +1470 -0
  86. package/dist/jsonpath.js.map +1 -0
  87. package/dist/language.d.ts +14 -0
  88. package/dist/language.d.ts.map +1 -0
  89. package/dist/language.js +95 -0
  90. package/dist/language.js.map +1 -0
  91. package/dist/link.d.ts +102 -0
  92. package/dist/link.d.ts.map +1 -0
  93. package/dist/link.js +437 -0
  94. package/dist/link.js.map +1 -0
  95. package/dist/linkset.d.ts +111 -0
  96. package/dist/linkset.d.ts.map +1 -0
  97. package/dist/linkset.js +501 -0
  98. package/dist/linkset.js.map +1 -0
  99. package/dist/negotiate.d.ts +71 -0
  100. package/dist/negotiate.d.ts.map +1 -0
  101. package/dist/negotiate.js +357 -0
  102. package/dist/negotiate.js.map +1 -0
  103. package/dist/pagination.d.ts +80 -0
  104. package/dist/pagination.d.ts.map +1 -0
  105. package/dist/pagination.js +188 -0
  106. package/dist/pagination.js.map +1 -0
  107. package/dist/prefer.d.ts +18 -0
  108. package/dist/prefer.d.ts.map +1 -0
  109. package/dist/prefer.js +93 -0
  110. package/dist/prefer.js.map +1 -0
  111. package/dist/problem.d.ts +54 -0
  112. package/dist/problem.d.ts.map +1 -0
  113. package/dist/problem.js +104 -0
  114. package/dist/problem.js.map +1 -0
  115. package/dist/proxy-status.d.ts +28 -0
  116. package/dist/proxy-status.d.ts.map +1 -0
  117. package/dist/proxy-status.js +220 -0
  118. package/dist/proxy-status.js.map +1 -0
  119. package/dist/range.d.ts +28 -0
  120. package/dist/range.d.ts.map +1 -0
  121. package/dist/range.js +243 -0
  122. package/dist/range.js.map +1 -0
  123. package/dist/response.d.ts +101 -0
  124. package/dist/response.d.ts.map +1 -0
  125. package/dist/response.js +200 -0
  126. package/dist/response.js.map +1 -0
  127. package/dist/sorting.d.ts +66 -0
  128. package/dist/sorting.d.ts.map +1 -0
  129. package/dist/sorting.js +168 -0
  130. package/dist/sorting.js.map +1 -0
  131. package/dist/structured-fields.d.ts +30 -0
  132. package/dist/structured-fields.d.ts.map +1 -0
  133. package/dist/structured-fields.js +468 -0
  134. package/dist/structured-fields.js.map +1 -0
  135. package/dist/types.d.ts +772 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +8 -0
  138. package/dist/types.js.map +1 -0
  139. package/dist/uri-template.d.ts +48 -0
  140. package/dist/uri-template.d.ts.map +1 -0
  141. package/dist/uri-template.js +483 -0
  142. package/dist/uri-template.js.map +1 -0
  143. package/dist/uri.d.ts +80 -0
  144. package/dist/uri.d.ts.map +1 -0
  145. package/dist/uri.js +423 -0
  146. package/dist/uri.js.map +1 -0
  147. package/package.json +66 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Cookie and Set-Cookie utilities per RFC 6265.
3
+ * RFC 6265 §4.1.1, §4.2.1, §5.1.1, §5.1.3, §5.1.4, §5.2, §5.3, §5.4.
4
+ * @see https://www.rfc-editor.org/rfc/rfc6265.html#section-4.1.1
5
+ */
6
+ import type { CookieHeaderOptions, SetCookie, StoredCookie } from './types.js';
7
+ /**
8
+ * Parse Cookie header value into name/value pairs.
9
+ */
10
+ export declare function parseCookie(header: string): Map<string, string>;
11
+ /**
12
+ * Format Cookie header value from pairs.
13
+ */
14
+ export declare function formatCookie(cookies: Map<string, string> | Record<string, string>): string;
15
+ /**
16
+ * Parse Set-Cookie header value into a cookie definition.
17
+ */
18
+ export declare function parseSetCookie(header: string): SetCookie | null;
19
+ /**
20
+ * Format Set-Cookie header value from a cookie definition.
21
+ */
22
+ export declare function formatSetCookie(value: SetCookie): string;
23
+ /**
24
+ * Parse cookie-date into a Date.
25
+ */
26
+ export declare function parseCookieDate(value: string): Date | null;
27
+ /**
28
+ * Determine whether a domain matches a host per RFC 6265.
29
+ */
30
+ export declare function domainMatches(host: string, domain: string): boolean;
31
+ /**
32
+ * Compute default-path for a request URL.
33
+ */
34
+ export declare function defaultPath(requestUrl: string): string;
35
+ /**
36
+ * Determine whether a cookie path matches the request path.
37
+ */
38
+ export declare function pathMatches(requestPath: string, cookiePath: string): boolean;
39
+ /**
40
+ * Build Cookie header from stored cookies for a request URL.
41
+ */
42
+ export declare function buildCookieHeader(cookies: StoredCookie[], requestUrl: string, options?: CookieHeaderOptions): string | null;
43
+ //# sourceMappingURL=cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAoB,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsJjG;;GAEG;AAEH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA8B/D;AAED;;GAEG;AAEH,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAG1F;AAED;;GAEG;AAEH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CA6F/D;AAED;;GAEG;AAEH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAiCxD;AAED;;GAEG;AAEH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAgE1D;AAED;;GAEG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAiBnE;AAED;;GAEG;AAEH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAuBtD;AAED;;GAEG;AAEH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAe5E;AAED;;GAEG;AAEH,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,mBAAwB,GAClC,MAAM,GAAG,IAAI,CAwDf"}
package/dist/cookie.js ADDED
@@ -0,0 +1,472 @@
1
+ /**
2
+ * Cookie and Set-Cookie utilities per RFC 6265.
3
+ * RFC 6265 §4.1.1, §4.2.1, §5.1.1, §5.1.3, §5.1.4, §5.2, §5.3, §5.4.
4
+ * @see https://www.rfc-editor.org/rfc/rfc6265.html#section-4.1.1
5
+ */
6
+ import { formatHTTPDate } from './datetime.js';
7
+ const MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
8
+ function unquoteCookieValue(value) {
9
+ const trimmed = value.trim();
10
+ if (!trimmed.startsWith('"') || !trimmed.endsWith('"') || trimmed.length < 2) {
11
+ return trimmed;
12
+ }
13
+ const inner = trimmed.slice(1, -1);
14
+ let result = '';
15
+ let i = 0;
16
+ while (i < inner.length) {
17
+ if (inner[i] === '\\' && i + 1 < inner.length) {
18
+ result += inner[i + 1];
19
+ i += 2;
20
+ }
21
+ else {
22
+ result += inner[i];
23
+ i++;
24
+ }
25
+ }
26
+ return result;
27
+ }
28
+ function formatCookieValue(value) {
29
+ if (!/[\s;,"]/.test(value) && !value.includes('\\')) {
30
+ return value;
31
+ }
32
+ const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
33
+ return `"${escaped}"`;
34
+ }
35
+ function isDelimiter(char) {
36
+ const code = char.charCodeAt(0);
37
+ return code === 0x09
38
+ || (code >= 0x20 && code <= 0x2f)
39
+ || (code >= 0x3b && code <= 0x40)
40
+ || (code >= 0x5b && code <= 0x60)
41
+ || (code >= 0x7b && code <= 0x7e);
42
+ }
43
+ function tokenizeCookieDate(value) {
44
+ const tokens = [];
45
+ let current = '';
46
+ for (const char of value) {
47
+ if (isDelimiter(char)) {
48
+ if (current) {
49
+ tokens.push(current);
50
+ current = '';
51
+ }
52
+ }
53
+ else {
54
+ current += char;
55
+ }
56
+ }
57
+ if (current) {
58
+ tokens.push(current);
59
+ }
60
+ return tokens;
61
+ }
62
+ function parseDayOfMonth(token) {
63
+ if (/^\d{3,}$/.test(token)) {
64
+ return null;
65
+ }
66
+ const match = token.match(/^(\d{1,2})/);
67
+ if (!match) {
68
+ return null;
69
+ }
70
+ return Number(match[1]);
71
+ }
72
+ function parseYear(token) {
73
+ const match = token.match(/^(\d{2,4})/);
74
+ if (!match) {
75
+ return null;
76
+ }
77
+ let year = Number(match[1]);
78
+ if (match[1].length === 2) {
79
+ year = year >= 70 ? year + 1900 : year + 2000;
80
+ }
81
+ return year;
82
+ }
83
+ function parseMonth(token) {
84
+ const lower = token.toLowerCase();
85
+ for (let i = 0; i < MONTHS.length; i++) {
86
+ if (lower.startsWith(MONTHS[i])) {
87
+ return i + 1;
88
+ }
89
+ }
90
+ return null;
91
+ }
92
+ function parseTime(token) {
93
+ const match = token.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})$/);
94
+ if (!match) {
95
+ return null;
96
+ }
97
+ return {
98
+ hour: Number(match[1]),
99
+ minute: Number(match[2]),
100
+ second: Number(match[3]),
101
+ };
102
+ }
103
+ function parseMaxAge(value) {
104
+ const trimmed = value.trim();
105
+ if (!trimmed) {
106
+ return null;
107
+ }
108
+ if (!/^-?\d+$/.test(trimmed)) {
109
+ return null;
110
+ }
111
+ const parsed = Number(trimmed);
112
+ if (!Number.isFinite(parsed)) {
113
+ return null;
114
+ }
115
+ return parsed;
116
+ }
117
+ function isIpAddress(host) {
118
+ if (host.includes(':')) {
119
+ return true;
120
+ }
121
+ const parts = host.split('.');
122
+ if (parts.length !== 4) {
123
+ return false;
124
+ }
125
+ for (const part of parts) {
126
+ if (!/^\d+$/.test(part)) {
127
+ return false;
128
+ }
129
+ const value = Number(part);
130
+ if (!Number.isFinite(value) || value < 0 || value > 255) {
131
+ return false;
132
+ }
133
+ }
134
+ return true;
135
+ }
136
+ /**
137
+ * Parse Cookie header value into name/value pairs.
138
+ */
139
+ // RFC 6265 §4.2.1: Cookie header parsing.
140
+ export function parseCookie(header) {
141
+ const cookies = new Map();
142
+ if (!header || !header.trim()) {
143
+ return cookies;
144
+ }
145
+ const parts = header.split(';');
146
+ for (const part of parts) {
147
+ const trimmed = part.trim();
148
+ if (!trimmed) {
149
+ continue;
150
+ }
151
+ const eqIndex = trimmed.indexOf('=');
152
+ if (eqIndex === -1) {
153
+ continue;
154
+ }
155
+ const name = trimmed.slice(0, eqIndex).trim();
156
+ if (!name) {
157
+ continue;
158
+ }
159
+ const value = unquoteCookieValue(trimmed.slice(eqIndex + 1));
160
+ if (!cookies.has(name)) {
161
+ cookies.set(name, value);
162
+ }
163
+ }
164
+ return cookies;
165
+ }
166
+ /**
167
+ * Format Cookie header value from pairs.
168
+ */
169
+ // RFC 6265 §4.2.1: Cookie header formatting.
170
+ export function formatCookie(cookies) {
171
+ const entries = cookies instanceof Map ? Array.from(cookies.entries()) : Object.entries(cookies);
172
+ return entries.map(([name, value]) => `${name}=${formatCookieValue(value)}`).join('; ');
173
+ }
174
+ /**
175
+ * Parse Set-Cookie header value into a cookie definition.
176
+ */
177
+ // RFC 6265 §5.2: Set-Cookie parsing algorithm.
178
+ export function parseSetCookie(header) {
179
+ if (!header || !header.trim()) {
180
+ return null;
181
+ }
182
+ const parts = header.split(';');
183
+ const cookiePair = parts.shift();
184
+ if (!cookiePair) {
185
+ return null;
186
+ }
187
+ const eqIndex = cookiePair.indexOf('=');
188
+ if (eqIndex === -1) {
189
+ return null;
190
+ }
191
+ const name = cookiePair.slice(0, eqIndex).trim();
192
+ if (!name) {
193
+ return null;
194
+ }
195
+ const value = unquoteCookieValue(cookiePair.slice(eqIndex + 1).trim());
196
+ const attributes = {};
197
+ for (const part of parts) {
198
+ const trimmed = part.trim();
199
+ if (!trimmed) {
200
+ continue;
201
+ }
202
+ const attrEq = trimmed.indexOf('=');
203
+ const rawName = (attrEq === -1 ? trimmed : trimmed.slice(0, attrEq)).trim();
204
+ if (!rawName) {
205
+ continue;
206
+ }
207
+ const nameLower = rawName.toLowerCase();
208
+ const rawValue = attrEq === -1 ? undefined : trimmed.slice(attrEq + 1).trim();
209
+ switch (nameLower) {
210
+ case 'expires': {
211
+ if (rawValue) {
212
+ const parsed = parseCookieDate(rawValue);
213
+ if (parsed) {
214
+ attributes.expires = parsed;
215
+ }
216
+ }
217
+ break;
218
+ }
219
+ case 'max-age': {
220
+ if (rawValue) {
221
+ const parsed = parseMaxAge(rawValue);
222
+ if (parsed !== null) {
223
+ attributes.maxAge = parsed;
224
+ }
225
+ }
226
+ break;
227
+ }
228
+ case 'domain': {
229
+ if (rawValue) {
230
+ let domain = rawValue.trim().toLowerCase();
231
+ if (domain.startsWith('.')) {
232
+ domain = domain.slice(1);
233
+ }
234
+ if (domain) {
235
+ attributes.domain = domain;
236
+ }
237
+ }
238
+ break;
239
+ }
240
+ case 'path': {
241
+ if (rawValue) {
242
+ attributes.path = rawValue;
243
+ }
244
+ break;
245
+ }
246
+ case 'secure':
247
+ attributes.secure = true;
248
+ break;
249
+ case 'httponly':
250
+ attributes.httpOnly = true;
251
+ break;
252
+ default: {
253
+ if (!attributes.extensions) {
254
+ attributes.extensions = {};
255
+ }
256
+ attributes.extensions[nameLower] = rawValue;
257
+ break;
258
+ }
259
+ }
260
+ }
261
+ return { name, value, attributes };
262
+ }
263
+ /**
264
+ * Format Set-Cookie header value from a cookie definition.
265
+ */
266
+ // RFC 6265 §4.1.1: Set-Cookie formatting.
267
+ export function formatSetCookie(value) {
268
+ const parts = [`${value.name}=${formatCookieValue(value.value)}`];
269
+ const attributes = value.attributes ?? {};
270
+ if (attributes.expires) {
271
+ parts.push(`Expires=${formatHTTPDate(attributes.expires)}`);
272
+ }
273
+ if (attributes.maxAge !== undefined) {
274
+ parts.push(`Max-Age=${Math.floor(attributes.maxAge)}`);
275
+ }
276
+ if (attributes.domain) {
277
+ parts.push(`Domain=${attributes.domain}`);
278
+ }
279
+ if (attributes.path) {
280
+ parts.push(`Path=${attributes.path}`);
281
+ }
282
+ if (attributes.secure) {
283
+ parts.push('Secure');
284
+ }
285
+ if (attributes.httpOnly) {
286
+ parts.push('HttpOnly');
287
+ }
288
+ if (attributes.extensions) {
289
+ for (const [key, extValue] of Object.entries(attributes.extensions)) {
290
+ if (extValue === undefined || extValue === '') {
291
+ parts.push(key);
292
+ }
293
+ else {
294
+ parts.push(`${key}=${extValue}`);
295
+ }
296
+ }
297
+ }
298
+ return parts.join('; ');
299
+ }
300
+ /**
301
+ * Parse cookie-date into a Date.
302
+ */
303
+ // RFC 6265 §5.1.1: cookie-date parsing.
304
+ export function parseCookieDate(value) {
305
+ const tokens = tokenizeCookieDate(value);
306
+ let day = null;
307
+ let month = null;
308
+ let year = null;
309
+ let hour = null;
310
+ let minute = null;
311
+ let second = null;
312
+ for (const token of tokens) {
313
+ if (hour === null) {
314
+ const time = parseTime(token);
315
+ if (time) {
316
+ hour = time.hour;
317
+ minute = time.minute;
318
+ second = time.second;
319
+ continue;
320
+ }
321
+ }
322
+ if (day === null) {
323
+ const parsedDay = parseDayOfMonth(token);
324
+ if (parsedDay !== null) {
325
+ day = parsedDay;
326
+ continue;
327
+ }
328
+ }
329
+ if (month === null) {
330
+ const parsedMonth = parseMonth(token);
331
+ if (parsedMonth !== null) {
332
+ month = parsedMonth;
333
+ continue;
334
+ }
335
+ }
336
+ if (year === null) {
337
+ const parsedYear = parseYear(token);
338
+ if (parsedYear !== null) {
339
+ year = parsedYear;
340
+ }
341
+ }
342
+ }
343
+ if (day === null || month === null || year === null || hour === null || minute === null || second === null) {
344
+ return null;
345
+ }
346
+ if (year < 1601 || year > 9999) {
347
+ return null;
348
+ }
349
+ if (day < 1 || day > 31) {
350
+ return null;
351
+ }
352
+ if (hour > 23 || minute > 59 || second > 59) {
353
+ return null;
354
+ }
355
+ const date = new Date(Date.UTC(year, month - 1, day, hour, minute, second));
356
+ if (Number.isNaN(date.getTime())) {
357
+ return null;
358
+ }
359
+ return date;
360
+ }
361
+ /**
362
+ * Determine whether a domain matches a host per RFC 6265.
363
+ */
364
+ // RFC 6265 §5.1.3: domain-match algorithm.
365
+ export function domainMatches(host, domain) {
366
+ const normalizedHost = host.toLowerCase();
367
+ const normalizedDomain = domain.toLowerCase();
368
+ if (!normalizedDomain) {
369
+ return false;
370
+ }
371
+ if (normalizedHost === normalizedDomain) {
372
+ return true;
373
+ }
374
+ if (isIpAddress(normalizedHost)) {
375
+ return false;
376
+ }
377
+ return normalizedHost.endsWith(`.${normalizedDomain}`);
378
+ }
379
+ /**
380
+ * Compute default-path for a request URL.
381
+ */
382
+ // RFC 6265 §5.1.4: default-path algorithm.
383
+ export function defaultPath(requestUrl) {
384
+ let path = '/';
385
+ try {
386
+ path = new URL(requestUrl).pathname;
387
+ }
388
+ catch {
389
+ return '/';
390
+ }
391
+ if (!path.startsWith('/')) {
392
+ return '/';
393
+ }
394
+ if (path === '/') {
395
+ return '/';
396
+ }
397
+ const lastSlash = path.lastIndexOf('/');
398
+ if (lastSlash <= 0) {
399
+ return '/';
400
+ }
401
+ return path.slice(0, lastSlash);
402
+ }
403
+ /**
404
+ * Determine whether a cookie path matches the request path.
405
+ */
406
+ // RFC 6265 §5.1.4: path-match rules.
407
+ export function pathMatches(requestPath, cookiePath) {
408
+ if (requestPath === cookiePath) {
409
+ return true;
410
+ }
411
+ if (!requestPath.startsWith(cookiePath)) {
412
+ return false;
413
+ }
414
+ if (cookiePath.endsWith('/')) {
415
+ return true;
416
+ }
417
+ const nextChar = requestPath[cookiePath.length];
418
+ return nextChar === '/';
419
+ }
420
+ /**
421
+ * Build Cookie header from stored cookies for a request URL.
422
+ */
423
+ // RFC 6265 §5.4: Cookie header generation order.
424
+ export function buildCookieHeader(cookies, requestUrl, options = {}) {
425
+ if (!cookies || cookies.length === 0) {
426
+ return null;
427
+ }
428
+ const url = new URL(requestUrl);
429
+ const host = url.hostname.toLowerCase();
430
+ const path = url.pathname || '/';
431
+ const now = options.now ?? new Date();
432
+ const isSecure = options.isSecure ?? url.protocol === 'https:';
433
+ const includeHttpOnly = options.includeHttpOnly ?? true;
434
+ const filtered = cookies.filter((cookie) => {
435
+ if (cookie.expires && cookie.expires.getTime() <= now.getTime()) {
436
+ return false;
437
+ }
438
+ const domain = cookie.domain.toLowerCase();
439
+ if (cookie.hostOnly) {
440
+ if (host !== domain) {
441
+ return false;
442
+ }
443
+ }
444
+ else if (!domainMatches(host, domain)) {
445
+ return false;
446
+ }
447
+ if (!pathMatches(path, cookie.path)) {
448
+ return false;
449
+ }
450
+ if (cookie.secureOnly && !isSecure) {
451
+ return false;
452
+ }
453
+ if (cookie.httpOnly && !includeHttpOnly) {
454
+ return false;
455
+ }
456
+ return true;
457
+ });
458
+ if (filtered.length === 0) {
459
+ return null;
460
+ }
461
+ filtered.sort((a, b) => {
462
+ const pathDiff = b.path.length - a.path.length;
463
+ if (pathDiff !== 0) {
464
+ return pathDiff;
465
+ }
466
+ return a.creationTime.getTime() - b.creationTime.getTime();
467
+ });
468
+ return filtered
469
+ .map(cookie => `${cookie.name}=${formatCookieValue(cookie.value)}`)
470
+ .join('; ');
471
+ }
472
+ //# sourceMappingURL=cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"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"}
package/dist/cors.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CORS helpers aligned with Fetch/CORS specs.
3
+ */
4
+ import type { CorsOptions } from './types.js';
5
+ /**
6
+ * Default CORS headers for permissive API access.
7
+ * Used when no specific options are provided.
8
+ */
9
+ export declare const defaultCorsHeaders: Record<string, string>;
10
+ /**
11
+ * Build CORS headers from options.
12
+ *
13
+ * @param options - CORS configuration
14
+ * @returns Headers object
15
+ *
16
+ * Behavior:
17
+ * - origin: '*' | string - sets Access-Control-Allow-Origin
18
+ * - For multiple origins, use buildCorsHeadersForOrigin(requestOrigin, options)
19
+ * - methods: string[] - sets Access-Control-Allow-Methods
20
+ * - allowHeaders: string[] - sets Access-Control-Allow-Headers
21
+ * - exposeHeaders: string[] - sets Access-Control-Expose-Headers
22
+ * - credentials: boolean - if true, sets Access-Control-Allow-Credentials: true
23
+ * - WARNING: Cannot use '*' for origin when credentials is true
24
+ * - maxAge: number - sets Access-Control-Max-Age in seconds
25
+ */
26
+ export declare function buildCorsHeaders(options?: CorsOptions): Record<string, string>;
27
+ /**
28
+ * Build CORS headers for a preflight response (OPTIONS request).
29
+ * Same as buildCorsHeaders but always includes max-age.
30
+ */
31
+ export declare function buildPreflightHeaders(options?: CorsOptions): Record<string, string>;
32
+ /**
33
+ * Build CORS headers for a specific request origin.
34
+ *
35
+ * Use this when you support multiple origins. It echoes the request origin
36
+ * and adds Vary: Origin for correct caching behavior.
37
+ */
38
+ export declare function buildCorsHeadersForOrigin(requestOrigin: string | null, options?: CorsOptions): Record<string, string>;
39
+ /**
40
+ * Check if an origin is allowed based on CorsOptions.
41
+ * Useful for dynamic origin validation.
42
+ *
43
+ * @param requestOrigin - The Origin header from the request
44
+ * @param options - CORS configuration
45
+ * @returns true if origin is allowed
46
+ */
47
+ export declare function isOriginAllowed(requestOrigin: string, options?: CorsOptions): boolean;
48
+ /**
49
+ * Legacy alias for backward compatibility.
50
+ * Returns defaultCorsHeaders.
51
+ */
52
+ export declare function corsHeaders(): Record<string, string>;
53
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC;AAwBF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmD9E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASnF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACrC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,OAAO,CAAC,EAAE,WAAW,GACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCxB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAUrF;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEpD"}