add progress to solver and introduce solver cli

This commit is contained in:
Tiago
2025-04-22 19:19:24 +01:00
parent ecf4758e76
commit 7779209fdc
9 changed files with 172 additions and 3 deletions
+2 -1
View File
@@ -220,6 +220,7 @@
"docs:preview": "cd docs && bun run preview",
"widget:build": "cd widget && bun run build.js",
"widget:publish": "cd widget && cd src && sudo npm publish --access public",
"server:publish": "cd server && sudo npm publish --access public"
"server:publish": "cd server && sudo npm publish --access public",
"cli:publish": "cd solver-cli && sudo npm publish --access public"
}
}
+34
View File
@@ -0,0 +1,34 @@
# dependencies (bun install)
node_modules
# output
out
dist
*.tgz
# code coverage
coverage
*.lcov
# logs
logs
_.log
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# caches
.eslintcache
.cache
*.tsbuildinfo
# IntelliJ based IDEs
.idea
# Finder (MacOS) folder config
.DS_Store
+15
View File
@@ -0,0 +1,15 @@
# solver-cli
To install dependencies:
```bash
bun install
```
To run:
```bash
bun run index.js
```
This project was created using `bun init` in bun v1.2.10. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
+30
View File
@@ -0,0 +1,30 @@
{
"lockfileVersion": 1,
"workspaces": {
"": {
"name": "solver-cli",
"dependencies": {
"@cap.js/solver": "^0.0.3",
},
"devDependencies": {
"@types/bun": "latest",
},
"peerDependencies": {
"typescript": "^5",
},
},
},
"packages": {
"@cap.js/solver": ["@cap.js/solver@0.0.3", "", {}, "sha512-J/Vso8LllJGBmVuj68mXalSsOg8a+Ry0/lnOYu63srk37UFlbQVWdcm63hARnEdOduR33DWS0Ot/yGHPliJhqw=="],
"@types/bun": ["@types/bun@1.2.10", "", { "dependencies": { "bun-types": "1.2.10" } }, "sha512-eilv6WFM3M0c9ztJt7/g80BDusK98z/FrFwseZgT4bXCq2vPhXD4z8R3oddmAn+R/Nmz9vBn4kweJKmGTZj+lg=="],
"@types/node": ["@types/node@22.14.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw=="],
"bun-types": ["bun-types@1.2.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-b5ITZMnVdf3m1gMvJHG+gIfeJHiQPJak0f7925Hxu6ZN5VKA8AGy4GZ4lM+Xkn6jtWxg5S3ldWvfmXdvnkp3GQ=="],
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
}
}
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env bun
import solver from "@cap.js/solver";
import kleur from "kleur";
const args = process.argv.slice(2);
(async () => {
if (args.length === 0) {
console.log(`\n${kleur.cyan("@cap.js/cli")} ${kleur.gray(
"cli solver for cap challenges"
)}
Usage:
${kleur.dim("$")} bunx ${kleur.bold("@cap.js/cli")} <challenges>
Options:
<challenges> The challenges to solve in
format \`salt:target\``);
return;
}
const challenges = args.map((arg) => {
const [salt, target] = arg.split(":");
if (!salt || !target) {
console.error(
`${kleur.red("Error:")} ${kleur.yellow(arg)} is not a valid challenge`
);
process.exit(1);
}
return [salt, target];
});
console.log(`\n${kleur.cyan("@cap.js/cli")} ${kleur.dim(`${challenges.length} challenges`)}\n\n\n`);
const solutions = await solver(challenges, {
onProgress: (status) => {
process.stdout.moveCursor(0, -2);
process.stdout.clearScreenDown();
console.log(
`${status.result.salt}:${status.result.target}:${status.result.nonce}`
);
console.log(kleur.dim("\nSolving challenges… " + status.progress + "%"));
},
});
process.stdout.moveCursor(0, -2);
process.stdout.clearScreenDown();
})();
+18
View File
@@ -0,0 +1,18 @@
{
"name": "@cap.js/cli",
"module": "index.js",
"type": "module",
"private": false,
"devDependencies": {
"@types/bun": "latest"
},
"peerDependencies": {
"typescript": "^5"
},
"dependencies": {
"@cap.js/solver": "^0.0.3"
},
"bin": {
"cli": "./index.js"
}
}
+12 -1
View File
@@ -21,4 +21,15 @@ const CHALLENGES = [
["0c21ade6e63a4e37b13cb8b087f31863", "65c9"],
];
console.log(await solver(CHALLENGES));
const solutions = await solver(CHALLENGES, {
onProgress: (status) => {
process.stdout.moveCursor(0, -1);
process.stdout.clearScreenDown();
console.log(`Progress: ${status.progress}%`);
},
});
process.stdout.moveCursor(0, -1);
process.stdout.clearScreenDown();
console.log("Solutions:", solutions);
+9
View File
@@ -72,6 +72,15 @@ export default function solver(challenges, config) {
challengesProcessed++;
activeWorkers--;
if (config?.onProgress) {
config.onProgress({
progress: Math.floor((challengesProcessed / totalChallenges) * 100),
currentChallenge: currentChallengeIndex,
challengesProcessed,
result,
});
}
if (challengesProcessed === totalChallenges) {
resolve(results);
} else {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@cap.js/solver",
"version": "0.0.2",
"version": "0.0.3",
"description": "Server-side solver for Cap's SHA-256 PoW captchas. Cap is a lightweight, modern open-source CAPTCHA alternative designed using SHA-256 PoW.",
"main": "index.js",
"scripts": {