Elysia Adapter
Adapter for integrating Better Auth Studio with Elysia applications.
Import
import { betterAuthStudio } from 'better-auth-studio/elysia' ;
betterAuthStudio()
Creates an Elysia-compatible handler for Better Auth Studio.
Function Signature
function betterAuthStudio ( config : StudioConfig ) : ( context : Context ) => Promise < Response | any >
Parameters
Studio configuration object containing authentication and feature settings. Show StudioConfig properties
Your Better Auth instance
Base path for the studio routes. Default: "/api/studio"
Access control configuration for the studio
Customization options for branding and theming
Last-seen tracking configuration
IP geolocation provider configuration
Event tracking and ingestion configuration
Tools configuration with exclude list
Returns
An async function that accepts an Elysia Context and returns a Response or serializable value
Usage
Basic Setup
import { Elysia } from 'elysia' ;
import { betterAuthStudio } from 'better-auth-studio/elysia' ;
import { auth } from './auth' ;
import { defineStudioConfig } from 'better-auth-studio' ;
const studioConfig = defineStudioConfig ({
auth ,
basePath: '/api/studio' ,
metadata: {
title: 'My App Studio' ,
theme: 'dark'
},
events: {
enabled: true ,
tableName: 'auth_events'
}
});
const studioHandler = betterAuthStudio ( studioConfig );
const app = new Elysia ()
. all ( '/api/studio/*' , studioHandler )
. listen ( 3000 );
console . log ( `Server running at http://localhost:3000` );
console . log ( `Studio available at http://localhost:3000/api/studio` );
With Bun Runtime
import { Elysia } from 'elysia' ;
import { betterAuthStudio } from 'better-auth-studio/elysia' ;
import { auth } from './auth' ;
const app = new Elysia ()
. all ( '/api/studio/*' , betterAuthStudio ({ auth }))
. listen ( 3000 );
console . log ( `🦊 Elysia is running at ${ app . server ?. hostname } : ${ app . server ?. port } ` );
With Plugins
import { Elysia } from 'elysia' ;
import { cors } from '@elysiajs/cors' ;
import { swagger } from '@elysiajs/swagger' ;
import { betterAuthStudio } from 'better-auth-studio/elysia' ;
import { auth } from './auth' ;
const app = new Elysia ()
. use ( cors ())
. use ( swagger ())
. all ( '/api/studio/*' , betterAuthStudio ({ auth }))
. listen ( 3000 );
With Type Safety
import { Elysia } from 'elysia' ;
import type { Context } from 'elysia' ;
import { betterAuthStudio } from 'better-auth-studio/elysia' ;
import { auth } from './auth' ;
const studioHandler : ( context : Context ) => Promise < Response | any > =
betterAuthStudio ({ auth });
const app = new Elysia ()
. all ( '/api/studio/*' , studioHandler )
. listen ( 3000 );
With Access Control
import { Elysia } from 'elysia' ;
import { betterAuthStudio } from 'better-auth-studio/elysia' ;
import { auth } from './auth' ;
const app = new Elysia ()
. all ( '/api/studio/*' , betterAuthStudio ({
auth ,
access: {
roles: [ 'admin' ],
allowEmails: [ '[email protected] ' ]
}
}))
. listen ( 3000 );
Implementation Details
Request Conversion
The adapter converts Elysia Context to the universal format:
type UniversalRequest = {
url : string ; // URL pathname + search params
method : string ; // context.request.method
headers : Record < string , string >; // context.request.headers
body ?: any ; // Parsed from context.body or context.request
};
Body Handling
The adapter attempts to read the body from:
context.body (parsed by Elysia)
context.query (query parameters)
context.request (raw request object)
Content Type Handling
The adapter automatically detects and parses:
application/json → context.request.json()
application/x-www-form-urlencoded → FormData converted to object
multipart/form-data → FormData converted to object
Other → Attempts to parse as text, then JSON
Response Handling
The adapter returns appropriate Elysia response types:
JSON content → Parsed JSON object
HTML content → Response object
Text content → String
Buffer content → Response object
Elysia automatically serializes these values based on content type.
Status and Headers
The adapter sets status and headers using Elysia’s context:
context . set . status = 200 ;
context . set . headers [ 'Content-Type' ] = 'application/json' ;
Error Handling
Errors are caught and returned as JSON objects:
{
error : "Internal server error"
}
Status code: 500
Elysia Features
Pattern Matching
Elysia supports wildcard routes:
app . all ( '/api/studio/*' , handler ); // Matches all paths under /api/studio
Elysia is built for speed with:
Bun runtime optimization
Zero-cost abstractions
Efficient request parsing