33 lines
930 B
JavaScript
33 lines
930 B
JavaScript
|
import {redirect} from '@remix-run/react';
|
||
|
|
||
|
import namer from './namer';
|
||
|
|
||
|
export async function loadSession(request) {
|
||
|
const {parse} = await import('#state/cookie.server');
|
||
|
return parse(request, 'session');
|
||
|
}
|
||
|
|
||
|
export async function juggleSession(request) {
|
||
|
const session = await loadSession(request);
|
||
|
const url = new URL(request.url);
|
||
|
if (!session) {
|
||
|
if (!url.searchParams.has('session')) {
|
||
|
const [id] = crypto.getRandomValues(new Uint32Array(1));
|
||
|
throw redirect(`${url.origin}${url.pathname}?session`, {
|
||
|
headers: {
|
||
|
'Set-Cookie': await writeSession({id, name: namer()}),
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
else if (url.searchParams.has('session')) {
|
||
|
throw redirect(`${url.origin}${url.pathname}`);
|
||
|
}
|
||
|
return session ? session : {id: 0};
|
||
|
}
|
||
|
|
||
|
async function writeSession(session) {
|
||
|
const {serialize} = await import('#state/cookie.server');
|
||
|
return serialize('session', session);
|
||
|
}
|