src/utils/DefaultPageHandlers.ts
import {EnforcerFunction} from "keycloak-lambda-authorizer/dist/src/Options";
import {
Options,
} from "../index";
import {DefaultSessionManager} from "../session/SessionManager";
import {APIGateWayOptions} from "../apigateway/ApiGateway";
import {DefaultLogout} from "../logout/Logout";
import {DefaultUrlJWKS} from "../jwks/UrlJWKS";
import {DefaultCallback} from "../callback/Callback";
import {DefaultTenantAdapter} from "../tenant/TenantAdapter";
import {DefaultMultiTenantAdapter} from "../multitenants/Multi-tenant-adapter";
import {TenantInternalPage} from "../handlers/TenantInternalPage";
import {PublicUrlPageHandler} from "../handlers/PublicUrlPageHandler";
import {TokenPageHandler} from "../handlers/TokenPageHandler";
import {SingleTenantUrlPageHandler} from "../handlers/SingleTenantUrlPageHandler";
/**
* default Page Handler
*/
export const defaultPageHandlers = (enforcer?: EnforcerFunction) => ([
new TenantInternalPage('/tenants', 35000),
new PublicUrlPageHandler('(.*)(/public)(.*)', 10000),
new PublicUrlPageHandler('(.*)(.(jpg|jpeg|png|gif|bmp))', 10000),
new PublicUrlPageHandler('(.*)(.(ico|tiff))', 10000),
new PublicUrlPageHandler('(.*)(.(css))', 10000),
new TokenPageHandler("/token"),
new SingleTenantUrlPageHandler("/", 0, enforcer),
new SingleTenantUrlPageHandler("/index.html", 32000, enforcer),
]);
function transform(opts: APIGateWayOptions): Options {
const options: Options = {
session: {
sessionConfiguration: {
storageType: opts.storageType,
storageTypeSettings: opts.storageTypeSettings,
keys: opts.keys,
},
},
singleTenantOptions: {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
defaultAdapterOptions: opts.defaultAdapterOptions,
idp: opts.identityProviders?.singleTenant,
},
pageHandlers: opts.pageHandlers,
};
if (opts.multiTenantAdapterOptions && opts.multiTenantJson) {
options.multiTenantOptions = {
multiTenantJson: opts.multiTenantJson,
multiTenantAdapterOptions: opts.multiTenantAdapterOptions,
idp: opts.identityProviders?.multiTenant,
};
}
options.defaultAuthorization = opts.defaultAuthorization;
return options;
}
export function initOptions(opts: APIGateWayOptions | Options): Options {
const options = (<any>opts).session ? <Options>opts : transform(<APIGateWayOptions>opts);
if (!options.logout) {
options.logout = new DefaultLogout(options);
}
if (!options.jwks) {
options.jwks = new DefaultUrlJWKS(options);
}
if (!options.session.sessionManager) {
options.session.sessionManager = new DefaultSessionManager(options);
}
if (!options.callback) {
options.callback = new DefaultCallback(options);
}
if (options.singleTenantOptions) {
if (!options.singleTenantOptions.singleTenantAdapter) {
options.singleTenantOptions.singleTenantAdapter = new DefaultTenantAdapter(options);
}
}
if (options.multiTenantOptions) {
if (!options.multiTenantOptions.multiTenantAdapter) {
options.multiTenantOptions.multiTenantAdapter = new DefaultMultiTenantAdapter(options);
}
}
if (!options.pageHandlers || options.pageHandlers.length === 0) {
options.pageHandlers = defaultPageHandlers(options.defaultAuthorization);
}
return options;
}