+
+
+
Run Speed Test
+
fa-tachometer-alt
+ Start A Test
+
+
+
+
-
+
+
+
-
+
-
-
fa-tachometer-alt
- Run A Speed Test
diff --git a/client/src/main.js b/client/src/main.js
index 9c06b80..2ba0c26 100644
--- a/client/src/main.js
+++ b/client/src/main.js
@@ -6,6 +6,8 @@ import vuetify from "./plugins/vuetify";
import("./plugins/vueSocketIo");
+import { format } from "date-fns";
+
import "roboto-fontface/css/roboto/roboto-fontface.css";
import "@fortawesome/fontawesome-free/css/all.css";
@@ -15,6 +17,10 @@ Vue.filter("convertToMegabits", (bytes) => {
return formatted;
});
+Vue.filter("formatDateTime", (timestamp) => {
+ return format(new Date(timestamp), "MMM dd, yyyy hh:mm a");
+});
+
Vue.config.productionTip = false;
new Vue({
diff --git a/client/src/scss/variables.scss b/client/src/scss/variables.scss
new file mode 100644
index 0000000..fb232cb
--- /dev/null
+++ b/client/src/scss/variables.scss
@@ -0,0 +1,10 @@
+/*
+@import url("https://fonts.googleapis.com/css2?family=Shadows+Into+Light&display=swap");
+$body-font-family: "Shadows Into Light", cursive;
+*/
+
+// @import url("https://fonts.googleapis.com/css2?family=Permanent+Marker&display=swap");
+// $body-font-family: "Permanent Marker", cursive;
+
+@import url("https://fonts.googleapis.com/css2?family=Exo:wght@200;300;400;500;700&display=swap");
+$body-font-family: "Exo", sans-serif;
diff --git a/client/src/store/api/index.js b/client/src/store/api/index.js
new file mode 100644
index 0000000..712650b
--- /dev/null
+++ b/client/src/store/api/index.js
@@ -0,0 +1,66 @@
+import Vue from "vue";
+import Vuex from "vuex";
+Vue.use(Vuex);
+
+import { axiosClient } from "@/util/axios";
+
+import {
+ MAKE_API_CALL,
+ ADD_API_CALL,
+ REMOVE_API_CALL,
+} from "../store.constants";
+
+//import { USER_LOGOUT } from "@/components/User/store/actionTypes";
+
+const api = {
+ namespaced: true,
+ state: {
+ loading: false,
+ },
+ getters: {},
+ mutations: {
+ [ADD_API_CALL](state) {
+ state.loading++;
+ },
+ [REMOVE_API_CALL](state) {
+ state.loading--;
+ },
+ },
+ actions: {
+ async [MAKE_API_CALL]({ commit }, payload) {
+ const { headers, method, url, params, loading } = payload;
+
+ //commit the loading mutation for our indicator
+ if (loading) commit(loading, { loading: true }, { root: true });
+
+ let config = { headers, method, url: `${url}` };
+ //set params for request
+ if (method === "post") config.data = { ...params };
+ if (method === "get") config.params = { ...params };
+ if (method === "put") config.data = { ...params };
+
+ try {
+ commit(`${ADD_API_CALL}`);
+ return await axiosClient({
+ ...axiosClient.defaults,
+ ...config,
+ });
+ } catch (e) {
+ if (e.response.status === 401 || e.response.status === 403) {
+ if (this.$app.$router.history.current.name !== "Login")
+ this.$app.$router.push({ path: "login" });
+ this.$app.$toastr.e("You need to be logged in to continue.");
+ } else {
+ console.log(e);
+ if (e.message) this.$app.$toastr.e(e.message);
+ }
+ return false;
+ } finally {
+ commit(`${REMOVE_API_CALL}`);
+ if (loading) commit(loading, { loading: false }, { root: true });
+ }
+ },
+ },
+};
+
+export default api;
diff --git a/client/src/store/index.js b/client/src/store/index.js
index af6ae10..7e76390 100644
--- a/client/src/store/index.js
+++ b/client/src/store/index.js
@@ -3,7 +3,16 @@ import Vuex from "vuex";
Vue.use(Vuex);
+import api from "./api";
+import logs from "./logs";
+
+import { LOGS_FETCH_RECENT } from "@/store/store.constants.js";
+
export default new Vuex.Store({
+ modules: {
+ api,
+ logs,
+ },
state: {
socketStatus: false,
socketStatusMessage: false,
@@ -76,5 +85,9 @@ export default new Vuex.Store({
commit("clearSpeedTestResults");
this._vm.$socket.client.emit("startSpeedTest", { start: true });
},
+ socket_finishedSpeedtestEvent({ dispatch }) {
+ //commit("SOCKET_FINISHED_SPEEDTEST_EVENT", data);
+ dispatch(`logs/${LOGS_FETCH_RECENT}`);
+ },
},
});
diff --git a/client/src/store/logs/index.js b/client/src/store/logs/index.js
new file mode 100644
index 0000000..1eeafdb
--- /dev/null
+++ b/client/src/store/logs/index.js
@@ -0,0 +1,55 @@
+import Vue from "vue";
+import Vuex from "vuex";
+Vue.use(Vuex);
+
+import {
+ //mutations
+ LOGS_RESULTS,
+ LOGS_LOADING,
+ //actions
+ LOGS_FETCH_RECENT,
+ MAKE_API_CALL,
+} from "../store.constants";
+
+const logs = {
+ namespaced: true,
+ state: {
+ items: [],
+ stats: false,
+ loading: false,
+ },
+ getters: {
+ getStats: (state) => {
+ return state.stats;
+ },
+ getResults: (state) => {
+ return state.items;
+ },
+ },
+ mutations: {
+ [LOGS_LOADING](state, { loading }) {
+ state.loading = loading;
+ },
+ [LOGS_RESULTS](state, { stats, results }) {
+ state.items = results;
+ state.stats = stats;
+ },
+ },
+ actions: {
+ async [LOGS_FETCH_RECENT]({ commit, dispatch }) {
+ const result = await dispatch(
+ `api/${MAKE_API_CALL}`,
+ {
+ method: "get",
+ url: "/logs/",
+ loading: `logs/${LOGS_LOADING}`,
+ },
+ { root: true }
+ );
+ if (result.data)
+ commit(`logs/${LOGS_RESULTS}`, result.data, { root: true });
+ },
+ },
+};
+
+export default logs;
diff --git a/client/src/store/store.constants.js b/client/src/store/store.constants.js
new file mode 100644
index 0000000..e08c28a
--- /dev/null
+++ b/client/src/store/store.constants.js
@@ -0,0 +1,14 @@
+const ACTION_TYPES = {
+ MAKE_API_CALL: "MAKE_API_CALL",
+ LOGS_FETCH_RECENT: "LOGS_FETCH_RECENT",
+};
+
+//actions
+const MUTATION_TYPES = {
+ ADD_API_CALL: "ADD_API_CALL",
+ REMOVE_API_CALL: "REMOVE_API_CALL",
+ LOGS_RESULTS: "LOGS_RESULTS",
+ LOGS_LOADING: "LOGS_LOADING",
+};
+
+module.exports = { ...ACTION_TYPES, ...MUTATION_TYPES };
diff --git a/client/src/util/axios.js b/client/src/util/axios.js
new file mode 100644
index 0000000..589bb2d
--- /dev/null
+++ b/client/src/util/axios.js
@@ -0,0 +1,10 @@
+import axios from "axios";
+
+const config = {
+ baseURL: "/v1/",
+ timeout: 30000,
+};
+
+const axiosClient = axios.create({ ...config });
+
+export { axiosClient };
diff --git a/client/src/views/Home.vue b/client/src/views/Home.vue
index ab4e64f..d1eba0d 100644
--- a/client/src/views/Home.vue
+++ b/client/src/views/Home.vue
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/client/vue.config.js b/client/vue.config.js
index b3db57a..259e560 100644
--- a/client/vue.config.js
+++ b/client/vue.config.js
@@ -4,6 +4,8 @@ module.exports = {
publicPath: "/",
outputDir: "dist",
+ runtimeCompiler: true,
+
devServer: {
headers: { "Access-Control-Allow-Origin": "*" },
contentBase: path.join(__dirname, "dist"),
@@ -17,7 +19,7 @@ module.exports = {
disableHostCheck: false,
proxy: {
"/*": {
- target: "http://localhost:8080",
+ target: "http://localhost:3000",
},
},
stats: {
diff --git a/config/config.js b/config/config.js
index 893c137..9b25b8c 100644
--- a/config/config.js
+++ b/config/config.js
@@ -4,8 +4,8 @@
let config = {
DB_NAME: "speedtester",
DB_URL: "localhost",
- SPEEDTEST_INTERVAL: "*/1 * * * *",
- RUN_SCHEDULED_JOB: false,
+ SPEEDTEST_INTERVAL: "*/30 * * * *",
+ RUN_SCHEDULED_JOB: true,
};
//Production Overrides
@@ -13,7 +13,7 @@ if (process.env.NODE_ENV == "production") {
config = {
...config,
DB_URL: "mongo",
- SPEEDTEST_INTERVAL: "*/15 * * * *",
+ SPEEDTEST_INTERVAL: "0 */2 * * *",
RUN_SCHEDULED_JOB: true,
};
}
diff --git a/docker-compose.yml b/docker-compose.yml
index 41861d4..75b76b6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
version: "3"
services:
speedtester:
- container_name: dynamikarray/speedtester:latest
+ container_name: speedtester
restart: always
build: .
ports:
@@ -13,6 +13,7 @@ services:
restart: always
image: ${MONGO_IMAGE_NAME}
volumes:
- - ./data:/data/db
+ - ~/mongo/data:/data/db
ports:
- - '27017:27017'
\ No newline at end of file
+ - '27017:27017'
+
diff --git a/package-lock.json b/package-lock.json
index 9c4375d..820c913 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -52,6 +52,16 @@
"negotiator": "0.6.2"
}
},
+ "acorn": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+ "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ=="
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+ },
"after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
@@ -761,6 +771,87 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
+ "eslint-plugin-vue": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.4.0.tgz",
+ "integrity": "sha512-Ga96QRG8GA9AyzKtEDxqYRCMt/VJM4SLkcNmm4FvUiFBE4jpaBr25unRBi9iVmHLYhA9EZ/4I+jD8n1vfWzyAA==",
+ "requires": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
+ "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
+ },
+ "espree": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
+ "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
+ "requires": {
+ "acorn": "^8.7.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^3.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
+ "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ=="
+ }
+ }
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ },
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -1256,6 +1347,11 @@
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
},
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
"logform": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.3.2.tgz",
@@ -1278,6 +1374,21 @@
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
"luxon": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
@@ -1509,6 +1620,11 @@
"resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
"integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
},
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
"needle": {
"version": "2.9.1",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
@@ -2408,6 +2524,48 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
+ "vue-eslint-parser": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.2.0.tgz",
+ "integrity": "sha512-hvl8OVT8imlKk/lQyhkshqwQQChzHETcBd5abiO4ePw7ib7QUZLfW+2TUrJHKUvFOCFRJrDin5KJO9OHzB5bRQ==",
+ "requires": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
+ "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
"webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
diff --git a/server/controllers/v1/logs/logsController.js b/server/controllers/v1/logs/logsController.js
index 932e2a1..e822cfb 100644
--- a/server/controllers/v1/logs/logsController.js
+++ b/server/controllers/v1/logs/logsController.js
@@ -1,6 +1,15 @@
+const { logger } = require("../../../util/logger");
+const SpeedTestLogs = require("../../../models/logSchema.js");
+
async function home(req, res, next) {
try {
- res.send("We Made It");
+
+ const results = await Promise.all([
+ await SpeedTestLogs.getCurrentStats(),
+ await SpeedTestLogs.getLatestResults(),
+ ]);
+
+ res.send({stats: results[0][0], results: results[1]});
//
} catch (e) {
//correctly json handle this error message
diff --git a/server/index.js b/server/index.js
index b1126e2..d9425cf 100644
--- a/server/index.js
+++ b/server/index.js
@@ -13,28 +13,35 @@ const { runSpeedTestLog } = require("./services/speedtestService.js");
logger.info(`Speedtester Starting in ${process.env.NODE_ENV} mode`);
+
const {install} = require("../config/install");
//Once connect launch our server
connectDb().then(async () => {
logger.info("Speedtester Connected to Mongo");
- logger.info("Speedtester Accepting Liscensce for Speedtest.net");
- await install();
+ //Liscense check for production only instances built through docker images
+ if(process.env.NODE_ENV == 'production'){
+ logger.info("Speedtester Accepting Liscensce for Speedtest.net");
+ await install();
+ }
- //Start Server
- const port = process.env.APP_PORT || 3000;
- server.listen(port);
-
//setup Events Emitter for sockets
const events = require("events");
const em = new events.EventEmitter();
+ //Pass Events Emitter to Socket Routes
require("./routes/socket")(io, em);
-
+
+ //setup scheduled jobs
if (RUN_SCHEDULED_JOB == true) {
const speedtestIntervalJob = schedule.scheduleJob(SPEEDTEST_INTERVAL, runSpeedTestLog);
}
+ //Start Server
+ const port = process.env.APP_PORT || 3000;
+ server.listen(port);
+
+
logger.info(`Speedtester API is running on port: ${port}`);
});
diff --git a/server/models/logSchema.js b/server/models/logSchema.js
index 401bceb..7dc124a 100644
--- a/server/models/logSchema.js
+++ b/server/models/logSchema.js
@@ -1,4 +1,5 @@
const mongoose = require("mongoose");
+const { logger } = require("../util/logger");
const LogSchema = new mongoose.Schema({
timestamp: {
@@ -77,4 +78,34 @@ const LogSchema = new mongoose.Schema({
//Make this collection singular later?
const Log = mongoose.model("Log", LogSchema);
+Log.getLatestResults = async function () {
+ try {
+ const results = await Log.find().sort({_id: -1}).limit(500);
+ return results;
+ } catch (error) {
+ logger.error("logSchema | getLatestResults | Error=", error.message);
+ }
+}
+
+Log.getCurrentStats = async function () {
+ try {
+ const results = await Log.aggregate([
+ {$sort: {timestamp: -1}},
+ {
+ $group:
+ {
+ "_id": null,
+ avgDownload: {$avg: "$download.bandwidth"} ,
+ avgUpload: {$avg: "$upload.bandwidth"}
+ }
+ }
+ ]);
+ return results;
+ } catch (error) {
+ logger.error("logSchema | getCurrentStats | Error=", error);
+ }
+}
+
+
+
module.exports = Log;
diff --git a/server/routes/socket/index.js b/server/routes/socket/index.js
index 91aadcd..a76563a 100644
--- a/server/routes/socket/index.js
+++ b/server/routes/socket/index.js
@@ -1,4 +1,6 @@
const { logger } = require("../../util/logger");
+const logsModel = require("../../models/logSchema.js");
+
const speedtestService = require("../../services/speedtestService");
@@ -14,4 +16,17 @@ module.exports = (io, em) => {
require("./liveTest/liveTest")(socket, em);
});
+
+
+ //Handle saving new log results?
+ //This needs a better events patter ?
+ em.on("testResults", async function (testResults) {
+ try {
+ const newLog = new logsModel(testResults);
+ const logSaveResult = await newLog.save();
+ } catch (error) {
+ logger.error("liveTest | testResults | error=" + error.message);
+ }
+ });
+
};
diff --git a/server/routes/socket/liveTest/liveTest.js b/server/routes/socket/liveTest/liveTest.js
index d5a8de8..c0c19a8 100644
--- a/server/routes/socket/liveTest/liveTest.js
+++ b/server/routes/socket/liveTest/liveTest.js
@@ -1,17 +1,18 @@
+const { logger } = require("../../../util/logger");
+
module.exports = async (socket, em) => {
//already connected so what do we want to do in here
- em.on("progressEvent", async function (progressEvent) {
- // console.log("emitting progress event to ", socket.id);
+ em.on("progressEvent", async function (progressEvent) {
socket.emit("PROGRESS_EVENT", progressEvent);
});
em.on("runningSpeedTestEvent", async function (params) {
- //console.log("runningSpeedTestEvent - " + JSON.stringify(params) + " sending event to ", socket.id);
+ //console.log("running speedtest");
socket.emit("RUNNING_SPEEDTEST_EVENT", params);
});
- em.on("testResults", async function (testResults) {
- //console.log("testResults - " + JSON.stringify(testResults) + " sending event to ", socket.id);
- socket.emit("FINISHED_SPEEDTEST_EVENT", testResults);
+ em.on("testResults", async function (testResults) {
+ //console.log("TEST RESULTS???",em, socket.conn.id);
+ socket.emit("FINISHED_SPEEDTEST_EVENT", testResults);
});
};
diff --git a/server/services/speedtestService.js b/server/services/speedtestService.js
index 79eda49..ea92b11 100644
--- a/server/services/speedtestService.js
+++ b/server/services/speedtestService.js
@@ -1,7 +1,6 @@
const speedTest = require("speedtest-net");
const { logger } = require("../util/logger");
-const mongooseService = require("../services/mongooseService.js");
const logsModel = require("../models/logSchema.js");
const events = require("events");
@@ -54,12 +53,3 @@ const speedtestService = {
};
module.exports = speedtestService;
-
-/**
-
-const { convertToMegabits } = require("../util/utilities.js");
-
-async function handleProgress(testEvent) {
- console.log(testEvent);
-}
- */