Установка
Сборка клиента
Клиент со всеми заданными опциями:ORBITFLARE_GRPC_URL.
Методы билдера
.URL(url) - Основной gRPC-эндпоинт. Резерв: ORBITFLARE_GRPC_URL. Используйте http:// для незашифрованного HTTP/2 и https:// для TLS.
.URLs(urls...) - Основной и резервные одним вызовом. Первый элемент - основной.
.FallbackURL(url) / .FallbackURLs(urls...) - Добавить резервные эндпоинты. При сбое соединения SDK перебирает их.
.Retry(policy) - Управляет backoff при переподключении. При обрыве соединения SDK ждёт InitialDelay, затем увеличивает задержку на каждой попытке (не выше MaxDelay). MaxAttempts равное 0 - бесконечные повторы. По умолчанию: 100 мс начальная, 30 с максимум, множитель 2x, бесконечно.
.Timeout(duration) - Таймаут подключения/набора. По умолчанию 30 с.
.Keepalive(duration) - Интервал keepalive TCP/HTTP2, используется для обнаружения мёртвых соединений на транспортном уровне. По умолчанию 60 с.
.PingInterval(duration) - Как часто SDK отправляет Ping-сообщения уровня протокола серверу. Сервер должен отвечать Pong. По умолчанию 10 с.
.MaxMissedPongs(n) - Сколько последовательных ping могут остаться без ответа, прежде чем SDK сочтёт соединение мёртвым и переподключится. По умолчанию 3. При значениях по умолчанию мёртвое соединение обнаруживается в течение 30 секунд.
.ChannelCapacity(n) - Ограниченный канал между фоновой горутиной и вашим кодом. Если ваш код медленно потребляет события, фоновая горутина блокируется при заполнении канала, а не расходует неограниченную память. По умолчанию 4096.
.Logger(logger) - *slog.Logger для событий жизненного цикла соединения. Если не задан, управляется через ORBITFLARE_LOG.
Построение подписки
Фильтры строятся программно с помощьюSubscribeRequestBuilder и типизированных типов фильтров. Транзакция совпадает, если задействует любой адрес из AccountInclude; AccountExclude убирает совпадения; AccountRequired требует присутствия всех перечисленных адресов.
Типы фильтров
NewTransactionFilter()-Vote(bool),Failed(bool),Signature(string),AccountInclude(...),AccountExclude(...),AccountRequired(...).NewAccountFilter()-Account(...),Owner(...),Datasize(uint64),TokenAccountState(bool),Memcmp(...),Lamports(...),NonemptyTxnSignature(bool).NewSlotFilter()-FilterByCommitment(bool),InterslotUpdates(bool).NewBlockFilter()-AccountInclude(...),IncludeTransactions(bool),IncludeAccounts(bool),IncludeEntries(bool).NewDeshredTransactionFilter()-Vote(bool),AccountInclude(...),AccountExclude(...),AccountRequired(...).
Memcmp строится через geyser.MemcmpBytes(offset, []byte), geyser.MemcmpBase58(offset, string) или geyser.MemcmpBase64(offset, string). Lamports - через geyser.LamportsEq/Ne/Lt/Gt(uint64). Commitment - одно из geyser.Processed, geyser.Confirmed, geyser.Finalized.
Subscribe также принимает сырой *geyser.SubscribeRequest (реэкспорт proto-типа), если вы предпочитаете собрать его вручную.
Чтение потока
Subscribe возвращает *geyser.Stream. Вызовите Next(ctx), чтобы получить следующее обновление:
Next(ctx) блокируется до прихода события. Возвращает io.EOF после завершения потока (в том числе после Close); любая другая ненулевая ошибка фатальна для этого потока. Также возвращает ctx.Err(), если контекст отменён. Сообщения Pong обрабатываются внутри и никогда не попадают в ваш поток.
Закрытие
client.Close() останавливает каждый поток, запущенный клиентом.