4.2 KiB
@cap.js/server
@cap.js/server is Cap's server-side library. It helps you create and validate challenges for your users. Start by installing it using bun (recommended), npm, or pnpm:
::: code-group
bun add @cap.js/server
npm i @cap.js/server
pnpm i @cap.js/server
:::
Note
It is recommended to use at least Node.js 14 or Bun v1.0.0. You might experience multiple issues on older versions of these runtimes.
If you're using Glitch, make sure to set your Node version to 14 in yourenginesfield inpackage.json
Example code
::: code-group
import { Elysia } from 'elysia';
import Cap from "@cap.js/server";
const cap = new Cap({
tokens_store_path: ".data/tokensList.json",
});
new Elysia()
.post("/api/challenge", () => {
return cap.createChallenge();
})
.post("/api/redeem", async ({ body, set }) => {
const { token, solutions } = body;
if (!token || !solutions) {
set.status = 400;
return { success: false };
}
return await cap.redeemChallenge({ token, solutions });
})
.listen(3000);
console.log(`🦊 Elysia is running at http://localhost:3000`);
import Fastify from "fastify";
import Cap from "@cap.js/server";
const fastify = Fastify();
const cap = new Cap({
tokens_store_path: ".data/tokensList.json",
});
fastify.post("/api/challenge", (req, res) => {
res.send(
cap.createChallenge()
);
});
fastify.post("/api/redeem", async (req, res) => {
const { token, solutions } = req.body;
if (!token || !solutions) {
return res.code(400).send({ success: false });
}
res.send(await cap.redeemChallenge({ token, solutions }));
});
fastify.listen({ port: 3000, host: "0.0.0.0" }).then(() => {
console.log("Server is running on http://localhost:3000");
});
import Cap from "@cap.js/server";
const cap = new Cap({
tokens_store_path: ".data/tokensList.json",
});
Bun.serve({
port: 3000,
routes: {
"/api/challenge": {
POST: () => {
return Response.json(cap.createChallenge());
},
},
"/api/redeem": {
POST: async (req) => {
const body = await req.json();
const { token, solutions } = body;
if (!token || !solutions) {
return Response.json({ success: false }, { status: 400 });
}
return Response.json(await cap.redeemChallenge({ token, solutions }));
},
},
},
});
console.log(`Server running at http://localhost:3000`);
import express from "express";
import Cap from "@cap.js/server";
const app = express();
app.use(express.json());
const cap = new Cap({
tokens_store_path: '.data/tokensList.json'
});
app.post('/api/challenge', (req, res) => {
res.json(cap.createChallenge());
});
app.post('/api/redeem', async (req, res) => {
const { token, solutions } = req.body;
if (!token || !solutions) {
return res.status(400).json({ success: false });
}
res.json(await cap.redeemChallenge({ token, solutions }));
});
app.listen(3000, () => {
console.log('Listening on port 3000');
})
:::
Then, you can verify the CAPTCHA tokens on your server by calling the await cap.validateToken("<token>") method. Example:
const { success } = await cap.validateToken("9363220f..."); // [!code highlight]
if (success) {
console.log("Valid token");
} else {
console.log("Invalid token");
}
Supported methods and arguments
The following methods are supported:
new Cap({ ... })
Creates a new Cap instance.
Arguments
{
tokens_store_path: ".data/tokensList.json",
state: {
challengesList: {},
tokensList: {},
},
}
Tip
You can always access or set the options of the
Capclass by accessing or modifying thecap.configobject.
cap.createChallenge({ ... })
Arguments
{
challengeCount: 18,
challengeSize: 32,
challengeDifficulty: 4,
expiresMs: 600000
}
Response: { challenge, expires }
cap.redeemChallenge({ ... })
{
token,
solutions
}
Response: { success, token }
await cap.validateToken("...", { ... })
Arguments:
{
keepToken: false
}
Response: { success }