This commit is contained in:
LittleBoy 2020-10-24 11:44:53 +08:00
commit b0213a8207
11 changed files with 1254 additions and 0 deletions

23
.gitignore vendored Normal file
View 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
View File

@ -0,0 +1,12 @@
{
"admin": {
"pass": "123213",
"role": "admin",
"nickname": "管理员"
},
"user": {
"pass": "user",
"role": "normal",
"nickname": "王大爷"
}
}

57
app.js Executable file
View 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
View 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
View 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

File diff suppressed because one or more lines are too long

37
lib/json-tool.js Executable file
View 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
View 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
View 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
View 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"
}

10
t.js Executable file
View File

@ -0,0 +1,10 @@
function aa(){
return new Promise((resolve,rejects)=>{
setTimeout(()=>{
resolve(111);
},1000);
});
}
var data = 1;//aa();
console.log(data instanceof Promise);