class EventListener(object):
    _connection = Repository(NETWORKS=NETWORKS)
    _event_repository = EventRepository(_connection)

    def __init__(self, repository=None):
        self.event_consumer_map = EventListener.initiate_event_subscription()

    def subscribe(self, event_names, event_consumer):
        for event in event_names:
            if event.get_name() in self.event_consumer_map:
                self.event_consumer_map[event] = event_consumer
            else:
                self.event_consumer_map[event] = [event_consumer]

        self.persist_event_subscription(event_names, event_consumer)

    @classmethod
    def initiate_event_subscription(cls):
        return EVENT_SUBSCRIPTIONS

    def _tranform_event_to_push(self, event):
        event['row_created'] = str(event['row_created'])
        event['row_updated'] = str(event['row_updated'])
        event['processed'] = 0
        push_event = {"data": event, "name": event["event"]}

        return push_event

    def _get_listener_handler(self, listener):
        if listener["type"] == "webhook":
            return WebHookHandler(listener["url"])
        elif listener["type"] == "lambda_arn":
            return LambdaArnHandler(listener["url"])

    def _publish_events(self, events):

        error_map = {}
        success_list = []

        for event in events:
            listeners = []
            if event['event'] in self.event_consumer_map:
                listeners = self.event_consumer_map[event['event']]
            for listener in listeners:
                push_event = self._tranform_event_to_push(event)
                logger.debug(f"pushing events {push_event} to listener {listener['url']}")
                try:
                    listener_handler = self._get_listener_handler(listener)
                    listener_handler.push_event(push_event)
                except Exception as e:
                    logger.exception(
                        f"Error while processing event with error {str(e)} for event {event} listener {listener['url']}")
                    error_map[event["row_id"]] = {"error_code": 500,
                                                  "error_message": f"for listener {listener['url']} got error {str(e)}"}
            success_list.append(event["row_id"])

        return error_map, success_list
    def test_produce_mpe_events_from_blockchain(self, mock_get_current_block_no, mock_last_block_number,
                                                mock_get_contract_instance):
        mpe_event_producer = MPEEventProducer(infura_endpoint, Repository(NETWORKS))
        event_repository = EventRepository(Repository(NETWORKS))

        deposit_fund_Event_object = Mock()
        deposit_fund_Event_object.createFilter = Mock(
            return_value=Mock(get_all_entries=Mock(return_value=[AttributeDict(
                {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
                 'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
                 'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
                 'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
                 'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
                 'blockNumber': 6286405})])))
        mock_last_block_number.return_value = 50
        mock_get_current_block_no.return_value = 50

        # Testing contract events
        mock_get_contract_instance.return_value = Mock(
            events=Mock(DepositFunds=deposit_fund_Event_object,
                        abi=[{"type": "event", "name": "DepositFunds"}]))
        blockchain_events = mpe_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict(
            {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
             'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
             'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
             'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
             'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
             'blockNumber': 6286405})]

        # Testing Airdrop events
        airdrop_event_producer = AirdropEventProducer(infura_endpoint, Repository(NETWORKS))
        blockchain_events = airdrop_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict(
            {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
             'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
             'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
             'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
             'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
             'blockNumber': 6286405})]

        # Testing Occam Airdrop events
        occam_airdrop_event_producer = OccamAirdropEventProducer(infura_endpoint, Repository(NETWORKS))
        blockchain_events = occam_airdrop_event_producer.produce_event(3)
        assert blockchain_events == [AttributeDict(
            {'args': AttributeDict({'sender': '0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A', 'amount': 30000000}),
             'event': 'DepositFunds', 'logIndex': 1, 'transactionIndex': 18,
             'transactionHash': HexBytes('0x562cc2fa59d9c7a4aa56106a19ad9c8078a95ae68416619fc191d86c50c91f12'),
             'address': '0x8FB1dC8df86b388C7e00689d1eCb533A160B4D0C',
             'blockHash': HexBytes('0xe06042a4d471351c0ee9e50056bd4fb6a0e158b2489ba70775d3c06bd29da19b'),
             'blockNumber': 6286405})]
예제 #3
0
    def test_produce_registry_events_from_blockchain(
            self, mock_get_current_block_no, mock_last_block_number,
            mock_get_contract_instance):
        registry_event_producer = RegistryEventProducer(
            "wss://ropsten.infura.io/ws", Repository(NETWORKS))

        org_created_event_object = Mock()
        event_repository = EventRepository(Repository(NETWORKS))
        org_created_event_object.createFilter = Mock(return_value=Mock(
            get_all_entries=Mock(return_value=[
                AttributeDict({
                    'args':
                    AttributeDict({
                        'orgId':
                        b'snet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
                    }),
                    'event':
                    'OrganizationCreated',
                    'logIndex':
                    1,
                    'transactionIndex':
                    15,
                    'transactionHash':
                    HexBytes(
                        '0x7934a42442792f6d5a171df218b66161021c885085187719c991ec58d7459821'
                    ),
                    'address':
                    '0x663422c6999Ff94933DBCb388623952CF2407F6f',
                    'blockHash':
                    HexBytes(
                        '0x1da77d63b7d57e0a667ffb9f6d23be92f3ffb5f4b27b39b86c5d75bb167d6779'
                    ),
                    'blockNumber':
                    6243627
                })
            ])))

        mock_get_contract_instance.return_value = Mock(
            events=Mock(organizationCreated=org_created_event_object,
                        abi=[{
                            "type": "event",
                            "name": "organizationCreated"
                        }]))

        mock_last_block_number.return_value = 50
        mock_get_current_block_no.return_value = 50

        blockchain_events = registry_event_producer.produce_event(3)
        assert blockchain_events == [
            AttributeDict({
                'args':
                AttributeDict({
                    'orgId':
                    b'snet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
                }),
                'event':
                'OrganizationCreated',
                'logIndex':
                1,
                'transactionIndex':
                15,
                'transactionHash':
                HexBytes(
                    '0x7934a42442792f6d5a171df218b66161021c885085187719c991ec58d7459821'
                ),
                'address':
                '0x663422c6999Ff94933DBCb388623952CF2407F6f',
                'blockHash':
                HexBytes(
                    '0x1da77d63b7d57e0a667ffb9f6d23be92f3ffb5f4b27b39b86c5d75bb167d6779'
                ),
                'blockNumber':
                6243627
            })
        ]
예제 #4
0
 def __init__(self, ws_provider, repository=None, ):
     self._blockchain_util = BlockChainUtil("WS_PROVIDER", ws_provider)
     self._event_repository = EventRepository(repository)