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

Хранилище

Как пользоваться хранилищами — в руководстве Общие данные. Здесь — точные формы.

Снимок#

await pairx.call("storage.snapshot"):

{
  seq: 42,                 // номер последнего изменения в снимке
  private: { … },          // личные данные — их отдаёт localStorage
  stores: {
    queue: { type: "log", entries: [{ entry: 7, user: "…", value: "join", at: 1760000000, retracted: false }] },
    votes: { type: "slot", slots: { "<user>": "Кафе" } },
    board: { type: "doc", value: { … }, version: 3 },
    likes: { type: "counter", totals: { "7": 12 }, mine: { "7": 1 } }
  }
}

at — секунды Unix по часам сервера. Документ, в который ещё не писали, — { value: null, version: 0 }.

Операции#

await pairx.call("storage.write", { op, store, ...поля }):

ОперацияПоляОтветИзменение
log.appendvalue{ entry, at, seq }{ op: "log", entry, user, value, at, seq, store }
log.retractentry{ seq }{ op: "retract", entry, seq, store }
slot.setvalue{ seq }{ op: "slot", user, value, seq, store }
slot.clear—{ seq }{ op: "slot", user, value: null, seq, store }
doc.setvalue, version{ version, seq }{ op: "doc", value, version, by, seq, store }
counter.addkey, amount{ total, mine, seq }{ op: "counter", key, total, user, mine, seq, store }

Каждая запись называет store — имя хранилища из манифеста.

Изменения#

Событие storage.changed приносит { changes: [...] } — изменения по порядку seq. У каждого есть seq, store и op; остальные поля зависят от операции (колонка «Изменение» выше).

pairx.on("storage.changed", ({ changes }) => {
  for (const c of changes) {
    switch (c.op) {
      case "log":     /* c.entry, c.user, c.value, c.at */ break;
      case "retract": /* c.entry */ break;
      case "slot":    /* c.user, c.value (null — очищено) */ break;
      case "doc":     /* c.value, c.version, c.by */ break;
      case "counter": /* c.key, c.total, c.user, c.mine */ break;
    }
  }
});

Событие storage.reset — изменений больше нет в ленте или кто-то удалил свои данные: перечитайте снимок.

Права#

writersКто пишет
everyoneВсе участники (по умолчанию).
adminsТот, кто отправил приложение в чат, и администраторы чата.
authorТолько тот, кто отправил приложение в чат.

Пределы#

ЧтоПредел
Значение слота или документа16 КиБ
Запись журнала4 КиБ
Записей в журнале10 000
Ключей в счётчике1 000
Весь экземпляр1 МиБ
Личные данные (localStorage)256 КиБ
Хранилищ в манифесте16
  • Записей от человека в одном контексте — не больше 10 в секунду.
  • И не больше 300 в минуту.

При превышении запись отклоняется с кодом rate_limited.