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
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 });
|
|
});
|
|
|