res.sendFile(__dirname + "/index.html"))app.listen(9091, ()=>console.log("Listening on http port 9091"))const webs..._yoqo.github.gane">
当前位置:   article > 正文

简单的抢地盘js小游戏实战篇(多人在线对战)_yoqo.github.gane

yoqo.github.gane

 

今天来实现一个简单的多人联机在线对战的小游戏

index.js

  1. const http = require("http");
  2. const app = require("express")();
  3. app.get("/", (req,res)=> res.sendFile(__dirname + "/index.html"))
  4. app.listen(9091, ()=>console.log("Listening on http port 9091"))
  5. const websocketServer = require("websocket").server
  6. const httpServer = http.createServer();
  7. httpServer.listen(9090, () => console.log("Listening.. on 9090"))
  8. //hashmap clients
  9. const clients = {};
  10. const games = {};
  11. const wsServer = new websocketServer({
  12. "httpServer": httpServer
  13. })
  14. wsServer.on("request", request => {
  15. //connect
  16. const connection = request.accept(null, request.origin);
  17. connection.on("open", () => console.log("opened!"))
  18. connection.on("close", () => console.log("closed!"))
  19. connection.on("message", message => {
  20. const result = JSON.parse(message.utf8Data)
  21. //I have received a message from the client
  22. //a user want to create a new game
  23. if (result.method === "create") {
  24. const clientId = result.clientId;
  25. const gameId = guid();
  26. games[gameId] = {
  27. "id": gameId,
  28. "balls": 20,
  29. "clients": []
  30. }
  31. const payLoad = {
  32. "method": "create",
  33. "game" : games[gameId]
  34. }
  35. const con = clients[clientId].connection;
  36. con.send(JSON.stringify(payLoad));
  37. }
  38. //a client want to join
  39. if (result.method === "join") {
  40. const clientId = result.clientId;
  41. const gameId = result.gameId;
  42. const game = games[gameId];
  43. if (game.clients.length >= 3)
  44. {
  45. //sorry max players reach
  46. return;
  47. }
  48. const color = {"0": "Red", "1": "Green", "2": "Blue"}[game.clients.length]
  49. game.clients.push({
  50. "clientId": clientId,
  51. "color": color
  52. })
  53. //start the game
  54. if (game.clients.length === 3) updateGameState();
  55. const payLoad = {
  56. "method": "join",
  57. "game": game
  58. }
  59. //loop through all clients and tell them that people has joined
  60. game.clients.forEach(c => {
  61. clients[c.clientId].connection.send(JSON.stringify(payLoad))
  62. })
  63. }
  64. //a user plays
  65. if (result.method === "play") {
  66. const gameId = result.gameId;
  67. const ballId = result.ballId;
  68. const color = result.color;
  69. let state = games[gameId].state;
  70. if (!state)
  71. state = {}
  72. state[ballId] = color;
  73. games[gameId].state = state;
  74. }
  75. })
  76. //generate a new clientId
  77. const clientId = guid();
  78. clients[clientId] = {
  79. "connection": connection
  80. }
  81. const payLoad = {
  82. "method": "connect",
  83. "clientId": clientId
  84. }
  85. //send back the client connect
  86. connection.send(JSON.stringify(payLoad))
  87. })
  88. function updateGameState(){
  89. //{"gameid", fasdfsf}
  90. for (const g of Object.keys(games)) {
  91. const game = games[g]
  92. const payLoad = {
  93. "method": "update",
  94. "game": game
  95. }
  96. game.clients.forEach(c=> {
  97. clients[c.clientId].connection.send(JSON.stringify(payLoad))
  98. })
  99. }
  100. setTimeout(updateGameState, 500);
  101. }
  102. function S4() {
  103. return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
  104. }
  105. // then to call it, plus stitch in '4' in the third group
  106. const guid = () => (S4() + S4() + "-" + S4() + "-4" + S4().substr(0,3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <h1>Ball Game</h1>
  10. <button id = 'btnCreate'>New Game</button>
  11. <button id = 'btnJoin'>Join Game</button>
  12. <input type = 'text' id = 'txtGameId'>
  13. <div id = 'divPlayers'></div>
  14. <div id = 'divBoard'></div>
  15. <script>
  16. //HTML elements
  17. let clientId = null;
  18. let gameId = null;
  19. let playerColor = null;
  20. let ws = new WebSocket("ws://localhost:9090")
  21. const btnCreate = document.getElementById("btnCreate");
  22. const btnJoin = document.getElementById("btnJoin");
  23. const txtGameId = document.getElementById("txtGameId");
  24. const divPlayers = document.getElementById("divPlayers");
  25. const divBoard = document.getElementById("divBoard");
  26. //wiring events
  27. btnJoin.addEventListener("click", e => {
  28. if (gameId === null)
  29. gameId = txtGameId.value;
  30. const payLoad = {
  31. "method": "join",
  32. "clientId": clientId,
  33. "gameId": gameId
  34. }
  35. ws.send(JSON.stringify(payLoad));
  36. })
  37. btnCreate.addEventListener("click", e => {
  38. const payLoad = {
  39. "method": "create",
  40. "clientId": clientId
  41. }
  42. ws.send(JSON.stringify(payLoad));
  43. })
  44. ws.onmessage = message => {
  45. //message.data
  46. const response = JSON.parse(message.data);
  47. //connect
  48. if (response.method === "connect"){
  49. clientId = response.clientId;
  50. console.log("Client id Set successfully " + clientId)
  51. }
  52. //create
  53. if (response.method === "create"){
  54. gameId = response.game.id;
  55. console.log("game successfully created with id " + response.game.id + " with " + response.game.balls + " balls")
  56. }
  57. //update
  58. if (response.method === "update"){
  59. //{1: "red", 1}
  60. if (!response.game.state) return;
  61. for(const b of Object.keys(response.game.state))
  62. {
  63. const color = response.game.state[b];
  64. const ballObject = document.getElementById("ball" + b);
  65. ballObject.style.backgroundColor = color
  66. }
  67. }
  68. //join
  69. if (response.method === "join"){
  70. const game = response.game;
  71. while(divPlayers.firstChild)
  72. divPlayers.removeChild (divPlayers.firstChild)
  73. game.clients.forEach (c => {
  74. const d = document.createElement("div");
  75. d.style.width = "200px";
  76. d.style.background = c.color
  77. d.textContent = c.clientId;
  78. divPlayers.appendChild(d);
  79. if (c.clientId === clientId) playerColor = c.color;
  80. })
  81. while(divBoard.firstChild)
  82. divBoard.removeChild (divBoard.firstChild)
  83. for (let i = 0; i < game.balls; i++){
  84. const b = document.createElement("button");
  85. b.id = "ball" + (i +1);
  86. b.tag = i+1
  87. b.textContent = i+1
  88. b.style.width = "150px"
  89. b.style.height = "150px"
  90. b.addEventListener("click", e => {
  91. b.style.background = playerColor
  92. const payLoad = {
  93. "method": "play",
  94. "clientId": clientId,
  95. "gameId": gameId,
  96. "ballId": b.tag,
  97. "color": playerColor
  98. }
  99. ws.send(JSON.stringify(payLoad))
  100. })
  101. divBoard.appendChild(b);
  102. }
  103. }
  104. }
  105. </script>
  106. </body>
  107. </html>

package.json

  1. {
  2. "name": "websocket-cell-game",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "index.js",
  6. "scripts": {
  7. "test": "echo \"Error: no test specified\" && exit 1"
  8. },
  9. "keywords": [],
  10. "author": "",
  11. "license": "ISC",
  12. "dependencies": {
  13. "express": "^4.17.3",
  14. "websocket": "^1.0.31"
  15. }
  16. }

 

 package-lock.json

  1. {
  2. "name": "websocket-cell-game",
  3. "version": "1.0.0",
  4. "lockfileVersion": 2,
  5. "requires": true,
  6. "packages": {
  7. "": {
  8. "name": "websocket-cell-game",
  9. "version": "1.0.0",
  10. "license": "ISC",
  11. "dependencies": {
  12. "express": "^4.17.3",
  13. "websocket": "^1.0.31"
  14. }
  15. },
  16. "node_modules/accepts": {
  17. "version": "1.3.8",
  18. "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
  19. "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
  20. "dependencies": {
  21. "mime-types": "~2.1.34",
  22. "negotiator": "0.6.3"
  23. },
  24. "engines": {
  25. "node": ">= 0.6"
  26. }
  27. },
  28. "node_modules/array-flatten": {
  29. "version": "1.1.1",
  30. "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
  31. "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
  32. },
  33. "node_modules/body-parser": {
  34. "version": "1.19.2",
  35. "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
  36. "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
  37. "dependencies": {
  38. "bytes": "3.1.2",
  39. "content-type": "~1.0.4",
  40. "debug": "2.6.9",
  41. "depd": "~1.1.2",
  42. "http-errors": "1.8.1",
  43. "iconv-lite": "0.4.24",
  44. "on-finished": "~2.3.0",
  45. "qs": "6.9.7",
  46. "raw-body": "2.4.3",
  47. "type-is": "~1.6.18"
  48. },
  49. "engines": {
  50. "node": ">= 0.8"
  51. }
  52. },
  53. "node_modules/bytes": {
  54. "version": "3.1.2",
  55. "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
  56. "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
  57. "engines": {
  58. "node": ">= 0.8"
  59. }
  60. },
  61. "node_modules/content-disposition": {
  62. "version": "0.5.4",
  63. "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
  64. "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
  65. "dependencies": {
  66. "safe-buffer": "5.2.1"
  67. },
  68. "engines": {
  69. "node": ">= 0.6"
  70. }
  71. },
  72. "node_modules/content-type": {
  73. "version": "1.0.4",
  74. "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
  75. "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
  76. "engines": {
  77. "node": ">= 0.6"
  78. }
  79. },
  80. "node_modules/cookie": {
  81. "version": "0.4.2",
  82. "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
  83. "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
  84. "engines": {
  85. "node": ">= 0.6"
  86. }
  87. },
  88. "node_modules/cookie-signature": {
  89. "version": "1.0.6",
  90. "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
  91. "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
  92. },
  93. "node_modules/d": {
  94. "version": "1.0.1",
  95. "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
  96. "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
  97. "dependencies": {
  98. "es5-ext": "^0.10.50",
  99. "type": "^1.0.1"
  100. }
  101. },
  102. "node_modules/debug": {
  103. "version": "2.6.9",
  104. "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  105. "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  106. "dependencies": {
  107. "ms": "2.0.0"
  108. }
  109. },
  110. "node_modules/depd": {
  111. "version": "1.1.2",
  112. "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
  113. "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
  114. "engines": {
  115. "node": ">= 0.6"
  116. }
  117. },
  118. "node_modules/destroy": {
  119. "version": "1.0.4",
  120. "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
  121. "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
  122. },
  123. "node_modules/ee-first": {
  124. "version": "1.1.1",
  125. "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
  126. "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
  127. },
  128. "node_modules/encodeurl": {
  129. "version": "1.0.2",
  130. "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
  131. "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
  132. "engines": {
  133. "node": ">= 0.8"
  134. }
  135. },
  136. "node_modules/es5-ext": {
  137. "version": "0.10.53",
  138. "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
  139. "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
  140. "dependencies": {
  141. "es6-iterator": "~2.0.3",
  142. "es6-symbol": "~3.1.3",
  143. "next-tick": "~1.0.0"
  144. }
  145. },
  146. "node_modules/es6-iterator": {
  147. "version": "2.0.3",
  148. "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
  149. "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
  150. "dependencies": {
  151. "d": "1",
  152. "es5-ext": "^0.10.35",
  153. "es6-symbol": "^3.1.1"
  154. }
  155. },
  156. "node_modules/es6-symbol": {
  157. "version": "3.1.3",
  158. "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
  159. "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
  160. "dependencies": {
  161. "d": "^1.0.1",
  162. "ext": "^1.1.2"
  163. }
  164. },
  165. "node_modules/escape-html": {
  166. "version": "1.0.3",
  167. "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
  168. "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
  169. },
  170. "node_modules/etag": {
  171. "version": "1.8.1",
  172. "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
  173. "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
  174. "engines": {
  175. "node": ">= 0.6"
  176. }
  177. },
  178. "node_modules/express": {
  179. "version": "4.17.3",
  180. "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
  181. "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
  182. "dependencies": {
  183. "accepts": "~1.3.8",
  184. "array-flatten": "1.1.1",
  185. "body-parser": "1.19.2",
  186. "content-disposition": "0.5.4",
  187. "content-type": "~1.0.4",
  188. "cookie": "0.4.2",
  189. "cookie-signature": "1.0.6",
  190. "debug": "2.6.9",
  191. "depd": "~1.1.2",
  192. "encodeurl": "~1.0.2",
  193. "escape-html": "~1.0.3",
  194. "etag": "~1.8.1",
  195. "finalhandler": "~1.1.2",
  196. "fresh": "0.5.2",
  197. "merge-descriptors": "1.0.1",
  198. "methods": "~1.1.2",
  199. "on-finished": "~2.3.0",
  200. "parseurl": "~1.3.3",
  201. "path-to-regexp": "0.1.7",
  202. "proxy-addr": "~2.0.7",
  203. "qs": "6.9.7",
  204. "range-parser": "~1.2.1",
  205. "safe-buffer": "5.2.1",
  206. "send": "0.17.2",
  207. "serve-static": "1.14.2",
  208. "setprototypeof": "1.2.0",
  209. "statuses": "~1.5.0",
  210. "type-is": "~1.6.18",
  211. "utils-merge": "1.0.1",
  212. "vary": "~1.1.2"
  213. },
  214. "engines": {
  215. "node": ">= 0.10.0"
  216. }
  217. },
  218. "node_modules/ext": {
  219. "version": "1.4.0",
  220. "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
  221. "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
  222. "dependencies": {
  223. "type": "^2.0.0"
  224. }
  225. },
  226. "node_modules/ext/node_modules/type": {
  227. "version": "2.0.0",
  228. "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
  229. "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
  230. },
  231. "node_modules/finalhandler": {
  232. "version": "1.1.2",
  233. "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
  234. "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
  235. "dependencies": {
  236. "debug": "2.6.9",
  237. "encodeurl": "~1.0.2",
  238. "escape-html": "~1.0.3",
  239. "on-finished": "~2.3.0",
  240. "parseurl": "~1.3.3",
  241. "statuses": "~1.5.0",
  242. "unpipe": "~1.0.0"
  243. },
  244. "engines": {
  245. "node": ">= 0.8"
  246. }
  247. },
  248. "node_modules/forwarded": {
  249. "version": "0.2.0",
  250. "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
  251. "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
  252. "engines": {
  253. "node": ">= 0.6"
  254. }
  255. },
  256. "node_modules/fresh": {
  257. "version": "0.5.2",
  258. "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
  259. "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
  260. "engines": {
  261. "node": ">= 0.6"
  262. }
  263. },
  264. "node_modules/http-errors": {
  265. "version": "1.8.1",
  266. "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
  267. "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
  268. "dependencies": {
  269. "depd": "~1.1.2",
  270. "inherits": "2.0.4",
  271. "setprototypeof": "1.2.0",
  272. "statuses": ">= 1.5.0 < 2",
  273. "toidentifier": "1.0.1"
  274. },
  275. "engines": {
  276. "node": ">= 0.6"
  277. }
  278. },
  279. "node_modules/iconv-lite": {
  280. "version": "0.4.24",
  281. "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
  282. "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
  283. "dependencies": {
  284. "safer-buffer": ">= 2.1.2 < 3"
  285. },
  286. "engines": {
  287. "node": ">=0.10.0"
  288. }
  289. },
  290. "node_modules/inherits": {
  291. "version": "2.0.4",
  292. "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
  293. "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
  294. },
  295. "node_modules/ipaddr.js": {
  296. "version": "1.9.1",
  297. "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
  298. "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
  299. "engines": {
  300. "node": ">= 0.10"
  301. }
  302. },
  303. "node_modules/is-typedarray": {
  304. "version": "1.0.0",
  305. "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
  306. "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
  307. },
  308. "node_modules/media-typer": {
  309. "version": "0.3.0",
  310. "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
  311. "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
  312. "engines": {
  313. "node": ">= 0.6"
  314. }
  315. },
  316. "node_modules/merge-descriptors": {
  317. "version": "1.0.1",
  318. "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
  319. "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
  320. },
  321. "node_modules/methods": {
  322. "version": "1.1.2",
  323. "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
  324. "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
  325. "engines": {
  326. "node": ">= 0.6"
  327. }
  328. },
  329. "node_modules/mime": {
  330. "version": "1.6.0",
  331. "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
  332. "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
  333. "bin": {
  334. "mime": "cli.js"
  335. },
  336. "engines": {
  337. "node": ">=4"
  338. }
  339. },
  340. "node_modules/mime-db": {
  341. "version": "1.51.0",
  342. "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
  343. "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
  344. "engines": {
  345. "node": ">= 0.6"
  346. }
  347. },
  348. "node_modules/mime-types": {
  349. "version": "2.1.34",
  350. "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
  351. "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
  352. "dependencies": {
  353. "mime-db": "1.51.0"
  354. },
  355. "engines": {
  356. "node": ">= 0.6"
  357. }
  358. },
  359. "node_modules/ms": {
  360. "version": "2.0.0",
  361. "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
  362. "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
  363. },
  364. "node_modules/nan": {
  365. "version": "2.14.0",
  366. "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
  367. "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
  368. },
  369. "node_modules/negotiator": {
  370. "version": "0.6.3",
  371. "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
  372. "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
  373. "engines": {
  374. "node": ">= 0.6"
  375. }
  376. },
  377. "node_modules/next-tick": {
  378. "version": "1.0.0",
  379. "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
  380. "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
  381. },
  382. "node_modules/on-finished": {
  383. "version": "2.3.0",
  384. "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
  385. "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
  386. "dependencies": {
  387. "ee-first": "1.1.1"
  388. },
  389. "engines": {
  390. "node": ">= 0.8"
  391. }
  392. },
  393. "node_modules/parseurl": {
  394. "version": "1.3.3",
  395. "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
  396. "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
  397. "engines": {
  398. "node": ">= 0.8"
  399. }
  400. },
  401. "node_modules/path-to-regexp": {
  402. "version": "0.1.7",
  403. "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
  404. "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
  405. },
  406. "node_modules/proxy-addr": {
  407. "version": "2.0.7",
  408. "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
  409. "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
  410. "dependencies": {
  411. "forwarded": "0.2.0",
  412. "ipaddr.js": "1.9.1"
  413. },
  414. "engines": {
  415. "node": ">= 0.10"
  416. }
  417. },
  418. "node_modules/qs": {
  419. "version": "6.9.7",
  420. "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
  421. "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
  422. "engines": {
  423. "node": ">=0.6"
  424. },
  425. "funding": {
  426. "url": "https://github.com/sponsors/ljharb"
  427. }
  428. },
  429. "node_modules/range-parser": {
  430. "version": "1.2.1",
  431. "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
  432. "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
  433. "engines": {
  434. "node": ">= 0.6"
  435. }
  436. },
  437. "node_modules/raw-body": {
  438. "version": "2.4.3",
  439. "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
  440. "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
  441. "dependencies": {
  442. "bytes": "3.1.2",
  443. "http-errors": "1.8.1",
  444. "iconv-lite": "0.4.24",
  445. "unpipe": "1.0.0"
  446. },
  447. "engines": {
  448. "node": ">= 0.8"
  449. }
  450. },
  451. "node_modules/safe-buffer": {
  452. "version": "5.2.1",
  453. "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
  454. "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
  455. "funding": [
  456. {
  457. "type": "github",
  458. "url": "https://github.com/sponsors/feross"
  459. },
  460. {
  461. "type": "patreon",
  462. "url": "https://www.patreon.com/feross"
  463. },
  464. {
  465. "type": "consulting",
  466. "url": "https://feross.org/support"
  467. }
  468. ]
  469. },
  470. "node_modules/safer-buffer": {
  471. "version": "2.1.2",
  472. "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
  473. "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
  474. },
  475. "node_modules/send": {
  476. "version": "0.17.2",
  477. "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
  478. "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
  479. "dependencies": {
  480. "debug": "2.6.9",
  481. "depd": "~1.1.2",
  482. "destroy": "~1.0.4",
  483. "encodeurl": "~1.0.2",
  484. "escape-html": "~1.0.3",
  485. "etag": "~1.8.1",
  486. "fresh": "0.5.2",
  487. "http-errors": "1.8.1",
  488. "mime": "1.6.0",
  489. "ms": "2.1.3",
  490. "on-finished": "~2.3.0",
  491. "range-parser": "~1.2.1",
  492. "statuses": "~1.5.0"
  493. },
  494. "engines": {
  495. "node": ">= 0.8.0"
  496. }
  497. },
  498. "node_modules/send/node_modules/ms": {
  499. "version": "2.1.3",
  500. "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
  501. "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
  502. },
  503. "node_modules/serve-static": {
  504. "version": "1.14.2",
  505. "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
  506. "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
  507. "dependencies": {
  508. "encodeurl": "~1.0.2",
  509. "escape-html": "~1.0.3",
  510. "parseurl": "~1.3.3",
  511. "send": "0.17.2"
  512. },
  513. "engines": {
  514. "node": ">= 0.8.0"
  515. }
  516. },
  517. "node_modules/setprototypeof": {
  518. "version": "1.2.0",
  519. "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
  520. "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
  521. },
  522. "node_modules/statuses": {
  523. "version": "1.5.0",
  524. "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
  525. "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
  526. "engines": {
  527. "node": ">= 0.6"
  528. }
  529. },
  530. "node_modules/toidentifier": {
  531. "version": "1.0.1",
  532. "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
  533. "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
  534. "engines": {
  535. "node": ">=0.6"
  536. }
  537. },
  538. "node_modules/type": {
  539. "version": "1.2.0",
  540. "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
  541. "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
  542. },
  543. "node_modules/type-is": {
  544. "version": "1.6.18",
  545. "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
  546. "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
  547. "dependencies": {
  548. "media-typer": "0.3.0",
  549. "mime-types": "~2.1.24"
  550. },
  551. "engines": {
  552. "node": ">= 0.6"
  553. }
  554. },
  555. "node_modules/typedarray-to-buffer": {
  556. "version": "3.1.5",
  557. "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
  558. "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
  559. "dependencies": {
  560. "is-typedarray": "^1.0.0"
  561. }
  562. },
  563. "node_modules/unpipe": {
  564. "version": "1.0.0",
  565. "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
  566. "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
  567. "engines": {
  568. "node": ">= 0.8"
  569. }
  570. },
  571. "node_modules/utils-merge": {
  572. "version": "1.0.1",
  573. "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
  574. "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
  575. "engines": {
  576. "node": ">= 0.4.0"
  577. }
  578. },
  579. "node_modules/vary": {
  580. "version": "1.1.2",
  581. "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
  582. "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
  583. "engines": {
  584. "node": ">= 0.8"
  585. }
  586. },
  587. "node_modules/websocket": {
  588. "version": "1.0.31",
  589. "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.31.tgz",
  590. "integrity": "sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ==",
  591. "hasInstallScript": true,
  592. "dependencies": {
  593. "debug": "^2.2.0",
  594. "es5-ext": "^0.10.50",
  595. "nan": "^2.14.0",
  596. "typedarray-to-buffer": "^3.1.5",
  597. "yaeti": "^0.0.6"
  598. },
  599. "engines": {
  600. "node": ">=0.10.0"
  601. }
  602. },
  603. "node_modules/yaeti": {
  604. "version": "0.0.6",
  605. "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
  606. "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=",
  607. "engines": {
  608. "node": ">=0.10.32"
  609. }
  610. }
  611. },
  612. "dependencies": {
  613. "accepts": {
  614. "version": "1.3.8",
  615. "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
  616. "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
  617. "requires": {
  618. "mime-types": "~2.1.34",
  619. "negotiator": "0.6.3"
  620. }
  621. },
  622. "array-flatten": {
  623. "version": "1.1.1",
  624. "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
  625. "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
  626. },
  627. "body-parser": {
  628. "version": "1.19.2",
  629. "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
  630. "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
  631. "requires": {
  632. "bytes": "3.1.2",
  633. "content-type": "~1.0.4",
  634. "debug": "2.6.9",
  635. "depd": "~1.1.2",
  636. "http-errors": "1.8.1",
  637. "iconv-lite": "0.4.24",
  638. "on-finished": "~2.3.0",
  639. "qs": "6.9.7",
  640. "raw-body": "2.4.3",
  641. "type-is": "~1.6.18"
  642. }
  643. },
  644. "bytes": {
  645. "version": "3.1.2",
  646. "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
  647. "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
  648. },
  649. "content-disposition": {
  650. "version": "0.5.4",
  651. "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
  652. "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
  653. "requires": {
  654. "safe-buffer": "5.2.1"
  655. }
  656. },
  657. "content-type": {
  658. "version": "1.0.4",
  659. "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
  660. "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
  661. },
  662. "cookie": {
  663. "version": "0.4.2",
  664. "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
  665. "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
  666. },
  667. "cookie-signature": {
  668. "version": "1.0.6",
  669. "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
  670. "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
  671. },
  672. "d": {
  673. "version": "1.0.1",
  674. "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
  675. "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
  676. "requires": {
  677. "es5-ext": "^0.10.50",
  678. "type": "^1.0.1"
  679. }
  680. },
  681. "debug": {
  682. "version": "2.6.9",
  683. "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  684. "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  685. "requires": {
  686. "ms": "2.0.0"
  687. }
  688. },
  689. "depd": {
  690. "version": "1.1.2",
  691. "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
  692. "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
  693. },
  694. "destroy": {
  695. "version": "1.0.4",
  696. "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
  697. "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
  698. },
  699. "ee-first": {
  700. "version": "1.1.1",
  701. "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
  702. "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
  703. },
  704. "encodeurl": {
  705. "version": "1.0.2",
  706. "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
  707. "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
  708. },
  709. "es5-ext": {
  710. "version": "0.10.53",
  711. "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
  712. "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
  713. "requires": {
  714. "es6-iterator": "~2.0.3",
  715. "es6-symbol": "~3.1.3",
  716. "next-tick": "~1.0.0"
  717. }
  718. },
  719. "es6-iterator": {
  720. "version": "2.0.3",
  721. "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
  722. "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
  723. "requires": {
  724. "d": "1",
  725. "es5-ext": "^0.10.35",
  726. "es6-symbol": "^3.1.1"
  727. }
  728. },
  729. "es6-symbol": {
  730. "version": "3.1.3",
  731. "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
  732. "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
  733. "requires": {
  734. "d": "^1.0.1",
  735. "ext": "^1.1.2"
  736. }
  737. },
  738. "escape-html": {
  739. "version": "1.0.3",
  740. "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
  741. "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
  742. },
  743. "etag": {
  744. "version": "1.8.1",
  745. "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
  746. "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
  747. },
  748. "express": {
  749. "version": "4.17.3",
  750. "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
  751. "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
  752. "requires": {
  753. "accepts": "~1.3.8",
  754. "array-flatten": "1.1.1",
  755. "body-parser": "1.19.2",
  756. "content-disposition": "0.5.4",
  757. "content-type": "~1.0.4",
  758. "cookie": "0.4.2",
  759. "cookie-signature": "1.0.6",
  760. "debug": "2.6.9",
  761. "depd": "~1.1.2",
  762. "encodeurl": "~1.0.2",
  763. "escape-html": "~1.0.3",
  764. "etag": "~1.8.1",
  765. "finalhandler": "~1.1.2",
  766. "fresh": "0.5.2",
  767. "merge-descriptors": "1.0.1",
  768. "methods": "~1.1.2",
  769. "on-finished": "~2.3.0",
  770. "parseurl": "~1.3.3",
  771. "path-to-regexp": "0.1.7",
  772. "proxy-addr": "~2.0.7",
  773. "qs": "6.9.7",
  774. "range-parser": "~1.2.1",
  775. "safe-buffer": "5.2.1",
  776. "send": "0.17.2",
  777. "serve-static": "1.14.2",
  778. "setprototypeof": "1.2.0",
  779. "statuses": "~1.5.0",
  780. "type-is": "~1.6.18",
  781. "utils-merge": "1.0.1",
  782. "vary": "~1.1.2"
  783. }
  784. },
  785. "ext": {
  786. "version": "1.4.0",
  787. "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
  788. "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
  789. "requires": {
  790. "type": "^2.0.0"
  791. },
  792. "dependencies": {
  793. "type": {
  794. "version": "2.0.0",
  795. "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
  796. "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
  797. }
  798. }
  799. },
  800. "finalhandler": {
  801. "version": "1.1.2",
  802. "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
  803. "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
  804. "requires": {
  805. "debug": "2.6.9",
  806. "encodeurl": "~1.0.2",
  807. "escape-html": "~1.0.3",
  808. "on-finished": "~2.3.0",
  809. "parseurl": "~1.3.3",
  810. "statuses": "~1.5.0",
  811. "unpipe": "~1.0.0"
  812. }
  813. },
  814. "forwarded": {
  815. "version": "0.2.0",
  816. "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
  817. "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
  818. },
  819. "fresh": {
  820. "version": "0.5.2",
  821. "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
  822. "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
  823. },
  824. "http-errors": {
  825. "version": "1.8.1",
  826. "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
  827. "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
  828. "requires": {
  829. "depd": "~1.1.2",
  830. "inherits": "2.0.4",
  831. "setprototypeof": "1.2.0",
  832. "statuses": ">= 1.5.0 < 2",
  833. "toidentifier": "1.0.1"
  834. }
  835. },
  836. "iconv-lite": {
  837. "version": "0.4.24",
  838. "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
  839. "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
  840. "requires": {
  841. "safer-buffer": ">= 2.1.2 < 3"
  842. }
  843. },
  844. "inherits": {
  845. "version": "2.0.4",
  846. "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
  847. "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
  848. },
  849. "ipaddr.js": {
  850. "version": "1.9.1",
  851. "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
  852. "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
  853. },
  854. "is-typedarray": {
  855. "version": "1.0.0",
  856. "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
  857. "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
  858. },
  859. "media-typer": {
  860. "version": "0.3.0",
  861. "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
  862. "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
  863. },
  864. "merge-descriptors": {
  865. "version": "1.0.1",
  866. "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
  867. "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
  868. },
  869. "methods": {
  870. "version": "1.1.2",
  871. "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
  872. "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
  873. },
  874. "mime": {
  875. "version": "1.6.0",
  876. "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
  877. "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
  878. },
  879. "mime-db": {
  880. "version": "1.51.0",
  881. "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
  882. "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
  883. },
  884. "mime-types": {
  885. "version": "2.1.34",
  886. "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
  887. "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
  888. "requires": {
  889. "mime-db": "1.51.0"
  890. }
  891. },
  892. "ms": {
  893. "version": "2.0.0",
  894. "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
  895. "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
  896. },
  897. "nan": {
  898. "version": "2.14.0",
  899. "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
  900. "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
  901. },
  902. "negotiator": {
  903. "version": "0.6.3",
  904. "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
  905. "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
  906. },
  907. "next-tick": {
  908. "version": "1.0.0",
  909. "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
  910. "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
  911. },
  912. "on-finished": {
  913. "version": "2.3.0",
  914. "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
  915. "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
  916. "requires": {
  917. "ee-first": "1.1.1"
  918. }
  919. },
  920. "parseurl": {
  921. "version": "1.3.3",
  922. "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
  923. "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
  924. },
  925. "path-to-regexp": {
  926. "version": "0.1.7",
  927. "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
  928. "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
  929. },
  930. "proxy-addr": {
  931. "version": "2.0.7",
  932. "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
  933. "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
  934. "requires": {
  935. "forwarded": "0.2.0",
  936. "ipaddr.js": "1.9.1"
  937. }
  938. },
  939. "qs": {
  940. "version": "6.9.7",
  941. "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
  942. "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw=="
  943. },
  944. "range-parser": {
  945. "version": "1.2.1",
  946. "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
  947. "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
  948. },
  949. "raw-body": {
  950. "version": "2.4.3",
  951. "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
  952. "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
  953. "requires": {
  954. "bytes": "3.1.2",
  955. "http-errors": "1.8.1",
  956. "iconv-lite": "0.4.24",
  957. "unpipe": "1.0.0"
  958. }
  959. },
  960. "safe-buffer": {
  961. "version": "5.2.1",
  962. "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
  963. "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
  964. },
  965. "safer-buffer": {
  966. "version": "2.1.2",
  967. "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
  968. "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
  969. },
  970. "send": {
  971. "version": "0.17.2",
  972. "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
  973. "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
  974. "requires": {
  975. "debug": "2.6.9",
  976. "depd": "~1.1.2",
  977. "destroy": "~1.0.4",
  978. "encodeurl": "~1.0.2",
  979. "escape-html": "~1.0.3",
  980. "etag": "~1.8.1",
  981. "fresh": "0.5.2",
  982. "http-errors": "1.8.1",
  983. "mime": "1.6.0",
  984. "ms": "2.1.3",
  985. "on-finished": "~2.3.0",
  986. "range-parser": "~1.2.1",
  987. "statuses": "~1.5.0"
  988. },
  989. "dependencies": {
  990. "ms": {
  991. "version": "2.1.3",
  992. "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
  993. "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
  994. }
  995. }
  996. },
  997. "serve-static": {
  998. "version": "1.14.2",
  999. "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
  1000. "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
  1001. "requires": {
  1002. "encodeurl": "~1.0.2",
  1003. "escape-html": "~1.0.3",
  1004. "parseurl": "~1.3.3",
  1005. "send": "0.17.2"
  1006. }
  1007. },
  1008. "setprototypeof": {
  1009. "version": "1.2.0",
  1010. "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
  1011. "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
  1012. },
  1013. "statuses": {
  1014. "version": "1.5.0",
  1015. "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
  1016. "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
  1017. },
  1018. "toidentifier": {
  1019. "version": "1.0.1",
  1020. "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
  1021. "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
  1022. },
  1023. "type": {
  1024. "version": "1.2.0",
  1025. "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
  1026. "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
  1027. },
  1028. "type-is": {
  1029. "version": "1.6.18",
  1030. "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
  1031. "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
  1032. "requires": {
  1033. "media-typer": "0.3.0",
  1034. "mime-types": "~2.1.24"
  1035. }
  1036. },
  1037. "typedarray-to-buffer": {
  1038. "version": "3.1.5",
  1039. "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
  1040. "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
  1041. "requires": {
  1042. "is-typedarray": "^1.0.0"
  1043. }
  1044. },
  1045. "unpipe": {
  1046. "version": "1.0.0",
  1047. "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
  1048. "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
  1049. },
  1050. "utils-merge": {
  1051. "version": "1.0.1",
  1052. "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
  1053. "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
  1054. },
  1055. "vary": {
  1056. "version": "1.1.2",
  1057. "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
  1058. "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
  1059. },
  1060. "websocket": {
  1061. "version": "1.0.31",
  1062. "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.31.tgz",
  1063. "integrity": "sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ==",
  1064. "requires": {
  1065. "debug": "^2.2.0",
  1066. "es5-ext": "^0.10.50",
  1067. "nan": "^2.14.0",
  1068. "typedarray-to-buffer": "^3.1.5",
  1069. "yaeti": "^0.0.6"
  1070. }
  1071. },
  1072. "yaeti": {
  1073. "version": "0.0.6",
  1074. "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
  1075. "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
  1076. }
  1077. }
  1078. }

最后一步,在项目目录右击在命令行输入 node index.js  

要是报错可以看下有什么express之类的需要下载

 浏览器打开输入

http://localhost:9091/

f12进入无敌模式 点击console,选中框内的,也就是相当于房间号

 

打开另一个浏览器, 输入方便号直接开始游玩 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/378319
推荐阅读
相关标签
  

闽ICP备14008679号