Skip to content

Conversation

@ssestak
Copy link

@ssestak ssestak commented Jan 8, 2026

Refactor network observation mechanism from a single tracer to a flexible observer protocol. This change replaces the concrete FTNetworkTracer dependency with a new NetworkObserver protocol, allowing for multiple custom observers. The URLServer now supports an array of observers that receive lifecycle callbacks for each request.

Key Features:

  • Decoupled Network Observation: Replaced the concrete FTNetworkTracer dependency with a protocol-oriented NetworkObserver, enhancing flexibility and extensibility.
  • Support for Multiple Observers: The URLServer now manages an array of NetworkObserver instances, enabling different modules to independently observe network events.
  • Contextual Callbacks: The new NetworkObserver protocol uses an associatedtype Context to pass correlation data (e.g., request ID, start time) between willSendRequest and subsequent completion callbacks.
  • Improved Testability: Dedicated NetworkObserverTests and a MockNetworkObserver demonstrate better test isolation and clarity.
  • Simplified Package.swift: Removed the external dependency on FTNetworkTracer.

Changes Summary:

Feature Before (Legacy) After (New)
Observation Mechanism Single FTNetworkTracer? Array of [any NetworkObserver]
Dependency External FTNetworkTracer Internal NetworkObserver protocol
Context Handling Manual requestId, startTime associatedtype Context managed by observer
Test Coverage NetworkTracerIntegrationTests (deleted) NetworkObserverTests (new)

…ware

- Remove hard dependency on FTNetworkTracer package
- Introduce NetworkObserver protocol with type-safe associated Context
- Support array of middlewares for multiple observers
- Zero overhead when no observers configured (empty array = no work)
- Use RequestToken pattern for type erasure while preserving type safety

Breaking change: `networkTracer: FTNetworkTracer?` replaced with
`networkObservers: [any NetworkObserver]`
@ssestak ssestak requested a review from jmarek41 January 8, 2026 07:21
Explicitly document that `didReceiveResponse` is always invoked with raw data, and `didFail` is an additional callback for errors occurring after the response is received. Update tests to assert this behavior.
@ssestak ssestak force-pushed the refactor/replace-tracer-with-observer-middleware branch from 72cbaaa to 87b0bb2 Compare January 8, 2026 07:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants