@marufme/device-key
Version:
A lightweight, modular TypeScript library for comprehensive device detection, fingerprinting, and information gathering in browsers. Features tree-shakeable modules for OS detection, browser analysis, network info, device fingerprinting, and more.
392 lines (288 loc) • 10.1 kB
Markdown
# @marufme/device-key 🔑
A lightweight, comprehensive device detection and fingerprinting library for modern web applications. Get detailed information about user devices, browsers, operating systems, and generate unique device fingerprints.
[](https://www.npmjs.com/package/@marufme/device-key)
[](https://opensource.org/licenses/MIT)
## ✨ Features
- **🖥️ Device Detection**: Identify device type (Desktop, Mobile, Tablet)
- **🌐 Browser Information**: Get browser name, version, engine, and vendor
- **💻 OS Detection**: Detect operating system name, version, platform, and architecture
- **🔋 Battery Status**: Monitor battery level, charging status, and charging time
- **🌍 Network Info**: Get network connection type, effectiveType, downlink, RTT, and CPU cores
- **🆔 Device Fingerprinting**: Generate unique, stable device identifiers
- **🎨 Canvas & WebGL Fingerprinting**: Canvas and WebGL helpers used for fingerprints
- **🔍 IP Detection & VPN Bypass**: Detect public/real IP, VPN/Proxy, and possible DNS leaks
- **🌍 Localization**: Language preferences, timezone, DST, and optional coordinates
- **📱 Hardware Details**: Screen resolution, pixel ratio, and CPU cores
- **🕵️ Incognito Detection**: Heuristic detection using StorageManager quota
- **🔒 Privacy Aware**: Server-side safe with graceful fallbacks
## 🚀 Installation
```bash
npm install @marufme/device-key
```
```bash
yarn add @marufme/device-key
```
```bash
pnpm add @marufme/device-key
```
## 📖 Quick Start
### Basic Usage
```typescript
import getDeviceInfo from "@marufme/device-key";
// Get comprehensive device information
const deviceInfo = await getDeviceInfo();
console.log(deviceInfo);
```
### Modular Usage
```typescript
import {
getOSInfo,
getBrowserInfo,
getNetworkInfo,
getDeviceInfoBasic,
getDeviceId,
getBatteryInfo,
getUserAgent,
parseUserAgent,
getLocationInfo,
getTimezoneInfo,
getLanguageInfo,
getIPInfo,
generateFingerprint,
getCanvasFingerprint,
getWebGLFingerprint,
detectIncognitoMode,
} from "@marufme/device-key";
// Get specific information
const osInfo = getOSInfo();
const browserInfo = getBrowserInfo();
const networkInfo = getNetworkInfo();
const basicDevice = await getDeviceInfoBasic();
const { deviceId } = await getDeviceId();
const battery = await getBatteryInfo();
const ua = getUserAgent();
const uaParsed = parseUserAgent();
const location = await getLocationInfo();
const tz = getTimezoneInfo();
const lang = getLanguageInfo();
const ipInfo = await getIPInfo();
const fingerprint = await generateFingerprint();
const canvasFp = getCanvasFingerprint();
const webglFp = getWebGLFingerprint();
const isIncognito = await detectIncognitoMode();
```
## 🔧 API Reference
### Main Function
#### `getDeviceInfo(): Promise<Device>`
Returns comprehensive device information including OS, browser, device details, network info, user-agent, location, and incognito status.
```typescript
const deviceInfo = await getDeviceInfo();
// Returns:
// {
// os: { name, version, platform, architecture },
// browser: { name, version, engine, vendor },
// device: {
// deviceId,
// deviceType,
// hardwareConcurrency,
// screen: { width, height, pixelRatio },
// battery: { level, charging, chargingTime }
// },
// network: { connectionType?, effectiveType?, downlink?, rtt?, cores? },
// location: {
// timezone: { timezone, offset, dst },
// language: { current, types, primary },
// coordinates?: GeolocationCoordinates,
// ipInfo?: {
// publicIP,
// realIP?,
// isVPN,
// isProxy,
// isTor,
// country?,
// city?,
// isp?,
// confidence
// }
// },
// userAgent: string,
// incognito: boolean
// }
```
### OS
#### `getOSInfo(): OSInfo`
Detects operating system information.
```typescript
const osInfo = getOSInfo();
// { name, version, platform, architecture }
// Example: { name: "Windows", version: "10", platform: "Win32", architecture: "64-bit" }
```
### Browser
#### `getBrowserInfo(): BrowserInfo`
Detects browser information.
```typescript
const browserInfo = getBrowserInfo();
// { name, version, engine, vendor }
// Example: { name: "Chrome", version: "120.0.0.0", engine: "Blink", vendor: "Google Inc." }
```
#### `detectIncognitoMode(): Promise<boolean>`
Heuristic detection using StorageManager quota (returns true if incognito/private mode likely).
```typescript
const isIncognito = await detectIncognitoMode();
```
### Device
#### `getDeviceInfoBasic(): Promise<DeviceBasicInfo>`
Gets basic device information including screen details and battery status.
```typescript
const info = await getDeviceInfoBasic();
// {
// deviceId,
// deviceType: "Desktop" | "Mobile" | "Tablet",
// hardwareConcurrency,
// screen: { width, height, pixelRatio },
// battery: { level, charging, chargingTime }
// }
```
#### `getDeviceId(): Promise<{ deviceId: string }>`
Generates or retrieves a stable device identifier. On first run in the browser, it generates a fingerprint and stores it in `localStorage` under a small key. On non-browser environments, returns `"server-mode"`.
```typescript
const { deviceId } = await getDeviceId();
```
#### `getBatteryInfo(): Promise<BatteryInfo>`
Gets battery information (where supported).
```typescript
const battery = await getBatteryInfo();
// { level: 0-100, charging: boolean, chargingTime: number | null }
```
### Network
#### `getNetworkInfo(): NetworkInfo`
Gets network connection information and CPU cores where available.
```typescript
const net = getNetworkInfo();
// {
// connectionType?,
// effectiveType?,
// downlink?,
// rtt?,
// cores?
// }
```
### User Agent
#### `getUserAgent(): { userAgent: string }`
Returns the current user agent string.
```typescript
const { userAgent } = getUserAgent();
```
#### `parseUserAgent(): UserAgentInfo`
Lightweight UA parsing helpers.
```typescript
const ua = parseUserAgent();
// { userAgent, isMobile, isTablet, isDesktop, isBot }
```
### Location & Locale
#### `getLocationInfo(): Promise<LocationInfo>`
Aggregates timezone, language, and optional geolocation coordinates (if permitted) and IP information.
```typescript
const loc = await getLocationInfo();
// {
// timezone: { timezone, offset, dst },
// language: { current, types, primary },
// coordinates?: GeolocationCoordinates,
// ipInfo?: IPInfo
// }
```
#### `getTimezoneInfo(): TimezoneInfo`
Gets timezone identifier, UTC offset (minutes east of UTC), and DST flag.
```typescript
const tz = getTimezoneInfo();
// { timezone, offset, dst }
```
#### `getLanguageInfo(): LanguageInfo`
Gets language preferences.
```typescript
const lang = getLanguageInfo();
// { current, types, primary }
```
#### `getIPInfo(): Promise<IPInfo>`
Advanced IP detection with VPN/Proxy insights. Uses WebRTC leak checks, public IP services, and heuristic VPN/Proxy signals.
```typescript
const ip = await getIPInfo();
// {
// publicIP: string,
// realIP?: string,
// isVPN: boolean,
// isProxy: boolean,
// isTor: boolean,
// country?: string,
// city?: string,
// isp?: string,
// confidence: number
// }
```
### Fingerprint
#### `generateFingerprint(): Promise<string>`
Creates a unique device fingerprint using basic info + Canvas + WebGL, hashed with SHA-256.
```typescript
const fp = await generateFingerprint();
```
#### `getCanvasFingerprint(): string`
Generates a canvas-based fingerprint string (data URL).
```typescript
const canvasFp = getCanvasFingerprint();
```
#### `getWebGLFingerprint(): string`
Generates a WebGL-based fingerprint string (vendor::renderer).
```typescript
const webglFp = getWebGLFingerprint();
```
> Note: Low-level helpers like hashing and info collection are internal; only the functions listed above are part of the public API.
## 📱 Device Types
The library automatically detects and categorizes devices:
- **Desktop**: Traditional computers and laptops
- **Mobile**: Smartphones and mobile devices
- **Tablet**: Tablet devices (including iPad)
## 🎯 Use Cases
- **Analytics**: Track device types and capabilities
- **User Experience**: Adapt UI based on device capabilities
- **Security**: Device fingerprinting for fraud detection
- **Performance**: Optimize based on device specifications
- **Debugging**: Collect device information for troubleshooting
- **A/B Testing**: Segment users by device characteristics
## 🔒 Privacy & Security
- **No External APIs**: All detection is done client-side (IP detection may call public IP services)
- **Graceful Fallbacks**: Works even when certain APIs are unavailable
- **Server-Side Safe**: Can run in Node.js environments; returns conservative defaults
- **User Consent**: Geolocation requests are optional and permission-based
## 🌐 Browser Support
- **Modern Browsers**: Chrome 60+, Firefox 55+, Safari 12+, Edge 79+
- **Mobile Browsers**: iOS Safari, Chrome Mobile, Samsung Internet
- **Progressive Enhancement**: Features gracefully degrade on older browsers
## 📦 Bundle Size
- **Minified**: ~15KB
- **Gzipped**: ~5KB
- **Tree-shakeable**: Import only what you need
## 🛠️ Development
```bash
# Clone the repository
git clone https://github.com/maruf-me/device-key.git
# Install dependencies
pnpm install
# Start development server
pnpm dev
# Build the package
pnpm build
# Preview build
pnpm preview
```
## 📄 License
MIT License - see [LICENSE](LICENSE) file for details.
## 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## 📞 Support
- **Issues**: [GitHub Issues](https://github.com/maruf-me/device-key/issues)
- **Documentation**: [GitHub Wiki](https://github.com/maruf-me/device-key/wiki)
- **Author**: [MD Maruf Hossain](https://marufme.com)
## 🔄 Changelog
See [CHANGELOG.md](CHANGELOG.md) for a list of changes and version history.
---
Made with ❤️ by [MD Maruf Hossain](https://marufme.com)