initial commit
This commit is contained in:
commit
eaca2e59bd
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules
|
||||||
|
db.level
|
75
incdec.js
Normal file
75
incdec.js
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
const express = require("express")
|
||||||
|
const expressWs = require("express-ws")
|
||||||
|
const _ = require("lodash")
|
||||||
|
|
||||||
|
const db = require("level")("./db.level", {
|
||||||
|
valueEncoding: "json"
|
||||||
|
})
|
||||||
|
|
||||||
|
const getWithDefault = async (key, def) => {
|
||||||
|
try {
|
||||||
|
return await db.get(key)
|
||||||
|
} catch(e) {
|
||||||
|
if (e.notFound) {
|
||||||
|
return def
|
||||||
|
} else {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let counter = 0
|
||||||
|
setImmediate(async () => {
|
||||||
|
counter = await getWithDefault("counter", 0)
|
||||||
|
})
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
console.log("Counter:", counter)
|
||||||
|
db.put("counter", counter)
|
||||||
|
}, 10000)
|
||||||
|
|
||||||
|
const app = express()
|
||||||
|
const wss = expressWs(app)
|
||||||
|
|
||||||
|
app.get("/", (req, res) => {
|
||||||
|
res.sendFile(__dirname + "/index.html")
|
||||||
|
})
|
||||||
|
|
||||||
|
const sendCounter = (ws, x) => ws.send(JSON.stringify({
|
||||||
|
type: "value",
|
||||||
|
value: x
|
||||||
|
}))
|
||||||
|
|
||||||
|
const transmitCounterUpdate = _.throttle(newValue => {
|
||||||
|
wss.getWss().clients.forEach(ws => sendCounter(ws, newValue))
|
||||||
|
}, 50)
|
||||||
|
|
||||||
|
app.ws("/api", (ws, req) => {
|
||||||
|
console.log("Connected")
|
||||||
|
sendCounter(ws, counter)
|
||||||
|
ws.on("message", async data => {
|
||||||
|
const msg = JSON.parse(data)
|
||||||
|
if (msg.type === "increment") {
|
||||||
|
counter++
|
||||||
|
transmitCounterUpdate(counter)
|
||||||
|
} else if (msg.type === "decrement") {
|
||||||
|
counter--
|
||||||
|
transmitCounterUpdate(counter)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post("/inc", (req, res) => {
|
||||||
|
counter++
|
||||||
|
transmitCounterUpdate(counter)
|
||||||
|
res.send(counter.toString())
|
||||||
|
})
|
||||||
|
app.post("/dec", (req, res) => {
|
||||||
|
counter--
|
||||||
|
transmitCounterUpdate(counter)
|
||||||
|
res.send(counter.toString())
|
||||||
|
})
|
||||||
|
|
||||||
|
const port = parseInt(process.env.PORT) || 3709
|
||||||
|
|
||||||
|
app.listen(port, () => console.log("Listening on", port))
|
79
index.html
Normal file
79
index.html
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<meta name="viewport" content="user-scalable=0">
|
||||||
|
<noscript>JavaScript is required for this.</noscript>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 100vh;
|
||||||
|
font-family: sans-serif;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container button {
|
||||||
|
width: 3em;
|
||||||
|
height: 3em;
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 1em;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container #value {
|
||||||
|
font-size: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(orientation: portrait) {
|
||||||
|
#container { flex-direction: column; }
|
||||||
|
#container button { width: calc(100% - 2em); }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="container">
|
||||||
|
<button id="up" onclick="increment()">+</button>
|
||||||
|
<div id="value">Loading...</div>
|
||||||
|
<button id="down" onclick="decrement()">-</button>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
var output = document.querySelector("#value")
|
||||||
|
window.onerror = function(err) {
|
||||||
|
output.innerText = err
|
||||||
|
output.style.color = "red"
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = (window.location.href + "api").replace("http", "ws")
|
||||||
|
console.log("connecting", url)
|
||||||
|
var socket = new WebSocket(url)
|
||||||
|
|
||||||
|
function display(text) {
|
||||||
|
output.innerText = text
|
||||||
|
}
|
||||||
|
|
||||||
|
function send(obj) {
|
||||||
|
socket.send(JSON.stringify(obj))
|
||||||
|
}
|
||||||
|
|
||||||
|
socket.onmessage = function(ev) {
|
||||||
|
var msg = JSON.parse(ev.data)
|
||||||
|
if (msg.type === "value") {
|
||||||
|
display(msg.value.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function increment() {
|
||||||
|
send({
|
||||||
|
type: "increment"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrement() {
|
||||||
|
send({
|
||||||
|
type: "decrement"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
1349
package-lock.json
generated
Normal file
1349
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
13
package.json
Normal file
13
package.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "incdec",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "The thrilling game of increments and decrements.",
|
||||||
|
"main": "incdec.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"express-ws": "^4.0.0",
|
||||||
|
"level": "^6.0.1",
|
||||||
|
"lodash": "^4.17.21"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user