Program Listing for File IWebSocket.h

Return to documentation for file (axr.sdk/net/IWebSocket.h)

// Copyright (C) AcceleratXR, Inc. All rights reserved.
#pragma once

#include <cpprest/asyncrt_utils.h>
#include <variant>
#include <vector>

namespace axr {
namespace sdk {
namespace net {

enum class WebSocketStatus
{
    NOT_CONNECTED,
    CONNECTING,
    CONNECTED,
    FAILED
};

enum class WebSocketCloseStatus
{
    NORMAL,
    FAILURE
};

enum class WebSocketMessageType
{
    BINARY,
    TEXT
};

class IWebSocketMessage
{
public:
    virtual std::vector<uint8_t> GetData() const = 0;

    virtual utility::string_t GetString() const = 0;

    virtual WebSocketMessageType GetType() const = 0;

    virtual pplx::task<std::vector<uint8_t>> ExtractData() const = 0;

    virtual pplx::task<utility::string_t> ExtractString() const = 0;
};

class OutgoingWebSocketMessage : public IWebSocketMessage
{
private:
    std::variant<utility::string_t, std::vector<uint8_t>> m_Value;
public:
    OutgoingWebSocketMessage(std::variant<utility::string_t, std::vector<uint8_t>> value)
        : m_Value(value)
    {
    }

    virtual ~OutgoingWebSocketMessage()
    {
    }

    virtual std::vector<uint8_t> GetData() const override
    {
        return std::get<std::vector<uint8_t>>(m_Value);
    }

    virtual utility::string_t GetString() const override
    {
        return std::get<utility::string_t>(m_Value);
    }

    virtual WebSocketMessageType GetType() const override
    {
        return m_Value.index() == 0 ? WebSocketMessageType::TEXT : WebSocketMessageType::BINARY;
    }

    virtual pplx::task<std::vector<uint8_t>> ExtractData() const override
    {
        return pplx::create_task([=]()
        {
            return std::get<std::vector<uint8_t>>(m_Value);
        });
    }

    virtual pplx::task<utility::string_t> ExtractString() const override
    {
        return pplx::create_task([=]()
        {
            return std::get<utility::string_t>(m_Value);
        });
    }
};

class IWebSocket
{
public:
    typedef std::function<void(WebSocketCloseStatus, const utility::string_t&)> CloseCallback;

    typedef std::function<void(std::shared_ptr<IWebSocketMessage>)> MessageCallback;

    virtual std::vector<CloseCallback>::const_iterator AddCloseHandler(CloseCallback callback) = 0;

    virtual void RemoveCloseHandler(std::vector<CloseCallback>::const_iterator iter) = 0;

    virtual std::vector<MessageCallback>::const_iterator AddMessageHandler(MessageCallback callback) = 0;

    virtual void RemoveMessageHandler(std::vector<MessageCallback>::const_iterator iter) = 0;

    virtual pplx::task<void> Connect(utility::string_t uri) = 0;

    virtual pplx::task<void> Close() = 0;

    virtual WebSocketStatus GetStatus() = 0;

    virtual pplx::task<void> Send(std::shared_ptr<IWebSocketMessage> message) = 0;
};

} // namespace net
} // namespace sdk
} // namespace axr