-
Notifications
You must be signed in to change notification settings - Fork 11
/
index.js
148 lines (145 loc) · 4.12 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import { Heart } from './libs/heart'
export class Socket extends Heart {
ws = null
RECONNEC_TTIMER = null // 重连计时器
RECONNECT_COUNT = 10 // 变量保存,防止丢失
OPTIONS = {
url: null, // 链接的通道的地址
heartTime: 5000, // 心跳时间间隔
heartMsg: 'ping', // 心跳信息,默认为'ping'
isReconnect: true, // 是否自动重连
isRestory: false, // 是否销毁
reconnectTime: 5000, // 重连时间间隔
reconnectCount: 5, // 重连次数 -1 则不限制
openCb: null, // 连接成功的回调
closeCb: null, // 关闭的回调
messageCb: null, // 消息的回调
errorCb: null // 错误的回调
}
constructor (ops) {
super(ops.heartTime)
Object.assign(this.OPTIONS, ops)
this.create()
}
/**
* 建立连接
*/
create () {
if (!('WebSocket' in window)) {
/* eslint-disable no-new */
new Error('当前浏览器不支持,无法使用')
return
}
if (!this.OPTIONS.url) {
new Error('地址不存在,无法建立通道')
return
}
delete this.ws
this.ws = new WebSocket(this.OPTIONS.url)
this.onopen()
this.onclose()
this.onmessage()
}
/**
* 自定义连接成功事件
* 如果callback存在,调用callback,不存在调用OPTIONS中的回调
* @param {Function} callback 回调函数
*/
onopen (callback) {
this.ws.onopen = (event) => {
clearTimeout(this.RECONNEC_TTIMER) // 清除重连定时器
this.OPTIONS.reconnectCount = this.RECONNECT_COUNT // 计数器重置
// 建立心跳机制
super.reset().start(() => {
this.send(this.OPTIONS.heartMsg)
})
if (typeof callback === 'function') {
callback(event)
} else {
(typeof this.OPTIONS.openCb === 'function') && this.OPTIONS.openCb(event)
}
}
}
/**
* 自定义关闭事件
* 如果callback存在,调用callback,不存在调用OPTIONS中的回调
* @param {Function} callback 回调函数
*/
onclose (callback) {
this.ws.onclose = (event) => {
super.reset()
!this.OPTIONS.isRestory && this.onreconnect()
if (typeof callback === 'function') {
callback(event)
} else {
(typeof this.OPTIONS.closeCb === 'function') && this.OPTIONS.closeCb(event)
}
}
}
/**
* 自定义错误事件
* 如果callback存在,调用callback,不存在调用OPTIONS中的回调
* @param {Function} callback 回调函数
*/
onerror (callback) {
this.ws.onerror = (event) => {
if (typeof callback === 'function') {
callback(event)
} else {
(typeof this.OPTIONS.errorCb === 'function') && this.OPTIONS.errorCb(event)
}
}
}
/**
* 自定义消息监听事件
* 如果callback存在,调用callback,不存在调用OPTIONS中的回调
* @param {Function} callback 回调函数
*/
onmessage (callback) {
this.ws.onmessage = (event) => {
// 收到任何消息,重新开始倒计时心跳检测
super.reset().start(() => {
this.send(this.OPTIONS.heartMsg)
})
if (typeof callback === 'function') {
callback(event.data)
} else {
(typeof this.OPTIONS.messageCb === 'function') && this.OPTIONS.messageCb(event.data)
}
}
}
/**
* 自定义发送消息事件
* @param {String} data 发送的文本
*/
send (data) {
if (this.ws.readyState !== this.ws.OPEN) {
new Error('没有连接到服务器,无法推送')
return
}
this.ws.send(data)
}
/**
* 连接事件
*/
onreconnect () {
if (this.OPTIONS.reconnectCount > 0 || this.OPTIONS.reconnectCount === -1) {
this.RECONNEC_TTIMER = setTimeout(() => {
this.create()
if (this.OPTIONS.reconnectCount !== -1) this.OPTIONS.reconnectCount--
}, this.OPTIONS.reconnectTime)
} else {
clearTimeout(this.RECONNEC_TTIMER)
this.OPTIONS.reconnectCount = this.RECONNECT_COUNT
}
}
/**
* 销毁
*/
destroy () {
super.reset()
clearTimeout(this.RECONNEC_TTIMER) // 清除重连定时器
this.OPTIONS.isRestory = true
this.ws.close()
}
}