├── README.md ├── chatRoom ├── README.md ├── app.js ├── index.html ├── index.js ├── package-lock.json └── package.json ├── socket_io ├── app.js ├── index.html ├── package-lock.json ├── package.json └── readme.md ├── vue_chatroom ├── README.md └── vue_element_chat │ ├── .babelrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package-lock.json │ ├── package.json │ ├── server │ ├── app.js │ ├── package-lock.json │ └── package.json │ ├── src │ ├── App.vue │ ├── assets │ │ └── logo.png │ └── main.js │ └── webpack.config.js └── websocket_test ├── index.html ├── package-lock.json ├── package.json ├── reademe.md └── server.js /README.md: -------------------------------------------------------------------------------- 1 | # Chatroom 2 | ChatRoom Using WebSocket and Node.js 3 | 4 | 文档完善中...... 5 | 6 | 7 | -------------------------------------------------------------------------------- /chatRoom/README.md: -------------------------------------------------------------------------------- 1 | # 启动 2 | 3 | 1. >npm init 4 | 2. >npm install express 5 | 3. >npm install socket.io 6 | 4. >npm install 7 | 5. >package.json里面添加"start":"node app.js" 8 | 6. >npm start -------------------------------------------------------------------------------- /chatRoom/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | // 设置静态文件夹,会默认找当前目录下的index.html文件当做访问的页面 4 | app.use(express.static(__dirname)); 5 | 6 | const server = require('http').createServer(app); 7 | const io = require('socket.io')(server); 8 | 9 | // 用来保存对应的socket 10 | let socketObj = {}; 11 | // 上来记录一个socket.id用来查找对应的用户 12 | let mySocket = {}; 13 | // 创建一个数组用来保存最近的20条消息记录,真实项目中会存到数据库中 14 | let msgHistory = []; 15 | 16 | const SYSTEM = '系统'; 17 | // 设置一些颜色的数组,让每次进入聊天的用户颜色都不一样 18 | let userColor = ['#00a1f4', '#0cc', '#f44336', '#795548', '#e91e63', '#00bcd4', '#009688', '#4caf50', '#8bc34a', '#ffc107', '#607d8b', '#ff9800', '#ff5722']; 19 | 20 | io.on('connection', socket => { 21 | // 这是所有连接到服务端的socket.id 22 | mySocket[socket.id] = socket; 23 | console.log('id', socket.id); 24 | 25 | // 记录用户名,用来记录是不是第一次进入 26 | let username, color, rooms = []; 27 | // 监听客户端发过来的消息 28 | socket.on('message', msg => { 29 | if (username) { 30 | let private = msg.match(/@([^ ]+) (.+)/); 31 | 32 | if (private) { // 私聊 33 | let user = private[1]; 34 | let content = private[2]; 35 | let toSocket = socketObj[user]; 36 | // 对方的socket存在,就发送消息 37 | if (toSocket) { 38 | toSocket.send({ 39 | user: username, 40 | color, 41 | content, 42 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 43 | }); 44 | } 45 | } else { 46 | // 房间内和房间外都是一样的消息对象,直接存成msgObj变量使用 47 | let msgObj = { 48 | user: username, 49 | color, 50 | content: msg, 51 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 52 | }; 53 | 54 | // 如果rooms数组有值,就代表有用户进入了房间 55 | if (rooms.length) { 56 | // 用来存储进入房间内的对应的socket.id 57 | let socketJson = {}; 58 | 59 | rooms.forEach(room => { 60 | // 取得进入房间内所对应的所有sockets的hash值,它便是拿到的socket.id 61 | let roomSockets = io.sockets.adapter.rooms[room].sockets; 62 | Object.keys(roomSockets).forEach(socketId => { 63 | console.log('socketId', socketId); 64 | // 进行一个去重,在socketJson中只有对应唯一的socketId 65 | if (!socketJson[socketId]) { 66 | socketJson[socketId] = 1; 67 | } 68 | }); 69 | }); 70 | 71 | // 遍历socketJson,在mySocket里找到对应的id,然后发送消息 72 | Object.keys(socketJson).forEach(socketId => { 73 | mySocket[socketId].emit('message', msgObj); 74 | }); 75 | } else { 76 | // 如果不是私聊的 77 | // 向所有人广播 78 | io.emit('message', msgObj); 79 | 80 | // 把发送的消息push到msgHistory中 81 | // 真实情况是存到数据库里的 82 | msgHistory.push(msgObj); 83 | } 84 | } 85 | } else { 86 | // 如果是第一次进入的话,就将输入的内容当做用户名 87 | username = msg; 88 | color = shuffle(userColor)[0]; 89 | // 这里保存一份对应的socket用户,以便之后可以找到该用户 90 | socketObj[username] = socket; 91 | // 向除了自己的所有人广播,毕竟进没进入自己当然是知道的,没必要跟自己再说 92 | socket.broadcast.emit('message', { 93 | user: SYSTEM, 94 | color, 95 | content: `${username}加入了聊天`, 96 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 97 | }); 98 | } 99 | }); 100 | // 监听进入房间的事件 101 | socket.on('join', room => { 102 | // 判断一下用户是否进入了房间,如果没有才让其进到房间里 103 | if (username && rooms.indexOf(room) === -1) { 104 | // socket.join表示进入某个房间 105 | socket.join(room); 106 | rooms.push(room); 107 | // 这里发送个joined事件,让前端监听后,控制房间按钮 108 | socket.emit('joined', room); 109 | // 通知一下自己 110 | socket.send({ 111 | user: SYSTEM, 112 | color, 113 | content: `你已加入到${room}战队`, 114 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 115 | }); 116 | } 117 | }); 118 | // 监听离开房间的事件 119 | socket.on('leave', room => { 120 | // index为该房间在数组rooms中的索引,方便删除 121 | let index = rooms.indexOf(room); 122 | if (index !== -1) { 123 | socket.leave(room); // 离开该房间 124 | rooms.splice(index, 1); // 删掉该房间 125 | // 这里发送个leaved事件,让前端监听后,控制房间按钮 126 | socket.emit('leaved', room); 127 | // 通知一下自己 128 | socket.send({ 129 | user: SYSTEM, 130 | color, 131 | content: `你已经离开${room}战队`, 132 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 133 | }); 134 | } 135 | }); 136 | 137 | // 监听获取历史消息的事件 138 | socket.on('getHistory', () => { 139 | // 通过数组的slice方法截取最新的20条消息 140 | if (msgHistory.length) { 141 | let history = msgHistory.slice(msgHistory.length - 20); 142 | socket.emit('history', history); 143 | } 144 | }); 145 | }); 146 | 147 | 148 | // 乱序排列 149 | function shuffle(arr) { 150 | let len = arr.length, random; 151 | while (0 !== len) { 152 | random = (Math.random() * len--) >>> 0; // 右移位运算符向下取整 153 | [arr[len], arr[random]] = [arr[random], arr[len]]; // 解构赋值实现变量互换 154 | } 155 | return arr; 156 | } 157 | // 时间补零 158 | function addZero(n) { 159 | return n < 10 ? '0' + n : '' + n; 160 | } 161 | 162 | 163 | 164 | // 这里记住要用server去监听端口,而不是app.listen去监听(防止找不到/socket.io/socket.io.js文件) 165 | server.listen(4000); -------------------------------------------------------------------------------- /chatRoom/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 聊聊天 9 | 22 | 23 | 24 |
25 |
26 |
27 |
28 |
29 |

放轻松,聊聊天

