feat(tui): reject expired token
This commit is contained in:
@@ -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* () {
|
||||||
|
|||||||
@@ -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",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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} />);
|
||||||
|
|||||||
Reference in New Issue
Block a user