7 mwsepeer
saqut edited this page 2025-12-07 13:37:31 +03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

MWSE Peer sistemi

MWSE sunucularında Websocket bağlantısı açan tüm clientler birer peer olarak tanımlanır. Bir client birden fazla kez sunucuya bağlanabileceği için birden fazla peer tek bir cihazda fazlı peerleri tanımlıyor olabilir

Hem kendi peer özniteliğinize ulaşmak için hemde diğer peerlere ulaşmak için aynı apiyi kullanabilirsiniz

Kendiniz 'me' anahtar sözcüğüyle alabilirsiniz. Herkesin sunucu tarafında oluşturulan tekil kodları socketId olarak saklanır

mwse.scope(()=>{
	let selfpeer = mwse.peer('me');
    selfpeer.socketId // --> Örnek "fa9b039e-29bf-4861-8bee-54c2c64ded19"
})

Arkaplanda tüm peerler birbirleriyle bu IDler ile haberleşmelerine rağmen MWSE soyutlama katmanları ekler

Peerlar arası iletişim

let otherPeer = mwse.peer('fa9b039e-29bf-4861-8bee-54c2c64ded19');

// Mesaj göndermek için son derece basit olan peer.send komutunu kullanabilirsiniz. Bu JSON'a çevrilebilecek tüm verileri orjinal formunda iletir

otherPeer.send("Hi '");

orherPeerden gelen mesajları dinlemek için message eventini dinlemeniz gerekir.

Bu peer.on('message') eventi YALNIZCA otherPeer tarafından size direkt gönderilen mesajları içerir. Bir oda içerisinden gönderilen mesaj burayı tetiklemez.

otherPeer.on('message', data => {
	console.log(data) // --> Örneğin "Hi !"
	// otherPeerden gelen mesaj "data"
})

Peerlerin birbirlerini doğrulaması

Temelde iki peer birbirlerine herhangi bir mesaj ilettiklerinde yada pair oldukları andan itibaren birbirlerini izlerler. Eğer iki tarafdan birisi sunucudan kopar ise diğer tarafda disconnect eventi tetiklenir

otherPeer.on('disconnect', () => {
	// otherPeer şuanda offline veya sokette yok
})


// Ayrıca bir event bağlamadanda online olup olmadığını sorgulayabilirsiniz
// Bu metot true ise peer halen içeridedir eğer false dönüyorsa kopmuştur
await otherPeer.isReachable()

Peerler arasında tünelleme

MWSE peerler arasında tünelleme kurar ve böylece arada bir sunucu olduğunu developerlara unutturmayı hedefler. Buradaki amaç iki peer arasındaki iletişimi request/response şeklinde kurabilmektir.

Bunun faydası bir peer diğer peerden veri almak istediğinde veya peerler birbirlerini veri kaynağı olarak kullanacakları sırada istenen veriler ile cevap verilen verilerin birbirlerine karışmasını önlemektir

Peer1 -----Question1-----> Peer2
Peer1 -----Question2-----> Peer2
Peer1 <-----Answer2------- Peer2
Peer1 <-----Answer1------- Peer2

Çalışma şekli

Peer2

peer1.on('request', request => {
	// request.body // -----> peer1 tarafında gönderilen veri
    // request.peer // -----> Hangi peerin gönderdiği
    // request.response(5) -> Talebe verilecek cevap
    if(request.body.type == "addition")
    {
    	// addition verisi geldiğinde number1 ve number2nin toplamını cevap olarak gönderecek bir düzenek kuruyoruz
    	request.response(
        	request.body.number1 + request.body.number2
        )
    }
})

Peer1 tarafında Peer2'nin işleyeceği veri gönderilir ve peer2nin bu mesaja cevap vermesi beklenir

let answer = await peer2.request({
	type: "addition",
	number1: 1,
    number2: 5
});

// Peer2den istenen veri, peer2 tarafında işlenip response olarak döndüğünde sunucu bunu anında iletir ve kod bu noktadan akmaya devam eder burdaki answer değeri response içeridir

console.log(answer) // --> 6

Burdaki developerin çözmesi gereken sorunlardan birisi eğer peer2 requeste cevap veremezse algoritmanın Promise'yi hiç bir zaman resolve etmeyeceğidir. Bu durumda peer2 requesti gittiğinde eğer peer2 soketten düşerse algoritma sonsuza kadar bekleyecektir

Peerler arası güvenlik

Eğer senaryonuzda peerler arasında rastgele mesajlaşma yoksa peerler arasındaki iletişimi koşullayabilirsiniz. MWSE peerlerin güvenliği için pair-auth sistemi kullanır, bu sistem eşleşme talebi iletilmesi, talebin karşı tarafça onaylanması ve opsiyonel olarak oturumun sonlandırılmasını içerir.

Bu sistem ön tanımlı olarak aktif olarak gelir ve kullanmadınız senaryolarda mwse.disablePairAuth() kullanarak pair-auth sistemini kendiniz için kapatabilirsiniz

Peer1 ---Pair Request---> Peer2
Peer1 <---Accepted Pair-- Peer2

Pair sistemi Peerlere özeldir ve tüm peerler etkileşime geçmek için pair-auth istemeyebilir. Bunu her peer için enablePairAuth() disablePairAuth() sistemleri ile birlikte açıp kapatabilirsiniz.

Bir peer pair-auth sistemi kullanıyorsa ona göndermek üzere ilettiğiniz tüm mesajları MWSE görmezden gelir. Sadece onunda dahil olduğu bir grub içerisinden herkese ileteceğiniz mesajlarını gönderilir.

