Skip to content

Поток подписки недоступен через IXrplClient: события закомментированы, остаётся только публичное поле connection #103

Description

@Platonenkov

Наблюдение

IXrplClient позволяет отправить команду подписки, но не позволяет получать поток.

Есть:

  • IXrplClient.Subscribe / UnsubscribeXrpl/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 при этом разумно закрыть или как минимум лишить публичного сеттера — но это уже следствие, а не суть задачи.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions