env-master

SDK для сервисов

@env-master/sdk — то, что подключает сервис. Забирает значения при старте и держит их в памяти процесса, а не в переменных окружения.

bun add @env-master/sdk

Подключение

import { EnvMasterClient } from "@env-master/sdk";

const em = new EnvMasterClient({
  baseUrl: process.env.ENVMASTER_URL!,
  project: "billing-api",
  environment: "production",
});

await em.loginMachine({
  clientId: process.env.ENVMASTER_CLIENT_ID!,
  clientSecret: process.env.ENVMASTER_CLIENT_SECRET!,
});

const dbPassword = await em.get("DB_PASSWORD");

Аксессор get() — рекомендуемый способ. Запись в process.env тоже возможна (injectIntoEnv()), но требует осознанного вызова: переменные окружения видны через /proc, наследуются дочерними процессами и попадают в crash-дампы.

Как значение доходит до сервиса

Клиент генерирует x25519-пару при создании. Сервер оборачивает data key окружения под её публичную часть, отдаёт шифртекст записей — и расшифровка происходит уже в вашем процессе. На этом пути сервер открытого значения не производит вовсе.

Методы

МетодЧто делает
loginMachine(creds)Вход и фоновое обновление токена
get(key)Значение ключа, NOT_FOUND если его нет
getVersion(key)Значение вместе с номером версии
secrets()Все значения как Map
list()Записи с метаданными
refresh()Сбросить кэш и перечитать
mask(text)Заменить известные значения на ***
dispose()Остановить таймер обновления токена

Ротация без перезапуска

Токен обновляется на 75% TTL, кэш записей живёт 15 минут. Чтобы среагировать на новое значение, сравнивайте версию:

const { value, version } = await em.getVersion("DB_PASSWORD");
if (version !== lastSeen) await reconnectPool(value);

Логи

logger.info(em.mask(`connecting as ${user}:${password}`));
// connecting as billing:***

Более длинные значения заменяются первыми — иначе от вложенной подстроки оставался бы хвост.