From 21b7ea49f22380a06088d6791372f41dad395de7 Mon Sep 17 00:00:00 2001 From: rizky Date: Sat, 24 Aug 2024 04:08:24 -0700 Subject: [PATCH] fix --- server/context.ts | 9 ++++ server/server-route.ts | 5 +- server/server-session.ts | 47 ------------------ server/session/client-session.ts | 43 ++++++++++++++++ server/session/router/session-check.ts | 11 +++++ server/session/router/session-router.ts | 5 ++ server/session/server-session.ts | 49 +++++++++++++++++++ server/session/store/client-store.ts | 15 ++++++ server/session/{ => store}/schema.ts | 1 - server/session/{ => store}/session-store.ts | 45 ++--------------- server/session/type.ts | 54 +++++++++++++++++++++ utils/client-session.ts | 2 +- 12 files changed, 193 insertions(+), 93 deletions(-) create mode 100755 server/context.ts delete mode 100755 server/server-session.ts create mode 100755 server/session/client-session.ts create mode 100755 server/session/router/session-check.ts create mode 100755 server/session/router/session-router.ts create mode 100755 server/session/server-session.ts create mode 100755 server/session/store/client-store.ts rename server/session/{ => store}/schema.ts (95%) rename server/session/{ => store}/session-store.ts (76%) create mode 100755 server/session/type.ts diff --git a/server/context.ts b/server/context.ts new file mode 100755 index 0000000..50a1138 --- /dev/null +++ b/server/context.ts @@ -0,0 +1,9 @@ +import { ServerContext, SessionContext } from "./server-route"; + +export const sessionContext = (sf: any) => { + return sf as unknown as SessionContext; +}; + +export const serverContext = (sf: any) => { + return sf as unknown as ServerContext; +}; diff --git a/server/server-route.ts b/server/server-route.ts index af27659..ec206f0 100755 --- a/server/server-route.ts +++ b/server/server-route.ts @@ -1,7 +1,7 @@ import { _post } from "lib/utils/post"; import { addRoute, createRouter, findRoute } from "rou3"; -import { ServerSession } from "./server-session"; -import { SessionData } from "./session/session-store"; +import { ServerSession } from "./session/server-session"; +import { SessionData } from "./session/store/session-store"; export type ServerContext = { req: Request; @@ -104,7 +104,6 @@ export const useServerRouter = >( return new Response(JSON.stringify(result)); } - return await arg.handle(arg.req); }, }; }; diff --git a/server/server-session.ts b/server/server-session.ts deleted file mode 100755 index 4b86026..0000000 --- a/server/server-session.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// - -import { ServerContext, useServerRouter } from "./server-route"; -import { - newSessionStore, - SessionData, - SessionStore, - SingleSession, -} from "./session/session-store"; - -export type ServerSession = SessionStore & { - current?: SingleSession; -}; - -type SessionServerHandler = { - cleanup: () => Promise; - handle: (arg: ServerContext) => Promise; -}; - -export const createSessionServer = (arg: { - encrypt?: boolean; - router?: ReturnType; - site_id?: string; -}): SessionServerHandler => { - const server_session = newSessionStore(arg.site_id); - - const server_handler: SessionServerHandler = { - async cleanup() {}, - async handle(server_arg) { - const { req, handle } = server_arg; - - if (arg.router) { - return await arg.router.handle({ - ...server_arg, - session: { - ...server_session, - current: undefined, - }, - }); - } - - return handle(req); - }, - }; - - return server_handler; -}; diff --git a/server/session/client-session.ts b/server/session/client-session.ts new file mode 100755 index 0000000..9618548 --- /dev/null +++ b/server/session/client-session.ts @@ -0,0 +1,43 @@ +import { newClientRouter } from "../server-route"; +import { sessionRouter } from "./router/session-router"; +import { sessionClientStore } from "./store/client-store"; +import { ClientSession } from "./type"; + +export const newClientSession = (arg?: { + on: Partial<{ + session: ClientSession; + messageReceived: () => Promise; + afterLogin: () => Promise; + afterLogout: () => Promise; + afterRecheck: () => Promise; + }>; +}) => { + const store = sessionClientStore(); + const client = newClientRouter(sessionRouter); + + const session: ClientSession = { + status: "checking", + current: null, + async recheck() { + const current = await store.load(); + if (!current) { + this.status = "guest"; + } else { + this.status = await client.check(current.uid, current.sid); + } + return { status: this.status }; + }, + async login(arg: { + method: "user-pass"; + username: string; + password: string; + }) {}, + async logout() {}, + }; + + session.recheck().then((e) => { + console.log(e); + }); + + return session; +}; diff --git a/server/session/router/session-check.ts b/server/session/router/session-check.ts new file mode 100755 index 0000000..3526f42 --- /dev/null +++ b/server/session/router/session-check.ts @@ -0,0 +1,11 @@ +import { EsensiSession } from "app/server/session"; +import { sessionContext } from "lib/server/context"; +import { ClientSessionStatus } from "../type"; + +export default async function (this: any, uid: string, sid: string) { + const ctx = sessionContext(this); + + let result = "invalid" as ClientSessionStatus; + + return result; +} diff --git a/server/session/router/session-router.ts b/server/session/router/session-router.ts new file mode 100755 index 0000000..3ce0191 --- /dev/null +++ b/server/session/router/session-router.ts @@ -0,0 +1,5 @@ +import { newServerRouter } from "lib/server/server-route"; + +export const sessionRouter = newServerRouter({ + check: ["/_session/check", () => import("./session-check")], +}); diff --git a/server/session/server-session.ts b/server/session/server-session.ts new file mode 100755 index 0000000..fb595d0 --- /dev/null +++ b/server/session/server-session.ts @@ -0,0 +1,49 @@ +/// + +import { ServerContext, useServerRouter } from "../server-route"; +import { sessionRouter } from "./router/session-router"; +import { newSessionStore } from "./store/session-store"; + +type SessionServerHandler = { + cleanup: () => Promise; + handle: (arg: ServerContext) => Promise; +}; + +export const createSessionServer = (arg: { + encrypt?: boolean; + server_router?: ReturnType; + site_id?: string; +}): SessionServerHandler => { + const session_store = newSessionStore(arg.site_id); + + const session_router = useServerRouter(sessionRouter); + + const server_handler: SessionServerHandler = { + async cleanup() {}, + async handle(server_arg) { + const { req, handle, url } = server_arg; + + const route_arg = { + ...server_arg, + session: { + ...session_store, + current: undefined, + }, + }; + + if (url.pathname.startsWith("/_session/")) { + const res = await session_router.handle(route_arg); + if (res) return res; + } + + if (arg.server_router) { + const res = await arg.server_router.handle(route_arg); + if (res) return res; + } + + return handle(req); + }, + }; + + return server_handler; +}; diff --git a/server/session/store/client-store.ts b/server/session/store/client-store.ts new file mode 100755 index 0000000..e478a66 --- /dev/null +++ b/server/session/store/client-store.ts @@ -0,0 +1,15 @@ +import { SessionData } from "../type"; + +const w = window as unknown as { _prasi?: { site_id?: string } }; + +export const sessionClientStore = () => ({ + async load(): Promise> { + if (w._prasi?.site_id) { + const cur = localStorage.getItem(`sid-${w._prasi?.site_id}`); + try { + return JSON.parse(cur || ""); + } catch (e) {} + } + return null; + }, +}); diff --git a/server/session/schema.ts b/server/session/store/schema.ts similarity index 95% rename from server/session/schema.ts rename to server/session/store/schema.ts index 28fd59e..cc99455 100755 --- a/server/session/schema.ts +++ b/server/session/store/schema.ts @@ -1,6 +1,5 @@ import { createId } from "@paralleldrive/cuid2"; import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; -import { select } from "lib/preset/login/utils/select"; export const session = sqliteTable( "session", diff --git a/server/session/session-store.ts b/server/session/store/session-store.ts similarity index 76% rename from server/session/session-store.ts rename to server/session/store/session-store.ts index 1fb4a2b..f3bf02e 100755 --- a/server/session/session-store.ts +++ b/server/session/store/session-store.ts @@ -1,49 +1,12 @@ /// import Database from "bun:sqlite"; -import { dir } from "../utils/dir"; +import { and, eq, sql } from "drizzle-orm"; +import { BunSQLiteDatabase, drizzle } from "drizzle-orm/bun-sqlite"; import { mkdirSync } from "fs"; import { join } from "path"; -import { BunSQLiteDatabase, drizzle } from "drizzle-orm/bun-sqlite"; +import { dir } from "../../utils/dir"; +import { SessionData, SessionStore, SingleSession } from "../type"; import { session } from "./schema"; -import { and, eq, sql } from "drizzle-orm"; - -export interface NewSessionData { - uid: string; - role: string; - data?: T; - expired_at?: number; -} - -export interface SessionData extends NewSessionData { - sid: string; - active: boolean; - created_at: number; -} - -export interface SingleSession extends SessionData { - track: (arg: { path: string }) => void; - destroy: () => boolean; -} - -type FilterSessionArg = { - uid: string; - sid: string; - role: string; - active: boolean; - created_at: { gt?: number; lt?: number }; - expired_at: { gt?: number; lt?: number }; -}; - -export type SessionStore = { - create: (arg: { - uid: string; - role: string; - data?: T; - expired_at?: number; - }) => SingleSession; - findMany: (arg?: Partial) => SingleSession[]; - findFirst: (arg?: Partial) => null | SingleSession; -}; export const newSessionStore = (site_id?: string) => { const db_path = site_id diff --git a/server/session/type.ts b/server/session/type.ts new file mode 100755 index 0000000..1e5233b --- /dev/null +++ b/server/session/type.ts @@ -0,0 +1,54 @@ +export interface NewSessionData { + uid: string; + role: string; + data?: T; + expired_at?: number; +} + +export interface SessionData extends NewSessionData { + sid: string; + active: boolean; + created_at: number; +} + +export interface SingleSession extends SessionData { + track: (arg: { path: string }) => void; + destroy: () => boolean; +} + +type FilterSessionArg = { + uid: string; + sid: string; + role: string; + active: boolean; + created_at: { gt?: number; lt?: number }; + expired_at: { gt?: number; lt?: number }; +}; + +export type SessionStore = { + create: (arg: { + uid: string; + role: string; + data?: T; + expired_at?: number; + }) => SingleSession; + findMany: (arg?: Partial) => SingleSession[]; + findFirst: (arg?: Partial) => null | SingleSession; +}; + +export type ServerSession = SessionStore & { + current?: SingleSession; +}; + +export type ClientSessionStatus = "checking" | "guest" | "expired" | "active"; +export type ClientSession = { + status: ClientSessionStatus; + current: null | SessionData; + recheck(): Promise<{ status: ClientSessionStatus }>; + login(arg: { + method: "user-pass"; + username: string; + password: string; + }): Promise; + logout(): Promise; +}; diff --git a/utils/client-session.ts b/utils/client-session.ts index aff7da6..2a5a8ea 100755 --- a/utils/client-session.ts +++ b/utils/client-session.ts @@ -1,4 +1,4 @@ -import { SessionData } from "lib/server/server-session"; +import { SessionData } from "lib/server/session/server-session"; const w = window as unknown as { _prasi_session: any;