UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 3.31 kB
var e=class{subscriptions=new Set;locks=new Map;cache=new Map;queues=new Map;connected=!1;connectPromise=null;async connect(){this.connected||(this.connectPromise||=Promise.resolve().then(()=>{process.env.NODE_ENV===`production`&&console.warn(`[chat] MemoryStateAdapter is not recommended for production. Consider using @chat-adapter/state-redis instead.`),this.connected=!0}),await this.connectPromise)}async disconnect(){this.connected=!1,this.connectPromise=null,this.subscriptions.clear(),this.locks.clear(),this.queues.clear()}async subscribe(e){this.ensureConnected(),this.subscriptions.add(e)}async unsubscribe(e){this.ensureConnected(),this.subscriptions.delete(e)}async isSubscribed(e){return this.ensureConnected(),this.subscriptions.has(e)}async acquireLock(e,n){this.ensureConnected(),this.cleanExpiredLocks();let r=this.locks.get(e);if(r&&r.expiresAt>Date.now())return null;let i={threadId:e,token:t(),expiresAt:Date.now()+n};return this.locks.set(e,i),i}async forceReleaseLock(e){this.ensureConnected(),this.locks.delete(e)}async releaseLock(e){this.ensureConnected();let t=this.locks.get(e.threadId);t&&t.token===e.token&&this.locks.delete(e.threadId)}async extendLock(e,t){this.ensureConnected();let n=this.locks.get(e.threadId);return!n||n.token!==e.token?!1:n.expiresAt<Date.now()?(this.locks.delete(e.threadId),!1):(n.expiresAt=Date.now()+t,!0)}async get(e){this.ensureConnected();let t=this.cache.get(e);return t?t.expiresAt!==null&&t.expiresAt<=Date.now()?(this.cache.delete(e),null):t.value:null}async set(e,t,n){this.ensureConnected(),this.cache.set(e,{value:t,expiresAt:n?Date.now()+n:null})}async setIfNotExists(e,t,n){this.ensureConnected();let r=this.cache.get(e);if(r)if(r.expiresAt!==null&&r.expiresAt<=Date.now())this.cache.delete(e);else return!1;return this.cache.set(e,{value:t,expiresAt:n?Date.now()+n:null}),!0}async delete(e){this.ensureConnected(),this.cache.delete(e)}async appendToList(e,t,n){this.ensureConnected();let r=this.cache.get(e),i;i=r&&r.expiresAt!==null&&r.expiresAt<=Date.now()?[]:r&&Array.isArray(r.value)?r.value:[],i.push(t),n?.maxLength&&i.length>n.maxLength&&(i=i.slice(i.length-n.maxLength)),this.cache.set(e,{value:i,expiresAt:n?.ttlMs?Date.now()+n.ttlMs:null})}async enqueue(e,t,n){this.ensureConnected();let r=this.queues.get(e);return r||(r=[],this.queues.set(e,r)),r.push(t),r.length>n&&r.splice(0,r.length-n),r.length}async dequeue(e){this.ensureConnected();let t=this.queues.get(e);if(!t||t.length===0)return null;let n=t.shift();return t.length===0&&this.queues.delete(e),n??null}async queueDepth(e){return this.ensureConnected(),this.queues.get(e)?.length??0}async getList(e){this.ensureConnected();let t=this.cache.get(e);return t?t.expiresAt!==null&&t.expiresAt<=Date.now()?(this.cache.delete(e),[]):Array.isArray(t.value)?t.value:[]:[]}ensureConnected(){if(!this.connected)throw Error(`MemoryStateAdapter is not connected. Call connect() first.`)}cleanExpiredLocks(){let e=Date.now();for(let[t,n]of this.locks)n.expiresAt<=e&&this.locks.delete(t)}_getSubscriptionCount(){return this.subscriptions.size}_getLockCount(){return this.cleanExpiredLocks(),this.locks.size}};function t(){return`mem_${Date.now()}_${Math.random().toString(36).substring(2,15)}`}function n(t){return new e}export{e as MemoryStateAdapter,n as createMemoryState};