# MWSE Nedir? MWSE yani Micro Web Socket Engine, kendisine bağlanan eşleri birbirleriyle ile eşleştirerek, eşler arası veri tünelleri oluşturan geniş ölçekli bir mikroservistir. Servis, bağlantı sağlayan cihazların verilerini kendi aralarında senkron etmek için kullanılabilir, cihazları gruplayabilir, odalar oluşturabilir, sohbet ve görüntülü görüşme yazılımları için alt yapı olarak kullanılabilir Bağlantı TCP tabanlı yüksek hızlı WebSocket protokolüne dayanır ve sunucunun cihazları sanallaştırması sayesinde diğer kişilerin IP adreslerini veya cihaz türü gibi bilgilere ihtiyaç duymadan düşük gecikmeli çift taraflı serbest iletişim kurmalarını sağlar. ## WebSocket topolojisi ![image](https://www.hitechmv.com/wp-content/uploads/2014/05/startopology.jpg) ## Proje tarafından uygulanan load balance teknolojisi ![image](https://git.saqut.com/saqut/storage/raw/branch/master/Diagram1.png) # Geliştirici Dökümantasyonu ## Kurulum ### Proje ortamına kurulumu ```html ``` ### Geliştirme ortamına kurulumu ```javascript const mwse = new MWSE({ endpoint: "wss://ws.saqut.com/" // MSWS kurulu sunucu adresi }); mwse.scope(async () => { // Bağlantı sağlandığında burası tetiklenir }) ``` ### Kendi bağlantı kimliğini öğrenme ```javascript mwse.scope(async () => { let me = mwse.peer('me'); // Kendi bağlantınız üzerinde işlem yaparken `me` olarak bahsedersiniz console.log(me.socketId); // Her eşin tekil bir socketIdsi vardır }) ``` ### Sanal Adres ayırma / yeniden ayırma / kaldırma ```javascript mwse.scope(async () => { let me = mwse.peer('me'); /** * Sanal adresler size veri gönderilmek istendiğinde veya etkileşime * geçilmesi istendiğinde ona socketId gibi bir UUID yerine sizi temsil eden daha kısa * ip adresi, sayı veya kısa bir kod ile aynı şeyleri yapmanıza olanak tanır. * Aynı anda hem sanal ip adres, sayı ve kısa koduna sahip olabilirsiniz * ancak aynı türden temsil koduna (mesela kısa koddan) birden fazla sahip olamazsınız * Yeni bir bağlantı daha açmanız gerekir **/ // Bağlantınıze özel sanal tekil ip adresi kaynağı ayırın let ipadress = await me.virtualPressure.allocAPIPAddress(); // Bağlantınıze özel sanal tekil numara kaynağı ayırın let numberaddress = await me.virtualPressure.allocAPNumber(); // Bağlantınıze özel sanal kod kaynağı ayırın let shortcodeadress = await me.virtualPressure.allocAPShortCode(); // Bütün bu kaynakları yenileriyle değiştirmek için // her birinin ayrı ayrı yeniden alma işlevleri vardır // Bir adresi yenilediğinizde artık eski adres kullanılmaz olur me.virtualPressure.reallocAPIPAddress(); me.virtualPressure.reallocAPNumber(); me.virtualPressure.reallocAPShortCode(); // Bütün bu kaynakları kaldırmak için her birinin ayrı ayrı // bırakma işlevi vardır // Bir adresi kullanmadığınızda artık bu adreslerden size // ulaşılamaz olursunuz await me.virtualPressure.releaseAPIPAddress(); await me.virtualPressure.releaseAPNumber(); await me.virtualPressure.releaseAPShortCode(); await me.virtualPressure.queryAPIPAddress(); await me.virtualPressure.queryAPNumber(); await me.virtualPressure.queryAPShortCode(); }) ``` ### Farklı bir eşe erişme ```javascript mwse.scope(async () => { let peer = mwse.peer('325a8f7f-eaaf-4c21-855e-9e965c0d5ac9') // Diğer eşin socketId'sini belirtiyoruz let me = mwse.peer('me'); // Eşin ulaşılabilir (online) olup olmadığını verir let isOnline = await peer.isReachable(); if(isOnline) { // İleitşim kurmak için istek gönderiyoruz await peer.requestPair(); } // Bize gönderilecek olan istekleri dinliyoruz me.on('request/pair', peer => { // İstek gönderen kullanıcının bilgileri peer içinde bulunur // iletişime devam etmek için isteği kabul ediyoruz peer.acceptPair(); // veya istemiyorsak reddediyoruz peer.rejectPair(); }) // Karşımızdaki kullanıcının ne cevap verdiğini // anlamak için sistem ayrı ayrı cevaplar üretir // Kabul ettiyse accept eventini tetikler me.on('accepted/pair', peer => { // İstek gönderen kullanıcının bilgileri peer içinde bulunur }) // Reddettiyse veya iletişimi sonlandırmışsa // end eventi tetiklenir me.on('end/pair', peer => { // Kullanıcının bilgileri peer içinde bulunur }) }) ``` Eğer uygulamanızda bu şekilde bir erişim metodolojisi kullanmak istemiyorsanız pair sistemini elle kapatabilirsiniz ```javascript mwse.scope(async () => { let me = mwse.peer('me'); // Tüm kullanıcılar size mesaj iletebilir await peer.disablePairAuth(); // Sadece eşleşmiş kullanıcılar size mesaj iletebilir await peer.enablePairAuth(); }) ``` ## Tünelleme ile mesajlaşma MWSE üzerinde karşılıklı mesajlaşma için 2 metodoloji bulunur bunlardan birisi serbest mesajlaşmadır ve bu şekilde çalışır ```javascript mwse.scope(async () => { let me = mwse.peer('325a8f7f-eaaf-4c21-855e-9e965c0d5ac9'); // Tüm kullanıcılar size mesaj iletebilir await peer.disablePairAuth(); // Bu şekilde serbest bir şekilde herhangi bir zamanda karşılıksız mesaj iletebilirsiniz peer.send({ text: "Good morning" }) // Kullanıcı her hangi bir mesaj gönderdiğinde burası tetiklenir peer.on('message', message => { if(text.message == "Good morning") { // Eğer mesaj için bir cevap bekliyorsa cevap veriyoruz peer.send("You are welcome"); }else{ // Ancak mesaj önceden gönderdiğimiz isteğin cevabıysa görüntülüyoruz console.log("Reply is :", message) // --> You are welcome } }) }) ``` 2. yöntem ise el sıkışmalı mesajlaşmadır ve gönderdiğiniz bir mesaja verilen karşılık olarak sistem, gelen mesajın gönderdiğiniz hangi mesaja karşılık olarak gönderildiğini tuttuğu için request/response şeklinde ilerleyebilir ```javascript mwse.scope(async () => { let peer = mwse.peer('325a8f7f-eaaf-4c21-855e-9e965c0d5ac9'); let me = mwse.peer('me'); // Tüm kullanıcılar size mesaj iletebilir await me.disablePairAuth(); // Bizden istenecek veriler için önceden cevapları hazırlıyoruz me.on('request', ({body, response}) => { switch(body.message) { case "Good morning":{ // do anything... response("You are welcome") break; } } }) // Bu şekilde serbest bir şekilde herhangi bir zamanda karşılıksız mesaj iletebilirsiniz let response = await peer.request({ message: "Good morning" }); console.log(response) // response ---> You are welcome }) ``` Bu şekilde hem okunabilirlik artar hemde mesajlar karşılıklı olarak etki-tepki şeklinde ilerler ---- ### Oda kurma ve kapatma Oda sistemi kullanıcıların bir araya gelerek, tek seferde bir grubun toplu olarak birbirleriyle mesajlaşabileceği bir yapıdır. Kişiler birbirlerini bulabilir, toplu mesajlar iletebilirler, odaya katılabilir veya ayrılabilirler Odanın ayarlarını, odayı ilk oluşturan kişi belirler ve oda bir kez oluşturulduğunda yeniden aynı isimle oda açılamaz Oda türü (joinType) herkese açık `free`, davet ile `invite`, şifreli `password` veya herkese kapalı `lock` olabilir. ```javascript mwse.scope(async () => { let room = mwse.room({ name: "Oda ismi", // odanın görünür ismi description: "Oda açıklaması", // odanın görünecek ismi joinType: "free", // herkese açık oda credential: "****", // varsa şifre notifyActionInvite: false, // yeni biri katılmak istediğinde tüm peerlere haber iletme özelliği notifyActionJoined: true, // yeni biri katıldığında tüm peerlere haber iletir notifyActionEjected: true, // Biri odadan ayrıldığında tüm peerlere haber iletir ifexistsJoin: false // true ayarlanırsa, oluşturma aşamasında oda zaten var yanıtı alırsa hata vermek yerine odaya katılır }); // Verilen isime ait odaya katılmak için bu komut yeterlidir await room.join(); // --> odaya katılırken sorun oluşursa hata fırlatır // Verilen ayarlara sahip odayı oluşturmak için aşağıdaki komut yeterlidir await room.createRoom(); // -> oda oluştururken sorun oluşursa hata fırlatır // Var olan bir odadan ayrılmak için bu komut kullanılabilir await room.eject(); // İçinde bulunduğu odanın tüm eşlerinin idsini verir let peers = await room.fetchPeers(); }); ``` ### Oda içerisinde iletişim Odaya katıldıktan sonra katılan kişiler `room` üzerinden mesaj iletebilirsiniz, verilen her mesajı sistem istisnasız tüm oda katılımcılarına iletmekten sorumludur Oda içerisindeki kişiler ile oda içindeki kişilerin listesini alarak özel iletişimede geçebilirsiniz ancak aynı odadaki kişiler sistem tarafında yinede güvenilir kabul edilmez Sistem pairAuth güvenliği kapalı olan kişilere mesajlar iletir ancak açık olan kullanıcıların her biri için ayrı ayrı eşleşme isteği göndermelisiniz ```javascript mwse.scope(async () => { let room = mwse.room({ name: "Oda ismi", // odanın görünür ismi description: "Oda açıklaması", // odanın görünecek ismi joinType: "free", // herkese açık oda notifyActionJoined: true, // yeni biri katıldığında tüm peerlere haber iletir ifexistsJoin: false // true ayarlanırsa, oluşturma aşamasında oda zaten var yanıtı alırsa hata vermek yerine odaya katılır }); // Verilen ayarlara sahip odayı oluşturmak için aşağıdaki komut yeterlidir await room.createRoom(); // -> oda oluştururken sorun oluşursa hata fırlatır // Oda içerisinde mesaj gönderildiğinde gönderilen paketi dinlemek için aşağıdaki komut kullanılabilir room.on('message', message => { // Odaya `message` paketi iletildi }) // Odaya yeni birisi katıldığında haber almak için aşağıdaki komut kullanılabilir room.on('join', peer => { // Odaya katılan kişinin bilgisi peerde tutulur // Odaya katılan kişiyle bağlantı kurup, oda dışında kendisiyle iletişimede geçebilirsiniz peer.requestPair(); }) // Odaya birisi ayrıldığında haber almak için aşağıdaki komut kullanılabilir room.on('eject', peer => { // Odadan ayrılan kişinin bilgisi peerde tutulur }) // Odadaki herkese mesaj iletmek için room içerisindeki send komutu kullanılabilir room.send({ message: "Good year !" }); // Oda kapatıldığında close tetiklenir room.on('close', () => { }) }); ``` ### Odayı kapatma Odalar odaya ait olan bağlantılar üzerine kurulur, tüm bağlantılar odadan çıktığında oda otomatik olarak kapatılır