extends SceneTree
## Test: C++ DHT announce — verify a JS peer can find us.
## Reads bootstrap from /tmp/layer_bootstrap.txt.
## Writes pk to /tmp/test_dht_announce_pk.txt.
## Writes "ready" to /tmp/test_dht_announce_ready.txt when announced.
const POLL_HZ := 0.05
var _peer: Object
func _init() -> void:
_start.call_deferred()
func _start() -> void:
var f := FileAccess.open("/tmp/layer_bootstrap.txt", FileAccess.READ)
if f == null:
print("[announce] FAIL: no bootstrap")
quit()
return
var bootstrap := PackedStringArray(f.get_as_text().strip_edges().split(","))
f.close()
print("[announce] bootstrap: %s" % str(bootstrap))
_peer = ClassDB.instantiate(&"HyperswarmMultiplayerPeer")
var kp: Dictionary = _peer.generate_dht_keypair()
var pk: PackedByteArray = kp["public_key"]
var sk: PackedByteArray = kp["secret_key"]
print("[announce] my pk: %s" % pk.hex_encode())
var err = _peer.join_dht(pk, sk, bootstrap)
if err != OK:
print("[announce] FAIL: join_dht=%d" % err)
quit()
return
# Wait for DHT active
var elapsed := 0.0
while elapsed < 10.0:
_peer.poll()
if _peer.get_dht_status().get("active", false):
break
await create_timer(POLL_HZ).timeout
elapsed += POLL_HZ
if not _peer.get_dht_status().get("active", false):
print("[announce] FAIL: DHT not active")
_peer.close()
quit()
return
print("[announce] DHT active, table_size=%s" % str(_peer.get_dht_status().get("table_size", -1)))
# Listen (required for announce to include proper record)
err = _peer.listen_on_dht()
if err != OK:
print("[announce] FAIL: listen_on_dht=%d" % err)
_peer.close()
quit()
return
# Announce topic
var topic := "test-p2p-layer2".sha256_buffer()
err = _peer.announce_topic(topic)
if err != OK:
print("[announce] FAIL: announce_topic=%d" % err)
_peer.close()
quit()
return
# Write pk and ready signal
var wf := FileAccess.open("/tmp/test_dht_announce_pk.txt", FileAccess.WRITE)
wf.store_string(pk.hex_encode())
wf.close()
# Give announce time to complete (commit phase)
await create_timer(3.0).timeout
_peer.poll()
var rf := FileAccess.open("/tmp/test_dht_announce_ready.txt", FileAccess.WRITE)
rf.store_string("ready")
rf.close()
print("[announce] announced, waiting 30s for JS lookup test...")
# Stay alive for 30s so JS can query us
elapsed = 0.0
while elapsed < 30.0:
_peer.poll()
await create_timer(POLL_HZ).timeout
elapsed += POLL_HZ
_peer.close()
quit()