Быстрый старт для 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. Первый вызов: откройте клиент и прочитайте статус
#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) при каждом
прогоне, поэтому показанные здесь функции гарантированно существуют с этими
сигнатурами.