ribaunt 0.1.6 → 0.2.1

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.
Files changed (58) hide show
  1. package/README.md +39 -6
  2. package/dist/cjs/index.d.ts +52 -24
  3. package/dist/cjs/index.d.ts.map +1 -1
  4. package/dist/cjs/index.js +267 -237
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/redis.d.ts +13 -0
  7. package/dist/cjs/redis.d.ts.map +1 -0
  8. package/dist/cjs/redis.js +53 -0
  9. package/dist/cjs/redis.js.map +1 -0
  10. package/dist/index.d.ts +52 -24
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +264 -236
  13. package/dist/index.js.map +1 -1
  14. package/dist/redis.d.ts +13 -0
  15. package/dist/redis.d.ts.map +1 -0
  16. package/dist/redis.js +49 -0
  17. package/dist/redis.js.map +1 -0
  18. package/dist/solver-worker.d.ts +2 -0
  19. package/dist/solver-worker.d.ts.map +1 -0
  20. package/dist/solver-worker.js +15 -0
  21. package/dist/solver-worker.js.map +1 -0
  22. package/dist/solver.d.ts +11 -0
  23. package/dist/solver.d.ts.map +1 -1
  24. package/dist/solver.js +15 -0
  25. package/dist/solver.js.map +1 -1
  26. package/dist/widget-browser.d.ts +1 -0
  27. package/dist/widget-browser.d.ts.map +1 -1
  28. package/dist/widget-browser.js +1 -0
  29. package/dist/widget-browser.js.map +1 -1
  30. package/dist/widget-react.d.ts +9 -11
  31. package/dist/widget-react.d.ts.map +1 -1
  32. package/dist/widget-react.js +44 -7
  33. package/dist/widget-react.js.map +1 -1
  34. package/dist/widget.d.ts +31 -1
  35. package/dist/widget.d.ts.map +1 -1
  36. package/dist/widget.js +220 -33
  37. package/dist/widget.js.map +1 -1
  38. package/dist/worker-client.d.ts +8 -0
  39. package/dist/worker-client.d.ts.map +1 -0
  40. package/dist/worker-client.js +78 -0
  41. package/dist/worker-client.js.map +1 -0
  42. package/package.json +23 -2
  43. package/dist/cjs/solver.d.ts +0 -16
  44. package/dist/cjs/solver.d.ts.map +0 -1
  45. package/dist/cjs/solver.js +0 -89
  46. package/dist/cjs/solver.js.map +0 -1
  47. package/dist/cjs/widget-browser.d.ts +0 -7
  48. package/dist/cjs/widget-browser.d.ts.map +0 -1
  49. package/dist/cjs/widget-browser.js +0 -12
  50. package/dist/cjs/widget-browser.js.map +0 -1
  51. package/dist/cjs/widget-react.d.ts +0 -40
  52. package/dist/cjs/widget-react.d.ts.map +0 -1
  53. package/dist/cjs/widget-react.js +0 -182
  54. package/dist/cjs/widget-react.js.map +0 -1
  55. package/dist/cjs/widget.d.ts +0 -97
  56. package/dist/cjs/widget.d.ts.map +0 -1
  57. package/dist/cjs/widget.js +0 -519
  58. package/dist/cjs/widget.js.map +0 -1
