/**
 * H5 运行中流式任务的 abort 注册表（进程内单例）。
 *
 * 用于区分「主动停止」与「被动断开」（方案 C）：
 *   - 被动断开（关页面 / 刷新 / 断网 → req.signal abort）不再中断引擎，
 *     引擎继续后台跑完并落库，用户再进来能看到完整回复。
 *   - 主动停止（用户点「停止」按钮）→ POST /api/h5/chat/stop → 查本表 abort
 *     对应 AbortController，真正中断引擎（SDK query）。
 *
 * key = sessionId：H5 前端 streaming 时禁用输入，同一 session 不会有并发流，
 * sessionId 足够唯一。参考 src/lib/im/core/bridge-manager.ts:70 的 activeTasks 模式。
 *
 * 进程内 Map：当前 H5 单进程部署够用；多实例部署时需上外部存储（如 Redis）。
 */

const activeStreams = new Map<string, AbortController>()

/** 注册一个运行中的流式任务。后台流启动时调用。 */
export function registerH5Stream(sessionId: string, controller: AbortController): void {
  activeStreams.set(sessionId, controller)
}

/**
 * 主动停止：abort 并移除指定 session 的流。
 * @returns 是否找到并 abort 了（false 表示该 session 当前没有运行中的流）
 */
export function abortH5Stream(sessionId: string): boolean {
  const controller = activeStreams.get(sessionId)
  if (!controller) return false
  controller.abort()
  activeStreams.delete(sessionId)
  return true
}

/** 注销：后台流结束（正常完成 / 出错 / 被动断开后跑完）时调用，防止泄漏。 */
export function unregisterH5Stream(sessionId: string): void {
  activeStreams.delete(sessionId)
}
