Keycloak

Форк
0
/
parse-response.ts 
53 строки · 1.3 Кб
1
import { isRecord } from "../utils/isRecord";
2
import { CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON } from "./constants";
3

4
export class ApiError extends Error {}
5

6
export async function parseResponse<T>(response: Response): Promise<T> {
7
  const contentType = response.headers.get(CONTENT_TYPE_HEADER);
8
  const isJSON = contentType ? contentType.includes(CONTENT_TYPE_JSON) : false;
9

10
  if (!isJSON) {
11
    throw new Error(
12
      `Expected response to have a JSON content type, got '${contentType}' instead.`,
13
    );
14
  }
15

16
  const data = await parseJSON(response);
17

18
  if (!response.ok) {
19
    throw new ApiError(getErrorMessage(data));
20
  }
21

22
  return data as T;
23
}
24

25
async function parseJSON(response: Response): Promise<unknown> {
26
  try {
27
    return await response.json();
28
  } catch (error) {
29
    throw new Error("Unable to parse response as valid JSON.", {
30
      cause: error,
31
    });
32
  }
33
}
34

35
function getErrorMessage(data: unknown): string {
36
  if (!isRecord(data)) {
37
    throw new Error("Unable to retrieve error message from response.");
38
  }
39

40
  const errorKeys = ["error_description", "errorMessage", "error"];
41

42
  for (const key of errorKeys) {
43
    const value = data[key];
44

45
    if (typeof value === "string") {
46
      return value;
47
    }
48
  }
49

50
  throw new Error(
51
    "Unable to retrieve error message from response, no matching key found.",
52
  );
53
}
54

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.