168 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
const { Client } = require("../Client.js");
 | 
						||
let {randomUUID} = require("crypto");
 | 
						||
let {addService,addListener} = require("../WebSocket.js");
 | 
						||
const { Room } = require("./Room.js");
 | 
						||
 | 
						||
/*
 | 
						||
Peer to peer veri aktarımı
 | 
						||
 | 
						||
- Kişiden kişiye direkt veri aktarımı
 | 
						||
- Kişiler arası tünelleme / Kişiler arası özel protokol
 | 
						||
- Oda katılımcıları içerisinde veri aktarımı
 | 
						||
- Oda katılımcıları arasında belli kişilere veri aktarımı
 | 
						||
 | 
						||
*/
 | 
						||
 | 
						||
addService(({
 | 
						||
    client,
 | 
						||
    end,
 | 
						||
    global,
 | 
						||
    message,
 | 
						||
    next,
 | 
						||
    response,
 | 
						||
    messageId
 | 
						||
}) => {
 | 
						||
    let {type} = message;
 | 
						||
    switch(type)
 | 
						||
    {
 | 
						||
        case "pack/to":{
 | 
						||
            let {to,pack,handshake} = message;
 | 
						||
 | 
						||
            if(!client.packReadable()){
 | 
						||
                console.error("Okunabilir olmayan client bir mesaj iletiyor")
 | 
						||
                handshake && end({
 | 
						||
                    type: 'fail'
 | 
						||
                })
 | 
						||
            }
 | 
						||
            
 | 
						||
            if(Client.clients.has(to))
 | 
						||
            {
 | 
						||
                let otherPeer = Client.clients.get(to);
 | 
						||
                if(otherPeer.requiredPair)
 | 
						||
                {
 | 
						||
                    if(!otherPeer.pairs.has(to))
 | 
						||
                    {
 | 
						||
                        console.error("Client, güvenilir olmayan bir cliente mesaj iletiyor")
 | 
						||
                        return handshake && end({
 | 
						||
                            type: 'fail'
 | 
						||
                        })
 | 
						||
                    }
 | 
						||
                }else{
 | 
						||
                    if(!otherPeer.pairs.has(to))
 | 
						||
                    {
 | 
						||
                        otherPeer.pairs.add(client.id);
 | 
						||
                        client.pairs.add(otherPeer.id);
 | 
						||
                    }
 | 
						||
                }
 | 
						||
 | 
						||
                if(!otherPeer.packWriteable()){
 | 
						||
                    console.error("Client, yazılabilir olmayan bir cliente mesaj iletiyor")
 | 
						||
                    handshake && end({
 | 
						||
                        type: 'fail'
 | 
						||
                    })
 | 
						||
                }
 | 
						||
                otherPeer.send([{
 | 
						||
                    from: client.id,
 | 
						||
                    pack: pack
 | 
						||
                }, 'pack']);
 | 
						||
                handshake && end({
 | 
						||
                    type: 'success'
 | 
						||
                })
 | 
						||
            }else{
 | 
						||
                console.error("Client, olmayan bir cliente mesaj iletiyor")
 | 
						||
                handshake && end({
 | 
						||
                    type: 'fail'
 | 
						||
                })
 | 
						||
            }
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case "request/to":{
 | 
						||
            let {to,pack} = message;
 | 
						||
            if(Client.clients.has(to))
 | 
						||
            {
 | 
						||
                let otherPeer = Client.clients.get(to);
 | 
						||
                if(otherPeer.requiredPair)
 | 
						||
                {
 | 
						||
                    if(!otherPeer.pairs.has(to))
 | 
						||
                    {
 | 
						||
                        console.error("Client, güvenilir olmayan bir clientden veri istiyor")
 | 
						||
                        return handshake && end({
 | 
						||
                            type: 'fail'
 | 
						||
                        })
 | 
						||
                    }
 | 
						||
                }else{
 | 
						||
                    otherPeer.pairs.add(client.id);
 | 
						||
                    client.pairs.add(otherPeer.id);
 | 
						||
                }
 | 
						||
                otherPeer.send([{
 | 
						||
                    from: client.id,
 | 
						||
                    pack: pack,
 | 
						||
                    id:messageId
 | 
						||
                }, 'request']);
 | 
						||
            }else console.error("request/to error not finded Peer");
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case "response/to":{
 | 
						||
            let {to,pack, id} = message;
 | 
						||
            if(Client.clients.has(to))
 | 
						||
            {
 | 
						||
                let otherPeer = Client.clients.get(to);
 | 
						||
                if(otherPeer.requiredPair && !otherPeer.pairs.has(to))
 | 
						||
                {
 | 
						||
                    console.error("response istenen peer güvenli değil")
 | 
						||
                    return;
 | 
						||
                }
 | 
						||
                otherPeer.send([{
 | 
						||
                    from: client.id,
 | 
						||
                    pack: pack
 | 
						||
                }, id]);
 | 
						||
            }else console.error("response/to error not finded Peer");
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case "pack/room":{
 | 
						||
            let {to,pack, handshake,wom} = message;
 | 
						||
 | 
						||
 | 
						||
            if(!client.packReadable()){
 | 
						||
                console.error("Client paketi okumak için müsait değil")
 | 
						||
                handshake && end({
 | 
						||
                    type: 'fail'
 | 
						||
                })
 | 
						||
            }
 | 
						||
 | 
						||
            if(Room.rooms.has(to))
 | 
						||
            {
 | 
						||
                if(!client.rooms.has(to))
 | 
						||
                {
 | 
						||
                    console.error("Client katılmadığı bir odaya mesaj iletiyor")
 | 
						||
                    return handshake && end({
 | 
						||
                        type: 'fail'
 | 
						||
                    })
 | 
						||
                };
 | 
						||
                Room.rooms.get(to).send(
 | 
						||
                    [
 | 
						||
                        {
 | 
						||
                            from: to,
 | 
						||
                            pack: pack,
 | 
						||
                            sender: client.id
 | 
						||
                        }, 'pack/room'
 | 
						||
                    ],
 | 
						||
                    wom ? client.id : void 0,
 | 
						||
                    client => client.packWriteable()
 | 
						||
                );
 | 
						||
                handshake && end({
 | 
						||
                    type: 'success'
 | 
						||
                })
 | 
						||
            }else{
 | 
						||
                console.error("Olmayan oda için veri gönderme isteniyor")
 | 
						||
                handshake && end({
 | 
						||
                    type: 'fail'
 | 
						||
                })
 | 
						||
            }
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        default:{
 | 
						||
            next();
 | 
						||
        }
 | 
						||
    };
 | 
						||
}); |