@tuwaio/satellite-siwe-next-auth 1.0.0-fix-test-alpha.21.76f200b → 1.0.0-fix-test-alpha.23.7306d70

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.
@@ -1,3 +1,3 @@
1
- import {getIronSession}from'iron-session';import {NextResponse}from'next/server';import {SiweMessage}from'siwe';function g(t){let e=t.session||{},c=process.env.SIWE_SESSION_SECRET,r=e.password||c;if(!r||r.length<32)throw new Error("SIWE Error: Iron Session requires a 'password' option (min 32 chars) or SIWE_SESSION_SECRET environment variable to be set.");let d={...{secure:process.env.NODE_ENV==="production",maxAge:300*60,httpOnly:true,sameSite:"lax",path:"/"},...e.cookieOptions};return {password:r,cookieName:e.cookieName||"satellite_siwe",cookieOptions:d}}function l(t){if(!t)return console.warn("SIWE WARN: SIWE_SESSION_URL is not defined. Defaulting domain check to 'localhost'."),"localhost";try{return new URL(t.startsWith("http")?t:`https://${t}`).host}catch(e){return console.error(`SIWE ERROR: Invalid URL provided in SIWE_SESSION_URL: ${t}. Error: ${typeof e=="string"?e:e.message}`),"localhost"}}function y(t={}){let e=t.options||{},c=g(t);async function r(s){let o=new Response;return getIronSession(s,o,c)}async function f(s){try{let{message:o,signature:u}=await s.json();if(!o||!u)return NextResponse.json({message:"Missing message or signature"},{status:400});e.afterNonce&&await e.afterNonce();let n=new SiweMessage(o),a=l(process.env.SIWE_SESSION_URL);if(!(await n.verify({signature:u,domain:a})).success)return NextResponse.json({message:"SIWE verification failed"},{status:401});e.afterVerify&&await e.afterVerify();let p=await r(s);return p.address=n.address,p.chainId=n.chainId,p.isLoggedIn=!0,await p.save(),e.afterSession&&await e.afterSession(),NextResponse.json({isLoggedIn:!0,address:n.address,chainId:n.chainId},{status:200})}catch(o){return console.error("SIWE CRITICAL LOGIN ERROR:",o),NextResponse.json({message:"Internal Server Error during login"},{status:500})}}async function d(s){let o=await r(s);return s.method==="POST"||s.method==="DELETE"?(o.destroy(),e.afterLogout&&await e.afterLogout(),NextResponse.json({isLoggedIn:false},{status:200})):o.isLoggedIn&&o.address&&o.chainId?NextResponse.json({isLoggedIn:true,address:o.address,chainId:o.chainId}):NextResponse.json({isLoggedIn:false},{status:401})}let S=async(s,o)=>{let n=(await o.params||{})?.siwe||[],a=n[n.length-1];return a==="login"&&s.method==="POST"?f(s):a==="session"&&s.method==="GET"||a==="logout"&&(s.method==="POST"||s.method==="DELETE")?d(s):Promise.resolve(new Response("Not Found",{status:404}))};return {GET:S,POST:S,DELETE:S}}
2
- export{y as createSiweApiHandler,g as getSessionOptions};//# sourceMappingURL=index.mjs.map
1
+ import {getIronSession}from'iron-session';import {NextResponse}from'next/server';import {SiweMessage}from'siwe';function E(n){let e=n.session||{},d=process.env.SIWE_SESSION_SECRET,a=e.password||d;if(!a||a.length<32)throw new Error("SIWE Error: Iron Session requires a 'password' option (min 32 chars) or SIWE_SESSION_SECRET environment variable to be set.");let S={...{secure:process.env.NODE_ENV==="production",maxAge:300*60,httpOnly:true,sameSite:"lax",path:"/"},...e.cookieOptions};return {password:a,cookieName:e.cookieName||"satellite_siwe",cookieOptions:S}}function O(n){if(!n)return console.warn("SIWE WARN: SIWE_SESSION_URL is not defined. Defaulting domain check to 'localhost'."),"localhost";try{return new URL(n.startsWith("http")?n:`https://${n}`).host}catch(e){return console.error(`SIWE ERROR: Invalid URL provided in SIWE_SESSION_URL: ${n}. Error: ${typeof e=="string"?e:e.message}`),"localhost"}}function x(n={}){let e=n.options||{},d=E(n);async function a(o){let s=new Response;return {session:await getIronSession(o,s,d),response:s}}async function f(o){try{let{message:s,signature:p}=await o.json();if(!s||!p)return NextResponse.json({message:"Missing message or signature"},{status:400});e.afterNonce&&await e.afterNonce();let t=new SiweMessage(s),i=O(process.env.SIWE_SESSION_URL);if(!(await t.verify({signature:p,domain:i})).success)return NextResponse.json({message:"SIWE verification failed"},{status:401});e.afterVerify&&await e.afterVerify();let{session:c,response:l}=await a(o);c.address=t.address,c.chainId=t.chainId,c.isLoggedIn=!0,await c.save(),e.afterSession&&await e.afterSession();let m=NextResponse.json({isLoggedIn:!0,address:c.address,chainId:c.chainId},{status:200});return l.headers.forEach((w,h)=>{h.toLowerCase()==="set-cookie"&&m.headers.append("Set-Cookie",w);}),m}catch(s){return console.error("SIWE CRITICAL LOGIN ERROR:",s),NextResponse.json({message:"Internal Server Error during login"},{status:500})}}async function S(o){let{session:s,response:p}=await a(o);if(o.method==="POST"||o.method==="DELETE"){s.destroy(),e.afterLogout&&await e.afterLogout();let t=NextResponse.json({isLoggedIn:false},{status:200});return p.headers.forEach((i,g)=>{g.toLowerCase()==="set-cookie"&&t.headers.append("Set-Cookie",i);}),t}return s.isLoggedIn&&s.address&&s.chainId?NextResponse.json({isLoggedIn:true,address:s.address,chainId:s.chainId}):NextResponse.json({isLoggedIn:false},{status:401})}let u=async(o,s)=>{let t=(await s.params||{})?.siwe||[],i=t[t.length-1];return i==="login"&&o.method==="POST"?f(o):i==="session"&&o.method==="GET"||i==="logout"&&(o.method==="POST"||o.method==="DELETE")?S(o):Promise.resolve(new Response("Not Found",{status:404}))};return {GET:u,POST:u,DELETE:u}}
2
+ export{x as createSiweApiHandler,E as getSessionOptions};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/session.config.ts","../../src/server/siweAuthServer.ts"],"names":["getSessionOptions","userConfig","sessionSettings","defaultPassword","finalPassword","finalCookieOptions","getDomain","url","createSiweApiHandler","config","hooks","currentSessionOptions","getSession","req","response","getIronSession","handleLogin","message","signature","NextResponse","siweMessage","SiweMessage","domain","session","error","handleGetSessionAndLogout","universalHandler","context","pathSegments","action"],"mappings":"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","file":"index.mjs","sourcesContent":["import { SessionOptions } from 'iron-session';\n\nimport { SiweApiConfig, SiweCookieOptions } from '../types';\n\n/**\n * @function getSessionOptions\n * @description Generates the Iron Session options object based on user configuration.\n * @param userConfig - The complete user configuration including session settings.\n * @returns SessionOptions The options required by `getIronSession`.\n */\nexport function getSessionOptions(userConfig: SiweApiConfig): SessionOptions {\n const sessionSettings = userConfig.session || {};\n\n const defaultPassword = process.env.SIWE_SESSION_SECRET;\n const finalPassword = sessionSettings.password || defaultPassword;\n\n if (!finalPassword || finalPassword.length < 32) {\n throw new Error(\n \"SIWE Error: Iron Session requires a 'password' option (min 32 chars) or SIWE_SESSION_SECRET environment variable to be set.\",\n );\n }\n\n // Determine cookie options\n const defaultCookieOptions: SiweCookieOptions = {\n // secure: true if NODE_ENV is production, as requested.\n secure: process.env.NODE_ENV === 'production',\n maxAge: 300 * 60, // 5 hours default\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n };\n\n // Merge default options with user provided options\n const finalCookieOptions: SiweCookieOptions = {\n ...defaultCookieOptions,\n ...sessionSettings.cookieOptions,\n };\n\n return {\n password: finalPassword as string,\n cookieName: sessionSettings.cookieName || 'satellite_siwe',\n cookieOptions: finalCookieOptions,\n } as SessionOptions;\n}\n","import { getIronSession, IronSession } from 'iron-session';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { SiweMessage } from 'siwe';\n\nimport { Session, SiweApiConfig, SiweApiHooks } from '../types';\nimport { getSessionOptions } from './session.config';\n\n// App Router Handler type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AppRouterHandler = (req: NextRequest, context: any) => Promise<Response>;\n\n// ------------------------------------\n// --- UTILITIES ---\n// ------------------------------------\n\n/**\n * @function getDomain\n * @description Extracts the host/domain from SIWE_SESSION_URL for SIWE verification.\n */\nfunction getDomain(url: string | undefined): string {\n if (!url) {\n console.warn(\"SIWE WARN: SIWE_SESSION_URL is not defined. Defaulting domain check to 'localhost'.\");\n return 'localhost';\n }\n try {\n const parsedUrl = new URL(url.startsWith('http') ? url : `https://${url}`);\n return parsedUrl.host;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n console.error(\n `SIWE ERROR: Invalid URL provided in SIWE_SESSION_URL: ${url}. Error: ${typeof e === 'string' ? e : e.message}`,\n );\n return 'localhost';\n }\n}\n\n// ------------------------------------\n// --- MAIN API FACTORY ---\n// ------------------------------------\n\ninterface SiweApiRoutes {\n GET: AppRouterHandler;\n POST: AppRouterHandler;\n DELETE: AppRouterHandler;\n}\n\nexport function createSiweApiHandler(config: SiweApiConfig = {}): SiweApiRoutes {\n const hooks: SiweApiHooks = config.options || {};\n const currentSessionOptions = getSessionOptions(config);\n\n /**\n * @function getSession\n * @description Retrieves the Iron Session object from the request using the configured options.\n */\n async function getSession(req: NextRequest): Promise<IronSession<Session>> {\n const response = new Response();\n return getIronSession<Session>(req, response, currentSessionOptions);\n }\n\n // 1. Handles the SIWE login process (POST /login)\n async function handleLogin(req: NextRequest): Promise<Response> {\n try {\n const { message, signature } = await req.json();\n\n if (!message || !signature) {\n return NextResponse.json({ message: 'Missing message or signature' }, { status: 400 });\n }\n\n if (hooks.afterNonce) await hooks.afterNonce();\n\n const siweMessage = new SiweMessage(message);\n // ИСПОЛЬЗУЕМ НОВУЮ ПЕРЕМЕННУЮ ДЛЯ ДОМЕНА\n const domain = getDomain(process.env.SIWE_SESSION_URL);\n\n const result = await siweMessage.verify({\n signature: signature,\n domain: domain,\n });\n\n if (!result.success) {\n return NextResponse.json({ message: 'SIWE verification failed' }, { status: 401 });\n }\n\n if (hooks.afterVerify) await hooks.afterVerify();\n\n const session = await getSession(req);\n\n session.address = siweMessage.address;\n session.chainId = siweMessage.chainId;\n session.isLoggedIn = true;\n\n await session.save();\n\n if (hooks.afterSession) await hooks.afterSession();\n\n return NextResponse.json(\n { isLoggedIn: true, address: siweMessage.address, chainId: siweMessage.chainId },\n { status: 200 },\n );\n } catch (error) {\n console.error('SIWE CRITICAL LOGIN ERROR:', error); // Делаем лог более заметным\n return NextResponse.json({ message: 'Internal Server Error during login' }, { status: 500 });\n }\n }\n\n // 2. Handles session retrieval (GET /session) and logout (POST/DELETE /logout)\n async function handleGetSessionAndLogout(req: NextRequest): Promise<Response> {\n // ... (логика без изменений)\n const session = await getSession(req);\n\n if (req.method === 'POST' || req.method === 'DELETE') {\n session.destroy();\n\n if (hooks.afterLogout) await hooks.afterLogout();\n\n return NextResponse.json({ isLoggedIn: false }, { status: 200 });\n }\n\n if (session.isLoggedIn && session.address && session.chainId) {\n return NextResponse.json({\n isLoggedIn: true,\n address: session.address,\n chainId: session.chainId,\n });\n }\n\n return NextResponse.json({ isLoggedIn: false }, { status: 401 });\n }\n\n // --- UNIVERSAL DISPATCHER ---\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const universalHandler = async (req: NextRequest, context: any): Promise<Response> => {\n const params = (await context.params) || {};\n const pathSegments: string[] = params?.siwe || [];\n const action = pathSegments[pathSegments.length - 1];\n\n if (action === 'login' && req.method === 'POST') {\n return handleLogin(req);\n }\n\n if (\n (action === 'session' && req.method === 'GET') ||\n (action === 'logout' && (req.method === 'POST' || req.method === 'DELETE'))\n ) {\n return handleGetSessionAndLogout(req);\n }\n\n return Promise.resolve(new Response('Not Found', { status: 404 }));\n };\n\n return {\n GET: universalHandler,\n POST: universalHandler,\n DELETE: universalHandler,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/session.config.ts","../../src/server/siweAuthServer.ts"],"names":["getSessionOptions","userConfig","sessionSettings","defaultPassword","finalPassword","finalCookieOptions","getDomain","url","createSiweApiHandler","config","hooks","currentSessionOptions","getSessionContainer","req","response","getIronSession","handleLogin","message","signature","NextResponse","siweMessage","SiweMessage","domain","session","sessionResponseContainer","finalResponse","value","key","error","handleGetSessionAndLogout","universalHandler","context","pathSegments","action"],"mappings":"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","file":"index.mjs","sourcesContent":["import { SessionOptions } from 'iron-session';\n\nimport { SiweApiConfig, SiweCookieOptions } from '../types';\n\n/**\n * @function getSessionOptions\n * @description Generates the Iron Session options object based on user configuration.\n * @param userConfig - The complete user configuration including session settings.\n * @returns SessionOptions The options required by `getIronSession`.\n */\nexport function getSessionOptions(userConfig: SiweApiConfig): SessionOptions {\n const sessionSettings = userConfig.session || {};\n\n const defaultPassword = process.env.SIWE_SESSION_SECRET;\n const finalPassword = sessionSettings.password || defaultPassword;\n\n if (!finalPassword || finalPassword.length < 32) {\n throw new Error(\n \"SIWE Error: Iron Session requires a 'password' option (min 32 chars) or SIWE_SESSION_SECRET environment variable to be set.\",\n );\n }\n\n // Determine cookie options\n const defaultCookieOptions: SiweCookieOptions = {\n // secure: true if NODE_ENV is production, as requested.\n secure: process.env.NODE_ENV === 'production',\n maxAge: 300 * 60, // 5 hours default\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n };\n\n // Merge default options with user provided options\n const finalCookieOptions: SiweCookieOptions = {\n ...defaultCookieOptions,\n ...sessionSettings.cookieOptions,\n };\n\n return {\n password: finalPassword as string,\n cookieName: sessionSettings.cookieName || 'satellite_siwe',\n cookieOptions: finalCookieOptions,\n } as SessionOptions;\n}\n","import { getIronSession, IronSession } from 'iron-session';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { SiweMessage } from 'siwe';\n\nimport { Session, SiweApiConfig, SiweApiHooks } from '../types';\nimport { getSessionOptions } from './session.config';\n\n// App Router Handler type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AppRouterHandler = (req: NextRequest, context: any) => Promise<Response>;\n\n// ------------------------------------\n// --- UTILITIES ---\n// ------------------------------------\n\n/**\n * @function getDomain\n * @description Extracts the host/domain from SIWE_SESSION_URL for SIWE verification.\n */\nfunction getDomain(url: string | undefined): string {\n if (!url) {\n console.warn(\"SIWE WARN: SIWE_SESSION_URL is not defined. Defaulting domain check to 'localhost'.\");\n return 'localhost';\n }\n try {\n const parsedUrl = new URL(url.startsWith('http') ? url : `https://${url}`);\n return parsedUrl.host;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n console.error(\n `SIWE ERROR: Invalid URL provided in SIWE_SESSION_URL: ${url}. Error: ${typeof e === 'string' ? e : e.message}`,\n );\n return 'localhost';\n }\n}\n\n// ------------------------------------\n// --- MAIN API FACTORY ---\n// ------------------------------------\n\ninterface SiweApiRoutes {\n GET: AppRouterHandler;\n POST: AppRouterHandler;\n DELETE: AppRouterHandler;\n}\n\nexport function createSiweApiHandler(config: SiweApiConfig = {}): SiweApiRoutes {\n const hooks: SiweApiHooks = config.options || {};\n const currentSessionOptions = getSessionOptions(config);\n\n /**\n * @function getSessionContainer\n * @description Retrieves the Iron Session object and the Response container\n * used to hold the Set-Cookie headers.\n * @returns Promise<{ session: IronSession<Session>, response: Response }>\n */\n async function getSessionContainer(req: NextRequest): Promise<{ session: IronSession<Session>; response: Response }> {\n const response = new Response(); // Response-контейнер для куки\n const session = await getIronSession<Session>(req, response, currentSessionOptions);\n return { session, response };\n }\n\n // 1. Handles the SIWE login process (POST /login)\n async function handleLogin(req: NextRequest): Promise<Response> {\n try {\n const { message, signature } = await req.json();\n\n if (!message || !signature) {\n return NextResponse.json({ message: 'Missing message or signature' }, { status: 400 });\n }\n\n if (hooks.afterNonce) await hooks.afterNonce();\n\n const siweMessage = new SiweMessage(message);\n const domain = getDomain(process.env.SIWE_SESSION_URL);\n\n const result = await siweMessage.verify({\n signature: signature,\n domain: domain,\n });\n\n if (!result.success) {\n return NextResponse.json({ message: 'SIWE verification failed' }, { status: 401 });\n }\n\n if (hooks.afterVerify) await hooks.afterVerify();\n\n const { session, response: sessionResponseContainer } = await getSessionContainer(req);\n\n session.address = siweMessage.address;\n session.chainId = siweMessage.chainId;\n session.isLoggedIn = true;\n\n await session.save();\n\n if (hooks.afterSession) await hooks.afterSession();\n\n const finalResponse = NextResponse.json(\n { isLoggedIn: true, address: session.address, chainId: session.chainId },\n { status: 200 },\n );\n\n sessionResponseContainer.headers.forEach((value, key) => {\n if (key.toLowerCase() === 'set-cookie') {\n finalResponse.headers.append('Set-Cookie', value);\n }\n });\n\n return finalResponse;\n } catch (error) {\n console.error('SIWE CRITICAL LOGIN ERROR:', error);\n return NextResponse.json({ message: 'Internal Server Error during login' }, { status: 500 });\n }\n }\n\n // 2. Handles session retrieval (GET /session) and logout (POST/DELETE /logout)\n async function handleGetSessionAndLogout(req: NextRequest): Promise<Response> {\n const { session, response: sessionResponseContainer } = await getSessionContainer(req);\n\n if (req.method === 'POST' || req.method === 'DELETE') {\n session.destroy();\n\n if (hooks.afterLogout) await hooks.afterLogout();\n\n const finalResponse = NextResponse.json({ isLoggedIn: false }, { status: 200 });\n\n sessionResponseContainer.headers.forEach((value, key) => {\n if (key.toLowerCase() === 'set-cookie') {\n finalResponse.headers.append('Set-Cookie', value);\n }\n });\n return finalResponse;\n }\n\n if (session.isLoggedIn && session.address && session.chainId) {\n return NextResponse.json({\n isLoggedIn: true,\n address: session.address,\n chainId: session.chainId,\n });\n }\n\n return NextResponse.json({ isLoggedIn: false }, { status: 401 });\n }\n\n // --- UNIVERSAL DISPATCHER ---\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const universalHandler = async (req: NextRequest, context: any): Promise<Response> => {\n const params = (await context.params) || {};\n const pathSegments: string[] = params?.siwe || [];\n const action = pathSegments[pathSegments.length - 1];\n\n if (action === 'login' && req.method === 'POST') {\n return handleLogin(req);\n }\n\n if (\n (action === 'session' && req.method === 'GET') ||\n (action === 'logout' && (req.method === 'POST' || req.method === 'DELETE'))\n ) {\n return handleGetSessionAndLogout(req);\n }\n\n return Promise.resolve(new Response('Not Found', { status: 404 }));\n };\n\n return {\n GET: universalHandler,\n POST: universalHandler,\n DELETE: universalHandler,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuwaio/satellite-siwe-next-auth",
3
- "version": "1.0.0-fix-test-alpha.21.76f200b",
3
+ "version": "1.0.0-fix-test-alpha.23.7306d70",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",