init this repo

This commit is contained in:
陆柯 2021-06-20 09:07:40 +08:00
parent 80b2b00b2a
commit 115e1be73e
5 changed files with 130 additions and 2 deletions

17
.gitignore vendored Normal file
View File

@ -0,0 +1,17 @@
.DS_Store
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
/package-lock.json

16
.prettierrc.js Normal file
View File

@ -0,0 +1,16 @@
/*
VSCode Prettier 有效建议一直要有本配置文件否则不同版本的 Prettier 的默认配置会不同例如 TrailingComma
VSCode Prettier Standard 无效似乎是集成了不能修改的配置
*/
module.exports = {
printWidth: 160, // default 80
tabWidth: 2, // default 2
useTabs: false,
semi: false, // default true
singleQuote: true, // default false
trailingComma: 'es5', // none (default in v 1.*), es5 (default in v2.0.0), all
bracketSpacing: true, // default true
jsxBracketSameLine: false, // default false
arrowParens: 'always', // avoid (default in v1.9.0), always (default since v2.0.0)
quoteProps: 'as-needed', // as-needed (default), consistent, preserve
}

View File

@ -1,2 +1 @@
# sol.webServerSocket
# sol.webServerSocket web服务端套接口

82
index.js Normal file
View File

@ -0,0 +1,82 @@
const ws = require('ws')
const webtoken = require('sol.webtoken')
const my = {
wssServer: undefined,
socketPool: {},
listeners: {},
}
module.exports = {
initSocket: (webServer) => {
my.wssServer = new ws.Server({ server: webServer })
console.info('App Socket Server attached to web server.')
my.wssServer.on('connection', (socket, req) => {
console.info(`A socket from App Client is connected from ${req.connection.remoteAddress}:${req.connection.remotePort}.`)
// socket.isAlive = true
// socket.on('pong', function() { console.log('👈 ASS: on Pong'); this.isAlive = true })
socket.on('message', (data) => {
// 在这里统一分发消息
console.log('App Socket Client message: ', data)
let dataObj
try {
dataObj = JSON.parse(data)
} catch (exception) {
console.log(new Date().toJSON(), 'Unable to parse socket message: ', data)
return
}
if (dataObj.skevent === 'SOCKET_OWNER') {
dataObj._passtokenSource = webtoken.verifyToken(dataObj._passtoken, wo.envi.tokenKey) // todo: 为防止前端欺骗应当用和login里类似的方法来检查来检查
my.socketPool[dataObj._passtokenSource.uuid] = socket
console.log('收到Login 成功的消息绑定socket', Object.keys(my.socketPool))
// this.sendToOne({skevent:'ws/Exchange/paintedWolf', info:'launch to mars'}, dataObj._passtokenSource.uuid)
}
const listeners = my.listeners[dataObj.skevent] || []
for (const listener of listeners) {
listener(dataObj)
}
})
})
return this
},
removeUserSocket: (uuid) => {
delete my.socketPool[uuid]
},
addListener: (skevent, listener) => {
if (Array.isArray(my.listeners[skevent]) && typeof listener === 'function') {
my.listeners[skevent].push(listener)
} else {
my.listeners[skevent] = [listener]
}
return this
},
sendToAll: (dataObj) => {
my.wssServer.clients.forEach((socket) => {
if (socket.readyState === socket.OPEN) {
socket.send(typeof dataObj !== 'string' ? JSON.stringify(dataObj) : dataObj)
} else {
delete my.socketPool[socket.uuid]
}
})
},
sendToOne: (dataObj, uuid) => {
const socket = my.socketPool[uuid]
if (socket && socket.readyState === socket.OPEN) {
socket.send(typeof dataObj !== 'string' ? JSON.stringify(dataObj) : dataObj)
} else {
delete my.socketPool[uuid]
}
},
}
// todo: 前端断线重连时,并不会再次 login_success。也许在前端的initSocket时应当把_passtoken送过来而后台则对_passtoken做验证后再加socketPool。

14
package.json Normal file
View File

@ -0,0 +1,14 @@
{
"name": "sol.webServerSocket",
"version": "0.1.0",
"private": true,
"dependencies": {
"sol.webtoken": "git+https://git.faronear.org/npm/sol.webtoken",
"ws": "^7.2.1"
},
"devDependencies": {},
"scripts": {
"setup": "npm install"
},
"author": ""
}