From b0213a8207eb40b11d7cb55a1133c4efe0a2454b Mon Sep 17 00:00:00 2001 From: callmeyan Date: Sat, 24 Oct 2020 11:44:53 +0800 Subject: [PATCH] init --- .gitignore | 23 +++ acc.json | 12 ++ app.js | 57 ++++++++ client.js | 340 +++++++++++++++++++++++++++++++++++++++++++ lib/chat.js | 253 ++++++++++++++++++++++++++++++++ lib/emoji.js | 21 +++ lib/json-tool.js | 37 +++++ lib/web.js | 124 ++++++++++++++++ package-lock.json | 359 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 18 +++ t.js | 10 ++ 11 files changed, 1254 insertions(+) create mode 100644 .gitignore create mode 100755 acc.json create mode 100755 app.js create mode 100755 client.js create mode 100755 lib/chat.js create mode 100755 lib/emoji.js create mode 100755 lib/json-tool.js create mode 100755 lib/web.js create mode 100755 package-lock.json create mode 100755 package.json create mode 100755 t.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3ea5a5 --- /dev/null +++ b/.gitignore @@ -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? \ No newline at end of file diff --git a/acc.json b/acc.json new file mode 100755 index 0000000..ac68f9a --- /dev/null +++ b/acc.json @@ -0,0 +1,12 @@ +{ + "admin": { + "pass": "123213", + "role": "admin", + "nickname": "管理员" + }, + "user": { + "pass": "user", + "role": "normal", + "nickname": "王大爷" + } +} \ No newline at end of file diff --git a/app.js b/app.js new file mode 100755 index 0000000..a24e12c --- /dev/null +++ b/app.js @@ -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`) +}); \ No newline at end of file diff --git a/client.js b/client.js new file mode 100755 index 0000000..90337de --- /dev/null +++ b/client.js @@ -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 = `
+
+
信息
`; + 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 = `
+
` + + message + '
'; + 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 = `
+
`; + 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); \ No newline at end of file diff --git a/lib/chat.js b/lib/chat.js new file mode 100755 index 0000000..8ecf48e --- /dev/null +++ b/lib/chat.js @@ -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: '', //系统[sys] + type: 'pub', + time: '', + content: '
' + + '' + d + '' + msg + '
' + })); +} + +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: '系统[sys]', + type: 'pub', + time: '', + content: '

系统准备重启!

' + })); + 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: '系统提示', //系统[sys] + type: 'pub', + time: '', + content: '

系统将在 ' + __count + '秒后重启...

' + })); + } + }, 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; + } +}; \ No newline at end of file diff --git a/lib/emoji.js b/lib/emoji.js new file mode 100755 index 0000000..8fc556a --- /dev/null +++ b/lib/emoji.js @@ -0,0 +1,21 @@ +var host_server = 'https://default.wm-app.xyz/emoji/basic/'; +/*##EMOJILIST*/ +var namedEmojiString = + "+1,-1,100,1234,8ball,a,ab,abc,abcd,accept,aerial_tramway,airplane,alarm_clock,alien,ambulance,anchor,angel,anger,angry,anguished,ant,apple,aquarius,aries,arrow_backward,arrow_double_down,arrow_double_up,arrow_down,arrow_down_small,arrow_forward,arrow_heading_down,arrow_heading_up,arrow_left,arrow_lower_left,arrow_lower_right,arrow_right,arrow_right_hook,arrow_up,arrow_up_down,arrow_up_small,arrow_upper_left,arrow_upper_right,arrows_clockwise,arrows_counterclockwise,art,articulated_lorry,astonished,atm,b,baby,baby_bottle,baby_chick,baby_symbol,back,baggage_claim,balloon,ballot_box_with_check,bamboo,banana,bangbang,bank,bar_chart,barber,baseball,basketball,bath,bathtub,battery,bear,bee,beer,beers,beetle,beginner,bell,bento,bicyclist,bike,bikini,bird,birthday,black_circle,black_joker,black_medium_small_square,black_medium_square,black_nib,black_small_square,black_square,black_square_button,blossom,blowfish,blue_book,blue_car,blue_heart,blush,boar,boat,bomb,book,bookmark,bookmark_tabs,books,boom,boot,bouquet,bow,bowling,bowtie,boy,bread,bride_with_veil,bridge_at_night,briefcase,broken_heart,bug,bulb,bullettrain_front,bullettrain_side,bus,busstop,bust_in_silhouette,busts_in_silhouette,cactus,cake,calendar,calling,camel,camera,cancer,candy,capital_abcd,capricorn,car,card_index,carousel_horse,cat,cat2,cd,chart,chart_with_downwards_trend,chart_with_upwards_trend,checkered_flag,cherries,cherry_blossom,chestnut,chicken,children_crossing,chocolate_bar,christmas_tree,church,cinema,circus_tent,city_sunrise,city_sunset,cl,clap,clapper,clipboard,clock1,clock10,clock1030,clock11,clock1130,clock12,clock1230,clock130,clock2,clock230,clock3,clock330,clock4,clock430,clock5,clock530,clock6,clock630,clock7,clock730,clock8,clock830,clock9,clock930,closed_book,closed_lock_with_key,closed_umbrella,cloud,clubs,cn,cocktail,coffee,cold_sweat,collision,computer,confetti_ball,confounded,confused,congratulations,construction,construction_worker,convenience_store,cookie,cool,cop,copyright,corn,couple,couple_with_heart,couplekiss,cow,cow2,credit_card,crescent_moon,crocodile,crossed_flags,crown,cry,crying_cat_face,crystal_ball,cupid,curly_loop,currency_exchange,curry,custard,customs,cyclone,dancer,dancers,dango,dart,dash,date,de,deciduous_tree,department_store,diamond_shape_with_a_dot_inside,diamonds,disappointed,disappointed_relieved,dizzy,dizzy_face,do_not_litter,dog,dog2,dollar,dolls,dolphin,donut,door,doughnut,dragon,dragon_face,dress,dromedary_camel,droplet,dvd,e-mail,ear,ear_of_rice,earth_africa,earth_americas,earth_asia,egg,eggplant,eight,eight_pointed_black_star,eight_spoked_asterisk,electric_plug,elephant,email,end,envelope,es,euro,european_castle,european_post_office,evergreen_tree,exclamation,expressionless,eyeglasses,eyes,facepunch,factory,fallen_leaf,family,fast_forward,fax,fearful,feelsgood,feet,ferris_wheel,file_folder,finnadie,fire,fire_engine,fireworks,first_quarter_moon,first_quarter_moon_with_face,fish,fish_cake,fishing_pole_and_fish,fist,five,flags,flashlight,floppy_disk,flower_playing_cards,flushed,foggy,football,fork_and_knife,fountain,four,four_leaf_clover,fr,free,fried_shrimp,fries,frog,frowning,fu,fuelpump,full_moon,full_moon_with_face,game_die,gb,gem,gemini,ghost,gift,gift_heart,girl,globe_with_meridians,goat,goberserk,godmode,golf,grapes,green_apple,green_book,green_heart,grey_exclamation,grey_question,grimacing,grin,grinning,guardsman,guitar,gun,haircut,hamburger,hammer,hamster,hand,handbag,hankey,hash,hatched_chick,hatching_chick,headphones,hear_no_evil,heart,heart_decoration,heart_eyes,heart_eyes_cat,heartbeat,heartpulse,hearts,heavy_check_mark,heavy_division_sign,heavy_dollar_sign,heavy_exclamation_mark,heavy_minus_sign,heavy_multiplication_x,heavy_plus_sign,helicopter,herb,hibiscus,high_brightness,high_heel,hocho,honey_pot,honeybee,horse,horse_racing,hospital,hotel,hotsprings,hourglass,hourglass_flowing_sand,house,house_with_garden,hurtrealbad,hushed,ice_cream,icecream,id,ideograph_advantage,imp,inbox_tray,incoming_envelope,information_desk_person,information_source,innocent,interrobang,iphone,it,izakaya_lantern,jack_o_lantern,japan,japanese_castle,japanese_goblin,japanese_ogre,jeans,joy,joy_cat,jp,key,keycap_ten,kimono,kiss,kissing,kissing_cat,kissing_closed_eyes,kissing_face,kissing_heart,kissing_smiling_eyes,koala,koko,kr,large_blue_circle,large_blue_diamond,large_orange_diamond,last_quarter_moon,last_quarter_moon_with_face,laughing,leaves,ledger,left_luggage,left_right_arrow,leftwards_arrow_with_hook,lemon,leo,leopard,libra,light_rail,link,lips,lipstick,lock,lock_with_ink_pen,lollipop,loop,loudspeaker,love_hotel,love_letter,low_brightness,m,mag,mag_right,mahjong,mailbox,mailbox_closed,mailbox_with_mail,mailbox_with_no_mail,man,man_with_gua_pi_mao,man_with_turban,mans_shoe,maple_leaf,mask,massage,meat_on_bone,mega,melon,memo,mens,metal,metro,microphone,microscope,milky_way,minibus,minidisc,mobile_phone_off,money_with_wings,moneybag,monkey,monkey_face,monorail,mortar_board,mount_fuji,mountain_bicyclist,mountain_cableway,mountain_railway,mouse,mouse2,movie_camera,moyai,muscle,mushroom,musical_keyboard,musical_note,musical_score,mute,nail_care,name_badge,neckbeard,necktie,negative_squared_cross_mark,neutral_face,new,new_moon,new_moon_with_face,newspaper,ng,nine,no_bell,no_bicycles,no_entry,no_entry_sign,no_good,no_mobile_phones,no_mouth,no_pedestrians,no_smoking,non-potable_water,nose,notebook,notebook_with_decorative_cover,notes,nut_and_bolt,o,o2,ocean,octocat,octopus,oden,office,ok,ok_hand,ok_woman,older_man,older_woman,on,oncoming_automobile,oncoming_bus,oncoming_police_car,oncoming_taxi,one,open_file_folder,open_hands,open_mouth,ophiuchus,orange_book,outbox_tray,ox,package,page_facing_up,page_with_curl,pager,palm_tree,panda_face,paperclip,parking,part_alternation_mark,partly_sunny,passport_control,paw_prints,peach,pear,pencil,pencil2,penguin,pensive,performing_arts,persevere,person_frowning,person_with_blond_hair,person_with_pouting_face,phone,pig,pig2,pig_nose,pill,pineapple,pisces,pizza,plus1,point_down,point_left,point_right,point_up,point_up_2,police_car,poodle,poop,post_office,postal_horn,postbox,potable_water,pouch,poultry_leg,pound,pouting_cat,pray,princess,punch,purple_heart,purse,pushpin,put_litter_in_its_place,question,rabbit,rabbit2,racehorse,radio,radio_button,rage,rage1,rage2,rage3,rage4,railway_car,rainbow,raised_hand,raised_hands,raising_hand,ram,ramen,rat,recycle,red_car,red_circle,registered,relaxed,relieved,repeat,repeat_one,restroom,revolving_hearts,rewind,ribbon,rice,rice_ball,rice_cracker,rice_scene,ring,rocket,roller_coaster,rooster,rose,rotating_light,round_pushpin,rowboat,ru,rugby_football,runner,running,running_shirt_with_sash,sa,sagittarius,sailboat,sake,sandal,santa,satellite,satisfied,saxophone,school,school_satchel,scissors,scorpius,scream,scream_cat,scroll,seat,secret,see_no_evil,seedling,seven,shaved_ice,sheep,shell,ship,shipit,shirt,shit,shoe,shower,signal_strength,six,six_pointed_star,ski,skull,sleeping,sleepy,slot_machine,small_blue_diamond,small_orange_diamond,small_red_triangle,small_red_triangle_down,smile,smile_cat,smiley,smiley_cat,smiling_imp,smirk,smirk_cat,smoking,snail,snake,snowboarder,snowflake,snowman,sob,soccer,soon,sos,sound,space_invader,spades,spaghetti,sparkle,sparkler,sparkles,sparkling_heart,speak_no_evil,speaker,speech_balloon,speedboat,squirrel,star,star2,stars,station,statue_of_liberty,steam_locomotive,stew,straight_ruler,strawberry,stuck_out_tongue,stuck_out_tongue_closed_eyes,stuck_out_tongue_winking_eye,sun_with_face,sunflower,sunglasses,sunny,sunrise,sunrise_over_mountains,surfer,sushi,suspect,suspension_railway,sweat,sweat_drops,sweat_smile,sweet_potato,swimmer,symbols,syringe,tada,tanabata_tree,tangerine,taurus,taxi,tea,telephone,telephone_receiver,telescope,tennis,tent,thought_balloon,three,thumbsdown,thumbsup,ticket,tiger,tiger2,tired_face,tm,toilet,tokyo_tower,tomato,tongue,top,tophat,tractor,traffic_light,train,train2,tram,triangular_flag_on_post,triangular_ruler,trident,triumph,trolleybus,trollface,trophy,tropical_drink,tropical_fish,truck,trumpet,tshirt,tulip,turtle,tv,twisted_rightwards_arrows,two,two_hearts,two_men_holding_hands,two_women_holding_hands,u5272,u5408,u55b6,u6307,u6708,u6709,u6e80,u7121,u7533,u7981,u7a7a,uk,umbrella,unamused,underage,unlock,up,us,v,vertical_traffic_light,vhs,vibration_mode,video_camera,video_game,violin,virgo,volcano,vs,walking,waning_crescent_moon,waning_gibbous_moon,warning,watch,water_buffalo,watermelon,wave,wavy_dash,waxing_crescent_moon,waxing_gibbous_moon,wc,weary,wedding,whale,whale2,wheelchair,white_check_mark,white_circle,white_flower,white_large_square,white_medium_small_square,white_medium_square,white_small_square,white_square_button,wind_chime,wine_glass,wink,wolf,woman,womans_clothes,womans_hat,womens,worried,wrench,x,yellow_heart,yen,yum,zap,zero,zzz"; + +var namedEmoji = namedEmojiString.split(/,/); + +exports = module.exports = { + /** + * 替换emoji表情 + * @param {string} str 内容 + */ + parse:function(str){ + return str.replace(/:([a-z0-9A-Z_-]+):/g, function (a, b) { + if(namedEmoji.indexOf(b) != -1){ + return ''; + } + return a; + }); + } +}; diff --git a/lib/json-tool.js b/lib/json-tool.js new file mode 100755 index 0000000..a3bbd84 --- /dev/null +++ b/lib/json-tool.js @@ -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); + } +}; diff --git a/lib/web.js b/lib/web.js new file mode 100755 index 0000000..156db8b --- /dev/null +++ b/lib/web.js @@ -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 +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100755 index 0000000..21020e1 --- /dev/null +++ b/package-lock.json @@ -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=" + } + } +} diff --git a/package.json b/package.json new file mode 100755 index 0000000..46fbf04 --- /dev/null +++ b/package.json @@ -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" +} diff --git a/t.js b/t.js new file mode 100755 index 0000000..e2ebe19 --- /dev/null +++ b/t.js @@ -0,0 +1,10 @@ + +function aa(){ + return new Promise((resolve,rejects)=>{ + setTimeout(()=>{ + resolve(111); + },1000); + }); +} +var data = 1;//aa(); +console.log(data instanceof Promise); \ No newline at end of file