This commit is contained in:
rizky 2024-09-02 07:06:06 -07:00
parent 6f69c78543
commit 86551c1ba8
6 changed files with 4 additions and 133 deletions

View File

@ -84,7 +84,7 @@ export const useServerRouter = <T extends ReturnType<typeof newServerRouter>>(
try { try {
params = await req.json(); params = await req.json();
} catch (e) {} } catch (e) {}
result = await route.handler.default.bind(arg)(...params); result = await route.handler.default.bind(arg)(params);
} }
if (typeof result === "object" && result instanceof Response) { if (typeof result === "object" && result instanceof Response) {

View File

@ -21,106 +21,9 @@ export const newClientSession = <T>(arg?: {
const session: ClientSession<T> = { const session: ClientSession<T> = {
status: "checking", status: "checking",
wsid: "",
current: null, current: null,
connected: false, connected: false,
get connectURL() { async connect(auth) {},
const url = new URL(location.href);
url.protocol = "wss:";
url.hash = "";
return url;
},
connect(auth?: SessionAuth) {
return new Promise<void>(async (done, reject) => {
const current = this.current;
if (current || auth) {
if (this.ws) {
await wsReady(this.ws);
}
const ws = new WebSocket(this.connectURL);
this.ws = ws;
ws.onclose = () => {
session.connected = false;
console.log(this.status);
if (this.status === "logout") {
store.clear();
this.current = null;
if (arg?.on?.afterLogout) {
arg.on.afterLogout(session);
}
logout_promise.resolve();
logout_promise.resolve = null;
logout_promise.reject = null;
} else {
setTimeout(() => {
console.warn("Reconnecting Session WS...");
this.connect();
}, 2000);
}
};
ws.onopen = () => {
if (session.current) {
ws.send(
JSON.stringify({
uid: session.current.uid,
sid: session.current.sid,
})
);
} else {
if (auth) {
ws.send(JSON.stringify(auth));
} else {
if (ws.readyState === ws.OPEN) {
ws.close();
}
}
}
};
ws.onmessage = async (m) => {
if (!session.connected) {
try {
const parsed = JSON.parse(m.data) as
| {
status: "ok";
wsid: string;
session: SessionData<T>;
}
| { status: "failed" };
if (parsed.status === "ok") {
session.wsid = parsed.wsid;
session.current = parsed.session;
if (login_promise.resolve) {
session.connected = true;
login_promise.resolve(session.current);
await store.save(session.current);
}
} else {
if (login_promise.reject) login_promise.reject();
}
login_promise.resolve = null;
login_promise.reject = null;
if (arg?.on?.afterLogin) {
arg.on.afterLogin(session);
}
done();
return;
} catch (e) {
reject(e);
}
if (ws.readyState === ws.OPEN) {
ws.close();
}
}
};
} else {
done();
}
});
},
async init() { async init() {
const current = await store.load(); const current = await store.load();
if (!current) { if (!current) {
@ -190,12 +93,6 @@ Login is prevented, please logout first before re-login!`
logout_promise.resolve = resolve; logout_promise.resolve = resolve;
logout_promise.reject = reject; logout_promise.reject = reject;
if (this.status === "active" && this.ws) {
await wsReady(this.ws);
this.status = "logout";
this.ws.send(JSON.stringify({ action: "logout" }));
}
}); });
}, },
}; };

View File

@ -2,7 +2,6 @@ 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")],
logout: ["/_session/logout", () => import("./session-logout")], logout: ["/_session/logout", () => import("./session-logout")],
track: ["/_session/track", () => import("./session-track")], track: ["/_session/track", () => import("./session-track")],
}); });

View File

@ -1,18 +0,0 @@
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

@ -22,10 +22,6 @@ export const initSessionServer = <T>(
arg: { arg: {
encrypt?: boolean; encrypt?: boolean;
router?: ReturnType<typeof useServerRouter>; router?: ReturnType<typeof useServerRouter>;
login: (
session: SessionStore<T>,
arg: SessionAuth
) => Promise<SingleSession<T> | false>;
} }
) => { ) => {
try { try {
@ -33,7 +29,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() {},
async handle(server_arg) { async handle(server_arg) {
const { req, handle, url } = server_arg; const { req, handle, url } = server_arg;

View File

@ -53,9 +53,6 @@ export type ClientSessionStatus =
export type ClientSession<T> = { export type ClientSession<T> = {
status: ClientSessionStatus; status: ClientSessionStatus;
current: null | SessionData<T>; current: null | SessionData<T>;
wsid: string;
connectURL: URL;
ws?: WebSocket;
init(): Promise<{ status: ClientSessionStatus }>; init(): Promise<{ status: ClientSessionStatus }>;
connect(auth?: SessionAuth): Promise<void>; connect(auth?: SessionAuth): Promise<void>;
connected: boolean; connected: boolean;
@ -81,4 +78,4 @@ export type SessionAuth = {
method: "user-pass"; method: "user-pass";
username: string; username: string;
password: string; password: string;
}; } & Record<string, any>;