@queelabs/next
v0.0.2
Published
Small Quee server + Next.js App Router handler
Readme
@queelabs/next
Thin Next.js helpers on top of @queelabs/sdk: createQuee / createQueeFromEnv, mount queeAppHandler on /quee/*, optional createQueeBrowserClient for the browser.
Quee: https://quee.one
Docs: Next.js integration · buyers & guests · quickstart.
Install
pnpm add @queelabs/next @queelabs/sdkServer (lib/quee.ts)
import { createQueeFromEnv } from "@queelabs/next";
export const quee = createQueeFromEnv({
identify: async ({ request }) => {
const session = await getSession(request); // your auth
if (!session?.user?.id) return null;
return {
externalRef: session.user.id,
displayName: session.user.name ?? "Buyer",
};
},
});Env: QUEE_API_BASE_URL, QUEE_API_KEY, QUEE_MARKETPLACE_ID.
Next.js App Router
app/quee/[[...slug]]/route.ts:
import { queeAppHandler } from "@queelabs/next";
import { quee } from "@/lib/quee";
export const { GET, POST } = queeAppHandler(quee);Routes
| Method | Path | Body / notes |
|--------|------|----------------|
| GET | /quee or /quee/health | Liveness JSON |
| POST | /quee/checkout/start | { "listingId": "lst_…" } → 402 + Quee payment-required payload |
| POST | /quee/checkout/verify | { orderId, challengeId, rail, proof } |
| GET | /quee/receipt/:qhash | Proxies receipt lookup (server API key) |
Browser
import { createQueeBrowserClient } from "@queelabs/next";
const api = createQueeBrowserClient({ basePath: "/quee" });
const { status, data } = await api.startCheckout("lst_…");The underlying server-side marketplace helper in @queelabs/sdk now also supports
a checkout-first flow:
const checkout = await marketplace.startCheckout({
listingId: "lst_…",
buyerActorId: "act_…",
});
await checkout.verifyWithProof({
rail: "tempo",
proof: {
txHash: "0x...",
sender: "0xbuyer",
recipient: "0xreceiver",
memo: checkout.order.id,
},
});
await checkout.confirmFulfillment({ delivered: true });
await checkout.releaseSettlement();Security note
The handler uses your server Quee API key. On /quee/checkout/verify, it resolves the current buyer from identify, loads the order, and rejects verification unless the order’s buyerActorId matches that buyer. If your app needs tighter policy than buyer-actor ownership, add your own server-side guard on top.
