├── readme.md ├── package.json ├── .gitignore ├── public ├── images │ ├── go.svg │ ├── back.svg │ ├── pen.svg │ ├── ok.svg │ ├── account.svg │ ├── close.svg │ ├── eraser.svg │ ├── clear.svg │ ├── submit.svg │ ├── new.svg │ ├── size.svg │ ├── send.svg │ ├── wait.svg │ ├── newroom.svg │ ├── draw.svg │ ├── drap.svg │ ├── chat.svg │ ├── color.svg │ └── home.svg ├── index.css └── index.html ├── server.js └── yarn.lock /readme.md: -------------------------------------------------------------------------------- 1 | # webrtc+socket.io+canvas实现的你画我猜小游戏 2 | ### [项目掘金文章](https://juejin.im/post/5cd3c94d6fb9a03214377acb) 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "koa": "^2.7.0", 4 | "koa-socket": "^4.4.0", 5 | "koa-static": "^5.0.0", 6 | "path": "^0.12.7", 7 | "socket.io": "^2.2.0" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /public/images/go.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/back.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/pen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/ok.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/account.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/eraser.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/clear.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/submit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/new.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/send.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/wait.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/newroom.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/draw.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/drap.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/chat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/color.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/home.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | import Koa from 'koa' 2 | import { join } from 'path' 3 | import Static from 'koa-static' 4 | import Socket from 'socket.io' 5 | 6 | // 保存user 7 | const users = {} 8 | // 保存房间 9 | const rooms = {} 10 | // 保存socket 11 | const sockets = {} 12 | 13 | // 题目 14 | const question = ['花','对牛弹琴', '冰糖葫芦', '刻舟求剑', '口红', '七上八下', '放风筝', '台灯',"理发师", "雷人", "不入虎穴焉得虎子", "仙人掌", "耳机", "打火机", "汉堡", "画饼充饥", "虎头蛇尾", "泪流满面", "捧腹大笑", "画蛇添足", "一手遮天", "掩耳盗铃", "布娃娃", "娃哈哈", "CD", "落地灯", "内裤", "烟斗", "鹦鹉", "钻戒", "网址", "牛肉面"] 15 | 16 | // 用户类 17 | class User { 18 | constructor(name, socre = 0, state=false, isoption=false) { 19 | this.name = name 20 | this.socre = socre 21 | this.state = state 22 | this.isoption = isoption 23 | } 24 | addSocre() { 25 | this.socre += 2 26 | } 27 | } 28 | // 房间类 29 | class Room { 30 | constructor(name) { 31 | this.name = name 32 | this.users = [] 33 | this.index = 0 34 | this.question = '' 35 | } 36 | addUser(user) { 37 | this.users.push(user) 38 | } 39 | deleteUser(user) { 40 | this.users.splice(this.users.indexOf(user), 1) 41 | } 42 | init() { 43 | this.index = 0 44 | for (let user of this.users) { 45 | user.state = false 46 | user.socre = 0 47 | user.isoption = false 48 | } 49 | this.question = '' 50 | } 51 | } 52 | // 创建一个socket.io 53 | const io = new Socket({ 54 | options : { 55 | pingTimeout: 10000, 56 | pingInterval: 5000 57 | } 58 | }) 59 | // 创建koa 60 | const app = new Koa() 61 | // socket注入app 62 | io.attach(app) 63 | 64 | // 添加指定静态web文件的Static路径 65 | // Static(root, opts) 这里将public作为根路径 66 | app.use(Static( 67 | // join 拼接路径 68 | // __dirname返回被执行文件夹的绝对路径 69 | join( __dirname, './public') 70 | )) 71 | 72 | function getRoomList(rooms) { 73 | let r = Object.keys(rooms) 74 | let room = r.map(room => { 75 | return {room: room, length: rooms[room].users.length} 76 | }) 77 | return room 78 | } 79 | function getRoomUsers(data) { 80 | let roomusers 81 | if (data.room && Object.keys(rooms).length) { 82 | roomusers = rooms[data.room].users 83 | } 84 | return roomusers || [] 85 | } 86 | 87 | io.on('connection', socket => { 88 | // 初始化 89 | socket.on('init', (data) => { 90 | socket.emit('init', {room: getRoomList(rooms), roomusers: getRoomUsers(data)}) 91 | }) 92 | // 创建账户 93 | socket.on('createUser', data => { 94 | let user = new User(data) 95 | users[data] = user 96 | sockets[data] = socket 97 | }) 98 | // 创建房间 99 | socket.on('createRoom', data => { 100 | socket.join(data.room, () => { 101 | let room = new Room(data.room) 102 | rooms[data.room] = room 103 | }) 104 | }) 105 | // 加入房间 106 | socket.on('joinRoom', data => { 107 | // socket api 加入房间 (房间名字, 回调) 108 | socket.join(data.room, () => { 109 | let user = new User(data.user) 110 | rooms[data.room].addUser(user) 111 | socket.emit('broadcast', {msg: '你已经加入了房间'}) 112 | socket.to(data.room).emit('broadcast', {msg: `${data.user}已经加入了房间`}) 113 | io.in(data.room).emit('joinedRoom', {roomusers: getRoomUsers(data), joinUser: data.user}) 114 | io.emit('roomChange', {room: getRoomList(rooms)}) 115 | }) 116 | }) 117 | // 离开房间 118 | socket.on('leaveRoom', data => { 119 | socket.leave(data.room, () => { 120 | rooms[data.room].deleteUser(data.user) 121 | if (!rooms[data.room].users.length) { 122 | delete rooms[data.room] 123 | } 124 | socket.emit('broadcast', {msg: '你已经离开了房间'}) 125 | socket.to(data.room).emit('broadcast', {msg: `${data.user}已经离开了房间`}) 126 | io.emit('roomChange', {room: getRoomList(rooms)}) 127 | socket.to(data.room).emit('leaveRoom', {roomusers: getRoomUsers(data), leaveUser: data.user}) 128 | }) 129 | }) 130 | // 准备 131 | socket.on('stateChange', (data) => { 132 | let users = rooms[data.room].users 133 | let index = users.findIndex((user) => { 134 | return user.name === data.user 135 | }) 136 | users[index].state = data.state 137 | let allStated = users.every((user) => { 138 | return user.state === true 139 | }) 140 | if (allStated && rooms[data.room].users.length === 2) { 141 | let room = data.room 142 | let index = rooms[room].index 143 | let users = rooms[room].users 144 | let random = Math.floor(Math.random() * 32) 145 | users[index].isoption = true 146 | rooms[room].question = question[random] 147 | sockets[users[index].name].to(room).emit('broadcast', {msg: `游戏已经开始,本轮你为猜题者`}) 148 | sockets[users[index].name].emit('broadcast', {msg: `游戏已经开始,本轮你为画手`}) 149 | io.to(room).emit('gameStart', {roomusers: getRoomUsers(data)}) 150 | sockets[users[index].name].to(room).emit('guessPage', {question: rooms[room].question.length}) 151 | sockets[users[index].name].emit('paintStart', {index: index, room: room, question: rooms[room].question}) 152 | } else { 153 | io.to(data.room).emit('stateChanged', {roomusers: getRoomUsers(data)}) 154 | } 155 | }) 156 | socket.on('paintEnd', data => { 157 | socket.to(data.room).emit('guessStart') 158 | socket.to(data.room).emit('broadcast', {msg: '已经绘画完成,请开始猜吧'}) 159 | }) 160 | socket.on('submitAnswer', data => { 161 | let users = rooms[data.room].users 162 | let index = users.findIndex((user) => { 163 | return user.name === data.user 164 | }) 165 | users[index].isoption = true 166 | if (data.answer === rooms[data.room].question) { 167 | users[index].addSocre() 168 | } 169 | let allOptioned = users.every((user) => { 170 | return user.isoption === true 171 | }) 172 | console.log(allOptioned) 173 | if (allOptioned) { 174 | if (rooms[data.room].index === 1) { 175 | console.log('gameEnd') 176 | io.to(data.room).emit('gameEnd', {roomusers: getRoomUsers(data)}) 177 | io.to(data.room).emit('broadcast', {msg: `本次游戏已经结束,请观看积分`}) 178 | rooms[data.room].init() 179 | } else { 180 | rooms[data.room].index++ 181 | io.to(data.room).emit('guessEnd', {roomusers: getRoomUsers(data)}) 182 | io.to(data.room).emit('broadcast', {msg: `第${rooms[data.room].index}轮已经结束,答案已经公布`}) 183 | } 184 | sockets[users[index].name].to(data.room).emit('showAnswer', {answer: rooms[data.room].question}) 185 | } 186 | }) 187 | 188 | // 关于房间nat穿透 189 | // 转发offer 190 | socket.on('offer', data => { 191 | socket.to(sockets[data.toUser].id).emit('offer', data) 192 | }) 193 | // 转发answer 194 | socket.on('answer', data => { 195 | socket.to(sockets[data.toUser].id).emit('answer', data) 196 | }) 197 | // 转发iceCandidate 198 | socket.on('ice', data => { 199 | socket.to(sockets[data.toUser].id).emit('ice', data) 200 | }) 201 | 202 | }) 203 | // 断开连接 204 | io.on('disconnect', socket => { 205 | // 当该io断开,将user在users中去除 206 | users.splice(users.indexOf(socket[socket.id]), 1) 207 | // 删除socket 208 | delete sockets[socket.id] 209 | }) 210 | io.listen(app.listen(3000, () => { 211 | console.log('server start at port: ' + 3000) 212 | })) -------------------------------------------------------------------------------- /public/index.css: -------------------------------------------------------------------------------- 1 | /* 基本配置 */ 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | ul li { 8 | list-style: none 9 | } 10 | 11 | html, body { 12 | background-color: #f7f7f7; 13 | position: relative; 14 | } 15 | /* 基本配置 */ 16 | 17 | 18 | /* 布局 */ 19 | .container { 20 | display: flex; 21 | margin: 0 auto; 22 | width: 1200px; 23 | height: 600px; 24 | border: 2px solid #f7f7f7; 25 | background-color: #fff; 26 | border-radius: 5px; 27 | } 28 | 29 | .left { 30 | width: 200px; 31 | height: 100%; 32 | position: relative; 33 | overflow: hidden; 34 | } 35 | 36 | .right { 37 | width: 350px; 38 | height: 100%; 39 | position: relative; 40 | overflow: hidden; 41 | } 42 | 43 | .center { 44 | flex: 1; 45 | background-color: #f7f7f7; 46 | position: relative; 47 | overflow: hidden; 48 | display: none; 49 | } 50 | .shade { 51 | position: fixed; 52 | display: none; 53 | width: 100vw; 54 | height: 100vh; 55 | left: 0; 56 | top: 0; 57 | z-index: 100; 58 | background-color: rgba(0, 0, 0, 0.5); 59 | } 60 | .new { 61 | margin-top: 200px; 62 | margin-left: 550px; 63 | } 64 | .new input { 65 | width: 200px; 66 | height: 30px; 67 | padding: 3px 0 3px 10px; 68 | box-sizing: border-box; 69 | position: relative; 70 | outline: none; 71 | border: 1px solid #707070; 72 | top: -10px; 73 | left: 5px; 74 | color: #707070; 75 | border-radius: 5px; 76 | } 77 | .new input + span { 78 | content: url(./images/submit.svg); 79 | width: 30px; 80 | height: 30px; 81 | margin-top: 5px; 82 | margin-left: 20px; 83 | cursor: pointer; 84 | } 85 | .shade i { 86 | content: url(./images/close.svg); 87 | width: 30px; 88 | height: 30px; 89 | margin-left: 90%; 90 | margin-top: 4%; 91 | cursor: pointer; 92 | } 93 | /* 布局 */ 94 | 95 | /* 头部 */ 96 | .header { 97 | width: 1200px; 98 | margin: 50px auto 0; 99 | height: 50px; 100 | border: 1px solid #fff; 101 | border-bottom: 0; 102 | overflow: hidden; 103 | text-align: right; 104 | position: relative; 105 | } 106 | .header .createUser { 107 | float: left; 108 | content: url(./images/new.svg); 109 | width: 40px; 110 | height: 40px; 111 | margin-top: 5px; 112 | margin-left: 30px; 113 | cursor: pointer; 114 | } 115 | .createUser:hover + P{ 116 | top: 50%; 117 | } 118 | .createUser + p { 119 | position: absolute; 120 | top: -100%; 121 | left: 11%; 122 | transform: translate(-50%,-50%); 123 | color: #707070; 124 | font-size: 20px; 125 | transition: all 0.3s; 126 | } 127 | 128 | .user { 129 | content: url(./images/account.svg); 130 | right: 13%; 131 | width: 40px; 132 | height: 40px; 133 | margin-right: 10px; 134 | margin-top: 5px; 135 | float: right; 136 | } 137 | .user + p { 138 | font-size: 26px; 139 | height: 40px; 140 | line-height: 40px; 141 | width: 500px; 142 | float: right; 143 | text-align: right; 144 | padding-right: 20px; 145 | color: #707070; 146 | position: relative; 147 | top: 5px; 148 | } 149 | /* 头部 */ 150 | 151 | 152 | /* 左侧房间列表 */ 153 | .home { 154 | content: url(./images/home.svg); 155 | margin-top: 10px; 156 | margin-left: 10px; 157 | width: 35px; 158 | height: 35px; 159 | } 160 | .home:hover + span { 161 | top: 3%; 162 | } 163 | .left span { 164 | position: absolute; 165 | top: -20%; 166 | left: 30%; 167 | height: 30px; 168 | color: #707070; 169 | line-height: 30px; 170 | transform: translate(-10%, 0%); 171 | transition: all 0.3s; 172 | } 173 | 174 | .list { 175 | text-align: center; 176 | } 177 | .userList { 178 | height: 160px; 179 | } 180 | .list p { 181 | height: 40px; 182 | line-height: 40px; 183 | cursor: pointer; 184 | position: relative; 185 | } 186 | 187 | .list p:first-child { 188 | margin-top: 10px; 189 | } 190 | 191 | .list p:nth-of-type(n) { 192 | background-color: #f7f7f7; 193 | } 194 | 195 | .list p:nth-of-type(2n) { 196 | background-color: #ffffff; 197 | } 198 | 199 | .list p span { 200 | position: absolute; 201 | top: 50%; 202 | left: 80%; 203 | transform: translate(-50%, -50%); 204 | display: inline-block; 205 | border: 1px solid #707070; 206 | color: #707070; 207 | font-size: 11px; 208 | text-align: center; 209 | line-height: 20px; 210 | border-radius: 2px; 211 | height: 20px; 212 | width: 40px; 213 | } 214 | .userList p{ 215 | cursor: default; 216 | } 217 | .left-bottom { 218 | position: absolute; 219 | bottom: 10px; 220 | width: 100%; 221 | height: 100px; 222 | } 223 | .roomops { 224 | float: left; 225 | width: 100%; 226 | height: 50px; 227 | position: relative; 228 | overflow: hidden; 229 | } 230 | .roomop { 231 | margin-top: 5px; 232 | cursor: pointer; 233 | } 234 | .roomop:hover + p{ 235 | top: 0%; 236 | } 237 | .roomop + p { 238 | position: absolute; 239 | width: 100px; 240 | top: -100%; 241 | left: 30%; 242 | transition: all 0.3s; 243 | transform: translateY(-30%,0%); 244 | line-height: 50px; 245 | text-align: center; 246 | color: #707070; 247 | font-size: 16px; 248 | } 249 | .createRoom { 250 | margin-left: 20px; 251 | width: 40px; 252 | height: 40px; 253 | content: url(./images/newroom.svg); 254 | } 255 | .drap { 256 | width: 35px; 257 | height: 35px; 258 | margin-left: 25px; 259 | content: url(./images/drap.svg); 260 | } 261 | /* 左侧房间列表 */ 262 | 263 | /* 画板区域 */ 264 | 265 | .draw { 266 | content: url(./images/draw.svg); 267 | width: 35px; 268 | height: 35px; 269 | margin-top: 10px; 270 | margin-left: 50px; 271 | position: relative; 272 | } 273 | 274 | .center head { 275 | height: 55px; 276 | position: relative; 277 | overflow: hidden; 278 | } 279 | .draw:hover + p { 280 | top: 3%; 281 | } 282 | 283 | .head p { 284 | position: absolute; 285 | top: -20%; 286 | left: 15%; 287 | height: 35px; 288 | line-height: 35px; 289 | color: #707070; 290 | transition: top 0.3s; 291 | } 292 | 293 | .center ul { 294 | width: 450px; 295 | float: right; 296 | height: 40px; 297 | margin-top: 10px; 298 | } 299 | 300 | ul li { 301 | position: relative; 302 | cursor: pointer; 303 | float: left; 304 | width: 35px; 305 | height: 35px; 306 | margin-left: 15px; 307 | border-radius: 5px; 308 | border: 2px solid #707070; 309 | text-align: center; 310 | overflow: hidden; 311 | } 312 | 313 | ul li:hover { 314 | box-shadow: 1px 0px 5px #707070; 315 | } 316 | .center .head ul li:hover span { 317 | top: 50%; 318 | } 319 | .center .head ul li:nth-of-type(6):hover + .weight-select{ 320 | display: inline-block; 321 | } 322 | ul li img { 323 | position: absolute; 324 | top: 50%; 325 | left: 50%; 326 | transform: translate(-50%, -50%); 327 | width: 80%; 328 | height: 80%; 329 | } 330 | .center .head ul li span { 331 | background-color: #fff; 332 | width: 30px; 333 | height: 30px; 334 | color: #707070; 335 | text-align: center; 336 | line-height: 30px; 337 | position: absolute; 338 | top: 150%; 339 | left: 50%; 340 | transform: translate(-50%,-50%); 341 | font-size: 14px; 342 | z-index: 10; 343 | transition: top 0.3s; 344 | } 345 | 346 | .weight-select { 347 | width: 40px; 348 | height: 100px; 349 | position: absolute; 350 | top: 7%; 351 | left: 74.5%; 352 | display: none; 353 | transition: all 0.3s; 354 | } 355 | .weight-select:hover { 356 | display: inline-block; 357 | } 358 | .weight-select p{ 359 | position: relative; 360 | top: 0; 361 | left: 0; 362 | width: 40px; 363 | height: 20px; 364 | margin-bottom: 3px; 365 | line-height: 20px; 366 | text-align: center; 367 | background-color: #fff; 368 | cursor: pointer; 369 | } 370 | .weight-select p:first-child { 371 | margin-top: 10px; 372 | } 373 | .weight-select p:hover { 374 | background-color: #707070; 375 | color: #f7f7f7; 376 | } 377 | .center-footer { 378 | position: absolute; 379 | bottom: 5px; 380 | right: 0; 381 | width: 300px; 382 | margin-left: 10px; 383 | height: 100px; 384 | } 385 | .questionTip { 386 | font-size: 20px; 387 | color: #707070; 388 | text-align: center; 389 | /* display: inline-block; */ 390 | width: 250px; 391 | height: 50px; 392 | line-height: 50px; 393 | /* position: relative; */ 394 | /* top: 20px; */ 395 | } 396 | .answer { 397 | outline: none; 398 | border: 1px solid#bfbfbf; 399 | border-radius: 5px; 400 | height: 25px; 401 | line-height: 25px; 402 | box-sizing: border-box; 403 | padding-left: 10px; 404 | } 405 | .answerBtn { 406 | width: 25px; 407 | height: 25px; 408 | content: url(./images/ok.svg); 409 | cursor: pointer; 410 | position: relative; 411 | margin-left: 20px; 412 | top: 8px; 413 | } 414 | .paintEnd { 415 | width: 35px; 416 | height: 35px; 417 | content: url(./images/ok.svg); 418 | cursor: pointer; 419 | margin-left: 120px; 420 | } 421 | /* 画板区域 */ 422 | 423 | /* 右侧房间信息 */ 424 | .right { 425 | display: none; 426 | } 427 | .right .head { 428 | vertical-align: center; 429 | } 430 | .right .head i { 431 | content: url(./images/wait.svg); 432 | width: 45px; 433 | height: 45px; 434 | margin-top: 10px; 435 | margin-left: 10px; 436 | } 437 | .right .head i:hover + p { 438 | top: 3%; 439 | } 440 | .right .head p { 441 | position: absolute; 442 | top: -20%; 443 | left: 15%; 444 | color: #707070; 445 | transition: top 0.3s; 446 | } 447 | 448 | .chat { 449 | position: relative; 450 | overflow: hidden; 451 | } 452 | .chat i { 453 | content: url(./images/chat.svg); 454 | width: 35px; 455 | height: 35px; 456 | margin-left: 20px; 457 | } 458 | .chat i:hover + p { 459 | top: 3%; 460 | } 461 | .chat i + p { 462 | position: absolute; 463 | top: -100%; 464 | left: 18%; 465 | color: #707070; 466 | transition: top 0.3s; 467 | } 468 | .chatList { 469 | margin: 0 auto; 470 | width: 310px; 471 | height: 280px; 472 | background-color: #f7f7f7; 473 | overflow:auto; 474 | } 475 | .chatList p { 476 | width: 95%; 477 | box-sizing: border-box; 478 | padding-left: 15px; 479 | display: inline-block; 480 | color: #707070; 481 | font-size: 14px; 482 | line-height: 1; 483 | word-break: normal; 484 | word-wrap: break-word; 485 | } 486 | .submit i { 487 | content: url(./images/send.svg); 488 | width: 25px; 489 | height: 25px; 490 | cursor: pointer; 491 | margin-left: 50px; 492 | } 493 | .submit { 494 | margin: 0 auto; 495 | width: 310px; 496 | height: 40px; 497 | background-color: #f7f7f7; 498 | position: relative; 499 | } 500 | .submit input { 501 | width: 200px; 502 | height: 25px; 503 | padding: 3px 0 3px 10px; 504 | color: #bfbfbf; 505 | box-sizing: border-box; 506 | position: relative; 507 | outline: none; 508 | border-radius: 5px; 509 | border: 1px solid #bfbfbf; 510 | top: -5px; 511 | left: 30px; 512 | } 513 | /* 右侧房间信息 */ 514 | /* 广播 */ 515 | .broadcast { 516 | position: fixed; 517 | top: 0; 518 | height: 50px; 519 | line-height: 50px; 520 | font-size: 25px; 521 | color: #707070; 522 | background-color: #f7f7f7; 523 | border-radius: 5px; 524 | text-align: right; 525 | z-index: 10; 526 | animation: broadcast 3s forwards ease-in-out; 527 | transition: all 3s; 528 | } 529 | @keyframes broadcast { 530 | 0% { 531 | right: 0; 532 | opacity: 0; 533 | } 534 | 50% { 535 | right: 50px; 536 | opacity: 1; 537 | } 538 | 75% { 539 | right: 50px; 540 | opacity: 1; 541 | } 542 | 100% { 543 | right: 0; 544 | opacity: 0; 545 | } 546 | } 547 | /* 广播 */ 548 | /* video */ 549 | .video { 550 | position: absolute; 551 | background-color: #fff; 552 | width: 600px; 553 | height: 400px; 554 | left: 25px; 555 | top: 70px; 556 | } 557 | /* video */ -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 你画我猜 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 |
20 |
21 | 26 |
27 |
28 |
29 | 主页 30 | 房间列表... 31 |
32 |
33 |
34 | 退出房间 35 |

