fixing session
This commit is contained in:
parent
5f29db5756
commit
6d52c8e277
|
|
@ -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";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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")],
|
||||||
});
|
});
|
||||||
|
|
@ -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" };
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue