# Манифест

Манифест описывает приложение: название, хранилища, разрешения, где оно открывается. Он бывает в двух видах.

**В странице** — для приложения из одного файла. Название берётся из `<title>`, остальное — из блока `application/pairx+json` (до 4 КиБ). В нём допустимы только поля `stores`, `permissions`, `description` и `age_rating`:

```html
<title>Очередь на сдачу</title>
<script type="application/pairx+json">
{"description": "Очередь на сдачу лабораторной", "stores": {"queue": {"type": "log"}}}
</script>
```

**Файл `pairx.app.json`** — в пакете из нескольких файлов, все поля:

```json
{
  "manifest_version": 1,
  "name": "Очередь",
  "description": "Очередь на сдачу лабораторной",
  "icon": "img/icon.png",
  "version": "1.2.0",
  "entry": "index.html",
  "min_bridge": "1.0",
  "contexts": ["chat"],
  "permissions": [],
  "age_rating": "all",
  "background_color": {"light": "#F5F6F8", "dark": "#101113"},
  "stores": {"queue": {"type": "log", "writers": "everyone"}},
  "locales": {"en": {"name": "Lab queue"}}
}
```

Неизвестные поля — ошибка: опечатка не должна молча ничего не делать.

## Поля {#fields}

| Поле | Тип | По умолчанию | Что |
| --- | --- | --- | --- |
| `manifest_version` | `1` | `1` | Версия формата манифеста. |
| `name` | `string` | из <title> или «Приложение» | Название, до 64 символов. |
| `description` | `string` | `""` | Описание, до 200 символов. |
| `icon` | `string?` |  | Путь к значку в пакете. |
| `version` | `string` | `"1.0.0"` | Версия для людей; номер версии ставит сервис. |
| `entry` | `string` | `"index.html"` | Входной HTML-файл. |
| `min_bridge` | `string` | `"1.0"` | Наименьшая версия моста, с которой приложение работает. |
| `contexts` | `string[]` | `["chat", "personal"]` | Где приложение открывается. |
| `permissions` | `string[]` | `[]` | Разрешения: человек соглашается на них при первом открытии. |
| `age_rating` | `"all" \| "18+"` | `"all"` | 18+ — спрашивает возраст при открытии и помечается. |
| `background_color` | `{ light, dark }?` |  | Цвет заставки, `#RRGGBB`. |
| `stores` | `{ [name]: { type, writers?, per_user_limit? } }` | `{}` | Общие хранилища: имя — до 32 символов, строчная латиница, цифры и `_`, первая — буква. |
| `locales` | `{ [lang]: { name?, description? } }` | `{}` | Название и описание на других языках, до 20 языков. |

## Хранилище в манифесте {#stores}

```json
{"type": "counter", "writers": "everyone", "per_user_limit": 1}
```

- `type` — `log`, `slot`, `doc` или `counter`, см. [Хранилище](https://dev.pairx.org/reference/storage).
- `writers` — кто пишет: `everyone` (по умолчанию), `admins`, `author`.
- `per_user_limit` — только у `counter`: от 1 до 1 000 000.

Как хранилища можно менять в новых версиях — в разделе [Публикация и версии](https://dev.pairx.org/guides/publishing#versii).

## Разрешения {#permissions}

| Разрешение | Что даёт |
| --- | --- |
| `profile.basic` | Имя человека (позже). |
| `chat.members` | Имена участников чата (позже, только приложениям в чатах). |
| `clipboard.write` | Копирование текста. |

## Файлы {#files}

| Что | Предел |
| --- | --- |
| Приложение из одного файла (быстрый режим) | HTML до 512 КиБ |
| Блок `application/pairx+json` в странице | до 4 КиБ |
| Пакет из нескольких файлов | до 10 МиБ, до 500 файлов |
| Один файл пакета | до 5 МиБ |
| Типы файлов | `.html`, `.htm`, `.js`, `.mjs`, `.css`, `.json`, `.png`, `.jpg`, `.jpeg`, `.webp`, `.gif`, `.svg`, `.woff2`, `.mp3`, `.ogg`, `.wasm` |

## Проверки {#checks}

Сервис проверяет каждую версию; `pairx check` делает то же самое на вашем компьютере.

| Код | Что ищет | Что будет |
| --- | --- | --- |
| `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 он не работает. | предупреждение |
