#wip: WebSockets Servers y HTTP Servers done.
This commit is contained in:
parent
ba3e8b4c59
commit
9f2effb6b4
@ -11,7 +11,7 @@ class HTTPServersAbstract(ABC):
|
|||||||
DEFAULT_PORT:int = 8000
|
DEFAULT_PORT:int = 8000
|
||||||
DEFAULT_HOST:str = ""
|
DEFAULT_HOST:str = ""
|
||||||
|
|
||||||
def __init__(self:Self, anp:Any, 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.__inputs:dict[str, Any|None] = Common.get_dictionary(inputs)
|
self.__inputs:dict[str, Any|None] = Common.get_dictionary(inputs)
|
||||||
self.host:str = self.DEFAULT_PORT
|
self.host:str = self.DEFAULT_PORT
|
||||||
|
|||||||
@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
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 Interfaces.Application.AnPInterface import AnPInterface
|
||||||
from Application.Event import Event
|
from Application.Event import Event
|
||||||
|
|
||||||
class WebSocketServersAbstract(ABC):
|
class WebSocketServersAbstract(ABC):
|
||||||
|
|
||||||
def __init__(self:Self, 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.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()
|
||||||
|
|||||||
@ -15,6 +15,7 @@ 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.WebSocketServersManager import WebSocketServersManager
|
from Managers.WebSocketServersManager import WebSocketServersManager
|
||||||
|
from Managers.HTTPServersManager import HTTPServersManager
|
||||||
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
|
||||||
@ -47,7 +48,8 @@ class AnP:
|
|||||||
self.indexes:IndexesManager = IndexesManager(self)
|
self.indexes:IndexesManager = IndexesManager(self)
|
||||||
self.routes:RoutesManager = RoutesManager(self)
|
self.routes:RoutesManager = RoutesManager(self)
|
||||||
self.web_socket_servers:WebSocketServersManager = WebSocketServersManager(self)
|
self.web_socket_servers:WebSocketServersManager = WebSocketServersManager(self)
|
||||||
self.http_server:HTTPDriver = HTTPDriver(self)
|
self.http_servers:HTTPServersManager = HTTPServersManager(self)
|
||||||
|
# self.http_server:HTTPDriver = HTTPDriver(self)
|
||||||
|
|
||||||
def update(self:Self) -> None:
|
def update(self:Self) -> None:
|
||||||
self.settings.update()
|
self.settings.update()
|
||||||
@ -61,7 +63,8 @@ class AnP:
|
|||||||
self.indexes.update()
|
self.indexes.update()
|
||||||
self.routes.update()
|
self.routes.update()
|
||||||
self.web_socket_servers.update()
|
self.web_socket_servers.update()
|
||||||
self.http_server.update()
|
self.http_servers.update()
|
||||||
|
# self.http_server.update()
|
||||||
|
|
||||||
def reset(self:Self) -> None:
|
def reset(self:Self) -> None:
|
||||||
self.settings.reset()
|
self.settings.reset()
|
||||||
@ -75,12 +78,14 @@ class AnP:
|
|||||||
self.indexes.reset()
|
self.indexes.reset()
|
||||||
self.routes.reset()
|
self.routes.reset()
|
||||||
self.web_socket_servers.reset()
|
self.web_socket_servers.reset()
|
||||||
self.http_server.reset()
|
self.http_servers.reset()
|
||||||
|
# self.http_server.reset()
|
||||||
|
|
||||||
def close(self:Self) -> None:
|
def close(self:Self) -> None:
|
||||||
self.__working = False
|
self.__working = False
|
||||||
self.web_socket_servers.close()
|
self.web_socket_servers.close()
|
||||||
self.http_server.close()
|
self.http_servers.close()
|
||||||
|
# self.http_server.close()
|
||||||
|
|
||||||
def working(self:Self) -> bool:
|
def working(self:Self) -> bool:
|
||||||
return self.__working
|
return self.__working
|
||||||
|
|||||||
@ -109,22 +109,6 @@ class HTTPDriver(HTTPServersAbstract):
|
|||||||
self.__server.shutdown()
|
self.__server.shutdown()
|
||||||
self.__server = None
|
self.__server = None
|
||||||
|
|
||||||
def update(self:Self) -> None:
|
|
||||||
|
|
||||||
self.close()
|
|
||||||
|
|
||||||
self.__port = self.anp.settings.get(("http_server_port", "http_port", "port"), self.__inputs, self.__port)
|
|
||||||
self.__host = self.anp.settings.get(("http_server_host", "http_host", "host"), self.__inputs, self.__host)
|
|
||||||
|
|
||||||
self.start()
|
|
||||||
|
|
||||||
def reset(self:Self) -> None:
|
|
||||||
|
|
||||||
self.__port = 8000
|
|
||||||
self.__host = ""
|
|
||||||
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
def __run_service(self:Self) -> None:
|
def __run_service(self:Self) -> None:
|
||||||
self.__server = HTTPServer((self.__host, self.__port), self.HTTPRequestHandler)
|
self.__server = HTTPServer((self.__host, self.__port), self.HTTPRequestHandler)
|
||||||
self.__server.anp = self.anp
|
self.__server.anp = self.anp
|
||||||
|
|||||||
@ -14,7 +14,7 @@ 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)
|
super().__init__(anp, 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, "")
|
||||||
@ -48,8 +48,8 @@ class WebSocketServerDriver(WebSocketServersAbstract, ModelAbstract):
|
|||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
self.anp.exception(exception, "web_socket_server_client_close_exception", {
|
self.anp.exception(exception, "web_socket_server_client_close_exception", {
|
||||||
"client": id,
|
"client": id,
|
||||||
"port": self.__port,
|
"port": self.port,
|
||||||
"host": self.__host
|
"host": self.host
|
||||||
})
|
})
|
||||||
del self.__clients[id]
|
del self.__clients[id]
|
||||||
|
|
||||||
@ -64,8 +64,8 @@ class WebSocketServerDriver(WebSocketServersAbstract, ModelAbstract):
|
|||||||
|
|
||||||
self.anp.print("info", "web_socket_server_client_connected", {
|
self.anp.print("info", "web_socket_server_client_connected", {
|
||||||
"client": id,
|
"client": id,
|
||||||
"port": self.__port,
|
"port": self.port,
|
||||||
"host": self.__host,
|
"host": self.host,
|
||||||
"client_host" : client.remote_address[0],
|
"client_host" : client.remote_address[0],
|
||||||
"client_port" : client.remote_address[1]
|
"client_port" : client.remote_address[1]
|
||||||
})
|
})
|
||||||
@ -79,8 +79,8 @@ class WebSocketServerDriver(WebSocketServersAbstract, ModelAbstract):
|
|||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
self.anp.exception(exception, "web_socket_server_client_exception", {
|
self.anp.exception(exception, "web_socket_server_client_exception", {
|
||||||
"client": id,
|
"client": id,
|
||||||
"port": self.__port,
|
"port": self.port,
|
||||||
"host": self.__host
|
"host": self.host
|
||||||
})
|
})
|
||||||
self.on_error.execute(id, exception)
|
self.on_error.execute(id, exception)
|
||||||
finally:
|
finally:
|
||||||
@ -88,8 +88,8 @@ class WebSocketServerDriver(WebSocketServersAbstract, ModelAbstract):
|
|||||||
self.on_close.execute(id)
|
self.on_close.execute(id)
|
||||||
self.anp.print("info", "web_socket_server_client_disconnected", {
|
self.anp.print("info", "web_socket_server_client_disconnected", {
|
||||||
"client": id,
|
"client": id,
|
||||||
"port": self.__port,
|
"port": self.port,
|
||||||
"host": self.__host
|
"host": self.host
|
||||||
})
|
})
|
||||||
|
|
||||||
def send(self:Self, data:str, ids:int|Sequence[int]) -> bool:
|
def send(self:Self, data:str, ids:int|Sequence[int]) -> bool:
|
||||||
@ -104,8 +104,8 @@ class WebSocketServerDriver(WebSocketServersAbstract, ModelAbstract):
|
|||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
self.anp.exception(exception, "web_socket_server_client_send_exception", {
|
self.anp.exception(exception, "web_socket_server_client_send_exception", {
|
||||||
"client": id,
|
"client": id,
|
||||||
"port": self.__port,
|
"port": self.port,
|
||||||
"host": self.__host
|
"host": self.host
|
||||||
})
|
})
|
||||||
success = False
|
success = False
|
||||||
|
|
||||||
|
|||||||
19
Python/Interfaces/Abstracts/HTTPServersAbstractInterface.py
Normal file
19
Python/Interfaces/Abstracts/HTTPServersAbstractInterface.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from typing import Self
|
||||||
|
|
||||||
|
class HTTPServersAbstractInterface(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def start(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def close(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def update(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def reset(self:Self) -> None:pass
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from typing import Any, Self, Optional, Sequence
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
|
class WebSocketServersAbstractInterface(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def start(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def close(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def close_client(self:Self, id:int) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def send(self:Self, data:Any|None, ids:Optional[int|Sequence[int]] = None) -> None:pass
|
||||||
@ -13,6 +13,7 @@ from Interfaces.Managers.DispatchesManagerInterface import DispatchesManagerInte
|
|||||||
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.WebSocketServersManagerInterface import WebSocketServersManagerInterface
|
from Interfaces.Managers.WebSocketServersManagerInterface import WebSocketServersManagerInterface
|
||||||
|
from Interfaces.Managers.HTTPServersManagerInterface import HTTPServersManagerInterface
|
||||||
|
|
||||||
class AnPInterface(ABC):
|
class AnPInterface(ABC):
|
||||||
|
|
||||||
@ -27,6 +28,7 @@ class AnPInterface(ABC):
|
|||||||
self.indexes:IndexesManagerInterface = None
|
self.indexes:IndexesManagerInterface = None
|
||||||
self.routes:RoutesManagerInterface = None
|
self.routes:RoutesManagerInterface = None
|
||||||
self.web_socket_servers:WebSocketServersManagerInterface = None
|
self.web_socket_servers:WebSocketServersManagerInterface = None
|
||||||
|
self.http_servers:HTTPServersManagerInterface = None
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def update(self:Self) -> None:pass
|
def update(self:Self) -> None:pass
|
||||||
|
|||||||
26
Python/Interfaces/Managers/HTTPServersManagerInterface.py
Normal file
26
Python/Interfaces/Managers/HTTPServersManagerInterface.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from typing import Self, Sequence, Any
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from Interfaces.Abstracts.HTTPServersAbstractInterface import HTTPServersAbstractInterface
|
||||||
|
|
||||||
|
class HTTPServersManagerInterface(ABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def update(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def reset(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def close(self:Self) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def add(self:Self, inputs:Any|None, overwrite:bool = False) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def remove(self:Self, names:str|Sequence[str]) -> None:pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get(self:Self, name:str) -> HTTPServersAbstractInterface|None:pass
|
||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
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.WebSocketServersAbstract import WebSocketServersAbstract
|
from Interfaces.Abstracts.WebSocketServersAbstractInterface import WebSocketServersAbstractInterface
|
||||||
from Application.Event import Event
|
from Application.Event import Event
|
||||||
|
|
||||||
class WebSocketServersManagerInterface(ABC):
|
class WebSocketServersManagerInterface(ABC):
|
||||||
@ -30,7 +30,7 @@ class WebSocketServersManagerInterface(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) -> WebSocketServersAbstract|None:pass
|
def get(self:Self, name:str) -> WebSocketServersAbstractInterface|None:pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def send(self:Self,
|
def send(self:Self,
|
||||||
|
|||||||
@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from typing import Self, Sequence, Any
|
||||||
|
from Interfaces.Application.AnPInterface import AnPInterface
|
||||||
|
from Abstracts.HTTPServersAbstract import HTTPServersAbstract
|
||||||
|
from Utils.Common import Common
|
||||||
|
from Utils.Checks import Check
|
||||||
|
|
||||||
|
class HTTPServersManager:
|
||||||
|
|
||||||
|
def __init__(self:Self, anp:AnPInterface) -> None:
|
||||||
|
self.anp:AnPInterface = anp
|
||||||
|
self.__servers:dict[str, HTTPServersAbstract] = {}
|
||||||
|
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def update(self:Self) -> None:
|
||||||
|
|
||||||
|
key:str
|
||||||
|
|
||||||
|
for key in ("default_http_server_files", "http_server_files", "default_http_server", "http_server"):
|
||||||
|
self.add(self.anp.settings.get(key), True)
|
||||||
|
|
||||||
|
def reset(self:Self) -> None:
|
||||||
|
|
||||||
|
self.__servers = {}
|
||||||
|
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def close(self:Self) -> None:
|
||||||
|
|
||||||
|
server:HTTPServersAbstract
|
||||||
|
|
||||||
|
for server in self.__servers.values():
|
||||||
|
server.close()
|
||||||
|
self.__servers = {}
|
||||||
|
|
||||||
|
def add(self:Self, inputs:Any|None, overwrite:bool = False) -> None:
|
||||||
|
|
||||||
|
subinputs:dict[str, Any|None]
|
||||||
|
|
||||||
|
for subinputs in Common.load_json(inputs, True):
|
||||||
|
|
||||||
|
key:str
|
||||||
|
value:Any|None
|
||||||
|
|
||||||
|
for key, value in subinputs.items():
|
||||||
|
if isinstance(value, HTTPServersAbstract):
|
||||||
|
if overwrite or key not in self.__servers:
|
||||||
|
self.__servers[key] = value
|
||||||
|
elif Check.is_dictionary(value):
|
||||||
|
if overwrite or key not in self.__servers:
|
||||||
|
|
||||||
|
_type:str|None = Common.get_value("type", value)
|
||||||
|
|
||||||
|
if _type is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
Class:type[HTTPServersAbstract] = self.anp.models.get(HTTPServersAbstract, _type)
|
||||||
|
|
||||||
|
if Class and issubclass(Class, HTTPServersAbstract):
|
||||||
|
self.__servers[key] = Class(self.anp, value)
|
||||||
|
|
||||||
|
def remove(self:Self, names:str|Sequence[str]) -> None:
|
||||||
|
for name in Common.get_key(names):
|
||||||
|
if name in self.__servers:
|
||||||
|
try:
|
||||||
|
self.__servers[name].close()
|
||||||
|
del self.__servers[name]
|
||||||
|
except Exception as exception:
|
||||||
|
self.anp.exception(exception, "http_server_close_exception", {"name": name})
|
||||||
|
|
||||||
|
def get(self:Self, name:str) -> HTTPServersAbstract|None:
|
||||||
|
return self.__servers.get(name)
|
||||||
@ -38,6 +38,9 @@ class WebSocketServersManager:
|
|||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def close(self:Self) -> None:
|
def close(self:Self) -> None:
|
||||||
|
|
||||||
|
web_socket:WebSocketServersAbstract
|
||||||
|
|
||||||
for web_socket in self.__web_sockets.values():
|
for web_socket in self.__web_sockets.values():
|
||||||
web_socket.close()
|
web_socket.close()
|
||||||
self.__web_sockets = {}
|
self.__web_sockets = {}
|
||||||
@ -77,7 +80,7 @@ class WebSocketServersManager:
|
|||||||
Class and issubclass(Class, WebSocketServersAbstract) 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 Common.get_keys(names):
|
||||||
if name in self.__web_sockets:
|
if name in self.__web_sockets:
|
||||||
try:
|
try:
|
||||||
self.__web_sockets[name].close()
|
self.__web_sockets[name].close()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user