From 05ce030b792d3c4638370a23f6b1676b380ab3ac Mon Sep 17 00:00:00 2001 From: Roky97 Date: Wed, 23 Dec 2020 17:41:05 +0100 Subject: [PATCH 1/5] Initial commit --- .gitignore | 18 +++ README.md | 12 +- app.js | 251 ++++++++++++++++++++++++++++++++++ config/app-config-schema.json | 57 ++++++++ config/app-config.json | 10 ++ config/services-schema.json | 203 +++++++++++++++++++++++++++ config/services.json | 100 ++++++++++++++ package.json | 49 +++++++ 8 files changed, 699 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 config/app-config-schema.json create mode 100644 config/app-config.json create mode 100644 config/services-schema.json create mode 100644 config/services.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..66df273 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# misc +.DS_Store +package-lock.json +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/README.md b/README.md index 80e0b42..3ece3fe 100644 --- a/README.md +++ b/README.md @@ -1 +1,11 @@ -# LoIDE-API-Server \ No newline at end of file +# LoIDE-API-Server + +An API server for LoIDE clients + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Run the LoIDE Web Server. diff --git a/app.js b/app.js new file mode 100644 index 0000000..2bb59ae --- /dev/null +++ b/app.js @@ -0,0 +1,251 @@ +var webSocket = require("websocket").w3cwebsocket; +var fs = require("fs"); +var jpointer = require("json-pointer"); +var https = require("https"); +var http = require("http"); + +var pckg = require("./package.json"); + +// System config loading +var properties = require("./config/app-config.json"); +var httpPort = properties.port.http; +var httpsPortP = properties.port.https; +var key = properties.path.key; +var cert = properties.path.cert; + +// Services configuration file +var servicesConfig = require("./config/services.json"); + +// This function validates the JSON schemas +var Ajv = require("ajv"); +validateJsonSchemas(); + +// Prepare the languages array to give to the clients +var languagesData = getLanguages(); + +var server = http.createServer(); + +var enableHTTPS = false; + +if (key.length !== 0 && cert.length !== 0) { + enableHTTPS = true; + + var options = { + key: fs.readFileSync(key), + cert: fs.readFileSync(cert), + }; + + var secureServer = https.createServer(options); +} + +var io = require("socket.io")({ + cors: { + origin: true, + }, +}); + +io.attach(server); +if (enableHTTPS) { + io.attach(secureServer); +} + +io.sockets.on("connection", (client) => { + // Wait for the incoming connection from the browser, the Socket.io client from index.html + print_log("Opened connection"); + + client.on("getLanguages", () => { + print_log('Executed "getLanguages"'); + client.emit("languages", JSON.stringify(languagesData)); + }); + + client.on("run", (data) => { + // Wait for the incoming data with the 'run' event and send data + print_log('Executed "run"'); + + // The function return the host path of one of the executors for a particular language and solver, if know + var host = getExcecutorURL(data); + + // Check if the choosen host is configured + if (host === undefined) { + client.emit("problem", { + reason: "No Executor available for this solver!", + }); + return; + } + + // Connect to the executor + var executor = new webSocket(host); + + print_log('Connecting to "' + host + '"'); + + executor.onopen = () => { + // Opens the connection and send data + print_log( + "Sending to EmbASPServerExecutor:\n" + + JSON.stringify(JSON.parse(data), null, "\t") + ); + executor.send(data); + }; + + executor.onerror = (error) => { + print_log( + "WebSocket problem:\n" + JSON.stringify(error, null, "\t") + ); + client.emit("problem", { + reason: "Execution error, please try again later!", + }); + }; + + executor.onmessage = (output) => { + // Wait for the incoming data from the EmbASPServerExecutor + var model = JSON.parse(output.data); + print_log( + 'From EmbASPServerExecutor:\nModel "' + + model.model + + '"\nError "' + + model.error + + '"' + ); // debug string + client.emit("output", model); // Socket.io calls emit() to send data to the browser. + }; + }); +}); + +if (enableHTTPS) { + secureServer.listen(httpsPortP, function () { + print_log("Loide API Server listening on secure port " + httpsPortP); + print_log("Version: " + pckg.version); + }); +} + +server.listen(httpPort, function () { + print_log("Loide API Server listening on port " + httpPort); + print_log("Version: " + pckg.version); +}); + +function print_log(statement) { + console.log("%s: %s", new Date().toLocaleString(), statement); // debug string +} + +function getExcecutorURL(data) { + console.log("data getExcecutorURL", data); + try { + data = JSON.parse(data); + } catch (error) { + return undefined; + } + for (var i in servicesConfig.languages) { + if (servicesConfig.languages[i].value === data.language) { + var solvers = servicesConfig.languages[i].solvers; + for (var j in solvers) { + // FIXME: The client should pass 'solver' parameter and not 'engine' + if (solvers[j].value === data.engine) { + var executors = solvers[j].executors; + for (var k in executors) { + if (executors[k].value === data.executor) { + return ( + executors[k].protocol + + "://" + + executors[k].url + + ":" + + executors[k].port + + executors[k].path + ); + } + } + } + } + } + } + return undefined; +} + +function validateJsonSchemas() { + // Validate JSON file with the relative scheme + var servicesValidation = validateSchema( + "./config/services.json", + "./config/services-schema.json" + ); + var appConfigValidation = validateSchema( + "./config/app-config.json", + "./config/app-config-schema.json" + ); + + if (servicesValidation.criticalError || appConfigValidation.criticalError) { + console.log( + "Fatal error: configuration files are not setted up properly!" + ); + process.exit(1); + } +} + +function validateSchema(jsonPath, schemaPath) { + // Loading files + var json = require(jsonPath); + var schema = require(schemaPath); + + // Config + var ajv = new Ajv({ + allErrors: true, + jsonPointers: true, + }); + + // Compiling the schema + var compiledSchema = ajv.compile(schema); + var validated = false; + var printError = true; + var response = {}; + + while (!validated) { + // Validating + var validatedJson = compiledSchema(json); + // If some there is some error, the nearest parent object in the file, containing this error, is deleted + if (!validatedJson) { + // Prints the errors only the first time + if (printError) { + console.log(compiledSchema.errors); + printError = false; + } + + for (var index in compiledSchema.errors) { + var path = compiledSchema.errors[index].dataPath; + if (path === "") { + // 'This' case happen when there is a problem in to the root of the json file (eg. when the file is empty) + console.log( + "Fatal error: " + + jsonPath + + " is not setted up properly!" + ); + response.criticalError = true; + validated = true; + } else { + jpointer.remove(json, path); + } + } + } else { + console.log("Validated: " + jsonPath); + validated = true; + } + } + + return response; +} + +function getLanguages() { + // get a copy of languages from the services JSON + let languages = JSON.parse(JSON.stringify(servicesConfig.languages)); + + for (let i = 0; i < languages.length; i++) { + for (let j = 0; j < languages[i].solvers.length; j++) { + for (let x = 0; x < languages[i].solvers[j].executors.length; x++) { + let executor = languages[i].solvers[j].executors[x]; + languages[i].solvers[j].executors[x] = { + name: executor.name, + value: executor.value, + }; + } + } + } + + return languages; +} diff --git a/config/app-config-schema.json b/config/app-config-schema.json new file mode 100644 index 0000000..ec00f29 --- /dev/null +++ b/config/app-config-schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "app-config-schema.json", + "self": { + "vendor": "unical", + "name": "app-config", + "format": "jsonschema", + "version": "1-0-0" + }, + "type": "object", + "properties": { + "port": { + "title": "Ports configuration object", + "description": "This object contains information about ports to be used for the various supported protocols.", + "type": "object", + "properties": { + "http": { + "title": "HTTP port", + "description": "This property specifies the port to use for HTTP connections.", + "type": "number", + "minimum": 0, + "maximum": 65535 + }, + "https": { + "title": "HTTPS port", + "description": "This property specifies the port to use for HTTPS connections.", + "type": "number", + "minimum": 0, + "maximum": 65535 + } + }, + "required": ["http"], + "additionalProperties": false + }, + "path": { + "title": "Paths configuration object", + "description": "This object contains information about paths to be used for the various configurations.", + "type": "object", + "properties": { + "key": { + "title": "HTTPS key", + "description": "This property specifies the path for the HTTPS key.", + "type": "string" + }, + "cert": { + "title": "HTTPS certificate", + "description": "This property specifies the path for the HTTPS certificate.", + "type": "string" + } + }, + "required": ["key", "cert"], + "additionalProperties": false + } + }, + "required": ["port"], + "additionalProperties": false +} diff --git a/config/app-config.json b/config/app-config.json new file mode 100644 index 0000000..1ee0547 --- /dev/null +++ b/config/app-config.json @@ -0,0 +1,10 @@ +{ + "port": { + "http": 8084, + "https": 8085 + }, + "path": { + "key": "", + "cert": "" + } +} diff --git a/config/services-schema.json b/config/services-schema.json new file mode 100644 index 0000000..69fe60c --- /dev/null +++ b/config/services-schema.json @@ -0,0 +1,203 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "services-schema.json", + "self": { + "vendor": "unical", + "name": "services", + "format": "jsonschema", + "version": "1-0-0" + }, + "properties": { + "languages": { + "title": "Supported languages.", + "description": "This property indicates all the supported languages by the services avalable on the LoIDE Web Application.", + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/language" + } + } + }, + "required": [ + "languages" + ], + "additionalProperties": false, + "definitions": { + "language": { + "type": "object", + "properties": { + "name": { + "title": "Language name.", + "description": "This property indicates the language name.", + "type": "string" + }, + "value": { + "title": "Language value.", + "description": "This property indicates the language value used in communication with other services.", + "type": "string" + }, + "syntax-highlighter": { + "title": "Syntax-Highlighter path.", + "description": "This property indicates the syntax highlighter path corresponding to this language.", + "type": "object", + "properties": { + "name": { + "title": "Syntax-Highlighter name.", + "description": "This property indicates the syntax-highlighter name.", + "type": "string" + }, + "description": { + "title": "Syntax-Highlighter description.", + "description": "This property indicates the syntax-highlighter description.", + "type": "string" + }, + "path": { + "title": "Syntax-Highlighter path.", + "description": "This property indicates the syntax-highlighter file path.", + "type": "string" + } + }, + "required": [ + "name", + "path" + ], + "additionalProperties": false + }, + "solvers": { + "title": "Supporting solvers.", + "description": "This property indicates all supporting solvers for this language.", + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/solver" + } + } + }, + "required": [ + "name", + "value", + "solvers" + ], + "additionalProperties": false + }, + "solver": { + "type": "object", + "properties": { + "name": { + "title": "Solver name.", + "description": "This property indicates the solver name.", + "type": "string" + }, + "value": { + "title": "Solver value.", + "description": "This property indicates the solver value used in communication with other services.", + "type": "string" + }, + "executors": { + "title": "Supporting executors.", + "description": "This property indicates all supporting executors for this solver.", + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/executor" + } + }, + "options": { + "title": "Solver option", + "description": "This property indicates the options supported by the solver.", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "properties": { + "name": { + "title": "Option name.", + "description": "This property indicates the option name.", + "type": "string" + }, + "value": { + "title": "Option value.", + "description": "This property indicates the command line argument passed to the solver.", + "type": "string" + }, + "word_argument": { + "title": "Word argument.", + "description": "This property indicates if this type of argument requires the second argument or it's just a word argument (this is just a flag).", + "type": "boolean" + }, + "description": { + "title": "Option description.", + "description": "This property contains the description of the option.", + "type": "string" + } + }, + "required": [ + "name", + "value", + "word_argument", + "description" + ], + "additionalProperties": false + } + } + }, + "required": [ + "name", + "value", + "executors", + "options" + ], + "additionalProperties": false + }, + "executor": { + "type": "object", + "properties": { + "protocol": { + "title": "Protocol name.", + "description": "This property indicates the protocol name to use for a connection with this Executor.", + "enum": [ "ws", "http" ] + }, + "url": { + "title": "Executor URL.", + "description": "This property indicates the executor URL to connect with it.", + "type": "string", + "oneOf": [ + { "format": "hostname" }, + { "format": "ipv4" }, + { "format": "ipv6" } + ] + }, + "name": { + "title": "Executor name.", + "description": "This property indicates the executor name.", + "type": "string" + }, + "value": { + "title": "Executor value.", + "description": "This property indicates the option value.", + "type": "string" + }, + "path": { + "title": "Executor path.", + "description": "This property indicates the executor path relative to its URL.", + "type": "string", + "_comment": "Add the pattern to match with the 'path'." + }, + "port": { + "title": "Connection port number.", + "description": "This property indicates the port number open on this executor for the incoming connections.", + "type": "number", + "minimum": 0, + "maximum": 65535 + } + }, + "required": [ + "protocol", + "url", + "path", + "port" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/config/services.json b/config/services.json new file mode 100644 index 0000000..e35cc10 --- /dev/null +++ b/config/services.json @@ -0,0 +1,100 @@ +{ + "languages": [ + { + "name": "ASP", + "value": "asp", + "solvers": [ + { + "name": "DLV2", + "value": "dlv2", + "executors": [ + { + "protocol": "ws", + "url": "localhost", + "name": "EmbASPServerExecutor", + "value": "embAspServerExecutor", + "path": "/EmbASPServerExecutor/home", + "port": 8080 + } + ], + "options": [ + { + "name": "Free choice", + "value": "free choice", + "word_argument": true, + "description": "Missing description" + } + ] + }, + { + "name": "Clingo", + "value": "clingo", + "executors": [ + { + "protocol": "ws", + "url": "localhost", + "name": "EmbASPServerExecutor", + "value": "embAspServerExecutor", + "path": "/EmbASPServerExecutor/home", + "port": 8080 + } + ], + "options": [ + { + "name": "Free choice", + "value": "free choice", + "word_argument": true, + "description": "Missing description" + } + ] + }, + { + "name": "DLV", + "value": "dlv", + "executors": [ + { + "protocol": "ws", + "url": "localhost", + "name": "EmbASPServerExecutor", + "value": "embAspServerExecutor", + "path": "/EmbASPServerExecutor/home", + "port": 8080 + } + ], + "options": [ + { + "name": "Free choice", + "value": "free choice", + "word_argument": true, + "description": "Missing description" + }, + { + "name": "Filter", + "value": "-filter=", + "word_argument": true, + "description": "Missing description" + }, + { + "name": "No Facts", + "value": "-nofacts", + "word_argument": false, + "description": "Missing description" + }, + { + "name": "Silent", + "value": "-silent", + "word_argument": false, + "description": "Missing description" + }, + { + "name": "Query", + "value": "-FC", + "word_argument": false, + "description": "Missing description" + } + ] + } + ] + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..05e5113 --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "loide-api-server", + "version": "1.0.0", + "description": "LoIDE Server API", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon app.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/DeMaCS-UNICAL/LoIDE-API-Server" + }, + "contributors": [ + { + "name": "Stefano Germano", + "email": "germano@mat.unical.it" + }, + { + "name": "Eliana Palermiti", + "email": "eliana_palermiti@libero.it" + }, + { + "name": "Rocco Palermiti", + "email": "roccopalermiti@virgilio.it" + }, + { + "name": "Alexander Karaulshchikov", + "email": "alexander.karaulshchikov@gmail.com" + }, + { + "name": "Francesco Calimeri", + "email": "calimeri@mat.unical.it" + } + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/DeMaCS-UNICAL/LoIDE-API-Server/issues" + }, + "dependencies": { + "ajv": "^6.12.6", + "json-pointer": "^0.6.0", + "socket.io": "^3.0.3", + "websocket": "^1.0.32" + }, + "devDependencies": { + "nodemon": "^2.0.6" + } +} From 73d44af7840a9c5b694f405feb2336cab55f931b Mon Sep 17 00:00:00 2001 From: Roky97 Date: Mon, 24 May 2021 17:14:16 +0200 Subject: [PATCH 2/5] Update dependencies --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 05e5113..2d59545 100644 --- a/package.json +++ b/package.json @@ -40,10 +40,10 @@ "dependencies": { "ajv": "^6.12.6", "json-pointer": "^0.6.0", - "socket.io": "^3.0.3", - "websocket": "^1.0.32" + "socket.io": "^3.1.2", + "websocket": "^1.0.34" }, "devDependencies": { - "nodemon": "^2.0.6" + "nodemon": "^2.0.7" } } From 2239bad0069a257098c00a5949228158f757e589 Mon Sep 17 00:00:00 2001 From: Roky97 Date: Mon, 4 Apr 2022 14:55:51 -0400 Subject: [PATCH 3/5] Update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2d59545..9122f71 100644 --- a/package.json +++ b/package.json @@ -39,11 +39,11 @@ }, "dependencies": { "ajv": "^6.12.6", - "json-pointer": "^0.6.0", + "json-pointer": "^0.6.2", "socket.io": "^3.1.2", "websocket": "^1.0.34" }, "devDependencies": { - "nodemon": "^2.0.7" + "nodemon": "^2.0.15" } } From 03027cd3bbaec6f5d06937651cd0d635c86eca88 Mon Sep 17 00:00:00 2001 From: Roky97 Date: Thu, 22 Sep 2022 14:32:15 -0400 Subject: [PATCH 4/5] Update dependencies --- .gitignore | 1 - package-lock.json | 621 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 622 insertions(+), 2 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 66df273..79eaf1f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ # misc .DS_Store -package-lock.json .env.local .env.development.local .env.test.local diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2e907ef --- /dev/null +++ b/package-lock.json @@ -0,0 +1,621 @@ +{ + "name": "loide-api-server", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" + }, + "@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==" + }, + "@types/node": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz", + "integrity": "sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", + "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "requires": { + "foreach": "^2.0.4" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "requires": { + "mime-db": "1.47.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "socket.io": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", + "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" + } + }, + "socket.io-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "requires": { + "punycode": "^2.1.0" + } + }, + "utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + } + } +} diff --git a/package.json b/package.json index 9122f71..959c9e4 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,6 @@ "websocket": "^1.0.34" }, "devDependencies": { - "nodemon": "^2.0.15" + "nodemon": "^2.0.20" } } From f1ed2c0b900559362f183c9d1b30b8ca745f7955 Mon Sep 17 00:00:00 2001 From: Roky97 Date: Tue, 27 Sep 2022 09:38:57 -0400 Subject: [PATCH 5/5] 1.0.0