

























@@ -46,6 +46,9 @@ function createTypingHarness(overrides: TypingCallbackOverrides = {}) {
4646 ...(overrides.maxConsecutiveFailures !== undefined
4747 ? { maxConsecutiveFailures: overrides.maxConsecutiveFailures }
4848 : {}),
49+ ...(overrides.keepaliveIntervalMs !== undefined
50+ ? { keepaliveIntervalMs: overrides.keepaliveIntervalMs }
51+ : {}),
4952 ...(overrides.maxDurationMs !== undefined ? { maxDurationMs: overrides.maxDurationMs } : {}),
5053});
5154return { start, stop, onStartError, onStopError, callbacks };
@@ -147,6 +150,42 @@ describe("createTypingCallbacks", () => {
147150});
148151});
149152153+it("uses default keepalive and breaker options for non-finite overrides", async () => {
154+await withFakeTimers(async () => {
155+const { start, onStartError, callbacks } = createTypingHarness({
156+start: vi.fn().mockRejectedValue(new Error("gone")),
157+keepaliveIntervalMs: Number.NaN,
158+maxConsecutiveFailures: Number.NaN,
159+});
160+161+await callbacks.onReplyStart();
162+await flushMicrotasks();
163+expect(start).toHaveBeenCalledTimes(1);
164+165+await vi.advanceTimersByTimeAsync(2_999);
166+expect(start).toHaveBeenCalledTimes(1);
167+168+await vi.advanceTimersByTimeAsync(1);
169+expect(start).toHaveBeenCalledTimes(2);
170+expect(onStartError).toHaveBeenCalledTimes(2);
171+172+await vi.advanceTimersByTimeAsync(9_000);
173+expect(start).toHaveBeenCalledTimes(2);
174+});
175+});
176+177+it("keeps zero keepalive interval disabled", async () => {
178+await withFakeTimers(async () => {
179+const { start, callbacks } = createTypingHarness({ keepaliveIntervalMs: 0 });
180+181+await callbacks.onReplyStart();
182+expect(start).toHaveBeenCalledTimes(1);
183+184+await vi.advanceTimersByTimeAsync(9_000);
185+expect(start).toHaveBeenCalledTimes(1);
186+});
187+});
188+150189it("does not restart keepalive when breaker trips on initial start", async () => {
151190await withFakeTimers(async () => {
152191const { start, onStartError, callbacks } = createTypingHarness({
@@ -282,6 +321,20 @@ describe("createTypingCallbacks", () => {
282321});
283322});
284323324+it("uses default 60s TTL for non-finite maxDurationMs", async () => {
325+await withFakeTimers(async () => {
326+const { stop, callbacks } = createTypingHarness({ maxDurationMs: Number.NaN });
327+328+await callbacks.onReplyStart();
329+330+await vi.advanceTimersByTimeAsync(59_000);
331+expect(stop).not.toHaveBeenCalled();
332+333+await vi.advanceTimersByTimeAsync(1_000);
334+expect(stop).toHaveBeenCalledTimes(1);
335+});
336+});
337+285338it("disables TTL when maxDurationMs is 0", async () => {
286339await withFakeTimers(async () => {
287340const { stop, callbacks } = createTypingHarness({ maxDurationMs: 0 });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。