| import { vi } from "vitest"; |
| import type { Mock } from "vitest"; |
| import type { GatewayRequestHandler, RespondFn } from "./types.js"; |
|
|
| export function createActiveRun( |
| sessionKey: string, |
| params: { |
| sessionId?: string; |
| owner?: { connId?: string; deviceId?: string }; |
| } = {}, |
| ) { |
| const now = Date.now(); |
| return { |
| controller: new AbortController(), |
| sessionId: params.sessionId ?? `${sessionKey}-session`, |
| sessionKey, |
| startedAtMs: now, |
| expiresAtMs: now + 30_000, |
| ownerConnId: params.owner?.connId, |
| ownerDeviceId: params.owner?.deviceId, |
| }; |
| } |
|
|
| export type ChatAbortTestContext = Record<string, unknown> & { |
| chatAbortControllers: Map<string, ReturnType<typeof createActiveRun>>; |
| chatRunBuffers: Map<string, string>; |
| chatDeltaSentAt: Map<string, number>; |
| chatAbortedRuns: Map<string, number>; |
| removeChatRun: (...args: unknown[]) => { sessionKey: string; clientRunId: string } | undefined; |
| agentRunSeq: Map<string, number>; |
| broadcast: (...args: unknown[]) => void; |
| nodeSendToSession: (...args: unknown[]) => void; |
| logGateway: { warn: (...args: unknown[]) => void }; |
| }; |
|
|
| export type ChatAbortRespondMock = Mock<RespondFn>; |
|
|
| export function createChatAbortContext( |
| overrides: Record<string, unknown> = {}, |
| ): ChatAbortTestContext { |
| return { |
| chatAbortControllers: new Map(), |
| chatRunBuffers: new Map(), |
| chatDeltaSentAt: new Map(), |
| chatAbortedRuns: new Map<string, number>(), |
| removeChatRun: vi |
| .fn() |
| .mockImplementation((run: string) => ({ sessionKey: "main", clientRunId: run })), |
| agentRunSeq: new Map<string, number>(), |
| broadcast: vi.fn(), |
| nodeSendToSession: vi.fn(), |
| logGateway: { warn: vi.fn() }, |
| ...overrides, |
| }; |
| } |
|
|
| export async function invokeChatAbortHandler(params: { |
| handler: GatewayRequestHandler; |
| context: ChatAbortTestContext; |
| request: { sessionKey: string; runId?: string }; |
| client?: { |
| connId?: string; |
| connect?: { |
| device?: { id?: string }; |
| scopes?: string[]; |
| }; |
| } | null; |
| respond?: ChatAbortRespondMock; |
| }): Promise<ChatAbortRespondMock> { |
| const respond = params.respond ?? vi.fn(); |
| await params.handler({ |
| params: params.request, |
| respond: respond as never, |
| context: params.context as never, |
| req: {} as never, |
| client: (params.client ?? null) as never, |
| isWebchatConnect: () => false, |
| }); |
| return respond; |
| } |
|
|