Christmas update: GNUnet++

=> home

Two weeks ago I announced GNUnet++, my C++ wrapper for common GNUnet functions. It's christmas time and I'm happy to share that I've made progress.

Coroutine support

The last version of GNUnet++ purely runs on callbacks. Which makes advanced usage cumbersome. Now there's full support for coroutines. This means that you can write code like this:

auto gns = std::make_shared(cfg);
auto result = co_await gns->lookup("gnunet.org");

And this which would be a nightmare in previous callback APIs. (Well, we can just use an anonymous identity, but you get the point)

auto identity = std::make_shared(cfg);
auto throwaway = co_await identity->createIdentity("test");
// ... do something with the identity ...
co_await identity->deleteIdentity("test");

CADET support

Yes! I got CADET working!! P2P messaging have not been easier. Took me much effort to bend the system enbough. You can now write code like this:

(client side)

auto cadet = std::make_shared(cfg);
// Connect to a peer and specify the message type we are willing to receive
auto channel = co_await cadet->connect("peerid", "port-name", {GNUNET_MESSAGE_TYPE_CADET_CLI});
channel->onReceive([](const std::string_view data, uint16_t type) {
    // Do something with the data
});
channel->send("Hello world!", GNUNET_MESSAGE_TYPE_CADET_CLI);

The design is heavily inspired by Trantor, a C++14 network library I help maintain. And a massive does of personal preference is added to the mix. For example, server side handlers set to the cadet object is treaded as the default handler. If you want to override it, you can do so by a per-channel basis. This does not apply to client side handlers.

// set a different handler because.. reasons
cadet->setConnectedCallback([](const CADETChannelPtr& channel) {
    // every once in a while, we'll dump the data to stderr
    if(rand() % 10 == 0) {
        channel->setReceiveCallback([](const std::string_view data, uint16_t type) {
            std::cerr << "I'm a bad person" << std::endl;
        });
    }
});

// This is the default message handler
cadet->setReceiveCallback([](CADETChannel* channel, const std::string_view data, uint16_t type) {
    std::cout << data << std::flush;
});

Misc

Next steps

A few things I want to do next:

=> =

Right, I've been goofing on the FS tool a little. You won't believe what I found on there. Literal hentai and dick pics. Classic

Proxy Information
Original URL
gemini://gemini.clehaxze.tw/gemlog/2022/12-24-christmas-update-gnunetpp.gmi
Status Code
Success (20)
Meta
text/gemini
Capsule Response Time
1435.718398 milliseconds
Gemini-to-HTML Time
0.81873 milliseconds

This content has been proxied by September (3851b).