import { type FileEvent, type JsonValue, type PathSpec } from '../../../types.ts'; import type { RedisAccessor } from '../../../accessor/redis.ts'; /** * Map one redis keyspace notification onto mount paths. * * The consumer subscribes to `__keyevent@__:*` (which requires * `notify-keyspace-events` to be configured; it is empty by default) and * forwards the event verb with the key the message carried. * * Two limits are the protocol's, not this hook's, and both are reported * honestly rather than guessed around: * * A `set` on a key that did not exist and one that did produce the same * notification, so a create is reported as an UPDATE. Nothing is lost for a * reader, because the watcher evicts the parent listing for either, but a * consumer that needs the distinction has to pull. * * A rename arrives as two independent messages (`rename_from` with the old * key, `rename_to` with the new), so reconstructing a MOVE would need state * this hook does not keep. They map to a DELETE and an UPDATE, which is what a * poll-diff source reports for a rename too. * * Directories are the third limit, and the coarsest. Every directory on the * mount is one member of a single `dir` set, and a keyspace message * carries the key, never the member, so an external `mkdir` or `rmdir` says * only that some directory changed. An empty directory has no `file:` key at * all, so nothing else reports it. That maps to UNKNOWN at the mount root, * which re-inventories the whole mount: expensive, but it is exactly what * UNKNOWN means and the protocol offers nothing narrower. * * Keys outside those two (the `modified:` and `attrs:` side keys) name nothing * this mount serves and map to nothing. * * Mirrors Python `RedisEventHook` (`core/redis/watch/hook.py`). */ export declare class RedisEventHook { private readonly accessor; constructor(accessor: RedisAccessor); /** Mount-relative path for a redis key, or null if it names no file. */ private relative; toEvents(root: PathSpec, eventType: string, payload: JsonValue): Promise; } //# sourceMappingURL=hook.d.ts.map