dimples 0.5.6__tar.gz → 0.5.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.
Files changed (143) hide show
  1. {dimples-0.5.6 → dimples-0.5.8}/PKG-INFO +1 -1
  2. {dimples-0.5.6 → dimples-0.5.8}/dimples/edge/octopus.py +47 -19
  3. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/dispatcher.py +25 -21
  4. {dimples-0.5.6 → dimples-0.5.8}/dimples.egg-info/PKG-INFO +1 -1
  5. {dimples-0.5.6 → dimples-0.5.8}/setup.py +1 -1
  6. {dimples-0.5.6 → dimples-0.5.8}/README.md +0 -0
  7. {dimples-0.5.6 → dimples-0.5.8}/dimples/__init__.py +0 -0
  8. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/__init__.py +0 -0
  9. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/archivist.py +0 -0
  10. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/checkpoint.py +0 -0
  11. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/__init__.py +0 -0
  12. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/commands.py +0 -0
  13. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/creator.py +0 -0
  14. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/group.py +0 -0
  15. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_expel.py +0 -0
  16. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_invite.py +0 -0
  17. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_join.py +0 -0
  18. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_query.py +0 -0
  19. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_quit.py +0 -0
  20. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_reset.py +0 -0
  21. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/grp_resign.py +0 -0
  22. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/cpu/handshake.py +0 -0
  23. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/facebook.py +0 -0
  24. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/messenger.py +0 -0
  25. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/network/__init__.py +0 -0
  26. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/network/session.py +0 -0
  27. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/network/state.py +0 -0
  28. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/network/transition.py +0 -0
  29. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/packer.py +0 -0
  30. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/processor.py +0 -0
  31. {dimples-0.5.6 → dimples-0.5.8}/dimples/client/terminal.py +0 -0
  32. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/__init__.py +0 -0
  33. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/anonymous.py +0 -0
  34. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/ans.py +0 -0
  35. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/archivist.py +0 -0
  36. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/compat/__init__.py +0 -0
  37. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/compat/btc.py +0 -0
  38. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/compat/compatible.py +0 -0
  39. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/compat/entity.py +0 -0
  40. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/compat/meta.py +0 -0
  41. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/compat/network.py +0 -0
  42. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/dbi/__init__.py +0 -0
  43. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/dbi/account.py +0 -0
  44. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/dbi/message.py +0 -0
  45. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/dbi/session.py +0 -0
  46. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/facebook.py +0 -0
  47. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/messenger.py +0 -0
  48. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/packer.py +0 -0
  49. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/processer.py +0 -0
  50. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/__init__.py +0 -0
  51. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/ans.py +0 -0
  52. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/block.py +0 -0
  53. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/handshake.py +0 -0
  54. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/login.py +0 -0
  55. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/mute.py +0 -0
  56. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/protocol/report.py +0 -0
  57. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/register.py +0 -0
  58. {dimples-0.5.6 → dimples-0.5.8}/dimples/common/session.py +0 -0
  59. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/__init__.py +0 -0
  60. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/gate.py +0 -0
  61. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/gatekeeper.py +0 -0
  62. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/mars.py +0 -0
  63. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/mtp.py +0 -0
  64. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/protocol/__init__.py +0 -0
  65. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/protocol/mars.py +0 -0
  66. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/protocol/ws.py +0 -0
  67. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/queue.py +0 -0
  68. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/seeker.py +0 -0
  69. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/session.py +0 -0
  70. {dimples-0.5.6 → dimples-0.5.8}/dimples/conn/ws.py +0 -0
  71. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/__init__.py +0 -0
  72. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/account.py +0 -0
  73. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/__init__.py +0 -0
  74. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/base.py +0 -0
  75. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/document.py +0 -0
  76. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/group.py +0 -0
  77. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/group_history.py +0 -0
  78. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/group_keys.py +0 -0
  79. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/login.py +0 -0
  80. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/meta.py +0 -0
  81. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/private.py +0 -0
  82. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/station.py +0 -0
  83. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/dos/user.py +0 -0
  84. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/message.py +0 -0
  85. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/session.py +0 -0
  86. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_cipherkey.py +0 -0
  87. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_document.py +0 -0
  88. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_group.py +0 -0
  89. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_group_history.py +0 -0
  90. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_group_keys.py +0 -0
  91. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_login.py +0 -0
  92. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_message.py +0 -0
  93. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_meta.py +0 -0
  94. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_private.py +0 -0
  95. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_station.py +0 -0
  96. {dimples-0.5.6 → dimples-0.5.8}/dimples/database/t_user.py +0 -0
  97. {dimples-0.5.6 → dimples-0.5.8}/dimples/edge/__init__.py +0 -0
  98. {dimples-0.5.6 → dimples-0.5.8}/dimples/edge/shared.py +0 -0
  99. {dimples-0.5.6 → dimples-0.5.8}/dimples/edge/start.py +0 -0
  100. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/__init__.py +0 -0
  101. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/admin.py +0 -0
  102. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/builder.py +0 -0
  103. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/delegate.py +0 -0
  104. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/emitter.py +0 -0
  105. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/helper.py +0 -0
  106. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/manager.py +0 -0
  107. {dimples-0.5.6 → dimples-0.5.8}/dimples/group/packer.py +0 -0
  108. {dimples-0.5.6 → dimples-0.5.8}/dimples/register/__init__.py +0 -0
  109. {dimples-0.5.6 → dimples-0.5.8}/dimples/register/base.py +0 -0
  110. {dimples-0.5.6 → dimples-0.5.8}/dimples/register/ext.py +0 -0
  111. {dimples-0.5.6 → dimples-0.5.8}/dimples/register/run.py +0 -0
  112. {dimples-0.5.6 → dimples-0.5.8}/dimples/register/shared.py +0 -0
  113. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/__init__.py +0 -0
  114. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/archivist.py +0 -0
  115. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/cpu/__init__.py +0 -0
  116. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/cpu/ans.py +0 -0
  117. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/cpu/document.py +0 -0
  118. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/cpu/handshake.py +0 -0
  119. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/cpu/login.py +0 -0
  120. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/cpu/report.py +0 -0
  121. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/messenger.py +0 -0
  122. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/packer.py +0 -0
  123. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/processor.py +0 -0
  124. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/push.py +0 -0
  125. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/session.py +0 -0
  126. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/session_center.py +0 -0
  127. {dimples-0.5.6 → dimples-0.5.8}/dimples/server/trace.py +0 -0
  128. {dimples-0.5.6 → dimples-0.5.8}/dimples/station/__init__.py +0 -0
  129. {dimples-0.5.6 → dimples-0.5.8}/dimples/station/handler.py +0 -0
  130. {dimples-0.5.6 → dimples-0.5.8}/dimples/station/shared.py +0 -0
  131. {dimples-0.5.6 → dimples-0.5.8}/dimples/station/start.py +0 -0
  132. {dimples-0.5.6 → dimples-0.5.8}/dimples/utils/__init__.py +0 -0
  133. {dimples-0.5.6 → dimples-0.5.8}/dimples/utils/cache.py +0 -0
  134. {dimples-0.5.6 → dimples-0.5.8}/dimples/utils/config.py +0 -0
  135. {dimples-0.5.6 → dimples-0.5.8}/dimples/utils/dos.py +0 -0
  136. {dimples-0.5.6 → dimples-0.5.8}/dimples/utils/log.py +0 -0
  137. {dimples-0.5.6 → dimples-0.5.8}/dimples/utils/singleton.py +0 -0
  138. {dimples-0.5.6 → dimples-0.5.8}/dimples.egg-info/SOURCES.txt +0 -0
  139. {dimples-0.5.6 → dimples-0.5.8}/dimples.egg-info/dependency_links.txt +0 -0
  140. {dimples-0.5.6 → dimples-0.5.8}/dimples.egg-info/entry_points.txt +0 -0
  141. {dimples-0.5.6 → dimples-0.5.8}/dimples.egg-info/requires.txt +0 -0
  142. {dimples-0.5.6 → dimples-0.5.8}/dimples.egg-info/top_level.txt +0 -0
  143. {dimples-0.5.6 → dimples-0.5.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimples
3
- Version: 0.5.6
3
+ Version: 0.5.8
4
4
  Summary: DIMP Library for Edges and Stations
5
5
  Home-page: https://github.com/dimchat/demo-py
6
6
  Author: Albert Moky
@@ -190,35 +190,63 @@ class Octopus(Runner, Logging):
190
190
 
191
191
  def income_message(self, msg: ReliableMessage, priority: int = 0) -> List[ReliableMessage]:
192
192
  """ redirect message from remote station """
193
+ sender = msg.sender
194
+ receiver = msg.receiver
193
195
  sig = get_msg_sig(msg=msg)
194
196
  messenger = self.inner_messenger
195
197
  if messenger.send_reliable_message(msg=msg, priority=priority):
196
- self.info(msg='redirected msg (%s) for receiver (%s)' % (sig, msg.receiver))
198
+ self.info(msg='redirected msg (%s): %s -> %s' % (sig, sender, receiver))
197
199
  else:
198
- self.error(msg='failed to redirect msg (%s) for receiver (%s)' % (sig, msg.receiver))
200
+ self.error(msg='failed to redirect msg (%s): %s -> %s' % (sig, sender, receiver))
199
201
  # no need to respond receipt for station
200
202
  return []
201
203
 
202
204
  def outgo_message(self, msg: ReliableMessage, priority: int = 0) -> List[ReliableMessage]:
203
205
  """ redirect message to remote station """
204
- target = ID.parse(identifier=msg.get('neighbor'))
205
- if target is None:
206
- # target station not found
207
- self.info(msg='cannot get target station for receiver (%s)' % msg.receiver)
208
- return []
209
- messenger = self.get_outer_messenger(identifier=target)
210
- if messenger is None:
211
- # target station not my neighbor
212
- self.info(msg='receiver (%s) is targeted to (%s), but not my neighbor' % (msg.receiver, target))
213
- return []
214
- msg.pop('neighbor', None)
215
- if messenger.send_reliable_message(msg=msg, priority=priority):
216
- sig = get_msg_sig(msg=msg)
217
- self.info(msg='redirected msg (%s) to target (%s) for receiver (%s)' % (sig, target, msg.receiver))
218
- # no need to respond receipt for station
219
- return []
206
+ receiver = msg.receiver
207
+ # get neighbor stations
208
+ neighbor = ID.parse(identifier=msg.get('neighbor'))
209
+ if neighbor is not None:
210
+ neighbors = set()
211
+ neighbors.add(neighbor)
212
+ msg.pop('neighbor', None)
213
+ else:
214
+ with self.__outer_lock:
215
+ neighbors = set(self.__outer_map.keys())
216
+ #
217
+ # 0. check recipients
218
+ #
219
+ new_recipients = set()
220
+ old_recipients = msg.get('recipients')
221
+ old_recipients = [] if old_recipients is None else ID.convert(old_recipients)
222
+ for item in neighbors:
223
+ if item in old_recipients:
224
+ self.info(msg='skip exists station: %s' % item)
225
+ continue
226
+ self.info(msg='new neighbor station: %s' % item)
227
+ new_recipients.add(item)
228
+ # update 'recipients' to avoid the new recipients redirect it to same targets
229
+ self.info(msg='append new recipients: %s, %s + %s' % (receiver, new_recipients, old_recipients))
230
+ all_recipients = list(old_recipients) + list(new_recipients)
231
+ msg['recipients'] = ID.revert(all_recipients)
232
+ #
233
+ # 1. send to the new recipients (neighbor stations)
234
+ #
220
235
  sig = get_msg_sig(msg=msg)
221
- self.error(msg='failed to redirect msg (%s) to target (%s) for receiver (%s)' % (sig, target, msg.receiver))
236
+ failed_neighbors = []
237
+ for target in new_recipients:
238
+ messenger = self.get_outer_messenger(identifier=target)
239
+ if messenger is None:
240
+ # target station not my neighbor
241
+ self.warning(msg='not my neighbor: %s (%s)' % (target, receiver))
242
+ failed_neighbors.append(target)
243
+ elif messenger.send_reliable_message(msg=msg, priority=priority):
244
+ self.info(msg='redirected msg (%s) to neighbor: %s (%s)' % (sig, target, receiver))
245
+ else:
246
+ self.error(msg='failed to send to neighbor: %s (%s)' % (target, receiver))
247
+ failed_neighbors.append(target)
248
+ if len(failed_neighbors) > 0:
249
+ self.error(msg='failed to redirect msg (%s) for receiver (%s): %s' % (sig, receiver, failed_neighbors))
222
250
  return []
223
251
 
224
252
 
@@ -206,26 +206,27 @@ class Dispatcher(MessageDeliver, Logging):
206
206
  return [res]
207
207
 
208
208
  def __broadcast_message(self, msg: ReliableMessage, receiver: ID, neighbors: Set[ID]) -> List[Content]:
209
+ current = self.facebook.current_user
210
+ assert current is not None, 'failed to get current station'
211
+ current = current.identifier
209
212
  #
210
213
  # 0. check recipients
211
214
  #
212
- new_recipients = neighbors.copy()
215
+ new_recipients = set()
213
216
  old_recipients = msg.get('recipients')
214
- if old_recipients is None:
215
- all_recipients = []
216
- else:
217
- all_recipients = ID.convert(old_recipients)
218
- # check duplicated
219
- self.info(msg='discard recipients: %s, new recipients: %s' % (old_recipients, new_recipients))
220
- for item in all_recipients:
221
- new_recipients.discard(item)
222
- if len(new_recipients) == 0:
223
- self.info(msg='new recipients empty: %s => %s' % (receiver, neighbors))
224
- return []
225
- self.info(msg='append new recipients: %s, %s => %s' % (receiver, new_recipients, all_recipients))
226
- for item in new_recipients:
227
- all_recipients.append(item)
228
- # avoid the new recipients redirect it to same targets
217
+ old_recipients = [] if old_recipients is None else ID.convert(old_recipients)
218
+ for item in neighbors:
219
+ if item == current:
220
+ self.info(msg='skip current station: %s' % item)
221
+ continue
222
+ elif item in old_recipients:
223
+ self.info(msg='skip exists station: %s' % item)
224
+ continue
225
+ self.info(msg='new neighbor station: %s' % item)
226
+ new_recipients.add(item)
227
+ # set 'recipients' in the msg to avoid the new recipients redirect it to same targets
228
+ self.info(msg='append new recipients: %s, %s + %s' % (receiver, new_recipients, old_recipients))
229
+ all_recipients = list(old_recipients) + list(new_recipients)
229
230
  msg['recipients'] = ID.revert(all_recipients)
230
231
  #
231
232
  # 1. push to neighbor stations directly
@@ -234,10 +235,13 @@ class Dispatcher(MessageDeliver, Logging):
234
235
  for target in new_recipients:
235
236
  if session_push(msg=msg, receiver=target) == 0:
236
237
  indirect_neighbors.add(target)
237
- if len(indirect_neighbors) > 0:
238
- for item in indirect_neighbors:
239
- all_recipients.remove(item)
240
- msg['recipients'] = ID.revert(all_recipients)
238
+ # remove unsuccessful items
239
+ for item in indirect_neighbors:
240
+ new_recipients.discard(item)
241
+ # update 'recipients' before redirect via bridge
242
+ self.info(msg='update recipients: %s, %s + %s' % (receiver, new_recipients, old_recipients))
243
+ all_recipients = list(old_recipients) + list(new_recipients)
244
+ msg['recipients'] = ID.revert(all_recipients)
241
245
  #
242
246
  # 2. push to other neighbor stations via station bridge
243
247
  #
@@ -384,7 +388,7 @@ class DeliverWorker(Logging):
384
388
  :return: responses
385
389
  """
386
390
  """ Redirect message to neighbor station """
387
- assert neighbor.type == EntityType.STATION, 'neighbor station ID error: %s' % neighbor
391
+ assert neighbor is None or neighbor.type == EntityType.STATION, 'neighbor station ID error: %s' % neighbor
388
392
  self.info(msg='redirect message %s => %s to neighbor station: %s' % (msg.sender, msg.receiver, neighbor))
389
393
  # 0. check current station
390
394
  current = self.facebook.current_user.identifier
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimples
3
- Version: 0.5.6
3
+ Version: 0.5.8
4
4
  Summary: DIMP Library for Edges and Stations
5
5
  Home-page: https://github.com/dimchat/demo-py
6
6
  Author: Albert Moky
@@ -14,7 +14,7 @@ import io
14
14
 
15
15
  from setuptools import setup, find_packages
16
16
 
17
- __version__ = '0.5.6'
17
+ __version__ = '0.5.8'
18
18
  __author__ = 'Albert Moky'
19
19
  __contact__ = 'albert.moky@gmail.com'
20
20
 
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