summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2021-05-05 14:16:41 +0100
committerErik Johnston <erik@matrix.org>2021-05-05 15:06:46 +0100
commitec1c2c69a23c2ad08b17bb2c45168f6ed69ba63c (patch)
tree9212e0887cfee09717a21797f5ce9e2d0fad7954
parentSlots (diff)
downloadsynapse-ec1c2c69a23c2ad08b17bb2c45168f6ed69ba63c.tar.xz
Encode json dict
-rw-r--r--synapse/events/__init__.py34
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):