// LogicSRC credentials — Express PWA entrypoint (auth + team credential sharing). import express from "express"; import cookieParser from "cookie-parser"; import path from "node:path"; import { config } from "./config.mjs"; import { migrate } from "./migrate.mjs"; import { sessionMiddleware, csrfGuard } from "./lib/session.mjs"; import { authRouter } from "./routes/auth.mjs"; import { passkeyRouter } from "./routes/passkey.mjs"; import { coinpayRouter } from "./routes/coinpay.mjs"; import { credshareRouter } from "./routes/credshare.mjs"; import { cliRouter } from "./routes/cli.mjs"; import { pagesRouter } from "./routes/pages.mjs"; const app = express(); app.disable("x-powered-by"); if (config.secure) app.set("trust proxy", 1); // Railway terminates TLS // body parsing — keep the raw body for HMAC signature verification app.use(express.json({ verify: (req, _res, buf) => { req.rawBody = buf.toString("utf8"); } })); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); // static app.use(express.static(path.join(config.root, "public"), { maxAge: "1h" })); // the @simplewebauthn/browser UMD bundle, served from node_modules (no CDN) app.get("/vendor/simplewebauthn-browser.umd.js", (_req, res) => res.sendFile(path.join(config.root, "node_modules/@simplewebauthn/browser/dist/bundle/index.umd.min.js"))); app.get("/healthz", (_req, res) => res.json({ ok: true, env: config.env })); app.use(sessionMiddleware); app.use(csrfGuard); // routes app.use(authRouter); // GET / (+ /auth/login|register|logout) app.use(passkeyRouter); app.use(coinpayRouter); app.use(credshareRouter); // /api/credshare/* (session or lsk_ Bearer) app.use(cliRouter); // /cli/authorize, /cli/token, /api/me app.use(pagesRouter); // /dashboard, /teams/*, /settings app.use((req, res) => res.status(404).type("html").send( `

404

no such page.

back to your teams →`)); // eslint-disable-next-line no-unused-vars app.use((err, _req, res, _next) => { console.error(err); res.status(500).type("html").send(`

500

something broke.

`); }); async function main() { await migrate(); app.listen(config.port, () => console.log(`🔐 logicsrc credentials on :${config.port} (${config.env}) — ${config.origin}`)); } main().catch((e) => { console.error("boot failed:", e); process.exit(1); }); export { app };