|
@@ -10,6 +10,9 @@ class IMManager {
|
10
|
10
|
this.lockReconnect = false
|
11
|
11
|
this.limit = 12
|
12
|
12
|
this.selfClose = false
|
|
13
|
+ this.timeTicker = undefined
|
|
14
|
+ this.messageListeners = []
|
|
15
|
+ this.imMessageListener = undefined
|
13
|
16
|
}
|
14
|
17
|
|
15
|
18
|
reconnect() {
|
|
@@ -54,6 +57,20 @@ class IMManager {
|
54
|
57
|
success && success(res)
|
55
|
58
|
})
|
56
|
59
|
|
|
60
|
+ this.wss.onMessage((data) => {
|
|
61
|
+ if (data.data === 'ping') {
|
|
62
|
+ this.wss.send({ data: 'pong' })
|
|
63
|
+ } else if (data.data === 'pong') {
|
|
64
|
+ console.log('[websocket]: 接收心跳')
|
|
65
|
+ } else {
|
|
66
|
+ if (this.imMessageListener) {
|
|
67
|
+ this.imMessageListener(data)
|
|
68
|
+ } else {
|
|
69
|
+ this.messageListeners.forEach(fn => fn(data))
|
|
70
|
+ }
|
|
71
|
+ }
|
|
72
|
+ })
|
|
73
|
+
|
57
|
74
|
this.wss.onClose(res => {
|
58
|
75
|
console.log('已关闭', res)
|
59
|
76
|
close && close(res)
|
|
@@ -74,6 +91,16 @@ class IMManager {
|
74
|
91
|
this.reconnect()
|
75
|
92
|
}
|
76
|
93
|
})
|
|
94
|
+
|
|
95
|
+ this.timeTicker = setInterval(() => {
|
|
96
|
+ if (this.limit <= 0) {
|
|
97
|
+ clearInterval(this.timeTicker)
|
|
98
|
+ }
|
|
99
|
+
|
|
100
|
+ if (this.socketOpen) {
|
|
101
|
+ this.wss.send({ data: 'ping', success: () => console.log('[websocket]: 发送心跳') })
|
|
102
|
+ }
|
|
103
|
+ }, 60000)
|
77
|
104
|
};
|
78
|
105
|
|
79
|
106
|
//组装消息
|
|
@@ -130,6 +157,17 @@ class IMManager {
|
130
|
157
|
})
|
131
|
158
|
}
|
132
|
159
|
}
|
|
160
|
+
|
|
161
|
+ onMessage(callback, isIMPage) {
|
|
162
|
+ if (isIMPage) {
|
|
163
|
+ this.messageListeners = [callback]
|
|
164
|
+ } else {
|
|
165
|
+ this.imMessageListener = callback
|
|
166
|
+
|
|
167
|
+ // 取消订阅
|
|
168
|
+ return () => this.imMessageListener = undefined
|
|
169
|
+ }
|
|
170
|
+ }
|
133
|
171
|
}
|
134
|
172
|
|
135
|
173
|
export default new IMManager()
|