如何注册 Ejabberd pubsub 节点的自定义实现?
How to register custom implementation of Ejabberd pubsub node?
我想使用 pubsub 节点的自定义实现 (gen_pubsub_node)。我在 elixir 中创建了虚拟实现(将所有内容委托给 node_flat_sql):
defmodule CustomNodePlugin do
@behaviour :gen_pubsub_node
defdelegate init(host, server_host, opts), to: :node_flat_sql
defdelegate terminate(host, server_host), to: :node_flat_sql
defdelegate options(), to: :node_flat_sql
defdelegate features(), to: :node_flat_sql
defdelegate create_node_permission(host, server_host, node, parent_node, owner), to: :node_flat_sql
defdelegate create_node(node_idx, owner), to: :node_flat_sql
defdelegate delete_node(nodes), to: :node_flat_sql
defdelegate purge_node(node_idx), to: :node_flat_sql
defdelegate subscribe_node(
node_idx,
sender,
subscriber,
access_model,
send_last,
pesesnce_subscription,
roster_group, options
), to: :node_flat_sql
defdelegate unsubscribe_node(
node_idx,
sender,
subscriber,
sub_id
), to: :node_flat_sql
defdelegate publish_item(
node_idx,
publisher,
publish_model,
max_items,
item_id,
payload,
options
), to: :node_flat_sql
defdelegate delete_item(
node_idx,
publisher,
publish_model,
item_id
), to: :node_flat_sql
defdelegate remove_extra_items(
node_idx,
max_items,
item_ids
), to: :node_flat_sql
defdelegate get_node_affiliations(node_idx), to: :node_flat_sql
defdelegate get_entity_affiliations(
host,
owner
), to: :node_flat_sql
defdelegate get_affiliation(node_idx, owner), to: :node_flat_sql
defdelegate set_affiliation(node_idx, owner, affiliation), to: :node_flat_sql
# needs to be implemented
defdelegate get_node_subscriptions(node_idx), to: :node_flat_sql
defdelegate get_entity_subscriptions(host, key), to: :node_flat_sql
defdelegate get_subscriptions(node_idx, owner), to: :node_flat_sql
defdelegate get_pending_nodes(host, owner), to: :node_flat_sql
defdelegate get_states(node_idx), to: :node_flat_sql
defdelegate get_state(node_idx, key), to: :node_flat_sql
defdelegate set_state(state), to: :node_flat_sql
defdelegate get_items(
node_idx,
jid,
access_model,
param1,
param2,
param3,
param4
), to: :node_flat_sql
defdelegate get_items(
node_idx,
jid,
access_model
), to: :node_flat_sql
defdelegate get_last_items(node_idx, jid, rsm_set), to: :node_flat_sql
defdelegate get_only_item(node_idx, jid), to: :node_flat_sql
defdelegate get_item(
node_idx,
jid,
access_model,
presence_subscription,
roster_group,
sub_id
), to: :node_flat_sql
defdelegate get_item(
node_idx,
item_id
), to: :node_flat_sql
defdelegate set_item(), to: :node_flat_sql
defdelegate get_item_name(host, server_host, node_idx), to: :node_flat_sql
defdelegate node_to_path(node_idx), to: :node_flat_sql
defdelegate path_to_node(node_idx), to: :node_flat_sql
end
我不知道如何将它集成到 ejabberd 中,我试着简单地在里面注册它 ejabberd.yml:
...
mod_pubsub:
access_createnode: pubsub_createnode
db_type: sql
plugins:
- "flat"
- "pep"
- "CustomNodePlugin"
force_node_config:
## Change from "whitelist" to "open" to enable OMEMO support
## See https://github.com/processone/ejabberd/issues/2425
"eu.siacs.conversations.axolotl.*":
access_model: open
## Avoid buggy clients to make their bookmarks public
"storage:bookmarks":
access_model: open
...
但我收到以下错误:
无法启动 ejabberd 应用程序:选项模块->mod_pubsub->插件->3 的值无效:意外值:CustomNodePlugin。你说的是平面吗?可能的值有:flat、pep
尝试查看文档(https://docs.ejabberd.im/developer/extending-ejabberd/pubsub/#pubsub-overview) and https://github.com/processone/ejabberd/blob/master/src/mod_pubsub.erl#L257,但找不到可以挂接新实现的位置。有没有办法通过配置文件注册新节点?如何?
我设法弄明白了,bun 仅适用于 pubsub。配置文档指出 PEP 节点可以通过 pep_mapping(https://docs.ejabberd.im/admin/configuration/#mod-pubsub 搜索 pep_mapping)使用自定义实现,在这里您可以通过添加 pep_mapping 项强制节点使用您的自定义实现,例如
mod_pubsub:
pep_mapping:
"custom:node": custom
在运行时(使用默认配置)Ejabberd 将查找名为 node_custom 的模块。如果 SQL 配置为后端,Ejabberd 将查找名为 node_custom_sql 的模块。
Elixir 模块可以将原子作为名称,因此您应该将模块定义为:
defmodule :node_custom_sql do
...
总结一下:
- 在配置中注册 PEP 映射
- 定义名称为 "node_" + + "_sql" 的模块(用于 SQL 后端,如果已配置)。模块名称是 atom
- 实施gen_pubsub_node行为
我想使用 pubsub 节点的自定义实现 (gen_pubsub_node)。我在 elixir 中创建了虚拟实现(将所有内容委托给 node_flat_sql):
defmodule CustomNodePlugin do
@behaviour :gen_pubsub_node
defdelegate init(host, server_host, opts), to: :node_flat_sql
defdelegate terminate(host, server_host), to: :node_flat_sql
defdelegate options(), to: :node_flat_sql
defdelegate features(), to: :node_flat_sql
defdelegate create_node_permission(host, server_host, node, parent_node, owner), to: :node_flat_sql
defdelegate create_node(node_idx, owner), to: :node_flat_sql
defdelegate delete_node(nodes), to: :node_flat_sql
defdelegate purge_node(node_idx), to: :node_flat_sql
defdelegate subscribe_node(
node_idx,
sender,
subscriber,
access_model,
send_last,
pesesnce_subscription,
roster_group, options
), to: :node_flat_sql
defdelegate unsubscribe_node(
node_idx,
sender,
subscriber,
sub_id
), to: :node_flat_sql
defdelegate publish_item(
node_idx,
publisher,
publish_model,
max_items,
item_id,
payload,
options
), to: :node_flat_sql
defdelegate delete_item(
node_idx,
publisher,
publish_model,
item_id
), to: :node_flat_sql
defdelegate remove_extra_items(
node_idx,
max_items,
item_ids
), to: :node_flat_sql
defdelegate get_node_affiliations(node_idx), to: :node_flat_sql
defdelegate get_entity_affiliations(
host,
owner
), to: :node_flat_sql
defdelegate get_affiliation(node_idx, owner), to: :node_flat_sql
defdelegate set_affiliation(node_idx, owner, affiliation), to: :node_flat_sql
# needs to be implemented
defdelegate get_node_subscriptions(node_idx), to: :node_flat_sql
defdelegate get_entity_subscriptions(host, key), to: :node_flat_sql
defdelegate get_subscriptions(node_idx, owner), to: :node_flat_sql
defdelegate get_pending_nodes(host, owner), to: :node_flat_sql
defdelegate get_states(node_idx), to: :node_flat_sql
defdelegate get_state(node_idx, key), to: :node_flat_sql
defdelegate set_state(state), to: :node_flat_sql
defdelegate get_items(
node_idx,
jid,
access_model,
param1,
param2,
param3,
param4
), to: :node_flat_sql
defdelegate get_items(
node_idx,
jid,
access_model
), to: :node_flat_sql
defdelegate get_last_items(node_idx, jid, rsm_set), to: :node_flat_sql
defdelegate get_only_item(node_idx, jid), to: :node_flat_sql
defdelegate get_item(
node_idx,
jid,
access_model,
presence_subscription,
roster_group,
sub_id
), to: :node_flat_sql
defdelegate get_item(
node_idx,
item_id
), to: :node_flat_sql
defdelegate set_item(), to: :node_flat_sql
defdelegate get_item_name(host, server_host, node_idx), to: :node_flat_sql
defdelegate node_to_path(node_idx), to: :node_flat_sql
defdelegate path_to_node(node_idx), to: :node_flat_sql
end
我不知道如何将它集成到 ejabberd 中,我试着简单地在里面注册它 ejabberd.yml:
...
mod_pubsub:
access_createnode: pubsub_createnode
db_type: sql
plugins:
- "flat"
- "pep"
- "CustomNodePlugin"
force_node_config:
## Change from "whitelist" to "open" to enable OMEMO support
## See https://github.com/processone/ejabberd/issues/2425
"eu.siacs.conversations.axolotl.*":
access_model: open
## Avoid buggy clients to make their bookmarks public
"storage:bookmarks":
access_model: open
...
但我收到以下错误: 无法启动 ejabberd 应用程序:选项模块->mod_pubsub->插件->3 的值无效:意外值:CustomNodePlugin。你说的是平面吗?可能的值有:flat、pep
尝试查看文档(https://docs.ejabberd.im/developer/extending-ejabberd/pubsub/#pubsub-overview) and https://github.com/processone/ejabberd/blob/master/src/mod_pubsub.erl#L257,但找不到可以挂接新实现的位置。有没有办法通过配置文件注册新节点?如何?
我设法弄明白了,bun 仅适用于 pubsub。配置文档指出 PEP 节点可以通过 pep_mapping(https://docs.ejabberd.im/admin/configuration/#mod-pubsub 搜索 pep_mapping)使用自定义实现,在这里您可以通过添加 pep_mapping 项强制节点使用您的自定义实现,例如
mod_pubsub:
pep_mapping:
"custom:node": custom
在运行时(使用默认配置)Ejabberd 将查找名为 node_custom 的模块。如果 SQL 配置为后端,Ejabberd 将查找名为 node_custom_sql 的模块。 Elixir 模块可以将原子作为名称,因此您应该将模块定义为:
defmodule :node_custom_sql do
...
总结一下:
- 在配置中注册 PEP 映射
- 定义名称为 "node_" + + "_sql" 的模块(用于 SQL 后端,如果已配置)。模块名称是 atom
- 实施gen_pubsub_node行为