Skip to content

Commit d36a4cc

Browse files
feat: structured client debug pipeline (debug, logger, stages)
- Add OpenFetchConfig.debug and logger with OpenFetchDebugEvent - Emit lifecycle events from client, dispatch, and retry (basic vs verbose) - Redact URLs and mask headers in debug output; classify retry reasons - Export OpenFetchDebugEvent; add debug-pipeline tests Made-with: Cursor
1 parent 6040495 commit d36a4cc

20 files changed

Lines changed: 711 additions & 48 deletions

dist/domain/types.d.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import type { StandardSchemaV1 } from "./standardSchema.js";
44
export type NextFn = () => Promise<void>;
55
export type TransformRequest = (data: unknown, headers: Record<string, string>) => unknown | Promise<unknown>;
66
export type TransformResponse<T = unknown> = (data: unknown) => T | Promise<T>;
7+
/** Structured record emitted when {@link OpenFetchConfig.debug} is enabled. */
8+
export type OpenFetchDebugEvent = {
9+
stage: string;
10+
timestamp: number;
11+
} & Record<string, unknown>;
712
/** Per-request overrides for the memory cache middleware. */
813
export type OpenFetchMemoryCacheRequestOptions = {
914
ttlMs?: number;
@@ -77,6 +82,14 @@ export type OpenFetchConfig = {
7782
* Default false — return full `OpenFetchResponse`.
7883
*/
7984
unwrapResponse?: boolean;
85+
/**
86+
* DevTools-style lifecycle logging. `true` / `"verbose"` emit structured events for the full
87+
* pipeline (merge, fetch, retries, parse, schema). `"basic"` logs `request`, final `response`,
88+
* and `error` only. Events go to {@link OpenFetchConfig.logger} or `console.debug`.
89+
*/
90+
debug?: boolean | "basic" | "verbose";
91+
/** Custom sink for structured {@link OpenFetchDebugEvent} records when `debug` is enabled. */
92+
logger?: (log: OpenFetchDebugEvent) => void;
8093
} & Partial<Pick<RequestInit, "cache" | "credentials" | "integrity" | "keepalive" | "mode" | "redirect" | "referrer" | "referrerPolicy">>;
8194
export type OpenFetchResponse<T = unknown> = {
8295
data: T;

dist/domain/types.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ export { cloneResponse } from "./shared/cloneResponse.js";
1919
export { SchemaValidationError, isSchemaValidationError, } from "./domain/schemaValidationError.js";
2020
export { OpenFetchForceRetry, isOpenFetchForceRetry, } from "./domain/forceRetry.js";
2121
export type { StandardSchemaV1, StandardSchemaV1InferOutput, StandardSchemaV1Issue, StandardSchemaV1Options, StandardSchemaV1Result, StandardSchemaV1SuccessResult, StandardSchemaV1FailureResult, StandardSchemaV1Types, } from "./domain/standardSchema.js";
22-
export type { Middleware, NextFn, OpenFetchClient, OpenFetchConfig, OpenFetchContext, OpenFetchInterceptors, OpenFetchMemoryCacheRequestOptions, OpenFetchResponse, OpenFetchRetryOptions, RequestConfig, TransformRequest, TransformResponse, } from "./types/index.js";
22+
export type { Middleware, NextFn, OpenFetchClient, OpenFetchConfig, OpenFetchContext, OpenFetchDebugEvent, OpenFetchInterceptors, OpenFetchMemoryCacheRequestOptions, OpenFetchResponse, OpenFetchRetryOptions, RequestConfig, TransformRequest, TransformResponse, } from "./types/index.js";
2323
//# sourceMappingURL=index.d.ts.map

dist/index.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/runtime/client.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)