Skip to main content

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

config
StudioConfig
required
Studio configuration object containing authentication and feature settings.

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:
  1. context.body (parsed by Elysia)
  2. context.query (query parameters)
  3. context.request (raw request object)

Content Type Handling

The adapter automatically detects and parses:
  • application/jsoncontext.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

High Performance

Elysia is built for speed with:
  • Bun runtime optimization
  • Zero-cost abstractions
  • Efficient request parsing

Build docs developers (and LLMs) love