Privacy-preserving keystroke biometrics tracker for human verification
npm install @authored/trackerbash
npm install @authored/tracker
`
Quick Start
`typescript
import { KeystrokeTracker } from '@authored/tracker';
const tracker = new KeystrokeTracker({
// Called when events buffer is full or on interval
onFlush: async (events) => {
await fetch('/api/events', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(events)
});
},
// Real-time metrics updates
onMetricsUpdate: (metrics) => {
console.log('WPM:', metrics.wpm);
console.log('Backspace ratio:', metrics.backspaceRatio);
},
// Called when user stops typing
onIdle: (metrics) => {
console.log('User idle, final metrics:', metrics);
}
});
// Start tracking on an element
const editor = document.getElementById('editor');
tracker.start(editor);
// When done
tracker.stop();
`
API
$3
#### Constructor Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| bufferSize | number | 50 | Events to buffer before flush |
| flushInterval | number | 5000 | Auto-flush interval in ms |
| idleTimeout | number | 3000 | Idle detection timeout in ms |
| onFlush | function | - | Callback when events are flushed |
| onMetricsUpdate | function | - | Callback for real-time metrics |
| onIdle | function | - | Callback when user becomes idle |
#### Methods
- start(element: HTMLElement) - Start tracking on an element
- stop() - Stop tracking and flush remaining events
- reset() - Reset all tracking data
- flush() - Manually flush buffered events
- forceFlush() - Async flush with completion wait
- getMetrics() - Get current metrics snapshot
- getBiometricData() - Get complete biometric data for ML
- isActive() - Check if tracker is running
- getBufferSize() - Get current buffer size
$3
`typescript
interface KeystrokeEvent {
type: 'keydown' | 'keyup' | 'paste';
timestamp: number;
keyCategory: KeyCategory;
flightTime?: number;
dwellTime?: number;
// ...
}
interface KeystrokeMetrics {
totalKeystrokes: number;
totalBackspaces: number;
backspaceRatio: number;
avgDwellTime: number;
avgFlightTime: number;
wpm: number;
pauseDistribution: PauseBuckets;
errorPatterns: ErrorPatterns;
}
``