import {randomUUID} from "node:crypto"; export type AiCancelRequest = { id: string; chatId: number; messageId?: number; fromId: number; provider: string; controller: AbortController; onCancel?: () => Promise | void; }; const requests = new Map(); export function createAiCancelRequest(params: Omit & { controller?: AbortController }): AiCancelRequest { const request: AiCancelRequest = { id: randomUUID(), controller: params.controller ?? new AbortController(), chatId: params.chatId, messageId: params.messageId, fromId: params.fromId, provider: params.provider, onCancel: params.onCancel, }; requests.set(request.id, request); return request; } export function setAiCancelMessageId(id: string, messageId: number): void { const request = requests.get(id); if (request) request.messageId = messageId; } export function getAiCancelRequest(id: string): AiCancelRequest | undefined { return requests.get(id); } export async function abortAiRequest(id: string): Promise { const request = requests.get(id); if (!request) return false; request.controller.abort(); try { await request.onCancel?.(); } finally { requests.delete(id); } return true; } export function finishAiRequest(id: string): void { requests.delete(id); }