可以使用 REST API 连接到外部会议预订系统。在创建新的 Jitsi Meet 会议之前,将查询预订系统以检查房间的可用性。该系统应返回一个正或负的响应代码,其中还包含会议的持续时间。Prosody 将强制执行会议持续时间,如果超过时间限制,则会终止会议。

启用预订系统

为了启用预订系统,必须配置 REST API 端点的 URL 基础。在 prosody 的主虚拟主机下,启用模块 “reservations” 并添加配置 reservations_api_prefix:

VirtualHost "meet.icloudportal.com"
    -- ....
    modules_enabled = {
        -- ....
        "reservations";
    }
    reservations_api_prefix = "http://s.icloudportal.com/api"

URL 基础用于构建请求 URL。目前,只支持 ‘/conference’ 终端点,因此所有请求都将发送到:

http://s.icloudportal.com/api/conference

还提供了其他配置选项:

  • “reservations_api_timeout”:更改 API 调用的超时时间(默认为 20 秒)
  • “reservations_api_headers”:指定包含在所有 API 调用中的自定义 HTTP 标头,例如提供身份验证令牌。
  • “reservations_api_retry_count”:指定 API 调用失败重试的次数(默认为 3 次)
  • “reservations_api_retry_delay”:重试之间等待的秒数(默认为 3 秒)
  • “reservations_api_should_retry_for_code”:作为一个函数,接受 HTTP 响应代码并返回 true,如果应重试 API 调用。默认情况下,对于 5XX 响应,会进行重试。超时永远不会重试,HTTP 调用失败总是会重试。
  • “reservations_enable_max_occupants”:启用设置最大入住人数的支持。如果设置为 true,并且 API 响应有效载荷包括一个 “max_occupants” 值,则该值将被设置为该特定房间的最大入住限制。
  • 必须还启用 “muc_max_occupants” 模块才能使其正常工作。
  • “reservations_enable_lobby_support”:启用大厅支持。如果设置为 true,并且 API 响应有效载荷包括一个 “lobby” 字段设置为 true,则将为该房间启用大厅。
  • 必须还启用 “muc_lobby_rooms” 和 “persistent_lobby” 模块才能使其正常工作。
  • “reservations_enable_password_support”:启用房间密码支持。如果设置为 true,并且 API 响应有效载荷包括一个 “password” 值,则该值将作为房间密码设置。然后用户将需要知道该密码才能加入房间,或者在启用大厅的情况下,可以使用密码绕过大厅。

    --- The following are all optional
reservations_api_headers = {
["Authorization"] = "Bearer TOKEN-237958623045";
}
reservations_api_timeout = 10 -- timeout if API does not respond within 10s
reservations_api_retry_count = 5 -- retry up to 5 times
reservations_api_retry_delay = 1 -- wait 1s between retries
reservations_api_should_retry_for_code = function (code)
return code >= 500 or code == 408
end
reservations_enable_max_occupants = true -- enable integration with muc_max_occupants
reservations_enable_lobby_support = true -- enable integration with muc_lobby_rooms
reservations_enable_password_support = true -- enable support for setting room passwords

调用流程

注意

所有 API 调用使用以下日期时间格式:

yyyy-MM-dd’T’HH:mm:ss.SSSX – 更多信息可以在 SimpleDateFormat JavaDoc 中找到

会议分配

当第一个用户加入一个 MUC 房间(即打开 Jitsi Meet URL)时,将向 ‘/conference’ 终端点发送 HTTP POST 请求,包含以下参数:

  • name (字符串) – 会议室的简短名称(不是完整的 MUC 地址)。如果使用了租户,则名称将为 [租户]房间名。
  • start_time (字符串) – 会议开始的日期和时间
  • mail_owner (字符串) – 如果启用了身份验证系统,该字段将包含用户的身份。在这种情况下,将无法在没有身份验证的情况下创建新的会议室。

