From cc5a5673355cb72d768d129c4f544f45862ceb11 Mon Sep 17 00:00:00 2001 From: Arne Baeumler Date: Sun, 7 Jun 2026 12:18:00 +0200 Subject: [PATCH] feat: add TypeScript server skeleton --- src/index.ts | 14 ++++++++++++++ src/server/request-handler.ts | 21 +++++++++++++++++++++ src/shared/env.ts | 15 +++++++++++++++ tsconfig.json | 16 ++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 src/index.ts create mode 100644 src/server/request-handler.ts create mode 100644 src/shared/env.ts create mode 100644 tsconfig.json diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..be48985 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,14 @@ +import { createServer } from "node:http"; +import { env } from "./shared/env.js"; +import { createRequestHandler } from "./server/request-handler.js"; + +const handler = createRequestHandler(); + +const server = createServer((req, res) => { + void handler(req, res); +}); + +server.listen(env.port, env.host, () => { + console.log(`mapy-mg listening on http://${env.host}:${env.port}`); +}); + diff --git a/src/server/request-handler.ts b/src/server/request-handler.ts new file mode 100644 index 0000000..b195b77 --- /dev/null +++ b/src/server/request-handler.ts @@ -0,0 +1,21 @@ +import type { IncomingMessage, ServerResponse } from "node:http"; + +export function createRequestHandler() { + return async function handleRequest(_req: IncomingMessage, res: ServerResponse) { + res.statusCode = 200; + res.setHeader("content-type", "application/json; charset=utf-8"); + res.end( + JSON.stringify({ + name: "mapy-mg", + status: "ok", + features: [ + "photo upload", + "EXIF location extraction", + "map markers", + "route preview" + ] + }) + ); + }; +} + diff --git a/src/shared/env.ts b/src/shared/env.ts new file mode 100644 index 0000000..b0eb1c0 --- /dev/null +++ b/src/shared/env.ts @@ -0,0 +1,15 @@ +function parsePort(value: string | undefined): number { + const port = Number(value ?? "3000"); + + if (!Number.isInteger(port) || port < 1 || port > 65535) { + throw new Error("PORT must be an integer between 1 and 65535"); + } + + return port; +} + +export const env = { + host: process.env.HOST ?? "0.0.0.0", + port: parsePort(process.env.PORT) +} as const; + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e71bac5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "rootDir": "src", + "outDir": "dist", + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] +} +