Skip to main content

Hono Adapter

Adapter for integrating Better Auth Studio with Hono applications.

Import

import { betterAuthStudio } from 'better-auth-studio/hono';

betterAuthStudio()

Creates a Hono-compatible handler for Better Auth Studio.

Function Signature

function betterAuthStudio(config: StudioConfig): (c: Context) => Promise<Response>

Parameters

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

Returns

An async function that accepts a Hono Context and returns a Response

Usage

Basic Setup

import { Hono } from 'hono';
import { betterAuthStudio } from 'better-auth-studio/hono';
import { auth } from './auth';
import { defineStudioConfig } from 'better-auth-studio';

const app = new Hono();

const studioConfig = defineStudioConfig({
  auth,
  basePath: '/api/studio',
  metadata: {
    title: 'My App Studio',
    theme: 'dark'
  },
  events: {
    enabled: true,
    tableName: 'auth_events'
  }
});

const studioHandler = betterAuthStudio(studioConfig);

// Mount as a catch-all route
app.all('/api/studio/*', studioHandler);

export default app;

With Cloudflare Workers

import { Hono } from 'hono';
import { betterAuthStudio } from 'better-auth-studio/hono';
import { auth } from './auth';

const app = new Hono();

const studioHandler = betterAuthStudio({
  auth,
  basePath: '/api/studio',
  events: {
    enabled: true,
    clientType: 'clickhouse',
    client: // Your ClickHouse client
  }
});

app.all('/api/studio/*', studioHandler);

export default app;

With Middleware

import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { logger } from 'hono/logger';
import { betterAuthStudio } from 'better-auth-studio/hono';
import { auth } from './auth';

const app = new Hono();

// Global middleware
app.use('*', cors());
app.use('*', logger());

// Studio handler
const studioHandler = betterAuthStudio({
  auth,
  access: {
    roles: ['admin']
  }
});

app.all('/api/studio/*', studioHandler);

With TypeScript Types

import { Hono } from 'hono';
import type { Context } from 'hono';
import { betterAuthStudio } from 'better-auth-studio/hono';
import { auth } from './auth';

const app = new Hono();

const studioHandler: (c: Context) => Promise<Response> = betterAuthStudio({
  auth
});

app.all('/api/studio/*', studioHandler);

Implementation Details

Request Conversion

The adapter converts Hono Context to the universal format:
type UniversalRequest = {
  url: string;           // URL pathname + search params
  method: string;        // c.req.method
  headers: Record<string, string>; // c.req.raw.headers
  body?: any;            // Parsed from c.req.json() or c.req.parseBody()
};

Content Type Handling

The adapter automatically detects and parses:
  • application/jsonc.req.json()
  • application/x-www-form-urlencodedc.req.parseBody()

Response Handling

The adapter returns appropriate Hono response types based on content:
  • JSON content → c.json()
  • HTML content → c.html()
  • Text content → c.text()
  • Buffer content → c.body()

Error Handling

Errors are caught and returned as JSON responses:
{
  error: "Internal server error"
}
Status code: 500

Build docs developers (and LLMs) love