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 fs = yield* FileSystem.FileSystem;
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");
const fs = yield* FileSystem.FileSystem;
yield* fs.writeFileString(config.authPath, JSON.stringify(sessionData));
const result = yield* Schema.decodeUnknown(AuthState)(sessionData)
return sessionData;
const fs = yield* FileSystem.FileSystem;
yield* fs.writeFileString(config.authPath, JSON.stringify(result));
return result;
});
export const getAuth = Effect.gen(function* () {

View File

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

View File

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