@compas/store
Version:
Postgres & S3-compatible wrappers for common things
96 lines (81 loc) • 2.42 kB
JavaScript
import {
AppError,
eventStart,
eventStop,
newEventFromEvent,
} from "@compas/stdlib";
import { sessionStoreGet } from "./session-store.js";
/**
* @template T
* @typedef {import("@compas/stdlib").Either<T, AppError>} Either
*/
/**
* @typedef {object} SessionTransportSettings
* @property {import("./session-store.js").SessionStoreSettings} sessionStoreSettings JWT
* generation settings
* @property {boolean} [enableHeaderTransport] Defaults to true, can be used to disable
* reading the `Authorization` header
* @property {object} [headerOptions] Object containing options to configure reading from
* the 'Authorization' header.
*/
/**
* Load the session from the authorization header.
*
* @param {import("@compas/stdlib").InsightEvent} event
* @param {import("postgres").Sql<{}>} sql
* @param {import("koa").Context} ctx
* @param {SessionTransportSettings} settings
* @returns {Promise<Either<{session:
* import("./generated/common/types.d.ts").QueryResultStoreSessionStore}>>}
*/
export async function sessionTransportLoadFromContext(
event,
sql,
ctx,
settings,
) {
eventStart(event, "sessionTransport.loadFromContext");
validateSessionTransportSettings(settings);
let accessToken;
if (settings.enableHeaderTransport) {
accessToken = sessionTransportLoadAuthorizationHeader(ctx);
}
const session = await sessionStoreGet(
newEventFromEvent(event),
sql,
settings.sessionStoreSettings,
accessToken,
);
eventStop(event);
// We need to return the same `Either<X,Y>` as `sessionStoreGet`.
return session;
}
/**
*
* @param {SessionTransportSettings} opts
* @returns {SessionTransportSettings}
*/
export function validateSessionTransportSettings(opts) {
opts.enableHeaderTransport = opts.enableHeaderTransport ?? true;
opts.headerOptions = opts.headerOptions ?? {};
if (!opts.enableHeaderTransport) {
throw AppError.serverError({
message:
"Invalid session transport settings. Needs `enableHeaderTransport` set to 'true'.",
});
}
return opts;
}
/**
* Read the authorization header from the Koa context
*
* @param {import("koa").Context} ctx
* @returns {string|undefined}
*/
function sessionTransportLoadAuthorizationHeader(ctx) {
const header = ctx.headers?.["authorization"] ?? "";
if (!header.startsWith("Bearer")) {
return undefined;
}
return header.slice("Bearer".length);
}