306 lines
11 KiB
Markdown
306 lines
11 KiB
Markdown
# 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
|
||
|
||

|
||
|
||
## Proje tarafından uygulanan load balance teknolojisi
|
||
|
||

|
||
|
||
# Geliştirici Dökümantasyonu
|
||
|
||
## Kurulum
|
||
|
||
### Proje ortamına kurulumu
|
||
|
||
```html
|
||
<script src="https://ws.saqut.com/script"></script>
|
||
```
|
||
|
||
### 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 |