import type { Options as QuickLruOptions, } from '@alloc/quick-lru' import QuickLru from '@alloc/quick-lru' import { envVars, log, } from '../config.js' import type { ContactPayload, } from '../schemas/contact.js' import type { FriendshipPayload, } from '../schemas/friendship.js' import type { MessagePayload, } from '../schemas/message.js' import type { RoomMemberPayload, RoomPayload, } from '../schemas/room.js' import type { RoomInvitationPayload, } from '../schemas/room-invitation.js' import type { PuppetOptions, } from '../schemas/puppet.js' import type { PostPayload, } from '../schemas/post.js' type PayloadCacheOptions = Required['cache'] interface LruRoomMemberPayload { [memberContactId: string]: RoomMemberPayload } class CacheAgent { readonly contact : QuickLru readonly friendship : QuickLru readonly message : QuickLru readonly post : QuickLru readonly room : QuickLru readonly roomInvitation : QuickLru readonly roomMember : QuickLru constructor ( protected options?: PayloadCacheOptions, ) { log.verbose('PuppetCacheAgent', 'constructor(%s)', options ? JSON.stringify(options) : '', ) /** * Setup LRU Caches */ const lruOptions = (maxSize = 100): QuickLruOptions => ({ maxAge: 15 * 60 * 1000 * 1000, // 15 minutes maxSize: maxSize, }) this.contact = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_CONTACT(options?.contact)), ) this.friendship = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_FRIENDSHIP(options?.friendship)), ) this.message = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_MESSAGE(options?.message)), ) this.roomInvitation = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_ROOM_INVITATION(options?.roomInvitation)), ) this.roomMember = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_ROOM_MEMBER(options?.roomMember)), ) this.room = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_ROOM(options?.room)), ) this.post = new QuickLru(lruOptions( envVars.WECHATY_PUPPET_LRU_CACHE_SIZE_POST(options?.post)), ) } start (): void { log.verbose('PuppetCacheAgent', 'start()') } stop (): void { log.verbose('PuppetCacheAgent', 'stop()') this.clear() } /** * FIXME: Huan(202008) clear cache when stop * keep the cache as a temp workaround since wechaty-puppet-service has reconnect issue * with un-cleared cache in wechaty-puppet will make the reconnect recoverable * * Related issue: https://github.com/wechaty/wechaty-puppet-service/issues/31 * * Update: * Huan(2021-08-28): clear the cache when stop */ clear (): void { log.verbose('PuppetCacheAgent', 'clear()') this.contact.clear() this.friendship.clear() this.message.clear() this.post.clear() this.room.clear() this.roomInvitation.clear() this.roomMember.clear() } } export type { PayloadCacheOptions } export { CacheAgent }