Buckets:
| import { describe, expect, test } from "bun:test" | |
| import type { ServerConnection } from "@/context/server" | |
| import { checkServerHealth } from "./server-health" | |
| const server: ServerConnection.HttpBase = { | |
| url: "http://localhost:4096", | |
| } | |
| function abortFromInput(input: RequestInfo | URL, init?: RequestInit) { | |
| if (init?.signal) return init.signal | |
| if (input instanceof Request) return input.signal | |
| return undefined | |
| } | |
| describe("checkServerHealth", () => { | |
| test("returns healthy response with version", async () => { | |
| const fetch = (async () => | |
| new Response(JSON.stringify({ healthy: true, version: "1.2.3" }), { | |
| status: 200, | |
| headers: { "content-type": "application/json" }, | |
| })) as unknown as typeof globalThis.fetch | |
| const result = await checkServerHealth(server, fetch) | |
| expect(result).toEqual({ healthy: true, version: "1.2.3" }) | |
| }) | |
| test("allows slow servers thirty seconds by default", async () => { | |
| const timeout = Object.getOwnPropertyDescriptor(AbortSignal, "timeout") | |
| let timeoutMs = 0 | |
| Object.defineProperty(AbortSignal, "timeout", { | |
| configurable: true, | |
| value: (ms: number) => { | |
| timeoutMs = ms | |
| return new AbortController().signal | |
| }, | |
| }) | |
| const fetch = (async () => | |
| new Response(JSON.stringify({ healthy: true, version: "1.2.3" }), { | |
| status: 200, | |
| headers: { "content-type": "application/json" }, | |
| })) as unknown as typeof globalThis.fetch | |
| await checkServerHealth(server, fetch).finally(() => { | |
| if (timeout) Object.defineProperty(AbortSignal, "timeout", timeout) | |
| if (!timeout) Reflect.deleteProperty(AbortSignal, "timeout") | |
| }) | |
| expect(timeoutMs).toBe(30_000) | |
| }) | |
| test("returns unhealthy when request fails", async () => { | |
| const fetch = (async () => { | |
| throw new Error("network") | |
| }) as unknown as typeof globalThis.fetch | |
| const result = await checkServerHealth(server, fetch) | |
| expect(result).toEqual({ healthy: false }) | |
| }) | |
| test("uses timeout fallback when AbortSignal.timeout is unavailable", async () => { | |
| const timeout = Object.getOwnPropertyDescriptor(AbortSignal, "timeout") | |
| Object.defineProperty(AbortSignal, "timeout", { | |
| configurable: true, | |
| value: undefined, | |
| }) | |
| let aborted = false | |
| const fetch = ((input: RequestInfo | URL, init?: RequestInit) => | |
| new Promise<Response>((_resolve, reject) => { | |
| const signal = abortFromInput(input, init) | |
| signal?.addEventListener( | |
| "abort", | |
| () => { | |
| aborted = true | |
| reject(new DOMException("Aborted", "AbortError")) | |
| }, | |
| { once: true }, | |
| ) | |
| })) as unknown as typeof globalThis.fetch | |
| const result = await checkServerHealth(server, fetch, { | |
| timeoutMs: 10, | |
| }).finally(() => { | |
| if (timeout) Object.defineProperty(AbortSignal, "timeout", timeout) | |
| if (!timeout) Reflect.deleteProperty(AbortSignal, "timeout") | |
| }) | |
| expect(aborted).toBe(true) | |
| expect(result).toEqual({ healthy: false }) | |
| }) | |
| test("uses provided abort signal", async () => { | |
| let signal: AbortSignal | undefined | |
| const fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { | |
| signal = abortFromInput(input, init) | |
| return new Response(JSON.stringify({ healthy: true, version: "1.2.3" }), { | |
| status: 200, | |
| headers: { "content-type": "application/json" }, | |
| }) | |
| }) as unknown as typeof globalThis.fetch | |
| const abort = new AbortController() | |
| await checkServerHealth(server, fetch, { | |
| signal: abort.signal, | |
| }) | |
| expect(signal).toBe(abort.signal) | |
| }) | |
| test("retries transient failures and eventually succeeds", async () => { | |
| let count = 0 | |
| const fetch = (async () => { | |
| count += 1 | |
| if (count < 3) throw new TypeError("network") | |
| return new Response(JSON.stringify({ healthy: true, version: "1.2.3" }), { | |
| status: 200, | |
| headers: { "content-type": "application/json" }, | |
| }) | |
| }) as unknown as typeof globalThis.fetch | |
| const result = await checkServerHealth(server, fetch, { | |
| retryCount: 2, | |
| retryDelayMs: 1, | |
| }) | |
| expect(count).toBe(3) | |
| expect(result).toEqual({ healthy: true, version: "1.2.3" }) | |
| }) | |
| test("returns unhealthy when retries are exhausted", async () => { | |
| let count = 0 | |
| const fetch = (async () => { | |
| count += 1 | |
| throw new TypeError("network") | |
| }) as unknown as typeof globalThis.fetch | |
| const result = await checkServerHealth(server, fetch, { | |
| retryCount: 2, | |
| retryDelayMs: 1, | |
| }) | |
| expect(count).toBe(3) | |
| expect(result).toEqual({ healthy: false }) | |
| }) | |
| }) | |
Xet Storage Details
- Size:
- 4.7 kB
- Xet hash:
- d1c22430ce06f1ec25e4e38e004db5b0451a645a65925098bb08e29a72e7986b
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.