2024-01-20 12:52:35 +00:00
|
|
|
import json
|
|
|
|
import structlog
|
|
|
|
class DataDispatcher:
|
|
|
|
def __init__(self):
|
|
|
|
self.logger = structlog.get_logger(type(self).__name__)
|
|
|
|
|
2024-01-20 13:35:04 +00:00
|
|
|
# endpoints
|
2024-01-20 12:52:35 +00:00
|
|
|
self.endpoints = {
|
|
|
|
"p2pmsg": self.handle_p2pmsg,
|
|
|
|
"test": self.handle_test,
|
|
|
|
}
|
|
|
|
|
|
|
|
def log(self, message, isWarning = False):
|
|
|
|
msg = f"[{type(self).__name__}]: {message}"
|
|
|
|
logger = self.logger.warn if isWarning else self.logger.info
|
|
|
|
logger(msg)
|
|
|
|
|
|
|
|
def encapsulate(self, data, type_key="p2pmsg"):
|
|
|
|
"""Encapsulate data into the specified format with the given type key."""
|
|
|
|
formatted_data = {type_key: data}
|
|
|
|
return json.dumps(formatted_data)
|
|
|
|
|
|
|
|
def decapsulate(self, byte_data):
|
|
|
|
"""Decapsulate data from the specified format, returning both the data and the type."""
|
|
|
|
try:
|
|
|
|
json_data = byte_data.decode('utf-8') # Decode byte array to string
|
|
|
|
parsed_data = json.loads(json_data)
|
|
|
|
if parsed_data and isinstance(parsed_data, dict):
|
|
|
|
for key, value in parsed_data.items():
|
|
|
|
return key, value # Return type and data
|
|
|
|
return "raw", byte_data # Treat as raw data if no matching type is found
|
|
|
|
except (json.JSONDecodeError, UnicodeDecodeError):
|
|
|
|
return "raw", byte_data # Return original data as raw if there's an error
|
|
|
|
|
|
|
|
def dispatch(self, byte_data):
|
|
|
|
"""Decapsulate and dispatch data to the appropriate endpoint based on its type."""
|
|
|
|
type_key, data = self.decapsulate(byte_data)
|
|
|
|
if type_key in self.endpoints:
|
|
|
|
self.endpoints[type_key](data)
|
|
|
|
else:
|
|
|
|
# Use the default handler for unrecognized types
|
2024-01-20 13:35:04 +00:00
|
|
|
self.handle_raw(data)
|
2024-01-20 12:52:35 +00:00
|
|
|
|
|
|
|
def handle_p2pmsg(self, data):
|
|
|
|
self.log(f"Handling p2pmsg: {data}")
|
|
|
|
|
|
|
|
def handle_raw(self, data):
|
|
|
|
self.log(f"Handling raw data: {data}")
|
|
|
|
|
|
|
|
def handle_test(self, data):
|
|
|
|
self.log(f"Handling test data: {data}")
|