Skip to content

Commit db18b06

Browse files
committed
fix: keep Replicate retry delays browser compatible
1 parent 68b6f5c commit db18b06

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

packages/runtime/src/providers/replicate-retry.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
*/
1414

1515
import { createLogger } from "@nodetool-ai/config";
16-
import { setTimeout as waitForRetry } from "node:timers/promises";
1716
import { isFiniteNumber, isRecord, isString } from "@nodetool-ai/protocol";
17+
import { sleep } from "./http-transport.js";
1818

1919
const log = createLogger("nodetool.runtime.providers.replicate");
2020

@@ -101,11 +101,7 @@ export async function withReplicateRetry<T>(
101101
delayMs: delay,
102102
retryAfterMs: requested
103103
});
104-
if (signal) {
105-
await waitForRetry(delay, undefined, { signal });
106-
} else {
107-
await new Promise<void>((resolve) => setTimeout(resolve, delay));
108-
}
104+
await sleep(delay, signal);
109105
}
110106
}
111107
}

packages/runtime/tests/providers/replicate-retry.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,31 @@ describe("withReplicateRetry", () => {
9797
expect(run).toHaveBeenCalledTimes(2);
9898
});
9999

100+
it("returns a successful retry with a live cancellation signal", async () => {
101+
const run = vi
102+
.fn()
103+
.mockRejectedValueOnce(rateLimitError())
104+
.mockResolvedValue("ok");
105+
const controller = new AbortController();
106+
const result = withReplicateRetry("relight", run, controller.signal);
107+
108+
await vi.advanceTimersByTimeAsync(20_000);
109+
await expect(result).resolves.toBe("ok");
110+
expect(run).toHaveBeenCalledTimes(2);
111+
});
112+
113+
it("stops after cancellation during a rate-limit wait", async () => {
114+
const run = vi.fn().mockRejectedValue(rateLimitError());
115+
const controller = new AbortController();
116+
const result = withReplicateRetry("relight", run, controller.signal);
117+
118+
await Promise.resolve();
119+
controller.abort();
120+
await expect(result).rejects.toBe(controller.signal.reason);
121+
expect(run).toHaveBeenCalledTimes(1);
122+
expect(vi.getTimerCount()).toBe(0);
123+
});
124+
100125
it("waits wider than the ~5s the server quotes", async () => {
101126
const run = vi
102127
.fn()

0 commit comments

Comments
 (0)