api-def 0.4.1-alpha3 → 0.5.1
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 +13 -15
- package/cjs/Api.js +28 -41
- package/cjs/ApiConstants.d.ts +28 -0
- package/cjs/ApiConstants.js +28 -0
- package/cjs/ApiTypes.d.ts +2 -7
- package/cjs/ApiUtils.d.ts +2 -10
- package/cjs/ApiUtils.js +24 -37
- package/cjs/Endpoint.d.ts +21 -5
- package/cjs/Endpoint.js +16 -31
- package/cjs/MockingTypes.d.ts +28 -0
- package/cjs/{lib/Utils.js → MockingTypes.js} +0 -0
- package/cjs/RequestContext.d.ts +9 -4
- package/cjs/RequestContext.js +4 -2
- package/cjs/RequestError.d.ts +21 -0
- package/cjs/RequestError.js +23 -0
- package/cjs/Requester.d.ts +2 -1
- package/cjs/Requester.js +153 -67
- package/cjs/TextDecoding.d.ts +1 -0
- package/cjs/TextDecoding.js +139 -0
- package/cjs/Utils.d.ts +9 -0
- package/cjs/Utils.js +30 -1
- package/cjs/backend/AxiosRequestBackend.d.ts +4 -3
- package/cjs/backend/AxiosRequestBackend.js +3 -0
- package/cjs/backend/FetchRequestBackend.d.ts +2 -1
- package/cjs/backend/FetchRequestBackend.js +12 -7
- package/cjs/backend/MockRequestBackend.d.ts +10 -0
- package/cjs/backend/MockRequestBackend.js +149 -0
- package/cjs/backend/RequestBackend.d.ts +4 -0
- package/cjs/cache/LocalForageCacheBackend.js +1 -0
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +2 -2
- package/cjs/util/retry/index.d.ts +3 -0
- package/cjs/util/retry/index.js +52 -0
- package/cjs/util/retry/lib/retry.d.ts +3 -0
- package/cjs/util/retry/lib/retry.js +54 -0
- package/cjs/util/retry/lib/retryOperation.d.ts +27 -0
- package/cjs/util/retry/lib/retryOperation.js +134 -0
- package/esm/Api.d.ts +13 -15
- package/esm/Api.js +24 -39
- package/esm/ApiConstants.d.ts +28 -0
- package/esm/ApiConstants.js +28 -0
- package/esm/ApiTypes.d.ts +2 -7
- package/esm/ApiUtils.d.ts +2 -10
- package/esm/ApiUtils.js +22 -35
- package/esm/Endpoint.d.ts +21 -5
- package/esm/Endpoint.js +16 -31
- package/esm/MockingTypes.d.ts +28 -0
- package/esm/{lib/backend/RequestBackend.js → MockingTypes.js} +0 -0
- package/esm/RequestContext.d.ts +9 -4
- package/esm/RequestContext.js +4 -2
- package/esm/RequestError.d.ts +21 -0
- package/esm/RequestError.js +18 -0
- package/esm/Requester.d.ts +2 -1
- package/esm/Requester.js +153 -67
- package/esm/TextDecoding.d.ts +1 -0
- package/esm/TextDecoding.js +135 -0
- package/esm/Utils.d.ts +9 -0
- package/esm/Utils.js +26 -0
- package/esm/backend/AxiosRequestBackend.d.ts +4 -3
- package/esm/backend/AxiosRequestBackend.js +3 -0
- package/esm/backend/FetchRequestBackend.d.ts +2 -1
- package/esm/backend/FetchRequestBackend.js +12 -7
- package/esm/backend/MockRequestBackend.d.ts +10 -0
- package/esm/backend/MockRequestBackend.js +147 -0
- package/esm/backend/RequestBackend.d.ts +4 -0
- package/esm/cache/LocalForageCacheBackend.js +1 -0
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -1
- package/esm/util/retry/index.d.ts +3 -0
- package/esm/util/retry/index.js +50 -0
- package/esm/util/retry/lib/retry.d.ts +3 -0
- package/esm/util/retry/lib/retry.js +50 -0
- package/esm/util/retry/lib/retryOperation.d.ts +27 -0
- package/esm/util/retry/lib/retryOperation.js +132 -0
- package/package.json +29 -19
- package/CHANGELOG.md +0 -39
- package/cjs/Mocking.d.ts +0 -23
- package/cjs/Mocking.js +0 -81
- package/cjs/__tests__/mock/ExampleApis.d.ts +0 -3
- package/cjs/__tests__/mock/ExampleApis.js +0 -19
- package/cjs/lib/Api.d.ts +0 -32
- package/cjs/lib/Api.js +0 -126
- package/cjs/lib/ApiTypes.d.ts +0 -102
- package/cjs/lib/ApiTypes.js +0 -31
- package/cjs/lib/ApiUtils.d.ts +0 -13
- package/cjs/lib/ApiUtils.js +0 -60
- package/cjs/lib/Caching.d.ts +0 -9
- package/cjs/lib/Caching.js +0 -85
- package/cjs/lib/Endpoint.d.ts +0 -30
- package/cjs/lib/Endpoint.js +0 -121
- package/cjs/lib/EndpointBuilder.d.ts +0 -12
- package/cjs/lib/EndpointBuilder.js +0 -27
- package/cjs/lib/Mocking.d.ts +0 -23
- package/cjs/lib/Mocking.js +0 -80
- package/cjs/lib/RequestContext.d.ts +0 -28
- package/cjs/lib/RequestContext.js +0 -166
- package/cjs/lib/Requester.d.ts +0 -2
- package/cjs/lib/Requester.js +0 -164
- package/cjs/lib/Utils.d.ts +0 -1
- package/cjs/lib/backend/AxiosBackend.d.ts +0 -10
- package/cjs/lib/backend/AxiosBackend.js +0 -98
- package/cjs/lib/backend/AxiosRequestBackend.d.ts +0 -11
- package/cjs/lib/backend/AxiosRequestBackend.js +0 -99
- package/cjs/lib/backend/FetchBackend.d.ts +0 -8
- package/cjs/lib/backend/FetchBackend.js +0 -145
- package/cjs/lib/backend/FetchRequestBackend.d.ts +0 -9
- package/cjs/lib/backend/FetchRequestBackend.js +0 -150
- package/cjs/lib/backend/RequestBackend.d.ts +0 -11
- package/cjs/lib/backend/RequestBackend.js +0 -2
- package/cjs/lib/cache/CacheBackend.d.ts +0 -6
- package/cjs/lib/cache/CacheBackend.js +0 -2
- package/cjs/lib/cache/Caching.d.ts +0 -10
- package/cjs/lib/cache/Caching.js +0 -84
- package/cjs/lib/cache/LocalForageCacheBackend.d.ts +0 -9
- package/cjs/lib/cache/LocalForageCacheBackend.js +0 -25
- package/cjs/lib/cache/LocalStorageCacheBackend.d.ts +0 -7
- package/cjs/lib/cache/LocalStorageCacheBackend.js +0 -78
- package/cjs/lib/middleware/CacheMiddleware.d.ts +0 -7
- package/cjs/lib/middleware/CacheMiddleware.js +0 -107
- package/cjs/lib/middleware/LoggingMiddleware.d.ts +0 -7
- package/cjs/lib/middleware/LoggingMiddleware.js +0 -95
- package/esm/Mocking.d.ts +0 -23
- package/esm/Mocking.js +0 -77
- package/esm/__tests__/mock/ExampleApis.d.ts +0 -3
- package/esm/__tests__/mock/ExampleApis.js +0 -16
- package/esm/lib/Api.d.ts +0 -32
- package/esm/lib/Api.js +0 -123
- package/esm/lib/ApiTypes.d.ts +0 -102
- package/esm/lib/ApiTypes.js +0 -28
- package/esm/lib/ApiUtils.d.ts +0 -13
- package/esm/lib/ApiUtils.js +0 -57
- package/esm/lib/Caching.d.ts +0 -9
- package/esm/lib/Caching.js +0 -82
- package/esm/lib/Endpoint.d.ts +0 -30
- package/esm/lib/Endpoint.js +0 -119
- package/esm/lib/EndpointBuilder.d.ts +0 -12
- package/esm/lib/EndpointBuilder.js +0 -25
- package/esm/lib/Mocking.d.ts +0 -23
- package/esm/lib/Mocking.js +0 -77
- package/esm/lib/RequestContext.d.ts +0 -28
- package/esm/lib/RequestContext.js +0 -164
- package/esm/lib/Requester.d.ts +0 -2
- package/esm/lib/Requester.js +0 -161
- package/esm/lib/Utils.d.ts +0 -1
- package/esm/lib/Utils.js +0 -0
- package/esm/lib/backend/AxiosBackend.d.ts +0 -10
- package/esm/lib/backend/AxiosBackend.js +0 -95
- package/esm/lib/backend/AxiosRequestBackend.d.ts +0 -11
- package/esm/lib/backend/AxiosRequestBackend.js +0 -96
- package/esm/lib/backend/FetchBackend.d.ts +0 -8
- package/esm/lib/backend/FetchBackend.js +0 -143
- package/esm/lib/backend/FetchRequestBackend.d.ts +0 -9
- package/esm/lib/backend/FetchRequestBackend.js +0 -148
- package/esm/lib/backend/RequestBackend.d.ts +0 -11
- package/esm/lib/cache/CacheBackend.d.ts +0 -6
- package/esm/lib/cache/CacheBackend.js +0 -1
- package/esm/lib/cache/Caching.d.ts +0 -10
- package/esm/lib/cache/Caching.js +0 -81
- package/esm/lib/cache/LocalForageCacheBackend.d.ts +0 -9
- package/esm/lib/cache/LocalForageCacheBackend.js +0 -23
- package/esm/lib/cache/LocalStorageCacheBackend.d.ts +0 -7
- package/esm/lib/cache/LocalStorageCacheBackend.js +0 -76
- package/esm/lib/middleware/CacheMiddleware.d.ts +0 -7
- package/esm/lib/middleware/CacheMiddleware.js +0 -105
- package/esm/lib/middleware/LoggingMiddleware.d.ts +0 -7
- package/esm/lib/middleware/LoggingMiddleware.js +0 -92
package/esm/Requester.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
1
12
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
13
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
14
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -35,18 +46,27 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
46
|
}
|
|
36
47
|
};
|
|
37
48
|
import * as ApiUtils from "./ApiUtils";
|
|
49
|
+
import { isAcceptableStatus, isNetworkError } from "./ApiUtils";
|
|
38
50
|
import RequestContext from "./RequestContext";
|
|
39
51
|
import * as Api from "./Api";
|
|
40
52
|
import { EventResultType, RequestEvent } from "./ApiConstants";
|
|
53
|
+
import retry from "./util/retry";
|
|
54
|
+
import MockRequestBackend from "./backend/MockRequestBackend";
|
|
55
|
+
import { convertToRequestError, isRequestError, RequestErrorCode } from "./RequestError";
|
|
41
56
|
var locks = {};
|
|
42
57
|
var runningOperations = {};
|
|
43
|
-
|
|
44
|
-
|
|
58
|
+
var MOCK_REQUEST_BACKEND = new MockRequestBackend();
|
|
59
|
+
export var submit = function (host, config, mocking) { return __awaiter(void 0, void 0, void 0, function () {
|
|
60
|
+
var computedConfig, backend, context, key, sameRequest, lock, lockedContext, response, successEventResult, error_1;
|
|
45
61
|
return __generator(this, function (_a) {
|
|
46
62
|
switch (_a.label) {
|
|
47
63
|
case 0:
|
|
48
64
|
computedConfig = host.computeConfig(config);
|
|
49
|
-
|
|
65
|
+
backend = mocking ? MOCK_REQUEST_BACKEND : Api.getRequestBackend();
|
|
66
|
+
if (!backend) {
|
|
67
|
+
throw new Error("[api-def] Please specify a backend you wish to use, this can be done either with 'setRequestBackend()'");
|
|
68
|
+
}
|
|
69
|
+
context = new RequestContext(backend, host, computedConfig, host.computePath(host.path, config), mocking);
|
|
50
70
|
key = context.key;
|
|
51
71
|
sameRequest = runningOperations[key];
|
|
52
72
|
if (sameRequest) {
|
|
@@ -90,87 +110,153 @@ export var submit = function (host, config) { return __awaiter(void 0, void 0, v
|
|
|
90
110
|
}); };
|
|
91
111
|
var defaultBackendMessageShown = false;
|
|
92
112
|
var makeRequest = function (context) { return __awaiter(void 0, void 0, void 0, function () {
|
|
93
|
-
var
|
|
94
|
-
var
|
|
95
|
-
return __generator(this, function (
|
|
96
|
-
switch (
|
|
113
|
+
var beforeSendEventResult, maxRetries, retryOpts, performRequest, response;
|
|
114
|
+
var _a;
|
|
115
|
+
return __generator(this, function (_b) {
|
|
116
|
+
switch (_b.label) {
|
|
97
117
|
case 0:
|
|
98
|
-
backend = Api.requestBackend;
|
|
99
|
-
if (!backend) {
|
|
100
|
-
throw new Error("[api-def] Please specify a backend you wish to use, this can be done either with 'setRequestBackend()'");
|
|
101
|
-
}
|
|
102
118
|
if (process.env.NODE_ENV === "development") {
|
|
103
|
-
if (Api.
|
|
119
|
+
if (Api.isRequestBackendDefault() && !defaultBackendMessageShown) {
|
|
104
120
|
defaultBackendMessageShown = true;
|
|
105
121
|
console.warn("[api-def] Using default fetch backend, you can use a different one with 'setRequestBackend()' (dev only message)");
|
|
106
122
|
}
|
|
107
123
|
}
|
|
108
|
-
context.stats.attempt++;
|
|
109
124
|
return [4 /*yield*/, context.triggerEvent(RequestEvent.BeforeSend)];
|
|
110
125
|
case 1:
|
|
111
|
-
beforeSendEventResult =
|
|
126
|
+
beforeSendEventResult = _b.sent();
|
|
112
127
|
if (beforeSendEventResult &&
|
|
113
128
|
beforeSendEventResult.type === EventResultType.Respond) {
|
|
114
129
|
return [2 /*return*/, (context.response = beforeSendEventResult.response)];
|
|
115
130
|
}
|
|
116
|
-
|
|
131
|
+
maxRetries = ((_a = context.computedConfig) === null || _a === void 0 ? void 0 : _a.retry) || 0;
|
|
132
|
+
retryOpts = {
|
|
133
|
+
retries: maxRetries,
|
|
134
|
+
// assume most users won't want to tune the delay between retries
|
|
135
|
+
minTimeout: 1 * 1000,
|
|
136
|
+
maxTimeout: 5 * 1000,
|
|
137
|
+
randomize: true,
|
|
138
|
+
};
|
|
139
|
+
context.stats.attempt = 0;
|
|
140
|
+
performRequest = function (fnBail, attemptCount) { return __awaiter(void 0, void 0, void 0, function () {
|
|
141
|
+
var _a, promise, canceler, response_1, parsedResponse, rawError_1, error, errorEventResult, shouldNaturallyRetry, forceRetry, unrecoverableErrorEventResult;
|
|
142
|
+
return __generator(this, function (_b) {
|
|
143
|
+
switch (_b.label) {
|
|
144
|
+
case 0:
|
|
145
|
+
context.stats.attempt++;
|
|
146
|
+
_b.label = 1;
|
|
147
|
+
case 1:
|
|
148
|
+
_b.trys.push([1, 4, , 8]);
|
|
149
|
+
_a = context.backend.makeRequest(context), promise = _a.promise, canceler = _a.canceler;
|
|
150
|
+
context.addCanceller(canceler);
|
|
151
|
+
return [4 /*yield*/, promise];
|
|
152
|
+
case 2:
|
|
153
|
+
response_1 = _b.sent();
|
|
154
|
+
return [4 /*yield*/, parseResponse(context, response_1)];
|
|
155
|
+
case 3:
|
|
156
|
+
parsedResponse = (_b.sent());
|
|
157
|
+
if (!isAcceptableStatus(parsedResponse.status, context.computedConfig.acceptableStatus)) {
|
|
158
|
+
throw convertToRequestError({
|
|
159
|
+
error: new Error("[api-def] Invalid response status code '" + parsedResponse.status + "'"),
|
|
160
|
+
response: parsedResponse,
|
|
161
|
+
code: RequestErrorCode.REQUEST_INVALID_STATUS,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
context.response = parsedResponse;
|
|
165
|
+
return [2 /*return*/, (parsedResponse)];
|
|
166
|
+
case 4:
|
|
167
|
+
rawError_1 = _b.sent();
|
|
168
|
+
if (context.cancelled) {
|
|
169
|
+
rawError_1.isCancelledRequest = true;
|
|
170
|
+
}
|
|
171
|
+
return [4 /*yield*/, parseError(context, rawError_1)];
|
|
172
|
+
case 5:
|
|
173
|
+
error = _b.sent();
|
|
174
|
+
context.error = error;
|
|
175
|
+
context.response = error.response;
|
|
176
|
+
// transform array buffer responses to objs
|
|
177
|
+
if (context.response) {
|
|
178
|
+
ApiUtils.parseResponseDataToObject(context.response);
|
|
179
|
+
}
|
|
180
|
+
return [4 /*yield*/, context.triggerEvent(RequestEvent.Error)];
|
|
181
|
+
case 6:
|
|
182
|
+
errorEventResult = _b.sent();
|
|
183
|
+
if ((errorEventResult === null || errorEventResult === void 0 ? void 0 : errorEventResult.type) === EventResultType.Respond) {
|
|
184
|
+
return [2 /*return*/, errorEventResult.response];
|
|
185
|
+
}
|
|
186
|
+
shouldNaturallyRetry = ApiUtils.isNetworkError(error);
|
|
187
|
+
if (shouldNaturallyRetry) {
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
forceRetry = (errorEventResult === null || errorEventResult === void 0 ? void 0 : errorEventResult.type) === EventResultType.Retry;
|
|
191
|
+
if (forceRetry) {
|
|
192
|
+
return [2 /*return*/, performRequest(fnBail, attemptCount)];
|
|
193
|
+
}
|
|
194
|
+
return [4 /*yield*/, context.triggerEvent(RequestEvent.UnrecoverableError)];
|
|
195
|
+
case 7:
|
|
196
|
+
unrecoverableErrorEventResult = _b.sent();
|
|
197
|
+
if (unrecoverableErrorEventResult) {
|
|
198
|
+
if (unrecoverableErrorEventResult.type === EventResultType.Respond) {
|
|
199
|
+
return [2 /*return*/, unrecoverableErrorEventResult.response];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
fnBail(error);
|
|
203
|
+
return [3 /*break*/, 8];
|
|
204
|
+
case 8: return [2 /*return*/];
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}); };
|
|
208
|
+
return [4 /*yield*/, retry(performRequest, retryOpts)];
|
|
209
|
+
case 2:
|
|
210
|
+
response = _b.sent();
|
|
211
|
+
return [2 /*return*/, (response)];
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}); };
|
|
215
|
+
var parseResponse = function (context, response, error) { return __awaiter(void 0, void 0, void 0, function () {
|
|
216
|
+
var parsedResponse;
|
|
217
|
+
return __generator(this, function (_a) {
|
|
218
|
+
switch (_a.label) {
|
|
219
|
+
case 0:
|
|
220
|
+
if (!response) return [3 /*break*/, 2];
|
|
221
|
+
return [4 /*yield*/, context.backend.convertResponse(context, response, error)];
|
|
222
|
+
case 1:
|
|
223
|
+
parsedResponse = _a.sent();
|
|
224
|
+
if (parsedResponse) {
|
|
225
|
+
ApiUtils.parseResponseDataToObject(parsedResponse);
|
|
226
|
+
}
|
|
227
|
+
return [2 /*return*/, parsedResponse];
|
|
228
|
+
case 2: return [2 /*return*/, response];
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}); };
|
|
232
|
+
var parseError = function (context, rawError) { return __awaiter(void 0, void 0, void 0, function () {
|
|
233
|
+
var error, extractedResponse, errorResponse, code, errorInfo;
|
|
234
|
+
return __generator(this, function (_a) {
|
|
235
|
+
switch (_a.label) {
|
|
236
|
+
case 0:
|
|
237
|
+
if (!isRequestError(rawError)) return [3 /*break*/, 1];
|
|
238
|
+
error = rawError;
|
|
239
|
+
return [3 /*break*/, 5];
|
|
240
|
+
case 1: return [4 /*yield*/, context.backend.extractResponseFromError(rawError)];
|
|
117
241
|
case 2:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return [4 /*yield*/,
|
|
242
|
+
extractedResponse = _a.sent();
|
|
243
|
+
errorResponse = undefined;
|
|
244
|
+
if (!(extractedResponse !== undefined)) return [3 /*break*/, 4];
|
|
245
|
+
return [4 /*yield*/, parseResponse(context, extractedResponse, true)];
|
|
122
246
|
case 3:
|
|
123
|
-
|
|
124
|
-
|
|
247
|
+
errorResponse = _a.sent();
|
|
248
|
+
_a.label = 4;
|
|
125
249
|
case 4:
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
error_2 = _d.sent();
|
|
131
|
-
if (context.cancelled) {
|
|
132
|
-
error_2.isCancelledRequest = true;
|
|
133
|
-
}
|
|
134
|
-
context.error = error_2;
|
|
135
|
-
return [4 /*yield*/, backend.extractResponseFromError(error_2)];
|
|
136
|
-
case 6:
|
|
137
|
-
errorResponse = _d.sent();
|
|
138
|
-
if (!(errorResponse !== undefined)) return [3 /*break*/, 8];
|
|
139
|
-
_b = context;
|
|
140
|
-
return [4 /*yield*/, backend.convertResponse(context, errorResponse, true)];
|
|
141
|
-
case 7:
|
|
142
|
-
_b.response = _d.sent();
|
|
143
|
-
error_2.response = context.response;
|
|
144
|
-
_d.label = 8;
|
|
145
|
-
case 8:
|
|
146
|
-
// transform array buffer responses to objs
|
|
147
|
-
if (context.response) {
|
|
148
|
-
ApiUtils.parseResponseDataToObject(context.response);
|
|
149
|
-
}
|
|
150
|
-
return [4 /*yield*/, context.triggerEvent(RequestEvent.Error)];
|
|
151
|
-
case 9:
|
|
152
|
-
errorEventResult = _d.sent();
|
|
153
|
-
if ((errorEventResult === null || errorEventResult === void 0 ? void 0 : errorEventResult.type) === EventResultType.Respond) {
|
|
154
|
-
return [2 /*return*/, errorEventResult.response];
|
|
155
|
-
}
|
|
156
|
-
retry = (_c = context.computedConfig) === null || _c === void 0 ? void 0 : _c.retry;
|
|
157
|
-
shouldNaturallyRetry = ApiUtils.isNetworkError(error_2) && retry && context.stats.attempt < retry;
|
|
158
|
-
shouldRetry = (errorEventResult === null || errorEventResult === void 0 ? void 0 : errorEventResult.type) === EventResultType.Retry ||
|
|
159
|
-
shouldNaturallyRetry;
|
|
160
|
-
// retry request with same config
|
|
161
|
-
if (shouldRetry) {
|
|
162
|
-
return [2 /*return*/, makeRequest(context)];
|
|
163
|
-
}
|
|
164
|
-
return [4 /*yield*/, context.triggerEvent(RequestEvent.UnrecoverableError)];
|
|
165
|
-
case 10:
|
|
166
|
-
unrecoverableErrorEventResult = _d.sent();
|
|
167
|
-
if (unrecoverableErrorEventResult) {
|
|
168
|
-
if (unrecoverableErrorEventResult.type === EventResultType.Respond) {
|
|
169
|
-
return [2 /*return*/, unrecoverableErrorEventResult.response];
|
|
250
|
+
code = isNetworkError(rawError) ? RequestErrorCode.REQUEST_NETWORK_ERROR : RequestErrorCode.MISC_UNKNOWN_ERROR;
|
|
251
|
+
if (errorResponse) {
|
|
252
|
+
if (!isAcceptableStatus(errorResponse.status, context.computedConfig.acceptableStatus)) {
|
|
253
|
+
code = RequestErrorCode.REQUEST_INVALID_STATUS;
|
|
170
254
|
}
|
|
171
255
|
}
|
|
172
|
-
|
|
173
|
-
|
|
256
|
+
errorInfo = context.backend.getErrorInfo(rawError, errorResponse);
|
|
257
|
+
error = convertToRequestError(__assign({ error: rawError, response: errorResponse, code: code }, errorInfo));
|
|
258
|
+
_a.label = 5;
|
|
259
|
+
case 5: return [2 /*return*/, error];
|
|
174
260
|
}
|
|
175
261
|
});
|
|
176
262
|
}); };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const textDecode: (inputArrayOrBuffer: any, options?: any) => string;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/* eslint-disable prefer-const */
|
|
2
|
+
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
3
|
+
// polyfill from https://github.com/anonyco/FastestSmallestTextEncoderDecoder/blob/master/EncoderDecoderTogether.src.js
|
|
4
|
+
export var textDecode = function (inputArrayOrBuffer, options) {
|
|
5
|
+
if (typeof TextDecoder !== "undefined") {
|
|
6
|
+
return new TextDecoder("utf-8").decode(inputArrayOrBuffer);
|
|
7
|
+
}
|
|
8
|
+
var fromCharCode = String.fromCharCode;
|
|
9
|
+
var Object_prototype_toString = ({}).toString;
|
|
10
|
+
var sharedArrayBufferString = Object_prototype_toString.call(window["SharedArrayBuffer"]);
|
|
11
|
+
var undefinedObjectString = Object_prototype_toString();
|
|
12
|
+
var NativeUint8Array = window.Uint8Array;
|
|
13
|
+
var patchedU8Array = NativeUint8Array || Array;
|
|
14
|
+
var nativeArrayBuffer = NativeUint8Array ? ArrayBuffer : patchedU8Array;
|
|
15
|
+
var arrayBuffer_isView = nativeArrayBuffer.isView || function (x) {
|
|
16
|
+
return x && "length" in x;
|
|
17
|
+
};
|
|
18
|
+
var arrayBufferString = Object_prototype_toString.call(nativeArrayBuffer.prototype);
|
|
19
|
+
var tmpBufferU16 = new (NativeUint8Array ? Uint16Array : patchedU8Array)(32);
|
|
20
|
+
var inputAs8 = inputArrayOrBuffer;
|
|
21
|
+
var asObjectString;
|
|
22
|
+
if (!arrayBuffer_isView(inputAs8)) {
|
|
23
|
+
asObjectString = Object_prototype_toString.call(inputAs8);
|
|
24
|
+
if (asObjectString !== arrayBufferString && asObjectString !== sharedArrayBufferString && asObjectString !== undefinedObjectString)
|
|
25
|
+
throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");
|
|
26
|
+
inputAs8 = NativeUint8Array ? new patchedU8Array(inputAs8) : inputAs8 || [];
|
|
27
|
+
}
|
|
28
|
+
var resultingString = "", tmpStr = "", index = 0, len = inputAs8.length | 0, lenMinus32 = len - 32 | 0, nextEnd = 0, cp0 = 0, codePoint = 0, minBits = 0, cp1 = 0, pos = 0, tmp = -1;
|
|
29
|
+
// Note that tmp represents the 2nd half of a surrogate pair incase a surrogate gets divided between blocks
|
|
30
|
+
for (; index < len;) {
|
|
31
|
+
nextEnd = index <= lenMinus32 ? 32 : len - index | 0;
|
|
32
|
+
for (; pos < nextEnd; index = index + 1 | 0, pos = pos + 1 | 0) {
|
|
33
|
+
cp0 = inputAs8[index] & 0xff;
|
|
34
|
+
switch (cp0 >> 4) {
|
|
35
|
+
case 15:
|
|
36
|
+
cp1 = inputAs8[index = index + 1 | 0] & 0xff;
|
|
37
|
+
if ((cp1 >> 6) !== 2 || 247 < cp0) {
|
|
38
|
+
index = index - 1 | 0;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
codePoint = ((cp0 & 7) << 6) | (cp1 & 63);
|
|
42
|
+
minBits = 5; // 20 ensures it never passes -> all invalid replacements
|
|
43
|
+
cp0 = 0x100; // keep track of th bit size
|
|
44
|
+
// eslint-disable-next-line no-fallthrough
|
|
45
|
+
case 14:
|
|
46
|
+
cp1 = inputAs8[index = index + 1 | 0] & 0xff;
|
|
47
|
+
codePoint <<= 6;
|
|
48
|
+
codePoint |= ((cp0 & 15) << 6) | (cp1 & 63);
|
|
49
|
+
minBits = (cp1 >> 6) === 2 ? minBits + 4 | 0 : 24; // 24 ensures it never passes -> all invalid replacements
|
|
50
|
+
cp0 = (cp0 + 0x100) & 0x300; // keep track of th bit size
|
|
51
|
+
// eslint-disable-next-line no-fallthrough
|
|
52
|
+
case 13:
|
|
53
|
+
case 12:
|
|
54
|
+
cp1 = inputAs8[index = index + 1 | 0] & 0xff;
|
|
55
|
+
codePoint <<= 6;
|
|
56
|
+
codePoint |= ((cp0 & 31) << 6) | cp1 & 63;
|
|
57
|
+
minBits = minBits + 7 | 0;
|
|
58
|
+
// Now, process the code point
|
|
59
|
+
if (index < len && (cp1 >> 6) === 2 && (codePoint >> minBits) && codePoint < 0x110000) {
|
|
60
|
+
cp0 = codePoint;
|
|
61
|
+
codePoint = codePoint - 0x10000 | 0;
|
|
62
|
+
if (0 <= codePoint /*0xffff < codePoint*/) { // BMP code point
|
|
63
|
+
//nextEnd = nextEnd - 1|0;
|
|
64
|
+
tmp = (codePoint >> 10) + 0xD800 | 0; // highSurrogate
|
|
65
|
+
cp0 = (codePoint & 0x3ff) + 0xDC00 | 0; // lowSurrogate (will be inserted later in the switch-statement)
|
|
66
|
+
if (pos < 31) { // notice 31 instead of 32
|
|
67
|
+
tmpBufferU16[pos] = tmp;
|
|
68
|
+
pos = pos + 1 | 0;
|
|
69
|
+
tmp = -1;
|
|
70
|
+
}
|
|
71
|
+
else { // else, we are at the end of the inputAs8 and let tmp0 be filled in later on
|
|
72
|
+
// NOTE that cp1 is being used as a temporary variable for the swapping of tmp with cp0
|
|
73
|
+
cp1 = tmp;
|
|
74
|
+
tmp = cp0;
|
|
75
|
+
cp0 = cp1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else
|
|
79
|
+
nextEnd = nextEnd + 1 | 0; // because we are advancing i without advancing pos
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// invalid code point means replacing the whole thing with null replacement characters
|
|
83
|
+
cp0 >>= 8;
|
|
84
|
+
index = index - cp0 - 1 | 0; // reset index back to what it was before
|
|
85
|
+
cp0 = 0xfffd;
|
|
86
|
+
}
|
|
87
|
+
// Finally, reset the variables for the next go-around
|
|
88
|
+
minBits = 0;
|
|
89
|
+
codePoint = 0;
|
|
90
|
+
nextEnd = index <= lenMinus32 ? 32 : len - index | 0;
|
|
91
|
+
/*case 11:
|
|
92
|
+
case 10:
|
|
93
|
+
case 9:
|
|
94
|
+
case 8:
|
|
95
|
+
codePoint ? codePoint = 0 : cp0 = 0xfffd; // fill with invalid replacement character
|
|
96
|
+
case 7:
|
|
97
|
+
case 6:
|
|
98
|
+
case 5:
|
|
99
|
+
case 4:
|
|
100
|
+
case 3:
|
|
101
|
+
case 2:
|
|
102
|
+
case 1:
|
|
103
|
+
case 0:
|
|
104
|
+
tmpBufferU16[pos] = cp0;
|
|
105
|
+
continue;*/
|
|
106
|
+
// eslint-disable-next-line no-fallthrough
|
|
107
|
+
default:
|
|
108
|
+
tmpBufferU16[pos] = cp0; // fill with invalid replacement character
|
|
109
|
+
continue;
|
|
110
|
+
case 11:
|
|
111
|
+
case 10:
|
|
112
|
+
case 9:
|
|
113
|
+
case 8:
|
|
114
|
+
}
|
|
115
|
+
tmpBufferU16[pos] = 0xfffd; // fill with invalid replacement character
|
|
116
|
+
}
|
|
117
|
+
tmpStr += fromCharCode(tmpBufferU16[0], tmpBufferU16[1], tmpBufferU16[2], tmpBufferU16[3], tmpBufferU16[4], tmpBufferU16[5], tmpBufferU16[6], tmpBufferU16[7], tmpBufferU16[8], tmpBufferU16[9], tmpBufferU16[10], tmpBufferU16[11], tmpBufferU16[12], tmpBufferU16[13], tmpBufferU16[14], tmpBufferU16[15], tmpBufferU16[16], tmpBufferU16[17], tmpBufferU16[18], tmpBufferU16[19], tmpBufferU16[20], tmpBufferU16[21], tmpBufferU16[22], tmpBufferU16[23], tmpBufferU16[24], tmpBufferU16[25], tmpBufferU16[26], tmpBufferU16[27], tmpBufferU16[28], tmpBufferU16[29], tmpBufferU16[30], tmpBufferU16[31]);
|
|
118
|
+
if (pos < 32)
|
|
119
|
+
tmpStr = tmpStr.slice(0, pos - 32 | 0); //-(32-pos));
|
|
120
|
+
if (index < len) {
|
|
121
|
+
//fromCharCode.apply(0, tmpBufferU16 : NativeUint8Array ? tmpBufferU16.subarray(0,pos) : tmpBufferU16.slice(0,pos));
|
|
122
|
+
tmpBufferU16[0] = tmp;
|
|
123
|
+
pos = (~tmp) >>> 31; //tmp !== -1 ? 1 : 0;
|
|
124
|
+
tmp = -1;
|
|
125
|
+
if (tmpStr.length < resultingString.length)
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
else if (tmp !== -1) {
|
|
129
|
+
tmpStr += fromCharCode(tmp);
|
|
130
|
+
}
|
|
131
|
+
resultingString += tmpStr;
|
|
132
|
+
tmpStr = "";
|
|
133
|
+
}
|
|
134
|
+
return (resultingString);
|
|
135
|
+
};
|
package/esm/Utils.d.ts
CHANGED
|
@@ -3,3 +3,12 @@ export declare const padNumber: (stringOrNumber: string | number, maxLength: num
|
|
|
3
3
|
export declare type EnumOf<T extends Record<string, any>> = T[keyof T];
|
|
4
4
|
export declare type Fetch = typeof window.fetch;
|
|
5
5
|
export declare const getGlobalFetch: () => Fetch | undefined;
|
|
6
|
+
export declare const noop: () => void;
|
|
7
|
+
/**
|
|
8
|
+
* Just used to simulate lag, or loading times.
|
|
9
|
+
* @param value The value you want to return after the delay
|
|
10
|
+
* @param delayMs The delay in ms
|
|
11
|
+
* @returns The `value` param as a Promise
|
|
12
|
+
*/
|
|
13
|
+
export declare const delayThenReturn: <T>(value: T, delayMs: number) => Promise<T>;
|
|
14
|
+
export declare const randInt: (min: number, max: number) => number;
|
package/esm/Utils.js
CHANGED
|
@@ -30,3 +30,29 @@ export var getGlobalFetch = function () {
|
|
|
30
30
|
}
|
|
31
31
|
return window.fetch.bind(window);
|
|
32
32
|
};
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
34
|
+
export var noop = function () {
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Just used to simulate lag, or loading times.
|
|
38
|
+
* @param value The value you want to return after the delay
|
|
39
|
+
* @param delayMs The delay in ms
|
|
40
|
+
* @returns The `value` param as a Promise
|
|
41
|
+
*/
|
|
42
|
+
export var delayThenReturn = function (value, delayMs) {
|
|
43
|
+
return (new Promise(function (resolve) {
|
|
44
|
+
if (delayMs > 0) {
|
|
45
|
+
setTimeout(function () {
|
|
46
|
+
resolve(value);
|
|
47
|
+
}, delayMs);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
resolve(value);
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
};
|
|
54
|
+
export var randInt = function (min, max) {
|
|
55
|
+
var minI = Math.ceil(min);
|
|
56
|
+
var maxI = Math.floor(max);
|
|
57
|
+
return (Math.floor(Math.random() * (maxI - minI + 1)) + minI);
|
|
58
|
+
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import RequestBackend, { RequestOperation } from "./RequestBackend";
|
|
1
|
+
import RequestBackend, { RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
|
|
2
2
|
import { ApiResponse } from "../ApiTypes";
|
|
3
|
-
import type { AxiosError, AxiosResponse } from "axios";
|
|
3
|
+
import type { AxiosError, AxiosResponse, AxiosStatic } from "axios";
|
|
4
4
|
import RequestContext from "../RequestContext";
|
|
5
5
|
export declare const isAxiosError: (error: Error) => error is AxiosError<any>;
|
|
6
6
|
export default class AxiosRequestBackend implements RequestBackend<AxiosResponse> {
|
|
7
|
-
constructor(axiosLibrary:
|
|
7
|
+
constructor(axiosLibrary: AxiosStatic);
|
|
8
8
|
extractResponseFromError(error: Error): Promise<AxiosResponse | null | undefined>;
|
|
9
9
|
convertResponse<T>(context: RequestContext, response: AxiosResponse): Promise<ApiResponse<T>>;
|
|
10
10
|
makeRequest(context: RequestContext): RequestOperation<AxiosResponse>;
|
|
11
|
+
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
11
12
|
}
|
|
@@ -79,6 +79,9 @@ var AxiosRequestBackend = /** @class */ (function () {
|
|
|
79
79
|
canceler: function () { return canceler && canceler(); },
|
|
80
80
|
};
|
|
81
81
|
};
|
|
82
|
+
AxiosRequestBackend.prototype.getErrorInfo = function (error, response) {
|
|
83
|
+
return undefined;
|
|
84
|
+
};
|
|
82
85
|
return AxiosRequestBackend;
|
|
83
86
|
}());
|
|
84
87
|
export default AxiosRequestBackend;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import RequestBackend, { RequestOperation } from "./RequestBackend";
|
|
1
|
+
import RequestBackend, { RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
|
|
2
2
|
import { ApiResponse } from "../ApiTypes";
|
|
3
3
|
import RequestContext from "../RequestContext";
|
|
4
4
|
import { Fetch } from "../Utils";
|
|
@@ -12,4 +12,5 @@ export default class FetchRequestBackend implements RequestBackend<Response> {
|
|
|
12
12
|
__text?: string;
|
|
13
13
|
}, error?: boolean): Promise<ApiResponse<T>>;
|
|
14
14
|
makeRequest(context: RequestContext): RequestOperation<Response>;
|
|
15
|
+
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
15
16
|
}
|
|
@@ -87,7 +87,7 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
87
87
|
};
|
|
88
88
|
FetchRequestBackend.prototype.convertResponse = function (context, response, error) {
|
|
89
89
|
return __awaiter(this, void 0, void 0, function () {
|
|
90
|
-
var data, responseType, _a, error_1;
|
|
90
|
+
var data, responseType, _a, error_1, status;
|
|
91
91
|
return __generator(this, function (_b) {
|
|
92
92
|
switch (_b.label) {
|
|
93
93
|
case 0:
|
|
@@ -122,11 +122,13 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
122
122
|
throw Object.assign(new Error("[api-def] Invalid '" + context.responseType + "' response, got: '" + response.__text + "'"), {
|
|
123
123
|
response: response,
|
|
124
124
|
});
|
|
125
|
-
case 9:
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
125
|
+
case 9:
|
|
126
|
+
status = response.status;
|
|
127
|
+
return [2 /*return*/, {
|
|
128
|
+
data: data,
|
|
129
|
+
status: status,
|
|
130
|
+
headers: response.headers,
|
|
131
|
+
}];
|
|
130
132
|
}
|
|
131
133
|
});
|
|
132
134
|
});
|
|
@@ -182,7 +184,7 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
182
184
|
throw error;
|
|
183
185
|
}
|
|
184
186
|
if (softAbort) {
|
|
185
|
-
throw new Error("Request was aborted");
|
|
187
|
+
throw new Error("[api-def] Request was aborted");
|
|
186
188
|
}
|
|
187
189
|
return response;
|
|
188
190
|
});
|
|
@@ -196,6 +198,9 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
196
198
|
},
|
|
197
199
|
};
|
|
198
200
|
};
|
|
201
|
+
FetchRequestBackend.prototype.getErrorInfo = function (error, response) {
|
|
202
|
+
return undefined;
|
|
203
|
+
};
|
|
199
204
|
return FetchRequestBackend;
|
|
200
205
|
}());
|
|
201
206
|
export default FetchRequestBackend;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import RequestBackend, { RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
|
|
2
|
+
import { ApiResponse } from "../ApiTypes";
|
|
3
|
+
import RequestContext from "../RequestContext";
|
|
4
|
+
export default class MockRequestBackend implements RequestBackend<ApiResponse> {
|
|
5
|
+
convertResponse<T>(context: RequestContext, response: ApiResponse, error?: boolean): Promise<ApiResponse<T>>;
|
|
6
|
+
extractResponseFromError(error: Error): Promise<ApiResponse | null | undefined>;
|
|
7
|
+
private runRequest;
|
|
8
|
+
makeRequest(context: RequestContext): RequestOperation<ApiResponse>;
|
|
9
|
+
getErrorInfo(error: Error, response: ApiResponse | undefined | null): RequestBackendErrorInfo | undefined;
|
|
10
|
+
}
|