2.39.0

(feat): Generate interfaces for WebSocket API classes (e.g., IStreamApi, ITranscribeApi) to improve testability. Each WebSocket client now implements a corresponding interface that declares all public event properties, Status, ConnectAsync, Send, and CloseAsync. The root client interface (ICortiClient) also includes factory method signatures (CreateStreamApi, CreateTranscribeApi) when WebSockets are enabled.

2.38.1

(fix): Fix Event<T> thread-safety issue. RaiseEvent now snapshots the subscriber collections under a lock before iterating, and Subscribe, Unsubscribe, and UnsubscribeAll are synchronized to prevent InvalidOperationException when handlers are added or removed concurrently from different threads.

2.38.0

(feat): Add optional CancellationToken parameter to all public async WebSocket methods (ConnectAsync, CloseAsync, and Send overloads). The token is threaded through the internal WebSocketClient, WebSocketConnection, and down to the underlying ClientWebSocket.SendAsync/ConnectAsync/CloseAsync calls, enabling callers to cancel long-running WebSocket operations.

2.37.2

(fix): Fix WebSocket binary messages being sent with WebSocketMessageType.Text instead of WebSocketMessageType.Binary. RequestBinaryMessage and RequestBinarySegmentMessage now correctly use WebSocketMessageType.Binary when calling SendAsync, ensuring audio data (e.g. webm/opus chunks) is sent as binary frames.

2.37.1

(fix): Add ReadAsPropertyName and WriteAsPropertyName overrides to all remaining custom JsonConverter types: EnumSerializer<TEnum> (native C# enums), DateTimeSerializer, DateAsDateTimeConverter, discriminated union converters, and literal type converters. Without these overrides, System.Text.Json throws NotSupportedException when any of these types is used as a Dictionary<TKey, TValue> key. This complements the IStringEnum fix in 2.35.1.

2.37.0

(feat): Replace separate deserialization and serialization tests with a single round-trip serialization test using JsonAssert.Roundtrips<T>(inputJson). The helper deserializes JSON to T, re-serializes, and compares to the original JSON via JsonElement deep equality, producing diff-reportable failures.

2.36.0

(feat): Add UsingObjectDictionaryComparer to test comparers for handling Dictionary<string, object?> fields. System.Text.Json deserializes object? values as JsonElement, so structural equality comparisons need to serialize both sides before comparing. The UsingDefaults() chain now includes this comparer automatically.

2.35.1

(fix): Add ReadAsPropertyName and WriteAsPropertyName overrides to the generated IStringEnum JsonConverter. Without these overrides, System.Text.Json throws NotSupportedException at runtime when serializing or deserializing a Dictionary<TStringEnum, TValue>. This is applied to all generated IStringEnum types so dictionary-key usage works without requiring regeneration.

2.35.0

(fix): Fix WebSocket binary message sending. Binary messages (e.g. audio bytes) are now sent as raw bytes instead of being JSON-serialized, which caused servers to reject them with CONFIG_DENIED.

(fix): Fix WebSocket incoming message deserialization. TryDeserialize now passes JsonSerializerOptions so the generated literal property setters correctly validate const discriminator fields (e.g. type: "transcript" vs type: "flushed") during deserialization.

(feat): Add forward-compatible UnknownMessage event to WebSocket clients. When the server sends an event type not recognized by the SDK, it is now dispatched to the UnknownMessage event handler (as a JsonElement) instead of raising an exception. This allows SDKs to gracefully handle new server event types without requiring regeneration.