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
})
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.
Frontend API
- mwse.server : Connection
- mwse.WSTSProtocol : WSTSProtocol
- mwse.EventPooling : EventPool
- mwse.rooms : Map<string, Room>
- mwse.pairs : Map<string, Peer>
- mwse.peers : Map<string, Peer>
- mwse.virtualPressure : VirtualPressure
- mwse.me : Peer
- mwse.destroy
- mwse.enableRecaiveData
- mwse.disableRecaiveData
- mwse.enableSendData
- mwse.disableSendData
- mwse.enableNotifyRoomInfo
- mwse.disableNotifyRoomInfo
- mwse.request
- mwse.response
- mwse.room
- mwse.peer