notes.dt.in.th

Remix has a pretty robust & easy-to-use session management utilities that can be easily integrated into an Elysia application:

import { Elysia } from 'elysia'

interface ISessionStorage<S> {
  getSession(cookieHeader: string | null): Promise<S>
  commitSession(session: S): Promise<string | null>
}

export function remixSession<T>(sessionStorage: ISessionStorage<T>) {
  return new Elysia({ name: 'remixSession' })
    .derive(async ({ request }) => {
      const cookieHeader = request.headers.get('cookie')
      return {
        session: await sessionStorage.getSession(cookieHeader),
      }
    })
    .onAfterHandle(async ({ session, set }) => {
      const cookie = await sessionStorage.commitSession(session)
      if (cookie) {
        set.headers['set-cookie'] ??= []
        if (!Array.isArray(set.headers['set-cookie'])) {
          set.headers['set-cookie'] = [set.headers['set-cookie']]
        }
        set.headers['set-cookie'].push(cookie)
      }
    })
    .as('scoped')
}

To use:

import { createCookieSessionStorage } from '@remix-run/node'

const sessionStorage = createCookieSessionStorage({
  cookie: { name: '__session', secrets: ['ELYSIAr0ck5'] },
})

export default new Elysia()
  .use(remixSession(sessionStorage))
  .get('/count', async ({ session }) => {
    const count = (await session.get('count')) || 0
    session.set('count', count + 1)
    return `Count: ${count}`
  })

I like that I don’t have to manage cookies directly — using Remix’s session abstraction keeps my code less coupled to Elysia itself. Plus, Remix provides built-in runtime warnings and robust error handling, so I’m less likely to misconfigure things.

Remix provides several session storage APIs, allowing you to store session data either as signed data in cookies or in a backing store like a filesystem, database, or key-value store. Here’s a quick reference table:

APIStorage Type
createCookieSessionStorageSigned data in cookie
createFileSessionStorageFile system (Node.js/Deno)
createWorkersKVSessionStorageCloudflare Workers KV
createArcTableSessionStorageDynamoDB (Architect/AWS)