Mikro WebSocket Engine
Go to file
Abdussamed 9fe48fab77 Bitrate trials webrtc 2023-10-02 23:13:20 +03:00
.well-known/acme-challenge fetchPeers / Peer count 2023-06-02 17:36:37 +03:00
Source Room infodeveloped 2023-09-17 17:03:51 +03:00
docs WebRTC and WebSocket merged 2023-04-18 23:19:53 +03:00
frontend Room infodeveloped 2023-09-17 17:03:51 +03:00
public Bitrate trials webrtc 2023-10-02 23:13:20 +03:00
script Room infodeveloped 2023-09-17 17:03:51 +03:00
.gitignore Bitrate trials webrtc 2023-10-02 23:13:20 +03:00
.htaccess fetchPeers / Peer count 2023-06-02 17:36:37 +03:00
LICENSE Initial commit 2022-11-16 20:31:27 +01:00
README.md 'README.md' güncelle 2023-07-18 20:57:20 +03:00
incoming-features.md Room infodeveloped 2023-09-17 17:03:51 +03:00
index.js Optimization 2023-06-09 23:39:21 +03:00
package-lock.json Room infodeveloped 2023-09-17 17:03:51 +03:00
package.json Room infodeveloped 2023-09-17 17:03:51 +03:00
test.html WebRTC and WebSocket merged 2023-04-18 23:19:53 +03:00
tsconfig.json D-TS 2023-05-16 10:49:36 +03:00
yarn.lock Room infodeveloped 2023-09-17 17:03:51 +03:00

README.md

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

Proje tarafından uygulanan load balance teknolojisi

image

Geliştirici Dökümantasyonu

Kurulum

Proje ortamına kurulumu

<script src="https://ws.saqut.com/script"></script>

Geliştirme ortamına kurulumu

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

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

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

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

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

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
        }
    })
})
  1. 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
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.


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


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