
























@@ -2,6 +2,7 @@ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
22import os from "node:os";
33import path from "node:path";
44import { resolveFetch } from "openclaw/plugin-sdk/fetch-runtime";
5+import { MAX_DATE_TIMESTAMP_MS } from "openclaw/plugin-sdk/number-runtime";
56import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
6778const setDefaultResultOrder = vi.hoisted(() => vi.fn());
@@ -1048,6 +1049,56 @@ describe("resolveTelegramFetch", () => {
10481049expectLoggerMessageContaining(loggerDebug, "fetch fallback: re-probing primary dispatcher");
10491050});
105010511052+it("does not treat fresh transport attempts as unhealthy when the process clock is invalid", async () => {
1053+const dateNowSpy = vi.spyOn(Date, "now").mockReturnValue(Number.NaN);
1054+try {
1055+undiciFetch.mockResolvedValueOnce({ ok: true } as Response);
1056+1057+const resolved = resolveTelegramFetchOrThrow(undefined, {
1058+network: {
1059+autoSelectFamily: true,
1060+},
1061+});
1062+1063+await resolved("https://api.telegram.org/botx/getMe");
1064+1065+expect(undiciFetch).toHaveBeenCalledTimes(1);
1066+expectNoLoggerMessageContaining(loggerWarn, "temporarily unhealthy");
1067+} finally {
1068+dateNowSpy.mockRestore();
1069+}
1070+});
1071+1072+it("does not cool down transport attempts when the expiry exceeds the Date range", async () => {
1073+const dateNowSpy = vi.spyOn(Date, "now").mockReturnValue(MAX_DATE_TIMESTAMP_MS);
1074+try {
1075+for (let i = 0; i < 10; i += 1) {
1076+undiciFetch.mockRejectedValueOnce(buildFetchFallbackError("ENETUNREACH"));
1077+}
1078+1079+const resolved = resolveTelegramFetchOrThrow(undefined, {
1080+network: {
1081+autoSelectFamily: true,
1082+dnsResultOrder: "ipv4first",
1083+},
1084+});
1085+1086+await expect(resolved("https://api.telegram.org/botx/deleteWebhook")).rejects.toThrow(
1087+"fetch failed",
1088+);
1089+for (let i = 0; i < 5; i += 1) {
1090+await expect(resolved("https://api.telegram.org/botx/getUpdates")).rejects.toThrow(
1091+"fetch failed",
1092+);
1093+}
1094+1095+expect(undiciFetch).toHaveBeenCalledTimes(8);
1096+expectNoLoggerMessageContaining(loggerWarn, "temporarily unhealthy");
1097+} finally {
1098+dateNowSpy.mockRestore();
1099+}
1100+});
1101+10511102it("preserves caller-provided dispatcher across fallback retry", async () => {
10521103const fetchError = buildFetchFallbackError("EHOSTUNREACH");
10531104undiciFetch.mockRejectedValueOnce(fetchError).mockResolvedValueOnce({ ok: true } as Response);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。