dimples 1.2.6__tar.gz → 1.2.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dimples-1.2.6 → dimples-1.2.8}/PKG-INFO +1 -1
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/flexible.py +0 -3
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/gate.py +10 -26
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/ws.py +52 -5
- {dimples-1.2.6 → dimples-1.2.8}/dimples/register/shared.py +2 -2
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/session.py +35 -17
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/session_center.py +3 -3
- {dimples-1.2.6 → dimples-1.2.8}/dimples/station/handler.py +4 -16
- {dimples-1.2.6 → dimples-1.2.8}/dimples.egg-info/PKG-INFO +1 -1
- {dimples-1.2.6 → dimples-1.2.8}/setup.py +1 -1
- {dimples-1.2.6 → dimples-1.2.8}/README.md +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/archivist.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/checkpoint.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/commands.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/creator.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/group.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_expel.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_invite.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_join.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_query.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_quit.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_reset.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/grp_resign.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/cpu/handshake.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/facebook.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/messenger.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/network/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/network/session.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/network/state.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/network/transition.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/packer.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/processor.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/client/terminal.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/anonymous.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/ans.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/archivist.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/compat/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/compat/btc.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/compat/compatible.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/compat/entity.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/compat/meta.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/compat/network.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/dbi/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/dbi/account.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/dbi/message.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/dbi/session.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/facebook.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/messenger.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/packer.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/processer.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/ans.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/block.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/handshake.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/login.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/mute.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/protocol/report.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/register.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/common/session.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/gatekeeper.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/mars.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/mtp.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/protocol/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/protocol/mars.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/protocol/ws.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/queue.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/seeker.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/conn/session.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/account.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/base.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/document.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/group.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/group_history.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/group_keys.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/login.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/meta.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/private.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/station.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/dos/user.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/message.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/base.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/document.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/group.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/grp_history.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/grp_keys.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/login.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/message.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/meta.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/station.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/redis/user.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/session.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_base.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_cipherkey.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_document.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_group.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_group_history.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_group_keys.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_login.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_message.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_meta.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_private.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_station.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/database/t_user.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/edge/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/edge/octopus.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/edge/shared.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/edge/start.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/admin.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/builder.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/delegate.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/emitter.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/helper.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/manager.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/group/packer.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/register/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/register/base.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/register/ext.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/register/run.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/archivist.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/cpu/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/cpu/ans.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/cpu/document.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/cpu/handshake.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/cpu/login.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/cpu/report.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/deliver.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/dis_roamer.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/dispatcher.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/messenger.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/packer.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/processor.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/push.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/server/trace.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/station/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/station/shared.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/station/start.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/utils/__init__.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/utils/cache.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/utils/config.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/utils/log.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples/utils/runner.py +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples.egg-info/SOURCES.txt +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples.egg-info/dependency_links.txt +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples.egg-info/entry_points.txt +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples.egg-info/requires.txt +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/dimples.egg-info/top_level.txt +0 -0
- {dimples-1.2.6 → dimples-1.2.8}/setup.cfg +0 -0
|
@@ -87,9 +87,6 @@ class FlexiblePorter(StarPorter, DeparturePacker, Logging):
|
|
|
87
87
|
coro = docker.set_connection(conn=self.connection)
|
|
88
88
|
Runner.async_task(coro=coro)
|
|
89
89
|
self.__porter = docker
|
|
90
|
-
if isinstance(docker, WSPorter):
|
|
91
|
-
# ignore first handshake package
|
|
92
|
-
return None
|
|
93
90
|
# OK
|
|
94
91
|
return await docker.process_received(data=data)
|
|
95
92
|
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
# ==============================================================================
|
|
30
30
|
|
|
31
31
|
import socket
|
|
32
|
-
import threading
|
|
33
32
|
from abc import ABC
|
|
34
33
|
from typing import Generic, TypeVar, Optional, Union
|
|
35
34
|
|
|
@@ -38,7 +37,7 @@ from startrek.net.state import StateOrder
|
|
|
38
37
|
from startrek import Hub
|
|
39
38
|
from startrek import Connection, ConnectionState, ActiveConnection
|
|
40
39
|
from startrek import Porter, PorterStatus, PorterDelegate
|
|
41
|
-
from startrek import Arrival,
|
|
40
|
+
from startrek import Arrival, StarGate
|
|
42
41
|
|
|
43
42
|
from ..utils import Logging
|
|
44
43
|
|
|
@@ -57,7 +56,6 @@ class CommonGate(StarGate, Logging, Generic[H], ABC):
|
|
|
57
56
|
def __init__(self, delegate: PorterDelegate):
|
|
58
57
|
super().__init__(delegate=delegate)
|
|
59
58
|
self.__hub: H = None
|
|
60
|
-
self.__lock = threading.Lock()
|
|
61
59
|
|
|
62
60
|
@property
|
|
63
61
|
def hub(self) -> H:
|
|
@@ -92,29 +90,15 @@ class CommonGate(StarGate, Logging, Generic[H], ABC):
|
|
|
92
90
|
else:
|
|
93
91
|
return docker.status
|
|
94
92
|
|
|
95
|
-
async def fetch_porter(self, remote: SocketAddress, local: Optional[SocketAddress]) -> Porter:
|
|
96
|
-
#
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
worker = old
|
|
105
|
-
if old is None:
|
|
106
|
-
hub = self.hub
|
|
107
|
-
assert isinstance(hub, Hub), 'gate hub error: %s' % hub
|
|
108
|
-
conn = await hub.connect(remote=remote, local=local)
|
|
109
|
-
if conn is None:
|
|
110
|
-
# assert False, 'failed to get connection: %s -> %s' % (local, remote)
|
|
111
|
-
self._remove_porter(worker, remote=remote, local=local)
|
|
112
|
-
worker = None
|
|
113
|
-
else:
|
|
114
|
-
assert isinstance(worker, StarPorter), 'docker error: %s, %s' % (remote, worker)
|
|
115
|
-
# set connection for this docker
|
|
116
|
-
await worker.set_connection(conn)
|
|
117
|
-
return worker
|
|
93
|
+
async def fetch_porter(self, remote: SocketAddress, local: Optional[SocketAddress]) -> Optional[Porter]:
|
|
94
|
+
# get connection from hub
|
|
95
|
+
hub = self.hub
|
|
96
|
+
assert isinstance(hub, Hub), 'gate hub error: %s' % hub
|
|
97
|
+
conn = await hub.connect(remote=remote, local=local)
|
|
98
|
+
if conn is not None:
|
|
99
|
+
# connected, get docker with this connection
|
|
100
|
+
return await self._dock(connection=conn, create_porter=True)
|
|
101
|
+
assert False, 'failed to get connection: %s -> %s' % (local, remote)
|
|
118
102
|
|
|
119
103
|
async def send_response(self, payload: bytes, ship: Arrival,
|
|
120
104
|
remote: SocketAddress, local: Optional[SocketAddress]) -> bool:
|
|
@@ -61,7 +61,9 @@ class WSArrival(ArrivalShip):
|
|
|
61
61
|
|
|
62
62
|
@property # Override
|
|
63
63
|
def sn(self) -> bytes:
|
|
64
|
-
|
|
64
|
+
data = self.__payload
|
|
65
|
+
sn = _fetch_sig_or_time(data=data)
|
|
66
|
+
return data if sn is None else sn
|
|
65
67
|
|
|
66
68
|
# Override
|
|
67
69
|
def assemble(self, ship):
|
|
@@ -71,11 +73,12 @@ class WSArrival(ArrivalShip):
|
|
|
71
73
|
|
|
72
74
|
class WSDeparture(DepartureShip):
|
|
73
75
|
|
|
74
|
-
def __init__(self, package: bytes, payload: bytes, priority: int = 0):
|
|
76
|
+
def __init__(self, package: bytes, payload: bytes, priority: int = 0, important: bool = False):
|
|
75
77
|
super().__init__(priority=priority, max_tries=1)
|
|
76
78
|
self.__fragments = [package]
|
|
77
79
|
self.__package = package
|
|
78
80
|
self.__payload = payload
|
|
81
|
+
self.__important = important
|
|
79
82
|
|
|
80
83
|
@property
|
|
81
84
|
def package(self) -> bytes:
|
|
@@ -87,7 +90,9 @@ class WSDeparture(DepartureShip):
|
|
|
87
90
|
|
|
88
91
|
@property # Override
|
|
89
92
|
def sn(self) -> bytes:
|
|
90
|
-
|
|
93
|
+
data = self.__payload
|
|
94
|
+
sn = _fetch_sig_or_time(data=data)
|
|
95
|
+
return data if sn is None else sn
|
|
91
96
|
|
|
92
97
|
@property # Override
|
|
93
98
|
def fragments(self) -> List[bytes]:
|
|
@@ -102,7 +107,42 @@ class WSDeparture(DepartureShip):
|
|
|
102
107
|
|
|
103
108
|
@property
|
|
104
109
|
def is_important(self) -> bool:
|
|
105
|
-
return
|
|
110
|
+
return self.__important
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _fetch_sig_or_time(data: bytes) -> Optional[bytes]:
|
|
114
|
+
sn = _fetch_value(data=data, tag=b'signature')
|
|
115
|
+
if sn is None:
|
|
116
|
+
sn = _fetch_value(data=data, tag=b'time')
|
|
117
|
+
return sn
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _fetch_value(data: bytes, tag: bytes) -> Optional[bytes]:
|
|
121
|
+
tag_len = len(tag)
|
|
122
|
+
if tag_len == 0:
|
|
123
|
+
return None
|
|
124
|
+
# search tag
|
|
125
|
+
pos = data.find(tag)
|
|
126
|
+
if pos < 0:
|
|
127
|
+
return None
|
|
128
|
+
else:
|
|
129
|
+
pos += tag_len
|
|
130
|
+
# skip to start of value
|
|
131
|
+
pos = data.find(b':', pos)
|
|
132
|
+
if pos < 0:
|
|
133
|
+
return None
|
|
134
|
+
else:
|
|
135
|
+
pos += 1
|
|
136
|
+
# find end value
|
|
137
|
+
end = data.find(b',', pos)
|
|
138
|
+
if end < 0:
|
|
139
|
+
end = data.find(b'}', pos)
|
|
140
|
+
if end < 0:
|
|
141
|
+
return None
|
|
142
|
+
value = data[pos:end]
|
|
143
|
+
value = value.strip(b'"')
|
|
144
|
+
value = value.strip(b"'")
|
|
145
|
+
return value
|
|
106
146
|
|
|
107
147
|
|
|
108
148
|
class WSPorter(PlainPorter, DeparturePacker):
|
|
@@ -116,6 +156,7 @@ class WSPorter(PlainPorter, DeparturePacker):
|
|
|
116
156
|
self.__chunks = b''
|
|
117
157
|
self.__chunks_lock = threading.RLock()
|
|
118
158
|
self.__package_received = False
|
|
159
|
+
self.__ack_enable = False
|
|
119
160
|
|
|
120
161
|
def _parse_package(self, data: bytes) -> Tuple[Optional[bytes], Optional[bytes], int]:
|
|
121
162
|
conn = self.connection
|
|
@@ -208,6 +249,11 @@ class WSPorter(PlainPorter, DeparturePacker):
|
|
|
208
249
|
elif body == OK:
|
|
209
250
|
# should not happen
|
|
210
251
|
return None
|
|
252
|
+
if body.startswith(b'ACK:'):
|
|
253
|
+
# respond for message
|
|
254
|
+
await self._check_response(ship=ship)
|
|
255
|
+
self.__ack_enable = True
|
|
256
|
+
return None
|
|
211
257
|
# NOTICE: the delegate must respond to client in current request,
|
|
212
258
|
# cause it's a HTTP connection
|
|
213
259
|
return ship
|
|
@@ -220,7 +266,8 @@ class WSPorter(PlainPorter, DeparturePacker):
|
|
|
220
266
|
# Override
|
|
221
267
|
def pack(self, payload: bytes, priority: int = 0) -> Optional[Departure]:
|
|
222
268
|
req_pack = WebSocket.pack(payload=payload)
|
|
223
|
-
|
|
269
|
+
important = self.__ack_enable
|
|
270
|
+
return WSDeparture(package=req_pack, payload=payload, priority=priority, important=important)
|
|
224
271
|
|
|
225
272
|
@classmethod
|
|
226
273
|
def check(cls, data: bytes) -> bool:
|
|
@@ -123,12 +123,12 @@ async def modify(identifier: ID, database: AccountDBI):
|
|
|
123
123
|
# Step 1: create account
|
|
124
124
|
#
|
|
125
125
|
account = create_account(network=network, database=database)
|
|
126
|
-
meta, doc = account.load_info(identifier=identifier)
|
|
126
|
+
meta, doc = await account.load_info(identifier=identifier)
|
|
127
127
|
if isinstance(account, GroupAccount):
|
|
128
128
|
assert isinstance(doc, Bulletin), 'group document error: %s' % doc
|
|
129
129
|
founder = doc.founder
|
|
130
130
|
assert founder is not None, 'founder not found: %s' % doc
|
|
131
|
-
account.load_founder(founder=founder)
|
|
131
|
+
await account.load_founder(founder=founder)
|
|
132
132
|
#
|
|
133
133
|
# Step 2. edit & save
|
|
134
134
|
#
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
38
|
import socket
|
|
39
|
+
import threading
|
|
39
40
|
import traceback
|
|
40
41
|
from typing import Optional, List, Tuple
|
|
41
42
|
|
|
@@ -84,6 +85,7 @@ class ServerSession(BaseSession):
|
|
|
84
85
|
def __init__(self, remote: Tuple[str, int], sock: socket.socket, database: SessionDBI):
|
|
85
86
|
super().__init__(remote=remote, sock=sock, database=database)
|
|
86
87
|
self.__key = generate_session_key()
|
|
88
|
+
self.__loader = OfflineMessageLoader()
|
|
87
89
|
|
|
88
90
|
@property
|
|
89
91
|
def key(self) -> str:
|
|
@@ -100,28 +102,16 @@ class ServerSession(BaseSession):
|
|
|
100
102
|
old = self.identifier
|
|
101
103
|
if super().set_identifier(identifier=identifier):
|
|
102
104
|
session_change_id(session=self, new_id=identifier, old_id=old)
|
|
103
|
-
self.
|
|
105
|
+
self.__loader.load_cached_messages(session=self)
|
|
104
106
|
return True
|
|
105
107
|
|
|
106
108
|
# Override
|
|
107
109
|
def set_active(self, active: bool, when: float = None) -> bool:
|
|
108
110
|
if super().set_active(active=active, when=when):
|
|
109
111
|
session_change_active(session=self, active=active)
|
|
110
|
-
self.
|
|
112
|
+
self.__loader.load_cached_messages(session=self)
|
|
111
113
|
return True
|
|
112
114
|
|
|
113
|
-
def _load_cached_messages(self):
|
|
114
|
-
if self.identifier is None:
|
|
115
|
-
# user not login
|
|
116
|
-
return False
|
|
117
|
-
elif not self.active:
|
|
118
|
-
# session not active
|
|
119
|
-
return False
|
|
120
|
-
# load cached message asynchronously
|
|
121
|
-
coro = load_cached_messages(session=self)
|
|
122
|
-
# Runner.async_task(coro=coro)
|
|
123
|
-
Runner.async_thread(coro=coro).start()
|
|
124
|
-
|
|
125
115
|
#
|
|
126
116
|
# Docker Delegate
|
|
127
117
|
#
|
|
@@ -183,6 +173,36 @@ class ServerSession(BaseSession):
|
|
|
183
173
|
await remove_reliable_message(msg=msg, receiver=receiver, database=db)
|
|
184
174
|
|
|
185
175
|
|
|
176
|
+
class OfflineMessageLoader:
|
|
177
|
+
|
|
178
|
+
def __init__(self):
|
|
179
|
+
super().__init__()
|
|
180
|
+
self.__lock = threading.Lock()
|
|
181
|
+
self.__thread = None
|
|
182
|
+
|
|
183
|
+
def load_cached_messages(self, session: ServerSession):
|
|
184
|
+
identifier = session.identifier
|
|
185
|
+
if identifier is None:
|
|
186
|
+
# user not login
|
|
187
|
+
return False
|
|
188
|
+
elif not session.active:
|
|
189
|
+
# session not active
|
|
190
|
+
return False
|
|
191
|
+
thr: threading.Thread = self.__thread
|
|
192
|
+
if thr is not None and thr.is_alive():
|
|
193
|
+
return False
|
|
194
|
+
with self.__lock:
|
|
195
|
+
thr = self.__thread
|
|
196
|
+
if thr is not None and thr.is_alive():
|
|
197
|
+
return False
|
|
198
|
+
# load cached message asynchronously
|
|
199
|
+
coro = _load_cached_messages(identifier=identifier, session=session)
|
|
200
|
+
thr = Runner.async_thread(coro=coro)
|
|
201
|
+
thr.start()
|
|
202
|
+
self.__thread = thr
|
|
203
|
+
return True
|
|
204
|
+
|
|
205
|
+
|
|
186
206
|
def get_data_packages(ship: Arrival) -> List[bytes]:
|
|
187
207
|
# get payload
|
|
188
208
|
if isinstance(ship, MTPStreamArrival):
|
|
@@ -224,9 +244,7 @@ def session_change_active(session: ServerSession, active: bool):
|
|
|
224
244
|
return True
|
|
225
245
|
|
|
226
246
|
|
|
227
|
-
async def
|
|
228
|
-
identifier = session.identifier
|
|
229
|
-
assert identifier is not None and session.active, 'session error: %s' % session
|
|
247
|
+
async def _load_cached_messages(identifier: ID, session: ServerSession):
|
|
230
248
|
messenger = session.messenger
|
|
231
249
|
db = messenger.database
|
|
232
250
|
limit = ReliableMessageDBI.CACHE_LIMIT
|
|
@@ -101,16 +101,16 @@ class SessionPool(Logging):
|
|
|
101
101
|
candidates = set()
|
|
102
102
|
clone_addresses = set(all_addresses) # copy
|
|
103
103
|
for remote in clone_addresses:
|
|
104
|
-
session = self.
|
|
104
|
+
session = self.__sessions.get(remote)
|
|
105
105
|
if session is None:
|
|
106
106
|
self.warning(msg='session removed: %s, %s' % (identifier, remote))
|
|
107
107
|
all_addresses.discard(remote)
|
|
108
|
-
self.remove_address(identifier=identifier, remote=remote)
|
|
108
|
+
# self.remove_address(identifier=identifier, remote=remote)
|
|
109
109
|
continue
|
|
110
110
|
elif session.identifier != identifier:
|
|
111
111
|
self.warning(msg='session reused: %s, %s, %s' % (identifier, remote, session))
|
|
112
112
|
all_addresses.discard(remote)
|
|
113
|
-
self.remove_address(identifier=identifier, remote=remote)
|
|
113
|
+
# self.remove_address(identifier=identifier, remote=remote)
|
|
114
114
|
continue
|
|
115
115
|
# got it
|
|
116
116
|
candidates.add(session)
|
|
@@ -46,33 +46,21 @@ class RequestHandler(StreamRequestHandler, Logging):
|
|
|
46
46
|
DIM Request Handler
|
|
47
47
|
"""
|
|
48
48
|
|
|
49
|
-
def __del__(self):
|
|
50
|
-
self.info(msg='request removed: %s' % str(self.client_address))
|
|
51
|
-
|
|
52
|
-
# Override
|
|
53
|
-
def setup(self):
|
|
54
|
-
super().setup()
|
|
55
|
-
self.info(msg='request setup: %s' % str(self.client_address))
|
|
56
|
-
|
|
57
|
-
# Override
|
|
58
|
-
def finish(self):
|
|
59
|
-
super().finish()
|
|
60
|
-
self.info(msg='request finished: %s' % str(self.client_address))
|
|
61
|
-
|
|
62
49
|
# Override
|
|
63
50
|
def handle(self):
|
|
64
51
|
super().handle()
|
|
65
52
|
try:
|
|
66
53
|
self.info(msg='session started: %s' % str(self.client_address))
|
|
67
|
-
|
|
68
|
-
Runner.sync_run(main=crt)
|
|
54
|
+
Runner.sync_run(main=_start_session(handler=self))
|
|
69
55
|
self.info(msg='session finished: %s' % str(self.client_address))
|
|
70
56
|
except Exception as error:
|
|
71
57
|
self.error(msg='request handler error: %s' % error)
|
|
72
58
|
traceback.print_exc()
|
|
73
59
|
|
|
74
60
|
|
|
75
|
-
async def _start_session(
|
|
61
|
+
async def _start_session(handler: RequestHandler):
|
|
62
|
+
client_address = handler.client_address
|
|
63
|
+
request = handler.request
|
|
76
64
|
shared = GlobalVariable()
|
|
77
65
|
session = ServerSession(remote=client_address, sock=request, database=shared.sdb)
|
|
78
66
|
messenger = create_messenger(facebook=shared.facebook, database=shared.mdb, session=session)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|