Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(cbindings): tiny waku relay example in Python #1793

Merged
merged 4 commits into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions examples/python/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
blinker==1.6.2
click==8.1.6
Flask==2.3.2
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
Werkzeug==2.3.6
117 changes: 117 additions & 0 deletions examples/python/waku.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
from flask import Flask
import ctypes
import argparse

libwaku = object
try:
# This python script should be run from the root repo folder
libwaku = ctypes.CDLL("build/libwaku.so")
except Exception as e:
print("Exception: ", e)
print("""
The 'libwaku.so' library can be created with the next command from
the repo's root folder: `make libwaku`.

And it should build the library in 'build/libwaku.so'.

Therefore, make sure the LD_LIBRARY_PATH env var points at the location that
contains the 'libwaku.so' library.
""")
exit(-1)

def handle_event(event):
print("Event received: {}".format(event))

def call_waku(func):
ret = func()
if (ret != 0):
print("Error in %s. Error code: %d" % (locals().keys(), ret))
exit(1)

# Parse params
parser = argparse.ArgumentParser(description='libwaku integration in Python.')
parser.add_argument('-d', '--host', dest='host', default='0.0.0.0',
help='Address this node will listen to. [=0.0.0.0]')
parser.add_argument('-p', '--port', dest='port', default=60000, required=True,
help='Port this node will listen to. [=60000]')
parser.add_argument('-k', '--key', dest='key', default="", required=True,
help="""P2P node private key as 64 char hex string.
e.g.: 364d111d729a6eb6d2e6113e163f017b5ef03a6f94c9b5b7bb1bb36fa5cb07a9""")
parser.add_argument('-r', '--relay', dest='relay', default="true",
help="Enable relay protocol: true|false [=true]")
parser.add_argument('--peer', dest='peer', default="",
help="Multiqualified libp2p address")

args = parser.parse_args()

# The next 'json_config' is the item passed to the 'waku_new'.
json_config = "{ \
\"host\": \"%s\", \
\"port\": %d, \
\"key\": \"%s\", \
\"relay\": %s \
}" % (args.host,
int(args.port),
args.key,
"true" if args.relay else "false")

callback_type = ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_size_t)

# Retrieve the current version of the library
libwaku.waku_version(callback_type(lambda msg, len:
print("Git Version: %s" %
msg.decode('utf-8'))))
# Retrieve the default pubsub topic
default_pubsub_topic = ""
libwaku.waku_default_pubsub_topic(callback_type(
lambda msg, len: (
globals().update(default_pubsub_topic = msg.decode('utf-8')),
print("Default pubsub topic: %s" % msg.decode('utf-8')))
))

print("Bind addr: {}:{}".format(args.host, args.port))
print("Waku Relay enabled: {}".format(args.relay))

# Node creation
libwaku.waku_new.argtypes = [ctypes.c_char_p,
callback_type]

libwaku.waku_new(bytes(json_config, 'utf-8'),
callback_type(
#onErrCb
lambda msg, len:
print("Error calling waku_new: %s",
msg.decode('utf-8'))
))
# Start the node
libwaku.waku_start()

# Set the event callback
callback_type = ctypes.CFUNCTYPE(None, ctypes.c_char_p)
callback = callback_type(handle_event)
libwaku.waku_set_event_callback(callback)

# Subscribe to the default pubsub topic
libwaku.waku_relay_subscribe(default_pubsub_topic.encode('utf-8'),
callback_type(
#onErrCb
lambda msg, len:
print("Error calling waku_new: %s",
msg.decode('utf-8'))
))

libwaku.waku_connect(args.peer.encode('utf-8'),
10000,
callback_type(
# onErrCb
lambda msg, len:
print("Error calling waku_new: %s", msg.decode('utf-8'))))

# app = Flask(__name__)
# @app.route("/")
# def hello_world():
# return "Hello, World!"

# Simply avoid the app to
a = input()