ribaunt 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +287 -0
- package/dist/cjs/index.cjs +175 -0
- package/dist/cjs/index.d.cts +31 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/solver.d.ts +16 -0
- package/dist/cjs/solver.d.ts.map +1 -0
- package/dist/cjs/solver.js +83 -0
- package/dist/cjs/solver.js.map +1 -0
- package/dist/cjs/widget-browser.d.ts +7 -0
- package/dist/cjs/widget-browser.d.ts.map +1 -0
- package/dist/cjs/widget-browser.js +12 -0
- package/dist/cjs/widget-browser.js.map +1 -0
- package/dist/cjs/widget.d.ts +64 -0
- package/dist/cjs/widget.d.ts.map +1 -0
- package/dist/cjs/widget.js +402 -0
- package/dist/cjs/widget.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/solver.d.ts +16 -0
- package/dist/solver.d.ts.map +1 -0
- package/dist/solver.js +79 -0
- package/dist/solver.js.map +1 -0
- package/dist/widget-browser.d.ts +7 -0
- package/dist/widget-browser.d.ts.map +1 -0
- package/dist/widget-browser.js +8 -0
- package/dist/widget-browser.js.map +1 -0
- package/dist/widget.d.ts +64 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +398 -0
- package/dist/widget.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/solver.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible challenge solver using Web Crypto API
|
|
3
|
+
*/
|
|
4
|
+
export interface ChallengeSolution {
|
|
5
|
+
nonce: string;
|
|
6
|
+
hash: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Solve a single challenge token (browser-compatible)
|
|
10
|
+
*/
|
|
11
|
+
export declare function solveSingleChallenge(token: string): Promise<ChallengeSolution | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Solve multiple challenge tokens (browser-compatible)
|
|
14
|
+
*/
|
|
15
|
+
export declare function solveChallenge(tokens: string[], onProgress?: (progress: number) => void): Promise<ChallengeSolution[]>;
|
|
16
|
+
//# sourceMappingURL=solver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAkCD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CA0BhG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GACtC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwB9B"}
|
package/dist/solver.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible challenge solver using Web Crypto API
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Decode JWT token (browser-compatible, without verification)
|
|
6
|
+
*/
|
|
7
|
+
function decodeJWT(token) {
|
|
8
|
+
try {
|
|
9
|
+
const parts = token.split('.');
|
|
10
|
+
if (parts.length !== 3 || !parts[1])
|
|
11
|
+
return null;
|
|
12
|
+
const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));
|
|
13
|
+
return payload;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* SHA-256 hash using Web Crypto API
|
|
21
|
+
*/
|
|
22
|
+
async function sha256(message) {
|
|
23
|
+
const msgBuffer = new TextEncoder().encode(message);
|
|
24
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
|
|
25
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
26
|
+
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
27
|
+
return hashHex;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Solve a single challenge token (browser-compatible)
|
|
31
|
+
*/
|
|
32
|
+
export async function solveSingleChallenge(token) {
|
|
33
|
+
try {
|
|
34
|
+
const payload = decodeJWT(token);
|
|
35
|
+
if (!payload)
|
|
36
|
+
return undefined;
|
|
37
|
+
const { challenge, difficulty } = payload;
|
|
38
|
+
const prefix = '0'.repeat(difficulty);
|
|
39
|
+
let nonce = 0;
|
|
40
|
+
while (true) {
|
|
41
|
+
const hash = await sha256(`${challenge}${nonce}`);
|
|
42
|
+
if (hash.startsWith(prefix)) {
|
|
43
|
+
return { nonce: String(nonce), hash };
|
|
44
|
+
}
|
|
45
|
+
nonce++;
|
|
46
|
+
// Yield to prevent blocking the UI (every 1000 iterations)
|
|
47
|
+
if (nonce % 1000 === 0) {
|
|
48
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Solve multiple challenge tokens (browser-compatible)
|
|
58
|
+
*/
|
|
59
|
+
export async function solveChallenge(tokens, onProgress) {
|
|
60
|
+
const solutions = [];
|
|
61
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
62
|
+
const token = tokens[i];
|
|
63
|
+
if (!token) {
|
|
64
|
+
throw new Error(`Invalid token at index ${i}`);
|
|
65
|
+
}
|
|
66
|
+
const solution = await solveSingleChallenge(token);
|
|
67
|
+
if (!solution) {
|
|
68
|
+
throw new Error(`Failed to solve challenge ${i + 1}`);
|
|
69
|
+
}
|
|
70
|
+
solutions.push(solution);
|
|
71
|
+
// Report progress
|
|
72
|
+
if (onProgress) {
|
|
73
|
+
const progress = Math.round(((i + 1) / tokens.length) * 100);
|
|
74
|
+
onProgress(progress);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return solutions;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=solver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-browser.d.ts","sourceRoot":"","sources":["../src/widget-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-only entry point for the Ribaunt Widget
|
|
3
|
+
* This file only exports the web component, not the server-side functions
|
|
4
|
+
*/
|
|
5
|
+
export { RibauntWidget } from './widget.js';
|
|
6
|
+
// Auto-register the widget when imported
|
|
7
|
+
import './widget.js';
|
|
8
|
+
//# sourceMappingURL=widget-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-browser.js","sourceRoot":"","sources":["../src/widget-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,yCAAyC;AACzC,OAAO,aAAa,CAAC"}
|
package/dist/widget.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ribaunt CAPTCHA Widget - Web Component
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```html
|
|
6
|
+
* <ribaunt-widget
|
|
7
|
+
* challenge-endpoint="/api/challenge"
|
|
8
|
+
* verify-endpoint="/api/verify"
|
|
9
|
+
* show-warning="true"
|
|
10
|
+
* warning-message="Custom warning message"
|
|
11
|
+
* ></ribaunt-widget>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Or in React/Vue/Svelte:
|
|
15
|
+
* ```jsx
|
|
16
|
+
* <ribaunt-widget
|
|
17
|
+
* challengeEndpoint="/api/challenge"
|
|
18
|
+
* verifyEndpoint="/api/verify"
|
|
19
|
+
* />
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Events:
|
|
23
|
+
* - verify: Fired when verification is complete
|
|
24
|
+
* - error: Fired when an error occurs
|
|
25
|
+
* - state-change: Fired when widget state changes
|
|
26
|
+
*/
|
|
27
|
+
type WidgetState = 'initial' | 'verifying' | 'done' | 'error';
|
|
28
|
+
export declare class RibauntWidget extends HTMLElement {
|
|
29
|
+
private shadow;
|
|
30
|
+
private state;
|
|
31
|
+
private progress;
|
|
32
|
+
private captchaElement;
|
|
33
|
+
private checkboxElement;
|
|
34
|
+
private messageElement;
|
|
35
|
+
private warningElement;
|
|
36
|
+
static get observedAttributes(): string[];
|
|
37
|
+
constructor();
|
|
38
|
+
connectedCallback(): void;
|
|
39
|
+
disconnectedCallback(): void;
|
|
40
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
41
|
+
private render;
|
|
42
|
+
private attachEventListeners;
|
|
43
|
+
private removeEventListeners;
|
|
44
|
+
private handleClick;
|
|
45
|
+
private handleKeyPress;
|
|
46
|
+
private getMessage;
|
|
47
|
+
private setState;
|
|
48
|
+
private setProgress;
|
|
49
|
+
private verify;
|
|
50
|
+
/**
|
|
51
|
+
* Public API: Reset the widget to initial state
|
|
52
|
+
*/
|
|
53
|
+
reset(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Public API: Get current state
|
|
56
|
+
*/
|
|
57
|
+
getState(): WidgetState;
|
|
58
|
+
/**
|
|
59
|
+
* Public API: Programmatically trigger verification
|
|
60
|
+
*/
|
|
61
|
+
startVerification(): void;
|
|
62
|
+
}
|
|
63
|
+
export default RibauntWidget;
|
|
64
|
+
//# sourceMappingURL=widget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AA+KH,KAAK,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,cAAc,CAA+B;IAErD,MAAM,KAAK,kBAAkB,aAQ5B;;IASD,iBAAiB;IAKjB,oBAAoB;IAIpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,OAAO,CAAC,MAAM;IA+Bd,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,WAAW;YAYL,MAAM;IAgEpB;;OAEG;IACH,KAAK;IAKL;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,iBAAiB;CAKlB;AAQD,eAAe,aAAa,CAAC"}
|
package/dist/widget.js
ADDED
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ribaunt CAPTCHA Widget - Web Component
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```html
|
|
6
|
+
* <ribaunt-widget
|
|
7
|
+
* challenge-endpoint="/api/challenge"
|
|
8
|
+
* verify-endpoint="/api/verify"
|
|
9
|
+
* show-warning="true"
|
|
10
|
+
* warning-message="Custom warning message"
|
|
11
|
+
* ></ribaunt-widget>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Or in React/Vue/Svelte:
|
|
15
|
+
* ```jsx
|
|
16
|
+
* <ribaunt-widget
|
|
17
|
+
* challengeEndpoint="/api/challenge"
|
|
18
|
+
* verifyEndpoint="/api/verify"
|
|
19
|
+
* />
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Events:
|
|
23
|
+
* - verify: Fired when verification is complete
|
|
24
|
+
* - error: Fired when an error occurs
|
|
25
|
+
* - state-change: Fired when widget state changes
|
|
26
|
+
*/
|
|
27
|
+
import { solveChallenge } from './solver.js';
|
|
28
|
+
const WIDGET_STYLES = `
|
|
29
|
+
/* Widget Container Styles */
|
|
30
|
+
:host,
|
|
31
|
+
:host * {
|
|
32
|
+
box-sizing: border-box;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.captcha {
|
|
36
|
+
background-color: var(--ribaunt-background, #fdfdfd);
|
|
37
|
+
border: 1px solid var(--ribaunt-border-color, #dddddd8f);
|
|
38
|
+
border-radius: var(--ribaunt-border-radius, 14px);
|
|
39
|
+
user-select: none;
|
|
40
|
+
height: var(--ribaunt-widget-height, 58px);
|
|
41
|
+
width: var(--ribaunt-widget-width, 230px);
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
padding: var(--ribaunt-widget-padding, 14px);
|
|
45
|
+
gap: var(--ribaunt-gap, 15px);
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
transition: filter .2s, transform .2s;
|
|
48
|
+
position: relative;
|
|
49
|
+
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
color: var(--ribaunt-color, #212121);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.captcha:hover {
|
|
55
|
+
filter: brightness(98%);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Checkbox Styles */
|
|
59
|
+
.checkbox {
|
|
60
|
+
width: var(--ribaunt-checkbox-size, 25px);
|
|
61
|
+
height: var(--ribaunt-checkbox-size, 25px);
|
|
62
|
+
border: var(--ribaunt-checkbox-border, 1px solid #aaaaaad1);
|
|
63
|
+
border-radius: var(--ribaunt-checkbox-border-radius, 6px);
|
|
64
|
+
background-color: var(--ribaunt-checkbox-background, #fafafa91);
|
|
65
|
+
transition: opacity .2s;
|
|
66
|
+
margin-top: var(--ribaunt-checkbox-margin, 2px);
|
|
67
|
+
margin-bottom: var(--ribaunt-checkbox-margin, 2px);
|
|
68
|
+
flex-shrink: 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Font Family */
|
|
72
|
+
.captcha * {
|
|
73
|
+
font-family: var(--ribaunt-font, system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* Label Text */
|
|
77
|
+
.captcha p {
|
|
78
|
+
margin: 0;
|
|
79
|
+
font-weight: 500;
|
|
80
|
+
font-size: 15px;
|
|
81
|
+
user-select: none;
|
|
82
|
+
transition: opacity .2s;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Verifying State */
|
|
86
|
+
.captcha[data-state=verifying] .checkbox {
|
|
87
|
+
background: none;
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
justify-content: center;
|
|
91
|
+
transform: scale(1.1);
|
|
92
|
+
border: none;
|
|
93
|
+
border-radius: 50%;
|
|
94
|
+
background: conic-gradient(
|
|
95
|
+
var(--ribaunt-spinner-color, #000) 0%,
|
|
96
|
+
var(--ribaunt-spinner-color, #000) var(--progress, 0%),
|
|
97
|
+
var(--ribaunt-spinner-background-color, #eee) var(--progress, 0%),
|
|
98
|
+
var(--ribaunt-spinner-background-color, #eee) 100%
|
|
99
|
+
);
|
|
100
|
+
position: relative;
|
|
101
|
+
transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.captcha[data-state=verifying] .checkbox::after {
|
|
105
|
+
content: "";
|
|
106
|
+
background-color: var(--ribaunt-background, #fdfdfd);
|
|
107
|
+
width: calc(100% - var(--ribaunt-spinner-thickness, 5px));
|
|
108
|
+
height: calc(100% - var(--ribaunt-spinner-thickness, 5px));
|
|
109
|
+
border-radius: 50%;
|
|
110
|
+
margin: calc(var(--ribaunt-spinner-thickness, 5px) / 2);
|
|
111
|
+
transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Done/Success State */
|
|
115
|
+
.captcha[data-state=done] .checkbox {
|
|
116
|
+
border: 1px solid transparent;
|
|
117
|
+
background-image: var(--ribaunt-checkmark, url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cstyle%3E%40keyframes%20anim%7B0%25%7Bstroke-dashoffset%3A23.21320343017578px%7Dto%7Bstroke-dashoffset%3A0%7D%7D%3C%2Fstyle%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%2300a67d%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22m5%2012%205%205L20%207%22%20style%3D%22stroke-dashoffset%3A0%3Bstroke-dasharray%3A23.21320343017578px%3Banimation%3Aanim%20.5s%20ease%22%2F%3E%3C%2Fsvg%3E"));
|
|
118
|
+
background-size: cover;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Error State */
|
|
122
|
+
.captcha[data-state=error] .checkbox {
|
|
123
|
+
border: 1px solid transparent;
|
|
124
|
+
background-image: var(--ribaunt-error-cross, url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='96' height='96' viewBox='0 0 24 24'%3E%3Cpath fill='%23f55b50' d='M11 15h2v2h-2zm0-8h2v6h-2zm1-5C6.47 2 2 6.5 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18a8 8 0 0 1-8-8a8 8 0 0 1 8-8a8 8 0 0 1 8 8a8 8 0 0 1-8 8'/%3E%3C/svg%3E"));
|
|
125
|
+
background-size: cover;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Disabled State */
|
|
129
|
+
.captcha[disabled] {
|
|
130
|
+
cursor: not-allowed;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.captcha[disabled][data-state=verifying] {
|
|
134
|
+
cursor: progress;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.captcha[disabled][data-state=done] {
|
|
138
|
+
cursor: default;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Logo */
|
|
142
|
+
.logo {
|
|
143
|
+
position: absolute;
|
|
144
|
+
bottom: 8px;
|
|
145
|
+
right: 8px;
|
|
146
|
+
width: 20px;
|
|
147
|
+
height: auto;
|
|
148
|
+
opacity: 0.6;
|
|
149
|
+
transition: opacity 0.2s, color 0.2s;
|
|
150
|
+
color: var(--ribaunt-logo-color, #666);
|
|
151
|
+
pointer-events: auto;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.logo svg {
|
|
155
|
+
width: 100%;
|
|
156
|
+
height: auto;
|
|
157
|
+
display: block;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Logo color adapts to theme */
|
|
161
|
+
@media (prefers-color-scheme: dark) {
|
|
162
|
+
.logo {
|
|
163
|
+
color: var(--ribaunt-logo-color, #999);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* Warning Message */
|
|
168
|
+
.warning {
|
|
169
|
+
width: var(--ribaunt-widget-width, 230px);
|
|
170
|
+
background: rgb(237, 56, 46);
|
|
171
|
+
color: white;
|
|
172
|
+
padding: 4px 6px;
|
|
173
|
+
padding-bottom: calc(var(--ribaunt-border-radius, 14px) + 5px);
|
|
174
|
+
font-size: 10px;
|
|
175
|
+
box-sizing: border-box;
|
|
176
|
+
font-family: system-ui;
|
|
177
|
+
border-top-left-radius: 8px;
|
|
178
|
+
border-top-right-radius: 8px;
|
|
179
|
+
text-align: center;
|
|
180
|
+
user-select: none;
|
|
181
|
+
margin-bottom: -35.5px;
|
|
182
|
+
opacity: 0;
|
|
183
|
+
transition: margin-bottom .3s, opacity .3s;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.warning.visible {
|
|
187
|
+
margin-bottom: calc(-1 * var(--ribaunt-border-radius, 14px));
|
|
188
|
+
opacity: 1;
|
|
189
|
+
}
|
|
190
|
+
`;
|
|
191
|
+
const RIBAUNT_LOGO = `
|
|
192
|
+
<svg width="500" height="384" viewBox="0 0 500 384" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
193
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M368.357 122.188H236.618L187.59 0H450.972L500 122.188L434.14 286.295H302.478L368.357 122.188Z" fill="currentColor"/>
|
|
194
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M236.619 122.188L341.575 383.702H209.913L170.796 286.199L131.663 383.702H0L104.957 122.188H236.619Z" fill="currentColor"/>
|
|
195
|
+
</svg>
|
|
196
|
+
`;
|
|
197
|
+
export class RibauntWidget extends HTMLElement {
|
|
198
|
+
static get observedAttributes() {
|
|
199
|
+
return [
|
|
200
|
+
'challenge-endpoint',
|
|
201
|
+
'verify-endpoint',
|
|
202
|
+
'show-warning',
|
|
203
|
+
'warning-message',
|
|
204
|
+
'disabled',
|
|
205
|
+
];
|
|
206
|
+
}
|
|
207
|
+
constructor() {
|
|
208
|
+
super();
|
|
209
|
+
this.state = 'initial';
|
|
210
|
+
this.progress = 0;
|
|
211
|
+
this.captchaElement = null;
|
|
212
|
+
this.checkboxElement = null;
|
|
213
|
+
this.messageElement = null;
|
|
214
|
+
this.warningElement = null;
|
|
215
|
+
this.shadow = this.attachShadow({ mode: 'open' });
|
|
216
|
+
this.handleClick = this.handleClick.bind(this);
|
|
217
|
+
this.handleKeyPress = this.handleKeyPress.bind(this);
|
|
218
|
+
}
|
|
219
|
+
connectedCallback() {
|
|
220
|
+
this.render();
|
|
221
|
+
this.attachEventListeners();
|
|
222
|
+
}
|
|
223
|
+
disconnectedCallback() {
|
|
224
|
+
this.removeEventListeners();
|
|
225
|
+
}
|
|
226
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
227
|
+
if (oldValue !== newValue) {
|
|
228
|
+
this.render();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
render() {
|
|
232
|
+
const showWarning = this.hasAttribute('show-warning') && this.getAttribute('show-warning') !== 'false';
|
|
233
|
+
const warningMessage = this.getAttribute('warning-message') || 'Enable WASM for significantly faster solving';
|
|
234
|
+
this.shadow.innerHTML = `
|
|
235
|
+
<style>${WIDGET_STYLES}</style>
|
|
236
|
+
<div>
|
|
237
|
+
${showWarning ? `<div class="warning ${showWarning ? 'visible' : ''}">${warningMessage}</div>` : ''}
|
|
238
|
+
<div class="captcha" data-state="${this.state}" role="button" tabindex="0" aria-label="${this.getMessage()}">
|
|
239
|
+
<div class="checkbox"></div>
|
|
240
|
+
<p>${this.getMessage()}</p>
|
|
241
|
+
<a class="logo" href="https://ribaunt.com" target="_blank" rel="noopener noreferrer" aria-label="Powered by Ribaunt">
|
|
242
|
+
${RIBAUNT_LOGO}
|
|
243
|
+
</a>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
`;
|
|
247
|
+
this.captchaElement = this.shadow.querySelector('.captcha');
|
|
248
|
+
this.checkboxElement = this.shadow.querySelector('.checkbox');
|
|
249
|
+
this.messageElement = this.shadow.querySelector('p');
|
|
250
|
+
this.warningElement = this.shadow.querySelector('.warning');
|
|
251
|
+
// Update progress CSS variable if verifying
|
|
252
|
+
if (this.state === 'verifying' && this.captchaElement) {
|
|
253
|
+
this.captchaElement.style.setProperty('--progress', `${this.progress}%`);
|
|
254
|
+
}
|
|
255
|
+
this.attachEventListeners();
|
|
256
|
+
}
|
|
257
|
+
attachEventListeners() {
|
|
258
|
+
if (this.captchaElement) {
|
|
259
|
+
this.captchaElement.addEventListener('click', this.handleClick);
|
|
260
|
+
this.captchaElement.addEventListener('keypress', this.handleKeyPress);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
removeEventListeners() {
|
|
264
|
+
if (this.captchaElement) {
|
|
265
|
+
this.captchaElement.removeEventListener('click', this.handleClick);
|
|
266
|
+
this.captchaElement.removeEventListener('keypress', this.handleKeyPress);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
handleClick() {
|
|
270
|
+
if (this.state !== 'initial' && this.state !== 'error')
|
|
271
|
+
return;
|
|
272
|
+
this.verify();
|
|
273
|
+
}
|
|
274
|
+
handleKeyPress(e) {
|
|
275
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
276
|
+
e.preventDefault();
|
|
277
|
+
this.handleClick();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
getMessage() {
|
|
281
|
+
switch (this.state) {
|
|
282
|
+
case 'initial':
|
|
283
|
+
return "I'm a human";
|
|
284
|
+
case 'verifying':
|
|
285
|
+
return `Verifying... ${this.progress}%`;
|
|
286
|
+
case 'done':
|
|
287
|
+
return "You're a human";
|
|
288
|
+
case 'error':
|
|
289
|
+
return 'Error. Try again.';
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
setState(newState) {
|
|
293
|
+
this.state = newState;
|
|
294
|
+
if (this.captchaElement) {
|
|
295
|
+
this.captchaElement.setAttribute('data-state', this.state);
|
|
296
|
+
this.captchaElement.setAttribute('aria-label', this.getMessage());
|
|
297
|
+
}
|
|
298
|
+
if (this.messageElement) {
|
|
299
|
+
this.messageElement.textContent = this.getMessage();
|
|
300
|
+
}
|
|
301
|
+
// Dispatch state change event
|
|
302
|
+
this.dispatchEvent(new CustomEvent('state-change', {
|
|
303
|
+
detail: { state: this.state },
|
|
304
|
+
bubbles: true,
|
|
305
|
+
composed: true,
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
setProgress(value) {
|
|
309
|
+
// Smooth the progress value for better animation
|
|
310
|
+
const smoothedProgress = Math.round(value * 10) / 10;
|
|
311
|
+
this.progress = smoothedProgress;
|
|
312
|
+
if (this.messageElement) {
|
|
313
|
+
this.messageElement.textContent = this.getMessage();
|
|
314
|
+
}
|
|
315
|
+
if (this.captchaElement) {
|
|
316
|
+
this.captchaElement.style.setProperty('--progress', `${smoothedProgress}%`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async verify() {
|
|
320
|
+
this.setState('verifying');
|
|
321
|
+
this.setProgress(0);
|
|
322
|
+
try {
|
|
323
|
+
const challengeEndpoint = this.getAttribute('challenge-endpoint');
|
|
324
|
+
const verifyEndpoint = this.getAttribute('verify-endpoint');
|
|
325
|
+
// Get challenge tokens
|
|
326
|
+
let tokens = [];
|
|
327
|
+
if (challengeEndpoint) {
|
|
328
|
+
const response = await fetch(challengeEndpoint);
|
|
329
|
+
if (!response.ok)
|
|
330
|
+
throw new Error('Failed to fetch challenge');
|
|
331
|
+
const data = await response.json();
|
|
332
|
+
tokens = data.challenges || data.tokens || data;
|
|
333
|
+
}
|
|
334
|
+
if (!tokens || !Array.isArray(tokens) || tokens.length === 0) {
|
|
335
|
+
throw new Error('No challenge tokens available');
|
|
336
|
+
}
|
|
337
|
+
// Solve challenges using the browser-compatible solver
|
|
338
|
+
const solutions = await solveChallenge(tokens, (progress) => {
|
|
339
|
+
this.setProgress(progress);
|
|
340
|
+
});
|
|
341
|
+
// Verify solution
|
|
342
|
+
if (verifyEndpoint) {
|
|
343
|
+
const response = await fetch(verifyEndpoint, {
|
|
344
|
+
method: 'POST',
|
|
345
|
+
headers: { 'Content-Type': 'application/json' },
|
|
346
|
+
body: JSON.stringify({ tokens, solutions }),
|
|
347
|
+
});
|
|
348
|
+
if (!response.ok) {
|
|
349
|
+
throw new Error('Verification failed');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
this.setState('done');
|
|
353
|
+
// Dispatch verify event
|
|
354
|
+
this.dispatchEvent(new CustomEvent('verify', {
|
|
355
|
+
detail: { solutions },
|
|
356
|
+
bubbles: true,
|
|
357
|
+
composed: true,
|
|
358
|
+
}));
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
this.setState('error');
|
|
362
|
+
// Dispatch error event
|
|
363
|
+
this.dispatchEvent(new CustomEvent('error', {
|
|
364
|
+
detail: { error: error instanceof Error ? error.message : String(error) },
|
|
365
|
+
bubbles: true,
|
|
366
|
+
composed: true,
|
|
367
|
+
}));
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Public API: Reset the widget to initial state
|
|
372
|
+
*/
|
|
373
|
+
reset() {
|
|
374
|
+
this.setState('initial');
|
|
375
|
+
this.setProgress(0);
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Public API: Get current state
|
|
379
|
+
*/
|
|
380
|
+
getState() {
|
|
381
|
+
return this.state;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Public API: Programmatically trigger verification
|
|
385
|
+
*/
|
|
386
|
+
startVerification() {
|
|
387
|
+
if (this.state === 'initial' || this.state === 'error') {
|
|
388
|
+
this.verify();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Register the custom element
|
|
393
|
+
if (typeof window !== 'undefined' && !customElements.get('ribaunt-widget')) {
|
|
394
|
+
customElements.define('ribaunt-widget', RibauntWidget);
|
|
395
|
+
}
|
|
396
|
+
// Export for use in TypeScript
|
|
397
|
+
export default RibauntWidget;
|
|
398
|
+
//# sourceMappingURL=widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ribaunt",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "A PoW CAPTCHA library that provides stateless and secure user verification",
|
|
5
|
+
"homepage": "https://ribaunt.com",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/computebaker/ribaunt/issues"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/cjs/index.cjs",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/cjs/index.cjs"
|
|
15
|
+
},
|
|
16
|
+
"./widget": {
|
|
17
|
+
"import": "./dist/widget-browser.js",
|
|
18
|
+
"types": "./dist/widget-browser.d.ts"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/computebaker/ribaunt.git"
|
|
24
|
+
},
|
|
25
|
+
"license": "EUPL-1.2",
|
|
26
|
+
"author": "computebaker",
|
|
27
|
+
"type": "module",
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc && tsc --project tsconfig.cjs.json && mv dist/cjs/index.js dist/cjs/index.cjs && mv dist/cjs/index.d.ts dist/cjs/index.d.cts",
|
|
30
|
+
"test": "jest --config jest.config.cjs"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/jest": "^30.0.0",
|
|
34
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
35
|
+
"@types/node": "^24.6.2",
|
|
36
|
+
"dotenv": "^17.2.3",
|
|
37
|
+
"jest": "^30.2.0",
|
|
38
|
+
"ts-jest": "^29.4.4",
|
|
39
|
+
"typescript": "^5.9.3"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"jsonwebtoken": "^9.0.2"
|
|
43
|
+
}
|
|
44
|
+
}
|