/** * @typedef {Object} FingerprintOptions * @property {boolean} [includeIP=false] * @property {boolean} [subnet=false] * @property {boolean} [strict=true] * @property {string} [algorithm='sha256'] */ /** * @typedef {Object} FingerprintInput * @property {string} [ua] * @property {Record} [headers] * @property {string} [ip] */ /** * Create a deterministic fingerprint from request signals. * * Layers: * - **Stable** (always included): browser family, OS family, device type * - **Semi-stable** (included unless `strict: false`): browser major, OS version, Accept-Language * - **Volatile** (opt-in): IP subnet * * import { createFingerprint } from '@exortek/ua/fingerprint'; * * const fp = createFingerprint({ * ua: req.headers['user-agent'], * headers: req.headers, * ip: req.ip, * }); * // → 'fp_a8f3b2c1d4e5f6...' * * @param {FingerprintInput} input * @param {FingerprintOptions} [options] * @returns {string} */ declare function createFingerprint(input: FingerprintInput, options?: FingerprintOptions): string; /** * Create a fingerprint from a request object (Express/Fastify compatible). * * import { fingerprintRequest } from '@exortek/ua/fingerprint'; * * app.use((req, res, next) => { * req.fingerprint = fingerprintRequest(req); * next(); * }); * * @param {Object} req * @param {FingerprintOptions} [options] * @returns {string} */ declare function fingerprintRequest(req: Object, options?: FingerprintOptions): string; type FingerprintOptions = { includeIP?: boolean | undefined; subnet?: boolean | undefined; strict?: boolean | undefined; algorithm?: string | undefined; }; type FingerprintInput = { ua?: string | undefined; headers?: Record | undefined; ip?: string | undefined; }; export { createFingerprint, fingerprintRequest }; export type { FingerprintInput, FingerprintOptions };