diff --git a/mwseroom.md b/mwseroom.md new file mode 100644 index 0000000..3561e4f --- /dev/null +++ b/mwseroom.md @@ -0,0 +1,209 @@ +# MWSE Oda sistemi + +## Oda ayrıntıları + +```ts +interface IRoomOptions { + name: string; + description?:string; + joinType: "free"|"invite"|"password"|"lock"; + credential?: string; + ifexistsJoin?: boolean; + accessType?: "public"|"private"; + notifyActionInvite?: boolean; + notifyActionJoined?: boolean; + notifyActionEjected?: boolean; + autoFetchInfo?:boolean +} + +mwse.room(room : IRoomOptions); + +``` +Odayı oluşturan peerin yapacağı zorunlu ayarlar bunlardır +- `name` Odanın ismidir ve tekildir +- `description` Odanın açıklaması +- `joinType` odaya katılma metodunu belirler + - `free` odaya herkes anında katılabilir + - `invite` bir peer odaya sadece başka bir peerin davet/kabul işlemiyle dahil edebilir + - `password` bir şifreyi bilen herkes katılabilir + - `lock` oda katılma durumlarına kapalı, kimse katılamaz +- `accessType` odanın herkese açık olup olmadığı `public` herkese açık, `private` gizli oda + +Odayı oluşturan veya katılmak isteyen peerin yapacağı ayarlar bunlardır + +- `credential` odanın şifresi +- `notifyActionInvite` Davet bildirimlerin almak isteyip istemediğini belirtir +- `notifyActionJoined` Odaya katılan her peer için anlık olarak bildirim almasını belirler +- `notifyActionEjected` Odadan ayrılan her peer için anlık olarak bildirim almasını belirler +- `autoFetchInfo` Oda ile ilgili bilgilerin frontend tarafında otomatik güncellemesini ayarlar +- `ifexistsJoin` Create aşamasında eğer oda zaten varsa join olmak istediğini belirtir + +Daha gelişmiş ayar + +## Odaya oluşturma, katılma, ayrılma ve kapatma + +```js +// Odayı oluşturmak veya katılmak için öncelikle meta bilgileri gerekiyor +// MWSEde oda üst bilgisi için mwse.room yetiyor +let room = mwse.room({ + name: "room-global-mm3-y5e", + description: "Empty description", + joinType: "free", + ifexistsJoin: true +}); + +// Odayı oluşturmak için .createRoom() yetiyor +// Oda bu aşamada oluşturulur veya hata fırlatır +await room.createRoom(); + + +// Var olan bir odaya katılmak için join() komutu yeterlidir +await room.join(); + +// Odadan ayrılmak için eject() yeterlidir +await room.eject(); + + +// MWSE içerisinde tüm odalar en az 1 peer gerektirir, tüm peerler bir odadan çıktığında oda otomatik kapatılır. Bu işlem odadaki son peerin çıkması ile anlık gerçekleşir. + + +``` + +## Odayı kullanma + +#### Mesaj gönderme + +MWSEde bir grup peere mesaj göndermenin en hızlı pratik yolu peerleri bir oda içine ekleyip oda içerisine mesaj bırakmaktadır, bu işlem clientin tüm peerler için ayrı ayrı mesajlar oluşturup göndermesi yerine verinin sunucuya bir kez gidip mesajın sunucudan kopyalanarak gönderilmesine sebep olur. + +Bu durum frontend tarafında çoklu kişilere mesaj gönderilmesi konusunda yüksek hızlı veri iletişimi gerçekleştirilmesini sağlar. + +> Odada sizde var olduğunuz için odaya gönderilen odanın üyesi olarak tekrar size gönderilmemesi için özel algoritma vardır, yankı yapmayacaktır + + +Mesaj gönderme işlemi send() fonksiyonu tarafından yapılır ve JSON apisi tarafından stringify edilebilen tüm objeleri iletebilir. + +```js + +// string +room.send("Hi !"); +// Object +room.send({ + type: "message" +}); +// Array +room.send([1,2,3,4]); +// Boolean +room.send(true); +// Number / BigNumbers +room.send(758.03); +``` + +#### Gelen mesajı işleme + +Client tarafında herhangi bir room.send işleminde iletilen veriyi yakalamak için bir fonksiyon sunmanız yeterlidir. Bu event, oda içerisindeki tüm peerlerin odaya ilettiği mesajları tek noktadan verecektir. + +MWSE oda içerisinde gönderilen mesajın orjinal içeriği ile beraber gönderen peerin objesinide verir + +```js +room.on('message',(message, peer) => { + console.log(message) // room.send ile gönderilen verinin kendisi + console.log(peer) // Mesajı gönderen peerin kendisi +}) + +``` + +room.send ile gönderilen mesaj ile room objesinde message eventinde alacağınız message verisinin tamamen aynı olacağını unutmayın room.send(1) komutunun çalıştırılması sizin mesaj olarak sayı tipinde 1 verisi almanıza neden olur. Uygulama katmanında tüm clientlerin verilerini işlemekle Developer sorumludur + +Ortak bir veri tipi belirlenmesi veyahut gelen mesajın veri tipinin kontrol (typecheck) edilmesi gerekir. + +## Odadaki peerler + +Oda içerisindeki tüm peerleri alma + +```js +// Odadaki tüm peerlerin listesini döner +let peers : Peer = await room.fetchPeers(); + +// Odadaki tüm peerleri Info değerindeki veriye göre filtreleyerek verir +// Örnekte peer.info verisinde gender:"Male" olan kişileri dönecektir +let peers : Peer = await room.fetchPeers({ + gender: "Male" +}); + +// İkinci parametre olarak true verilmesi +// Sistemin kullanıcılar yerine odadaki kişilerin sayısını +// dönmesini sağlar. Yine filtre parametresi çalışır durumdadır +let peerCount : number = await room.fetchPeers(null, true); + +``` + +## Odaya katılan peer + + +MWSE odaya yeni katılan her yeni peer için anlık bildirilmesi için event sunar + +> Event odanın başlangıcında yerleştirilmişse tüm katılmalardan haberiniz olacaktır ancak sonradan yerleştirilmiş eventlerde zaten o andan itibaren odaya katılanlar bilidirilir, öncekiler geriye dönük tekrar tetiklenmez + +```js +room.on('join', peer => { + peer.send("Hi!") + // Odaya katılan peer +}) + +``` + + +## Odaya katılan peer / odadan ayrılan peerler + + +MWSE odaya yeni katılan her yeni peer için anlık bildirilmesi için event sunar + +```js +room.on('join', peer => { + peer.send("Hi!") + // Odaya katılan peer +}) + +``` + +MWSE odadan ayrılan her yeni peer için anlık bildirilmesi için event sunar + +```js +room.on('eject', peer => { + // peer.send("Hi!") artık çalışmaz + // Ancak yinede peer.info.get çalışır +}) + +``` + +MWSE tarafında oda kapatılmışsa bildirilir. Teknik olarak bu event hiç çalışmayacaktır çünki MWSE sisteminde odalar sadece içerisinde peer olmadığı anda kapatılırlar. Bu yüzden odadan tüm peerlar çıktığında MWSE sistemi close eventini iletecek peer bulamayacaktır :D + +```js +room.on('close', () => { /* */ }) + +``` + +## Oda oturum bilgisi yönetme ve okuma + +Odaların isimleri ve açıklamaları dışında eğer odalara özellikler atayacaksanız MWSE geliştiricilere RoomInfo apisi sunar bu api get/set/Listen şeklinde çalışır ve key/value şeklinde tutulur + +```js +// oda bilgisinin güncellemesini beklemek geliştirici insiyatifindedir +// beklenmesi gerekmiyorsa await kaldırılabilir +// Burdaki await keywordu sunucu onayladığı anda Resolve olur tüm peerlere dağıtılması beklenmez +await room.info.set("token","74e84ad6....510c1b"); + +// Oda içerisinde session ile ilgili bir veri alma +await room.info.get("token") // --> "74e84ad6....510c1b" + +// Odanın içerisindeki session bilgisini sunucudan tekrar çekmek için fetch komutu ile güncelleyebilirsiniz +await room.info.fetch() + +room.on('updateinfo',(name, value)=>{ + // name = "token" + // value = "74e84ad6....510c1b" +}) + +``` + +Odalarda info ayarını belirleme konusunda rol sistemi yoktur herkes okur veya değiştirebilir \ No newline at end of file