Помните мост Рида?
Ну так вот. Я тут изучаю Rust на досуге, и пишу мини проекты. Так и получился у меня...
Stem
Это интернет мост для OpenComputers.
Что такое мост
Для тех кто не знает что такое мост, и для чего он нужен:
мост дает примерно такие же возможности как и linked карта. Он позволяет связать между собой компьютеры OpenComputers, где бы они не находились. Только мост реализует это через интернет карту.
Однако по сравнению с linked картой есть один очень крутой плюс. Вы можете подключиться к своему OpenComputers компу не только с другого OpenComputers компа из Майнкрафта, но и из реального мира. Например с телефона. Или с вашего домашнего компьютера.
Отличие от моста Рида
Я немного по другому подошел к архитектуре проекта.
Вместо попарного соединения, Stem реализует систему каналов.
Работает это очень просто. Вы можете:
1) послать сообщение в канал X
2) подписаться на сообщения из канала X
Количество подписчиков не ограничено. Количество клиентов которые могут посылать сообщения в канал тоже не ограничено.
ID канала (по которому происходит подписка и отправка сообщений) служит заодно и паролем к нему.
Поэтому если вы хотите создать публично доступный канал - просто опубликуйте его ID.
А если хотите создать свой, приватный, канал - просто возьмите ID подлиннее и никому его не открывайте.
ID - это последовательность любых байт длиной до 256. Число комбинаций (256 в степени 256) это огромное число, так что уникальных ключей хватит надолго.
Пример
local event = require('event')
-- подключаем STEM
local stem = require('stem')
-- присоединяемся к серверу STEM
local server = stem.connect('stem.fomalhaut.me')
-- просим сервер присылать нам сообщения с канала 'my-channel-id'
server:subscribe('my-channel-id')
-- слушаем эвент 'stem_message' в цикле
while true do
local name, channel_id, message = event.pull('stem_message')
if name ~= nil then
print(channel_id, message)
end
end
-- ...или регистрируем листенер
event.listen('stem_message', function(_, channel_id, message)
print(channel_id, message)
end)
-- мы можем посылать сообщение в канал
-- (причем не обязательно быть подписанным на этот канал
-- достаточно просто его ID)
server:send('my-channel-id', 'hello there')
-- просим сервер перестать присылать сообщение с канала
server:unsubscribe('my-channel-id')
-- полностью отключаемся от сервера STEM
server:disconnect()
Одновременно можно работать с несколькими серверами Stem и с любым количеством каналов.
Библиотека stem.lua
Библиотечку можно скачать напрямую по этой ссылке: https://gitlab.com/UnicornFreedom/stem/raw/master/stem.lua
Либо установить через HPM:
hpm install stem
Подробная документация по командам библиотеки находится здесь.
Сервер STEM
Дефолтный сервер STEM запущен у меня на VPS по адресу: https://stem.fomalhaut.me/
Можете смело его использовать. Единственное, что это тестовый сервер пока. Может пропадать или менять протокол.
Новости постараюсь писать сюда.
Исходный код проекта находится тут: https://gitlab.com/UnicornFreedom/stem
Вы можете скомпилировать его под свою систему и запустить где угодно.
Настраивается сервер файлом stem.toml в корневой папке.
Дефолтный конфиг может выглядеть так:
[tcp]
host = '127.0.0.1'
port = 5733
[web]
host = '127.0.0.1'
port = 5780
[general]
ping_interval = 60
Чтобы получить полностью свой отдельный и независимый сервер STEM, достаточно будет просто запустить бинарник, получившийся после компиляции.
Не забудьте также положить в папку с бинарником папки static и templates. Они нужны для веб-интерфейса.
Сервер мультипоточный, и очень производительный. Должен тянуть довольно большие объемы трафика. Но точных бенчмарков я не проводил. Если есть желающие - пишите в IRC, скооперируемся и померяем. 😃
Для того чтобы видеть логи сервера, используйте переменную окружения RUST_LOG. Например чтобы включить полное отображение всех логов:
$ RUST_LOG=stem ./stem
Веб-интерфейс
Если перейти по ссылке на сервер STEM то вы увидите... веб-интерфейс.
Веб интерфейс показывает счетчик активных каналов и сессий (клиентских подключений).
Кроме того, он дает возможность подключиться к любому каналу STEM и поучаствовать в приеме-передаче сообщений прямо через сайт. Единственное ограничение - как ID канала, так и контент сообщений ограничивается тем, что можно закодировать в UTF-8.
Ну вот и все
Мост в принципе уже полностью работоспособен.
Все идеи, пожелания, отчеты о багах пишите сюда, либо на issue трекер в репозитории.
Если кто-нибудь хочет помочь с написанием клиента STEM на своём любимом языке программирования - обращайтесь ко мне в ЛС, IRC или пишите в этой теме. Написать клиент несложно - для примера можно глянуть на код библиотеки для OpenComputers. Она состоит всего из 150 строк кода.
Enjoy! 😃