|
|
@@ -1,13 +1,26 @@
|
|
|
import { Client as ColyseusClient, Room } from "colyseus.js";
|
|
|
class CSClient {
|
|
|
- constructor(roomName, serverUrl,messageCB) {
|
|
|
+ constructor(roomName, serverUrl,messageCB,connectedCB,closeCB) {
|
|
|
this.roomName=roomName;
|
|
|
this.serverUrl=serverUrl;
|
|
|
this.messageCB=messageCB;
|
|
|
+ this.connectedCB=connectedCB;
|
|
|
+ this.closeCB=closeCB;
|
|
|
this.client=new ColyseusClient(serverUrl);
|
|
|
this.callbacks=[];
|
|
|
+ this.retryTimer=null;
|
|
|
+ this.retryTimeout=1000;
|
|
|
+ this.maxRetry=15;
|
|
|
+ this.currRetry=0;
|
|
|
+ this.isKicked=false;
|
|
|
this.unsetRoom();
|
|
|
}
|
|
|
+ clearTimer(){
|
|
|
+ if (this.retryTimer!=null){
|
|
|
+ clearTimeout(this.retryTimer);
|
|
|
+ this.retryTimer = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
unsetRoom(){
|
|
|
console.log("unsetRoomunsetRoom");
|
|
|
if(this.currentRoom){
|
|
|
@@ -17,22 +30,51 @@ class CSClient {
|
|
|
}
|
|
|
setRoom(room){
|
|
|
this.currentRoom=room;
|
|
|
+ this.currRetry=0;
|
|
|
let self=this;
|
|
|
- // room.connection.ws.addEventListener("close",()=>{
|
|
|
- // self.unsetRoom();
|
|
|
- // });
|
|
|
+ room.connection.transport.ws.addEventListener("close",()=>{
|
|
|
+ console.log("connection closed");
|
|
|
+ if (!self.isKicked)self.reconnect();
|
|
|
+ });
|
|
|
room.onStateChange((newState) => {
|
|
|
- console.log(self.roomName, "has new state:", newState.mySynchronizedProperty);
|
|
|
+ // console.log(self.roomName, "has new state:", newState.mySynchronizedProperty);
|
|
|
// skip unregistered (null) callbacks
|
|
|
self.callbacks.filter((_) => _).forEach((callback) => callback(newState));
|
|
|
});
|
|
|
room.onMessage("*",(type,message)=>{
|
|
|
- console.log("Room:"+self.roomName+" onMessage:"+" type:"+type+" message:"+JSON.stringify(message))
|
|
|
+ //被踢了
|
|
|
+ if (message!=null&&message.cmd==="kick"){
|
|
|
+ self.isKicked=true;
|
|
|
+ }
|
|
|
+ // console.log("Room:"+self.roomName+" onMessage:"+" type:"+type+" message:"+JSON.stringify(message))
|
|
|
if (self.messageCB)self.messageCB(type,message);
|
|
|
})
|
|
|
+ room.onError((code, message) => {
|
|
|
+ console.log("couldn't join", room.name,code,message);
|
|
|
+ });
|
|
|
|
|
|
// when leaving, reset the connection state indicator
|
|
|
- room.onLeave(self.unsetRoom);
|
|
|
+ room.onLeave((e)=>{
|
|
|
+ self.unsetRoom();
|
|
|
+ });
|
|
|
+ if (this.connectedCB)this.connectedCB(true);
|
|
|
+ }
|
|
|
+ async reconnect(resolve){
|
|
|
+ let during=this.retryTimeout+this.currRetry*2000;
|
|
|
+ this.clearTimer();
|
|
|
+ if (this.currRetry>=this.maxRetry){
|
|
|
+ if (resolve)resolve(false);
|
|
|
+ this.currRetry=0;
|
|
|
+ if (this.closeCB)this.closeCB();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let self=this;
|
|
|
+ this.retryTimer=setTimeout(()=>{
|
|
|
+ self.currRetry++;
|
|
|
+ self.connect({}).then((data)=>{
|
|
|
+ if (resolve)resolve(data);
|
|
|
+ })
|
|
|
+ },during);
|
|
|
}
|
|
|
async connect(options={}){
|
|
|
let self=this;
|
|
|
@@ -42,7 +84,8 @@ class CSClient {
|
|
|
self.setRoom(room);
|
|
|
resolve(true);
|
|
|
}).catch((e)=>{
|
|
|
- resolve(false);
|
|
|
+ // resolve(false);
|
|
|
+ self.reconnect(resolve);
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
@@ -63,6 +106,7 @@ class CSClient {
|
|
|
}
|
|
|
send(type,message){
|
|
|
if (this.currentRoom){
|
|
|
+ console.log("send:",type,message)
|
|
|
this.currentRoom.send(type,message);
|
|
|
}
|
|
|
}
|