@@ -1,519 +0,0 @@
1
- "use strict";
2
- /**
3
- * Ribaunt CAPTCHA Widget - Web Component
4
- *
5
- * Usage:
6
- * ```html
7
- * <ribaunt-widget
8
- * challenge-endpoint="/api/challenge"
9
- * verify-endpoint="/api/verify"
10
- * auto-verify="true"
11
- * show-warning="true"
12
- * warning-message="Custom warning message"
13
- * ></ribaunt-widget>
14
- * ```
15
- *
16
- * Or in React/Vue/Svelte:
17
- * ```jsx
18
- * <ribaunt-widget
19
- * challengeEndpoint="/api/challenge"
20
- * verifyEndpoint="/api/verify"
21
- * />
22
- * ```
23
- *
24
- * Events:
25
- * - verify: Fired when verification is complete
26
- * - error: Fired when an error occurs
27
- * - state-change: Fired when widget state changes
28
- */
29
- Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.RibauntWidget = void 0;
31
- const solver_js_1 = require("./solver.js");
32
- const WIDGET_STYLES = `
33
- /* Widget Container Styles */
34
- :host,
35
- :host * {
36
- box-sizing: border-box;
37
- }
38
-
39
- .captcha {
40
- background-color: var(--ribaunt-background, #fdfdfd);
41
- border: 1px solid var(--ribaunt-border-color, #dddddd8f);
42
- border-radius: var(--ribaunt-border-radius, 14px);
43
- user-select: none;
44
- height: var(--ribaunt-widget-height, 58px);
45
- width: var(--ribaunt-widget-width, 230px);
46
- display: flex;
47
- align-items: center;
48
- padding: var(--ribaunt-widget-padding, 14px);
49
- gap: var(--ribaunt-gap, 15px);
50
- cursor: pointer;
51
- transition: filter .2s, transform .2s;
52
- position: relative;
53
- -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
54
- overflow: hidden;
55
- color: var(--ribaunt-color, #212121);
56
- }
57
-
58
- :host([disabled]) .captcha {
59
- cursor: not-allowed;
60
- opacity: 0.72;
61
- }
62
-
63
- :host([disabled]) .captcha:hover {
64
- filter: none;
65
- }
66
-
67
- :host([disabled]) .captcha[data-state=verifying] {
68
- cursor: progress;
69
- }
70
-
71
- :host([disabled]) .captcha[data-state=done] {
72
- cursor: default;
73
- }
74
-
75
- .captcha:hover {
76
- filter: brightness(98%);
77
- }
78
-
79
- /* Checkbox Styles */
80
- .checkbox {
81
- width: var(--ribaunt-checkbox-size, 25px);
82
- height: var(--ribaunt-checkbox-size, 25px);
83
- border: var(--ribaunt-checkbox-border, 1px solid #aaaaaad1);
84
- border-radius: var(--ribaunt-checkbox-border-radius, 6px);
85
- background-color: var(--ribaunt-checkbox-background, #fafafa91);
86
- transition: opacity .2s;
87
- margin-top: var(--ribaunt-checkbox-margin, 2px);
88
- margin-bottom: var(--ribaunt-checkbox-margin, 2px);
89
- flex-shrink: 0;
90
- }
91
-
92
- /* Font Family */
93
- .captcha * {
94
- font-family: var(--ribaunt-font, system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif);
95
- }
96
-
97
- /* Label Text */
98
- .captcha p {
99
- margin: 0;
100
- font-weight: 500;
101
- font-size: 15px;
102
- user-select: none;
103
- transition: opacity .2s;
104
- }
105
-
106
- /* Verifying State */
107
- .captcha[data-state=verifying] .checkbox {
108
- background: none;
109
- display: flex;
110
- align-items: center;
111
- justify-content: center;
112
- transform: scale(1.1);
113
- border: none;
114
- border-radius: 50%;
115
- background: conic-gradient(
116
- var(--ribaunt-spinner-color, #000) 0%,
117
- var(--ribaunt-spinner-color, #000) var(--progress, 0%),
118
- var(--ribaunt-spinner-background-color, #eee) var(--progress, 0%),
119
- var(--ribaunt-spinner-background-color, #eee) 100%
120
- );
121
- position: relative;
122
- transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
123
- }
124
-
125
- .captcha[data-state=verifying] .checkbox::after {
126
- content: "";
127
- background-color: var(--ribaunt-background, #fdfdfd);
128
- width: calc(100% - var(--ribaunt-spinner-thickness, 5px));
129
- height: calc(100% - var(--ribaunt-spinner-thickness, 5px));
130
- border-radius: 50%;
131
- margin: calc(var(--ribaunt-spinner-thickness, 5px) / 2);
132
- transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
133
- }
134
-
135
- /* Done/Success State */
136
- .captcha[data-state=done] .checkbox {
137
- border: 1px solid transparent;
138
- 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"));
139
- background-size: cover;
140
- }
141
-
142
- /* Error State */
143
- .captcha[data-state=error] .checkbox {
144
- border: 1px solid transparent;
145
- 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"));
146
- background-size: cover;
147
- }
148
-
149
- /* Logo */
150
- .logo {
151
- position: absolute;
152
- bottom: 8px;
153
- right: 8px;
154
- width: 20px;
155
- height: auto;
156
- opacity: 0.6;
157
- transition: opacity 0.2s, color 0.2s;
158
- color: var(--ribaunt-logo-color, #666);
159
- pointer-events: auto;
160
- }
161
-
162
- .logo svg {
163
- width: 100%;
164
- height: auto;
165
- display: block;
166
- }
167
-
168
- /* Logo color adapts to theme */
169
- @media (prefers-color-scheme: dark) {
170
- .logo {
171
- color: var(--ribaunt-logo-color, #999);
172
- }
173
- }
174
-
175
- /* Warning Message */
176
- .warning {
177
- width: var(--ribaunt-widget-width, 230px);
178
- background: rgb(237, 56, 46);
179
- color: white;
180
- padding: 4px 6px;
181
- padding-bottom: calc(var(--ribaunt-border-radius, 14px) + 5px);
182
- font-size: 10px;
183
- box-sizing: border-box;
184
- font-family: system-ui;
185
- border-top-left-radius: 8px;
186
- border-top-right-radius: 8px;
187
- text-align: center;
188
- user-select: none;
189
- margin-bottom: -35.5px;
190
- opacity: 0;
191
- transition: margin-bottom .3s, opacity .3s;
192
- }
193
-
194
- .warning.visible {
195
- margin-bottom: calc(-1 * var(--ribaunt-border-radius, 14px));
196
- opacity: 1;
197
- }
198
- `;
199
- const RIBAUNT_LOGO = `
200
- <svg width="500" height="384" viewBox="0 0 500 384" fill="none" xmlns="http://www.w3.org/2000/svg">
201
- <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"/>
202
- <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"/>
203
- </svg>
204
- `;
205
- function parseTokenArray(value) {
206
- if (!Array.isArray(value)) {
207
- throw new Error('Challenge response must be an array of token strings');
208
- }
209
- if (value.length === 0) {
210
- throw new Error('No challenge tokens available');
211
- }
212
- if (!value.every((entry) => typeof entry === 'string' && entry.length > 0)) {
213
- throw new Error('Challenge response contains invalid token values');
214
- }
215
- return value;
216
- }
217
- function parseChallengeTokens(payload) {
218
- if (Array.isArray(payload)) {
219
- return parseTokenArray(payload);
220
- }
221
- if (!payload || typeof payload !== 'object') {
222
- throw new Error('Challenge response must be an object or array of token strings');
223
- }
224
- const record = payload;
225
- if ('challenges' in record) {
226
- return parseTokenArray(record.challenges);
227
- }
228
- if ('tokens' in record) {
229
- return parseTokenArray(record.tokens);
230
- }
231
- throw new Error('Challenge response must include "challenges" or "tokens"');
232
- }
233
- class RibauntWidget extends HTMLElement {
234
- static get observedAttributes() {
235
- return [
236
- 'challenge-endpoint',
237
- 'verify-endpoint',
238
- 'auto-verify',
239
- 'show-warning',
240
- 'warning-message',
241
- 'solve-timeout',
242
- 'disabled',
243
- ];
244
- }
245
- constructor() {
246
- super();
247
- this.state = 'initial';
248
- this.progress = 0;
249
- this.timeoutError = false;
250
- this.captchaElement = null;
251
- this.checkboxElement = null;
252
- this.messageElement = null;
253
- this.warningElement = null;
254
- this.logoElement = null;
255
- this.autoVerifyStarted = false;
256
- this.shadow = this.attachShadow({ mode: 'open' });
257
- this.handleClick = this.handleClick.bind(this);
258
- this.handleKeyPress = this.handleKeyPress.bind(this);
259
- this.handleLogoClick = this.handleLogoClick.bind(this);
260
- }
261
- connectedCallback() {
262
- this.render();
263
- this.dispatchStateChange();
264
- this.maybeAutoVerify();
265
- }
266
- disconnectedCallback() {
267
- this.removeEventListeners();
268
- }
269
- attributeChangedCallback(name, oldValue, newValue) {
270
- if (oldValue !== newValue) {
271
- this.render();
272
- if (name === 'auto-verify') {
273
- this.maybeAutoVerify();
274
- }
275
- }
276
- }
277
- render() {
278
- this.removeEventListeners();
279
- const showWarning = this.hasAttribute('show-warning') && this.getAttribute('show-warning') !== 'false';
280
- const warningMessage = this.getAttribute('warning-message') || 'Enable WASM for significantly faster solving';
281
- const disabled = this.isDisabled();
282
- this.shadow.innerHTML = `
283
- <style>${WIDGET_STYLES}</style>
284
- <div>
285
- ${showWarning ? '<div class="warning"></div>' : ''}
286
- <div class="captcha" data-state="${this.state}" role="button" tabindex="${disabled ? '-1' : '0'}" aria-disabled="${disabled}" aria-label="${this.getMessage()}">
287
- <div class="checkbox"></div>
288
- <p>${this.getMessage()}</p>
289
- <a class="logo" href="https://ribaunt.com" target="_blank" rel="noopener noreferrer" aria-label="Powered by Ribaunt">
290
- ${RIBAUNT_LOGO}
291
- </a>
292
- </div>
293
- </div>
294
- `;
295
- this.captchaElement = this.shadow.querySelector('.captcha');
296
- this.checkboxElement = this.shadow.querySelector('.checkbox');
297
- this.messageElement = this.shadow.querySelector('p');
298
- this.warningElement = this.shadow.querySelector('.warning');
299
- this.logoElement = this.shadow.querySelector('.logo');
300
- if (showWarning && this.warningElement) {
301
- this.warningElement.textContent = warningMessage;
302
- setTimeout(() => {
303
- this.warningElement?.classList.add('visible');
304
- }, 0);
305
- }
306
- // Update progress CSS variable if verifying
307
- if (this.state === 'verifying' && this.captchaElement) {
308
- this.captchaElement.style.setProperty('--progress', `${this.progress}%`);
309
- }
310
- this.attachEventListeners();
311
- }
312
- attachEventListeners() {
313
- if (this.captchaElement) {
314
- this.captchaElement.addEventListener('click', this.handleClick);
315
- this.captchaElement.addEventListener('keypress', this.handleKeyPress);
316
- }
317
- if (this.logoElement) {
318
- this.logoElement.addEventListener('click', this.handleLogoClick);
319
- }
320
- }
321
- removeEventListeners() {
322
- if (this.captchaElement) {
323
- this.captchaElement.removeEventListener('click', this.handleClick);
324
- this.captchaElement.removeEventListener('keypress', this.handleKeyPress);
325
- }
326
- if (this.logoElement) {
327
- this.logoElement.removeEventListener('click', this.handleLogoClick);
328
- }
329
- }
330
- handleLogoClick(event) {
331
- event.stopPropagation();
332
- }
333
- handleClick() {
334
- if (this.isDisabled())
335
- return;
336
- if (this.state !== 'initial' && this.state !== 'error')
337
- return;
338
- this.verify();
339
- }
340
- handleKeyPress(e) {
341
- if (e.key === 'Enter' || e.key === ' ') {
342
- e.preventDefault();
343
- this.handleClick();
344
- }
345
- }
346
- getMessage() {
347
- switch (this.state) {
348
- case 'initial':
349
- return "I'm a human";
350
- case 'verifying':
351
- return `Verifying... ${this.progress}%`;
352
- case 'done':
353
- return "You're a human";
354
- case 'error':
355
- return this.timeoutError ? 'Timed out. Try again.' : 'Error. Try again.';
356
- }
357
- }
358
- getSolveTimeoutMs() {
359
- const raw = this.getAttribute('solve-timeout');
360
- if (!raw) {
361
- return undefined;
362
- }
363
- const value = Number(raw);
364
- if (!Number.isFinite(value) || value <= 0) {
365
- return undefined;
366
- }
367
- return Math.floor(value);
368
- }
369
- isDisabled() {
370
- return this.hasAttribute('disabled') && this.getAttribute('disabled') !== 'false';
371
- }
372
- shouldAutoVerify() {
373
- return this.hasAttribute('auto-verify') && this.getAttribute('auto-verify') !== 'false';
374
- }
375
- maybeAutoVerify() {
376
- if (!this.isConnected || this.autoVerifyStarted || !this.shouldAutoVerify()) {
377
- return;
378
- }
379
- this.autoVerifyStarted = true;
380
- queueMicrotask(() => {
381
- this.startVerification();
382
- });
383
- }
384
- setState(newState) {
385
- if (newState !== 'error') {
386
- this.timeoutError = false;
387
- }
388
- this.state = newState;
389
- if (this.captchaElement) {
390
- this.captchaElement.setAttribute('data-state', this.state);
391
- this.captchaElement.setAttribute('aria-label', this.getMessage());
392
- this.captchaElement.tabIndex = this.isDisabled() ? -1 : 0;
393
- this.captchaElement.setAttribute('aria-disabled', String(this.isDisabled()));
394
- }
395
- if (this.messageElement) {
396
- this.messageElement.textContent = this.getMessage();
397
- }
398
- this.dispatchStateChange();
399
- }
400
- dispatchStateChange() {
401
- // Dispatch state change event
402
- this.dispatchEvent(new CustomEvent('state-change', {
403
- detail: { state: this.state },
404
- bubbles: true,
405
- composed: true,
406
- }));
407
- }
408
- setProgress(value) {
409
- // Smooth the progress value for better animation
410
- const smoothedProgress = Math.round(value * 10) / 10;
411
- this.progress = smoothedProgress;
412
- if (this.messageElement) {
413
- this.messageElement.textContent = this.getMessage();
414
- }
415
- if (this.captchaElement) {
416
- this.captchaElement.style.setProperty('--progress', `${smoothedProgress}%`);
417
- }
418
- }
419
- async verify() {
420
- this.setState('verifying');
421
- this.setProgress(0);
422
- const timeoutMs = this.getSolveTimeoutMs();
423
- const controller = timeoutMs ? new AbortController() : undefined;
424
- const timeoutHandle = timeoutMs
425
- ? setTimeout(() => {
426
- controller?.abort();
427
- }, timeoutMs)
428
- : undefined;
429
- try {
430
- const challengeEndpoint = this.getAttribute('challenge-endpoint');
431
- const verifyEndpoint = this.getAttribute('verify-endpoint');
432
- // Get challenge tokens
433
- let tokens = [];
434
- if (challengeEndpoint) {
435
- const response = await fetch(challengeEndpoint);
436
- if (!response.ok)
437
- throw new Error('Failed to fetch challenge');
438
- const data = await response.json();
439
- tokens = parseChallengeTokens(data);
440
- }
441
- if (tokens.length === 0) {
442
- throw new Error('No challenge tokens available');
443
- }
444
- // Solve challenges using the browser-compatible solver
445
- const solutions = await (0, solver_js_1.solveChallenge)(tokens, (progress) => {
446
- this.setProgress(progress);
447
- }, controller?.signal);
448
- // Verify solution
449
- if (verifyEndpoint) {
450
- const response = await fetch(verifyEndpoint, {
451
- method: 'POST',
452
- headers: { 'Content-Type': 'application/json' },
453
- body: JSON.stringify({ tokens, solutions }),
454
- });
455
- if (!response.ok) {
456
- throw new Error('Verification failed');
457
- }
458
- }
459
- this.setState('done');
460
- // Dispatch verify event
461
- this.dispatchEvent(new CustomEvent('verify', {
462
- detail: { solutions },
463
- bubbles: true,
464
- composed: true,
465
- }));
466
- }
467
- catch (error) {
468
- this.timeoutError = error instanceof DOMException && error.name === 'AbortError';
469
- this.setState('error');
470
- // Dispatch error event
471
- this.dispatchEvent(new CustomEvent('error', {
472
- detail: {
473
- error: this.timeoutError
474
- ? 'Timed out. Try again.'
475
- : (error instanceof Error ? error.message : String(error)),
476
- timeout: this.timeoutError,
477
- },
478
- bubbles: true,
479
- composed: true,
480
- }));
481
- }
482
- finally {
483
- if (timeoutHandle !== undefined) {
484
- clearTimeout(timeoutHandle);
485
- }
486
- }
487
- }
488
- /**
489
- * Public API: Reset the widget to initial state
490
- */
491
- reset() {
492
- this.timeoutError = false;
493
- this.setState('initial');
494
- this.setProgress(0);
495
- }
496
- /**
497
- * Public API: Get current state
498
- */
499
- getState() {
500
- return this.state;
501
- }
502
- /**
503
- * Public API: Programmatically trigger verification
504
- */
505
- startVerification() {
506
- if (!this.isDisabled() && (this.state === 'initial' || this.state === 'error')) {
507
- this.verify();
508
- }
509
- }
510
- }
511
- exports.RibauntWidget = RibauntWidget;
512
- // Register the custom element
513
- /* v8 ignore next -- environment guard for SSR/repeated imports */
514
- if (typeof window !== 'undefined' && typeof customElements !== 'undefined' && !customElements.get('ribaunt-widget')) {
515
- customElements.define('ribaunt-widget', RibauntWidget);
516
- }
517
- // Export for use in TypeScript
518
- exports.default = RibauntWidget;
519
- //# sourceMappingURL=widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/widget.ts"],"names":[],"mappings":"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"}