diff options
author | Erik Johnston <erik@matrix.org> | 2021-05-05 14:16:41 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2021-05-05 15:06:46 +0100 |
commit | ec1c2c69a23c2ad08b17bb2c45168f6ed69ba63c (patch) | |
tree | 9212e0887cfee09717a21797f5ce9e2d0fad7954 | |
parent | Slots (diff) | |
download | synapse-ec1c2c69a23c2ad08b17bb2c45168f6ed69ba63c.tar.xz |
Encode json dict
-rw-r--r-- | synapse/events/__init__.py | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/synapse/events/__init__.py b/synapse/events/__init__.py index baae3be69c..5a443dec09 100644 --- a/synapse/events/__init__.py +++ b/synapse/events/__init__.py @@ -16,12 +16,14 @@ import abc import os +import zlib from typing import Dict, Optional, Tuple, Type from unpaddedbase64 import encode_base64 from synapse.api.room_versions import EventFormatVersions, RoomVersion, RoomVersions from synapse.types import JsonDict, RoomStreamToken +from synapse.util import json_decoder, json_encoder from synapse.util.caches import intern_dict from synapse.util.frozenutils import freeze from synapse.util.stringutils import strtobool @@ -37,6 +39,26 @@ from synapse.util.stringutils import strtobool USE_FROZEN_DICTS = strtobool(os.environ.get("SYNAPSE_USE_FROZEN_DICTS", "0")) +_PRESET_ZDICT = b""""auth_events":[],"prev_events":[],"type":"m.room.create","room_id":,"sender":,"content":"room_version":"creator":"depth":"prev_state":"state_key":""origin":"origin_server_ts":"hashes":{"sha256":"signatures":,"unsigned":{"age_ts":""" + + +def _encode_dict(d: JsonDict) -> bytes: + json_bytes = json_encoder.encode(d).encode("utf-8") + c = zlib.compressobj(1, zdict=_PRESET_ZDICT) + result_bytes = c.compress(json_bytes) + result_bytes += c.flush() + return result_bytes + + +def _decode_dict(b: bytes) -> JsonDict: + d = zlib.decompressobj(zdict=_PRESET_ZDICT) + + result_bytes = d.decompress(b) + result_bytes += d.flush() + + return json_decoder.decode(result_bytes.decode("utf-8")) + + class DictProperty: """An object property which delegates to the `_dict` within its parent object.""" @@ -211,11 +233,11 @@ class EventBase(metaclass=abc.ABCMeta): "signatures", "unsigned", "rejected_reason", - "_dict", + "_encoded_dict", "auth_events", "depth", - "content", - "hashes", + "_content", + "_hashes", "origin", "origin_server_ts", "prev_events", @@ -250,7 +272,7 @@ class EventBase(metaclass=abc.ABCMeta): self.unsigned = unsigned self.rejected_reason = rejected_reason - self._dict = event_dict + self._encoded_dict = _encode_dict(event_dict) self.auth_events = event_dict["auth_events"] self.depth = event_dict["depth"] @@ -281,7 +303,7 @@ class EventBase(metaclass=abc.ABCMeta): return hasattr(self, "state_key") and self.state_key is not None def get_dict(self) -> JsonDict: - d = dict(self._dict) + d = _decode_dict(self._encoded_dict) d.update({"signatures": self.signatures, "unsigned": dict(self.unsigned)}) return d @@ -324,7 +346,7 @@ class EventBase(metaclass=abc.ABCMeta): """'Freeze' the event dict, so it cannot be modified by accident""" # this will be a no-op if the event dict is already frozen. - self._dict = freeze(self._dict) + # self._dict = freeze(self._dict) class FrozenEvent(EventBase): |