fixing session

This commit is contained in:
rizky 2024-09-02 06:50:12 -07:00
parent 5f29db5756
commit 6d52c8e277
4 changed files with 22 additions and 171 deletions

View File

@ -1,6 +1,6 @@
import { ConsoleLogWriter } from "drizzle-orm"; import { ConsoleLogWriter } from "drizzle-orm";
import { newClientRouter } from "../server/server-route"; import { newClientRouter } from "../server/server-route";
import { sessionRouter } from "./router/session-router"; import { sessionRouter } from "./router/router";
import { sessionClientStore } from "./store/client-store"; import { sessionClientStore } from "./store/client-store";
import { ClientSession, SessionAuth, SessionData } from "./type"; import { ClientSession, SessionAuth, SessionData } from "./type";

View File

@ -2,4 +2,5 @@ import { newServerRouter } from "lib/server/server-route";
export const sessionRouter = newServerRouter({ export const sessionRouter = newServerRouter({
check: ["/_session/check", () => import("./session-check")], check: ["/_session/check", () => import("./session-check")],
login: ["/_session/login", () => import("./session-login")],
}); });

18
session/router/session-login.ts Executable file
View File

@ -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<EsensiSession>(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" };
}

View File

@ -2,7 +2,7 @@
import { ServerWebSocket } from "bun"; import { ServerWebSocket } from "bun";
import { useServerRouter } from "../server/server-route"; import { useServerRouter } from "../server/server-route";
import { sessionRouter } from "./router/session-router"; import { sessionRouter } from "./router/router";
import { newSessionStore } from "./store/session-store"; import { newSessionStore } from "./store/session-store";
import { import {
ServerContext, ServerContext,
@ -10,19 +10,11 @@ import {
SessionStore, SessionStore,
SingleSession, SingleSession,
} from "./type"; } from "./type";
import { createId } from "@paralleldrive/cuid2";
import { ConsoleLogWriter } from "drizzle-orm";
type WS = ServerWebSocket<{ url: string }>; type WS = ServerWebSocket<{ url: string }>;
type SessionServerHandler = { type SessionServerHandler = {
cleanup: () => Promise<void>; cleanup: () => Promise<void>;
handle: (arg: ServerContext) => Promise<Response>; handle: (arg: ServerContext) => Promise<Response>;
ws: {
sids: Record<string, WS[]>;
index: Record<string, WS>;
conns: Map<WS, { sid: string; uid: string; wsid: string }>;
init: () => PrasiServer["ws"];
};
}; };
export const initSessionServer = <T>( export const initSessionServer = <T>(
@ -41,166 +33,7 @@ export const initSessionServer = <T>(
const session_router = useServerRouter(sessionRouter); const session_router = useServerRouter(sessionRouter);
const server_handler: SessionServerHandler = { const server_handler: SessionServerHandler = {
async cleanup() {}, 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<T>) => {
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) { async handle(server_arg) {
const { req, handle, url } = server_arg; const { req, handle, url } = server_arg;
@ -226,7 +59,6 @@ export const initSessionServer = <T>(
}, },
}; };
server.ws = server_handler.ws.init();
server.session = server_handler; server.session = server_handler;
} catch (e) { } catch (e) {
console.log(e); console.log(e);