79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
# Copyright 2014, 2015 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.
 | 
						|
 | 
						|
"""This layer is responsible for replicating with remote home servers using
 | 
						|
a given transport.
 | 
						|
"""
 | 
						|
 | 
						|
from .federation_client import FederationClient
 | 
						|
from .federation_server import FederationServer
 | 
						|
 | 
						|
from .transaction_queue import TransactionQueue
 | 
						|
 | 
						|
from .persistence import TransactionActions
 | 
						|
 | 
						|
import logging
 | 
						|
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
class ReplicationLayer(FederationClient, FederationServer):
 | 
						|
    """This layer is responsible for replicating with remote home servers over
 | 
						|
    the given transport. I.e., does the sending and receiving of PDUs to
 | 
						|
    remote home servers.
 | 
						|
 | 
						|
    The layer communicates with the rest of the server via a registered
 | 
						|
    ReplicationHandler.
 | 
						|
 | 
						|
    In more detail, the layer:
 | 
						|
        * Receives incoming data and processes it into transactions and pdus.
 | 
						|
        * Fetches any PDUs it thinks it might have missed.
 | 
						|
        * Keeps the current state for contexts up to date by applying the
 | 
						|
          suitable conflict resolution.
 | 
						|
        * Sends outgoing pdus wrapped in transactions.
 | 
						|
        * Fills out the references to previous pdus/transactions appropriately
 | 
						|
          for outgoing data.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, hs, transport_layer):
 | 
						|
        self.server_name = hs.hostname
 | 
						|
 | 
						|
        self.keyring = hs.get_keyring()
 | 
						|
 | 
						|
        self.transport_layer = transport_layer
 | 
						|
        self.transport_layer.register_received_handler(self)
 | 
						|
        self.transport_layer.register_request_handler(self)
 | 
						|
 | 
						|
        self.federation_client = self
 | 
						|
 | 
						|
        self.store = hs.get_datastore()
 | 
						|
 | 
						|
        self.handler = None
 | 
						|
        self.edu_handlers = {}
 | 
						|
        self.query_handlers = {}
 | 
						|
 | 
						|
        self._clock = hs.get_clock()
 | 
						|
 | 
						|
        self.transaction_actions = TransactionActions(self.store)
 | 
						|
        self._transaction_queue = TransactionQueue(hs, transport_layer)
 | 
						|
 | 
						|
        self._order = 0
 | 
						|
 | 
						|
        self.hs = hs
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        return "<ReplicationLayer(%s)>" % self.server_name
 |