Имя эхи - от 3 до 120 символов: маленькие латинские буквы, цифры, символы подчёркивания, минуса и точки. Название должно содержать минимум одну точку. В старых версиях обязано заканчиваться на точку и число.
Примеры правильных названий эх: 1.1 ii.14 ii.about.14 to.ivan.15, my.beseda
Id сообщения (msgid) - уникальный номер, который генерируется станцией, как 20 первых символов base64 sha256-bin хэша сообщения.
Примечание: production-реализации нод заменяют в полученной base64-строке плюс (+) и слэш (/) либо их аналоги (- и _) на буквы "A" и "Z" соответственно, дабы убрать из msgid спецсимволы.
Сама эха представляет собой изнутри всего лишь список (массив) msgid, расположенных в определённом порядке. После каждого написанного/принятого сообщения его msgid добавляется в конец этого списка.
Простейшая база данных реализации IDEC и ii состоит из двух каталогов: echo/ и msg/. В msg/ хранятся сами сообщения (имя файла = msgid). В echo/ хранятся индексы сообщений, т.е. файлы эхоконференций (имя файла = название эхи).
Файл в echo/<эха> состоит из списка имён файлов сообщений, находящихся в msg/, по порядку, в конце пустая строка. Из-за простой структуры базы данных сообщения можно передавать даже оффлайн, на флешке: достаточно лишь положить сообщение в msg/ и в файле эхоконференции прописать его хэш (вручную или простейшим скриптом).
Хранить файлы на самом деле можно и в json, и в sqlite, и в любом другом формате на ваше усмотрение.
Получить данные из нужных эх может любой пользователь, авторизованный или нет. Сначала нужно получить список сообщений эхи, и потом загрузить недостающие сообщения, которых ещё нет в базе данных. Подобным образом могут получать данные любые поинты, и так же, настроив взаимное получение данных друг с друга, обмениваться между собой ноды. Подробности на странице протокола.
Бандл - это полное, сформированное сообщение, уже имеющее идентификатор. Возможно, не одно.
По умолчанию, при распаковке, бандл создаёт все эхи, которые указаны в заголовках. То есть, распаковка бандла - это команда сохранить такое-то сообщение и прописать его во все эхи.
Бандлу не нужен онлайн. Можно создать бандл со всеми нужными сообщениями и передать его любым способом - после его распаковки в базе создадутся все сообщения.
Формат кодирования:
msgid:text
msgid:text
msgid:text
и так далее
где text - это просто текстовый файл самого сообщения, кодированный base64 (все серверы обязаны принимать как обычный, так и urlsafe-словарь, генерируются же бандлы в формате обычного base64). Разделитель для бандла - новая линия (LF, код 10).
| Строка | Поле | Описание |
|---|---|---|
| 1 | tags | теги (используются только для repto и для идентификатора ii/ok) |
| 2 | echoarea | основная эхоконференция, в которую помещается сообщение |
| 3 | date | число секунд от эпохи unix, в utc |
| 4 | msgfrom | отправитель |
| 5 | addr | адрес отправителя (практического смысла не имеет, служит для того, чтобы узнавать, с какой станции пришло сообщение) |
| 6 | msgto | пользователь, которому предназначено сообщение (либо All) |
| 7 | subj | тема сообщения |
| 8 | - | пустая строка |
| 9 и далее | msg | текст сообщения |
Строки, разделённые слешами. Сначала ключ, потом значение и так далее.
Образец: ii/ok/repto/fjLkfrmjNvO4fjzlUs5U
Тег ii/ok проставляется обязательно. Требуется для совместимости с ii.
ii/ok/repto/IZXhLBKJx0rhx0lXYu3L
im.16
1455789357
Vasya
Lunar, 2
Pupkin
Re: Мое первое сообщение в эху
текст сообщения
Перед отправкой этот файл кодируется base64.
| Строка | Поле | Описание |
|---|---|---|
| 1 | echoarea | эхоконференция, в которую помещается сообщение |
| 2 | msgto | пользователь, которому вы пишете (либо All, если обращаетесь ко всем) |
| 3 | subj | тема сообщения |
| 4 | - | пустая строка |
| 5 | repto | если начинается с @repto:, то нода проставляет тэг repto (указывает id письма, на которое отвечаем). Иначе строка относится к тексту сообщения |
| 6 и далее | msg | текст сообщения |
Внимание!
- Пустые поля (в том числе
subjилиmsg) не допускаются. - В отличие от бандлов, в одном запросе нельзя передать сразу несколько сообщений.
- Максимальный размер файла 64КБ (65536 байт) на полезную нагрузку (а в base64-виде - 4/3 от исходного, т.е. 87382 байт)
im.16
All
Тестируем
@repto:2hEUbMAxKSA83vcmgU4s
И вот я пишу своё первое письмо в нашу секту.
Меня видно?