ribaunt 0.1.2 → 0.1.3
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/dist/cjs/index.d.ts +30 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +166 -26
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/solver.d.ts +2 -2
- package/dist/cjs/solver.d.ts.map +1 -1
- package/dist/cjs/solver.js +6 -3
- package/dist/cjs/solver.js.map +1 -1
- package/dist/cjs/widget-react.d.ts +2 -0
- package/dist/cjs/widget-react.d.ts.map +1 -1
- package/dist/cjs/widget-react.js +6 -3
- package/dist/cjs/widget-react.js.map +1 -1
- package/dist/cjs/widget.d.ts +3 -0
- package/dist/cjs/widget.d.ts.map +1 -1
- package/dist/cjs/widget.js +74 -6
- package/dist/cjs/widget.js.map +1 -1
- package/dist/index.d.ts +30 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +164 -26
- package/dist/index.js.map +1 -1
- package/dist/solver.d.ts +2 -2
- package/dist/solver.d.ts.map +1 -1
- package/dist/solver.js +6 -3
- package/dist/solver.js.map +1 -1
- package/dist/widget-react.d.ts +2 -0
- package/dist/widget-react.d.ts.map +1 -1
- package/dist/widget-react.js +6 -3
- package/dist/widget-react.js.map +1 -1
- package/dist/widget.d.ts +3 -0
- package/dist/widget.d.ts.map +1 -1
- package/dist/widget.js +74 -6
- package/dist/widget.js.map +1 -1
- package/package.json +4 -4
package/dist/cjs/widget.js
CHANGED
|
@@ -201,6 +201,34 @@ const RIBAUNT_LOGO = `
|
|
|
201
201
|
<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"/>
|
|
202
202
|
</svg>
|
|
203
203
|
`;
|
|
204
|
+
function parseTokenArray(value) {
|
|
205
|
+
if (!Array.isArray(value)) {
|
|
206
|
+
throw new Error('Challenge response must be an array of token strings');
|
|
207
|
+
}
|
|
208
|
+
if (value.length === 0) {
|
|
209
|
+
throw new Error('No challenge tokens available');
|
|
210
|
+
}
|
|
211
|
+
if (!value.every((entry) => typeof entry === 'string' && entry.length > 0)) {
|
|
212
|
+
throw new Error('Challenge response contains invalid token values');
|
|
213
|
+
}
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
function parseChallengeTokens(payload) {
|
|
217
|
+
if (Array.isArray(payload)) {
|
|
218
|
+
return parseTokenArray(payload);
|
|
219
|
+
}
|
|
220
|
+
if (!payload || typeof payload !== 'object') {
|
|
221
|
+
throw new Error('Challenge response must be an object or array of token strings');
|
|
222
|
+
}
|
|
223
|
+
const record = payload;
|
|
224
|
+
if ('challenges' in record) {
|
|
225
|
+
return parseTokenArray(record.challenges);
|
|
226
|
+
}
|
|
227
|
+
if ('tokens' in record) {
|
|
228
|
+
return parseTokenArray(record.tokens);
|
|
229
|
+
}
|
|
230
|
+
throw new Error('Challenge response must include "challenges" or "tokens"');
|
|
231
|
+
}
|
|
204
232
|
class RibauntWidget extends HTMLElement {
|
|
205
233
|
static get observedAttributes() {
|
|
206
234
|
return [
|
|
@@ -208,6 +236,7 @@ class RibauntWidget extends HTMLElement {
|
|
|
208
236
|
'verify-endpoint',
|
|
209
237
|
'show-warning',
|
|
210
238
|
'warning-message',
|
|
239
|
+
'solve-timeout',
|
|
211
240
|
'disabled',
|
|
212
241
|
];
|
|
213
242
|
}
|
|
@@ -215,6 +244,7 @@ class RibauntWidget extends HTMLElement {
|
|
|
215
244
|
super();
|
|
216
245
|
this.state = 'initial';
|
|
217
246
|
this.progress = 0;
|
|
247
|
+
this.timeoutError = false;
|
|
218
248
|
this.captchaElement = null;
|
|
219
249
|
this.checkboxElement = null;
|
|
220
250
|
this.messageElement = null;
|
|
@@ -245,7 +275,7 @@ class RibauntWidget extends HTMLElement {
|
|
|
245
275
|
this.shadow.innerHTML = `
|
|
246
276
|
<style>${WIDGET_STYLES}</style>
|
|
247
277
|
<div>
|
|
248
|
-
${showWarning ? `<div class="warning
|
|
278
|
+
${showWarning ? `<div class="warning">${warningMessage}</div>` : ''}
|
|
249
279
|
<div class="captcha" data-state="${this.state}" role="button" tabindex="${disabled ? '-1' : '0'}" aria-disabled="${disabled}" aria-label="${this.getMessage()}">
|
|
250
280
|
<div class="checkbox"></div>
|
|
251
281
|
<p>${this.getMessage()}</p>
|
|
@@ -260,6 +290,11 @@ class RibauntWidget extends HTMLElement {
|
|
|
260
290
|
this.messageElement = this.shadow.querySelector('p');
|
|
261
291
|
this.warningElement = this.shadow.querySelector('.warning');
|
|
262
292
|
this.logoElement = this.shadow.querySelector('.logo');
|
|
293
|
+
if (showWarning && this.warningElement) {
|
|
294
|
+
setTimeout(() => {
|
|
295
|
+
this.warningElement?.classList.add('visible');
|
|
296
|
+
}, 0);
|
|
297
|
+
}
|
|
263
298
|
// Update progress CSS variable if verifying
|
|
264
299
|
if (this.state === 'verifying' && this.captchaElement) {
|
|
265
300
|
this.captchaElement.style.setProperty('--progress', `${this.progress}%`);
|
|
@@ -309,13 +344,27 @@ class RibauntWidget extends HTMLElement {
|
|
|
309
344
|
case 'done':
|
|
310
345
|
return "You're a human";
|
|
311
346
|
case 'error':
|
|
312
|
-
return 'Error. Try again.';
|
|
347
|
+
return this.timeoutError ? 'Timed out. Try again.' : 'Error. Try again.';
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
getSolveTimeoutMs() {
|
|
351
|
+
const raw = this.getAttribute('solve-timeout');
|
|
352
|
+
if (!raw) {
|
|
353
|
+
return undefined;
|
|
313
354
|
}
|
|
355
|
+
const value = Number(raw);
|
|
356
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
359
|
+
return Math.floor(value);
|
|
314
360
|
}
|
|
315
361
|
isDisabled() {
|
|
316
362
|
return this.hasAttribute('disabled') && this.getAttribute('disabled') !== 'false';
|
|
317
363
|
}
|
|
318
364
|
setState(newState) {
|
|
365
|
+
if (newState !== 'error') {
|
|
366
|
+
this.timeoutError = false;
|
|
367
|
+
}
|
|
319
368
|
this.state = newState;
|
|
320
369
|
if (this.captchaElement) {
|
|
321
370
|
this.captchaElement.setAttribute('data-state', this.state);
|
|
@@ -350,6 +399,13 @@ class RibauntWidget extends HTMLElement {
|
|
|
350
399
|
async verify() {
|
|
351
400
|
this.setState('verifying');
|
|
352
401
|
this.setProgress(0);
|
|
402
|
+
const timeoutMs = this.getSolveTimeoutMs();
|
|
403
|
+
const controller = timeoutMs ? new AbortController() : undefined;
|
|
404
|
+
const timeoutHandle = timeoutMs
|
|
405
|
+
? setTimeout(() => {
|
|
406
|
+
controller?.abort();
|
|
407
|
+
}, timeoutMs)
|
|
408
|
+
: undefined;
|
|
353
409
|
try {
|
|
354
410
|
const challengeEndpoint = this.getAttribute('challenge-endpoint');
|
|
355
411
|
const verifyEndpoint = this.getAttribute('verify-endpoint');
|
|
@@ -360,15 +416,15 @@ class RibauntWidget extends HTMLElement {
|
|
|
360
416
|
if (!response.ok)
|
|
361
417
|
throw new Error('Failed to fetch challenge');
|
|
362
418
|
const data = await response.json();
|
|
363
|
-
tokens = data
|
|
419
|
+
tokens = parseChallengeTokens(data);
|
|
364
420
|
}
|
|
365
|
-
if (
|
|
421
|
+
if (tokens.length === 0) {
|
|
366
422
|
throw new Error('No challenge tokens available');
|
|
367
423
|
}
|
|
368
424
|
// Solve challenges using the browser-compatible solver
|
|
369
425
|
const solutions = await (0, solver_js_1.solveChallenge)(tokens, (progress) => {
|
|
370
426
|
this.setProgress(progress);
|
|
371
|
-
});
|
|
427
|
+
}, controller?.signal);
|
|
372
428
|
// Verify solution
|
|
373
429
|
if (verifyEndpoint) {
|
|
374
430
|
const response = await fetch(verifyEndpoint, {
|
|
@@ -389,19 +445,31 @@ class RibauntWidget extends HTMLElement {
|
|
|
389
445
|
}));
|
|
390
446
|
}
|
|
391
447
|
catch (error) {
|
|
448
|
+
this.timeoutError = error instanceof DOMException && error.name === 'AbortError';
|
|
392
449
|
this.setState('error');
|
|
393
450
|
// Dispatch error event
|
|
394
451
|
this.dispatchEvent(new CustomEvent('error', {
|
|
395
|
-
detail: {
|
|
452
|
+
detail: {
|
|
453
|
+
error: this.timeoutError
|
|
454
|
+
? 'Timed out. Try again.'
|
|
455
|
+
: (error instanceof Error ? error.message : String(error)),
|
|
456
|
+
timeout: this.timeoutError,
|
|
457
|
+
},
|
|
396
458
|
bubbles: true,
|
|
397
459
|
composed: true,
|
|
398
460
|
}));
|
|
399
461
|
}
|
|
462
|
+
finally {
|
|
463
|
+
if (timeoutHandle !== undefined) {
|
|
464
|
+
clearTimeout(timeoutHandle);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
400
467
|
}
|
|
401
468
|
/**
|
|
402
469
|
* Public API: Reset the widget to initial state
|
|
403
470
|
*/
|
|
404
471
|
reset() {
|
|
472
|
+
this.timeoutError = false;
|
|
405
473
|
this.setState('initial');
|
|
406
474
|
this.setProgress(0);
|
|
407
475
|
}
|
package/dist/cjs/widget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/widget.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAEH,2CAAqE;AAErE,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsKrB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;CAKpB,CAAC;AAIF,MAAa,aAAc,SAAQ,WAAW;
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/widget.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,10 +3,35 @@ export interface ChallengeSolution {
|
|
|
3
3
|
nonce: string;
|
|
4
4
|
hash: string;
|
|
5
5
|
}
|
|
6
|
+
export interface ReplayStore {
|
|
7
|
+
consume(jti: string, expiresAt: number): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
export type ReplayPreventionMode = 'disabled' | 'local' | 'remote';
|
|
10
|
+
export interface VerifySolutionOptions {
|
|
11
|
+
replayPrevention?: ReplayPreventionMode;
|
|
12
|
+
replayStore?: ReplayStore;
|
|
13
|
+
debug?: boolean;
|
|
14
|
+
onWarning?: (warning: VerifyWarning) => void;
|
|
15
|
+
}
|
|
16
|
+
export type VerifyWarningReason = 'invalid-token' | 'expired-token' | 'invalid-solution' | 'replay-detected' | 'configuration-error';
|
|
17
|
+
export interface VerifyWarning {
|
|
18
|
+
reason: VerifyWarningReason;
|
|
19
|
+
message: string;
|
|
20
|
+
error?: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface SolveChallengeOptions {
|
|
23
|
+
maxIterations?: number;
|
|
24
|
+
maxDurationMs?: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class LocalReplayStore implements ReplayStore {
|
|
27
|
+
private usedTokens;
|
|
28
|
+
consume(jti: string, expiresAt: number): Promise<boolean>;
|
|
29
|
+
private cleanup;
|
|
30
|
+
}
|
|
6
31
|
/**
|
|
7
32
|
* Creates one or more PoW challenges and returns them as signed JWT tokens.
|
|
8
33
|
*
|
|
9
|
-
* @param difficulty - Number of leading zeros required in the hash (default
|
|
34
|
+
* @param difficulty - Number of leading zeros required in the hash (default 5)
|
|
10
35
|
* @param amount - Number of challenges to create (default 4)
|
|
11
36
|
* @param ttlSeconds - Time to live for each challenge in seconds (default 30)
|
|
12
37
|
* @returns An array of JWT challenge tokens
|
|
@@ -16,10 +41,13 @@ export declare function createChallenge(difficulty?: number, amount?: number, tt
|
|
|
16
41
|
* Solves one or more PoW challenges encoded in JWT tokens.
|
|
17
42
|
*
|
|
18
43
|
* @param token - The JWT challenge token or an array of tokens
|
|
44
|
+
* @param options - Optional guardrails for test/debug usage (`maxIterations`, `maxDurationMs`)
|
|
19
45
|
* @returns The nonce/hash pair for single input or an array of them for multiple tokens
|
|
20
46
|
*/
|
|
21
47
|
export declare function solveChallenge(token: ChallengeToken): ChallengeSolution | undefined;
|
|
48
|
+
export declare function solveChallenge(token: ChallengeToken, options?: SolveChallengeOptions): ChallengeSolution | undefined;
|
|
22
49
|
export declare function solveChallenge(token: ChallengeToken[]): ChallengeSolution[] | undefined;
|
|
50
|
+
export declare function solveChallenge(token: ChallengeToken[], options?: SolveChallengeOptions): ChallengeSolution[] | undefined;
|
|
23
51
|
/**
|
|
24
52
|
* Verifies a PoW solution returned by the client.
|
|
25
53
|
*
|
|
@@ -27,5 +55,5 @@ export declare function solveChallenge(token: ChallengeToken[]): ChallengeSoluti
|
|
|
27
55
|
* @param nonce - The nonce/answer submitted by the client (single nonce, array of nonces, or array of solution objects)
|
|
28
56
|
* @returns true only if every provided solution is valid; otherwise false
|
|
29
57
|
*/
|
|
30
|
-
export declare function verifySolution(token: ChallengeToken | ChallengeToken[], nonce: number | string | Array<number | string> | ChallengeSolution | ChallengeSolution[]): boolean
|
|
58
|
+
export declare function verifySolution(token: ChallengeToken | ChallengeToken[], nonce: number | string | Array<number | string> | ChallengeSolution | ChallengeSolution[], options?: VerifySolutionOptions): Promise<boolean>;
|
|
31
59
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,UAAU,CAA6B;IAEzC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/D,OAAO,CAAC,OAAO;CAShB;AAsMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,UAAU,GAAE,MAAU,EACtB,MAAM,GAAE,MAAU,EAClB,UAAU,GAAE,MAAW,GACtB,cAAc,EAAE,CAUlB;AA0FD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,GAAG,SAAS,CAAC;AACrF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,iBAAiB,GAAG,SAAS,CAAC;AACjC,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,GAAG,SAAS,CAAC;AACzF,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,iBAAiB,EAAE,GAAG,SAAS,CAAC;AAwBnC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE,EACxC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,iBAAiB,GAAG,iBAAiB,EAAE,EACzF,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAuDlB"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
import crypto from 'crypto';
|
|
2
2
|
import jwt from 'jsonwebtoken';
|
|
3
|
+
export class LocalReplayStore {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.usedTokens = new Map();
|
|
6
|
+
}
|
|
7
|
+
async consume(jti, expiresAt) {
|
|
8
|
+
this.cleanup();
|
|
9
|
+
if (this.usedTokens.has(jti)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
this.usedTokens.set(jti, expiresAt);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
cleanup() {
|
|
16
|
+
const now = Math.floor(Date.now() / 1000);
|
|
17
|
+
for (const [jti, expiresAt] of this.usedTokens.entries()) {
|
|
18
|
+
if (expiresAt < now) {
|
|
19
|
+
this.usedTokens.delete(jti);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const defaultLocalReplayStore = new LocalReplayStore();
|
|
25
|
+
const DEFAULT_SOLVE_MAX_DURATION_MS = 30000;
|
|
3
26
|
function generateChallenge(length = 8) {
|
|
4
27
|
const buffer = crypto.randomBytes(length);
|
|
5
28
|
return buffer.toString('base64').slice(0, length);
|
|
@@ -9,14 +32,102 @@ function createChallengePayload(difficulty, ttlSeconds) {
|
|
|
9
32
|
challenge: generateChallenge(),
|
|
10
33
|
difficulty,
|
|
11
34
|
expires: Math.floor(Date.now() / 1000) + ttlSeconds,
|
|
35
|
+
jti: crypto.randomUUID(),
|
|
12
36
|
};
|
|
13
37
|
}
|
|
38
|
+
let cachedSecret;
|
|
14
39
|
function getSecret() {
|
|
15
40
|
const secret = process.env.RIBAUNT_SECRET;
|
|
16
41
|
if (!secret) {
|
|
42
|
+
cachedSecret = undefined;
|
|
17
43
|
throw new Error('RIBAUNT_SECRET environment variable is not set!');
|
|
18
44
|
}
|
|
19
|
-
|
|
45
|
+
if (cachedSecret === secret) {
|
|
46
|
+
return cachedSecret;
|
|
47
|
+
}
|
|
48
|
+
cachedSecret = secret;
|
|
49
|
+
return cachedSecret;
|
|
50
|
+
}
|
|
51
|
+
function shouldDebugVerifyErrors(options) {
|
|
52
|
+
if (options?.debug !== undefined) {
|
|
53
|
+
return options.debug;
|
|
54
|
+
}
|
|
55
|
+
return process.env.NODE_ENV === 'development';
|
|
56
|
+
}
|
|
57
|
+
function logVerifyWarning(message, options, error) {
|
|
58
|
+
const warning = {
|
|
59
|
+
reason: classifyVerifyWarningReason(error),
|
|
60
|
+
message,
|
|
61
|
+
error,
|
|
62
|
+
};
|
|
63
|
+
options?.onWarning?.(warning);
|
|
64
|
+
if (!shouldDebugVerifyErrors(options)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const details = error instanceof Error ? error.message : error;
|
|
68
|
+
console.warn(`[ribaunt] ${message}`, details ?? '');
|
|
69
|
+
}
|
|
70
|
+
function emitVerifyWarning(reason, message, options, error) {
|
|
71
|
+
options?.onWarning?.({ reason, message, error });
|
|
72
|
+
if (!shouldDebugVerifyErrors(options)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const details = error instanceof Error ? error.message : error;
|
|
76
|
+
console.warn(`[ribaunt] ${message}`, details ?? '');
|
|
77
|
+
}
|
|
78
|
+
function classifyVerifyWarningReason(error) {
|
|
79
|
+
if (error && typeof error === 'object' && 'name' in error) {
|
|
80
|
+
const name = String(error.name);
|
|
81
|
+
if (name === 'TokenExpiredError') {
|
|
82
|
+
return 'expired-token';
|
|
83
|
+
}
|
|
84
|
+
if (name === 'JsonWebTokenError' || name === 'NotBeforeError') {
|
|
85
|
+
return 'invalid-token';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (error instanceof Error && error.message.includes('replayStore')) {
|
|
89
|
+
return 'configuration-error';
|
|
90
|
+
}
|
|
91
|
+
return 'invalid-token';
|
|
92
|
+
}
|
|
93
|
+
function normalizeMaxIterations(options) {
|
|
94
|
+
if (options?.maxIterations === undefined) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
if (!Number.isFinite(options.maxIterations)) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const normalized = Math.floor(options.maxIterations);
|
|
101
|
+
if (normalized < 1) {
|
|
102
|
+
return 1;
|
|
103
|
+
}
|
|
104
|
+
return normalized;
|
|
105
|
+
}
|
|
106
|
+
function normalizeMaxDurationMs(options) {
|
|
107
|
+
if (options?.maxDurationMs === undefined) {
|
|
108
|
+
return DEFAULT_SOLVE_MAX_DURATION_MS;
|
|
109
|
+
}
|
|
110
|
+
if (!Number.isFinite(options.maxDurationMs)) {
|
|
111
|
+
return DEFAULT_SOLVE_MAX_DURATION_MS;
|
|
112
|
+
}
|
|
113
|
+
const normalized = Math.floor(options.maxDurationMs);
|
|
114
|
+
if (normalized < 1) {
|
|
115
|
+
return 1;
|
|
116
|
+
}
|
|
117
|
+
return normalized;
|
|
118
|
+
}
|
|
119
|
+
function getReplayStore(options) {
|
|
120
|
+
const mode = options?.replayPrevention ?? 'disabled';
|
|
121
|
+
if (mode === 'disabled') {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
if (mode === 'local') {
|
|
125
|
+
return defaultLocalReplayStore;
|
|
126
|
+
}
|
|
127
|
+
if (!options?.replayStore) {
|
|
128
|
+
throw new Error('A replayStore is required when replayPrevention is set to "remote"');
|
|
129
|
+
}
|
|
130
|
+
return options.replayStore;
|
|
20
131
|
}
|
|
21
132
|
function signChallenge(payload) {
|
|
22
133
|
return jwt.sign(payload, getSecret());
|
|
@@ -58,7 +169,7 @@ function createSingleChallenge(difficulty, ttlSeconds) {
|
|
|
58
169
|
/**
|
|
59
170
|
* Creates one or more PoW challenges and returns them as signed JWT tokens.
|
|
60
171
|
*
|
|
61
|
-
* @param difficulty - Number of leading zeros required in the hash (default
|
|
172
|
+
* @param difficulty - Number of leading zeros required in the hash (default 5)
|
|
62
173
|
* @param amount - Number of challenges to create (default 4)
|
|
63
174
|
* @param ttlSeconds - Time to live for each challenge in seconds (default 30)
|
|
64
175
|
* @returns An array of JWT challenge tokens
|
|
@@ -70,15 +181,24 @@ export function createChallenge(difficulty = 5, amount = 4, ttlSeconds = 30) {
|
|
|
70
181
|
const challenges = Array.from({ length: normalizedAmount }, () => createSingleChallenge(normalizedDifficulty, normalizedTtl));
|
|
71
182
|
return challenges;
|
|
72
183
|
}
|
|
73
|
-
function solveSingleChallenge(token) {
|
|
184
|
+
function solveSingleChallenge(token, options) {
|
|
74
185
|
try {
|
|
75
186
|
const payload = jwt.decode(token);
|
|
76
187
|
if (!payload)
|
|
77
188
|
return undefined;
|
|
78
189
|
const { challenge, difficulty } = payload;
|
|
79
190
|
const prefix = '0'.repeat(difficulty);
|
|
191
|
+
const maxIterations = normalizeMaxIterations(options);
|
|
192
|
+
const maxDurationMs = normalizeMaxDurationMs(options);
|
|
193
|
+
const startedAt = Date.now();
|
|
80
194
|
let nonce = 0;
|
|
81
195
|
while (true) {
|
|
196
|
+
if (maxIterations !== undefined && nonce >= maxIterations) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
if (Date.now() - startedAt >= maxDurationMs) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
82
202
|
const hash = crypto
|
|
83
203
|
.createHash('sha256')
|
|
84
204
|
.update(`${challenge}${nonce}`)
|
|
@@ -93,32 +213,49 @@ function solveSingleChallenge(token) {
|
|
|
93
213
|
return undefined;
|
|
94
214
|
}
|
|
95
215
|
}
|
|
96
|
-
function verifySingleSolution(token, nonce) {
|
|
216
|
+
async function verifySingleSolution(token, nonce, options) {
|
|
97
217
|
if (nonce === undefined || nonce === null) {
|
|
218
|
+
emitVerifyWarning('invalid-solution', 'verifySolution received an empty nonce', options);
|
|
98
219
|
return false;
|
|
99
220
|
}
|
|
100
221
|
try {
|
|
222
|
+
const replayStore = getReplayStore(options);
|
|
101
223
|
const payload = jwt.verify(token, getSecret());
|
|
102
224
|
const now = Math.floor(Date.now() / 1000);
|
|
103
|
-
if (payload.expires < now)
|
|
225
|
+
if (payload.expires < now) {
|
|
226
|
+
emitVerifyWarning('expired-token', 'verifySolution rejected an expired challenge token', options);
|
|
104
227
|
return false;
|
|
228
|
+
}
|
|
105
229
|
const nonceValue = typeof nonce === 'number' ? String(nonce) : nonce;
|
|
106
230
|
const hash = crypto
|
|
107
231
|
.createHash('sha256')
|
|
108
232
|
.update(`${payload.challenge}${nonceValue}`)
|
|
109
233
|
.digest('hex');
|
|
110
234
|
const prefix = '0'.repeat(payload.difficulty);
|
|
111
|
-
|
|
235
|
+
const isValid = hash.startsWith(prefix);
|
|
236
|
+
if (!isValid) {
|
|
237
|
+
emitVerifyWarning('invalid-solution', 'verifySolution rejected an invalid nonce', options);
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
if (replayStore && payload.jti) {
|
|
241
|
+
const consumed = await replayStore.consume(payload.jti, payload.expires);
|
|
242
|
+
if (!consumed) {
|
|
243
|
+
emitVerifyWarning('replay-detected', 'verifySolution rejected a replayed token', options);
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
112
248
|
}
|
|
113
249
|
catch (err) {
|
|
250
|
+
logVerifyWarning('verifySolution rejected a token or nonce', options, err);
|
|
114
251
|
return false;
|
|
115
252
|
}
|
|
116
253
|
}
|
|
117
|
-
export function solveChallenge(token) {
|
|
254
|
+
export function solveChallenge(token, options) {
|
|
118
255
|
if (Array.isArray(token)) {
|
|
119
256
|
const solutions = [];
|
|
120
257
|
for (const singleToken of token) {
|
|
121
|
-
const solution = solveSingleChallenge(singleToken);
|
|
258
|
+
const solution = solveSingleChallenge(singleToken, options);
|
|
122
259
|
if (!solution) {
|
|
123
260
|
return undefined;
|
|
124
261
|
}
|
|
@@ -126,7 +263,7 @@ export function solveChallenge(token) {
|
|
|
126
263
|
}
|
|
127
264
|
return solutions;
|
|
128
265
|
}
|
|
129
|
-
const solution = solveSingleChallenge(token);
|
|
266
|
+
const solution = solveSingleChallenge(token, options);
|
|
130
267
|
return solution;
|
|
131
268
|
}
|
|
132
269
|
/**
|
|
@@ -136,12 +273,12 @@ export function solveChallenge(token) {
|
|
|
136
273
|
* @param nonce - The nonce/answer submitted by the client (single nonce, array of nonces, or array of solution objects)
|
|
137
274
|
* @returns true only if every provided solution is valid; otherwise false
|
|
138
275
|
*/
|
|
139
|
-
export function verifySolution(token, nonce) {
|
|
276
|
+
export function verifySolution(token, nonce, options) {
|
|
140
277
|
if (Array.isArray(token)) {
|
|
141
278
|
let nonces;
|
|
142
279
|
if (Array.isArray(nonce)) {
|
|
143
280
|
if (nonce.length !== token.length) {
|
|
144
|
-
return false;
|
|
281
|
+
return Promise.resolve(false);
|
|
145
282
|
}
|
|
146
283
|
if (nonce.length > 0 && typeof nonce[0] === 'object' && 'nonce' in nonce[0]) {
|
|
147
284
|
nonces = nonce.map(s => s.nonce);
|
|
@@ -151,24 +288,26 @@ export function verifySolution(token, nonce) {
|
|
|
151
288
|
}
|
|
152
289
|
}
|
|
153
290
|
else {
|
|
154
|
-
return false;
|
|
291
|
+
return Promise.resolve(false);
|
|
155
292
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
293
|
+
return (async () => {
|
|
294
|
+
for (let index = 0; index < token.length; index++) {
|
|
295
|
+
const challengeToken = token[index];
|
|
296
|
+
const nonceEntry = nonces[index];
|
|
297
|
+
if (challengeToken === undefined || nonceEntry === undefined) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
if (!await verifySingleSolution(challengeToken, nonceEntry, options)) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
164
303
|
}
|
|
165
|
-
|
|
166
|
-
|
|
304
|
+
return true;
|
|
305
|
+
})();
|
|
167
306
|
}
|
|
168
307
|
let effectiveNonce;
|
|
169
308
|
if (Array.isArray(nonce)) {
|
|
170
309
|
if (nonce.length === 0) {
|
|
171
|
-
return false;
|
|
310
|
+
return Promise.resolve(false);
|
|
172
311
|
}
|
|
173
312
|
if (typeof nonce[0] === 'object' && 'nonce' in nonce[0]) {
|
|
174
313
|
effectiveNonce = nonce[0].nonce;
|
|
@@ -184,9 +323,8 @@ export function verifySolution(token, nonce) {
|
|
|
184
323
|
effectiveNonce = nonce;
|
|
185
324
|
}
|
|
186
325
|
if (effectiveNonce === undefined) {
|
|
187
|
-
return false;
|
|
326
|
+
return Promise.resolve(false);
|
|
188
327
|
}
|
|
189
|
-
|
|
190
|
-
return result;
|
|
328
|
+
return verifySingleSolution(token, effectiveNonce, options);
|
|
191
329
|
}
|
|
192
330
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,GAAG,MAAM,cAAc,CAAC;AA+C/B,MAAM,OAAO,gBAAgB;IAA7B;QACU,eAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAsBjD,CAAC;IApBC,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,SAAiB;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACzD,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,uBAAuB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AACvD,MAAM,6BAA6B,GAAG,KAAM,CAAC;AAE7C,SAAS,iBAAiB,CAAC,MAAM,GAAG,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB,EAAE,UAAkB;IACpE,OAAO;QACL,SAAS,EAAE,iBAAiB,EAAE;QAC9B,UAAU;QACV,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU;QACnD,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,IAAI,YAAgC,CAAC;AAErC,SAAS,SAAS;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,YAAY,GAAG,SAAS,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YAAY,GAAG,MAAM,CAAC;IACtB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA+B;IAC9D,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,OAA+B,EAAE,KAAe;IACzF,MAAM,OAAO,GAAkB;QAC7B,MAAM,EAAE,2BAA2B,CAAC,KAAK,CAAC;QAC1C,OAAO;QACP,KAAK;KACN,CAAC;IAEF,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IAE9B,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA2B,EAC3B,OAAe,EACf,OAA+B,EAC/B,KAAe;IAEf,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAEjD,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IACjD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC,CAAC;QAExD,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACjC,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC9D,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA+B;IAC7D,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACrD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA+B;IAC7D,IAAI,OAAO,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACrD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,OAA+B;IACrD,MAAM,IAAI,GAAG,OAAO,EAAE,gBAAgB,IAAI,UAAU,CAAC;IAErD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,OAA8B;IACnD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB,EAAE,UAAkB;IACnE,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/D,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,aAAqB,CAAC,EACtB,SAAiB,CAAC,EAClB,aAAqB,EAAE;IAEvB,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAC5B,GAAG,EAAE,CAAC,qBAAqB,CAAC,oBAAoB,EAAE,aAAa,CAAC,CACjE,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAqB,EACrB,OAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAiC,CAAC;QAClE,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,aAAa,KAAK,SAAS,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;gBAC1D,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,aAAa,EAAE,CAAC;gBAC5C,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM;iBAChB,UAAU,CAAC,QAAQ,CAAC;iBACpB,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC;iBAC9B,MAAM,CAAC,KAAK,CAAC,CAAC;YAEjB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;YACxC,CAAC;YAED,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAqB,EACrB,KAAkC,EAClC,OAA+B;IAE/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,iBAAiB,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,OAAO,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,CAA0B,CAAC;QAExE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YAC1B,iBAAiB,CAAC,eAAe,EAAE,oDAAoD,EAAE,OAAO,CAAC,CAAC;YAClG,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM;aAChB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;aAC3C,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,iBAAiB,CAAC,kBAAkB,EAAE,0CAA0C,EAAE,OAAO,CAAC,CAAC;YAC3F,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,iBAAiB,CAAC,iBAAiB,EAAE,0CAA0C,EAAE,OAAO,CAAC,CAAC;gBAC1F,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB,CAAC,0CAA0C,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAmBD,MAAM,UAAU,cAAc,CAC5B,KAAwC,EACxC,OAA+B;IAE/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,SAAS,GAAwB,EAAE,CAAC;QAE1C,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAwC,EACxC,KAAyF,EACzF,OAA+B;IAE/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,MAA8B,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,MAAM,GAAI,KAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,KAA+B,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,KAAK,IAAI,EAAE;YACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEjC,IAAI,cAAc,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7D,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,IAAI,CAAC,MAAM,oBAAoB,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;oBACrE,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,IAAI,cAA+B,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,cAAc,GAAI,KAAK,CAAC,CAAC,CAAuB,CAAC,KAAK,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,KAAK,CAAC,CAAC,CAAoB,CAAC;QAC/C,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACzD,cAAc,GAAI,KAA2B,CAAC,KAAK,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,KAAwB,CAAC;IAC5C,CAAC;IAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/solver.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ export interface ChallengeSolution {
|
|
|
8
8
|
/**
|
|
9
9
|
* Solve a single challenge token (browser-compatible)
|
|
10
10
|
*/
|
|
11
|
-
export declare function solveSingleChallenge(token: string): Promise<ChallengeSolution | undefined>;
|
|
11
|
+
export declare function solveSingleChallenge(token: string, signal?: AbortSignal): Promise<ChallengeSolution | undefined>;
|
|
12
12
|
/**
|
|
13
13
|
* Solve multiple challenge tokens (browser-compatible)
|
|
14
14
|
*/
|
|
15
|
-
export declare function solveChallenge(tokens: string[], onProgress?: (progress: number) => void): Promise<ChallengeSolution[]>;
|
|
15
|
+
export declare function solveChallenge(tokens: string[], onProgress?: (progress: number) => void, signal?: AbortSignal): Promise<ChallengeSolution[]>;
|
|
16
16
|
//# sourceMappingURL=solver.d.ts.map
|
package/dist/solver.d.ts.map
CHANGED
|
@@ -1 +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;AAgDD;;GAEG;AACH,wBAAsB,oBAAoB,
|
|
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;AAgDD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CA0BxC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACvC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwB9B"}
|
package/dist/solver.js
CHANGED
|
@@ -37,7 +37,7 @@ async function sha256(message) {
|
|
|
37
37
|
/**
|
|
38
38
|
* Solve a single challenge token (browser-compatible)
|
|
39
39
|
*/
|
|
40
|
-
export async function solveSingleChallenge(token) {
|
|
40
|
+
export async function solveSingleChallenge(token, signal) {
|
|
41
41
|
const payload = decodeJWT(token);
|
|
42
42
|
if (!payload)
|
|
43
43
|
return undefined;
|
|
@@ -45,6 +45,9 @@ export async function solveSingleChallenge(token) {
|
|
|
45
45
|
const prefix = '0'.repeat(difficulty);
|
|
46
46
|
let nonce = 0;
|
|
47
47
|
while (true) {
|
|
48
|
+
if (signal?.aborted) {
|
|
49
|
+
throw new DOMException('Challenge solving aborted', 'AbortError');
|
|
50
|
+
}
|
|
48
51
|
const hash = await sha256(`${challenge}${nonce}`);
|
|
49
52
|
if (hash.startsWith(prefix)) {
|
|
50
53
|
return { nonce: String(nonce), hash };
|
|
@@ -59,14 +62,14 @@ export async function solveSingleChallenge(token) {
|
|
|
59
62
|
/**
|
|
60
63
|
* Solve multiple challenge tokens (browser-compatible)
|
|
61
64
|
*/
|
|
62
|
-
export async function solveChallenge(tokens, onProgress) {
|
|
65
|
+
export async function solveChallenge(tokens, onProgress, signal) {
|
|
63
66
|
const solutions = [];
|
|
64
67
|
for (let i = 0; i < tokens.length; i++) {
|
|
65
68
|
const token = tokens[i];
|
|
66
69
|
if (!token) {
|
|
67
70
|
throw new Error(`Invalid token at index ${i}`);
|
|
68
71
|
}
|
|
69
|
-
const solution = await solveSingleChallenge(token);
|
|
72
|
+
const solution = await solveSingleChallenge(token, signal);
|
|
70
73
|
if (!solution) {
|
|
71
74
|
throw new Error(`Failed to solve challenge ${i + 1}`);
|
|
72
75
|
}
|