You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

61 lines
1.9 KiB

import { defineEventHandler, readBody } from "h3";
import { getCurrentUser } from "#server/utils/context";
import { getTempTokenFromCookie } from "#server/service/agent/temp-token";
import { getSessionByIdAndUser } from "#server/service/agent/session";
import { getStreamBuffer, markBufferDone } from "#server/service/agent/stream-buffer";
import { R } from "#server/utils/response";
import log4js from "logger";
const logger = log4js.getLogger("APP");
const activeControllers = new Map<string, AbortController>();
export function registerAbortController(sessionId: string, controller: AbortController) {
activeControllers.set(sessionId, controller);
}
export function unregisterAbortController(sessionId: string) {
activeControllers.delete(sessionId);
}
export function abortSessionStream(sessionId: string): boolean {
const controller = activeControllers.get(sessionId);
if (controller && !controller.signal.aborted) {
controller.abort();
logger.info("[AGENT-STOP] aborted streamText for sessionId=%s", sessionId);
return true;
}
return false;
}
export default defineEventHandler(async (event) => {
const user = await getCurrentUser(event);
const tempToken = getTempTokenFromCookie(event);
if (!user && !tempToken) {
throw createError({ statusCode: 401, statusMessage: "请先登录或创建临时会话" });
}
const body = await readBody(event);
const { sessionId } = body as { sessionId?: string };
if (!sessionId) {
throw createError({ statusCode: 400, statusMessage: "缺少 sessionId 参数" });
}
const session = await getSessionByIdAndUser(sessionId, user?.id ?? null, tempToken);
if (!session) {
throw createError({ statusCode: 404, statusMessage: "会话不存在" });
}
const aborted = abortSessionStream(sessionId);
if (!aborted) {
const buf = getStreamBuffer(sessionId);
if (buf && !buf.done) {
markBufferDone(sessionId);
}
}
return R.success({ aborted });
});