From 6d52c8e2772819d3b79d4be67b21936f6c285e84 Mon Sep 17 00:00:00 2001 From: rizky Date: Mon, 2 Sep 2024 06:50:12 -0700 Subject: [PATCH] fixing session --- session/client-session.ts | 2 +- .../router/{session-router.ts => router.ts} | 1 + session/router/session-login.ts | 18 ++ session/server-session.ts | 172 +----------------- 4 files changed, 22 insertions(+), 171 deletions(-) rename session/router/{session-router.ts => router.ts} (73%) create mode 100755 session/router/session-login.ts diff --git a/session/client-session.ts b/session/client-session.ts index 307b88f..6a06951 100755 --- a/session/client-session.ts +++ b/session/client-session.ts @@ -1,6 +1,6 @@ import { ConsoleLogWriter } from "drizzle-orm"; import { newClientRouter } from "../server/server-route"; -import { sessionRouter } from "./router/session-router"; +import { sessionRouter } from "./router/router"; import { sessionClientStore } from "./store/client-store"; import { ClientSession, SessionAuth, SessionData } from "./type"; diff --git a/session/router/session-router.ts b/session/router/router.ts similarity index 73% rename from session/router/session-router.ts rename to session/router/router.ts index 3ce0191..e812e52 100755 --- a/session/router/session-router.ts +++ b/session/router/router.ts @@ -2,4 +2,5 @@ import { newServerRouter } from "lib/server/server-route"; export const sessionRouter = newServerRouter({ check: ["/_session/check", () => import("./session-check")], + login: ["/_session/login", () => import("./session-login")], }); diff --git a/session/router/session-login.ts b/session/router/session-login.ts new file mode 100755 index 0000000..d77d5af --- /dev/null +++ b/session/router/session-login.ts @@ -0,0 +1,18 @@ +import { EsensiSession } from "app/server/session"; +import { sessionContext } from "lib/server/context"; +import { ClientSessionStatus, SessionAuth } from "../type"; + +export default async function (this: any, arg: SessionAuth) { + const ctx = sessionContext(this); + // let result = "invalid" as ClientSessionStatus; + // const session = ctx.session.findFirst({ uid, sid }); + // if (session) { + // if (!session.expired_at || session.expired_at > Date.now()) { + // result = "active"; + // } else { + // result = "expired"; + // } + // } + + return { status: "ok" }; +} diff --git a/session/server-session.ts b/session/server-session.ts index 34ed441..60d9606 100755 --- a/session/server-session.ts +++ b/session/server-session.ts @@ -2,7 +2,7 @@ import { ServerWebSocket } from "bun"; import { useServerRouter } from "../server/server-route"; -import { sessionRouter } from "./router/session-router"; +import { sessionRouter } from "./router/router"; import { newSessionStore } from "./store/session-store"; import { ServerContext, @@ -10,19 +10,11 @@ import { SessionStore, SingleSession, } from "./type"; -import { createId } from "@paralleldrive/cuid2"; -import { ConsoleLogWriter } from "drizzle-orm"; type WS = ServerWebSocket<{ url: string }>; type SessionServerHandler = { cleanup: () => Promise; handle: (arg: ServerContext) => Promise; - ws: { - sids: Record; - index: Record; - conns: Map; - init: () => PrasiServer["ws"]; - }; }; export const initSessionServer = ( @@ -41,166 +33,7 @@ export const initSessionServer = ( const session_router = useServerRouter(sessionRouter); const server_handler: SessionServerHandler = { async cleanup() {}, - ws: { - sids: {}, - index: {}, - conns: new Map(), - init() { - return { - async message(ws, message) { - const sids = server_handler.ws.sids; - const conns = server_handler.ws.conns; - const index = server_handler.ws.index; - const conn = conns.get(ws); - if (conn) { - try { - if (typeof message === "string") { - const parsed = JSON.parse(message) as { action: "logout" }; - - if (parsed.action === "logout") { - const sid = `${conn.uid}-${conn.sid}`; - - if (!sids[sid]) { - sids[sid] = []; - } - sids[sid].forEach((e) => { - conns.delete(e); - e.close(); - }); - - session_store.update( - { sid: conn.sid, uid: conn.uid }, - { - active: false, - wsid: [], - } - ); - } - } - } catch (e) {} - } else { - try { - if (typeof message === "string") { - const activateSession = (result: SingleSession) => { - try { - const wsid = createId(); - conns.set(ws, { - wsid, - uid: result.uid, - sid: result.sid, - }); - - index[wsid] = ws; - const sid = `${result.uid}-${result.sid}`; - - if (!sids[sid]) { - sids[sid] = []; - } - - sids[sid].push(ws); - - const wsids = Object.values(sids[sid]).map( - (e) => server_handler.ws.conns.get(e)?.sid || "" - ); - - session_store.update( - { sid: result.sid, uid: result.uid }, - { - wsid: wsids, - } - ); - - ws.send( - JSON.stringify({ - status: "ok", - wsid, - session: result, - }) - ); - } catch (e) { - console.error(e); - } - }; - - const parsed = JSON.parse(message) as - | { - method: undefined; - uid: string; - sid: string; - } - | SessionAuth; - - if (parsed) { - if (parsed.method) { - if (parsed.method === "user-pass") { - const result = await arg.login(session_store, parsed); - if (result) { - activateSession(result); - } else { - ws.send(JSON.stringify({ status: "failed" })); - } - } - } else { - const result = session_store.findFirst({ - uid: parsed.uid, - sid: parsed.sid, - }); - - if (result) { - if ( - result.active && - (!result.expired_at || - (result.expired_at && - result.expired_at > Date.now())) - ) { - activateSession(result); - } else { - session_store.update( - { - uid: parsed.uid, - sid: parsed.sid, - }, - { active: false } - ); - - ws.send(JSON.stringify({ status: "expired" })); - } - } - } - } - } - } catch (e) { - console.error(e); - } - } - }, - close(ws, code, reason) { - const result = server_handler.ws.conns.get(ws); - - if (result) { - const sid = `${result.uid}-${result.sid}`; - if (server_handler.ws.sids[sid]) { - server_handler.ws.sids[sid] = server_handler.ws.sids[ - sid - ].filter((e) => e !== ws); - - session_store.update( - { sid: result.sid }, - { - wsid: Object.values(server_handler.ws.sids[sid]).map( - (e) => server_handler.ws.conns.get(e)?.sid || "" - ), - } - ); - } - - delete server_handler.ws.index[result.wsid]; - server_handler.ws.conns.delete(ws); - } - }, - }; - }, - }, + async handle(server_arg) { const { req, handle, url } = server_arg; @@ -226,7 +59,6 @@ export const initSessionServer = ( }, }; - server.ws = server_handler.ws.init(); server.session = server_handler; } catch (e) { console.log(e);