diff --git a/dependencies.js b/dependencies.js index 41be8f0..601c09d 100644 --- a/dependencies.js +++ b/dependencies.js @@ -37,4 +37,6 @@ FOREIGN KEY (transaction_id) REFERENCES transactions (transaction_id) FOREIGN KE ); `) + + module.exports = db diff --git a/index.js b/index.js index 55ec1e7..9cecac2 100644 --- a/index.js +++ b/index.js @@ -47,6 +47,7 @@ app.use( express.static( __dirname + '/frontend')) const accountsRoute = require("./routes/accounts"); const transactionsRoute = require("./routes/transactions"); const resetRoute = require("./routes/reset") +const { sse } = require("./sse") const basepath = "/api/v1"; @@ -54,7 +55,7 @@ app.use(`${basepath}/accounts`, accountsRoute); app.use(`${basepath}/transactions`, transactionsRoute); app.use(`${basepath}/`, resetRoute.router); -app.get("/live", resetRoute.mysse) +app.get("/live", sse) app.get("/", (req, res) => { @@ -64,3 +65,4 @@ app.get("/", (req, res) => { app.listen(port, () => { console.log(`App listening on port ${port}`); }); + diff --git a/routes/accounts.js b/routes/accounts.js index 0496f92..f590327 100644 --- a/routes/accounts.js +++ b/routes/accounts.js @@ -2,7 +2,7 @@ const express = require("express"); const router = express.Router(); const db = require("../dependencies"); -const { update } = require("./reset"); +const {send_sse_update} = require("../sse") // Fix if balance is null function fix_balance_is_null(acc) { @@ -84,12 +84,8 @@ router.post("/", (req, res) => { .run(number, name, qualifiedName, des, type, req.body.parentAccount); res.status(204).send(); - - for (res of update.values()) { - // res.write("data: update\n\n") - res.write("event: update\n"); - res.write("data: {}\n\n"); - } + send_sse_update(); + }); router.get("/:account", (req, res) => { @@ -160,11 +156,8 @@ router.put("/:account", (req, res) => { }); } else { res.status(204).send(); - for (res of update.values()) { - // res.write("data: update\n\n") - res.write("event: update\n"); - res.write("data: {}\n\n"); - } + send_sse_update(); + } }); @@ -182,12 +175,7 @@ router.delete("/:account", (req, res) => { } else { res.status(200).send(); } - - for (res of update.values()) { - // res.write("data: update\n\n") - res.write("event: update\n"); - res.write("data: {}\n\n"); - } + send_sse_update(); }); module.exports = router; diff --git a/routes/reset.js b/routes/reset.js index 6685896..3bb78b5 100644 --- a/routes/reset.js +++ b/routes/reset.js @@ -2,35 +2,13 @@ const express = require('express'); const router = express.Router(); const db = require("../dependencies"); +const {send_sse_update} = require("../sse") router.post("/reset", (req, res) => { db.exec("DELETE FROM accounts; DELETE FROM transaction_entries; DELETE FROM transactions") res.status(204).send() + send_sse_update() }) -const update = new Map() -async function mysse(req, res) { - console.log('Got /events'); - - res.set({ - 'Cache-Control': 'no-cache', - 'Content-Type': 'text/event-stream', - 'Connection': 'keep-alive' - }); - res.flushHeaders(); - - - // Tell the client to retry every 10 seconds if connectivity is lost - res.write('retry: 10000\n\n'); - update.set(req.sessionId, res) - console.log("connected") - - res.on("close", () => { - update.delete(req.sessionId) - res.end() - }) -}; - - -module.exports = { router, mysse, update}; +module.exports = { router}; diff --git a/routes/transactions.js b/routes/transactions.js index b5fddee..8f22dd7 100644 --- a/routes/transactions.js +++ b/routes/transactions.js @@ -2,7 +2,7 @@ const express = require('express'); const router = express.Router(); const db = require("../dependencies"); -const { update } = require("./reset") +const {send_sse_update} = require("../sse") router.get("/", (req, res) => { const transactions = db.prepare("SELECT transaction_id as id, postingDate, valueDate, title FROM transactions").all(); @@ -30,11 +30,7 @@ router.post("/", (req, res) => { res.send({ id: db_transaction.lastInsertRowid }) - for (res of update.values()) { - // res.write("data: update\n\n") - res.write('event: update\n'); - res.write('data: {}\n\n'); - } + send_sse_update() }) @@ -56,12 +52,8 @@ router.put("/:id", (req, res) => { const db_entries = db.prepare("INSERT INTO transaction_entries (transaction_id, account_name, amount, label) VALUES (?, ?, ?, ?)").run(req.params.id, req.body.entries[i].account, req.body.entries[i].amount, req.body.entries[i].label) } - + send_sse_update() res.status(204).send() - for (res of update.values()) { - res.write('event: update\n'); - res.write('data: {}\n\n'); - } }) @@ -71,12 +63,7 @@ router.delete("/:id", (req, res) => { res.status(204).send() - for (res of update.values()) { - // res.write("data: update\n\n") - res.write('event: update\n'); - res.write('data: {}\n\n'); - } - + send_sse_update() }) module.exports = router; diff --git a/sse.js b/sse.js new file mode 100644 index 0000000..09adf86 --- /dev/null +++ b/sse.js @@ -0,0 +1,42 @@ +let newcode = false; +//helferfunktion die das richtige format für das event erstellt +function sendMessage(response, eventname, datacontent) { + //response.write ist ein append, also schreibt was ans ende der seite + + response.write('event: ' + eventname + '\n' + 'data: ' + JSON.stringify(datacontent) + '\n\n') + newcode = false; +} + +function send_sse_update() { + newcode = true; +} + + +async function sse(request, response) { + + //header so setzen + response.set({ + 'Cache-Control': 'no-cache', + 'Content-Type': 'text/event-stream', + 'Connection': 'keep-alive' + }) + response.flushHeaders(); + //loop, schickt ein event, wartet 5 sekunden, schickt dann erneut. + // so abändern, dass anderer code in den loop hineingreifen kann (variable bool "newcode" oder so) + //dann wenn newcode = true, schicke ein eben via sendlive) + //der loop muss glaube ich bestehen bleiben + while (true){ + if (newcode) { + console.log("update send") + sendMessage(response, 'update', {}) + } else { + sendMessage(response,'hello', {}) + } + // response.write() + await new Promise(resolve => setTimeout(resolve, 5000)) + console.log(newcode) + } + +} + +module.exports = { sse, send_sse_update }