///
type ServerArg = {
req: Request;
handle: (req: Request) => Promise;
mode: "dev" | "prod";
url: {
raw: URL;
pathname: string;
};
};
type ServerSession = {
handle: (arg: ServerArg) => Promise;
};
export const sessionServer = (arg: {
encrypt?: boolean;
router?: (
arg: ServerArg & { session: {} }
) => Response | (() => Promise) | void;
on: {
login: (arg: {
mode: "user-pass";
username: string;
password: string;
}) => Promise;
};
}): ServerSession => {
const s: ServerSession = {
async handle(server_arg) {
const { req, handle, mode, url } = server_arg;
if (typeof arg.router === "function") {
let result = arg.router({
...server_arg,
session: {},
});
if (result && typeof result === "function") {
result = await result();
}
if (result instanceof Response) {
return result;
}
}
return await handle(req);
},
};
return s;
};