UNPKG

@mesh-tech/mesh-cli

Version:

CLI for Mesh platform development utilities

46 lines (45 loc) 1.82 kB
import * as http from "node:http"; import { getValidToken, readCredentials, decodeJwtPayload } from "./login.js"; import { logInfo, logWarn } from "../utils/log.js"; export async function handleTokenRequest(context, deps) { const idToken = await deps.getValidToken(context); const creds = idToken ? deps.readCredentials(context) : null; if (!idToken || !creds) return { status: 503, body: { error: "token-unavailable" } }; const payload = deps.decodeJwtPayload(idToken); return { status: 200, body: { idToken, accessToken: creds.accessToken, sub: payload.sub ?? undefined, email: creds.email ?? payload.email ?? undefined, expiresAt: creds.expiresAt, }, }; } const REFRESH_MARGIN_MS = 120_000; export async function startTokenServer(port, context) { const deps = { getValidToken: (c) => getValidToken(c, { marginMs: REFRESH_MARGIN_MS }), readCredentials, decodeJwtPayload, }; const server = http.createServer((_req, res) => { void (async () => { try { const { status, body } = await handleTokenRequest(context, deps); res.writeHead(status, { "content-type": "application/json" }); res.end(JSON.stringify(body)); } catch (e) { res.writeHead(500, { "content-type": "application/json" }); res.end(JSON.stringify({ error: e.message })); } })(); }); server.on("error", (e) => logWarn(`token-server error: ${e.message}`)); await new Promise((resolve) => server.listen(port, "127.0.0.1", resolve)); logInfo(`dev-user token-server on http://127.0.0.1:${port} (context ${context})`); await new Promise(() => { }); }