30 |
31 |
32 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 |
41 |
42 |
    43 |
    44 | 54 |
    55 |
    56 |
    57 |
    58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /chatRoom/index.js: -------------------------------------------------------------------------------- 1 | let socket = io(); 2 | // 列表list,输入框content,按钮sendBtn 3 | let list = document.getElementById('list'), 4 | input = document.getElementById('input'), 5 | sendBtn = document.getElementById('sendBtn'); 6 | 7 | // 发言的方法 8 | function send() { 9 | console.log(socket.connected); 10 | let value = input.value; 11 | if (value) { 12 | // 发送消息给服务器 13 | socket.emit('message', value); 14 | input.value = ''; 15 | } else { 16 | alert('输入的内容不能为空!'); 17 | } 18 | } 19 | // 回车发言的方法 20 | function keySend(event) { 21 | const key = event.keyCode; 22 | if (key === 13) { 23 | send(); 24 | } 25 | } 26 | // 私聊的方法 27 | function privateChat(event) { 28 | let target = event.target; 29 | let user = target.innerText; 30 | if (target.className === 'user') { 31 | input.value = `@${user} `; 32 | } 33 | } 34 | // 进入房间(群) 35 | function join(room) { 36 | socket.emit('join', room); 37 | } 38 | // 离开房间(群) 39 | function leave(room) { 40 | socket.emit('leave', room); 41 | } 42 | 43 | // 点击按钮进行发言 44 | sendBtn.onclick = send; 45 | // 按回车进行发言 46 | input.onkeydown = function (event) { 47 | keySend(event); 48 | }; 49 | // 添加私聊 50 | list.onclick = function (event) { 51 | privateChat(event); 52 | }; 53 | // 监听进入房间后,将进入房间按钮隐藏 54 | socket.on('joined', room => { 55 | document.getElementById(`join-${room}`).style.display = 'none'; 56 | document.getElementById(`leave-${room}`).style.display = 'inline-block'; 57 | }); 58 | // 监听离开房间后,将离开房间按钮隐藏 59 | socket.on('leaved', room => { 60 | document.getElementById(`join-${room}`).style.display = 'inline-block'; 61 | document.getElementById(`leave-${room}`).style.display = 'none'; 62 | }); 63 | 64 | // 监听与服务端的连接 65 | socket.on('connect', () => { 66 | console.log('连接成功'); 67 | console.log(socket.connected); 68 | socket.emit('getHistory'); 69 | }); 70 | // 接收历史消息 71 | socket.on('history', history => { 72 | // history拿到的是一个数组,所以用map映射成新数组,然后再join一下连接拼成字符串 73 | let html = history.map(data => { 74 | return `
  • 75 |

    ${data.user} ${data.createAt}

    76 |

    ${data.content}

    77 |
  • `; 78 | }).join(''); 79 | list.innerHTML = html + '
  • 以上是历史消息
  • '; 80 | // 将聊天区域的滚动条设置到最新内容的位置 81 | list.scrollTop = list.scrollHeight; 82 | }); 83 | // 接收服务端传过来的消息 84 | socket.on('message', data => { 85 | let li = document.createElement('li'); 86 | li.className = 'list-group-item'; 87 | li.innerHTML = `

    ${data.user} ${data.createAt}

    88 |

    ${data.content}

    `; 89 | list.appendChild(li); 90 | // 将聊天区域的滚动条设置到最新内容的位置 91 | list.scrollTop = list.scrollHeight; 92 | }); -------------------------------------------------------------------------------- /chatRoom/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatroom", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "2.1.21", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "after": { 17 | "version": "0.8.2", 18 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 19 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 20 | }, 21 | "array-flatten": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 25 | }, 26 | "arraybuffer.slice": { 27 | "version": "0.0.7", 28 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 29 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 30 | }, 31 | "async-limiter": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 34 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 35 | }, 36 | "backo2": { 37 | "version": "1.0.2", 38 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 39 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 40 | }, 41 | "base64-arraybuffer": { 42 | "version": "0.1.5", 43 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 44 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 45 | }, 46 | "base64id": { 47 | "version": "1.0.0", 48 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 49 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" 50 | }, 51 | "better-assert": { 52 | "version": "1.0.2", 53 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 54 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 55 | "requires": { 56 | "callsite": "1.0.0" 57 | } 58 | }, 59 | "blob": { 60 | "version": "0.0.5", 61 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 62 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 63 | }, 64 | "body-parser": { 65 | "version": "1.18.3", 66 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 67 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 68 | "requires": { 69 | "bytes": "3.0.0", 70 | "content-type": "1.0.4", 71 | "debug": "2.6.9", 72 | "depd": "1.1.2", 73 | "http-errors": "1.6.3", 74 | "iconv-lite": "0.4.23", 75 | "on-finished": "2.3.0", 76 | "qs": "6.5.2", 77 | "raw-body": "2.3.3", 78 | "type-is": "1.6.16" 79 | } 80 | }, 81 | "bytes": { 82 | "version": "3.0.0", 83 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 84 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 85 | }, 86 | "callsite": { 87 | "version": "1.0.0", 88 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 89 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" 90 | }, 91 | "component-bind": { 92 | "version": "1.0.0", 93 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 94 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 95 | }, 96 | "component-emitter": { 97 | "version": "1.2.1", 98 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 99 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 100 | }, 101 | "component-inherit": { 102 | "version": "0.0.3", 103 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 104 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 105 | }, 106 | "content-disposition": { 107 | "version": "0.5.2", 108 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 109 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 110 | }, 111 | "content-type": { 112 | "version": "1.0.4", 113 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 114 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 115 | }, 116 | "cookie": { 117 | "version": "0.3.1", 118 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 119 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 120 | }, 121 | "cookie-signature": { 122 | "version": "1.0.6", 123 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 124 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 125 | }, 126 | "debug": { 127 | "version": "2.6.9", 128 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 129 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 130 | "requires": { 131 | "ms": "2.0.0" 132 | } 133 | }, 134 | "depd": { 135 | "version": "1.1.2", 136 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 137 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 138 | }, 139 | "destroy": { 140 | "version": "1.0.4", 141 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 142 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 143 | }, 144 | "ee-first": { 145 | "version": "1.1.1", 146 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 147 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 148 | }, 149 | "encodeurl": { 150 | "version": "1.0.2", 151 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 152 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 153 | }, 154 | "engine.io": { 155 | "version": "3.2.0", 156 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", 157 | "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", 158 | "requires": { 159 | "accepts": "1.3.5", 160 | "base64id": "1.0.0", 161 | "cookie": "0.3.1", 162 | "debug": "3.1.0", 163 | "engine.io-parser": "2.1.3", 164 | "ws": "3.3.3" 165 | }, 166 | "dependencies": { 167 | "debug": { 168 | "version": "3.1.0", 169 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 170 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 171 | "requires": { 172 | "ms": "2.0.0" 173 | } 174 | } 175 | } 176 | }, 177 | "engine.io-client": { 178 | "version": "3.2.1", 179 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", 180 | "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", 181 | "requires": { 182 | "component-emitter": "1.2.1", 183 | "component-inherit": "0.0.3", 184 | "debug": "3.1.0", 185 | "engine.io-parser": "2.1.3", 186 | "has-cors": "1.1.0", 187 | "indexof": "0.0.1", 188 | "parseqs": "0.0.5", 189 | "parseuri": "0.0.5", 190 | "ws": "3.3.3", 191 | "xmlhttprequest-ssl": "1.5.5", 192 | "yeast": "0.1.2" 193 | }, 194 | "dependencies": { 195 | "debug": { 196 | "version": "3.1.0", 197 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 198 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 199 | "requires": { 200 | "ms": "2.0.0" 201 | } 202 | } 203 | } 204 | }, 205 | "engine.io-parser": { 206 | "version": "2.1.3", 207 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", 208 | "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", 209 | "requires": { 210 | "after": "0.8.2", 211 | "arraybuffer.slice": "0.0.7", 212 | "base64-arraybuffer": "0.1.5", 213 | "blob": "0.0.5", 214 | "has-binary2": "1.0.3" 215 | } 216 | }, 217 | "escape-html": { 218 | "version": "1.0.3", 219 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 220 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 221 | }, 222 | "etag": { 223 | "version": "1.8.1", 224 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 225 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 226 | }, 227 | "express": { 228 | "version": "4.16.4", 229 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 230 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 231 | "requires": { 232 | "accepts": "1.3.5", 233 | "array-flatten": "1.1.1", 234 | "body-parser": "1.18.3", 235 | "content-disposition": "0.5.2", 236 | "content-type": "1.0.4", 237 | "cookie": "0.3.1", 238 | "cookie-signature": "1.0.6", 239 | "debug": "2.6.9", 240 | "depd": "1.1.2", 241 | "encodeurl": "1.0.2", 242 | "escape-html": "1.0.3", 243 | "etag": "1.8.1", 244 | "finalhandler": "1.1.1", 245 | "fresh": "0.5.2", 246 | "merge-descriptors": "1.0.1", 247 | "methods": "1.1.2", 248 | "on-finished": "2.3.0", 249 | "parseurl": "1.3.2", 250 | "path-to-regexp": "0.1.7", 251 | "proxy-addr": "2.0.4", 252 | "qs": "6.5.2", 253 | "range-parser": "1.2.0", 254 | "safe-buffer": "5.1.2", 255 | "send": "0.16.2", 256 | "serve-static": "1.13.2", 257 | "setprototypeof": "1.1.0", 258 | "statuses": "1.4.0", 259 | "type-is": "1.6.16", 260 | "utils-merge": "1.0.1", 261 | "vary": "1.1.2" 262 | } 263 | }, 264 | "finalhandler": { 265 | "version": "1.1.1", 266 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 267 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 268 | "requires": { 269 | "debug": "2.6.9", 270 | "encodeurl": "1.0.2", 271 | "escape-html": "1.0.3", 272 | "on-finished": "2.3.0", 273 | "parseurl": "1.3.2", 274 | "statuses": "1.4.0", 275 | "unpipe": "1.0.0" 276 | } 277 | }, 278 | "forwarded": { 279 | "version": "0.1.2", 280 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 281 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 282 | }, 283 | "fresh": { 284 | "version": "0.5.2", 285 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 286 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 287 | }, 288 | "has-binary2": { 289 | "version": "1.0.3", 290 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 291 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 292 | "requires": { 293 | "isarray": "2.0.1" 294 | } 295 | }, 296 | "has-cors": { 297 | "version": "1.1.0", 298 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 299 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 300 | }, 301 | "http-errors": { 302 | "version": "1.6.3", 303 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 304 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 305 | "requires": { 306 | "depd": "1.1.2", 307 | "inherits": "2.0.3", 308 | "setprototypeof": "1.1.0", 309 | "statuses": "1.4.0" 310 | } 311 | }, 312 | "iconv-lite": { 313 | "version": "0.4.23", 314 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 315 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 316 | "requires": { 317 | "safer-buffer": "2.1.2" 318 | } 319 | }, 320 | "indexof": { 321 | "version": "0.0.1", 322 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 323 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 324 | }, 325 | "inherits": { 326 | "version": "2.0.3", 327 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 328 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 329 | }, 330 | "ipaddr.js": { 331 | "version": "1.8.0", 332 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 333 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 334 | }, 335 | "isarray": { 336 | "version": "2.0.1", 337 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 338 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 339 | }, 340 | "media-typer": { 341 | "version": "0.3.0", 342 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 343 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 344 | }, 345 | "merge-descriptors": { 346 | "version": "1.0.1", 347 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 348 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 349 | }, 350 | "methods": { 351 | "version": "1.1.2", 352 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 353 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 354 | }, 355 | "mime": { 356 | "version": "1.4.1", 357 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 358 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 359 | }, 360 | "mime-db": { 361 | "version": "1.37.0", 362 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 363 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 364 | }, 365 | "mime-types": { 366 | "version": "2.1.21", 367 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 368 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 369 | "requires": { 370 | "mime-db": "1.37.0" 371 | } 372 | }, 373 | "ms": { 374 | "version": "2.0.0", 375 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 376 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 377 | }, 378 | "negotiator": { 379 | "version": "0.6.1", 380 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 381 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 382 | }, 383 | "object-component": { 384 | "version": "0.0.3", 385 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 386 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" 387 | }, 388 | "on-finished": { 389 | "version": "2.3.0", 390 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 391 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 392 | "requires": { 393 | "ee-first": "1.1.1" 394 | } 395 | }, 396 | "parseqs": { 397 | "version": "0.0.5", 398 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 399 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 400 | "requires": { 401 | "better-assert": "1.0.2" 402 | } 403 | }, 404 | "parseuri": { 405 | "version": "0.0.5", 406 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 407 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 408 | "requires": { 409 | "better-assert": "1.0.2" 410 | } 411 | }, 412 | "parseurl": { 413 | "version": "1.3.2", 414 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 415 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 416 | }, 417 | "path-to-regexp": { 418 | "version": "0.1.7", 419 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 420 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 421 | }, 422 | "proxy-addr": { 423 | "version": "2.0.4", 424 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 425 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 426 | "requires": { 427 | "forwarded": "0.1.2", 428 | "ipaddr.js": "1.8.0" 429 | } 430 | }, 431 | "qs": { 432 | "version": "6.5.2", 433 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 434 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 435 | }, 436 | "range-parser": { 437 | "version": "1.2.0", 438 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 439 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 440 | }, 441 | "raw-body": { 442 | "version": "2.3.3", 443 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 444 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 445 | "requires": { 446 | "bytes": "3.0.0", 447 | "http-errors": "1.6.3", 448 | "iconv-lite": "0.4.23", 449 | "unpipe": "1.0.0" 450 | } 451 | }, 452 | "safe-buffer": { 453 | "version": "5.1.2", 454 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 455 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 456 | }, 457 | "safer-buffer": { 458 | "version": "2.1.2", 459 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 460 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 461 | }, 462 | "send": { 463 | "version": "0.16.2", 464 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 465 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 466 | "requires": { 467 | "debug": "2.6.9", 468 | "depd": "1.1.2", 469 | "destroy": "1.0.4", 470 | "encodeurl": "1.0.2", 471 | "escape-html": "1.0.3", 472 | "etag": "1.8.1", 473 | "fresh": "0.5.2", 474 | "http-errors": "1.6.3", 475 | "mime": "1.4.1", 476 | "ms": "2.0.0", 477 | "on-finished": "2.3.0", 478 | "range-parser": "1.2.0", 479 | "statuses": "1.4.0" 480 | } 481 | }, 482 | "serve-static": { 483 | "version": "1.13.2", 484 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 485 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 486 | "requires": { 487 | "encodeurl": "1.0.2", 488 | "escape-html": "1.0.3", 489 | "parseurl": "1.3.2", 490 | "send": "0.16.2" 491 | } 492 | }, 493 | "setprototypeof": { 494 | "version": "1.1.0", 495 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 496 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 497 | }, 498 | "socket.io": { 499 | "version": "2.1.1", 500 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", 501 | "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", 502 | "requires": { 503 | "debug": "3.1.0", 504 | "engine.io": "3.2.0", 505 | "has-binary2": "1.0.3", 506 | "socket.io-adapter": "1.1.1", 507 | "socket.io-client": "2.1.1", 508 | "socket.io-parser": "3.2.0" 509 | }, 510 | "dependencies": { 511 | "debug": { 512 | "version": "3.1.0", 513 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 514 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 515 | "requires": { 516 | "ms": "2.0.0" 517 | } 518 | } 519 | } 520 | }, 521 | "socket.io-adapter": { 522 | "version": "1.1.1", 523 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 524 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" 525 | }, 526 | "socket.io-client": { 527 | "version": "2.1.1", 528 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", 529 | "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", 530 | "requires": { 531 | "backo2": "1.0.2", 532 | "base64-arraybuffer": "0.1.5", 533 | "component-bind": "1.0.0", 534 | "component-emitter": "1.2.1", 535 | "debug": "3.1.0", 536 | "engine.io-client": "3.2.1", 537 | "has-binary2": "1.0.3", 538 | "has-cors": "1.1.0", 539 | "indexof": "0.0.1", 540 | "object-component": "0.0.3", 541 | "parseqs": "0.0.5", 542 | "parseuri": "0.0.5", 543 | "socket.io-parser": "3.2.0", 544 | "to-array": "0.1.4" 545 | }, 546 | "dependencies": { 547 | "debug": { 548 | "version": "3.1.0", 549 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 550 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 551 | "requires": { 552 | "ms": "2.0.0" 553 | } 554 | } 555 | } 556 | }, 557 | "socket.io-parser": { 558 | "version": "3.2.0", 559 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", 560 | "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", 561 | "requires": { 562 | "component-emitter": "1.2.1", 563 | "debug": "3.1.0", 564 | "isarray": "2.0.1" 565 | }, 566 | "dependencies": { 567 | "debug": { 568 | "version": "3.1.0", 569 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 570 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 571 | "requires": { 572 | "ms": "2.0.0" 573 | } 574 | } 575 | } 576 | }, 577 | "statuses": { 578 | "version": "1.4.0", 579 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 580 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 581 | }, 582 | "to-array": { 583 | "version": "0.1.4", 584 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 585 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 586 | }, 587 | "type-is": { 588 | "version": "1.6.16", 589 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 590 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 591 | "requires": { 592 | "media-typer": "0.3.0", 593 | "mime-types": "2.1.21" 594 | } 595 | }, 596 | "ultron": { 597 | "version": "1.1.1", 598 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 599 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" 600 | }, 601 | "unpipe": { 602 | "version": "1.0.0", 603 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 604 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 605 | }, 606 | "utils-merge": { 607 | "version": "1.0.1", 608 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 609 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 610 | }, 611 | "vary": { 612 | "version": "1.1.2", 613 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 614 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 615 | }, 616 | "ws": { 617 | "version": "3.3.3", 618 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 619 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 620 | "requires": { 621 | "async-limiter": "1.0.0", 622 | "safe-buffer": "5.1.2", 623 | "ultron": "1.1.1" 624 | } 625 | }, 626 | "xmlhttprequest-ssl": { 627 | "version": "1.5.5", 628 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 629 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" 630 | }, 631 | "yeast": { 632 | "version": "0.1.2", 633 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 634 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 635 | } 636 | } 637 | } 638 | -------------------------------------------------------------------------------- /chatRoom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatroom", 3 | "version": "1.0.0", 4 | "description": "``` // index.html文件", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node app.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.16.4", 14 | "socket.io": "^2.1.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /socket_io/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | app.use(express.static(__dirname)); 4 | 5 | const server = require('http').createServer(app); 6 | 7 | const io = require('socket.io')(server); 8 | 9 | io.on('connection', (socket) => { 10 | socket.send('服务端的消息1'); 11 | socket.on('message', (msg) => { 12 | console.log(msg); 13 | socket.send('服务端的消息2'); 14 | }); 15 | }); 16 | server.listen(3000); -------------------------------------------------------------------------------- /socket_io/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | socket_io 9 | 10 | 11 | 12 | 13 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /socket_io/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "socket_io", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "2.1.21", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "after": { 17 | "version": "0.8.2", 18 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 19 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 20 | }, 21 | "array-flatten": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 25 | }, 26 | "arraybuffer.slice": { 27 | "version": "0.0.7", 28 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 29 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 30 | }, 31 | "async-limiter": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 34 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 35 | }, 36 | "backo2": { 37 | "version": "1.0.2", 38 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 39 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 40 | }, 41 | "base64-arraybuffer": { 42 | "version": "0.1.5", 43 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 44 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 45 | }, 46 | "base64id": { 47 | "version": "1.0.0", 48 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 49 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" 50 | }, 51 | "better-assert": { 52 | "version": "1.0.2", 53 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 54 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 55 | "requires": { 56 | "callsite": "1.0.0" 57 | } 58 | }, 59 | "blob": { 60 | "version": "0.0.5", 61 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 62 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 63 | }, 64 | "body-parser": { 65 | "version": "1.18.3", 66 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 67 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 68 | "requires": { 69 | "bytes": "3.0.0", 70 | "content-type": "1.0.4", 71 | "debug": "2.6.9", 72 | "depd": "1.1.2", 73 | "http-errors": "1.6.3", 74 | "iconv-lite": "0.4.23", 75 | "on-finished": "2.3.0", 76 | "qs": "6.5.2", 77 | "raw-body": "2.3.3", 78 | "type-is": "1.6.16" 79 | }, 80 | "dependencies": { 81 | "debug": { 82 | "version": "2.6.9", 83 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 84 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 85 | "requires": { 86 | "ms": "2.0.0" 87 | } 88 | } 89 | } 90 | }, 91 | "bytes": { 92 | "version": "3.0.0", 93 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 94 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 95 | }, 96 | "callsite": { 97 | "version": "1.0.0", 98 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 99 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" 100 | }, 101 | "component-bind": { 102 | "version": "1.0.0", 103 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 104 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 105 | }, 106 | "component-emitter": { 107 | "version": "1.2.1", 108 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 109 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 110 | }, 111 | "component-inherit": { 112 | "version": "0.0.3", 113 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 114 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 115 | }, 116 | "content-disposition": { 117 | "version": "0.5.2", 118 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 119 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 120 | }, 121 | "content-type": { 122 | "version": "1.0.4", 123 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 124 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 125 | }, 126 | "cookie": { 127 | "version": "0.3.1", 128 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 129 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 130 | }, 131 | "cookie-signature": { 132 | "version": "1.0.6", 133 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 134 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 135 | }, 136 | "debug": { 137 | "version": "3.1.0", 138 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 139 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 140 | "requires": { 141 | "ms": "2.0.0" 142 | } 143 | }, 144 | "depd": { 145 | "version": "1.1.2", 146 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 147 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 148 | }, 149 | "destroy": { 150 | "version": "1.0.4", 151 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 152 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 153 | }, 154 | "ee-first": { 155 | "version": "1.1.1", 156 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 157 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 158 | }, 159 | "encodeurl": { 160 | "version": "1.0.2", 161 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 162 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 163 | }, 164 | "engine.io": { 165 | "version": "3.2.0", 166 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", 167 | "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", 168 | "requires": { 169 | "accepts": "1.3.5", 170 | "base64id": "1.0.0", 171 | "cookie": "0.3.1", 172 | "debug": "3.1.0", 173 | "engine.io-parser": "2.1.3", 174 | "ws": "3.3.3" 175 | } 176 | }, 177 | "engine.io-client": { 178 | "version": "3.2.1", 179 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", 180 | "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", 181 | "requires": { 182 | "component-emitter": "1.2.1", 183 | "component-inherit": "0.0.3", 184 | "debug": "3.1.0", 185 | "engine.io-parser": "2.1.3", 186 | "has-cors": "1.1.0", 187 | "indexof": "0.0.1", 188 | "parseqs": "0.0.5", 189 | "parseuri": "0.0.5", 190 | "ws": "3.3.3", 191 | "xmlhttprequest-ssl": "1.5.5", 192 | "yeast": "0.1.2" 193 | } 194 | }, 195 | "engine.io-parser": { 196 | "version": "2.1.3", 197 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", 198 | "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", 199 | "requires": { 200 | "after": "0.8.2", 201 | "arraybuffer.slice": "0.0.7", 202 | "base64-arraybuffer": "0.1.5", 203 | "blob": "0.0.5", 204 | "has-binary2": "1.0.3" 205 | } 206 | }, 207 | "escape-html": { 208 | "version": "1.0.3", 209 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 210 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 211 | }, 212 | "etag": { 213 | "version": "1.8.1", 214 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 215 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 216 | }, 217 | "express": { 218 | "version": "4.16.4", 219 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 220 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 221 | "requires": { 222 | "accepts": "1.3.5", 223 | "array-flatten": "1.1.1", 224 | "body-parser": "1.18.3", 225 | "content-disposition": "0.5.2", 226 | "content-type": "1.0.4", 227 | "cookie": "0.3.1", 228 | "cookie-signature": "1.0.6", 229 | "debug": "2.6.9", 230 | "depd": "1.1.2", 231 | "encodeurl": "1.0.2", 232 | "escape-html": "1.0.3", 233 | "etag": "1.8.1", 234 | "finalhandler": "1.1.1", 235 | "fresh": "0.5.2", 236 | "merge-descriptors": "1.0.1", 237 | "methods": "1.1.2", 238 | "on-finished": "2.3.0", 239 | "parseurl": "1.3.2", 240 | "path-to-regexp": "0.1.7", 241 | "proxy-addr": "2.0.4", 242 | "qs": "6.5.2", 243 | "range-parser": "1.2.0", 244 | "safe-buffer": "5.1.2", 245 | "send": "0.16.2", 246 | "serve-static": "1.13.2", 247 | "setprototypeof": "1.1.0", 248 | "statuses": "1.4.0", 249 | "type-is": "1.6.16", 250 | "utils-merge": "1.0.1", 251 | "vary": "1.1.2" 252 | }, 253 | "dependencies": { 254 | "debug": { 255 | "version": "2.6.9", 256 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 257 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 258 | "requires": { 259 | "ms": "2.0.0" 260 | } 261 | } 262 | } 263 | }, 264 | "finalhandler": { 265 | "version": "1.1.1", 266 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 267 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 268 | "requires": { 269 | "debug": "2.6.9", 270 | "encodeurl": "1.0.2", 271 | "escape-html": "1.0.3", 272 | "on-finished": "2.3.0", 273 | "parseurl": "1.3.2", 274 | "statuses": "1.4.0", 275 | "unpipe": "1.0.0" 276 | }, 277 | "dependencies": { 278 | "debug": { 279 | "version": "2.6.9", 280 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 281 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 282 | "requires": { 283 | "ms": "2.0.0" 284 | } 285 | } 286 | } 287 | }, 288 | "forwarded": { 289 | "version": "0.1.2", 290 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 291 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 292 | }, 293 | "fresh": { 294 | "version": "0.5.2", 295 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 296 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 297 | }, 298 | "has-binary2": { 299 | "version": "1.0.3", 300 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 301 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 302 | "requires": { 303 | "isarray": "2.0.1" 304 | } 305 | }, 306 | "has-cors": { 307 | "version": "1.1.0", 308 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 309 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 310 | }, 311 | "http-errors": { 312 | "version": "1.6.3", 313 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 314 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 315 | "requires": { 316 | "depd": "1.1.2", 317 | "inherits": "2.0.3", 318 | "setprototypeof": "1.1.0", 319 | "statuses": "1.4.0" 320 | } 321 | }, 322 | "iconv-lite": { 323 | "version": "0.4.23", 324 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 325 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 326 | "requires": { 327 | "safer-buffer": "2.1.2" 328 | } 329 | }, 330 | "indexof": { 331 | "version": "0.0.1", 332 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 333 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 334 | }, 335 | "inherits": { 336 | "version": "2.0.3", 337 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 338 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 339 | }, 340 | "ipaddr.js": { 341 | "version": "1.8.0", 342 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 343 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 344 | }, 345 | "isarray": { 346 | "version": "2.0.1", 347 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 348 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 349 | }, 350 | "media-typer": { 351 | "version": "0.3.0", 352 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 353 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 354 | }, 355 | "merge-descriptors": { 356 | "version": "1.0.1", 357 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 358 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 359 | }, 360 | "methods": { 361 | "version": "1.1.2", 362 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 363 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 364 | }, 365 | "mime": { 366 | "version": "1.4.1", 367 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 368 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 369 | }, 370 | "mime-db": { 371 | "version": "1.37.0", 372 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 373 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 374 | }, 375 | "mime-types": { 376 | "version": "2.1.21", 377 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 378 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 379 | "requires": { 380 | "mime-db": "1.37.0" 381 | } 382 | }, 383 | "ms": { 384 | "version": "2.0.0", 385 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 386 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 387 | }, 388 | "negotiator": { 389 | "version": "0.6.1", 390 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 391 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 392 | }, 393 | "object-component": { 394 | "version": "0.0.3", 395 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 396 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" 397 | }, 398 | "on-finished": { 399 | "version": "2.3.0", 400 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 401 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 402 | "requires": { 403 | "ee-first": "1.1.1" 404 | } 405 | }, 406 | "parseqs": { 407 | "version": "0.0.5", 408 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 409 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 410 | "requires": { 411 | "better-assert": "1.0.2" 412 | } 413 | }, 414 | "parseuri": { 415 | "version": "0.0.5", 416 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 417 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 418 | "requires": { 419 | "better-assert": "1.0.2" 420 | } 421 | }, 422 | "parseurl": { 423 | "version": "1.3.2", 424 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 425 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 426 | }, 427 | "path-to-regexp": { 428 | "version": "0.1.7", 429 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 430 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 431 | }, 432 | "proxy-addr": { 433 | "version": "2.0.4", 434 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 435 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 436 | "requires": { 437 | "forwarded": "0.1.2", 438 | "ipaddr.js": "1.8.0" 439 | } 440 | }, 441 | "qs": { 442 | "version": "6.5.2", 443 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 444 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 445 | }, 446 | "range-parser": { 447 | "version": "1.2.0", 448 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 449 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 450 | }, 451 | "raw-body": { 452 | "version": "2.3.3", 453 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 454 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 455 | "requires": { 456 | "bytes": "3.0.0", 457 | "http-errors": "1.6.3", 458 | "iconv-lite": "0.4.23", 459 | "unpipe": "1.0.0" 460 | } 461 | }, 462 | "safe-buffer": { 463 | "version": "5.1.2", 464 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 465 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 466 | }, 467 | "safer-buffer": { 468 | "version": "2.1.2", 469 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 470 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 471 | }, 472 | "send": { 473 | "version": "0.16.2", 474 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 475 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 476 | "requires": { 477 | "debug": "2.6.9", 478 | "depd": "1.1.2", 479 | "destroy": "1.0.4", 480 | "encodeurl": "1.0.2", 481 | "escape-html": "1.0.3", 482 | "etag": "1.8.1", 483 | "fresh": "0.5.2", 484 | "http-errors": "1.6.3", 485 | "mime": "1.4.1", 486 | "ms": "2.0.0", 487 | "on-finished": "2.3.0", 488 | "range-parser": "1.2.0", 489 | "statuses": "1.4.0" 490 | }, 491 | "dependencies": { 492 | "debug": { 493 | "version": "2.6.9", 494 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 495 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 496 | "requires": { 497 | "ms": "2.0.0" 498 | } 499 | } 500 | } 501 | }, 502 | "serve-static": { 503 | "version": "1.13.2", 504 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 505 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 506 | "requires": { 507 | "encodeurl": "1.0.2", 508 | "escape-html": "1.0.3", 509 | "parseurl": "1.3.2", 510 | "send": "0.16.2" 511 | } 512 | }, 513 | "setprototypeof": { 514 | "version": "1.1.0", 515 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 516 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 517 | }, 518 | "socket.io": { 519 | "version": "2.1.1", 520 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", 521 | "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", 522 | "requires": { 523 | "debug": "3.1.0", 524 | "engine.io": "3.2.0", 525 | "has-binary2": "1.0.3", 526 | "socket.io-adapter": "1.1.1", 527 | "socket.io-client": "2.1.1", 528 | "socket.io-parser": "3.2.0" 529 | } 530 | }, 531 | "socket.io-adapter": { 532 | "version": "1.1.1", 533 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 534 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" 535 | }, 536 | "socket.io-client": { 537 | "version": "2.1.1", 538 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", 539 | "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", 540 | "requires": { 541 | "backo2": "1.0.2", 542 | "base64-arraybuffer": "0.1.5", 543 | "component-bind": "1.0.0", 544 | "component-emitter": "1.2.1", 545 | "debug": "3.1.0", 546 | "engine.io-client": "3.2.1", 547 | "has-binary2": "1.0.3", 548 | "has-cors": "1.1.0", 549 | "indexof": "0.0.1", 550 | "object-component": "0.0.3", 551 | "parseqs": "0.0.5", 552 | "parseuri": "0.0.5", 553 | "socket.io-parser": "3.2.0", 554 | "to-array": "0.1.4" 555 | } 556 | }, 557 | "socket.io-parser": { 558 | "version": "3.2.0", 559 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", 560 | "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", 561 | "requires": { 562 | "component-emitter": "1.2.1", 563 | "debug": "3.1.0", 564 | "isarray": "2.0.1" 565 | } 566 | }, 567 | "statuses": { 568 | "version": "1.4.0", 569 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 570 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 571 | }, 572 | "to-array": { 573 | "version": "0.1.4", 574 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 575 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 576 | }, 577 | "type-is": { 578 | "version": "1.6.16", 579 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 580 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 581 | "requires": { 582 | "media-typer": "0.3.0", 583 | "mime-types": "2.1.21" 584 | } 585 | }, 586 | "ultron": { 587 | "version": "1.1.1", 588 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 589 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" 590 | }, 591 | "unpipe": { 592 | "version": "1.0.0", 593 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 594 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 595 | }, 596 | "utils-merge": { 597 | "version": "1.0.1", 598 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 599 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 600 | }, 601 | "vary": { 602 | "version": "1.1.2", 603 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 604 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 605 | }, 606 | "ws": { 607 | "version": "3.3.3", 608 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 609 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 610 | "requires": { 611 | "async-limiter": "1.0.0", 612 | "safe-buffer": "5.1.2", 613 | "ultron": "1.1.1" 614 | } 615 | }, 616 | "xmlhttprequest-ssl": { 617 | "version": "1.5.5", 618 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 619 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" 620 | }, 621 | "yeast": { 622 | "version": "0.1.2", 623 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 624 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 625 | } 626 | } 627 | } 628 | -------------------------------------------------------------------------------- /socket_io/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "socket_io", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node app.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.16.4", 14 | "socket.io": "^2.1.1" 15 | } 16 | } -------------------------------------------------------------------------------- /socket_io/readme.md: -------------------------------------------------------------------------------- 1 | # 启动 2 | 3 | 1. >npm init 4 | 2. >npm install express 5 | 3. >npm install socket.io 6 | 4. >npm install 7 | 5. >npm start -------------------------------------------------------------------------------- /vue_chatroom/README.md: -------------------------------------------------------------------------------- 1 | npm install -g vue-cli 2 | 3 | vue init webpack-simple vue_element_chat 4 | 5 | 一通下一步 6 | cd vue_element_chat 7 | npm install 8 | npm run dev 9 | 10 | 11 | 安装element 12 | npm i element-ui -S 13 | 14 | main.js: 15 | import Vue from 'vue'; 16 | import ElementUI from 'element-ui'; 17 | import 'element-ui/lib/theme-chalk/index.css'; 18 | import App from './App.vue'; 19 | 20 | Vue.use(ElementUI); 21 | 22 | new Vue({ 23 | el: '#app', 24 | render: h => h(App) 25 | }); 26 | 27 | 28 | npm run dev运行 29 | 30 | 报错: 31 | ERROR in ./node_modules/element-ui/lib/theme-chalk/fonts/element-icons.ttf 32 | Module parse failed: Unexpected character '' (1:0) 33 | You may need an appropriate loader to handle this file type. 34 | (Source code omitted for this binary file) 35 | @ ./node_modules/css-loader!./node_modules/element-ui/lib/theme-chalk/index.css 7:894-930 36 | @ ./node_modules/element-ui/lib/theme-chalk/index.css 37 | @ ./src/main.js 38 | @ multi (webpack)-dev-server/client?http://localhost:8081 webpack/hot/dev-server ./src/main.js 39 | 40 | ERROR in ./node_modules/element-ui/lib/theme-chalk/fonts/element-icons.woff 41 | Module parse failed: Unexpected character '' (1:4) 42 | You may need an appropriate loader to handle this file type. 43 | (Source code omitted for this binary file) 44 | @ ./node_modules/css-loader!./node_modules/element-ui/lib/theme-chalk/index.css 7:818-855 45 | @ ./node_modules/element-ui/lib/theme-chalk/index.css 46 | @ ./src/main.js 47 | @ multi (webpack)-dev-server/client?http://localhost:8081 webpack/hot/dev-server ./src/main.js 48 | 49 | 解决: 50 | 修改webpack.config.js配置 51 | { 52 | test: /\.(png|jpg|gif|svg|ttf|woff)$/, 53 | loader: 'file-loader', 54 | options: { 55 | name: '[name].[ext]?[hash]' 56 | } 57 | } 58 | 59 | 页面布局 60 | 监听高度 61 | 新建server写后台 62 | 1. >npm init 63 | 2. >npm install express 64 | 3. >npm install socket.io 65 | 4. >npm install 66 | 5. >package.json里面添加"start":"node app.js" 67 | 6. >npm start 68 | 69 | 70 | 客户端 71 | npm install vue-socket.io -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }], 4 | "stage-3" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log 5 | yarn-error.log 6 | 7 | # Editor directories and files 8 | .idea 9 | *.suo 10 | *.ntvs* 11 | *.njsproj 12 | *.sln 13 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/README.md: -------------------------------------------------------------------------------- 1 | # vue_element_chat 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | ``` 17 | 18 | For detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader). 19 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | vue_element_chat 6 | 7 | 8 |
    9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue_element_chat", 3 | "description": "A Vue.js project", 4 | "version": "1.0.0", 5 | "author": "lichaojiang ", 6 | "license": "MIT", 7 | "private": true, 8 | "scripts": { 9 | "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot", 10 | "build": "cross-env NODE_ENV=production webpack --progress --hide-modules" 11 | }, 12 | "dependencies": { 13 | "element-ui": "^2.4.9", 14 | "vue": "^2.5.11", 15 | "vue-socket.io": "^2.1.1-b" 16 | }, 17 | "browserslist": [ 18 | "> 1%", 19 | "last 2 versions", 20 | "not ie <= 8" 21 | ], 22 | "devDependencies": { 23 | "babel-core": "^6.26.0", 24 | "babel-loader": "^7.1.2", 25 | "babel-preset-env": "^1.6.0", 26 | "babel-preset-stage-3": "^6.24.1", 27 | "cross-env": "^5.0.5", 28 | "css-loader": "^0.28.7", 29 | "file-loader": "^1.1.4", 30 | "vue-loader": "^13.0.5", 31 | "vue-template-compiler": "^2.4.4", 32 | "webpack": "^3.6.0", 33 | "webpack-dev-server": "^2.9.1" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/server/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | // 设置静态文件夹,会默认找当前目录下的index.html文件当做访问的页面 4 | app.use(express.static(__dirname)); 5 | 6 | const server = require('http').createServer(app); 7 | const io = require('socket.io')(server); 8 | 9 | // 用来保存对应的socket 10 | let socketObj = {}; 11 | // 上来记录一个socket.id用来查找对应的用户 12 | let mySocket = {}; 13 | // 创建一个数组用来保存最近的20条消息记录,真实项目中会存到数据库中 14 | let msgHistory = []; 15 | 16 | const SYSTEM = '系统'; 17 | // 设置一些颜色的数组,让每次进入聊天的用户颜色都不一样 18 | let userColor = ['#00a1f4', '#0cc', '#f44336', '#795548', '#e91e63', '#00bcd4', '#009688', '#4caf50', '#8bc34a', '#ffc107', '#607d8b', '#ff9800', '#ff5722']; 19 | 20 | io.on('connection', socket => { 21 | // 这是所有连接到服务端的socket.id 22 | mySocket[socket.id] = socket; 23 | console.log('id', socket.id); 24 | 25 | // 记录用户名,用来记录是不是第一次进入 26 | let username, color, rooms = []; 27 | // 监听客户端发过来的消息 28 | socket.on('message', msg => { 29 | if (username) { 30 | let private = msg.match(/@([^ ]+) (.+)/); 31 | 32 | if (private) { // 私聊 33 | let user = private[1]; 34 | let content = private[2]; 35 | let toSocket = socketObj[user]; 36 | // 对方的socket存在,就发送消息 37 | if (toSocket) { 38 | toSocket.send({ 39 | user: username, 40 | color, 41 | content, 42 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 43 | }); 44 | } 45 | } else { 46 | // 房间内和房间外都是一样的消息对象,直接存成msgObj变量使用 47 | let msgObj = { 48 | user: username, 49 | color, 50 | content: msg, 51 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 52 | }; 53 | 54 | // 如果rooms数组有值,就代表有用户进入了房间 55 | if (rooms.length) { 56 | // 用来存储进入房间内的对应的socket.id 57 | let socketJson = {}; 58 | 59 | rooms.forEach(room => { 60 | // 取得进入房间内所对应的所有sockets的hash值,它便是拿到的socket.id 61 | let roomSockets = io.sockets.adapter.rooms[room].sockets; 62 | Object.keys(roomSockets).forEach(socketId => { 63 | console.log('socketId', socketId); 64 | // 进行一个去重,在socketJson中只有对应唯一的socketId 65 | if (!socketJson[socketId]) { 66 | socketJson[socketId] = 1; 67 | } 68 | }); 69 | }); 70 | 71 | // 遍历socketJson,在mySocket里找到对应的id,然后发送消息 72 | Object.keys(socketJson).forEach(socketId => { 73 | mySocket[socketId].emit('message', msgObj); 74 | }); 75 | } else { 76 | // 如果不是私聊的 77 | // 向所有人广播 78 | io.emit('message', msgObj); 79 | 80 | // 把发送的消息push到msgHistory中 81 | // 真实情况是存到数据库里的 82 | msgHistory.push(msgObj); 83 | } 84 | } 85 | } else { 86 | // 如果是第一次进入的话,就将输入的内容当做用户名 87 | username = msg; 88 | color = shuffle(userColor)[0]; 89 | // 这里保存一份对应的socket用户,以便之后可以找到该用户 90 | socketObj[username] = socket; 91 | // 向除了自己的所有人广播,毕竟进没进入自己当然是知道的,没必要跟自己再说 92 | socket.broadcast.emit('message', { 93 | user: SYSTEM, 94 | color, 95 | content: `${username}加入了聊天`, 96 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 97 | }); 98 | } 99 | }); 100 | // 监听进入房间的事件 101 | socket.on('join', room => { 102 | // 判断一下用户是否进入了房间,如果没有才让其进到房间里 103 | if (username && rooms.indexOf(room) === -1) { 104 | // socket.join表示进入某个房间 105 | socket.join(room); 106 | rooms.push(room); 107 | // 这里发送个joined事件,让前端监听后,控制房间按钮 108 | socket.emit('joined', room); 109 | // 通知一下自己 110 | socket.send({ 111 | user: SYSTEM, 112 | color, 113 | content: `你已加入到${room}战队`, 114 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 115 | }); 116 | } 117 | }); 118 | // 监听离开房间的事件 119 | socket.on('leave', room => { 120 | // index为该房间在数组rooms中的索引,方便删除 121 | let index = rooms.indexOf(room); 122 | if (index !== -1) { 123 | socket.leave(room); // 离开该房间 124 | rooms.splice(index, 1); // 删掉该房间 125 | // 这里发送个leaved事件,让前端监听后,控制房间按钮 126 | socket.emit('leaved', room); 127 | // 通知一下自己 128 | socket.send({ 129 | user: SYSTEM, 130 | color, 131 | content: `你已经离开${room}战队`, 132 | createAt: `${addZero(new Date().getHours())}:${addZero(new Date().getMinutes())}:${addZero(new Date().getSeconds())}` 133 | }); 134 | } 135 | }); 136 | 137 | // 监听获取历史消息的事件 138 | socket.on('getHistory', () => { 139 | // 通过数组的slice方法截取最新的20条消息 140 | if (msgHistory.length) { 141 | let history = msgHistory.slice(msgHistory.length - 20); 142 | socket.emit('history', history); 143 | } 144 | }); 145 | }); 146 | 147 | 148 | // 乱序排列 149 | function shuffle(arr) { 150 | let len = arr.length, 151 | random; 152 | while (0 !== len) { 153 | random = (Math.random() * len--) >>> 0; // 右移位运算符向下取整 154 | [arr[len], arr[random]] = [arr[random], arr[len]]; // 解构赋值实现变量互换 155 | } 156 | return arr; 157 | } 158 | // 时间补零 159 | function addZero(n) { 160 | return n < 10 ? '0' + n : '' + n; 161 | } 162 | 163 | 164 | 165 | // 这里记住要用server去监听端口,而不是app.listen去监听(防止找不到/socket.io/socket.io.js文件) 166 | server.listen(5000); -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "2.1.21", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "after": { 17 | "version": "0.8.2", 18 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 19 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 20 | }, 21 | "array-flatten": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 25 | }, 26 | "arraybuffer.slice": { 27 | "version": "0.0.7", 28 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 29 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 30 | }, 31 | "async-limiter": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 34 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 35 | }, 36 | "backo2": { 37 | "version": "1.0.2", 38 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 39 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 40 | }, 41 | "base64-arraybuffer": { 42 | "version": "0.1.5", 43 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 44 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 45 | }, 46 | "base64id": { 47 | "version": "1.0.0", 48 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 49 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" 50 | }, 51 | "better-assert": { 52 | "version": "1.0.2", 53 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 54 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 55 | "requires": { 56 | "callsite": "1.0.0" 57 | } 58 | }, 59 | "blob": { 60 | "version": "0.0.5", 61 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 62 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 63 | }, 64 | "body-parser": { 65 | "version": "1.18.3", 66 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 67 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 68 | "requires": { 69 | "bytes": "3.0.0", 70 | "content-type": "1.0.4", 71 | "debug": "2.6.9", 72 | "depd": "1.1.2", 73 | "http-errors": "1.6.3", 74 | "iconv-lite": "0.4.23", 75 | "on-finished": "2.3.0", 76 | "qs": "6.5.2", 77 | "raw-body": "2.3.3", 78 | "type-is": "1.6.16" 79 | } 80 | }, 81 | "bytes": { 82 | "version": "3.0.0", 83 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 84 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 85 | }, 86 | "callsite": { 87 | "version": "1.0.0", 88 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 89 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" 90 | }, 91 | "component-bind": { 92 | "version": "1.0.0", 93 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 94 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 95 | }, 96 | "component-emitter": { 97 | "version": "1.2.1", 98 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 99 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 100 | }, 101 | "component-inherit": { 102 | "version": "0.0.3", 103 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 104 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 105 | }, 106 | "content-disposition": { 107 | "version": "0.5.2", 108 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 109 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 110 | }, 111 | "content-type": { 112 | "version": "1.0.4", 113 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 114 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 115 | }, 116 | "cookie": { 117 | "version": "0.3.1", 118 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 119 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 120 | }, 121 | "cookie-signature": { 122 | "version": "1.0.6", 123 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 124 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 125 | }, 126 | "debug": { 127 | "version": "2.6.9", 128 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 129 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 130 | "requires": { 131 | "ms": "2.0.0" 132 | } 133 | }, 134 | "depd": { 135 | "version": "1.1.2", 136 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 137 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 138 | }, 139 | "destroy": { 140 | "version": "1.0.4", 141 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 142 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 143 | }, 144 | "ee-first": { 145 | "version": "1.1.1", 146 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 147 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 148 | }, 149 | "encodeurl": { 150 | "version": "1.0.2", 151 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 152 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 153 | }, 154 | "engine.io": { 155 | "version": "3.2.1", 156 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", 157 | "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", 158 | "requires": { 159 | "accepts": "1.3.5", 160 | "base64id": "1.0.0", 161 | "cookie": "0.3.1", 162 | "debug": "3.1.0", 163 | "engine.io-parser": "2.1.3", 164 | "ws": "3.3.3" 165 | }, 166 | "dependencies": { 167 | "debug": { 168 | "version": "3.1.0", 169 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 170 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 171 | "requires": { 172 | "ms": "2.0.0" 173 | } 174 | } 175 | } 176 | }, 177 | "engine.io-client": { 178 | "version": "3.2.1", 179 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", 180 | "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", 181 | "requires": { 182 | "component-emitter": "1.2.1", 183 | "component-inherit": "0.0.3", 184 | "debug": "3.1.0", 185 | "engine.io-parser": "2.1.3", 186 | "has-cors": "1.1.0", 187 | "indexof": "0.0.1", 188 | "parseqs": "0.0.5", 189 | "parseuri": "0.0.5", 190 | "ws": "3.3.3", 191 | "xmlhttprequest-ssl": "1.5.5", 192 | "yeast": "0.1.2" 193 | }, 194 | "dependencies": { 195 | "debug": { 196 | "version": "3.1.0", 197 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 198 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 199 | "requires": { 200 | "ms": "2.0.0" 201 | } 202 | } 203 | } 204 | }, 205 | "engine.io-parser": { 206 | "version": "2.1.3", 207 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", 208 | "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", 209 | "requires": { 210 | "after": "0.8.2", 211 | "arraybuffer.slice": "0.0.7", 212 | "base64-arraybuffer": "0.1.5", 213 | "blob": "0.0.5", 214 | "has-binary2": "1.0.3" 215 | } 216 | }, 217 | "escape-html": { 218 | "version": "1.0.3", 219 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 220 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 221 | }, 222 | "etag": { 223 | "version": "1.8.1", 224 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 225 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 226 | }, 227 | "express": { 228 | "version": "4.16.4", 229 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 230 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 231 | "requires": { 232 | "accepts": "1.3.5", 233 | "array-flatten": "1.1.1", 234 | "body-parser": "1.18.3", 235 | "content-disposition": "0.5.2", 236 | "content-type": "1.0.4", 237 | "cookie": "0.3.1", 238 | "cookie-signature": "1.0.6", 239 | "debug": "2.6.9", 240 | "depd": "1.1.2", 241 | "encodeurl": "1.0.2", 242 | "escape-html": "1.0.3", 243 | "etag": "1.8.1", 244 | "finalhandler": "1.1.1", 245 | "fresh": "0.5.2", 246 | "merge-descriptors": "1.0.1", 247 | "methods": "1.1.2", 248 | "on-finished": "2.3.0", 249 | "parseurl": "1.3.2", 250 | "path-to-regexp": "0.1.7", 251 | "proxy-addr": "2.0.4", 252 | "qs": "6.5.2", 253 | "range-parser": "1.2.0", 254 | "safe-buffer": "5.1.2", 255 | "send": "0.16.2", 256 | "serve-static": "1.13.2", 257 | "setprototypeof": "1.1.0", 258 | "statuses": "1.4.0", 259 | "type-is": "1.6.16", 260 | "utils-merge": "1.0.1", 261 | "vary": "1.1.2" 262 | } 263 | }, 264 | "finalhandler": { 265 | "version": "1.1.1", 266 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 267 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 268 | "requires": { 269 | "debug": "2.6.9", 270 | "encodeurl": "1.0.2", 271 | "escape-html": "1.0.3", 272 | "on-finished": "2.3.0", 273 | "parseurl": "1.3.2", 274 | "statuses": "1.4.0", 275 | "unpipe": "1.0.0" 276 | } 277 | }, 278 | "forwarded": { 279 | "version": "0.1.2", 280 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 281 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 282 | }, 283 | "fresh": { 284 | "version": "0.5.2", 285 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 286 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 287 | }, 288 | "has-binary2": { 289 | "version": "1.0.3", 290 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 291 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 292 | "requires": { 293 | "isarray": "2.0.1" 294 | } 295 | }, 296 | "has-cors": { 297 | "version": "1.1.0", 298 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 299 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 300 | }, 301 | "http-errors": { 302 | "version": "1.6.3", 303 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 304 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 305 | "requires": { 306 | "depd": "1.1.2", 307 | "inherits": "2.0.3", 308 | "setprototypeof": "1.1.0", 309 | "statuses": "1.4.0" 310 | } 311 | }, 312 | "iconv-lite": { 313 | "version": "0.4.23", 314 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 315 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 316 | "requires": { 317 | "safer-buffer": "2.1.2" 318 | } 319 | }, 320 | "indexof": { 321 | "version": "0.0.1", 322 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 323 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 324 | }, 325 | "inherits": { 326 | "version": "2.0.3", 327 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 328 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 329 | }, 330 | "ipaddr.js": { 331 | "version": "1.8.0", 332 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 333 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 334 | }, 335 | "isarray": { 336 | "version": "2.0.1", 337 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 338 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 339 | }, 340 | "media-typer": { 341 | "version": "0.3.0", 342 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 343 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 344 | }, 345 | "merge-descriptors": { 346 | "version": "1.0.1", 347 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 348 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 349 | }, 350 | "methods": { 351 | "version": "1.1.2", 352 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 353 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 354 | }, 355 | "mime": { 356 | "version": "1.4.1", 357 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 358 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 359 | }, 360 | "mime-db": { 361 | "version": "1.37.0", 362 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 363 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 364 | }, 365 | "mime-types": { 366 | "version": "2.1.21", 367 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 368 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 369 | "requires": { 370 | "mime-db": "1.37.0" 371 | } 372 | }, 373 | "ms": { 374 | "version": "2.0.0", 375 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 376 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 377 | }, 378 | "negotiator": { 379 | "version": "0.6.1", 380 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 381 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 382 | }, 383 | "object-component": { 384 | "version": "0.0.3", 385 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 386 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" 387 | }, 388 | "on-finished": { 389 | "version": "2.3.0", 390 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 391 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 392 | "requires": { 393 | "ee-first": "1.1.1" 394 | } 395 | }, 396 | "parseqs": { 397 | "version": "0.0.5", 398 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 399 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 400 | "requires": { 401 | "better-assert": "1.0.2" 402 | } 403 | }, 404 | "parseuri": { 405 | "version": "0.0.5", 406 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 407 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 408 | "requires": { 409 | "better-assert": "1.0.2" 410 | } 411 | }, 412 | "parseurl": { 413 | "version": "1.3.2", 414 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 415 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 416 | }, 417 | "path-to-regexp": { 418 | "version": "0.1.7", 419 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 420 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 421 | }, 422 | "proxy-addr": { 423 | "version": "2.0.4", 424 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 425 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 426 | "requires": { 427 | "forwarded": "0.1.2", 428 | "ipaddr.js": "1.8.0" 429 | } 430 | }, 431 | "qs": { 432 | "version": "6.5.2", 433 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 434 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 435 | }, 436 | "range-parser": { 437 | "version": "1.2.0", 438 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 439 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 440 | }, 441 | "raw-body": { 442 | "version": "2.3.3", 443 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 444 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 445 | "requires": { 446 | "bytes": "3.0.0", 447 | "http-errors": "1.6.3", 448 | "iconv-lite": "0.4.23", 449 | "unpipe": "1.0.0" 450 | } 451 | }, 452 | "safe-buffer": { 453 | "version": "5.1.2", 454 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 455 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 456 | }, 457 | "safer-buffer": { 458 | "version": "2.1.2", 459 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 460 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 461 | }, 462 | "send": { 463 | "version": "0.16.2", 464 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 465 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 466 | "requires": { 467 | "debug": "2.6.9", 468 | "depd": "1.1.2", 469 | "destroy": "1.0.4", 470 | "encodeurl": "1.0.2", 471 | "escape-html": "1.0.3", 472 | "etag": "1.8.1", 473 | "fresh": "0.5.2", 474 | "http-errors": "1.6.3", 475 | "mime": "1.4.1", 476 | "ms": "2.0.0", 477 | "on-finished": "2.3.0", 478 | "range-parser": "1.2.0", 479 | "statuses": "1.4.0" 480 | } 481 | }, 482 | "serve-static": { 483 | "version": "1.13.2", 484 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 485 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 486 | "requires": { 487 | "encodeurl": "1.0.2", 488 | "escape-html": "1.0.3", 489 | "parseurl": "1.3.2", 490 | "send": "0.16.2" 491 | } 492 | }, 493 | "setprototypeof": { 494 | "version": "1.1.0", 495 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 496 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 497 | }, 498 | "socket.io": { 499 | "version": "2.1.1", 500 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", 501 | "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", 502 | "requires": { 503 | "debug": "3.1.0", 504 | "engine.io": "3.2.1", 505 | "has-binary2": "1.0.3", 506 | "socket.io-adapter": "1.1.1", 507 | "socket.io-client": "2.1.1", 508 | "socket.io-parser": "3.2.0" 509 | }, 510 | "dependencies": { 511 | "debug": { 512 | "version": "3.1.0", 513 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 514 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 515 | "requires": { 516 | "ms": "2.0.0" 517 | } 518 | } 519 | } 520 | }, 521 | "socket.io-adapter": { 522 | "version": "1.1.1", 523 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 524 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" 525 | }, 526 | "socket.io-client": { 527 | "version": "2.1.1", 528 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", 529 | "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", 530 | "requires": { 531 | "backo2": "1.0.2", 532 | "base64-arraybuffer": "0.1.5", 533 | "component-bind": "1.0.0", 534 | "component-emitter": "1.2.1", 535 | "debug": "3.1.0", 536 | "engine.io-client": "3.2.1", 537 | "has-binary2": "1.0.3", 538 | "has-cors": "1.1.0", 539 | "indexof": "0.0.1", 540 | "object-component": "0.0.3", 541 | "parseqs": "0.0.5", 542 | "parseuri": "0.0.5", 543 | "socket.io-parser": "3.2.0", 544 | "to-array": "0.1.4" 545 | }, 546 | "dependencies": { 547 | "debug": { 548 | "version": "3.1.0", 549 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 550 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 551 | "requires": { 552 | "ms": "2.0.0" 553 | } 554 | } 555 | } 556 | }, 557 | "socket.io-parser": { 558 | "version": "3.2.0", 559 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", 560 | "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", 561 | "requires": { 562 | "component-emitter": "1.2.1", 563 | "debug": "3.1.0", 564 | "isarray": "2.0.1" 565 | }, 566 | "dependencies": { 567 | "debug": { 568 | "version": "3.1.0", 569 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 570 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 571 | "requires": { 572 | "ms": "2.0.0" 573 | } 574 | } 575 | } 576 | }, 577 | "statuses": { 578 | "version": "1.4.0", 579 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 580 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 581 | }, 582 | "to-array": { 583 | "version": "0.1.4", 584 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 585 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 586 | }, 587 | "type-is": { 588 | "version": "1.6.16", 589 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 590 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 591 | "requires": { 592 | "media-typer": "0.3.0", 593 | "mime-types": "2.1.21" 594 | } 595 | }, 596 | "ultron": { 597 | "version": "1.1.1", 598 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 599 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" 600 | }, 601 | "unpipe": { 602 | "version": "1.0.0", 603 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 604 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 605 | }, 606 | "utils-merge": { 607 | "version": "1.0.1", 608 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 609 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 610 | }, 611 | "vary": { 612 | "version": "1.1.2", 613 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 614 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 615 | }, 616 | "ws": { 617 | "version": "3.3.3", 618 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 619 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 620 | "requires": { 621 | "async-limiter": "1.0.0", 622 | "safe-buffer": "5.1.2", 623 | "ultron": "1.1.1" 624 | } 625 | }, 626 | "xmlhttprequest-ssl": { 627 | "version": "1.5.5", 628 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 629 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" 630 | }, 631 | "yeast": { 632 | "version": "0.1.2", 633 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 634 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 635 | } 636 | } 637 | } 638 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node app.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.16.4", 14 | "socket.io": "^2.1.1" 15 | } 16 | } -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/src/App.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 117 | 118 | 210 | -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usecodelee/Chatroom/7535700438a317619f11a7f90b915d246afdf1b2/vue_chatroom/vue_element_chat/src/assets/logo.png -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import ElementUI from 'element-ui'; 4 | import 'element-ui/lib/theme-chalk/index.css'; 5 | import VueSocketio from 'vue-socket.io'; 6 | Vue.use(VueSocketio, 'http://localhost:5000'); 7 | Vue.use(ElementUI); 8 | 9 | new Vue({ 10 | el: '#app', 11 | render: h => h(App) 12 | }) -------------------------------------------------------------------------------- /vue_chatroom/vue_element_chat/webpack.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var webpack = require('webpack') 3 | 4 | module.exports = { 5 | entry: './src/main.js', 6 | output: { 7 | path: path.resolve(__dirname, './dist'), 8 | publicPath: '/dist/', 9 | filename: 'build.js' 10 | }, 11 | module: { 12 | rules: [{ 13 | test: /\.css$/, 14 | use: [ 15 | 'vue-style-loader', 16 | 'css-loader' 17 | ], 18 | }, { 19 | test: /\.vue$/, 20 | loader: 'vue-loader', 21 | options: { 22 | loaders: {} 23 | // other vue-loader options go here 24 | } 25 | }, 26 | { 27 | test: /\.js$/, 28 | loader: 'babel-loader', 29 | exclude: /node_modules/ 30 | }, 31 | { 32 | test: /\.(png|jpg|gif|svg|ttf|woff)$/, 33 | loader: 'file-loader', 34 | options: { 35 | name: '[name].[ext]?[hash]' 36 | } 37 | } 38 | ] 39 | }, 40 | resolve: { 41 | alias: { 42 | 'vue$': 'vue/dist/vue.esm.js' 43 | }, 44 | extensions: ['*', '.js', '.vue', '.json'] 45 | }, 46 | devServer: { 47 | historyApiFallback: true, 48 | noInfo: true, 49 | overlay: true 50 | }, 51 | performance: { 52 | hints: false 53 | }, 54 | devtool: '#eval-source-map' 55 | } 56 | 57 | if (process.env.NODE_ENV === 'production') { 58 | module.exports.devtool = '#source-map' 59 | // http://vue-loader.vuejs.org/en/workflow/production.html 60 | module.exports.plugins = (module.exports.plugins || []).concat([ 61 | new webpack.DefinePlugin({ 62 | 'process.env': { 63 | NODE_ENV: '"production"' 64 | } 65 | }), 66 | new webpack.optimize.UglifyJsPlugin({ 67 | sourceMap: true, 68 | compress: { 69 | warnings: false 70 | } 71 | }), 72 | new webpack.LoaderOptionsPlugin({ 73 | minimize: true 74 | }) 75 | ]) 76 | } -------------------------------------------------------------------------------- /websocket_test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | WebSocket 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /websocket_test/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "websocket_test", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "2.1.21", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "any-promise": { 17 | "version": "1.3.0", 18 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 19 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 20 | }, 21 | "array-flatten": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 25 | }, 26 | "async-limiter": { 27 | "version": "1.0.0", 28 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 29 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 30 | }, 31 | "bluebird": { 32 | "version": "3.1.5", 33 | "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-3.1.5.tgz", 34 | "integrity": "sha1-aSeKHh02WhgXuojzIUwvlCd50K4=" 35 | }, 36 | "body-parser": { 37 | "version": "1.18.3", 38 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 39 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 40 | "requires": { 41 | "bytes": "3.0.0", 42 | "content-type": "1.0.4", 43 | "debug": "2.6.9", 44 | "depd": "1.1.2", 45 | "http-errors": "1.6.3", 46 | "iconv-lite": "0.4.23", 47 | "on-finished": "2.3.0", 48 | "qs": "6.5.2", 49 | "raw-body": "2.3.3", 50 | "type-is": "1.6.16" 51 | } 52 | }, 53 | "bytes": { 54 | "version": "3.0.0", 55 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 56 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 57 | }, 58 | "content-disposition": { 59 | "version": "0.5.2", 60 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 61 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 62 | }, 63 | "content-type": { 64 | "version": "1.0.4", 65 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 66 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 67 | }, 68 | "cookie": { 69 | "version": "0.3.1", 70 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 71 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 72 | }, 73 | "cookie-signature": { 74 | "version": "1.0.6", 75 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 76 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 77 | }, 78 | "debug": { 79 | "version": "2.6.9", 80 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 81 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 82 | "requires": { 83 | "ms": "2.0.0" 84 | } 85 | }, 86 | "depd": { 87 | "version": "1.1.2", 88 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 89 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 90 | }, 91 | "destroy": { 92 | "version": "1.0.4", 93 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 94 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 95 | }, 96 | "ee-first": { 97 | "version": "1.1.1", 98 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 99 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 100 | }, 101 | "encodeurl": { 102 | "version": "1.0.2", 103 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 104 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 105 | }, 106 | "es": { 107 | "version": "0.6.0", 108 | "resolved": "https://registry.npmjs.org/es/-/es-0.6.0.tgz", 109 | "integrity": "sha512-bcnlEcn4d7UO6n1fcCByRQr8vwDhI2SbAMA1kRYswoIBMIs4OqO7QbA//CR9hZLIPc9x+RGqWAyFtUXwjbfszg==", 110 | "requires": { 111 | "bluebird": "3.1.5", 112 | "thenify-all": "1.6.0" 113 | } 114 | }, 115 | "escape-html": { 116 | "version": "1.0.3", 117 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 118 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 119 | }, 120 | "etag": { 121 | "version": "1.8.1", 122 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 123 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 124 | }, 125 | "express": { 126 | "version": "4.16.4", 127 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 128 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 129 | "requires": { 130 | "accepts": "1.3.5", 131 | "array-flatten": "1.1.1", 132 | "body-parser": "1.18.3", 133 | "content-disposition": "0.5.2", 134 | "content-type": "1.0.4", 135 | "cookie": "0.3.1", 136 | "cookie-signature": "1.0.6", 137 | "debug": "2.6.9", 138 | "depd": "1.1.2", 139 | "encodeurl": "1.0.2", 140 | "escape-html": "1.0.3", 141 | "etag": "1.8.1", 142 | "finalhandler": "1.1.1", 143 | "fresh": "0.5.2", 144 | "merge-descriptors": "1.0.1", 145 | "methods": "1.1.2", 146 | "on-finished": "2.3.0", 147 | "parseurl": "1.3.2", 148 | "path-to-regexp": "0.1.7", 149 | "proxy-addr": "2.0.4", 150 | "qs": "6.5.2", 151 | "range-parser": "1.2.0", 152 | "safe-buffer": "5.1.2", 153 | "send": "0.16.2", 154 | "serve-static": "1.13.2", 155 | "setprototypeof": "1.1.0", 156 | "statuses": "1.4.0", 157 | "type-is": "1.6.16", 158 | "utils-merge": "1.0.1", 159 | "vary": "1.1.2" 160 | } 161 | }, 162 | "finalhandler": { 163 | "version": "1.1.1", 164 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 165 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 166 | "requires": { 167 | "debug": "2.6.9", 168 | "encodeurl": "1.0.2", 169 | "escape-html": "1.0.3", 170 | "on-finished": "2.3.0", 171 | "parseurl": "1.3.2", 172 | "statuses": "1.4.0", 173 | "unpipe": "1.0.0" 174 | } 175 | }, 176 | "forwarded": { 177 | "version": "0.1.2", 178 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 179 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 180 | }, 181 | "fresh": { 182 | "version": "0.5.2", 183 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 184 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 185 | }, 186 | "http-errors": { 187 | "version": "1.6.3", 188 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 189 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 190 | "requires": { 191 | "depd": "1.1.2", 192 | "inherits": "2.0.3", 193 | "setprototypeof": "1.1.0", 194 | "statuses": "1.4.0" 195 | } 196 | }, 197 | "iconv-lite": { 198 | "version": "0.4.23", 199 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 200 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 201 | "requires": { 202 | "safer-buffer": "2.1.2" 203 | } 204 | }, 205 | "inherits": { 206 | "version": "2.0.3", 207 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 208 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 209 | }, 210 | "ipaddr.js": { 211 | "version": "1.8.0", 212 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 213 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 214 | }, 215 | "media-typer": { 216 | "version": "0.3.0", 217 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 218 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 219 | }, 220 | "merge-descriptors": { 221 | "version": "1.0.1", 222 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 223 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 224 | }, 225 | "methods": { 226 | "version": "1.1.2", 227 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 228 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 229 | }, 230 | "mime": { 231 | "version": "1.4.1", 232 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 233 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 234 | }, 235 | "mime-db": { 236 | "version": "1.37.0", 237 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 238 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 239 | }, 240 | "mime-types": { 241 | "version": "2.1.21", 242 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 243 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 244 | "requires": { 245 | "mime-db": "1.37.0" 246 | } 247 | }, 248 | "ms": { 249 | "version": "2.0.0", 250 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 251 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 252 | }, 253 | "negotiator": { 254 | "version": "0.6.1", 255 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 256 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 257 | }, 258 | "on-finished": { 259 | "version": "2.3.0", 260 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 261 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 262 | "requires": { 263 | "ee-first": "1.1.1" 264 | } 265 | }, 266 | "parseurl": { 267 | "version": "1.3.2", 268 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 269 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 270 | }, 271 | "path-to-regexp": { 272 | "version": "0.1.7", 273 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 274 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 275 | }, 276 | "proxy-addr": { 277 | "version": "2.0.4", 278 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 279 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 280 | "requires": { 281 | "forwarded": "0.1.2", 282 | "ipaddr.js": "1.8.0" 283 | } 284 | }, 285 | "qs": { 286 | "version": "6.5.2", 287 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 288 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 289 | }, 290 | "range-parser": { 291 | "version": "1.2.0", 292 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 293 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 294 | }, 295 | "raw-body": { 296 | "version": "2.3.3", 297 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 298 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 299 | "requires": { 300 | "bytes": "3.0.0", 301 | "http-errors": "1.6.3", 302 | "iconv-lite": "0.4.23", 303 | "unpipe": "1.0.0" 304 | } 305 | }, 306 | "safe-buffer": { 307 | "version": "5.1.2", 308 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 309 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 310 | }, 311 | "safer-buffer": { 312 | "version": "2.1.2", 313 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 314 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 315 | }, 316 | "send": { 317 | "version": "0.16.2", 318 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 319 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 320 | "requires": { 321 | "debug": "2.6.9", 322 | "depd": "1.1.2", 323 | "destroy": "1.0.4", 324 | "encodeurl": "1.0.2", 325 | "escape-html": "1.0.3", 326 | "etag": "1.8.1", 327 | "fresh": "0.5.2", 328 | "http-errors": "1.6.3", 329 | "mime": "1.4.1", 330 | "ms": "2.0.0", 331 | "on-finished": "2.3.0", 332 | "range-parser": "1.2.0", 333 | "statuses": "1.4.0" 334 | } 335 | }, 336 | "serve-static": { 337 | "version": "1.13.2", 338 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 339 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 340 | "requires": { 341 | "encodeurl": "1.0.2", 342 | "escape-html": "1.0.3", 343 | "parseurl": "1.3.2", 344 | "send": "0.16.2" 345 | } 346 | }, 347 | "setprototypeof": { 348 | "version": "1.1.0", 349 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 350 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 351 | }, 352 | "statuses": { 353 | "version": "1.4.0", 354 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 355 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 356 | }, 357 | "thenify": { 358 | "version": "3.3.0", 359 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", 360 | "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", 361 | "requires": { 362 | "any-promise": "1.3.0" 363 | } 364 | }, 365 | "thenify-all": { 366 | "version": "1.6.0", 367 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 368 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 369 | "requires": { 370 | "thenify": "3.3.0" 371 | } 372 | }, 373 | "type-is": { 374 | "version": "1.6.16", 375 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 376 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 377 | "requires": { 378 | "media-typer": "0.3.0", 379 | "mime-types": "2.1.21" 380 | } 381 | }, 382 | "unpipe": { 383 | "version": "1.0.0", 384 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 385 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 386 | }, 387 | "utils-merge": { 388 | "version": "1.0.1", 389 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 390 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 391 | }, 392 | "vary": { 393 | "version": "1.1.2", 394 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 395 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 396 | }, 397 | "ws": { 398 | "version": "6.1.0", 399 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz", 400 | "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==", 401 | "requires": { 402 | "async-limiter": "1.0.0" 403 | } 404 | } 405 | } 406 | } 407 | -------------------------------------------------------------------------------- /websocket_test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "websocket_test", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "es": "^0.6.0", 14 | "express": "^4.16.4", 15 | "ws": "^6.1.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /websocket_test/reademe.md: -------------------------------------------------------------------------------- 1 | # 启动 2 | 3 | 1. >npm init 4 | 2. >npm install express 5 | 3. >npm install ws 6 | 4. >npm install 7 | 5. >npm start -------------------------------------------------------------------------------- /websocket_test/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | app.use(express.static(__dirname)); 4 | app.listen(3000); 5 | 6 | // ============================================= 7 | const Server = require('ws').Server; 8 | const ws = new Server({ port: 9999 }); // 这里是设置服务器的端口号,和上面的3000端口不用一致 9 | 10 | // 服务器与客户端进行连接的监听 11 | ws.on('connection', (socket) => { 12 | // 服务器来监听客户端发过来的消息 13 | socket.on('message', (msg) => { 14 | console.log(msg); // 这个msg就是客户端发过来的消息 15 | // 服务端也返回给客户端的数据 16 | socket.send(`服务端返回: ${msg}`); 17 | }); 18 | }); --------------------------------------------------------------------------------