feat(tui): reject expired token

This commit is contained in:
Max Koon
2025-11-18 13:21:56 -05:00
parent 92c3dc4a85
commit 801bb1c194
3 changed files with 17 additions and 10 deletions

View File

@@ -10,7 +10,9 @@ const CLIENT_ID = "koon-family";
const getFromFromDisk = Effect.gen(function* () { const getFromFromDisk = Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem; const fs = yield* FileSystem.FileSystem;
const content = yield* fs.readFileString(config.authPath); const content = yield* fs.readFileString(config.authPath);
return yield* Schema.decode(Schema.parseJson(AuthState))(content); const auth = yield* Schema.decode(Schema.parseJson(AuthState))(content);
if (auth.session.expiresAt < new Date()) yield* Effect.fail("Token expired");
return auth;
}); });
@@ -123,10 +125,12 @@ const requestAuth = Effect.gen(function* () {
})); }));
if (sessionData == null) return yield* Effect.fail("Session was null"); if (sessionData == null) return yield* Effect.fail("Session was null");
const fs = yield* FileSystem.FileSystem; const result = yield* Schema.decodeUnknown(AuthState)(sessionData)
yield* fs.writeFileString(config.authPath, JSON.stringify(sessionData));
return sessionData; const fs = yield* FileSystem.FileSystem;
yield* fs.writeFileString(config.authPath, JSON.stringify(result));
return result;
}); });
export const getAuth = Effect.gen(function* () { export const getAuth = Effect.gen(function* () {

View File

@@ -7,4 +7,5 @@ const AUTH_PATH = join(PATH, "auth.json");
export const config = { export const config = {
dir: PATH, dir: PATH,
authPath: AUTH_PATH, authPath: AUTH_PATH,
zeroUrl: "http://laptop:4848",
}; };

View File

@@ -1,5 +1,5 @@
import { createCliRenderer } from "@opentui/core"; import { createCliRenderer } from "@opentui/core";
import { createRoot } from "@opentui/react"; import { createRoot, useKeyboard } from "@opentui/react";
import { App, type Route } from "@money/ui"; import { App, type Route } from "@money/ui";
import { ZeroProvider } from "@rocicorp/zero/react"; import { ZeroProvider } from "@rocicorp/zero/react";
import { schema } from '@money/shared'; import { schema } from '@money/shared';
@@ -9,15 +9,17 @@ import { Effect } from "effect";
import { BunContext } from "@effect/platform-bun"; import { BunContext } from "@effect/platform-bun";
import type { AuthData } from "./schema"; import type { AuthData } from "./schema";
import { kvStore } from "./store"; import { kvStore } from "./store";
import { config } from "./config";
const userID = "anon";
const server = "http://laptop:4848";
function Main({ auth }: { auth: AuthData }) { function Main({ auth }: { auth: AuthData }) {
const [route, setRoute] = useState<Route>("/"); const [route, setRoute] = useState<Route>("/");
useKeyboard(key => {
if (key.name == "c" && key.ctrl) process.exit(0);
});
return ( return (
<ZeroProvider {...{ userID, auth: auth.session.token, server, schema, kvStore }}> <ZeroProvider {...{ userID: auth.user.id, auth: auth.session.token, server: config.zeroUrl, schema, kvStore }}>
<App <App
auth={auth || null} auth={auth || null}
route={route} route={route}
@@ -35,5 +37,5 @@ const auth = await Effect.runPromise(
Effect.provide(layer()), Effect.provide(layer()),
) )
); );
const renderer = await createCliRenderer(); const renderer = await createCliRenderer({ exitOnCtrlC: false });
createRoot(renderer).render(<Main auth={auth} />); createRoot(renderer).render(<Main auth={auth} />);