diff --git a/basics.js b/basics.js new file mode 100644 index 0000000..38df0ac --- /dev/null +++ b/basics.js @@ -0,0 +1,60 @@ +const fs = require("fs") +const path = require("path") + + +module.exports.getDate = function (formated) { + + var date = new Date() + + // [Date Format] - Format de la date + + var gmonth = date.getMonth() + 1 + var gday = date.getDate() + var gHour = date.getHours() + var gMinute = date.getMinutes() + var gSecondes = date.getSeconds() + + + if(date.getMonth() + 1 < 10) { + gmonth = "0" + (date.getMonth() + 1) + } + + if(date.getDate() + 1 <= 10) { + gday = "0" + date.getDate() + } + + if(date.getHours() + 1 <= 10) { + gHour = "0" + date.getHours() + } + + if(date.getMinutes() + 1 <= 10) { + gMinute = "0" + date.getMinutes() + } + + if(date.getSeconds() + 1 <= 10) { + gSecondes = "0" + date.getSeconds() + } + + if(!formated) { + return gday + "/" + gmonth + " - " + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" + } else { + return date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" + + } + + +} + + +module.exports.getMetricsFile = () => { + if(!fs.existsSync(path.join(__dirname, "/metrics.json"))) { + fs.writeFileSync(path.join(__dirname, "/metrics.json"), JSON.stringify([], null, 2)) + } else { + return JSON.parse(fs.readFileSync(path.join(__dirname, "/metrics.json"))) + } + +} + +module.exports.saveMetricsFile = (data) => { + fs.writeFileSync(path.join(__dirname, "/metrics.json"), JSON.stringify(data, null, 2)) +} \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..da30e55 --- /dev/null +++ b/main.js @@ -0,0 +1,107 @@ +//WebMetrik - Web Analytics +//Git : https://git.raphix.fr/lib/webmetrik +//Author : Raphix + +const basics = require('./basics.js'); +const fs = require('fs'); + +module.exports.Metric = class { + name; + description; + value; + constructor(name, description) { + const metricsFile = basics.getMetricsFile(); + //Check if the metric already exists and set the value and description of the metric + if(basics.getMetricsFile().findIndex(x => x.name == name) != -1) { + this.name = name; + this.description = basics.getMetricsFile()[basics.getMetricsFile().findIndex(x => x.name == name)].description; + this.value = basics.getMetricsFile()[basics.getMetricsFile().findIndex(x => x.name == name)].value; + } else { + this.name = name; + this.description = description; + this.value = 0; + + //save it to the file + basics.saveMetricsFile([...basics.getMetricsFile(), {name: this.name, description: this.description, value: this.value}]) + + } + + } + + setValue(value) { + + //get the value of the metric from the file and set it to the value of the metric + this.value = basics.getMetricsFile()[basics.getMetricsFile().findIndex(x => x.name == this.name)].value; + + //save it to the file + basics.saveMetricsFile(basics.getMetricsFile().map(x => { + if(x.name == this.name) { + x.value = value; + } + return x; + })) + } + + getValue() { + //get the value of the metric from the file and set it to the value of the metric + this.value = basics.getMetricsFile()[basics.getMetricsFile().findIndex(x => x.name == this.name)].value; + return this.value; + } + + setDescription(description) { + //get the value of the metric from the file and set it to the value of the metric + this.value = basics.getMetricsFile()[basics.getMetricsFile().findIndex(x => x.name == this.name)].value; + + //save it to the file + basics.saveMetricsFile(basics.getMetricsFile().map(x => { + if(x.name == this.name) { + x.description = description; + } + return x; + })) + } + + clearMetric() { + //delete the metric from the file + basics.saveMetricsFile(basics.getMetricsFile().filter(x => x.name != this.name)) + } + +} + + +module.exports.publishMetrics = (port, privateKey) => { + const http = require('http'); + const url = require('url'); + + const server = http.createServer((req, res) => { + const parsedUrl = url.parse(req.url, true); + const pathname = parsedUrl.pathname; + const query = parsedUrl.query; + + if(pathname == "/metrics") { + if(query.privatekey == privateKey) { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end(JSON.stringify(basics.getMetricsFile())); + } else { + res.writeHead(403, {'Content-Type': 'application/json'}); + res.end(JSON.stringify({error: "Invalid private key"})); + } + } else { + res.writeHead(404, {'Content-Type': 'application/json'}); + res.end(JSON.stringify({error: "Invalid path"})); + } + }) + + server.listen(port, () => { + console.log("WebMetrik is listening on port " + port); + }) +} + + +// CHeck if the metric exitst and delete it + +module.exports.deleteMetric = (name) => { + if(basics.getMetricsFile().findIndex(x => x.name == name) != -1) { + basics.saveMetricsFile(basics.getMetricsFile().filter(x => x.name != name)) + } +} diff --git a/metrics.json b/metrics.json new file mode 100644 index 0000000..e32b6e2 --- /dev/null +++ b/metrics.json @@ -0,0 +1,7 @@ +[ + { + "name": "test", + "description": "test metric", + "value": 20 + } +] \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..e2eb8d1 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "webmetrik", + "version": "0.0.1", + "description": "NodeJS - npm package - Make metrics and make it available by making a httpServer", + "main": "main.js", + "keywords": [], + "author": "Raphix", + "license": "ISC" +}