Чего нет
Неподдержанное отвечает отказом с именем возможности, а не молчаливой заглушкой. Молчаливое расхождение дороже отсутствия — «работает, но не так» всплывает у посетителя, а не у разработчика.
Возможности, которых нет
| Чего нет | Что делать |
|---|---|
| Realtime — подписки на изменения | опрос по интервалу |
| Edge Functions — исполнение вашего кода у нас | логика в функциях базы; наружу — исходящие вызовы |
/auth/v1/admin/* | управление пользователями — своими функциями в схеме api |
| смена почты, SMS, MFA, корпоративный SSO | — |
| RS256/JWKS | токены подписаны HS256 секретом базы |
| преобразования картинок, возобновляемая загрузка, S3-протокол | готовьте файл на своей стороне; загрузка и раздача работают |
⚠️ «Edge Functions нет» не значит «наружу нельзя». Уведомления в Telegram, вебхуки и вызовы чужих API работают — см. Исходящие вызовы. Нет именно исполнения вашего кода на нашей стороне.
Границы, о которых лучше знать заранее
| Что | Значение |
|---|---|
| Одновременных соединений у одной базы | 4 на процесс шлюза, процессов два — то есть 8; сверх — отказ db_too_busy |
| Файл в хранилище | до 10 МБ |
| Суточный предел запросов | задаётся у базы; без него не ограничен |
| Баз на организацию | 10 (напишите нам, если нужно больше) |
| Источников приёма у базы | 50 |
Отдельный код db_too_busy означает «перегружены вы», а не «перегружена
платформа»: соседние базы при этом работают.
Клиент
Свой пакет — @layero/data. Он тонкий: вызов функций базы и внешних вызовов
через шлюз, без обёртки над таблицами.
npm i @layero/data
import { createClient } from "@layero/data";
const db = createClient({
url: import.meta.env.VITE_LAYERO_DATA_URL, // https://data.layero.ru/<база>
key: import.meta.env.VITE_LAYERO_DATA_KEY, // pk_live_…
});
const menu = await db.rpc("menu");
⚠️ Версия 0.x: HTTP-контракт ещё меняется, пин версии в проде обязателен.
Для таблиц, фильтров и входа пользователей берите @supabase/supabase-js —
контракт совместим, и он умеет всё, чего @layero/data пока не умеет.
Обойтись можно и без пакетов, запрос уместится в несколько строк:
const call = (fn, args) =>
fetch(`${import.meta.env.VITE_LAYERO_DATA_URL}/rest/v1/rpc/${fn}`, {
method: "POST",
headers: { "content-type": "application/json",
apikey: import.meta.env.VITE_LAYERO_DATA_KEY },
body: JSON.stringify(args),
}).then((r) => r.json());