Skip to content

ipfs_pubsub/ipfs_pubsub.cpp

Functions

Name
const std::string logger_config(R"(# ----------------sinks: - name: console type: console color: truegroups: - name: gossip_pubsub_test sink: console level: error children: - name: libp2p - name: Gossip# ---------------- )" )
int main(int argc, char * argv[])

Functions Documentation

function logger_config

const std::string logger_config(
    R"(# ----------------sinks:  - name: console    type: console    color: truegroups:  - name: gossip_pubsub_test    sink: console    level: error    children:      - name: libp2p      - name: Gossip# ----------------  )" 
)

function main

int main(
    int argc,
    char * argv[]
)

Source code

#include "ipfs_pubsub/gossip_pubsub.hpp"
#include <iostream>
#include <spdlog/sinks/basic_file_sink.h>
#include <libp2p/log/configurator.hpp>
#include <libp2p/log/logger.hpp>
#include <libp2p/injector/host_injector.hpp>
#include <libp2p/multi/multibase_codec/multibase_codec_impl.hpp>
#include "crdt/globaldb/globaldb.hpp"
#include "crdt/globaldb/keypair_file_storage.hpp"
#include <libp2p/host/basic_host.hpp>

using GossipPubSub = sgns::ipfs_pubsub::GossipPubSub;
const std::string logger_config(R"(
# ----------------
sinks:
  - name: console
    type: console
    color: true
groups:
  - name: gossip_pubsub_test
    sink: console
    level: error
    children:
      - name: libp2p
      - name: Gossip
# ----------------
  )");

int main(int argc, char* argv[])
{
    // prepare log system
    auto logging_system = std::make_shared<soralog::LoggingSystem>(
        std::make_shared<soralog::ConfiguratorFromYAML>(
            // Original LibP2P logging config
            std::make_shared<libp2p::log::Configurator>(),
            // Additional logging config for application
            logger_config));
    logging_system->configure();



    libp2p::log::setLoggingSystem(logging_system);
    libp2p::log::setLevelOfGroup("gossip_pubsub_test", soralog::Level::ERROR_);
    libp2p::protocol::gossip::Config config;
    config.echo_forward_mode = true;
    std::vector<std::string> receivedMessages;

    auto pubs = std::make_shared<sgns::ipfs_pubsub::GossipPubSub>(
        sgns::crdt::KeyPairFileStorage("CRDT.Datastore.TEST/pubs_dapp").GetKeyPair().value());
    auto pubs2 = std::make_shared<sgns::ipfs_pubsub::GossipPubSub>(
        sgns::crdt::KeyPairFileStorage("CRDT.Datastore.TEST2/pubs_processor").GetKeyPair().value());
    pubs2->Start(40002, { pubs->GetLocalAddress(), "",});
    pubs->Start(40001, { pubs2->GetLocalAddress(), "",});
    std::string topic = "SuperGenius";
    auto pubsTopic1 = pubs->Subscribe(topic, [&](boost::optional<const GossipPubSub::Message&> msg)
        {
            if (msg)
            {
                std::string message(reinterpret_cast<const char*>(msg->data.data()), msg->data.size());
                std::cout << "Pubs 1 Got message: " << message << std::endl;
                std::cout << "Choose pubsub to send message (1 for pubs, 2 for pubs2, 3 to quit): ";
                receivedMessages.push_back(std::move(message));
            }
        });
    auto pubsTopic2 = pubs2->Subscribe(topic, [&](boost::optional<const GossipPubSub::Message&> msg)
        {
            if (msg)
            {
                std::string message(reinterpret_cast<const char*>(msg->data.data()), msg->data.size());
                std::cout << "Pubs 2 Got message: " << message << std::endl;
                std::cout << "Choose pubsub to send message (1 for pubs, 2 for pubs2, 3 to quit): ";
                receivedMessages.push_back(std::move(message));
            }
        });
    //std::string message("Hello Pubsub");
    //pubs.Publish(topic, std::vector<uint8_t>(message.begin(), message.end()));
    auto publishMessage = [&](GossipPubSub& pubsub) {
        std::string message;
        std::cout << "Enter message to send: ";
        std::getline(std::cin, message);
        std::vector<uint8_t> messageData(message.begin(), message.end());
        pubsub.Publish(topic, messageData);
        };
    std::cout << "Choose pubsub to send message (1 for pubs, 2 for pubs2, 3 to quit): ";
    while (true) {
        //std::cout << "Choose pubsub to send message (1 for pubs, 2 for pubs2, 3 to quit): ";
        int choice;
        std::cin >> choice;
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

        if (choice == 1) {
            publishMessage(*pubs);
        }
        else if (choice == 2) {
            publishMessage(*pubs2);
        }
        else if (choice == 3) {
            break;
        }
        else {
            std::cout << "Invalid choice. Please enter 1, 2, or 3." << std::endl;
        }
    }
}

Updated on 2026-04-13 at 23:22:46 -0700