From f021b52028f5965516671b7f53e7e71543a8ae52 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Wed, 30 Jun 2021 11:33:40 +0300 Subject: Do things --- backend/index.ts | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 backend/index.ts (limited to 'backend/index.ts') diff --git a/backend/index.ts b/backend/index.ts new file mode 100644 index 0000000..5a974d6 --- /dev/null +++ b/backend/index.ts @@ -0,0 +1,58 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import express from "express"; +import http from "http"; +import { + createPool, + DatabasePoolType, + DatabaseTransactionConnectionType, + sql, +} from "slonik"; +import * as config from "./config"; +import { ValueRecord } from "../shared-types"; +import { Server as SocketIOServer, Socket } from "socket.io"; + +const app = express(); + +const httpServer = http.createServer(app); +const io = new SocketIOServer(httpServer, { + cors: { + origin: "*", + }, +}); + +type Connection = DatabasePoolType | DatabaseTransactionConnectionType; +const _connection = createPool(config.postgresConnectionString); + +const getCurrentValue = async (conn: Connection): Promise => { + return await conn.oneFirst(sql` + SELECT value + FROM state + `); +}; + +const incrementCurrentValue = async (conn: Connection): Promise => + await conn.transaction(async (trans) => { + const current = await getCurrentValue(trans); + + const newValue = current + 1; + await trans.query(sql` + UPDATE state + SET value = ${newValue} + `); + return newValue; + }); + +io.on("connection", async (socket) => { + console.log(`a user connected: ${socket.id}`); + const currentValue = await getCurrentValue(_connection); + socket.emit("update", currentValue); + + socket.on("increment", async () => { + const newValue = await incrementCurrentValue(_connection); + io.emit("update", newValue); // broadcast + }); +}); + +httpServer.listen(config.port, () => { + console.log(`Listening on http://localhost:${config.port}`); +}); -- cgit v1.3