ribaunt 0.2.2 → 0.2.4
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/README.md +113 -10
- package/demo/lib/ribaunt-solver.wasm +0 -0
- package/demo/lib/solver-worker.js +174 -0
- package/demo/lib/solver-worker.js.map +1 -0
- package/demo/lib/solver.js +135 -0
- package/demo/lib/solver.js.map +1 -0
- package/demo/lib/wasm-solver.js +296 -0
- package/demo/lib/wasm-solver.js.map +1 -0
- package/demo/lib/widget-browser.js +9 -0
- package/demo/lib/widget-browser.js.map +1 -0
- package/demo/lib/widget.js +942 -0
- package/demo/lib/widget.js.map +1 -0
- package/demo/lib/worker-client.js +128 -0
- package/demo/lib/worker-client.js.map +1 -0
- package/dist/cjs/index.d.ts +48 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +196 -17
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/risk.d.ts +124 -0
- package/dist/cjs/risk.d.ts.map +1 -0
- package/dist/cjs/risk.js +213 -0
- package/dist/cjs/risk.js.map +1 -0
- package/dist/index.d.ts +48 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +193 -16
- package/dist/index.js.map +1 -1
- package/dist/ribaunt-solver.wasm +0 -0
- package/dist/risk.d.ts +124 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +202 -0
- package/dist/risk.js.map +1 -0
- package/dist/solver-worker.d.ts.map +1 -1
- package/dist/solver-worker.js +166 -7
- package/dist/solver-worker.js.map +1 -1
- package/dist/solver.d.ts +1 -0
- package/dist/solver.d.ts.map +1 -1
- package/dist/solver.js +38 -3
- package/dist/solver.js.map +1 -1
- package/dist/wasm-solver.d.ts +29 -0
- package/dist/wasm-solver.d.ts.map +1 -0
- package/dist/wasm-solver.js +296 -0
- package/dist/wasm-solver.js.map +1 -0
- package/dist/widget-browser.d.ts +3 -2
- package/dist/widget-browser.d.ts.map +1 -1
- package/dist/widget-browser.js +1 -1
- package/dist/widget-browser.js.map +1 -1
- package/dist/widget-react.d.ts +4 -1
- package/dist/widget-react.d.ts.map +1 -1
- package/dist/widget-react.js +102 -14
- package/dist/widget-react.js.map +1 -1
- package/dist/widget.d.ts +42 -14
- package/dist/widget.d.ts.map +1 -1
- package/dist/widget.js +254 -12
- package/dist/widget.js.map +1 -1
- package/dist/worker-client.d.ts +7 -1
- package/dist/worker-client.d.ts.map +1 -1
- package/dist/worker-client.js +69 -19
- package/dist/worker-client.js.map +1 -1
- package/package.json +22 -9
- package/context7.json +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { solveChallenge, } from './solver.js';
|
|
2
|
+
export class WorkerUnavailableError extends Error {
|
|
3
|
+
constructor(message = 'Web Worker solving is unavailable') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.code = 'worker-unavailable';
|
|
6
|
+
this.name = 'WorkerUnavailableError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function abortError() {
|
|
10
|
+
return new DOMException('Challenge solving aborted', 'AbortError');
|
|
11
|
+
}
|
|
12
|
+
const CANCEL_GRACE_MS = 250;
|
|
13
|
+
function solveInWorker(tokens, onProgress, signal, wasmMode = 'preferred', onBackend) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
if (typeof Worker === 'undefined') {
|
|
16
|
+
reject(new WorkerUnavailableError());
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let worker;
|
|
20
|
+
try {
|
|
21
|
+
worker = new Worker(new URL('./solver-worker.js', import.meta.url), { type: 'module' });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
reject(new WorkerUnavailableError(error instanceof Error ? error.message : String(error)));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const id = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;
|
|
28
|
+
let cancelTimer;
|
|
29
|
+
let cancelled = false;
|
|
30
|
+
const release = () => {
|
|
31
|
+
if (cancelTimer !== undefined)
|
|
32
|
+
clearTimeout(cancelTimer);
|
|
33
|
+
cancelTimer = undefined;
|
|
34
|
+
signal?.removeEventListener('abort', handleAbort);
|
|
35
|
+
};
|
|
36
|
+
const finish = () => {
|
|
37
|
+
release();
|
|
38
|
+
worker.terminate();
|
|
39
|
+
};
|
|
40
|
+
const handleAbort = () => {
|
|
41
|
+
if (cancelled)
|
|
42
|
+
return;
|
|
43
|
+
cancelled = true;
|
|
44
|
+
worker.postMessage({ type: 'cancel', id });
|
|
45
|
+
cancelTimer = setTimeout(() => {
|
|
46
|
+
finish();
|
|
47
|
+
reject(abortError());
|
|
48
|
+
}, CANCEL_GRACE_MS);
|
|
49
|
+
};
|
|
50
|
+
worker.addEventListener('message', (event) => {
|
|
51
|
+
const message = event.data;
|
|
52
|
+
if (!message || message.id !== id)
|
|
53
|
+
return;
|
|
54
|
+
if (message.type === 'cancelled') {
|
|
55
|
+
release();
|
|
56
|
+
reject(abortError());
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (message.type === 'backend' && message.backend) {
|
|
60
|
+
if (cancelled)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
onBackend?.(message.backend);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// telemetry must never break solving
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (cancelled)
|
|
71
|
+
return;
|
|
72
|
+
if (message.type === 'progress' && message.progress !== undefined) {
|
|
73
|
+
onProgress?.(message.progress);
|
|
74
|
+
}
|
|
75
|
+
else if (message.type === 'result' && message.solutions) {
|
|
76
|
+
finish();
|
|
77
|
+
resolve(message.solutions);
|
|
78
|
+
}
|
|
79
|
+
else if (message.type === 'error') {
|
|
80
|
+
finish();
|
|
81
|
+
reject(new Error(message.error ?? 'Worker solving failed'));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
worker.addEventListener('error', () => {
|
|
85
|
+
finish();
|
|
86
|
+
reject(new WorkerUnavailableError('The solver worker failed to load'));
|
|
87
|
+
}, { once: true });
|
|
88
|
+
if (signal?.aborted) {
|
|
89
|
+
finish();
|
|
90
|
+
reject(abortError());
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
signal?.addEventListener('abort', handleAbort, { once: true });
|
|
94
|
+
worker.postMessage({ type: 'solve', id, tokens, wasmMode });
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
export async function solveChallengeWithWorker(tokens, onProgress, signal, mode = 'preferred', wasmMode = 'preferred', onBackend) {
|
|
98
|
+
// Backwards compat: if wasmMode is an options object, normalize
|
|
99
|
+
// Also support legacy 4-arg calls where 5th arg is wasmMode string
|
|
100
|
+
let normalizedWasmMode = wasmMode;
|
|
101
|
+
let normalizedOnBackend = onBackend;
|
|
102
|
+
// If 5th arg looks like object with wasmMode property, handle (future proof)
|
|
103
|
+
if (typeof wasmMode === 'object' && wasmMode !== null && 'wasmMode' in wasmMode) {
|
|
104
|
+
const opts = wasmMode;
|
|
105
|
+
normalizedWasmMode = opts.wasmMode ?? 'preferred';
|
|
106
|
+
normalizedOnBackend = opts.onBackend;
|
|
107
|
+
}
|
|
108
|
+
if (normalizedWasmMode !== 'preferred' && normalizedWasmMode !== 'disabled') {
|
|
109
|
+
normalizedWasmMode = 'preferred';
|
|
110
|
+
}
|
|
111
|
+
if (mode === 'disabled') {
|
|
112
|
+
// Even when worker disabled, we still solve on main thread via JS (no wasm on main thread for v1)
|
|
113
|
+
// Telemetry for main thread fallback is not needed
|
|
114
|
+
return solveChallenge(tokens, onProgress, signal);
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
return await solveInWorker(tokens, onProgress, signal, normalizedWasmMode, normalizedOnBackend);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (mode === 'preferred'
|
|
121
|
+
&& error instanceof WorkerUnavailableError
|
|
122
|
+
&& !signal?.aborted) {
|
|
123
|
+
return solveChallenge(tokens, onProgress, signal);
|
|
124
|
+
}
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=worker-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../src/worker-client.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { DEFAULT_RISK_THRESHOLDS } from './risk.js';
|
|
2
|
+
import type { AssessOptions, RiskAssessment } from './risk.js';
|
|
3
|
+
export type { AssessOptions, AssessWorkloadOptions, RiskAssessment, RiskScorer, RiskSignals, RiskThresholds } from './risk.js';
|
|
4
|
+
export { DEFAULT_RISK_THRESHOLDS };
|
|
1
5
|
export type ChallengeToken = string;
|
|
2
6
|
export interface ChallengeSolution {
|
|
3
7
|
nonce: string;
|
|
@@ -36,11 +40,20 @@ export interface ChallengeOptions {
|
|
|
36
40
|
maxDifficulty?: number;
|
|
37
41
|
minAmount?: number;
|
|
38
42
|
maxAmount?: number;
|
|
43
|
+
rateLimiter?: RateLimiter;
|
|
44
|
+
onEvent?: (event: RibauntEvent) => void;
|
|
39
45
|
}
|
|
40
46
|
export interface ReplayStore {
|
|
41
47
|
consume(jti: string, expiresAt: number): Promise<boolean>;
|
|
42
48
|
consumeMany?(jtis: string[], expiresAt: number): Promise<boolean>;
|
|
43
49
|
}
|
|
50
|
+
export interface RateLimiter {
|
|
51
|
+
check(key?: string): Promise<boolean>;
|
|
52
|
+
}
|
|
53
|
+
export declare class RateLimitedError extends Error {
|
|
54
|
+
readonly code = "rate-limited";
|
|
55
|
+
constructor(message?: string);
|
|
56
|
+
}
|
|
44
57
|
export type ReplayPreventionMode = 'disabled' | 'local' | 'remote';
|
|
45
58
|
export interface VerifySolutionOptions {
|
|
46
59
|
replayPrevention?: ReplayPreventionMode;
|
|
@@ -48,14 +61,27 @@ export interface VerifySolutionOptions {
|
|
|
48
61
|
context?: string;
|
|
49
62
|
debug?: boolean;
|
|
50
63
|
onWarning?: (warning: VerifyWarning) => void;
|
|
64
|
+
rateLimiter?: RateLimiter;
|
|
65
|
+
onEvent?: (event: RibauntEvent) => void;
|
|
51
66
|
}
|
|
52
|
-
export type VerifyFailureReason = 'invalid-token' | 'expired-token' | 'invalid-solution' | 'context-mismatch' | 'replay-detected' | 'configuration-error';
|
|
67
|
+
export type VerifyFailureReason = 'invalid-token' | 'expired-token' | 'invalid-solution' | 'context-mismatch' | 'replay-detected' | 'replay-store-unavailable' | 'configuration-error';
|
|
53
68
|
export type VerifyWarningReason = VerifyFailureReason;
|
|
54
69
|
export interface VerifyWarning {
|
|
55
70
|
reason: VerifyWarningReason;
|
|
56
71
|
message: string;
|
|
57
72
|
error?: unknown;
|
|
58
73
|
}
|
|
74
|
+
export type RibauntEvent = {
|
|
75
|
+
type: 'challenge-issued';
|
|
76
|
+
difficulty: number;
|
|
77
|
+
amount: number;
|
|
78
|
+
} | {
|
|
79
|
+
type: 'verify-success';
|
|
80
|
+
} | {
|
|
81
|
+
type: 'verify-failure';
|
|
82
|
+
reason: VerifyFailureReason;
|
|
83
|
+
message: string;
|
|
84
|
+
};
|
|
59
85
|
export type VerifySolutionResult = {
|
|
60
86
|
valid: true;
|
|
61
87
|
} | {
|
|
@@ -77,10 +103,29 @@ export declare class LocalReplayStore implements ReplayStore {
|
|
|
77
103
|
* Selects bounded proof-of-work using a server-owned risk floor and untrusted timing calibration.
|
|
78
104
|
*/
|
|
79
105
|
export declare function selectWorkload(options?: AdaptiveWorkloadOptions): Workload;
|
|
106
|
+
/**
|
|
107
|
+
* Programmable risk-assessment subsystem.
|
|
108
|
+
*
|
|
109
|
+
* All signals are caller-supplied and treated as untrusted inputs.
|
|
110
|
+
* The default scorer is a transparent heuristic (not an ML model).
|
|
111
|
+
* The returned `risk` is a bounded heuristic score, not a probability
|
|
112
|
+
* or identity confidence. The caller is responsible for obtaining
|
|
113
|
+
* trustworthy inputs.
|
|
114
|
+
*
|
|
115
|
+
* Flow:
|
|
116
|
+
* validate AssessOptions
|
|
117
|
+
* -> resolve scorer (custom or default)
|
|
118
|
+
* -> await scorer.score(signals)
|
|
119
|
+
* -> validate risk 0..100
|
|
120
|
+
* -> resolve thresholds (custom or DEFAULT_RISK_THRESHOLDS)
|
|
121
|
+
* -> apply policy (allow / challenge / block)
|
|
122
|
+
* -> if challenge, delegate to existing selectWorkload() with riskScore
|
|
123
|
+
*/
|
|
124
|
+
export declare function assess(options: AssessOptions): Promise<RiskAssessment>;
|
|
80
125
|
export declare function calibrateNode(iterations?: number): ClientCalibration;
|
|
81
126
|
export declare const calibrateClient: typeof calibrateNode;
|
|
82
|
-
export declare function createChallenge(difficulty?: number, amount?: number, ttlSeconds?: number): ChallengeToken[]
|
|
83
|
-
export declare function createChallenge(options: ChallengeOptions): ChallengeToken[]
|
|
127
|
+
export declare function createChallenge(difficulty?: number, amount?: number, ttlSeconds?: number): Promise<ChallengeToken[]>;
|
|
128
|
+
export declare function createChallenge(options: ChallengeOptions): Promise<ChallengeToken[]>;
|
|
84
129
|
export declare function solveChallenge(token: ChallengeToken, options?: SolveChallengeOptions): ChallengeSolution | undefined;
|
|
85
130
|
export declare function solveChallenge(token: ChallengeToken[], options?: SolveChallengeOptions): ChallengeSolution[] | undefined;
|
|
86
131
|
export declare function verifySolution(token: ChallengeToken | ChallengeToken[], nonce: number | string | Array<number | string> | ChallengeSolution | ChallengeSolution[], options?: VerifySolutionOptions): Promise<VerifySolutionResult>;
|
package/dist/cjs/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":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -3,14 +3,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.calibrateClient = exports.LocalReplayStore = void 0;
|
|
6
|
+
exports.calibrateClient = exports.LocalReplayStore = exports.RateLimitedError = exports.DEFAULT_RISK_THRESHOLDS = void 0;
|
|
7
7
|
exports.selectWorkload = selectWorkload;
|
|
8
|
+
exports.assess = assess;
|
|
8
9
|
exports.calibrateNode = calibrateNode;
|
|
9
10
|
exports.createChallenge = createChallenge;
|
|
10
11
|
exports.solveChallenge = solveChallenge;
|
|
11
12
|
exports.verifySolution = verifySolution;
|
|
12
13
|
const crypto_1 = __importDefault(require("crypto"));
|
|
13
14
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
15
|
+
const risk_js_1 = require("./risk.js");
|
|
16
|
+
Object.defineProperty(exports, "DEFAULT_RISK_THRESHOLDS", { enumerable: true, get: function () { return risk_js_1.DEFAULT_RISK_THRESHOLDS; } });
|
|
17
|
+
class RateLimitedError extends Error {
|
|
18
|
+
constructor(message = 'Rate limit exceeded') {
|
|
19
|
+
super(message);
|
|
20
|
+
this.code = 'rate-limited';
|
|
21
|
+
this.name = 'RateLimitedError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.RateLimitedError = RateLimitedError;
|
|
14
25
|
class LocalReplayStore {
|
|
15
26
|
constructor() {
|
|
16
27
|
this.usedTokens = new Map();
|
|
@@ -45,6 +56,9 @@ const DEFAULT_BOUNDS = {
|
|
|
45
56
|
minAmount: 1,
|
|
46
57
|
maxAmount: 8,
|
|
47
58
|
};
|
|
59
|
+
const MAX_WORKLOAD_DIFFICULTY = 64;
|
|
60
|
+
const MAX_WORKLOAD_AMOUNT = 64;
|
|
61
|
+
const MAX_WORKLOAD_CANDIDATES = 10000;
|
|
48
62
|
function assertFiniteInteger(value, name, minimum) {
|
|
49
63
|
if (!Number.isFinite(value))
|
|
50
64
|
throw new Error(`${name} must be a finite number`);
|
|
@@ -77,9 +91,25 @@ function assertRange(value, name, minimum, maximum) {
|
|
|
77
91
|
}
|
|
78
92
|
function normalizeBounds(options) {
|
|
79
93
|
const minDifficulty = assertFiniteInteger(options.minDifficulty ?? DEFAULT_BOUNDS.minDifficulty, 'Minimum difficulty', 1);
|
|
94
|
+
if (minDifficulty > MAX_WORKLOAD_DIFFICULTY) {
|
|
95
|
+
throw new Error(`Minimum difficulty must be at most ${MAX_WORKLOAD_DIFFICULTY}`);
|
|
96
|
+
}
|
|
80
97
|
const maxDifficulty = assertFiniteInteger(options.maxDifficulty ?? DEFAULT_BOUNDS.maxDifficulty, 'Maximum difficulty', minDifficulty);
|
|
98
|
+
if (maxDifficulty > MAX_WORKLOAD_DIFFICULTY) {
|
|
99
|
+
throw new Error(`Maximum difficulty must be at most ${MAX_WORKLOAD_DIFFICULTY}`);
|
|
100
|
+
}
|
|
81
101
|
const minAmount = assertFiniteInteger(options.minAmount ?? DEFAULT_BOUNDS.minAmount, 'Minimum amount', 1);
|
|
102
|
+
if (minAmount > MAX_WORKLOAD_AMOUNT) {
|
|
103
|
+
throw new Error(`Minimum amount must be at most ${MAX_WORKLOAD_AMOUNT}`);
|
|
104
|
+
}
|
|
82
105
|
const maxAmount = assertFiniteInteger(options.maxAmount ?? DEFAULT_BOUNDS.maxAmount, 'Maximum amount', minAmount);
|
|
106
|
+
if (maxAmount > MAX_WORKLOAD_AMOUNT) {
|
|
107
|
+
throw new Error(`Maximum amount must be at most ${MAX_WORKLOAD_AMOUNT}`);
|
|
108
|
+
}
|
|
109
|
+
const candidateCount = (maxDifficulty - minDifficulty + 1) * (maxAmount - minAmount + 1);
|
|
110
|
+
if (candidateCount > MAX_WORKLOAD_CANDIDATES) {
|
|
111
|
+
throw new Error(`Workload bounds too large: candidate count ${candidateCount} exceeds ${MAX_WORKLOAD_CANDIDATES}`);
|
|
112
|
+
}
|
|
83
113
|
return { minDifficulty, maxDifficulty, minAmount, maxAmount };
|
|
84
114
|
}
|
|
85
115
|
function closestWorkload(targetAttempts, bounds) {
|
|
@@ -117,6 +147,131 @@ function selectWorkload(options = {}) {
|
|
|
117
147
|
const maximumAttempts = (16 ** bounds.maxDifficulty) * bounds.maxAmount;
|
|
118
148
|
return closestWorkload(Math.min(targetAttempts, maximumAttempts), bounds);
|
|
119
149
|
}
|
|
150
|
+
function validateAssessWorkloadOptions(workload) {
|
|
151
|
+
// Reuse same validation messages as normalizeBounds / selectWorkload for regression safety
|
|
152
|
+
if (workload.minDifficulty !== undefined) {
|
|
153
|
+
assertFiniteInteger(workload.minDifficulty, 'Minimum difficulty', 1);
|
|
154
|
+
}
|
|
155
|
+
if (workload.maxDifficulty !== undefined) {
|
|
156
|
+
// Need to ensure we validate max >= min (using resolved min)
|
|
157
|
+
const min = workload.minDifficulty !== undefined ? Math.floor(workload.minDifficulty) : DEFAULT_BOUNDS.minDifficulty;
|
|
158
|
+
assertFiniteInteger(workload.maxDifficulty, 'Maximum difficulty', min);
|
|
159
|
+
}
|
|
160
|
+
else if (workload.minDifficulty !== undefined) {
|
|
161
|
+
// If only minDifficulty provided, still need to ensure default max >= min
|
|
162
|
+
if (DEFAULT_BOUNDS.maxDifficulty < Math.floor(workload.minDifficulty)) {
|
|
163
|
+
throw new Error(`Maximum difficulty must be at least ${Math.floor(workload.minDifficulty)}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (workload.minAmount !== undefined) {
|
|
167
|
+
assertFiniteInteger(workload.minAmount, 'Minimum amount', 1);
|
|
168
|
+
}
|
|
169
|
+
if (workload.maxAmount !== undefined) {
|
|
170
|
+
const minAmt = workload.minAmount !== undefined ? Math.floor(workload.minAmount) : DEFAULT_BOUNDS.minAmount;
|
|
171
|
+
assertFiniteInteger(workload.maxAmount, 'Maximum amount', minAmt);
|
|
172
|
+
}
|
|
173
|
+
else if (workload.minAmount !== undefined) {
|
|
174
|
+
if (DEFAULT_BOUNDS.maxAmount < Math.floor(workload.minAmount)) {
|
|
175
|
+
throw new Error(`Maximum amount must be at least ${Math.floor(workload.minAmount)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Cross-check when both are provided, normalizeBounds already checks but we also check explicit ordering
|
|
179
|
+
// Also need to handle case where both provided but max < min — already caught above with min as floor.
|
|
180
|
+
// For completeness, if both undefined, no check needed.
|
|
181
|
+
// Validate targetDurationMs
|
|
182
|
+
if (workload.targetDurationMs !== undefined) {
|
|
183
|
+
assertFiniteInteger(workload.targetDurationMs, 'Target duration', 1);
|
|
184
|
+
}
|
|
185
|
+
// Validate calibration
|
|
186
|
+
if (workload.calibration !== undefined) {
|
|
187
|
+
if (!workload.calibration || typeof workload.calibration !== 'object' || Array.isArray(workload.calibration)) {
|
|
188
|
+
throw new Error('Calibration must be an object');
|
|
189
|
+
}
|
|
190
|
+
const cal = workload.calibration;
|
|
191
|
+
assertFiniteInteger(cal.iterations, 'Calibration iterations', 1);
|
|
192
|
+
assertFiniteInteger(cal.durationMs, 'Calibration duration', 1);
|
|
193
|
+
}
|
|
194
|
+
// If any of min/max are provided, also run through normalizeBounds to ensure combined validation matches selectWorkload exactly
|
|
195
|
+
// This catches edge cases like non-finite values already handled, but ensures parity
|
|
196
|
+
if (workload.minDifficulty !== undefined ||
|
|
197
|
+
workload.maxDifficulty !== undefined ||
|
|
198
|
+
workload.minAmount !== undefined ||
|
|
199
|
+
workload.maxAmount !== undefined) {
|
|
200
|
+
normalizeBounds(workload);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Programmable risk-assessment subsystem.
|
|
205
|
+
*
|
|
206
|
+
* All signals are caller-supplied and treated as untrusted inputs.
|
|
207
|
+
* The default scorer is a transparent heuristic (not an ML model).
|
|
208
|
+
* The returned `risk` is a bounded heuristic score, not a probability
|
|
209
|
+
* or identity confidence. The caller is responsible for obtaining
|
|
210
|
+
* trustworthy inputs.
|
|
211
|
+
*
|
|
212
|
+
* Flow:
|
|
213
|
+
* validate AssessOptions
|
|
214
|
+
* -> resolve scorer (custom or default)
|
|
215
|
+
* -> await scorer.score(signals)
|
|
216
|
+
* -> validate risk 0..100
|
|
217
|
+
* -> resolve thresholds (custom or DEFAULT_RISK_THRESHOLDS)
|
|
218
|
+
* -> apply policy (allow / challenge / block)
|
|
219
|
+
* -> if challenge, delegate to existing selectWorkload() with riskScore
|
|
220
|
+
*/
|
|
221
|
+
async function assess(options) {
|
|
222
|
+
if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
223
|
+
throw new Error('AssessOptions must be an object');
|
|
224
|
+
}
|
|
225
|
+
const { signals, scorer, thresholds, workload } = options;
|
|
226
|
+
if (!signals || typeof signals !== 'object' || Array.isArray(signals)) {
|
|
227
|
+
throw new Error('signals must be an object');
|
|
228
|
+
}
|
|
229
|
+
if (scorer !== undefined) {
|
|
230
|
+
if (!scorer || typeof scorer !== 'object' || typeof scorer.score !== 'function') {
|
|
231
|
+
throw new Error('scorer must be an object with a score function');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (thresholds !== undefined) {
|
|
235
|
+
(0, risk_js_1.validateRiskThresholds)(thresholds);
|
|
236
|
+
}
|
|
237
|
+
// Use a private immutable default via copy so consumer mutation of the exported
|
|
238
|
+
// DEFAULT_RISK_THRESHOLDS cannot change library behavior
|
|
239
|
+
const resolvedThresholds = thresholds
|
|
240
|
+
? { challenge: thresholds.challenge, block: thresholds.block }
|
|
241
|
+
: { challenge: risk_js_1.DEFAULT_RISK_THRESHOLDS.challenge, block: risk_js_1.DEFAULT_RISK_THRESHOLDS.block };
|
|
242
|
+
// Validate resolved copy as well (defensive)
|
|
243
|
+
(0, risk_js_1.validateRiskThresholds)(resolvedThresholds);
|
|
244
|
+
if (workload !== undefined) {
|
|
245
|
+
if (!workload || typeof workload !== 'object' || Array.isArray(workload)) {
|
|
246
|
+
throw new Error('workload must be an object');
|
|
247
|
+
}
|
|
248
|
+
validateAssessWorkloadOptions(workload);
|
|
249
|
+
}
|
|
250
|
+
const activeScorer = scorer ?? risk_js_1.defaultScorer;
|
|
251
|
+
const rawRisk = await activeScorer.score(signals);
|
|
252
|
+
const risk = (0, risk_js_1.validateScorerOutput)(rawRisk);
|
|
253
|
+
const { challenge, block } = resolvedThresholds;
|
|
254
|
+
let action;
|
|
255
|
+
if (risk < challenge)
|
|
256
|
+
action = 'allow';
|
|
257
|
+
else if (risk < block)
|
|
258
|
+
action = 'challenge';
|
|
259
|
+
else
|
|
260
|
+
action = 'block';
|
|
261
|
+
if (action === 'challenge') {
|
|
262
|
+
// Reuse existing adaptive workload selection. Do not duplicate logic.
|
|
263
|
+
// Ensure assessed risk overrides any riskScore that might be present in workload (defensive copy).
|
|
264
|
+
const workloadOptions = {
|
|
265
|
+
...workload,
|
|
266
|
+
riskScore: risk,
|
|
267
|
+
};
|
|
268
|
+
// Ensure workload's riskScore is overridden even if spread included one
|
|
269
|
+
workloadOptions.riskScore = risk;
|
|
270
|
+
const resultWorkload = selectWorkload(workloadOptions);
|
|
271
|
+
return { risk, action, workload: resultWorkload };
|
|
272
|
+
}
|
|
273
|
+
return { risk, action };
|
|
274
|
+
}
|
|
120
275
|
function calibrateNode(iterations = 128) {
|
|
121
276
|
if (!Number.isFinite(iterations) || iterations < 1) {
|
|
122
277
|
throw new Error('Calibration iterations must be at least 1');
|
|
@@ -143,20 +298,15 @@ function hashContext(context, jti) {
|
|
|
143
298
|
.update(context, 'utf8')
|
|
144
299
|
.digest('hex');
|
|
145
300
|
}
|
|
146
|
-
let cachedSecret;
|
|
147
301
|
function getSecret() {
|
|
148
302
|
const secret = process.env.RIBAUNT_SECRET;
|
|
149
303
|
if (!secret) {
|
|
150
|
-
cachedSecret = undefined;
|
|
151
304
|
throw new Error('RIBAUNT_SECRET environment variable is not set!');
|
|
152
305
|
}
|
|
153
306
|
if (Buffer.byteLength(secret, 'utf8') < 32) {
|
|
154
|
-
cachedSecret = undefined;
|
|
155
307
|
throw new Error('RIBAUNT_SECRET must be at least 32 bytes');
|
|
156
308
|
}
|
|
157
|
-
|
|
158
|
-
cachedSecret = secret;
|
|
159
|
-
return cachedSecret;
|
|
309
|
+
return secret;
|
|
160
310
|
}
|
|
161
311
|
function createSingleChallenge(difficulty, ttlSeconds, context) {
|
|
162
312
|
const jti = crypto_1.default.randomUUID();
|
|
@@ -168,9 +318,19 @@ function createSingleChallenge(difficulty, ttlSeconds, context) {
|
|
|
168
318
|
};
|
|
169
319
|
if (context !== undefined)
|
|
170
320
|
payload.contextHash = hashContext(context, jti);
|
|
171
|
-
return jsonwebtoken_1.default.sign(payload, getSecret());
|
|
321
|
+
return jsonwebtoken_1.default.sign(payload, getSecret(), { algorithm: 'HS256' });
|
|
172
322
|
}
|
|
173
|
-
function
|
|
323
|
+
function emitEvent(options, event) {
|
|
324
|
+
if (!options?.onEvent)
|
|
325
|
+
return;
|
|
326
|
+
try {
|
|
327
|
+
options.onEvent(event);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// telemetry must never break challenge issuance or verification
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async function createChallenge(difficultyOrOptions = 5, amount = 4, ttlSeconds = 30) {
|
|
174
334
|
const options = typeof difficultyOrOptions === 'object' ? difficultyOrOptions : undefined;
|
|
175
335
|
const selectedWorkload = options?.workload
|
|
176
336
|
?? (options?.difficulty === 'auto' ? selectWorkload(options) : undefined);
|
|
@@ -185,7 +345,14 @@ function createChallenge(difficultyOrOptions = 5, amount = 4, ttlSeconds = 30) {
|
|
|
185
345
|
throw new Error('Challenge TTL must be at least 1 second');
|
|
186
346
|
}
|
|
187
347
|
const normalizedTtl = assertFiniteInteger(ttlValue, 'Challenge TTL', 1);
|
|
188
|
-
|
|
348
|
+
if (options?.rateLimiter) {
|
|
349
|
+
const allowed = await options.rateLimiter.check(options?.context);
|
|
350
|
+
if (!allowed)
|
|
351
|
+
throw new RateLimitedError('Challenge issuance rate limited');
|
|
352
|
+
}
|
|
353
|
+
const challenges = Array.from({ length: normalizedAmount }, () => createSingleChallenge(difficulty, normalizedTtl, options?.context));
|
|
354
|
+
emitEvent(options, { type: 'challenge-issued', difficulty, amount: normalizedAmount });
|
|
355
|
+
return challenges;
|
|
189
356
|
}
|
|
190
357
|
function normalizeMaxIterations(options) {
|
|
191
358
|
if (options?.maxIterations === undefined || !Number.isFinite(options.maxIterations))
|
|
@@ -242,6 +409,7 @@ function warn(reason, message, options, error) {
|
|
|
242
409
|
? { reason, message }
|
|
243
410
|
: { reason, message, error };
|
|
244
411
|
options?.onWarning?.(warning);
|
|
412
|
+
emitEvent(options, { type: 'verify-failure', reason, message });
|
|
245
413
|
if (shouldDebug(options)) {
|
|
246
414
|
const details = error instanceof Error ? error.message : error;
|
|
247
415
|
console.warn(`[ribaunt] ${message}`, details ?? '');
|
|
@@ -284,6 +452,11 @@ function contextMatches(payload, suppliedContext) {
|
|
|
284
452
|
return expected.length === actual.length && crypto_1.default.timingSafeEqual(expected, actual);
|
|
285
453
|
}
|
|
286
454
|
async function verifySolution(token, nonce, options) {
|
|
455
|
+
if (options?.rateLimiter) {
|
|
456
|
+
const allowed = await options.rateLimiter.check(options?.context);
|
|
457
|
+
if (!allowed)
|
|
458
|
+
throw new RateLimitedError('Challenge verification rate limited');
|
|
459
|
+
}
|
|
287
460
|
const tokens = Array.isArray(token) ? token : [token];
|
|
288
461
|
if (tokens.length === 0) {
|
|
289
462
|
return warn('invalid-solution', 'verifySolution requires at least one challenge token', options);
|
|
@@ -315,7 +488,7 @@ async function verifySolution(token, nonce, options) {
|
|
|
315
488
|
if (!currentToken || currentNonce === undefined || currentNonce === null || currentNonce === '') {
|
|
316
489
|
return warn('invalid-solution', 'verifySolution received an empty nonce', options);
|
|
317
490
|
}
|
|
318
|
-
const decoded = jsonwebtoken_1.default.verify(currentToken, getSecret());
|
|
491
|
+
const decoded = jsonwebtoken_1.default.verify(currentToken, getSecret(), { algorithms: ['HS256'] });
|
|
319
492
|
if (!isValidPayload(decoded))
|
|
320
493
|
throw new Error('Invalid challenge token payload');
|
|
321
494
|
const payload = decoded;
|
|
@@ -339,18 +512,24 @@ async function verifySolution(token, nonce, options) {
|
|
|
339
512
|
if (replayStore && jtis.length > 0) {
|
|
340
513
|
const expiresAt = Math.max(...validated.map((payload) => payload.expires));
|
|
341
514
|
let consumed;
|
|
342
|
-
|
|
343
|
-
if (
|
|
344
|
-
|
|
515
|
+
try {
|
|
516
|
+
if (jtis.length > 1) {
|
|
517
|
+
if (!replayStore.consumeMany) {
|
|
518
|
+
return warn('configuration-error', 'A replayStore with consumeMany is required for atomic batch verification', options);
|
|
519
|
+
}
|
|
520
|
+
consumed = await replayStore.consumeMany(jtis, expiresAt);
|
|
521
|
+
}
|
|
522
|
+
else {
|
|
523
|
+
consumed = await replayStore.consume(jtis[0], expiresAt);
|
|
345
524
|
}
|
|
346
|
-
consumed = await replayStore.consumeMany(jtis, expiresAt);
|
|
347
525
|
}
|
|
348
|
-
|
|
349
|
-
|
|
526
|
+
catch (error) {
|
|
527
|
+
return warn('replay-store-unavailable', 'verifySolution failed because the replay store could not be reached', options, error);
|
|
350
528
|
}
|
|
351
529
|
if (!consumed)
|
|
352
530
|
return warn('replay-detected', 'verifySolution rejected a replayed token', options);
|
|
353
531
|
}
|
|
532
|
+
emitEvent(options, { type: 'verify-success' });
|
|
354
533
|
return { valid: true };
|
|
355
534
|
}
|
|
356
535
|
catch (error) {
|