neuronum 4.0.1__py3-none-any.whl → 5.0.1__py3-none-any.whl

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.

Potentially problematic release.


This version of neuronum might be problematic. Click here for more details.

neuronum/neuronum.py CHANGED
@@ -13,6 +13,7 @@ class Cell:
13
13
  self.synapse = synapse
14
14
  self.queue = asyncio.Queue()
15
15
 
16
+
16
17
  def to_dict(self) -> dict:
17
18
  return {
18
19
  "host": self.host,
@@ -20,8 +21,98 @@ class Cell:
20
21
  "synapse": self.synapse
21
22
  }
22
23
 
24
+
23
25
  def __repr__(self) -> str:
24
26
  return f"Cell(host={self.host}, password={self.password}, network={self.network}, synapse={self.synapse})"
27
+
28
+
29
+ async def stream(self, label: str, data: dict, stx: Optional[str] = None, retry_delay: int = 3):
30
+ context = ssl.create_default_context()
31
+ context.check_hostname = True
32
+ context.verify_mode = ssl.CERT_REQUIRED
33
+
34
+ while True:
35
+ try:
36
+ reader, writer = await asyncio.open_connection(self.network, 55555, ssl=context, server_hostname=self.network)
37
+
38
+ credentials = f"{self.host}\n{self.password}\n{self.synapse}\n{stx}\n"
39
+ writer.write(credentials.encode("utf-8"))
40
+ await writer.drain()
41
+
42
+ response = await reader.read(1024)
43
+ response_text = response.decode("utf-8").strip()
44
+
45
+ if "Authentication successful" not in response_text:
46
+ print("Authentication failed, retrying...")
47
+ writer.close()
48
+ await writer.wait_closed()
49
+ await asyncio.sleep(retry_delay)
50
+ continue
51
+
52
+ stream_payload = {
53
+ "label": label,
54
+ "data": data,
55
+ }
56
+
57
+ writer.write(json.dumps(stream_payload).encode("utf-8"))
58
+ await writer.drain()
59
+
60
+ response = await reader.read(1024)
61
+ response_text = response.decode("utf-8").strip()
62
+
63
+ if response_text == "Sent":
64
+ print(f"Success: {response_text} - {stream_payload}")
65
+ break
66
+ else:
67
+ print(f"Error sending: {stream_payload}")
68
+
69
+ except (ssl.SSLError, ConnectionError) as e:
70
+ print(f"Connection error: {e}, retrying...")
71
+ await asyncio.sleep(retry_delay)
72
+
73
+ except Exception as e:
74
+ print(f"Unexpected error: {e}, retrying...")
75
+ await asyncio.sleep(retry_delay)
76
+
77
+ finally:
78
+ if 'writer' in locals():
79
+ writer.close()
80
+ await writer.wait_closed()
81
+
82
+
83
+ async def sync(self, stx: Optional[str] = None) -> AsyncGenerator[str, None]:
84
+ full_url = f"wss://{self.network}/sync/{stx}"
85
+
86
+ auth_payload = {
87
+ "host": self.host,
88
+ "password": self.password,
89
+ "synapse": self.synapse,
90
+ }
91
+
92
+ try:
93
+ async with websockets.connect(full_url) as ws:
94
+ await ws.send(json.dumps(auth_payload))
95
+ print("Listening to Stream...")
96
+
97
+ try:
98
+ while True:
99
+ try:
100
+ raw_operation = await ws.recv()
101
+ operation = json.loads(raw_operation)
102
+ yield operation
103
+
104
+ except asyncio.TimeoutError:
105
+ print("No initial data received. Continuing to listen...")
106
+ continue
107
+
108
+ except asyncio.CancelledError:
109
+ print("Connection closed.")
110
+
111
+ except websockets.exceptions.WebSocketException as e:
112
+ print(f"WebSocket error occurred: {e}")
113
+
114
+ except Exception as e:
115
+ print(f"An unexpected error occurred: {e}")
25
116
 
26
117
 
27
118
  async def create_tx(self, descr: str, key_values: dict, stx: str, label: str, partners: list):
@@ -73,7 +164,6 @@ class Cell:
73
164
 
