Documentation
This commit is contained in:
parent
80cfaa7d50
commit
cdf3100098
293
README.md
293
README.md
|
@ -10,4 +10,295 @@ Bağlantı TCP tabanlı yüksek hızlı WebSocket protokolüne dayanır ve sunuc
|
|||
|
||||
## 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
|
||||
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
|
|
@ -27,6 +27,9 @@ function Client()
|
|||
* @type {Set<string>}
|
||||
*/
|
||||
this.rooms = new Set();
|
||||
/**
|
||||
* @type {Set<string>}
|
||||
*/
|
||||
this.pairs = new Set();
|
||||
this.requiredPair = false;
|
||||
|
||||
|
@ -151,7 +154,7 @@ Client.prototype.rejectPeerRequest = function(client){
|
|||
this.sync('pairs');
|
||||
client.send([{
|
||||
from: this.id
|
||||
},'rejected/pair']);
|
||||
},'end/pair']);
|
||||
};
|
||||
/**
|
||||
* @param {Client|string} client
|
||||
|
@ -164,6 +167,9 @@ Client.prototype.isPaired = function(client){
|
|||
}
|
||||
return client.pairs.has(this.id) && this.pairs.has(client.id);
|
||||
};
|
||||
/**
|
||||
* @returns {string[]}
|
||||
*/
|
||||
Client.prototype.pairList = function(){
|
||||
return [...this.pairs.values()].filter(e => this.isPaired(e));
|
||||
};
|
||||
|
|
|
@ -127,10 +127,28 @@ addService(({
|
|||
client.rejectPeerRequest(pairclient);
|
||||
break;
|
||||
}
|
||||
case 'end/pair':{
|
||||
if(Client.clients.has(to)){
|
||||
return end({
|
||||
status: 'fail',
|
||||
message: 'CLIENT-NOT-FOUND'
|
||||
})
|
||||
};
|
||||
let pairclient = Client.clients.get(to);
|
||||
if(!pairclient.pairs.has(client.id))
|
||||
{
|
||||
return end({
|
||||
status: 'success',
|
||||
message: 'NOT-PAIRED'
|
||||
})
|
||||
}
|
||||
client.rejectPeerRequest(pairclient);
|
||||
break;
|
||||
}
|
||||
case 'pair/list':{
|
||||
end({
|
||||
type:'pair/list',
|
||||
value: pairList
|
||||
value: client.pairList()
|
||||
})
|
||||
break;
|
||||
}
|
||||
|
@ -149,38 +167,6 @@ addService(({
|
|||
}
|
||||
break;
|
||||
}
|
||||
// case 'auth/check':{
|
||||
// let auth = client.store.has('user');
|
||||
// return end({
|
||||
// value: auth
|
||||
// })
|
||||
// }
|
||||
// case 'auth/login':{
|
||||
// if(username == '*' && password == '*')
|
||||
// {
|
||||
// return end({
|
||||
// status: 'success'
|
||||
// })
|
||||
// }else{
|
||||
// return end({
|
||||
// status: 'fail'
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
// case 'auth/logout':{
|
||||
// let auth = client.store.has('user');
|
||||
// if(auth)
|
||||
// {
|
||||
// client.store.delete('user');
|
||||
// return end({
|
||||
// status: 'success'
|
||||
// })
|
||||
// }else{
|
||||
// return end({
|
||||
// status: 'fail'
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
case 'auth/info':{
|
||||
client.info.set(name, value);
|
||||
let clients = client.getSucureClients();
|
||||
|
|
|
@ -119,6 +119,68 @@ export default class Peer extends EventTarget
|
|||
value: 'disable'
|
||||
});
|
||||
}
|
||||
async requestPair()
|
||||
{
|
||||
let {message,status} = await this.mwse.EventPooling.request({
|
||||
type:'request/pair',
|
||||
to: this.socketId
|
||||
});
|
||||
if(
|
||||
message == "ALREADY-PAIRED" ||
|
||||
message == "ALREADY-REQUESTED"
|
||||
)
|
||||
{
|
||||
console.warn("Already paired or pair requested")
|
||||
};
|
||||
if(status == "fail")
|
||||
{
|
||||
console.error("Request Pair Error",status, message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
async endPair()
|
||||
{
|
||||
await this.mwse.EventPooling.request({
|
||||
type:'end/pair',
|
||||
to: this.socketId
|
||||
});
|
||||
this.forget();
|
||||
}
|
||||
async acceptPair()
|
||||
{
|
||||
let {message,status} = await this.mwse.EventPooling.request({
|
||||
type:'accept/pair',
|
||||
to: this.socketId
|
||||
});
|
||||
if(status == "fail")
|
||||
{
|
||||
console.error("Pair Error",status, message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
async rejectPair()
|
||||
{
|
||||
let {message,status} = await this.mwse.EventPooling.request({
|
||||
type:'reject/pair',
|
||||
to: this.socketId
|
||||
});
|
||||
if(status == "fail")
|
||||
{
|
||||
console.error("Pair Error",status, message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
async getPairedList() : Promise<string>
|
||||
{
|
||||
let {value} = await this.mwse.EventPooling.request({
|
||||
type:'pair/list',
|
||||
to: this.socketId
|
||||
});
|
||||
return value;
|
||||
}
|
||||
async send(pack: any){
|
||||
let isOpenedP2P = this.peerConnection;
|
||||
let isOpenedServer = this.mwse.server.connected;
|
||||
|
|
|
@ -99,13 +99,30 @@ export default class MWSE extends EventTarget {
|
|||
})
|
||||
this.EventPooling.signal("pair/info", (payload : {from : string,name: string, value: string | number | boolean}) => {
|
||||
let {from, name, value} = payload;
|
||||
|
||||
let peer = this.peer(from);
|
||||
|
||||
peer.info.info[name] = value;
|
||||
|
||||
peer.emit("info", name, value);
|
||||
})
|
||||
this.EventPooling.signal("request/pair", (payload : {from : string,info: any}) => {
|
||||
let {from, info} = payload;
|
||||
let peer = this.peer(from);
|
||||
peer.info.info = info;
|
||||
peer.emit("request/pair", peer);
|
||||
this.peer('me').emit('request/pair', peer);
|
||||
})
|
||||
this.EventPooling.signal("accepted/pair", (payload : {from : string,info: any}) => {
|
||||
let {from, info} = payload;
|
||||
let peer = this.peer(from);
|
||||
peer.info.info = info;
|
||||
peer.emit("accepted/pair", peer);
|
||||
this.peer('me').emit('accepted/pairr', peer);
|
||||
})
|
||||
this.EventPooling.signal("end/pair", (payload : {from : string,info: any}) => {
|
||||
let {from, info} = payload;
|
||||
let peer = this.peer(from);
|
||||
peer.emit("endPair", info);
|
||||
this.peer('me').emit('endPair', from, info);
|
||||
})
|
||||
}
|
||||
public room(options: IRoomOptions | string) : Room
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue