feat(client): Improve initialization state handling in McpAsyncClient (#39)

- Add proper initialization state tracking using AtomicBoolean and Sinks
- Implement timeout handling for requests requiring initialization
- Ensure all client methods verify initialization state before proceeding
- Fix rootsListChangedNotification to check initialization state
- Improve error messages for uninitialized client operations
- improve JavaDoc
- Add tests to verify proper error handling for uninitialized clients
  - Replace hardcoded timeout constants with configurable getTimeoutDuration() method
  - Remove automatic initialization in setUp methods to allow explicit testing

Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
This commit is contained in:
Christian Tzolov 2025-03-13 15:13:50 +01:00 • committed by GitHub
commit 109aab20e8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 613 additions and 242 deletions

View file

@ -4,6 +4,8 @@
package io.modelcontextprotocol.client;
import java.time.Duration;
import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
import io.modelcontextprotocol.spec.ClientMcpTransport;
import org.junit.jupiter.api.Timeout;
@ -46,4 +48,9 @@ class WebFluxSseMcpAsyncClientTests extends AbstractMcpAsyncClientTests {
container.stop();
}
@Override
protected Duration getTimeoutDuration() {
return Duration.ofMillis(300);
}
}

View file

@ -4,6 +4,8 @@
package io.modelcontextprotocol.client;
import java.time.Duration;
import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
import io.modelcontextprotocol.spec.ClientMcpTransport;
import org.junit.jupiter.api.Timeout;
@ -46,4 +48,9 @@ class WebFluxSseMcpSyncClientTests extends AbstractMcpSyncClientTests {
container.stop();
}
@Override
protected Duration getTimeoutDuration() {
return Duration.ofMillis(300);
}
}