""" AUTHOR: Khushal P Soonderji DATE: Create: Tuesday, 30th Sept., 2025 OBJECTIVE: Simple helper functions to work with the Socket.IO server process. REFERENCES: N/A DOWNLOADS: N/A """ # ***************************************************************************************************************** # ***** **** # *** IMPORT *** # ***** **** # ***************************************************************************************************************** # To make sibling directories accessible for imports: import sys sys.path.append(".") sys.path.append("..") # My utils: from utils_v2.string import regex from utils_v2.queue.kafka.controllers.async_kafka import ConsumerKafka, get_ssl_context from utils_v2.cache.async_redis_cache_v3 import AsyncRedisCache from utils_v2.serialization.json_serializer import JSONSerializer # To maintain the app's state: from wsio_v2.app_state import AppState # ***************************************************************************************************************** # ***** **** # *** MACROS / ONE-TIME INIT *** # ***** **** # ***************************************************************************************************************** # --- Nothing Yet # ***************************************************************************************************************** # ***** **** # *** VARIABLES *** # ***** **** # ***************************************************************************************************************** # --- Nothing Yet # ***************************************************************************************************************** # ***** **** # *** FUNCTIONS *** # ***** **** # ***************************************************************************************************************** def origin_is_allowed(origin: str, app_state: AppState) -> bool: """ To check if a given origin is in the allowed list. :param origin: The origin of your request. :return: True if allowed, else False. """ # For debugging: app_state.printer("Validating origin.") # Start by assuming failure: is_allowed = False # Check through all the allowed origins: for allowed in app_state.ALLOWED_ORIGINS: try: if regex.match(origin, allowed): is_allowed = True break except Exception as exception: app_state.printer(exception) # Done here: app_state.printer(is_allowed) return is_allowed # --------------------------------------------------------------------------------------------------------------------- async def init( script_id: str, debug: bool, app_state: AppState, ): """ To initialize all credentials, instances, and connectivity for this whole script. :param script_id: The id to use to load cred and data from the internal service. :param debug: Whether, or not, you would like to print the debug messages. :return: True if initialized successfully, else False. """ # Basic stuff: if debug: app_state.printer.enable() app_state.printer("Initializing.") # ┏┓ • • # ┃┃┏┓┓┏┓┓┏┓┏ # ┗┛┛ ┗┗┫┗┛┗┛ # ┛ response = await app_state.http_client.post( url = r"https://api.thecaoffice.com/ca/get/title", headers = {"Origin": "https://thecaoffice.com/"}, data = { "domainName": "127.0.0.1:1234", "screenWidth": 1920, "screenHeight": 1080 } ) if response.status_code not in [200]: print("FATAL: ALLOWED ORIGINS NOT FETCHED!") return False ALLOWED_ORIGINS = [origin["domain"] for origin in response.json().get("data", {}).get("rs2", [])] app_state.printer(ALLOWED_ORIGINS) if len(ALLOWED_ORIGINS) < 1: print("FATAL: ALLOWED ORIGINS IS EMPTY!") return False # ┏┓ ┓ ┓ ┳┓ # ┃ ┏┓┏┓┏┫ ┏┓┏┓┏┫ ┃┃┏┓╋┏┓ # ┗┛┛ ┗ ┗┻ ┗┻┛┗┗┻ ┻┛┗┻┗┗┻ # Get the script credentials: response = await app_state.http_client.get( url = r"https://nexcom.ditscentre.in/internal/cred/get", headers = {"X-Script-Id": script_id} ) if response.status_code not in [200]: print("FATAL: SCRIPT CREDENTIALS LOADING FAILED!") return False script_cred = response.json().get("data") # Get the script data: response = await app_state.http_client.get( url = r"https://nexcom.ditscentre.in/internal/data/get", headers = {"X-Script-Id": script_id} ) if response.status_code not in [200]: print("FATAL: SCRIPT DATA LOADING FAILED!") return False app_state.SCRIPT_DATA = response.json().get("data") # Done with this step: app_state.printer("Cred and Data loaded.") # ┓┏┓ ┏┓ ┏┓┓• # ┃┫ ┏┓╋┃┏┏┓ ┃ ┃┓┏┓┏┓╋┏ # ┛┗┛┗┻┛┛┗┗┻ ┗┛┗┗┗ ┛┗┗┛ # Create the consumer that will listen to changes in watchlist: consumer_creds = script_cred["kafka"]["consumer"] app_state.kafka_consumer = ConsumerKafka( topic = consumer_creds["topic"], bootstrap_servers = consumer_creds["config"]["bootstrapServers"], security_protocol = consumer_creds["config"].get("securityProtocol", "PLAINTEXT"), ssl_context = get_ssl_context( ca_file = consumer_creds["config"].get("caFile"), cert_file = consumer_creds["config"].get("certFile"), key_file = consumer_creds["config"].get("keyFile"), ), serializer = JSONSerializer(), debug = debug ) if not await app_state.kafka_consumer.connect(): print("FATAL: KAFKA CONSUMER NOT CREATED!") return False app_state.printer("Kafka consumer ready.") # ┳┓ ┓• ┏┓ ┓ # ┣┫┏┓┏┫┓┏ ━━ ┃ ┏┓┏┣┓┏┓ # ┛┗┗ ┗┻┗┛ ┗┛┗┻┗┛┗┗ app_state.redis_cache = AsyncRedisCache( connection_string = script_cred["redisCache"]["general"]["sentinelJson"], # connection_string = script_cred["redisCache"]["general"]["connectionString"], # serializer = JSONSerializer(), debug = debug, debug_prefix = "General Cache | " ) if not await app_state.redis_cache.connect(): print("FATAL: REDIS CACHE NOT CREATED!") return False app_state.printer("Redis cache ready.") # ┳┓ # ┃┃┏┓┏┓┏┓ # ┻┛┗┛┛┗┗ # If everything went well, we return with success: app_state.printer("Initialization done.") return True # ***************************************************************************************************************** # ***** **** # *** MAIN PROGRAM *** # ***** **** # ***************************************************************************************************************** if __name__ == "__main__": pass