feat(api): Telegram — темы, очередь повторов, «Система», /setup

telegram/client: Bot API на fetch с таймаутом 5 с; ошибки делятся на
повторяемые (сеть, таймаут, 429, 5xx) и конфигурационные (400/403…),
токен не попадает ни в тексты ошибок, ни в tg_last_error.
format: заявка и уточнение по шаблону плана, HTML с экранированием,
источник из utm / referrer, первый визит.
outbox: Notifier с отправкой после ответа и тиком раз в минуту, пауза
1, 2, 4… мин, уточнение только после своей заявки, после 10 попыток —
в «Систему». system: тема «Система» с троттлингом ×N за период.
bot: long polling, только TELEGRAM_ADMIN_ID, /setup создаёт темы и
присылает id в личку. config: всё окружение в одном месте.
This commit is contained in:
2026-10-17 16:07:26 +03:00
parent 5d970be228
commit 667c6a6e6d
15 changed files with 1316 additions and 22 deletions
+3
View File
@@ -17,6 +17,8 @@ export type AppDeps = {
/** Адреса, от которых верим X-Real-IP, помимо loopback. */
trustedProxies?: readonly string[];
version?: string;
/** 500: сообщить в «Систему». Ответ клиенту от этого не зависит. */
onServerError?: (err: unknown) => void;
};
export const MAX_BODY_BYTES = 16 * 1024;
@@ -41,6 +43,7 @@ export function createApp(deps: AppDeps) {
app.onError((err) => {
console.error(err);
deps.onServerError?.(err);
return reply({ ok: false, error: 'server' }, 500);
});