74
165
  async def activate_tx(self, txID: str, data: dict):
75
166
  url = f"https://{self.network}/api/activate_tx/{txID}"
76
-
77
167
  TX = {
78
168
  "data": data,
79
169
  "cell": self.to_dict()
@@ -82,10 +172,40 @@ class Cell:
82
172
  async with aiohttp.ClientSession() as session:
83
173
  try:
84
174
  async with session.post(url, json=TX) as response:
85
- response.raise_for_status()
86
175
  response.raise_for_status()
87
176
  data = await response.json()
88
- print(data["message"])
177
+ if data["success"] == "activated":
178
+ async for operation in self.sync():
179
+ label = operation.get("label")
180
+ if label == "tx_response":
181
+ operation_txID = operation.get("txID")
182
+ if operation_txID == txID:
183
+ return operation.get("data")
184
+ else:
185
+ print(data["success"], data["message"])
186
+
187
+ except aiohttp.ClientError as e:
188
+ print(f"Error sending request: {e}")
189
+ except Exception as e:
190
+ print(f"Unexpected error: {e}")
191
+
192
+
193
+ async def tx_response(self, txID: str, client: str, data: dict):
194
+ url = f"https://{self.network}/api/tx_response/{txID}"
195
+
196
+ tx_response = {
197
+ "client": client,
198
+ "data": data,
199
+ "cell": self.to_dict()
200
+ }
201
+
202
+ async with aiohttp.ClientSession() as session:
203
+ try:
204
+ for _ in range(2):
205
+ async with session.post(url, json=tx_response) as response:
206
+ response.raise_for_status()
207
+ data = await response.json()
208
+ print(data["message"])
89
209
 
90
210
  except aiohttp.ClientError as e:
91
211
  print(f"Error sending request: {e}")
@@ -368,80 +488,4 @@ class Cell:
368
488
  print(f"Unexpected error: {e}")
369
489
 
370
490
 
371
- async def stream(self, label: str, data: dict, stx: Optional[str] = None):
372
- context = ssl.create_default_context()
373
- context.check_hostname = True
374
- context.verify_mode = ssl.CERT_REQUIRED
375
-
376
- try:
377
- reader, writer = await asyncio.open_connection(self.network, 55555, ssl=context, server_hostname=self.network)
378
-
379
- credentials = f"{self.host}\n{self.password}\n{self.synapse}\n{stx}\n"
380
- writer.write(credentials.encode("utf-8"))
381
- await writer.drain()
382
-
383
- response = await reader.read(1024)
384
- response_text = response.decode("utf-8")
385
-
386
- if "Authentication successful" not in response_text:
387
- print("Authentication failed")
388
- writer.close()
389
- await writer.wait_closed()
390
- return
391
-
392
- stream_payload = {
393
- "label": label,
394
- "data": data,
395
- }
396
-
397
- writer.write(json.dumps(stream_payload).encode("utf-8"))
398
- await writer.drain()
399
- print(f"Sent: {stream_payload}")
400
-
401
- except ssl.SSLError as e:
402
- print(f"SSL error occurred: {e}")
403
-
404
- except Exception as e:
405
- print(f"An unexpected error occurred: {e}")
406
-
407
- finally:
408
- writer.close()
409
- await writer.wait_closed()
410
-
411
-
412
- async def sync(self, stx: Optional[str] = None) -> AsyncGenerator[str, None]:
413
- full_url = f"wss://{self.network}/sync/{stx}"
414
-
415
- auth_payload = {
416
- "host": self.host,
417
- "password": self.password,
418
- "synapse": self.synapse,
419
- }
420
-
421
- try:
422
- async with websockets.connect(full_url) as ws:
423
- await ws.send(json.dumps(auth_payload))
424
- print("Listening to Stream...")
425
-
426
- try:
427
- while True:
428
- try:
429
- raw_operation = await ws.recv()
430
- operation = json.loads(raw_operation)
431
- yield operation
432
-
433
- except asyncio.TimeoutError:
434
- print("No initial data received. Continuing to listen...")
435
- continue
436
-
437
- except asyncio.CancelledError:
438
- print("Connection closed.")
439
-
440
- except websockets.exceptions.WebSocketException as e:
441
- print(f"WebSocket error occurred: {e}")
442
-
443
- except Exception as e:
444
- print(f"An unexpected error occurred: {e}")
445
-
446
-
447
491
  __all__ = ['Cell']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: neuronum
3
- Version: 4.0.1
3
+ Version: 5.0.1
4
4
  Summary: Official client library to interact with the Neuronum Network
5
5
  Home-page: https://neuronum.net
6
6
  Author: Neuronum Cybernetics
@@ -86,11 +86,20 @@ neuronum view-cell # view Cell / output = Connected Cell: '
86
86
 
87
87
 
88
88
  ### **Build on Neuronum**
89
+ **Node Examples:**
90
+ Visit: https://github.com/neuronumcybernetics/neuronum/tree/main/how_tos/nodes
91
+
89
92
  Initialize Node (default template):
90
93
  ```sh
91
94
  neuronum init-node # initialize a Node with default template
92
95
  ```
93
96
 
97
+ Start Node:
98
+ ```sh
99
+ neuronum start-node # start Node
100
+ ```
94
101
 
95
- **Node Examples:**
96
- Visit: https://github.com/neuronumcybernetics/neuronum/tree/main/how_tos/nodes
102
+ Stop Node:
103
+ ```sh
104
+ neuronum stop-node # stop Node
105
+ ```
@@ -0,0 +1,10 @@
1
+ cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ cli/main.py,sha256=g7Y-W1G7C1firXHsEnBFyqa52nSk6GVzcax_6up0Ezg,24991
3
+ neuronum/__init__.py,sha256=Drsm263_w3_VWgl1YsKLUr8WwVodqV3TSjqpxLjyq_M,46
4
+ neuronum/neuronum.py,sha256=qzxc9csSEnGX8wRC_14vzjJPQsCTC8wswhXno1Ih_Xw,17166
5
+ neuronum-5.0.1.dist-info/licenses/LICENSE,sha256=UiZjNHiCyRP6WoZfbYQh9cv4JW96wIofKXmzBJrYSUk,1125
6
+ neuronum-5.0.1.dist-info/METADATA,sha256=pxMNkUpve0FgezRiZLDm3c-mboVYt3TGmGY8Cnut1ns,2883
7
+ neuronum-5.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
8
+ neuronum-5.0.1.dist-info/entry_points.txt,sha256=XKYBcRNxGeJpZZkDPsa8HA_RaJ7Km_R_JaUq5T9Nk2U,42
9
+ neuronum-5.0.1.dist-info/top_level.txt,sha256=ru8Fr84cHm6oHr_DcJ8-uaq3RTiuCRFIr6AC8V0zPu4,13
10
+ neuronum-5.0.1.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- cli/main.py,sha256=g7Y-W1G7C1firXHsEnBFyqa52nSk6GVzcax_6up0Ezg,24991
3
- neuronum/__init__.py,sha256=Drsm263_w3_VWgl1YsKLUr8WwVodqV3TSjqpxLjyq_M,46
4
- neuronum/neuronum.py,sha256=botQ0FJIf5e00MqfUeIcD6aAchys9vSsQ3ymj8YzGMc,15223
5
- neuronum-4.0.1.dist-info/licenses/LICENSE,sha256=UiZjNHiCyRP6WoZfbYQh9cv4JW96wIofKXmzBJrYSUk,1125
6
- neuronum-4.0.1.dist-info/METADATA,sha256=SVe3ktDGVnjOpjl4PXi0QtIFOgW84Mr0TzfDJpivwsY,2725
7
- neuronum-4.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
8
- neuronum-4.0.1.dist-info/entry_points.txt,sha256=XKYBcRNxGeJpZZkDPsa8HA_RaJ7Km_R_JaUq5T9Nk2U,42
9
- neuronum-4.0.1.dist-info/top_level.txt,sha256=ru8Fr84cHm6oHr_DcJ8-uaq3RTiuCRFIr6AC8V0zPu4,13
10
- neuronum-4.0.1.dist-info/RECORD,,