You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.1 KiB
52 lines
1.1 KiB
4 years ago
|
import $store from "@//store";
|
||
|
import { VUE_APP_WS_URL } from "@/utils";
|
||
|
|
||
|
const Socket = function() {
|
||
|
this.ws = new WebSocket(VUE_APP_WS_URL);
|
||
|
this.ws.onopen = this.onOpen.bind(this);
|
||
|
this.ws.onerror = this.onError.bind(this);
|
||
|
this.ws.onmessage = this.onMessage.bind(this);
|
||
|
this.ws.onclose = this.onClose.bind(this);
|
||
|
};
|
||
|
|
||
|
Socket.prototype = {
|
||
|
vm(vm) {
|
||
|
this.vm = vm;
|
||
|
},
|
||
|
close() {
|
||
|
clearInterval(this.timer);
|
||
|
this.ws.close();
|
||
|
},
|
||
|
onOpen: function() {
|
||
|
this.init();
|
||
|
this.send({
|
||
|
type: "login",
|
||
|
data: $store.state.token
|
||
|
});
|
||
|
this.vm.$emit("socket_open");
|
||
|
},
|
||
|
init: function() {
|
||
|
var that = this;
|
||
|
this.timer = setInterval(function() {
|
||
|
that.send({ type: "ping" });
|
||
|
}, 10000);
|
||
|
},
|
||
|
send: function(data) {
|
||
|
return this.ws.send(JSON.stringify(data));
|
||
|
},
|
||
|
onMessage: function(res) {
|
||
|
const { type, data = {} } = JSON.parse(res.data);
|
||
|
this.vm.$emit(type, data);
|
||
|
},
|
||
|
onClose: function() {
|
||
|
clearInterval(this.timer);
|
||
|
},
|
||
|
onError: function(e) {
|
||
|
this.vm.$emit("socket_error", e);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Socket.prototype.constructor = Socket;
|
||
|
|
||
|
export default Socket;
|