@keycloakify/keycloak-account-ui
Version:
<p align="center"> <img src="https://github.com/user-attachments/assets/e31c4910-7205-441c-9a35-e134b806b3a8"> </p> <p align="center"> <i>Repackaged Keycloak Account UI</i> <br> <br> <a href="https://github.com/keycloakify/keycloak-a
75 lines (66 loc) • 1.8 kB
text/typescript
import {
KeycloakContext,
type BaseEnvironment,
} from "@keycloakify/keycloak-account-ui/ui-shared";
import Keycloak from "keycloak-js";
import { joinPath } from "@keycloakify/keycloak-account-ui/utils/joinPath";
import { CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON } from "@keycloakify/keycloak-account-ui/api/constants";
export type RequestOptions = {
signal?: AbortSignal;
getAccessToken?: () => Promise<string | undefined>;
method?: "POST" | "PUT" | "DELETE";
searchParams?: Record<string, string>;
body?: unknown;
};
async function _request(
url: URL,
{ signal, getAccessToken, method, searchParams, body }: RequestOptions = {},
): Promise<Response> {
if (searchParams) {
Object.entries(searchParams).forEach(([key, value]) =>
url.searchParams.set(key, value),
);
}
return fetch(url, {
signal,
method,
body: body ? JSON.stringify(body) : undefined,
headers: {
[CONTENT_TYPE_HEADER]: CONTENT_TYPE_JSON,
authorization: `Bearer ${await getAccessToken?.()}`,
},
});
}
export async function request(
path: string,
{ environment, keycloak }: KeycloakContext<BaseEnvironment>,
opts: RequestOptions = {},
fullUrl?: URL,
) {
if (typeof fullUrl === "undefined") {
fullUrl = url(environment, path);
}
return _request(fullUrl, {
...opts,
getAccessToken: token(keycloak),
});
}
export const url = (environment: BaseEnvironment, path: string) =>
new URL(
joinPath(
environment.serverBaseUrl,
"realms",
environment.realm,
"account",
path,
),
);
export const token = (keycloak: Keycloak) =>
async function getAccessToken() {
try {
await keycloak.updateToken(5);
} catch (error) {
await keycloak.login();
}
return keycloak.token;
};