socket.d 2.4.10.6__tar.gz → 2.4.11__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {socket.d-2.4.10.6 → socket.d-2.4.11}/PKG-INFO +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/setup.py +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/PKG-INFO +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/SOURCES.txt +6 -3
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/SocketD.py +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/BrokerListenerBase.py +5 -5
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/ClusterClientSession.py +2 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/LoadBalancer.py +2 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Codec.py +3 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/HandshakeDefault.py +4 -4
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/IdGenerator.py +2 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Listener.py +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Processor.py +5 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/Buffer.py +9 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/ByteBufferCodecReader.py +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/ByteBufferCodecWriter.py +4 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/CodecDefault.py +24 -16
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/FileEntity.py +0 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentAggregatorDefault.py +10 -6
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ChannelDefault.py +14 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/LogConfig.py +4 -5
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ProcessorDefault.py +14 -8
- socket.d-2.4.11/socketd/transport/core/listener/EventListener.py +59 -0
- socket.d-2.4.11/socketd/transport/core/listener/PathListener.py +32 -0
- socket.d-2.4.11/socketd/transport/core/listener/PipelineListener.py +42 -0
- socket.d-2.4.11/socketd/transport/core/listener/RouteSelector.py +21 -0
- socket.d-2.4.11/socketd/transport/core/listener/RouteSelectorDefault.py +20 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/listener/SimpleListener.py +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/Server.py +3 -5
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/ServerBase.py +12 -7
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/ServerConfig.py +1 -1
- socket.d-2.4.10.6/socketd/transport/utils/AsyncUtil.py → socket.d-2.4.11/socketd/transport/utils/AsyncUtils.py +4 -4
- socket.d-2.4.11/socketd/utils/RunUtils.py +13 -0
- socket.d-2.4.10.6/socketd/transport/utils/StrUtil.py → socket.d-2.4.11/socketd/utils/StrUtils.py +3 -3
- socket.d-2.4.11/socketd/utils/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TCPAIOServer.py +1 -1
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAioClientConnector.py +2 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioClientConnector.py +2 -2
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioServer.py +8 -7
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOWebSocketServerImpl.py +33 -37
- socket.d-2.4.10.6/socketd/transport/core/listener/EventListener.py +0 -57
- socket.d-2.4.10.6/socketd/transport/core/listener/PathListener.py +0 -32
- socket.d-2.4.10.6/socketd/transport/core/listener/PathMapper.py +0 -11
- socket.d-2.4.10.6/socketd/transport/core/listener/PipelineListener.py +0 -21
- {socket.d-2.4.10.6 → socket.d-2.4.11}/README.md +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/setup.cfg +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/dependency_links.txt +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/requires.txt +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/top_level.txt +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/zip-safe +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/BrokerFragmentHandler.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/BrokerListener.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/ClusterClient.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/exception/SocketDExecption.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/exception/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/Client.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientChannel.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConfig.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConfigHandler.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConnectHandler.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConnector.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConnectorBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientHandshakeResult.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientHeartbeatHandler.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientProvider.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientSession.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Asserts.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Channel.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/ChannelAssistant.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/ChannelInternal.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/ChannelSupporter.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Config.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Costants.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Entity.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/EntityMetas.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Flags.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/FragmentAggregator.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/FragmentHandler.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Frame.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Frames.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Message.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Session.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/EntityDefault.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/MessageBuilder.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/MessageDefault.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/StringEntity.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentHandlerBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentHandlerDefault.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentHolder.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ChannelBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ConfigBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/SessionBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/SessionDefault.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/listener/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/ServerProvider.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/RequestStream.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/SendStream.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/Stream.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/StreamBase.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/StreamManger.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/StreamMangerDefault.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/SubscribeStream.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/CompletableFuture.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/async_api/AtomicRefer.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/async_api/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/sync_api/AtomicRefer.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/sync_api/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TCPStreamIO.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAIOChannelAssistant.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAioClient.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAioProvider.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioChannelAssistant.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioClient.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioProvider.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/__init__.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOConnect.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOServe.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOWebSocketClientImpl.py +0 -0
- {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/__init__.py +0 -0
@@ -80,8 +80,9 @@ socketd/transport/core/impl/SessionDefault.py
|
|
80
80
|
socketd/transport/core/impl/__init__.py
|
81
81
|
socketd/transport/core/listener/EventListener.py
|
82
82
|
socketd/transport/core/listener/PathListener.py
|
83
|
-
socketd/transport/core/listener/PathMapper.py
|
84
83
|
socketd/transport/core/listener/PipelineListener.py
|
84
|
+
socketd/transport/core/listener/RouteSelector.py
|
85
|
+
socketd/transport/core/listener/RouteSelectorDefault.py
|
85
86
|
socketd/transport/core/listener/SimpleListener.py
|
86
87
|
socketd/transport/core/listener/__init__.py
|
87
88
|
socketd/transport/server/Server.py
|
@@ -97,14 +98,16 @@ socketd/transport/stream/StreamManger.py
|
|
97
98
|
socketd/transport/stream/StreamMangerDefault.py
|
98
99
|
socketd/transport/stream/SubscribeStream.py
|
99
100
|
socketd/transport/stream/__init__.py
|
100
|
-
socketd/transport/utils/
|
101
|
+
socketd/transport/utils/AsyncUtils.py
|
101
102
|
socketd/transport/utils/CompletableFuture.py
|
102
|
-
socketd/transport/utils/StrUtil.py
|
103
103
|
socketd/transport/utils/__init__.py
|
104
104
|
socketd/transport/utils/async_api/AtomicRefer.py
|
105
105
|
socketd/transport/utils/async_api/__init__.py
|
106
106
|
socketd/transport/utils/sync_api/AtomicRefer.py
|
107
107
|
socketd/transport/utils/sync_api/__init__.py
|
108
|
+
socketd/utils/RunUtils.py
|
109
|
+
socketd/utils/StrUtils.py
|
110
|
+
socketd/utils/__init__.py
|
108
111
|
socketd_aio_tcp/TCPAIOServer.py
|
109
112
|
socketd_aio_tcp/TCPStreamIO.py
|
110
113
|
socketd_aio_tcp/TcpAIOChannelAssistant.py
|
@@ -6,7 +6,7 @@ from socketd.transport.core.EntityMetas import EntityMetas
|
|
6
6
|
from socketd.transport.core.Listener import Listener
|
7
7
|
from socketd.transport.core.Message import Message
|
8
8
|
from socketd.transport.core.Session import Session
|
9
|
-
from socketd.
|
9
|
+
from socketd.utils.StrUtils import StrUtils
|
10
10
|
|
11
11
|
|
12
12
|
# 经纪人监听器基类(实现玩家封闭管理)
|
@@ -41,7 +41,7 @@ class BrokerListenerBase(Listener, ABC):
|
|
41
41
|
|
42
42
|
# 获取任意一个玩家会话
|
43
43
|
def get_player_any(self, atName: str, requester: Session | None, message: Message | None) -> ClientSession | None:
|
44
|
-
if
|
44
|
+
if StrUtils.is_empty(atName):
|
45
45
|
return None
|
46
46
|
|
47
47
|
if atName.endswith("!"):
|
@@ -51,7 +51,7 @@ class BrokerListenerBase(Listener, ABC):
|
|
51
51
|
if message is not None:
|
52
52
|
x_hash = message.meta(EntityMetas.META_X_Hash)
|
53
53
|
|
54
|
-
if
|
54
|
+
if StrUtils.is_empty(x_hash):
|
55
55
|
if requester is None:
|
56
56
|
return LoadBalancer.get_any_by_poll(self.get_player_all(atName))
|
57
57
|
else: # 使用请求者 ip 分流
|
@@ -63,7 +63,7 @@ class BrokerListenerBase(Listener, ABC):
|
|
63
63
|
|
64
64
|
# 添加玩家会话
|
65
65
|
def add_player(self, name: str, session: Session):
|
66
|
-
if
|
66
|
+
if StrUtils.is_not_empty(name):
|
67
67
|
tmp: List[Session] = self.__playerSessions.get(name)
|
68
68
|
if tmp is None:
|
69
69
|
tmp = [session]
|
@@ -74,7 +74,7 @@ class BrokerListenerBase(Listener, ABC):
|
|
74
74
|
|
75
75
|
# 移除玩家会话
|
76
76
|
def remove_player(self, name: str, session: Session):
|
77
|
-
if
|
77
|
+
if StrUtils.is_not_empty(name):
|
78
78
|
tmp: list[Session] = self.get_player_all(name)
|
79
79
|
if tmp is not None:
|
80
80
|
tmp.remove(session)
|
@@ -5,14 +5,14 @@ from socketd.transport.core import Entity
|
|
5
5
|
from socketd.transport.stream.RequestStream import RequestStream
|
6
6
|
from socketd.transport.stream.SendStream import SendStream
|
7
7
|
from socketd.transport.stream.SubscribeStream import SubscribeStream
|
8
|
-
from socketd.
|
8
|
+
from socketd.utils.StrUtils import StrUtils
|
9
9
|
|
10
10
|
|
11
11
|
class ClusterClientSession(ClientSession):
|
12
12
|
|
13
13
|
def __init__(self, _sessionSet):
|
14
14
|
self.__sessionSet: list[ClientSession] = _sessionSet
|
15
|
-
self.__sessionId =
|
15
|
+
self.__sessionId = StrUtils.guid()
|
16
16
|
|
17
17
|
def get_session_all(self) -> list[ClientSession]:
|
18
18
|
return self.__sessionSet
|
@@ -2,7 +2,7 @@ from threading import RLock
|
|
2
2
|
from typing import List
|
3
3
|
|
4
4
|
from socketd.transport.client.ClientSession import ClientSession
|
5
|
-
from socketd.
|
5
|
+
from socketd.utils.StrUtils import StrUtils
|
6
6
|
|
7
7
|
|
8
8
|
class LoadBalancer:
|
@@ -29,7 +29,7 @@ class LoadBalancer:
|
|
29
29
|
# 根据 hash 获取任意一个
|
30
30
|
@staticmethod
|
31
31
|
def get_any_by_hash(coll: List[ClientSession], diversion: str) -> ClientSession:
|
32
|
-
return LoadBalancer.get_any(coll,
|
32
|
+
return LoadBalancer.get_any(coll, StrUtils.hash_code(diversion))
|
33
33
|
|
34
34
|
# 获取任意一个
|
35
35
|
@staticmethod
|
@@ -3,7 +3,7 @@ from urllib.parse import urlparse, parse_qsl
|
|
3
3
|
|
4
4
|
from socketd.transport.core.EntityMetas import EntityMetas
|
5
5
|
from socketd.transport.core.Message import Message, MessageInternal
|
6
|
-
from socketd.
|
6
|
+
from socketd.utils.StrUtils import StrUtils
|
7
7
|
|
8
8
|
|
9
9
|
class Handshake:
|
@@ -33,7 +33,7 @@ class HandshakeInternal(Handshake):
|
|
33
33
|
class HandshakeDefault(HandshakeInternal):
|
34
34
|
def __init__(self, source: MessageInternal):
|
35
35
|
linkUrl = source.data_as_string()
|
36
|
-
if
|
36
|
+
if StrUtils.is_empty(linkUrl):
|
37
37
|
# 兼容旧版本(@deprecated 2.2)
|
38
38
|
linkUrl = source.event()
|
39
39
|
|
@@ -44,7 +44,7 @@ class HandshakeDefault(HandshakeInternal):
|
|
44
44
|
self._paramMap = self._parse_query_string(self._uri.query)
|
45
45
|
self._outMetaMap:dict[str,str] = {}
|
46
46
|
|
47
|
-
if
|
47
|
+
if StrUtils.is_empty(self._path):
|
48
48
|
self._path = "/" # tcp://1.1.1.1 无路径连接时,path 为空
|
49
49
|
|
50
50
|
self._paramMap.update(source.meta_map())
|
@@ -84,7 +84,7 @@ class HandshakeDefault(HandshakeInternal):
|
|
84
84
|
@staticmethod
|
85
85
|
def _parse_query_string(query_string):
|
86
86
|
params = {}
|
87
|
-
if
|
87
|
+
if StrUtils.is_not_empty(query_string):
|
88
88
|
for name, value in parse_qsl(query_string):
|
89
89
|
params[name] = value
|
90
90
|
return params
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from abc import ABC, abstractmethod
|
2
2
|
|
3
|
+
from socketd.transport.core import Listener
|
3
4
|
from socketd.transport.core.Channel import Channel
|
4
5
|
from socketd.transport.core.ChannelInternal import ChannelInternal
|
5
6
|
from socketd.transport.core.Frame import Frame
|
@@ -9,7 +10,7 @@ from socketd.transport.core.Message import Message
|
|
9
10
|
class Processor(ABC):
|
10
11
|
|
11
12
|
@abstractmethod
|
12
|
-
def set_listener(self, listener):
|
13
|
+
def set_listener(self, listener: Listener) -> None:
|
13
14
|
pass
|
14
15
|
|
15
16
|
@abstractmethod
|
@@ -31,3 +32,6 @@ class Processor(ABC):
|
|
31
32
|
@abstractmethod
|
32
33
|
def on_error(self, channel: ChannelInternal, error):
|
33
34
|
pass
|
35
|
+
@abstractmethod
|
36
|
+
def do_close_notice(self, channel: ChannelInternal):
|
37
|
+
pass
|
@@ -21,16 +21,23 @@ class Buffer(BytesIO):
|
|
21
21
|
rem = self.__size - self.tell()
|
22
22
|
return rem if rem > 0 else 0
|
23
23
|
|
24
|
-
def
|
25
|
-
|
24
|
+
def position(self) -> int:
|
25
|
+
...
|
26
26
|
|
27
27
|
def size(self):
|
28
28
|
return self.__size
|
29
29
|
|
30
|
+
def limit(self):
|
31
|
+
return self.__limit
|
32
|
+
|
30
33
|
def put_int(self, num: int):
|
31
34
|
super().write(num.to_bytes(length=4, byteorder='big', signed=False))
|
32
35
|
self.__size += 4
|
33
36
|
|
37
|
+
def put_char(self, char:int):
|
38
|
+
super().write(char.to_bytes(length=2, byteorder='big', signed=False))
|
39
|
+
self.__size += 2
|
40
|
+
|
34
41
|
def get_int(self):
|
35
42
|
return int.from_bytes(self.read1(4), byteorder='big', signed=False)
|
36
43
|
|
@@ -13,7 +13,7 @@ class ByteBufferCodecReader(CodecReader):
|
|
13
13
|
return self.__buffer.getvalue()
|
14
14
|
|
15
15
|
def get_int(self) -> int:
|
16
|
-
return int.from_bytes(self.__buffer.read1(4), byteorder='
|
16
|
+
return int.from_bytes(self.__buffer.read1(4), byteorder='big', signed=False)
|
17
17
|
|
18
18
|
def skip_bytes(self, size):
|
19
19
|
self.__buffer.seek(self.__buffer.tell() + size)
|
@@ -12,7 +12,10 @@ class ByteBufferCodecWriter(CodecWriter):
|
|
12
12
|
self.__buffer.write(_bytes)
|
13
13
|
|
14
14
|
def put_int(self, _num: int):
|
15
|
-
self.__buffer.
|
15
|
+
self.__buffer.put_int(_num)
|
16
|
+
|
17
|
+
def put_char(self, _char: int):
|
18
|
+
self.__buffer.put_char(_char)
|
16
19
|
|
17
20
|
def flush(self):
|
18
21
|
self.__buffer.flush()
|
@@ -55,15 +55,15 @@ class CodecDefault(Codec):
|
|
55
55
|
|
56
56
|
# sid
|
57
57
|
target.put_bytes(sidB)
|
58
|
-
target.
|
58
|
+
target.put_char(10) #'\n'
|
59
59
|
|
60
60
|
# event
|
61
61
|
target.put_bytes(event)
|
62
|
-
target.
|
62
|
+
target.put_char(10)
|
63
63
|
|
64
64
|
# metaString
|
65
65
|
target.put_bytes(metaStringB)
|
66
|
-
target.
|
66
|
+
target.put_char(10)
|
67
67
|
|
68
68
|
# _data
|
69
69
|
if frame.message().entity().data() is not None:
|
@@ -73,25 +73,30 @@ class CodecDefault(Codec):
|
|
73
73
|
return target
|
74
74
|
|
75
75
|
def read(self, _reader: CodecReader) -> Frame | None:
|
76
|
-
|
76
|
+
frameSize = _reader.get_int()
|
77
77
|
|
78
|
-
if
|
78
|
+
if frameSize > (_reader.remaining() + 4):
|
79
79
|
return None
|
80
80
|
|
81
81
|
flag = _reader.get_int() # 取前一位数据
|
82
82
|
|
83
|
-
if
|
83
|
+
if frameSize == 8:
|
84
84
|
# len + flag
|
85
85
|
return Frame(Flags.of(flag), None)
|
86
86
|
else:
|
87
87
|
metaBufSize = min(Constants.MAX_SIZE_META_STRING, _reader.remaining())
|
88
|
+
|
88
89
|
# 1. decode sid and event
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
90
|
+
buf = Buffer(limit=metaBufSize)
|
91
|
+
|
92
|
+
sid = self.decodeString(_reader, buf, Constants.MAX_SIZE_SID)
|
93
|
+
|
94
|
+
event = self.decodeString(_reader, buf, Constants.MAX_SIZE_EVENT)
|
95
|
+
|
96
|
+
metaString = self.decodeString(_reader, buf, Constants.MAX_SIZE_META_STRING)
|
97
|
+
|
93
98
|
# 2. decode body
|
94
|
-
dataRealSize =
|
99
|
+
dataRealSize = frameSize - _reader.position()
|
95
100
|
data: Optional[bytearray] = None
|
96
101
|
if dataRealSize > Constants.MAX_SIZE_DATA:
|
97
102
|
# exceeded the limit, read and discard the bytes
|
@@ -102,15 +107,18 @@ class CodecDefault(Codec):
|
|
102
107
|
else:
|
103
108
|
data = bytearray(_reader.get_buffer().read(dataRealSize))
|
104
109
|
|
105
|
-
message = MessageBuilder()
|
106
|
-
|
107
|
-
|
108
|
-
|
110
|
+
message = (MessageBuilder()
|
111
|
+
.flag(Flags.of(flag))
|
112
|
+
.sid(sid)
|
113
|
+
.event(event)
|
114
|
+
.entity(EntityDefault().data_set(data).meta_string_set(metaString))
|
115
|
+
.build())
|
116
|
+
buf.close()
|
109
117
|
_reader.close()
|
110
118
|
return Frame(message.flag(), message)
|
111
119
|
|
112
120
|
def decodeString(self, reader: CodecReader, buf: Buffer, maxLen: int) -> str:
|
113
|
-
b = bytearray(reader.get_buffer().readline(maxLen).replace(b'\n', b''))
|
121
|
+
b = bytearray(reader.get_buffer().readline(maxLen).replace(b'\x00\n', b''))
|
114
122
|
if buf.limit() < 1:
|
115
123
|
return ""
|
116
124
|
return b.decode(self.config.get_charset())
|
{socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentAggregatorDefault.py
RENAMED
@@ -9,7 +9,7 @@ from socketd.exception.SocketDExecption import SocketDException
|
|
9
9
|
|
10
10
|
from .FragmentHolder import FragmentHolder
|
11
11
|
from ..entity.MessageBuilder import MessageBuilder
|
12
|
-
from
|
12
|
+
from socketd.utils.StrUtils import StrUtils
|
13
13
|
|
14
14
|
|
15
15
|
class FragmentAggregatorDefault(FragmentAggregator):
|
@@ -22,7 +22,7 @@ class FragmentAggregatorDefault(FragmentAggregator):
|
|
22
22
|
self.__fragmentHolders: list[FragmentHolder] = []
|
23
23
|
|
24
24
|
data_length: str = frame.meta(EntityMetas.META_DATA_LENGTH)
|
25
|
-
if
|
25
|
+
if StrUtils.is_empty(data_length):
|
26
26
|
raise SocketDException(f"Missing {EntityMetas.META_DATA_LENGTH} meta, event= {frame.event()}")
|
27
27
|
self.__data_length = int(data_length)
|
28
28
|
self.__data_stream_size = 0
|
@@ -43,14 +43,18 @@ class FragmentAggregatorDefault(FragmentAggregator):
|
|
43
43
|
def get(self) -> Frame:
|
44
44
|
self.__fragmentHolders.sort(key=lambda x: x.index)
|
45
45
|
|
46
|
-
|
46
|
+
dataBuffer: BytesIO = BytesIO()
|
47
47
|
|
48
48
|
for fragment in self.__fragmentHolders:
|
49
|
-
|
49
|
+
dataBuffer.write(fragment.message.data().getvalue())
|
50
|
+
|
51
|
+
entity = EntityDefault().meta_map_put(self.__main.meta_map()).data_set(dataBuffer)
|
52
|
+
entity.meta_map().pop(EntityMetas.META_DATA_FRAGMENT_IDX)
|
50
53
|
|
51
54
|
return Frame(self.__main.flag(),
|
52
55
|
MessageBuilder()
|
53
56
|
.flag(self.__main.flag())
|
54
57
|
.sid(self.__main.sid())
|
55
|
-
.
|
56
|
-
)
|
58
|
+
.event(self.__main.event())
|
59
|
+
.entity(entity)
|
60
|
+
.build())
|
@@ -19,6 +19,7 @@ from socketd.transport.core.Session import Session
|
|
19
19
|
from socketd.transport.core.impl.SessionDefault import SessionDefault
|
20
20
|
from socketd.transport.core.Frame import Frame
|
21
21
|
from socketd.transport.utils.CompletableFuture import CompletableFuture
|
22
|
+
from socketd.utils.RunUtils import RunUtils
|
22
23
|
|
23
24
|
S = TypeVar("S")
|
24
25
|
|
@@ -38,6 +39,7 @@ class ChannelDefault(ChannelBase, ChannelInternal):
|
|
38
39
|
self._session: Optional[Session] = None
|
39
40
|
self._liveTime: Optional[float] = None
|
40
41
|
self._closeCode: int = 0
|
42
|
+
self._isCloseNotified = False;
|
41
43
|
|
42
44
|
def is_valid(self) -> bool:
|
43
45
|
return self.is_closed() == 0 and self._assistant.is_valid(self._source)
|
@@ -160,13 +162,23 @@ class ChannelDefault(ChannelBase, ChannelInternal):
|
|
160
162
|
try:
|
161
163
|
self._closeCode = code
|
162
164
|
|
163
|
-
await super().close(code)
|
165
|
+
await RunUtils.waitTry(super().close(code))
|
164
166
|
|
165
167
|
if code > Constants.CLOSE1000_PROTOCOL_CLOSE_STARTING:
|
166
168
|
if self._assistant.is_valid(self._source):
|
167
169
|
# 如果有效且非预关闭,则尝试关闭源
|
168
|
-
await self._assistant.close(self._source)
|
170
|
+
await RunUtils.waitTry(self._assistant.close(self._source))
|
169
171
|
log.debug(f"{self.get_config().get_role_name()} channel closed, sessionId={self.get_session().session_id()}")
|
170
172
|
except Exception as e:
|
171
173
|
log.warning(f"{self.get_config().get_role_name()} channel close error, "
|
172
174
|
f"sessionId={self.get_session().session_id()} : {e}")
|
175
|
+
|
176
|
+
if code > Constants.CLOSE1000_PROTOCOL_CLOSE_STARTING:
|
177
|
+
self.on_close_do()
|
178
|
+
|
179
|
+
|
180
|
+
def on_close_do(self):
|
181
|
+
if self._isCloseNotified == False:
|
182
|
+
self._isCloseNotified = True
|
183
|
+
self._processor.do_close_notice(self)
|
184
|
+
|
@@ -1,13 +1,12 @@
|
|
1
1
|
# 异步日志框架
|
2
|
-
|
3
|
-
|
2
|
+
import sys
|
4
3
|
import logging
|
5
4
|
|
5
|
+
from loguru import logger as _logger
|
6
|
+
|
6
7
|
# socket.d 默认
|
7
8
|
logger = logging.getLogger("socketD")
|
8
9
|
# 异步默认日志
|
9
10
|
logging.getLogger("asyncio").setLevel(logging.WARNING)
|
10
|
-
#
|
11
|
-
# 删除原本的处理器
|
12
|
-
_logger.remove()
|
11
|
+
# 日志用这个
|
13
12
|
log = _logger.opt(colors=True)
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import asyncio
|
2
1
|
from abc import ABC
|
3
2
|
from typing import Optional
|
4
3
|
|
@@ -14,6 +13,7 @@ from socketd.transport.core.Frame import Frame
|
|
14
13
|
from socketd.transport.core.impl.LogConfig import log
|
15
14
|
from socketd.transport.core.listener.SimpleListener import SimpleListener
|
16
15
|
from socketd.transport.stream.StreamManger import StreamInternal
|
16
|
+
from socketd.utils.RunUtils import RunUtils
|
17
17
|
|
18
18
|
|
19
19
|
class ProcessorDefault(Processor, ABC):
|
@@ -143,7 +143,7 @@ class ProcessorDefault(Processor, ABC):
|
|
143
143
|
self.on_message(channel, frame.message())
|
144
144
|
|
145
145
|
def on_open(self, channel: ChannelInternal):
|
146
|
-
|
146
|
+
RunUtils.taskTry(self.on_open_do(channel))
|
147
147
|
|
148
148
|
async def on_open_do(self, channel: ChannelInternal):
|
149
149
|
try:
|
@@ -154,7 +154,7 @@ class ProcessorDefault(Processor, ABC):
|
|
154
154
|
channel.do_open_future(False, e)
|
155
155
|
|
156
156
|
def on_message(self, channel: ChannelInternal, message: Message):
|
157
|
-
|
157
|
+
RunUtils.taskTry(self.on_message_do(channel, message))
|
158
158
|
|
159
159
|
async def on_message_do(self, channel: ChannelInternal, message: Message):
|
160
160
|
try:
|
@@ -165,13 +165,19 @@ class ProcessorDefault(Processor, ABC):
|
|
165
165
|
|
166
166
|
def on_close(self, channel: ChannelInternal):
|
167
167
|
if channel.is_closed() <= Constants.CLOSE1000_PROTOCOL_CLOSE_STARTING:
|
168
|
-
|
168
|
+
RunUtils.taskTry(self.on_close_internal(channel, Constants.CLOSE2003_DISCONNECTION))
|
169
169
|
|
170
170
|
async def on_close_internal(self, channel: ChannelInternal, code: int):
|
171
171
|
await channel.close(code)
|
172
172
|
|
173
|
-
if code > Constants.CLOSE1000_PROTOCOL_CLOSE_STARTING:
|
174
|
-
await self.listener.on_close(channel.get_session())
|
175
|
-
|
176
173
|
def on_error(self, channel: ChannelInternal, error):
|
177
|
-
self.listener.on_error(channel.get_session(), error)
|
174
|
+
RunUtils.taskTry(self.listener.on_error(channel.get_session(), error))
|
175
|
+
|
176
|
+
def do_close_notice(self, channel: ChannelInternal):
|
177
|
+
RunUtils.taskTry(self.do_close_notice_internal(channel))
|
178
|
+
|
179
|
+
async def do_close_notice_internal(self, channel: ChannelInternal):
|
180
|
+
try:
|
181
|
+
await RunUtils.waitTry(self.listener.on_close(channel.get_session()))
|
182
|
+
except Exception as e:
|
183
|
+
self.on_error(channel, e)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
from typing import Callable, Union, Dict, Coroutine
|
2
|
+
|
3
|
+
from socketd.transport.core.Listener import Listener
|
4
|
+
from socketd.transport.core.Session import Session
|
5
|
+
from socketd.transport.core.Message import Message
|
6
|
+
from socketd.utils.RunUtils import RunUtils
|
7
|
+
|
8
|
+
|
9
|
+
class EventListener(Listener):
|
10
|
+
"""
|
11
|
+
@author bai
|
12
|
+
@since 2.0
|
13
|
+
"""
|
14
|
+
|
15
|
+
def __init__(self):
|
16
|
+
self._doOnOpenHandler: Union[Callable[[Session], Coroutine], None] = None
|
17
|
+
self._doOnMessageHandler: Union[Callable[[Session, Message], Coroutine], None] = None
|
18
|
+
self._doOnCloseHandler: Union[Callable[[Session], Coroutine], None] = None
|
19
|
+
self._doOnErrorHandler: Union[Callable[[Session, Exception], Coroutine], None] = None
|
20
|
+
self._eventRouteSelector: Dict[str, Callable[[Session, Message], Coroutine]] = {}
|
21
|
+
|
22
|
+
def do_on_open(self, handler: Callable[[Session], None]) -> 'EventListener':
|
23
|
+
self._doOnOpenHandler = handler
|
24
|
+
return self
|
25
|
+
|
26
|
+
def do_on_message(self, handler: Callable[[Session, Message], None]) -> 'EventListener':
|
27
|
+
self._doOnMessageHandler = handler
|
28
|
+
return self
|
29
|
+
|
30
|
+
def do_on_close(self, handler: Callable[[Session], None]) -> 'EventListener':
|
31
|
+
self._doOnCloseHandler = handler
|
32
|
+
return self
|
33
|
+
|
34
|
+
def do_on_error(self, handler: Callable[[Session, Exception], None]) -> 'EventListener':
|
35
|
+
self._doOnErrorHandler = handler
|
36
|
+
return self
|
37
|
+
|
38
|
+
def do_on(self, event: str, handler: Callable[[Session, Message], None]) -> 'EventListener':
|
39
|
+
self._eventRouteSelector[event] = handler
|
40
|
+
return self
|
41
|
+
|
42
|
+
async def on_open(self, session: Session):
|
43
|
+
if self._doOnOpenHandler:
|
44
|
+
await RunUtils.waitTry(await self._doOnOpenHandler(session))
|
45
|
+
|
46
|
+
async def on_message(self, session: Session, message: Message):
|
47
|
+
if self._doOnMessageHandler:
|
48
|
+
await RunUtils.waitTry(self._doOnMessageHandler(session, message))
|
49
|
+
|
50
|
+
if message_handler := self._eventRouteSelector.get(message.event()):
|
51
|
+
await RunUtils.waitTry(message_handler(session, message))
|
52
|
+
|
53
|
+
async def on_close(self, session: Session):
|
54
|
+
if self._doOnCloseHandler:
|
55
|
+
await RunUtils.waitTry(self._doOnCloseHandler(session))
|
56
|
+
|
57
|
+
async def on_error(self, session: Session, error: Exception):
|
58
|
+
if self._doOnErrorHandler:
|
59
|
+
await RunUtils.waitTry(self._doOnErrorHandler(session, error))
|
@@ -0,0 +1,32 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from socketd.transport.core.Listener import Listener
|
4
|
+
from socketd.transport.core.Session import Session
|
5
|
+
from socketd.transport.core.listener.RouteSelector import RouteSelector
|
6
|
+
from socketd.transport.core.listener.RouteSelectorDefault import RouteSelectorDefault
|
7
|
+
from socketd.utils.RunUtils import RunUtils
|
8
|
+
|
9
|
+
|
10
|
+
class PathListener(Listener):
|
11
|
+
def __init__(self):
|
12
|
+
_pathRouteSelector:RouteSelector = RouteSelectorDefault()
|
13
|
+
|
14
|
+
def doOf(self, path: str, listener: Listener) -> PathListener:
|
15
|
+
self._pathRouteSelector.put(path, listener)
|
16
|
+
return self
|
17
|
+
|
18
|
+
async def on_open(self, session: Session):
|
19
|
+
if l := self._pathRouteSelector.select(session.path()):
|
20
|
+
await RunUtils.waitTry(l.on_open(session))
|
21
|
+
|
22
|
+
async def on_message(self, session, message):
|
23
|
+
if l := self._pathRouteSelector.select(session.path()):
|
24
|
+
await RunUtils.waitTry(l.on_message(session, message))
|
25
|
+
|
26
|
+
async def on_close(self, session):
|
27
|
+
if l := self._pathRouteSelector.select(session.path()):
|
28
|
+
await RunUtils.waitTry(l.on_close(session))
|
29
|
+
|
30
|
+
async def on_error(self, session, error:Exception):
|
31
|
+
if l := self._pathRouteSelector.select(session.path()):
|
32
|
+
await RunUtils.waitTry(l.on_error(session, error))
|