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.
Files changed (134) hide show
  1. {socket.d-2.4.10.6 → socket.d-2.4.11}/PKG-INFO +1 -1
  2. {socket.d-2.4.10.6 → socket.d-2.4.11}/setup.py +1 -1
  3. {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/PKG-INFO +1 -1
  4. {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/SOURCES.txt +6 -3
  5. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/SocketD.py +1 -1
  6. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/BrokerListenerBase.py +5 -5
  7. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/ClusterClientSession.py +2 -2
  8. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/LoadBalancer.py +2 -2
  9. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Codec.py +3 -0
  10. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/HandshakeDefault.py +4 -4
  11. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/IdGenerator.py +2 -2
  12. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Listener.py +1 -1
  13. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Processor.py +5 -1
  14. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/Buffer.py +9 -2
  15. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/ByteBufferCodecReader.py +1 -1
  16. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/ByteBufferCodecWriter.py +4 -1
  17. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/CodecDefault.py +24 -16
  18. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/FileEntity.py +0 -1
  19. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentAggregatorDefault.py +10 -6
  20. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ChannelDefault.py +14 -2
  21. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/LogConfig.py +4 -5
  22. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ProcessorDefault.py +14 -8
  23. socket.d-2.4.11/socketd/transport/core/listener/EventListener.py +59 -0
  24. socket.d-2.4.11/socketd/transport/core/listener/PathListener.py +32 -0
  25. socket.d-2.4.11/socketd/transport/core/listener/PipelineListener.py +42 -0
  26. socket.d-2.4.11/socketd/transport/core/listener/RouteSelector.py +21 -0
  27. socket.d-2.4.11/socketd/transport/core/listener/RouteSelectorDefault.py +20 -0
  28. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/listener/SimpleListener.py +1 -1
  29. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/Server.py +3 -5
  30. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/ServerBase.py +12 -7
  31. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/ServerConfig.py +1 -1
  32. socket.d-2.4.10.6/socketd/transport/utils/AsyncUtil.py → socket.d-2.4.11/socketd/transport/utils/AsyncUtils.py +4 -4
  33. socket.d-2.4.11/socketd/utils/RunUtils.py +13 -0
  34. socket.d-2.4.10.6/socketd/transport/utils/StrUtil.py → socket.d-2.4.11/socketd/utils/StrUtils.py +3 -3
  35. socket.d-2.4.11/socketd/utils/__init__.py +0 -0
  36. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TCPAIOServer.py +1 -1
  37. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAioClientConnector.py +2 -2
  38. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioClientConnector.py +2 -2
  39. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioServer.py +8 -7
  40. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOWebSocketServerImpl.py +33 -37
  41. socket.d-2.4.10.6/socketd/transport/core/listener/EventListener.py +0 -57
  42. socket.d-2.4.10.6/socketd/transport/core/listener/PathListener.py +0 -32
  43. socket.d-2.4.10.6/socketd/transport/core/listener/PathMapper.py +0 -11
  44. socket.d-2.4.10.6/socketd/transport/core/listener/PipelineListener.py +0 -21
  45. {socket.d-2.4.10.6 → socket.d-2.4.11}/README.md +0 -0
  46. {socket.d-2.4.10.6 → socket.d-2.4.11}/setup.cfg +0 -0
  47. {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/dependency_links.txt +0 -0
  48. {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/requires.txt +0 -0
  49. {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/top_level.txt +0 -0
  50. {socket.d-2.4.10.6 → socket.d-2.4.11}/socket.d.egg-info/zip-safe +0 -0
  51. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/__init__.py +0 -0
  52. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/BrokerFragmentHandler.py +0 -0
  53. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/BrokerListener.py +0 -0
  54. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/broker/__init__.py +0 -0
  55. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/ClusterClient.py +0 -0
  56. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/cluster/__init__.py +0 -0
  57. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/exception/SocketDExecption.py +0 -0
  58. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/exception/__init__.py +0 -0
  59. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/__init__.py +0 -0
  60. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/Client.py +0 -0
  61. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientBase.py +0 -0
  62. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientChannel.py +0 -0
  63. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConfig.py +0 -0
  64. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConfigHandler.py +0 -0
  65. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConnectHandler.py +0 -0
  66. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConnector.py +0 -0
  67. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientConnectorBase.py +0 -0
  68. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientHandshakeResult.py +0 -0
  69. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientHeartbeatHandler.py +0 -0
  70. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientProvider.py +0 -0
  71. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/ClientSession.py +0 -0
  72. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/client/__init__.py +0 -0
  73. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Asserts.py +0 -0
  74. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Channel.py +0 -0
  75. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/ChannelAssistant.py +0 -0
  76. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/ChannelInternal.py +0 -0
  77. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/ChannelSupporter.py +0 -0
  78. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Config.py +0 -0
  79. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Costants.py +0 -0
  80. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Entity.py +0 -0
  81. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/EntityMetas.py +0 -0
  82. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Flags.py +0 -0
  83. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/FragmentAggregator.py +0 -0
  84. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/FragmentHandler.py +0 -0
  85. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Frame.py +0 -0
  86. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Frames.py +0 -0
  87. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Message.py +0 -0
  88. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/Session.py +0 -0
  89. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/__init__.py +0 -0
  90. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/codec/__init__.py +0 -0
  91. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/EntityDefault.py +0 -0
  92. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/MessageBuilder.py +0 -0
  93. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/MessageDefault.py +0 -0
  94. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/StringEntity.py +0 -0
  95. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/entity/__init__.py +0 -0
  96. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentHandlerBase.py +0 -0
  97. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentHandlerDefault.py +0 -0
  98. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/FragmentHolder.py +0 -0
  99. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/fragment/__init__.py +0 -0
  100. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ChannelBase.py +0 -0
  101. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/ConfigBase.py +0 -0
  102. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/SessionBase.py +0 -0
  103. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/SessionDefault.py +0 -0
  104. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/impl/__init__.py +0 -0
  105. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/core/listener/__init__.py +0 -0
  106. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/ServerProvider.py +0 -0
  107. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/server/__init__.py +0 -0
  108. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/RequestStream.py +0 -0
  109. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/SendStream.py +0 -0
  110. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/Stream.py +0 -0
  111. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/StreamBase.py +0 -0
  112. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/StreamManger.py +0 -0
  113. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/StreamMangerDefault.py +0 -0
  114. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/SubscribeStream.py +0 -0
  115. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/stream/__init__.py +0 -0
  116. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/CompletableFuture.py +0 -0
  117. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/__init__.py +0 -0
  118. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/async_api/AtomicRefer.py +0 -0
  119. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/async_api/__init__.py +0 -0
  120. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/sync_api/AtomicRefer.py +0 -0
  121. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd/transport/utils/sync_api/__init__.py +0 -0
  122. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TCPStreamIO.py +0 -0
  123. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAIOChannelAssistant.py +0 -0
  124. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAioClient.py +0 -0
  125. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/TcpAioProvider.py +0 -0
  126. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_aio_tcp/__init__.py +0 -0
  127. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioChannelAssistant.py +0 -0
  128. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioClient.py +0 -0
  129. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/WsAioProvider.py +0 -0
  130. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/__init__.py +0 -0
  131. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOConnect.py +0 -0
  132. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOServe.py +0 -0
  133. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/AIOWebSocketClientImpl.py +0 -0
  134. {socket.d-2.4.10.6 → socket.d-2.4.11}/socketd_websocket/impl/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: socket.d
3
- Version: 2.4.10.6
3
+ Version: 2.4.11
4
4
  Summary: @noear/socket.d python project
5
5
  Home-page: https://socketd.noear.org/
6
6
  Author: noear,bai
@@ -4,7 +4,7 @@ from setuptools import setup,find_packages
4
4
 
5
5
  setup(
6
6
  name='socket.d',
7
- version='2.4.10.6',
7
+ version='2.4.11',
8
8
  description='@noear/socket.d python project',
9
9
  author='noear,bai',
10
10
  url='https://socketd.noear.org/',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: socket.d
3
- Version: 2.4.10.6
3
+ Version: 2.4.11
4
4
  Summary: @noear/socket.d python project
5
5
  Home-page: https://socketd.noear.org/
6
6
  Author: noear,bai
@@ -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/AsyncUtil.py
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
@@ -14,7 +14,7 @@ from socketd_aio_tcp.TcpAioProvider import TcpAioProvider
14
14
 
15
15
 
16
16
  def version() -> str:
17
- return "2.4.10"
17
+ return "2.4.11"
18
18
 
19
19
 
20
20
  def protocol_version() -> str:
@@ -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.transport.utils.StrUtil import StrUtil
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 StrUtil.is_empty(atName):
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 StrUtil.is_empty(x_hash):
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 StrUtil.is_not_empty(name):
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 StrUtil.is_not_empty(name):
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.transport.utils.StrUtil import StrUtil
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 = StrUtil.guid()
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.transport.utils.StrUtil import StrUtil
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, StrUtil.hash_code(diversion))
32
+ return LoadBalancer.get_any(coll, StrUtils.hash_code(diversion))
33
33
 
34
34
  # 获取任意一个
35
35
  @staticmethod
@@ -40,6 +40,9 @@ class CodecWriter(ABC):
40
40
  @abstractmethod
41
41
  def put_int(self, _num: int): ...
42
42
 
43
+ @abstractmethod
44
+ def put_char(self, _char: int): ...
45
+
43
46
  @abstractmethod
44
47
  def flush(self): ...
45
48
 
@@ -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.transport.utils.StrUtil import StrUtil
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 StrUtil.is_empty(linkUrl):
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 StrUtil.is_empty(self._path):
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 StrUtil.is_not_empty(query_string):
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,9 +1,9 @@
1
1
  from typing import Callable
2
2
 
3
- from socketd.transport.utils.StrUtil import StrUtil
3
+ from socketd.utils.StrUtils import StrUtils
4
4
 
5
5
  IdGenerator = Callable[[None], str]
6
6
 
7
7
 
8
8
  def GuidGenerator():
9
- return StrUtil.guid()
9
+ return StrUtils.guid()
@@ -18,5 +18,5 @@ class Listener(abc.ABC):
18
18
  pass
19
19
 
20
20
  @abc.abstractmethod
21
- def on_error(self, session: Session, error):
21
+ async def on_error(self, session: Session, error):
22
22
  pass
@@ -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 limit(self):
25
- return self.__limit
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='little', signed=False)
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.write(_num.to_bytes(length=4, byteorder='little', signed=False))
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.put_bytes(b'\n')
58
+ target.put_char(10) #'\n'
59
59
 
60
60
  # event
61
61
  target.put_bytes(event)
62
- target.put_bytes(b'\n')
62
+ target.put_char(10)
63
63
 
64
64
  # metaString
65
65
  target.put_bytes(metaStringB)
66
- target.put_bytes(b'\n')
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
- len0 = _reader.get_int()
76
+ frameSize = _reader.get_int()
77
77
 
78
- if len0 > (_reader.remaining() + 4):
78
+ if frameSize > (_reader.remaining() + 4):
79
79
  return None
80
80
 
81
81
  flag = _reader.get_int() # 取前一位数据
82
82
 
83
- if len0 == 8:
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
- by = Buffer(limit=metaBufSize)
90
- sid = self.decodeString(_reader, by, Constants.MAX_SIZE_SID)
91
- event = self.decodeString(_reader, by, Constants.MAX_SIZE_EVENT)
92
- metaString = self.decodeString(_reader, by, Constants.MAX_SIZE_META_STRING)
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 = len0 - _reader.position()
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().flag(Flags.of(flag)).sid(sid).event(event).entity(
106
- EntityDefault().meta_string_set(metaString).data_set(data)
107
- ).build()
108
- by.close()
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())
@@ -1,4 +1,3 @@
1
- from io import BufferedReader, BytesIO
2
1
  from typing import BinaryIO
3
2
 
4
3
  from socketd.exception.SocketDExecption import SocketDCodecException
@@ -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 ...utils.StrUtil import StrUtil
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 StrUtil.is_empty(data_length):
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
- byte: BytesIO = BytesIO()
46
+ dataBuffer: BytesIO = BytesIO()
47
47
 
48
48
  for fragment in self.__fragmentHolders:
49
- byte.write(fragment.message.data().getvalue())
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
- .entity(EntityDefault().meta_map_put(self.__main.entity().meta_map())).build()
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
- from loguru import logger as _logger
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
- # 少用默认logging ,因为他会阻塞你的线程
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
- asyncio.create_task(self.on_open_do(channel))
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
- asyncio.create_task(self.on_message_do(channel, message))
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
- asyncio.create_task(self.on_close_internal(channel, Constants.CLOSE2003_DISCONNECTION))
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))