api-def 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cjs/Api.d.ts +35 -35
- package/cjs/Api.js +140 -144
- package/cjs/ApiConstants.d.ts +58 -58
- package/cjs/ApiConstants.js +55 -55
- package/cjs/ApiTypes.d.ts +103 -103
- package/cjs/ApiTypes.js +4 -4
- package/cjs/ApiUtils.d.ts +6 -6
- package/cjs/ApiUtils.js +51 -53
- package/cjs/Endpoint.d.ts +52 -52
- package/cjs/Endpoint.js +104 -108
- package/cjs/EndpointBuilder.d.ts +14 -14
- package/cjs/EndpointBuilder.js +46 -46
- package/cjs/MockingTypes.d.ts +30 -30
- package/cjs/MockingTypes.js +2 -2
- package/cjs/QueryHandling.d.ts +3 -3
- package/cjs/QueryHandling.js +24 -24
- package/cjs/RequestConfig.d.ts +2 -2
- package/cjs/RequestConfig.js +74 -74
- package/cjs/RequestContext.d.ts +48 -48
- package/cjs/RequestContext.js +235 -238
- package/cjs/RequestError.d.ts +30 -30
- package/cjs/RequestError.js +47 -47
- package/cjs/Requester.d.ts +3 -3
- package/cjs/Requester.js +335 -336
- package/cjs/TextDecoding.d.ts +1 -1
- package/cjs/TextDecoding.js +152 -139
- package/cjs/UtilTypes.d.ts +5 -5
- package/cjs/UtilTypes.js +2 -2
- package/cjs/Utils.d.ts +15 -15
- package/cjs/Utils.js +79 -77
- package/cjs/Validation.d.ts +8 -8
- package/cjs/Validation.js +2 -2
- package/cjs/backend/AxiosRequestBackend.d.ts +13 -13
- package/cjs/backend/AxiosRequestBackend.js +99 -99
- package/cjs/backend/FetchRequestBackend.d.ts +15 -15
- package/cjs/backend/FetchRequestBackend.js +203 -202
- package/cjs/backend/MockRequestBackend.d.ts +11 -11
- package/cjs/backend/MockRequestBackend.js +164 -164
- package/cjs/backend/RequestBackend.d.ts +19 -19
- package/cjs/backend/RequestBackend.js +2 -2
- package/cjs/cache/CacheBackend.d.ts +6 -6
- package/cjs/cache/CacheBackend.js +2 -2
- package/cjs/cache/Caching.d.ts +10 -10
- package/cjs/cache/Caching.js +88 -88
- package/cjs/cache/LocalForageCacheBackend.d.ts +9 -9
- package/cjs/cache/LocalForageCacheBackend.js +24 -24
- package/cjs/cache/LocalStorageCacheBackend.d.ts +7 -7
- package/cjs/cache/LocalStorageCacheBackend.js +77 -77
- package/cjs/index.d.ts +13 -13
- package/cjs/index.js +41 -41
- package/cjs/middleware/CacheMiddleware.d.ts +7 -7
- package/cjs/middleware/CacheMiddleware.js +107 -107
- package/cjs/middleware/LoggingMiddleware.d.ts +6 -6
- package/cjs/middleware/LoggingMiddleware.js +82 -88
- package/cjs/util/retry/index.d.ts +3 -3
- package/cjs/util/retry/index.js +52 -52
- package/cjs/util/retry/lib/retry.d.ts +3 -3
- package/cjs/util/retry/lib/retry.js +50 -54
- package/cjs/util/retry/lib/retryOperation.d.ts +27 -27
- package/cjs/util/retry/lib/retryOperation.js +130 -134
- package/esm/Api.d.ts +35 -35
- package/esm/Api.js +92 -98
- package/esm/ApiConstants.d.ts +58 -58
- package/esm/ApiConstants.js +52 -52
- package/esm/ApiTypes.d.ts +103 -103
- package/esm/ApiTypes.js +1 -1
- package/esm/ApiUtils.d.ts +6 -6
- package/esm/ApiUtils.js +43 -45
- package/esm/Endpoint.d.ts +52 -52
- package/esm/Endpoint.js +66 -70
- package/esm/EndpointBuilder.d.ts +14 -14
- package/esm/EndpointBuilder.js +31 -31
- package/esm/MockingTypes.d.ts +30 -30
- package/esm/MockingTypes.js +1 -1
- package/esm/QueryHandling.d.ts +3 -3
- package/esm/QueryHandling.js +19 -19
- package/esm/RequestConfig.d.ts +2 -2
- package/esm/RequestConfig.js +56 -56
- package/esm/RequestContext.d.ts +48 -48
- package/esm/RequestContext.js +167 -170
- package/esm/RequestError.d.ts +30 -30
- package/esm/RequestError.js +42 -42
- package/esm/Requester.d.ts +3 -3
- package/esm/Requester.js +252 -253
- package/esm/TextDecoding.d.ts +1 -1
- package/esm/TextDecoding.js +148 -135
- package/esm/UtilTypes.d.ts +5 -5
- package/esm/UtilTypes.js +1 -1
- package/esm/Utils.d.ts +15 -15
- package/esm/Utils.js +66 -68
- package/esm/Validation.d.ts +8 -8
- package/esm/Validation.js +1 -1
- package/esm/backend/AxiosRequestBackend.d.ts +13 -13
- package/esm/backend/AxiosRequestBackend.js +62 -62
- package/esm/backend/FetchRequestBackend.d.ts +15 -15
- package/esm/backend/FetchRequestBackend.js +136 -136
- package/esm/backend/MockRequestBackend.d.ts +11 -11
- package/esm/backend/MockRequestBackend.js +116 -116
- package/esm/backend/RequestBackend.d.ts +19 -19
- package/esm/backend/RequestBackend.js +1 -1
- package/esm/cache/CacheBackend.d.ts +6 -6
- package/esm/cache/CacheBackend.js +1 -1
- package/esm/cache/Caching.d.ts +10 -10
- package/esm/cache/Caching.js +39 -39
- package/esm/cache/LocalForageCacheBackend.d.ts +9 -9
- package/esm/cache/LocalForageCacheBackend.js +20 -20
- package/esm/cache/LocalStorageCacheBackend.d.ts +7 -7
- package/esm/cache/LocalStorageCacheBackend.js +32 -32
- package/esm/index.d.ts +13 -13
- package/esm/index.js +14 -15
- package/esm/middleware/CacheMiddleware.d.ts +7 -7
- package/esm/middleware/CacheMiddleware.js +58 -58
- package/esm/middleware/LoggingMiddleware.d.ts +6 -6
- package/esm/middleware/LoggingMiddleware.js +77 -83
- package/esm/util/retry/index.d.ts +3 -3
- package/esm/util/retry/index.js +50 -50
- package/esm/util/retry/lib/retry.d.ts +3 -3
- package/esm/util/retry/lib/retry.js +35 -39
- package/esm/util/retry/lib/retryOperation.d.ts +27 -27
- package/esm/util/retry/lib/retryOperation.js +126 -132
- package/package.json +19 -34
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
let axios;
|
|
11
|
-
export const isAxiosError = (error) => {
|
|
12
|
-
return "isAxiosError" in error;
|
|
13
|
-
};
|
|
14
|
-
export default class AxiosRequestBackend {
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
16
|
-
constructor(axiosLibrary) {
|
|
17
|
-
this.id = "axios";
|
|
18
|
-
axios = axiosLibrary;
|
|
19
|
-
}
|
|
20
|
-
extractResponseFromError(error) {
|
|
21
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
-
if (isAxiosError(error)) {
|
|
23
|
-
return error.response ? error.response : null;
|
|
24
|
-
}
|
|
25
|
-
return undefined;
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
convertResponse(context, response) {
|
|
29
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
return {
|
|
31
|
-
method: context.method,
|
|
32
|
-
url: response.request.res.responseUrl,
|
|
33
|
-
data: response.data,
|
|
34
|
-
headers: response.headers,
|
|
35
|
-
status: response.status,
|
|
36
|
-
__lowercaseHeaders: response._lowerCaseResponseHeaders,
|
|
37
|
-
};
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
makeRequest(context) {
|
|
41
|
-
const { computedConfig } = context;
|
|
42
|
-
const url = context.requestUrl;
|
|
43
|
-
let canceler = null;
|
|
44
|
-
const promise = axios({
|
|
45
|
-
method: context.method,
|
|
46
|
-
url: url.href,
|
|
47
|
-
data: context.getParsedBody(),
|
|
48
|
-
headers: computedConfig.headers || {},
|
|
49
|
-
responseType: context.responseType,
|
|
50
|
-
cancelToken: new axios.CancelToken((cancellerFunc) => {
|
|
51
|
-
canceler = cancellerFunc;
|
|
52
|
-
}),
|
|
53
|
-
});
|
|
54
|
-
return {
|
|
55
|
-
promise: promise,
|
|
56
|
-
canceler: () => canceler
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
getErrorInfo(error, response) {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
let axios;
|
|
11
|
+
export const isAxiosError = (error) => {
|
|
12
|
+
return "isAxiosError" in error;
|
|
13
|
+
};
|
|
14
|
+
export default class AxiosRequestBackend {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
16
|
+
constructor(axiosLibrary) {
|
|
17
|
+
this.id = "axios";
|
|
18
|
+
axios = axiosLibrary;
|
|
19
|
+
}
|
|
20
|
+
extractResponseFromError(error) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
if (isAxiosError(error)) {
|
|
23
|
+
return error.response ? error.response : null;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
convertResponse(context, response) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
return {
|
|
31
|
+
method: context.method,
|
|
32
|
+
url: response.request.res.responseUrl,
|
|
33
|
+
data: response.data,
|
|
34
|
+
headers: response.headers,
|
|
35
|
+
status: response.status,
|
|
36
|
+
__lowercaseHeaders: response._lowerCaseResponseHeaders,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
makeRequest(context) {
|
|
41
|
+
const { computedConfig } = context;
|
|
42
|
+
const url = context.requestUrl;
|
|
43
|
+
let canceler = null;
|
|
44
|
+
const promise = axios({
|
|
45
|
+
method: context.method,
|
|
46
|
+
url: url.href,
|
|
47
|
+
data: context.getParsedBody(),
|
|
48
|
+
headers: computedConfig.headers || {},
|
|
49
|
+
responseType: context.responseType,
|
|
50
|
+
cancelToken: new axios.CancelToken((cancellerFunc) => {
|
|
51
|
+
canceler = cancellerFunc;
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
promise: promise,
|
|
56
|
+
canceler: () => canceler === null || canceler === void 0 ? void 0 : canceler(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
getErrorInfo(error, response) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
export default class FetchRequestBackend implements RequestBackend<Response> {
|
|
6
|
-
fetch: (((input: RequestInfo | URL, init?: RequestInit | undefined) => Promise<Response>) & typeof fetch) | undefined;
|
|
7
|
-
readonly id = "fetch";
|
|
8
|
-
constructor(fetchLibrary?: Fetch);
|
|
9
|
-
extractResponseFromError(error: Error): Promise<Response | null | undefined>;
|
|
10
|
-
convertResponse<T>(context: RequestContext, response: Response & {
|
|
11
|
-
__text?: string;
|
|
12
|
-
}): Promise<ConvertedApiResponse<T>>;
|
|
13
|
-
makeRequest(context: RequestContext): RequestOperation<Response>;
|
|
14
|
-
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
15
|
-
}
|
|
1
|
+
import { ApiResponse } from "../ApiTypes";
|
|
2
|
+
import RequestContext from "../RequestContext";
|
|
3
|
+
import { Fetch } from "../Utils";
|
|
4
|
+
import RequestBackend, { ConvertedApiResponse, RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
|
|
5
|
+
export default class FetchRequestBackend implements RequestBackend<Response> {
|
|
6
|
+
fetch: (((input: RequestInfo | URL, init?: RequestInit | undefined) => Promise<Response>) & typeof fetch) | undefined;
|
|
7
|
+
readonly id = "fetch";
|
|
8
|
+
constructor(fetchLibrary?: Fetch);
|
|
9
|
+
extractResponseFromError(error: Error): Promise<Response | null | undefined>;
|
|
10
|
+
convertResponse<T>(context: RequestContext, response: Response & {
|
|
11
|
+
__text?: string;
|
|
12
|
+
}): Promise<ConvertedApiResponse<T>>;
|
|
13
|
+
makeRequest(context: RequestContext): RequestOperation<Response>;
|
|
14
|
+
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
15
|
+
}
|
|
@@ -1,136 +1,136 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
14
|
-
class FetchError extends Error {
|
|
15
|
-
}
|
|
16
|
-
export default class FetchRequestBackend {
|
|
17
|
-
constructor(fetchLibrary) {
|
|
18
|
-
this.fetch = getGlobalFetch();
|
|
19
|
-
this.id = "fetch";
|
|
20
|
-
if (fetchLibrary !== undefined) {
|
|
21
|
-
this.fetch = fetchLibrary;
|
|
22
|
-
// otherwise window throws illegal invocation
|
|
23
|
-
if (fetchLibrary === getGlobalFetch()) {
|
|
24
|
-
this.fetch = fetchLibrary.bind(getGlobal());
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
extractResponseFromError(error) {
|
|
29
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
if ("response" in error) {
|
|
31
|
-
const fetchError = error;
|
|
32
|
-
return fetchError.response ? fetchError.response : null;
|
|
33
|
-
}
|
|
34
|
-
return undefined;
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
convertResponse(context, response) {
|
|
38
|
-
var _a;
|
|
39
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
-
const { status, headers } = response;
|
|
41
|
-
const processedHeaders = {};
|
|
42
|
-
headers.forEach((value, key) => {
|
|
43
|
-
processedHeaders[key] = value;
|
|
44
|
-
});
|
|
45
|
-
const convertedResponse = {
|
|
46
|
-
__lowercaseHeaders: processedHeaders,
|
|
47
|
-
method: context.method,
|
|
48
|
-
url: response.url,
|
|
49
|
-
data: undefined,
|
|
50
|
-
status: status,
|
|
51
|
-
headers: processedHeaders,
|
|
52
|
-
};
|
|
53
|
-
const responseType = (_a = context.responseType) !== null && _a !== void 0 ? _a : inferResponseType(response.headers.get("Content-Type"));
|
|
54
|
-
let text;
|
|
55
|
-
let data;
|
|
56
|
-
try {
|
|
57
|
-
if (responseType === "arraybuffer") {
|
|
58
|
-
data = yield response.arrayBuffer();
|
|
59
|
-
}
|
|
60
|
-
else if (responseType === "json") {
|
|
61
|
-
text = yield response.text();
|
|
62
|
-
data = JSON.parse(text);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
data = response.text();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
throw convertToRequestError({
|
|
70
|
-
error: Object.assign(new Error(`[api-def] Failed to parse response as '${responseType}'${text ? `, got: ${text}` : ""}`), {
|
|
71
|
-
cause: error,
|
|
72
|
-
}),
|
|
73
|
-
code: RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
|
|
74
|
-
context: context,
|
|
75
|
-
response: convertedResponse,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
convertedResponse.data = data;
|
|
79
|
-
return convertedResponse;
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
makeRequest(context) {
|
|
83
|
-
if (!this.fetch) {
|
|
84
|
-
throw new Error("[api-def] No fetch impl was provided to FetchRequestBackend");
|
|
85
|
-
}
|
|
86
|
-
const { computedConfig } = context;
|
|
87
|
-
// abort controller is a newer feature than fetch
|
|
88
|
-
const abortController = AbortController && new AbortController();
|
|
89
|
-
const abortSignal = abortController ? abortController.signal : undefined;
|
|
90
|
-
let softAbort = false;
|
|
91
|
-
let responded = false;
|
|
92
|
-
const body = context.getParsedBody();
|
|
93
|
-
const bodyJsonify = body !== null && typeof body === "object";
|
|
94
|
-
const headers = Utils.assign({
|
|
95
|
-
// logic from axios
|
|
96
|
-
"Content-Type": bodyJsonify ? "application/json;charset=utf-8" : "application/x-www-form-urlencoded",
|
|
97
|
-
}, computedConfig.headers);
|
|
98
|
-
const parsedHeaders = Object.keys(headers).reduce((parsedHeaders, key) => {
|
|
99
|
-
const value = headers[key];
|
|
100
|
-
if (value !== undefined) {
|
|
101
|
-
parsedHeaders[key] = value;
|
|
102
|
-
}
|
|
103
|
-
return parsedHeaders;
|
|
104
|
-
}, {});
|
|
105
|
-
const url = context.requestUrl;
|
|
106
|
-
const promise = this.fetch(url.href, {
|
|
107
|
-
method: context.method.toUpperCase(),
|
|
108
|
-
body: bodyJsonify ? JSON.stringify(body) : body,
|
|
109
|
-
headers: parsedHeaders,
|
|
110
|
-
mode: "cors",
|
|
111
|
-
signal: abortSignal,
|
|
112
|
-
}).then((response) => {
|
|
113
|
-
responded = true;
|
|
114
|
-
if (!response.ok) {
|
|
115
|
-
const error = new FetchError("Fetch failed");
|
|
116
|
-
error.response = response;
|
|
117
|
-
throw error;
|
|
118
|
-
}
|
|
119
|
-
if (softAbort) {
|
|
120
|
-
throw new Error("[api-def] Request was aborted");
|
|
121
|
-
}
|
|
122
|
-
return response;
|
|
123
|
-
});
|
|
124
|
-
return {
|
|
125
|
-
promise: promise,
|
|
126
|
-
canceler: abortSignal
|
|
127
|
-
? () => !responded && abortController.abort()
|
|
128
|
-
: () => {
|
|
129
|
-
softAbort = true;
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
getErrorInfo(error, response) {
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { inferResponseType } from "../ApiUtils";
|
|
11
|
+
import { RequestErrorCode, convertToRequestError } from "../RequestError";
|
|
12
|
+
import * as Utils from "../Utils";
|
|
13
|
+
import { getGlobal, getGlobalFetch } from "../Utils";
|
|
14
|
+
class FetchError extends Error {
|
|
15
|
+
}
|
|
16
|
+
export default class FetchRequestBackend {
|
|
17
|
+
constructor(fetchLibrary) {
|
|
18
|
+
this.fetch = getGlobalFetch();
|
|
19
|
+
this.id = "fetch";
|
|
20
|
+
if (fetchLibrary !== undefined) {
|
|
21
|
+
this.fetch = fetchLibrary;
|
|
22
|
+
// otherwise window throws illegal invocation
|
|
23
|
+
if (fetchLibrary === getGlobalFetch()) {
|
|
24
|
+
this.fetch = fetchLibrary.bind(getGlobal());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
extractResponseFromError(error) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
if ("response" in error) {
|
|
31
|
+
const fetchError = error;
|
|
32
|
+
return fetchError.response ? fetchError.response : null;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
convertResponse(context, response) {
|
|
38
|
+
var _a;
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
const { status, headers } = response;
|
|
41
|
+
const processedHeaders = {};
|
|
42
|
+
headers.forEach((value, key) => {
|
|
43
|
+
processedHeaders[key] = value;
|
|
44
|
+
});
|
|
45
|
+
const convertedResponse = {
|
|
46
|
+
__lowercaseHeaders: processedHeaders,
|
|
47
|
+
method: context.method,
|
|
48
|
+
url: response.url,
|
|
49
|
+
data: undefined,
|
|
50
|
+
status: status,
|
|
51
|
+
headers: processedHeaders,
|
|
52
|
+
};
|
|
53
|
+
const responseType = (_a = context.responseType) !== null && _a !== void 0 ? _a : inferResponseType(response.headers.get("Content-Type"));
|
|
54
|
+
let text;
|
|
55
|
+
let data;
|
|
56
|
+
try {
|
|
57
|
+
if (responseType === "arraybuffer") {
|
|
58
|
+
data = yield response.arrayBuffer();
|
|
59
|
+
}
|
|
60
|
+
else if (responseType === "json") {
|
|
61
|
+
text = yield response.text();
|
|
62
|
+
data = JSON.parse(text);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
data = yield response.text();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw convertToRequestError({
|
|
70
|
+
error: Object.assign(new Error(`[api-def] Failed to parse response as '${responseType}'${text ? `, got: ${text}` : ""}`), {
|
|
71
|
+
cause: error,
|
|
72
|
+
}),
|
|
73
|
+
code: RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
|
|
74
|
+
context: context,
|
|
75
|
+
response: convertedResponse,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
convertedResponse.data = data;
|
|
79
|
+
return convertedResponse;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
makeRequest(context) {
|
|
83
|
+
if (!this.fetch) {
|
|
84
|
+
throw new Error("[api-def] No fetch impl was provided to FetchRequestBackend");
|
|
85
|
+
}
|
|
86
|
+
const { computedConfig } = context;
|
|
87
|
+
// abort controller is a newer feature than fetch
|
|
88
|
+
const abortController = AbortController && new AbortController();
|
|
89
|
+
const abortSignal = abortController ? abortController.signal : undefined;
|
|
90
|
+
let softAbort = false;
|
|
91
|
+
let responded = false;
|
|
92
|
+
const body = context.getParsedBody();
|
|
93
|
+
const bodyJsonify = body !== null && typeof body === "object";
|
|
94
|
+
const headers = Utils.assign({
|
|
95
|
+
// logic from axios
|
|
96
|
+
"Content-Type": bodyJsonify ? "application/json;charset=utf-8" : "application/x-www-form-urlencoded",
|
|
97
|
+
}, computedConfig.headers);
|
|
98
|
+
const parsedHeaders = Object.keys(headers).reduce((parsedHeaders, key) => {
|
|
99
|
+
const value = headers[key];
|
|
100
|
+
if (value !== undefined) {
|
|
101
|
+
parsedHeaders[key] = value;
|
|
102
|
+
}
|
|
103
|
+
return parsedHeaders;
|
|
104
|
+
}, {});
|
|
105
|
+
const url = context.requestUrl;
|
|
106
|
+
const promise = this.fetch(url.href, {
|
|
107
|
+
method: context.method.toUpperCase(),
|
|
108
|
+
body: bodyJsonify ? JSON.stringify(body) : body,
|
|
109
|
+
headers: parsedHeaders,
|
|
110
|
+
mode: "cors",
|
|
111
|
+
signal: abortSignal,
|
|
112
|
+
}).then((response) => {
|
|
113
|
+
responded = true;
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
const error = new FetchError("Fetch failed");
|
|
116
|
+
error.response = response;
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
if (softAbort) {
|
|
120
|
+
throw new Error("[api-def] Request was aborted");
|
|
121
|
+
}
|
|
122
|
+
return response;
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
promise: promise,
|
|
126
|
+
canceler: abortSignal
|
|
127
|
+
? () => !responded && abortController.abort()
|
|
128
|
+
: () => {
|
|
129
|
+
softAbort = true;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
getErrorInfo(error, response) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
export default class MockRequestBackend implements RequestBackend<ApiResponse> {
|
|
5
|
-
readonly id = "mock";
|
|
6
|
-
convertResponse<T>(context: RequestContext, response: ApiResponse, error?: boolean): Promise<ApiResponse<T>>;
|
|
7
|
-
extractResponseFromError(error: Error): Promise<ApiResponse | null | undefined>;
|
|
8
|
-
private runRequest;
|
|
9
|
-
makeRequest(context: RequestContext): RequestOperation<ApiResponse>;
|
|
10
|
-
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
11
|
-
}
|
|
1
|
+
import { ApiResponse } from "../ApiTypes";
|
|
2
|
+
import RequestContext from "../RequestContext";
|
|
3
|
+
import RequestBackend, { RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
|
|
4
|
+
export default class MockRequestBackend implements RequestBackend<ApiResponse> {
|
|
5
|
+
readonly id = "mock";
|
|
6
|
+
convertResponse<T>(context: RequestContext, response: ApiResponse, error?: boolean): Promise<ApiResponse<T>>;
|
|
7
|
+
extractResponseFromError(error: Error): Promise<ApiResponse | null | undefined>;
|
|
8
|
+
private runRequest;
|
|
9
|
+
makeRequest(context: RequestContext): RequestOperation<ApiResponse>;
|
|
10
|
+
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
11
|
+
}
|