Skip to content
Snippets Groups Projects
  • Quentin Gliech's avatar
    4af33015
    Fix joining remote rooms when a `on_new_event` callback is registered (#16973) · 4af33015
    Quentin Gliech authored
    Since Synapse 1.76.0, any module which registers a `on_new_event`
    callback would brick the ability to join remote rooms.
    This is because this callback tried to get the full state of the room,
    which would end up in a deadlock.
    
    Related:
    https://github.com/matrix-org/synapse-auto-accept-invite/issues/18
    
    The following module would brick the ability to join remote rooms:
    
    ```python
    from typing import Any, Dict, Literal, Union
    import logging
    
    from synapse.module_api import ModuleApi, EventBase
    
    logger = logging.getLogger(__name__)
    
    class MyModule:
        def __init__(self, config: None, api: ModuleApi):
            self._api = api
            self._config = config
    
            self._api.register_third_party_rules_callbacks(
                on_new_event=self.on_new_event,
            )
    
        async def on_new_event(self, event: EventBase, _state_map: Any) -> None:
            logger.info(f"Received new event: {event}")
    
        @staticmethod
        def parse_config(_config: Dict[str, Any]) -> None:
            return None
    ```
    
    This is technically a breaking change, as we are now passing partial
    state on the `on_new_event` callback.
    However, this callback was broken for federated rooms since 1.76.0, and
    local rooms have full state anyway, so it's unlikely that it would
    change anything.
    Fix joining remote rooms when a `on_new_event` callback is registered (#16973)
    Quentin Gliech authored
    Since Synapse 1.76.0, any module which registers a `on_new_event`
    callback would brick the ability to join remote rooms.
    This is because this callback tried to get the full state of the room,
    which would end up in a deadlock.
    
    Related:
    https://github.com/matrix-org/synapse-auto-accept-invite/issues/18
    
    The following module would brick the ability to join remote rooms:
    
    ```python
    from typing import Any, Dict, Literal, Union
    import logging
    
    from synapse.module_api import ModuleApi, EventBase
    
    logger = logging.getLogger(__name__)
    
    class MyModule:
        def __init__(self, config: None, api: ModuleApi):
            self._api = api
            self._config = config
    
            self._api.register_third_party_rules_callbacks(
                on_new_event=self.on_new_event,
            )
    
        async def on_new_event(self, event: EventBase, _state_map: Any) -> None:
            logger.info(f"Received new event: {event}")
    
        @staticmethod
        def parse_config(_config: Dict[str, Any]) -> None:
            return None
    ```
    
    This is technically a breaking change, as we are now passing partial
    state on the `on_new_event` callback.
    However, this callback was broken for federated rooms since 1.76.0, and
    local rooms have full state anyway, so it's unlikely that it would
    change anything.