import { WebPartContext } from '@microsoft/sp-webpart-base'; import { SPHttpClient, AadHttpClient } from '@microsoft/sp-http'; import { IHttpClient, IHttpRequest, IHttpResponse } from './IHttpClient'; // Адаптеры SPFx-клиентов к IHttpClient. Вся работа с авторизацией — здесь, // остальной код о SPFx не знает. export function createSharePointClient(context: WebPartContext): IHttpClient { return { fetch: (url: string, request: IHttpRequest = {}): Promise => context.spHttpClient.fetch(url, SPHttpClient.configurations.v1, { method: request.method ?? 'GET', headers: request.headers, body: request.body }) }; } /** * Клиент к ресурсу под AAD (Dataverse или корпоративный API). * AadHttpClient создаётся лениво и один раз — получение клиента запрашивает токен. */ export function createAadClient(context: WebPartContext, resource: string): IHttpClient { let clientPromise: Promise | undefined; // Неудачную попытку не запоминаем: иначе одна сетевая осечка при получении токена // ломала бы все запросы к этому ресурсу до перезагрузки страницы. const getClient = (): Promise => { if (!clientPromise) { clientPromise = context.aadHttpClientFactory.getClient(resource).catch((error: unknown) => { clientPromise = undefined; throw error; }); } return clientPromise; }; return { fetch: async (url: string, request: IHttpRequest = {}): Promise => { const client = await getClient(); return client.fetch(url, AadHttpClient.configurations.v1, { method: request.method ?? 'GET', headers: request.headers, body: request.body }); } }; }