Skip to content

Публичный интерфейс библиотеки oneflag-sdk

Классы

Сводка методов

ЕдиницаМетодВозвращает
OneFlagProviderИнициализировать(Контекст = Неопределено)-
OneFlagProviderЗавершить()-
OneFlagProviderСостояние()Строка
OneFlagProviderМетаданные()Структура
OneFlagProviderОбновитьСнимок()Булево
OneFlagProviderЖивоеОбновлениеРаботает()Булево
OneFlagProviderКлючиФлагов()Массив
OneFlagProviderПоследняяОшибка()Строка
OneFlagProviderОбновленийПолученоЧисло
OneFlagProviderВычислитьЛогическое(Ключ, ЗначениеПоУмолчанию, Контекст)ResolutionDetails
OneFlagProviderВычислитьСтроку(Ключ, ЗначениеПоУмолчанию, Контекст)ResolutionDetails
OneFlagProviderВычислитьЧисло(Ключ, ЗначениеПоУмолчанию, Контекст)ResolutionDetails
OneFlagProviderВычислитьОбъект(Ключ, ЗначениеПоУмолчанию, Контекст)ResolutionDetails
FlagEvaluatorОценитьПоСнимку(Ключ, Настройка, Контекст, ЗначениеПоУмолчанию)Соответствие

Методы контракта провайдера (Вычислить..., Метаданные) вызывает клиент OpenFeature - напрямую они не нужны.

Обмен с сервером

ЗапросКогда
GET /api/snapshot?env=<окружение>При инициализации и при каждом обновлении снимка
GET /streamОдин раз после успешной инициализации, читается до закрытия

Запрос снимка уходит с заголовками Authorization: Bearer <ключ SDK> и Accept: application/json. Поток подключается без заголовка авторизации. Снимок обновляется по событиям потока, чей тип начинается с com.oneflag.flag..


Класс FlagEvaluator

Правила разрешения значения флага по элементу снимка конфигурации. Состояния не хранит, поэтому один экземпляр обслуживает любое число оценок.

Тот же класс используется сервером OneFlag. Общий код исключает расхождение между тем, что показывает дашборд, и тем, что видит приложение.

Исходник: src/Классы/FlagEvaluator.os

Конструктор

bsl
Новый FlagEvaluator()

Параметров нет.

ОценитьПоСнимку

bsl
Функция ОценитьПоСнимку(Знач Ключ, Знач Настройка, Знач Контекст = Неопределено,
	Знач ЗначениеПоУмолчанию = Неопределено) Экспорт

Разрешает значение флага по его настройке в окружении.

Параметры

ПараметрТипНазначение
КлючСтрокаКлюч флага. Участвует в хешировании процентной выкатки
НастройкаСоответствиеЭлемент снимка конфигурации
КонтекстСоответствиеАтрибуты пользователя, включая targetingKey
ЗначениеПоУмолчаниюПроизвольныйЗначение при внештатной ситуации

Поля Настройка:

ПолеТипНазначение
включенБулевоФлаг включён в окружении
вариантыСоответствиеИмя варианта → значение
вариантПоУмолчаниюСтрокаВариант, когда правила не сработали
процентВыкаткиЧислоДоля аудитории, 100 по умолчанию
правилаМассивПравила таргетинга, проверяются по порядку

Возвращаемое значение

Соответствие с полями:

ПолеТипСодержимое
значениеПроизвольныйЗначение варианта либо ЗначениеПоУмолчанию
вариантСтрокаИмя выбранного варианта, пустая строка при отказе
причинаСтрокаSTATIC, TARGETING_MATCH, SPLIT, DISABLED или ERROR
кодОшибкиСтрокаКод ошибки OpenFeature, пустая строка при успехе

Порядок разрешения

  1. Настройка не передана - ERROR с кодом FLAG_NOT_FOUND;
  2. включен не равно Истина - значение по умолчанию, причина DISABLED;
  3. сработало правило таргетинга - вариант правила, причина TARGETING_MATCH;
  4. процентВыкатки не меньше 100 - вариант по умолчанию, причина STATIC;
  5. в контексте нет непустого targetingKey - ERROR с кодом TARGETING_KEY_MISSING;
  6. пользователь не попал в выкатку - значение по умолчанию, причина SPLIT;
  7. иначе вариант по умолчанию, причина SPLIT.

