{"version":3,"file":"hysterics.js","sources":["../../src/wrappers/no-op.js","../../src/wrappers/abort.js","../../src/wrappers/context-terminus.js","../../src/wrappers/options.js","../../src/wrappers/newrelic/nr-agent-browser.js","../../src/wrappers/newrelic/index.js","../../src/wrappers/duration.js","../../src/util/fetch-http-error.js","../../src/wrappers/fetch.js","../../node_modules/retry/lib/retry_operation.js","../../node_modules/retry/lib/retry.js","../../node_modules/retry/index.js","../../node_modules/async-retry/lib/index.js","../../src/wrappers/retry.js","../../node_modules/p-timeout/index.js","../../node_modules/p-finally/index.js","../../src/wrappers/timeout.js","../../src/wrappers/index.js","../../src/hystericall.js","../../src/hysterifetch.js"],"sourcesContent":["export const contextKey = 'no-op';\nexport const getWrapper = nextAction => (fnArgs, executionContext) =>\n\tnextAction(fnArgs, executionContext);\ngetWrapper.contextKey = contextKey;\n","import { getWrapper as getNoOpWrapper } from './no-op';\n\nexport const contextKey = 'abort';\n\nlet _AbortController;\nif (typeof window === 'undefined' || typeof window.document === 'undefined') {\n\t// NodeJS.\n\t_AbortController = require('abort-controller');\n} else if (typeof AbortController !== 'undefined') {\n\t// Should be all modern browsers.\n\t_AbortController = AbortController;\n}\n\nexport const abort = executionContext => {\n\tconst abortContext = executionContext[contextKey];\n\tif (abortContext && abortContext.controller) {\n\t\tabortContext.controller.abort();\n\t}\n};\n\nexport const getAbortSignal = executionContext => {\n\tconst abortContext = executionContext[contextKey];\n\tif (abortContext && abortContext.controller) {\n\t\treturn abortContext.controller.signal;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexport const getWrapper = nextAction => {\n\tif (!_AbortController) {\n\t\t/* We decided not to polyfill this for IE11 to reduce package size, since\n\t\t * every other major browser has built in support. */\n\t\treturn getNoOpWrapper(nextAction);\n\t}\n\n\treturn (fnArgs, executionContext) => {\n\t\texecutionContext[contextKey].controller = new _AbortController();\n\n\t\tconst nextActionPromise = (async () =>\n\t\t\tnextAction(fnArgs, executionContext))();\n\n\t\t// This cancel method is used implicitly by `p-timeout` in the Timeout wrapper.\n\t\t// See: https://github.com/sindresorhus/p-timeout#ptimeoutinput-milliseconds-fallback\n\t\tnextActionPromise.cancel = () => abort(executionContext);\n\n\t\treturn nextActionPromise;\n\t};\n};\n\ngetWrapper.contextKey = contextKey;\n","export const contextKey = 'contextTerminus';\nexport const getWrapper = nextAction => fnArgs => nextAction(...fnArgs);\ngetWrapper.contextKey = contextKey;\n","export const initOptions = (context, key, defaults) => {\n\tcontext[key].options = {\n\t\t...defaults,\n\t\t...context[key].options\n\t};\n};\n","let newrelic = window && window.newrelic;\n\nif (!newrelic) {\n\t// eslint-disable-next-line no-console\n\tconsole.warn(\n\t\t'Unable to locate the NewRelic browser agent - performance metrics will not be recorded for this application!'\n\t);\n\tnewrelic = {\n\t\tnoticeError: () => {},\n\t\taddPageAction: () => {}\n\t};\n}\n\nexport const noticeError = (...args) => newrelic.noticeError(...args);\nexport const recordMetrics = (...args) => newrelic.addPageAction(...args);\n","import { initOptions } from '../options';\nimport { noticeError, recordMetrics } from './nr-agent-server';\n\nexport const contextKey = 'newRelic';\n\nconst defaultOptions = {\n\tisNoticeable: _err => true\n};\n\nexport const recordMetric = (context, key, value) => {\n\tif (!context[contextKey]) {\n\t\t// Only attempt appending a metric if the New Relic wrapper is in use.\n\t\treturn;\n\t}\n\n\tconst { metrics } = context[contextKey];\n\tif (!metrics) {\n\t\tthrow new Error(\n\t\t\t'The New Relic wrapper must be ordered before any wrappers that append metrics!'\n\t\t);\n\t}\n\n\tmetrics[key] = value;\n};\n\nexport const getWrapper = (nextAction, context) => {\n\tinitOptions(context, contextKey, defaultOptions);\n\treturn async (fnArgs, executionContext) => {\n\t\tconst metrics = {};\n\t\texecutionContext[contextKey].metrics = metrics;\n\n\t\ttry {\n\t\t\treturn await nextAction(fnArgs, executionContext);\n\t\t} catch (e) {\n\t\t\tif (executionContext[contextKey].options.isNoticeable(e)) {\n\t\t\t\tnoticeError(e);\n\t\t\t}\n\t\t\tmetrics.error = true;\n\t\t\tif (e.name) metrics['error.name'] = e.name;\n\t\t\tif (e.message) metrics['error.message'] = e.message;\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\tconst prefix =\n\t\t\t\texecutionContext[contextKey].options.prefix || executionContext.name;\n\t\t\trecordMetrics(prefix, metrics);\n\t\t}\n\t};\n};\n\ngetWrapper.contextKey = contextKey;\n","import { recordMetric } from './newrelic';\n\nexport const contextKey = 'duration';\n\nexport const getWrapper = nextAction => async (fnArgs, executionContext) => {\n\tconst startTime = Date.now();\n\ttry {\n\t\treturn await nextAction(fnArgs, executionContext);\n\t} finally {\n\t\tconst elapsed = Date.now() - startTime;\n\t\texecutionContext[contextKey].elapsed = elapsed;\n\t\trecordMetric(executionContext, `${contextKey}.elapsed`, elapsed);\n\t}\n};\n\ngetWrapper.contextKey = contextKey;\n","export class FetchHttpError extends Error {\n\tconstructor(fetchHttpResponse, description, upstreamError = null) {\n\t\tsuper();\n\n\t\tconst { url, status, statusText } = fetchHttpResponse;\n\n\t\tthis.status = status;\n\t\tthis.statusText = statusText;\n\t\tthis.url = url;\n\t\tthis.message = `${status} ${statusText} (${url}) - ${description}`;\n\t\tthis.name = `FetchHttpError${status}`;\n\t\tthis.upstreamError = upstreamError;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, FetchHttpError);\n\t\t} else {\n\t\t\tthis.stack = new Error(this.message).stack;\n\t\t}\n\t}\n}\n","import { initOptions } from './options';\nimport { recordMetric } from './newrelic';\nimport { FetchHttpError } from '../util/fetch-http-error';\nimport { getAbortSignal } from './abort';\n\nconst validateResponse = async response => {\n\tif (!response.ok) {\n\t\tconst { headers } = response;\n\n\t\t// Try to extract an upstream error message.\n\t\tlet error;\n\t\tlet description;\n\t\ttry {\n\t\t\tconst contentType = headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('json')) {\n\t\t\t\terror = await response.json();\n\t\t\t\tdescription =\n\t\t\t\t\terror.description || error.message || JSON.stringify(error);\n\t\t\t} else {\n\t\t\t\tdescription = await response.text();\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t/* No-Op */\n\t\t}\n\n\t\tthrow new FetchHttpError(response, description, error);\n\t}\n};\n\nconst defaultOptions = {\n\tresponseBodyType: 'json',\n\tvalidateResponse\n};\n\nexport const defaultIsRetryable = err =>\n\t!err.status || err.status === 429 || Math.trunc(err.status / 100) === 5;\n\nexport const defaultCircuitBreakerErrorFilter = err => !defaultIsRetryable(err);\n\nexport const contextKey = 'fetch';\n\nexport const getWrapper = (_nextAction, context) => {\n\tif (!fetch) {\n\t\tthrow new Error(\n\t\t\t'No globally available `fetch` implementation could be found.'\n\t\t);\n\t}\n\n\tinitOptions(context, contextKey, defaultOptions);\n\n\treturn async (fnArgs, executionContext) => {\n\t\tconst [url] = fnArgs;\n\t\tconst options = {\n\t\t\t...executionContext[contextKey].options,\n\t\t\tsignal: getAbortSignal(executionContext)\n\t\t};\n\t\tconst { responseBodyType } = options;\n\n\t\trecordMetric(executionContext, `${contextKey}.url`, url);\n\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await fetch(url, options);\n\t\t} catch (err) {\n\t\t\tif (err.name === 'AbortError') {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\tconst { status } = response;\n\t\trecordMetric(executionContext, `${contextKey}.status`, response.status);\n\n\t\t// response.json() throws an exception when there is no content.\n\t\tif (status === 204) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (options.validateResponse !== null) {\n\t\t\tawait options.validateResponse(response);\n\t\t}\n\n\t\tif (responseBodyType === null) {\n\t\t\treturn response;\n\t\t} else {\n\t\t\treturn response[responseBodyType]();\n\t\t}\n\t};\n};\n\ngetWrapper.contextKey = contextKey;\n","function RetryOperation(timeouts, options) {\n // Compatibility for the old (timeouts, retryForever) signature\n if (typeof options === 'boolean') {\n options = { forever: options };\n }\n\n this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n this._timeouts = timeouts;\n this._options = options || {};\n this._maxRetryTime = options && options.maxRetryTime || Infinity;\n this._fn = null;\n this._errors = [];\n this._attempts = 1;\n this._operationTimeout = null;\n this._operationTimeoutCb = null;\n this._timeout = null;\n this._operationStart = null;\n\n if (this._options.forever) {\n this._cachedTimeouts = this._timeouts.slice(0);\n }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n this._attempts = 1;\n this._timeouts = this._originalTimeouts;\n}\n\nRetryOperation.prototype.stop = function() {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n\n this._timeouts = [];\n this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n\n if (!err) {\n return false;\n }\n var currentTime = new Date().getTime();\n if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n this._errors.unshift(new Error('RetryOperation timeout occurred'));\n return false;\n }\n\n this._errors.push(err);\n\n var timeout = this._timeouts.shift();\n if (timeout === undefined) {\n if (this._cachedTimeouts) {\n // retry forever, only keep last error\n this._errors.splice(this._errors.length - 1, this._errors.length);\n this._timeouts = this._cachedTimeouts.slice(0);\n timeout = this._timeouts.shift();\n } else {\n return false;\n }\n }\n\n var self = this;\n var timer = setTimeout(function() {\n self._attempts++;\n\n if (self._operationTimeoutCb) {\n self._timeout = setTimeout(function() {\n self._operationTimeoutCb(self._attempts);\n }, self._operationTimeout);\n\n if (self._options.unref) {\n self._timeout.unref();\n }\n }\n\n self._fn(self._attempts);\n }, timeout);\n\n if (this._options.unref) {\n timer.unref();\n }\n\n return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n this._fn = fn;\n\n if (timeoutOps) {\n if (timeoutOps.timeout) {\n this._operationTimeout = timeoutOps.timeout;\n }\n if (timeoutOps.cb) {\n this._operationTimeoutCb = timeoutOps.cb;\n }\n }\n\n var self = this;\n if (this._operationTimeoutCb) {\n this._timeout = setTimeout(function() {\n self._operationTimeoutCb();\n }, self._operationTimeout);\n }\n\n this._operationStart = new Date().getTime();\n\n this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n console.log('Using RetryOperation.try() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n console.log('Using RetryOperation.start() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n if (this._errors.length === 0) {\n return null;\n }\n\n var counts = {};\n var mainError = null;\n var mainErrorCount = 0;\n\n for (var i = 0; i < this._errors.length; i++) {\n var error = this._errors[i];\n var message = error.message;\n var count = (counts[message] || 0) + 1;\n\n counts[message] = count;\n\n if (count >= mainErrorCount) {\n mainError = error;\n mainErrorCount = count;\n }\n }\n\n return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n var timeouts = exports.timeouts(options);\n return new RetryOperation(timeouts, {\n forever: options && options.forever,\n unref: options && options.unref,\n maxRetryTime: options && options.maxRetryTime\n });\n};\n\nexports.timeouts = function(options) {\n if (options instanceof Array) {\n return [].concat(options);\n }\n\n var opts = {\n retries: 10,\n factor: 2,\n minTimeout: 1 * 1000,\n maxTimeout: Infinity,\n randomize: false\n };\n for (var key in options) {\n opts[key] = options[key];\n }\n\n if (opts.minTimeout > opts.maxTimeout) {\n throw new Error('minTimeout is greater than maxTimeout');\n }\n\n var timeouts = [];\n for (var i = 0; i < opts.retries; i++) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n if (options && options.forever && !timeouts.length) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n // sort the array numerically ascending\n timeouts.sort(function(a,b) {\n return a - b;\n });\n\n return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n var random = (opts.randomize)\n ? (Math.random() + 1)\n : 1;\n\n var timeout = Math.round(random * opts.minTimeout * Math.pow(opts.factor, attempt));\n timeout = Math.min(timeout, opts.maxTimeout);\n\n return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n if (options instanceof Array) {\n methods = options;\n options = null;\n }\n\n if (!methods) {\n methods = [];\n for (var key in obj) {\n if (typeof obj[key] === 'function') {\n methods.push(key);\n }\n }\n }\n\n for (var i = 0; i < methods.length; i++) {\n var method = methods[i];\n var original = obj[method];\n\n obj[method] = function retryWrapper(original) {\n var op = exports.operation(options);\n var args = Array.prototype.slice.call(arguments, 1);\n var callback = args.pop();\n\n args.push(function(err) {\n if (op.retry(err)) {\n return;\n }\n if (err) {\n arguments[0] = op.mainError();\n }\n callback.apply(this, arguments);\n });\n\n op.attempt(function() {\n original.apply(obj, args);\n });\n }.bind(obj, original);\n obj[method].options = options;\n }\n};\n","module.exports = require('./lib/retry');","// Packages\nvar retrier = require('retry');\n\nfunction retry(fn, opts) {\n function run(resolve, reject) {\n var options = opts || {};\n\n // Default `randomize` to true\n if (!('randomize' in options)) {\n options.randomize = true;\n }\n\n var op = retrier.operation(options);\n\n // We allow the user to abort retrying\n // this makes sense in the cases where\n // knowledge is obtained that retrying\n // would be futile (e.g.: auth errors)\n\n function bail(err) {\n reject(err || new Error('Aborted'));\n }\n\n function onError(err, num) {\n if (err.bail) {\n bail(err);\n return;\n }\n\n if (!op.retry(err)) {\n reject(op.mainError());\n } else if (options.onRetry) {\n options.onRetry(err, num);\n }\n }\n\n function runAttempt(num) {\n var val;\n\n try {\n val = fn(bail, num);\n } catch (err) {\n onError(err, num);\n return;\n }\n\n Promise.resolve(val)\n .then(resolve)\n .catch(function catchIt(err) {\n onError(err, num);\n });\n }\n\n op.attempt(runAttempt);\n }\n\n return new Promise(run);\n}\n\nmodule.exports = retry;\n","import asyncRetry from 'async-retry';\nimport { recordMetric } from './newrelic';\nimport { initOptions } from './options';\n\nexport const contextKey = 'retry';\n\n// See: https://github.com/zeit/async-retry\nconst defaultOptions = {\n\tretries: 1,\n\tminTimeout: 30,\n\tisRetryable: _err => true\n};\n\nexport const getWrapper = (nextAction, context) => {\n\tinitOptions(context, contextKey, defaultOptions);\n\treturn async (fnArgs, executionContext) => {\n\t\tlet attempts = 0;\n\t\ttry {\n\t\t\treturn await asyncRetry(async (bail, attemptNum) => {\n\t\t\t\tattempts = attemptNum;\n\t\t\t\ttry {\n\t\t\t\t\treturn await nextAction(fnArgs, executionContext);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconst { isRetryable } = executionContext[contextKey].options;\n\t\t\t\t\tif (!(await isRetryable(e))) {\n\t\t\t\t\t\tbail(e);\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}, executionContext[contextKey].options);\n\t\t} finally {\n\t\t\texecutionContext[contextKey].attempts = attempts;\n\t\t\trecordMetric(executionContext, `${contextKey}.attempts`, attempts);\n\t\t}\n\t};\n};\n\ngetWrapper.contextKey = contextKey;\n","'use strict';\n\nconst pFinally = require('p-finally');\n\nclass TimeoutError extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = 'TimeoutError';\n\t}\n}\n\nconst pTimeout = (promise, milliseconds, fallback) => new Promise((resolve, reject) => {\n\tif (typeof milliseconds !== 'number' || milliseconds < 0) {\n\t\tthrow new TypeError('Expected `milliseconds` to be a positive number');\n\t}\n\n\tif (milliseconds === Infinity) {\n\t\tresolve(promise);\n\t\treturn;\n\t}\n\n\tconst timer = setTimeout(() => {\n\t\tif (typeof fallback === 'function') {\n\t\t\ttry {\n\t\t\t\tresolve(fallback());\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = typeof fallback === 'string' ? fallback : `Promise timed out after ${milliseconds} milliseconds`;\n\t\tconst timeoutError = fallback instanceof Error ? fallback : new TimeoutError(message);\n\n\t\tif (typeof promise.cancel === 'function') {\n\t\t\tpromise.cancel();\n\t\t}\n\n\t\treject(timeoutError);\n\t}, milliseconds);\n\n\t// TODO: Use native `finally` keyword when targeting Node.js 10\n\tpFinally(\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tpromise.then(resolve, reject),\n\t\t() => {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t);\n});\n\nmodule.exports = pTimeout;\n// TODO: Remove this for the next major release\nmodule.exports.default = pTimeout;\n\nmodule.exports.TimeoutError = TimeoutError;\n","'use strict';\nmodule.exports = (promise, onFinally) => {\n\tonFinally = onFinally || (() => {});\n\n\treturn promise.then(\n\t\tval => new Promise(resolve => {\n\t\t\tresolve(onFinally());\n\t\t}).then(() => val),\n\t\terr => new Promise(resolve => {\n\t\t\tresolve(onFinally());\n\t\t}).then(() => {\n\t\t\tthrow err;\n\t\t})\n\t);\n};\n","import pTimeout from 'p-timeout';\n\nimport { initOptions } from './options';\n\nexport const contextKey = 'timeout';\n\nconst defaultOptions = {\n\ttimeout: 600\n};\n\nexport const getWrapper = (nextAction, context) => {\n\tinitOptions(context, contextKey, defaultOptions);\n\treturn async (fnArgs, executionContext) => {\n\t\tconst { timeout } = executionContext[contextKey].options;\n\t\treturn pTimeout(nextAction(fnArgs, executionContext), timeout);\n\t};\n};\n\ngetWrapper.contextKey = contextKey;\n","import * as abort from './abort';\nimport * as circuitBreaker from './circuit-breaker';\nimport * as contextTerminus from './context-terminus';\nimport * as duration from './duration';\nimport * as fetch from './fetch';\nimport * as newRelic from './newrelic';\nimport * as retry from './retry';\nimport * as timeout from './timeout';\n\nexport const allWrappers = {\n\tabort,\n\tcircuitBreaker,\n\tcontextTerminus,\n\tduration,\n\tfetch,\n\tnewRelic,\n\tretry,\n\ttimeout\n};\n\nconst defaultWrappers = [\n\tnewRelic,\n\tduration,\n\tcircuitBreaker,\n\tretry,\n\ttimeout,\n\tabort,\n\tcontextTerminus\n];\n\n/**\n * Get the default list of wrappers to use in the fault tolerant execution chain.\n *\n * @param {boolean} [terminateContext] - [Optional] By default, the wrapper execution chain will expand the\n * arguments array before passing to the execution terminus (the function supplied when building the\n * fault tolerant chain with `hysteriCall()`). Setting this argument to false will result in the execution\n * terminus receiving two arguments instead:\n * (1) The function arguments in its original array form from the invocation\n * (2) The execution chain context.\n *\n * @returns {Function[]} The default list of wrappers.\n */\nexport const getDefaultWrappers = (terminateContext = true) => {\n\treturn terminateContext\n\t\t? defaultWrappers\n\t\t: defaultWrappers.filter(wrapper => wrapper !== contextTerminus);\n};\n","import { getDefaultWrappers } from './wrappers';\n\nconst createExecutionContext = (context, optionOverrides, wrappers) => {\n\t/* Shallow copy each wrapper context 'sandbox', except for the options\n\t * field, which we also separately shallow copy. Copying in this way\n\t * prevents the deep copy of possibly large and/or circular objects,\n\t * but exposes us to potential future bugs associated with the shallow\n\t * copying of deeply nested objects. */\n\tconst executionContext = { ...context };\n\twrappers.forEach(wrapper => {\n\t\tconst { contextKey } = wrapper;\n\t\texecutionContext[contextKey] = { ...context[contextKey] };\n\t\texecutionContext[contextKey].options = {\n\t\t\t...executionContext[contextKey].options,\n\t\t\t...optionOverrides[contextKey]\n\t\t};\n\t});\n\treturn executionContext;\n};\n\n/**\n * Create a call wrapper that will invoke your supplied function with the supplied (or default) fault tolerance\n * wrappers (e.g. circuit breaker, retry).\n *\n * @param {String} name - Name of the service or action you are wrapping. Should be unique in your application.\n * @param {Function} fn - The function to invoke.\n * @param {Object} [options] - [Optional] Additional options to pass to wrappers, e.g. retry or circuit breaker options.\n * @param {Object[]} [wrappers] - [Optional] The intermediary wrappers to wrap your function with.\n *\n * @returns {HysteriCallExecutor} An async executor function ({@link HysteriCallExecutor}) that should be invoked\n * instead of the original function whenever fault tolerant behavior is desired.\n */\nexport const hysteriCall = (\n\tname,\n\tfn,\n\toptions = {},\n\twrappers = getDefaultWrappers()\n) => {\n\tconst context = createExecutionContext({ name }, options || {}, wrappers);\n\n\t// Build the execution chain upwards from the function.\n\tlet executionChain = fn;\n\twrappers\n\t\t.slice()\n\t\t.reverse()\n\t\t.forEach(wrapper => {\n\t\t\texecutionChain = wrapper.getWrapper(executionChain, context);\n\t\t});\n\n\t/**\n\t * @function HysteriCallExecutor\n\t * @typedef {Function} HysteriCallExecutor\n\t *\n\t * Execute the function supplied to {@link hysteriCall} within a fault tolerant context.\n\t *\n\t * @param {*[]} [fnArgs] - [Optional] An array of arguments to the wrapped function.\n\t * @param {Object} [optionOverrides] - [Optional] Execution time option overrides.\n\t *\n\t * @returns {Promise<*>} A promise containing the function invocation results (if any).\n\t */\n\treturn async (fnArgs = [], optionOverrides = {}) => {\n\t\tif (!Array.isArray(fnArgs)) {\n\t\t\tthrow new Error('Function arguments must be provided as an array');\n\t\t}\n\t\tconst executionContext = createExecutionContext(\n\t\t\tcontext,\n\t\t\toptionOverrides,\n\t\t\twrappers\n\t\t);\n\t\treturn executionChain(fnArgs, executionContext);\n\t};\n};\n","import { hysteriCall } from './hystericall';\nimport { allWrappers, getDefaultWrappers } from './wrappers';\n\n/**\n * Create a call wrapper that will invoke `fetch` with the supplied (or default) fault tolerance wrappers\n * (e.g. circuit breaker, retry).\n *\n * @param {string} name - Name of the service or action you are wrapping. Should be unique in your application.\n * @param {Object} [options] - [Optional] Additional options to pass to wrappers, e.g. retry or circuit breaker options.\n * @param {Object[]} [wrappers] - [Optional] The intermediary wrappers to wrap your function with.\n *\n * @returns {HysteriFetchExecutor} An async executor function ({@link HysteriFetchExecutor}) that should be invoked\n * instead of the `fetch` function whenever fault tolerant behavior is desired.\n */\nexport const hysteriFetch = (\n\tname,\n\toptions = {},\n\twrappers = [...getDefaultWrappers(false), allWrappers.fetch]\n) => {\n\tif (wrappers[wrappers.length - 1] !== allWrappers.fetch) {\n\t\tthrow new Error(\n\t\t\t'The wrappers array argument must end with the fetch wrapper!'\n\t\t);\n\t}\n\n\tconst callOptions = {\n\t\t...options,\n\t\t[allWrappers.retry.contextKey]: {\n\t\t\tisRetryable: allWrappers.fetch.defaultIsRetryable,\n\t\t\t...(options ? options[allWrappers.retry.contextKey] : {})\n\t\t},\n\t\t[allWrappers.circuitBreaker.contextKey]: {\n\t\t\terrorFilter: allWrappers.fetch.defaultCircuitBreakerErrorFilter,\n\t\t\t...(options ? options[allWrappers.circuitBreaker.contextKey] : {})\n\t\t}\n\t};\n\tconst call = hysteriCall(name, null, callOptions, wrappers);\n\n\t/**\n\t * @function HysteriFetchExecutor\n\t * @typedef {Function} HysteriFetchExecutor\n\t *\n\t * Within the fault tolerant context supplied by {@link hysteriFetch}, execute `fetch` and process the response\n\t * body.\n\t *\n\t * @param {String} fetchUrl - The URL argument to `fetch`.\n\t * @param {Object} [fetchOptions] - [Optional] The options argument to `fetch`. These options will override any options\n\t * specified when the executor was created with {@link hysteriFetch}.\n\t * @param {Object} [optionOverrides] - [Optional] Execution time option overrides (for other wrappers).\n\t *\n\t * @returns {Promise<*>} A promise containing the fetch response body (if any).\n\t */\n\treturn async (fetchUrl, fetchOptions = {}, optionOverrides = {}) => {\n\t\tconst mergedOptions = {\n\t\t\t...optionOverrides,\n\t\t\t[allWrappers.fetch.contextKey]: {\n\t\t\t\t...(fetchOptions || {}),\n\t\t\t\t...(optionOverrides\n\t\t\t\t\t? optionOverrides[allWrappers.fetch.contextKey]\n\t\t\t\t\t: {})\n\t\t\t}\n\t\t};\n\t\treturn call([fetchUrl], mergedOptions);\n\t};\n};\n"],"names":["getWrapper","nextAction","fnArgs","executionContext","contextKey","_AbortController","window","document","require","AbortController","abort","abortContext","controller","getAbortSignal","signal","nextActionPromise","cancel","getNoOpWrapper","initOptions","context","key","defaults","options","newrelic","console","warn","noticeError","addPageAction","defaultOptions","isNoticeable","_err","recordMetric","value","metrics","Error","async","e","args","error","name","message","recordMetrics","prefix","startTime","Date","now","elapsed","FetchHttpError","constructor","fetchHttpResponse","description","upstreamError","url","status","statusText","captureStackTrace","this","stack","responseBodyType","validateResponse","response","ok","headers","contentType","get","includes","json","JSON","stringify","text","defaultIsRetryable","err","Math","trunc","_nextAction","fetch","RetryOperation","timeouts","forever","_originalTimeouts","parse","_timeouts","_options","_maxRetryTime","maxRetryTime","Infinity","_fn","_errors","_attempts","_operationTimeout","_operationTimeoutCb","_timeout","_operationStart","_cachedTimeouts","slice","prototype","reset","stop","clearTimeout","retry","currentTime","getTime","unshift","push","timeout","shift","undefined","splice","length","self","timer","setTimeout","unref","attempt","fn","timeoutOps","cb","try","log","start","errors","attempts","mainError","counts","mainErrorCount","i","count","exports","Array","concat","opts","retries","factor","minTimeout","maxTimeout","randomize","createTimeout","sort","a","b","random","round","pow","min","obj","methods","method","original","op","operation","call","arguments","callback","pop","apply","bind","require$$0","Promise","resolve","reject","retrier","bail","onError","num","onRetry","val","then","catch","isRetryable","asyncRetry","attemptNum","TimeoutError","pTimeout","promise","milliseconds","fallback","TypeError","timeoutError","onFinally","pFinally","allWrappers","circuitBreaker","contextTerminus","duration","newRelic","defaultWrappers","getDefaultWrappers","terminateContext","filter","wrapper","createExecutionContext","optionOverrides","wrappers","forEach","hysteriCall","executionChain","reverse","isArray","callOptions","errorFilter","defaultCircuitBreakerErrorFilter","fetchUrl","fetchOptions","mergedOptions"],"mappings":"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"}