var websocket = function(addr) {
	var app = getApp();
	var thos = this;
	this.buffer = new Array(); //发送数据缓冲区
	this.reOpenData = [2, 5, 3, 5, 5, 3, 5, 8, 10, 20, 30, 30]; //断线重连，每次间隔时间/秒
	this.reOpen = 0; //断线重连次数
	this.keepAliveTimer = setInterval(function() {
		console.log('keep');
		try {
			if (thos.wsock && thos.wsock.readyState !== 1) {
				thos.reOpenSec--;
				if (thos.reOpenSec <= 0) {
					thos.reOpen++;
					thos.reOpenSec = 10;
					thos.open();
				}
				return;
			}
			if (thos.buffer.length > 0) {
				var data = thos.buffer.pop();
				thos.send(data);
			} else {
				if (new Date().getTime() - thos.last_health_time >= 15000 && thos.wsock
					.readyState === 1) {
					thos.wsock.send({
						data: 'h'
					});
					thos.last_health_time = new Date().getTime();
				}
			}
		} catch (err) {
			app.uperr("app.ws.error", err);
		}
	}, 1000);
	this.setOpenSec = function() {
		(thos.reOpen < thos.reOpenData.length) ? thos.reOpenSec = thos.reOpenData[thos.reOpen]: thos
			.reOpenSec = 90; //断线重试太多后的间隔时间
	}
	this.open = function() {
		try {
			if (thos.wsock && thos.wsock.trueClose)
				return;
			thos.setOpenSec();
			if (thos.wsock) {
				if (thos.wsock.readyState == 1)
					return;
				thos.wsock.close();
			}
			thos.wsock = uni.connectSocket({
				url: addr,
				complete: () => {}
			});
			thos.wsock.onOpen(function(event) {
				try {
					thos.reOpen = 0;
					thos.last_health_time = new Date().getTime();
					if (typeof(thos.onopen) == "function")
						thos.onopen(event);
				} catch (err) {
					app.uperr('app.ws.onopen', err);
				}
			});
			thos.wsock.onMessage(function(e) {
				try {
					if (typeof(thos.onmessage) == "function")
						thos.onmessage(e);
				} catch (err) {
					app.uperr('app.ws.onmessage', err);
				}
			});
			thos.wsock.onClose(function(e) {
				try {
					if (thos.wsock.trueClose) {
						clearInterval(thos.keepAliveTimer);
						return;
					}
					thos.setOpenSec();
					if (typeof(thos.onclose) == "function")
						thos.onclose(e);
				} catch (err) {
					app.uperr('app.ws.onclose', err);
				}
			});
			thos.wsock.onError(function(e) {
				try {
					thos.setOpenSec();
					if (typeof(thos.onerror) == "function")
						thos.onerror(e);
				} catch (err) {
					app.uperr('app.ws.onerror', err);
				}
			});
		} catch (err) {
			console.log(app, err);
			app.uperr('app.ws.open', err);
		}
	}
	this.send = function(msg) {
		try {
			if (this.wsock === undefined || this.wsock.trueClose)
				return false;
			if (this.wsock.readyState !== 1 || this.wsock.bufferedAmount > 0)
				this.buffer.push(msg);
			else {
				this.wsock.send({
					data: msg
				});
				this.last_health_time = new Date().getTime();
			}
			return true;
		} catch (err) {
			app.uperr('app.ws.send', err);
		}
	}
	this.close = function(send) {
		this.wsock.trueClose = true;
		this.wsock.close();
	}
	this.open();
};

export default websocket