pair-auth sistemini kullanan bir peer'a ulaşmak için öncelikle requestPair() metodunu kullanara eşleşme talep etmeli kabul edildiği takdirde iletişime geçmelisiniz

Diğer yandan pair-auth kullanan peer; gelen talepleri kabul etmek için request/pair eventini dinleyebilir gelen talepleri takip eder ve acceptPair() ile onaylar, rejectPair() ile reddeder veya endPair() ile var olan eşlemeyi sonlandırabilir

requestPair()

// Odaya katılan peerleri izle
room.on('join', peer => {
	// Katılan peere direkt mesaj göndermek için eşleşme isteği gönder
    peer.requestPair();
    
    // Peer özelinde kabul edilip edilmediğini takip edebilirsiniz
    peer.on('accepted/pair', peer => {
    	// Peer eşleşmeyi kabul etti
    })
    peer.on('end/pair', peer => {
    	// Peer eşleşmeyi reddetti veya sonlandırdı
    })
});

// Bunun yanı sıra tüm sistem genelinde eşleşmeyi takip edebilirsiniz
mwse.on('accepted/pair', peer => {
	// Peer eşleşmeyi kabul etti
})
mwse.on('end/pair', peer => {
	// Peer eşleşmeyi reddetti veya sonlandırdı
})

Accept pair / Reject pair / Endpair

// Gelen pair isteklerini genelde dinleyebilirsiniz
mwse.on('request/pair', peer => {
	// Peer eşleşme isteği gönderdi
})

// Veya peer özelinde eşleşme isteğini dinleyebilirsiniz
peer2.on('request/pair', peer => {
	// Peer eşleşme isteği gönderdi
});


// Burda eşleşme istekleri sırasında yapabileceğiniz 2 şey vardır kabul etmek veya reddetmek

// Eşleşme isteğini kabul etmek için acceptPair kullanılır
await peer.acceptPair();

// Eşleşme isteğini reddetmek etmek için acceptPair kullanılır
await peer.rejectPair();

// Bir isteği kabul ettikten bir süre sonra tekrar eşleşme listesinden çıkarabilirsiniz
// Burda endPair kullanılabilir
// Bu işlem peerden direkt gelen tüm mesajların engellenmesine neden olur
await peer.endPair();

Önemli not

Bir eşleşmeyi onaylamak onu güvenilen listesine eklemeniz için eşleşme talebinin iletilmesine gerek yoktur. Bir peer diğer peeri olduğu gibi onaylayabilir

Aşağıdaki kod bir peerin odanın içerisinde bulunan tüm peerlerin özeldende mesaj iletmesini onaylamasına sebep olur

room.on('join', peer => {
    peer.acceptPair();
});
for(let peer of await room.fetchPeers()){
	peer.acceptPair();
};

// room odasındaki herkes pair-auth onaylanmıştır

Bunun yan etkisi olara odaya katılan herkese bu peer tarafından onaylandığı haberide gönderilecektir

Peer info / Peerlerin meta verisi

MWSE sistemi her peeri tanımlamak için tekil socketId verisi kullanır ancak reelde bu geliştiriciler için yeterli değildir ve ayrıca peerlerin birbirlerini tanımlamak için mesaj iletmesi her zaman doğru bir fikir olmayabilir.

Bazı senaryolarda bir peerin adı soyadı avatarı gibi veriler, bazı senaryolarda ise token, gate, user_id gibi sistemsel veriler paylaşılabilir. Bu info sistemi pair-auth sisteminin dışında olduğu için herkese açık bir metaveridir, gizliliğin önemli olduğu alanlarda kullanmayın !

Kendi bilgilerinizi belirlemek ve değiştirmek için info arayüzünü kullanabilirsiniz

// Kendi peer objeniz
let myself = mwse.peer('me');

// Kendi verilerinize yazmak için set kullanın
await myself.info.set("name","John");
await myself.info.set("surname","Smith");

// Kendi verinizi almak için get kullanın
await myself.info.get("name") // --> John

// get parametresine veri sağlamamanız obje halinde veriyi almanıza sebep olur
await myself.info.get() // --> {name:"John",surname:"Smith"}

Başka bir peerin infosuna erişme

// Farklı bir peer
let myself = mwse.peer('6cb11af8-caf7-419a-89b9-956eddd74277');

// Kendi verinizi almak için get kullanın
await myself.info.get("name") // --> John

// get parametresine veri sağlamamanız obje halinde veriyi almanıza sebep olur
await myself.info.get() // --> {name:"John",surname:"Smith"}

Önemli not

Farklı bir peerin metaverileri sizin için readonlydir ve eğer değiştirmeye çalışırsanız MWSE bunu kendi peerinizin verisini değiştirme olarak yorumlar yani aşağıdaki iki kod aynı şeyi yapar

mwse.peer('6cb11af8-caf7-419a-89b9-956eddd74277').info.set("value", 0)
mwse.peer('me').info.set("value", 0)

Farklı bir peerin infosunun değişmesi sizin için anlık bildirilmesi gereken bir şey ise MWSE bunun içinde destek sağlar zira eşleştiğiniz tüm pairlerin bilgilerin değişimi zaten size anlık güncellenir ve ayrıca sizin infonuzu değiştirmeniz tüm eşleşmelerinize anlık bildirilir

let peer = mwse.peer('6cb11af8-caf7-419a-89b9-956eddd74277');
peer.on('info', (name, value) => {
	// peerin infosundaki `name` değeri `value` olarak belirlendi
})