neuronum 4.0.1__py3-none-any.whl → 5.0.0__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):
@@ -85,7 +176,17 @@ class Cell:
85
176
  response.raise_for_status()
86
177
  response.raise_for_status()
87
178
  data = await response.json()
88
- print(data["message"])
179
+ if data["success"] == "activated":
180
+ async for operation in self.sync():
181
+ label = operation.get("label")
182
+ if label == "tx_response":
183
+ operation_id = operation.get("operationID")
184
+ if operation_id == data["operationID"]:
185
+ tx_response = operation.get("data")
186
+ return tx_response
187
+
188
+ else:
189
+ print(data["success"], data["message"])
89
190
 
90
191
  except aiohttp.ClientError as e:
91
192
  print(f"Error sending request: {e}")
@@ -93,6 +194,31 @@ class Cell:
93
194
  print(f"Unexpected error: {e}")
94
195
 
95
196
 
197
+ async def tx_response(self, txID: str, cc: str, operationID: str, data: dict):
198
+ url = f"https://{self.network}/api/tx_response/{txID}"
199
+
200
+ tx_response = {
201
+ "cc": cc,
202
+ "operationID": operationID,
203
+ "data": data,
204
+ "cell": self.to_dict()
205
+ }
206
+
207
+ async with aiohttp.ClientSession() as session:
208
+ for attempt in range(5):
209
+ try:
210
+ async with session.post(url, json=tx_response) as response:
211
+ response.raise_for_status()
212
+ data = await response.json()
213
+
214
+ except aiohttp.ClientError as e:
215
+ print(f"Attempt {attempt + 1}: Error sending request: {e}")
216
+ except Exception as e:
217
+ print(f"Attempt {attempt + 1}: Unexpected error: {e}")
218
+
219
+ print(data["message"])
220
+
221
+
96
222
  async def create_ctx(self, descr: str, partners: list):
97
223
  url = f"https://{self.network}/api/create_ctx"
98
224
 
@@ -368,80 +494,4 @@ class Cell:
368
494
  print(f"Unexpected error: {e}")
369
495
 
370
496
 
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
497
  __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.0
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=t1BDzFDzbq9kQN7RSFIagctSGWOoP5MewjpauJxhH5k,17511
5
+ neuronum-5.0.0.dist-info/licenses/LICENSE,sha256=UiZjNHiCyRP6WoZfbYQh9cv4JW96wIofKXmzBJrYSUk,1125
6
+ neuronum-5.0.0.dist-info/METADATA,sha256=KkMqALQtmMd_2gnstSXwjqx2AvkegZr-26c1oBXAHao,2883
7
+ neuronum-5.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
8
+ neuronum-5.0.0.dist-info/entry_points.txt,sha256=XKYBcRNxGeJpZZkDPsa8HA_RaJ7Km_R_JaUq5T9Nk2U,42
9
+ neuronum-5.0.0.dist-info/top_level.txt,sha256=ru8Fr84cHm6oHr_DcJ8-uaq3RTiuCRFIr6AC8V0zPu4,13
10
+ neuronum-5.0.0.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,,