From ba3e8b4c592a309aa03677de9fe9509c57b964b3 Mon Sep 17 00:00:00 2001 From: mbruzon Date: Thu, 28 May 2026 18:09:12 +0200 Subject: [PATCH] #wip: Doing HTTPServersManager. --- Python/Abstracts/HTTPServersAbstract.py | 52 +++++++++++++++++++ ...bstract.py => WebSocketServersAbstract.py} | 2 +- Python/Application/AnP.py | 10 ++-- Python/Drivers/HTTPDriver.py | 6 +-- Python/Drivers/WebSocketServerDriver.py | 7 ++- Python/Interfaces/Application/AnPInterface.py | 4 +- ...py => WebSocketServersManagerInterface.py} | 6 +-- Python/Managers/HTTPServersManager.py | 0 ...rManager.py => WebSocketServersManager.py} | 18 +++---- Tools/run.server.python.bat | 4 ++ 10 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 Python/Abstracts/HTTPServersAbstract.py rename Python/Abstracts/{WebSocketsServerAbstract.py => WebSocketServersAbstract.py} (91%) rename Python/Interfaces/Managers/{WebSocketsServerManagerInterface.py => WebSocketServersManagerInterface.py} (84%) create mode 100644 Python/Managers/HTTPServersManager.py rename Python/Managers/{WebSocketsServerManager.py => WebSocketServersManager.py} (85%) create mode 100644 Tools/run.server.python.bat diff --git a/Python/Abstracts/HTTPServersAbstract.py b/Python/Abstracts/HTTPServersAbstract.py new file mode 100644 index 0000000..2cd4187 --- /dev/null +++ b/Python/Abstracts/HTTPServersAbstract.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from abc import ABC, abstractmethod +from typing import Any, Self, Optional, Sequence +from Interfaces.Application.AnPInterface import AnPInterface +from Utils.Common import Common + +class HTTPServersAbstract(ABC): + + DEFAULT_PORT:int = 8000 + DEFAULT_HOST:str = "" + + def __init__(self:Self, anp:Any, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None: + self.anp:AnPInterface = anp + self.__inputs:dict[str, Any|None] = Common.get_dictionary(inputs) + self.host:str = self.DEFAULT_PORT + self.port:int = self.DEFAULT_HOST + self._print_data:dict[str, Any|None] = { + "port": self.port, + "host": self.host + } + + self.update() + + def __update_print_data(self:Self) -> None: + self._print_data["port"] = self.port + self._print_data["host"] = self.host + + @abstractmethod + def start(self:Self) -> None:pass + + @abstractmethod + def close(self:Self) -> None:pass + + def update(self:Self) -> None: + + self.close() + + self.port = self.anp.settings.get(("http_server_port", "http_port", "port"), self.__inputs, self.DEFAULT_PORT) + self.host = self.anp.settings.get(("http_server_host", "http_host", "host"), self.__inputs, self.DEFAULT_HOST) + self.__update_print_data() + + self.anp.settings.get(("http_server_autostart", "http_autostart", "autostart")) and self.start() + + def reset(self:Self) -> None: + + self.port = self.DEFAULT_PORT + self.host = self.DEFAULT_HOST + self.__update_print_data() + + self.update() \ No newline at end of file diff --git a/Python/Abstracts/WebSocketsServerAbstract.py b/Python/Abstracts/WebSocketServersAbstract.py similarity index 91% rename from Python/Abstracts/WebSocketsServerAbstract.py rename to Python/Abstracts/WebSocketServersAbstract.py index cd0866a..0dddd01 100644 --- a/Python/Abstracts/WebSocketsServerAbstract.py +++ b/Python/Abstracts/WebSocketServersAbstract.py @@ -5,7 +5,7 @@ from typing import Any, Self, Optional, Sequence from abc import ABC, abstractmethod from Application.Event import Event -class WebSocketsServerAbstract(ABC): +class WebSocketServersAbstract(ABC): def __init__(self:Self, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None: self.on_new_client:Event = Event() diff --git a/Python/Application/AnP.py b/Python/Application/AnP.py index 8a3daa2..916a8d3 100644 --- a/Python/Application/AnP.py +++ b/Python/Application/AnP.py @@ -14,7 +14,7 @@ from Managers.ControllersManager import ControllersManager from Managers.DispatchesManager import DispatchesManager from Managers.IndexesManager import IndexesManager from Managers.RoutesManager import RoutesManager -from Managers.WebSocketsServerManager import WebSocketsServerManager +from Managers.WebSocketServersManager import WebSocketServersManager from Drivers.HTTPDriver import HTTPDriver from Utils.Common import Common from Utils.Patterns import RE @@ -46,7 +46,7 @@ class AnP: self.dispatches:DispatchesManager = DispatchesManager(self) self.indexes:IndexesManager = IndexesManager(self) self.routes:RoutesManager = RoutesManager(self) - self.web_sockets_servers:WebSocketsServerManager = WebSocketsServerManager(self) + self.web_socket_servers:WebSocketServersManager = WebSocketServersManager(self) self.http_server:HTTPDriver = HTTPDriver(self) def update(self:Self) -> None: @@ -60,7 +60,7 @@ class AnP: self.dispatches.update() self.indexes.update() self.routes.update() - self.web_sockets_servers.update() + self.web_socket_servers.update() self.http_server.update() def reset(self:Self) -> None: @@ -74,12 +74,12 @@ class AnP: self.dispatches.reset() self.indexes.reset() self.routes.reset() - self.web_sockets_servers.reset() + self.web_socket_servers.reset() self.http_server.reset() def close(self:Self) -> None: self.__working = False - self.web_sockets_servers.close() + self.web_socket_servers.close() self.http_server.close() def working(self:Self) -> bool: diff --git a/Python/Drivers/HTTPDriver.py b/Python/Drivers/HTTPDriver.py index 141d245..8cac4ce 100644 --- a/Python/Drivers/HTTPDriver.py +++ b/Python/Drivers/HTTPDriver.py @@ -7,8 +7,9 @@ from Models.RequestModel import RequestModel from Utils.Common import Common from threading import Thread from http.server import BaseHTTPRequestHandler, HTTPServer +from Abstracts.HTTPServersAbstract import HTTPServersAbstract -class HTTPDriver: +class HTTPDriver(HTTPServersAbstract): class HTTPRequestHandler(BaseHTTPRequestHandler): @@ -92,8 +93,7 @@ class HTTPDriver: self.anp:AnPInterface = anp self.__inputs:dict[str, Any|None] = Common.get_dictionary(inputs) - self.__port:int = 8000 - self.__host:str = "" + super().__init__(inputs) self.__server:HTTPServer|None = None self.__thread:Thread|None = None diff --git a/Python/Drivers/WebSocketServerDriver.py b/Python/Drivers/WebSocketServerDriver.py index fa6877b..a232b5f 100644 --- a/Python/Drivers/WebSocketServerDriver.py +++ b/Python/Drivers/WebSocketServerDriver.py @@ -3,19 +3,18 @@ from threading import Thread from typing import Any, Self, Sequence, Optional -from Abstracts.WebSocketsServerAbstract import WebSocketsServerAbstract +from Abstracts.WebSocketServersAbstract import WebSocketServersAbstract from Abstracts.ModelAbstract import ModelAbstract from websockets.sync.server import serve as server_serve from websockets import Server as WebSocketServer, ClientConnection as WebSocketClient from Interfaces.Application.AnPInterface import AnPInterface from Utils.Checks import Check -class WebSocketServerDriver(WebSocketsServerAbstract, ModelAbstract): +class WebSocketServerDriver(WebSocketServersAbstract, ModelAbstract): def __init__(self:Self, anp:AnPInterface, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None: + super().__init__(anp, inputs) - self.anp:AnPInterface = anp - super().__init__(inputs) self.__server:WebSocketServer self.__clients:dict[int, WebSocketClient] = {} self.__host:str = anp.settings.get(("web_socket_server_host", "host"), inputs, "") diff --git a/Python/Interfaces/Application/AnPInterface.py b/Python/Interfaces/Application/AnPInterface.py index 57c84f4..98b5119 100644 --- a/Python/Interfaces/Application/AnPInterface.py +++ b/Python/Interfaces/Application/AnPInterface.py @@ -12,7 +12,7 @@ from Interfaces.Managers.ControllersManagerInterface import ControllersManagerIn from Interfaces.Managers.DispatchesManagerInterface import DispatchesManagerInterface from Interfaces.Managers.IndexesManagerInterface import IndexesManagerInterface from Interfaces.Managers.RoutesManagerInterface import RoutesManagerInterface -from Interfaces.Managers.WebSocketsServerManagerInterface import WebSocketsServerManagerInterface +from Interfaces.Managers.WebSocketServersManagerInterface import WebSocketServersManagerInterface class AnPInterface(ABC): @@ -26,7 +26,7 @@ class AnPInterface(ABC): self.dispatches:DispatchesManagerInterface = None self.indexes:IndexesManagerInterface = None self.routes:RoutesManagerInterface = None - self.web_sockets_servers:WebSocketsServerManagerInterface = None + self.web_socket_servers:WebSocketServersManagerInterface = None @abstractmethod def update(self:Self) -> None:pass diff --git a/Python/Interfaces/Managers/WebSocketsServerManagerInterface.py b/Python/Interfaces/Managers/WebSocketServersManagerInterface.py similarity index 84% rename from Python/Interfaces/Managers/WebSocketsServerManagerInterface.py rename to Python/Interfaces/Managers/WebSocketServersManagerInterface.py index 05979aa..a3bad72 100644 --- a/Python/Interfaces/Managers/WebSocketsServerManagerInterface.py +++ b/Python/Interfaces/Managers/WebSocketServersManagerInterface.py @@ -3,10 +3,10 @@ from typing import Any, Self, Optional, Sequence from abc import ABC, abstractmethod -from Abstracts.WebSocketsServerAbstract import WebSocketsServerAbstract +from Abstracts.WebSocketServersAbstract import WebSocketServersAbstract from Application.Event import Event -class WebSocketsServerManagerInterface(ABC): +class WebSocketServersManagerInterface(ABC): def __init__(self:Self, anp:Any, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None: self.on_new_client:Event = None @@ -30,7 +30,7 @@ class WebSocketsServerManagerInterface(ABC): def remove(self:Self, names:str|Sequence[str]) -> None:pass @abstractmethod - def get(self:Self, name:str) -> WebSocketsServerAbstract|None:pass + def get(self:Self, name:str) -> WebSocketServersAbstract|None:pass @abstractmethod def send(self:Self, diff --git a/Python/Managers/HTTPServersManager.py b/Python/Managers/HTTPServersManager.py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Managers/WebSocketsServerManager.py b/Python/Managers/WebSocketServersManager.py similarity index 85% rename from Python/Managers/WebSocketsServerManager.py rename to Python/Managers/WebSocketServersManager.py index db49f5c..0fde26b 100644 --- a/Python/Managers/WebSocketsServerManager.py +++ b/Python/Managers/WebSocketServersManager.py @@ -3,18 +3,18 @@ from typing import Any, Self, Optional, Sequence from Interfaces.Application.AnPInterface import AnPInterface -from Abstracts.WebSocketsServerAbstract import WebSocketsServerAbstract +from Abstracts.WebSocketServersAbstract import WebSocketServersAbstract from Application.Event import Event from Models.RequestModel import RequestModel from Utils.Checks import Check from Utils.Common import Common -class WebSocketsServerManager: +class WebSocketServersManager: def __init__(self:Self, anp:AnPInterface, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None: self.anp:AnPInterface = anp - self.__web_sockets:dict[str, WebSocketsServerAbstract] = {} + self.__web_sockets:dict[str, WebSocketServersAbstract] = {} self.on_new_client:Event = Event() self.on_message:Event = Event() self.on_close:Event = Event() @@ -42,7 +42,7 @@ class WebSocketsServerManager: web_socket.close() self.__web_sockets = {} - def __set(self:Self, name:str, web_socket:WebSocketsServerAbstract) -> None: + def __set(self:Self, name:str, web_socket:WebSocketServersAbstract) -> None: self.__web_sockets[name] = web_socket @@ -61,7 +61,7 @@ class WebSocketsServerManager: value:Any|None for key, value in subinputs.items(): - if isinstance(value, WebSocketsServerAbstract): + if isinstance(value, WebSocketServersAbstract): if overwrite or key not in self.__web_sockets: self.__set(key, value) elif Check.is_dictionary(value): @@ -72,9 +72,9 @@ class WebSocketsServerManager: if _type is None: continue - Class:type[WebSocketsServerAbstract] = self.anp.models.get(WebSocketsServerAbstract, _type) + Class:type[WebSocketServersAbstract] = self.anp.models.get(WebSocketServersAbstract, _type) - Class and issubclass(Class, WebSocketsServerAbstract) and self.__set(key, Class(self.anp, value)) + Class and issubclass(Class, WebSocketServersAbstract) and self.__set(key, Class(self.anp, value)) def remove(self:Self, names:str|Sequence[str]) -> None: for name in names if Check.is_array(names) else [names]: @@ -85,7 +85,7 @@ class WebSocketsServerManager: except Exception as exception: self.anp.exception(exception, "web_socket_server_close_exception", {"name": name}) - def get(self:Self, name:str) -> WebSocketsServerAbstract|None: + def get(self:Self, name:str) -> WebSocketServersAbstract|None: return self.__web_sockets.get(name) def send(self:Self, @@ -108,7 +108,7 @@ class WebSocketsServerManager: except Exception as exception: self.anp.exception(exception, "web_socket_server_send_exception", {"name": name}) - def __receive(self:Self, web_socket:WebSocketsServerAbstract, client:int, raw_data:str, name:str) -> None: + def __receive(self:Self, web_socket:WebSocketServersAbstract, client:int, raw_data:str, name:str) -> None: data:dict[str, Any|None] = Common.data_decode(raw_data) diff --git a/Tools/run.server.python.bat b/Tools/run.server.python.bat new file mode 100644 index 0000000..562cac7 --- /dev/null +++ b/Tools/run.server.python.bat @@ -0,0 +1,4 @@ +@rem @echo off +cd %~dp0..\Python +python3 run.py +cd ..\Tools \ No newline at end of file