Редактирование: Введение в Matrix

Перейти к навигации Перейти к поиску

Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
<big>'''DISCLAIMER'''</big>
<big>'''DISCLAIMER'''</big>


Статья является переводом https://brendan.abolivier.bzh/enter-the-matrix/ автора [https://matrix.to/#/@brendan:abolivier.bzh @brendan:abolivier.bzh] и распространяется по лицензии Creative Commons BY-SA (https://creativecommons.org/licenses/by-sa/4.0/). Перевод выполнили [https://matrix.to/#/@airin:matrix.org @airin:matrix.org], [https://matrix.to/#/@commagray:matrix.org @commagray:matrix.org], [https://matrix.to/#/@WaleSky:matrix.org @WaleSky:matrix.org]. Все вопросы и предложение можно задать в комнате [https://matrix.to/#/!BWAqsfIAMQABBlOYbt:matrix.org #perevodators:matrix.org].
Статья является переводом https://brendan.abolivier.bzh/enter-the-matrix/ автора @brendan:abolivier.bzh и распространяется по лицензии Creative Commons BY-SA (https://creativecommons.org/licenses/by-sa/4.0/). Перевод выполнил пользователь @airin:matrix.org. Все вопросы и предложение можно задать в комнате #perevodators:matrix.org.


----
----


Как вы можете знать, если вы некоторое время подписаны на меня в Twitter (или знаете меня в реальной жизни) (автора оригинала - прим. перевода), я  очень люблю свободные программы и децентрализацию. Я люблю свободные программы. потому что они соответствуют философии, которой я живу, а децентрализацию -потому что она расширяет пользовательскую свободу и индивидуальность, и я считаю работу над децентрализованными сетями увлекательной. Они заставляют кардинально изменить способ проектирования систем, поскольку большая часть интернета сейчас состоит из централизованных сервисов, которые учат разрабатывать и проектировать только в этом плане (ключе) (=== централизованном).
Как вы можете знать, если вы некоторое время подписаны на меня в Twitter (или знаете меня в реальной жизни), я  очень люблю свободные программы и децентрализацию. Я люблю свободные программы. потому что они соответствуют философии, которой я живу, а децентрализацию -потому что она расширяет пользовательскую свободу и индивидуальность, и я считаю работу над децентрализованными сетями увлекательной. Они заставляют кардинально изменить способ проектирования систем, поскольку большая часть интернета сейчас состоит из централизованных сервисов, которые учат разрабатывать и проектировать только в этом плане (ключе) (=== централизованном).


