Установка
@grpc/grpc-js и yaml - опциональные peer-зависимости. Устанавливайте их, только если используете gRPC-клиент (или YAML-конфиг).
Сборка клиента
Пример клиента со всеми опциями:Методы билдера
.url(url) - основной gRPC-эндпоинт. Резерв: переменная окружения ORBITFLARE_GRPC_URL.
.urls([...]) - основной и резервные за один вызов. Первый элемент - основной.
.fallbackUrl(url) / .fallbackUrls([...]) - добавить резервные эндпоинты. При сбое подключения SDK перебирает их по очереди.
.retry(policy) - управление backoff при переподключении. Когда соединение падает, SDK ждёт initialDelayMs, затем удваивает задержку на каждой попытке (ограничение maxDelayMs). maxAttempts: 0 - бесконечные повторы. По умолчанию: 100 мс начальная, 30 с максимум, множитель 2×, бесконечно.
.timeoutSecs(n) - таймаут gRPC на запрос. По умолчанию: 30.
.keepaliveSecs(n) - интервал TCP keepalive. ОС отправляет пробу с этим интервалом для обнаружения мёртвых соединений на уровне TCP. По умолчанию: 60.
.pingIntervalSecs(n) - как часто SDK отправляет на уровне proto сообщения Ping. Сервер должен ответить Pong. По умолчанию: 10.
.maxMissedPongs(n) - сколько подряд ping без ответа допускается, прежде чем SDK считает соединение мёртвым и переподключится. По умолчанию: 3. С дефолтами «мёртвое» соединение обнаруживается примерно за 30 секунд.
.channelCapacity(n) - ограниченный буфер между фоновой задачей и вашим кодом. Если обработка событий медленная, фоновая задача приостанавливается при заполнении вместо неограниченного роста памяти. По умолчанию: 4096.
Написание YAML-конфига
Создайте YAML с нужными фильтрами:Справочник фильтров YAML
transactions - каждая запись - именованный фильтр. Транзакция попадает, если задействован любой адрес из account_include. account_exclude исключает совпадения. account_required - все перечисленные адреса должны присутствовать. vote и failed фильтруют тип транзакции.
accounts - следить за конкретными аккаунтами по адресу или за всеми аккаунтами программы через owner.
slots - подписка на обновления слотов. filter_by_commitment отправляет обновления только на вашем уровне commitment.
commitment - 'processed', 'confirmed' или 'finalized'. По умолчанию 'confirmed'.
В YAML поддерживается подстановка ${ENV_VAR}:
Подписка и чтение событий
Из YAML
Программно
Для динамических фильтров во время выполнения:Чтение потока
ИsubscribeYaml, и subscribe возвращают GeyserStream. Это асинхронно итерируемый объект - используйте for await:
await stream.next() напрямую, чтобы получать события по одному. Возвращает undefined, когда поток закрыт. Если повторы исчерпаны, следующая итерация выбрасывает исключение.
Сообщения Pong потребляются внутри и в ваш поток не попадают.
Закрытие
Несколько потоков
Один клиент может держать много потоков одновременно. У каждого свой фоновый коннект:Полный пример
Поток следит за транзакциями pump.fun, декодирует подпись и печатает краткое резюме.grpc.yml: