代码拉取完成,页面将自动刷新
const isProduction = process.env.NODE_ENV === 'production'
const Koa = require('koa')
const url = require('url')
const ws = require('ws')
const Cookies=require('cookies');
const bodyparser=require('koa-bodyparser');
const templating=require('./templating');
const controller=require('./controller');
const WebSocketServer = ws.Server
const rest=require('./rest')
const app = new Koa()
//第一个middleware记录url以及页面执行时间
app.use(async (ctx, next) => {
console.log(`Process ${ctx.method} ${ctx.url}`);
var start = new Date().getTime()
, execTime;
await next();
execTime = new Date().getTime() - start;
ctx.set('X-Response-Time', `${execTime}ms`);
})
app.use(async (ctx, next) => {
ctx.state.user = parseUser(ctx.cookies.get('name') || '');
await next();
})
//第二个middleware处理静态文件
if (!isProduction) {
let staticFiles = require('./static-files');
app.use(staticFiles('/static/', '/node_modules/'));
}
//第三个middleware解析post请求
app.use(bodyparser());
//第四个middleware给ctx添加render方法 来使用nunjucks
app.use(templating('views', {
noCache: !isProduction,
watch: !isProduction,
autoescape: isProduction
}));
//第五个middleware处理rest请求
app.use(rest.restify());
//最后一个middleware处理url路由
app.use(controller());
let server = app.listen(3001);
function createWebSocketServer(server, onConnection, onMessage, onClose, onError) {
let wss = new WebSocketServer({
server: server
});
wss.broadcast = data => {
wss.clients.forEach(client => {
client.send(data)
})
}
onConnection = onConnection || (()=> console.log('[WebSocket] connected.'))
onMessage = onMessage||(msg=>console.log('[WebSocket] message received'+msg))
onClose=onClose||((code,message)=>console.log(`[WebSocket] closed:${code}-${message}`))
onError=onError||(err=>console.log('[WebSocket] error:'+err))
wss.on('connection', function (ws,req) {
let location = url.parse(req.url, true)
console.log('[WebSocketServer] connection:'+location.href)
ws.on('message',onMessage)
ws.on('close',onClose)
ws.on('error',onError)
if(location.pathname!=='/ws/chat'){
ws.close(4000,'Invalid URL');
}
let user = parseUser(req);
console.log(req);
if (!user) {
ws.close(4001, 'Invalid user');
}
ws.user = user;
ws.wss = wss;
onConnection.apply(ws)
});
}
var messageIndex = 0;
function createMessage(type, user, data) {
messageIndex++;
return JSON.stringify({
id: messageIndex,
type: type,
user: user,
data: data
})
}
function onConnection(){
let user=this.user,
users=[],
msg=createMessage('join',user,`${user.name} joined`);
this.wss.broadcast(msg);
this.wss.clients.forEach(client=>{
users.push(client.user);
})
this.send(createMessage('list',user,users));
}
function onMessage(message){
console.log(message);
if(message&&message.trim()){
let msg=createMessage('chat',this.user,message.trim());
this.wss.broadcast(msg);
}
}
function onClose(){
let user=this.user;
let msg=createMessage('left',user,`${user.name} is left`);
this.wss.broadcast(msg);
}
function parseUser(obj) {
if (!obj) return;
console.log('try parse:' + obj);
let s = '';
if (typeof obj === 'string') {
s = obj;
} else if (obj.headers) {
let cookies = new Cookies(obj, null);
s = cookies.get('name');
}
if (s) {
try {
let user = JSON.parse(Buffer.from(s, 'base64').toString());
console.log(`User:${user.name},ID:${user.id}`);
return user;
} catch (e) {
console.log('报错了:' + e);
}
}
}
app.wss = createWebSocketServer(server,onConnection,onMessage,onClose);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。