Prosody 是一款面向商业消息和聊天提供商的开源 XMPP 通信服务器。有了 Prosody,开发人员就可以利用 Prosody 提供的可扩展性和灵活性,轻松快速地开发附加功能或新协议原型。开发人员可以将 Prosody 服务器与其他 Prosody 服务器或任何其他兼容 XMPP 的实现方式连接起来。
Prosody 在 Jitsi 系统中起什么作用?
Jitsi 主要使用 Prosody 来发出信号并管理连接用户之间的存在。作为 Jitsi 的用户,你看不到 Prosody 在你与其他用户之间管理的存在,但它就是这样做的。Prosody 管理你在 Jitsi 中的在线状态、信息内容、显示属性等。
下面的架构图显示了 Prosody 组件在 Jitsi 架构中的位置,以及 Prosody 组件连接的其他组件。
尽管 Jitsi 使用了 Prosody,但 Prosody 组件与 Jitsi 组件是完全独立的,因此我们可以针对不同用途对组件进行修改。这为 Jitsi 开发人员提供了高水平的可配置性,可以实现许多自定义功能。就像我们在本文中要做的一样。
Prosody 插件
Prosody 有一个插件目录,其中包含所有可选模块。插件只有启用后才能使用。在 jitsi-meet 项目中可以找到许多默认插件。
这意味着,如果在服务器上安装了 Jitsi,那么 Jitsi 实例中也会有这些内容。安装 Jitsi 实例时必须安装 Prosody。你会在/etc/prosody/conf.d/meet.domain.cfg.lua中获得一个prosody配置。可以在其中定义启用的模块。
modules_enabled = {
"bosh";
"http";
"pubsub";
...
}
每次 Prosody 服务启动时,都会加载这个模块数组(如果更改了配置文件,则必须重启服务才能应用更改)。这就是为 Prosody 启用可选模块的方法。
请注意,有些插件需要额外更改配置。
插件路径
在配置中,你可以看到一个名为 plugin_paths = { “/usr/share/jitsi-meet/prosody-plugins/” } 的选项。这是 Jitsi 的默认 Prosody 插件所在的位置。你可以添加包含你的插件的新路径,或者将你的新插件放在默认路径中。
Lua 编程语言
Prosody 插件是用 Lua 语言编写的,这就是为什么我们可以看到以 .lua 为扩展名的插件文件。这种语言被认为是一种强大、高效、轻量级、可嵌入的脚本语言。由于使用了 Lua 语言,Prosody 插件的行数较少,语法也比较简单。
如何激活现有的 Prosody 插件?
我们将激活 Prosody 插件 mod_muc_size.lua,并尝试在这里使用该插件。
1. 首先,我们需要在 Prosody 配置中启用该模块。
modules_enabled = {
"bosh";
"http";
"pubsub";
...
"muc_size";
}
这里不使用mod_
前缀。
2. 重新启动 Prosody 服务以使更改生效。
service prosody restart
3. 根据插件定义,我们可以调用 /room
API 端点来获取数据。我们可以通过以下方式访问 API 端点。
https://meet.domain.com/room?room=room_name
但最终会返回 404 Not Found 代码。这个代码来自服务器上的nginx服务。出现此代码的原因是,我们要查找的 Prosody 服务是在服务器本地运行的,因此无法在服务器的公共域中发现它。
4. 我们必须在 nginx 层面引入一条规则,以便在任何请求指向 /room
URL 时,将请求指向 Prosody 服务。
location = /room {
proxy_pass http://127.0.0.1:5280/room?$args&domain=meet.domain.com;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host meet.domain.com;
add_header Content-Type "application/json; charset=UTF-8";
add_header 'Access-Control-Allow-Origin' '*';
}
5. 重新启动 nginx 服务以使反向代理更改生效。
service nginx restart
6. 现在我们可以看到 Prosody 服务发送的所需输出。
[
{"display_name":"Michael","email":"michael@gmail.com","jid":"room_name@conference.meet.domain.com/f9a6340f"},
{"display_name":"Lyon","email":"lyon@gmail.com","jid":"room_name@conference.meet.domain.com/eb20392d"}
]
这样您就可以使用 Jitsi 提供的所有 Prosody 模块。
使用 http 模块编写你自己的 Prosody 插件
现在我们将更新插件逻辑并部署为新插件。假设我们需要一些有关房间的额外信息并位于不同的 URL 中。为此,我们需要稍微更改输出格式。
1. 我们首先从路由部分更改 API URL。
function module.load()
module:depends("http");
module:provides("http", {
default_path = "/";
route = {
["GET api/room_data"] = function (event) return async_handler_wrapper(event, handle_get_room_data) end;
};
});
end
2. 我们需要更改 API 处理程序的内容,以满足我们的需求。
if room then
local occupants = room._occupants;
if occupants then
participant_count = iterators.count(room:each_occupant());
for _, occupant in room:each_occupant() do
if string.sub(occupant.nick,-string.len("/focus"))~="/focus" then
for _, pr in occupant:each_session() do
local nick = pr:get_child_text("nick", "http://jabber.org/protocol/nick") or "";
local email = pr:get_child_text("email") or "";
occupants_json:push({
jid = tostring(occupant.nick),
email = tostring(email),
display_name = tostring(nick)});
end
end
end
end
if participant_count > 1 then
participant_count = participant_count - 1;
end
response = {
success = true;
room = {
room_name = room_name;
room_address = room_address;
participants_count = participant_count;
participants = occupants_json;
}
};
else
response = {
success = false;
message = "No room found"
};
end
return { status_code = 200; body = json.encode(response); };
我们可以使用 mod_muc_size.lua 插件中的相同函数,并将其修改为符合我们的输出要求。
3. 由于我们必须将其添加为一个新插件,因此请在 Prosody plugin_paths 目录下创建一个新的 .lua 文件。为此,我们将创建一个名为 mod_muc_room_data.lua 的新文件。
4. 要加载这个插件文件,我们需要在 Prosody 配置文件下加载它。
modules_enabled = {
"bosh";
"http";
"pubsub";
...
"muc_size";
"muc_room_data";
}
5. 我们必须重启 Prosody 才能使更改生效。重启后,新模块也将加载。如果在模块中使用了其他模块,也需要在此处加入这些模块。
6. 在域外访问时,仍无法发现该 API 端点。我们可以在nginx配置中添加另一个反向代理条目,使外部可以访问API。
location = /api/room_data {
proxy_pass http://127.0.0.1:5280/api/room_data?$args&domain=meet.domain.com;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host meet.domain.com;
add_header Content-Type "application/json; charset=UTF-8";
add_header 'Access-Control-Allow-Origin' '*';
}
只有在我们添加基于 “http “模块的插件时才需要这样做。不同的使用情况可能不需要完成这一步。
7. 重启 nginx 服务以应用更改。
8. 以下列方式访问新创建的 Prosody 插件的 API
https://meet.domain.com/api/room_data?room=room_name
通过进一步了解 Jitsi 生态系统,你可以更多地使用 Prosody 和 Jitsi,还可以为社区做出贡献。
还可以学习 .lua 来编写出色的脚本。通过揭开 Prosody 数据层的神秘面纱,你不仅可以创建 API 端点,还可以修改数据、附加监听器等。甚至可以找到社区开发者编写的优秀 Prosody 插件。
作者:Buddhi Vikasitha
编译自medium.
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/33405.html