├── 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 |
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 |
2 |
3 |
4 |
5 | 聊天室
6 |
7 |
8 |
9 |
10 | 聊天室A
11 |
12 |
13 | 大厅
14 |
15 |
16 | 聊天室B
17 |
18 |
19 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
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 | });
--------------------------------------------------------------------------------