


























@@ -12,23 +12,23 @@ type AbortResponsePayload = {
1212};
1313type AbortRespond = Awaited<ReturnType<typeof invokeChatAbortHandler>>;
141415-async function invokeSingleRunAbort({
15+async function invokeAbort({
1616 context,
17- runId = "run-1",
17+ runId,
1818 connId,
1919 deviceId,
20- scopes,
20+ scopes = ["operator.write"],
2121}: {
2222context: ReturnType<typeof createChatAbortContext>;
2323runId?: string;
2424connId: string;
2525deviceId: string;
26-scopes: string[];
26+scopes?: string[];
2727}) {
2828return await invokeChatAbortHandler({
2929handler: chatHandlers["chat.abort"],
3030 context,
31-request: { sessionKey: "main", runId },
31+request: { sessionKey: "main", ...(runId ? { runId } : {}) },
3232client: {
3333 connId,
3434connect: { device: { id: deviceId }, scopes },
@@ -56,12 +56,22 @@ function requireLastRespondCall(respond: AbortRespond) {
5656return call;
5757}
585859+function expectAbortPayload(
60+payload: unknown,
61+expected: { aborted: boolean; runIds: string[] },
62+): void {
63+const abortPayload = payload as AbortResponsePayload | undefined;
64+expect(abortPayload?.aborted).toBe(expected.aborted);
65+expect(abortPayload?.runIds).toEqual(expected.runIds);
66+}
67+5968describe("chat.abort authorization", () => {
6069it("rejects explicit run aborts from other clients", async () => {
6170const context = createSingleAbortContext();
627163-const respond = await invokeSingleRunAbort({
72+const respond = await invokeAbort({
6473 context,
74+runId: "run-1",
6575connId: "conn-other",
6676deviceId: "dev-other",
6777scopes: ["operator.write"],
@@ -82,21 +92,16 @@ describe("chat.abort authorization", () => {
8292]),
8393});
849485-const respond = await invokeChatAbortHandler({
86-handler: chatHandlers["chat.abort"],
95+const respond = await invokeAbort({
8796 context,
88-request: { sessionKey: "main", runId: "run-1" },
89-client: {
90-connId: "conn-new",
91-connect: { device: { id: "dev-1" }, scopes: ["operator.write"] },
92-},
97+runId: "run-1",
98+connId: "conn-new",
99+deviceId: "dev-1",
93100});
9410195102const [ok, payload] = requireLastRespondCall(respond);
96103expect(ok).toBe(true);
97-const abortPayload = payload as AbortResponsePayload | undefined;
98-expect(abortPayload?.aborted).toBe(true);
99-expect(abortPayload?.runIds).toEqual(["run-1"]);
104+expectAbortPayload(payload, { aborted: true, runIds: ["run-1"] });
100105expect(context.chatAbortControllers.has("run-1")).toBe(false);
101106});
102107@@ -107,21 +112,15 @@ describe("chat.abort authorization", () => {
107112]),
108113});
109114110-const respond = await invokeChatAbortHandler({
111-handler: chatHandlers["chat.abort"],
115+const respond = await invokeAbort({
112116 context,
113-request: { sessionKey: "main" },
114-client: {
115-connId: "conn-owner",
116-connect: { device: { id: "dev-owner" }, scopes: ["operator.write"] },
117-},
117+connId: "conn-owner",
118+deviceId: "dev-owner",
118119});
119120120121const [ok, payload] = requireLastRespondCall(respond);
121122expect(ok).toBe(true);
122-const abortPayload = payload as AbortResponsePayload | undefined;
123-expect(abortPayload?.aborted).toBe(false);
124-expect(abortPayload?.runIds).toEqual([]);
123+expectAbortPayload(payload, { aborted: false, runIds: [] });
125124expect(context.chatAbortControllers.has("run-hidden")).toBe(true);
126125});
127126@@ -147,14 +146,11 @@ describe("chat.abort authorization", () => {
147146]),
148147});
149148150-const respond = await invokeChatAbortHandler({
151-handler: chatHandlers["chat.abort"],
149+const respond = await invokeAbort({
152150 context,
153-request: { sessionKey: "main", runId: "run-1" },
154-client: {
155-connId: "conn-owner",
156-connect: { device: { id: "dev-1" }, scopes: ["operator.write"] },
157-},
151+runId: "run-1",
152+connId: "conn-owner",
153+deviceId: "dev-1",
158154});
159155160156const [ok, payload] = respond.mock.calls.at(-1) ?? [];
@@ -172,39 +168,32 @@ describe("chat.abort authorization", () => {
172168]),
173169});
174170175-const respond = await invokeChatAbortHandler({
176-handler: chatHandlers["chat.abort"],
171+const respond = await invokeAbort({
177172 context,
178-request: { sessionKey: "main" },
179-client: {
180-connId: "conn-1",
181-connect: { device: { id: "dev-1" }, scopes: ["operator.write"] },
182-},
173+connId: "conn-1",
174+deviceId: "dev-1",
183175});
184176185177const [ok, payload] = requireLastRespondCall(respond);
186178expect(ok).toBe(true);
187-const abortPayload = payload as AbortResponsePayload | undefined;
188-expect(abortPayload?.aborted).toBe(true);
189-expect(abortPayload?.runIds).toEqual(["run-mine"]);
179+expectAbortPayload(payload, { aborted: true, runIds: ["run-mine"] });
190180expect(context.chatAbortControllers.has("run-mine")).toBe(false);
191181expect(context.chatAbortControllers.has("run-other")).toBe(true);
192182});
193183194184it("allows operator.admin clients to bypass owner checks", async () => {
195185const context = createSingleAbortContext();
196186197-const respond = await invokeSingleRunAbort({
187+const respond = await invokeAbort({
198188 context,
189+runId: "run-1",
199190connId: "conn-admin",
200191deviceId: "dev-admin",
201192scopes: ["operator.admin"],
202193});
203194204195const [ok, payload] = requireLastRespondCall(respond);
205196expect(ok).toBe(true);
206-const abortPayload = payload as AbortResponsePayload | undefined;
207-expect(abortPayload?.aborted).toBe(true);
208-expect(abortPayload?.runIds).toEqual(["run-1"]);
197+expectAbortPayload(payload, { aborted: true, runIds: ["run-1"] });
209198});
210199});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。