-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathexample.py
More file actions
111 lines (83 loc) · 2.27 KB
/
example.py
File metadata and controls
111 lines (83 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python3
"""
Example: HyperDHT from Python.
Usage:
# Server
python example.py server
# Client (pass the server's public key)
python example.py connect <public_key_hex>
# Keypair
python example.py keygen
"""
import sys
sys.path.insert(0, ".")
from hyperdht import HyperDHT, KeyPair
def cmd_keygen():
kp = KeyPair.generate()
print(f"Public key: {kp.public_key.hex()}")
print(f"Secret key: {kp.secret_key.hex()}")
def cmd_server():
dht = HyperDHT()
dht.bind()
kp = KeyPair.generate()
server = dht.create_server()
def on_connection(conn):
print(f"Client connected: {conn.remote_key[:16].hex()}...")
print(f" From: {conn.peer_host}:{conn.peer_port}")
server.listen(kp, on_connection)
print(f"Server listening")
print(f"Public key: {kp.public_key.hex()}")
print(f"Port: {dht.port}")
print(f"Ctrl+C to stop")
try:
dht.run()
except KeyboardInterrupt:
pass
finally:
dht.destroy()
def cmd_connect(pk_hex):
"""JS-style: one call returns a ready-to-use stream."""
remote_pk = bytes.fromhex(pk_hex)
dht = HyperDHT()
dht.bind()
connected = False
def on_open(stream):
nonlocal connected
connected = True
print("Connected! Sending hello...")
stream.write(b"hello from python")
def on_data(data):
print(f"Received: {data!r}")
def on_close():
print("Stream closed")
dht.destroy()
def on_error(code):
print(f"Connection failed: {code}")
dht.destroy()
print(f"Connecting to {pk_hex[:32]}...")
stream = dht.connect_stream(
remote_pk,
on_open=on_open,
on_data=on_data,
on_close=on_close,
on_error=on_error,
)
# You can even queue a write before on_open fires:
# stream.write(b"queued before open")
dht.run()
if connected:
print("Success!")
if __name__ == "__main__":
if len(sys.argv) < 2:
print(__doc__)
sys.exit(1)
cmd = sys.argv[1]
if cmd == "keygen":
cmd_keygen()
elif cmd == "server":
cmd_server()
elif cmd == "connect" and len(sys.argv) >= 3:
cmd_connect(sys.argv[2])
else:
print(__doc__)
sys.exit(1)