retry.test.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { describe, expect, test } from "bun:test"
  2. import { SessionRetry } from "../../src/session/retry"
  3. import { MessageV2 } from "../../src/session/message-v2"
  4. function apiError(headers?: Record<string, string>): MessageV2.APIError {
  5. return new MessageV2.APIError({
  6. message: "boom",
  7. isRetryable: true,
  8. responseHeaders: headers,
  9. }).toObject() as MessageV2.APIError
  10. }
  11. describe("session.retry.getRetryDelayInMs", () => {
  12. test("doubles delay on each attempt when headers missing", () => {
  13. const error = apiError()
  14. const delays = Array.from({ length: 7 }, (_, index) =>
  15. SessionRetry.getRetryDelayInMs(error, index + 1),
  16. )
  17. expect(delays).toStrictEqual([2000, 4000, 8000, 16000, 32000, 64000, 128000])
  18. })
  19. test("prefers retry-after-ms when shorter than exponential", () => {
  20. const error = apiError({ "retry-after-ms": "1500" })
  21. expect(SessionRetry.getRetryDelayInMs(error, 4)).toBe(1500)
  22. })
  23. test("uses retry-after seconds when reasonable", () => {
  24. const error = apiError({ "retry-after": "30" })
  25. expect(SessionRetry.getRetryDelayInMs(error, 3)).toBe(30000)
  26. })
  27. test("falls back to exponential when server delay is long", () => {
  28. const error = apiError({ "retry-after": "120" })
  29. expect(SessionRetry.getRetryDelayInMs(error, 2)).toBe(4000)
  30. })
  31. test("accepts http-date retry-after values", () => {
  32. const date = new Date(Date.now() + 20000).toUTCString()
  33. const error = apiError({ "retry-after": date })
  34. const delay = SessionRetry.getRetryDelayInMs(error, 1)
  35. expect(delay).toBeGreaterThanOrEqual(19000)
  36. expect(delay).toBeLessThanOrEqual(20000)
  37. })
  38. test("ignores invalid retry hints", () => {
  39. const error = apiError({ "retry-after": "not-a-number" })
  40. expect(SessionRetry.getRetryDelayInMs(error, 1)).toBe(2000)
  41. })
  42. })