退出房间...

36 |
37 |
38 | 创建房间 39 |

创建房间...

40 |
41 |
42 |
43 |
44 |
45 | 46 |

画板...

47 |
    48 |
  • 49 | 画笔 50 | 画笔 51 |
  • 52 |
  • 53 | 橡皮 54 | 橡皮 55 |
  • 56 |
  • 57 | 撤退 58 | 撤回 59 |
  • 60 |
  • 61 | 前进 62 | 前进 63 |
  • 64 |
  • 65 | 清屏 66 | 清空 67 |
  • 68 |
  • 69 | 粗细 70 | 清空 71 |
  • 72 |
    73 |

    1px

    74 |

    5px

    75 |

    10px

    76 |

    30px

    77 |
    78 |
  • 79 | 颜色 80 | 清空 81 | 82 |
  • 83 |
84 | 85 |
86 | 87 | 88 | 89 | 90 | 95 | 96 |
97 | 115 |
116 | 117 | 930 | 931 | 932 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@1.1.4: 6 | version "1.1.4" 7 | resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.1.4.tgz#d71c96f7d41d0feda2c38cd14e8a27c04158df4a" 8 | integrity sha1-1xyW99QdD+2iw4zRToonwEFY30o= 9 | dependencies: 10 | mime-types "~2.0.4" 11 | negotiator "0.4.9" 12 | 13 | accepts@^1.3.5, accepts@~1.3.4: 14 | version "1.3.5" 15 | resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 16 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 17 | dependencies: 18 | mime-types "~2.1.18" 19 | negotiator "0.6.1" 20 | 21 | after@0.8.1: 22 | version "0.8.1" 23 | resolved "https://registry.npm.taobao.org/after/download/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" 24 | integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= 25 | 26 | after@0.8.2: 27 | version "0.8.2" 28 | resolved "https://registry.npm.taobao.org/after/download/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" 29 | integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= 30 | 31 | any-promise@^1.0.0, any-promise@^1.1.0: 32 | version "1.3.0" 33 | resolved "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 34 | integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= 35 | 36 | arraybuffer.slice@0.0.6: 37 | version "0.0.6" 38 | resolved "https://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" 39 | integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= 40 | 41 | arraybuffer.slice@~0.0.7: 42 | version "0.0.7" 43 | resolved "https://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" 44 | integrity sha1-O7xCdd1YTMGxCAm4nU6LY6aednU= 45 | 46 | async-limiter@~1.0.0: 47 | version "1.0.0" 48 | resolved "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 49 | integrity sha1-ePrtjD0HSrgfIrTphdeehzj3IPg= 50 | 51 | backo2@1.0.2: 52 | version "1.0.2" 53 | resolved "https://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 54 | integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= 55 | 56 | base64-arraybuffer@0.1.2: 57 | version "0.1.2" 58 | resolved "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.2.tgz#474df4a9f2da24e05df3158c3b1db3c3cd46a154" 59 | integrity sha1-R030qfLaJOBd8xWMOx2zw81GoVQ= 60 | 61 | base64-arraybuffer@0.1.5: 62 | version "0.1.5" 63 | resolved "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 64 | integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= 65 | 66 | base64id@0.1.0: 67 | version "0.1.0" 68 | resolved "https://registry.npm.taobao.org/base64id/download/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" 69 | integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= 70 | 71 | base64id@1.0.0: 72 | version "1.0.0" 73 | resolved "https://registry.npm.taobao.org/base64id/download/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" 74 | integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= 75 | 76 | benchmark@1.0.0: 77 | version "1.0.0" 78 | resolved "https://registry.npm.taobao.org/benchmark/download/benchmark-1.0.0.tgz#2f1e2fa4c359f11122aa183082218e957e390c73" 79 | integrity sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM= 80 | 81 | better-assert@~1.0.0: 82 | version "1.0.2" 83 | resolved "https://registry.npm.taobao.org/better-assert/download/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" 84 | integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= 85 | dependencies: 86 | callsite "1.0.0" 87 | 88 | blob@0.0.4: 89 | version "0.0.4" 90 | resolved "https://registry.npm.taobao.org/blob/download/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" 91 | integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= 92 | 93 | blob@0.0.5: 94 | version "0.0.5" 95 | resolved "https://registry.npm.taobao.org/blob/download/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" 96 | integrity sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM= 97 | 98 | cache-content-type@^1.0.0: 99 | version "1.0.1" 100 | resolved "https://registry.npm.taobao.org/cache-content-type/download/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" 101 | integrity sha1-A1zeKwjuISn0qDFeqPAKANuhRTw= 102 | dependencies: 103 | mime-types "^2.1.18" 104 | ylru "^1.2.0" 105 | 106 | callsite@1.0.0: 107 | version "1.0.0" 108 | resolved "https://registry.npm.taobao.org/callsite/download/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" 109 | integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= 110 | 111 | co@^4.6.0: 112 | version "4.6.0" 113 | resolved "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 114 | integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 115 | 116 | component-bind@1.0.0: 117 | version "1.0.0" 118 | resolved "https://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 119 | integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= 120 | 121 | component-emitter@1.1.2: 122 | version "1.1.2" 123 | resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" 124 | integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= 125 | 126 | component-emitter@1.2.0: 127 | version "1.2.0" 128 | resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" 129 | integrity sha1-zNETqGOI0GSC0D3j/H35hSa6jv4= 130 | 131 | component-emitter@1.2.1: 132 | version "1.2.1" 133 | resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 134 | integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= 135 | 136 | component-inherit@0.0.3: 137 | version "0.0.3" 138 | resolved "https://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" 139 | integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= 140 | 141 | content-disposition@~0.5.2: 142 | version "0.5.3" 143 | resolved "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 144 | integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= 145 | dependencies: 146 | safe-buffer "5.1.2" 147 | 148 | content-type@^1.0.4: 149 | version "1.0.4" 150 | resolved "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 151 | integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= 152 | 153 | cookie@0.3.1: 154 | version "0.3.1" 155 | resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 156 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 157 | 158 | cookies@~0.7.1: 159 | version "0.7.3" 160 | resolved "https://registry.npm.taobao.org/cookies/download/cookies-0.7.3.tgz#7912ce21fbf2e8c2da70cf1c3f351aecf59dadfa" 161 | integrity sha1-eRLOIfvy6MLacM8cPzUa7PWdrfo= 162 | dependencies: 163 | depd "~1.1.2" 164 | keygrip "~1.0.3" 165 | 166 | debug@0.7.4: 167 | version "0.7.4" 168 | resolved "https://registry.npm.taobao.org/debug/download/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" 169 | integrity sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk= 170 | 171 | debug@2.2.0: 172 | version "2.2.0" 173 | resolved "https://registry.npm.taobao.org/debug/download/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 174 | integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= 175 | dependencies: 176 | ms "0.7.1" 177 | 178 | debug@^3.1.0: 179 | version "3.2.6" 180 | resolved "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 181 | integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps= 182 | dependencies: 183 | ms "^2.1.1" 184 | 185 | debug@~3.1.0: 186 | version "3.1.0" 187 | resolved "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 188 | integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE= 189 | dependencies: 190 | ms "2.0.0" 191 | 192 | debug@~4.1.0: 193 | version "4.1.1" 194 | resolved "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 195 | integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E= 196 | dependencies: 197 | ms "^2.1.1" 198 | 199 | deep-equal@~1.0.1: 200 | version "1.0.1" 201 | resolved "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 202 | integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= 203 | 204 | delegates@^1.0.0: 205 | version "1.0.0" 206 | resolved "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 207 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 208 | 209 | depd@^1.1.2, depd@~1.1.2: 210 | version "1.1.2" 211 | resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 212 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 213 | 214 | destroy@^1.0.4: 215 | version "1.0.4" 216 | resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 217 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 218 | 219 | ee-first@1.1.1: 220 | version "1.1.1" 221 | resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 222 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 223 | 224 | engine.io-client@1.6.8: 225 | version "1.6.8" 226 | resolved "https://registry.npm.taobao.org/engine.io-client/download/engine.io-client-1.6.8.tgz#6e2db11648b45e405c46b172ea3e3dac37cc0ceb" 227 | integrity sha1-bi2xFki0XkBcRrFy6j49rDfMDOs= 228 | dependencies: 229 | component-emitter "1.1.2" 230 | component-inherit "0.0.3" 231 | debug "2.2.0" 232 | engine.io-parser "1.2.4" 233 | has-cors "1.1.0" 234 | indexof "0.0.1" 235 | parsejson "0.0.1" 236 | parseqs "0.0.2" 237 | parseuri "0.0.4" 238 | ws "1.0.1" 239 | xmlhttprequest-ssl "1.5.1" 240 | yeast "0.1.2" 241 | 242 | engine.io-client@~3.3.1: 243 | version "3.3.2" 244 | resolved "https://registry.npm.taobao.org/engine.io-client/download/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" 245 | integrity sha1-BOBoeY11vtoUN1omS7PXQte8M6o= 246 | dependencies: 247 | component-emitter "1.2.1" 248 | component-inherit "0.0.3" 249 | debug "~3.1.0" 250 | engine.io-parser "~2.1.1" 251 | has-cors "1.1.0" 252 | indexof "0.0.1" 253 | parseqs "0.0.5" 254 | parseuri "0.0.5" 255 | ws "~6.1.0" 256 | xmlhttprequest-ssl "~1.5.4" 257 | yeast "0.1.2" 258 | 259 | engine.io-parser@1.2.4: 260 | version "1.2.4" 261 | resolved "https://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-1.2.4.tgz#e0897b0bf14e792d4cd2a5950553919c56948c42" 262 | integrity sha1-4Il7C/FOeS1M0qWVBVORnFaUjEI= 263 | dependencies: 264 | after "0.8.1" 265 | arraybuffer.slice "0.0.6" 266 | base64-arraybuffer "0.1.2" 267 | blob "0.0.4" 268 | has-binary "0.1.6" 269 | utf8 "2.1.0" 270 | 271 | engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: 272 | version "2.1.3" 273 | resolved "https://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" 274 | integrity sha1-dXq5cPvy37Mse3SwMyFtVznveaY= 275 | dependencies: 276 | after "0.8.2" 277 | arraybuffer.slice "~0.0.7" 278 | base64-arraybuffer "0.1.5" 279 | blob "0.0.5" 280 | has-binary2 "~1.0.2" 281 | 282 | engine.io@1.6.8: 283 | version "1.6.8" 284 | resolved "https://registry.npm.taobao.org/engine.io/download/engine.io-1.6.8.tgz#de05a06b757e7517695e088c7b051c47819f511b" 285 | integrity sha1-3gWga3V+dRdpXgiMewUcR4GfURs= 286 | dependencies: 287 | accepts "1.1.4" 288 | base64id "0.1.0" 289 | debug "2.2.0" 290 | engine.io-parser "1.2.4" 291 | ws "1.0.1" 292 | 293 | engine.io@~3.3.1: 294 | version "3.3.2" 295 | resolved "https://registry.npm.taobao.org/engine.io/download/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" 296 | integrity sha1-GMvItvNulGHFwPgd8rgw3hYFilk= 297 | dependencies: 298 | accepts "~1.3.4" 299 | base64id "1.0.0" 300 | cookie "0.3.1" 301 | debug "~3.1.0" 302 | engine.io-parser "~2.1.0" 303 | ws "~6.1.0" 304 | 305 | error-inject@^1.0.0: 306 | version "1.0.0" 307 | resolved "https://registry.npm.taobao.org/error-inject/download/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 308 | integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= 309 | 310 | escape-html@^1.0.3: 311 | version "1.0.3" 312 | resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 313 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 314 | 315 | fresh@~0.5.2: 316 | version "0.5.2" 317 | resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 318 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 319 | 320 | has-binary2@~1.0.2: 321 | version "1.0.3" 322 | resolved "https://registry.npm.taobao.org/has-binary2/download/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" 323 | integrity sha1-d3asYn8+p3JQz8My2rfd9eT10R0= 324 | dependencies: 325 | isarray "2.0.1" 326 | 327 | has-binary@0.1.6: 328 | version "0.1.6" 329 | resolved "https://registry.npm.taobao.org/has-binary/download/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" 330 | integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= 331 | dependencies: 332 | isarray "0.0.1" 333 | 334 | has-binary@0.1.7: 335 | version "0.1.7" 336 | resolved "https://registry.npm.taobao.org/has-binary/download/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" 337 | integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= 338 | dependencies: 339 | isarray "0.0.1" 340 | 341 | has-cors@1.1.0: 342 | version "1.1.0" 343 | resolved "https://registry.npm.taobao.org/has-cors/download/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" 344 | integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= 345 | 346 | http-assert@^1.3.0: 347 | version "1.4.0" 348 | resolved "https://registry.npm.taobao.org/http-assert/download/http-assert-1.4.0.tgz#0e550b4fca6adf121bbeed83248c17e62f593a9a" 349 | integrity sha1-DlULT8pq3xIbvu2DJIwX5i9ZOpo= 350 | dependencies: 351 | deep-equal "~1.0.1" 352 | http-errors "~1.7.1" 353 | 354 | http-errors@^1.6.3, http-errors@~1.7.1: 355 | version "1.7.2" 356 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 357 | integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= 358 | dependencies: 359 | depd "~1.1.2" 360 | inherits "2.0.3" 361 | setprototypeof "1.1.1" 362 | statuses ">= 1.5.0 < 2" 363 | toidentifier "1.0.0" 364 | 365 | http-errors@~1.6.2: 366 | version "1.6.3" 367 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 368 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 369 | dependencies: 370 | depd "~1.1.2" 371 | inherits "2.0.3" 372 | setprototypeof "1.1.0" 373 | statuses ">= 1.4.0 < 2" 374 | 375 | indexof@0.0.1: 376 | version "0.0.1" 377 | resolved "https://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 378 | integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= 379 | 380 | inherits@2.0.3: 381 | version "2.0.3" 382 | resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 383 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 384 | 385 | is-generator-function@^1.0.7: 386 | version "1.0.7" 387 | resolved "https://registry.npm.taobao.org/is-generator-function/download/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" 388 | integrity sha1-0hMuUpuwAAp/gHlNS99c1eWBNSI= 389 | 390 | isarray@0.0.1: 391 | version "0.0.1" 392 | resolved "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 393 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 394 | 395 | isarray@2.0.1: 396 | version "2.0.1" 397 | resolved "https://registry.npm.taobao.org/isarray/download/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" 398 | integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= 399 | 400 | json3@3.2.6: 401 | version "3.2.6" 402 | resolved "https://registry.npm.taobao.org/json3/download/json3-3.2.6.tgz#f6efc93c06a04de9aec53053df2559bb19e2038b" 403 | integrity sha1-9u/JPAagTemuxTBT3yVZuxniA4s= 404 | 405 | json3@3.3.2: 406 | version "3.3.2" 407 | resolved "https://registry.npm.taobao.org/json3/download/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 408 | integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= 409 | 410 | keygrip@~1.0.3: 411 | version "1.0.3" 412 | resolved "https://registry.npm.taobao.org/keygrip/download/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc" 413 | integrity sha1-OZ1wnwrtK6sKBZ4M3TpQI6BT4dw= 414 | 415 | koa-compose@3.1.0: 416 | version "3.1.0" 417 | resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-3.1.0.tgz#f6e32f1b8953f7c87b97fc10c208fed334da76f4" 418 | integrity sha1-9uMvG4lT98h7l/wQwgj+0zTadvQ= 419 | dependencies: 420 | any-promise "^1.1.0" 421 | 422 | koa-compose@^3.0.0: 423 | version "3.2.1" 424 | resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 425 | integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= 426 | dependencies: 427 | any-promise "^1.1.0" 428 | 429 | koa-compose@^4.1.0: 430 | version "4.1.0" 431 | resolved "https://registry.npm.taobao.org/koa-compose/download/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 432 | integrity sha1-UHMGuTcZAdtBEhyBLpI9DWfT6Hc= 433 | 434 | koa-convert@^1.2.0: 435 | version "1.2.0" 436 | resolved "https://registry.npm.taobao.org/koa-convert/download/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 437 | integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= 438 | dependencies: 439 | co "^4.6.0" 440 | koa-compose "^3.0.0" 441 | 442 | koa-is-json@^1.0.0: 443 | version "1.0.0" 444 | resolved "https://registry.npm.taobao.org/koa-is-json/download/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" 445 | integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ= 446 | 447 | koa-send@^5.0.0: 448 | version "5.0.0" 449 | resolved "https://registry.npm.taobao.org/koa-send/download/koa-send-5.0.0.tgz#5e8441e07ef55737734d7ced25b842e50646e7eb" 450 | integrity sha1-XoRB4H71VzdzTXztJbhC5QZG5+s= 451 | dependencies: 452 | debug "^3.1.0" 453 | http-errors "^1.6.3" 454 | mz "^2.7.0" 455 | resolve-path "^1.4.0" 456 | 457 | koa-socket@^4.4.0: 458 | version "4.4.0" 459 | resolved "https://registry.npm.taobao.org/koa-socket/download/koa-socket-4.4.0.tgz#e651a003980d96d96fce3955116dfbc563665097" 460 | integrity sha1-5lGgA5gNltlvzjlVEW37xWNmUJc= 461 | dependencies: 462 | koa-compose "3.1.0" 463 | socket.io "1.4.5" 464 | 465 | koa-static@^5.0.0: 466 | version "5.0.0" 467 | resolved "https://registry.npm.taobao.org/koa-static/download/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" 468 | integrity sha1-XpL8lrU3rVIZ9CUxnJW2R3J3aUM= 469 | dependencies: 470 | debug "^3.1.0" 471 | koa-send "^5.0.0" 472 | 473 | koa@^2.7.0: 474 | version "2.7.0" 475 | resolved "https://registry.npm.taobao.org/koa/download/koa-2.7.0.tgz#7e00843506942b9d82c6cc33749f657c6e5e7adf" 476 | integrity sha1-fgCENQaUK52CxswzdJ9lfG5eet8= 477 | dependencies: 478 | accepts "^1.3.5" 479 | cache-content-type "^1.0.0" 480 | content-disposition "~0.5.2" 481 | content-type "^1.0.4" 482 | cookies "~0.7.1" 483 | debug "~3.1.0" 484 | delegates "^1.0.0" 485 | depd "^1.1.2" 486 | destroy "^1.0.4" 487 | error-inject "^1.0.0" 488 | escape-html "^1.0.3" 489 | fresh "~0.5.2" 490 | http-assert "^1.3.0" 491 | http-errors "^1.6.3" 492 | is-generator-function "^1.0.7" 493 | koa-compose "^4.1.0" 494 | koa-convert "^1.2.0" 495 | koa-is-json "^1.0.0" 496 | on-finished "^2.3.0" 497 | only "~0.0.2" 498 | parseurl "^1.3.2" 499 | statuses "^1.5.0" 500 | type-is "^1.6.16" 501 | vary "^1.1.2" 502 | 503 | media-typer@0.3.0: 504 | version "0.3.0" 505 | resolved "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 506 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 507 | 508 | mime-db@1.40.0: 509 | version "1.40.0" 510 | resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 511 | integrity sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI= 512 | 513 | mime-db@~1.12.0: 514 | version "1.12.0" 515 | resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" 516 | integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc= 517 | 518 | mime-types@^2.1.18, mime-types@~2.1.18: 519 | version "2.1.24" 520 | resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 521 | integrity sha1-tvjQs+lR77d97eyhlM/20W9nb4E= 522 | dependencies: 523 | mime-db "1.40.0" 524 | 525 | mime-types@~2.0.4: 526 | version "2.0.14" 527 | resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" 528 | integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY= 529 | dependencies: 530 | mime-db "~1.12.0" 531 | 532 | ms@0.7.1: 533 | version "0.7.1" 534 | resolved "https://registry.npm.taobao.org/ms/download/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 535 | integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= 536 | 537 | ms@2.0.0: 538 | version "2.0.0" 539 | resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 540 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 541 | 542 | ms@^2.1.1: 543 | version "2.1.1" 544 | resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 545 | integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= 546 | 547 | mz@^2.7.0: 548 | version "2.7.0" 549 | resolved "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 550 | integrity sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI= 551 | dependencies: 552 | any-promise "^1.0.0" 553 | object-assign "^4.0.1" 554 | thenify-all "^1.0.0" 555 | 556 | negotiator@0.4.9: 557 | version "0.4.9" 558 | resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.4.9.tgz#92e46b6db53c7e421ed64a2bc94f08be7630df3f" 559 | integrity sha1-kuRrbbU8fkIe1koryU8IvnYw3z8= 560 | 561 | negotiator@0.6.1: 562 | version "0.6.1" 563 | resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 564 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 565 | 566 | object-assign@^4.0.1: 567 | version "4.1.1" 568 | resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 569 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 570 | 571 | object-component@0.0.3: 572 | version "0.0.3" 573 | resolved "https://registry.npm.taobao.org/object-component/download/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" 574 | integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= 575 | 576 | on-finished@^2.3.0: 577 | version "2.3.0" 578 | resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 579 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 580 | dependencies: 581 | ee-first "1.1.1" 582 | 583 | only@~0.0.2: 584 | version "0.0.2" 585 | resolved "https://registry.npm.taobao.org/only/download/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 586 | integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= 587 | 588 | options@>=0.0.5: 589 | version "0.0.6" 590 | resolved "https://registry.npm.taobao.org/options/download/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" 591 | integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= 592 | 593 | parsejson@0.0.1: 594 | version "0.0.1" 595 | resolved "https://registry.npm.taobao.org/parsejson/download/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" 596 | integrity sha1-mxDGwNglq1ieaFFTgm3go7oni8w= 597 | dependencies: 598 | better-assert "~1.0.0" 599 | 600 | parseqs@0.0.2: 601 | version "0.0.2" 602 | resolved "https://registry.npm.taobao.org/parseqs/download/parseqs-0.0.2.tgz#9dfe70b2cddac388bde4f35b1f240fa58adbe6c7" 603 | integrity sha1-nf5wss3aw4i95PNbHyQPpYrb5sc= 604 | dependencies: 605 | better-assert "~1.0.0" 606 | 607 | parseqs@0.0.5: 608 | version "0.0.5" 609 | resolved "https://registry.npm.taobao.org/parseqs/download/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" 610 | integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= 611 | dependencies: 612 | better-assert "~1.0.0" 613 | 614 | parseuri@0.0.4: 615 | version "0.0.4" 616 | resolved "https://registry.npm.taobao.org/parseuri/download/parseuri-0.0.4.tgz#806582a39887e1ea18dd5e2fe0e01902268e9350" 617 | integrity sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A= 618 | dependencies: 619 | better-assert "~1.0.0" 620 | 621 | parseuri@0.0.5: 622 | version "0.0.5" 623 | resolved "https://registry.npm.taobao.org/parseuri/download/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" 624 | integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= 625 | dependencies: 626 | better-assert "~1.0.0" 627 | 628 | parseurl@^1.3.2: 629 | version "1.3.3" 630 | resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 631 | integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= 632 | 633 | path-is-absolute@1.0.1: 634 | version "1.0.1" 635 | resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 636 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 637 | 638 | path@^0.12.7: 639 | version "0.12.7" 640 | resolved "https://registry.npm.taobao.org/path/download/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" 641 | integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= 642 | dependencies: 643 | process "^0.11.1" 644 | util "^0.10.3" 645 | 646 | process@^0.11.1: 647 | version "0.11.10" 648 | resolved "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 649 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 650 | 651 | resolve-path@^1.4.0: 652 | version "1.4.0" 653 | resolved "https://registry.npm.taobao.org/resolve-path/download/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" 654 | integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= 655 | dependencies: 656 | http-errors "~1.6.2" 657 | path-is-absolute "1.0.1" 658 | 659 | safe-buffer@5.1.2: 660 | version "5.1.2" 661 | resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 662 | integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= 663 | 664 | setprototypeof@1.1.0: 665 | version "1.1.0" 666 | resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 667 | integrity sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= 668 | 669 | setprototypeof@1.1.1: 670 | version "1.1.1" 671 | resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 672 | integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= 673 | 674 | socket.io-adapter@0.4.0: 675 | version "0.4.0" 676 | resolved "https://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-0.4.0.tgz#fb9f82ab1aa65290bf72c3657955b930a991a24f" 677 | integrity sha1-+5+CqxqmUpC/csNleVW5MKmRok8= 678 | dependencies: 679 | debug "2.2.0" 680 | socket.io-parser "2.2.2" 681 | 682 | socket.io-adapter@~1.1.0: 683 | version "1.1.1" 684 | resolved "https://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" 685 | integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= 686 | 687 | socket.io-client@1.4.5: 688 | version "1.4.5" 689 | resolved "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-1.4.5.tgz#400d630c31e7c9579e45173f977e4f5bd8dc7d2e" 690 | integrity sha1-QA1jDDHnyVeeRRc/l35PW9jcfS4= 691 | dependencies: 692 | backo2 "1.0.2" 693 | component-bind "1.0.0" 694 | component-emitter "1.2.0" 695 | debug "2.2.0" 696 | engine.io-client "1.6.8" 697 | has-binary "0.1.7" 698 | indexof "0.0.1" 699 | object-component "0.0.3" 700 | parseuri "0.0.4" 701 | socket.io-parser "2.2.6" 702 | to-array "0.1.4" 703 | 704 | socket.io-client@2.2.0: 705 | version "2.2.0" 706 | resolved "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" 707 | integrity sha1-hOc+48Q9UCDMwaJY+u65rsJyOvc= 708 | dependencies: 709 | backo2 "1.0.2" 710 | base64-arraybuffer "0.1.5" 711 | component-bind "1.0.0" 712 | component-emitter "1.2.1" 713 | debug "~3.1.0" 714 | engine.io-client "~3.3.1" 715 | has-binary2 "~1.0.2" 716 | has-cors "1.1.0" 717 | indexof "0.0.1" 718 | object-component "0.0.3" 719 | parseqs "0.0.5" 720 | parseuri "0.0.5" 721 | socket.io-parser "~3.3.0" 722 | to-array "0.1.4" 723 | 724 | socket.io-parser@2.2.2: 725 | version "2.2.2" 726 | resolved "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-2.2.2.tgz#3d7af6b64497e956b7d9fe775f999716027f9417" 727 | integrity sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc= 728 | dependencies: 729 | benchmark "1.0.0" 730 | component-emitter "1.1.2" 731 | debug "0.7.4" 732 | isarray "0.0.1" 733 | json3 "3.2.6" 734 | 735 | socket.io-parser@2.2.6: 736 | version "2.2.6" 737 | resolved "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-2.2.6.tgz#38dfd61df50dcf8ab1d9e2091322bf902ba28b99" 738 | integrity sha1-ON/WHfUNz4qx2eIJEyK/kCuii5k= 739 | dependencies: 740 | benchmark "1.0.0" 741 | component-emitter "1.1.2" 742 | debug "2.2.0" 743 | isarray "0.0.1" 744 | json3 "3.3.2" 745 | 746 | socket.io-parser@~3.3.0: 747 | version "3.3.0" 748 | resolved "https://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" 749 | integrity sha1-K1KpalCf3zFEC6QP7WCUx9TxJi8= 750 | dependencies: 751 | component-emitter "1.2.1" 752 | debug "~3.1.0" 753 | isarray "2.0.1" 754 | 755 | socket.io@1.4.5: 756 | version "1.4.5" 757 | resolved "https://registry.npm.taobao.org/socket.io/download/socket.io-1.4.5.tgz#f202f49eeb9cf7cf6c0971ad75d8d96d451ea4f7" 758 | integrity sha1-8gL0nuuc989sCXGtddjZbUUepPc= 759 | dependencies: 760 | debug "2.2.0" 761 | engine.io "1.6.8" 762 | has-binary "0.1.7" 763 | socket.io-adapter "0.4.0" 764 | socket.io-client "1.4.5" 765 | socket.io-parser "2.2.6" 766 | 767 | socket.io@^2.2.0: 768 | version "2.2.0" 769 | resolved "https://registry.npm.taobao.org/socket.io/download/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" 770 | integrity sha1-8PYzFh72cSyXKzB1mOzQjJsbTVs= 771 | dependencies: 772 | debug "~4.1.0" 773 | engine.io "~3.3.1" 774 | has-binary2 "~1.0.2" 775 | socket.io-adapter "~1.1.0" 776 | socket.io-client "2.2.0" 777 | socket.io-parser "~3.3.0" 778 | 779 | "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: 780 | version "1.5.0" 781 | resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 782 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 783 | 784 | thenify-all@^1.0.0: 785 | version "1.6.0" 786 | resolved "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 787 | integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 788 | dependencies: 789 | thenify ">= 3.1.0 < 4" 790 | 791 | "thenify@>= 3.1.0 < 4": 792 | version "3.3.0" 793 | resolved "https://registry.npm.taobao.org/thenify/download/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" 794 | integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= 795 | dependencies: 796 | any-promise "^1.0.0" 797 | 798 | to-array@0.1.4: 799 | version "0.1.4" 800 | resolved "https://registry.npm.taobao.org/to-array/download/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" 801 | integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= 802 | 803 | toidentifier@1.0.0: 804 | version "1.0.0" 805 | resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 806 | integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= 807 | 808 | type-is@^1.6.16: 809 | version "1.6.16" 810 | resolved "https://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 811 | integrity sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ= 812 | dependencies: 813 | media-typer "0.3.0" 814 | mime-types "~2.1.18" 815 | 816 | ultron@1.0.x: 817 | version "1.0.2" 818 | resolved "https://registry.npm.taobao.org/ultron/download/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" 819 | integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= 820 | 821 | utf8@2.1.0: 822 | version "2.1.0" 823 | resolved "https://registry.npm.taobao.org/utf8/download/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" 824 | integrity sha1-DP7FyAUtRKI+OqqQgQToB1+V39U= 825 | 826 | util@^0.10.3: 827 | version "0.10.4" 828 | resolved "https://registry.npm.taobao.org/util/download/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 829 | integrity sha1-OqASW/5mikZy3liFfTrOJ+y3aQE= 830 | dependencies: 831 | inherits "2.0.3" 832 | 833 | vary@^1.1.2: 834 | version "1.1.2" 835 | resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 836 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 837 | 838 | ws@1.0.1: 839 | version "1.0.1" 840 | resolved "https://registry.npm.taobao.org/ws/download/ws-1.0.1.tgz#7d0b2a2e58cddd819039c29c9de65045e1b310e9" 841 | integrity sha1-fQsqLljN3YGQOcKcneZQReGzEOk= 842 | dependencies: 843 | options ">=0.0.5" 844 | ultron "1.0.x" 845 | 846 | ws@~6.1.0: 847 | version "6.1.4" 848 | resolved "https://registry.npm.taobao.org/ws/download/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" 849 | integrity sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk= 850 | dependencies: 851 | async-limiter "~1.0.0" 852 | 853 | xmlhttprequest-ssl@1.5.1: 854 | version "1.5.1" 855 | resolved "https://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.1.tgz#3b7741fea4a86675976e908d296d4445961faa67" 856 | integrity sha1-O3dB/qSoZnWXbpCNKW1ERZYfqmc= 857 | 858 | xmlhttprequest-ssl@~1.5.4: 859 | version "1.5.5" 860 | resolved "https://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" 861 | integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= 862 | 863 | yeast@0.1.2: 864 | version "0.1.2" 865 | resolved "https://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 866 | integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= 867 | 868 | ylru@^1.2.0: 869 | version "1.2.1" 870 | resolved "https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" 871 | integrity sha1-9Xa2M0FUeYnB3nuiiHYJI7J/6E8= 872 | --------------------------------------------------------------------------------