@mesh-tech/mesh-cli
Version:
CLI for Mesh platform development utilities
46 lines (45 loc) • 1.82 kB
JavaScript
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(() => { });
}