#wip: Doing HTTPServersManager.

This commit is contained in:
mbruzon 2026-05-28 18:09:12 +02:00
parent 4a97794e2c
commit ba3e8b4c59
10 changed files with 82 additions and 27 deletions

View File

@ -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()

View File

@ -5,7 +5,7 @@ from typing import Any, Self, Optional, Sequence
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from Application.Event import Event 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: def __init__(self:Self, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None:
self.on_new_client:Event = Event() self.on_new_client:Event = Event()

View File

@ -14,7 +14,7 @@ from Managers.ControllersManager import ControllersManager
from Managers.DispatchesManager import DispatchesManager from Managers.DispatchesManager import DispatchesManager
from Managers.IndexesManager import IndexesManager from Managers.IndexesManager import IndexesManager
from Managers.RoutesManager import RoutesManager from Managers.RoutesManager import RoutesManager
from Managers.WebSocketsServerManager import WebSocketsServerManager from Managers.WebSocketServersManager import WebSocketServersManager
from Drivers.HTTPDriver import HTTPDriver from Drivers.HTTPDriver import HTTPDriver
from Utils.Common import Common from Utils.Common import Common
from Utils.Patterns import RE from Utils.Patterns import RE
@ -46,7 +46,7 @@ class AnP:
self.dispatches:DispatchesManager = DispatchesManager(self) self.dispatches:DispatchesManager = DispatchesManager(self)
self.indexes:IndexesManager = IndexesManager(self) self.indexes:IndexesManager = IndexesManager(self)
self.routes:RoutesManager = RoutesManager(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) self.http_server:HTTPDriver = HTTPDriver(self)
def update(self:Self) -> None: def update(self:Self) -> None:
@ -60,7 +60,7 @@ class AnP:
self.dispatches.update() self.dispatches.update()
self.indexes.update() self.indexes.update()
self.routes.update() self.routes.update()
self.web_sockets_servers.update() self.web_socket_servers.update()
self.http_server.update() self.http_server.update()
def reset(self:Self) -> None: def reset(self:Self) -> None:
@ -74,12 +74,12 @@ class AnP:
self.dispatches.reset() self.dispatches.reset()
self.indexes.reset() self.indexes.reset()
self.routes.reset() self.routes.reset()
self.web_sockets_servers.reset() self.web_socket_servers.reset()
self.http_server.reset() self.http_server.reset()
def close(self:Self) -> None: def close(self:Self) -> None:
self.__working = False self.__working = False
self.web_sockets_servers.close() self.web_socket_servers.close()
self.http_server.close() self.http_server.close()
def working(self:Self) -> bool: def working(self:Self) -> bool:

View File

@ -7,8 +7,9 @@ from Models.RequestModel import RequestModel
from Utils.Common import Common from Utils.Common import Common
from threading import Thread from threading import Thread
from http.server import BaseHTTPRequestHandler, HTTPServer from http.server import BaseHTTPRequestHandler, HTTPServer
from Abstracts.HTTPServersAbstract import HTTPServersAbstract
class HTTPDriver: class HTTPDriver(HTTPServersAbstract):
class HTTPRequestHandler(BaseHTTPRequestHandler): class HTTPRequestHandler(BaseHTTPRequestHandler):
@ -92,8 +93,7 @@ class HTTPDriver:
self.anp:AnPInterface = anp self.anp:AnPInterface = anp
self.__inputs:dict[str, Any|None] = Common.get_dictionary(inputs) self.__inputs:dict[str, Any|None] = Common.get_dictionary(inputs)
self.__port:int = 8000 super().__init__(inputs)
self.__host:str = ""
self.__server:HTTPServer|None = None self.__server:HTTPServer|None = None
self.__thread:Thread|None = None self.__thread:Thread|None = None

View File

@ -3,19 +3,18 @@
from threading import Thread from threading import Thread
from typing import Any, Self, Sequence, Optional from typing import Any, Self, Sequence, Optional
from Abstracts.WebSocketsServerAbstract import WebSocketsServerAbstract from Abstracts.WebSocketServersAbstract import WebSocketServersAbstract
from Abstracts.ModelAbstract import ModelAbstract from Abstracts.ModelAbstract import ModelAbstract
from websockets.sync.server import serve as server_serve from websockets.sync.server import serve as server_serve
from websockets import Server as WebSocketServer, ClientConnection as WebSocketClient from websockets import Server as WebSocketServer, ClientConnection as WebSocketClient
from Interfaces.Application.AnPInterface import AnPInterface from Interfaces.Application.AnPInterface import AnPInterface
from Utils.Checks import Check 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: 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.__server:WebSocketServer
self.__clients:dict[int, WebSocketClient] = {} self.__clients:dict[int, WebSocketClient] = {}
self.__host:str = anp.settings.get(("web_socket_server_host", "host"), inputs, "") self.__host:str = anp.settings.get(("web_socket_server_host", "host"), inputs, "")

View File

@ -12,7 +12,7 @@ from Interfaces.Managers.ControllersManagerInterface import ControllersManagerIn
from Interfaces.Managers.DispatchesManagerInterface import DispatchesManagerInterface from Interfaces.Managers.DispatchesManagerInterface import DispatchesManagerInterface
from Interfaces.Managers.IndexesManagerInterface import IndexesManagerInterface from Interfaces.Managers.IndexesManagerInterface import IndexesManagerInterface
from Interfaces.Managers.RoutesManagerInterface import RoutesManagerInterface from Interfaces.Managers.RoutesManagerInterface import RoutesManagerInterface
from Interfaces.Managers.WebSocketsServerManagerInterface import WebSocketsServerManagerInterface from Interfaces.Managers.WebSocketServersManagerInterface import WebSocketServersManagerInterface
class AnPInterface(ABC): class AnPInterface(ABC):
@ -26,7 +26,7 @@ class AnPInterface(ABC):
self.dispatches:DispatchesManagerInterface = None self.dispatches:DispatchesManagerInterface = None
self.indexes:IndexesManagerInterface = None self.indexes:IndexesManagerInterface = None
self.routes:RoutesManagerInterface = None self.routes:RoutesManagerInterface = None
self.web_sockets_servers:WebSocketsServerManagerInterface = None self.web_socket_servers:WebSocketServersManagerInterface = None
@abstractmethod @abstractmethod
def update(self:Self) -> None:pass def update(self:Self) -> None:pass

View File

@ -3,10 +3,10 @@
from typing import Any, Self, Optional, Sequence from typing import Any, Self, Optional, Sequence
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from Abstracts.WebSocketsServerAbstract import WebSocketsServerAbstract from Abstracts.WebSocketServersAbstract import WebSocketServersAbstract
from Application.Event import Event 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: def __init__(self:Self, anp:Any, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None:
self.on_new_client:Event = None self.on_new_client:Event = None
@ -30,7 +30,7 @@ class WebSocketsServerManagerInterface(ABC):
def remove(self:Self, names:str|Sequence[str]) -> None:pass def remove(self:Self, names:str|Sequence[str]) -> None:pass
@abstractmethod @abstractmethod
def get(self:Self, name:str) -> WebSocketsServerAbstract|None:pass def get(self:Self, name:str) -> WebSocketServersAbstract|None:pass
@abstractmethod @abstractmethod
def send(self:Self, def send(self:Self,

View File

View File

@ -3,18 +3,18 @@
from typing import Any, Self, Optional, Sequence from typing import Any, Self, Optional, Sequence
from Interfaces.Application.AnPInterface import AnPInterface from Interfaces.Application.AnPInterface import AnPInterface
from Abstracts.WebSocketsServerAbstract import WebSocketsServerAbstract from Abstracts.WebSocketServersAbstract import WebSocketServersAbstract
from Application.Event import Event from Application.Event import Event
from Models.RequestModel import RequestModel from Models.RequestModel import RequestModel
from Utils.Checks import Check from Utils.Checks import Check
from Utils.Common import Common 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: def __init__(self:Self, anp:AnPInterface, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None:
self.anp:AnPInterface = anp self.anp:AnPInterface = anp
self.__web_sockets:dict[str, WebSocketsServerAbstract] = {} self.__web_sockets:dict[str, WebSocketServersAbstract] = {}
self.on_new_client:Event = Event() self.on_new_client:Event = Event()
self.on_message:Event = Event() self.on_message:Event = Event()
self.on_close:Event = Event() self.on_close:Event = Event()
@ -42,7 +42,7 @@ class WebSocketsServerManager:
web_socket.close() web_socket.close()
self.__web_sockets = {} 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 self.__web_sockets[name] = web_socket
@ -61,7 +61,7 @@ class WebSocketsServerManager:
value:Any|None value:Any|None
for key, value in subinputs.items(): for key, value in subinputs.items():
if isinstance(value, WebSocketsServerAbstract): if isinstance(value, WebSocketServersAbstract):
if overwrite or key not in self.__web_sockets: if overwrite or key not in self.__web_sockets:
self.__set(key, value) self.__set(key, value)
elif Check.is_dictionary(value): elif Check.is_dictionary(value):
@ -72,9 +72,9 @@ class WebSocketsServerManager:
if _type is None: if _type is None:
continue 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: def remove(self:Self, names:str|Sequence[str]) -> None:
for name in names if Check.is_array(names) else [names]: for name in names if Check.is_array(names) else [names]:
@ -85,7 +85,7 @@ class WebSocketsServerManager:
except Exception as exception: except Exception as exception:
self.anp.exception(exception, "web_socket_server_close_exception", {"name": name}) 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) return self.__web_sockets.get(name)
def send(self:Self, def send(self:Self,
@ -108,7 +108,7 @@ class WebSocketsServerManager:
except Exception as exception: except Exception as exception:
self.anp.exception(exception, "web_socket_server_send_exception", {"name": name}) 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) data:dict[str, Any|None] = Common.data_decode(raw_data)

View File

@ -0,0 +1,4 @@
@rem @echo off
cd %~dp0..\Python
python3 run.py
cd ..\Tools