diff --git a/src/Utilities/Utilities.ts b/src/Utilities/Utilities.ts index 86c532d..6c39272 100644 --- a/src/Utilities/Utilities.ts +++ b/src/Utilities/Utilities.ts @@ -32,15 +32,56 @@ type Cookie = { secure?: boolean; }; -export const setCookie = ( - headers: Headers, - cookie: Cookie -): Headers => { - throw new Error('unimplemented'); + +export const setCookie = (headers: Headers) => (cookie: Cookie): Headers => { + const { + name, + value, + domain, + path = '/', + expires, + httpOnly, + maxAge, + sameSite, + secure, + } = cookie; + + let cookieString = `${name}=${value}; Path=${path}`; + if (domain) cookieString += `; Domain=${domain}`; + if (maxAge) cookieString += `; Max-Age=${maxAge}`; + if (expires !== undefined) { + cookieString += `; Expires=${expires === 0 ? 'Thu, 01 Jan 1970 00:00:00 GMT' : (expires as Date).toUTCString()}`; + } + if (secure) cookieString += `; Secure`; + if (httpOnly) cookieString += `; HttpOnly`; + if (sameSite) cookieString += `; SameSite=${sameSite}`; + + const key = Object.keys(headers).find(k => k.toLowerCase() === 'set-cookie') || 'set-cookie'; + const existing = headers[key] || []; + + return { + ...headers, + [key]: [...existing, cookieString], + }; }; -export const getCookie = ( - headers: Headers -) => (name: string): string => { - throw new Error('unimplemented'); -} + +export const getCookie = (headers: Headers) => (name: string): Cookie | undefined => { + const cookieKey = Object.keys(headers).find(k => k.toLowerCase() === 'cookie'); + if (!cookieKey) return undefined; + + const cookieString = headers[cookieKey].join('; '); + const cookieParts = cookieString.split(';').map(c => c.trim()); + + for (const part of cookieParts) { + const [k, ...rest] = part.split('='); + if (k === name) { + return { + name: k, + value: rest.join('=') + }; + } + } + + return undefined; +}; \ No newline at end of file