@h-ai/cache 0.1.0-alpha5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +150 -0
- package/dist/index.d.ts +476 -0
- package/dist/index.js +1571 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cache-config.ts","../messages/en-US.json","../messages/zh-CN.json","../src/cache-i18n.ts","../src/cache-types.ts","../src/providers/cache-provider-memory.ts","../src/providers/cache-provider-redis.ts","../src/cache-main.ts"],"names":["core","err","ok","result","logger"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/cache — 错误码 + 配置 Schema\n *\n * 定义缓存模块的错误码常量、Zod Schema 和配置类型。\n * @module cache-config\n */\n\nimport { z } from 'zod'\n\n// ─── 配置 Schema ───\n\n/** Redis 集群节点配置 */\nexport const RedisClusterNodeSchema = z.object({\n /** 节点主机地址 */\n host: z.string(),\n /** 节点端口号(1~65535) */\n port: z.number().int().min(1).max(65535),\n})\n\n/** Redis 集群节点类型 */\nexport type RedisClusterNode = z.infer<typeof RedisClusterNodeSchema>\n\n/** Redis 哨兵模式配置 */\nexport const RedisSentinelConfigSchema = z.object({\n /** 哨兵节点列表(至少 1 个) */\n sentinels: z.array(RedisClusterNodeSchema).min(1),\n /** 哨兵监控的主节点名称 */\n name: z.string(),\n})\n\n/** Redis 哨兵模式配置类型 */\nexport type RedisSentinelConfig = z.infer<typeof RedisSentinelConfigSchema>\n\n/** 内存缓存配置(仅用于开发/测试,不支持跨进程共享) */\nexport const MemoryConfigSchema = z.object({\n type: z.literal('memory'),\n})\n\n/**\n * Redis 缓存配置\n *\n * 连接优先级:url > cluster > sentinel > host\n */\nexport const RedisConfigSchema = z.object({\n type: z.literal('redis'),\n\n // 连接(优先级:url > cluster > sentinel > host)\n /** Redis 连接 URL(如 redis://user:pass@host:6379/0),优先级最高 */\n url: z.string().optional(),\n /** 主机地址;默认 'localhost' */\n host: z.string().default('localhost'),\n /** 端口号;默认 6379 */\n port: z.number().int().min(1).max(65535).default(6379),\n /** 认证密码 */\n password: z.string().optional(),\n /** 数据库编号(0~15);默认 0 */\n db: z.number().int().min(0).max(15).default(0),\n /** 集群节点列表;配置后以集群模式连接 */\n cluster: z.array(RedisClusterNodeSchema).optional(),\n /** 哨兵配置;配置后以哨兵模式连接 */\n sentinel: RedisSentinelConfigSchema.optional(),\n\n // 通用选项\n /** 连接超时时间(毫秒);默认 10000 */\n connectTimeout: z.number().int().min(0).default(10000),\n /** 命令执行超时(毫秒);默认 5000 */\n commandTimeout: z.number().int().min(0).default(5000),\n /** 键前缀(自动加在所有键前) */\n keyPrefix: z.string().optional(),\n /** 是否开启 TLS;默认 false */\n tls: z.boolean().default(false),\n /** 最大重试次数;默认 3 */\n maxRetries: z.number().int().min(0).default(3),\n /** 重试间隔基数(毫秒);实际间隔 = retryDelay × 重试次数;默认 50 */\n retryDelay: z.number().int().min(0).default(50),\n /** 是否只读模式;默认 false */\n readOnly: z.boolean().default(false),\n})\n\n/** 缓存配置 Schema;通过 type 字段区分 memory / redis */\nexport const CacheConfigSchema = z.discriminatedUnion('type', [\n MemoryConfigSchema,\n RedisConfigSchema,\n])\n\n/** 缓存配置类型(Zod parse 后的完整类型,所有默认值已填充) */\nexport type CacheConfig = z.infer<typeof CacheConfigSchema>\n\n/** 缓存配置输入类型(Zod parse 前,允许省略带默认值的字段) */\nexport type CacheConfigInput = z.input<typeof CacheConfigSchema>\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"cache_notInitialized\": \"Cache not initialized, please call cache.init() first\",\n \"cache_operationFailed\": \"Cache operation failed: {error}\",\n \"cache_redisConnectionFailed\": \"Redis connection failed: {error}\",\n \"cache_initFailed\": \"Cache initialization failed: {error}\",\n \"cache_unsupportedType\": \"Unsupported cache type: {type}\",\n \"cache_valueNotNumber\": \"Value is not a number\",\n \"cache_keyNotFound\": \"Key not found\",\n \"cache_indexOutOfRange\": \"Index out of range\",\n \"cache_configError\": \"Cache config validation failed: {error}\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"cache_notInitialized\": \"缓存未初始化,请先调用 cache.init()\",\n \"cache_operationFailed\": \"缓存操作失败:{error}\",\n \"cache_redisConnectionFailed\": \"Redis 连接失败:{error}\",\n \"cache_initFailed\": \"缓存初始化失败:{error}\",\n \"cache_unsupportedType\": \"不支持的缓存类型:{type}\",\n \"cache_valueNotNumber\": \"值不是数字\",\n \"cache_keyNotFound\": \"键不存在\",\n \"cache_indexOutOfRange\": \"索引越界\",\n \"cache_configError\": \"缓存配置校验失败:{error}\"\n}\n","/**\n * @h-ai/cache — i18n\n *\n * 本文件提供缓存模块的 i18n 文案访问入口。\n * @module cache-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\ntype CacheMessageKey = keyof typeof messagesZhCN\n\n/**\n * 缓存模块 i18n 文案获取器\n *\n * @param key - 文案 Key\n * @param options - 插值参数\n * @returns 本地化后的文案字符串\n */\nexport const cacheM = core.i18n.createMessageGetter<CacheMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/cache — 公共类型\n *\n * 定义缓存模块的对外接口类型。\n * @module cache-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport type { CacheConfig, CacheConfigInput } from './cache-config.js'\nimport { core } from '@h-ai/core'\n\nexport type { CacheConfig, CacheConfigInput } from './cache-config.js'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\nconst CacheErrorInfo = {\n CONNECTION_FAILED: '001:500',\n OPERATION_FAILED: '002:500',\n SERIALIZATION_FAILED: '003:500',\n DESERIALIZATION_FAILED: '004:500',\n KEY_NOT_FOUND: '005:404',\n TIMEOUT: '006:504',\n NOT_INITIALIZED: '010:500',\n UNSUPPORTED_TYPE: '011:400',\n CONFIG_ERROR: '012:500',\n} as const satisfies ErrorInfo\n\nexport const HaiCacheError = core.error.buildHaiErrorsDef('cache', CacheErrorInfo)\n\n// ─── 缓存值类型 ───\n\n/**\n * 可缓存的值类型\n *\n * 说明:`object` 包含普通对象与数组;函数、Symbol、BigInt 等不建议直接缓存。\n */\nexport type CacheValue = string | number | boolean | object | null\n\n/** 缓存设置选项 */\nexport interface SetOptions {\n /** 过期时间(秒) */\n ex?: number\n /** 过期时间(毫秒) */\n px?: number\n /** 过期时间点(Unix 时间戳,秒) */\n exat?: number\n /** 过期时间点(Unix 时间戳,毫秒) */\n pxat?: number\n /** 仅在键不存在时设置 */\n nx?: boolean\n /** 仅在键存在时设置 */\n xx?: boolean\n /** 保留原有的 TTL(与 ex/px/exat/pxat 互斥,冲突时以后端实现行为为准) */\n keepTtl?: boolean\n}\n\n/** 扫描选项 */\nexport interface ScanOptions {\n /** 匹配模式 */\n match?: string\n /** 每次扫描数量 */\n count?: number\n}\n\n/** 有序集合成员(score + member 对) */\nexport interface ZMember {\n /** 分数,用于排序 */\n score: number\n /** 成员标识 */\n member: string\n}\n\n// ─── KV 操作接口 ───\n\n/**\n * 基础键值操作接口\n *\n * @example\n * ```ts\n * await cache.kv.set('key', { name: '张三' }, { ex: 3600 })\n * const result = await cache.kv.get<{ name: string }>('key')\n * ```\n */\nexport interface KvOperations {\n /** 获取值;键不存在时返回 null */\n get: <T = CacheValue>(key: string) => Promise<HaiResult<T | null>>\n /** 设置值;可通过 options 控制过期时间、NX/XX 条件等 */\n set: (key: string, value: CacheValue, options?: SetOptions) => Promise<HaiResult<void>>\n /** 删除一个或多个键;返回实际删除的数量 */\n del: (...keys: string[]) => Promise<HaiResult<number>>\n /** 检查一个或多个键是否存在;返回存在的数量 */\n exists: (...keys: string[]) => Promise<HaiResult<number>>\n /** 设置过期时间(秒) */\n expire: (key: string, seconds: number) => Promise<HaiResult<boolean>>\n /** 设置过期时间点(Unix 时间戳,秒) */\n expireAt: (key: string, timestamp: number) => Promise<HaiResult<boolean>>\n /** 获取剩余过期时间(秒);-1 永不过期,-2 不存在 */\n ttl: (key: string) => Promise<HaiResult<number>>\n /** 移除过期时间 */\n persist: (key: string) => Promise<HaiResult<boolean>>\n /** 自增 1;键不存在时从 0 开始;值非数字时返回 OPERATION_FAILED */\n incr: (key: string) => Promise<HaiResult<number>>\n /** 自增指定值;键不存在时从 0 开始 */\n incrBy: (key: string, increment: number) => Promise<HaiResult<number>>\n /** 自减 1;键不存在时从 0 开始 */\n decr: (key: string) => Promise<HaiResult<number>>\n /** 自减指定值;键不存在时从 0 开始 */\n decrBy: (key: string, decrement: number) => Promise<HaiResult<number>>\n /** 批量获取;不存在的键对应位置返回 null */\n mget: <T = CacheValue>(...keys: string[]) => Promise<HaiResult<(T | null)[]>>\n /** 批量设置键值对 */\n mset: (entries: Array<[string, CacheValue]>) => Promise<HaiResult<void>>\n /** 游标扫描键;返回 [下一游标, 匹配的键列表],游标为 0 时表示遍历完成 */\n scan: (cursor: number, options?: ScanOptions) => Promise<HaiResult<[number, string[]]>>\n /** 获取匹配模式的所有键(慎用,生产环境请用 scan 迭代) */\n keys: (pattern: string) => Promise<HaiResult<string[]>>\n /** 获取键的数据类型;不存在时返回 \"none\" */\n type: (key: string) => Promise<HaiResult<string>>\n}\n\n// ─── Hash 操作接口 ───\n\n/**\n * Hash 操作接口\n *\n * @example\n * ```ts\n * await cache.hash.hset('user:1', { name: '张三', age: 25 })\n * const name = await cache.hash.hget<string>('user:1', 'name')\n * ```\n */\nexport interface HashOperations {\n /** 获取字段值;字段不存在时返回 null */\n hget: <T = CacheValue>(key: string, field: string) => Promise<HaiResult<T | null>>\n /** 设置字段值(单字段或批量);返回新增的字段数(已存在的字段不计入) */\n hset: ((key: string, field: string, value: CacheValue) => Promise<HaiResult<number>>) & ((key: string, data: Record<string, CacheValue>) => Promise<HaiResult<number>>)\n /** 删除字段 */\n hdel: (key: string, ...fields: string[]) => Promise<HaiResult<number>>\n /** 检查字段是否存在 */\n hexists: (key: string, field: string) => Promise<HaiResult<boolean>>\n /** 获取所有字段和值;键不存在时返回空对象 */\n hgetall: <T = Record<string, CacheValue>>(key: string) => Promise<HaiResult<T>>\n /** 获取所有字段名;键不存在时返回空数组 */\n hkeys: (key: string) => Promise<HaiResult<string[]>>\n /** 获取所有字段值;键不存在时返回空数组 */\n hvals: <T = CacheValue>(key: string) => Promise<HaiResult<T[]>>\n /** 获取字段数量;键不存在时返回 0 */\n hlen: (key: string) => Promise<HaiResult<number>>\n /** 批量获取字段值;不存在的字段对应位置返回 null */\n hmget: <T = CacheValue>(key: string, ...fields: string[]) => Promise<HaiResult<(T | null)[]>>\n /** 字段自增;字段不存在时从 0 开始 */\n hincrBy: (key: string, field: string, increment: number) => Promise<HaiResult<number>>\n}\n\n// ─── List 操作接口 ───\n\n/**\n * List 操作接口\n *\n * @example\n * ```ts\n * await cache.list.lpush('queue', 'task1', 'task2')\n * const item = await cache.list.rpop<string>('queue')\n * ```\n */\nexport interface ListOperations {\n /** 从左侧推入 */\n lpush: (key: string, ...values: CacheValue[]) => Promise<HaiResult<number>>\n /** 从右侧推入 */\n rpush: (key: string, ...values: CacheValue[]) => Promise<HaiResult<number>>\n /** 从左侧弹出 */\n lpop: <T = CacheValue>(key: string) => Promise<HaiResult<T | null>>\n /** 从右侧弹出 */\n rpop: <T = CacheValue>(key: string) => Promise<HaiResult<T | null>>\n /** 获取列表长度 */\n llen: (key: string) => Promise<HaiResult<number>>\n /** 获取指定范围的元素;支持负索引(-1 为最后一个);键不存在时返回空数组 */\n lrange: <T = CacheValue>(key: string, start: number, stop: number) => Promise<HaiResult<T[]>>\n /** 获取指定索引的元素;支持负索引;不存在时返回 null */\n lindex: <T = CacheValue>(key: string, index: number) => Promise<HaiResult<T | null>>\n /** 设置指定索引的元素;键不存在或索引越界时返回错误 */\n lset: (key: string, index: number, value: CacheValue) => Promise<HaiResult<void>>\n /** 保留指定范围的元素,范围外的元素被删除 */\n ltrim: (key: string, start: number, stop: number) => Promise<HaiResult<void>>\n /** 阻塞式从左侧弹出;返回 [key, value] 或超时返回 null。memory 实现为非阻塞立即返回。 */\n blpop: <T = CacheValue>(timeout: number, ...keys: string[]) => Promise<HaiResult<[string, T] | null>>\n /** 阻塞式从右侧弹出;返回 [key, value] 或超时返回 null。memory 实现为非阻塞立即返回。 */\n brpop: <T = CacheValue>(timeout: number, ...keys: string[]) => Promise<HaiResult<[string, T] | null>>\n}\n\n// ─── Set 操作接口 ───\n\n/**\n * Set 操作接口\n *\n * @example\n * ```ts\n * await cache.set_.sadd('tags', 'redis', 'cache')\n * const members = await cache.set_.smembers<string>('tags')\n * ```\n */\nexport interface SetOperations {\n /** 添加成员;返回新增的成员数(已存在的不计入) */\n sadd: (key: string, ...members: CacheValue[]) => Promise<HaiResult<number>>\n /** 移除成员;返回实际移除的数量 */\n srem: (key: string, ...members: CacheValue[]) => Promise<HaiResult<number>>\n /** 获取所有成员;键不存在时返回空数组 */\n smembers: <T = CacheValue>(key: string) => Promise<HaiResult<T[]>>\n /** 检查是否为集合成员 */\n sismember: (key: string, member: CacheValue) => Promise<HaiResult<boolean>>\n /** 获取成员数量;键不存在时返回 0 */\n scard: (key: string) => Promise<HaiResult<number>>\n /** 随机获取成员;不指定 count 返回单个值,指定 count 返回数组;空集合返回 null */\n srandmember: <T = CacheValue>(key: string, count?: number) => Promise<HaiResult<T | T[] | null>>\n /** 随机弹出成员(会从集合中移除);不指定 count 返回单个值,指定 count 返回数组;空集合返回 null */\n spop: <T = CacheValue>(key: string, count?: number) => Promise<HaiResult<T | T[] | null>>\n /** 集合交集;任一 key 不存在时返回空数组 */\n sinter: <T = CacheValue>(...keys: string[]) => Promise<HaiResult<T[]>>\n /** 集合并集 */\n sunion: <T = CacheValue>(...keys: string[]) => Promise<HaiResult<T[]>>\n /** 集合差集(第一个集合减去其余集合) */\n sdiff: <T = CacheValue>(...keys: string[]) => Promise<HaiResult<T[]>>\n}\n\n// ─── SortedSet 操作接口 ───\n\n/**\n * 有序集合操作接口\n *\n * @example\n * ```ts\n * await cache.zset.zadd('rank', { score: 100, member: 'player1' })\n * const top = await cache.zset.zrevrange('rank', 0, 9, true)\n * ```\n */\nexport interface ZSetOperations {\n /** 添加成员;已存在的成员只更新分数不计入新增数;返回新增的成员数 */\n zadd: (key: string, ...members: ZMember[]) => Promise<HaiResult<number>>\n /** 移除成员;返回实际移除的数量 */\n zrem: (key: string, ...members: string[]) => Promise<HaiResult<number>>\n /** 获取成员分数;成员不存在时返回 null */\n zscore: (key: string, member: string) => Promise<HaiResult<number | null>>\n /** 获取成员升序排名(0-based);成员不存在时返回 null */\n zrank: (key: string, member: string) => Promise<HaiResult<number | null>>\n /** 获取成员降序排名(0-based);成员不存在时返回 null */\n zrevrank: (key: string, member: string) => Promise<HaiResult<number | null>>\n /** 获取指定排名范围的成员(升序);withScores=true 时返回 ZMember[];键不存在时返回空数组 */\n zrange: (key: string, start: number, stop: number, withScores?: boolean) => Promise<HaiResult<string[] | ZMember[]>>\n /** 获取指定排名范围的成员(降序);withScores=true 时返回 ZMember[] */\n zrevrange: (key: string, start: number, stop: number, withScores?: boolean) => Promise<HaiResult<string[] | ZMember[]>>\n /** 获取指定分数范围的成员;min/max 支持 '-inf'/'+inf';可通过 offset/count 分页 */\n zrangeByScore: (\n key: string,\n min: number | string,\n max: number | string,\n options?: { withScores?: boolean, offset?: number, count?: number },\n ) => Promise<HaiResult<string[] | ZMember[]>>\n /** 获取成员数量;键不存在时返回 0 */\n zcard: (key: string) => Promise<HaiResult<number>>\n /** 获取指定分数范围内的成员数量;min/max 支持 '-inf'/'+inf' */\n zcount: (key: string, min: number | string, max: number | string) => Promise<HaiResult<number>>\n /** 增加成员分数;成员不存在时以 0 为初始值;返回更新后的分数 */\n zincrBy: (key: string, increment: number, member: string) => Promise<HaiResult<number>>\n /** 移除指定排名范围的成员;返回实际移除的数量 */\n zremRangeByRank: (key: string, start: number, stop: number) => Promise<HaiResult<number>>\n /** 移除指定分数范围的成员;返回实际移除的数量 */\n zremRangeByScore: (key: string, min: number | string, max: number | string) => Promise<HaiResult<number>>\n}\n\n// ─── 分布式锁操作接口 ───\n\n/**\n * 分布式锁操作接口\n *\n * 基于 SET NX EX 模式实现分布式互斥锁,适用于多节点部署场景。\n *\n * @example\n * ```ts\n * const acquired = await cache.lock.acquire('my-lock', { ttl: 30 })\n * if (acquired.success && acquired.data) {\n * try {\n * // 执行受保护操作\n * } finally {\n * await cache.lock.release('my-lock')\n * }\n * }\n * ```\n */\nexport interface LockOperations {\n /**\n * 尝试获取分布式锁\n *\n * 通过 SET NX EX 原子操作实现。获锁成功返回 true,锁已被持有返回 false。\n *\n * @param key - 锁键名\n * @param options - 锁选项\n * @returns true 表示获锁成功,false 表示锁已被其他持有者持有\n */\n acquire: (key: string, options?: LockOptions) => Promise<HaiResult<boolean>>\n\n /**\n * 释放分布式锁\n *\n * 仅当锁由当前持有者持有时才释放(通过 owner 比对),防止误释放他人的锁。\n *\n * @param key - 锁键名\n * @param owner - 锁持有者标识(须与 acquire 时一致);未传则强制释放\n * @returns true 表示释放成功,false 表示锁不存在或非当前持有者\n */\n release: (key: string, owner?: string) => Promise<HaiResult<boolean>>\n\n /**\n * 检查锁是否被持有\n *\n * @param key - 锁键名\n * @returns true 表示锁存在且未过期\n */\n isLocked: (key: string) => Promise<HaiResult<boolean>>\n\n /**\n * 续期锁的过期时间\n *\n * 仅当锁由当前持有者持有时才续期。\n *\n * @param key - 锁键名\n * @param ttl - 新的过期时间(秒)\n * @param owner - 锁持有者标识;未传则直接续期\n * @returns true 表示续期成功,false 表示锁不存在或非当前持有者\n */\n extend: (key: string, ttl: number, owner?: string) => Promise<HaiResult<boolean>>\n}\n\n/** 分布式锁选项 */\nexport interface LockOptions {\n /** 锁过期时间(秒);默认 30 */\n ttl?: number\n /** 锁持有者标识;默认 'default'(多节点部署时建议设置固定值以便审计) */\n owner?: string\n}\n\n// ─── 复合操作接口 ───\n\n/**\n * 复合缓存操作接口,聚合所有数据结构的操作子接口\n *\n * 通过 `cache.kv` / `cache.hash` / `cache.list` / `cache.set_` / `cache.zset` / `cache.lock` 分别访问\n */\nexport interface CacheCompositeOperations {\n /** KV 操作 */\n readonly kv: KvOperations\n /** Hash 操作 */\n readonly hash: HashOperations\n /** List 操作 */\n readonly list: ListOperations\n /** Set 操作 */\n readonly set_: SetOperations\n /** SortedSet 操作 */\n readonly zset: ZSetOperations\n /** 分布式锁操作 */\n readonly lock: LockOperations\n /** 测试连接 */\n ping: () => Promise<HaiResult<string>>\n}\n\n// ─── 函数接口 ───\n\n/**\n * 缓存函数接口\n *\n * @example\n * ```ts\n * import { cache } from '@h-ai/cache'\n *\n * await cache.init({ type: 'redis', host: 'localhost' })\n * await cache.kv.set('key', 'value', { ex: 3600 })\n * const result = await cache.kv.get('key')\n * await cache.close()\n * ```\n */\nexport interface CacheFunctions extends CacheCompositeOperations {\n /** 初始化缓存连接;会先关闭已有连接再以新配置重新初始化 */\n init: (config: CacheConfigInput) => Promise<HaiResult<void>>\n /** 当前配置(parse 后);未初始化时为 null */\n readonly config: CacheConfig | null\n /** 是否已初始化并连接 */\n readonly isInitialized: boolean\n /** 关闭连接并清理资源;未初始化时调用安全无副作用 */\n close: () => Promise<void>\n}\n\n// ─── Provider 接口 ───\n\n/**\n * 缓存 Provider 接口\n *\n * 由具体实现(memory / redis)提供;上层通过 cache-main 统一管理生命周期。\n * 此接口仅供模块内部使用,消费者请使用 {@link CacheFunctions}。\n *\n * @internal\n */\nexport interface CacheProvider extends CacheCompositeOperations {\n /** Provider 名称(如 'memory' / 'redis') */\n readonly name: string\n /** 连接缓存服务;config 已经过 Zod Schema 校验 */\n connect: (config: CacheConfig) => Promise<HaiResult<void>>\n /** 关闭连接并释放资源 */\n close: () => Promise<void>\n /** 是否处于已连接状态 */\n isConnected: () => boolean\n}\n","/**\n * @h-ai/cache — 内存 Provider\n *\n * 基于 Map 的内存缓存实现,适用于开发与测试环境。\n * @module cache-provider-memory\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { CacheConfig, CacheProvider, CacheValue, HashOperations, KvOperations, ListOperations, LockOperations, LockOptions, ScanOptions, SetOperations, SetOptions, ZMember, ZSetOperations } from '../cache-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { cacheM } from '../cache-i18n.js'\nimport {\n\n HaiCacheError,\n\n} from '../cache-types.js'\n\n// ─── 内部类型 ───\n\n/** KV 存储项(包含值和可选的过期时间戳) */\ninterface CacheEntry {\n /** 缓存值 */\n value: CacheValue\n /** 过期时间戳(毫秒);省略表示永不过期 */\n expiresAt?: number\n}\n\n// ─── 辅助函数 ───\n\n/**\n * 序列化值为 JSON 字符串\n *\n * 所有类型(包括 string)都经 JSON.stringify,以保证反序列化时类型一致\n */\nfunction serializeValue(value: CacheValue): string {\n return JSON.stringify(value)\n}\n\n/**\n * 反序列化 JSON 字符串为值\n *\n * @param str - JSON.stringify 产生的字符串\n */\nfunction deserializeValue(str: string): CacheValue {\n return JSON.parse(str)\n}\n\n/**\n * 将 glob 通配符模式转为安全的正则表达式\n *\n * 先转义所有正则特殊字符,再将 `*` → `.*`、`?` → `.` 还原。\n * 避免用户输入中的正则元字符导致 ReDoS。\n *\n * @param pattern - glob 风格的通配符(仅支持 `*` 和 `?`)\n * @returns 匹配整个字符串的正则表达式\n */\nfunction globToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const regexStr = escaped.replace(/\\\\\\*/g, '.*').replace(/\\\\\\?/g, '.')\n return new RegExp(`^${regexStr}$`)\n}\n\n// ─── Memory Provider ───\n\n/**\n * 创建 Memory Provider 实例\n *\n * 基于 Map/Set 的纯内存实现,支持 KV/Hash/List/Set/ZSet 全部操作。\n * 适用于开发和测试环境,不支持跨进程共享。\n * close() 后所有数据清空。\n *\n * @returns CacheProvider 实例\n */\nexport function createMemoryProvider(): CacheProvider {\n /** KV 存储(带过期时间) */\n const store = new Map<string, CacheEntry>()\n /** Hash 存储:key → { field → serialized-value } */\n const hashStore = new Map<string, Map<string, string>>()\n /** List 存储:key → serialized-value[] */\n const listStore = new Map<string, string[]>()\n /** Set 存储:key → Set<serialized-value> */\n const setStore = new Map<string, Set<string>>()\n /** ZSet 存储:key → { member → score } */\n const zsetStore = new Map<string, Map<string, number>>()\n\n let connected = false\n /** 定期清理过期 KV 数据的定时器;间隔 60s */\n let cleanupTimer: ReturnType<typeof setInterval> | null = null\n\n /**\n * 判断缓存项是否过期\n *\n * @param entry - 缓存项\n * @returns 未设置 expiresAt 视为永不过期,返回 false\n */\n function isExpired(entry: CacheEntry): boolean {\n return entry.expiresAt != null && Date.now() > entry.expiresAt\n }\n\n /** 定期清理 store 中的所有过期 KV 项 */\n function cleanup(): void {\n const now = Date.now()\n for (const [key, entry] of store.entries()) {\n if (entry.expiresAt && entry.expiresAt < now) {\n store.delete(key)\n }\n }\n }\n\n /**\n * 获取有效的缓存项\n *\n * 如果项已过期则立即从 store 中删除并返回 null(懒删除策略)\n *\n * @param key - 缓存键\n * @returns 有效的缓存项,或 null\n */\n function getValidEntry(key: string): CacheEntry | null {\n const entry = store.get(key)\n if (!entry)\n return null\n if (isExpired(entry)) {\n store.delete(key)\n return null\n }\n return entry\n }\n\n /**\n * 根据 SetOptions 计算过期时间戳\n *\n * 优先级:ex > px > exat > pxat,均未指定时返回 undefined(永不过期)\n *\n * @param options - 设置选项\n * @returns 过期时间戳(毫秒),或 undefined\n */\n function calculateExpiry(options?: SetOptions): number | undefined {\n if (!options)\n return undefined\n const now = Date.now()\n if (options.ex)\n return now + options.ex * 1000\n if (options.px)\n return now + options.px\n if (options.exat)\n return options.exat * 1000\n if (options.pxat)\n return options.pxat\n return undefined\n }\n\n // ─── KV 操作 ───\n\n const kv: KvOperations = {\n async get<T = CacheValue>(key: string): Promise<HaiResult<T | null>> {\n const entry = getValidEntry(key)\n return ok(entry ? (entry.value as T) : null)\n },\n\n async set(key: string, value: CacheValue, options?: SetOptions): Promise<HaiResult<void>> {\n const existing = getValidEntry(key) !== null\n if (options?.nx && existing)\n return ok(undefined)\n if (options?.xx && !existing)\n return ok(undefined)\n\n const currentEntry = getValidEntry(key)\n const expiresAt = options?.keepTtl && currentEntry ? currentEntry.expiresAt : calculateExpiry(options)\n store.set(key, { value, expiresAt })\n return ok(undefined)\n },\n\n async del(...keys: string[]): Promise<HaiResult<number>> {\n let count = 0\n for (const key of keys) {\n if (store.delete(key))\n count++\n hashStore.delete(key)\n listStore.delete(key)\n setStore.delete(key)\n zsetStore.delete(key)\n }\n return ok(count)\n },\n\n async exists(...keys: string[]): Promise<HaiResult<number>> {\n let count = 0\n for (const key of keys) {\n if (getValidEntry(key))\n count++\n }\n return ok(count)\n },\n\n async expire(key: string, seconds: number): Promise<HaiResult<boolean>> {\n const entry = getValidEntry(key)\n if (!entry)\n return ok(false)\n entry.expiresAt = Date.now() + seconds * 1000\n return ok(true)\n },\n\n async expireAt(key: string, timestamp: number): Promise<HaiResult<boolean>> {\n const entry = getValidEntry(key)\n if (!entry)\n return ok(false)\n entry.expiresAt = timestamp * 1000\n return ok(true)\n },\n\n async ttl(key: string): Promise<HaiResult<number>> {\n const entry = store.get(key)\n if (!entry)\n return ok(-2)\n if (!entry.expiresAt)\n return ok(-1)\n if (isExpired(entry)) {\n store.delete(key)\n return ok(-2)\n }\n return ok(Math.ceil((entry.expiresAt - Date.now()) / 1000))\n },\n\n async persist(key: string): Promise<HaiResult<boolean>> {\n const entry = getValidEntry(key)\n if (!entry)\n return ok(false)\n delete entry.expiresAt\n return ok(true)\n },\n\n async incr(key: string): Promise<HaiResult<number>> {\n const entry = getValidEntry(key)\n const current = entry ? Number(entry.value) : 0\n if (Number.isNaN(current)) {\n return err(HaiCacheError.OPERATION_FAILED, cacheM('cache_valueNotNumber'))\n }\n const newValue = current + 1\n store.set(key, { value: newValue, expiresAt: entry?.expiresAt })\n return ok(newValue)\n },\n\n async incrBy(key: string, increment: number): Promise<HaiResult<number>> {\n const entry = getValidEntry(key)\n const current = entry ? Number(entry.value) : 0\n if (Number.isNaN(current)) {\n return err(HaiCacheError.OPERATION_FAILED, cacheM('cache_valueNotNumber'))\n }\n const newValue = current + increment\n store.set(key, { value: newValue, expiresAt: entry?.expiresAt })\n return ok(newValue)\n },\n\n async decr(key: string): Promise<HaiResult<number>> {\n return kv.incrBy(key, -1)\n },\n\n async decrBy(key: string, decrement: number): Promise<HaiResult<number>> {\n return kv.incrBy(key, -decrement)\n },\n\n async mget<T = CacheValue>(...keys: string[]): Promise<HaiResult<(T | null)[]>> {\n const results: (T | null)[] = []\n for (const key of keys) {\n const entry = getValidEntry(key)\n results.push(entry ? (entry.value as T) : null)\n }\n return ok(results)\n },\n\n async mset(entries: Array<[string, CacheValue]>): Promise<HaiResult<void>> {\n for (const [key, value] of entries) {\n store.set(key, { value })\n }\n return ok(undefined)\n },\n\n async scan(cursor: number, options?: ScanOptions): Promise<HaiResult<[number, string[]]>> {\n const allKeys = Array.from(store.keys()).filter((key) => {\n const entry = store.get(key)\n return entry && !isExpired(entry)\n })\n const regex = options?.match ? globToRegex(options.match) : null\n const filtered = regex ? allKeys.filter(k => regex.test(k)) : allKeys\n const count = options?.count || 10\n const start = cursor\n const end = Math.min(start + count, filtered.length)\n const keys = filtered.slice(start, end)\n const nextCursor = end >= filtered.length ? 0 : end\n return ok([nextCursor, keys])\n },\n\n async keys(pattern: string): Promise<HaiResult<string[]>> {\n const regex = globToRegex(pattern)\n const result: string[] = []\n for (const [key] of store.entries()) {\n if (regex.test(key) && getValidEntry(key)) {\n result.push(key)\n }\n }\n return ok(result)\n },\n\n async type(key: string): Promise<HaiResult<string>> {\n if (getValidEntry(key))\n return ok('string')\n if (hashStore.has(key))\n return ok('hash')\n if (listStore.has(key))\n return ok('list')\n if (setStore.has(key))\n return ok('set')\n if (zsetStore.has(key))\n return ok('zset')\n return ok('none')\n },\n }\n\n // ─── Hash 操作 ───\n\n const hash: HashOperations = {\n async hget<T = CacheValue>(key: string, field: string): Promise<HaiResult<T | null>> {\n const map = hashStore.get(key)\n if (!map)\n return ok(null)\n const val = map.get(field)\n return ok(val !== undefined ? (deserializeValue(val) as T) : null)\n },\n\n hset: (async (key: string, fieldOrData: string | Record<string, CacheValue>, value?: CacheValue): Promise<HaiResult<number>> => {\n let map = hashStore.get(key)\n if (!map) {\n map = new Map()\n hashStore.set(key, map)\n }\n if (typeof fieldOrData === 'string') {\n const existed = map.has(fieldOrData)\n map.set(fieldOrData, serializeValue(value!))\n return ok(existed ? 0 : 1)\n }\n let count = 0\n for (const [f, v] of Object.entries(fieldOrData)) {\n if (!map.has(f))\n count++\n map.set(f, serializeValue(v))\n }\n return ok(count)\n }) as HashOperations['hset'],\n\n async hdel(key: string, ...fields: string[]): Promise<HaiResult<number>> {\n const map = hashStore.get(key)\n if (!map)\n return ok(0)\n let count = 0\n for (const field of fields) {\n if (map.delete(field))\n count++\n }\n return ok(count)\n },\n\n async hexists(key: string, field: string): Promise<HaiResult<boolean>> {\n const map = hashStore.get(key)\n return ok(map?.has(field) ?? false)\n },\n\n async hgetall<T = Record<string, CacheValue>>(key: string): Promise<HaiResult<T>> {\n const map = hashStore.get(key)\n if (!map)\n return ok({} as T)\n const result: Record<string, CacheValue> = {}\n for (const [f, v] of map.entries()) {\n result[f] = deserializeValue(v)\n }\n return ok(result as T)\n },\n\n async hkeys(key: string): Promise<HaiResult<string[]>> {\n const map = hashStore.get(key)\n return ok(map ? Array.from(map.keys()) : [])\n },\n\n async hvals<T = CacheValue>(key: string): Promise<HaiResult<T[]>> {\n const map = hashStore.get(key)\n if (!map)\n return ok([])\n return ok(Array.from(map.values()).map(v => deserializeValue(v) as T))\n },\n\n async hlen(key: string): Promise<HaiResult<number>> {\n const map = hashStore.get(key)\n return ok(map?.size ?? 0)\n },\n\n async hmget<T = CacheValue>(key: string, ...fields: string[]): Promise<HaiResult<(T | null)[]>> {\n const map = hashStore.get(key)\n const results: (T | null)[] = fields.map((field) => {\n const val = map?.get(field)\n return val !== undefined ? (deserializeValue(val) as T) : null\n })\n return ok(results)\n },\n\n async hincrBy(key: string, field: string, increment: number): Promise<HaiResult<number>> {\n let map = hashStore.get(key)\n if (!map) {\n map = new Map()\n hashStore.set(key, map)\n }\n const current = map.has(field) ? Number(deserializeValue(map.get(field)!)) : 0\n const newValue = current + increment\n map.set(field, serializeValue(newValue))\n return ok(newValue)\n },\n }\n\n // ─── List 操作 ───\n\n const list: ListOperations = {\n async lpush(key: string, ...values: CacheValue[]): Promise<HaiResult<number>> {\n let arr = listStore.get(key)\n if (!arr) {\n arr = []\n listStore.set(key, arr)\n }\n // 逐个从左侧推入,匹配 Redis LPUSH 行为(多值时结果顺序为输入的逆序)\n for (const value of values) {\n arr.unshift(serializeValue(value))\n }\n return ok(arr.length)\n },\n\n async rpush(key: string, ...values: CacheValue[]): Promise<HaiResult<number>> {\n let arr = listStore.get(key)\n if (!arr) {\n arr = []\n listStore.set(key, arr)\n }\n arr.push(...values.map(serializeValue))\n return ok(arr.length)\n },\n\n async lpop<T = CacheValue>(key: string): Promise<HaiResult<T | null>> {\n const arr = listStore.get(key)\n if (!arr || arr.length === 0)\n return ok(null)\n const val = arr.shift()!\n return ok(deserializeValue(val) as T)\n },\n\n async rpop<T = CacheValue>(key: string): Promise<HaiResult<T | null>> {\n const arr = listStore.get(key)\n if (!arr || arr.length === 0)\n return ok(null)\n const val = arr.pop()!\n return ok(deserializeValue(val) as T)\n },\n\n async llen(key: string): Promise<HaiResult<number>> {\n const arr = listStore.get(key)\n return ok(arr?.length ?? 0)\n },\n\n async lrange<T = CacheValue>(key: string, start: number, stop: number): Promise<HaiResult<T[]>> {\n const arr = listStore.get(key)\n if (!arr)\n return ok([])\n const len = arr.length\n const s = start < 0 ? Math.max(len + start, 0) : start\n const e = stop < 0 ? len + stop + 1 : stop + 1\n return ok(arr.slice(s, e).map(v => deserializeValue(v) as T))\n },\n\n async lindex<T = CacheValue>(key: string, index: number): Promise<HaiResult<T | null>> {\n const arr = listStore.get(key)\n if (!arr)\n return ok(null)\n const i = index < 0 ? arr.length + index : index\n const val = arr[i]\n return ok(val !== undefined ? (deserializeValue(val) as T) : null)\n },\n\n async lset(key: string, index: number, value: CacheValue): Promise<HaiResult<void>> {\n const arr = listStore.get(key)\n if (!arr) {\n return err(HaiCacheError.KEY_NOT_FOUND, cacheM('cache_keyNotFound'))\n }\n const i = index < 0 ? arr.length + index : index\n if (i < 0 || i >= arr.length) {\n return err(HaiCacheError.OPERATION_FAILED, cacheM('cache_indexOutOfRange'))\n }\n arr[i] = serializeValue(value)\n return ok(undefined)\n },\n\n async ltrim(key: string, start: number, stop: number): Promise<HaiResult<void>> {\n const arr = listStore.get(key)\n if (!arr)\n return ok(undefined)\n const len = arr.length\n const s = start < 0 ? Math.max(len + start, 0) : start\n const e = stop < 0 ? len + stop + 1 : stop + 1\n listStore.set(key, arr.slice(s, e))\n return ok(undefined)\n },\n\n /**\n * Memory 版本的 blpop 为“非阻塞模拟”:忽略 timeout,立即按 keys 顺序尝试弹出。\n */\n async blpop<T = CacheValue>(_timeout: number, ...keys: string[]): Promise<HaiResult<[string, T] | null>> {\n for (const key of keys) {\n const arr = listStore.get(key)\n if (arr && arr.length > 0) {\n const val = arr.shift()!\n return ok([key, deserializeValue(val) as T])\n }\n }\n return ok(null)\n },\n\n /**\n * Memory 版本的 brpop 为“非阻塞模拟”:忽略 timeout,立即按 keys 顺序尝试弹出。\n */\n async brpop<T = CacheValue>(_timeout: number, ...keys: string[]): Promise<HaiResult<[string, T] | null>> {\n for (const key of keys) {\n const arr = listStore.get(key)\n if (arr && arr.length > 0) {\n const val = arr.pop()!\n return ok([key, deserializeValue(val) as T])\n }\n }\n return ok(null)\n },\n }\n\n // ─── Set 操作 ───\n\n const set_: SetOperations = {\n async sadd(key: string, ...members: CacheValue[]): Promise<HaiResult<number>> {\n let s = setStore.get(key)\n if (!s) {\n s = new Set()\n setStore.set(key, s)\n }\n let count = 0\n for (const member of members) {\n const str = serializeValue(member)\n if (!s.has(str)) {\n s.add(str)\n count++\n }\n }\n return ok(count)\n },\n\n async srem(key: string, ...members: CacheValue[]): Promise<HaiResult<number>> {\n const s = setStore.get(key)\n if (!s)\n return ok(0)\n let count = 0\n for (const member of members) {\n if (s.delete(serializeValue(member)))\n count++\n }\n return ok(count)\n },\n\n async smembers<T = CacheValue>(key: string): Promise<HaiResult<T[]>> {\n const s = setStore.get(key)\n if (!s)\n return ok([])\n return ok(Array.from(s).map(v => deserializeValue(v) as T))\n },\n\n async sismember(key: string, member: CacheValue): Promise<HaiResult<boolean>> {\n const s = setStore.get(key)\n return ok(s?.has(serializeValue(member)) ?? false)\n },\n\n async scard(key: string): Promise<HaiResult<number>> {\n const s = setStore.get(key)\n return ok(s?.size ?? 0)\n },\n\n async srandmember<T = CacheValue>(key: string, count?: number): Promise<HaiResult<T | T[] | null>> {\n const s = setStore.get(key)\n if (!s || s.size === 0)\n return ok(null)\n const arr = Array.from(s)\n if (count === undefined) {\n const idx = Math.floor(Math.random() * arr.length)\n return ok(deserializeValue(arr[idx]) as T)\n }\n const result: T[] = []\n for (let i = 0; i < Math.min(Math.abs(count), arr.length); i++) {\n const idx = Math.floor(Math.random() * arr.length)\n result.push(deserializeValue(arr[idx]) as T)\n }\n return ok(result)\n },\n\n async spop<T = CacheValue>(key: string, count?: number): Promise<HaiResult<T | T[] | null>> {\n const s = setStore.get(key)\n if (!s || s.size === 0)\n return ok(null)\n const arr = Array.from(s)\n if (count === undefined) {\n const idx = Math.floor(Math.random() * arr.length)\n const val = arr[idx]\n s.delete(val)\n return ok(deserializeValue(val) as T)\n }\n const result: T[] = []\n for (let i = 0; i < Math.min(count, arr.length); i++) {\n const idx = Math.floor(Math.random() * arr.length)\n const val = arr.splice(idx, 1)[0]\n s.delete(val)\n result.push(deserializeValue(val) as T)\n }\n return ok(result)\n },\n\n async sinter<T = CacheValue>(...keys: string[]): Promise<HaiResult<T[]>> {\n if (keys.length === 0)\n return ok([])\n const sets = keys.map(k => setStore.get(k))\n if (sets.some(s => !s))\n return ok([])\n const [first, ...rest] = sets as Set<string>[]\n const result = Array.from(first).filter(v => rest.every(s => s.has(v)))\n return ok(result.map(v => deserializeValue(v) as T))\n },\n\n async sunion<T = CacheValue>(...keys: string[]): Promise<HaiResult<T[]>> {\n const union = new Set<string>()\n for (const key of keys) {\n const s = setStore.get(key)\n if (s) {\n for (const v of s) union.add(v)\n }\n }\n return ok(Array.from(union).map(v => deserializeValue(v) as T))\n },\n\n async sdiff<T = CacheValue>(...keys: string[]): Promise<HaiResult<T[]>> {\n if (keys.length === 0)\n return ok([])\n const first = setStore.get(keys[0])\n if (!first)\n return ok([])\n const rest = keys.slice(1).map(k => setStore.get(k)).filter(Boolean) as Set<string>[]\n const result = Array.from(first).filter(v => !rest.some(s => s.has(v)))\n return ok(result.map(v => deserializeValue(v) as T))\n },\n }\n\n // ─── ZSet 操作 ───\n\n const zset: ZSetOperations = {\n async zadd(key: string, ...members: ZMember[]): Promise<HaiResult<number>> {\n let map = zsetStore.get(key)\n if (!map) {\n map = new Map()\n zsetStore.set(key, map)\n }\n let count = 0\n for (const { score, member } of members) {\n if (!map.has(member))\n count++\n map.set(member, score)\n }\n return ok(count)\n },\n\n async zrem(key: string, ...members: string[]): Promise<HaiResult<number>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok(0)\n let count = 0\n for (const member of members) {\n if (map.delete(member))\n count++\n }\n return ok(count)\n },\n\n async zscore(key: string, member: string): Promise<HaiResult<number | null>> {\n const map = zsetStore.get(key)\n const score = map?.get(member)\n return ok(score !== undefined ? score : null)\n },\n\n async zrank(key: string, member: string): Promise<HaiResult<number | null>> {\n const map = zsetStore.get(key)\n if (!map || !map.has(member))\n return ok(null)\n const sorted = Array.from(map.entries()).sort((a, b) => a[1] - b[1])\n const idx = sorted.findIndex(([m]) => m === member)\n return ok(idx >= 0 ? idx : null)\n },\n\n async zrevrank(key: string, member: string): Promise<HaiResult<number | null>> {\n const map = zsetStore.get(key)\n if (!map || !map.has(member))\n return ok(null)\n const sorted = Array.from(map.entries()).sort((a, b) => b[1] - a[1])\n const idx = sorted.findIndex(([m]) => m === member)\n return ok(idx >= 0 ? idx : null)\n },\n\n async zrange(key: string, start: number, stop: number, withScores?: boolean): Promise<HaiResult<string[] | ZMember[]>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok([])\n const sorted = Array.from(map.entries()).sort((a, b) => a[1] - b[1])\n const len = sorted.length\n const s = start < 0 ? Math.max(len + start, 0) : start\n const e = stop < 0 ? len + stop + 1 : stop + 1\n const slice = sorted.slice(s, e)\n if (withScores) {\n return ok(slice.map(([member, score]) => ({ member, score })))\n }\n return ok(slice.map(([member]) => member))\n },\n\n async zrevrange(key: string, start: number, stop: number, withScores?: boolean): Promise<HaiResult<string[] | ZMember[]>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok([])\n const sorted = Array.from(map.entries()).sort((a, b) => b[1] - a[1])\n const len = sorted.length\n const s = start < 0 ? Math.max(len + start, 0) : start\n const e = stop < 0 ? len + stop + 1 : stop + 1\n const slice = sorted.slice(s, e)\n if (withScores) {\n return ok(slice.map(([member, score]) => ({ member, score })))\n }\n return ok(slice.map(([member]) => member))\n },\n\n async zrangeByScore(\n key: string,\n min: number | string,\n max: number | string,\n options?: { withScores?: boolean, offset?: number, count?: number },\n ): Promise<HaiResult<string[] | ZMember[]>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok([])\n const minVal = min === '-inf' ? Number.NEGATIVE_INFINITY : Number(min)\n const maxVal = max === '+inf' ? Number.POSITIVE_INFINITY : Number(max)\n let sorted = Array.from(map.entries())\n .filter(([, score]) => score >= minVal && score <= maxVal)\n .sort((a, b) => a[1] - b[1])\n if (options?.offset !== undefined || options?.count !== undefined) {\n const offset = options.offset ?? 0\n const count = options.count ?? sorted.length\n sorted = sorted.slice(offset, offset + count)\n }\n if (options?.withScores) {\n return ok(sorted.map(([member, score]) => ({ member, score })))\n }\n return ok(sorted.map(([member]) => member))\n },\n\n async zcard(key: string): Promise<HaiResult<number>> {\n const map = zsetStore.get(key)\n return ok(map?.size ?? 0)\n },\n\n async zcount(key: string, min: number | string, max: number | string): Promise<HaiResult<number>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok(0)\n const minVal = min === '-inf' ? Number.NEGATIVE_INFINITY : Number(min)\n const maxVal = max === '+inf' ? Number.POSITIVE_INFINITY : Number(max)\n let count = 0\n for (const score of map.values()) {\n if (score >= minVal && score <= maxVal)\n count++\n }\n return ok(count)\n },\n\n async zincrBy(key: string, increment: number, member: string): Promise<HaiResult<number>> {\n let map = zsetStore.get(key)\n if (!map) {\n map = new Map()\n zsetStore.set(key, map)\n }\n const current = map.get(member) ?? 0\n const newScore = current + increment\n map.set(member, newScore)\n return ok(newScore)\n },\n\n async zremRangeByRank(key: string, start: number, stop: number): Promise<HaiResult<number>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok(0)\n const sorted = Array.from(map.entries()).sort((a, b) => a[1] - b[1])\n const len = sorted.length\n const s = start < 0 ? Math.max(len + start, 0) : start\n const e = stop < 0 ? len + stop + 1 : stop + 1\n const toRemove = sorted.slice(s, e)\n for (const [member] of toRemove) {\n map.delete(member)\n }\n return ok(toRemove.length)\n },\n\n async zremRangeByScore(key: string, min: number | string, max: number | string): Promise<HaiResult<number>> {\n const map = zsetStore.get(key)\n if (!map)\n return ok(0)\n const minVal = min === '-inf' ? Number.NEGATIVE_INFINITY : Number(min)\n const maxVal = max === '+inf' ? Number.POSITIVE_INFINITY : Number(max)\n let count = 0\n for (const [member, score] of map.entries()) {\n if (score >= minVal && score <= maxVal) {\n map.delete(member)\n count++\n }\n }\n return ok(count)\n },\n }\n\n // ─── Lock 操作 ───\n\n /** 锁前缀,用于区分锁键与普通 KV 键 */\n const LOCK_PREFIX = '__lock:'\n\n const lock: LockOperations = {\n async acquire(key: string, options?: LockOptions): Promise<HaiResult<boolean>> {\n const lockKey = `${LOCK_PREFIX}${key}`\n const ttl = options?.ttl ?? 30\n const owner = options?.owner ?? 'default'\n const existing = getValidEntry(lockKey)\n if (existing) {\n // 锁已被持有\n return ok(false)\n }\n store.set(lockKey, {\n value: owner,\n expiresAt: Date.now() + ttl * 1000,\n })\n return ok(true)\n },\n\n async release(key: string, owner?: string): Promise<HaiResult<boolean>> {\n const lockKey = `${LOCK_PREFIX}${key}`\n const entry = getValidEntry(lockKey)\n if (!entry) {\n return ok(false)\n }\n if (owner !== undefined && entry.value !== owner) {\n return ok(false)\n }\n store.delete(lockKey)\n return ok(true)\n },\n\n async isLocked(key: string): Promise<HaiResult<boolean>> {\n const lockKey = `${LOCK_PREFIX}${key}`\n const entry = getValidEntry(lockKey)\n return ok(entry !== null)\n },\n\n async extend(key: string, ttl: number, owner?: string): Promise<HaiResult<boolean>> {\n const lockKey = `${LOCK_PREFIX}${key}`\n const entry = getValidEntry(lockKey)\n if (!entry) {\n return ok(false)\n }\n if (owner !== undefined && entry.value !== owner) {\n return ok(false)\n }\n entry.expiresAt = Date.now() + ttl * 1000\n return ok(true)\n },\n }\n\n // ─── Provider 返回 ───\n\n return {\n name: 'memory',\n\n async connect(_config: CacheConfig): Promise<HaiResult<void>> {\n if (connected)\n return ok(undefined)\n cleanupTimer = setInterval(cleanup, 60000)\n connected = true\n return ok(undefined)\n },\n\n async close(): Promise<void> {\n if (cleanupTimer) {\n clearInterval(cleanupTimer)\n cleanupTimer = null\n }\n store.clear()\n hashStore.clear()\n listStore.clear()\n setStore.clear()\n zsetStore.clear()\n connected = false\n },\n\n isConnected: () => connected,\n\n kv,\n hash,\n list,\n set_,\n zset,\n lock,\n\n async ping(): Promise<HaiResult<string>> {\n return ok('PONG')\n },\n }\n}\n","/**\n * @h-ai/cache — Redis Provider\n *\n * 基于 ioredis 的 Redis/Cluster 缓存实现。\n * @module cache-provider-redis\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { Cluster, ClusterOptions, RedisOptions } from 'ioredis'\nimport type { CacheConfig } from '../cache-config.js'\nimport type { CacheProvider, CacheValue, HashOperations, KvOperations, ListOperations, LockOperations, LockOptions, ScanOptions, SetOperations, SetOptions, ZMember, ZSetOperations } from '../cache-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport Redis from 'ioredis'\nimport { cacheM } from '../cache-i18n.js'\nimport {\n\n HaiCacheError,\n\n} from '../cache-types.js'\n\nconst logger = core.logger.child({ module: 'cache', scope: 'redis' })\n\n/**\n * 剥离 URL 中的认证信息,避免密码泄露到日志\n */\nfunction sanitizeRedisUrl(url: string): string {\n try {\n const u = new URL(url)\n if (u.password)\n u.password = '***'\n if (u.username)\n u.username = '***'\n return u.toString()\n }\n catch {\n return '(invalid url)'\n }\n}\n\n// ─── Lua 脚本常量(分布式锁) ───\n\n/** Lua 脚本:仅当 owner 匹配时才删除锁(原子操作,防止误释放) */\nconst RELEASE_LOCK_SCRIPT = `\n if redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"del\", KEYS[1])\n else\n return 0\n end\n`\n\n/** Lua 脚本:仅当 owner 匹配时才续期锁(原子操作) */\nconst EXTEND_LOCK_SCRIPT = `\n if redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"expire\", KEYS[1], ARGV[2])\n else\n return 0\n end\n`\n\n// ─── Redis Provider ───\n\n/**\n * 创建 Redis Provider 实例\n *\n * 基于 ioredis 实现,支持单机 / 集群 / 哨兵 / URL 四种连接模式。\n * 连接优先级:url > cluster > sentinel > host。\n * 值序列化规则:string 直接存储,其它类型经 JSON.stringify。\n *\n * @returns CacheProvider 实例\n */\nexport function createRedisProvider(): CacheProvider {\n /** ioredis 客户端实例;connect 后赋值,close 后置 null */\n let client: Redis | Cluster | null = null\n\n // ─── 辅助函数 ───\n\n /**\n * 序列化值\n *\n * 所有类型(包括 string)统一经 JSON.stringify,确保 deserialize 时能还原原始类型。\n * 例:string '123' → '\"123\"'(反序列化回 string),number 123 → '123'(反序列化回 number)。\n */\n function serialize(value: CacheValue): string {\n return JSON.stringify(value)\n }\n\n /**\n * 反序列化值\n *\n * 尝试 JSON.parse;失败则返回原始字符串(兼容纯字符串存储场景)\n *\n * @param value - Redis 返回的字符串值或 null\n * @returns 解析后的值,或 null\n */\n function deserialize<T>(value: string | null): T | null {\n if (value === null)\n return null\n try {\n return JSON.parse(value) as T\n }\n catch {\n return value as T\n }\n }\n\n /**\n * 包装 Redis 操作为 HaiResult 结果\n *\n * 统一处理未初始化检查和异常捕获:\n * - client 为 null → NOT_INITIALIZED\n * - 操作抛异常 → OPERATION_FAILED\n *\n * @param operation - 实际的 Redis 命令执行函数\n * @returns HaiResult 包装的操作结果\n */\n async function wrapOperation<T>(operation: () => Promise<T>): Promise<HaiResult<T>> {\n if (!client) {\n return err(\n HaiCacheError.NOT_INITIALIZED,\n cacheM('cache_notInitialized'),\n )\n }\n try {\n const result = await operation()\n return ok(result)\n }\n catch (error) {\n return err(\n HaiCacheError.OPERATION_FAILED,\n cacheM('cache_operationFailed', { params: { error: error instanceof Error ? error.message : String(error) } }),\n error,\n )\n }\n }\n\n // ─── KV 操作 ───\n\n const kv: KvOperations = {\n async get<T = CacheValue>(key: string): Promise<HaiResult<T | null>> {\n return wrapOperation(async () => {\n const value = await client!.get(key)\n return deserialize<T>(value)\n })\n },\n\n async set(key: string, value: CacheValue, options?: SetOptions): Promise<HaiResult<void>> {\n return wrapOperation(async () => {\n const args: (string | number)[] = [key, serialize(value)]\n if (options?.ex)\n args.push('EX', options.ex)\n else if (options?.px)\n args.push('PX', options.px)\n else if (options?.exat)\n args.push('EXAT', options.exat)\n else if (options?.pxat)\n args.push('PXAT', options.pxat)\n if (options?.nx)\n args.push('NX')\n else if (options?.xx)\n args.push('XX')\n if (options?.keepTtl)\n args.push('KEEPTTL')\n // ioredis SET 的 TypeScript 重载签名不支持动态参数拼装(EX/PX/NX/XX/KEEPTTL),需绕过类型检查\n await (client as unknown as { set: (...args: Array<string | number>) => Promise<unknown> }).set(...args)\n })\n },\n\n async del(...keys: string[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.del(...keys))\n },\n\n async exists(...keys: string[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.exists(...keys))\n },\n\n async expire(key: string, seconds: number): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const result = await client!.expire(key, seconds)\n return result === 1\n })\n },\n\n async expireAt(key: string, timestamp: number): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const result = await client!.expireat(key, timestamp)\n return result === 1\n })\n },\n\n async ttl(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.ttl(key))\n },\n\n async persist(key: string): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const result = await client!.persist(key)\n return result === 1\n })\n },\n\n async incr(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.incr(key))\n },\n\n async incrBy(key: string, increment: number): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.incrby(key, increment))\n },\n\n async decr(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.decr(key))\n },\n\n async decrBy(key: string, decrement: number): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.decrby(key, decrement))\n },\n\n async mget<T = CacheValue>(...keys: string[]): Promise<HaiResult<(T | null)[]>> {\n return wrapOperation(async () => {\n const values = await client!.mget(...keys)\n return values.map(v => deserialize<T>(v))\n })\n },\n\n async mset(entries: Array<[string, CacheValue]>): Promise<HaiResult<void>> {\n return wrapOperation(async () => {\n const args: string[] = []\n for (const [key, value] of entries) {\n args.push(key, serialize(value))\n }\n await client!.mset(...args)\n })\n },\n\n async scan(cursor: number, options?: ScanOptions): Promise<HaiResult<[number, string[]]>> {\n return wrapOperation(async () => {\n let result: [string, string[]]\n if (options?.match && options?.count) {\n result = await client!.scan(cursor, 'MATCH', options.match, 'COUNT', options.count)\n }\n else if (options?.match) {\n result = await client!.scan(cursor, 'MATCH', options.match)\n }\n else if (options?.count) {\n result = await client!.scan(cursor, 'COUNT', options.count)\n }\n else {\n result = await client!.scan(cursor)\n }\n const [nextCursor, keys] = result\n return [Number.parseInt(nextCursor, 10), keys]\n })\n },\n\n async keys(pattern: string): Promise<HaiResult<string[]>> {\n return wrapOperation(() => client!.keys(pattern))\n },\n\n async type(key: string): Promise<HaiResult<string>> {\n return wrapOperation(() => client!.type(key))\n },\n }\n\n // ─── Hash 操作 ───\n\n const hash: HashOperations = {\n async hget<T = CacheValue>(key: string, field: string): Promise<HaiResult<T | null>> {\n return wrapOperation(async () => {\n const value = await client!.hget(key, field)\n return deserialize<T>(value)\n })\n },\n\n async hset(\n key: string,\n fieldOrData: string | Record<string, CacheValue>,\n value?: CacheValue,\n ): Promise<HaiResult<number>> {\n return wrapOperation(async () => {\n if (typeof fieldOrData === 'string' && value !== undefined) {\n return client!.hset(key, fieldOrData, serialize(value))\n }\n if (typeof fieldOrData === 'object') {\n const serialized: Record<string, string> = {}\n for (const [k, v] of Object.entries(fieldOrData)) {\n serialized[k] = serialize(v)\n }\n return client!.hset(key, serialized)\n }\n return 0\n })\n },\n\n async hdel(key: string, ...fields: string[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.hdel(key, ...fields))\n },\n\n async hexists(key: string, field: string): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const result = await client!.hexists(key, field)\n return result === 1\n })\n },\n\n async hgetall<T = Record<string, CacheValue>>(key: string): Promise<HaiResult<T>> {\n return wrapOperation(async () => {\n const data = await client!.hgetall(key)\n const result: Record<string, CacheValue> = {}\n for (const [k, v] of Object.entries(data)) {\n result[k] = deserialize(v)\n }\n return result as T\n })\n },\n\n async hkeys(key: string): Promise<HaiResult<string[]>> {\n return wrapOperation(() => client!.hkeys(key))\n },\n\n async hvals<T = CacheValue>(key: string): Promise<HaiResult<T[]>> {\n return wrapOperation(async () => {\n const values = await client!.hvals(key)\n return values.map(v => deserialize<T>(v)!)\n })\n },\n\n async hlen(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.hlen(key))\n },\n\n async hmget<T = CacheValue>(key: string, ...fields: string[]): Promise<HaiResult<(T | null)[]>> {\n return wrapOperation(async () => {\n const values = await client!.hmget(key, ...fields)\n return values.map(v => deserialize<T>(v))\n })\n },\n\n async hincrBy(key: string, field: string, increment: number): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.hincrby(key, field, increment))\n },\n }\n\n // ─── List 操作 ───\n\n const list: ListOperations = {\n async lpush(key: string, ...values: CacheValue[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.lpush(key, ...values.map(serialize)))\n },\n\n async rpush(key: string, ...values: CacheValue[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.rpush(key, ...values.map(serialize)))\n },\n\n async lpop<T = CacheValue>(key: string): Promise<HaiResult<T | null>> {\n return wrapOperation(async () => {\n const value = await client!.lpop(key)\n return deserialize<T>(value)\n })\n },\n\n async rpop<T = CacheValue>(key: string): Promise<HaiResult<T | null>> {\n return wrapOperation(async () => {\n const value = await client!.rpop(key)\n return deserialize<T>(value)\n })\n },\n\n async llen(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.llen(key))\n },\n\n async lrange<T = CacheValue>(key: string, start: number, stop: number): Promise<HaiResult<T[]>> {\n return wrapOperation(async () => {\n const values = await client!.lrange(key, start, stop)\n return values.map(v => deserialize<T>(v)!)\n })\n },\n\n async lindex<T = CacheValue>(key: string, index: number): Promise<HaiResult<T | null>> {\n return wrapOperation(async () => {\n const value = await client!.lindex(key, index)\n return deserialize<T>(value)\n })\n },\n\n async lset(key: string, index: number, value: CacheValue): Promise<HaiResult<void>> {\n return wrapOperation(async () => {\n await client!.lset(key, index, serialize(value))\n })\n },\n\n async ltrim(key: string, start: number, stop: number): Promise<HaiResult<void>> {\n return wrapOperation(async () => {\n await client!.ltrim(key, start, stop)\n })\n },\n\n async blpop<T = CacheValue>(timeout: number, ...keys: string[]): Promise<HaiResult<[string, T] | null>> {\n return wrapOperation(async () => {\n const result = await client!.blpop(...keys, timeout)\n if (!result)\n return null\n return [result[0], deserialize<T>(result[1])!]\n })\n },\n\n async brpop<T = CacheValue>(timeout: number, ...keys: string[]): Promise<HaiResult<[string, T] | null>> {\n return wrapOperation(async () => {\n const result = await client!.brpop(...keys, timeout)\n if (!result)\n return null\n return [result[0], deserialize<T>(result[1])!]\n })\n },\n }\n\n // ─── Set 操作 ───\n\n const set_: SetOperations = {\n async sadd(key: string, ...members: CacheValue[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.sadd(key, ...members.map(serialize)))\n },\n\n async srem(key: string, ...members: CacheValue[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.srem(key, ...members.map(serialize)))\n },\n\n async smembers<T = CacheValue>(key: string): Promise<HaiResult<T[]>> {\n return wrapOperation(async () => {\n const members = await client!.smembers(key)\n return members.map(m => deserialize<T>(m)!)\n })\n },\n\n async sismember(key: string, member: CacheValue): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const result = await client!.sismember(key, serialize(member))\n return result === 1\n })\n },\n\n async scard(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.scard(key))\n },\n\n async srandmember<T = CacheValue>(key: string, count?: number): Promise<HaiResult<T | T[] | null>> {\n return wrapOperation(async () => {\n if (count !== undefined) {\n const members = await client!.srandmember(key, count)\n return (members as string[]).map(m => deserialize<T>(m)!)\n }\n const member = await client!.srandmember(key)\n return deserialize<T>(member)\n })\n },\n\n async spop<T = CacheValue>(key: string, count?: number): Promise<HaiResult<T | T[] | null>> {\n return wrapOperation(async () => {\n if (count !== undefined) {\n const members = await client!.spop(key, count)\n return (members as string[]).map(m => deserialize<T>(m)!)\n }\n const member = await client!.spop(key)\n return deserialize<T>(member)\n })\n },\n\n async sinter<T = CacheValue>(...keys: string[]): Promise<HaiResult<T[]>> {\n return wrapOperation(async () => {\n const members = await client!.sinter(...keys)\n return members.map(m => deserialize<T>(m)!)\n })\n },\n\n async sunion<T = CacheValue>(...keys: string[]): Promise<HaiResult<T[]>> {\n return wrapOperation(async () => {\n const members = await client!.sunion(...keys)\n return members.map(m => deserialize<T>(m)!)\n })\n },\n\n async sdiff<T = CacheValue>(...keys: string[]): Promise<HaiResult<T[]>> {\n return wrapOperation(async () => {\n const members = await client!.sdiff(...keys)\n return members.map(m => deserialize<T>(m)!)\n })\n },\n }\n\n // ─── ZSet 操作 ───\n\n const zset: ZSetOperations = {\n async zadd(key: string, ...members: ZMember[]): Promise<HaiResult<number>> {\n return wrapOperation(async () => {\n const args: (string | number)[] = []\n for (const { score, member } of members) {\n args.push(score, member)\n }\n return client!.zadd(key, ...args)\n })\n },\n\n async zrem(key: string, ...members: string[]): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.zrem(key, ...members))\n },\n\n async zscore(key: string, member: string): Promise<HaiResult<number | null>> {\n return wrapOperation(async () => {\n const score = await client!.zscore(key, member)\n return score !== null ? Number.parseFloat(score) : null\n })\n },\n\n async zrank(key: string, member: string): Promise<HaiResult<number | null>> {\n return wrapOperation(() => client!.zrank(key, member))\n },\n\n async zrevrank(key: string, member: string): Promise<HaiResult<number | null>> {\n return wrapOperation(() => client!.zrevrank(key, member))\n },\n\n async zrange(key: string, start: number, stop: number, withScores?: boolean): Promise<HaiResult<string[] | ZMember[]>> {\n return wrapOperation(async () => {\n if (withScores) {\n const result = await client!.zrange(key, start, stop, 'WITHSCORES')\n const members: ZMember[] = []\n for (let i = 0; i < result.length; i += 2) {\n members.push({ member: result[i], score: Number.parseFloat(result[i + 1]) })\n }\n return members\n }\n return client!.zrange(key, start, stop)\n })\n },\n\n async zrevrange(key: string, start: number, stop: number, withScores?: boolean): Promise<HaiResult<string[] | ZMember[]>> {\n return wrapOperation(async () => {\n if (withScores) {\n const result = await client!.zrevrange(key, start, stop, 'WITHSCORES')\n const members: ZMember[] = []\n for (let i = 0; i < result.length; i += 2) {\n members.push({ member: result[i], score: Number.parseFloat(result[i + 1]) })\n }\n return members\n }\n return client!.zrevrange(key, start, stop)\n })\n },\n\n async zrangeByScore(\n key: string,\n min: number | string,\n max: number | string,\n options?: { withScores?: boolean, offset?: number, count?: number },\n ): Promise<HaiResult<string[] | ZMember[]>> {\n return wrapOperation(async () => {\n const args: (string | number)[] = [key, String(min), String(max)]\n if (options?.withScores)\n args.push('WITHSCORES')\n if (options?.offset !== undefined && options?.count !== undefined) {\n args.push('LIMIT', options.offset, options.count)\n }\n // ioredis zrangebyscore 的 TypeScript 重载签名不支持动态参数拼装(WITHSCORES/LIMIT),需绕过类型检查\n const result = await (client!.zrangebyscore as unknown as (...a: (string | number)[]) => Promise<string[]>).call(client, ...args)\n if (options?.withScores) {\n const members: ZMember[] = []\n for (let i = 0; i < result.length; i += 2) {\n members.push({ member: result[i], score: Number.parseFloat(result[i + 1]) })\n }\n return members\n }\n return result as string[]\n })\n },\n\n async zcard(key: string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.zcard(key))\n },\n\n async zcount(key: string, min: number | string, max: number | string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.zcount(key, min, max))\n },\n\n async zincrBy(key: string, increment: number, member: string): Promise<HaiResult<number>> {\n return wrapOperation(async () => {\n const result = await client!.zincrby(key, increment, member)\n return Number.parseFloat(result)\n })\n },\n\n async zremRangeByRank(key: string, start: number, stop: number): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.zremrangebyrank(key, start, stop))\n },\n\n async zremRangeByScore(key: string, min: number | string, max: number | string): Promise<HaiResult<number>> {\n return wrapOperation(() => client!.zremrangebyscore(key, min, max))\n },\n }\n\n // ─── Lock 操作 ───\n\n /** 锁前缀,用于区分锁键与普通 KV 键 */\n const LOCK_PREFIX = '__lock:'\n\n const lock: LockOperations = {\n async acquire(key: string, options?: LockOptions): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const lockKey = `${LOCK_PREFIX}${key}`\n const ttl = options?.ttl ?? 30\n const owner = options?.owner ?? 'default'\n // SET key value NX EX ttl — 原子获锁\n const result = await client!.set(lockKey, owner, 'EX', ttl, 'NX')\n return result === 'OK'\n })\n },\n\n async release(key: string, owner?: string): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const lockKey = `${LOCK_PREFIX}${key}`\n if (owner !== undefined) {\n const result = await client!.eval(RELEASE_LOCK_SCRIPT, 1, lockKey, owner) as number\n return result === 1\n }\n const deleted = await client!.del(lockKey)\n return deleted === 1\n })\n },\n\n async isLocked(key: string): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const lockKey = `${LOCK_PREFIX}${key}`\n const exists = await client!.exists(lockKey)\n return exists === 1\n })\n },\n\n async extend(key: string, ttl: number, owner?: string): Promise<HaiResult<boolean>> {\n return wrapOperation(async () => {\n const lockKey = `${LOCK_PREFIX}${key}`\n if (owner !== undefined) {\n const result = await client!.eval(EXTEND_LOCK_SCRIPT, 1, lockKey, owner, ttl) as number\n return result === 1\n }\n const result = await client!.expire(lockKey, ttl)\n return result === 1\n })\n },\n }\n\n // ─── Provider 返回 ───\n\n return {\n name: 'redis',\n\n /**\n * 连接 Redis 服务\n *\n * 根据配置自动选择连接模式:\n * 1. url → 单机 URL 连接\n * 2. cluster → 集群模式\n * 3. sentinel → 哨兵模式\n * 4. host/port → 单机连接(默认)\n *\n * @param config - 已校验的 Redis 配置\n * @returns 成功 ok(undefined),失败 CONNECTION_FAILED\n */\n async connect(config: CacheConfig): Promise<HaiResult<void>> {\n if (config.type !== 'redis') {\n return err(\n HaiCacheError.UNSUPPORTED_TYPE,\n cacheM('cache_unsupportedType', { params: { type: config.type } }),\n )\n }\n\n try {\n const redisOptions: RedisOptions = {\n connectTimeout: config.connectTimeout,\n commandTimeout: config.commandTimeout,\n keyPrefix: config.keyPrefix,\n maxRetriesPerRequest: config.maxRetries,\n retryStrategy: (times) => {\n if (times > config.maxRetries)\n return null\n return config.retryDelay * times\n },\n lazyConnect: true,\n }\n\n if (config.tls)\n redisOptions.tls = {}\n if (config.readOnly)\n redisOptions.readOnly = true\n\n if (config.url) {\n client = new Redis(config.url, redisOptions)\n }\n else if (config.cluster && config.cluster.length > 0) {\n const clusterOptions: ClusterOptions = {\n redisOptions,\n clusterRetryStrategy: (times) => {\n if (times > config.maxRetries)\n return null\n return config.retryDelay * times\n },\n }\n client = new Redis.Cluster(config.cluster, clusterOptions)\n }\n else if (config.sentinel) {\n client = new Redis({\n ...redisOptions,\n sentinels: config.sentinel.sentinels,\n name: config.sentinel.name,\n password: config.password,\n db: config.db,\n })\n }\n else {\n client = new Redis({\n ...redisOptions,\n host: config.host,\n port: config.port,\n password: config.password,\n db: config.db,\n })\n }\n\n await client.connect()\n await client.ping()\n\n const address = config.url ? sanitizeRedisUrl(config.url) : `${config.host}:${config.port}`\n logger.info('Redis connected', { address })\n\n return ok(undefined)\n }\n catch (error) {\n return err(\n HaiCacheError.CONNECTION_FAILED,\n cacheM('cache_redisConnectionFailed', { params: { error: error instanceof Error ? error.message : String(error) } }),\n error,\n )\n }\n },\n\n async close(): Promise<void> {\n if (client) {\n logger.info('Disconnecting Redis')\n await client.quit()\n client = null\n logger.info('Redis disconnected')\n }\n },\n\n isConnected: () => client !== null,\n\n kv,\n hash,\n list,\n set_,\n zset,\n lock,\n\n async ping(): Promise<HaiResult<string>> {\n return wrapOperation(() => client!.ping())\n },\n }\n}\n","/**\n * @h-ai/cache — 缓存服务主入口\n *\n * 提供统一的 `cache` 对象,聚合所有缓存操作功能。\n * @module cache-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { CacheConfig, CacheConfigInput } from './cache-config.js'\nimport type { CacheFunctions, CacheProvider, HashOperations, KvOperations, ListOperations, LockOperations, SetOperations, ZSetOperations } from './cache-types.js'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { CacheConfigSchema } from './cache-config.js'\n\nimport { cacheM } from './cache-i18n.js'\nimport {\n\n HaiCacheError,\n\n} from './cache-types.js'\nimport { createMemoryProvider } from './providers/cache-provider-memory.js'\nimport { createRedisProvider } from './providers/cache-provider-redis.js'\n\nconst logger = core.logger.child({ module: 'cache', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的 Provider 实例;init 后赋值,close 后置 null */\nlet currentProvider: CacheProvider | null = null\n/** 当前缓存配置(Zod parse 后);init 后赋值,close 后置 null */\nlet currentConfig: CacheConfig | null = null\n/** 并发初始化防护标志;防止多次 init() 同时执行导致资源泄漏 */\nlet initInProgress = false\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的缓存 Provider\n *\n * @param config - 已经过 Zod Schema 校验的配置对象\n * @returns 未连接的 Provider 实例,需后续调用 connect()\n * @throws 理论上仅当出现未覆盖的 type 分支时抛出异常(正常情况下由 CacheConfigSchema 保证不会发生)\n */\nfunction createProvider(config: CacheConfig): CacheProvider {\n switch (config.type) {\n case 'memory':\n return createMemoryProvider()\n case 'redis':\n return createRedisProvider()\n default:\n throw new Error(cacheM('cache_unsupportedType', { params: { type: (config as { type: string }).type } }))\n }\n}\n\n// ─── 未初始化占位 ───\n\n/**\n * 未初始化时的错误工具集\n *\n * 所有子接口(kv/hash/list/set_/zset)在未 init 前使用 proxy 占位,\n * 调用任意方法均返回 { success: false, error: { code: NOT_INITIALIZED } }\n */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiCacheError.NOT_INITIALIZED,\n () => cacheM('cache_notInitialized'),\n)\n\nconst notInitializedKv = notInitialized.proxy<KvOperations>()\nconst notInitializedHash = notInitialized.proxy<HashOperations>()\nconst notInitializedList = notInitialized.proxy<ListOperations>()\nconst notInitializedSet = notInitialized.proxy<SetOperations>()\nconst notInitializedZSet = notInitialized.proxy<ZSetOperations>()\nconst notInitializedLock = notInitialized.proxy<LockOperations>()\n\n// ─── 缓存服务对象 ───\n\n/**\n * 缓存服务对象\n *\n * @example\n * ```ts\n * import { cache } from '@h-ai/cache'\n *\n * await cache.init({ type: 'redis', host: 'localhost', port: 6379 })\n * await cache.kv.set('user:1', { name: '张三' }, { ex: 3600 })\n * const result = await cache.kv.get<{ name: string }>('user:1')\n * await cache.close()\n * ```\n */\nexport const cache: CacheFunctions = {\n /**\n * 初始化缓存连接。\n *\n * 会先关闭已有连接,再用新配置重新初始化。\n * 配置经 Zod Schema parse 后传给 Provider。\n *\n * @param config 缓存配置(支持 memory / redis)。\n * @returns 成功时返回 ok(undefined);失败时返回 Provider 错误(如 CONNECTION_FAILED)。\n *\n * @example\n * ```ts\n * const result = await cache.init({ type: 'redis', host: 'localhost' })\n * if (!result.success) {\n * // 生产代码中请使用项目 logger 输出错误\n * }\n * ```\n */\n async init(config: CacheConfigInput): Promise<HaiResult<void>> {\n // 并发初始化防护:避免多次 init 同时执行导致 Provider 泄漏\n if (initInProgress) {\n logger.warn('Cache init already in progress, skipping concurrent call')\n return err(\n HaiCacheError.OPERATION_FAILED,\n cacheM('cache_operationFailed', { params: { error: 'Concurrent initialization detected' } }),\n )\n }\n initInProgress = true\n\n try {\n if (currentProvider) {\n logger.warn('Cache module is already initialized, reinitializing')\n await cache.close()\n }\n\n logger.info('Initializing cache module')\n\n const parseResult = CacheConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('Cache config validation failed', { error: parseResult.error.message })\n return err(\n HaiCacheError.CONFIG_ERROR,\n cacheM('cache_configError', { params: { error: parseResult.error.message } }),\n parseResult.error,\n )\n }\n const parsed = parseResult.data\n\n try {\n const provider = createProvider(parsed)\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('Cache module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return connectResult\n }\n currentProvider = provider\n currentConfig = parsed\n logger.info('Cache module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Cache module initialization failed', { error })\n return err(\n HaiCacheError.CONNECTION_FAILED,\n cacheM('cache_initFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n finally {\n initInProgress = false\n }\n },\n\n /** KV 操作子接口;未 init 时所有方法返回 NOT_INITIALIZED */\n get kv(): KvOperations { return currentProvider?.kv ?? notInitializedKv },\n /** Hash 操作子接口 */\n get hash(): HashOperations { return currentProvider?.hash ?? notInitializedHash },\n /** List 操作子接口 */\n get list(): ListOperations { return currentProvider?.list ?? notInitializedList },\n /** Set 操作子接口(名称加 _ 以避免与 JS 关键字冲突) */\n get set_(): SetOperations { return currentProvider?.set_ ?? notInitializedSet },\n /** ZSet(有序集合)操作子接口 */\n get zset(): ZSetOperations { return currentProvider?.zset ?? notInitializedZSet },\n /** 分布式锁操作子接口 */\n get lock(): LockOperations { return currentProvider?.lock ?? notInitializedLock },\n /** 当前配置(parse 后);未初始化时返回 null */\n get config(): CacheConfig | null { return currentConfig },\n /** 是否已初始化并连接;Provider 不存在或未连接时返回 false */\n get isInitialized(): boolean { return currentProvider !== null && currentProvider.isConnected() },\n\n /**\n * 测试缓存连接状态\n *\n * @returns 成功时返回 'PONG';未初始化时返回 NOT_INITIALIZED 错误\n */\n ping(): Promise<HaiResult<string>> {\n return currentProvider?.ping() ?? Promise.resolve(notInitialized.result())\n },\n\n /** 关闭缓存连接并释放资源;未初始化时调用安全无副作用 */\n async close(): Promise<void> {\n if (!currentProvider) {\n currentConfig = null\n logger.info('Cache module already closed, skipping')\n return\n }\n\n logger.info('Closing cache module')\n\n try {\n await currentProvider.close()\n logger.info('Cache module closed')\n }\n catch (error) {\n logger.error('Cache module close failed', { error })\n }\n finally {\n currentProvider = null\n currentConfig = null\n }\n },\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@h-ai/cache",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.1.0-alpha5",
|
|
5
|
+
"description": "Hai Framework cache module with memory and Redis backends.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"ioredis": "^5.4.2",
|
|
24
|
+
"zod": "^4.3.6",
|
|
25
|
+
"@h-ai/core": "0.1.0-alpha5"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^25.1.0",
|
|
29
|
+
"rimraf": "^6.0.1",
|
|
30
|
+
"testcontainers": "^11.11.0",
|
|
31
|
+
"tsup": "^8.3.5",
|
|
32
|
+
"typescript": "^5.7.2",
|
|
33
|
+
"vitest": "^4.0.18"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"test:watch": "vitest",
|
|
40
|
+
"typecheck": "tsc --noEmit",
|
|
41
|
+
"lint": "eslint .",
|
|
42
|
+
"lint:fix": "eslint . --fix",
|
|
43
|
+
"clean": "rimraf dist .turbo"
|
|
44
|
+
}
|
|
45
|
+
}
|