Без targetingKey процентная выкатка была бы случайной при каждом вызове, поэтому она не выполняется, а не выбирает наугад. Попадание считается через bucketer от пары «ключ флага + ключ таргетинга»: один и тот же пользователь всегда попадает в тот же бакет, поэтому при увеличении процента никто не выключается обратно.

Если варианты отсутствуют или названного варианта в них нет - ERROR с кодом PARSE_ERROR.

Правило таргетинга

json
{ "атрибут": "plan", "оператор": "равно", "значения": ["pro"], "вариант": "вкл" }
ПолеНазначение
атрибутИмя атрибута контекста. Отсутствующий атрибут правило пропускает
операторСм. таблицу ниже. По умолчанию равно
значенияМассив эталонов. Пустой массив правило не выбирает
вариантИмя варианта при срабатывании

Правила проверяются по порядку, срабатывает первое подошедшее.

Операторы

ОператорУсловие
равноЗначение атрибута совпадает с одним из эталонов
не равноЗначение атрибута не совпадает ни с одним эталоном
содержитЭталон входит в значение как подстрока
начинается сЗначение начинается с эталона
заканчивается наЗначение заканчивается эталоном
больше, меньшеЧисловое сравнение
версия равна, версия больше, версия меньшеСравнение по semver
версия в диапазонеВхождение в диапазон semver

Нечисловое значение числовые операторы не выбирают, а не роняют оценку. То же с версиями: значение или эталон, которые версией не разбираются, правило не выбирает.

Диапазон принимает форму >=1.2.0, ^1.2.3, ~1.2, 1.2.x или составную >=1.0.0 <2.0.0. Составной диапазон собирается по частям: Версии.ВерсияВДиапазоне читает из строки только первое условие и молча отбрасывает остальные, из-за чего 5.0.0 прошла бы проверку >=1.0.0 <2.0.0. Пустой эталон диапазона считается ошибкой настройки и правило не выбирает, хотя semver трактовал бы его как *.

bsl
Оценщик = Новый FlagEvaluator();

Настройка = Новый Соответствие();
Настройка.Вставить("включен", Истина);
Настройка.Вставить("варианты", Новый Соответствие());
Настройка["варианты"].Вставить("вкл", Истина);
Настройка["варианты"].Вставить("выкл", Ложь);
Настройка.Вставить("вариантПоУмолчанию", "выкл");
Настройка.Вставить("процентВыкатки", 100);

Контекст = Новый Соответствие();
Контекст.Вставить("targetingKey", "user-42");

Оценка = Оценщик.ОценитьПоСнимку("new-checkout", Настройка, Контекст, Ложь);

Сообщить(Оценка["значение"]);   // Ложь
Сообщить(Оценка["вариант"]);    // выкл
Сообщить(Оценка["причина"]);    // STATIC

Класс OneFlagProvider

Провайдер OpenFeature поверх сервера OneFlag. Хранит снимок конфигурации окружения и вычисляет значения флагов локально, а свежесть снимка поддерживает потоком изменений.

Исходник: src/Классы/OneFlagProvider.os

Конструктор

bsl
Новый OneFlagProvider(Знач Адрес, Знач Ключ, Знач Окружение = "dev", Знач Настройки = Неопределено)
ПараметрТипНазначение
АдресСтрокаБазовый адрес сервера, например http://localhost:3333. Завершающие слеши отбрасываются
КлючСтрокаКлюч SDK, уходит в заголовке Authorization
ОкружениеСтрокаКлюч окружения. По умолчанию dev
НастройкиСтруктура, СоответствиеНеобязательные параметры устойчивости

Поля Настройки:

ПараметрПо умолчаниюОписание
ПовторовЗагрузки3Сколько раз повторить неудачный запрос снимка
ЗадержкаПовтора500Пауза между попытками, мс
ТаймаутЗапроса10Таймаут HTTP-запроса, с

Повторы нужны, потому что первая неудача редко означает недоступный сервер: чаще это гонка при старте, когда приложение поднялось раньше сервиса флагов. Реализованы через resilience.

Исключения

УсловиеСообщение
Пустой адресOneFlag: не задан адрес сервера

Свойства

СвойствоТипНазначение
ОбновленийПолученоЧислоСколько раз конфигурация обновлялась по потоку

Жизненный цикл

МетодВозвращаетНазначение
Инициализировать-Загружает снимок и подписывается на изменения
Завершить-Останавливает чтение потока и закрывает соединение
СостояниеСтрокаNOT_READY, READY или ERROR
МетаданныеСтруктураСтруктура с полем Имя = OneFlagProvider

