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.
Files changed (167) hide show
  1. package/README.md +1 -1
  2. package/cjs/Api.d.ts +13 -15
  3. package/cjs/Api.js +28 -41
  4. package/cjs/ApiConstants.d.ts +28 -0
  5. package/cjs/ApiConstants.js +28 -0
  6. package/cjs/ApiTypes.d.ts +2 -7
  7. package/cjs/ApiUtils.d.ts +2 -10
  8. package/cjs/ApiUtils.js +24 -37
  9. package/cjs/Endpoint.d.ts +21 -5
  10. package/cjs/Endpoint.js +16 -31
  11. package/cjs/MockingTypes.d.ts +28 -0
  12. package/cjs/{lib/Utils.js → MockingTypes.js} +0 -0
  13. package/cjs/RequestContext.d.ts +9 -4
  14. package/cjs/RequestContext.js +4 -2
  15. package/cjs/RequestError.d.ts +21 -0
  16. package/cjs/RequestError.js +23 -0
  17. package/cjs/Requester.d.ts +2 -1
  18. package/cjs/Requester.js +153 -67
  19. package/cjs/TextDecoding.d.ts +1 -0
  20. package/cjs/TextDecoding.js +139 -0
  21. package/cjs/Utils.d.ts +9 -0
  22. package/cjs/Utils.js +30 -1
  23. package/cjs/backend/AxiosRequestBackend.d.ts +4 -3
  24. package/cjs/backend/AxiosRequestBackend.js +3 -0
  25. package/cjs/backend/FetchRequestBackend.d.ts +2 -1
  26. package/cjs/backend/FetchRequestBackend.js +12 -7
  27. package/cjs/backend/MockRequestBackend.d.ts +10 -0
  28. package/cjs/backend/MockRequestBackend.js +149 -0
  29. package/cjs/backend/RequestBackend.d.ts +4 -0
  30. package/cjs/cache/LocalForageCacheBackend.js +1 -0
  31. package/cjs/index.d.ts +1 -1
  32. package/cjs/index.js +2 -2
  33. package/cjs/util/retry/index.d.ts +3 -0
  34. package/cjs/util/retry/index.js +52 -0
  35. package/cjs/util/retry/lib/retry.d.ts +3 -0
  36. package/cjs/util/retry/lib/retry.js +54 -0
  37. package/cjs/util/retry/lib/retryOperation.d.ts +27 -0
  38. package/cjs/util/retry/lib/retryOperation.js +134 -0
  39. package/esm/Api.d.ts +13 -15
  40. package/esm/Api.js +24 -39
  41. package/esm/ApiConstants.d.ts +28 -0
  42. package/esm/ApiConstants.js +28 -0
  43. package/esm/ApiTypes.d.ts +2 -7
  44. package/esm/ApiUtils.d.ts +2 -10
  45. package/esm/ApiUtils.js +22 -35
  46. package/esm/Endpoint.d.ts +21 -5
  47. package/esm/Endpoint.js +16 -31
  48. package/esm/MockingTypes.d.ts +28 -0
  49. package/esm/{lib/backend/RequestBackend.js → MockingTypes.js} +0 -0
  50. package/esm/RequestContext.d.ts +9 -4
  51. package/esm/RequestContext.js +4 -2
  52. package/esm/RequestError.d.ts +21 -0
  53. package/esm/RequestError.js +18 -0
  54. package/esm/Requester.d.ts +2 -1
  55. package/esm/Requester.js +153 -67
  56. package/esm/TextDecoding.d.ts +1 -0
  57. package/esm/TextDecoding.js +135 -0
  58. package/esm/Utils.d.ts +9 -0
  59. package/esm/Utils.js +26 -0
  60. package/esm/backend/AxiosRequestBackend.d.ts +4 -3
  61. package/esm/backend/AxiosRequestBackend.js +3 -0
  62. package/esm/backend/FetchRequestBackend.d.ts +2 -1
  63. package/esm/backend/FetchRequestBackend.js +12 -7
  64. package/esm/backend/MockRequestBackend.d.ts +10 -0
  65. package/esm/backend/MockRequestBackend.js +147 -0
  66. package/esm/backend/RequestBackend.d.ts +4 -0
  67. package/esm/cache/LocalForageCacheBackend.js +1 -0
  68. package/esm/index.d.ts +1 -1
  69. package/esm/index.js +1 -1
  70. package/esm/util/retry/index.d.ts +3 -0
  71. package/esm/util/retry/index.js +50 -0
  72. package/esm/util/retry/lib/retry.d.ts +3 -0
  73. package/esm/util/retry/lib/retry.js +50 -0
  74. package/esm/util/retry/lib/retryOperation.d.ts +27 -0
  75. package/esm/util/retry/lib/retryOperation.js +132 -0
  76. package/package.json +29 -19
  77. package/CHANGELOG.md +0 -39
  78. package/cjs/Mocking.d.ts +0 -23
  79. package/cjs/Mocking.js +0 -81
  80. package/cjs/__tests__/mock/ExampleApis.d.ts +0 -3
  81. package/cjs/__tests__/mock/ExampleApis.js +0 -19
  82. package/cjs/lib/Api.d.ts +0 -32
  83. package/cjs/lib/Api.js +0 -126
  84. package/cjs/lib/ApiTypes.d.ts +0 -102
  85. package/cjs/lib/ApiTypes.js +0 -31
  86. package/cjs/lib/ApiUtils.d.ts +0 -13
  87. package/cjs/lib/ApiUtils.js +0 -60
  88. package/cjs/lib/Caching.d.ts +0 -9
  89. package/cjs/lib/Caching.js +0 -85
  90. package/cjs/lib/Endpoint.d.ts +0 -30
  91. package/cjs/lib/Endpoint.js +0 -121
  92. package/cjs/lib/EndpointBuilder.d.ts +0 -12
  93. package/cjs/lib/EndpointBuilder.js +0 -27
  94. package/cjs/lib/Mocking.d.ts +0 -23
  95. package/cjs/lib/Mocking.js +0 -80
  96. package/cjs/lib/RequestContext.d.ts +0 -28
  97. package/cjs/lib/RequestContext.js +0 -166
  98. package/cjs/lib/Requester.d.ts +0 -2
  99. package/cjs/lib/Requester.js +0 -164
  100. package/cjs/lib/Utils.d.ts +0 -1
  101. package/cjs/lib/backend/AxiosBackend.d.ts +0 -10
  102. package/cjs/lib/backend/AxiosBackend.js +0 -98
  103. package/cjs/lib/backend/AxiosRequestBackend.d.ts +0 -11
  104. package/cjs/lib/backend/AxiosRequestBackend.js +0 -99
  105. package/cjs/lib/backend/FetchBackend.d.ts +0 -8
  106. package/cjs/lib/backend/FetchBackend.js +0 -145
  107. package/cjs/lib/backend/FetchRequestBackend.d.ts +0 -9
  108. package/cjs/lib/backend/FetchRequestBackend.js +0 -150
  109. package/cjs/lib/backend/RequestBackend.d.ts +0 -11
  110. package/cjs/lib/backend/RequestBackend.js +0 -2
  111. package/cjs/lib/cache/CacheBackend.d.ts +0 -6
  112. package/cjs/lib/cache/CacheBackend.js +0 -2
  113. package/cjs/lib/cache/Caching.d.ts +0 -10
  114. package/cjs/lib/cache/Caching.js +0 -84
  115. package/cjs/lib/cache/LocalForageCacheBackend.d.ts +0 -9
  116. package/cjs/lib/cache/LocalForageCacheBackend.js +0 -25
  117. package/cjs/lib/cache/LocalStorageCacheBackend.d.ts +0 -7
  118. package/cjs/lib/cache/LocalStorageCacheBackend.js +0 -78
  119. package/cjs/lib/middleware/CacheMiddleware.d.ts +0 -7
  120. package/cjs/lib/middleware/CacheMiddleware.js +0 -107
  121. package/cjs/lib/middleware/LoggingMiddleware.d.ts +0 -7
  122. package/cjs/lib/middleware/LoggingMiddleware.js +0 -95
  123. package/esm/Mocking.d.ts +0 -23
  124. package/esm/Mocking.js +0 -77
  125. package/esm/__tests__/mock/ExampleApis.d.ts +0 -3
  126. package/esm/__tests__/mock/ExampleApis.js +0 -16
  127. package/esm/lib/Api.d.ts +0 -32
  128. package/esm/lib/Api.js +0 -123
  129. package/esm/lib/ApiTypes.d.ts +0 -102
  130. package/esm/lib/ApiTypes.js +0 -28
  131. package/esm/lib/ApiUtils.d.ts +0 -13
  132. package/esm/lib/ApiUtils.js +0 -57
  133. package/esm/lib/Caching.d.ts +0 -9
  134. package/esm/lib/Caching.js +0 -82
  135. package/esm/lib/Endpoint.d.ts +0 -30
  136. package/esm/lib/Endpoint.js +0 -119
  137. package/esm/lib/EndpointBuilder.d.ts +0 -12
  138. package/esm/lib/EndpointBuilder.js +0 -25
  139. package/esm/lib/Mocking.d.ts +0 -23
  140. package/esm/lib/Mocking.js +0 -77
  141. package/esm/lib/RequestContext.d.ts +0 -28
  142. package/esm/lib/RequestContext.js +0 -164
  143. package/esm/lib/Requester.d.ts +0 -2
  144. package/esm/lib/Requester.js +0 -161
  145. package/esm/lib/Utils.d.ts +0 -1
  146. package/esm/lib/Utils.js +0 -0
  147. package/esm/lib/backend/AxiosBackend.d.ts +0 -10
  148. package/esm/lib/backend/AxiosBackend.js +0 -95
  149. package/esm/lib/backend/AxiosRequestBackend.d.ts +0 -11
  150. package/esm/lib/backend/AxiosRequestBackend.js +0 -96
  151. package/esm/lib/backend/FetchBackend.d.ts +0 -8
  152. package/esm/lib/backend/FetchBackend.js +0 -143
  153. package/esm/lib/backend/FetchRequestBackend.d.ts +0 -9
  154. package/esm/lib/backend/FetchRequestBackend.js +0 -148
  155. package/esm/lib/backend/RequestBackend.d.ts +0 -11
  156. package/esm/lib/cache/CacheBackend.d.ts +0 -6
  157. package/esm/lib/cache/CacheBackend.js +0 -1
  158. package/esm/lib/cache/Caching.d.ts +0 -10
  159. package/esm/lib/cache/Caching.js +0 -81
  160. package/esm/lib/cache/LocalForageCacheBackend.d.ts +0 -9
  161. package/esm/lib/cache/LocalForageCacheBackend.js +0 -23
  162. package/esm/lib/cache/LocalStorageCacheBackend.d.ts +0 -7
  163. package/esm/lib/cache/LocalStorageCacheBackend.js +0 -76
  164. package/esm/lib/middleware/CacheMiddleware.d.ts +0 -7
  165. package/esm/lib/middleware/CacheMiddleware.js +0 -105
  166. package/esm/lib/middleware/LoggingMiddleware.d.ts +0 -7
  167. 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
