Skip to content
Быстрые старты

Быстрый старт для C ABI и Dart

Используйте чистый C-интерфейс клиента ForestVPN — один заголовок, одна разделяемая библиотека — из C или сгенерируйте Dart-привязки для Flutter.

Самая низкоуровневая клиентская поверхность — это крейт forestvpn-client-ffi: полный клиентский движок ForestVPN, скомпилированный в разделяемую библиотеку с чистым C-заголовком по пути forestvpn-sdk/crates/forestvpn-client-ffi/include/forestvpn_client.h. Если ваш язык умеет вызывать C, он сможет управлять ForestVPN.

Честно о распространении: библиотека собирается из исходников — готового бинарника для скачивания нет, как нет пока и пакета на pub.dev для пути Dart.

Что понадобится

  • Набор инструментов Rust (rustup.rs)
  • Компилятор C (cc)
  • Локальная копия репозитория ForestVPN

1. Получите исходники и соберите библиотеку

git clone [email protected]:forestvpn/forestvpn.git
cd forestvpn/forestvpn-sdk
cargo build -p forestvpn-client-ffi --release

Имя библиотеки крейта — forestvpn, поэтому в результате появляется target/release/libforestvpn.dylib (macOS), .so (Linux) или forestvpn.dll (Windows), рядом со статической библиотекой.

2. Первый вызов: откройте клиент и прочитайте статус

first-call.c
#include <stdio.h>
#include <stdlib.h>

#include "forestvpn_client.h"

int main(void) {
  printf("ForestVPN client C ABI v%u\n", fvpn_abi_version());

  FvpnClient *client = NULL;
  int32_t rc = fvpn_client_open("/tmp/forestvpn-quickstart-state", &client);
  if (rc != FVPN_OK) {
    char message[512];
    fvpn_last_error_message(message, sizeof message);
    fprintf(stderr, "open failed (%d): %s\n", rc, message);
    return 1;
  }

  char *status_json = NULL;
  rc = fvpn_client_status_json(client, &status_json);
  if (rc == FVPN_OK) {
    printf("status: %s\n", status_json);
    fvpn_string_free(status_json);
  }

  fvpn_client_close(client);
  return rc == FVPN_OK ? 0 : 1;
}

Каждый вызов, способный завершиться ошибкой, возвращает FvpnStatus (FVPN_OK при успехе); при ошибке fvpn_last_error_message копирует человекочитаемое сообщение. Строки, которые выделяет библиотека, возвращаются через выходные параметры и освобождаются вызовом fvpn_string_free.

3. Скомпилируйте и запустите

Из корня репозитория:

cc -I forestvpn-sdk/crates/forestvpn-client-ffi/include \
   first-call.c \
   -L forestvpn-sdk/target/release -lforestvpn \
   -o first-call
./first-call

Ожидаемый вывод: строка с версией ABI, затем документ статуса клиента в формате JSON.

Dart / Flutter

Заголовок написан так, чтобы его напрямую использовал package:ffigen: у каждого долгого вызова есть асинхронный вариант, принимающий Dart-NativePort и идентификатор запроса (например, fvpn_client_status(client, dart_port, request_id) рядом с синхронным fvpn_client_status_json), поэтому результаты возвращаются в ваш isolate без блокировки. Направьте ffigen на forestvpn_client.h из вашего Flutter-проекта и поставляйте библиотеку из шага 1 вместе со сборкой приложения.

Чем проверяется

scripts/quickstart-verify/c-ffi.sh — компилирует сниппет с этой страницы против настоящего заголовка (cc -fsyntax-only -Wall -Werror) при каждом прогоне, поэтому показанные здесь функции гарантированно существуют с этими сигнатурами.