Инициализировать

bsl
Процедура Инициализировать(Знач Контекст = Неопределено) Экспорт

Загружает снимок и, если он получен, подписывается на поток изменений. Вызывается клиентом OpenFeature при УстановитьПровайдер.

Результат загрузкиСостояниеПоток
Снимок полученREADYПодписка выполняется
Снимок не полученERRORПодписки нет

Неудача подписки на поток состояние не меняет: снимок уже загружен, и без потока провайдер продолжит отдавать значения из него.

Завершить

bsl
Процедура Завершить() Экспорт

Останавливает цикл чтения потока, закрывает соединение и переводит провайдера в NOT_READY. Разорванное соединение ошибкой не считается.

Состояние

bsl
Функция Состояние() Экспорт

Возвращаемое значение

Строка - NOT_READY до инициализации и после Завершить, READY при успешной загрузке снимка, ERROR при неудаче.

В состоянии NOT_READY любая оценка возвращает значение по умолчанию с кодом ошибки PROVIDER_NOT_READY.

Работа со снимком

МетодВозвращаетНазначение
ОбновитьСнимокБулевоПринудительно перечитывает конфигурацию
ЖивоеОбновлениеРаботаетБулевоЧитается ли поток изменений
КлючиФлаговМассивКлючи известных флагов
ПоследняяОшибкаСтрокаОписание последнего сбоя связи

ОбновитьСнимок

bsl
Функция ОбновитьСнимок() Экспорт

Забирает свежий снимок конфигурации с повторами по настройкам устойчивости.

Возвращаемое значение

Булево - Истина, если снимок обновлён.

При неудаче прежний снимок остаётся в силе, а описание сбоя попадает в ПоследняяОшибка(). Замена снимка выполняется под семафором, поэтому одновременная оценка флага видит либо старый снимок целиком, либо новый.

ЖивоеОбновлениеРаботает

bsl
Функция ЖивоеОбновлениеРаботает() Экспорт

Возвращаемое значение

Булево - Истина, если фоновое задание читает поток изменений.

Значение Ложь при Состояние() = "READY" означает рабочий, но деградировавший режим: значения берутся из снимка, изменения на сервере до приложения не доходят. Обновить конфигурацию в этом режиме можно только ОбновитьСнимок().

КлючиФлагов

bsl
Функция КлючиФлагов() Экспорт

Возвращаемое значение

Массив из Строка - ключи всех флагов текущего снимка.

ПоследняяОшибка

bsl
Функция ПоследняяОшибка() Экспорт

Возвращаемое значение

Строка - краткое представление последней ошибки связи, пустая строка после успешного обновления.

Контракт провайдера OpenFeature

bsl
Функция ВычислитьЛогическое(Знач Ключ, Знач ЗначениеПоУмолчанию, Знач Контекст) Экспорт
Функция ВычислитьСтроку(Знач Ключ, Знач ЗначениеПоУмолчанию, Знач Контекст) Экспорт
Функция ВычислитьЧисло(Знач Ключ, Знач ЗначениеПоУмолчанию, Знач Контекст) Экспорт
Функция ВычислитьОбъект(Знач Ключ, Знач ЗначениеПоУмолчанию, Знач Контекст) Экспорт

Вызываются клиентом OpenFeature. Возвращают ResolutionDetails.

Коды ошибок:

КодКогда
PROVIDER_NOT_READYПровайдер не инициализирован
FLAG_NOT_FOUNDКлюча нет в снимке окружения
TYPE_MISMATCHТип значения флага не совпал с типом метода
TARGETING_KEY_MISSINGЗадана процентная выкатка, но в контексте нет targetingKey
PARSE_ERRORВ настройке нет вариантов или назван несуществующий вариант

ВычислитьОбъект тип не проверяет: у объекта ожидаемого типа платформы нет.

bsl
Провайдер = Новый OneFlagProvider("http://localhost:3333", "local-sdk-key", "prod");
OpenFeature.УстановитьПровайдер(Провайдер);

Клиент = OpenFeature.ПолучитьКлиента();
Детали = Клиент.ПолучитьЛогическоеСДеталями("new-checkout", Ложь,
	Новый EvaluationContext("user-42", Новый Структура("plan", "pro")));

Сообщить(Детали.Значение);   // Истина
Сообщить(Детали.Причина);    // TARGETING_MATCH
Сообщить(Детали.Вариант);    // вкл