forked from boostorg/beast
		
	
		
			
	
	
		
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2018 Vinnie Falco (vinnie dot falco at gmail dot com)
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0. (See accompanying
							 | 
						||
| 
								 | 
							
								// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Official repository: https://github.com/vinniefalco/CppCon2018
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "shared_state.hpp"
							 | 
						||
| 
								 | 
							
								#include "websocket_session.hpp"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								shared_state::
							 | 
						||
| 
								 | 
							
								shared_state(std::string doc_root)
							 | 
						||
| 
								 | 
							
								    : doc_root_(std::move(doc_root))
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								shared_state::
							 | 
						||
| 
								 | 
							
								join(websocket_session* session)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    std::lock_guard<std::mutex> lock(mutex_);
							 | 
						||
| 
								 | 
							
								    sessions_.insert(session);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								shared_state::
							 | 
						||
| 
								 | 
							
								leave(websocket_session* session)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    std::lock_guard<std::mutex> lock(mutex_);
							 | 
						||
| 
								 | 
							
								    sessions_.erase(session);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Broadcast a message to all websocket client sessions
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								shared_state::
							 | 
						||
| 
								 | 
							
								send(std::string message)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Put the message in a shared pointer so we can re-use it for each client
							 | 
						||
| 
								 | 
							
								    auto const ss = boost::make_shared<std::string const>(std::move(message));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Make a local list of all the weak pointers representing
							 | 
						||
| 
								 | 
							
								    // the sessions, so we can do the actual sending without
							 | 
						||
| 
								 | 
							
								    // holding the mutex:
							 | 
						||
| 
								 | 
							
								    std::vector<boost::weak_ptr<websocket_session>> v;
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        std::lock_guard<std::mutex> lock(mutex_);
							 | 
						||
| 
								 | 
							
								        v.reserve(sessions_.size());
							 | 
						||
| 
								 | 
							
								        for(auto p : sessions_)
							 | 
						||
| 
								 | 
							
								            v.emplace_back(p->weak_from_this());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // For each session in our local list, try to acquire a strong
							 | 
						||
| 
								 | 
							
								    // pointer. If successful, then send the message on that session.
							 | 
						||
| 
								 | 
							
								    for(auto const& wp : v)
							 | 
						||
| 
								 | 
							
								        if(auto sp = wp.lock())
							 | 
						||
| 
								 | 
							
								            sp->send(ss);
							 | 
						||
| 
								 | 
							
								}
							 |