/PhxSocketCPP

A C++ library to communicate with Phoenix Channels

Primary LanguageC++GNU General Public License v3.0GPL-3.0

This fork is designed to work within OpenFrameworks projects. json.hpp has been removed as it is included within OpenFrameworks as ofJson. EasyLogging has been removed to instead use OF’s own logging.

Intro

PhoenixClient is ready for use with Phoenix Framework v1.0.0. The PhoenixClient enables communication with a phoenix framework web project through the use of channels over websocket.

Learn more about the Phoenix Framework at http://www.phoenixframework.org/

Example Usage

#ifndef Network_H
#define Network_H

#include "PhxSocket.h"
#include <memory>

class PhxChannel;

class Network : public std::enable_shared_from_this<PhxSocketDelegate>,
                public PhxSocketDelegate {
private:
    // PhxSocketDelegate
    void phxSocketDidOpen();
    void phxSocketDidClose(const std::string& event);
    void phxSocketDidReceiveError(const std::string& error);
    // PhxSocketDelegate

    /*!< This is the main entry point of communication over Phoenix Channels. */
    std::shared_ptr<PhxChannel> channel;

public:
    /**
      *  \brief Trigger start of Network connection.
      *
      *  Detailed description
      *
      *  \param param
      *  \return return type
      */
    void start();
};

#endif // Network_H
#include "Network.h"
#include "PhxChannel.h"
#include "PhxPush.h"
#include "PhxSocket.h"
#include "easylogging++.h"
#include <iostream>

void Network::start() {
    std::shared_ptr<PhxSocket::PhxSocket> socket
        = std::make_shared<PhxSocket::PhxSocket>(
            "ws://localhost:4000/socket/websocket", 1);
    socket->setDelegate(this->shared_from_this());

    this->channel = std::make_shared<PhxChannel::PhxChannel>(
        socket, "room:1", std::map<std::string, std::string>());
    this->channel->bootstrap();

    // Instantiate the PhxChannel first before connecting on the socket.
    // This is because the connection can happen before the channel
    // is done instantiating.
    socket->connect();
}

void Network::phxSocketDidOpen() {
    LOG(INFO) << "phxSocketDidOpen";
    this->channel->join()
        ->onReceive("ok",
            [](nlohmann::json json) {
                LOG(INFO) << "Received OK on join:" << json.dump() << std::endl;
            })
        ->onReceive("error", [](nlohmann::json error) {
            LOG(INFO) << "Error joining: " << error << std::endl;
        });
}

void Network::phxSocketDidClose(const std::string& event) {
    LOG(INFO) << "phxSocketDidClose" << std::endl;
}

void Network::phxSocketDidReceiveError(const std::string& error) {
    LOG(INFO) << "phxSocketDidReceiveError" << std::endl;
}

Requirements

Json Library

https://github.com/nlohmann/json

Logging

https://github.com/muflihun/easyloggingpp

Websocket Client

https://github.com/dhbaird/easywsclient

Thread Pool

https://github.com/progschj/ThreadPool

Credit

ObjCPhoenixClient

https://github.com/livehelpnow/ObjCPhoenixClient

License

Copyright (C) 2017-2018 James N.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.