Skip to main content

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):

CategoryMethods
Setupsetup(databaseUrl?)
BalancesgetBalance(userId), addCredits(userId, amount, type?, metadata?, expiresAt?), reserveCredits(userId, amount, opType?, metadata?, minBalance?), deductCredits(userId, reservationId, amount, idempotencyKey?, metadata?)
PricinggetActivePricing(), setActivePricing(config, label?)
PlansgetUserPlan(userId), setUserPlan(userId, planId), checkAllowance(userId), incrementUsageWindow(userId, planId, amount)
Spend capscheckSpendCap(userId, model?, amount?)
RefundsrefundCredits(transactionId, amount?, reason?, metadata?)
ExpirysweepExpiredCredits(dryRun?)
AnalyticsspendByUser(start, end), spendByModel(start, end), topUsers(limit, start, end), dailySpend(start, end), aggregateStats(start, end)
TeamscreateTeam(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)
}