UNPKG

@mastra/core

Version:
1 lines • 13.4 kB
{"version":3,"file":"index.cjs","names":[],"sources":["../../../_internals/auth/dist/session-DA5voLUM.js"],"sourcesContent":["import { createHmac } from \"crypto\";\n//#region src/session/memory.ts\nfunction escapeRegExp$1(str) {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n/**\n* In-memory session provider.\n*\n* Stores sessions in a Map. Useful for development but not suitable\n* for production as sessions are lost on restart.\n*\n* @example\n* ```typescript\n* const sessionProvider = new MemorySessionProvider({\n* ttl: 24 * 60 * 60 * 1000, // 24 hours\n* });\n* ```\n*/\nvar MemorySessionProvider = class {\n\tsessions = /* @__PURE__ */ new Map();\n\tttl;\n\tcookieName;\n\tcookiePath;\n\tcleanupTimer = null;\n\tconstructor(options = {}) {\n\t\tthis.ttl = options.ttl ?? 10080 * 60 * 1e3;\n\t\tthis.cookieName = options.cookieName ?? \"mastra_session\";\n\t\tthis.cookiePath = options.cookiePath ?? \"/\";\n\t\tconst cleanupInterval = options.cleanupInterval ?? 6e4;\n\t\tthis.cleanupTimer = setInterval(() => this.cleanup(), cleanupInterval);\n\t\tconsole.warn(\"[MemorySessionProvider] Using in-memory sessions. Sessions will be lost on server restart. Use a persistent session provider in production.\");\n\t}\n\tasync createSession(userId, metadata) {\n\t\tconst session = {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tuserId,\n\t\t\texpiresAt: new Date(Date.now() + this.ttl),\n\t\t\tcreatedAt: /* @__PURE__ */ new Date(),\n\t\t\tmetadata\n\t\t};\n\t\tthis.sessions.set(session.id, session);\n\t\treturn session;\n\t}\n\tasync validateSession(sessionId) {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (!session) return null;\n\t\tif (session.expiresAt < /* @__PURE__ */ new Date()) {\n\t\t\tthis.sessions.delete(sessionId);\n\t\t\treturn null;\n\t\t}\n\t\treturn session;\n\t}\n\tasync destroySession(sessionId) {\n\t\tthis.sessions.delete(sessionId);\n\t}\n\tasync refreshSession(sessionId) {\n\t\tconst session = await this.validateSession(sessionId);\n\t\tif (!session) return null;\n\t\tsession.expiresAt = new Date(Date.now() + this.ttl);\n\t\tthis.sessions.set(sessionId, session);\n\t\treturn session;\n\t}\n\tgetSessionIdFromRequest(request) {\n\t\tconst cookieHeader = request.headers.get(\"cookie\");\n\t\tif (!cookieHeader) return null;\n\t\tconst escapedName = escapeRegExp$1(this.cookieName);\n\t\treturn cookieHeader.match(new RegExp(`${escapedName}=([^;]+)`))?.[1] ?? null;\n\t}\n\tgetSessionHeaders(session) {\n\t\tconst maxAge = Math.floor((session.expiresAt.getTime() - Date.now()) / 1e3);\n\t\treturn { \"Set-Cookie\": `${this.cookieName}=${session.id}; HttpOnly; SameSite=Lax; Path=${this.cookiePath}; Max-Age=${maxAge}` };\n\t}\n\tgetClearSessionHeaders() {\n\t\treturn { \"Set-Cookie\": `${this.cookieName}=; HttpOnly; SameSite=Lax; Path=${this.cookiePath}; Max-Age=0` };\n\t}\n\t/**\n\t* Clean up expired sessions.\n\t*/\n\tcleanup() {\n\t\tconst now = /* @__PURE__ */ new Date();\n\t\tfor (const [id, session] of this.sessions) if (session.expiresAt < now) this.sessions.delete(id);\n\t}\n\t/**\n\t* Stop the cleanup timer.\n\t*/\n\tdispose() {\n\t\tif (this.cleanupTimer) {\n\t\t\tclearInterval(this.cleanupTimer);\n\t\t\tthis.cleanupTimer = null;\n\t\t}\n\t}\n\t/**\n\t* Get the number of active sessions (for debugging).\n\t*/\n\tgetSessionCount() {\n\t\treturn this.sessions.size;\n\t}\n};\n//#endregion\n//#region src/session/cookie.ts\n/**\n* Signed cookie session provider.\n*\n* Stores session data in signed cookies. No server-side storage required.\n*/\nfunction escapeRegExp(str) {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n/**\n* Signed cookie session provider.\n*\n* Stores session data in signed cookies. The session is validated\n* by verifying the signature on each request.\n*\n* @example\n* ```typescript\n* const sessionProvider = new CookieSessionProvider({\n* secret: process.env.SESSION_SECRET!,\n* ttl: 7 * 24 * 60 * 60 * 1000, // 7 days\n* });\n* ```\n*/\nvar CookieSessionProvider = class {\n\tsecret;\n\tttl;\n\tcookieName;\n\tcookiePath;\n\tcookieDomain;\n\tsecure;\n\tconstructor(options) {\n\t\tif (!options.secret || options.secret.length < 32) throw new Error(\"CookieSessionProvider requires a secret of at least 32 characters\");\n\t\tthis.secret = options.secret;\n\t\tthis.ttl = options.ttl ?? 10080 * 60 * 1e3;\n\t\tthis.cookieName = options.cookieName ?? \"mastra_session\";\n\t\tthis.cookiePath = options.cookiePath ?? \"/\";\n\t\tthis.cookieDomain = options.cookieDomain;\n\t\tthis.secure = options.secure ?? process.env[\"NODE_ENV\"] === \"production\";\n\t}\n\tasync createSession(userId, metadata) {\n\t\tconst now = Date.now();\n\t\treturn {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tuserId,\n\t\t\texpiresAt: new Date(now + this.ttl),\n\t\t\tcreatedAt: new Date(now),\n\t\t\tmetadata\n\t\t};\n\t}\n\tasync validateSession(_sessionId) {\n\t\treturn null;\n\t}\n\tasync destroySession(_sessionId) {}\n\tasync refreshSession(_sessionId) {\n\t\treturn null;\n\t}\n\tgetSessionIdFromRequest(request) {\n\t\treturn this.getSessionFromCookie(request)?.id ?? null;\n\t}\n\t/**\n\t* Get full session from cookie.\n\t*/\n\tgetSessionFromCookie(request) {\n\t\tconst cookieHeader = request.headers.get(\"cookie\");\n\t\tif (!cookieHeader) return null;\n\t\tconst escapedName = escapeRegExp(this.cookieName);\n\t\tconst match = cookieHeader.match(new RegExp(`${escapedName}=([^;]+)`));\n\t\tif (!match?.[1]) return null;\n\t\ttry {\n\t\t\tconst decoded = this.decodeAndVerify(match[1]);\n\t\t\tif (!decoded) return null;\n\t\t\tif (decoded.expiresAt < Date.now()) return null;\n\t\t\treturn {\n\t\t\t\tid: decoded.id,\n\t\t\t\tuserId: decoded.userId,\n\t\t\t\texpiresAt: new Date(decoded.expiresAt),\n\t\t\t\tcreatedAt: new Date(decoded.createdAt),\n\t\t\t\tmetadata: decoded.metadata\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\tgetSessionHeaders(session) {\n\t\tconst data = {\n\t\t\tid: session.id,\n\t\t\tuserId: session.userId,\n\t\t\texpiresAt: session.expiresAt.getTime(),\n\t\t\tcreatedAt: session.createdAt.getTime(),\n\t\t\tmetadata: session.metadata\n\t\t};\n\t\tconst encoded = this.signAndEncode(data);\n\t\tconst maxAge = Math.floor((session.expiresAt.getTime() - Date.now()) / 1e3);\n\t\tlet cookie = `${this.cookieName}=${encoded}; HttpOnly; SameSite=Lax; Path=${this.cookiePath}; Max-Age=${maxAge}`;\n\t\tif (this.cookieDomain) cookie += `; Domain=${this.cookieDomain}`;\n\t\tif (this.secure) cookie += \"; Secure\";\n\t\treturn { \"Set-Cookie\": cookie };\n\t}\n\tgetClearSessionHeaders() {\n\t\tlet cookie = `${this.cookieName}=; HttpOnly; SameSite=Lax; Path=${this.cookiePath}; Max-Age=0`;\n\t\tif (this.cookieDomain) cookie += `; Domain=${this.cookieDomain}`;\n\t\treturn { \"Set-Cookie\": cookie };\n\t}\n\t/**\n\t* Sign and encode session data.\n\t*/\n\tsignAndEncode(data) {\n\t\tconst json = JSON.stringify(data);\n\t\tconst signature = this.sign(json);\n\t\tconst payload = `${this.base64Encode(json)}.${signature}`;\n\t\treturn encodeURIComponent(payload);\n\t}\n\t/**\n\t* Decode and verify session cookie.\n\t*/\n\tdecodeAndVerify(cookie) {\n\t\ttry {\n\t\t\tconst [data, signature] = decodeURIComponent(cookie).split(\".\");\n\t\t\tif (!data || !signature) return null;\n\t\t\tconst json = this.base64Decode(data);\n\t\t\tconst expectedSignature = this.sign(json);\n\t\t\tif (!this.secureCompare(signature, expectedSignature)) return null;\n\t\t\treturn JSON.parse(json);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\t/**\n\t* Create HMAC-SHA256 signature.\n\t*/\n\tsign(data) {\n\t\treturn createHmac(\"sha256\", this.secret).update(data).digest(\"base64url\");\n\t}\n\t/**\n\t* Base64 encode (consistent across Node.js and browser runtimes).\n\t*/\n\tbase64Encode(str) {\n\t\tconst bytes = new TextEncoder().encode(str);\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(bytes).toString(\"base64\");\n\t\tlet binary = \"\";\n\t\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\t\treturn btoa(binary);\n\t}\n\t/**\n\t* Base64 decode (consistent across Node.js and browser runtimes).\n\t*/\n\tbase64Decode(str) {\n\t\tif (typeof Buffer !== \"undefined\") return Buffer.from(str, \"base64\").toString(\"utf-8\");\n\t\tconst binary = atob(str);\n\t\tconst bytes = new Uint8Array(binary.length);\n\t\tfor (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n\t\treturn new TextDecoder().decode(bytes);\n\t}\n\t/**\n\t* Constant-time string comparison.\n\t*/\n\tsecureCompare(a, b) {\n\t\tif (a.length !== b.length) return false;\n\t\tlet result = 0;\n\t\tfor (let i = 0; i < a.length; i++) result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\treturn result === 0;\n\t}\n};\n//#endregion\nexport { MemorySessionProvider as n, CookieSessionProvider as t };\n\n//# sourceMappingURL=session-DA5voLUM.js.map"],"mappings":"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"}