Сегодня я хочу вам рассказать об одном из моих любимых свободных децентрализованных проектов - Matrix. Давайте уясним, что я не говорю об одной научно-фантастической франшизе или ночном клубе в Берлине. Matrix - это протокол для децентрализованных, федеративных и защищённых коммуникаций, созданный и поддерживаемый New Vector, компанией, базирующейся на территории Британии и Франции (в которую я присоединился для интернатуры в Лондоне прошлым летом). Он основан на RESTful HTTP/JSON API, документирован открытой спецификацией и спроектирован быть пригодным для чего угодно, что требует коммуникацию в реальном времени, от мгновенных сообщений до интернета вещей. Некоторые люди экспериментируют с Matrix, используя его в качестве блога, RSS-читалки и прочих неочевидных вещей, которых вы не ожидаете от такого проекта. Несмотря на это, однако, он в основном используется для мгновенных сообщений, в частности с клиентом Riot (который так же разработан New Vector).
Сегодня я хочу вам рассказать об одном из моих любимых свободных децентрализованных проектов - Matrix. Давайте уясним, что я не говорю об одной научно-фантастической франшизе или ночном клубе в Берлине. Matrix - это протокол для децентрализованных, федеративных и защищённых коммуникаций, созданный и поддерживаемый New Vector, компанией, базирующейся на территории Британии и Франции (в которую я присоединился для интернатуры в Лондоне прошлым летом). Он основан на RESTful HTTP/JSON API, документирован открытой спецификацией и спроектирован быть пригодным для чего угодно, что требует коммуникацию в реальном времени, от мгновенных сообщений до интернета вещей. Некоторые люди экспериментируют с Matrix, используя его в качестве блога, RSS-читалки и прочих неочевидных вещей, которых вы не ожидаете от такого проекта. Несмотря на это, однако, он в основном используется для мгновенных сообщений, в частности с клиентом Riot (который так же разработан New Vector).
Строка 192: Строка 192:
Теперь, когда у нас есть аутентифицированный пользователь на сервере, давайте создадим комнату. Это делается посылкой POST запроса на точку подключения [https://matrix.org/docs/spec/client_server/r0.4.0.html#post-matrix-client-r0-createroom /_matrix/client/r0/createRoom]. В нашем примере, полный URL запроса будет: https://matrix.project.tld/_matrix/client/r0/createRoom?access_token=olic0yeVa1pore2Kie4Wohsh
Теперь, когда у нас есть аутентифицированный пользователь на сервере, давайте создадим комнату. Это делается посылкой POST запроса на точку подключения [https://matrix.org/docs/spec/client_server/r0.4.0.html#post-matrix-client-r0-createroom /_matrix/client/r0/createRoom]. В нашем примере, полный URL запроса будет: https://matrix.project.tld/_matrix/client/r0/createRoom?access_token=olic0yeVa1pore2Kie4Wohsh
Обратите внимание на параметр access_token, который должен содержать токен доступа, выданным нам сервером ранее.
Обратите внимание на параметр access_token, который должен содержать токен доступа, выданным нам сервером ранее.
Есть несколько JSON параметров, которые я не буду здесь затрагивать, поскольку ни один из них не является обязательным для выполнения запроса. Давайте отправим запрос с пустым объектом ({}) в качестве содержимого.
Перед ответом, хоум-сервер создаст комнату, заполнит её несколькими событиями состояния (такими, как первичное событие m.room.create или событие входа для вашего пользователя). Затем он должен вернуть в ответ статус 200 и JSON, выглядящий примерно так:
{
    "room_id": "!RtZiWTovChPysCUIgn:matrix.project.tld"
}
Вот вы и создали свою самую первую комнату! Как вы наверное догадались, значениe поля room_id это ID свежесозданной комнаты.
==== Копаемся в состоянии комнаты ====
Смотреть состояние комнаты на данном этапе практически бесполезно, но давайте сделаем это тем не менее. Вызов полного состояния комнаты, к примеру, не сложнее обычного GET запроса к точке входа [_matrix /_matrix/client/r0/rooms/{roomId}/state], где {roomId} это ID комнаты. Если вы выполняете эти шаги используя curl в bash, вам понадобится заменить "!" в ID комнаты на его URL-закодированный вариант (%21). Не забудьте добавить свой токен доступа к полному URL, как показано выше.
Запрос должен вернуть JSON-массив, содержащий события состояния, такие как:
{
  "age": 654742,
  "content": {
    "join_rule": "public"
  },
  "event_id": "$1526078716401exXBQ:matrix.project.tld",
  "origin_server_ts": 1526078716874,
  "room_id": "!RtZiWTovChPysCUIgn:matrix.project.tld",
  "sender": "@Alice:matrix.project.tld",
  "state_key": "",
  "type": "m.room.join_rules",
  "unsigned": {
    "age": 654742
  }
}
Теперь давайте попробуем отправить своё собственное событие состояния в комнату.  Чтобы это сделать, вам потребуется отправить PUT-запрос на точку [https://matrix.org/docs/spec/client_server/r0.4.0.html#put-matrix-client-r0-rooms-roomid-state-eventtype /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}], заменив ID комнаты, тип события и state_key на нужные значения. Если ваш state key - пустая строка, вы можете исключить его из URL запроса. Еще раз, не забудьте добавить ваш токен доступа!
Полезная нагрузка события в теле запроса передается объектом content.
Давайте создадим событие tld.project.foo с ключом состояния "bar" и {"baz": "qux"} в качестве содержимого. Для этого отправим запрос PUT по адресу /_matrix/client/r0/rooms/!RtZiWTovChPysCUIgn:matrix.project.tld/state/tld.project.foo/bar?access_token=olic0yeVa1pore2Kie4Wohsh (из которого я убрал схему протокола и доменное имя, чтобы он не был слишком большим) со следующим содержимым:
{
  "baz": "qux"
}
Хоум-сервер после этого возвращает нам объект с единственным полем event_id, содержащим ID только что созданного события состояния.
Если мы повторим запрос, который делали ранее, чтобы получить полное состояние комнаты, мы теперь увидим наше событие:
{
    "age": 58357,
    "content": {
        "baz": "qux"
    },
    "event_id": "$1526080218403sbpku:matrix.project.tld",
    "origin_server_ts": 1526080218639,
    "room_id": "!RtZiWTovChPysCUIgn:matrix.project.tld",
    "sender": "@Alice:matrix.project.tld",
    "state_key": "bar",
    "type": "tld.project.foo",
    "unsigned": {
        "age": 58357
    }
}
Обратите внимание, отправка обновления события состояния производится отправкой нового события с таким же именем класса и ключом.
==== Отправка сообщений ====
Отправка событий ленты почти не отличается от отправки событий состояния, за исключением того, что это делается через точку входа [https://matrix.org/docs/spec/client_server/r0.4.0.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid /_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId}], и содержит один параметр, который мы прежде не видели: txnId — ID транзакции. Это просто уникальный ID, позволяющий идентифицировать конкретный запрос среди всех других запросов для того же токена доступа. Вы можете писать туда что угодно, пока вы не используете одно и то же значение дважды в пределах одного токена доступа.
Повторюсь, что тело запроса это контент события.
Выборка событий ленты, однако, немного более сложный процесс. Он производится запросом GET к точке [https://matrix.org/docs/spec/client_server/r0.4.0.html#get-matrix-client-r0-sync /_matrix/client/r0/sync].  Хитрость в том, что эта точка входа не специфична для конкретной комнаты, и возвращает все события, полученные во всех комнатах, в которых вы находитесь, вместе с некоторыми событиями присутствия, приглашениями итд.
После такого запроса (с добавленным к нему токеном доступа)  вы можете найти в JSON-ответе события ленты интересующей вас комнаты обратив внимание на объект rooms, который содержит объект join, который содержит по одному объекту на каждую вашу комнату. Найдите комнату !RtZiWTovChPysCUIgn:matrix.project.tld (ту, что мы создали ранее), и в соответствующем объекте вы увидите события состояния, ленты и эфемерные события для данной комнаты.
==== Приглашение народа ====
Алиса зарегистрировалась на серверe и создала свою комнату, но чувствует себя довольно одинокой. Давайте пригласим туда Боба и порадуем её.
Приглашение в комнату довольно простая операция и требует только POST запроса на точку [https://matrix.org/docs/spec/client_server/r0.4.0.html#post-matrix-client-r0-rooms-roomid-invite /_matrix/client/r0/rooms/{roomId}/invite]. Тело запроса должно содержать Matrix ID приглашаемого, например:
{
  "user_id": "@Bob:matrix.bob.tld"
}
Подобный же запрос был бы, если бы Боб зарегистрировался на том же сервере, что и Алиса.
Если всё прошло нормально, хоум-сервер должен вернуть статус 200 и пустой JSON объект ({}).
При следующем обращении к точке /_matrix/client/r0/sync Боб увидит среди комнат объект "invite", содержащий приглашение, которое Алиса ему прислала и состоящий из нескольких событий, в т.ч. события приглашения:
{
  "invite": {
    "!RtZiWTovChPysCUIgn:matrix.project.tld": {
      "invite_state": {
        "events": [
          {
            "sender": "@Alice:matrix.project.tld",
            "type": "m.room.name",
            "state_key": "",
            "content": {
              "name": "My very cool room"
            }
          },
          {
            "sender": "@Alice:matrix.project.tld",
            "type": "m.room.member",
            "state_key": "@Bob:matrix.bob.tld",
            "content": {
              "membership": "invite"
            }
          }
        ]
      }
    }
  }
}
Теперь Боб сможет присоединиться к комнате посылкой простого POST запроса на точку [https://matrix.org/docs/spec/client_server/r0.4.0.html#post-matrix-client-r0-rooms-roomid-join /_matrix/client/r0/rooms/{roomId}/join].
==== Алиса встречает Боба ====
Итак, у нас теперь есть свежая комната, где Алиса и Боб могут общаться между собой, и всё проделано при помощи HTTP запросов, которые вы можете слать curl`ом из терминала. Разумеется, вам не нужно всякий раз делать это настолько вручную, существуют также Matrix SDK для разных языков и платформ, включая [https://matrix.org/docs/projects/sdk/matrix.org-js-sdk.html JavaScript], [https://matrix.org/docs/projects/sdk/goMatrix.html Go], [https://matrix.org/docs/projects/sdk/goMatrix.html Python], [https://matrix.org/docs/projects/sdk/matrix.org-android-sdk.html Android], [https://matrix.org/docs/projects/sdk/matrix.org-ios-sdk.html iOS] и многое другое. Полный список доступен [https://matrix.org/docs/projects/try-matrix-now.html#client-sdks здесь].
Если вы хотите вникнуть немного глубже в Matrix API, я бы советовал вам взглянуть на [https://matrix.org/docs/spec спецификацию] (хотя она и требует еще много работы) и проекты сообщества на странице [https://matrix.org/docs/projects/try-matrix-now.html Try Matrix Now!] на сайте Matrix.
Надеюсь вам понравилось это путешествие в Matrix API, как и мне, когда я впервые услышал об этом проекте. Matrix это определённо то, с чем я буду играться, и может у меня появятся значительные новости касательно Matrix-проектов, над которыми я работаю.
Как обычно, хочу поблагодарить Thibaut за вычитку этого поста и полезный первичный фидбек. Если вы захотите оставить свой фидбек об этом посте, не стесняйтесь сделать это в Твиттере или через Matrix, мой личный Matrix ID: @Brendan:matrix.trancendances.fr!

Пожалуйста, учтите, что любой ваш вклад в проект «[matrix] на Русском» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. [[[matrix] на Русском:Авторские права]]). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!