diff --git a/basesocket.js b/basesocket.js index 5c417b3..6c84ba3 100644 --- a/basesocket.js +++ b/basesocket.js @@ -45,11 +45,12 @@ module.exports = { console.log('WebSocket-onMessage: dataObj', dataObj) if (['SOCKET_OWNER', 'SOCKET_OWNER_RECONNECT'].includes(dataObj.skevent)) { // 前端断线重连时,并不会自动再次提供 _passtoken。在前端的initSocket时,应当把_passtoken送过来。 - dataObj._passtokenSource = webtoken.verifyToken(dataObj._passtoken) - console.log('WebSocket-onMessge: _passtokenSource', dataObj._passtokenSource) - if (typeof dataObj._passtokenSource?.usid === 'string') { - socket.usid = dataObj._passtokenSource.usid - socket.skid = socket.skid || dataObj._passtokenSource.clid || 'skid' + crypto.randomBytes(16).toString('hex') // 注意,skid 这个名字 仅限在本文件内使用,在外部都使用 clid (client id) + const _passtokenSource = webtoken.verifyToken(dataObj._passtoken) + console.log('WebSocket-onMessge: _passtokenSource', _passtokenSource) + if (typeof _passtokenSource?.usid === 'string') { + socket.appkey = _passtokenSource.appkey + socket.usid = _passtokenSource.usid + socket.skid = socket.skid || _passtokenSource.clid || 'skid' + crypto.randomBytes(16).toString('hex') // 注意,skid 这个名字 仅限在本文件内使用,在外部都使用 clid (client id) // my.socketPool[socket.skid] = socket console.log( { @@ -87,12 +88,11 @@ module.exports = { console.log('WebSocket_heartbeat: starting...') setInterval(() => { my.wsServer.clients.forEach((socket) => { + console.log('WebSocket_heartbeat: ', { usid: socket.usid, skid: socket.skid, appkey: socket.appkey, readyState: socket.readyState }) if (socket.readyState !== ws.OPEN) { //socket.isAlive = false - console.log('WebSocket_heartbeat: not open', { usid: socket.usid, skid: socket.skid, readyState: socket.readyState }) } else { //socket.ping() - console.log('WebSocket_heartbeat: ping', { usid: socket.usid, skid: socket.skid, readyState: socket.readyState }) } }) console.log('WebSocket_heartbeat: clientsSize =', my.wsServer.clients.size) @@ -152,20 +152,22 @@ module.exports = { }) }, - sendToOne (dataObj) { + sendToOne (dataObj = {}) { console.log('sendToOne: dataObj =', dataObj) my.wsServer.clients.forEach((socket) => { - console.log('sendToOne: socket', { usid: socket.usid, skid: socket.skid }) - if ((dataObj.clid && socket.skid === dataObj.clid) || (dataObj.usid && socket.usid === dataObj.usid)) { - try { - if (socket.readyState === ws.OPEN) { - socket.send(typeof dataObj !== 'string' ? JSON.stringify(dataObj) : dataObj) - } else { - console.warn({ _at: new Date().toJSON(), _from: 'Socket:sendToOne', _type: 'CWARN', msg: 'sendToOne: socket not open', dataObj }, '\n,') + console.log('sendToOne: socket', { usid: socket.usid, skid: socket.skid, appkey: socket.appkey }) + if ((dataObj.appkey && dataObj.appkey === socket.appkey) || !dataObj.appkey) { + if ((dataObj.clid && socket.skid === dataObj.clid) || (!dataObj.clid && dataObj.usid && socket.usid === dataObj.usid)) { + try { + if (socket.readyState === ws.OPEN) { + socket.send(typeof dataObj !== 'string' ? JSON.stringify(dataObj) : dataObj) + } else { + console.warn({ _at: new Date().toJSON(), _from: 'Socket:sendToOne', _type: 'CWARN', msg: 'sendToOne: socket not open', dataObj }, '\n,') + } + } catch (expt) { + console.error({ _at: new Date().toJSON(), _from: 'Socket:sendToOne', _type: 'CERROR', msg: 'sendToOne: Failed sending to socket', dataObj }, '\n,') + // delete my.socketPool[socket.skid] } - } catch (expt) { - console.error({ _at: new Date().toJSON(), _from: 'Socket:sendToOne', _type: 'CERROR', msg: 'sendToOne: Failed sending to socket', dataObj }, '\n,') - // delete my.socketPool[socket.skid] } } })