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:***
Более длинные значения заменяются первыми — иначе от вложенной подстроки оставался бы хвост.