scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
85 lines (76 loc) • 2.13 kB
text/typescript
import {
LoginHandler,
TokenAuthorizationProvider,
clientConfig,
getTokenProvider,
} from 'scrivito_sdk/client';
import {
ApiClient,
ApiClientHeaders,
ApiClientOptions,
FetchOptions,
} from 'scrivito_sdk/client/api_client';
import { fetchJson } from 'scrivito_sdk/client/fetch_json';
import { joinPaths } from 'scrivito_sdk/client/join_paths';
import { withLoginHandler } from 'scrivito_sdk/client/login_handler';
import { loginRedirectHandler } from 'scrivito_sdk/client/login_redirect_handler';
/** @public */
export function createRestApiClient(
baseUrl: string,
options?: ApiClientOptions
): ApiClient {
return new ApiClient(
async (url, fetchOptions?) => fetch(joinPaths(baseUrl, url), fetchOptions),
options
);
}
async function fetch(
url: string,
{
audience,
data,
headers,
loginHandler,
idp,
method: verb,
params,
authViaAccount,
authViaInstance,
credentials,
}: FetchOptions = {}
) {
const method = verb?.toUpperCase() ?? 'GET';
const authorization =
headers && 'Authorization' in headers ? headers.Authorization : undefined;
let handler: LoginHandler | undefined;
let authProvider: TokenAuthorizationProvider;
if (authorization === undefined) {
const config = await clientConfig.fetch();
handler =
loginHandler ??
(config.loginHandler === 'redirect'
? (visit) => loginRedirectHandler(visit, idp)
: undefined);
authProvider = getTokenProvider({
audience: audience || new URL(url).origin,
...(authViaAccount && { authViaAccount }),
...(authViaInstance && { authViaInstance }),
});
}
const fetchFn = () =>
fetchJson(url, {
data,
authProvider,
headers: removeNullValues(headers),
skipAuthorization: authorization === null || !!authorization,
params,
method,
credentials,
});
return method === 'GET' ? withLoginHandler(handler, fetchFn) : fetchFn();
}
function removeNullValues(headers: ApiClientHeaders = {}) {
return Object.fromEntries(
Object.entries(headers).filter(([, v]) => v !== null)
);
}