diff --git a/.gitignore b/.gitignore
index eaa9d4f..6704566 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,447 +1,104 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
-
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Mono auto generated files
-mono_crash.*
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-[Ll]ogs/
-
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# Visual Studio 2017 auto generated files
-Generated\ Files/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
-*.obj
-*.iobj
-*.pch
-*.pdb
-*.ipdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
+# Logs
+logs
*.log
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
-# Chutzpah Test files
-_Chutzpah*
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
-# Visual Studio Trace Files
-*.e2e
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
-# TFS 2012 Local Workspace
-$tf/
+# nyc test coverage
+.nyc_output
-# Guidance Automation Toolkit
-*.gpState
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
+# Bower dependency directory (https://bower.io/)
+bower_components
-# TeamCity is a build add-in
-_TeamCity*
+# node-waf configuration
+.lock-wscript
-# DotCover is a Code Coverage Tool
-*.dotCover
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
+# Dependency directories
node_modules/
+jspm_packages/
-# Visual Studio 6 build log
-*.plg
+# TypeScript v1 declaration files
+typings/
-# Visual Studio 6 workspace options file
-*.opt
+# TypeScript cache
+*.tsbuildinfo
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
+# Optional npm cache directory
+.npm
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
+# Optional eslint cache
+.eslintcache
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
-# FAKE - F# Make
-.fake/
+# Optional REPL history
+.node_repl_history
-# CodeRush personal settings
-.cr/personal
+# Output of 'npm pack'
+*.tgz
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
+# Yarn Integrity file
+.yarn-integrity
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
+# dotenv environment variables file
+.env
+.env.test
-# Tabs Studio
-*.tss
+# parcel-bundler cache (https://parceljs.org/)
+.cache
-# Telerik's JustMock configuration file
-*.jmconfig
+# Next.js build output
+.next
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
+# Nuxt.js build / generate output
+.nuxt
+dist
-# OpenCover UI analysis results
-OpenCover/
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and *not* Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
-# Azure Stream Analytics local run output
-ASALocalRun/
+# vuepress build output
+.vuepress/dist
-# MSBuild Binary and Structured Log
-*.binlog
+# Serverless directories
+.serverless/
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
+# FuseBox cache
+.fusebox/
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
+# DynamoDB Local files
+.dynamodb/
-# Local History for Visual Studio
-.localhistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-.ionide/
-out/build/x86-Debug/VSInheritEnvironments.txt
-out/build/x86-Debug/rules.ninja
-out/build/x86-Debug/CMakeFiles/untitled.dir/manifest.res
-out/build/x86-Debug/CMakeFiles/untitled.dir/manifest.rc
-out/build/x86-Debug/CMakeFiles/untitled.dir/intermediate.manifest
-out/build/x86-Debug/CMakeFiles/untitled.dir/embed.manifest
-out/build/x86-Debug/CMakeFiles/TargetDirectories.txt
-out/build/x86-Debug/CMakeFiles/ShowIncludes/main.c
-out/build/x86-Debug/CMakeFiles/ShowIncludes/foo.h
-out/build/x86-Debug/CMakeFiles/cmake.check_cache
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.exe
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.cpp
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdC/CMakeCCompilerId.exe
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdC/CMakeCCompilerId.c
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeSystem.cmake
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeRCCompiler.cmake
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeDetermineCompilerABI_CXX.bin
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeDetermineCompilerABI_C.bin
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeCXXCompiler.cmake
-out/build/x86-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeCCompiler.cmake
-out/build/x86-Debug/CMakeCache.txt
-out/build/x86-Debug/cmake_install.cmake
-out/build/x86-Debug/build.ninja
-out/build/x86-Debug/.ninja_log
-out/build/x86-Debug/.ninja_deps
-out/build/x86-Debug/.cmake/api/v1/reply/target-untitled-Debug-03f16c5921ae0bd48990.json
-out/build/x86-Debug/.cmake/api/v1/reply/index-2020-01-27T23-42-34-0718.json
-out/build/x86-Debug/.cmake/api/v1/reply/codemodel-v2-2b93246ca751d7a49cd1.json
-out/build/x86-Debug/.cmake/api/v1/reply/cmakeFiles-v1-d93b224eb363971ee2c4.json
-out/build/x86-Debug/.cmake/api/v1/reply/cache-v2-43521627501184045d13.json
-out/build/x86-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json
-out/build/x64-Debug/VSInheritEnvironments.txt
-out/build/x64-Debug/rules.ninja
-out/build/x64-Debug/CMakeFiles/untitled.dir/manifest.res
-out/build/x64-Debug/CMakeFiles/untitled.dir/manifest.rc
-out/build/x64-Debug/CMakeFiles/untitled.dir/intermediate.manifest
-out/build/x64-Debug/CMakeFiles/untitled.dir/embed.manifest
-out/build/x64-Debug/CMakeFiles/TargetDirectories.txt
-out/build/x64-Debug/CMakeFiles/ShowIncludes/main.c
-out/build/x64-Debug/CMakeFiles/ShowIncludes/foo.h
-out/build/x64-Debug/CMakeFiles/cmake.check_cache
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.exe
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.cpp
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdC/CMakeCCompilerId.exe
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CompilerIdC/CMakeCCompilerId.c
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeSystem.cmake
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeRCCompiler.cmake
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeDetermineCompilerABI_CXX.bin
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeDetermineCompilerABI_C.bin
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeCXXCompiler.cmake
-out/build/x64-Debug/CMakeFiles/3.15.19101501-MSVC_2/CMakeCCompiler.cmake
-out/build/x64-Debug/CMakeCache.txt
-out/build/x64-Debug/cmake_install.cmake
-out/build/x64-Debug/build.ninja
-out/build/x64-Debug/.ninja_log
-out/build/x64-Debug/.ninja_deps
-out/build/x64-Debug/.cmake/api/v1/reply/target-untitled-Debug-8918286eee207fe0275b.json
-out/build/x64-Debug/.cmake/api/v1/reply/index-2020-01-27T23-42-03-0431.json
-out/build/x64-Debug/.cmake/api/v1/reply/codemodel-v2-ee254da00ecbf4b22928.json
-out/build/x64-Debug/.cmake/api/v1/reply/cmakeFiles-v1-ee926bd040d82c324cbe.json
-out/build/x64-Debug/.cmake/api/v1/reply/cache-v2-6f7cb0917968b934d35c.json
-out/build/x64-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json
-CMakeSettings.json
-cmake-build-debug/Resource1.resx
-out/build/x64-Debug/.cmake/api/v1/reply/index-2020-01-28T10-34-19-0746.json
-out/build/x64-Debug/untitled.exe
-out/build/x64-Debug/.cmake/api/v1/reply/index-2020-01-28T11-19-41-0061.json
-out/build/x64-Debug/.cmake/api/v1/reply/cmakeFiles-v1-52c1d9386071c1490278.json
-out/build/x86-Debug/CMakeFiles/cmake-main.dir/manifest.res
-out/build/x86-Debug/CMakeFiles/cmake-main.dir/manifest.rc
-out/build/x86-Debug/CMakeFiles/cmake-main.dir/intermediate.manifest
-out/build/x86-Debug/CMakeFiles/cmake-main.dir/embed.manifest
-out/build/x86-Debug/cmake-main.exe
-out/build/x86-Debug/.cmake/api/v1/reply/target-enet-Debug-1cc90e5d191bd520f961.json
-out/build/x86-Debug/.cmake/api/v1/reply/target-cmake-main-Debug-0c9bd3464adc40e447af.json
-out/build/x86-Debug/.cmake/api/v1/reply/index-2020-01-28T11-21-26-0362.json
-out/build/x86-Debug/.cmake/api/v1/reply/codemodel-v2-1850e17888d5bab56568.json
-out/build/x86-Debug/.cmake/api/v1/reply/cmakeFiles-v1-7c376457f6b736ad28ac.json
-out/build/x64-Debug/CMakeFiles/cmake-main.dir/manifest.res
-out/build/x64-Debug/CMakeFiles/cmake-main.dir/manifest.rc
-out/build/x64-Debug/CMakeFiles/cmake-main.dir/intermediate.manifest
-out/build/x64-Debug/CMakeFiles/cmake-main.dir/embed.manifest
-out/build/x64-Debug/cmake-main.exe
-out/build/x64-Debug/.cmake/api/v1/reply/target-enet-Debug-645fd45f5bd4fab53aa9.json
-out/build/x64-Debug/.cmake/api/v1/reply/target-cmake-main-Debug-b124668c8fb6ca5df286.json
-out/build/x64-Debug/.cmake/api/v1/reply/index-2020-01-28T11-21-06-0706.json
-out/build/x64-Debug/.cmake/api/v1/reply/codemodel-v2-63a6ab1789a1732f4563.json
-out/build/x86-Debug/.cmake/api/v1/reply/target-enet-Debug-d301abed48f6c38bdcfb.json
-out/build/x86-Debug/.cmake/api/v1/reply/index-2020-01-28T12-30-44-0946.json
-out/build/x86-Debug/.cmake/api/v1/reply/codemodel-v2-3eaabe43603befc605b1.json
-out/build/x86-Debug/.cmake/api/v1/reply/target-cmake-main-Debug-70eff68e1e381b42992e.json
-*.xml
-out/build/x86-Debug/.cmake/api/v1/reply/target-enet-Debug-48db38ae5d08e27876b8.json
-out/build/x86-Debug/.cmake/api/v1/reply/target-cmake-main-Debug-540e487569703b71c785.json
-out/build/x86-Debug/.cmake/api/v1/reply/index-2020-01-28T17-35-38-0764.json
-out/build/x86-Debug/.cmake/api/v1/reply/codemodel-v2-6a61e390ef8eaf17e9f8.json
-out/build/x86-Debug/Server.cfg
+# TernJS port file
+.tern-port
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index e7e9d11..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Default ignored files
-/workspace.xml
diff --git a/.idea/BeamNG-MP-Server.iml b/.idea/BeamNG-MP-Server.iml
deleted file mode 100644
index f08604b..0000000
--- a/.idea/BeamNG-MP-Server.iml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 8822db8..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 35f1ecb..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index 568c400..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(BeamNG-MP-Server)
-
-set(CMAKE_CXX_STANDARD 14)
-
-add_executable(cmake-main src/main.cpp src/network.cpp src/logger.cpp src/config.cpp)
-ADD_LIBRARY(
- enet STATIC
- enet.lib
-)
-set_target_properties(enet PROPERTIES LINKER_LANGUAGE CXX)
\ No newline at end of file
diff --git a/enet.lib b/enet.lib
deleted file mode 100644
index 4ecef81..0000000
Binary files a/enet.lib and /dev/null differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..8cd0171
--- /dev/null
+++ b/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+ Hello World!
+
+
+ BeamNG.drive MP Development Tool!
+
+ Make:
+ Clutch:
+ Throttle:
+ Brake:
+ Steering:
+ POS:
+ Time difference:
+
+
+
+
+
+
+
+
+
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..4e161a4
--- /dev/null
+++ b/index.js
@@ -0,0 +1,345 @@
+// Server Settings!
+var map = "";
+let _VERSION = "0.0.3"
+let UDPExpireTime = 30// In Seconds
+
+const net = require('net');
+const uuidv4 = require('uuid/v4');
+const args = require('minimist')(process.argv.slice(2));
+const chalk = require("chalk")
+
+//console.log(args.port)
+if (args.port) {
+ var tcpport = args.port;
+} else {
+ var tcpport = 30813;
+}
+
+var udpport = tcpport + 1;
+var wsport = tcpport + 2;
+const host = '0.0.0.0';
+
+//==========================================================
+// WebSocket Server
+//==========================================================
+
+const WebSocket = require('ws');
+
+const wss = new WebSocket.Server({ port: wsport });
+
+wss.on('connection', function connection(ws) {
+ ws.on('message', function incoming(message) {
+ console.log('[WS] received: %s', message);
+ wss.clients.forEach(function each(client) {
+ if (client.readyState === WebSocket.OPEN) {
+ client.send(message);
+ }
+ });
+ });
+
+ ws.send('Welcome!');
+});
+console.log(chalk.cyan('[WS]')+' Server listening on 0.0.0.0:' + wsport);
+
+//==========================================================
+// TCP Server
+//==========================================================
+
+const TCPserver = net.createServer();
+TCPserver.listen(tcpport, () => {
+ console.log(chalk.green('[TCP]')+' Server listening on 0.0.0.0:' + tcpport);
+});
+
+let sockets = [];
+let players = [];
+let names = [];
+let vehicles = [];
+
+TCPserver.on('connection', function(sock) {
+ console.log(chalk.green('[TCP]')+' CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
+ sockets.push(sock);
+
+ var player = {};
+ player.remoteAddress = sock.remoteAddress;
+ player.remotePort = sock.remotePort;
+ player.nickname = "New User, Loading...";
+ player.id = uuidv4();
+ player.currentVehID = 0;
+ players.push(player);
+
+ sock.write('HOLA'+player.id+'\n');
+ if (map == "") {
+ sock.write("MAPS\n");
+ } else {
+ sock.write("MAPC"+map+'\n')
+ }
+ sock.write("VCHK"+_VERSION+'\n')
+
+ sock.on('data', function(data) {
+ // Write the data back to all the connected, the client will receive it as data from the server
+ var str = data.toString();
+ data = str.trim(); //replace(/\r?\n|\r/g, "");
+ var code = data.substring(0, 4);
+ var message = data.substr(4);
+
+ if (code != "PING") {
+ //console.log(code)
+ }
+ //if (data.length > 4) {
+ //console.log(data.length)
+ //}
+
+ switch (code) {
+ case "PING":
+ //console.log("Ping Received")
+ sock.write('PONG\n');
+ break;
+ case "CHAT":
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ socket.write(data+'\n');
+ });
+ break;
+ case "MAPS":
+ map = message;
+ console.log("Setting map to: "+map);
+ sock.write("MAPC"+map+'\n');
+ break;
+ case "USER":
+ players.forEach(function(player, index, array) {
+ if (player.remoteAddress == sock.remoteAddress && player.remotePort == sock.remotePort) {
+ console.log("Player Found ("+player.id+"), setting nickname("+data.substr(4)+")");
+ player.nickname = ""+data.substr(4)+"";
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ socket.write('PLST'+JSON.stringify(players)+'\n');
+ socket.write('SMSG'+data.substr(4)+' Just Joined the Session.\n');
+ });
+ }
+ });
+ break;
+ case "QUIT":
+ case "2001":
+ let index = sockets.findIndex(function(o) {
+ return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
+ })
+ if (index !== -1) sockets.splice(index, 1);
+ console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
+ break;
+ case "U-VI":
+ case "U-VE":
+ case "U-VN":
+ case "U-VP":
+ case "U-VL":
+ case "U-VR":
+ case "U-VV":
+ //console.log(data)
+ //players.forEach(function(player, index, array) {
+ //if (player.remoteAddress != sock.remoteAddress) {
+ //console.log(player.remoteAddress+' != '+sock.remoteAddress+' Is not the same so we should send?')
+ //console.log("Got Update to send!")
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ //console.log(socket.remotePort+' != '+sock.remotePort+' Is not the same so we should send?')
+ if ((sock.remoteAddress != socket.remoteAddress && sock.remotePort != socket.remotePort) || (sock.remoteAddress == socket.remoteAddress && sock.remotePort != socket.remotePort)) {
+ socket.write(data+'\n');
+ }
+ });
+ //}
+ //});
+ break;
+ case "U-VC":
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ socket.write(data+'\n');
+ });
+ break;
+ case "U-NV":
+ console.log(message)
+ var vid = uuidv4();
+
+ break;
+ case "C-VS": // Client has changed vehicle. lets update our records.
+ console.log(message)
+ players.forEach(function(player, index, array) {
+ if (player.currentVehID != message && player.remoteAddress == sock.remoteAddress && player.remotePort == sock.remotePort) {
+ console.log(chalk.green('[TCP]')+" Player Found ("+player.id+"), updating current vehile("+message+")");
+ player.currentVehID = message;
+ }
+ });
+ break;
+ default:
+ console.log(chalk.green('[TCP]')+' Unknown / unhandled data from:' + sock.remoteAddress);
+ console.log(chalk.green('[TCP]')+' Data -> ' + data);
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ //if ((sock.remoteAddress != socket.remoteAddress && sock.remotePort != socket.remotePort) || (sock.remoteAddress == socket.remoteAddress && sock.remotePort != socket.remotePort)) {
+ socket.write(data+'\n');
+ //}
+ });
+ break;
+ }
+ sockets.forEach(function(sock, index, array) {
+ //sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');
+ });
+ });
+
+ // Add a 'close' event handler to this instance of socket
+ sock.on('close', function(data) {
+ var index = players.findIndex(function(o) {
+ return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
+ })
+ if (index !== -1) sockets.splice(index, 1);
+ index = sockets.findIndex(function(o) {
+ return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
+ })
+ if (index !== -1) sockets.splice(index, 1);
+ console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
+ players = removePlayer(players, sock.remoteAddress);
+ console.log("Player list now holds: "+JSON.stringify(players));
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ socket.write('PLST'+JSON.stringify(players)+'\n');
+ });
+ });
+
+ sock.on('error', (err) => {
+ // handle errors here
+ if (err.code == "ECONNRESET") {
+ console.error(chalk.red("ERROR ")+"Connection Reset for player: ");
+ players.forEach(function(player, index, array) {
+ if (player.remoteAddress == sock.remoteAddress && player.remotePort == sock.remotePort) {
+ console.error(+player.nickname+" ("+player.id+")");
+ console.error(chalk.red("ERROR ")+"End Error.");
+ }
+ });
+ } else {
+ console.error("Sock Error");
+ console.error(err);
+ throw err;
+ }
+ });
+});
+
+TCPserver.on('error', (err) => {
+ // handle errors here
+ console.error("TCPserver Error");
+ console.error(err);
+ throw err;
+});
+
+function removePlayer(array, ip) {
+ return array.filter(player => player.remoteAddress != ip);
+}
+
+//==========================================================
+// UDP Server
+//==========================================================
+
+var clients = {};
+var intervalTime = UDPExpireTime*2*1000;
+
+setInterval(function() {
+ console.log(clients);
+ for (var client in clients) {
+ var lastupdate = clients[client];
+ var millis = Date.now() - lastupdate;
+ var t = Math.floor(millis/1000)
+ if (t > UDPExpireTime) {
+ console.warn("Found Old Client: "+client)
+ delete clients[client];
+ }
+ }
+}, intervalTime);
+
+function updateClient (rinfo) {
+ for (var client in clients) {
+ client = JSON.parse(client);
+ var address = client[0];
+ var port = client[1];
+ if (port == rinfo.port && address == rinfo.address) {
+ client
+ }
+ }
+}
+
+var dgram = require('dgram');
+var UDPserver = dgram.createSocket('udp4');
+
+function UDPsend(message, info) {
+ UDPserver.send(message, 0, message.length, info.port, info.address, function(error){
+ if (error) {
+ console.log("ERROR");
+ console.log(error);
+ client.close();
+ };
+ });
+}
+
+UDPserver.on('listening', function() {
+ var address = UDPserver.address();
+ console.log(chalk.rgb(123, 45, 67)('[UDP]')+' Server listening on ' + address.address + ':' + address.port);
+});
+
+UDPserver.on('message',function(msg,rinfo){
+ clients[JSON.stringify([rinfo.address, rinfo.port])] = Date.now();
+ //sending msg
+ var str = msg.toString();
+ data = str.trim(); //replace(/\r?\n|\r/g, "");
+ var code = data.substring(0, 4);
+ //if (code != "PING") {
+ //console.log(msg.toString());
+ //}
+ switch (code) {
+ case "PING":
+ UDPsend("PONG", rinfo)
+ break;
+ case "U-VC":
+ for (var client in clients) {
+ client = JSON.parse(client);
+ var port = client[1];
+ var address = client[0];
+ UDPserver.send(msg, 0, msg.length, port, address, function(error){
+ if (error) {
+ console.log("ERROR");
+ console.log(error);
+ client.close();
+ };
+ });
+ }
+ break;
+ case "U-VR":
+ case "U-VL":
+ case "U-VP":
+ case "U-VN":
+ case "U-VE":
+ case "U-VI":
+ for (var client in clients) {
+ client = JSON.parse(client);
+ var port = client[1];
+ var address = client[0];
+ if (port != rinfo.port && address != rinfo.address) {
+ UDPserver.send(msg, 0, msg.length, port, address, function(error){
+ if (error) {
+ console.log("ERROR");
+ console.log(error);
+ client.close();
+ };
+ });
+ }
+ }
+ break;
+ default:
+ // Unhandled data, this at the moment includes the extra packets of vehicles so it needs to be here until it is handled correctly
+ for (var client in clients) {
+ client = JSON.parse(client);
+ var port = client[1];
+ var address = client[0];
+ UDPserver.send(msg, 0, msg.length, port, address, function(error){
+ if (error) {
+ console.log("ERROR");
+ console.log(error);
+ client.close();
+ };
+ });
+ }
+ //console.log(chalk.rgb(123, 45, 67)('[UDP]')+' Data received from client : ' + msg.toString());
+ //console.log(chalk.rgb(123, 45, 67)('[UDP]')+' Received %d bytes from %s:%d\n',msg.length, rinfo.address, rinfo.port);
+ }
+});
+
+UDPserver.bind(Number(udpport));
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..d0b26c7
--- /dev/null
+++ b/main.js
@@ -0,0 +1,235 @@
+// Modules to control application life and create native browser window
+const {app, BrowserWindow} = require('electron')
+const path = require('path')
+
+// Keep a global reference of the window object, if you don't, the window will
+// be closed automatically when the JavaScript object is garbage collected.
+let mainWindow
+
+var windowReady = false
+function createWindow () {
+ // Create the browser window.
+ mainWindow = new BrowserWindow({
+ width: 800,
+ height: 600,
+ webPreferences: {
+ nodeIntegration: true,
+ preload: path.join(__dirname, 'preload.js')
+ }
+ })
+
+ // and load the index.html of the app.
+ mainWindow.loadFile('index.html')
+
+ windowReady = true
+
+ // Open the DevTools.
+ // mainWindow.webContents.openDevTools()
+
+ // Emitted when the window is closed.
+ mainWindow.on('closed', function () {
+ // Dereference the window object, usually you would store windows
+ // in an array if your app supports multi windows, this is the time
+ // when you should delete the corresponding element.
+ mainWindow = null
+ })
+}
+
+// This method will be called when Electron has finished
+// initialization and is ready to create browser windows.
+// Some APIs can only be used after this event occurs.
+app.on('ready', createWindow)
+
+// Quit when all windows are closed.
+app.on('window-all-closed', function () {
+ // On macOS it is common for applications and their menu bar
+ // to stay active until the user quits explicitly with Cmd + Q
+ if (process.platform !== 'darwin') app.quit()
+})
+
+app.on('activate', function () {
+ // On macOS it's common to re-create a window in the app when the
+ // dock icon is clicked and there are no other windows open.
+ if (mainWindow === null) createWindow()
+})
+
+// In this file you can include the rest of your app's specific main process
+// code. You can also put them in separate files and require them here.
+
+function SendToUI(type, data) {
+ if (windowReady) {
+ mainWindow.webContents.send(type, data)
+ }
+}
+
+// Server Settings!
+var map = "";
+
+const net = require('net');
+const uuidv4 = require('uuid/v4');
+const args = require('minimist')(process.argv.slice(2));
+console.log(args.port)
+if (args.port) {
+ var tcpport = args.port;
+} else {
+ var tcpport = 30813;
+}
+var udpport = tcpport + 1;
+const host = '192.168.1.195';
+
+const TCPserver = net.createServer();
+TCPserver.listen(tcpport, () => {
+ console.log('TCP Server listening on ' + TCPserver.address().address + ':' + tcpport);
+ SendToUI('log', 'TCP Server listening on ' + TCPserver.address().address + ':' + tcpport)
+});
+
+let sockets = [];
+let players = [];
+let vehicles = [];
+
+TCPserver.on('connection', function(sock) {
+ console.log('[TCP] CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
+ sockets.push(sock);
+
+ var player = {};
+ player.remoteAddress = sock.remoteAddress;
+ player.remotePort = sock.remotePort;
+ player.nickname = "";
+ player.id = uuidv4();
+ player.currentVehID = 0;
+
+ players.push(player);
+
+ sock.write('HOLA'+player.id+'\n');
+ if (map == "") {
+ sock.write("MAPS\n");
+ } else {
+ sock.write("MAPC"+map+'\n')
+ }
+
+ sock.on('data', function(data) {
+ // Write the data back to all the connected, the client will receive it as data from the server
+ var str = data.toString();
+ data = str.trim(); //replace(/\r?\n|\r/g, "");
+ var code = data.substring(0, 4);
+ var message = data.substr(4);
+ console.log(code)
+ switch (code) {
+ case "PING":
+ console.log("Ping Received")
+ sock.write('PONG\n');
+ break;
+ case "CHAT":
+ sock.write(data+'\n');
+ break;
+ case "MAPS":
+ map = message;
+ console.log("Setting map to: "+map);
+ sock.write("MAPC"+map+'\n');
+ case "USER":
+ players.forEach(function(player, index, array) {
+ if (player.nickname == "" && player.remoteAddress == sock.remoteAddress && player.remotePort == sock.remotePort) {
+ console.log("Player Found ("+player.id+"), setting nickname("+data.substr(4)+")");
+ player.nickname = data.substr(4);
+ }
+ });
+ break;
+ case "U-VI":
+ case "U-VE":
+ case "U-VN":
+ case "U-VP":
+ case "U-VL":
+ //console.log(data)
+ //players.forEach(function(player, index, array) {
+ //if (player.remoteAddress != sock.remoteAddress) {
+ //console.log(player.remoteAddress+' != '+sock.remoteAddress+' Is not the same so we should send?')
+ //console.log("Got Update to send!")
+ sockets.forEach(function(socket, index, array) { // Send update to all clients
+ //console.log(socket.remotePort+' != '+sock.remotePort+' Is not the same so we should send?')
+ if ((sock.remoteAddress != socket.remoteAddress && sock.remotePort != socket.remotePort) || (sock.remoteAddress == socket.remoteAddress && sock.remotePort != socket.remotePort)) {
+ socket.write(data+'\n');
+ }
+ });
+ //}
+ //});
+ break;
+ case "U-NV":
+ console.log(message)
+ var vid = uuidv4();
+
+ break;
+ case "C-VS": // Client has changed vehicle. lets update our records.
+ console.log(message)
+ players.forEach(function(player, index, array) {
+ if (player.currentVehID != message && player.remoteAddress == sock.remoteAddress && player.remotePort == sock.remotePort) {
+ console.log("Player Found ("+player.id+"), updating current vehile("+message+")");
+ player.currentVehID = message;
+ }
+ });
+ break;
+ default:
+ console.log('Unknown / unhandled data: ' + sock.remoteAddress + ': ' + data);
+ }
+ sockets.forEach(function(sock, index, array) {
+ //sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');
+ });
+ });
+
+ // Add a 'close' event handler to this instance of socket
+ sock.on('close', function(data) {
+ let index = sockets.findIndex(function(o) {
+ return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
+ })
+ if (index !== -1) sockets.splice(index, 1);
+ console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
+ });
+
+ sock.on('error', (err) => {
+ // handle errors here
+ if (err == "ECONNRESET") {
+ console.error("Connection Reset!")
+ } else {
+ console.error("Sock Error");
+ console.error(err);
+ throw err;
+ }
+ });
+});
+
+TCPserver.on('error', (err) => {
+ // handle errors here
+ console.error("TCPserver Error");
+ console.error(err);
+ throw err;
+});
+
+var dgram = require('dgram');
+var UDPserver = dgram.createSocket('udp4');
+
+function UDPsend(message, info) {
+ UDPserver.send(message,info.port,info.address,function(error){if(error){console.log("ERROR");console.log(error);client.close();};});
+}
+
+UDPserver.on('listening', function() {
+ var address = UDPserver.address();
+ console.log('UDP Server listening on ' + address.address + ':' + address.port);
+});
+
+var UDPMembers = [];
+
+UDPserver.on('message',function(msg,info){
+ //sending msg
+ var str = msg.toString();
+ data = str.trim(); //replace(/\r?\n|\r/g, "");
+ var code = data.substring(0, 4);
+ switch (code) {
+ case "PING":
+ UDPsend("PONG", info)
+ break;
+ default:
+ console.log('[UDP] Data received from client : ' + msg.toString());
+ console.log('Received %d bytes from %s:%d\n',msg.length, info.address, info.port);
+ }
+});
+
+UDPserver.bind(udpport);
diff --git a/out/build/x64-Debug/enet64.lib b/out/build/x64-Debug/enet64.lib
deleted file mode 100644
index 150213d..0000000
Binary files a/out/build/x64-Debug/enet64.lib and /dev/null differ
diff --git a/out/build/x86-Debug/enet.lib b/out/build/x86-Debug/enet.lib
deleted file mode 100644
index 4ecef81..0000000
Binary files a/out/build/x86-Debug/enet.lib and /dev/null differ
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..1caf901
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1268 @@
+{
+ "name": "beamng.drive-mp-server",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+ },
+ "@types/node": {
+ "version": "10.17.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.6.tgz",
+ "integrity": "sha512-0a2X6cgN3RdPBL2MIlR6Lt0KlM7fOFsutuXcdglcOq6WvLnYXgPQSh0Mx6tO1KCAE8MxbHSOSTWDoUxRq+l3DA==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz",
+ "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "electron": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-6.1.5.tgz",
+ "integrity": "sha512-PrdJKkAS0IaSJwu4him03VYqvAKK1qyWTE/ieb4LgcbR4F4u90b91/7xna6P1GpD/FXiHqzZQcs0SvK/o08ckQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^10.12.18",
+ "electron-download": "^4.1.0",
+ "extract-zip": "^1.0.3"
+ }
+ },
+ "electron-download": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz",
+ "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.0.0",
+ "env-paths": "^1.0.0",
+ "fs-extra": "^4.0.1",
+ "minimist": "^1.2.0",
+ "nugget": "^2.0.1",
+ "path-exists": "^3.0.0",
+ "rc": "^1.2.1",
+ "semver": "^5.4.1",
+ "sumchecker": "^2.0.2"
+ }
+ },
+ "env-paths": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
+ "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extract-zip": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+ "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "1.6.2",
+ "debug": "2.6.9",
+ "mkdirp": "0.5.1",
+ "yauzl": "2.4.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ }
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "hosted-git-info": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
+ "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.42.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
+ "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.25",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
+ "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.42.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "nugget": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
+ "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.1.3",
+ "minimist": "^1.1.0",
+ "pretty-bytes": "^1.0.2",
+ "progress-stream": "^1.1.0",
+ "request": "^2.45.0",
+ "single-line-log": "^1.1.2",
+ "throttleit": "0.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "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=",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pretty-bytes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
+ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1",
+ "meow": "^3.1.0"
+ }
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "progress-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
+ "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
+ "dev": true,
+ "requires": {
+ "speedometer": "~0.1.2",
+ "through2": "~0.2.3"
+ }
+ },
+ "psl": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.5.0.tgz",
+ "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==",
+ "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==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "resolve": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz",
+ "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "single-line-log": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
+ "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
+ "speedometer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
+ "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "sumchecker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
+ "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "throttleit": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+ "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
+ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9",
+ "xtend": "~2.1.1"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ }
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
+ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "ws": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz",
+ "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A=="
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "dev": true,
+ "requires": {
+ "object-keys": "~0.4.0"
+ }
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "dev": true,
+ "requires": {
+ "fd-slicer": "~1.0.1"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..37049e7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "beamng.drive-mp-server",
+ "version": "1.0.0",
+ "description": "",
+ "main": "main.js",
+ "scripts": {
+ "start": "electron ."
+ },
+ "author": "Mitch Durso",
+ "license": "ISC",
+ "devDependencies": {
+ "electron": "^6.0.7"
+ },
+ "dependencies": {
+ "chalk": "^3.0.0",
+ "minimist": "^1.2.0",
+ "uuid": "^3.3.3",
+ "ws": "^7.2.1"
+ }
+}
diff --git a/preload.js b/preload.js
new file mode 100644
index 0000000..b8d217f
--- /dev/null
+++ b/preload.js
@@ -0,0 +1,12 @@
+// All of the Node.js APIs are available in the preload process.
+// It has the same sandbox as a Chrome extension.
+window.addEventListener('DOMContentLoaded', () => {
+ const replaceText = (selector, text) => {
+ const element = document.getElementById(selector)
+ if (element) element.innerText = text
+ }
+
+ for (const type of ['chrome', 'node', 'electron']) {
+ replaceText(`${type}-version`, process.versions[type])
+ }
+})
diff --git a/renderer.js b/renderer.js
new file mode 100644
index 0000000..901d75e
--- /dev/null
+++ b/renderer.js
@@ -0,0 +1,3 @@
+// This file is required by the index.html file and will
+// be executed in the renderer process for that window.
+// All of the Node.js APIs are available in this process.
diff --git a/src/config.cpp b/src/config.cpp
deleted file mode 100644
index c0d8416..0000000
--- a/src/config.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// Created by Anonymous275 on 1/28/2020.
-//
-
-#include "main.h"
-#include
-#include
-#include
-#include "logger.h"
-using namespace std; //nameSpace STD
-void GenerateConfig();
-string RemoveComments(string Line);
-string convertToString(char* a, int size);
-void SetValues(string Line, int Index);
-void SetMainValues(bool D,int P,string Name,string serverName);
-bool D;
-int P;
-string M;
-string S;
-
-
-//Generates or Reads Config
-void ParseConfig(){
- ifstream InFileStream;
- InFileStream.open("Server.cfg");
- if(InFileStream.good()){ //Checks if Config Exists
- info("Config Found Updating Values");
- string line;
- int index = 1;
- while (getline(InFileStream, line)) {
- if(line.rfind('#', 0) != 0){ //Checks if it starts as Comment
- string CleanLine = RemoveComments(line); //Cleans it from the Comments
- SetValues(CleanLine,index); //sets the values
- index++;
- }
- }
- SetMainValues(D,P,M,S); //gives the values to Main
- }else{
- info("Config Not Found Generating A new One");
- GenerateConfig();
- }
- InFileStream.close();
-}
-
-
-
-void SetValues(string Line, int Index) {
- int i = 0, state = 0;
- char Data[50] = "";
- bool Switch = false;
- if (Index > 2) { Switch = true; }
- for (char &c : Line) {
- if (Switch) {
- if (c == '\"') { state++; }
- if (state > 0 && state < 2) {
- Data[i] = c;
- i++;
- }
- } else {
- if (c == ' ') { state++; }
- if (state > 1) {
- Data[i] = c;
- i++;
- }
- }
- }
- for (int C = 1; C <= i; C++){
- Data[C-1] = Data[C];
- }
- string::size_type sz;
- bool Boolean = (convertToString(Data,i-1).find("true") != string::npos);//searches for "true"
- switch (Index){
- case 1 :
- if(Boolean){D = true;}else{D = false;}//checks and sets the Debug Value
- break;
- case 2 : P = stoi(Data, &sz);//sets the Port
- break;
- case 3 : M = Data; //Map
- break;
- case 4 : S = Data; //Name
- }
-}
-
-
-
-//generates default Config
-void GenerateConfig(){
- ofstream FileStream;
- FileStream.open ("Server.cfg");
- FileStream << "# This is the BeamNG-MP Server Configuration File\n"
- "Debug = false # true or false to enable debug console output\n"
- "Port = 30813 # Port to run the server on\n"
- "Map = \"levels/gridmap/level.json\"\n"
- "Name = \"BeamNG-MP FTW\"";
- FileStream.close();
-}
-
-
-string RemoveComments(string Line){
- int i = 0;
- char Data[50] = "";
- for(char& c : Line) {
- if(c == '#'){break;} //when it finds the # it will stop
- Data[i] = c;
- i++;
- }
- return convertToString(Data,i); //Converts it from a char array to string and returns it
-}
-
-//Converts a char array or pointer to string
-string convertToString(char* a, int size)
-{
- int i;
- string s = "";
- for (i = 0; i < size; i++) {
- s = s + a[i];
- }
- return s;
-}
\ No newline at end of file
diff --git a/src/enet/callbacks.h b/src/enet/callbacks.h
deleted file mode 100644
index aa4fc70..0000000
--- a/src/enet/callbacks.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- @file callbacks.h
- @brief ENet callbacks
-*/
-#ifndef __ENET_CALLBACKS_H__
-#define __ENET_CALLBACKS_H__
-
-#include
-
-typedef struct _ENetCallbacks
-{
- void * (ENET_CALLBACK * malloc) (size_t size);
- void (ENET_CALLBACK * free) (void * memory);
- void (ENET_CALLBACK * no_memory) (void);
-} ENetCallbacks;
-
-/** @defgroup callbacks ENet internal callbacks
- @{
- @ingroup private
-*/
-extern void * enet_malloc (size_t);
-extern void enet_free (void *);
-
-/** @} */
-
-#endif /* __ENET_CALLBACKS_H__ */
-
diff --git a/src/enet/enet.h b/src/enet/enet.h
deleted file mode 100644
index c22a417..0000000
--- a/src/enet/enet.h
+++ /dev/null
@@ -1,607 +0,0 @@
-/**
- @file enet.h
- @brief ENet public header file
-*/
-#ifndef __ENET_ENET_H__
-#define __ENET_ENET_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#include
-
-#ifdef _WIN32
-#include "enet/win32.h"
-#else
-#include "enet/unix.h"
-#endif
-
-#include "enet/types.h"
-#include "enet/protocol.h"
-#include "enet/list.h"
-#include "enet/callbacks.h"
-
-#define ENET_VERSION_MAJOR 1
-#define ENET_VERSION_MINOR 3
-#define ENET_VERSION_PATCH 14
-#define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch))
-#define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF)
-#define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF)
-#define ENET_VERSION_GET_PATCH(version) ((version)&0xFF)
-#define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH)
-
-typedef enet_uint32 ENetVersion;
-
-struct _ENetHost;
-struct _ENetEvent;
-struct _ENetPacket;
-
-typedef enum _ENetSocketType
-{
- ENET_SOCKET_TYPE_STREAM = 1,
- ENET_SOCKET_TYPE_DATAGRAM = 2
-} ENetSocketType;
-
-typedef enum _ENetSocketWait
-{
- ENET_SOCKET_WAIT_NONE = 0,
- ENET_SOCKET_WAIT_SEND = (1 << 0),
- ENET_SOCKET_WAIT_RECEIVE = (1 << 1),
- ENET_SOCKET_WAIT_INTERRUPT = (1 << 2)
-} ENetSocketWait;
-
-typedef enum _ENetSocketOption
-{
- ENET_SOCKOPT_NONBLOCK = 1,
- ENET_SOCKOPT_BROADCAST = 2,
- ENET_SOCKOPT_RCVBUF = 3,
- ENET_SOCKOPT_SNDBUF = 4,
- ENET_SOCKOPT_REUSEADDR = 5,
- ENET_SOCKOPT_RCVTIMEO = 6,
- ENET_SOCKOPT_SNDTIMEO = 7,
- ENET_SOCKOPT_ERROR = 8,
- ENET_SOCKOPT_NODELAY = 9
-} ENetSocketOption;
-
-typedef enum _ENetSocketShutdown
-{
- ENET_SOCKET_SHUTDOWN_READ = 0,
- ENET_SOCKET_SHUTDOWN_WRITE = 1,
- ENET_SOCKET_SHUTDOWN_READ_WRITE = 2
-} ENetSocketShutdown;
-
-#define ENET_HOST_ANY 0
-#define ENET_HOST_BROADCAST 0xFFFFFFFFU
-#define ENET_PORT_ANY 0
-
-/**
- * Portable internet address structure.
- *
- * The host must be specified in network byte-order, and the port must be in host
- * byte-order. The constant ENET_HOST_ANY may be used to specify the default
- * server host. The constant ENET_HOST_BROADCAST may be used to specify the
- * broadcast address (255.255.255.255). This makes sense for enet_host_connect,
- * but not for enet_host_create. Once a server responds to a broadcast, the
- * address is updated from ENET_HOST_BROADCAST to the server's actual IP address.
- */
-typedef struct _ENetAddress
-{
- enet_uint32 host;
- enet_uint16 port;
-} ENetAddress;
-
-/**
- * Packet flag bit constants.
- *
- * The host must be specified in network byte-order, and the port must be in
- * host byte-order. The constant ENET_HOST_ANY may be used to specify the
- * default server host.
-
- @sa ENetPacket
-*/
-typedef enum _ENetPacketFlag
-{
- /** packet must be received by the target peer and resend attempts should be
- * made until the packet is delivered */
- ENET_PACKET_FLAG_RELIABLE = (1 << 0),
- /** packet will not be sequenced with other packets
- * not supported for reliable packets
- */
- ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1),
- /** packet will not allocate data, and user must supply it instead */
- ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2),
- /** packet will be fragmented using unreliable (instead of reliable) sends
- * if it exceeds the MTU */
- ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3),
-
- /** whether the packet has been sent from all queues it has been entered into */
- ENET_PACKET_FLAG_SENT = (1<<8)
-} ENetPacketFlag;
-
-typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *);
-
-/**
- * ENet packet structure.
- *
- * An ENet data packet that may be sent to or received from a peer. The shown
- * fields should only be read and never modified. The data field contains the
- * allocated data for the packet. The dataLength fields specifies the length
- * of the allocated data. The flags field is either 0 (specifying no flags),
- * or a bitwise-or of any combination of the following flags:
- *
- * ENET_PACKET_FLAG_RELIABLE - packet must be received by the target peer
- * and resend attempts should be made until the packet is delivered
- *
- * ENET_PACKET_FLAG_UNSEQUENCED - packet will not be sequenced with other packets
- * (not supported for reliable packets)
- *
- * ENET_PACKET_FLAG_NO_ALLOCATE - packet will not allocate data, and user must supply it instead
- *
- * ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT - packet will be fragmented using unreliable
- * (instead of reliable) sends if it exceeds the MTU
- *
- * ENET_PACKET_FLAG_SENT - whether the packet has been sent from all queues it has been entered into
- @sa ENetPacketFlag
- */
-typedef struct _ENetPacket
-{
- size_t referenceCount; /**< internal use only */
- enet_uint32 flags; /**< bitwise-or of ENetPacketFlag constants */
- enet_uint8 * data; /**< allocated data for packet */
- size_t dataLength; /**< length of data */
- ENetPacketFreeCallback freeCallback; /**< function to be called when the packet is no longer in use */
- void * userData; /**< application private data, may be freely modified */
-} ENetPacket;
-
-typedef struct _ENetAcknowledgement
-{
- ENetListNode acknowledgementList;
- enet_uint32 sentTime;
- ENetProtocol command;
-} ENetAcknowledgement;
-
-typedef struct _ENetOutgoingCommand
-{
- ENetListNode outgoingCommandList;
- enet_uint16 reliableSequenceNumber;
- enet_uint16 unreliableSequenceNumber;
- enet_uint32 sentTime;
- enet_uint32 roundTripTimeout;
- enet_uint32 roundTripTimeoutLimit;
- enet_uint32 fragmentOffset;
- enet_uint16 fragmentLength;
- enet_uint16 sendAttempts;
- ENetProtocol command;
- ENetPacket * packet;
-} ENetOutgoingCommand;
-
-typedef struct _ENetIncomingCommand
-{
- ENetListNode incomingCommandList;
- enet_uint16 reliableSequenceNumber;
- enet_uint16 unreliableSequenceNumber;
- ENetProtocol command;
- enet_uint32 fragmentCount;
- enet_uint32 fragmentsRemaining;
- enet_uint32 * fragments;
- ENetPacket * packet;
-} ENetIncomingCommand;
-
-typedef enum _ENetPeerState
-{
- ENET_PEER_STATE_DISCONNECTED = 0,
- ENET_PEER_STATE_CONNECTING = 1,
- ENET_PEER_STATE_ACKNOWLEDGING_CONNECT = 2,
- ENET_PEER_STATE_CONNECTION_PENDING = 3,
- ENET_PEER_STATE_CONNECTION_SUCCEEDED = 4,
- ENET_PEER_STATE_CONNECTED = 5,
- ENET_PEER_STATE_DISCONNECT_LATER = 6,
- ENET_PEER_STATE_DISCONNECTING = 7,
- ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT = 8,
- ENET_PEER_STATE_ZOMBIE = 9
-} ENetPeerState;
-
-#ifndef ENET_BUFFER_MAXIMUM
-#define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS)
-#endif
-
-enum
-{
- ENET_HOST_RECEIVE_BUFFER_SIZE = 256 * 1024,
- ENET_HOST_SEND_BUFFER_SIZE = 256 * 1024,
- ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL = 1000,
- ENET_HOST_DEFAULT_MTU = 1400,
- ENET_HOST_DEFAULT_MAXIMUM_PACKET_SIZE = 32 * 1024 * 1024,
- ENET_HOST_DEFAULT_MAXIMUM_WAITING_DATA = 32 * 1024 * 1024,
-
- ENET_PEER_DEFAULT_ROUND_TRIP_TIME = 500,
- ENET_PEER_DEFAULT_PACKET_THROTTLE = 32,
- ENET_PEER_PACKET_THROTTLE_SCALE = 32,
- ENET_PEER_PACKET_THROTTLE_COUNTER = 7,
- ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2,
- ENET_PEER_PACKET_THROTTLE_DECELERATION = 2,
- ENET_PEER_PACKET_THROTTLE_INTERVAL = 5000,
- ENET_PEER_PACKET_LOSS_SCALE = (1 << 16),
- ENET_PEER_PACKET_LOSS_INTERVAL = 10000,
- ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024,
- ENET_PEER_TIMEOUT_LIMIT = 32,
- ENET_PEER_TIMEOUT_MINIMUM = 5000,
- ENET_PEER_TIMEOUT_MAXIMUM = 30000,
- ENET_PEER_PING_INTERVAL = 500,
- ENET_PEER_UNSEQUENCED_WINDOWS = 64,
- ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024,
- ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32,
- ENET_PEER_RELIABLE_WINDOWS = 16,
- ENET_PEER_RELIABLE_WINDOW_SIZE = 0x1000,
- ENET_PEER_FREE_RELIABLE_WINDOWS = 8
-};
-
-typedef struct _ENetChannel
-{
- enet_uint16 outgoingReliableSequenceNumber;
- enet_uint16 outgoingUnreliableSequenceNumber;
- enet_uint16 usedReliableWindows;
- enet_uint16 reliableWindows [ENET_PEER_RELIABLE_WINDOWS];
- enet_uint16 incomingReliableSequenceNumber;
- enet_uint16 incomingUnreliableSequenceNumber;
- ENetList incomingReliableCommands;
- ENetList incomingUnreliableCommands;
-} ENetChannel;
-
-/**
- * An ENet peer which data packets may be sent or received from.
- *
- * No fields should be modified unless otherwise specified.
- */
-typedef struct _ENetPeer
-{
- ENetListNode dispatchList;
- struct _ENetHost * host;
- enet_uint16 outgoingPeerID;
- enet_uint16 incomingPeerID;
- enet_uint32 connectID;
- enet_uint8 outgoingSessionID;
- enet_uint8 incomingSessionID;
- ENetAddress address; /**< Internet address of the peer */
- void * data; /**< Application private data, may be freely modified */
- ENetPeerState state;
- ENetChannel * channels;
- size_t channelCount; /**< Number of channels allocated for communication with peer */
- enet_uint32 incomingBandwidth; /**< Downstream bandwidth of the client in bytes/second */
- enet_uint32 outgoingBandwidth; /**< Upstream bandwidth of the client in bytes/second */
- enet_uint32 incomingBandwidthThrottleEpoch;
- enet_uint32 outgoingBandwidthThrottleEpoch;
- enet_uint32 incomingDataTotal;
- enet_uint32 outgoingDataTotal;
- enet_uint32 lastSendTime;
- enet_uint32 lastReceiveTime;
- enet_uint32 nextTimeout;
- enet_uint32 earliestTimeout;
- enet_uint32 packetLossEpoch;
- enet_uint32 packetsSent;
- enet_uint32 packetsLost;
- enet_uint32 packetLoss; /**< mean packet loss of reliable packets as a ratio with respect to the constant ENET_PEER_PACKET_LOSS_SCALE */
- enet_uint32 packetLossVariance;
- enet_uint32 packetThrottle;
- enet_uint32 packetThrottleLimit;
- enet_uint32 packetThrottleCounter;
- enet_uint32 packetThrottleEpoch;
- enet_uint32 packetThrottleAcceleration;
- enet_uint32 packetThrottleDeceleration;
- enet_uint32 packetThrottleInterval;
- enet_uint32 pingInterval;
- enet_uint32 timeoutLimit;
- enet_uint32 timeoutMinimum;
- enet_uint32 timeoutMaximum;
- enet_uint32 lastRoundTripTime;
- enet_uint32 lowestRoundTripTime;
- enet_uint32 lastRoundTripTimeVariance;
- enet_uint32 highestRoundTripTimeVariance;
- enet_uint32 roundTripTime; /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */
- enet_uint32 roundTripTimeVariance;
- enet_uint32 mtu;
- enet_uint32 windowSize;
- enet_uint32 reliableDataInTransit;
- enet_uint16 outgoingReliableSequenceNumber;
- ENetList acknowledgements;
- ENetList sentReliableCommands;
- ENetList sentUnreliableCommands;
- ENetList outgoingReliableCommands;
- ENetList outgoingUnreliableCommands;
- ENetList dispatchedCommands;
- int needsDispatch;
- enet_uint16 incomingUnsequencedGroup;
- enet_uint16 outgoingUnsequencedGroup;
- enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32];
- enet_uint32 eventData;
- size_t totalWaitingData;
-} ENetPeer;
-
-/** An ENet packet compressor for compressing UDP packets before socket sends or receives.
- */
-typedef struct _ENetCompressor
-{
- /** Context data for the compressor. Must be non-NULL. */
- void * context;
- /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */
- size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit);
- /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */
- size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit);
- /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */
- void (ENET_CALLBACK * destroy) (void * context);
-} ENetCompressor;
-
-/** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */
-typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount);
-
-/** Callback for intercepting received raw UDP packets. Should return 1 to intercept, 0 to ignore, or -1 to propagate an error. */
-typedef int (ENET_CALLBACK * ENetInterceptCallback) (struct _ENetHost * host, struct _ENetEvent * event);
-
-/** An ENet host for communicating with peers.
- *
- * No fields should be modified unless otherwise stated.
-
- @sa enet_host_create()
- @sa enet_host_destroy()
- @sa enet_host_connect()
- @sa enet_host_service()
- @sa enet_host_flush()
- @sa enet_host_broadcast()
- @sa enet_host_compress()
- @sa enet_host_compress_with_range_coder()
- @sa enet_host_channel_limit()
- @sa enet_host_bandwidth_limit()
- @sa enet_host_bandwidth_throttle()
- */
-typedef struct _ENetHost
-{
- ENetSocket socket;
- ENetAddress address; /**< Internet address of the host */
- enet_uint32 incomingBandwidth; /**< downstream bandwidth of the host */
- enet_uint32 outgoingBandwidth; /**< upstream bandwidth of the host */
- enet_uint32 bandwidthThrottleEpoch;
- enet_uint32 mtu;
- enet_uint32 randomSeed;
- int recalculateBandwidthLimits;
- ENetPeer * peers; /**< array of peers allocated for this host */
- size_t peerCount; /**< number of peers allocated for this host */
- size_t channelLimit; /**< maximum number of channels allowed for connected peers */
- enet_uint32 serviceTime;
- ENetList dispatchQueue;
- int continueSending;
- size_t packetSize;
- enet_uint16 headerFlags;
- ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS];
- size_t commandCount;
- ENetBuffer buffers [ENET_BUFFER_MAXIMUM];
- size_t bufferCount;
- ENetChecksumCallback checksum; /**< callback the user can set to enable packet checksums for this host */
- ENetCompressor compressor;
- enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU];
- ENetAddress receivedAddress;
- enet_uint8 * receivedData;
- size_t receivedDataLength;
- enet_uint32 totalSentData; /**< total data sent, user should reset to 0 as needed to prevent overflow */
- enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */
- enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */
- enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */
- ENetInterceptCallback intercept; /**< callback the user can set to intercept received raw UDP packets */
- size_t connectedPeers;
- size_t bandwidthLimitedPeers;
- size_t duplicatePeers; /**< optional number of allowed peers from duplicate IPs, defaults to ENET_PROTOCOL_MAXIMUM_PEER_ID */
- size_t maximumPacketSize; /**< the maximum allowable packet size that may be sent or received on a peer */
- size_t maximumWaitingData; /**< the maximum aggregate amount of buffer space a peer may use waiting for packets to be delivered */
-} ENetHost;
-
-/**
- * An ENet event type, as specified in @ref ENetEvent.
- */
-typedef enum _ENetEventType
-{
- /** no event occurred within the specified time limit */
- ENET_EVENT_TYPE_NONE = 0,
-
- /** a connection request initiated by enet_host_connect has completed.
- * The peer field contains the peer which successfully connected.
- */
- ENET_EVENT_TYPE_CONNECT = 1,
-
- /** a peer has disconnected. This event is generated on a successful
- * completion of a disconnect initiated by enet_peer_disconnect, if
- * a peer has timed out, or if a connection request intialized by
- * enet_host_connect has timed out. The peer field contains the peer
- * which disconnected. The data field contains user supplied data
- * describing the disconnection, or 0, if none is available.
- */
- ENET_EVENT_TYPE_DISCONNECT = 2,
-
- /** a packet has been received from a peer. The peer field specifies the
- * peer which sent the packet. The channelID field specifies the channel
- * number upon which the packet was received. The packet field contains
- * the packet that was received; this packet must be destroyed with
- * enet_packet_destroy after use.
- */
- ENET_EVENT_TYPE_RECEIVE = 3
-} ENetEventType;
-
-/**
- * An ENet event as returned by enet_host_service().
-
- @sa enet_host_service
- */
-typedef struct _ENetEvent
-{
- ENetEventType type; /**< type of the event */
- ENetPeer * peer; /**< peer that generated a connect, disconnect or receive event */
- enet_uint8 channelID; /**< channel on the peer that generated the event, if appropriate */
- enet_uint32 data; /**< data associated with the event, if appropriate */
- ENetPacket * packet; /**< packet associated with the event, if appropriate */
-} ENetEvent;
-
-/** @defgroup global ENet global functions
- @{
-*/
-
-/**
- Initializes ENet globally. Must be called prior to using any functions in
- ENet.
- @returns 0 on success, < 0 on failure
-*/
-ENET_API int enet_initialize (void);
-
-/**
- Initializes ENet globally and supplies user-overridden callbacks. Must be called prior to using any functions in ENet. Do not use enet_initialize() if you use this variant. Make sure the ENetCallbacks structure is zeroed out so that any additional callbacks added in future versions will be properly ignored.
-
- @param version the constant ENET_VERSION should be supplied so ENet knows which version of ENetCallbacks struct to use
- @param inits user-overridden callbacks where any NULL callbacks will use ENet's defaults
- @returns 0 on success, < 0 on failure
-*/
-ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits);
-
-/**
- Shuts down ENet globally. Should be called when a program that has
- initialized ENet exits.
-*/
-ENET_API void enet_deinitialize (void);
-
-/**
- Gives the linked version of the ENet library.
- @returns the version number
-*/
-ENET_API ENetVersion enet_linked_version (void);
-
-/** @} */
-
-/** @defgroup private ENet private implementation functions */
-
-/**
- Returns the wall-time in milliseconds. Its initial value is unspecified
- unless otherwise set.
- */
-ENET_API enet_uint32 enet_time_get (void);
-/**
- Sets the current wall-time in milliseconds.
- */
-ENET_API void enet_time_set (enet_uint32);
-
-/** @defgroup socket ENet socket functions
- @{
-*/
-ENET_API ENetSocket enet_socket_create (ENetSocketType);
-ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *);
-ENET_API int enet_socket_get_address (ENetSocket, ENetAddress *);
-ENET_API int enet_socket_listen (ENetSocket, int);
-ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
-ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *);
-ENET_API int enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
-ENET_API int enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
-ENET_API int enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
-ENET_API int enet_socket_set_option (ENetSocket, ENetSocketOption, int);
-ENET_API int enet_socket_get_option (ENetSocket, ENetSocketOption, int *);
-ENET_API int enet_socket_shutdown (ENetSocket, ENetSocketShutdown);
-ENET_API void enet_socket_destroy (ENetSocket);
-ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32);
-
-/** @} */
-
-/** @defgroup Address ENet address functions
- @{
-*/
-
-/** Attempts to parse the printable form of the IP address in the parameter hostName
- and sets the host field in the address parameter if successful.
- @param address destination to store the parsed IP address
- @param hostName IP address to parse
- @retval 0 on success
- @retval < 0 on failure
- @returns the address of the given hostName in address on success
-*/
-ENET_API int enet_address_set_host_ip (ENetAddress * address, const char * hostName);
-
-/** Attempts to resolve the host named by the parameter hostName and sets
- the host field in the address parameter if successful.
- @param address destination to store resolved address
- @param hostName host name to lookup
- @retval 0 on success
- @retval < 0 on failure
- @returns the address of the given hostName in address on success
-*/
-ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName);
-
-/** Gives the printable form of the IP address specified in the address parameter.
- @param address address printed
- @param hostName destination for name, must not be NULL
- @param nameLength maximum length of hostName.
- @returns the null-terminated name of the host in hostName on success
- @retval 0 on success
- @retval < 0 on failure
-*/
-ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength);
-
-/** Attempts to do a reverse lookup of the host field in the address parameter.
- @param address address used for reverse lookup
- @param hostName destination for name, must not be NULL
- @param nameLength maximum length of hostName.
- @returns the null-terminated name of the host in hostName on success
- @retval 0 on success
- @retval < 0 on failure
-*/
-ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength);
-
-/** @} */
-
-ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32);
-ENET_API void enet_packet_destroy (ENetPacket *);
-ENET_API int enet_packet_resize (ENetPacket *, size_t);
-ENET_API enet_uint32 enet_crc32 (const ENetBuffer *, size_t);
-
-ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32);
-ENET_API void enet_host_destroy (ENetHost *);
-ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32);
-ENET_API int enet_host_check_events (ENetHost *, ENetEvent *);
-ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32);
-ENET_API void enet_host_flush (ENetHost *);
-ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *);
-ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *);
-ENET_API int enet_host_compress_with_range_coder (ENetHost * host);
-ENET_API void enet_host_channel_limit (ENetHost *, size_t);
-ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32);
-extern void enet_host_bandwidth_throttle (ENetHost *);
-extern enet_uint32 enet_host_random_seed (void);
-
-ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *);
-ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID);
-ENET_API void enet_peer_ping (ENetPeer *);
-ENET_API void enet_peer_ping_interval (ENetPeer *, enet_uint32);
-ENET_API void enet_peer_timeout (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);
-ENET_API void enet_peer_reset (ENetPeer *);
-ENET_API void enet_peer_disconnect (ENetPeer *, enet_uint32);
-ENET_API void enet_peer_disconnect_now (ENetPeer *, enet_uint32);
-ENET_API void enet_peer_disconnect_later (ENetPeer *, enet_uint32);
-ENET_API void enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);
-extern int enet_peer_throttle (ENetPeer *, enet_uint32);
-extern void enet_peer_reset_queues (ENetPeer *);
-extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *);
-extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16);
-extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, const void *, size_t, enet_uint32, enet_uint32);
-extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16);
-extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *);
-extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *);
-extern void enet_peer_on_connect (ENetPeer *);
-extern void enet_peer_on_disconnect (ENetPeer *);
-
-ENET_API void * enet_range_coder_create (void);
-ENET_API void enet_range_coder_destroy (void *);
-ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t);
-ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t);
-
-extern size_t enet_protocol_command_size (enet_uint8);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ENET_ENET_H__ */
-
diff --git a/src/enet/list.h b/src/enet/list.h
deleted file mode 100644
index f4ea53a..0000000
--- a/src/enet/list.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- @file list.h
- @brief ENet list management
-*/
-#ifndef __ENET_LIST_H__
-#define __ENET_LIST_H__
-
-#include
-
-typedef struct _ENetListNode
-{
- struct _ENetListNode * next;
- struct _ENetListNode * previous;
-} ENetListNode;
-
-typedef ENetListNode * ENetListIterator;
-
-typedef struct _ENetList
-{
- ENetListNode sentinel;
-} ENetList;
-
-extern void enet_list_clear (ENetList *);
-
-extern ENetListIterator enet_list_insert (ENetListIterator, void *);
-extern void * enet_list_remove (ENetListIterator);
-extern ENetListIterator enet_list_move (ENetListIterator, void *, void *);
-
-extern size_t enet_list_size (ENetList *);
-
-#define enet_list_begin(list) ((list) -> sentinel.next)
-#define enet_list_end(list) (& (list) -> sentinel)
-
-#define enet_list_empty(list) (enet_list_begin (list) == enet_list_end (list))
-
-#define enet_list_next(iterator) ((iterator) -> next)
-#define enet_list_previous(iterator) ((iterator) -> previous)
-
-#define enet_list_front(list) ((void *) (list) -> sentinel.next)
-#define enet_list_back(list) ((void *) (list) -> sentinel.previous)
-
-#endif /* __ENET_LIST_H__ */
-
diff --git a/src/enet/protocol.h b/src/enet/protocol.h
deleted file mode 100644
index 434fd47..0000000
--- a/src/enet/protocol.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- @file protocol.h
- @brief ENet protocol
-*/
-#ifndef __ENET_PROTOCOL_H__
-#define __ENET_PROTOCOL_H__
-
-#include "enet/types.h"
-
-enum
-{
- ENET_PROTOCOL_MINIMUM_MTU = 576,
- ENET_PROTOCOL_MAXIMUM_MTU = 4096,
- ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS = 32,
- ENET_PROTOCOL_MINIMUM_WINDOW_SIZE = 4096,
- ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE = 65536,
- ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT = 1,
- ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT = 255,
- ENET_PROTOCOL_MAXIMUM_PEER_ID = 0xFFF,
- ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT = 1024 * 1024
-};
-
-typedef enum _ENetProtocolCommand
-{
- ENET_PROTOCOL_COMMAND_NONE = 0,
- ENET_PROTOCOL_COMMAND_ACKNOWLEDGE = 1,
- ENET_PROTOCOL_COMMAND_CONNECT = 2,
- ENET_PROTOCOL_COMMAND_VERIFY_CONNECT = 3,
- ENET_PROTOCOL_COMMAND_DISCONNECT = 4,
- ENET_PROTOCOL_COMMAND_PING = 5,
- ENET_PROTOCOL_COMMAND_SEND_RELIABLE = 6,
- ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE = 7,
- ENET_PROTOCOL_COMMAND_SEND_FRAGMENT = 8,
- ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED = 9,
- ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT = 10,
- ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE = 11,
- ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT = 12,
- ENET_PROTOCOL_COMMAND_COUNT = 13,
-
- ENET_PROTOCOL_COMMAND_MASK = 0x0F
-} ENetProtocolCommand;
-
-typedef enum _ENetProtocolFlag
-{
- ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7),
- ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6),
-
- ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14),
- ENET_PROTOCOL_HEADER_FLAG_SENT_TIME = (1 << 15),
- ENET_PROTOCOL_HEADER_FLAG_MASK = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME,
-
- ENET_PROTOCOL_HEADER_SESSION_MASK = (3 << 12),
- ENET_PROTOCOL_HEADER_SESSION_SHIFT = 12
-} ENetProtocolFlag;
-
-#ifdef _MSC_VER
-#pragma pack(push, 1)
-#define ENET_PACKED
-#elif defined(__GNUC__) || defined(__clang__)
-#define ENET_PACKED __attribute__ ((packed))
-#else
-#define ENET_PACKED
-#endif
-
-typedef struct _ENetProtocolHeader
-{
- enet_uint16 peerID;
- enet_uint16 sentTime;
-} ENET_PACKED ENetProtocolHeader;
-
-typedef struct _ENetProtocolCommandHeader
-{
- enet_uint8 command;
- enet_uint8 channelID;
- enet_uint16 reliableSequenceNumber;
-} ENET_PACKED ENetProtocolCommandHeader;
-
-typedef struct _ENetProtocolAcknowledge
-{
- ENetProtocolCommandHeader header;
- enet_uint16 receivedReliableSequenceNumber;
- enet_uint16 receivedSentTime;
-} ENET_PACKED ENetProtocolAcknowledge;
-
-typedef struct _ENetProtocolConnect
-{
- ENetProtocolCommandHeader header;
- enet_uint16 outgoingPeerID;
- enet_uint8 incomingSessionID;
- enet_uint8 outgoingSessionID;
- enet_uint32 mtu;
- enet_uint32 windowSize;
- enet_uint32 channelCount;
- enet_uint32 incomingBandwidth;
- enet_uint32 outgoingBandwidth;
- enet_uint32 packetThrottleInterval;
- enet_uint32 packetThrottleAcceleration;
- enet_uint32 packetThrottleDeceleration;
- enet_uint32 connectID;
- enet_uint32 data;
-} ENET_PACKED ENetProtocolConnect;
-
-typedef struct _ENetProtocolVerifyConnect
-{
- ENetProtocolCommandHeader header;
- enet_uint16 outgoingPeerID;
- enet_uint8 incomingSessionID;
- enet_uint8 outgoingSessionID;
- enet_uint32 mtu;
- enet_uint32 windowSize;
- enet_uint32 channelCount;
- enet_uint32 incomingBandwidth;
- enet_uint32 outgoingBandwidth;
- enet_uint32 packetThrottleInterval;
- enet_uint32 packetThrottleAcceleration;
- enet_uint32 packetThrottleDeceleration;
- enet_uint32 connectID;
-} ENET_PACKED ENetProtocolVerifyConnect;
-
-typedef struct _ENetProtocolBandwidthLimit
-{
- ENetProtocolCommandHeader header;
- enet_uint32 incomingBandwidth;
- enet_uint32 outgoingBandwidth;
-} ENET_PACKED ENetProtocolBandwidthLimit;
-
-typedef struct _ENetProtocolThrottleConfigure
-{
- ENetProtocolCommandHeader header;
- enet_uint32 packetThrottleInterval;
- enet_uint32 packetThrottleAcceleration;
- enet_uint32 packetThrottleDeceleration;
-} ENET_PACKED ENetProtocolThrottleConfigure;
-
-typedef struct _ENetProtocolDisconnect
-{
- ENetProtocolCommandHeader header;
- enet_uint32 data;
-} ENET_PACKED ENetProtocolDisconnect;
-
-typedef struct _ENetProtocolPing
-{
- ENetProtocolCommandHeader header;
-} ENET_PACKED ENetProtocolPing;
-
-typedef struct _ENetProtocolSendReliable
-{
- ENetProtocolCommandHeader header;
- enet_uint16 dataLength;
-} ENET_PACKED ENetProtocolSendReliable;
-
-typedef struct _ENetProtocolSendUnreliable
-{
- ENetProtocolCommandHeader header;
- enet_uint16 unreliableSequenceNumber;
- enet_uint16 dataLength;
-} ENET_PACKED ENetProtocolSendUnreliable;
-
-typedef struct _ENetProtocolSendUnsequenced
-{
- ENetProtocolCommandHeader header;
- enet_uint16 unsequencedGroup;
- enet_uint16 dataLength;
-} ENET_PACKED ENetProtocolSendUnsequenced;
-
-typedef struct _ENetProtocolSendFragment
-{
- ENetProtocolCommandHeader header;
- enet_uint16 startSequenceNumber;
- enet_uint16 dataLength;
- enet_uint32 fragmentCount;
- enet_uint32 fragmentNumber;
- enet_uint32 totalLength;
- enet_uint32 fragmentOffset;
-} ENET_PACKED ENetProtocolSendFragment;
-
-typedef union _ENetProtocol
-{
- ENetProtocolCommandHeader header;
- ENetProtocolAcknowledge acknowledge;
- ENetProtocolConnect connect;
- ENetProtocolVerifyConnect verifyConnect;
- ENetProtocolDisconnect disconnect;
- ENetProtocolPing ping;
- ENetProtocolSendReliable sendReliable;
- ENetProtocolSendUnreliable sendUnreliable;
- ENetProtocolSendUnsequenced sendUnsequenced;
- ENetProtocolSendFragment sendFragment;
- ENetProtocolBandwidthLimit bandwidthLimit;
- ENetProtocolThrottleConfigure throttleConfigure;
-} ENET_PACKED ENetProtocol;
-
-#ifdef _MSC_VER
-#pragma pack(pop)
-#endif
-
-#endif /* __ENET_PROTOCOL_H__ */
-
diff --git a/src/enet/time.h b/src/enet/time.h
deleted file mode 100644
index 46539af..0000000
--- a/src/enet/time.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- @file time.h
- @brief ENet time constants and macros
-*/
-#ifndef __ENET_TIME_H__
-#define __ENET_TIME_H__
-
-#define ENET_TIME_OVERFLOW 86400000
-
-#define ENET_TIME_LESS(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW)
-#define ENET_TIME_GREATER(a, b) ((b) - (a) >= ENET_TIME_OVERFLOW)
-#define ENET_TIME_LESS_EQUAL(a, b) (! ENET_TIME_GREATER (a, b))
-#define ENET_TIME_GREATER_EQUAL(a, b) (! ENET_TIME_LESS (a, b))
-
-#define ENET_TIME_DIFFERENCE(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW ? (b) - (a) : (a) - (b))
-
-#endif /* __ENET_TIME_H__ */
-
diff --git a/src/enet/types.h b/src/enet/types.h
deleted file mode 100644
index eab0603..0000000
--- a/src/enet/types.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- @file types.h
- @brief type definitions for ENet
-*/
-#ifndef __ENET_TYPES_H__
-#define __ENET_TYPES_H__
-
-typedef unsigned char enet_uint8; /**< unsigned 8-bit type */
-typedef unsigned short enet_uint16; /**< unsigned 16-bit type */
-typedef unsigned int enet_uint32; /**< unsigned 32-bit type */
-
-#endif /* __ENET_TYPES_H__ */
-
diff --git a/src/enet/unix.h b/src/enet/unix.h
deleted file mode 100644
index 93a67f6..0000000
--- a/src/enet/unix.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- @file unix.h
- @brief ENet Unix header
-*/
-#ifndef __ENET_UNIX_H__
-#define __ENET_UNIX_H__
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#ifdef MSG_MAXIOVLEN
-#define ENET_BUFFER_MAXIMUM MSG_MAXIOVLEN
-#endif
-
-typedef int ENetSocket;
-
-#define ENET_SOCKET_NULL -1
-
-#define ENET_HOST_TO_NET_16(value) (htons (value)) /**< macro that converts host to net byte-order of a 16-bit value */
-#define ENET_HOST_TO_NET_32(value) (htonl (value)) /**< macro that converts host to net byte-order of a 32-bit value */
-
-#define ENET_NET_TO_HOST_16(value) (ntohs (value)) /**< macro that converts net to host byte-order of a 16-bit value */
-#define ENET_NET_TO_HOST_32(value) (ntohl (value)) /**< macro that converts net to host byte-order of a 32-bit value */
-
-typedef struct
-{
- void * data;
- size_t dataLength;
-} ENetBuffer;
-
-#define ENET_CALLBACK
-
-#define ENET_API extern
-
-typedef fd_set ENetSocketSet;
-
-#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset))
-#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset))
-#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset))
-#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset))
-
-#endif /* __ENET_UNIX_H__ */
-
diff --git a/src/enet/utility.h b/src/enet/utility.h
deleted file mode 100644
index 6f7f473..0000000
--- a/src/enet/utility.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- @file utility.h
- @brief ENet utility header
-*/
-#ifndef __ENET_UTILITY_H__
-#define __ENET_UTILITY_H__
-
-#define ENET_MAX(x, y) ((x) > (y) ? (x) : (y))
-#define ENET_MIN(x, y) ((x) < (y) ? (x) : (y))
-
-#endif /* __ENET_UTILITY_H__ */
-
diff --git a/src/enet/win32.h b/src/enet/win32.h
deleted file mode 100644
index 5b2be16..0000000
--- a/src/enet/win32.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- @file win32.h
- @brief ENet Win32 header
-*/
-#ifndef __ENET_WIN32_H__
-#define __ENET_WIN32_H__
-
-#ifdef _MSC_VER
-#ifdef ENET_BUILDING_LIB
-#pragma warning (disable: 4267) // size_t to int conversion
-#pragma warning (disable: 4244) // 64bit to 32bit int
-#pragma warning (disable: 4018) // signed/unsigned mismatch
-#pragma warning (disable: 4146) // unary minus operator applied to unsigned type
-#endif
-#endif
-
-#include
-#include
-
-typedef SOCKET ENetSocket;
-
-#define ENET_SOCKET_NULL INVALID_SOCKET
-
-#define ENET_HOST_TO_NET_16(value) (htons (value))
-#define ENET_HOST_TO_NET_32(value) (htonl (value))
-
-#define ENET_NET_TO_HOST_16(value) (ntohs (value))
-#define ENET_NET_TO_HOST_32(value) (ntohl (value))
-
-typedef struct
-{
- size_t dataLength;
- void * data;
-} ENetBuffer;
-
-#define ENET_CALLBACK __cdecl
-
-#ifdef ENET_DLL
-#ifdef ENET_BUILDING_LIB
-#define ENET_API __declspec( dllexport )
-#else
-#define ENET_API __declspec( dllimport )
-#endif /* ENET_BUILDING_LIB */
-#else /* !ENET_DLL */
-#define ENET_API extern
-#endif /* ENET_DLL */
-
-typedef fd_set ENetSocketSet;
-
-#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset))
-#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset))
-#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLR (socket, & (sockset))
-#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset))
-
-#endif /* __ENET_WIN32_H__ */
-
-
diff --git a/src/logger.cpp b/src/logger.cpp
deleted file mode 100644
index 2947d13..0000000
--- a/src/logger.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// Created by jojos38 on 28.01.2020.
-//
-
-
-#include "logger.h"
-using namespace std;
-
-int loggerlevel;
-
-void setLoggerLevel(char level_string[]) {
- if (!strcmp(level_string, "ALL"))
- loggerlevel = 0;
-
- if (!strcmp(level_string, "DEBUG"))
- loggerlevel = 1;
-
- if (!strcmp(level_string, "INFO"))
- loggerlevel = 2;
-
- if (!strcmp(level_string, "WARN"))
- loggerlevel = 3;
-
- if (!strcmp(level_string, "ERROR"))
- loggerlevel = 4;
-
- if (!strcmp(level_string, "OFF"))
- loggerlevel = 5;
-}
-
-stringstream getDate() {
- // current date/time based on current system
- time_t now = time(0);
- tm* ltm = localtime(&now);
-
- int month = 1 + ltm->tm_mon;
- int day = ltm->tm_mday;
- int hours = 1 + ltm->tm_hour;
- int minutes = 1 + ltm->tm_min;
- int seconds = 1 + ltm->tm_sec;
-
- string month_string;
- if (month < 10) month_string = "0" + to_string(month);
- else month_string = to_string(month);
-
- string day_string;
- if (day < 10) day_string = "0" + to_string(day);
- else day_string = to_string(day);
-
- string hours_string;
- if (hours < 10) hours_string = "0" + to_string(hours);
- else hours_string = to_string(hours);
-
- string minutes_string;
- if (minutes < 10) minutes_string = "0" + to_string(minutes);
- else minutes_string = to_string(minutes);
-
- string seconds_string;
- if (seconds < 10) seconds_string = "0" + to_string(seconds);
- else seconds_string = to_string(seconds);
-
- std::stringstream date;
- date
- << "["
- << day_string << "/"
- << month_string << "/"
- << 1900 + ltm->tm_year << " "
- << hours_string << ":"
- << minutes_string << ":"
- << seconds_string
- << "] ";
- return date;
-}
-
-/*
-void info(char obj[]) {
- if (level <= 2)
- cout << getDate().str() << "\u001b[36m" << "[INFO]" << "\u001b[0m" << " " << obj << endl;
-}
-
-void error(char obj[]) {
- if (level <= 4)
- cout << getDate().str() << "\x1B[31m" << "[ERRO]" << "\u001b[0m" << " " << obj << endl;
-}
-
-void warn(char obj[]) {
- if (level <= 3)
- cout << getDate().str() << "\u001b[33m" << "[WARN]" << "\u001b[0m" << " " << obj << endl;
-}
-
-void debug(char obj[]) {
- if (level <= 1)
- cout << getDate().str() << "\u001b[35m" << "[DBUG]" << "\u001b[0m" << " " << obj << endl;
-}*/
\ No newline at end of file
diff --git a/src/logger.h b/src/logger.h
deleted file mode 100644
index 0df8c2b..0000000
--- a/src/logger.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Created by jojos38 on 28.01.2020.
-//
-
-#ifndef LOGGER_H
-#define LOGGER_H
-
-#include
-#include
-#include
-#include
-using namespace std;
-
-extern int loggerlevel;
-stringstream getDate();
-void setLoggerLevel(char level_string[]);
-
-template
-void info(const T& toPrint) {
- if (loggerlevel <= 2)
- cout << getDate().str() << "[INFO] " << toPrint << endl;
-}
-template
-void error(const T& toPrint) {
- if (loggerlevel <= 4)
- cout << getDate().str() "[ERRO] " << toPrint << endl;
-}
-
-template
-void warn(const T& toPrint) {
- if (loggerlevel <= 3)
- cout << getDate().str() << "[WARN] " << toPrint << endl;
-}
-
-template
-void debug(const T& toPrint) {
- if (loggerlevel <= 1)
- cout << getDate().str() << "[DBUG] " << toPrint << endl;
-}
-
-#endif // LOGGER_H
diff --git a/src/main.cpp b/src/main.cpp
deleted file mode 100644
index 7a3e4d3..0000000
--- a/src/main.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// Created by Anonymous275 on 28.01.2020.
-//
-
-#include "main.h"
-#include
-#include
-#include "enet/enet.h"
-#include "network.h"
-#include "logger.h"
-
-using namespace std; //nameSpace STD
-
-void DebugData();
-void ParseConfig();
-
-bool Debug = false;
-int Port = 30813;
-string MapName = "levels/gridmap/level.json";
-string ServerName = "BeamNG-MP FTW";
-
-//Entry
-int main() {
- ParseConfig();
- if(Debug){ //checks if debug is on
- DebugData(); //Prints Debug Data
- }
- setLoggerLevel("ALL");
- startRUDP("localhost", 30814);
-}
-
-
-void DebugData(){
- cout << "Debug : true" << "\n";
- cout << "Port : " << Port << "\n";
- cout << "MapName : " << MapName << "\n";
- cout << "ServerName : " << ServerName << "\n";
-}
-
-void SetMainValues(bool D, int P,string Name,string serverName){
- Debug = D;
- Port = P;
- MapName = Name;
- ServerName = serverName;
-}
-
diff --git a/src/main.h b/src/main.h
deleted file mode 100644
index e43af72..0000000
--- a/src/main.h
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// Created by Антон on 28.01.2020.
-//
-
-#ifndef BEAMNG_MP_SERVER_MAIN_H
-#define BEAMNG_MP_SERVER_MAIN_H
-
-class main {
-
-};
-
-#endif //BEAMNG_MP_SERVER_MAIN_H
diff --git a/src/network.cpp b/src/network.cpp
deleted file mode 100644
index f0fc9bb..0000000
--- a/src/network.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Created by jojos38 on 28.01.2020.
-//
-
-#include
-#include "network.h"
-#include "logger.h"
-using namespace std;
-#define EXIT_SUCCESS /*implementation defined*/
-#define EXIT_FAILURE /*implementation defined*/
-
-void listen();
-
-ENetAddress address;
-ENetHost* server;
-ENetEvent event;
-
-void startRUDP(char host[], int port) {
- // ---------- Initializing ENet ---------- //
- if (enet_initialize() != 0) {
- fprintf(stderr, "An error occurred while initializing ENet.\n");
- return EXIT_FAILURE;
- }
- atexit(enet_deinitialize);
- info("ENet initialized");
-
- // ---------- Starting server ---------- //
- enet_address_set_host(&address, host); // Set host
- address.port = port; // Set port
- server = enet_host_create(
- &address /* the address to bind the server host to */,
- 32 /* allow up to 32 clients and/or outgoing connections */,
- 2 /* allow up to 2 channels to be used, 0 and 1 */,
- 0 /* assume any amount of incoming bandwidth */,
- 0 /* assume any amount of outgoing bandwidth */);
- if (server == NULL) {
- fprintf(stderr, "An error occurred while trying to create an ENet server host.\n");
- return EXIT_FAILURE;
- }
- info("Server started");
- listen();
-}
-
-void listen() {
- info("Listening for packets...");
- while (true) {
- switch (event.type) {
- case ENET_EVENT_TYPE_CONNECT:
- printf("A new client connected from %x:%u.\n", event.peer->address.host, event.peer->address.port);
- /* Store any relevant client information here. */
- event.peer->data = "Client information";
- break;
- case ENET_EVENT_TYPE_RECEIVE:
- printf("A packet of length %u containing %s was received from %s on channel %u.\n",
- event.packet->dataLength,
- event.packet->data,
- event.peer->data,
- event.channelID);
- /* Clean up the packet now that we're done using it. */
- enet_packet_destroy(event.packet);
- break;
- case ENET_EVENT_TYPE_DISCONNECT:
- printf("%s disconnected.\n", event.peer->data);
- /* Reset the peer's client information. */
- event.peer->data = NULL;
- }
- }
-}
\ No newline at end of file
diff --git a/src/network.h b/src/network.h
deleted file mode 100644
index 53a7ecf..0000000
--- a/src/network.h
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// Created by jojos38 on 28.01.2020.
-//
-
-#ifndef NETWORK_H
-#define NETWORK_H
-
-#include "enet/enet.h"
-#pragma comment(lib,"ws2_32.lib")
-#pragma comment(lib,"winmm.lib")
-#pragma comment(lib,"enet.lib")
-
-void startRUDP(char host[], int port);
-
-#endif // NETWORK_H