Add a type hints for service notices to the HomeServer object. (#9675)
parent
e550ab17ad
commit
7e8dc9934e
|
@ -0,0 +1 @@
|
||||||
|
Add additional type hints to the Homeserver object.
|
|
@ -80,7 +80,7 @@ class SyncConfig:
|
||||||
filter_collection = attr.ib(type=FilterCollection)
|
filter_collection = attr.ib(type=FilterCollection)
|
||||||
is_guest = attr.ib(type=bool)
|
is_guest = attr.ib(type=bool)
|
||||||
request_key = attr.ib(type=Tuple[Any, ...])
|
request_key = attr.ib(type=Tuple[Any, ...])
|
||||||
device_id = attr.ib(type=str)
|
device_id = attr.ib(type=Optional[str])
|
||||||
|
|
||||||
|
|
||||||
@attr.s(slots=True, frozen=True)
|
@attr.s(slots=True, frozen=True)
|
||||||
|
@ -723,7 +723,9 @@ class SyncHandler:
|
||||||
|
|
||||||
return summary
|
return summary
|
||||||
|
|
||||||
def get_lazy_loaded_members_cache(self, cache_key: Tuple[str, str]) -> LruCache:
|
def get_lazy_loaded_members_cache(
|
||||||
|
self, cache_key: Tuple[str, Optional[str]]
|
||||||
|
) -> LruCache:
|
||||||
cache = self.lazy_loaded_members_cache.get(cache_key)
|
cache = self.lazy_loaded_members_cache.get(cache_key)
|
||||||
if cache is None:
|
if cache is None:
|
||||||
logger.debug("creating LruCache for %r", cache_key)
|
logger.debug("creating LruCache for %r", cache_key)
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
|
from typing import TYPE_CHECKING, Tuple
|
||||||
|
|
||||||
from synapse.api.constants import PresenceState
|
from synapse.api.constants import PresenceState
|
||||||
from synapse.api.errors import Codes, StoreError, SynapseError
|
from synapse.api.errors import Codes, StoreError, SynapseError
|
||||||
|
@ -26,11 +27,15 @@ from synapse.events.utils import (
|
||||||
from synapse.handlers.presence import format_user_presence_state
|
from synapse.handlers.presence import format_user_presence_state
|
||||||
from synapse.handlers.sync import SyncConfig
|
from synapse.handlers.sync import SyncConfig
|
||||||
from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string
|
from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string
|
||||||
from synapse.types import StreamToken
|
from synapse.http.site import SynapseRequest
|
||||||
|
from synapse.types import JsonDict, StreamToken
|
||||||
from synapse.util import json_decoder
|
from synapse.util import json_decoder
|
||||||
|
|
||||||
from ._base import client_patterns, set_timeline_upper_limit
|
from ._base import client_patterns, set_timeline_upper_limit
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from synapse.server import HomeServer
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,7 +78,7 @@ class SyncRestServlet(RestServlet):
|
||||||
PATTERNS = client_patterns("/sync$")
|
PATTERNS = client_patterns("/sync$")
|
||||||
ALLOWED_PRESENCE = {"online", "offline", "unavailable"}
|
ALLOWED_PRESENCE = {"online", "offline", "unavailable"}
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs: "HomeServer"):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.hs = hs
|
self.hs = hs
|
||||||
self.auth = hs.get_auth()
|
self.auth = hs.get_auth()
|
||||||
|
@ -85,7 +90,7 @@ class SyncRestServlet(RestServlet):
|
||||||
self._server_notices_sender = hs.get_server_notices_sender()
|
self._server_notices_sender = hs.get_server_notices_sender()
|
||||||
self._event_serializer = hs.get_event_client_serializer()
|
self._event_serializer = hs.get_event_client_serializer()
|
||||||
|
|
||||||
async def on_GET(self, request):
|
async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
|
||||||
if b"from" in request.args:
|
if b"from" in request.args:
|
||||||
# /events used to use 'from', but /sync uses 'since'.
|
# /events used to use 'from', but /sync uses 'since'.
|
||||||
# Lets be helpful and whine if we see a 'from'.
|
# Lets be helpful and whine if we see a 'from'.
|
||||||
|
|
|
@ -650,13 +650,13 @@ class HomeServer(metaclass=abc.ABCMeta):
|
||||||
return FederationHandlerRegistry(self)
|
return FederationHandlerRegistry(self)
|
||||||
|
|
||||||
@cache_in_self
|
@cache_in_self
|
||||||
def get_server_notices_manager(self):
|
def get_server_notices_manager(self) -> ServerNoticesManager:
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
raise Exception("Workers cannot send server notices")
|
raise Exception("Workers cannot send server notices")
|
||||||
return ServerNoticesManager(self)
|
return ServerNoticesManager(self)
|
||||||
|
|
||||||
@cache_in_self
|
@cache_in_self
|
||||||
def get_server_notices_sender(self):
|
def get_server_notices_sender(self) -> WorkerServerNoticesSender:
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
return WorkerServerNoticesSender(self)
|
return WorkerServerNoticesSender(self)
|
||||||
return ServerNoticesSender(self)
|
return ServerNoticesSender(self)
|
||||||
|
|
|
@ -13,13 +13,16 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import logging
|
import logging
|
||||||
from typing import Any
|
from typing import TYPE_CHECKING, Any, Set
|
||||||
|
|
||||||
from synapse.api.errors import SynapseError
|
from synapse.api.errors import SynapseError
|
||||||
from synapse.api.urls import ConsentURIBuilder
|
from synapse.api.urls import ConsentURIBuilder
|
||||||
from synapse.config import ConfigError
|
from synapse.config import ConfigError
|
||||||
from synapse.types import get_localpart_from_id
|
from synapse.types import get_localpart_from_id
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from synapse.server import HomeServer
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,16 +31,11 @@ class ConsentServerNotices:
|
||||||
privacy policy consent, and sends one if we do.
|
privacy policy consent, and sends one if we do.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs: "HomeServer"):
|
||||||
"""
|
|
||||||
|
|
||||||
Args:
|
|
||||||
hs (synapse.server.HomeServer):
|
|
||||||
"""
|
|
||||||
self._server_notices_manager = hs.get_server_notices_manager()
|
self._server_notices_manager = hs.get_server_notices_manager()
|
||||||
self._store = hs.get_datastore()
|
self._store = hs.get_datastore()
|
||||||
|
|
||||||
self._users_in_progress = set()
|
self._users_in_progress = set() # type: Set[str]
|
||||||
|
|
||||||
self._current_consent_version = hs.config.user_consent_version
|
self._current_consent_version = hs.config.user_consent_version
|
||||||
self._server_notice_content = hs.config.user_consent_server_notice_content
|
self._server_notice_content = hs.config.user_consent_server_notice_content
|
||||||
|
@ -73,6 +71,10 @@ class ConsentServerNotices:
|
||||||
try:
|
try:
|
||||||
u = await self._store.get_user_by_id(user_id)
|
u = await self._store.get_user_by_id(user_id)
|
||||||
|
|
||||||
|
# The user doesn't exist.
|
||||||
|
if u is None:
|
||||||
|
return
|
||||||
|
|
||||||
if u["is_guest"] and not self._send_to_guests:
|
if u["is_guest"] and not self._send_to_guests:
|
||||||
# don't send to guests
|
# don't send to guests
|
||||||
return
|
return
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import logging
|
import logging
|
||||||
from typing import List, Tuple
|
from typing import TYPE_CHECKING, List, Tuple
|
||||||
|
|
||||||
from synapse.api.constants import (
|
from synapse.api.constants import (
|
||||||
EventTypes,
|
EventTypes,
|
||||||
|
@ -24,6 +24,9 @@ from synapse.api.constants import (
|
||||||
from synapse.api.errors import AuthError, ResourceLimitError, SynapseError
|
from synapse.api.errors import AuthError, ResourceLimitError, SynapseError
|
||||||
from synapse.server_notices.server_notices_manager import SERVER_NOTICE_ROOM_TAG
|
from synapse.server_notices.server_notices_manager import SERVER_NOTICE_ROOM_TAG
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from synapse.server import HomeServer
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,11 +35,7 @@ class ResourceLimitsServerNotices:
|
||||||
ensures that the client is kept up to date.
|
ensures that the client is kept up to date.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs: "HomeServer"):
|
||||||
"""
|
|
||||||
Args:
|
|
||||||
hs (synapse.server.HomeServer):
|
|
||||||
"""
|
|
||||||
self._server_notices_manager = hs.get_server_notices_manager()
|
self._server_notices_manager = hs.get_server_notices_manager()
|
||||||
self._store = hs.get_datastore()
|
self._store = hs.get_datastore()
|
||||||
self._auth = hs.get_auth()
|
self._auth = hs.get_auth()
|
||||||
|
|
|
@ -58,7 +58,7 @@ class ServerNoticesManager:
|
||||||
user_id: str,
|
user_id: str,
|
||||||
event_content: dict,
|
event_content: dict,
|
||||||
type: str = EventTypes.Message,
|
type: str = EventTypes.Message,
|
||||||
state_key: Optional[bool] = None,
|
state_key: Optional[str] = None,
|
||||||
) -> EventBase:
|
) -> EventBase:
|
||||||
"""Send a notice to the given user
|
"""Send a notice to the given user
|
||||||
|
|
||||||
|
|
|
@ -12,25 +12,27 @@
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
from typing import Iterable, Union
|
from typing import TYPE_CHECKING, Iterable, Union
|
||||||
|
|
||||||
from synapse.server_notices.consent_server_notices import ConsentServerNotices
|
from synapse.server_notices.consent_server_notices import ConsentServerNotices
|
||||||
from synapse.server_notices.resource_limits_server_notices import (
|
from synapse.server_notices.resource_limits_server_notices import (
|
||||||
ResourceLimitsServerNotices,
|
ResourceLimitsServerNotices,
|
||||||
)
|
)
|
||||||
|
from synapse.server_notices.worker_server_notices_sender import (
|
||||||
|
WorkerServerNoticesSender,
|
||||||
|
)
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from synapse.server import HomeServer
|
||||||
|
|
||||||
|
|
||||||
class ServerNoticesSender:
|
class ServerNoticesSender(WorkerServerNoticesSender):
|
||||||
"""A centralised place which sends server notices automatically when
|
"""A centralised place which sends server notices automatically when
|
||||||
Certain Events take place
|
Certain Events take place
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs: "HomeServer"):
|
||||||
"""
|
super().__init__(hs)
|
||||||
|
|
||||||
Args:
|
|
||||||
hs (synapse.server.HomeServer):
|
|
||||||
"""
|
|
||||||
self._server_notices = (
|
self._server_notices = (
|
||||||
ConsentServerNotices(hs),
|
ConsentServerNotices(hs),
|
||||||
ResourceLimitsServerNotices(hs),
|
ResourceLimitsServerNotices(hs),
|
||||||
|
|
|
@ -12,16 +12,17 @@
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from synapse.server import HomeServer
|
||||||
|
|
||||||
|
|
||||||
class WorkerServerNoticesSender:
|
class WorkerServerNoticesSender:
|
||||||
"""Stub impl of ServerNoticesSender which does nothing"""
|
"""Stub impl of ServerNoticesSender which does nothing"""
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs: "HomeServer"):
|
||||||
"""
|
pass
|
||||||
Args:
|
|
||||||
hs (synapse.server.HomeServer):
|
|
||||||
"""
|
|
||||||
|
|
||||||
async def on_user_syncing(self, user_id: str) -> None:
|
async def on_user_syncing(self, user_id: str) -> None:
|
||||||
"""Called when the user performs a sync operation.
|
"""Called when the user performs a sync operation.
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from typing import List, Tuple
|
from typing import List, Optional, Tuple
|
||||||
|
|
||||||
from synapse.logging.opentracing import log_kv, set_tag, trace
|
from synapse.logging.opentracing import log_kv, set_tag, trace
|
||||||
from synapse.replication.tcp.streams import ToDeviceStream
|
from synapse.replication.tcp.streams import ToDeviceStream
|
||||||
|
@ -115,7 +115,7 @@ class DeviceInboxWorkerStore(SQLBaseStore):
|
||||||
async def get_new_messages_for_device(
|
async def get_new_messages_for_device(
|
||||||
self,
|
self,
|
||||||
user_id: str,
|
user_id: str,
|
||||||
device_id: str,
|
device_id: Optional[str],
|
||||||
last_stream_id: int,
|
last_stream_id: int,
|
||||||
current_stream_id: int,
|
current_stream_id: int,
|
||||||
limit: int = 100,
|
limit: int = 100,
|
||||||
|
@ -163,7 +163,7 @@ class DeviceInboxWorkerStore(SQLBaseStore):
|
||||||
|
|
||||||
@trace
|
@trace
|
||||||
async def delete_messages_for_device(
|
async def delete_messages_for_device(
|
||||||
self, user_id: str, device_id: str, up_to_stream_id: int
|
self, user_id: str, device_id: Optional[str], up_to_stream_id: int
|
||||||
) -> int:
|
) -> int:
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import logging
|
import logging
|
||||||
from typing import Dict, List
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
from synapse.metrics.background_process_metrics import wrap_as_background_process
|
from synapse.metrics.background_process_metrics import wrap_as_background_process
|
||||||
from synapse.storage._base import SQLBaseStore
|
from synapse.storage._base import SQLBaseStore
|
||||||
|
@ -109,7 +109,7 @@ class MonthlyActiveUsersWorkerStore(SQLBaseStore):
|
||||||
return users
|
return users
|
||||||
|
|
||||||
@cached(num_args=1)
|
@cached(num_args=1)
|
||||||
async def user_last_seen_monthly_active(self, user_id: str) -> int:
|
async def user_last_seen_monthly_active(self, user_id: str) -> Optional[int]:
|
||||||
"""
|
"""
|
||||||
Checks if a given user is part of the monthly active user group
|
Checks if a given user is part of the monthly active user group
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue