Store Adapters — JavaScript
MemoryStore
In-memory, data lost on restart. Perfect for testing and development.
import { MemoryStore } from "@apoorwv/ducto";
const store = new MemoryStore();
Full CreditStore interface (18 async methods):
| Category | Methods |
|---|---|
| Setup | setup(databaseUrl?) |
| Balances | getBalance(userId), addCredits(userId, amount, type?, metadata?, expiresAt?), reserveCredits(userId, amount, opType?, metadata?, minBalance?), deductCredits(userId, reservationId, amount, idempotencyKey?, metadata?) |
| Pricing | getActivePricing(), setActivePricing(config, label?) |
| Plans | getUserPlan(userId), setUserPlan(userId, planId), checkAllowance(userId), incrementUsageWindow(userId, planId, amount) |
| Spend caps | checkSpendCap(userId, model?, amount?) |
| Refunds | refundCredits(transactionId, amount?, reason?, metadata?) |
| Expiry | sweepExpiredCredits(dryRun?) |
| Analytics | spendByUser(start, end), spendByModel(start, end), topUsers(limit, start, end), dailySpend(start, end), aggregateStats(start, end) |
| Teams | createTeam(name, initialBalance?), getTeamBalance(teamId), addTeamMember(teamId, userId, role?, spendCap?), getTeamMembers(teamId), deductTeam(teamId, userId, amount, metadata?) |
HttpxSupabaseStore
Supabase-backed store using native fetch (Node 18+).
import { HttpxSupabaseStore } from "@apoorwv/ducto";
const store = new HttpxSupabaseStore(
"https://your-project.supabase.co",
"service_role_key", // service_role, not anon key
);
Delegates all operations to Postgres RPC functions via HTTP.
PostgresStore
Direct PostgreSQL store. Requires pg package.
import { PostgresStore } from "@apoorwv/ducto";
const store = new PostgresStore("postgresql://user:pass@host:5432/db");
Delegates all operations to Postgres RPC functions via callproc.
Custom Adapter
Implement the CreditStore interface:
import type { CreditStore, ReserveResult, DeductionResult, BalanceResult, AddCreditsResult } from "@apoorwv/ducto";
class MyStore implements CreditStore {
async getBalance(userId: string): Promise<BalanceResult> { ... }
async addCredits(userId: string, amount: number, ...): Promise<AddCreditsResult> { ... }
async reserveCredits(userId: string, amount: number, ...): Promise<ReserveResult> { ... }
async deductCredits(userId: string, reservationId: string, amount: number): Promise<DeductionResult> { ... }
// ... 14 more methods (see CreditStore interface)
}