from typing import Callable
from UbiiNetworkClient import UbiiNetworkClient
from proto.topicData.topicDataRecord_pb2 import TopicDataRecord
from TopicDataBuffer import SubscriptionToken, TopicDataBuffer, SubscriptionTokenTYPE
from typing import List
[docs]class TopicDataProxy:
def __init__(self, topicDataBuffer: TopicDataBuffer, networkClient: UbiiNetworkClient, node):
self.topicDataBuffer: TopicDataBuffer = topicDataBuffer
self.networkClient = networkClient
self.node = node
[docs] def subscribeTopic(self, topic: str, callback: Callable[[TopicDataRecord], None]) -> SubscriptionToken:
subscriptions = self.getTopicSubscriptionTokens(topic)
if subscriptions is None or not subscriptions:
self.networkClient.subscribeTopic(topic, self.onTopicDataRecord)
return self.topicDataBuffer.subscribeTopic(topic, callback)
[docs] def subscribeRegex(self, regex: str, callback: Callable[[TopicDataRecord], None]) -> SubscriptionToken:
subscriptions = self.getRegexSubscriptionTokens(regex)
if subscriptions is None or not subscriptions:
self.networkClient.subscribeRegex(regex, self.onTopicDataRecord)
return self.topicDataBuffer.subscribeRegex(regex, callback)
[docs] def unsubscribe(self, token: SubscriptionToken) -> bool:
bufferUnsubscribe = self.topicDataBuffer.unsubscribe(token)
if bufferUnsubscribe:
if token.type == SubscriptionTokenTYPE.TOPIC:
subList = self.getTopicSubscriptionTokens(token.topic)
if (subList is None) or (not subList):
self.networkClient.unsubscribe(token.topic, self.onTopicDataRecord)
elif token.type == SubscriptionTokenTYPE.REGEX:
subList = self.getRegexSubscriptionTokens(token.topic)
if (subList is None) or (not subList):
self.networkClient.unsubscribeRegex(token.topic, self.onTopicDataRecord)
return True
return False
[docs] def remove(self, topic: str):
self.topicDataBuffer.remove(topic)
[docs] def pull(self, topic: str) -> TopicDataRecord:
return self.topicDataBuffer.pull(topic)
[docs] def getTopicSubscriptionTokens(self, topic: str) -> List[SubscriptionToken]:
return self.topicDataBuffer.getTopicSubscriptionTokens(topic)
[docs] def getRegexSubscriptionTokens(self, regex: str) -> List[SubscriptionToken]:
return self.topicDataBuffer.getRegexSubscriptionTokens(regex)
[docs] def onTopicDataRecord(self, record: TopicDataRecord):
self.topicDataBuffer.publish(record)
[docs] def setPublishFrequency(self, frequency):
self.networkClient.setPublishFrequency(frequency)
[docs] def stopNode(self):
self.networkClient.stopNode()