105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
# Copyright 2014-2016 OpenMarket Ltd
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
""" Defines the JSON structure of the protocol units used by the server to
 | 
						|
server protocol.
 | 
						|
"""
 | 
						|
 | 
						|
import logging
 | 
						|
from typing import List, Optional
 | 
						|
 | 
						|
import attr
 | 
						|
 | 
						|
from synapse.types import JsonDict
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
@attr.s(slots=True, frozen=True, auto_attribs=True)
 | 
						|
class Edu:
 | 
						|
    """An Edu represents a piece of data sent from one homeserver to another.
 | 
						|
 | 
						|
    In comparison to Pdus, Edus are not persisted for a long time on disk, are
 | 
						|
    not meaningful beyond a given pair of homeservers, and don't have an
 | 
						|
    internal ID or previous references graph.
 | 
						|
    """
 | 
						|
 | 
						|
    edu_type: str
 | 
						|
    content: dict
 | 
						|
    origin: str
 | 
						|
    destination: str
 | 
						|
 | 
						|
    def get_dict(self) -> JsonDict:
 | 
						|
        return {
 | 
						|
            "edu_type": self.edu_type,
 | 
						|
            "content": self.content,
 | 
						|
        }
 | 
						|
 | 
						|
    def get_internal_dict(self) -> JsonDict:
 | 
						|
        return {
 | 
						|
            "edu_type": self.edu_type,
 | 
						|
            "content": self.content,
 | 
						|
            "origin": self.origin,
 | 
						|
            "destination": self.destination,
 | 
						|
        }
 | 
						|
 | 
						|
    def get_context(self) -> str:
 | 
						|
        return getattr(self, "content", {}).get("org.matrix.opentracing_context", "{}")
 | 
						|
 | 
						|
    def strip_context(self) -> None:
 | 
						|
        getattr(self, "content", {})["org.matrix.opentracing_context"] = "{}"
 | 
						|
 | 
						|
 | 
						|
def _none_to_list(edus: Optional[List[JsonDict]]) -> List[JsonDict]:
 | 
						|
    if edus is None:
 | 
						|
        return []
 | 
						|
    return edus
 | 
						|
 | 
						|
 | 
						|
@attr.s(slots=True, frozen=True, auto_attribs=True)
 | 
						|
class Transaction:
 | 
						|
    """A transaction is a list of Pdus and Edus to be sent to a remote home
 | 
						|
    server with some extra metadata.
 | 
						|
 | 
						|
    Example transaction::
 | 
						|
 | 
						|
        {
 | 
						|
            "origin": "foo",
 | 
						|
            "prev_ids": ["abc", "def"],
 | 
						|
            "pdus": [
 | 
						|
                ...
 | 
						|
            ],
 | 
						|
        }
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    # Required keys.
 | 
						|
    transaction_id: str
 | 
						|
    origin: str
 | 
						|
    destination: str
 | 
						|
    origin_server_ts: int
 | 
						|
    pdus: List[JsonDict] = attr.ib(factory=list, converter=_none_to_list)
 | 
						|
    edus: List[JsonDict] = attr.ib(factory=list, converter=_none_to_list)
 | 
						|
 | 
						|
    def get_dict(self) -> JsonDict:
 | 
						|
        """A JSON-ready dictionary of valid keys which aren't internal."""
 | 
						|
        result = {
 | 
						|
            "origin": self.origin,
 | 
						|
            "origin_server_ts": self.origin_server_ts,
 | 
						|
            "pdus": self.pdus,
 | 
						|
        }
 | 
						|
        if self.edus:
 | 
						|
            result["edus"] = self.edus
 | 
						|
        return result
 |