发送到终端点的有效载荷将编码为 application/x-www-form-urlencoded。

预订系统预计将以以下响应之一响应:

HTTP 200 或 201 会议创建成功

在 HTTP 响应中,预期一个 JSON 对象。它应包含系统分配的会议 ID 和以秒为单位的持续时间。示例响应主体:

{
  "id": 364758328,
  "name": "conference1234",
  "mail_owner": "user@server.com",
  "start_time": "2048-04-20T17:55:12.000Z",
  "duration": 900000
}



modules_enabled = {对象还可以可选地包含一个 max_occupants 键,其值为整数。当提供时,且如果启用了 reservations_enable_max_occupants,则该值将传递给 muc_mod_max_occupants 以强制执行每个房间的人数限制。


HTTP 409 – 会议已存在

这是为了从先前的故障中恢复。如果由于某种原因会议被重新启动并且用户尝试再次创建房间,则此响应通知 Prosody 该会议室已经存在。预期的是在 JSON 响应主体中包含 conflict_id:


{
"conflict_id": 364758328
}


Prosody 将使用 HTTP GET 获取给定 conflict_id 的冲突会议的信息。关于此请求的更多信息可以在 “读取会议信息” 部分找到。

HTTP 4xx
其他响应代码将导致会议创建失败。JSON 响应可以包含一个消息对象,该对象将被发送回客户端。

例如,用户 1 尝试通过将会议 IQ 发送到 Jicofo 来启动一个新会议。系统将拒绝该请求。

客户端 -> Jicofo:


<iq from='client1@xmpp.com' to='jicofo.meet.com' type='set'>
<conference xmlns='http://jitsi.org/protocol/focus' room='testroom1' />
</iq>


Prosody -> 预订系统:

POST /conference HTTP/1.1
content-type:application/x-www-form-urlencoded;charset=utf-8
host: http://reservation.example.com
content-length: length

name=testroom1&start_time=2048-04-20T17%3A55%3A12.000Z&mail_owner=client1%40xmpp.com

预订系统 -> Prosody:

HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
Content-Length: length

{
  "message": "client1 is not allowed to create the room at this time"
}

Prosody -> 客户端:

<iq from='jicofo.meet.com' to='client1@xmpp.com' type='error'>
<error type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' />
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>
client1 is not allowed to create the room at this time
</text>
<reservation-error xmlns='http://jitsi.org/protocol/focus' error-code='403'/>
</error>
</iq>

应用程序可以使用文本和 reservation-error 元素向用户提供有意义的信息。

读取会议信息

如果对 HTTP POST 请求的响应是 409,则 Prosody 将尝试使用 HTTP GET ‘/conference/{conflict_id}’ 终端点读取有关冲突会议的信息。响应应提供存储在预订系统中的有关会议的所有信息:

  • “id”: 预订系统分配的会议标识符
  • “name”: 会议室名称
  • “mail_owner”: 创建会议的用户的身份
  • “start_time”: 会议开始的日期和时间
  • “duration”: 预定会议持续时间(以秒为单位)
  • 如果适用,还应提供可选的 max_occupants 值。

示例响应 JSON 主体(包含与 HTTP POST 的 200 OK 相同的信息):

{
"id": 364758328,
"name": "conference1234",
"mail_owner": "user@server.com",
"start_time": "2048-04-20T17:55:12.000Z",
"duration": 900000
}

删除会议

Prosody 在两种情况下从预订系统中删除会议。首先是当所有用户离开 XMPP 多用户聊天室时。其次是当超过会议持续时间限制时。在后一种情况下,Prosody 将销毁 XMPP MUC 房间。在 MUC 房间被销毁后,Prosody 将向 ‘/conference/{id}’ 终端点发送 HTTP DELETE 请求,其中 {id} 被预订系统分配的会议标识符替换。

DELETE /conference/364758328 HTTP/1.1
host: http://reservation.example.com
...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注