From 2c882846a6834e13705ee56713d2402d4e9c2709 Mon Sep 17 00:00:00 2001
From: Tiago <70700766+tiagorangel1@users.noreply.github.com>
Date: Wed, 25 Jun 2025 20:32:08 +0100
Subject: [PATCH] feat: standalone v2!
---
.gitignore | 5 +-
assets/standalone_v1/Dockerfile | 29 +
assets/standalone_v1/bun.lock | 79 ++
assets/standalone_v1/package.json | 58 ++
assets/standalone_v1/public/index.html | 326 ++++++++
.../standalone_v1}/public/index.js | 0
.../standalone_v1}/public/lock.html | 0
.../standalone_v1}/public/logo.png | Bin
.../standalone_v1}/public/test.html | 0
assets/standalone_v1/src/index.js | 449 +++++++++++
docs/.vitepress/config.mjs | 28 +-
docs/guide/index.md | 10 +-
docs/guide/middleware/demo.png | Bin 499441 -> 0 bytes
docs/guide/middleware/index.md | 6 +-
docs/guide/standalone.md | 4 +
docs/guide/standalone/api.md | 13 +
docs/guide/standalone/index.md | 9 +
docs/guide/standalone/installation.md | 32 +
docs/guide/standalone/options.md | 38 +
docs/guide/standalone/usage.md | 73 ++
docs/package.json | 4 +-
docs/public/checkpoints_screenshot.png | Bin 0 -> 4691695 bytes
docs/public/standalone_screenshot.png | Bin 0 -> 1294962 bytes
standalone/.env.example | 1 +
standalone/bun.lock | 27 +
standalone/package.json | 3 +-
standalone/public/index.css | 745 ++++++++++++++++++
standalone/public/index.html | 473 ++++-------
standalone/public/js/api.js | 37 +
standalone/public/js/createApiKey.js | 82 ++
standalone/public/js/createKey.js | 100 +++
standalone/public/js/homepage.js | 82 ++
standalone/public/js/index.js | 48 ++
standalone/public/js/keyPage.js | 439 +++++++++++
standalone/public/js/settings.js | 142 ++++
standalone/public/js/state.js | 16 +
standalone/public/js/utils.js | 36 +
standalone/public/login.html | 287 +++++++
standalone/public/logo-small.webp | Bin 0 -> 1156 bytes
standalone/public/tester.html | 133 ++++
standalone/src/assets.js | 109 +++
standalone/src/auth.js | 154 ++++
standalone/src/cap.js | 173 ++++
standalone/src/db.js | 76 ++
standalone/src/index.js | 497 ++----------
standalone/src/ratelimit.js | 29 +
standalone/src/server.js | 491 ++++++++++++
47 files changed, 4578 insertions(+), 765 deletions(-)
create mode 100644 assets/standalone_v1/Dockerfile
create mode 100644 assets/standalone_v1/bun.lock
create mode 100644 assets/standalone_v1/package.json
create mode 100644 assets/standalone_v1/public/index.html
rename {standalone => assets/standalone_v1}/public/index.js (100%)
rename {standalone => assets/standalone_v1}/public/lock.html (100%)
rename {standalone => assets/standalone_v1}/public/logo.png (100%)
rename {standalone => assets/standalone_v1}/public/test.html (100%)
create mode 100644 assets/standalone_v1/src/index.js
delete mode 100644 docs/guide/middleware/demo.png
create mode 100644 docs/guide/standalone/api.md
create mode 100644 docs/guide/standalone/index.md
create mode 100644 docs/guide/standalone/installation.md
create mode 100644 docs/guide/standalone/options.md
create mode 100644 docs/guide/standalone/usage.md
create mode 100644 docs/public/checkpoints_screenshot.png
create mode 100644 docs/public/standalone_screenshot.png
create mode 100644 standalone/.env.example
create mode 100644 standalone/public/index.css
create mode 100644 standalone/public/js/api.js
create mode 100644 standalone/public/js/createApiKey.js
create mode 100644 standalone/public/js/createKey.js
create mode 100644 standalone/public/js/homepage.js
create mode 100644 standalone/public/js/index.js
create mode 100644 standalone/public/js/keyPage.js
create mode 100644 standalone/public/js/settings.js
create mode 100644 standalone/public/js/state.js
create mode 100644 standalone/public/js/utils.js
create mode 100644 standalone/public/login.html
create mode 100644 standalone/public/logo-small.webp
create mode 100644 standalone/public/tester.html
create mode 100644 standalone/src/assets.js
create mode 100644 standalone/src/auth.js
create mode 100644 standalone/src/cap.js
create mode 100644 standalone/src/db.js
create mode 100644 standalone/src/ratelimit.js
create mode 100644 standalone/src/server.js
diff --git a/.gitignore b/.gitignore
index 5459546..5510722 100644
--- a/.gitignore
+++ b/.gitignore
@@ -93,7 +93,4 @@ node_modules
debug/
target/
**/*.rs.bk
-*.pdb
-
-
-standalone-v2-beta/**
+*.pdb
\ No newline at end of file
diff --git a/assets/standalone_v1/Dockerfile b/assets/standalone_v1/Dockerfile
new file mode 100644
index 0000000..f72e975
--- /dev/null
+++ b/assets/standalone_v1/Dockerfile
@@ -0,0 +1,29 @@
+FROM oven/bun:1 AS base
+WORKDIR /usr/src/app
+
+FROM base AS install
+RUN mkdir -p /temp/dev
+COPY package.json bun.lock /temp/dev/
+RUN cd /temp/dev && bun install
+
+FROM base AS prod
+RUN mkdir -p /temp/prod
+COPY package.json bun.lock /temp/prod/
+RUN cd /temp/prod && bun install
+
+FROM base AS prerelease
+COPY --from=install /temp/dev/node_modules node_modules
+COPY . .
+
+FROM base AS release
+COPY --from=prod /temp/prod/node_modules node_modules
+COPY --from=prerelease /usr/src/app .
+WORKDIR /usr/src/app
+
+RUN mkdir -p /usr/src/app/.data && chown -R bun:bun /usr/src/app/.data
+
+EXPOSE 3000/tcp
+
+USER bun
+
+ENTRYPOINT [ "bun", "run", "./src/index.js" ]
\ No newline at end of file
diff --git a/assets/standalone_v1/bun.lock b/assets/standalone_v1/bun.lock
new file mode 100644
index 0000000..a08968c
--- /dev/null
+++ b/assets/standalone_v1/bun.lock
@@ -0,0 +1,79 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "app",
+ "dependencies": {
+ "@cap.js/server": "^1.0.13",
+ "@elysiajs/cors": "^1.3.3",
+ "@elysiajs/static": "^1.3.0",
+ "elysia": "^1.3.1",
+ "elysia-rate-limit": "^4.3.0",
+ },
+ "devDependencies": {
+ "bun-types": "latest",
+ },
+ },
+ },
+ "packages": {
+ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
+
+ "@cap.js/server": ["@cap.js/server@1.0.13", "", { "dependencies": { "@types/node": "^22.14.1", "typescript": "^5.8.3" } }, "sha512-JcEd/XdqheDSaoBdW0YK4o2lpxlFiCipcUcvgr8ZHscprYVXOTpk7fpagiXqJAJSr68dwyaYk+h8WBv42R4QTw=="],
+
+ "@elysiajs/cors": ["@elysiajs/cors@1.3.3", "", { "peerDependencies": { "elysia": ">= 1.3.0" } }, "sha512-mYIU6PyMM6xIJuj7d27Vt0/wuzVKIEnFPjcvlkyd7t/m9xspAG37cwNjFxVOnyvY43oOd2I/oW2DB85utXpA2Q=="],
+
+ "@elysiajs/static": ["@elysiajs/static@1.3.0", "", { "dependencies": { "node-cache": "^5.1.2" }, "peerDependencies": { "elysia": ">= 1.3.0" } }, "sha512-7mWlj2U/AZvH27IfRKqpUjDP1W9ZRldF9NmdnatFEtx0AOy7YYgyk0rt5hXrH6wPcR//2gO2Qy+k5rwswpEhJA=="],
+
+ "@sinclair/typebox": ["@sinclair/typebox@0.34.33", "", {}, "sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g=="],
+
+ "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="],
+
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
+
+ "@types/node": ["@types/node@22.15.2", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A=="],
+
+ "bun-types": ["bun-types@1.2.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-Kuh4Ub28ucMRWeiUUWMHsT9Wcbr4H3kLIO72RZZElSDxSu7vpetRvxIUDUaW6QtaIeixIpm7OXtNnZPf82EzwA=="],
+
+ "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
+
+ "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="],
+
+ "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="],
+
+ "elysia": ["elysia@1.3.1", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-En41P6cDHcHtQ0nvfsn9ayB+8ahQJqG1nzvPX8FVZjOriFK/RtZPQBtXMfZDq/AsVIk7JFZGFEtAVEmztNJVhQ=="],
+
+ "elysia-rate-limit": ["elysia-rate-limit@4.3.0", "", { "dependencies": { "@alloc/quick-lru": "5.2.0", "debug": "4.3.4" }, "peerDependencies": { "elysia": ">= 1.0.0" } }, "sha512-TCquBhMqUK+Wce+2RoaIk6byhJ6KMtO316PYp4Mc1GKkBH7qKPQH7Y5qVLauBkzx69wBYgFwMrtuz8yToG3JtQ=="],
+
+ "exact-mirror": ["exact-mirror@0.1.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-wFCPCDLmHbKGUb8TOi/IS7jLsgR8WVDGtDK3CzcB4Guf/weq7G+I+DkXiRSZfbemBFOxOINKpraM6ml78vo8Zw=="],
+
+ "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
+
+ "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
+
+ "file-type": ["file-type@20.5.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.6", "strtok3": "^10.2.0", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
+
+ "node-cache": ["node-cache@5.1.2", "", { "dependencies": { "clone": "2.x" } }, "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg=="],
+
+ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
+
+ "peek-readable": ["peek-readable@7.0.0", "", {}, "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ=="],
+
+ "strtok3": ["strtok3@10.2.2", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^7.0.0" } }, "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg=="],
+
+ "token-types": ["token-types@6.0.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA=="],
+
+ "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
+
+ "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="],
+
+ "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@tokenizer/inflate/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
+
+ "@tokenizer/inflate/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+ }
+}
diff --git a/assets/standalone_v1/package.json b/assets/standalone_v1/package.json
new file mode 100644
index 0000000..2588bb1
--- /dev/null
+++ b/assets/standalone_v1/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "cap-standalone",
+ "version": "1.0.17",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "dev": "bun run --watch src/index.js",
+ "docker:publish": "docker buildx build --platform linux/amd64,linux/arm64 -t tiago2/cap:latest . --push"
+ },
+ "keywords": [
+ "security",
+ "detection",
+ "prevention",
+ "defense",
+ "protection",
+ "anti-abuse",
+ "anti-automation",
+ "anti-bot",
+ "anti-ddos",
+ "anti-dos",
+ "anti-exploitation",
+ "anti-spam",
+ "anti-scraping",
+ "attack-mitigation",
+ "protocol",
+ "client-server",
+ "computational-puzzle",
+ "complexity",
+ "puzzle",
+ "crypto",
+ "cryptographic",
+ "algorithm",
+ "cybersecurity",
+ "ddos",
+ "hashcash",
+ "hcaptcha",
+ "captcha-alternative",
+ "verification",
+ "invisible",
+ "pow",
+ "proof-of-work",
+ "recaptcha",
+ "spam",
+ "bots",
+ "filtering",
+ "turing-test"
+ ],
+ "dependencies": {
+ "@cap.js/server": "^1.0.13",
+ "@elysiajs/cors": "^1.3.3",
+ "@elysiajs/static": "^1.3.0",
+ "elysia": "^1.3.1",
+ "elysia-rate-limit": "^4.3.0"
+ },
+ "devDependencies": {
+ "bun-types": "latest"
+ },
+ "module": "src/index.js"
+}
diff --git a/assets/standalone_v1/public/index.html b/assets/standalone_v1/public/index.html
new file mode 100644
index 0000000..223cd4f
--- /dev/null
+++ b/assets/standalone_v1/public/index.html
@@ -0,0 +1,326 @@
+
+
+
+
+
+ Cap
+
+
+
+
+
+
+
+
Your keys
+
+
+
+
+
+
+
diff --git a/standalone/public/index.js b/assets/standalone_v1/public/index.js
similarity index 100%
rename from standalone/public/index.js
rename to assets/standalone_v1/public/index.js
diff --git a/standalone/public/lock.html b/assets/standalone_v1/public/lock.html
similarity index 100%
rename from standalone/public/lock.html
rename to assets/standalone_v1/public/lock.html
diff --git a/standalone/public/logo.png b/assets/standalone_v1/public/logo.png
similarity index 100%
rename from standalone/public/logo.png
rename to assets/standalone_v1/public/logo.png
diff --git a/standalone/public/test.html b/assets/standalone_v1/public/test.html
similarity index 100%
rename from standalone/public/test.html
rename to assets/standalone_v1/public/test.html
diff --git a/assets/standalone_v1/src/index.js b/assets/standalone_v1/src/index.js
new file mode 100644
index 0000000..67f43b8
--- /dev/null
+++ b/assets/standalone_v1/src/index.js
@@ -0,0 +1,449 @@
+import { Elysia, file, NotFoundError } from "elysia";
+import { staticPlugin } from "@elysiajs/static";
+import { timingSafeEqual } from "node:crypto";
+import { cors } from "@elysiajs/cors";
+import { rateLimit } from "elysia-rate-limit";
+import Cap from "@cap.js/server";
+import crypto from "crypto";
+import fs from "fs/promises";
+import path from "path";
+
+const ADMIN_KEY = process.env.ADMIN_KEY?.trim();
+const dataDir = "./.data";
+const keysStorePath = path.join(dataDir, "keys.json");
+
+function generateAdminKeyHint() {
+ return `\nWe've generated this one for you to use: \n\n${crypto
+ .randomBytes(30)
+ .toString("hex")}\n\nThen, restart this process.\n\n`;
+}
+
+if (!ADMIN_KEY) {
+ console.error(
+ `\nNo admin key has been set. Make sure to set it using the \n\`ADMIN_KEY\` environment variable.${generateAdminKeyHint()}`
+ );
+ process.exit(1);
+}
+
+if (ADMIN_KEY === "your_secret_key") {
+ console.error(
+ `\nDon't leave the admin key as default! Make sure to set it \nusing the \`ADMIN_KEY\` environment variable.${generateAdminKeyHint()}`
+ );
+ process.exit(1);
+}
+
+if (ADMIN_KEY.length < 20) {
+ console.warn(
+ `\n${"*".repeat(
+ 60
+ )}\n\nThe admin key you're using is quite short. We recommend \nusing a longer one.${generateAdminKeyHint()}${"*".repeat(
+ 60
+ )}\n`
+ );
+}
+
+let keys = [];
+const capInstances = new Map();
+
+const updateCache = async () => {
+ let cacheConfig = {};
+
+ try {
+ cacheConfig = JSON.parse(
+ await fs.readFile(path.join(dataDir, "assets-cache.json"), "utf-8")
+ );
+ } catch {}
+
+ const lastUpdate = cacheConfig["lastUpdate"] || 0;
+ const currentTime = Date.now();
+ const updateInterval = 1000 * 60 * 60 * 24; // 1 day
+
+ if (!(currentTime - lastUpdate > updateInterval)) return;
+
+ const CACHE_HOST = process.env.CACHE_HOST || "https://cdn.jsdelivr.net";
+ if (CACHE_HOST === "disable") return;
+
+ const WIDGET_VERSION = process.env.WIDGET_VERSION || "latest";
+ const WASM_VERSION = process.env.WASM_VERSION || "latest";
+
+ try {
+ const [widgetSource, floatingSource, wasmSource, wasmLoaderSource] =
+ await Promise.all([
+ fetch(`${CACHE_HOST}/npm/@cap.js/widget@${WIDGET_VERSION}`).then((r) => r.text()),
+ fetch(`${CACHE_HOST}/npm/@cap.js/widget@${WIDGET_VERSION}/cap-floating.min.js`).then(
+ (r) => r.text()
+ ),
+ fetch(`${CACHE_HOST}/npm/@cap.js/wasm@${WASM_VERSION}/browser/cap_wasm_bg.wasm`).then(
+ (r) => r.arrayBuffer()
+ ),
+ fetch(`${CACHE_HOST}/npm/@cap.js/wasm@${WASM_VERSION}/browser/cap_wasm.min.js`).then(
+ (r) => r.text()
+ ),
+ ]);
+
+ cacheConfig["lastUpdate"] = currentTime;
+ await fs.writeFile(
+ path.join(dataDir, "assets-cache.json"),
+ JSON.stringify(cacheConfig)
+ );
+
+ await fs.writeFile(path.join(dataDir, "assets-widget.js"), widgetSource);
+ await fs.writeFile(
+ path.join(dataDir, "assets-floating.js"),
+ floatingSource
+ );
+ await fs.writeFile(
+ path.join(dataDir, "assets-cap_wasm_bg.wasm"),
+ Buffer.from(wasmSource)
+ );
+ await fs.writeFile(
+ path.join(dataDir, "assets-cap_wasm.js"),
+ wasmLoaderSource
+ );
+
+ console.log("[asset server] updated assets cache");
+ } catch (e) {
+ console.error(
+ "[asset server] error updating assets cache, trying to load them might fail:",
+ e
+ );
+ }
+};
+
+const init = async () => {
+ try {
+ await fs.mkdir(dataDir, { recursive: true });
+
+ const data = await fs.readFile(keysStorePath, "utf-8");
+ keys = JSON.parse(data);
+ capInstances.clear();
+
+ keys.forEach((key) => {
+ capInstances.set(
+ key.publicKey,
+ new Cap({
+ tokens_store_path: path.join(dataDir, `tokens-${key.publicKey}.json`),
+ })
+ );
+ });
+ } catch {
+ await fs.writeFile(keysStorePath, "[]");
+ keys = [];
+ capInstances.clear();
+ }
+
+ await updateCache();
+};
+
+const saveKeys = async () => {
+ await fs.writeFile(keysStorePath, JSON.stringify(keys));
+};
+
+const getCapInstance = (publicKey) => {
+ if (!capInstances.has(publicKey) || !capInstances.get(publicKey)) {
+ const keyData = keys.find((k) => k.publicKey === publicKey);
+ if (keyData) {
+ capInstances.set(
+ publicKey,
+ new Cap({
+ tokens_store_path: path.join(dataDir, `tokens-${publicKey}.json`),
+ })
+ );
+ }
+ }
+ return capInstances.get(publicKey);
+};
+
+const auth = new Elysia({
+ prefix: "/internal/auth",
+})
+ .use(
+ rateLimit({
+ scoping: "scoped",
+ count: 10,
+ duration: 15000,
+ })
+ )
+ .post("/", async ({ body, cookie, set }) => {
+ try {
+ if (
+ !body?.password ||
+ !timingSafeEqual(Buffer.from(body.password), Buffer.from(ADMIN_KEY))
+ ) {
+ set.status = 401;
+ return { success: false };
+ }
+ } catch {
+ set.status = 500;
+ return { success: false };
+ }
+
+ cookie["cap-admin-key"].set({
+ value: await Bun.password.hash(body.password),
+ httpOnly: true,
+ secure: true,
+ sameSite: "lax",
+ path: "/",
+ maxAge: 86400 * 7,
+ });
+
+ return { success: true };
+ })
+ .get("/logout", ({ cookie, redirect }) => {
+ cookie["cap-admin-key"].remove();
+ return redirect("/");
+ });
+
+const internal = new Elysia({ prefix: "/internal" })
+ .onBeforeHandle(async ({ cookie, set }) => {
+ const authCookie = cookie["cap-admin-key"]?.value;
+ if (!authCookie || !(await Bun.password.verify(ADMIN_KEY, authCookie))) {
+ set.status = 401;
+ return {
+ success: false,
+ message: "Unauthorized",
+ };
+ }
+ })
+ .use(
+ rateLimit({
+ scoping: "scoped",
+ number: 60,
+ duration: 10000,
+ })
+ )
+ .post(
+ "/createKey",
+ async ({
+ body: {
+ keyName,
+ challengesCount = 18,
+ challengeSize = 32,
+ challengeDifficulty = 4,
+ expiresMs = 600000,
+ },
+ set,
+ }) => {
+ if (!keyName?.trim()) {
+ set.status = 400;
+ return { success: false, message: "Key name is required" };
+ }
+
+ const publicKey = crypto.randomBytes(6).toString("hex");
+ const privateKey = crypto.randomBytes(25).toString("hex");
+ const privateKeyHash = await Bun.password.hash(privateKey);
+
+ const newKey = {
+ name: keyName,
+ publicKey,
+ privateKey: privateKeyHash,
+ challengesCount: Number(challengesCount),
+ challengeSize: Number(challengeSize),
+ challengeDifficulty: Number(challengeDifficulty),
+ expiresMs: Number(expiresMs),
+ };
+
+ keys.push(newKey);
+ await saveKeys();
+
+ getCapInstance(publicKey);
+
+ set.status = 201;
+ return {
+ success: true,
+ publicKey,
+ privateKey,
+ };
+ }
+ )
+ .post(
+ "/editKey",
+ async ({
+ body: {
+ publicKey,
+ keyName,
+ challengesCount,
+ challengeSize,
+ challengeDifficulty,
+ expiresMs,
+ },
+ set,
+ }) => {
+ const keyIndex = keys.findIndex((key) => key.publicKey === publicKey);
+
+ if (keyIndex === -1) {
+ set.status = 404;
+ return { success: false, message: "Key not found" };
+ }
+
+ if (!keyName.trim()) {
+ set.status = 400;
+ return { success: false, message: "Key name is required" };
+ }
+
+ const existingKey = keys[keyIndex];
+ keys[keyIndex] = {
+ ...existingKey,
+ name: keyName,
+ challengesCount: Number(challengesCount),
+ challengeSize: Number(challengeSize),
+ challengeDifficulty: Number(challengeDifficulty),
+ expiresMs: Number(expiresMs),
+ };
+
+ await saveKeys();
+
+ return { success: true };
+ }
+ )
+ .get("/listKeys", async () => {
+ return {
+ keys: keys.map(({ privateKey, ...rest }) => rest),
+ };
+ })
+ .post("/deleteKey", async ({ body: { publicKey }, set }) => {
+ const initialLength = keys.length;
+ keys = keys.filter((key) => key.publicKey !== publicKey);
+
+ if (keys.length === initialLength) {
+ set.status = 404;
+ return { success: false, message: "Key not found" };
+ }
+
+ await saveKeys();
+
+ const tokenFilePath = path.join(dataDir, `tokens-${publicKey}.json`);
+ try {
+ await fs.unlink(tokenFilePath);
+ } catch (error) {
+ if (error.code !== "ENOENT") {
+ console.warn(
+ `Could not delete token file ${tokenFilePath}:`,
+ error.message
+ );
+ }
+ }
+
+ capInstances.delete(publicKey);
+
+ set.status = 200;
+ return { success: true };
+ })
+ .post("/rotateKey", async ({ body: { publicKey }, set }) => {
+ const keyIndex = keys.findIndex((key) => key.publicKey === publicKey);
+
+ if (keyIndex === -1) {
+ set.status = 404;
+ return { success: false, message: "Key not found" };
+ }
+
+ const newPrivateKey = crypto.randomBytes(25).toString("hex");
+ const newPrivateKeyHash = await Bun.password.hash(newPrivateKey);
+
+ keys[keyIndex].privateKey = newPrivateKeyHash;
+
+ await saveKeys();
+
+ return { success: true, privateKey: newPrivateKey };
+ });
+
+const api = new Elysia({ prefix: "/:key" })
+ .use(
+ cors({
+ origin: process.env.CORS_ORIGIN || true,
+ })
+ )
+ .use(
+ rateLimit({
+ scoping: "scoped",
+ number: 80,
+ duration: 1000,
+ })
+ )
+ .derive(({ params }) => {
+ const keyData = keys.find((k) => k.publicKey === params.key);
+ if (!keyData) {
+ throw new NotFoundError("Key not found");
+ }
+ return { keyData, capInstance: getCapInstance(params.key) };
+ })
+ .post("/api/challenge", async ({ keyData, capInstance }) => {
+ return await capInstance.createChallenge({
+ challengeSize: keyData.challengeSize,
+ challengeDifficulty: keyData.challengeDifficulty,
+ challengeCount: keyData.challengesCount,
+ expiresMs: keyData.expiresMs,
+ });
+ })
+ .post("/api/redeem", async ({ body, set, capInstance }) => {
+ const { token, solutions } = body;
+
+ if (!token || !solutions) {
+ set.status = 400;
+ return { success: false, message: "Missing solutions and/or token" };
+ }
+
+ return await capInstance.redeemChallenge({ token, solutions });
+ })
+ .post("/siteverify", async ({ body, set, keyData, capInstance }) => {
+ const { secret, response } = body;
+
+ if (!secret || !response) {
+ set.status = 400;
+ return { success: false, message: "Missing secret or/and response" };
+ }
+
+ if (!(await Bun.password.verify(secret, keyData.privateKey))) {
+ set.status = 400;
+ return { success: false, message: "Invalid secret" };
+ }
+
+ return await capInstance.validateToken(response, {
+ keepToken: false,
+ });
+ });
+
+const assetsServer = new Elysia({ prefix: "/assets" })
+ .use(
+ cors({
+ origin: process.env.CORS_ORIGIN || true,
+ methods: ["GET"],
+ })
+ )
+ .onBeforeHandle(({ set }) => {
+ set.headers["Cache-Control"] = "max-age=31536000, immutable";
+ })
+ .get("/widget.js", ({ set }) => {
+ set.headers["Content-Type"] = "text/javascript";
+ return file(path.join(dataDir, "assets-widget.js"));
+ })
+ .get("/floating.js", ({ set }) => {
+ set.headers["Content-Type"] = "text/javascript";
+ return file(path.join(dataDir, "assets-floating.js"));
+ })
+ .get("/cap_wasm_bg.wasm", ({ set }) => {
+ set.headers["Content-Type"] = "application/wasm";
+ return file(path.join(dataDir, "assets-cap_wasm_bg.wasm"));
+ })
+ .get("/cap_wasm.js", ({ set }) => {
+ set.headers["Content-Type"] = "text/javascript";
+ return file(path.join(dataDir, "assets-cap_wasm.js"));
+ });
+
+new Elysia()
+ .use(staticPlugin())
+ .use(auth)
+ .use(internal)
+ .use(api)
+ .use(assetsServer)
+ .get("/", async ({ cookie }) => {
+ const authCookie = cookie["cap-admin-key"]?.value;
+ const isAuthed =
+ authCookie && (await Bun.password.verify(ADMIN_KEY, authCookie));
+
+ return file(isAuthed ? "./public/index.html" : "./public/lock.html");
+ })
+ .listen(3000);
+
+console.log(`Cap standalone running on http://localhost:3000`);
+init();
diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs
index 2b200e5..79ad0fc 100644
--- a/docs/.vitepress/config.mjs
+++ b/docs/.vitepress/config.mjs
@@ -152,15 +152,6 @@ export default withMermaid({
{ text: "Quickstart", link: "/guide/index.md" },
{ text: "Feature comparison", link: "/guide/alternatives.md" },
{ text: "Community libraries", link: "/guide/community.md" },
- {
- text: "Modes",
- collapsed: false,
- items: [
- { text: "Standalone mode", link: "/guide/standalone.md" },
- { text: "Floating mode", link: "/guide/floating.md" },
- { text: "Invisible mode", link: "/guide/invisible.md" },
- ],
- },
{
text: "Libraries",
collapsed: false,
@@ -171,6 +162,25 @@ export default withMermaid({
{ text: "CLI", link: "/guide/cli.md" },
],
},
+ {
+ text: "Standalone",
+ collapsed: true,
+ items: [
+ { text: "About", link: "/guide/standalone/index.md" },
+ { text: "Installation", link: "/guide/standalone/installation.md" },
+ { text: "Usage", link: "/guide/standalone/usage.md" },
+ { text: "API", link: "/guide/standalone/api.md" },
+ { text: "Options", link: "/guide/standalone/options.md" },
+ ],
+ },
+ {
+ text: "Modes",
+ collapsed: true,
+ items: [
+ { text: "Floating mode", link: "/guide/floating.md" },
+ { text: "Invisible mode", link: "/guide/invisible.md" },
+ ],
+ },
{
text: "Checkpoint",
collapsed: true,
diff --git a/docs/guide/index.md b/docs/guide/index.md
index 8071d4e..d7feb9a 100644
--- a/docs/guide/index.md
+++ b/docs/guide/index.md
@@ -23,6 +23,8 @@ Cap consists mainly of the **widget** (can be used invisibly) and **server** (yo
This guide details how to use the usual setup. You can find guides on using the [Standalone server](./standalone.md), [M2M solver](./solver.md), and [checkpoint middleware](./middleware/index.md) in their respective sections.
+We highly recommend checking out the [Standalone mode](./standalone/index.md) as it's complete, fast, simple to set up, and works with any language that can make HTTP requests. It also includes a dashboard, API key support, and more.
+
## Client-side
Start by adding importing the Cap widget library from a CDN:
@@ -243,9 +245,11 @@ app.listen(3000, () => {
:::
-::: warning
-These example codes don't have ratelimiting for simplicity. Make sure to add proper ratelimiting to your endpoints to prevent abuse.
-:::
+Note that these are the simplest examples possible. You should adapt them to your needs. Usually, you'll want to:
+
+- Use an actual database such as SQLite or Redis for storing tokens and challenges. This is done for you in the [Standalone server](./standalone/index.md)
+
+- Add some kind of actual ratelimiting. This is also done for you in the [Standalone server](./standalone/index.md)
### Token validation
diff --git a/docs/guide/middleware/demo.png b/docs/guide/middleware/demo.png
deleted file mode 100644
index 531a40b97b4cb3daad7235890a79027a2133c2b3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 499441
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