<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def client_event_handler(self, client_id, event_tuple, user_data):
 """Forward an event on behalf of a client. This method is called by StandardDeviceServer when it has an event that should be sent to a client. Args: client_id (str):
 The client that we should send this event to event_tuple (tuple):
 The conn_string, event_name and event object passed from the call to notify_event. user_data (object):
 The user data passed in the call to :meth:`setup_client`. """


        #TODO: Support sending disconnection events

        conn_string, event_name, event = event_tuple

        if event_name == 'report':
            report = event.serialize()
            report['encoded_report'] = base64.b64encode(report['encoded_report'])
            msg_payload = dict(connection_string=conn_string, serialized_report=report)
            msg_name = OPERATIONS.NOTIFY_REPORT
        elif event_name == 'trace':
            encoded_payload = base64.b64encode(event)
            msg_payload = dict(connection_string=conn_string, payload=encoded_payload)
            msg_name = OPERATIONS.NOTIFY_TRACE
        elif event_name == 'progress':
            msg_payload = dict(connection_string=conn_string, operation=event.get('operation'),
                               done_count=event.get('finished'), total_count=event.get('total'))
            msg_name = OPERATIONS.NOTIFY_PROGRESS
        elif event_name == 'device_seen':
            msg_payload = event
            msg_name = OPERATIONS.NOTIFY_DEVICE_FOUND
        elif event_name == 'broadcast':
            report = event.serialize()
            report['encoded_report'] = base64.b64encode(report['encoded_report'])
            msg_payload = dict(connection_string=conn_string, serialized_report=report)
            msg_name = OPERATIONS.NOTIFY_BROADCAST
        else:
            self._logger.debug("Not forwarding unknown event over websockets: %s", event_tuple)
            return

        try:
            self._logger.debug("Sending event %s: %s", msg_name, msg_payload)
            await self.server.send_event(user_data, msg_name, msg_payload)
        except websockets.exceptions.ConnectionClosed:
            self._logger.debug("Could not send notification because connection was closed for client %s", client_id)