
























@@ -1,3 +1,4 @@
1+import { MAX_DATE_TIMESTAMP_MS } from "openclaw/plugin-sdk/number-runtime";
12import { describe, expect, it, vi } from "vitest";
23import { RateLimitError } from "./rest-errors.js";
34import { RestScheduler, type RestSchedulerOptions } from "./rest-scheduler.js";
@@ -68,4 +69,67 @@ describe("RestScheduler", () => {
6869expect(executor).toHaveBeenCalledTimes(1);
6970expect(scheduler.queueSize).toBe(0);
7071});
72+73+it("ignores 429 retry deadlines that exceed the Date range", () => {
74+vi.useFakeTimers();
75+vi.setSystemTime(MAX_DATE_TIMESTAMP_MS);
76+try {
77+const scheduler = new RestScheduler(createOptions(), vi.fn());
78+scheduler.recordResponse(
79+"GET /channels/c1/messages",
80+"/channels/c1/messages",
81+createJsonResponse(
82+{ message: "Rate limited", retry_after: 1, global: true },
83+{ status: 429 },
84+),
85+{ message: "Rate limited", retry_after: 1, global: true },
86+);
87+88+expect(scheduler.getMetrics().globalRateLimitUntil).toBe(0);
89+} finally {
90+vi.useRealTimers();
91+}
92+});
93+94+it("keeps immediate 429 retry deadlines working", () => {
95+vi.useFakeTimers();
96+vi.setSystemTime(new Date("2026-05-28T12:00:00.000Z"));
97+try {
98+const scheduler = new RestScheduler(createOptions(), vi.fn());
99+scheduler.recordResponse(
100+"GET /channels/c1/messages",
101+"/channels/c1/messages",
102+createJsonResponse(
103+{ message: "Rate limited", retry_after: 0, global: true },
104+{ status: 429 },
105+),
106+{ message: "Rate limited", retry_after: 0, global: true },
107+);
108+109+expect(scheduler.getMetrics().globalRateLimitUntil).toBe(Date.now());
110+} finally {
111+vi.useRealTimers();
112+}
113+});
114+115+it("rounds fractional millisecond 429 retry deadlines up", () => {
116+vi.useFakeTimers();
117+vi.setSystemTime(new Date("2026-05-28T12:00:00.000Z"));
118+try {
119+const scheduler = new RestScheduler(createOptions(), vi.fn());
120+scheduler.recordResponse(
121+"GET /channels/c1/messages",
122+"/channels/c1/messages",
123+createJsonResponse(
124+{ message: "Rate limited", retry_after: 0.0004, global: true },
125+{ status: 429 },
126+),
127+{ message: "Rate limited", retry_after: 0.0004, global: true },
128+);
129+130+expect(scheduler.getMetrics().globalRateLimitUntil).toBe(Date.now() + 1);
131+} finally {
132+vi.useRealTimers();
133+}
134+});
71135});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。