# Публикация и версии

## Быстрый режим

Сейчас приложение публикуется из самого Pairx: «+» в чате → «Приложение» → «Новое из кода». Один HTML-файл до 512 КиБ, название — из `<title>`, переключатель «Только для взрослых (18+)». После «Отправить» сервис:

1. Читает [манифест](https://dev.pairx.org/reference/manifest) из `<script type="application/pairx+json">` и проверяет пределы.
2. Проверяет код — те же проверки делает `pairx check` (см. ниже).
3. Создаёт приложение и его первую версию и отправляет карточку в чат.

Не больше 30 отправок в час от одного человека.

## Что проверяет сервис

| Код | Что ищет | Что будет |
| --- | --- | --- |
| `webrtc` | WebRTC: `RTCPeerConnection`, `RTCDataChannel`, `RTCIceCandidate`. | ручная проверка |
| `ice-server` | Адрес STUN/TURN в строке: `"stun:…"`, `'turn:…'`. | ручная проверка |
| `frame-realm` | Обращение к окну или документу фрейма: `contentWindow`, `contentDocument`, `window.frames`, `window[0]`. | ручная проверка |
| `miner` | Признаки майнера криптовалюты. | ручная проверка |
| `detached-click` | Нажатие ссылки из кода: созданная ссылка и `click()` в одном файле. | ручная проверка |
| `obfuscation` | Признаки обфускации: `eval` или `new Function` вместе с раскодированием строк. | ручная проверка |
| `network` | Сеть: `fetch`, `XMLHttpRequest`, `WebSocket`, `EventSource`, `sendBeacon` — наружу запросы не выполнятся, свои файлы читаются. | предупреждение |
| `external-url` | Внешний адрес в `src`, `href` или `import` — не загрузится. | предупреждение |
| `webgl` | WebGL — на iPhone его нет. | предупреждение |
| `audio` | WebAudio (`AudioContext`) — на iPhone его нет. | предупреждение |
| `indexeddb` | IndexedDB — на iPhone его нет; используйте `localStorage` или хранилища Pairx. | предупреждение |
| `wasm` | Файл WebAssembly — на iPhone он не работает. | предупреждение |

- **Ошибка** — сервис не примет приложение и скажет, что исправить: неверный манифест, превышен предел, неподдерживаемый тип файла.
- **Ручная проверка** — версия принята, но сразу в чат не уходит: код посмотрит человек, обычно в течение суток. После проверки приложение появится в «Мои приложения» (из выбора приложения в чате) — оттуда его можно отправить. Это признаки обхода песочницы: даже если в вашем коде они случайны, без взгляда человека версия не выйдет.
- **Предупреждение** — в песочнице это просто не заработает; приложение публикуется сразу.

## Код открыт

Любой, кто открыл приложение, может посмотреть его код: меню приложения → «Посмотреть код». Не кладите в код того, что не должны видеть другие, — ключи, личные данные, ответы к тесту.

## Версии

Каждая отправка — неизменяемая версия с номером. Экземпляры в чатах открывают текущую версию приложения.

Чтобы данные экземпляров пережили обновление, сервис сравнивает манифест новой версии с выпущенной:

- хранилища можно только добавлять — убрать нельзя;
- тип хранилища менять нельзя;
- права записи `writers` можно только сузить (`everyone` → `admins` → `author`);
- `per_user_limit` счётчика можно только уменьшить.

Для более широкого правила нужно новое хранилище. Новые разрешения в версии — повод снова спросить согласие у каждого.

> **Скоро.** Новые версии приложения из быстрого режима — в «Профиль → Приложения», а отправка версий и пакетов из нескольких файлов — из [CLI](https://dev.pairx.org/tools). Пока каждая отправка кода создаёт новое приложение; уже опубликованное отправляется в другие чаты из «Мои приложения» в выборе приложения.

## Жалобы и блокировки

Любой, кто открыл приложение, может пожаловаться на него из меню: спам, обман или сбор паролей, оскорбления, не для всех возрастов, незаконное, другое. Pairx рассматривает жалобы и может заблокировать приложение целиком или его содержимое — тогда тот же код не примут и под другим названием.

Заблокированное приложение не открывается ни у кого: для всех оно выглядит как удалённое.

Вопросы о проверке и блокировке — на support@mail.pairx.org.
