File size: 737 Bytes
1f21206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * 会话串行队列
 *
 * 同一 chatId 的消息串行处理,防并发冲突。
 * 不同 chatId 之间互不影响。
 * 参考 openclaw-lark chat-queue.ts 的 Promise 链设计。
 */

const queues = new Map<string, Promise<void>>()

export async function enqueue(chatId: string, fn: () => Promise<void>): Promise<void> {
  const prev = queues.get(chatId) ?? Promise.resolve()
  const next = prev.then(fn, () => fn()).catch((err) => {
    console.error(`[ChatQueue] Error in task for chat ${chatId}:`, err)
  })
  queues.set(chatId, next)
  // Clean up after completion to avoid memory leak for one-off chats
  next.finally(() => {
    if (queues.get(chatId) === next) {
      queues.delete(chatId)
    }
  })
  return next
}