• Как подключить пользователя к сокетам по invite-ссылке?

    @Sarclin Автор вопроса
    Решил. Если вдруг кому понадобится - пример как можно решить. Здесь ограничение на 2 пользователя в одной комнате и некоторая "защита" от подключения в не созданную комнату. Не допилил удаление комнаты после дисконнекта пользователя.
    Сервер:
    var app = require('http').createServer(handler),
    io = require('socket.io').listen(app),
    fs = require('fs'),
    url = require('url');
    
    app.listen(8080);
    
    function handler(req, res) {
    	var urlParse = url.parse(req.url);
    	if (urlParse.path == '/') {
    		//если пользователь зашел на главную
    		fs.readFile(__dirname + '/index.html',
    		function(err, data) {
    			if (err){
    				res.writeHead(404);
    				return res.end('Page doesn\'t exist - 404');
    			} else {
    			res.writeHead(200, {'Content-Type': 'text/html'});
    				//отдаем страницу клиенту
    				res.write(data,'utf8');
    				res.end();
    			}
    		});
    	} else if (urlParse.search) {
    		fs.readFile(__dirname + '/index.html',
    		function(err, data) {
    			if (err){
    				res.writeHead(404);
    				return res.end('Page doesn\'t exist - 404');
    			} else {
    			res.writeHead(200, {'Content-Type': 'text/html'});
    				//отдаем страницу клиенту
    				res.write(data,'utf8');
    				res.end();
    			}
    		});
    	} else {
    		res.writeHead(404);
    		res.write('Page doesn\'t exist - 404');
    		res.end();
    	}
    };
    var rooms = [];
    io.sockets.on('connection', function(socket) {
    	//событие подключение нового пользователя
    	socket.on('connect_new_user', function() {
    		//генерируем id комнаты
    		var room = Math.round(Math.random() * 1000000);
    		//подключаем сокет к комнате
    		socket.join(room);
    		//отправляем клиенту id комнаты
    		socket.emit('addRoom', {'room': room});
    		addRoom(room);
    	});
    	//событие подключение второго пользователя
    	socket.on('connect_second_user', function(data) {
    		//получаем к-во пользователей в комнате
    		var playersCount =  io.clients(function(err, clients) {
    			if(err) throw error;
    		});
    		//если кол-во пользователей в комнате 2 или более - комната полна
    		if (playersCount.server.eio.clientsCount-1 >= 2) {
    			console.log('Room is full');
    			return;
    		} 
    		if (!containsTheRoom(data.roomId)) {
    			socket.emit('message', {message: 'Room not found'});
    		} else {
    		//если нет - подключаем пользователя к комнате с переданным id
    			socket.join(data.roomId);
    		//отправляем сообщение всем
    			io.sockets.to(data.roomId).emit('message', {message: 'message for all'});
    		//и себе
    			socket.to(data.roomId).emit('message', {message: 'message for you'});
    			console.log('connect in room');
    		}
    		console.log(rooms);
    	});
    });
    
    function addRoom(roomId) {
    	rooms.push(roomId);
    }
    function containsTheRoom(roomId) {
    	for (var i=0; i < rooms.length; i++) {
    		if (rooms[i] == roomId) {
    			return true;
    		} else {
    			return false;
    		}
    	}
    }


    Клиент:

    <!doctype html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<script src="/socket.io/socket.io.js"></script>
    	</head>
    	<body>
    		<script>
    			var socket = io.connect('http://localhost:8080');
    
    			socket.on('connect', function() {
    				var path = window.location.search;
    				if (path == '') {
    					socket.emit('connect_new_user');
    				} else {
    					socket.emit('connect_second_user', {'roomId': path.substr(1)});
    				}
    			});
    			socket.on('addRoom', function(data) {
    				document.querySelector('#output').innerHTML=
    				window.location.href+'?'+data.room;
    			});
    			socket.on('message', function(data) {
    				document.write(data.message);
    			});
    		</script>
    		<div id="output"></div>
    	</body>
    </html>
    Ответ написан
    Комментировать