- export var submit = function (host, config) { return __awaiter(void 0, void 0, void 0, function () {
44
- var computedConfig, context, key, sameRequest, lock, lockedContext, response, successEventResult, error_1;
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
- context = new RequestContext(host, computedConfig, host.computePath(host.path, config));
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 backend, beforeSendEventResult, _a, promise, canceler, response, parsedResponse, error_2, errorResponse, _b, errorEventResult, retry, shouldNaturallyRetry, shouldRetry, unrecoverableErrorEventResult;
94
- var _c;
95
- return __generator(this, function (_d) {
96
- switch (_d.label) {
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.requestBackendIsDefault && !defaultBackendMessageShown) {
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 = _d.sent();
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
- _d.label = 2;
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
- _d.trys.push([2, 5, , 11]);
119
- _a = backend.makeRequest(context), promise = _a.promise, canceler = _a.canceler;
120
- context.addCanceller(canceler);
121
- return [4 /*yield*/, promise];
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
- response = _d.sent();
124
- return [4 /*yield*/, backend.convertResponse(context, response)];
247
+ errorResponse = _a.sent();
248
+ _a.label = 4;
125
249
  case 4:
126
- parsedResponse = _d.sent();
127
- context.response = parsedResponse;
128
- return [2 /*return*/, parsedResponse];
129
- case 5:
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
- throw error_2;
173
- case 11: return [2 /*return*/];
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: any);
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: return [2 /*return*/, {
126
- data: data,
127
- status: response.status,
128
- headers: response.headers,
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
+ }