Pairxдля разработчиков

Манифест

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

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

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

Файл pairx.app.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"}}
}

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

Поля#

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

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

{"type": "counter", "writers": "everyone", "per_user_limit": 1}
  • type — log, slot, doc или counter, см. Хранилище.
  • writers — кто пишет: everyone (по умолчанию), admins, author.
  • per_user_limit — только у counter: от 1 до 1 000 000.

Как хранилища можно менять в новых версиях — в разделе Публикация и версии.

Разрешения#

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

Файлы#

ЧтоПредел
Приложение из одного файла (быстрый режим)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

Проверки#

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

КодЧто ищетЧто будет
webrtcWebRTC: 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 — не загрузится.предупреждение
webglWebGL — на iPhone его нет.предупреждение
audioWebAudio (AudioContext) — на iPhone его нет.предупреждение
indexeddbIndexedDB — на iPhone его нет; используйте localStorage или хранилища Pairx.предупреждение
wasmФайл WebAssembly — на iPhone он не работает.предупреждение