diff --git a/src/api/client.ts b/src/api/client.ts new file mode 100644 index 0000000..bd83d86 --- /dev/null +++ b/src/api/client.ts @@ -0,0 +1,41 @@ +import type { ApiErrorCode, ApiResponse } from "@/api/contracts/common"; + +export type MockClientOptions = { + latencyMs?: number; + errorRate?: number; +}; + +const defaultOptions: Required = { + latencyMs: 45, + errorRate: 0, +}; + +let options = defaultOptions; + +export function configureMockClient(next: MockClientOptions) { + options = { ...options, ...next }; +} + +export async function mockResponse( + data: T, + overrides?: { errorCode?: ApiErrorCode; message?: string; latencyMs?: number }, +): Promise> { + const latencyMs = overrides?.latencyMs ?? options.latencyMs; + await new Promise((resolve) => setTimeout(resolve, latencyMs)); + const requestId = `req_${Math.random().toString(16).slice(2, 10)}`; + if (overrides?.errorCode || Math.random() < options.errorRate) { + return { + data: null, + meta: { requestId, latencyMs }, + error: { + code: overrides?.errorCode ?? "NETWORK_ERROR", + message: overrides?.message ?? "The mock service could not complete the request.", + }, + }; + } + return { + data, + meta: { requestId, latencyMs }, + error: null, + }; +}