Наблюдение
IXrplClient позволяет отправить команду подписки, но не позволяет получать поток.
Есть:
IXrplClient.Subscribe / Unsubscribe — Xrpl/Client/IXrplClient.cs:81,85.
Нет:
- события потока на интерфейсе закомментированы (
Xrpl/Client/IXrplClient.cs:483-491):
//public event OnError OnError;
//public event OnConnected OnConnected;
//public event OnDisconnect OnDisconnect;
//public event OnLedgerClosed OnLedgerClosed;
//public event OnTransaction OnTransaction;
Работающие события есть только на Connection (Xrpl/Client/connection.cs:88,90), диспетчеризация — строки 3049 и 3069.
Почему это проблема
Единственный путь к потоку сегодня — публичное свойство на конкретном классе:
// Xrpl/Client/IXrplClient.cs:467
public Connection connection { get; set; }
Это лазейка, а не контракт:
- свойства нет на интерфейсе, поэтому код, работающий через
IXrplClient, не может подписаться и не может быть покрыт тестом с подменённым клиентом;
- сеттер публичный — внешний код может подменить соединение целиком у живого клиента;
- имя в нижнем регистре выдаёт незапланированность.
Итог: подписка через SDK формально существует, но пользоваться ей можно только отказавшись от абстракции, которую сам SDK и предлагает.
Ожидаемое
Подписка на поток становится частью контракта IXrplClient: подписаться, получать сообщения, отписаться — не зная о существовании Connection.
Форма на усмотрение реализации — события, IAsyncEnumerable<T>, System.Threading.Channels или колбэки при подписке. Выбор стоит обосновать: он определяет и семантику доставки (см. отдельный issue про выполнение обработчика внутри приёмного цикла).
Свойство connection при этом разумно закрыть или как минимум лишить публичного сеттера — но это уже следствие, а не суть задачи.
Наблюдение
IXrplClientпозволяет отправить команду подписки, но не позволяет получать поток.Есть:
IXrplClient.Subscribe/Unsubscribe—Xrpl/Client/IXrplClient.cs:81,85.Нет:
Xrpl/Client/IXrplClient.cs:483-491):Работающие события есть только на
Connection(Xrpl/Client/connection.cs:88,90), диспетчеризация — строки 3049 и 3069.Почему это проблема
Единственный путь к потоку сегодня — публичное свойство на конкретном классе:
Это лазейка, а не контракт:
IXrplClient, не может подписаться и не может быть покрыт тестом с подменённым клиентом;Итог: подписка через SDK формально существует, но пользоваться ей можно только отказавшись от абстракции, которую сам SDK и предлагает.
Ожидаемое
Подписка на поток становится частью контракта
IXrplClient: подписаться, получать сообщения, отписаться — не зная о существованииConnection.Форма на усмотрение реализации — события,
IAsyncEnumerable<T>,System.Threading.Channelsили колбэки при подписке. Выбор стоит обосновать: он определяет и семантику доставки (см. отдельный issue про выполнение обработчика внутри приёмного цикла).Свойство
connectionпри этом разумно закрыть или как минимум лишить публичного сеттера — но это уже следствие, а не суть задачи.