init
This commit is contained in:
commit
b0213a8207
23
.gitignore
vendored
Normal file
23
.gitignore
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
commit.sh
|
||||
miniprogram_npm
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
12
acc.json
Executable file
12
acc.json
Executable file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"admin": {
|
||||
"pass": "123213",
|
||||
"role": "admin",
|
||||
"nickname": "管理员"
|
||||
},
|
||||
"user": {
|
||||
"pass": "user",
|
||||
"role": "normal",
|
||||
"nickname": "王大爷"
|
||||
}
|
||||
}
|
57
app.js
Executable file
57
app.js
Executable file
@ -0,0 +1,57 @@
|
||||
var http = require('http');
|
||||
|
||||
//聊天服务
|
||||
var chat = require('./lib/chat');
|
||||
//web服务
|
||||
var web = require('./lib/web');
|
||||
|
||||
var server = http.createServer(web.handler);
|
||||
var io = require('socket.io')(server);
|
||||
|
||||
var loginUseSession = true; // 是否需要登录
|
||||
|
||||
//进行相关事件处理
|
||||
io.on('connection', function (client) {
|
||||
|
||||
if (!client.handshake.query || !client.handshake.query.key) {
|
||||
//没有正确的连接参数 直接断开连接
|
||||
client.emit('error notice', '连接参数不正确(-1)');
|
||||
client.disconnect();
|
||||
return;
|
||||
}
|
||||
if(client.handshake.query.key != chat.connect_key){
|
||||
//连接的key不正确
|
||||
client.emit('error notice', '连接参数不正确(-2)');
|
||||
client.disconnect();
|
||||
return;
|
||||
}
|
||||
//判断是否存在session_id
|
||||
if (!client.handshake.query && !client.handshake.query.username) {
|
||||
client.emit('error notice', 'no username');
|
||||
client.disconnect();
|
||||
return;
|
||||
}
|
||||
if(loginUseSession) {
|
||||
client['tag'] = 'new';
|
||||
chat.processUserLogin(client);
|
||||
}else{
|
||||
client.emit('error notice', '请使用session登录');
|
||||
// setTimeout(function() {
|
||||
// client.disconnect();
|
||||
// }, 3000);
|
||||
//仍然使用普通昵称 登录
|
||||
client['tag'] = 'old';
|
||||
chat.processClient(client,{
|
||||
uid:0,
|
||||
nickname:client.handshake.query.username,
|
||||
avatar:'https://default.wm-app.xyz/chat_server/chat/img/default-avatar.jpg'
|
||||
})
|
||||
}
|
||||
});
|
||||
chat.init(io);
|
||||
|
||||
var serverPort = 3000;
|
||||
server.listen(serverPort,()=>{
|
||||
console.log('server start at port ',serverPort);
|
||||
console.log(`open http://localhost:${serverPort}/ view`)
|
||||
});
|
340
client.js
Executable file
340
client.js
Executable file
@ -0,0 +1,340 @@
|
||||
(function (document, window) {
|
||||
var _layer = {
|
||||
create: function (tag, html, _p) {
|
||||
_p = _p || document.body;
|
||||
var _ele = document.createElement(tag);
|
||||
_ele.innerHTML = html || ' ';
|
||||
_p.appendChild(_ele);
|
||||
return (function (a, pp) {
|
||||
var ss = function (ele, p) {
|
||||
var _ret = {
|
||||
get: function () {
|
||||
return ele;
|
||||
},
|
||||
on: function (evt, f) {
|
||||
ele['on' + evt] = f;
|
||||
return _ret;
|
||||
},
|
||||
addClass: function (clsName) {
|
||||
ele.className += clsName;
|
||||
return _ret;
|
||||
},
|
||||
remove: function () {
|
||||
p.removeChild(ele);
|
||||
},
|
||||
html: function (s) {
|
||||
if (s) ele.innerHTML = s;
|
||||
return ele.innerHTML;
|
||||
},
|
||||
css: function (name, value) {
|
||||
ele.style[name] = value;
|
||||
return _ret;
|
||||
},
|
||||
find: function (s) {
|
||||
data = ele.querySelector(s);
|
||||
if (data) {
|
||||
return ss(data);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
center: function () {
|
||||
ele.style['left'] = (window.innerWidth - ele.offsetWidth) / 2 + 'px';
|
||||
ele.style['top'] = (window.innerHeight - ele.offsetHeight) / 2 + 'px';
|
||||
return _ret;
|
||||
}
|
||||
};
|
||||
_ret[0] = ele;
|
||||
return _ret;
|
||||
}
|
||||
return ss(a, pp);
|
||||
})(_ele, _p);
|
||||
},
|
||||
alert: function (message) {
|
||||
var tpl = `<div class="layui-layer-shade" times="3" style="z-index: 19891016; background-color: rgb(0, 0, 0); opacity: 0.3;"></div>
|
||||
<div class="layui-layer layui-layer-dialog" id="layui-layer3" type="dialog" times="3"
|
||||
showtime="0" contype="string" style="z-index: 19891017; ">
|
||||
<div class="layui-layer-title" style="cursor: move;">信息</div><div id="" class="layui-layer-content"></div><span class="layui-layer-setwin"><a class="layui-layer-ico layui-layer-close layui-layer-close1" href="javascript:;"></a></span><div class="layui-layer-btn layui-layer-btn-"><a class="layui-layer-btn0 close-dialog">确定</a></div><span class="layui-layer-resize"></span></div>`;
|
||||
var dialog = _layer.create('div', tpl).addClass('layer-wrapper');
|
||||
dialog.find('.layui-layer-content').html(message);
|
||||
var _c = function () {
|
||||
dialog.remove();
|
||||
return false;
|
||||
};
|
||||
dialog.find('.layui-layer-close1').on('click', _c);
|
||||
dialog.find('.close-dialog').on('click', _c);
|
||||
dialog.find('.layui-layer-dialog').center();
|
||||
},
|
||||
msg: function (message) {
|
||||
var msgString = `<div class="layui-layer layui-layer-dialog layui-layer-border layui-layer-msg layui-layer-hui"
|
||||
id="layui-layer3" type="dialog" times="3" showtime="0" contype="string" style="z-index: 19891017; ">
|
||||
<div id="" class="layui-layer-content">` +
|
||||
message + '</div><span class="layui-layer-setwin"></span></div>';
|
||||
var ele = _layer.create('div', msgString).addClass('layer-wrapper');
|
||||
var child = ele.get().children[0]
|
||||
child.style['left'] = (window.innerWidth - child.offsetWidth) / 2 + 'px';
|
||||
// child.style['top'] = (window.innerHeight - child.offsetHeight)/2 + 'px';
|
||||
ele.find('.layui-layer-dialog').css('top', (window.innerHeight - child.offsetHeight) / 2 + 'px');
|
||||
setTimeout(function () {
|
||||
ele.remove();
|
||||
}, 4000);
|
||||
},
|
||||
loading: function (message, time) {
|
||||
var tpl = `<div class="layui-layer-shade" times="3" style="z-index: 19891016; background-color: rgb(0, 0, 0); opacity: 0.3;"></div>
|
||||
<div class="layui-layer layui-layer-dialog layui-layer-msg" id="layui-layer4" type="dialog" times="4" showtime="0" contype="string" style="z-index: 19891018; top: 430.5px; left: 360px;"><div id="" class="layui-layer-content layui-layer-padding"><i class="layui-layer-ico layui-layer-ico16"></i><span class="loading-text"></span></div><span class="layui-layer-setwin"></span></div>`;
|
||||
var dialog = _layer.create('div', tpl).addClass('layer-wrapper');
|
||||
dialog.find('.loading-text').html(message);
|
||||
var _c = function () {
|
||||
dialog.remove();
|
||||
return false;
|
||||
};
|
||||
if (typeof (time) == 'number' && time > 0) {
|
||||
setTimeout(function () {
|
||||
dialog.remove();
|
||||
}, 4000);
|
||||
}
|
||||
dialog.find('.layui-layer-dialog').center();
|
||||
},
|
||||
closeAll: function () {
|
||||
document.querySelectorAll('.layer-wrapper').forEach(function (ele) {
|
||||
ele.parentNode.removeChild(ele);
|
||||
});
|
||||
}
|
||||
};
|
||||
window['layer'] = _layer;
|
||||
})(document, window);
|
||||
|
||||
(function (w, d) {
|
||||
var __server = 'http://' + location.host,
|
||||
chatServer = __server + '/chat_server/',
|
||||
socket = null, _username = "无名氏",
|
||||
_initStart = false,
|
||||
loadJs = function (src, callback) {
|
||||
var s = d.createElement('script');
|
||||
s.setAttribute('src', src);
|
||||
if (typeof (callback) == 'function') {
|
||||
s.onload = callback;//;
|
||||
}
|
||||
d.head.appendChild(s);
|
||||
},
|
||||
loadCss = function (src, callback) {
|
||||
var s = d.createElement('link');
|
||||
s.setAttribute('href', src);
|
||||
s.setAttribute('rel', 'stylesheet');
|
||||
if (typeof (callback) == 'function') {
|
||||
s.onload = callback;//;
|
||||
}
|
||||
d.head.appendChild(s);
|
||||
},
|
||||
getCookie = function (name) {
|
||||
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
|
||||
if (arr = document.cookie.match(reg))
|
||||
return unescape(arr[2]);
|
||||
else
|
||||
return null;
|
||||
},
|
||||
loading = 0,
|
||||
_ = {
|
||||
init: function () {
|
||||
socket = io(__server + ':3000?username=' + _username);
|
||||
socket.on('error notice', function (err) {
|
||||
try {
|
||||
layer.alert('服务器提示:' + err)
|
||||
} catch (e) {
|
||||
alert('服务器提示:' + err)
|
||||
}
|
||||
console.error('服务器提示:', err)
|
||||
});
|
||||
socket.on('message', function (data) {
|
||||
if (typeof (ret.onMessage) == 'function') {
|
||||
ret.onMessage(JSON.parse(data));
|
||||
} else console.log(data);
|
||||
});
|
||||
socket.on('updatePerson', function (data) {
|
||||
if (typeof (ret.onUpdatePerson) == 'function') {
|
||||
ret.onUpdatePerson(JSON.parse(data));
|
||||
} else console.log(data);
|
||||
});
|
||||
socket.on('connect', function () {
|
||||
setTimeout(function () {
|
||||
layer.closeAll();
|
||||
}, 500);
|
||||
console.log('connect server success');
|
||||
});
|
||||
socket.on('reconnect', function () {
|
||||
// layer.closeAll();
|
||||
console.log('reconnect server success');
|
||||
});
|
||||
socket.on('disconnect', function () {
|
||||
layer.loading('连接服务器中...', 0);
|
||||
});
|
||||
|
||||
layer.loading('连接服务器中...', 0);
|
||||
|
||||
}
|
||||
},
|
||||
ret = {
|
||||
/**
|
||||
* 发送消息
|
||||
* @param string message
|
||||
*/
|
||||
sendMessage: function (message) {
|
||||
if (!socket) {
|
||||
alert("请先使用start()注册聊天服务!");
|
||||
}
|
||||
socket.emit('message', message);
|
||||
},
|
||||
sendMessageTo: function (message, uuid) {
|
||||
if (!socket) {
|
||||
alert("请先使用start()注册聊天服务!");
|
||||
}
|
||||
socket.emit('message_to', JSON.stringify({contenet: message, uuid: uuid}));
|
||||
},
|
||||
startWithSession: function (session_id) {
|
||||
if (_initStart) {
|
||||
alert('已经start过了');
|
||||
return;
|
||||
}
|
||||
_initStart = true;
|
||||
if (!session_id) {
|
||||
try {
|
||||
layer.alert("用户的session不能为空!")
|
||||
} catch (e) {
|
||||
alert("用户的session不能为空!")
|
||||
}
|
||||
return false;
|
||||
}
|
||||
_username = 'nickname&session=' + session_id;
|
||||
loadJs(__server + '/socket.io/socket.io.js', _.init);
|
||||
},
|
||||
start: function (username) {
|
||||
if (_initStart) {
|
||||
alert('start()已经被调用过了');
|
||||
return;
|
||||
}
|
||||
_initStart = true;
|
||||
try {
|
||||
layer.msg('此方法即将被废弃请使用startWidthSession()')
|
||||
} catch (ex) {
|
||||
}
|
||||
if (!username) {
|
||||
setTimeout(function () {
|
||||
try {
|
||||
layer.alert("请输入用户名!")
|
||||
} catch (e) {
|
||||
alert("请输入用户名!")
|
||||
}
|
||||
}, 50);
|
||||
return false;
|
||||
}
|
||||
_username = username;
|
||||
loadJs(__server + '/socket.io/socket.io.js', _.init);
|
||||
},
|
||||
regUser: function (username, pwd1, pwd2, nickname, email, valicode, onDataBack) {
|
||||
if (!username || !pwd1 || !pwd2 || !nickname || !email || !valicode) {
|
||||
try {
|
||||
layer.alert("所有的参数都填写了吗!")
|
||||
} catch (e) {
|
||||
alert("所有的参数都填写了吗!")
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (typeof (onDataBack) != 'function') {
|
||||
try {
|
||||
layer.alert("没有设置数据处理函数!")
|
||||
} catch (e) {
|
||||
alert("没有设置数据处理函数!")
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var postData = {
|
||||
'username': username,
|
||||
'pwd1': pwd1,
|
||||
'pwd2': pwd2,
|
||||
'email': email,
|
||||
'nickname': nickname,
|
||||
'valicode': valicode
|
||||
};
|
||||
$.post(chatServer + 'account/reg.php', postData, function (ret) {
|
||||
if (ret['code'] == 0) {
|
||||
onDataBack('success', ret['data']);
|
||||
} else {
|
||||
onDataBack('error', ret['message']);
|
||||
}
|
||||
}, 'json');
|
||||
},
|
||||
showMessage:function(message){
|
||||
try {
|
||||
layer.msg(message);
|
||||
} catch (e) {
|
||||
alert(message);
|
||||
}
|
||||
},
|
||||
showAlert:function(message){
|
||||
try {
|
||||
layer.alert(message);
|
||||
} catch (e) {
|
||||
alert(message);
|
||||
}
|
||||
},
|
||||
userLogin: function (username, password) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!username || !password) {
|
||||
ret.showAlert('必须填写用户名和密码');
|
||||
resolve(false);return;
|
||||
}
|
||||
var xhr = $.ajax({
|
||||
url: chatServer + 'account/login.php',
|
||||
async: false,
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
data: {username: username, password: password}
|
||||
});
|
||||
if (xhr.status != 200) {
|
||||
resolve(false);
|
||||
} else {
|
||||
var data = xhr.responseJSON;
|
||||
if (data.code == 0) {
|
||||
resolve(data.data)
|
||||
}else{
|
||||
ret.showMessage(data.message);
|
||||
resolve(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
sendEmailCode: function (email) {
|
||||
return new Promise((resolve, reject) => {
|
||||
$.post(chatServer + 'sendEmail.php', {'email': email}, function (ret) {
|
||||
if (ret['code'] == 0) {
|
||||
resolve(ret['data']);
|
||||
} else {
|
||||
reject(ret['message']);
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
},
|
||||
addEventListener: function (eventName, callback) {
|
||||
|
||||
},
|
||||
onMessage: function (data) {
|
||||
console.log(data);
|
||||
},
|
||||
|
||||
onUpdatePerson: function (data) {
|
||||
console.log(data);
|
||||
}
|
||||
};
|
||||
//ret.__proto__['get_cookie'] = get_cookie;
|
||||
w.Chat = ret;
|
||||
if (typeof (w['jQuery']) == 'function' ) {
|
||||
loadCss('https://cdn.bootcss.com/layer/3.1.0/theme/default/layer.css');
|
||||
//loadJs('https://cdn.bootcss.com/layer/3.1.0/layer.js');
|
||||
} else {
|
||||
loadJs('https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js', function () {
|
||||
loadCss('https://cdn.bootcss.com/layer/3.1.0/theme/default/layer.css');
|
||||
//loadJs('https://cdn.bootcss.com/layer/3.1.0/layer.js');
|
||||
});
|
||||
}
|
||||
})(window, document);
|
253
lib/chat.js
Executable file
253
lib/chat.js
Executable file
@ -0,0 +1,253 @@
|
||||
var xss = require('xss');
|
||||
var emoji = require('./emoji');
|
||||
var uuid_v4 = require('uuid/v4');
|
||||
const json = require('./json-tool');
|
||||
|
||||
let accountData = (async () => await json.read())();
|
||||
var io = null;
|
||||
|
||||
var userList = {};
|
||||
|
||||
function updateUser() {
|
||||
var _data = [];
|
||||
for (var p in userList) {
|
||||
//发送 聊天室列表
|
||||
_data.push({
|
||||
uuid: userList[p].uuid,
|
||||
uid: userList[p].uid,
|
||||
name: userList[p].name,
|
||||
avatar: userList[p].avatar
|
||||
});
|
||||
}
|
||||
io.sockets.emit("updatePerson", JSON.stringify(_data));
|
||||
}
|
||||
|
||||
function systemMessage(msg) {
|
||||
var d = new Date();
|
||||
d = d.getHours() + ':' + d.getMinutes();
|
||||
io.sockets.emit("message", JSON.stringify({
|
||||
name: '', //<b>系统[sys]</b>
|
||||
type: 'pub',
|
||||
time: '',
|
||||
content: '<div style="text-align:center;color:#999;font-size:12px;margin:3px;">' +
|
||||
'<span style="padding:0 3px;margin-right:2px">' + d + '</span>' + msg + '</div>'
|
||||
}));
|
||||
}
|
||||
|
||||
function parseBiaoqing(content, client) {
|
||||
var needxss = true;
|
||||
|
||||
if (content.substr(0, 4) == '@xss') {
|
||||
content = content.substr(4);
|
||||
needxss = false;
|
||||
}
|
||||
if (content.substr(0, 1) == '@') {
|
||||
console.log('get order from @' + client.name + ' text:' + content);
|
||||
switch (content.toLowerCase()) {
|
||||
case '@clear':
|
||||
// code
|
||||
systemMessage('需要清除所有的消息');
|
||||
io.sockets.emit('server cmd', '@clear');
|
||||
return;
|
||||
case '@restart': // 重启服务
|
||||
io.sockets.emit("message", JSON.stringify({
|
||||
name: '<b>系统[sys]</b>',
|
||||
type: 'pub',
|
||||
time: '',
|
||||
content: '<h1>系统准备重启!</h1>'
|
||||
}));
|
||||
var __count = 60;
|
||||
var __timer = setInterval(function () {
|
||||
if (__count-- <= 0) {
|
||||
clearInterval(__timer);
|
||||
for (var p in userList) {
|
||||
userList[p].client.disconnect(); //踢下线
|
||||
}
|
||||
//清除所有的用户哟
|
||||
// userList = {};
|
||||
} else {
|
||||
io.sockets.emit("message", JSON.stringify({
|
||||
name: '系统提示', //<b>系统[sys]</b>
|
||||
type: 'pub',
|
||||
time: '',
|
||||
content: '<h1>系统将在 ' + __count + '秒后重启...</h1>'
|
||||
}));
|
||||
}
|
||||
}, 1000);
|
||||
return;
|
||||
default:
|
||||
// code
|
||||
}
|
||||
}
|
||||
|
||||
return emoji.parse(needxss ? xss(content) : content);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function processClient(client, userData) {
|
||||
var _id = client.id;
|
||||
//昵称
|
||||
client['user_nickname'] = userData.nickname;
|
||||
client['uid'] = userData.uid;
|
||||
client['avatar'] = userData.avatar;
|
||||
client['user_type'] = userData.role;
|
||||
var errorNotice = function (msg) {
|
||||
client.emit('error notice', msg);
|
||||
};
|
||||
userList[userData.uid] = {
|
||||
uuid: _id,
|
||||
uid: userData.uid,
|
||||
name: userData.nickname,
|
||||
avatar: userData.avatar,
|
||||
type: userData.role,
|
||||
client: client
|
||||
};
|
||||
|
||||
client.on('event', function (data) {
|
||||
console.log('get event from client');
|
||||
});
|
||||
|
||||
client.on('message_to', function (data) {
|
||||
try {
|
||||
data = JSON.parse(data);
|
||||
} catch (e) {
|
||||
client.emit('error notice', 'error data');
|
||||
return;
|
||||
}
|
||||
//暂时不验证用户是否存在
|
||||
if (!data.to_user) {
|
||||
client.emit('error notice', '没有找到对方');
|
||||
return;
|
||||
}
|
||||
var message_content = parseBiaoqing(data.contenet, client);
|
||||
var readState = 1,
|
||||
message_tag = uuid_v4();
|
||||
var d = new Date();
|
||||
|
||||
//给自己发一条
|
||||
client.emit('message', JSON.stringify({
|
||||
message_id: message_tag,
|
||||
name: client.user_nickname,
|
||||
uid: client.uid,
|
||||
uuid: client.uuid,
|
||||
avatar: client.avatar,
|
||||
// for cust
|
||||
cust_user_id: client.user_type == 0 ? data.to_user : client.uid,
|
||||
type: 'pri',
|
||||
time: d.getHours() + ':' + d.getMinutes(),
|
||||
content: message_content
|
||||
}));
|
||||
if (userList[data.to_user]) {
|
||||
userList[data.to_user].client.emit('message', JSON.stringify({
|
||||
message_id: message_tag,
|
||||
name: client.user_nickname,
|
||||
uid: client.uid,
|
||||
uuid: client.uuid,
|
||||
avatar: client.avatar,
|
||||
cust_user_id: client.user_type == 0 ? data.to_user : client.uid,
|
||||
type: 'pri',
|
||||
time: d.getHours() + ':' + d.getMinutes(),
|
||||
content: message_content
|
||||
}));
|
||||
} else {
|
||||
readState = 2;
|
||||
systemMessage('对方暂时无法接收到该消息');
|
||||
}
|
||||
});
|
||||
client.on('kill client', function (data) {
|
||||
console.log('get kill message,data is ' + data);
|
||||
var _client = userList[data].client;
|
||||
if (!userList[data]) {
|
||||
errorNotice('没有找到要kill的目标(not found uuid)');
|
||||
return;
|
||||
}
|
||||
systemMessage(userList[data].name + '太调皮,需要下线休息一下');
|
||||
|
||||
_client.emit('error notice', '你将会在5s后被强制离线');
|
||||
setTimeout(function () {
|
||||
_client.disconnect();
|
||||
}, 5000);
|
||||
});
|
||||
//
|
||||
//接收到 客户端的消息
|
||||
client.on('message', function (data) {
|
||||
if (!data) {
|
||||
client.emit('error notice', 'need message data');
|
||||
return;
|
||||
}
|
||||
if (data.length > 7 && data.substr(0, 7) == 'sys msg') {
|
||||
systemMessage(data.substr(7))
|
||||
return;
|
||||
}
|
||||
var d = new Date(),
|
||||
h = d.getHours(),
|
||||
m = d.getMinutes(),
|
||||
s = d.getSeconds();
|
||||
|
||||
io.sockets.emit("message", JSON.stringify({
|
||||
name: userData.nickname,
|
||||
type: 'pub',
|
||||
time: (h < 10 ? '0' : h) + ':' + (h < 10 ? '0' : h) + ':' + (h < 10 ? '0' : h),
|
||||
content: parseBiaoqing(data, client)
|
||||
}));
|
||||
});
|
||||
|
||||
client.on('disconnect', function () {
|
||||
if (userList[_id]) {
|
||||
// systemMessage(userData.nickname + ' 下线了');
|
||||
delete userList[_id];
|
||||
}
|
||||
// 更新用户列表
|
||||
updateUser();
|
||||
});
|
||||
}
|
||||
|
||||
//关闭连接
|
||||
function closeClient(client, reason) {
|
||||
client.emit('error notice', reason || '服务器即将断开连接(Server will disconnect)');
|
||||
client.disconnect();
|
||||
}
|
||||
//处理用户登录
|
||||
function processUserLogin(client) {
|
||||
var queryData = client.handshake.query,
|
||||
uid = queryData.uid,
|
||||
pwd = queryData.pwd,
|
||||
_id = client.id;
|
||||
if (accountData[uid]) {
|
||||
if (accountData[uid].pass == pwd) {
|
||||
accountData[uid].uid = uuid_v4();
|
||||
accountData[uid].avatar = 'https://default.wm-app.xyz/chat_server/chat/img/avatar.png';
|
||||
console.log('user %s[type:%s](%s) connect success', accountData[uid]['nickname'], accountData[uid]['role'], _id);
|
||||
processClient(client, accountData[uid])
|
||||
} else {
|
||||
closeClient(client, '登录密码不正确');
|
||||
}
|
||||
} else {
|
||||
closeClient(client, '没有找到登录用户,请先注册!');
|
||||
}
|
||||
}
|
||||
|
||||
exports = module.exports = {
|
||||
connect_key: 'test',
|
||||
init: function (socket) {
|
||||
io = socket;
|
||||
},
|
||||
processClient: processClient,
|
||||
processUserLogin: processUserLogin,
|
||||
systemMessage: systemMessage,
|
||||
closeClient: closeClient,
|
||||
getUserList: function () {
|
||||
var _data = [];
|
||||
for (var p in userList) {
|
||||
//发送 聊天室列表
|
||||
_data.push({
|
||||
uuid: userList[p].uuid,
|
||||
uid: userList[p].uid,
|
||||
name: userList[p].name,
|
||||
avatar: userList[p].avatar
|
||||
});
|
||||
}
|
||||
return _data;
|
||||
}
|
||||
};
|
21
lib/emoji.js
Executable file
21
lib/emoji.js
Executable file
File diff suppressed because one or more lines are too long
37
lib/json-tool.js
Executable file
37
lib/json-tool.js
Executable file
@ -0,0 +1,37 @@
|
||||
const fs = require('fs');
|
||||
// const path = require('path');
|
||||
|
||||
const filePath = './acc.json';//path.join('/', 'acc.json');
|
||||
const _ = {
|
||||
readJSON() {
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile(filePath, function (err, data) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
|
||||
resolve(JSON.parse(data.toString()));
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
writeJSON(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
data = typeof(data) == 'string' ? data : JSON.stringify(data)
|
||||
fs.writeFile(filePath, data, function (err) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else resolve(data);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
exports = module.exports = {
|
||||
read: async () => {
|
||||
return await _.readJSON();
|
||||
},
|
||||
write: async (data) => {
|
||||
return await _.writeJSON(data);
|
||||
}
|
||||
};
|
124
lib/web.js
Executable file
124
lib/web.js
Executable file
@ -0,0 +1,124 @@
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
const querystring = require('querystring');
|
||||
var chat = require('./chat');
|
||||
|
||||
var routes = {};
|
||||
var route = {
|
||||
on: function (url, handler) {
|
||||
routes[url] = handler;
|
||||
},
|
||||
endRequest: (response, header, data) => {
|
||||
if (data) {
|
||||
header['Content-Type'] = 'text/html; charset=UTF-8';
|
||||
if (typeof (data) != 'string') {
|
||||
data = JSON.stringify(data)
|
||||
header['Access-Control-Allow-Origin'] = '*';
|
||||
header['Content-Type'] = 'application/json; charset=UTF-8';
|
||||
}
|
||||
} else {
|
||||
data = '';
|
||||
}
|
||||
response.writeHead(200, header);
|
||||
response.end(data);
|
||||
},
|
||||
process: function (request, response) {
|
||||
var header = {
|
||||
'Content-Type': 'text/html; charset=UTF-8',
|
||||
'Server': 'chat-server'
|
||||
};
|
||||
var requestUrl = request.url.toLowerCase();
|
||||
if (typeof (routes[requestUrl]) == "function") {
|
||||
var data = routes[requestUrl](request, response);
|
||||
let isCallback = data instanceof Promise;
|
||||
if (isCallback) {
|
||||
data.then((resp) => {
|
||||
route.endRequest(response, header, resp);
|
||||
})
|
||||
} else {
|
||||
route.endRequest(response, header, data);
|
||||
}
|
||||
} else {
|
||||
response.writeHead(200, header);
|
||||
response.end('chat-server is running!');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
route.on('/online', function () {
|
||||
return chat.getUserList();
|
||||
});
|
||||
route.on('/reg', function (req, response) {
|
||||
return new Promise((res, rej) => {
|
||||
var data = '';
|
||||
req.on('data', function (chunk) {
|
||||
data += chunk;
|
||||
});
|
||||
req.on('end', function () {
|
||||
//(1).对url进行解码(url会对中文进行编码)
|
||||
console.log(data);
|
||||
data = JSON.parse(decodeURI(data));
|
||||
console.log(data);
|
||||
res({
|
||||
code: 1,
|
||||
message: '错误的数据',
|
||||
data: data
|
||||
});
|
||||
});
|
||||
})
|
||||
});
|
||||
|
||||
|
||||
var coreProcess = function (request, response) {
|
||||
var requestUrl = request.url.toLowerCase();
|
||||
var realPath = path.join('static', 'chat.html');
|
||||
if (requestUrl == '/chat_client.js') {
|
||||
realPath = path.join('static', 'chat_client.js');
|
||||
}
|
||||
console.log(realPath);
|
||||
fs.exists(realPath, function (exists) {
|
||||
fs.stat(realPath, function (err, stat) {
|
||||
var lastModified = stat.mtime.toUTCString();
|
||||
var ifModifiedSince = "If-Modified-Since".toLowerCase();
|
||||
response.setHeader("Last-Modified", lastModified);
|
||||
var expires = new Date();
|
||||
var maxAge = 60 * 60 * 24 * 365;
|
||||
expires.setTime(expires.getTime() + maxAge * 1000);
|
||||
response.setHeader("Expires", expires.toUTCString());
|
||||
response.setHeader("Cache-Control", "max-age=" + maxAge);
|
||||
if (lastModified == request.headers[ifModifiedSince]) {
|
||||
response.writeHead(304, "Not Modified");
|
||||
response.end();
|
||||
} else {
|
||||
var raw = fs.createReadStream(realPath);
|
||||
response.writeHead(200, "Ok");
|
||||
raw.pipe(response);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
route.on('/', coreProcess);
|
||||
route.on('/chat_client.js', coreProcess);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
exports = module.exports = {
|
||||
handler: route.process
|
||||
};
|
359
package-lock.json
generated
Executable file
359
package-lock.json
generated
Executable file
@ -0,0 +1,359 @@
|
||||
{
|
||||
"name": "chat-server",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"accepts": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz",
|
||||
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
|
||||
"requires": {
|
||||
"mime-types": "~2.1.18",
|
||||
"negotiator": "0.6.1"
|
||||
}
|
||||
},
|
||||
"after": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "http://registry.npm.taobao.org/after/download/after-0.8.2.tgz",
|
||||
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
|
||||
},
|
||||
"arraybuffer.slice": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "http://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.7.tgz",
|
||||
"integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU="
|
||||
},
|
||||
"async-limiter": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz",
|
||||
"integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg="
|
||||
},
|
||||
"backo2": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "http://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz",
|
||||
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
|
||||
},
|
||||
"base64-arraybuffer": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz",
|
||||
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
|
||||
},
|
||||
"base64id": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/base64id/download/base64id-1.0.0.tgz",
|
||||
"integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
|
||||
},
|
||||
"better-assert": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "http://registry.npm.taobao.org/better-assert/download/better-assert-1.0.2.tgz",
|
||||
"integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
|
||||
"requires": {
|
||||
"callsite": "1.0.0"
|
||||
}
|
||||
},
|
||||
"blob": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "http://registry.npm.taobao.org/blob/download/blob-0.0.5.tgz",
|
||||
"integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM="
|
||||
},
|
||||
"callsite": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/callsite/download/callsite-1.0.0.tgz",
|
||||
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.20.0",
|
||||
"resolved": "http://registry.npm.taobao.org/commander/download/commander-2.20.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.0.tgz",
|
||||
"integrity": "sha1-1YuytcHuj4ew00ACfp6U4iLFpCI="
|
||||
},
|
||||
"component-bind": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz",
|
||||
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
|
||||
},
|
||||
"component-emitter": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
|
||||
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
|
||||
},
|
||||
"component-inherit": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "http://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz",
|
||||
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz",
|
||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||
},
|
||||
"cssfilter": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "http://registry.npm.taobao.org/cssfilter/download/cssfilter-0.0.10.tgz",
|
||||
"integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4="
|
||||
},
|
||||
"debug": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
|
||||
"integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"engine.io": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "http://registry.npm.taobao.org/engine.io/download/engine.io-3.3.2.tgz",
|
||||
"integrity": "sha1-GMvItvNulGHFwPgd8rgw3hYFilk=",
|
||||
"requires": {
|
||||
"accepts": "~1.3.4",
|
||||
"base64id": "1.0.0",
|
||||
"cookie": "0.3.1",
|
||||
"debug": "~3.1.0",
|
||||
"engine.io-parser": "~2.1.0",
|
||||
"ws": "~6.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
|
||||
"integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"engine.io-client": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "http://registry.npm.taobao.org/engine.io-client/download/engine.io-client-3.3.2.tgz",
|
||||
"integrity": "sha1-BOBoeY11vtoUN1omS7PXQte8M6o=",
|
||||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"component-inherit": "0.0.3",
|
||||
"debug": "~3.1.0",
|
||||
"engine.io-parser": "~2.1.1",
|
||||
"has-cors": "1.1.0",
|
||||
"indexof": "0.0.1",
|
||||
"parseqs": "0.0.5",
|
||||
"parseuri": "0.0.5",
|
||||
"ws": "~6.1.0",
|
||||
"xmlhttprequest-ssl": "~1.5.4",
|
||||
"yeast": "0.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
|
||||
"integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"engine.io-parser": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "http://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-2.1.3.tgz",
|
||||
"integrity": "sha1-dXq5cPvy37Mse3SwMyFtVznveaY=",
|
||||
"requires": {
|
||||
"after": "0.8.2",
|
||||
"arraybuffer.slice": "~0.0.7",
|
||||
"base64-arraybuffer": "0.1.5",
|
||||
"blob": "0.0.5",
|
||||
"has-binary2": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"has-binary2": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "http://registry.npm.taobao.org/has-binary2/download/has-binary2-1.0.3.tgz",
|
||||
"integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=",
|
||||
"requires": {
|
||||
"isarray": "2.0.1"
|
||||
}
|
||||
},
|
||||
"has-cors": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "http://registry.npm.taobao.org/has-cors/download/has-cors-1.1.0.tgz",
|
||||
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
|
||||
},
|
||||
"indexof": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz",
|
||||
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
|
||||
},
|
||||
"isarray": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "http://registry.npm.taobao.org/isarray/download/isarray-2.0.1.tgz",
|
||||
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.38.0",
|
||||
"resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.38.0.tgz",
|
||||
"integrity": "sha1-GiqrFtqesWe0nG5N8tnGjWPY4q0="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.22",
|
||||
"resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.22.tgz",
|
||||
"integrity": "sha1-/ms1WhkJJqt2mMmgVWoRGZshmb0=",
|
||||
"requires": {
|
||||
"mime-db": "~1.38.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz",
|
||||
"integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
|
||||
},
|
||||
"negotiator": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz",
|
||||
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
||||
},
|
||||
"object-component": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "http://registry.npm.taobao.org/object-component/download/object-component-0.0.3.tgz",
|
||||
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
|
||||
},
|
||||
"parseqs": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "http://registry.npm.taobao.org/parseqs/download/parseqs-0.0.5.tgz",
|
||||
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
|
||||
"requires": {
|
||||
"better-assert": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"parseuri": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "http://registry.npm.taobao.org/parseuri/download/parseuri-0.0.5.tgz",
|
||||
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
|
||||
"requires": {
|
||||
"better-assert": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"socket.io": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "http://registry.npm.taobao.org/socket.io/download/socket.io-2.2.0.tgz?cache=0&other_urls=http%3A%2F%2Fregistry.npm.taobao.org%2Fsocket.io%2Fdownload%2Fsocket.io-2.2.0.tgz",
|
||||
"integrity": "sha1-8PYzFh72cSyXKzB1mOzQjJsbTVs=",
|
||||
"requires": {
|
||||
"debug": "~4.1.0",
|
||||
"engine.io": "~3.3.1",
|
||||
"has-binary2": "~1.0.2",
|
||||
"socket.io-adapter": "~1.1.0",
|
||||
"socket.io-client": "2.2.0",
|
||||
"socket.io-parser": "~3.3.0"
|
||||
}
|
||||
},
|
||||
"socket.io-adapter": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "http://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-1.1.1.tgz",
|
||||
"integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
|
||||
},
|
||||
"socket.io-client": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "http://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.2.0.tgz",
|
||||
"integrity": "sha1-hOc+48Q9UCDMwaJY+u65rsJyOvc=",
|
||||
"requires": {
|
||||
"backo2": "1.0.2",
|
||||
"base64-arraybuffer": "0.1.5",
|
||||
"component-bind": "1.0.0",
|
||||
"component-emitter": "1.2.1",
|
||||
"debug": "~3.1.0",
|
||||
"engine.io-client": "~3.3.1",
|
||||
"has-binary2": "~1.0.2",
|
||||
"has-cors": "1.1.0",
|
||||
"indexof": "0.0.1",
|
||||
"object-component": "0.0.3",
|
||||
"parseqs": "0.0.5",
|
||||
"parseuri": "0.0.5",
|
||||
"socket.io-parser": "~3.3.0",
|
||||
"to-array": "0.1.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
|
||||
"integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"socket.io-parser": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "http://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-3.3.0.tgz",
|
||||
"integrity": "sha1-K1KpalCf3zFEC6QP7WCUx9TxJi8=",
|
||||
"requires": {
|
||||
"component-emitter": "1.2.1",
|
||||
"debug": "~3.1.0",
|
||||
"isarray": "2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
|
||||
"integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"to-array": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "http://registry.npm.taobao.org/to-array/download/to-array-0.1.4.tgz",
|
||||
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz",
|
||||
"integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE="
|
||||
},
|
||||
"ws": {
|
||||
"version": "6.1.4",
|
||||
"resolved": "http://registry.npm.taobao.org/ws/download/ws-6.1.4.tgz",
|
||||
"integrity": "sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk=",
|
||||
"requires": {
|
||||
"async-limiter": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"xmlhttprequest-ssl": {
|
||||
"version": "1.5.5",
|
||||
"resolved": "http://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.5.tgz",
|
||||
"integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
|
||||
},
|
||||
"xss": {
|
||||
"version": "0.3.8",
|
||||
"resolved": "http://registry.npm.taobao.org/xss/download/xss-0.3.8.tgz",
|
||||
"integrity": "sha1-0MviO95JC8mME58I3jiZFlporw4=",
|
||||
"requires": {
|
||||
"commander": "^2.9.0",
|
||||
"cssfilter": "0.0.10"
|
||||
}
|
||||
},
|
||||
"yeast": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "http://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz",
|
||||
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
|
||||
}
|
||||
}
|
||||
}
|
18
package.json
Executable file
18
package.json
Executable file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "chat-server",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "app.js",
|
||||
"dependencies": {
|
||||
"socket.io": "^2.1.0",
|
||||
"uuid": "^3.2.1",
|
||||
"xss": "^0.3.8"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "nodemon app.js"
|
||||
},
|
||||
"author": "xiaoyan",
|
||||
"license": "ISC"
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user