Skip to content
On this page

synapse代码阅读的一点体会

HomeServer中的get_xx找不到

实际上是通过setattr DEPENDENCIES动态设置的, 以federation_client为例. get_federation_client 是在初始化的时候通过_make_dependency_method构造的. _make_dependency_method最终会调用build_federation_client来构造实例,

至于为什么这么做,我猜可能是为了延迟实例初始化.避免不避免的构建.

http服务的总入口

SynapseHomeServer的_listener_http关联到SynapseSite SynapseSite是按照twisted框架导出真实服务接口的地方.

SynapseHomeServer的_configure_named_resource是加载相应的resource的入口 在这里可以看到配置文件如何影响加载

ClientRestResource这是目前client-server api的总入口. TransportLayerServer这是fedoration 服务的总入口

http模块

  1. site.py 构建了基于twisted的服务处理流程. SynapseSite,提供SynapseRequestFactory,SynapseRequestFactory创建SynapseRequest
  2. additional_resource.py 暂时完全用不着,因为目前配置文件这部分为空
  3. client.py SimpleHttpClient 是让synapse向其他服务器发起http请求用,比如
  • CaptchaServerHttpClient用于captcha验证
  • HomeServer get_simple_http_client 调用创建的用于Identity,fedoration请求等等.
  1. matrixfederationclient.py 主要用于创建到fedoration的http链接,我猜应该是因为@alice:domain.com,这里的domain.com解析比较复杂,synapse有专门的说明,在dns解析中,需要有特殊支持.
  2. request_metrics.py 用于测量每次请求的花费
  3. server.py主要提供JsonResource,其他各种handler都基于这个.

handlers模块

client-server ,fedoration,admin等等服务端最终的handler都在这里. 其中最复杂的莫过于sync.py中负责/sync的api

变量类型映射

txn_ctrl--> _TransactionController txn AppServiceTransaction

app service 注册问题

LoginType.APPLICATION_SERVICE 通过他可以跟踪到 application service 如何新注册用户

v1_only/register.py 1. on_POST 就算是禁止注册,也可以通过application service注册用户 2. _do_app_service 进行注册 3. appservice_register url中的access_token以及userId传进去. storage/appservice.py: 1. 如果这个access_token能够找到对应的service,则允许注册,否则不允许 我觉得这里的service应该是在配置文件homeserver.yaml app_service_config_files 2. application_service提供了一一系列验证,如果可以将此用户写入数据库中 3. 问题是如何登陆呢?这种方式也没法控制用户注册, 因为他并不会转到application service,让他们来处理这个事情.

可否通过app service注册用户呢?