dimp 2.3.4__tar.gz → 2.4.1__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 (56) hide show
  1. {dimp-2.3.4 → dimp-2.4.1}/PKG-INFO +99 -23
  2. {dimp-2.3.4 → dimp-2.4.1}/README.md +98 -22
  3. {dimp-2.3.4 → dimp-2.4.1}/dimp/__init__.py +142 -62
  4. {dimp-2.3.4 → dimp-2.4.1}/dimp/crypto/__init__.py +9 -21
  5. {dimp-2.3.4 → dimp-2.4.1}/dimp/crypto/algorithms.py +0 -15
  6. {dimp-2.3.4 → dimp-2.4.1}/dimp/dkd/__init__.py +48 -43
  7. {dimp-2.3.4/dimp/msg → dimp-2.4.1/dimp/dkd}/base.py +9 -8
  8. {dimp-2.3.4/dimp/msg → dimp-2.4.1/dimp/dkd}/envelope.py +8 -9
  9. {dimp-2.3.4/dimp/msg → dimp-2.4.1/dimp/dkd}/instant.py +37 -27
  10. {dimp-2.3.4/dimp/msg → dimp-2.4.1/dimp/dkd}/reliable.py +17 -16
  11. {dimp-2.3.4/dimp/msg → dimp-2.4.1/dimp/dkd}/secure.py +26 -39
  12. {dimp-2.3.4 → dimp-2.4.1}/dimp/ext/__init__.py +40 -25
  13. dimp-2.4.1/dimp/format/__init__.py +110 -0
  14. dimp-2.4.1/dimp/format/base.py +212 -0
  15. dimp-2.4.1/dimp/format/data.py +113 -0
  16. dimp-2.4.1/dimp/format/duri.py +285 -0
  17. dimp-2.4.1/dimp/format/embed.py +224 -0
  18. dimp-2.4.1/dimp/format/file.py +296 -0
  19. dimp-2.4.1/dimp/format/file_wrapper.py +191 -0
  20. dimp-2.4.1/dimp/format/pnf.py +182 -0
  21. dimp-2.4.1/dimp/format/pnf_wrapper.py +222 -0
  22. {dimp-2.3.4 → dimp-2.4.1}/dimp/mkm/__init__.py +24 -22
  23. {dimp-2.3.4 → dimp-2.4.1}/dimp/mkm/docs.py +48 -56
  24. {dimp-2.3.4 → dimp-2.4.1}/dimp/mkm/document.py +47 -56
  25. {dimp-2.3.4 → dimp-2.4.1}/dimp/mkm/meta.py +44 -28
  26. dimp-2.4.1/dimp/protocol/__init__.py +187 -0
  27. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/assets.py +42 -21
  28. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/base.py +129 -94
  29. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/commands.py +33 -22
  30. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/contents.py +131 -64
  31. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/docs.py +64 -24
  32. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/files.py +201 -106
  33. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/forward.py +54 -52
  34. dimp-2.4.1/dimp/protocol/groups.py +263 -0
  35. dimp-2.4.1/dimp/protocol/quote.py +235 -0
  36. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/receipt.py +36 -40
  37. {dimp-2.3.4 → dimp-2.4.1}/dimp/protocol/types.py +12 -61
  38. dimp-2.4.1/dimp/protocol/version.py +78 -0
  39. {dimp-2.3.4 → dimp-2.4.1}/dimp.egg-info/PKG-INFO +99 -23
  40. {dimp-2.3.4 → dimp-2.4.1}/dimp.egg-info/SOURCES.txt +16 -12
  41. dimp-2.4.1/dimp.egg-info/requires.txt +2 -0
  42. {dimp-2.3.4 → dimp-2.4.1}/setup.py +3 -3
  43. dimp-2.3.4/dimp/crypto/keys.py +0 -194
  44. dimp-2.3.4/dimp/crypto/pnf.py +0 -150
  45. dimp-2.3.4/dimp/crypto/ted.py +0 -154
  46. dimp-2.3.4/dimp/msg/__init__.py +0 -68
  47. dimp-2.3.4/dimp/protocol/__init__.py +0 -130
  48. dimp-2.3.4/dimp/protocol/app.py +0 -135
  49. dimp-2.3.4/dimp/protocol/groups.py +0 -466
  50. dimp-2.3.4/dimp/protocol/helpers.py +0 -41
  51. dimp-2.3.4/dimp/protocol/quote.py +0 -158
  52. dimp-2.3.4/dimp.egg-info/requires.txt +0 -2
  53. {dimp-2.3.4 → dimp-2.4.1}/LICENSE +0 -0
  54. {dimp-2.3.4 → dimp-2.4.1}/dimp.egg-info/dependency_links.txt +0 -0
  55. {dimp-2.3.4 → dimp-2.4.1}/dimp.egg-info/top_level.txt +0 -0
  56. {dimp-2.3.4 → dimp-2.4.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimp
3
- Version: 2.3.4
3
+ Version: 2.4.1
4
4
  Summary: Decentralized Instant Messaging Protocol
5
5
  Home-page: https://github.com/dimchat/core-py
6
6
  Author: Albert Moky
@@ -49,7 +49,7 @@ from abc import ABC, abstractmethod
49
49
  from enum import IntEnum
50
50
  from typing import Optional, Dict
51
51
 
52
- from dimp import Command, BaseCommand
52
+ from dimp import *
53
53
 
54
54
 
55
55
  class HandshakeState(IntEnum):
@@ -78,12 +78,12 @@ class HandshakeCommand(Command, ABC):
78
78
  ~~~~~~~~~~~~~~~~~
79
79
 
80
80
  data format: {
81
- type : 0x88,
82
- sn : 123,
81
+ "type" : i2s(0x88),
82
+ "sn" : 12345,
83
83
 
84
- command : "handshake", // command name
85
- title : "Hello world!", // "DIM?", "DIM!"
86
- session : "{SESSION_ID}", // session key
84
+ "command" : "handshake", // command name
85
+ "title" : "Hello world!", // "DIM?", "DIM!"
86
+ "session" : "{SESSION_ID}", // session key
87
87
  }
88
88
  """
89
89
  HANDSHAKE = 'handshake'
@@ -91,17 +91,23 @@ class HandshakeCommand(Command, ABC):
91
91
  @property
92
92
  @abstractmethod
93
93
  def title(self) -> str:
94
- raise NotImplemented
94
+ raise NotImplementedError(
95
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.title getter'
96
+ )
95
97
 
96
98
  @property
97
99
  @abstractmethod
98
100
  def session(self) -> Optional[str]:
99
- raise NotImplemented
101
+ raise NotImplementedError(
102
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.session getter'
103
+ )
100
104
 
101
105
  @property
102
106
  @abstractmethod
103
107
  def state(self) -> HandshakeState:
104
- raise NotImplemented
108
+ raise NotImplementedError(
109
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.state getter'
110
+ )
105
111
 
106
112
  #
107
113
  # Factories
@@ -175,42 +181,112 @@ class BaseHandshakeCommand(BaseCommand, HandshakeCommand):
175
181
  ### Extends Content
176
182
 
177
183
  ```python
178
- from typing import Any, Dict
184
+ from abc import ABC, abstractmethod
179
185
 
180
186
  from dimp import *
181
187
 
182
188
 
183
- class ApplicationContent(BaseContent, AppContent):
189
+ class AppContent(Content, ABC):
190
+ """
191
+ Content for Application 0nly
192
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
193
+
194
+ data format: {
195
+ "type" : i2s(0xA0),
196
+ "sn" : 12345,
197
+
198
+ "app" : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
199
+ "extra" : info // action parameters
200
+ }
201
+ """
202
+
203
+ @property
204
+ @abstractmethod
205
+ def application(self) -> str:
206
+ """ App ID """
207
+ raise NotImplementedError(
208
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.application getter'
209
+ )
210
+
211
+
212
+ class CustomizedContent(Content, ABC):
184
213
  """
185
214
  Application Customized message
186
215
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
187
216
 
188
217
  data format: {
189
- type : i2s(0xA0),
190
- sn : 123,
218
+ "type" : i2s(0xCC),
219
+ "sn" : 12345,
191
220
 
192
- app : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
193
- extra : info // action parameters
221
+ "app" : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
222
+ "mod" : "{MODULE}", // module name (e.g.: "drift_bottle")
223
+ "act" : "{ACTION}", // action name (e.g.: "throw")
224
+ "extra" : info // action parameters
194
225
  }
195
226
  """
196
227
 
197
- def __init__(self, content: Dict[str, Any] = None,
198
- msg_type: str = None, app: str = None):
228
+ @property
229
+ @abstractmethod
230
+ def module(self) -> str:
231
+ """ Module Name """
232
+ raise NotImplementedError(
233
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.module getter'
234
+ )
235
+
236
+ @property
237
+ @abstractmethod
238
+ def action(self) -> str:
239
+ """ Action Name """
240
+ raise NotImplementedError(
241
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.action getter'
242
+ )
243
+
244
+ #
245
+ # Factory method
246
+ #
247
+ @classmethod
248
+ def create(cls, app: str, mod: str, act: str):
249
+ return AppCustomizedContent(app=app, mod=mod, act=act)
250
+ ```
251
+
252
+ ```python
253
+ from typing import Dict
254
+
255
+ from dimp import *
256
+
257
+
258
+ class AppCustomizedContent(BaseContent, AppContent, CustomizedContent):
259
+
260
+ def __init__(self, content: Dict = None,
261
+ msg_type: str = None,
262
+ app: str = None, mod: str = None, act: str = None):
199
263
  if content is None:
200
- # 1. new content with type, app_id
201
- assert app is not None, 'customized content error: %s, %s' % (msg_type, app)
264
+ # 1. new content with type, application, module & action
265
+ assert app is not None and mod is not None and act is not None, \
266
+ 'customized content error: %s, %s, %s, %s' % (msg_type, app, mod, act)
202
267
  if msg_type is None:
203
- msg_type = ContentType.APPLICATION
268
+ msg_type = ContentType.CUSTOMIZED
204
269
  super().__init__(None, msg_type)
205
270
  self['app'] = app
271
+ self['mod'] = mod
272
+ self['act'] = act
206
273
  else:
207
274
  # 2. content info from network
208
- assert msg_type is None and app is None, 'params error: %s, %s, %s' % (content, msg_type, app)
275
+ assert msg_type is None and app is None and mod is None and act is None, \
276
+ 'params error: %s, %s, %s, %s, %s' % (content, msg_type, app, mod, act)
209
277
  super().__init__(content)
210
278
 
211
279
  @property # Override
212
280
  def application(self) -> str:
213
281
  return self.get_str(key='app', default='')
282
+
283
+ @property # Override
284
+ def module(self) -> str:
285
+ return self.get_str(key='mod', default='')
286
+
287
+ @property # Override
288
+ def action(self) -> str:
289
+ return self.get_str(key='act', default='')
214
290
  ```
215
291
 
216
292
  ### Extends ID Address
@@ -219,5 +295,5 @@ class ApplicationContent(BaseContent, AppContent):
219
295
 
220
296
  ----
221
297
 
222
- Copyright © 2018-2025 Albert Moky
298
+ Copyright © 2018-2026 Albert Moky
223
299
  [![Followers](https://img.shields.io/github/followers/moky)](https://github.com/moky?tab=followers)
@@ -35,7 +35,7 @@ from abc import ABC, abstractmethod
35
35
  from enum import IntEnum
36
36
  from typing import Optional, Dict
37
37
 
38
- from dimp import Command, BaseCommand
38
+ from dimp import *
39
39
 
40
40
 
41
41
  class HandshakeState(IntEnum):
@@ -64,12 +64,12 @@ class HandshakeCommand(Command, ABC):
64
64
  ~~~~~~~~~~~~~~~~~
65
65
 
66
66
  data format: {
67
- type : 0x88,
68
- sn : 123,
67
+ "type" : i2s(0x88),
68
+ "sn" : 12345,
69
69
 
70
- command : "handshake", // command name
71
- title : "Hello world!", // "DIM?", "DIM!"
72
- session : "{SESSION_ID}", // session key
70
+ "command" : "handshake", // command name
71
+ "title" : "Hello world!", // "DIM?", "DIM!"
72
+ "session" : "{SESSION_ID}", // session key
73
73
  }
74
74
  """
75
75
  HANDSHAKE = 'handshake'
@@ -77,17 +77,23 @@ class HandshakeCommand(Command, ABC):
77
77
  @property
78
78
  @abstractmethod
79
79
  def title(self) -> str:
80
- raise NotImplemented
80
+ raise NotImplementedError(
81
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.title getter'
82
+ )
81
83
 
82
84
  @property
83
85
  @abstractmethod
84
86
  def session(self) -> Optional[str]:
85
- raise NotImplemented
87
+ raise NotImplementedError(
88
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.session getter'
89
+ )
86
90
 
87
91
  @property
88
92
  @abstractmethod
89
93
  def state(self) -> HandshakeState:
90
- raise NotImplemented
94
+ raise NotImplementedError(
95
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.state getter'
96
+ )
91
97
 
92
98
  #
93
99
  # Factories
@@ -161,42 +167,112 @@ class BaseHandshakeCommand(BaseCommand, HandshakeCommand):
161
167
  ### Extends Content
162
168
 
163
169
  ```python
164
- from typing import Any, Dict
170
+ from abc import ABC, abstractmethod
165
171
 
166
172
  from dimp import *
167
173
 
168
174
 
169
- class ApplicationContent(BaseContent, AppContent):
175
+ class AppContent(Content, ABC):
176
+ """
177
+ Content for Application 0nly
178
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
179
+
180
+ data format: {
181
+ "type" : i2s(0xA0),
182
+ "sn" : 12345,
183
+
184
+ "app" : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
185
+ "extra" : info // action parameters
186
+ }
187
+ """
188
+
189
+ @property
190
+ @abstractmethod
191
+ def application(self) -> str:
192
+ """ App ID """
193
+ raise NotImplementedError(
194
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.application getter'
195
+ )
196
+
197
+
198
+ class CustomizedContent(Content, ABC):
170
199
  """
171
200
  Application Customized message
172
201
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
173
202
 
174
203
  data format: {
175
- type : i2s(0xA0),
176
- sn : 123,
204
+ "type" : i2s(0xCC),
205
+ "sn" : 12345,
177
206
 
178
- app : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
179
- extra : info // action parameters
207
+ "app" : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
208
+ "mod" : "{MODULE}", // module name (e.g.: "drift_bottle")
209
+ "act" : "{ACTION}", // action name (e.g.: "throw")
210
+ "extra" : info // action parameters
180
211
  }
181
212
  """
182
213
 
183
- def __init__(self, content: Dict[str, Any] = None,
184
- msg_type: str = None, app: str = None):
214
+ @property
215
+ @abstractmethod
216
+ def module(self) -> str:
217
+ """ Module Name """
218
+ raise NotImplementedError(
219
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.module getter'
220
+ )
221
+
222
+ @property
223
+ @abstractmethod
224
+ def action(self) -> str:
225
+ """ Action Name """
226
+ raise NotImplementedError(
227
+ f'Not implemented: {type(self).__module__}.{type(self).__name__}.action getter'
228
+ )
229
+
230
+ #
231
+ # Factory method
232
+ #
233
+ @classmethod
234
+ def create(cls, app: str, mod: str, act: str):
235
+ return AppCustomizedContent(app=app, mod=mod, act=act)
236
+ ```
237
+
238
+ ```python
239
+ from typing import Dict
240
+
241
+ from dimp import *
242
+
243
+
244
+ class AppCustomizedContent(BaseContent, AppContent, CustomizedContent):
245
+
246
+ def __init__(self, content: Dict = None,
247
+ msg_type: str = None,
248
+ app: str = None, mod: str = None, act: str = None):
185
249
  if content is None:
186
- # 1. new content with type, app_id
187
- assert app is not None, 'customized content error: %s, %s' % (msg_type, app)
250
+ # 1. new content with type, application, module & action
251
+ assert app is not None and mod is not None and act is not None, \
252
+ 'customized content error: %s, %s, %s, %s' % (msg_type, app, mod, act)
188
253
  if msg_type is None:
189
- msg_type = ContentType.APPLICATION
254
+ msg_type = ContentType.CUSTOMIZED
190
255
  super().__init__(None, msg_type)
191
256
  self['app'] = app
257
+ self['mod'] = mod
258
+ self['act'] = act
192
259
  else:
193
260
  # 2. content info from network
194
- assert msg_type is None and app is None, 'params error: %s, %s, %s' % (content, msg_type, app)
261
+ assert msg_type is None and app is None and mod is None and act is None, \
262
+ 'params error: %s, %s, %s, %s, %s' % (content, msg_type, app, mod, act)
195
263
  super().__init__(content)
196
264
 
197
265
  @property # Override
198
266
  def application(self) -> str:
199
267
  return self.get_str(key='app', default='')
268
+
269
+ @property # Override
270
+ def module(self) -> str:
271
+ return self.get_str(key='mod', default='')
272
+
273
+ @property # Override
274
+ def action(self) -> str:
275
+ return self.get_str(key='act', default='')
200
276
  ```
201
277
 
202
278
  ### Extends ID Address
@@ -205,5 +281,5 @@ class ApplicationContent(BaseContent, AppContent):
205
281
 
206
282
  ----
207
283
 
208
- Copyright © 2018-2025 Albert Moky
284
+ Copyright © 2018-2026 Albert Moky
209
285
  [![Followers](https://img.shields.io/github/followers/moky)](https://github.com/moky?tab=followers)
@@ -28,18 +28,12 @@
28
28
  # SOFTWARE.
29
29
  # ==============================================================================
30
30
 
31
- from mkm.types import *
32
- from mkm.format import *
33
- from mkm.crypto import *
34
- from mkm import *
35
- from dkd import *
36
-
37
- from .protocol.base import CommandFactory
38
- from .protocol import *
31
+ from .format import *
39
32
  from .crypto import *
33
+ from .protocol import *
40
34
  from .mkm import *
41
35
  from .dkd import *
42
- from .msg import *
36
+ from .ext import *
43
37
 
44
38
 
45
39
  name = "DIMP"
@@ -53,6 +47,7 @@ __all__ = [
53
47
  'URI', 'DateTime',
54
48
 
55
49
  'Converter', 'DataConverter', 'BaseConverter',
50
+
56
51
  'Copier',
57
52
  'Wrapper', 'Stringer', 'Mapper',
58
53
  'ConstantString', # 'String',
@@ -73,8 +68,42 @@ __all__ = [
73
68
  'json_encode', 'json_decode',
74
69
  'utf8_encode', 'utf8_decode',
75
70
 
76
- 'TransportableData', 'TransportableDataFactory',
77
- 'PortableNetworkFile', 'PortableNetworkFileFactory',
71
+ 'TransportableResource',
72
+ 'TransportableData',
73
+
74
+ 'TransportableDataFactory',
75
+
76
+ 'TransportableDataHelper',
77
+ 'FormatExtensions', 'shared_format_extensions',
78
+
79
+ 'Header', 'DataURI',
80
+
81
+ #
82
+ # TED
83
+ #
84
+
85
+ 'EncodeAlgorithms',
86
+
87
+ 'BaseString', 'BaseData',
88
+
89
+ 'Base64Data', 'PlainData',
90
+ 'EmbedData',
91
+
92
+ #
93
+ # PNF
94
+ #
95
+
96
+ 'TransportableFile', 'TransportableFileFactory',
97
+ # 'TransportableFileHelper', 'TransportableFileExtension',
98
+ 'TransportableFileWrapper', 'TransportableFileWrapperFactory',
99
+ # 'TransportableFileWrapperExtension',
100
+
101
+ 'PortableNetworkFile',
102
+ 'PortableNetworkFileWrapper',
103
+
104
+
105
+ # ================================================================
106
+
78
107
 
79
108
  #
80
109
  # Digest
@@ -95,102 +124,153 @@ __all__ = [
95
124
 
96
125
  'SymmetricKeyFactory', 'PrivateKeyFactory', 'PublicKeyFactory',
97
126
 
98
- 'BaseKey', 'BaseSymmetricKey',
99
- 'BaseAsymmetricKey', 'BasePublicKey', 'BasePrivateKey',
127
+ 'SymmetricKeyHelper', 'PublicKeyHelper', 'PrivateKeyHelper',
100
128
 
101
- 'BaseDataWrapper',
102
- 'BaseFileWrapper',
129
+ 'SymmetricKeyExtension', 'PublicKeyExtension', 'PrivateKeyExtension',
130
+ 'CryptoExtensions', 'shared_crypto_extensions',
103
131
 
104
132
  #
105
- # Algorithm
133
+ # Algorithms
106
134
  #
135
+
107
136
  'AsymmetricAlgorithms', 'SymmetricAlgorithms',
108
- 'EncodeAlgorithms',
137
+
138
+
139
+ # ================================================================
140
+
109
141
 
110
142
  #
111
- # MingKeMing
143
+ # Ming-Ke-Ming
112
144
  #
113
145
 
114
146
  'EntityType',
115
- 'Address',
116
- 'ID',
117
- 'Meta',
118
- 'Document', 'Visa', 'Bulletin',
119
-
120
- 'MetaType', 'DocumentType',
147
+ 'Address', 'ID',
148
+ 'Meta', 'TAI', 'Document',
121
149
 
122
- 'AddressFactory',
123
- 'IDFactory',
124
- 'MetaFactory',
125
- 'DocumentFactory',
150
+ 'AddressFactory', 'IDFactory',
151
+ 'MetaFactory', 'DocumentFactory',
126
152
 
127
- 'Identifier',
128
- 'ANYONE', 'EVERYONE', 'FOUNDER',
129
153
  'ANYWHERE', 'EVERYWHERE',
130
- # 'BroadcastAddress',
154
+ 'ANYONE', 'EVERYONE', 'FOUNDER',
155
+ 'BroadcastAddress', 'Identifier',
131
156
 
132
- 'BaseMeta',
133
- 'BaseDocument', 'BaseVisa', 'BaseBulletin',
157
+ 'AddressHelper', 'IDHelper',
158
+ 'MetaHelper', 'DocumentHelper',
159
+
160
+ 'AddressExtension', 'IDExtension',
161
+ 'MetaExtension', 'DocumentExtension',
162
+ 'AccountExtensions', 'shared_account_extensions',
134
163
 
135
164
  #
136
- # DaoKeDao
165
+ # Dao-Ke-Dao
137
166
  #
138
167
 
139
- 'ContentType',
140
- 'Content',
141
- 'Envelope',
168
+ 'Content', 'Envelope',
142
169
  'Message',
143
170
  'InstantMessage', 'SecureMessage', 'ReliableMessage',
144
171
 
145
- # contents
172
+ 'ContentFactory', 'EnvelopeFactory',
173
+ 'InstantMessageFactory', 'SecureMessageFactory', 'ReliableMessageFactory',
174
+
175
+ 'ContentHelper', 'EnvelopeHelper',
176
+ 'InstantMessageHelper', 'SecureMessageHelper', 'ReliableMessageHelper',
177
+
178
+ 'ContentExtension',
179
+ 'InstantMessageExtension', 'SecureMessageExtension', 'ReliableMessageExtension',
180
+ 'MessageExtensions', 'shared_message_extensions',
181
+
182
+ #
183
+ # Core Protocols
184
+ #
185
+
186
+ 'MetaType',
187
+ 'DocumentType',
188
+ 'Visa', 'Bulletin',
189
+
190
+ 'ContentType',
191
+
192
+ 'Command', 'CommandFactory',
193
+
194
+ # 'CommandHelper', 'GeneralCommandHelper',
195
+ # 'CommandExtension', 'CmdExtension',
196
+
197
+ #
198
+ # Contents
199
+ #
200
+
146
201
  'TextContent', 'PageContent', 'NameCard',
147
- 'ForwardContent', 'CombineContent', 'ArrayContent',
148
- 'FileContent', 'ImageContent', 'AudioContent', 'VideoContent',
149
202
  'MoneyContent', 'TransferContent',
203
+ 'FileContent', 'ImageContent', 'AudioContent', 'VideoContent',
204
+ 'ForwardContent', 'CombineContent', 'ArrayContent',
150
205
  'QuoteContent',
151
- 'CustomizedContent',
206
+ # 'QuoteHelper', 'QuotePurifier', 'QuoteExtension',
207
+
208
+ #
209
+ # Commands
210
+ #
152
211
 
153
- # commands
154
- 'Command',
155
212
  'MetaCommand', 'DocumentCommand',
156
213
  'ReceiptCommand',
157
214
 
158
- # group history
159
215
  'HistoryCommand', 'GroupCommand',
160
216
  'InviteCommand', 'ExpelCommand', 'JoinCommand', 'QuitCommand', 'ResetCommand',
161
- 'HireCommand', 'FireCommand', 'ResignCommand',
162
217
 
163
- # extend contents
164
- 'BaseContent',
218
+
219
+ # ================================================================
220
+
221
+
222
+ #
223
+ # Account Implementations
224
+ #
225
+
226
+ 'BaseMeta',
227
+ 'BaseDocument', 'BaseVisa', 'BaseBulletin',
228
+
229
+ #
230
+ # Content Implementations
231
+ #
232
+
233
+ 'BaseContent', 'BaseCommand',
234
+ # 'CommandHelper', 'GeneralCommandHelper',
235
+ # 'CommandExtension', 'CmdExtension',
236
+
165
237
  'BaseTextContent', 'WebPageContent', 'NameCardContent',
166
- 'SecretContent', 'CombineForwardContent', 'ListContent',
167
- 'BaseFileContent', 'ImageFileContent', 'AudioFileContent', 'VideoFileContent',
168
238
  'BaseMoneyContent', 'TransferMoneyContent',
239
+ 'BaseFileContent', 'ImageFileContent', 'AudioFileContent', 'VideoFileContent',
240
+ 'SecretContent', 'CombineForwardContent', 'ListContent',
169
241
  'BaseQuoteContent',
170
- 'AppCustomizedContent',
242
+ # 'QuoteHelper', 'QuotePurifier', 'QuoteExtension',
171
243
 
172
- # extend commands
173
- 'BaseCommand',
174
244
  'BaseMetaCommand', 'BaseDocumentCommand',
175
245
  'BaseReceiptCommand',
176
-
177
- # extend group history
178
246
  'BaseHistoryCommand', 'BaseGroupCommand',
179
- 'InviteGroupCommand', 'ExpelGroupCommand',
180
- 'JoinGroupCommand', 'QuitGroupCommand', 'ResetGroupCommand',
181
- 'HireGroupCommand', 'FireGroupCommand', 'ResignGroupCommand',
247
+ 'InviteGroupCommand', 'ExpelGroupCommand', 'JoinGroupCommand', 'QuitGroupCommand', 'ResetGroupCommand',
182
248
 
183
249
  #
184
- # Message
250
+ # Message Implementations
185
251
  #
186
252
 
187
253
  'MessageEnvelope',
188
254
  'BaseMessage',
189
255
  'PlainMessage', 'EncryptedMessage', 'NetworkMessage',
190
256
 
191
- # factories
192
- 'ContentFactory', 'CommandFactory',
193
- 'EnvelopeFactory',
194
- 'InstantMessageFactory', 'SecureMessageFactory', 'ReliableMessageFactory',
257
+
258
+ # ================================================================
259
+
260
+
261
+ 'GeneralCryptoHelper', 'GeneralCryptoExtension',
262
+ 'GeneralAccountHelper', 'GeneralAccountExtension',
263
+
264
+ 'GeneralMessageHelper', 'GeneralMessageExtension',
265
+
266
+ 'TransportableFileHelper',
267
+ 'TransportableFileExtension',
268
+ 'TransportableFileWrapperExtension',
269
+
270
+ 'CommandHelper', 'GeneralCommandHelper',
271
+ 'CommandExtension', 'CmdExtension',
272
+
273
+ 'QuoteHelper', 'QuotePurifier',
274
+ 'QuoteExtension',
195
275
 
196
276
  ]