This commit is contained in:
rizky 2024-08-27 02:49:58 -07:00
parent 571ad3dcd1
commit fef9da2ab0
4 changed files with 49 additions and 39 deletions

View File

@ -1,21 +1,6 @@
import { _post } from "lib/utils/post"; import { _post } from "lib/utils/post";
import { addRoute, createRouter, findRoute } from "rou3"; import { addRoute, createRouter, findRoute } from "rou3";
import { ServerSession } from "./session/server-session"; import { ServerContext, SessionContext } from "./session/type";
import { SessionData } from "./session/store/session-store";
export type ServerContext = {
req: Request;
handle: (req: Request) => Promise<Response>;
mode: "dev" | "prod";
url: {
raw: URL;
pathname: string;
};
};
export interface SessionContext<T> extends ServerContext {
session: ServerSession<T>;
}
type RouteFn = (...arg: any[]) => Promise<any>; type RouteFn = (...arg: any[]) => Promise<any>;
@ -38,18 +23,22 @@ export const newServerRouter = <
}; };
export const newClientRouter = <T extends ReturnType<typeof newServerRouter>>( export const newClientRouter = <T extends ReturnType<typeof newServerRouter>>(
router: T ...routers: T[]
) => { ) => {
return new Proxy( return new Proxy(
{}, {},
{ {
get(target, api_name, receiver) { get(target, api_name, receiver) {
return (...args: any[]) => { return (...args: any[]) => {
for (const router of routers) {
if (router[api_name as any]) {
const [url, _, opt] = router[api_name as any]; const [url, _, opt] = router[api_name as any];
if (opt && opt.response_as) if (opt && opt.response_as)
return _post(url, args, { response_as: opt.response_as }); return _post(url, args, { response_as: opt.response_as });
return _post(url, args); return _post(url, args);
}
}
}; };
}, },
} }

View File

@ -5,11 +5,10 @@ import { ClientSession } from "./type";
export const newClientSession = <T>(arg?: { export const newClientSession = <T>(arg?: {
on: Partial<{ on: Partial<{
session: ClientSession<T>; messageReceived: (session: ClientSession<T>) => Promise<void>;
messageReceived: () => Promise<void>; afterLogin: (session: ClientSession<T>) => Promise<void>;
afterLogin: () => Promise<void>; afterLogout: (session: ClientSession<T>) => Promise<void>;
afterLogout: () => Promise<void>; afterRecheck: (session: ClientSession<T>) => Promise<void>;
afterRecheck: () => Promise<void>;
}>; }>;
}) => { }) => {
const store = sessionClientStore<T>(); const store = sessionClientStore<T>();
@ -18,13 +17,23 @@ export const newClientSession = <T>(arg?: {
const session: ClientSession<T> = { const session: ClientSession<T> = {
status: "checking", status: "checking",
current: null, current: null,
async recheck() { async connect() {
const current = await store.load(); const url = new URL(location.href);
if (!current) { url.protocol = "wss:";
this.status = "guest"; const ws = new WebSocket(url);
} else {
this.status = await client.check(current.uid, current.sid); ws.onopen = () => {
} ws.send("ok");
};
ws.onmessage = (m) => {
console.log(m);
};
// const current = await store.load();
// if (!current) {
// this.status = "guest";
// } else {
// this.status = await client.check(current.uid, current.sid);
// }
return { status: this.status }; return { status: this.status };
}, },
async login(arg: { async login(arg: {
@ -35,9 +44,6 @@ export const newClientSession = <T>(arg?: {
async logout() {}, async logout() {},
}; };
session.recheck().then((e) => { session.connect();
console.log(e);
});
return session; return session;
}; };

View File

@ -1,8 +1,9 @@
/// <reference types="bun-types" /> /// <reference types="bun-types" />
import { ServerContext, useServerRouter } from "../server-route"; import { useServerRouter } from "../server-route";
import { sessionRouter } from "./router/session-router"; import { sessionRouter } from "./router/session-router";
import { newSessionStore } from "./store/session-store"; import { newSessionStore } from "./store/session-store";
import { ServerContext } from "./type";
type SessionServerHandler = { type SessionServerHandler = {
cleanup: () => Promise<void>; cleanup: () => Promise<void>;

View File

@ -44,7 +44,7 @@ export type ClientSessionStatus = "checking" | "guest" | "expired" | "active";
export type ClientSession<T> = { export type ClientSession<T> = {
status: ClientSessionStatus; status: ClientSessionStatus;
current: null | SessionData<T>; current: null | SessionData<T>;
recheck(): Promise<{ status: ClientSessionStatus }>; connect(): Promise<{ status: ClientSessionStatus }>;
login(arg: { login(arg: {
method: "user-pass"; method: "user-pass";
username: string; username: string;
@ -52,3 +52,17 @@ export type ClientSession<T> = {
}): Promise<void>; }): Promise<void>;
logout(): Promise<void>; logout(): Promise<void>;
}; };
export interface SessionContext<T> extends ServerContext {
session: ServerSession<T>;
}
export type ServerContext = {
req: Request;
handle: (req: Request) => Promise<Response>;
mode: "dev" | "prod";
url: {
raw: URL;
pathname: string;
};
};