Имя эхи - от 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
И вот я пишу своё первое письмо в нашу секту.
Меня видно?