/** * Hash storage: redis_hashes + coordination with redis_keys. * Empty hash removes the key (Section 8.6). * Per-field TTL is tracked in redis_hash_field_ttl (epoch milliseconds); * HSET clears a field's TTL, lazy-expiration prunes stale fields. */ import type Database from './driver.ts'; import type { KeyMeta, KeysStorage } from './keys.ts'; export interface HashWriteOptions { updatedAt?: number; existingMeta?: KeyMeta | null; } export declare function createHashesStorage(db: Database, keys: KeysStorage, options?: { clock?: () => number; }): { get(key: Buffer, field: Buffer): Buffer | null; getAll(key: Buffer): Buffer[]; getAllWithMeta: (key: Buffer) => { values: Buffer[]; hasFieldTtl: boolean; }; scan(key: Buffer, limit: number, offset: number): Buffer[]; set(key: Buffer, field: Buffer, value: Buffer, options?: HashWriteOptions): number; setMultiple(key: Buffer, pairs: Buffer[], options?: HashWriteOptions): number; setIfAbsent(key: Buffer, field: Buffer, value: Buffer, options?: HashWriteOptions): number; delete(key: Buffer, fields: Buffer[], options?: HashWriteOptions): number; count(key: Buffer, options?: HashWriteOptions): number; incr(key: Buffer, field: Buffer, delta: number, options?: HashWriteOptions): number; incrFloat(key: Buffer, field: Buffer, delta: number, options?: HashWriteOptions): Buffer; /** * Per-field expiration set. Returns -2/0/1/2 per HEXPIRE spec. * `condition` is null or one of 'NX','XX','GT','LT'. */ setFieldExpire(key: Buffer, field: Buffer, expiresAtMs: number, { condition }?: { condition?: 'NX' | 'XX' | 'GT' | 'LT' | null; }): number; /** * Returns remaining ms plus whether lazy expiration mutated the hash. */ getFieldTtl(key: Buffer, field: Buffer): { value: number; expired: boolean; }; /** * Returns absolute expiry plus whether lazy expiration mutated the hash. */ getFieldExpireAt(key: Buffer, field: Buffer): { value: number; expired: boolean; }; /** * Clears a field's TTL. Returns 1 if cleared, -1 if no TTL, -2 if field missing. */ persistField(key: Buffer, field: Buffer): number; /** Copy all field/value rows from oldKey to newKey. Caller ensures newKey exists in redis_keys. */ copyKey(oldKey: Buffer, newKey: Buffer): void; }; export type HashesStorage = ReturnType;