Docs
Adapters
Database Adapters

Database Adapters

Use server adapters when dismissal/read state must persist across devices.

Import adapters from featuredrop/adapters.

RemoteAdapter runs in the browser and talks to your API. Database adapters run on the server behind that API.

Remote contract

Your API usually supports:

  • GET /api/featuredrop/state -> { watermark, dismissedIds }
  • POST /api/featuredrop/dismiss -> { featureId }
  • POST /api/featuredrop/dismiss-all -> { watermark }

Example server implementations

app/api/featuredrop/state/route.ts
import { NextResponse } from 'next/server'
import { PostgresAdapter } from 'featuredrop/adapters'
import { Pool } from 'pg'
 
const pool = new Pool({ connectionString: process.env.DATABASE_URL })
 
function getAdapter(userId: string) {
  return new PostgresAdapter({
    userId,
    query: (sql, params) => pool.query(sql, params as unknown[])
  })
}
 
export async function GET() {
  const userId = 'current-user-id'
  const adapter = getAdapter(userId)
  await adapter.sync()
  return NextResponse.json({
    watermark: adapter.getWatermark(),
    dismissedIds: Array.from(adapter.getDismissedIds())
  })
}

Adapter contract

All DB adapters implement ServerStorageAdapter, so you can swap backends without changing React integration.