-
Notifications
You must be signed in to change notification settings - Fork 2
/
socket-server.js
160 lines (126 loc) · 2.94 KB
/
socket-server.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
149
150
151
152
153
154
155
156
157
158
159
160
var Server = require('socket.io');
var Promise = require('bluebird');
var jwt = require('jsonwebtoken');
// var redisClient = require('./redis-client');
var appConfig = require('./config/app-config');
var StayedMsg = require('./models/stayed-msg');
var Msg = require('./models/msg');
var io = new Server();
var sockets = {};
io.on('connection', function (socket) {
// let handshake = socket.handshake;
//退出
socket.on('disconnect', function () {
delete sockets[socket.$userId];
console.log('[userId:' + socket.$userId + '] logout---------------');
});
//登录
socket.on('login', function (token, ack) {
var verify = Promise.promisify(jwt.verify);
verify(token, appConfig.secret)
.then(decoded => {
var userId = decoded.userId;
var onlineSocket = sockets[userId];
//如果已经在线
if (onlineSocket) {
onlineSocket.emit('forceQuit');
onlineSocket.disconnect();
}
socket.$userId = userId;
sockets[userId] = socket;
ack(true);
//推送存储的消息,如果有的话
pushStayMsg(userId);
console.log('[userId:' + userId + '] login---------------');
})
.catch(err => {
ack(false);
})
});
});
function attach(server) {
console.log('[scoketServer] attach success!');
io.attach(server);
}
function isOnline(userId) {
var socket = sockets[userId];
return !!socket;
}
/* @des
* 推送消息
* @params
* msg(s) 消息 可以是数组
*/
function pushMsg(toUserId, msgs, isSaved) {
var socket = sockets[toUserId];
if (msgs && msgs.constructor != Array) {
msgs = [msgs];
}
if (socket) {
socket.emit('pushMsg', msgs, function (msgIds) {
StayedMsg.remove({
userId: toUserId,
msgId: {
$in: msgIds
}
}).exec();
});
} else {
if (!isSaved) {
//储存起来
msgs.forEach(msg => {
saveStayMsg(toUserId, msg);
});
}
}
}
/* @des
* 当用户刚上线,把存储的消息推送过去
* @params
* msg(s) 消息 可以是数组
*/
function pushStayMsg(userId) {
StayedMsg.find({
userId: userId
})
.exec()
.map(stayMsg => {
return stayMsg.msgId.toString();
})
.then(msgIds => {
return Msg.find({
'_id': {
$in: msgIds
}
})
.populate('_fromUser', '-password')
.exec()
})
.then(msgs => {
pushMsg(userId, msgs, true);
})
.catch((err) => {
// debugger;
})
}
/* @des
* 当用户不在线,把待推送的消息存储
* @params
* msg(s) 消息 可以是数组
*/
function saveStayMsg(userId, msg) {
StayedMsg.create({
userId: userId,
msgId: msg._id
})
}
function pushUserModed(toUserId, user) {
var socket = sockets[toUserId];
if (socket) {
socket.emit('pushUserModed', user);
}
}
exports.attach = attach;
exports.isOnline = isOnline;
exports.pushMsg = pushMsg;
exports.pushUserModed = pushUserModed;