@rendomnet/apiservice 1.3.8 → 1.4.0

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/dist/index.js CHANGED
@@ -1,405 +1,684 @@
1
1
  "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
2
29
 
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ default: () => index_default
5
34
  });
6
- exports["default"] = void 0;
7
- var _ApiKeyAuthProvider = require("./ApiKeyAuthProvider");
8
- var _components = require("./components");
9
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
10
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
- function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
13
- function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); }
14
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
15
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
16
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
17
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
19
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
20
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
- function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
23
- function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
24
- function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
25
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
26
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
27
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
28
- /**
29
- * ApiService - Core API service for making authenticated API calls
30
- * with caching, retry, and hook support.
31
- */
32
- var ApiService = /*#__PURE__*/function () {
33
- function ApiService() {
34
- _classCallCheck(this, ApiService);
35
- // Service provider name
36
- _defineProperty(this, "baseUrl", '');
37
- // Default max attempts for API calls
38
- _defineProperty(this, "maxAttempts", 10);
39
- this.provider = '';
40
- this.authProvider = {};
35
+ module.exports = __toCommonJS(index_exports);
41
36
 
42
- // Initialize component managers
43
- this.cacheManager = new _components.CacheManager();
44
- this.retryManager = new _components.RetryManager();
45
- this.hookManager = new _components.HookManager();
46
- this.httpClient = new _components.HttpClient();
47
- this.accountManager = new _components.AccountManager();
37
+ // src/ApiKeyAuthProvider.ts
38
+ var ApiKeyAuthProvider = class {
39
+ constructor(options) {
40
+ this.apiKey = options.apiKey;
41
+ this.headerName = options.headerName;
42
+ this.queryParamName = options.queryParamName;
48
43
  }
44
+ async getAuthHeaders() {
45
+ if (this.headerName) {
46
+ return { [this.headerName]: this.apiKey };
47
+ }
48
+ return {};
49
+ }
50
+ // For API key, refresh is not supported
51
+ };
49
52
 
53
+ // src/CacheManager.ts
54
+ var CacheManager = class {
55
+ constructor() {
56
+ this.cache = /* @__PURE__ */ new Map();
57
+ this.cacheTime = 2e4;
58
+ }
59
+ // Default cache time of 20 seconds
50
60
  /**
51
- * Setup the API service
61
+ * Get data from cache if available and not expired
52
62
  */
53
- return _createClass(ApiService, [{
54
- key: "setup",
55
- value: function setup(_ref) {
56
- var provider = _ref.provider,
57
- authProvider = _ref.authProvider,
58
- _ref$hooks = _ref.hooks,
59
- hooks = _ref$hooks === void 0 ? {} : _ref$hooks,
60
- cacheTime = _ref.cacheTime,
61
- _ref$baseUrl = _ref.baseUrl,
62
- baseUrl = _ref$baseUrl === void 0 ? '' : _ref$baseUrl;
63
- this.provider = provider;
64
- this.authProvider = authProvider;
65
- this.baseUrl = baseUrl;
66
-
67
- // Create a copy of hooks to avoid modifying the input
68
- var finalHooks = {};
63
+ getFromCache(apiCallParams) {
64
+ var _a;
65
+ const requestKey = this.getRequestKey(apiCallParams);
66
+ const currentCacheTime = (_a = apiCallParams.cacheTime) != null ? _a : this.cacheTime;
67
+ const cached = this.cache.get(requestKey);
68
+ if (cached && Date.now() - cached.timestamp < currentCacheTime) {
69
+ return cached.data;
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Save data to cache
75
+ */
76
+ saveToCache(apiCallParams, data) {
77
+ const requestKey = this.getRequestKey(apiCallParams);
78
+ this.cache.set(requestKey, {
79
+ data,
80
+ timestamp: Date.now()
81
+ });
82
+ }
83
+ /**
84
+ * Generate a unique key for caching based on request parameters
85
+ */
86
+ getRequestKey(apiCallParams) {
87
+ const { accountId, method, route, base, queryParams, body, data } = apiCallParams;
88
+ return JSON.stringify({
89
+ accountId,
90
+ method,
91
+ route,
92
+ base,
93
+ queryParams,
94
+ body: body || data
95
+ });
96
+ }
97
+ /**
98
+ * Set the default cache time in milliseconds
99
+ */
100
+ setCacheTime(milliseconds) {
101
+ this.cacheTime = milliseconds;
102
+ }
103
+ /**
104
+ * Clear the entire cache
105
+ */
106
+ clearCache() {
107
+ this.cache.clear();
108
+ }
109
+ };
69
110
 
70
- // Apply default 401 handler if:
71
- // 1. No 401 hook is explicitly defined (or is explicitly null)
72
- // 2. AuthProvider has a refresh method
73
- if (hooks[401] === undefined && typeof this.authProvider.refresh === 'function') {
74
- finalHooks[401] = this.createDefaultAuthRefreshHandler();
111
+ // src/RetryManager.ts
112
+ var RetryManager = class {
113
+ constructor() {
114
+ this.defaultMaxDelay = 6e4;
115
+ // Default max delay of 1 minute
116
+ this.defaultMaxRetries = 4;
117
+ /**
118
+ * Default exponential backoff strategy with full jitter
119
+ */
120
+ this.defaultDelayStrategy = {
121
+ calculate: (attempt, response) => {
122
+ const retryAfter = this.getRetryAfterValue(response);
123
+ if (retryAfter) return retryAfter;
124
+ const baseDelay = 1e3;
125
+ const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);
126
+ return Math.floor(Math.random() * exponentialDelay);
75
127
  }
128
+ };
129
+ }
130
+ /**
131
+ * Calculate and wait for appropriate delay time before retry
132
+ */
133
+ async calculateAndDelay(params) {
134
+ const { attempt, response, hook } = params;
135
+ const delayStrategy = hook.delayStrategy || this.defaultDelayStrategy;
136
+ const maxDelay = hook.maxDelay || this.defaultMaxDelay;
137
+ const calculatedDelay = delayStrategy.calculate(attempt, response);
138
+ const finalDelay = Math.min(calculatedDelay, maxDelay);
139
+ console.log(`\u{1F504} Waiting for ${finalDelay / 1e3} seconds before retrying.`);
140
+ await new Promise((resolve) => setTimeout(resolve, finalDelay));
141
+ }
142
+ /**
143
+ * Extract retry-after value from response
144
+ */
145
+ getRetryAfterValue(response) {
146
+ var _a;
147
+ if (!((_a = response == null ? void 0 : response.headers) == null ? void 0 : _a.get)) return null;
148
+ const retryAfter = response.headers.get("Retry-After");
149
+ if (!retryAfter) return null;
150
+ const parsedDelay = parseInt(retryAfter, 10);
151
+ if (!isNaN(parsedDelay)) {
152
+ return parsedDelay * 1e3;
153
+ }
154
+ const date = new Date(retryAfter).getTime();
155
+ const now = Date.now();
156
+ if (date > now) {
157
+ return date - now;
158
+ }
159
+ return null;
160
+ }
161
+ /**
162
+ * Get the default maximum number of retries
163
+ */
164
+ getDefaultMaxRetries() {
165
+ return this.defaultMaxRetries;
166
+ }
167
+ /**
168
+ * Set the default maximum number of retries
169
+ */
170
+ setDefaultMaxRetries(maxRetries) {
171
+ this.defaultMaxRetries = maxRetries;
172
+ }
173
+ /**
174
+ * Set the default maximum delay between retries
175
+ */
176
+ setDefaultMaxDelay(maxDelay) {
177
+ this.defaultMaxDelay = maxDelay;
178
+ }
179
+ };
76
180
 
77
- // Add user-defined hooks (skipping null/undefined values)
78
- for (var _i = 0, _Object$entries = Object.entries(hooks); _i < _Object$entries.length; _i++) {
79
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
80
- statusCode = _Object$entries$_i[0],
81
- hook = _Object$entries$_i[1];
82
- if (hook) {
83
- finalHooks[statusCode] = hook;
181
+ // src/HookManager.ts
182
+ var HookManager = class {
183
+ constructor() {
184
+ this.hooks = {};
185
+ this.hookPromises = {};
186
+ }
187
+ /**
188
+ * Set hooks for different status codes
189
+ */
190
+ setHooks(hooks) {
191
+ this.hooks = { ...this.hooks, ...hooks };
192
+ }
193
+ /**
194
+ * Get a hook for a specific status code
195
+ */
196
+ getHook(status) {
197
+ return this.hooks[status];
198
+ }
199
+ /**
200
+ * Process a hook for a specific status code
201
+ */
202
+ async processHook(accountId, status, error) {
203
+ const hook = this.hooks[status];
204
+ if (!hook || !hook.handler) return null;
205
+ const hookKey = `${accountId || "default"}-${status}`;
206
+ try {
207
+ if (hook.preventConcurrentCalls) {
208
+ if (!this.hookPromises[hookKey]) {
209
+ this.hookPromises[hookKey] = Promise.resolve(
210
+ hook.handler(accountId, error.response) || {}
211
+ );
84
212
  }
213
+ const result = await this.hookPromises[hookKey];
214
+ delete this.hookPromises[hookKey];
215
+ return result;
85
216
  }
86
-
87
- // Set the hooks if we have any
88
- if (Object.keys(finalHooks).length > 0) {
89
- this.hookManager.setHooks(finalHooks);
90
- }
91
- if (typeof cacheTime !== 'undefined') {
92
- this.cacheManager.setCacheTime(cacheTime);
217
+ return await hook.handler(accountId, error.response) || {};
218
+ } catch (hookError) {
219
+ console.error(`Hook handler failed for status ${status}:`, hookError);
220
+ if (hook.onHandlerError) {
221
+ await hook.onHandlerError(accountId, hookError);
93
222
  }
223
+ throw hookError;
224
+ }
225
+ }
226
+ /**
227
+ * Handle a retry failure with the appropriate hook
228
+ */
229
+ async handleRetryFailure(accountId, status, error) {
230
+ const hook = this.hooks[status];
231
+ if (hook == null ? void 0 : hook.onMaxRetriesExceeded) {
232
+ await hook.onMaxRetriesExceeded(accountId, error);
94
233
  }
234
+ }
235
+ /**
236
+ * Check if a hook exists and should retry for a given status
237
+ */
238
+ shouldRetry(status) {
239
+ const hook = this.hooks[status];
240
+ return !!hook && !!hook.shouldRetry;
241
+ }
242
+ };
95
243
 
96
- /**
97
- * Create a default handler for 401 (Unauthorized) errors
98
- * that implements standard credential refresh behavior
99
- */
100
- }, {
101
- key: "createDefaultAuthRefreshHandler",
102
- value: function createDefaultAuthRefreshHandler() {
103
- var _this = this;
104
- return {
105
- shouldRetry: true,
106
- useRetryDelay: true,
107
- preventConcurrentCalls: true,
108
- maxRetries: 1,
109
- handler: function () {
110
- var _handler = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(accountId) {
111
- var _t;
112
- return _regenerator().w(function (_context) {
113
- while (1) switch (_context.n) {
114
- case 0:
115
- _context.p = 0;
116
- console.log("\uD83D\uDD04 Using default auth refresh handler for ".concat(accountId));
117
- if (_this.authProvider.refresh) {
118
- _context.n = 1;
119
- break;
120
- }
121
- throw new Error('No refresh method available on auth provider');
122
- case 1:
123
- _context.n = 2;
124
- return _this.authProvider.refresh(accountId);
125
- case 2:
126
- return _context.a(2, {});
127
- case 3:
128
- _context.p = 3;
129
- _t = _context.v;
130
- console.error("Auth refresh failed for ".concat(accountId, ":"), _t);
131
- throw _t;
132
- case 4:
133
- return _context.a(2);
134
- }
135
- }, _callee, null, [[0, 3]]);
136
- }));
137
- function handler(_x) {
138
- return _handler.apply(this, arguments);
139
- }
140
- return handler;
141
- }(),
142
- onMaxRetriesExceeded: function () {
143
- var _onMaxRetriesExceeded = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(accountId, error) {
144
- return _regenerator().w(function (_context2) {
145
- while (1) switch (_context2.n) {
146
- case 0:
147
- console.error("Authentication failed after refresh attempt for ".concat(accountId, ":"), error);
148
- case 1:
149
- return _context2.a(2);
150
- }
151
- }, _callee2);
152
- }));
153
- function onMaxRetriesExceeded(_x2, _x3) {
154
- return _onMaxRetriesExceeded.apply(this, arguments);
244
+ // src/HttpClient.ts
245
+ var import_qs = __toESM(require("qs"));
246
+
247
+ // src/FetchError.ts
248
+ var FetchError = class extends Error {
249
+ constructor(response, data = {}, code = "FETCH_ERROR") {
250
+ super();
251
+ this.name = "FetchError";
252
+ const defaultMessage = "An unspecified error occurred";
253
+ const getMessage = (data2, locations) => locations.map((item) => {
254
+ const parts = item.split(".");
255
+ let value = data2;
256
+ for (const part of parts) {
257
+ value = value == null ? void 0 : value[part];
258
+ }
259
+ return value;
260
+ }).find((message) => typeof message === "string") || null;
261
+ const messageFromData = getMessage(data, [
262
+ "error.errors.0.message",
263
+ "error.message",
264
+ "error",
265
+ "message"
266
+ ]);
267
+ this.message = messageFromData || response.statusText || defaultMessage;
268
+ this.status = response.status;
269
+ this.code = code;
270
+ this.data = data;
271
+ this.message = this.message || defaultMessage;
272
+ Object.setPrototypeOf(this, new.target.prototype);
273
+ }
274
+ };
275
+
276
+ // src/form.ts
277
+ function deserializeForm(src) {
278
+ const fd = new FormData();
279
+ switch (src.cls) {
280
+ case "FormData": {
281
+ for (const [key, items] of src.value) {
282
+ for (const item of items) {
283
+ let deserializedItem = deserializeForm(item);
284
+ if (deserializedItem instanceof FormData) {
285
+ const entries = deserializedItem;
286
+ for (const [subKey, subValue] of entries.entries()) {
287
+ fd.append(`${key}[${subKey}]`, subValue);
288
+ }
289
+ } else {
290
+ fd.append(key, deserializedItem);
155
291
  }
156
- return onMaxRetriesExceeded;
157
- }()
158
- };
292
+ }
293
+ }
294
+ break;
159
295
  }
160
-
161
- /**
162
- * Set the maximum number of retry attempts
163
- */
164
- }, {
165
- key: "setMaxAttempts",
166
- value: function setMaxAttempts(attempts) {
167
- this.maxAttempts = attempts;
296
+ case "Blob":
297
+ case "File": {
298
+ const { type, name, lastModified } = src;
299
+ const binStr = atob(src.value);
300
+ const arr = new Uint8Array(binStr.length);
301
+ for (let i = 0; i < binStr.length; i++) arr[i] = binStr.charCodeAt(i);
302
+ const data = [arr.buffer];
303
+ const fileOrBlob = src.cls === "File" ? new File(data, name, { type, lastModified }) : new Blob(data, { type });
304
+ fd.append("file", fileOrBlob);
305
+ break;
306
+ }
307
+ case "json": {
308
+ fd.append("json", JSON.stringify(JSON.parse(src.value)));
309
+ break;
168
310
  }
311
+ default:
312
+ throw new Error("Unsupported type for deserialization");
313
+ }
314
+ return fd;
315
+ }
169
316
 
170
- /**
171
- * Update account data
172
- */
173
- }, {
174
- key: "updateAccountData",
175
- value: function updateAccountData(accountId, data) {
176
- this.accountManager.updateAccountData(accountId, data);
317
+ // src/HttpClient.ts
318
+ var HttpClient = class {
319
+ /**
320
+ * Make an HTTP request
321
+ */
322
+ async makeRequest(apiParams, authToken) {
323
+ const {
324
+ accountId,
325
+ method,
326
+ route,
327
+ base,
328
+ body,
329
+ data,
330
+ headers,
331
+ queryParams,
332
+ contentType = "application/json",
333
+ accessToken: forcedAccessToken,
334
+ useAuth = true,
335
+ files,
336
+ abortSignal
337
+ } = apiParams;
338
+ const normalizedMethod = method == null ? void 0 : method.toUpperCase();
339
+ let finalQueryParams = {};
340
+ if (queryParams) {
341
+ if (queryParams instanceof URLSearchParams) {
342
+ queryParams.forEach((val, key) => {
343
+ finalQueryParams[key] = val;
344
+ });
345
+ } else {
346
+ finalQueryParams = { ...queryParams };
347
+ }
348
+ }
349
+ if (normalizedMethod === "GET") {
350
+ if (body) {
351
+ finalQueryParams = { ...finalQueryParams, ...body };
352
+ }
353
+ if (data) {
354
+ finalQueryParams = { ...finalQueryParams, ...data };
355
+ }
356
+ }
357
+ const url = this.buildUrl(base, route, finalQueryParams);
358
+ const requestBody = body || data;
359
+ const formData = this.prepareFormData(files);
360
+ const fetchOptions = this.buildFetchOptions({
361
+ method: normalizedMethod,
362
+ body: requestBody,
363
+ formData,
364
+ contentType,
365
+ authToken,
366
+ forcedAccessToken,
367
+ useAuth,
368
+ headers,
369
+ abortSignal
370
+ });
371
+ try {
372
+ console.log(`\u{1F504} Making API call to ${url}`);
373
+ const response = await fetch(url, fetchOptions);
374
+ return await this.handleResponse(response);
375
+ } catch (error) {
376
+ console.error("\u{1F504} Error making API call:", error, "status:", error == null ? void 0 : error.status);
377
+ throw error;
378
+ }
379
+ }
380
+ /**
381
+ * Build URL with query parameters
382
+ */
383
+ buildUrl(base, route, queryParams) {
384
+ const baseUrl = base || "";
385
+ let url = `${baseUrl}${route || ""}`;
386
+ if (queryParams && Object.keys(queryParams).length > 0) {
387
+ url += `?${import_qs.default.stringify(queryParams)}`;
177
388
  }
389
+ return url;
390
+ }
391
+ /**
392
+ * Prepare form data for file uploads
393
+ */
394
+ prepareFormData(files) {
395
+ if (!files) return null;
396
+ const formData = deserializeForm(files);
397
+ const entries = formData;
398
+ for (let [key, value] of entries.entries()) {
399
+ console.log(`formdata ${key}:`, value);
400
+ }
401
+ return formData;
402
+ }
403
+ /**
404
+ * Build fetch options for request
405
+ */
406
+ buildFetchOptions({
407
+ method,
408
+ body,
409
+ formData,
410
+ contentType,
411
+ authToken,
412
+ forcedAccessToken,
413
+ useAuth,
414
+ headers,
415
+ abortSignal
416
+ }) {
417
+ const allowedMethods = ["POST", "PUT", "PATCH"];
418
+ return {
419
+ method,
420
+ signal: abortSignal,
421
+ headers: {
422
+ ...useAuth && {
423
+ Authorization: `Bearer ${forcedAccessToken || authToken.access_token}`
424
+ },
425
+ ...!formData && { "content-type": contentType },
426
+ ...headers || {}
427
+ },
428
+ body: body && allowedMethods.includes(method) ? JSON.stringify(body) : formData || null
429
+ };
430
+ }
431
+ /**
432
+ * Handle API response
433
+ */
434
+ async handleResponse(response) {
435
+ let data = null;
436
+ try {
437
+ data = await response.json();
438
+ console.log("\u{1F504} Response data:", data);
439
+ } catch (error) {
440
+ }
441
+ if (!response.ok) {
442
+ throw new FetchError(response, data);
443
+ }
444
+ return data;
445
+ }
446
+ };
178
447
 
179
- /**
180
- * Make an API call with all features (caching, retry, hooks)
181
- */
182
- }, {
183
- key: "call",
184
- value: (function () {
185
- var _call = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(apiCallParams) {
186
- var params, queryParamName, apiKey, urlParams, cachedData, result;
187
- return _regenerator().w(function (_context3) {
188
- while (1) switch (_context3.n) {
189
- case 0:
190
- // Use 'default' as fallback if accountId is not provided
191
- // and use default baseUrl if not provided
192
- params = _objectSpread(_objectSpread({}, apiCallParams), {}, {
193
- accountId: apiCallParams.accountId || 'default',
194
- base: apiCallParams.base || this.baseUrl
195
- }); // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams
196
- if (this.authProvider instanceof _ApiKeyAuthProvider.ApiKeyAuthProvider && this.authProvider.queryParamName) {
197
- queryParamName = this.authProvider.queryParamName;
198
- apiKey = this.authProvider.apiKey;
199
- urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();
200
- urlParams.set(queryParamName, apiKey);
201
- params.queryParams = urlParams;
202
- }
203
- console.log('🔄 API call', this.provider, params.accountId, params.method, params.route);
448
+ // src/AccountManager.ts
449
+ var AccountManager = class {
450
+ constructor() {
451
+ this.accounts = {};
452
+ this.DEFAULT_ACCOUNT = "default";
453
+ }
454
+ /**
455
+ * Update account data for a specific account
456
+ */
457
+ updateAccountData(accountId = this.DEFAULT_ACCOUNT, data) {
458
+ this.accounts[accountId] = {
459
+ ...this.accounts[accountId],
460
+ ...data
461
+ };
462
+ }
463
+ /**
464
+ * Get account data for a specific account
465
+ */
466
+ getAccountData(accountId = this.DEFAULT_ACCOUNT) {
467
+ return this.accounts[accountId] || {};
468
+ }
469
+ /**
470
+ * Check if an account's last request failed
471
+ */
472
+ didLastRequestFail(accountId = this.DEFAULT_ACCOUNT) {
473
+ var _a;
474
+ return !!((_a = this.accounts[accountId]) == null ? void 0 : _a.lastFailed);
475
+ }
476
+ /**
477
+ * Set account's last request as failed
478
+ */
479
+ setLastRequestFailed(accountId = this.DEFAULT_ACCOUNT, failed = true) {
480
+ this.updateAccountData(accountId, { lastFailed: failed });
481
+ }
482
+ /**
483
+ * Update the last request time for an account
484
+ */
485
+ updateLastRequestTime(accountId = this.DEFAULT_ACCOUNT) {
486
+ this.updateAccountData(accountId, { lastRequestTime: Date.now() });
487
+ }
488
+ };
204
489
 
205
- // Check cache first
206
- cachedData = this.cacheManager.getFromCache(params);
207
- if (!cachedData) {
208
- _context3.n = 1;
209
- break;
210
- }
211
- return _context3.a(2, cachedData);
212
- case 1:
213
- _context3.n = 2;
214
- return this.makeRequestWithRetry(params);
215
- case 2:
216
- result = _context3.v;
217
- // Cache the result
218
- this.cacheManager.saveToCache(params, result);
219
- return _context3.a(2, result);
220
- }
221
- }, _callee3, this);
222
- }));
223
- function call(_x4) {
224
- return _call.apply(this, arguments);
490
+ // src/index.ts
491
+ var ApiService = class {
492
+ constructor() {
493
+ this.baseUrl = "";
494
+ // Default max attempts for API calls
495
+ this.maxAttempts = 10;
496
+ this.provider = "";
497
+ this.authProvider = {};
498
+ this.cacheManager = new CacheManager();
499
+ this.retryManager = new RetryManager();
500
+ this.hookManager = new HookManager();
501
+ this.httpClient = new HttpClient();
502
+ this.accountManager = new AccountManager();
503
+ }
504
+ /**
505
+ * Setup the API service
506
+ */
507
+ setup({
508
+ provider,
509
+ authProvider,
510
+ hooks = {},
511
+ cacheTime,
512
+ baseUrl = ""
513
+ }) {
514
+ this.provider = provider;
515
+ this.authProvider = authProvider;
516
+ this.baseUrl = baseUrl;
517
+ const finalHooks = {};
518
+ if (hooks[401] === void 0 && typeof this.authProvider.refresh === "function") {
519
+ finalHooks[401] = this.createDefaultAuthRefreshHandler();
520
+ }
521
+ for (const [statusCode, hook] of Object.entries(hooks)) {
522
+ if (hook) {
523
+ finalHooks[statusCode] = hook;
225
524
  }
226
- return call;
227
- }()
228
- /**
229
- * Legacy method for backward compatibility
230
- * @deprecated Use call() instead
231
- */
232
- )
233
- }, {
234
- key: "makeApiCall",
235
- value: (function () {
236
- var _makeApiCall = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(apiCallParams) {
237
- return _regenerator().w(function (_context4) {
238
- while (1) switch (_context4.n) {
239
- case 0:
240
- return _context4.a(2, this.call(apiCallParams));
525
+ }
526
+ if (Object.keys(finalHooks).length > 0) {
527
+ this.hookManager.setHooks(finalHooks);
528
+ }
529
+ if (typeof cacheTime !== "undefined") {
530
+ this.cacheManager.setCacheTime(cacheTime);
531
+ }
532
+ }
533
+ /**
534
+ * Create a default handler for 401 (Unauthorized) errors
535
+ * that implements standard credential refresh behavior
536
+ */
537
+ createDefaultAuthRefreshHandler() {
538
+ return {
539
+ shouldRetry: true,
540
+ useRetryDelay: true,
541
+ preventConcurrentCalls: true,
542
+ maxRetries: 1,
543
+ handler: async (accountId) => {
544
+ try {
545
+ console.log(`\u{1F504} Using default auth refresh handler for ${accountId}`);
546
+ if (!this.authProvider.refresh) {
547
+ throw new Error("No refresh method available on auth provider");
241
548
  }
242
- }, _callee4, this);
243
- }));
244
- function makeApiCall(_x5) {
245
- return _makeApiCall.apply(this, arguments);
549
+ await this.authProvider.refresh(accountId);
550
+ return {};
551
+ } catch (error) {
552
+ console.error(`Auth refresh failed for ${accountId}:`, error);
553
+ throw error;
554
+ }
555
+ },
556
+ onMaxRetriesExceeded: async (accountId, error) => {
557
+ console.error(`Authentication failed after refresh attempt for ${accountId}:`, error);
246
558
  }
247
- return makeApiCall;
248
- }()
249
- /**
250
- * Make a request with retry capability
251
- */
252
- )
253
- }, {
254
- key: "makeRequestWithRetry",
255
- value: (function () {
256
- var _makeRequestWithRetry = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(apiCallParams) {
257
- var accountId, abortSignal, attempts, statusRetries, currentParams, queryParamName, apiKey, urlParams, authHeaders, response, _activeHook$maxRetrie, status, activeHook, maxRetries, hookResult, _t2, _t3, _t4;
258
- return _regenerator().w(function (_context5) {
259
- while (1) switch (_context5.n) {
260
- case 0:
261
- accountId = apiCallParams.accountId, abortSignal = apiCallParams.abortSignal;
262
- attempts = 0;
263
- statusRetries = {};
264
- currentParams = _objectSpread({}, apiCallParams); // If using ApiKeyAuthProvider with queryParamName, add API key to queryParams
265
- if (this.authProvider instanceof _ApiKeyAuthProvider.ApiKeyAuthProvider && this.authProvider.queryParamName) {
266
- queryParamName = this.authProvider.queryParamName;
267
- apiKey = this.authProvider.apiKey;
268
- urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();
269
- urlParams.set(queryParamName, apiKey);
270
- currentParams.queryParams = urlParams;
271
- }
272
- // Main retry loop
273
- case 1:
274
- if (!(attempts < this.maxAttempts)) {
275
- _context5.n = 17;
276
- break;
277
- }
278
- if (!(abortSignal !== null && abortSignal !== void 0 && abortSignal.aborted)) {
279
- _context5.n = 2;
280
- break;
281
- }
282
- throw new Error('Request aborted');
283
- case 2:
284
- attempts++;
285
- _context5.p = 3;
286
- if (!(apiCallParams.useAuth !== false)) {
287
- _context5.n = 5;
288
- break;
289
- }
290
- _context5.n = 4;
291
- return this.authProvider.getAuthHeaders(accountId);
292
- case 4:
293
- _t2 = _context5.v;
294
- _context5.n = 6;
295
- break;
296
- case 5:
297
- _t2 = {};
298
- case 6:
299
- authHeaders = _t2;
300
- // Merge auth headers into params.headers
301
- currentParams.headers = _objectSpread(_objectSpread({}, currentParams.headers || {}), authHeaders);
302
-
303
- // Verify we have authentication if required
304
- if (!(apiCallParams.useAuth !== false && Object.keys(authHeaders).length === 0 && !(this.authProvider instanceof _ApiKeyAuthProvider.ApiKeyAuthProvider && this.authProvider.queryParamName))) {
305
- _context5.n = 7;
306
- break;
307
- }
308
- throw new Error("".concat(this.provider, " credentials not found for account ID ").concat(accountId));
309
- case 7:
310
- _context5.n = 8;
311
- return this.httpClient.makeRequest(currentParams, {});
312
- case 8:
313
- response = _context5.v;
314
- // Success - update account status and return result
315
- this.accountManager.setLastRequestFailed(accountId, false);
316
- return _context5.a(2, response);
317
- case 9:
318
- _context5.p = 9;
319
- _t3 = _context5.v;
320
- status = _t3 === null || _t3 === void 0 ? void 0 : _t3.status; // If no hook exists for this error, or we shouldn't retry, throw
321
- if (this.hookManager.shouldRetry(status)) {
322
- _context5.n = 10;
323
- break;
324
- }
325
- throw _t3;
326
- case 10:
327
- // Track retries for this status code
328
- statusRetries[status] = (statusRetries[status] || 0) + 1;
329
- activeHook = this.hookManager.getHook(status);
330
- maxRetries = (_activeHook$maxRetrie = activeHook === null || activeHook === void 0 ? void 0 : activeHook.maxRetries) !== null && _activeHook$maxRetrie !== void 0 ? _activeHook$maxRetrie : this.retryManager.getDefaultMaxRetries(); // Check if we've exceeded retries for this status
331
- if (!(statusRetries[status] > maxRetries)) {
332
- _context5.n = 12;
333
- break;
334
- }
335
- _context5.n = 11;
336
- return this.hookManager.handleRetryFailure(accountId, status, _t3);
337
- case 11:
338
- this.accountManager.setLastRequestFailed(accountId, true);
339
- throw _t3;
340
- case 12:
341
- _context5.p = 12;
342
- _context5.n = 13;
343
- return this.hookManager.processHook(accountId, status, _t3);
344
- case 13:
345
- hookResult = _context5.v;
346
- if (hookResult) {
347
- currentParams = _objectSpread(_objectSpread({}, currentParams), hookResult);
348
- }
349
- _context5.n = 15;
350
- break;
351
- case 14:
352
- _context5.p = 14;
353
- _t4 = _context5.v;
354
- this.accountManager.setLastRequestFailed(accountId, true);
355
- throw _t4;
356
- case 15:
357
- if (!(activeHook !== null && activeHook !== void 0 && activeHook.useRetryDelay)) {
358
- _context5.n = 16;
359
- break;
360
- }
361
- _context5.n = 16;
362
- return this.retryManager.calculateAndDelay({
363
- attempt: statusRetries[status],
364
- response: _t3.response,
365
- hook: activeHook
366
- });
367
- case 16:
368
- _context5.n = 1;
369
- break;
370
- case 17:
371
- // If we've reached here, we've exceeded our maximum attempts
372
- this.accountManager.setLastRequestFailed(accountId, true);
373
- throw new Error("Exceeded maximum attempts (".concat(this.maxAttempts, ") for API call to ").concat(accountId));
374
- case 18:
375
- return _context5.a(2);
559
+ };
560
+ }
561
+ /**
562
+ * Set the maximum number of retry attempts
563
+ */
564
+ setMaxAttempts(attempts) {
565
+ this.maxAttempts = attempts;
566
+ }
567
+ /**
568
+ * Update account data
569
+ */
570
+ updateAccountData(accountId, data) {
571
+ this.accountManager.updateAccountData(accountId, data);
572
+ }
573
+ /**
574
+ * Make an API call with all features (caching, retry, hooks)
575
+ */
576
+ async call(apiCallParams) {
577
+ const params = {
578
+ ...apiCallParams,
579
+ accountId: apiCallParams.accountId || "default",
580
+ base: apiCallParams.base || this.baseUrl
581
+ };
582
+ if (this.authProvider instanceof ApiKeyAuthProvider && this.authProvider.queryParamName) {
583
+ const queryParamName = this.authProvider.queryParamName;
584
+ const apiKey = this.authProvider.apiKey;
585
+ const urlParams = params.queryParams ? new URLSearchParams(params.queryParams) : new URLSearchParams();
586
+ urlParams.set(queryParamName, apiKey);
587
+ params.queryParams = urlParams;
588
+ }
589
+ console.log("\u{1F504} API call", this.provider, params.accountId, params.method, params.route);
590
+ const cachedData = this.cacheManager.getFromCache(params);
591
+ if (cachedData) return cachedData;
592
+ const result = await this.makeRequestWithRetry(params);
593
+ this.cacheManager.saveToCache(params, result);
594
+ return result;
595
+ }
596
+ /**
597
+ * Legacy method for backward compatibility
598
+ * @deprecated Use call() instead
599
+ */
600
+ async makeApiCall(apiCallParams) {
601
+ return this.call(apiCallParams);
602
+ }
603
+ /**
604
+ * Make a request with retry capability
605
+ */
606
+ async makeRequestWithRetry(apiCallParams) {
607
+ var _a;
608
+ const { accountId, abortSignal } = apiCallParams;
609
+ let attempts = 0;
610
+ const statusRetries = {};
611
+ let currentParams = { ...apiCallParams };
612
+ if (this.authProvider instanceof ApiKeyAuthProvider && this.authProvider.queryParamName) {
613
+ const queryParamName = this.authProvider.queryParamName;
614
+ const apiKey = this.authProvider.apiKey;
615
+ const urlParams = currentParams.queryParams ? new URLSearchParams(currentParams.queryParams) : new URLSearchParams();
616
+ urlParams.set(queryParamName, apiKey);
617
+ currentParams.queryParams = urlParams;
618
+ }
619
+ while (attempts < this.maxAttempts) {
620
+ if (abortSignal == null ? void 0 : abortSignal.aborted) {
621
+ throw new Error("Request aborted");
622
+ }
623
+ attempts++;
624
+ try {
625
+ const authHeaders = apiCallParams.useAuth !== false ? await this.authProvider.getAuthHeaders(accountId) : {};
626
+ currentParams.headers = {
627
+ ...currentParams.headers || {},
628
+ ...authHeaders
629
+ };
630
+ if (apiCallParams.useAuth !== false && Object.keys(authHeaders).length === 0 && !(this.authProvider instanceof ApiKeyAuthProvider && this.authProvider.queryParamName)) {
631
+ throw new Error(`${this.provider} credentials not found for account ID ${accountId}`);
632
+ }
633
+ const response = await this.httpClient.makeRequest(currentParams, {});
634
+ this.accountManager.setLastRequestFailed(accountId, false);
635
+ return response;
636
+ } catch (error) {
637
+ const status = error == null ? void 0 : error.status;
638
+ if (!this.hookManager.shouldRetry(status)) {
639
+ throw error;
640
+ }
641
+ statusRetries[status] = (statusRetries[status] || 0) + 1;
642
+ const activeHook = this.hookManager.getHook(status);
643
+ const maxRetries = (_a = activeHook == null ? void 0 : activeHook.maxRetries) != null ? _a : this.retryManager.getDefaultMaxRetries();
644
+ if (statusRetries[status] > maxRetries) {
645
+ await this.hookManager.handleRetryFailure(accountId, status, error);
646
+ this.accountManager.setLastRequestFailed(accountId, true);
647
+ throw error;
648
+ }
649
+ try {
650
+ const hookResult = await this.hookManager.processHook(accountId, status, error);
651
+ if (hookResult) {
652
+ currentParams = { ...currentParams, ...hookResult };
376
653
  }
377
- }, _callee5, this, [[12, 14], [3, 9]]);
378
- }));
379
- function makeRequestWithRetry(_x6) {
380
- return _makeRequestWithRetry.apply(this, arguments);
654
+ } catch (hookError) {
655
+ this.accountManager.setLastRequestFailed(accountId, true);
656
+ throw hookError;
657
+ }
658
+ if (activeHook == null ? void 0 : activeHook.useRetryDelay) {
659
+ await this.retryManager.calculateAndDelay({
660
+ attempt: statusRetries[status],
661
+ response: error.response,
662
+ hook: activeHook
663
+ });
664
+ }
381
665
  }
382
- return makeRequestWithRetry;
383
- }()
384
- /**
385
- * Set the cache time in milliseconds
386
- */
387
- )
388
- }, {
389
- key: "setCacheTime",
390
- value: function setCacheTime(milliseconds) {
391
- this.cacheManager.setCacheTime(milliseconds);
392
666
  }
393
-
394
- /**
395
- * Clear the cache
396
- */
397
- }, {
398
- key: "clearCache",
399
- value: function clearCache() {
400
- this.cacheManager.clearCache();
401
- }
402
- }]);
403
- }();
404
- var _default = exports["default"] = ApiService;
405
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQXBpS2V5QXV0aFByb3ZpZGVyIiwicmVxdWlyZSIsIl9jb21wb25lbnRzIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yIiwibiIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJHZW5lcmF0b3IiLCJ1IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwidyIsIm0iLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl9pbnZva2UiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9uZXh0IiwiX3Rocm93IiwiX3NsaWNlZFRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJuZXh0IiwiaXNBcnJheSIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsIkFwaVNlcnZpY2UiLCJwcm92aWRlciIsImF1dGhQcm92aWRlciIsImNhY2hlTWFuYWdlciIsIkNhY2hlTWFuYWdlciIsInJldHJ5TWFuYWdlciIsIlJldHJ5TWFuYWdlciIsImhvb2tNYW5hZ2VyIiwiSG9va01hbmFnZXIiLCJodHRwQ2xpZW50IiwiSHR0cENsaWVudCIsImFjY291bnRNYW5hZ2VyIiwiQWNjb3VudE1hbmFnZXIiLCJzZXR1cCIsIl9yZWYiLCJfcmVmJGhvb2tzIiwiaG9va3MiLCJjYWNoZVRpbWUiLCJfcmVmJGJhc2VVcmwiLCJiYXNlVXJsIiwiZmluYWxIb29rcyIsInVuZGVmaW5lZCIsInJlZnJlc2giLCJjcmVhdGVEZWZhdWx0QXV0aFJlZnJlc2hIYW5kbGVyIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwic3RhdHVzQ29kZSIsImhvb2siLCJzZXRIb29rcyIsInNldENhY2hlVGltZSIsIl90aGlzIiwic2hvdWxkUmV0cnkiLCJ1c2VSZXRyeURlbGF5IiwicHJldmVudENvbmN1cnJlbnRDYWxscyIsIm1heFJldHJpZXMiLCJoYW5kbGVyIiwiX2hhbmRsZXIiLCJfY2FsbGVlIiwiYWNjb3VudElkIiwiX3QiLCJfY29udGV4dCIsImNvbnNvbGUiLCJsb2ciLCJjb25jYXQiLCJFcnJvciIsImVycm9yIiwiX3giLCJvbk1heFJldHJpZXNFeGNlZWRlZCIsIl9vbk1heFJldHJpZXNFeGNlZWRlZCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiX3gyIiwiX3gzIiwic2V0TWF4QXR0ZW1wdHMiLCJhdHRlbXB0cyIsIm1heEF0dGVtcHRzIiwidXBkYXRlQWNjb3VudERhdGEiLCJkYXRhIiwiX2NhbGwiLCJfY2FsbGVlMyIsImFwaUNhbGxQYXJhbXMiLCJwYXJhbXMiLCJxdWVyeVBhcmFtTmFtZSIsImFwaUtleSIsInVybFBhcmFtcyIsImNhY2hlZERhdGEiLCJyZXN1bHQiLCJfY29udGV4dDMiLCJiYXNlIiwiQXBpS2V5QXV0aFByb3ZpZGVyIiwicXVlcnlQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJtZXRob2QiLCJyb3V0ZSIsImdldEZyb21DYWNoZSIsIm1ha2VSZXF1ZXN0V2l0aFJldHJ5Iiwic2F2ZVRvQ2FjaGUiLCJfeDQiLCJfbWFrZUFwaUNhbGwiLCJfY2FsbGVlNCIsIl9jb250ZXh0NCIsIm1ha2VBcGlDYWxsIiwiX3g1IiwiX21ha2VSZXF1ZXN0V2l0aFJldHJ5IiwiX2NhbGxlZTUiLCJhYm9ydFNpZ25hbCIsInN0YXR1c1JldHJpZXMiLCJjdXJyZW50UGFyYW1zIiwiYXV0aEhlYWRlcnMiLCJyZXNwb25zZSIsIl9hY3RpdmVIb29rJG1heFJldHJpZSIsInN0YXR1cyIsImFjdGl2ZUhvb2siLCJob29rUmVzdWx0IiwiX3QyIiwiX3QzIiwiX3Q0IiwiX2NvbnRleHQ1IiwiYWJvcnRlZCIsInVzZUF1dGgiLCJnZXRBdXRoSGVhZGVycyIsImhlYWRlcnMiLCJtYWtlUmVxdWVzdCIsInNldExhc3RSZXF1ZXN0RmFpbGVkIiwiZ2V0SG9vayIsImdldERlZmF1bHRNYXhSZXRyaWVzIiwiaGFuZGxlUmV0cnlGYWlsdXJlIiwicHJvY2Vzc0hvb2siLCJjYWxjdWxhdGVBbmREZWxheSIsImF0dGVtcHQiLCJfeDYiLCJtaWxsaXNlY29uZHMiLCJjbGVhckNhY2hlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuICBBdXRoUHJvdmlkZXIsXG4gIEFwaUNhbGxQYXJhbXMsXG4gIEhvb2tTZXR0aW5ncyxcbiAgU3RhdHVzQ29kZSxcbiAgVG9rZW4sXG4gIE9BdXRoVG9rZW5cbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlLZXlBdXRoUHJvdmlkZXIgfSBmcm9tICcuL0FwaUtleUF1dGhQcm92aWRlcic7XG5pbXBvcnQge1xuICBDYWNoZU1hbmFnZXIsXG4gIFJldHJ5TWFuYWdlcixcbiAgSG9va01hbmFnZXIsXG4gIEh0dHBDbGllbnQsXG4gIEFjY291bnRNYW5hZ2VyXG59IGZyb20gJy4vY29tcG9uZW50cyc7XG5cbi8qKlxuICogQXBpU2VydmljZSAtIENvcmUgQVBJIHNlcnZpY2UgZm9yIG1ha2luZyBhdXRoZW50aWNhdGVkIEFQSSBjYWxsc1xuICogd2l0aCBjYWNoaW5nLCByZXRyeSwgYW5kIGhvb2sgc3VwcG9ydC5cbiAqL1xuY2xhc3MgQXBpU2VydmljZSB7XG4gIHB1YmxpYyBwcm92aWRlcjogc3RyaW5nOyAvLyBTZXJ2aWNlIHByb3ZpZGVyIG5hbWVcbiAgcHJpdmF0ZSBhdXRoUHJvdmlkZXI6IEF1dGhQcm92aWRlcjtcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSAnJzsgLy8gRGVmYXVsdCBiYXNlIFVSTFxuICBcbiAgLy8gQ29tcG9uZW50IG1hbmFnZXJzXG4gIHByaXZhdGUgY2FjaGVNYW5hZ2VyOiBDYWNoZU1hbmFnZXI7XG4gIHByaXZhdGUgcmV0cnlNYW5hZ2VyOiBSZXRyeU1hbmFnZXI7XG4gIHByaXZhdGUgaG9va01hbmFnZXI6IEhvb2tNYW5hZ2VyO1xuICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gIHByaXZhdGUgYWNjb3VudE1hbmFnZXI6IEFjY291bnRNYW5hZ2VyO1xuICBcbiAgLy8gRGVmYXVsdCBtYXggYXR0ZW1wdHMgZm9yIEFQSSBjYWxsc1xuICBwcml2YXRlIG1heEF0dGVtcHRzID0gMTA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm92aWRlciA9ICcnO1xuICAgIHRoaXMuYXV0aFByb3ZpZGVyID0ge30gYXMgQXV0aFByb3ZpZGVyO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY29tcG9uZW50IG1hbmFnZXJzXG4gICAgdGhpcy5jYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKCk7XG4gICAgdGhpcy5yZXRyeU1hbmFnZXIgPSBuZXcgUmV0cnlNYW5hZ2VyKCk7XG4gICAgdGhpcy5ob29rTWFuYWdlciA9IG5ldyBIb29rTWFuYWdlcigpO1xuICAgIHRoaXMuaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7XG4gICAgdGhpcy5hY2NvdW50TWFuYWdlciA9IG5ldyBBY2NvdW50TWFuYWdlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBBUEkgc2VydmljZVxuICAgKi9cbiAgcHVibGljIHNldHVwKHtcbiAgICBwcm92aWRlcixcbiAgICBhdXRoUHJvdmlkZXIsXG4gICAgaG9va3MgPSB7fSxcbiAgICBjYWNoZVRpbWUsXG4gICAgYmFzZVVybCA9ICcnLFxuICB9OiB7XG4gICAgcHJvdmlkZXI6IHN0cmluZztcbiAgICBhdXRoUHJvdmlkZXI6IEF1dGhQcm92aWRlcjtcbiAgICBob29rcz86IFJlY29yZDxTdGF0dXNDb2RlLCBIb29rU2V0dGluZ3MgfCBudWxsPjtcbiAgICBjYWNoZVRpbWU6IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIHRoaXMuYXV0aFByb3ZpZGVyID0gYXV0aFByb3ZpZGVyO1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiBob29rcyB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIGlucHV0XG4gICAgY29uc3QgZmluYWxIb29rczogUmVjb3JkPFN0YXR1c0NvZGUsIEhvb2tTZXR0aW5ncz4gPSB7fTtcbiAgICBcbiAgICAvLyBBcHBseSBkZWZhdWx0IDQwMSBoYW5kbGVyIGlmOlxuICAgIC8vIDEuIE5vIDQwMSBob29rIGlzIGV4cGxpY2l0bHkgZGVmaW5lZCAob3IgaXMgZXhwbGljaXRseSBudWxsKVxuICAgIC8vIDIuIEF1dGhQcm92aWRlciBoYXMgYSByZWZyZXNoIG1ldGhvZFxuICAgIGlmIChob29rc1s0MDFdID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMuYXV0aFByb3ZpZGVyLnJlZnJlc2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsSG9va3NbNDAxXSA9IHRoaXMuY3JlYXRlRGVmYXVsdEF1dGhSZWZyZXNoSGFuZGxlcigpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgdXNlci1kZWZpbmVkIGhvb2tzIChza2lwcGluZyBudWxsL3VuZGVmaW5lZCB2YWx1ZXMpXG4gICAgZm9yIChjb25zdCBbc3RhdHVzQ29kZSwgaG9va10gb2YgT2JqZWN0LmVudHJpZXMoaG9va3MpKSB7XG4gICAgICBpZiAoaG9vaykge1xuICAgICAgICBmaW5hbEhvb2tzW3N0YXR1c0NvZGVdID0gaG9vaztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU2V0IHRoZSBob29rcyBpZiB3ZSBoYXZlIGFueVxuICAgIGlmIChPYmplY3Qua2V5cyhmaW5hbEhvb2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmhvb2tNYW5hZ2VyLnNldEhvb2tzKGZpbmFsSG9va3MpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodHlwZW9mIGNhY2hlVGltZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY2FjaGVNYW5hZ2VyLnNldENhY2hlVGltZShjYWNoZVRpbWUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlZmF1bHQgaGFuZGxlciBmb3IgNDAxIChVbmF1dGhvcml6ZWQpIGVycm9yc1xuICAgKiB0aGF0IGltcGxlbWVudHMgc3RhbmRhcmQgY3JlZGVudGlhbCByZWZyZXNoIGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRBdXRoUmVmcmVzaEhhbmRsZXIoKTogSG9va1NldHRpbmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkUmV0cnk6IHRydWUsXG4gICAgICB1c2VSZXRyeURlbGF5OiB0cnVlLFxuICAgICAgcHJldmVudENvbmN1cnJlbnRDYWxsczogdHJ1ZSxcbiAgICAgIG1heFJldHJpZXM6IDEsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYWNjb3VudElkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYPCflIQgVXNpbmcgZGVmYXVsdCBhdXRoIHJlZnJlc2ggaGFuZGxlciBmb3IgJHthY2NvdW50SWR9YCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmF1dGhQcm92aWRlci5yZWZyZXNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlZnJlc2ggbWV0aG9kIGF2YWlsYWJsZSBvbiBhdXRoIHByb3ZpZGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFlvdSBtYXkgd2FudCB0byBzdG9yZSByZWZyZXNoIHRva2VuIGluIGFjY291bnQgZGF0YSBvciBwYXNzIGl0IGluIGFub3RoZXIgd2F5XG4gICAgICAgICAgLy8gRm9yIG5vdywgYXNzdW1lIHJlZnJlc2ggdG9rZW4gaXMgbWFuYWdlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwcm92aWRlclxuICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aFByb3ZpZGVyLnJlZnJlc2goYWNjb3VudElkKTtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQXV0aCByZWZyZXNoIGZhaWxlZCBmb3IgJHthY2NvdW50SWR9OmAsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uTWF4UmV0cmllc0V4Y2VlZGVkOiBhc3luYyAoYWNjb3VudElkLCBlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBBdXRoZW50aWNhdGlvbiBmYWlsZWQgYWZ0ZXIgcmVmcmVzaCBhdHRlbXB0IGZvciAke2FjY291bnRJZH06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzXG4gICAqL1xuICBwdWJsaWMgc2V0TWF4QXR0ZW1wdHMoYXR0ZW1wdHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWF4QXR0ZW1wdHMgPSBhdHRlbXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYWNjb3VudCBkYXRhXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQWNjb3VudERhdGEoYWNjb3VudElkOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYW55Pj4pOiB2b2lkIHtcbiAgICB0aGlzLmFjY291bnRNYW5hZ2VyLnVwZGF0ZUFjY291bnREYXRhKGFjY291bnRJZCwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhbiBBUEkgY2FsbCB3aXRoIGFsbCBmZWF0dXJlcyAoY2FjaGluZywgcmV0cnksIGhvb2tzKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGwoYXBpQ2FsbFBhcmFtczogT21pdDxBcGlDYWxsUGFyYW1zLCAnYWNjb3VudElkJz4gJiB7IGFjY291bnRJZD86IHN0cmluZzsgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBVc2UgJ2RlZmF1bHQnIGFzIGZhbGxiYWNrIGlmIGFjY291bnRJZCBpcyBub3QgcHJvdmlkZWRcbiAgICAvLyBhbmQgdXNlIGRlZmF1bHQgYmFzZVVybCBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBwYXJhbXM6IEFwaUNhbGxQYXJhbXMgPSB7XG4gICAgICAuLi5hcGlDYWxsUGFyYW1zLFxuICAgICAgYWNjb3VudElkOiBhcGlDYWxsUGFyYW1zLmFjY291bnRJZCB8fCAnZGVmYXVsdCcsXG4gICAgICBiYXNlOiBhcGlDYWxsUGFyYW1zLmJhc2UgfHwgdGhpcy5iYXNlVXJsLFxuICAgIH07XG5cbiAgICAvLyBJZiB1c2luZyBBcGlLZXlBdXRoUHJvdmlkZXIgd2l0aCBxdWVyeVBhcmFtTmFtZSwgYWRkIEFQSSBrZXkgdG8gcXVlcnlQYXJhbXNcbiAgICBpZiAoXG4gICAgICB0aGlzLmF1dGhQcm92aWRlciBpbnN0YW5jZW9mIEFwaUtleUF1dGhQcm92aWRlciAmJlxuICAgICAgKHRoaXMuYXV0aFByb3ZpZGVyIGFzIGFueSkucXVlcnlQYXJhbU5hbWVcbiAgICApIHtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1OYW1lID0gKHRoaXMuYXV0aFByb3ZpZGVyIGFzIGFueSkucXVlcnlQYXJhbU5hbWU7XG4gICAgICBjb25zdCBhcGlLZXkgPSAodGhpcy5hdXRoUHJvdmlkZXIgYXMgYW55KS5hcGlLZXk7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBwYXJhbXMucXVlcnlQYXJhbXMgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcy5xdWVyeVBhcmFtcykgOiBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICB1cmxQYXJhbXMuc2V0KHF1ZXJ5UGFyYW1OYW1lLCBhcGlLZXkpO1xuICAgICAgcGFyYW1zLnF1ZXJ5UGFyYW1zID0gdXJsUGFyYW1zO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCfwn5SEIEFQSSBjYWxsJywgdGhpcy5wcm92aWRlciwgcGFyYW1zLmFjY291bnRJZCwgcGFyYW1zLm1ldGhvZCwgcGFyYW1zLnJvdXRlKTtcbiAgICBcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLmNhY2hlTWFuYWdlci5nZXRGcm9tQ2FjaGUocGFyYW1zKTtcbiAgICBpZiAoY2FjaGVkRGF0YSkgcmV0dXJuIGNhY2hlZERhdGE7XG5cbiAgICAvLyBNYWtlIHRoZSBBUEkgY2FsbCB3aXRoIHJldHJ5IGNhcGFiaWxpdHlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0V2l0aFJldHJ5KHBhcmFtcyk7XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuY2FjaGVNYW5hZ2VyLnNhdmVUb0NhY2hlKHBhcmFtcywgcmVzdWx0KTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIExlZ2FjeSBtZXRob2QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNhbGwoKSBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZUFwaUNhbGwoYXBpQ2FsbFBhcmFtczogT21pdDxBcGlDYWxsUGFyYW1zLCAnYWNjb3VudElkJz4gJiB7IGFjY291bnRJZD86IHN0cmluZzsgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKGFwaUNhbGxQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSByZXF1ZXN0IHdpdGggcmV0cnkgY2FwYWJpbGl0eVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUmVxdWVzdFdpdGhSZXRyeShhcGlDYWxsUGFyYW1zOiBBcGlDYWxsUGFyYW1zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IGFjY291bnRJZCwgYWJvcnRTaWduYWwgfSA9IGFwaUNhbGxQYXJhbXM7XG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBzdGF0dXNSZXRyaWVzOiBSZWNvcmQ8U3RhdHVzQ29kZSwgbnVtYmVyPiA9IHt9O1xuICAgIGxldCBjdXJyZW50UGFyYW1zID0geyAuLi5hcGlDYWxsUGFyYW1zIH07XG4gICAgLy8gSWYgdXNpbmcgQXBpS2V5QXV0aFByb3ZpZGVyIHdpdGggcXVlcnlQYXJhbU5hbWUsIGFkZCBBUEkga2V5IHRvIHF1ZXJ5UGFyYW1zXG4gICAgaWYgKFxuICAgICAgdGhpcy5hdXRoUHJvdmlkZXIgaW5zdGFuY2VvZiBBcGlLZXlBdXRoUHJvdmlkZXIgJiZcbiAgICAgICh0aGlzLmF1dGhQcm92aWRlciBhcyBhbnkpLnF1ZXJ5UGFyYW1OYW1lXG4gICAgKSB7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtTmFtZSA9ICh0aGlzLmF1dGhQcm92aWRlciBhcyBhbnkpLnF1ZXJ5UGFyYW1OYW1lO1xuICAgICAgY29uc3QgYXBpS2V5ID0gKHRoaXMuYXV0aFByb3ZpZGVyIGFzIGFueSkuYXBpS2V5O1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gY3VycmVudFBhcmFtcy5xdWVyeVBhcmFtcyA/IG5ldyBVUkxTZWFyY2hQYXJhbXMoY3VycmVudFBhcmFtcy5xdWVyeVBhcmFtcykgOiBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICB1cmxQYXJhbXMuc2V0KHF1ZXJ5UGFyYW1OYW1lLCBhcGlLZXkpO1xuICAgICAgY3VycmVudFBhcmFtcy5xdWVyeVBhcmFtcyA9IHVybFBhcmFtcztcbiAgICB9XG4gICAgLy8gTWFpbiByZXRyeSBsb29wXG4gICAgd2hpbGUgKGF0dGVtcHRzIDwgdGhpcy5tYXhBdHRlbXB0cykge1xuICAgICAgaWYgKGFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdCBhYm9ydGVkJyk7XG4gICAgICB9XG4gICAgICBhdHRlbXB0cysrO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgYXV0aGVudGljYXRpb24gaGVhZGVycyBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgYXV0aEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBhcGlDYWxsUGFyYW1zLnVzZUF1dGggIT09IGZhbHNlXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmF1dGhQcm92aWRlci5nZXRBdXRoSGVhZGVycyhhY2NvdW50SWQpXG4gICAgICAgICAgOiB7fTtcbiAgICAgICAgLy8gTWVyZ2UgYXV0aCBoZWFkZXJzIGludG8gcGFyYW1zLmhlYWRlcnNcbiAgICAgICAgY3VycmVudFBhcmFtcy5oZWFkZXJzID0ge1xuICAgICAgICAgIC4uLihjdXJyZW50UGFyYW1zLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAgIC4uLmF1dGhIZWFkZXJzLFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHdlIGhhdmUgYXV0aGVudGljYXRpb24gaWYgcmVxdWlyZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFwaUNhbGxQYXJhbXMudXNlQXV0aCAhPT0gZmFsc2UgJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyhhdXRoSGVhZGVycykubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgIShcbiAgICAgICAgICAgIHRoaXMuYXV0aFByb3ZpZGVyIGluc3RhbmNlb2YgQXBpS2V5QXV0aFByb3ZpZGVyICYmXG4gICAgICAgICAgICAodGhpcy5hdXRoUHJvdmlkZXIgYXMgYW55KS5xdWVyeVBhcmFtTmFtZVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMucHJvdmlkZXJ9IGNyZWRlbnRpYWxzIG5vdCBmb3VuZCBmb3IgYWNjb3VudCBJRCAke2FjY291bnRJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFrZSB0aGUgYWN0dWFsIEFQSSBjYWxsXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5odHRwQ2xpZW50Lm1ha2VSZXF1ZXN0KGN1cnJlbnRQYXJhbXMsIHt9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN1Y2Nlc3MgLSB1cGRhdGUgYWNjb3VudCBzdGF0dXMgYW5kIHJldHVybiByZXN1bHRcbiAgICAgICAgdGhpcy5hY2NvdW50TWFuYWdlci5zZXRMYXN0UmVxdWVzdEZhaWxlZChhY2NvdW50SWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBcbiAgICAgIGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yPy5zdGF0dXM7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiBubyBob29rIGV4aXN0cyBmb3IgdGhpcyBlcnJvciwgb3Igd2Ugc2hvdWxkbid0IHJldHJ5LCB0aHJvd1xuICAgICAgICBpZiAoIXRoaXMuaG9va01hbmFnZXIuc2hvdWxkUmV0cnkoc3RhdHVzKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBUcmFjayByZXRyaWVzIGZvciB0aGlzIHN0YXR1cyBjb2RlXG4gICAgICAgIHN0YXR1c1JldHJpZXNbc3RhdHVzXSA9IChzdGF0dXNSZXRyaWVzW3N0YXR1c10gfHwgMCkgKyAxO1xuICAgICAgICBjb25zdCBhY3RpdmVIb29rID0gdGhpcy5ob29rTWFuYWdlci5nZXRIb29rKHN0YXR1cyk7XG4gICAgICAgIGNvbnN0IG1heFJldHJpZXMgPSBhY3RpdmVIb29rPy5tYXhSZXRyaWVzID8/IHRoaXMucmV0cnlNYW5hZ2VyLmdldERlZmF1bHRNYXhSZXRyaWVzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSBleGNlZWRlZCByZXRyaWVzIGZvciB0aGlzIHN0YXR1c1xuICAgICAgICBpZiAoc3RhdHVzUmV0cmllc1tzdGF0dXNdID4gbWF4UmV0cmllcykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaG9va01hbmFnZXIuaGFuZGxlUmV0cnlGYWlsdXJlKGFjY291bnRJZCwgc3RhdHVzLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5hY2NvdW50TWFuYWdlci5zZXRMYXN0UmVxdWVzdEZhaWxlZChhY2NvdW50SWQsIHRydWUpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcm9jZXNzIHRoZSBob29rIHRvIGdldCB1cGRhdGVkIHBhcmFtc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCB0aGlzLmhvb2tNYW5hZ2VyLnByb2Nlc3NIb29rKGFjY291bnRJZCwgc3RhdHVzLCBlcnJvcik7XG4gICAgICAgICAgaWYgKGhvb2tSZXN1bHQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbXMgPSB7IC4uLmN1cnJlbnRQYXJhbXMsIC4uLmhvb2tSZXN1bHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgICAgIGNhdGNoIChob29rRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmFjY291bnRNYW5hZ2VyLnNldExhc3RSZXF1ZXN0RmFpbGVkKGFjY291bnRJZCwgdHJ1ZSk7XG4gICAgICAgICAgdGhyb3cgaG9va0Vycm9yO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBXYWl0IGJlZm9yZSByZXRyeWluZyBpZiBuZWVkZWRcbiAgICAgICAgaWYgKGFjdGl2ZUhvb2s/LnVzZVJldHJ5RGVsYXkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJldHJ5TWFuYWdlci5jYWxjdWxhdGVBbmREZWxheSh7XG4gICAgICAgICAgICBhdHRlbXB0OiBzdGF0dXNSZXRyaWVzW3N0YXR1c10sXG4gICAgICAgICAgICByZXNwb25zZTogZXJyb3IucmVzcG9uc2UsXG4gICAgICAgICAgICBob29rOiBhY3RpdmVIb29rLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgd2UndmUgZXhjZWVkZWQgb3VyIG1heGltdW0gYXR0ZW1wdHNcbiAgICB0aGlzLmFjY291bnRNYW5hZ2VyLnNldExhc3RSZXF1ZXN0RmFpbGVkKGFjY291bnRJZCwgdHJ1ZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeGNlZWRlZCBtYXhpbXVtIGF0dGVtcHRzICgke3RoaXMubWF4QXR0ZW1wdHN9KSBmb3IgQVBJIGNhbGwgdG8gJHthY2NvdW50SWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjYWNoZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHNldENhY2hlVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FjaGVNYW5hZ2VyLnNldENhY2hlVGltZShtaWxsaXNlY29uZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBjYWNoZVxuICAgKi9cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZU1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwaVNlcnZpY2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVFBLElBQUFBLG1CQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFELE9BQUE7QUFNc0IsU0FBQUUsUUFBQUMsQ0FBQSxzQ0FBQUQsT0FBQSx3QkFBQUUsTUFBQSx1QkFBQUEsTUFBQSxDQUFBQyxRQUFBLGFBQUFGLENBQUEsa0JBQUFBLENBQUEsZ0JBQUFBLENBQUEsV0FBQUEsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRCxDQUFBLENBQUFHLFdBQUEsS0FBQUYsTUFBQSxJQUFBRCxDQUFBLEtBQUFDLE1BQUEsQ0FBQUcsU0FBQSxxQkFBQUosQ0FBQSxLQUFBRCxPQUFBLENBQUFDLENBQUE7QUFBQSxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFYLENBQUEsR0FBQVMsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQVAsQ0FBQSxHQUFBQSxDQUFBLENBQUFZLE1BQUEsV0FBQUwsQ0FBQSxXQUFBRSxNQUFBLENBQUFJLHdCQUFBLENBQUFQLENBQUEsRUFBQUMsQ0FBQSxFQUFBTyxVQUFBLE9BQUFOLENBQUEsQ0FBQU8sSUFBQSxDQUFB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
667
+ this.accountManager.setLastRequestFailed(accountId, true);
668
+ throw new Error(`Exceeded maximum attempts (${this.maxAttempts}) for API call to ${accountId}`);
669
+ }
670
+ /**
671
+ * Set the cache time in milliseconds
672
+ */
673
+ setCacheTime(milliseconds) {
674
+ this.cacheManager.setCacheTime(milliseconds);
675
+ }
676
+ /**
677
+ * Clear the cache
678
+ */
679
+ clearCache() {
680
+ this.cacheManager.clearCache();
681
+ }
682
+ };
683
+ var index_default = ApiService;
684
+ //# sourceMappingURL=index.js.map