construct-hub 0.2.57 → 0.2.58

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. package/.gitattributes +0 -1
  2. package/.jsii +2 -2
  3. package/lib/backend/catalog-builder/catalog-builder.bundle/index.js +1 -1
  4. package/lib/backend/catalog-builder/catalog-builder.bundle/index.js.map +1 -1
  5. package/lib/backend/catalog-builder/catalog-builder.lambda.js +2 -2
  6. package/lib/backend/ingestion/ingestion.bundle/index.js +3 -3
  7. package/lib/backend/ingestion/ingestion.bundle/index.js.map +1 -1
  8. package/lib/backend/ingestion/ingestion.lambda.js +4 -4
  9. package/lib/backend/package-stats/package-stats.bundle/index.js +1 -1
  10. package/lib/backend/package-stats/package-stats.bundle/index.js.map +1 -1
  11. package/lib/backend/package-stats/package-stats.lambda.js +2 -2
  12. package/lib/backend/transliterator/transliterator.bundle/index.js +1 -1
  13. package/lib/backend/transliterator/transliterator.bundle/index.js.map +1 -1
  14. package/lib/backend/transliterator/transliterator.ecstask.js +2 -2
  15. package/lib/construct-hub.js +1 -1
  16. package/lib/package-sources/code-artifact.js +1 -1
  17. package/lib/package-sources/npmjs.js +1 -1
  18. package/lib/package-tag/index.js +2 -2
  19. package/lib/spdx-license.js +1 -1
  20. package/lib/webapp/index.js +10 -4
  21. package/package.json +1 -2
  22. package/lib/webapp/cache-invalidator/constants.d.ts +0 -4
  23. package/lib/webapp/cache-invalidator/constants.js +0 -5
  24. package/lib/webapp/cache-invalidator/handler.bundle/index.js +0 -1404
  25. package/lib/webapp/cache-invalidator/handler.bundle/index.js.map +0 -7
  26. package/lib/webapp/cache-invalidator/handler.d.ts +0 -7
  27. package/lib/webapp/cache-invalidator/handler.js +0 -19
  28. package/lib/webapp/cache-invalidator/handler.lambda.d.ts +0 -3
  29. package/lib/webapp/cache-invalidator/handler.lambda.js +0 -42
  30. package/lib/webapp/cache-invalidator/index.d.ts +0 -34
  31. package/lib/webapp/cache-invalidator/index.js +0 -57
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/aws-embedded-metrics/lib/Constants.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/Environments.js", "../../../../node_modules/aws-embedded-metrics/lib/config/EnvironmentConfigurationProvider.js", "../../../../node_modules/aws-embedded-metrics/lib/config/Configuration.js", "../../../../node_modules/aws-embedded-metrics/lib/utils/Logger.js", "../../../../node_modules/aws-embedded-metrics/lib/logger/MetricValues.js", "../../../../node_modules/aws-embedded-metrics/lib/logger/MetricsContext.js", "../../../../node_modules/aws-embedded-metrics/lib/logger/MetricsLogger.js", "../../../../node_modules/aws-embedded-metrics/lib/serializers/LogSerializer.js", "../../../../node_modules/aws-embedded-metrics/lib/sinks/ConsoleSink.js", "../../../../node_modules/aws-embedded-metrics/lib/sinks/connections/TcpClient.js", "../../../../node_modules/aws-embedded-metrics/lib/sinks/connections/UdpClient.js", "../../../../node_modules/aws-embedded-metrics/lib/sinks/AgentSink.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/DefaultEnvironment.js", "../../../../node_modules/aws-embedded-metrics/lib/utils/Fetch.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/ECSEnvironment.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/EC2Environment.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/LambdaEnvironment.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/LocalEnvironment.js", "../../../../node_modules/aws-embedded-metrics/lib/environment/EnvironmentDetector.js", "../../../../node_modules/aws-embedded-metrics/lib/logger/MetricsLoggerFactory.js", "../../../../node_modules/aws-embedded-metrics/lib/logger/MetricScope.js", "../../../../node_modules/aws-embedded-metrics/lib/logger/Unit.js", "../../../../node_modules/aws-embedded-metrics/lib/index.js", "../../../../node_modules/@sindresorhus/is/dist/index.js", "../../../../node_modules/p-cancelable/index.js", "../../../../node_modules/defer-to-connect/dist/source/index.js", "../../../../node_modules/@szmarczak/http-timer/dist/source/index.js", "../../../../node_modules/cacheable-lookup/source/index.js", "../../../../node_modules/normalize-url/index.js", "../../../../node_modules/wrappy/wrappy.js", "../../../../node_modules/once/once.js", "../../../../node_modules/end-of-stream/index.js", "../../../../node_modules/pump/index.js", "../../../../node_modules/get-stream/buffer-stream.js", "../../../../node_modules/get-stream/index.js", "../../../../node_modules/http-cache-semantics/index.js", "../../../../node_modules/lowercase-keys/index.js", "../../../../node_modules/responselike/src/index.js", "../../../../node_modules/mimic-response/index.js", "../../../../node_modules/clone-response/src/index.js", "../../../../node_modules/json-buffer/index.js", "../../../../node_modules/keyv/src/index.js", "../../../../node_modules/cacheable-request/src/index.js", "../../../../node_modules/decompress-response/node_modules/mimic-response/index.js", "../../../../node_modules/decompress-response/index.js", "../../../../node_modules/quick-lru/index.js", "../../../../node_modules/http2-wrapper/source/agent.js", "../../../../node_modules/http2-wrapper/source/incoming-message.js", "../../../../node_modules/http2-wrapper/source/utils/url-to-options.js", "../../../../node_modules/http2-wrapper/source/utils/proxy-events.js", "../../../../node_modules/http2-wrapper/source/utils/is-request-pseudo-header.js", "../../../../node_modules/http2-wrapper/source/utils/errors.js", "../../../../node_modules/http2-wrapper/source/client-request.js", "../../../../node_modules/resolve-alpn/index.js", "../../../../node_modules/http2-wrapper/source/utils/calculate-server-name.js", "../../../../node_modules/http2-wrapper/source/auto.js", "../../../../node_modules/http2-wrapper/source/index.js", "../../../../node_modules/got/dist/source/core/utils/is-form-data.js", "../../../../node_modules/got/dist/source/core/utils/get-body-size.js", "../../../../node_modules/got/dist/source/core/utils/proxy-events.js", "../../../../node_modules/got/dist/source/core/utils/unhandle.js", "../../../../node_modules/got/dist/source/core/utils/timed-out.js", "../../../../node_modules/got/dist/source/core/utils/url-to-options.js", "../../../../node_modules/got/dist/source/core/utils/options-to-url.js", "../../../../node_modules/got/dist/source/core/utils/weakable-map.js", "../../../../node_modules/got/dist/source/core/utils/get-buffer.js", "../../../../node_modules/got/dist/source/core/utils/dns-ip-version.js", "../../../../node_modules/got/dist/source/core/utils/is-response-ok.js", "../../../../node_modules/got/dist/source/utils/deprecation-warning.js", "../../../../node_modules/got/dist/source/as-promise/normalize-arguments.js", "../../../../node_modules/got/dist/source/core/calculate-retry-delay.js", "../../../../node_modules/got/dist/source/core/index.js", "../../../../node_modules/got/dist/source/as-promise/types.js", "../../../../node_modules/got/dist/source/as-promise/parse-body.js", "../../../../node_modules/got/dist/source/as-promise/index.js", "../../../../node_modules/got/dist/source/as-promise/create-rejection.js", "../../../../node_modules/got/dist/source/utils/deep-freeze.js", "../../../../node_modules/got/dist/source/types.js", "../../../../node_modules/got/dist/source/create.js", "../../../../node_modules/got/dist/source/index.js", "../../../../node_modules/shimmer/index.js", "../../../../node_modules/emitter-listener/listener.js", "../../../../node_modules/cls-hooked/context.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/logger.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/attributes/captured_exception.js", "../../../../node_modules/atomic-batcher/index.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/daemon_config.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segment_emitter.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/attributes/trace_id.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/utils.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/segment_utils.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/attributes/remote_request_data.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/attributes/subsegment.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/segment.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/context_utils.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/incoming_request_data.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/local_reservoir.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/local_sampler.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/reservoir.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/sampling_rule.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/service_connector.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/rule_cache.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/rule_poller.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/target_poller.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/sampling/default_sampler.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/middleware/mw_utils.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/env/aws_lambda.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/plugins/plugin.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/plugins/ec2_plugin.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/plugins/ecs_plugin.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/plugins/elastic_beanstalk_plugin.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/patchers/call_capturer.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/segments/attributes/aws.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/capture.js", "../../../../node_modules/aws-xray-sdk-core/node_modules/semver/semver.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/patchers/aws_p.js", "../../../../node_modules/@aws-sdk/service-error-classification/dist-cjs/constants.js", "../../../../node_modules/@aws-sdk/service-error-classification/dist-cjs/index.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/patchers/aws3_p.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/patchers/http_p.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/patchers/promise_p.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/database/sql_data.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/aws-xray.js", "../../../../node_modules/aws-xray-sdk-core/dist/lib/index.js", "../../../../src/backend/package-stats/package-stats.lambda.ts", "../../../../src/backend/shared/aws.lambda-shared.ts", "../../../../src/backend/shared/env.lambda-shared.ts", "../../../../src/backend/catalog-builder/client.lambda-shared.ts", "../../../../src/backend/package-stats/constants.ts", "../../../../src/backend/package-stats/npm-downloads.lambda-shared.ts"],
4
- "sourcesContent": ["\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Constants;\n(function (Constants) {\n Constants[Constants[\"MAX_DIMENSIONS\"] = 9] = \"MAX_DIMENSIONS\";\n Constants[\"DEFAULT_NAMESPACE\"] = \"aws-embedded-metrics\";\n Constants[Constants[\"MAX_METRICS_PER_EVENT\"] = 100] = \"MAX_METRICS_PER_EVENT\";\n Constants[\"DEFAULT_AGENT_HOST\"] = \"0.0.0.0\";\n Constants[Constants[\"DEFAULT_AGENT_PORT\"] = 25888] = \"DEFAULT_AGENT_PORT\";\n})(Constants = exports.Constants || (exports.Constants = {}));\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Environments;\n(function (Environments) {\n Environments[\"Local\"] = \"Local\";\n Environments[\"Lambda\"] = \"Lambda\";\n Environments[\"Agent\"] = \"Agent\";\n Environments[\"EC2\"] = \"EC2\";\n Environments[\"ECS\"] = \"ECS\";\n Environments[\"Unknown\"] = \"\";\n})(Environments || (Environments = {}));\nexports.default = Environments;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Constants_1 = require(\"../Constants\");\nconst Environments_1 = require(\"../environment/Environments\");\nconst ENV_VAR_PREFIX = 'AWS_EMF';\nvar ConfigKeys;\n(function (ConfigKeys) {\n ConfigKeys[\"LOG_GROUP_NAME\"] = \"LOG_GROUP_NAME\";\n ConfigKeys[\"LOG_STREAM_NAME\"] = \"LOG_STREAM_NAME\";\n ConfigKeys[\"ENABLE_DEBUG_LOGGING\"] = \"ENABLE_DEBUG_LOGGING\";\n ConfigKeys[\"SERVICE_NAME\"] = \"SERVICE_NAME\";\n ConfigKeys[\"SERVICE_TYPE\"] = \"SERVICE_TYPE\";\n ConfigKeys[\"AGENT_ENDPOINT\"] = \"AGENT_ENDPOINT\";\n ConfigKeys[\"ENVIRONMENT_OVERRIDE\"] = \"ENVIRONMENT\";\n ConfigKeys[\"NAMESPACE\"] = \"NAMESPACE\";\n})(ConfigKeys || (ConfigKeys = {}));\nclass EnvironmentConfigurationProvider {\n getConfiguration() {\n return {\n agentEndpoint: this.getEnvVariable(ConfigKeys.AGENT_ENDPOINT),\n debuggingLoggingEnabled: this.tryGetEnvVariableAsBoolean(ConfigKeys.ENABLE_DEBUG_LOGGING, false),\n logGroupName: this.getEnvVariable(ConfigKeys.LOG_GROUP_NAME),\n logStreamName: this.getEnvVariable(ConfigKeys.LOG_STREAM_NAME),\n serviceName: this.getEnvVariable(ConfigKeys.SERVICE_NAME) || this.getEnvVariableWithoutPrefix(ConfigKeys.SERVICE_NAME),\n serviceType: this.getEnvVariable(ConfigKeys.SERVICE_TYPE) || this.getEnvVariableWithoutPrefix(ConfigKeys.SERVICE_TYPE),\n environmentOverride: this.getEnvironmentOverride(),\n namespace: this.getEnvVariable(ConfigKeys.NAMESPACE) || Constants_1.Constants.DEFAULT_NAMESPACE,\n };\n }\n getEnvVariableWithoutPrefix(configKey) {\n return process.env[configKey];\n }\n getEnvVariable(configKey) {\n return process.env[`${ENV_VAR_PREFIX}_${configKey}`];\n }\n tryGetEnvVariableAsBoolean(configKey, fallback) {\n const configValue = this.getEnvVariable(configKey);\n return !configValue ? fallback : configValue.toLowerCase() === 'true';\n }\n getEnvironmentOverride() {\n const overrideValue = this.getEnvVariable(ConfigKeys.ENVIRONMENT_OVERRIDE);\n const environment = Environments_1.default[overrideValue];\n if (environment === undefined) {\n return Environments_1.default.Unknown;\n }\n return environment;\n }\n}\nexports.EnvironmentConfigurationProvider = EnvironmentConfigurationProvider;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst EnvironmentConfigurationProvider_1 = require(\"./EnvironmentConfigurationProvider\");\nconst Configuration = new EnvironmentConfigurationProvider_1.EnvironmentConfigurationProvider().getConfiguration();\nexports.default = Configuration;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst LOG = (...args) => {\n if (Configuration_1.default.debuggingLoggingEnabled) {\n console.log(...args);\n }\n};\nexports.LOG = LOG;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass MetricValues {\n constructor(value, unit) {\n this.values = [value];\n this.unit = unit || 'None';\n }\n /**\n * Appends the provided value to the current metric\n * @param value\n */\n addValue(value) {\n this.values.push(value);\n }\n}\nexports.MetricValues = MetricValues;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst MetricValues_1 = require(\"./MetricValues\");\nclass MetricsContext {\n /**\n * Constructor used to create child instances.\n * You should not use this constructor directly.\n * Instead, use createCopyWithContext() or empty().\n *\n * The reason for this is to avoid unexpected behavior when creating\n * MetricsContexts with defaultDimensions and existing dimensions.\n *\n * @param properties\n * @param dimensions\n */\n constructor(namespace, properties, dimensions, defaultDimensions, shouldUseDefaultDimensions, timestamp) {\n this.metrics = new Map();\n this.meta = {};\n this.shouldUseDefaultDimensions = true;\n this.namespace = namespace || Configuration_1.default.namespace;\n this.properties = properties || {};\n this.dimensions = dimensions || [];\n this.timestamp = timestamp;\n this.meta.Timestamp = MetricsContext.resolveMetaTimestamp(timestamp);\n this.defaultDimensions = defaultDimensions || {};\n if (shouldUseDefaultDimensions != undefined) {\n this.shouldUseDefaultDimensions = shouldUseDefaultDimensions;\n }\n }\n /**\n * Use this to create a new, empty context.\n */\n static empty() {\n return new MetricsContext();\n }\n static resolveMetaTimestamp(timestamp) {\n if (timestamp instanceof Date) {\n return timestamp.getTime();\n }\n else if (timestamp) {\n return timestamp;\n }\n else {\n return Date.now();\n }\n }\n setNamespace(value) {\n this.namespace = value;\n }\n setProperty(key, value) {\n this.properties[key] = value;\n }\n setTimestamp(timestamp) {\n this.timestamp = timestamp;\n this.meta.Timestamp = MetricsContext.resolveMetaTimestamp(timestamp);\n }\n /**\n * Sets default dimensions for the Context.\n * A dimension set will be created with just the default dimensions\n * and all calls to putDimensions will be prepended with the defaults.\n */\n setDefaultDimensions(dimensions) {\n Logger_1.LOG(`Received default dimensions`, dimensions);\n this.defaultDimensions = dimensions;\n }\n /**\n * Adds a new set of dimensions. Any time a new dimensions set\n * is added, the set is first prepended by the default dimensions.\n *\n * @param dimensions\n */\n putDimensions(incomingDimensionSet) {\n if (this.dimensions.length === 0) {\n this.dimensions.push(incomingDimensionSet);\n return;\n }\n for (let i = 0; i < this.dimensions.length; i++) {\n const existingDimensionSet = this.dimensions[i];\n // check for duplicate dimensions when putting\n // this is an O(n^2) operation, but since we never expect to have more than\n // 10 dimensions, this is acceptable for almost all cases.\n // This makes re-using loggers much easier.\n const existingDimensionSetKeys = Object.keys(existingDimensionSet);\n const incomingDimensionSetKeys = Object.keys(incomingDimensionSet);\n if (existingDimensionSetKeys.length !== incomingDimensionSetKeys.length) {\n this.dimensions.push(incomingDimensionSet);\n return;\n }\n for (let j = 0; j < existingDimensionSetKeys.length; j++) {\n if (!incomingDimensionSetKeys.includes(existingDimensionSetKeys[j])) {\n // we're done now because we know that the dimensions keys are not identical\n this.dimensions.push(incomingDimensionSet);\n return;\n }\n }\n }\n }\n /**\n * Overwrite all dimensions.\n *\n * @param dimensionSets\n */\n setDimensions(dimensionSets) {\n this.shouldUseDefaultDimensions = false;\n this.dimensions = dimensionSets;\n }\n /**\n * Get the current dimensions.\n */\n getDimensions() {\n // caller has explicitly called setDimensions\n if (this.shouldUseDefaultDimensions === false) {\n return this.dimensions;\n }\n // if there are no default dimensions, return the custom dimensions\n if (Object.keys(this.defaultDimensions).length === 0) {\n return this.dimensions;\n }\n // if default dimensions have been provided, but no custom dimensions, use the defaults\n if (this.dimensions.length === 0) {\n return [this.defaultDimensions];\n }\n // otherwise, merge the dimensions\n // we do this on the read path because default dimensions\n // may get updated asynchronously by environment detection\n return this.dimensions.map(custom => {\n return Object.assign(Object.assign({}, this.defaultDimensions), custom);\n });\n }\n putMetric(key, value, unit) {\n const currentMetric = this.metrics.get(key);\n if (currentMetric) {\n currentMetric.addValue(value);\n }\n else {\n this.metrics.set(key, new MetricValues_1.MetricValues(value, unit));\n }\n }\n /**\n * Creates an independently flushable context.\n */\n createCopyWithContext() {\n return new MetricsContext(this.namespace, Object.assign({}, this.properties), Object.assign([], this.dimensions), this.defaultDimensions, this.shouldUseDefaultDimensions, this.timestamp);\n }\n}\nexports.MetricsContext = MetricsContext;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst MetricsContext_1 = require(\"./MetricsContext\");\n/**\n * An async metrics logger.\n * Use this interface to publish logs to CloudWatch Logs\n * and extract metrics to CloudWatch Metrics asynchronously.\n */\nclass MetricsLogger {\n constructor(resolveEnvironment, context) {\n this.configureContextForEnvironment = (context, environment) => {\n const defaultDimensions = {\n // LogGroup name will entirely depend on the environment since there\n // are some cases where the LogGroup cannot be configured (e.g. Lambda)\n LogGroup: environment.getLogGroupName(),\n ServiceName: Configuration_1.default.serviceName || environment.getName(),\n ServiceType: Configuration_1.default.serviceType || environment.getType(),\n };\n context.setDefaultDimensions(defaultDimensions);\n environment.configureContext(context);\n };\n this.resolveEnvironment = resolveEnvironment;\n this.context = context || MetricsContext_1.MetricsContext.empty();\n }\n /**\n * Flushes the current context state to the configured sink.\n */\n flush() {\n return __awaiter(this, void 0, void 0, function* () {\n // resolve the environment and get the sink\n // MOST of the time this will run synchonrously\n // This only runs asynchronously if executing for the\n // first time in a non-lambda environment\n const environment = yield this.resolveEnvironment();\n this.configureContextForEnvironment(this.context, environment);\n const sink = environment.getSink();\n // accept and reset the context\n yield sink.accept(this.context);\n this.context = this.context.createCopyWithContext();\n });\n }\n /**\n * Set a property on the published metrics.\n * This is stored in the emitted log data and you are not\n * charged for this data by CloudWatch Metrics.\n * These values can be values that are useful for searching on,\n * but have too high cardinality to emit as dimensions to\n * CloudWatch Metrics.\n *\n * @param key Property name\n * @param value Property value\n */\n setProperty(key, value) {\n this.context.setProperty(key, value);\n return this;\n }\n /**\n * Adds a dimension.\n * This is generally a low cardinality key-value pair that is part of the metric identity.\n * CloudWatch treats each unique combination of dimensions as a separate metric, even if the metrics have the same metric name.\n *\n * @param dimension\n * @param value\n * @see [CloudWatch Dimensions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension)\n */\n putDimensions(dimensions) {\n this.context.putDimensions(dimensions);\n return this;\n }\n /**\n * Overwrite all dimensions on this MetricsLogger instance.\n *\n * @param dimensionSets\n * @see [CloudWatch Dimensions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension)\n */\n setDimensions(...dimensionSets) {\n this.context.setDimensions(dimensionSets);\n return this;\n }\n /**\n * Put a metric value.\n * This value will be emitted to CloudWatch Metrics asyncronously and does not contribute to your\n * account TPS limits. The value will also be available in your CloudWatch Logs\n * @param key\n * @param value\n * @param unit\n */\n putMetric(key, value, unit) {\n this.context.putMetric(key, value, unit);\n return this;\n }\n /**\n * Set the CloudWatch namespace that metrics should be published to.\n * @param value\n */\n setNamespace(value) {\n this.context.setNamespace(value);\n return this;\n }\n /**\n * Set the timestamp of metrics emitted in this context.\n *\n * If not set, the timestamp will default to new Date() at the point\n * the context is constructed.\n *\n * If set, timestamp will preserved across calls to flush().\n *\n * @param timestamp\n */\n setTimestamp(timestamp) {\n this.context.setTimestamp(timestamp);\n return this;\n }\n /**\n * Creates a new logger using the same contextual data as\n * the previous logger. This allows you to flush the instances\n * independently.\n */\n new() {\n return new MetricsLogger(this.resolveEnvironment, this.context.createCopyWithContext());\n }\n}\nexports.MetricsLogger = MetricsLogger;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Constants_1 = require(\"../Constants\");\n/**\n * Serializes the provided context to the CWL Structured\n * Logs format with Embedded Metric Filters.\n */\nclass LogSerializer {\n /**\n * Retrieve the current context as a JSON string\n */\n serialize(context) {\n const dimensionKeys = [];\n let dimensionProperties = {};\n context.getDimensions().forEach(d => {\n // we can only take the first 9 defined dimensions\n // the reason we do this in the serializer is because\n // it is possible that other sinks or formats can\n // support more dimensions\n // in the future it may make sense to introduce a higher-order\n // representation for sink-specific validations\n const keys = Object.keys(d).slice(0, Constants_1.Constants.MAX_DIMENSIONS);\n dimensionKeys.push(keys);\n dimensionProperties = Object.assign(Object.assign({}, dimensionProperties), d);\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createBody = () => {\n return Object.assign(Object.assign(Object.assign({}, dimensionProperties), context.properties), { _aws: Object.assign(Object.assign({}, context.meta), { CloudWatchMetrics: [\n {\n Dimensions: dimensionKeys,\n Metrics: [],\n Namespace: context.namespace,\n },\n ] }) });\n };\n const eventBatches = [];\n let currentBody = createBody();\n const currentMetricsInBody = () => currentBody._aws.CloudWatchMetrics[0].Metrics.length;\n const shouldSerialize = () => currentMetricsInBody() === Constants_1.Constants.MAX_METRICS_PER_EVENT;\n // converts the body to JSON and pushes it into the batches\n const serializeCurrentBody = () => {\n eventBatches.push(JSON.stringify(currentBody));\n currentBody = createBody();\n };\n for (const [key, metric] of context.metrics) {\n // if there is only one metric value, unwrap it to make querying easier\n const metricValue = metric.values.length === 1 ? metric.values[0] : metric.values;\n currentBody[key] = metricValue;\n currentBody._aws.CloudWatchMetrics[0].Metrics.push({ Name: key, Unit: metric.unit });\n if (shouldSerialize()) {\n serializeCurrentBody();\n }\n }\n if (eventBatches.length === 0 || currentMetricsInBody() > 0) {\n serializeCurrentBody();\n }\n return eventBatches;\n }\n}\nexports.LogSerializer = LogSerializer;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst LogSerializer_1 = require(\"../serializers/LogSerializer\");\n/**\n * A sink that flushes log data to stdout.\n * This is the preferred sink for Lambda functions.\n */\nclass ConsoleSink {\n constructor(serializer) {\n this.name = 'ConsoleSink';\n this.serializer = serializer || new LogSerializer_1.LogSerializer();\n }\n accept(context) {\n // tslint:disable-next-line\n const events = this.serializer.serialize(context);\n events.forEach(event => console.log(event));\n return Promise.resolve();\n }\n}\nexports.ConsoleSink = ConsoleSink;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst net = require(\"net\");\nconst Logger_1 = require(\"../../utils/Logger\");\nclass TcpClient {\n constructor(endpoint) {\n this.endpoint = endpoint;\n this.socket = new net.Socket({ allowHalfOpen: true, writable: false })\n .setEncoding('utf8')\n .setKeepAlive(true)\n .setTimeout(5000) // idle timeout\n .on('timeout', () => this.disconnect('idle timeout'))\n .on('end', () => this.disconnect('end'))\n .on('data', data => Logger_1.LOG('TcpClient received data.', data));\n }\n warmup() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield this.establishConnection();\n }\n catch (err) {\n Logger_1.LOG('Failed to connect', err);\n }\n });\n }\n sendMessage(message) {\n return __awaiter(this, void 0, void 0, function* () {\n // ensure the socket is open and writable\n yield this.waitForOpenConnection();\n yield new Promise((resolve, reject) => {\n const onSendError = (err) => {\n Logger_1.LOG('Failed to write', err);\n reject(err);\n };\n const wasFlushedToKernel = this.socket.write(message, (err) => {\n if (!err) {\n Logger_1.LOG('Write succeeded');\n resolve();\n }\n else {\n onSendError(err);\n }\n });\n if (!wasFlushedToKernel) {\n Logger_1.LOG('TcpClient data was not flushed to kernel buffer and was queued in memory.');\n }\n });\n });\n }\n disconnect(eventName) {\n Logger_1.LOG('TcpClient disconnected due to:', eventName);\n this.socket.removeAllListeners();\n this.socket.destroy();\n this.socket.unref();\n }\n waitForOpenConnection() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.socket.writeable || this.socket.readyState !== 'open') {\n yield this.establishConnection();\n }\n });\n }\n establishConnection() {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((resolve, reject) => {\n const onError = (e) => {\n // socket is already open, no need to connect\n if (e.message.includes('EISCONN')) {\n resolve();\n return;\n }\n Logger_1.LOG('TCP Client received error', e);\n this.disconnect(e.message);\n reject(e);\n };\n const onConnect = () => {\n this.socket.removeListener('error', onError);\n Logger_1.LOG('TcpClient connected.', this.endpoint);\n resolve();\n };\n // TODO: convert this to a proper state machine\n switch (this.socket.readyState) {\n case 'open':\n resolve();\n break;\n case 'opening':\n // the socket is currently opening, we will resolve\n // or fail the current promise on the connect or\n // error events\n this.socket.once('connect', onConnect);\n this.socket.once('error', onError);\n break;\n default:\n Logger_1.LOG('opening connection with socket in state: ', this.socket.readyState);\n this.socket.connect(this.endpoint.port, this.endpoint.host, onConnect).once('error', onError);\n break;\n }\n });\n });\n }\n}\nexports.TcpClient = TcpClient;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst dgram = require(\"dgram\");\nconst Logger_1 = require(\"../../utils/Logger\");\nclass UdpClient {\n constructor(endpoint) {\n this.endpoint = endpoint;\n }\n // No warm up for UDP\n warmup() {\n return Promise.resolve();\n }\n sendMessage(message) {\n return __awaiter(this, void 0, void 0, function* () {\n const client = dgram.createSocket('udp4');\n client.send(message, this.endpoint.port, this.endpoint.host, (error) => {\n if (error) {\n Logger_1.LOG(error);\n }\n client.close();\n });\n return Promise.resolve();\n });\n }\n}\nexports.UdpClient = UdpClient;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url = require(\"url\");\nconst Configuration_1 = require(\"../config/Configuration\");\nconst LogSerializer_1 = require(\"../serializers/LogSerializer\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst TcpClient_1 = require(\"./connections/TcpClient\");\nconst UdpClient_1 = require(\"./connections/UdpClient\");\nconst TCP = 'tcp:';\nconst UDP = 'udp:';\nconst defaultTcpEndpoint = {\n host: '0.0.0.0',\n port: 25888,\n protocol: TCP,\n};\nconst parseEndpoint = (endpoint) => {\n try {\n if (!endpoint) {\n return defaultTcpEndpoint;\n }\n const parsedUrl = url.parse(endpoint);\n if (!parsedUrl.hostname || !parsedUrl.port || !parsedUrl.protocol) {\n Logger_1.LOG(`Failed to parse the provided agent endpoint. Falling back to the default TCP endpoint.`, parsedUrl);\n return defaultTcpEndpoint;\n }\n if (parsedUrl.protocol !== TCP && parsedUrl.protocol !== UDP) {\n Logger_1.LOG(`The provided agent endpoint protocol '${parsedUrl.protocol}' is not supported. Please use TCP or UDP. Falling back to the default TCP endpoint.`, parsedUrl);\n return defaultTcpEndpoint;\n }\n return {\n host: parsedUrl.hostname,\n port: Number(parsedUrl.port),\n protocol: parsedUrl.protocol,\n };\n }\n catch (e) {\n Logger_1.LOG('Failed to parse the provided agent endpoint', e);\n return defaultTcpEndpoint;\n }\n};\n/**\n * A sink that flushes to the CW Agent.\n * This sink instance should be re-used to avoid\n * leaking connections.\n */\nclass AgentSink {\n constructor(logGroupName, logStreamName, serializer) {\n this.name = 'AgentSink';\n this.logGroupName = logGroupName;\n this.logStreamName = logStreamName;\n this.serializer = serializer || new LogSerializer_1.LogSerializer();\n this.endpoint = parseEndpoint(Configuration_1.default.agentEndpoint);\n this.socketClient = this.getSocketClient(this.endpoint);\n Logger_1.LOG('Using socket client', this.socketClient.constructor.name);\n }\n accept(context) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.logGroupName) {\n context.meta.LogGroupName = this.logGroupName;\n }\n if (this.logStreamName) {\n context.meta.LogStreamName = this.logStreamName;\n }\n const events = this.serializer.serialize(context);\n Logger_1.LOG(`Sending {} events to socket.`, events.length);\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n const message = event + '\\n';\n const bytes = Buffer.from(message);\n yield this.socketClient.sendMessage(bytes);\n }\n });\n }\n getSocketClient(endpoint) {\n Logger_1.LOG('Getting socket client for connection.', endpoint);\n const client = endpoint.protocol === TCP ? new TcpClient_1.TcpClient(endpoint) : new UdpClient_1.UdpClient(endpoint);\n client.warmup();\n return client;\n }\n}\nexports.AgentSink = AgentSink;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst AgentSink_1 = require(\"../sinks/AgentSink\");\nconst Logger_1 = require(\"../utils/Logger\");\nclass DefaultEnvironment {\n probe() {\n return Promise.resolve(true);\n }\n getName() {\n if (!Configuration_1.default.serviceName) {\n Logger_1.LOG('Unknown ServiceName.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceName;\n }\n getType() {\n if (!Configuration_1.default.serviceType) {\n Logger_1.LOG('Unknown ServiceType.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceType;\n }\n getLogGroupName() {\n // if the caller explicitly overrides logGroupName to\n // be empty, we should honor that rather than providing\n // the default behavior.\n if (Configuration_1.default.logGroupName === '') {\n return '';\n }\n return Configuration_1.default.logGroupName ? Configuration_1.default.logGroupName : `${this.getName()}-metrics`;\n }\n configureContext() {\n // no-op\n }\n getSink() {\n if (!this.sink) {\n this.sink = new AgentSink_1.AgentSink(this.getLogGroupName(), Configuration_1.default.logStreamName);\n }\n return this.sink;\n }\n}\nexports.DefaultEnvironment = DefaultEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst http = require(\"http\");\nconst SOCKET_TIMEOUT = 1000;\n/**\n * Fetch JSON data from an remote HTTP endpoint and de-serialize to the provided type.\n * There are no guarantees the response will conform to the contract defined by T.\n * It is up to the consumer to ensure the provided T captures all possible response types\n * from the provided endpoint.\n *\n * @param url - currently only supports HTTP\n */\nconst fetch = (url) => {\n return new Promise((resolve, reject) => {\n const request = http\n .get(url, { timeout: 2000 }, (response) => {\n if (!response.statusCode) {\n reject(`Received undefined response status code from '${url}'`);\n return;\n }\n if (response.statusCode < 200 || response.statusCode > 299) {\n reject(new Error('Failed to load page, status code: ' + response.statusCode));\n return;\n }\n // using similar approach to node-fetch\n // https://github.com/bitinn/node-fetch/blob/6a5d192034a0f438551dffb6d2d8df2c00921d16/src/body.js#L217\n const body = [];\n let bodyBytes = 0;\n response.on('data', (chunk) => {\n bodyBytes += chunk.length;\n body.push(chunk);\n });\n response.on('end', () => {\n let responseString;\n try {\n const buffer = Buffer.concat(body, bodyBytes);\n responseString = buffer.toString();\n const parsedJson = JSON.parse(responseString);\n resolve(parsedJson);\n }\n catch (e) {\n reject(`Failed to parse response from '${url}' as JSON. Received: ${responseString}`);\n }\n });\n })\n .on('error', (err) => {\n reject(err);\n });\n request.on('socket', socket => {\n socket.on('timeout', () => {\n request.abort();\n reject(`Socket timeout while connecting to '${url}'`);\n });\n socket.setTimeout(SOCKET_TIMEOUT);\n });\n });\n};\nexports.fetch = fetch;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst AgentSink_1 = require(\"../sinks/AgentSink\");\nconst Fetch_1 = require(\"../utils/Fetch\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst os = require(\"os\");\nconst Constants_1 = require(\"../Constants\");\n// formats image names into something more readable for a metric name\n// e.g. <account-id>.dkr.ecr.<region>.amazonaws.com/<image-name>:latest -> <image-name>:latest\nconst formatImageName = (imageName) => {\n if (imageName) {\n const splitImageName = imageName.split('/');\n return splitImageName[splitImageName.length - 1];\n }\n return imageName;\n};\nclass ECSEnvironment {\n probe() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!process.env.ECS_CONTAINER_METADATA_URI) {\n return Promise.resolve(false);\n }\n if (process.env.FLUENT_HOST && !Configuration_1.default.agentEndpoint) {\n this.fluentBitEndpoint = `tcp://${process.env.FLUENT_HOST}:${Constants_1.Constants.DEFAULT_AGENT_PORT}`;\n Configuration_1.default.agentEndpoint = this.fluentBitEndpoint;\n Logger_1.LOG(`Using FluentBit configuration. Endpoint: ${this.fluentBitEndpoint}`);\n }\n try {\n this.metadata = yield Fetch_1.fetch(process.env.ECS_CONTAINER_METADATA_URI);\n if (this.metadata) {\n this.metadata.FormattedImageName = formatImageName(this.metadata.Image);\n Logger_1.LOG(`Successfully collected ECS Container metadata.`);\n }\n }\n catch (e) {\n Logger_1.LOG('Failed to collect ECS Container Metadata.');\n Logger_1.LOG(e);\n }\n // return true regardless of whether or not metadata collection\n // succeeded. we know that this is supposed to be an ECS environment\n // just from the environment variable\n return true;\n });\n }\n getName() {\n var _a;\n if (Configuration_1.default.serviceName) {\n return Configuration_1.default.serviceName;\n }\n return ((_a = this.metadata) === null || _a === void 0 ? void 0 : _a.FormattedImageName) ? this.metadata.FormattedImageName : 'Unknown';\n }\n getType() {\n return 'AWS::ECS::Container';\n }\n getLogGroupName() {\n // FireLens / fluent-bit does not need the log group to be included\n // since configuration of the LogGroup is handled by the\n // fluent bit config file\n if (this.fluentBitEndpoint) {\n return '';\n }\n return Configuration_1.default.logGroupName || this.getName();\n }\n configureContext(context) {\n var _a, _b, _c, _d, _e;\n this.addProperty(context, 'containerId', os.hostname());\n this.addProperty(context, 'createdAt', (_a = this.metadata) === null || _a === void 0 ? void 0 : _a.CreatedAt);\n this.addProperty(context, 'startedAt', (_b = this.metadata) === null || _b === void 0 ? void 0 : _b.StartedAt);\n this.addProperty(context, 'image', (_c = this.metadata) === null || _c === void 0 ? void 0 : _c.Image);\n this.addProperty(context, 'cluster', (_d = this.metadata) === null || _d === void 0 ? void 0 : _d.Labels['com.amazonaws.ecs.cluster']);\n this.addProperty(context, 'taskArn', (_e = this.metadata) === null || _e === void 0 ? void 0 : _e.Labels['com.amazonaws.ecs.task-arn']);\n // we override the standard default dimensions here because in the\n // FireLens / fluent-bit case, we don't need the LogGroup\n if (this.fluentBitEndpoint) {\n context.setDefaultDimensions({\n ServiceName: Configuration_1.default.serviceName || this.getName(),\n ServiceType: Configuration_1.default.serviceType || this.getType(),\n });\n }\n }\n getSink() {\n if (!this.sink) {\n const logGroupName = this.fluentBitEndpoint ? '' : this.getLogGroupName();\n this.sink = new AgentSink_1.AgentSink(logGroupName);\n }\n return this.sink;\n }\n addProperty(context, key, value) {\n if (value) {\n context.setProperty(key, value);\n }\n }\n}\nexports.ECSEnvironment = ECSEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst AgentSink_1 = require(\"../sinks/AgentSink\");\nconst Fetch_1 = require(\"../utils/Fetch\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst endpoint = 'http://169.254.169.254/latest/dynamic/instance-identity/document';\nclass EC2Environment {\n probe() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n this.metadata = yield Fetch_1.fetch(endpoint);\n if (this.metadata) {\n return true;\n }\n return false;\n }\n catch (e) {\n Logger_1.LOG(e);\n return false;\n }\n });\n }\n getName() {\n if (!Configuration_1.default.serviceName) {\n Logger_1.LOG('Unknown ServiceName.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceName;\n }\n getType() {\n if (this.metadata) {\n return 'AWS::EC2::Instance';\n }\n // this will only happen if probe() is not called first\n return 'Unknown';\n }\n getLogGroupName() {\n return Configuration_1.default.logGroupName ? Configuration_1.default.logGroupName : `${this.getName()}-metrics`;\n }\n configureContext(context) {\n if (this.metadata) {\n context.setProperty('imageId', this.metadata.imageId);\n context.setProperty('instanceId', this.metadata.instanceId);\n context.setProperty('instanceType', this.metadata.instanceType);\n context.setProperty('privateIP', this.metadata.privateIp);\n context.setProperty('availabilityZone', this.metadata.availabilityZone);\n }\n }\n getSink() {\n if (!this.sink) {\n this.sink = new AgentSink_1.AgentSink(this.getLogGroupName(), Configuration_1.default.logStreamName);\n }\n return this.sink;\n }\n}\nexports.EC2Environment = EC2Environment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst ConsoleSink_1 = require(\"../sinks/ConsoleSink\");\nclass LambdaEnvironment {\n probe() {\n return Promise.resolve(process.env.AWS_LAMBDA_FUNCTION_NAME ? true : false);\n }\n getName() {\n return process.env.AWS_LAMBDA_FUNCTION_NAME || 'Unknown';\n }\n getType() {\n return 'AWS::Lambda::Function';\n }\n getLogGroupName() {\n return this.getName();\n }\n configureContext(context) {\n this.addProperty(context, 'executionEnvironment', process.env.AWS_EXECUTION_ENV);\n this.addProperty(context, 'memorySize', process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE);\n this.addProperty(context, 'functionVersion', process.env.AWS_LAMBDA_FUNCTION_VERSION);\n this.addProperty(context, 'logStreamId', process.env.AWS_LAMBDA_LOG_STREAM_NAME);\n const trace = this.getSampledTrace();\n if (trace) {\n this.addProperty(context, 'traceId', trace);\n }\n }\n getSink() {\n if (!this.sink) {\n this.sink = new ConsoleSink_1.ConsoleSink();\n }\n return this.sink;\n }\n addProperty(context, key, value) {\n if (value) {\n context.setProperty(key, value);\n }\n }\n getSampledTrace() {\n // only collect traces which have been sampled\n if (process.env._X_AMZN_TRACE_ID && process.env._X_AMZN_TRACE_ID.includes('Sampled=1')) {\n return process.env._X_AMZN_TRACE_ID;\n }\n }\n}\nexports.LambdaEnvironment = LambdaEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst ConsoleSink_1 = require(\"../sinks/ConsoleSink\");\nclass LocalEnvironment {\n probe() {\n // probe is not intended to be used in the LocalEnvironment\n // To use the local environment you should set the environment\n // override\n return Promise.resolve(false);\n }\n getName() {\n if (!Configuration_1.default.serviceName) {\n Logger_1.LOG('Unknown ServiceName.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceName;\n }\n getType() {\n if (!Configuration_1.default.serviceType) {\n Logger_1.LOG('Unknown ServiceType.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceType;\n }\n getLogGroupName() {\n return Configuration_1.default.logGroupName ? Configuration_1.default.logGroupName : `${this.getName()}-metrics`;\n }\n configureContext() {\n // no-op\n }\n getSink() {\n if (!this.sink) {\n this.sink = new ConsoleSink_1.ConsoleSink();\n }\n return this.sink;\n }\n}\nexports.LocalEnvironment = LocalEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Logger_1 = require(\"../utils/Logger\");\nconst DefaultEnvironment_1 = require(\"./DefaultEnvironment\");\nconst ECSEnvironment_1 = require(\"./ECSEnvironment\");\nconst EC2Environment_1 = require(\"./EC2Environment\");\nconst LambdaEnvironment_1 = require(\"./LambdaEnvironment\");\nconst Configuration_1 = require(\"../config/Configuration\");\nconst Environments_1 = require(\"./Environments\");\nconst LocalEnvironment_1 = require(\"./LocalEnvironment\");\nconst lambdaEnvironment = new LambdaEnvironment_1.LambdaEnvironment();\nconst ecsEnvironment = new ECSEnvironment_1.ECSEnvironment();\nconst ec2Environment = new EC2Environment_1.EC2Environment();\nconst defaultEnvironment = new DefaultEnvironment_1.DefaultEnvironment();\n// ordering of this array matters\n// both Lambda and ECS can be determined from environment variables\n// making the entire detection process fast an cheap\n// EC2 can only be determined by making a remote HTTP request\nconst environments = [lambdaEnvironment, ecsEnvironment, ec2Environment];\nlet environment = undefined;\nconst getEnvironmentFromOverride = () => {\n // short-circuit environment detection and use override\n switch (Configuration_1.default.environmentOverride) {\n case Environments_1.default.Agent:\n return defaultEnvironment;\n case Environments_1.default.EC2:\n return ec2Environment;\n case Environments_1.default.Lambda:\n return lambdaEnvironment;\n case Environments_1.default.ECS:\n return ecsEnvironment;\n case Environments_1.default.Local:\n return new LocalEnvironment_1.LocalEnvironment();\n case Environments_1.default.Unknown:\n default:\n return undefined;\n }\n};\nconst discoverEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n Logger_1.LOG(`Discovering environment`);\n for (const envUnderTest of environments) {\n Logger_1.LOG(`Testing: ${envUnderTest.constructor.name}`);\n try {\n if (yield envUnderTest.probe()) {\n return envUnderTest;\n }\n }\n catch (e) {\n Logger_1.LOG(`Failed probe: ${envUnderTest.constructor.name}`);\n }\n }\n return defaultEnvironment;\n});\nconst _resolveEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n Logger_1.LOG('Resolving environment');\n if (environment) {\n return environment;\n }\n if (Configuration_1.default.environmentOverride) {\n Logger_1.LOG('Environment override supplied', Configuration_1.default.environmentOverride);\n // this will be falsy if an invalid configuration value is provided\n environment = getEnvironmentFromOverride();\n if (environment) {\n return environment;\n }\n else {\n Logger_1.LOG('Invalid environment provided. Falling back to auto-discovery.', Configuration_1.default.environmentOverride);\n }\n }\n environment = yield discoverEnvironment(); // eslint-disable-line require-atomic-updates\n return environment;\n});\n// pro-actively begin resolving the environment\n// this will allow us to kick off any async tasks\n// at module load time to reduce any blocking that\n// may occur on the initial flush()\nconst environmentPromise = _resolveEnvironment();\nconst resolveEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n return environmentPromise;\n});\nexports.resolveEnvironment = resolveEnvironment;\n// this method is used for testing to bypass the cached environmentPromise result\nconst cleanResolveEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n yield environmentPromise;\n environment = undefined;\n return yield _resolveEnvironment();\n});\nexports.cleanResolveEnvironment = cleanResolveEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst __1 = require(\"..\");\nconst EnvironmentDetector_1 = require(\"../environment/EnvironmentDetector\");\nconst MetricsContext_1 = require(\"./MetricsContext\");\nconst createMetricsLogger = () => {\n const context = MetricsContext_1.MetricsContext.empty();\n const logger = new __1.MetricsLogger(EnvironmentDetector_1.resolveEnvironment, context);\n return logger;\n};\nexports.createMetricsLogger = createMetricsLogger;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Logger_1 = require(\"../utils/Logger\");\nconst MetricsLoggerFactory_1 = require(\"./MetricsLoggerFactory\");\n/**\n * An asynchronous wrapper that provides a metrics instance.\n */\nconst metricScope = (handler) => {\n const wrappedHandler = (...args) => __awaiter(void 0, void 0, void 0, function* () {\n const metrics = MetricsLoggerFactory_1.createMetricsLogger();\n try {\n return yield handler(metrics)(...args);\n }\n finally {\n try {\n yield metrics.flush();\n }\n catch (e) {\n Logger_1.LOG('Failed to flush metrics', e);\n }\n }\n });\n return wrappedHandler;\n};\nexports.metricScope = metricScope;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Unit;\n(function (Unit) {\n Unit[\"Seconds\"] = \"Seconds\";\n Unit[\"Microseconds\"] = \"Microseconds\";\n Unit[\"Milliseconds\"] = \"Milliseconds\";\n Unit[\"Bytes\"] = \"Bytes\";\n Unit[\"Kilobytes\"] = \"Kilobytes\";\n Unit[\"Megabytes\"] = \"Megabytes\";\n Unit[\"Gigabytes\"] = \"Gigabytes\";\n Unit[\"Terabytes\"] = \"Terabytes\";\n Unit[\"Bits\"] = \"Bits\";\n Unit[\"Kilobits\"] = \"Kilobits\";\n Unit[\"Megabits\"] = \"Megabits\";\n Unit[\"Gigabits\"] = \"Gigabits\";\n Unit[\"Terabits\"] = \"Terabits\";\n Unit[\"Percent\"] = \"Percent\";\n Unit[\"Count\"] = \"Count\";\n Unit[\"BytesPerSecond\"] = \"Bytes/Second\";\n Unit[\"KilobytesPerSecond\"] = \"Kilobytes/Second\";\n Unit[\"MegabytesPerSecond\"] = \"Megabytes/Second\";\n Unit[\"GigabytesPerSecond\"] = \"Gigabytes/Second\";\n Unit[\"TerabytesPerSecond\"] = \"Terabytes/Second\";\n Unit[\"BitsPerSecond\"] = \"Bits/Second\";\n Unit[\"KilobitsPerSecond\"] = \"Kilobits/Second\";\n Unit[\"MegabitsPerSecond\"] = \"Megabits/Second\";\n Unit[\"GigabitsPerSecond\"] = \"Gigabits/Second\";\n Unit[\"TerabitsPerSecond\"] = \"Terabits/Second\";\n Unit[\"CountPerSecond\"] = \"Count/Second\";\n Unit[\"None\"] = \"None\";\n})(Unit = exports.Unit || (exports.Unit = {}));\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MetricsLogger_1 = require(\"./logger/MetricsLogger\");\nexports.MetricsLogger = MetricsLogger_1.MetricsLogger;\nvar ConsoleSink_1 = require(\"./sinks/ConsoleSink\");\nexports.LocalSink = ConsoleSink_1.ConsoleSink;\nvar AgentSink_1 = require(\"./sinks/AgentSink\");\nexports.AgentSink = AgentSink_1.AgentSink;\nvar MetricScope_1 = require(\"./logger/MetricScope\");\nexports.metricScope = MetricScope_1.metricScope;\nvar MetricsLoggerFactory_1 = require(\"./logger/MetricsLoggerFactory\");\nexports.createMetricsLogger = MetricsLoggerFactory_1.createMetricsLogger;\nvar Unit_1 = require(\"./logger/Unit\");\nexports.Unit = Unit_1.Unit;\nconst Configuration_1 = require(\"./config/Configuration\");\nexports.Configuration = Configuration_1.default;\n", "\"use strict\";\n/// <reference lib=\"es2018\"/>\n/// <reference lib=\"dom\"/>\n/// <reference types=\"node\"/>\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst typedArrayTypeNames = [\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array'\n];\nfunction isTypedArrayName(name) {\n return typedArrayTypeNames.includes(name);\n}\nconst objectTypeNames = [\n 'Function',\n 'Generator',\n 'AsyncGenerator',\n 'GeneratorFunction',\n 'AsyncGeneratorFunction',\n 'AsyncFunction',\n 'Observable',\n 'Array',\n 'Buffer',\n 'Object',\n 'RegExp',\n 'Date',\n 'Error',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'ArrayBuffer',\n 'SharedArrayBuffer',\n 'DataView',\n 'Promise',\n 'URL',\n 'FormData',\n 'URLSearchParams',\n 'HTMLElement',\n ...typedArrayTypeNames\n];\nfunction isObjectTypeName(name) {\n return objectTypeNames.includes(name);\n}\nconst primitiveTypeNames = [\n 'null',\n 'undefined',\n 'string',\n 'number',\n 'bigint',\n 'boolean',\n 'symbol'\n];\nfunction isPrimitiveTypeName(name) {\n return primitiveTypeNames.includes(name);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isOfType(type) {\n return (value) => typeof value === type;\n}\nconst { toString } = Object.prototype;\nconst getObjectType = (value) => {\n const objectTypeName = toString.call(value).slice(8, -1);\n if (/HTML\\w+Element/.test(objectTypeName) && is.domElement(value)) {\n return 'HTMLElement';\n }\n if (isObjectTypeName(objectTypeName)) {\n return objectTypeName;\n }\n return undefined;\n};\nconst isObjectOfType = (type) => (value) => getObjectType(value) === type;\nfunction is(value) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'undefined':\n return 'undefined';\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'function':\n return 'Function';\n case 'bigint':\n return 'bigint';\n case 'symbol':\n return 'symbol';\n default:\n }\n if (is.observable(value)) {\n return 'Observable';\n }\n if (is.array(value)) {\n return 'Array';\n }\n if (is.buffer(value)) {\n return 'Buffer';\n }\n const tagType = getObjectType(value);\n if (tagType) {\n return tagType;\n }\n if (value instanceof String || value instanceof Boolean || value instanceof Number) {\n throw new TypeError('Please don\\'t use object wrappers for primitive types');\n }\n return 'Object';\n}\nis.undefined = isOfType('undefined');\nis.string = isOfType('string');\nconst isNumberType = isOfType('number');\nis.number = (value) => isNumberType(value) && !is.nan(value);\nis.bigint = isOfType('bigint');\n// eslint-disable-next-line @typescript-eslint/ban-types\nis.function_ = isOfType('function');\nis.null_ = (value) => value === null;\nis.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');\nis.boolean = (value) => value === true || value === false;\nis.symbol = isOfType('symbol');\nis.numericString = (value) => is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value));\nis.array = (value, assertion) => {\n if (!Array.isArray(value)) {\n return false;\n }\n if (!is.function_(assertion)) {\n return true;\n }\n return value.every(assertion);\n};\nis.buffer = (value) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = value) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.isBuffer) === null || _c === void 0 ? void 0 : _c.call(_b, value)) !== null && _d !== void 0 ? _d : false; };\nis.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);\nis.object = (value) => !is.null_(value) && (typeof value === 'object' || is.function_(value));\nis.iterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.iterator]); };\nis.asyncIterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.asyncIterator]); };\nis.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.asyncGenerator = (value) => is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.nativePromise = (value) => isObjectOfType('Promise')(value);\nconst hasPromiseAPI = (value) => {\n var _a, _b;\n return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a.then) &&\n is.function_((_b = value) === null || _b === void 0 ? void 0 : _b.catch);\n};\nis.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);\nis.generatorFunction = isObjectOfType('GeneratorFunction');\nis.asyncGeneratorFunction = (value) => getObjectType(value) === 'AsyncGeneratorFunction';\nis.asyncFunction = (value) => getObjectType(value) === 'AsyncFunction';\n// eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types\nis.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype');\nis.regExp = isObjectOfType('RegExp');\nis.date = isObjectOfType('Date');\nis.error = isObjectOfType('Error');\nis.map = (value) => isObjectOfType('Map')(value);\nis.set = (value) => isObjectOfType('Set')(value);\nis.weakMap = (value) => isObjectOfType('WeakMap')(value);\nis.weakSet = (value) => isObjectOfType('WeakSet')(value);\nis.int8Array = isObjectOfType('Int8Array');\nis.uint8Array = isObjectOfType('Uint8Array');\nis.uint8ClampedArray = isObjectOfType('Uint8ClampedArray');\nis.int16Array = isObjectOfType('Int16Array');\nis.uint16Array = isObjectOfType('Uint16Array');\nis.int32Array = isObjectOfType('Int32Array');\nis.uint32Array = isObjectOfType('Uint32Array');\nis.float32Array = isObjectOfType('Float32Array');\nis.float64Array = isObjectOfType('Float64Array');\nis.bigInt64Array = isObjectOfType('BigInt64Array');\nis.bigUint64Array = isObjectOfType('BigUint64Array');\nis.arrayBuffer = isObjectOfType('ArrayBuffer');\nis.sharedArrayBuffer = isObjectOfType('SharedArrayBuffer');\nis.dataView = isObjectOfType('DataView');\nis.directInstanceOf = (instance, class_) => Object.getPrototypeOf(instance) === class_.prototype;\nis.urlInstance = (value) => isObjectOfType('URL')(value);\nis.urlString = (value) => {\n if (!is.string(value)) {\n return false;\n }\n try {\n new URL(value); // eslint-disable-line no-new\n return true;\n }\n catch (_a) {\n return false;\n }\n};\n// TODO: Use the `not` operator with a type guard here when it's available.\n// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`\nis.truthy = (value) => Boolean(value);\n// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`\nis.falsy = (value) => !value;\nis.nan = (value) => Number.isNaN(value);\nis.primitive = (value) => is.null_(value) || isPrimitiveTypeName(typeof value);\nis.integer = (value) => Number.isInteger(value);\nis.safeInteger = (value) => Number.isSafeInteger(value);\nis.plainObject = (value) => {\n // From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js\n if (toString.call(value) !== '[object Object]') {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.getPrototypeOf({});\n};\nis.typedArray = (value) => isTypedArrayName(getObjectType(value));\nconst isValidLength = (value) => is.safeInteger(value) && value >= 0;\nis.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);\nis.inRange = (value, range) => {\n if (is.number(range)) {\n return value >= Math.min(0, range) && value <= Math.max(range, 0);\n }\n if (is.array(range) && range.length === 2) {\n return value >= Math.min(...range) && value <= Math.max(...range);\n }\n throw new TypeError(`Invalid range: ${JSON.stringify(range)}`);\n};\nconst NODE_TYPE_ELEMENT = 1;\nconst DOM_PROPERTIES_TO_CHECK = [\n 'innerHTML',\n 'ownerDocument',\n 'style',\n 'attributes',\n 'nodeValue'\n];\nis.domElement = (value) => {\n return is.object(value) &&\n value.nodeType === NODE_TYPE_ELEMENT &&\n is.string(value.nodeName) &&\n !is.plainObject(value) &&\n DOM_PROPERTIES_TO_CHECK.every(property => property in value);\n};\nis.observable = (value) => {\n var _a, _b, _c, _d;\n if (!value) {\n return false;\n }\n // eslint-disable-next-line no-use-extend-native/no-use-extend-native\n if (value === ((_b = (_a = value)[Symbol.observable]) === null || _b === void 0 ? void 0 : _b.call(_a))) {\n return true;\n }\n if (value === ((_d = (_c = value)['@@observable']) === null || _d === void 0 ? void 0 : _d.call(_c))) {\n return true;\n }\n return false;\n};\nis.nodeStream = (value) => is.object(value) && is.function_(value.pipe) && !is.observable(value);\nis.infinite = (value) => value === Infinity || value === -Infinity;\nconst isAbsoluteMod2 = (remainder) => (value) => is.integer(value) && Math.abs(value % 2) === remainder;\nis.evenInteger = isAbsoluteMod2(0);\nis.oddInteger = isAbsoluteMod2(1);\nis.emptyArray = (value) => is.array(value) && value.length === 0;\nis.nonEmptyArray = (value) => is.array(value) && value.length > 0;\nis.emptyString = (value) => is.string(value) && value.length === 0;\n// TODO: Use `not ''` when the `not` operator is available.\nis.nonEmptyString = (value) => is.string(value) && value.length > 0;\nconst isWhiteSpaceString = (value) => is.string(value) && !/\\S/.test(value);\nis.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value);\nis.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0;\n// TODO: Use `not` operator here to remove `Map` and `Set` from type guard:\n// - https://github.com/Microsoft/TypeScript/pull/29317\nis.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0;\nis.emptySet = (value) => is.set(value) && value.size === 0;\nis.nonEmptySet = (value) => is.set(value) && value.size > 0;\nis.emptyMap = (value) => is.map(value) && value.size === 0;\nis.nonEmptyMap = (value) => is.map(value) && value.size > 0;\n// `PropertyKey` is any value that can be used as an object key (string, number, or symbol)\nis.propertyKey = (value) => is.any([is.string, is.number, is.symbol], value);\nis.formData = (value) => isObjectOfType('FormData')(value);\nis.urlSearchParams = (value) => isObjectOfType('URLSearchParams')(value);\nconst predicateOnArray = (method, predicate, values) => {\n if (!is.function_(predicate)) {\n throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`);\n }\n if (values.length === 0) {\n throw new TypeError('Invalid number of values');\n }\n return method.call(values, predicate);\n};\nis.any = (predicate, ...values) => {\n const predicates = is.array(predicate) ? predicate : [predicate];\n return predicates.some(singlePredicate => predicateOnArray(Array.prototype.some, singlePredicate, values));\n};\nis.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values);\nconst assertType = (condition, description, value, options = {}) => {\n if (!condition) {\n const { multipleValues } = options;\n const valuesMessage = multipleValues ?\n `received values of types ${[\n ...new Set(value.map(singleValue => `\\`${is(singleValue)}\\``))\n ].join(', ')}` :\n `received value of type \\`${is(value)}\\``;\n throw new TypeError(`Expected value which is \\`${description}\\`, ${valuesMessage}.`);\n }\n};\nexports.assert = {\n // Unknowns.\n undefined: (value) => assertType(is.undefined(value), 'undefined', value),\n string: (value) => assertType(is.string(value), 'string', value),\n number: (value) => assertType(is.number(value), 'number', value),\n bigint: (value) => assertType(is.bigint(value), 'bigint', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n function_: (value) => assertType(is.function_(value), 'Function', value),\n null_: (value) => assertType(is.null_(value), 'null', value),\n class_: (value) => assertType(is.class_(value), \"Class\" /* class_ */, value),\n boolean: (value) => assertType(is.boolean(value), 'boolean', value),\n symbol: (value) => assertType(is.symbol(value), 'symbol', value),\n numericString: (value) => assertType(is.numericString(value), \"string with a number\" /* numericString */, value),\n array: (value, assertion) => {\n const assert = assertType;\n assert(is.array(value), 'Array', value);\n if (assertion) {\n value.forEach(assertion);\n }\n },\n buffer: (value) => assertType(is.buffer(value), 'Buffer', value),\n nullOrUndefined: (value) => assertType(is.nullOrUndefined(value), \"null or undefined\" /* nullOrUndefined */, value),\n object: (value) => assertType(is.object(value), 'Object', value),\n iterable: (value) => assertType(is.iterable(value), \"Iterable\" /* iterable */, value),\n asyncIterable: (value) => assertType(is.asyncIterable(value), \"AsyncIterable\" /* asyncIterable */, value),\n generator: (value) => assertType(is.generator(value), 'Generator', value),\n asyncGenerator: (value) => assertType(is.asyncGenerator(value), 'AsyncGenerator', value),\n nativePromise: (value) => assertType(is.nativePromise(value), \"native Promise\" /* nativePromise */, value),\n promise: (value) => assertType(is.promise(value), 'Promise', value),\n generatorFunction: (value) => assertType(is.generatorFunction(value), 'GeneratorFunction', value),\n asyncGeneratorFunction: (value) => assertType(is.asyncGeneratorFunction(value), 'AsyncGeneratorFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n asyncFunction: (value) => assertType(is.asyncFunction(value), 'AsyncFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n boundFunction: (value) => assertType(is.boundFunction(value), 'Function', value),\n regExp: (value) => assertType(is.regExp(value), 'RegExp', value),\n date: (value) => assertType(is.date(value), 'Date', value),\n error: (value) => assertType(is.error(value), 'Error', value),\n map: (value) => assertType(is.map(value), 'Map', value),\n set: (value) => assertType(is.set(value), 'Set', value),\n weakMap: (value) => assertType(is.weakMap(value), 'WeakMap', value),\n weakSet: (value) => assertType(is.weakSet(value), 'WeakSet', value),\n int8Array: (value) => assertType(is.int8Array(value), 'Int8Array', value),\n uint8Array: (value) => assertType(is.uint8Array(value), 'Uint8Array', value),\n uint8ClampedArray: (value) => assertType(is.uint8ClampedArray(value), 'Uint8ClampedArray', value),\n int16Array: (value) => assertType(is.int16Array(value), 'Int16Array', value),\n uint16Array: (value) => assertType(is.uint16Array(value), 'Uint16Array', value),\n int32Array: (value) => assertType(is.int32Array(value), 'Int32Array', value),\n uint32Array: (value) => assertType(is.uint32Array(value), 'Uint32Array', value),\n float32Array: (value) => assertType(is.float32Array(value), 'Float32Array', value),\n float64Array: (value) => assertType(is.float64Array(value), 'Float64Array', value),\n bigInt64Array: (value) => assertType(is.bigInt64Array(value), 'BigInt64Array', value),\n bigUint64Array: (value) => assertType(is.bigUint64Array(value), 'BigUint64Array', value),\n arrayBuffer: (value) => assertType(is.arrayBuffer(value), 'ArrayBuffer', value),\n sharedArrayBuffer: (value) => assertType(is.sharedArrayBuffer(value), 'SharedArrayBuffer', value),\n dataView: (value) => assertType(is.dataView(value), 'DataView', value),\n urlInstance: (value) => assertType(is.urlInstance(value), 'URL', value),\n urlString: (value) => assertType(is.urlString(value), \"string with a URL\" /* urlString */, value),\n truthy: (value) => assertType(is.truthy(value), \"truthy\" /* truthy */, value),\n falsy: (value) => assertType(is.falsy(value), \"falsy\" /* falsy */, value),\n nan: (value) => assertType(is.nan(value), \"NaN\" /* nan */, value),\n primitive: (value) => assertType(is.primitive(value), \"primitive\" /* primitive */, value),\n integer: (value) => assertType(is.integer(value), \"integer\" /* integer */, value),\n safeInteger: (value) => assertType(is.safeInteger(value), \"integer\" /* safeInteger */, value),\n plainObject: (value) => assertType(is.plainObject(value), \"plain object\" /* plainObject */, value),\n typedArray: (value) => assertType(is.typedArray(value), \"TypedArray\" /* typedArray */, value),\n arrayLike: (value) => assertType(is.arrayLike(value), \"array-like\" /* arrayLike */, value),\n domElement: (value) => assertType(is.domElement(value), \"HTMLElement\" /* domElement */, value),\n observable: (value) => assertType(is.observable(value), 'Observable', value),\n nodeStream: (value) => assertType(is.nodeStream(value), \"Node.js Stream\" /* nodeStream */, value),\n infinite: (value) => assertType(is.infinite(value), \"infinite number\" /* infinite */, value),\n emptyArray: (value) => assertType(is.emptyArray(value), \"empty array\" /* emptyArray */, value),\n nonEmptyArray: (value) => assertType(is.nonEmptyArray(value), \"non-empty array\" /* nonEmptyArray */, value),\n emptyString: (value) => assertType(is.emptyString(value), \"empty string\" /* emptyString */, value),\n nonEmptyString: (value) => assertType(is.nonEmptyString(value), \"non-empty string\" /* nonEmptyString */, value),\n emptyStringOrWhitespace: (value) => assertType(is.emptyStringOrWhitespace(value), \"empty string or whitespace\" /* emptyStringOrWhitespace */, value),\n emptyObject: (value) => assertType(is.emptyObject(value), \"empty object\" /* emptyObject */, value),\n nonEmptyObject: (value) => assertType(is.nonEmptyObject(value), \"non-empty object\" /* nonEmptyObject */, value),\n emptySet: (value) => assertType(is.emptySet(value), \"empty set\" /* emptySet */, value),\n nonEmptySet: (value) => assertType(is.nonEmptySet(value), \"non-empty set\" /* nonEmptySet */, value),\n emptyMap: (value) => assertType(is.emptyMap(value), \"empty map\" /* emptyMap */, value),\n nonEmptyMap: (value) => assertType(is.nonEmptyMap(value), \"non-empty map\" /* nonEmptyMap */, value),\n propertyKey: (value) => assertType(is.propertyKey(value), 'PropertyKey', value),\n formData: (value) => assertType(is.formData(value), 'FormData', value),\n urlSearchParams: (value) => assertType(is.urlSearchParams(value), 'URLSearchParams', value),\n // Numbers.\n evenInteger: (value) => assertType(is.evenInteger(value), \"even integer\" /* evenInteger */, value),\n oddInteger: (value) => assertType(is.oddInteger(value), \"odd integer\" /* oddInteger */, value),\n // Two arguments.\n directInstanceOf: (instance, class_) => assertType(is.directInstanceOf(instance, class_), \"T\" /* directInstanceOf */, instance),\n inRange: (value, range) => assertType(is.inRange(value, range), \"in range\" /* inRange */, value),\n // Variadic functions.\n any: (predicate, ...values) => {\n return assertType(is.any(predicate, ...values), \"predicate returns truthy for any value\" /* any */, values, { multipleValues: true });\n },\n all: (predicate, ...values) => assertType(is.all(predicate, ...values), \"predicate returns truthy for all values\" /* all */, values, { multipleValues: true })\n};\n// Some few keywords are reserved, but we'll populate them for Node.js users\n// See https://github.com/Microsoft/TypeScript/issues/2536\nObject.defineProperties(is, {\n class: {\n value: is.class_\n },\n function: {\n value: is.function_\n },\n null: {\n value: is.null_\n }\n});\nObject.defineProperties(exports.assert, {\n class: {\n value: exports.assert.class_\n },\n function: {\n value: exports.assert.function_\n },\n null: {\n value: exports.assert.null_\n }\n});\nexports.default = is;\n// For CommonJS default export support\nmodule.exports = is;\nmodule.exports.default = is;\nmodule.exports.assert = exports.assert;\n", "'use strict';\n\nclass CancelError extends Error {\n\tconstructor(reason) {\n\t\tsuper(reason || 'Promise was canceled');\n\t\tthis.name = 'CancelError';\n\t}\n\n\tget isCanceled() {\n\t\treturn true;\n\t}\n}\n\nclass PCancelable {\n\tstatic fn(userFn) {\n\t\treturn (...arguments_) => {\n\t\t\treturn new PCancelable((resolve, reject, onCancel) => {\n\t\t\t\targuments_.push(onCancel);\n\t\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t\tuserFn(...arguments_).then(resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n\n\tconstructor(executor) {\n\t\tthis._cancelHandlers = [];\n\t\tthis._isPending = true;\n\t\tthis._isCanceled = false;\n\t\tthis._rejectOnCancel = true;\n\n\t\tthis._promise = new Promise((resolve, reject) => {\n\t\t\tthis._reject = reject;\n\n\t\t\tconst onResolve = value => {\n\t\t\t\tif (!this._isCanceled || !onCancel.shouldReject) {\n\t\t\t\t\tthis._isPending = false;\n\t\t\t\t\tresolve(value);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst onReject = error => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst onCancel = handler => {\n\t\t\t\tif (!this._isPending) {\n\t\t\t\t\tthrow new Error('The `onCancel` handler was attached after the promise settled.');\n\t\t\t\t}\n\n\t\t\t\tthis._cancelHandlers.push(handler);\n\t\t\t};\n\n\t\t\tObject.defineProperties(onCancel, {\n\t\t\t\tshouldReject: {\n\t\t\t\t\tget: () => this._rejectOnCancel,\n\t\t\t\t\tset: boolean => {\n\t\t\t\t\t\tthis._rejectOnCancel = boolean;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn executor(onResolve, onReject, onCancel);\n\t\t});\n\t}\n\n\tthen(onFulfilled, onRejected) {\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\treturn this._promise.then(onFulfilled, onRejected);\n\t}\n\n\tcatch(onRejected) {\n\t\treturn this._promise.catch(onRejected);\n\t}\n\n\tfinally(onFinally) {\n\t\treturn this._promise.finally(onFinally);\n\t}\n\n\tcancel(reason) {\n\t\tif (!this._isPending || this._isCanceled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isCanceled = true;\n\n\t\tif (this._cancelHandlers.length > 0) {\n\t\t\ttry {\n\t\t\t\tfor (const handler of this._cancelHandlers) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._reject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this._rejectOnCancel) {\n\t\t\tthis._reject(new CancelError(reason));\n\t\t}\n\t}\n\n\tget isCanceled() {\n\t\treturn this._isCanceled;\n\t}\n}\n\nObject.setPrototypeOf(PCancelable.prototype, Promise.prototype);\n\nmodule.exports = PCancelable;\nmodule.exports.CancelError = CancelError;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isTLSSocket(socket) {\n return socket.encrypted;\n}\nconst deferToConnect = (socket, fn) => {\n let listeners;\n if (typeof fn === 'function') {\n const connect = fn;\n listeners = { connect };\n }\n else {\n listeners = fn;\n }\n const hasConnectListener = typeof listeners.connect === 'function';\n const hasSecureConnectListener = typeof listeners.secureConnect === 'function';\n const hasCloseListener = typeof listeners.close === 'function';\n const onConnect = () => {\n if (hasConnectListener) {\n listeners.connect();\n }\n if (isTLSSocket(socket) && hasSecureConnectListener) {\n if (socket.authorized) {\n listeners.secureConnect();\n }\n else if (!socket.authorizationError) {\n socket.once('secureConnect', listeners.secureConnect);\n }\n }\n if (hasCloseListener) {\n socket.once('close', listeners.close);\n }\n };\n if (socket.writable && !socket.connecting) {\n onConnect();\n }\n else if (socket.connecting) {\n socket.once('connect', onConnect);\n }\n else if (socket.destroyed && hasCloseListener) {\n listeners.close(socket._hadError);\n }\n};\nexports.default = deferToConnect;\n// For CommonJS default export support\nmodule.exports = deferToConnect;\nmodule.exports.default = deferToConnect;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst defer_to_connect_1 = require(\"defer-to-connect\");\nconst util_1 = require(\"util\");\nconst nodejsMajorVersion = Number(process.versions.node.split('.')[0]);\nconst timer = (request) => {\n if (request.timings) {\n return request.timings;\n }\n const timings = {\n start: Date.now(),\n socket: undefined,\n lookup: undefined,\n connect: undefined,\n secureConnect: undefined,\n upload: undefined,\n response: undefined,\n end: undefined,\n error: undefined,\n abort: undefined,\n phases: {\n wait: undefined,\n dns: undefined,\n tcp: undefined,\n tls: undefined,\n request: undefined,\n firstByte: undefined,\n download: undefined,\n total: undefined\n }\n };\n request.timings = timings;\n const handleError = (origin) => {\n const emit = origin.emit.bind(origin);\n origin.emit = (event, ...args) => {\n // Catches the `error` event\n if (event === 'error') {\n timings.error = Date.now();\n timings.phases.total = timings.error - timings.start;\n origin.emit = emit;\n }\n // Saves the original behavior\n return emit(event, ...args);\n };\n };\n handleError(request);\n const onAbort = () => {\n timings.abort = Date.now();\n // Let the `end` response event be responsible for setting the total phase,\n // unless the Node.js major version is >= 13.\n if (!timings.response || nodejsMajorVersion >= 13) {\n timings.phases.total = Date.now() - timings.start;\n }\n };\n request.prependOnceListener('abort', onAbort);\n const onSocket = (socket) => {\n timings.socket = Date.now();\n timings.phases.wait = timings.socket - timings.start;\n if (util_1.types.isProxy(socket)) {\n return;\n }\n const lookupListener = () => {\n timings.lookup = Date.now();\n timings.phases.dns = timings.lookup - timings.socket;\n };\n socket.prependOnceListener('lookup', lookupListener);\n defer_to_connect_1.default(socket, {\n connect: () => {\n timings.connect = Date.now();\n if (timings.lookup === undefined) {\n socket.removeListener('lookup', lookupListener);\n timings.lookup = timings.connect;\n timings.phases.dns = timings.lookup - timings.socket;\n }\n timings.phases.tcp = timings.connect - timings.lookup;\n // This callback is called before flushing any data,\n // so we don't need to set `timings.phases.request` here.\n },\n secureConnect: () => {\n timings.secureConnect = Date.now();\n timings.phases.tls = timings.secureConnect - timings.connect;\n }\n });\n };\n if (request.socket) {\n onSocket(request.socket);\n }\n else {\n request.prependOnceListener('socket', onSocket);\n }\n const onUpload = () => {\n var _a;\n timings.upload = Date.now();\n timings.phases.request = timings.upload - ((_a = timings.secureConnect) !== null && _a !== void 0 ? _a : timings.connect);\n };\n const writableFinished = () => {\n if (typeof request.writableFinished === 'boolean') {\n return request.writableFinished;\n }\n // Node.js doesn't have `request.writableFinished` property\n return request.finished && request.outputSize === 0 && (!request.socket || request.socket.writableLength === 0);\n };\n if (writableFinished()) {\n onUpload();\n }\n else {\n request.prependOnceListener('finish', onUpload);\n }\n request.prependOnceListener('response', (response) => {\n timings.response = Date.now();\n timings.phases.firstByte = timings.response - timings.upload;\n response.timings = timings;\n handleError(response);\n response.prependOnceListener('end', () => {\n timings.end = Date.now();\n timings.phases.download = timings.end - timings.response;\n timings.phases.total = timings.end - timings.start;\n });\n response.prependOnceListener('aborted', onAbort);\n });\n return timings;\n};\nexports.default = timer;\n// For CommonJS default export support\nmodule.exports = timer;\nmodule.exports.default = timer;\n", "'use strict';\nconst {\n\tV4MAPPED,\n\tADDRCONFIG,\n\tALL,\n\tpromises: {\n\t\tResolver: AsyncResolver\n\t},\n\tlookup: dnsLookup\n} = require('dns');\nconst {promisify} = require('util');\nconst os = require('os');\n\nconst kCacheableLookupCreateConnection = Symbol('cacheableLookupCreateConnection');\nconst kCacheableLookupInstance = Symbol('cacheableLookupInstance');\nconst kExpires = Symbol('expires');\n\nconst supportsALL = typeof ALL === 'number';\n\nconst verifyAgent = agent => {\n\tif (!(agent && typeof agent.createConnection === 'function')) {\n\t\tthrow new Error('Expected an Agent instance as the first argument');\n\t}\n};\n\nconst map4to6 = entries => {\n\tfor (const entry of entries) {\n\t\tif (entry.family === 6) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.address = `::ffff:${entry.address}`;\n\t\tentry.family = 6;\n\t}\n};\n\nconst getIfaceInfo = () => {\n\tlet has4 = false;\n\tlet has6 = false;\n\n\tfor (const device of Object.values(os.networkInterfaces())) {\n\t\tfor (const iface of device) {\n\t\t\tif (iface.internal) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (iface.family === 'IPv6') {\n\t\t\t\thas6 = true;\n\t\t\t} else {\n\t\t\t\thas4 = true;\n\t\t\t}\n\n\t\t\tif (has4 && has6) {\n\t\t\t\treturn {has4, has6};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {has4, has6};\n};\n\nconst isIterable = map => {\n\treturn Symbol.iterator in map;\n};\n\nconst ttl = {ttl: true};\nconst all = {all: true};\n\nclass CacheableLookup {\n\tconstructor({\n\t\tcache = new Map(),\n\t\tmaxTtl = Infinity,\n\t\tfallbackDuration = 3600,\n\t\terrorTtl = 0.15,\n\t\tresolver = new AsyncResolver(),\n\t\tlookup = dnsLookup\n\t} = {}) {\n\t\tthis.maxTtl = maxTtl;\n\t\tthis.errorTtl = errorTtl;\n\n\t\tthis._cache = cache;\n\t\tthis._resolver = resolver;\n\t\tthis._dnsLookup = promisify(lookup);\n\n\t\tif (this._resolver instanceof AsyncResolver) {\n\t\t\tthis._resolve4 = this._resolver.resolve4.bind(this._resolver);\n\t\t\tthis._resolve6 = this._resolver.resolve6.bind(this._resolver);\n\t\t} else {\n\t\t\tthis._resolve4 = promisify(this._resolver.resolve4.bind(this._resolver));\n\t\t\tthis._resolve6 = promisify(this._resolver.resolve6.bind(this._resolver));\n\t\t}\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tthis._pending = {};\n\t\tthis._nextRemovalTime = false;\n\t\tthis._hostnamesToFallback = new Set();\n\n\t\tif (fallbackDuration < 1) {\n\t\t\tthis._fallback = false;\n\t\t} else {\n\t\t\tthis._fallback = true;\n\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tthis._hostnamesToFallback.clear();\n\t\t\t}, fallbackDuration * 1000);\n\n\t\t\t/* istanbul ignore next: There is no `interval.unref()` when running inside an Electron renderer */\n\t\t\tif (interval.unref) {\n\t\t\t\tinterval.unref();\n\t\t\t}\n\t\t}\n\n\t\tthis.lookup = this.lookup.bind(this);\n\t\tthis.lookupAsync = this.lookupAsync.bind(this);\n\t}\n\n\tset servers(servers) {\n\t\tthis.clear();\n\n\t\tthis._resolver.setServers(servers);\n\t}\n\n\tget servers() {\n\t\treturn this._resolver.getServers();\n\t}\n\n\tlookup(hostname, options, callback) {\n\t\tif (typeof options === 'function') {\n\t\t\tcallback = options;\n\t\t\toptions = {};\n\t\t} else if (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tif (!callback) {\n\t\t\tthrow new Error('Callback must be a function.');\n\t\t}\n\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tthis.lookupAsync(hostname, options).then(result => {\n\t\t\tif (options.all) {\n\t\t\t\tcallback(null, result);\n\t\t\t} else {\n\t\t\t\tcallback(null, result.address, result.family, result.expires, result.ttl);\n\t\t\t}\n\t\t}, callback);\n\t}\n\n\tasync lookupAsync(hostname, options = {}) {\n\t\tif (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tlet cached = await this.query(hostname);\n\n\t\tif (options.family === 6) {\n\t\t\tconst filtered = cached.filter(entry => entry.family === 6);\n\n\t\t\tif (options.hints & V4MAPPED) {\n\t\t\t\tif ((supportsALL && options.hints & ALL) || filtered.length === 0) {\n\t\t\t\t\tmap4to6(cached);\n\t\t\t\t} else {\n\t\t\t\t\tcached = filtered;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcached = filtered;\n\t\t\t}\n\t\t} else if (options.family === 4) {\n\t\t\tcached = cached.filter(entry => entry.family === 4);\n\t\t}\n\n\t\tif (options.hints & ADDRCONFIG) {\n\t\t\tconst {_iface} = this;\n\t\t\tcached = cached.filter(entry => entry.family === 6 ? _iface.has6 : _iface.has4);\n\t\t}\n\n\t\tif (cached.length === 0) {\n\t\t\tconst error = new Error(`cacheableLookup ENOTFOUND ${hostname}`);\n\t\t\terror.code = 'ENOTFOUND';\n\t\t\terror.hostname = hostname;\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (options.all) {\n\t\t\treturn cached;\n\t\t}\n\n\t\treturn cached[0];\n\t}\n\n\tasync query(hostname) {\n\t\tlet cached = await this._cache.get(hostname);\n\n\t\tif (!cached) {\n\t\t\tconst pending = this._pending[hostname];\n\n\t\t\tif (pending) {\n\t\t\t\tcached = await pending;\n\t\t\t} else {\n\t\t\t\tconst newPromise = this.queryAndCache(hostname);\n\t\t\t\tthis._pending[hostname] = newPromise;\n\n\t\t\t\ttry {\n\t\t\t\t\tcached = await newPromise;\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this._pending[hostname];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcached = cached.map(entry => {\n\t\t\treturn {...entry};\n\t\t});\n\n\t\treturn cached;\n\t}\n\n\tasync _resolve(hostname) {\n\t\tconst wrap = async promise => {\n\t\t\ttry {\n\t\t\t\treturn await promise;\n\t\t\t} catch (error) {\n\t\t\t\tif (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\n\t\t// ANY is unsafe as it doesn't trigger new queries in the underlying server.\n\t\tconst [A, AAAA] = await Promise.all([\n\t\t\tthis._resolve4(hostname, ttl),\n\t\t\tthis._resolve6(hostname, ttl)\n\t\t].map(promise => wrap(promise)));\n\n\t\tlet aTtl = 0;\n\t\tlet aaaaTtl = 0;\n\t\tlet cacheTtl = 0;\n\n\t\tconst now = Date.now();\n\n\t\tfor (const entry of A) {\n\t\t\tentry.family = 4;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taTtl = Math.max(aTtl, entry.ttl);\n\t\t}\n\n\t\tfor (const entry of AAAA) {\n\t\t\tentry.family = 6;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taaaaTtl = Math.max(aaaaTtl, entry.ttl);\n\t\t}\n\n\t\tif (A.length > 0) {\n\t\t\tif (AAAA.length > 0) {\n\t\t\t\tcacheTtl = Math.min(aTtl, aaaaTtl);\n\t\t\t} else {\n\t\t\t\tcacheTtl = aTtl;\n\t\t\t}\n\t\t} else {\n\t\t\tcacheTtl = aaaaTtl;\n\t\t}\n\n\t\treturn {\n\t\t\tentries: [\n\t\t\t\t...A,\n\t\t\t\t...AAAA\n\t\t\t],\n\t\t\tcacheTtl\n\t\t};\n\t}\n\n\tasync _lookup(hostname) {\n\t\ttry {\n\t\t\tconst entries = await this._dnsLookup(hostname, {\n\t\t\t\tall: true\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tentries,\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t} catch (_) {\n\t\t\treturn {\n\t\t\t\tentries: [],\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t}\n\t}\n\n\tasync _set(hostname, data, cacheTtl) {\n\t\tif (this.maxTtl > 0 && cacheTtl > 0) {\n\t\t\tcacheTtl = Math.min(cacheTtl, this.maxTtl) * 1000;\n\t\t\tdata[kExpires] = Date.now() + cacheTtl;\n\n\t\t\ttry {\n\t\t\t\tawait this._cache.set(hostname, data, cacheTtl);\n\t\t\t} catch (error) {\n\t\t\t\tthis.lookupAsync = async () => {\n\t\t\t\t\tconst cacheError = new Error('Cache Error. Please recreate the CacheableLookup instance.');\n\t\t\t\t\tcacheError.cause = error;\n\n\t\t\t\t\tthrow cacheError;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (isIterable(this._cache)) {\n\t\t\t\tthis._tick(cacheTtl);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync queryAndCache(hostname) {\n\t\tif (this._hostnamesToFallback.has(hostname)) {\n\t\t\treturn this._dnsLookup(hostname, all);\n\t\t}\n\n\t\tlet query = await this._resolve(hostname);\n\n\t\tif (query.entries.length === 0 && this._fallback) {\n\t\t\tquery = await this._lookup(hostname);\n\n\t\t\tif (query.entries.length !== 0) {\n\t\t\t\t// Use `dns.lookup(...)` for that particular hostname\n\t\t\t\tthis._hostnamesToFallback.add(hostname);\n\t\t\t}\n\t\t}\n\n\t\tconst cacheTtl = query.entries.length === 0 ? this.errorTtl : query.cacheTtl;\n\t\tawait this._set(hostname, query.entries, cacheTtl);\n\n\t\treturn query.entries;\n\t}\n\n\t_tick(ms) {\n\t\tconst nextRemovalTime = this._nextRemovalTime;\n\n\t\tif (!nextRemovalTime || ms < nextRemovalTime) {\n\t\t\tclearTimeout(this._removalTimeout);\n\n\t\t\tthis._nextRemovalTime = ms;\n\n\t\t\tthis._removalTimeout = setTimeout(() => {\n\t\t\t\tthis._nextRemovalTime = false;\n\n\t\t\t\tlet nextExpiry = Infinity;\n\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tfor (const [hostname, entries] of this._cache) {\n\t\t\t\t\tconst expires = entries[kExpires];\n\n\t\t\t\t\tif (now >= expires) {\n\t\t\t\t\t\tthis._cache.delete(hostname);\n\t\t\t\t\t} else if (expires < nextExpiry) {\n\t\t\t\t\t\tnextExpiry = expires;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextExpiry !== Infinity) {\n\t\t\t\t\tthis._tick(nextExpiry - now);\n\t\t\t\t}\n\t\t\t}, ms);\n\n\t\t\t/* istanbul ignore next: There is no `timeout.unref()` when running inside an Electron renderer */\n\t\t\tif (this._removalTimeout.unref) {\n\t\t\t\tthis._removalTimeout.unref();\n\t\t\t}\n\t\t}\n\t}\n\n\tinstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (kCacheableLookupCreateConnection in agent) {\n\t\t\tthrow new Error('CacheableLookup has been already installed');\n\t\t}\n\n\t\tagent[kCacheableLookupCreateConnection] = agent.createConnection;\n\t\tagent[kCacheableLookupInstance] = this;\n\n\t\tagent.createConnection = (options, callback) => {\n\t\t\tif (!('lookup' in options)) {\n\t\t\t\toptions.lookup = this.lookup;\n\t\t\t}\n\n\t\t\treturn agent[kCacheableLookupCreateConnection](options, callback);\n\t\t};\n\t}\n\n\tuninstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (agent[kCacheableLookupCreateConnection]) {\n\t\t\tif (agent[kCacheableLookupInstance] !== this) {\n\t\t\t\tthrow new Error('The agent is not owned by this CacheableLookup instance');\n\t\t\t}\n\n\t\t\tagent.createConnection = agent[kCacheableLookupCreateConnection];\n\n\t\t\tdelete agent[kCacheableLookupCreateConnection];\n\t\t\tdelete agent[kCacheableLookupInstance];\n\t\t}\n\t}\n\n\tupdateInterfaceInfo() {\n\t\tconst {_iface} = this;\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tif ((_iface.has4 && !this._iface.has4) || (_iface.has6 && !this._iface.has6)) {\n\t\t\tthis._cache.clear();\n\t\t}\n\t}\n\n\tclear(hostname) {\n\t\tif (hostname) {\n\t\t\tthis._cache.delete(hostname);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cache.clear();\n\t}\n}\n\nmodule.exports = CacheableLookup;\nmodule.exports.default = CacheableLookup;\n", "'use strict';\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\n\nconst testParameter = (name, filters) => {\n\treturn filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n};\n\nconst normalizeDataURL = (urlString, {stripHash}) => {\n\tconst match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\n\n\tif (!match) {\n\t\tthrow new Error(`Invalid URL: ${urlString}`);\n\t}\n\n\tlet {type, data, hash} = match.groups;\n\tconst mediaType = type.split(';');\n\thash = stripHash ? '' : hash;\n\n\tlet isBase64 = false;\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop();\n\t\tisBase64 = true;\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase();\n\tconst attributes = mediaType\n\t\t.map(attribute => {\n\t\t\tlet [key, value = ''] = attribute.split('=').map(string => string.trim());\n\n\t\t\t// Lowercase `charset`\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${key}${value ? `=${value}` : ''}`;\n\t\t})\n\t\t.filter(Boolean);\n\n\tconst normalizedMediaType = [\n\t\t...attributes\n\t];\n\n\tif (isBase64) {\n\t\tnormalizedMediaType.push('base64');\n\t}\n\n\tif (normalizedMediaType.length !== 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\n\t\tnormalizedMediaType.unshift(mimeType);\n\t}\n\n\treturn `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\n};\n\nconst normalizeUrl = (urlString, options) => {\n\toptions = {\n\t\tdefaultProtocol: 'http:',\n\t\tnormalizeProtocol: true,\n\t\tforceHttp: false,\n\t\tforceHttps: false,\n\t\tstripAuthentication: true,\n\t\tstripHash: false,\n\t\tstripTextFragment: true,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveSingleSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true,\n\t\t...options\n\t};\n\n\turlString = urlString.trim();\n\n\t// Data URL\n\tif (/^data:/i.test(urlString)) {\n\t\treturn normalizeDataURL(urlString, options);\n\t}\n\n\tif (/^view-source:/i.test(urlString)) {\n\t\tthrow new Error('`view-source:` is not supported as it is a non-standard protocol');\n\t}\n\n\tconst hasRelativeProtocol = urlString.startsWith('//');\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n\n\t// Prepend protocol\n\tif (!isRelativeUrl) {\n\t\turlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n\t}\n\n\tconst urlObj = new URL(urlString);\n\n\tif (options.forceHttp && options.forceHttps) {\n\t\tthrow new Error('The `forceHttp` and `forceHttps` options cannot be used together');\n\t}\n\n\tif (options.forceHttp && urlObj.protocol === 'https:') {\n\t\turlObj.protocol = 'http:';\n\t}\n\n\tif (options.forceHttps && urlObj.protocol === 'http:') {\n\t\turlObj.protocol = 'https:';\n\t}\n\n\t// Remove auth\n\tif (options.stripAuthentication) {\n\t\turlObj.username = '';\n\t\turlObj.password = '';\n\t}\n\n\t// Remove hash\n\tif (options.stripHash) {\n\t\turlObj.hash = '';\n\t} else if (options.stripTextFragment) {\n\t\turlObj.hash = urlObj.hash.replace(/#?:~:text.*?$/i, '');\n\t}\n\n\t// Remove duplicate slashes if not preceded by a protocol\n\tif (urlObj.pathname) {\n\t\turlObj.pathname = urlObj.pathname.replace(/(?<!\\b(?:[a-z][a-z\\d+\\-.]{1,50}:))\\/{2,}/g, '/');\n\t}\n\n\t// Decode URI octets\n\tif (urlObj.pathname) {\n\t\ttry {\n\t\t\turlObj.pathname = decodeURI(urlObj.pathname);\n\t\t} catch (_) {}\n\t}\n\n\t// Remove directory index\n\tif (options.removeDirectoryIndex === true) {\n\t\toptions.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObj.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, options.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, pathComponents.length - 1);\n\t\t\turlObj.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\tif (urlObj.hostname) {\n\t\t// Remove trailing dot\n\t\turlObj.hostname = urlObj.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (options.stripWWW && /^www\\.(?!www\\.)(?:[a-z\\-\\d]{1,63})\\.(?:[a-z.\\-\\d]{2,63})$/.test(urlObj.hostname)) {\n\t\t\t// Each label should be max 63 at length (min: 1).\n\t\t\t// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n\t\t\t// Each TLD should be up to 63 characters long (min: 2).\n\t\t\t// It is technically possible to have a single character TLD, but none currently exist.\n\t\t\turlObj.hostname = urlObj.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(options.removeQueryParameters)) {\n\t\tfor (const key of [...urlObj.searchParams.keys()]) {\n\t\t\tif (testParameter(key, options.removeQueryParameters)) {\n\t\t\t\turlObj.searchParams.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (options.removeQueryParameters === true) {\n\t\turlObj.search = '';\n\t}\n\n\t// Sort query parameters\n\tif (options.sortQueryParameters) {\n\t\turlObj.searchParams.sort();\n\t}\n\n\tif (options.removeTrailingSlash) {\n\t\turlObj.pathname = urlObj.pathname.replace(/\\/$/, '');\n\t}\n\n\tconst oldUrlString = urlString;\n\n\t// Take advantage of many of the Node `url` normalizations\n\turlString = urlObj.toString();\n\n\tif (!options.removeSingleSlash && urlObj.pathname === '/' && !oldUrlString.endsWith('/') && urlObj.hash === '') {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Remove ending `/` unless removeSingleSlash is false\n\tif ((options.removeTrailingSlash || urlObj.pathname === '/') && urlObj.hash === '' && options.removeSingleSlash) {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !options.normalizeProtocol) {\n\t\turlString = urlString.replace(/^http:\\/\\//, '//');\n\t}\n\n\t// Remove http/https\n\tif (options.stripProtocol) {\n\t\turlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\n\t}\n\n\treturn urlString;\n};\n\nmodule.exports = normalizeUrl;\n", "// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n", "var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n", "var once = require('once');\n\nvar noop = function() {};\n\nvar isRequest = function(stream) {\n\treturn stream.setHeader && typeof stream.abort === 'function';\n};\n\nvar isChildProcess = function(stream) {\n\treturn stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3\n};\n\nvar eos = function(stream, opts, callback) {\n\tif (typeof opts === 'function') return eos(stream, null, opts);\n\tif (!opts) opts = {};\n\n\tcallback = once(callback || noop);\n\n\tvar ws = stream._writableState;\n\tvar rs = stream._readableState;\n\tvar readable = opts.readable || (opts.readable !== false && stream.readable);\n\tvar writable = opts.writable || (opts.writable !== false && stream.writable);\n\tvar cancelled = false;\n\n\tvar onlegacyfinish = function() {\n\t\tif (!stream.writable) onfinish();\n\t};\n\n\tvar onfinish = function() {\n\t\twritable = false;\n\t\tif (!readable) callback.call(stream);\n\t};\n\n\tvar onend = function() {\n\t\treadable = false;\n\t\tif (!writable) callback.call(stream);\n\t};\n\n\tvar onexit = function(exitCode) {\n\t\tcallback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);\n\t};\n\n\tvar onerror = function(err) {\n\t\tcallback.call(stream, err);\n\t};\n\n\tvar onclose = function() {\n\t\tprocess.nextTick(onclosenexttick);\n\t};\n\n\tvar onclosenexttick = function() {\n\t\tif (cancelled) return;\n\t\tif (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));\n\t\tif (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));\n\t};\n\n\tvar onrequest = function() {\n\t\tstream.req.on('finish', onfinish);\n\t};\n\n\tif (isRequest(stream)) {\n\t\tstream.on('complete', onfinish);\n\t\tstream.on('abort', onclose);\n\t\tif (stream.req) onrequest();\n\t\telse stream.on('request', onrequest);\n\t} else if (writable && !ws) { // legacy streams\n\t\tstream.on('end', onlegacyfinish);\n\t\tstream.on('close', onlegacyfinish);\n\t}\n\n\tif (isChildProcess(stream)) stream.on('exit', onexit);\n\n\tstream.on('end', onend);\n\tstream.on('finish', onfinish);\n\tif (opts.error !== false) stream.on('error', onerror);\n\tstream.on('close', onclose);\n\n\treturn function() {\n\t\tcancelled = true;\n\t\tstream.removeListener('complete', onfinish);\n\t\tstream.removeListener('abort', onclose);\n\t\tstream.removeListener('request', onrequest);\n\t\tif (stream.req) stream.req.removeListener('finish', onfinish);\n\t\tstream.removeListener('end', onlegacyfinish);\n\t\tstream.removeListener('close', onlegacyfinish);\n\t\tstream.removeListener('finish', onfinish);\n\t\tstream.removeListener('exit', onexit);\n\t\tstream.removeListener('end', onend);\n\t\tstream.removeListener('error', onerror);\n\t\tstream.removeListener('close', onclose);\n\t};\n};\n\nmodule.exports = eos;\n", "var once = require('once')\nvar eos = require('end-of-stream')\nvar fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes\n\nvar noop = function () {}\nvar ancient = /^v?\\.0/.test(process.version)\n\nvar isFn = function (fn) {\n return typeof fn === 'function'\n}\n\nvar isFS = function (stream) {\n if (!ancient) return false // newer node version do not need to care about fs is a special way\n if (!fs) return false // browser\n return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)\n}\n\nvar isRequest = function (stream) {\n return stream.setHeader && isFn(stream.abort)\n}\n\nvar destroyer = function (stream, reading, writing, callback) {\n callback = once(callback)\n\n var closed = false\n stream.on('close', function () {\n closed = true\n })\n\n eos(stream, {readable: reading, writable: writing}, function (err) {\n if (err) return callback(err)\n closed = true\n callback()\n })\n\n var destroyed = false\n return function (err) {\n if (closed) return\n if (destroyed) return\n destroyed = true\n\n if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks\n if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want\n\n if (isFn(stream.destroy)) return stream.destroy()\n\n callback(err || new Error('stream was destroyed'))\n }\n}\n\nvar call = function (fn) {\n fn()\n}\n\nvar pipe = function (from, to) {\n return from.pipe(to)\n}\n\nvar pump = function () {\n var streams = Array.prototype.slice.call(arguments)\n var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop\n\n if (Array.isArray(streams[0])) streams = streams[0]\n if (streams.length < 2) throw new Error('pump requires two streams per minimum')\n\n var error\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1\n var writing = i > 0\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err\n if (err) destroys.forEach(call)\n if (reading) return\n destroys.forEach(call)\n callback(error)\n })\n })\n\n return streams.reduce(pipe)\n}\n\nmodule.exports = pump\n", "'use strict';\nconst {PassThrough: PassThroughStream} = require('stream');\n\nmodule.exports = options => {\n\toptions = {...options};\n\n\tconst {array} = options;\n\tlet {encoding} = options;\n\tconst isBuffer = encoding === 'buffer';\n\tlet objectMode = false;\n\n\tif (array) {\n\t\tobjectMode = !(encoding || isBuffer);\n\t} else {\n\t\tencoding = encoding || 'utf8';\n\t}\n\n\tif (isBuffer) {\n\t\tencoding = null;\n\t}\n\n\tconst stream = new PassThroughStream({objectMode});\n\n\tif (encoding) {\n\t\tstream.setEncoding(encoding);\n\t}\n\n\tlet length = 0;\n\tconst chunks = [];\n\n\tstream.on('data', chunk => {\n\t\tchunks.push(chunk);\n\n\t\tif (objectMode) {\n\t\t\tlength = chunks.length;\n\t\t} else {\n\t\t\tlength += chunk.length;\n\t\t}\n\t});\n\n\tstream.getBufferedValue = () => {\n\t\tif (array) {\n\t\t\treturn chunks;\n\t\t}\n\n\t\treturn isBuffer ? Buffer.concat(chunks, length) : chunks.join('');\n\t};\n\n\tstream.getBufferedLength = () => length;\n\n\treturn stream;\n};\n", "'use strict';\nconst {constants: BufferConstants} = require('buffer');\nconst pump = require('pump');\nconst bufferStream = require('./buffer-stream');\n\nclass MaxBufferError extends Error {\n\tconstructor() {\n\t\tsuper('maxBuffer exceeded');\n\t\tthis.name = 'MaxBufferError';\n\t}\n}\n\nasync function getStream(inputStream, options) {\n\tif (!inputStream) {\n\t\treturn Promise.reject(new Error('Expected a stream'));\n\t}\n\n\toptions = {\n\t\tmaxBuffer: Infinity,\n\t\t...options\n\t};\n\n\tconst {maxBuffer} = options;\n\n\tlet stream;\n\tawait new Promise((resolve, reject) => {\n\t\tconst rejectPromise = error => {\n\t\t\t// Don't retrieve an oversized buffer.\n\t\t\tif (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {\n\t\t\t\terror.bufferedData = stream.getBufferedValue();\n\t\t\t}\n\n\t\t\treject(error);\n\t\t};\n\n\t\tstream = pump(inputStream, bufferStream(options), error => {\n\t\t\tif (error) {\n\t\t\t\trejectPromise(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolve();\n\t\t});\n\n\t\tstream.on('data', () => {\n\t\t\tif (stream.getBufferedLength() > maxBuffer) {\n\t\t\t\trejectPromise(new MaxBufferError());\n\t\t\t}\n\t\t});\n\t});\n\n\treturn stream.getBufferedValue();\n}\n\nmodule.exports = getStream;\n// TODO: Remove this for the next major release\nmodule.exports.default = getStream;\nmodule.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});\nmodule.exports.array = (stream, options) => getStream(stream, {...options, array: true});\nmodule.exports.MaxBufferError = MaxBufferError;\n", "'use strict';\n// rfc7231 6.1\nconst statusCodeCacheableByDefault = new Set([\n 200,\n 203,\n 204,\n 206,\n 300,\n 301,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\n// This implementation does not understand partial responses (206)\nconst understoodStatuses = new Set([\n 200,\n 203,\n 204,\n 300,\n 301,\n 302,\n 303,\n 307,\n 308,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\nconst errorStatusCodes = new Set([\n 500,\n 502,\n 503, \n 504,\n]);\n\nconst hopByHopHeaders = {\n date: true, // included, because we add Age update Date\n connection: true,\n 'keep-alive': true,\n 'proxy-authenticate': true,\n 'proxy-authorization': true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n};\n\nconst excludedFromRevalidationUpdate = {\n // Since the old body is reused, it doesn't make sense to change properties of the body\n 'content-length': true,\n 'content-encoding': true,\n 'transfer-encoding': true,\n 'content-range': true,\n};\n\nfunction toNumberOrZero(s) {\n const n = parseInt(s, 10);\n return isFinite(n) ? n : 0;\n}\n\n// RFC 5861\nfunction isErrorResponse(response) {\n // consider undefined response as faulty\n if(!response) {\n return true\n }\n return errorStatusCodes.has(response.status);\n}\n\nfunction parseCacheControl(header) {\n const cc = {};\n if (!header) return cc;\n\n // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),\n // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale\n const parts = header.trim().split(/\\s*,\\s*/); // TODO: lame parsing\n for (const part of parts) {\n const [k, v] = part.split(/\\s*=\\s*/, 2);\n cc[k] = v === undefined ? true : v.replace(/^\"|\"$/g, ''); // TODO: lame unquoting\n }\n\n return cc;\n}\n\nfunction formatCacheControl(cc) {\n let parts = [];\n for (const k in cc) {\n const v = cc[k];\n parts.push(v === true ? k : k + '=' + v);\n }\n if (!parts.length) {\n return undefined;\n }\n return parts.join(', ');\n}\n\nmodule.exports = class CachePolicy {\n constructor(\n req,\n res,\n {\n shared,\n cacheHeuristic,\n immutableMinTimeToLive,\n ignoreCargoCult,\n _fromObject,\n } = {}\n ) {\n if (_fromObject) {\n this._fromObject(_fromObject);\n return;\n }\n\n if (!res || !res.headers) {\n throw Error('Response headers missing');\n }\n this._assertRequestHasHeaders(req);\n\n this._responseTime = this.now();\n this._isShared = shared !== false;\n this._cacheHeuristic =\n undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE\n this._immutableMinTtl =\n undefined !== immutableMinTimeToLive\n ? immutableMinTimeToLive\n : 24 * 3600 * 1000;\n\n this._status = 'status' in res ? res.status : 200;\n this._resHeaders = res.headers;\n this._rescc = parseCacheControl(res.headers['cache-control']);\n this._method = 'method' in req ? req.method : 'GET';\n this._url = req.url;\n this._host = req.headers.host;\n this._noAuthorization = !req.headers.authorization;\n this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used\n this._reqcc = parseCacheControl(req.headers['cache-control']);\n\n // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,\n // so there's no point stricly adhering to the blindly copy&pasted directives.\n if (\n ignoreCargoCult &&\n 'pre-check' in this._rescc &&\n 'post-check' in this._rescc\n ) {\n delete this._rescc['pre-check'];\n delete this._rescc['post-check'];\n delete this._rescc['no-cache'];\n delete this._rescc['no-store'];\n delete this._rescc['must-revalidate'];\n this._resHeaders = Object.assign({}, this._resHeaders, {\n 'cache-control': formatCacheControl(this._rescc),\n });\n delete this._resHeaders.expires;\n delete this._resHeaders.pragma;\n }\n\n // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive\n // as having the same effect as if \"Cache-Control: no-cache\" were present (see Section 5.2.1).\n if (\n res.headers['cache-control'] == null &&\n /no-cache/.test(res.headers.pragma)\n ) {\n this._rescc['no-cache'] = true;\n }\n }\n\n now() {\n return Date.now();\n }\n\n storable() {\n // The \"no-store\" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.\n return !!(\n !this._reqcc['no-store'] &&\n // A cache MUST NOT store a response to any request, unless:\n // The request method is understood by the cache and defined as being cacheable, and\n ('GET' === this._method ||\n 'HEAD' === this._method ||\n ('POST' === this._method && this._hasExplicitExpiration())) &&\n // the response status code is understood by the cache, and\n understoodStatuses.has(this._status) &&\n // the \"no-store\" cache directive does not appear in request or response header fields, and\n !this._rescc['no-store'] &&\n // the \"private\" response directive does not appear in the response, if the cache is shared, and\n (!this._isShared || !this._rescc.private) &&\n // the Authorization header field does not appear in the request, if the cache is shared,\n (!this._isShared ||\n this._noAuthorization ||\n this._allowsStoringAuthenticated()) &&\n // the response either:\n // contains an Expires header field, or\n (this._resHeaders.expires ||\n // contains a max-age response directive, or\n // contains a s-maxage response directive and the cache is shared, or\n // contains a public response directive.\n this._rescc['max-age'] ||\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc.public ||\n // has a status code that is defined as cacheable by default\n statusCodeCacheableByDefault.has(this._status))\n );\n }\n\n _hasExplicitExpiration() {\n // 4.2.1 Calculating Freshness Lifetime\n return (\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc['max-age'] ||\n this._resHeaders.expires\n );\n }\n\n _assertRequestHasHeaders(req) {\n if (!req || !req.headers) {\n throw Error('Request headers missing');\n }\n }\n\n satisfiesWithoutRevalidation(req) {\n this._assertRequestHasHeaders(req);\n\n // When presented with a request, a cache MUST NOT reuse a stored response, unless:\n // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,\n // unless the stored response is successfully validated (Section 4.3), and\n const requestCC = parseCacheControl(req.headers['cache-control']);\n if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {\n return false;\n }\n\n if (requestCC['max-age'] && this.age() > requestCC['max-age']) {\n return false;\n }\n\n if (\n requestCC['min-fresh'] &&\n this.timeToLive() < 1000 * requestCC['min-fresh']\n ) {\n return false;\n }\n\n // the stored response is either:\n // fresh, or allowed to be served stale\n if (this.stale()) {\n const allowsStale =\n requestCC['max-stale'] &&\n !this._rescc['must-revalidate'] &&\n (true === requestCC['max-stale'] ||\n requestCC['max-stale'] > this.age() - this.maxAge());\n if (!allowsStale) {\n return false;\n }\n }\n\n return this._requestMatches(req, false);\n }\n\n _requestMatches(req, allowHeadMethod) {\n // The presented effective request URI and that of the stored response match, and\n return (\n (!this._url || this._url === req.url) &&\n this._host === req.headers.host &&\n // the request method associated with the stored response allows it to be used for the presented request, and\n (!req.method ||\n this._method === req.method ||\n (allowHeadMethod && 'HEAD' === req.method)) &&\n // selecting header fields nominated by the stored response (if any) match those presented, and\n this._varyMatches(req)\n );\n }\n\n _allowsStoringAuthenticated() {\n // following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.\n return (\n this._rescc['must-revalidate'] ||\n this._rescc.public ||\n this._rescc['s-maxage']\n );\n }\n\n _varyMatches(req) {\n if (!this._resHeaders.vary) {\n return true;\n }\n\n // A Vary header field-value of \"*\" always fails to match\n if (this._resHeaders.vary === '*') {\n return false;\n }\n\n const fields = this._resHeaders.vary\n .trim()\n .toLowerCase()\n .split(/\\s*,\\s*/);\n for (const name of fields) {\n if (req.headers[name] !== this._reqHeaders[name]) return false;\n }\n return true;\n }\n\n _copyWithoutHopByHopHeaders(inHeaders) {\n const headers = {};\n for (const name in inHeaders) {\n if (hopByHopHeaders[name]) continue;\n headers[name] = inHeaders[name];\n }\n // 9.1. Connection\n if (inHeaders.connection) {\n const tokens = inHeaders.connection.trim().split(/\\s*,\\s*/);\n for (const name of tokens) {\n delete headers[name];\n }\n }\n if (headers.warning) {\n const warnings = headers.warning.split(/,/).filter(warning => {\n return !/^\\s*1[0-9][0-9]/.test(warning);\n });\n if (!warnings.length) {\n delete headers.warning;\n } else {\n headers.warning = warnings.join(',').trim();\n }\n }\n return headers;\n }\n\n responseHeaders() {\n const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);\n const age = this.age();\n\n // A cache SHOULD generate 113 warning if it heuristically chose a freshness\n // lifetime greater than 24 hours and the response's age is greater than 24 hours.\n if (\n age > 3600 * 24 &&\n !this._hasExplicitExpiration() &&\n this.maxAge() > 3600 * 24\n ) {\n headers.warning =\n (headers.warning ? `${headers.warning}, ` : '') +\n '113 - \"rfc7234 5.5.4\"';\n }\n headers.age = `${Math.round(age)}`;\n headers.date = new Date(this.now()).toUTCString();\n return headers;\n }\n\n /**\n * Value of the Date response header or current time if Date was invalid\n * @return timestamp\n */\n date() {\n const serverDate = Date.parse(this._resHeaders.date);\n if (isFinite(serverDate)) {\n return serverDate;\n }\n return this._responseTime;\n }\n\n /**\n * Value of the Age header, in seconds, updated for the current time.\n * May be fractional.\n *\n * @return Number\n */\n age() {\n let age = this._ageValue();\n\n const residentTime = (this.now() - this._responseTime) / 1000;\n return age + residentTime;\n }\n\n _ageValue() {\n return toNumberOrZero(this._resHeaders.age);\n }\n\n /**\n * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.\n *\n * For an up-to-date value, see `timeToLive()`.\n *\n * @return Number\n */\n maxAge() {\n if (!this.storable() || this._rescc['no-cache']) {\n return 0;\n }\n\n // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default\n // so this implementation requires explicit opt-in via public header\n if (\n this._isShared &&\n (this._resHeaders['set-cookie'] &&\n !this._rescc.public &&\n !this._rescc.immutable)\n ) {\n return 0;\n }\n\n if (this._resHeaders.vary === '*') {\n return 0;\n }\n\n if (this._isShared) {\n if (this._rescc['proxy-revalidate']) {\n return 0;\n }\n // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.\n if (this._rescc['s-maxage']) {\n return toNumberOrZero(this._rescc['s-maxage']);\n }\n }\n\n // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.\n if (this._rescc['max-age']) {\n return toNumberOrZero(this._rescc['max-age']);\n }\n\n const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;\n\n const serverDate = this.date();\n if (this._resHeaders.expires) {\n const expires = Date.parse(this._resHeaders.expires);\n // A cache recipient MUST interpret invalid date formats, especially the value \"0\", as representing a time in the past (i.e., \"already expired\").\n if (Number.isNaN(expires) || expires < serverDate) {\n return 0;\n }\n return Math.max(defaultMinTtl, (expires - serverDate) / 1000);\n }\n\n if (this._resHeaders['last-modified']) {\n const lastModified = Date.parse(this._resHeaders['last-modified']);\n if (isFinite(lastModified) && serverDate > lastModified) {\n return Math.max(\n defaultMinTtl,\n ((serverDate - lastModified) / 1000) * this._cacheHeuristic\n );\n }\n }\n\n return defaultMinTtl;\n }\n\n timeToLive() {\n const age = this.maxAge() - this.age();\n const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);\n const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);\n return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000;\n }\n\n stale() {\n return this.maxAge() <= this.age();\n }\n\n _useStaleIfError() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();\n }\n\n useStaleWhileRevalidate() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age();\n }\n\n static fromObject(obj) {\n return new this(undefined, undefined, { _fromObject: obj });\n }\n\n _fromObject(obj) {\n if (this._responseTime) throw Error('Reinitialized');\n if (!obj || obj.v !== 1) throw Error('Invalid serialization');\n\n this._responseTime = obj.t;\n this._isShared = obj.sh;\n this._cacheHeuristic = obj.ch;\n this._immutableMinTtl =\n obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;\n this._status = obj.st;\n this._resHeaders = obj.resh;\n this._rescc = obj.rescc;\n this._method = obj.m;\n this._url = obj.u;\n this._host = obj.h;\n this._noAuthorization = obj.a;\n this._reqHeaders = obj.reqh;\n this._reqcc = obj.reqcc;\n }\n\n toObject() {\n return {\n v: 1,\n t: this._responseTime,\n sh: this._isShared,\n ch: this._cacheHeuristic,\n imm: this._immutableMinTtl,\n st: this._status,\n resh: this._resHeaders,\n rescc: this._rescc,\n m: this._method,\n u: this._url,\n h: this._host,\n a: this._noAuthorization,\n reqh: this._reqHeaders,\n reqcc: this._reqcc,\n };\n }\n\n /**\n * Headers for sending to the origin server to revalidate stale response.\n * Allows server to return 304 to allow reuse of the previous response.\n *\n * Hop by hop headers are always stripped.\n * Revalidation headers may be added or removed, depending on request.\n */\n revalidationHeaders(incomingReq) {\n this._assertRequestHasHeaders(incomingReq);\n const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);\n\n // This implementation does not understand range requests\n delete headers['if-range'];\n\n if (!this._requestMatches(incomingReq, true) || !this.storable()) {\n // revalidation allowed via HEAD\n // not for the same resource, or wasn't allowed to be cached anyway\n delete headers['if-none-match'];\n delete headers['if-modified-since'];\n return headers;\n }\n\n /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */\n if (this._resHeaders.etag) {\n headers['if-none-match'] = headers['if-none-match']\n ? `${headers['if-none-match']}, ${this._resHeaders.etag}`\n : this._resHeaders.etag;\n }\n\n // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.\n const forbidsWeakValidators =\n headers['accept-ranges'] ||\n headers['if-match'] ||\n headers['if-unmodified-since'] ||\n (this._method && this._method != 'GET');\n\n /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.\n Note: This implementation does not understand partial responses (206) */\n if (forbidsWeakValidators) {\n delete headers['if-modified-since'];\n\n if (headers['if-none-match']) {\n const etags = headers['if-none-match']\n .split(/,/)\n .filter(etag => {\n return !/^\\s*W\\//.test(etag);\n });\n if (!etags.length) {\n delete headers['if-none-match'];\n } else {\n headers['if-none-match'] = etags.join(',').trim();\n }\n }\n } else if (\n this._resHeaders['last-modified'] &&\n !headers['if-modified-since']\n ) {\n headers['if-modified-since'] = this._resHeaders['last-modified'];\n }\n\n return headers;\n }\n\n /**\n * Creates new CachePolicy with information combined from the previews response,\n * and the new revalidation response.\n *\n * Returns {policy, modified} where modified is a boolean indicating\n * whether the response body has been modified, and old cached body can't be used.\n *\n * @return {Object} {policy: CachePolicy, modified: Boolean}\n */\n revalidatedPolicy(request, response) {\n this._assertRequestHasHeaders(request);\n if(this._useStaleIfError() && isErrorResponse(response)) { // I consider the revalidation request unsuccessful\n return {\n modified: false,\n matches: false,\n policy: this,\n };\n }\n if (!response || !response.headers) {\n throw Error('Response headers missing');\n }\n\n // These aren't going to be supported exactly, since one CachePolicy object\n // doesn't know about all the other cached objects.\n let matches = false;\n if (response.status !== undefined && response.status != 304) {\n matches = false;\n } else if (\n response.headers.etag &&\n !/^\\s*W\\//.test(response.headers.etag)\n ) {\n // \"All of the stored responses with the same strong validator are selected.\n // If none of the stored responses contain the same strong validator,\n // then the cache MUST NOT use the new response to update any stored responses.\"\n matches =\n this._resHeaders.etag &&\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag;\n } else if (this._resHeaders.etag && response.headers.etag) {\n // \"If the new response contains a weak validator and that validator corresponds\n // to one of the cache's stored responses,\n // then the most recent of those matching stored responses is selected for update.\"\n matches =\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag.replace(/^\\s*W\\//, '');\n } else if (this._resHeaders['last-modified']) {\n matches =\n this._resHeaders['last-modified'] ===\n response.headers['last-modified'];\n } else {\n // If the new response does not include any form of validator (such as in the case where\n // a client generates an If-Modified-Since request from a source other than the Last-Modified\n // response header field), and there is only one stored response, and that stored response also\n // lacks a validator, then that stored response is selected for update.\n if (\n !this._resHeaders.etag &&\n !this._resHeaders['last-modified'] &&\n !response.headers.etag &&\n !response.headers['last-modified']\n ) {\n matches = true;\n }\n }\n\n if (!matches) {\n return {\n policy: new this.constructor(request, response),\n // Client receiving 304 without body, even if it's invalid/mismatched has no option\n // but to reuse a cached body. We don't have a good way to tell clients to do\n // error recovery in such case.\n modified: response.status != 304,\n matches: false,\n };\n }\n\n // use other header fields provided in the 304 (Not Modified) response to replace all instances\n // of the corresponding header fields in the stored response.\n const headers = {};\n for (const k in this._resHeaders) {\n headers[k] =\n k in response.headers && !excludedFromRevalidationUpdate[k]\n ? response.headers[k]\n : this._resHeaders[k];\n }\n\n const newResponse = Object.assign({}, response, {\n status: this._status,\n method: this._method,\n headers,\n });\n return {\n policy: new this.constructor(request, newResponse, {\n shared: this._isShared,\n cacheHeuristic: this._cacheHeuristic,\n immutableMinTimeToLive: this._immutableMinTtl,\n }),\n modified: false,\n matches: true,\n };\n }\n};\n", "'use strict';\nmodule.exports = object => {\n\tconst result = {};\n\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tresult[key.toLowerCase()] = value;\n\t}\n\n\treturn result;\n};\n", "'use strict';\n\nconst Readable = require('stream').Readable;\nconst lowercaseKeys = require('lowercase-keys');\n\nclass Response extends Readable {\n\tconstructor(statusCode, headers, body, url) {\n\t\tif (typeof statusCode !== 'number') {\n\t\t\tthrow new TypeError('Argument `statusCode` should be a number');\n\t\t}\n\t\tif (typeof headers !== 'object') {\n\t\t\tthrow new TypeError('Argument `headers` should be an object');\n\t\t}\n\t\tif (!(body instanceof Buffer)) {\n\t\t\tthrow new TypeError('Argument `body` should be a buffer');\n\t\t}\n\t\tif (typeof url !== 'string') {\n\t\t\tthrow new TypeError('Argument `url` should be a string');\n\t\t}\n\n\t\tsuper();\n\t\tthis.statusCode = statusCode;\n\t\tthis.headers = lowercaseKeys(headers);\n\t\tthis.body = body;\n\t\tthis.url = url;\n\t}\n\n\t_read() {\n\t\tthis.push(this.body);\n\t\tthis.push(null);\n\t}\n}\n\nmodule.exports = Response;\n", "'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProps = [\n\t'destroy',\n\t'setTimeout',\n\t'socket',\n\t'headers',\n\t'trailers',\n\t'rawHeaders',\n\t'statusCode',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'rawTrailers',\n\t'statusMessage'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tconst fromProps = new Set(Object.keys(fromStream).concat(knownProps));\n\n\tfor (const prop of fromProps) {\n\t\t// Don't overwrite existing properties\n\t\tif (prop in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttoStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];\n\t}\n};\n", "'use strict';\n\nconst PassThrough = require('stream').PassThrough;\nconst mimicResponse = require('mimic-response');\n\nconst cloneResponse = response => {\n\tif (!(response && response.pipe)) {\n\t\tthrow new TypeError('Parameter `response` must be a response stream.');\n\t}\n\n\tconst clone = new PassThrough();\n\tmimicResponse(response, clone);\n\n\treturn response.pipe(clone);\n};\n\nmodule.exports = cloneResponse;\n", "//TODO: handle reviver/dehydrate function like normal\n//and handle indentation, like normal.\n//if anyone needs this... please send pull request.\n\nexports.stringify = function stringify (o) {\n if('undefined' == typeof o) return o\n\n if(o && Buffer.isBuffer(o))\n return JSON.stringify(':base64:' + o.toString('base64'))\n\n if(o && o.toJSON)\n o = o.toJSON()\n\n if(o && 'object' === typeof o) {\n var s = ''\n var array = Array.isArray(o)\n s = array ? '[' : '{'\n var first = true\n\n for(var k in o) {\n var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k])\n if(Object.hasOwnProperty.call(o, k) && !ignore) {\n if(!first)\n s += ','\n first = false\n if (array) {\n if(o[k] == undefined)\n s += 'null'\n else\n s += stringify(o[k])\n } else if (o[k] !== void(0)) {\n s += stringify(k) + ':' + stringify(o[k])\n }\n }\n }\n\n s += array ? ']' : '}'\n\n return s\n } else if ('string' === typeof o) {\n return JSON.stringify(/^:/.test(o) ? ':' + o : o)\n } else if ('undefined' === typeof o) {\n return 'null';\n } else\n return JSON.stringify(o)\n}\n\nexports.parse = function (s) {\n return JSON.parse(s, function (key, value) {\n if('string' === typeof value) {\n if(/^:base64:/.test(value))\n return Buffer.from(value.substring(8), 'base64')\n else\n return /^:/.test(value) ? value.substring(1) : value \n }\n return value\n })\n}\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst JSONB = require('json-buffer');\n\nconst loadStore = opts => {\n\tconst adapters = {\n\t\tredis: '@keyv/redis',\n\t\tmongodb: '@keyv/mongo',\n\t\tmongo: '@keyv/mongo',\n\t\tsqlite: '@keyv/sqlite',\n\t\tpostgresql: '@keyv/postgres',\n\t\tpostgres: '@keyv/postgres',\n\t\tmysql: '@keyv/mysql'\n\t};\n\tif (opts.adapter || opts.uri) {\n\t\tconst adapter = opts.adapter || /^[^:]*/.exec(opts.uri)[0];\n\t\treturn new (require(adapters[adapter]))(opts);\n\t}\n\n\treturn new Map();\n};\n\nclass Keyv extends EventEmitter {\n\tconstructor(uri, opts) {\n\t\tsuper();\n\t\tthis.opts = Object.assign(\n\t\t\t{\n\t\t\t\tnamespace: 'keyv',\n\t\t\t\tserialize: JSONB.stringify,\n\t\t\t\tdeserialize: JSONB.parse\n\t\t\t},\n\t\t\t(typeof uri === 'string') ? { uri } : uri,\n\t\t\topts\n\t\t);\n\n\t\tif (!this.opts.store) {\n\t\t\tconst adapterOpts = Object.assign({}, this.opts);\n\t\t\tthis.opts.store = loadStore(adapterOpts);\n\t\t}\n\n\t\tif (typeof this.opts.store.on === 'function') {\n\t\t\tthis.opts.store.on('error', err => this.emit('error', err));\n\t\t}\n\n\t\tthis.opts.store.namespace = this.opts.namespace;\n\t}\n\n\t_getKeyPrefix(key) {\n\t\treturn `${this.opts.namespace}:${key}`;\n\t}\n\n\tget(key, opts) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tconst { store } = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.get(keyPrefixed))\n\t\t\t.then(data => {\n\t\t\t\treturn (typeof data === 'string') ? this.opts.deserialize(data) : data;\n\t\t\t})\n\t\t\t.then(data => {\n\t\t\t\tif (data === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tif (typeof data.expires === 'number' && Date.now() > data.expires) {\n\t\t\t\t\tthis.delete(key);\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn (opts && opts.raw) ? data : data.value;\n\t\t\t});\n\t}\n\n\tset(key, value, ttl) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tif (typeof ttl === 'undefined') {\n\t\t\tttl = this.opts.ttl;\n\t\t}\n\n\t\tif (ttl === 0) {\n\t\t\tttl = undefined;\n\t\t}\n\n\t\tconst { store } = this.opts;\n\n\t\treturn Promise.resolve()\n\t\t\t.then(() => {\n\t\t\t\tconst expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null;\n\t\t\t\tvalue = { value, expires };\n\t\t\t\treturn this.opts.serialize(value);\n\t\t\t})\n\t\t\t.then(value => store.set(keyPrefixed, value, ttl))\n\t\t\t.then(() => true);\n\t}\n\n\tdelete(key) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tconst { store } = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.delete(keyPrefixed));\n\t}\n\n\tclear() {\n\t\tconst { store } = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.clear());\n\t}\n}\n\nmodule.exports = Keyv;\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst urlLib = require('url');\nconst normalizeUrl = require('normalize-url');\nconst getStream = require('get-stream');\nconst CachePolicy = require('http-cache-semantics');\nconst Response = require('responselike');\nconst lowercaseKeys = require('lowercase-keys');\nconst cloneResponse = require('clone-response');\nconst Keyv = require('keyv');\n\nclass CacheableRequest {\n\tconstructor(request, cacheAdapter) {\n\t\tif (typeof request !== 'function') {\n\t\t\tthrow new TypeError('Parameter `request` must be a function');\n\t\t}\n\n\t\tthis.cache = new Keyv({\n\t\t\turi: typeof cacheAdapter === 'string' && cacheAdapter,\n\t\t\tstore: typeof cacheAdapter !== 'string' && cacheAdapter,\n\t\t\tnamespace: 'cacheable-request'\n\t\t});\n\n\t\treturn this.createCacheableRequest(request);\n\t}\n\n\tcreateCacheableRequest(request) {\n\t\treturn (opts, cb) => {\n\t\t\tlet url;\n\t\t\tif (typeof opts === 'string') {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts));\n\t\t\t\topts = {};\n\t\t\t} else if (opts instanceof urlLib.URL) {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts.toString()));\n\t\t\t\topts = {};\n\t\t\t} else {\n\t\t\t\tconst [pathname, ...searchParts] = (opts.path || '').split('?');\n\t\t\t\tconst search = searchParts.length > 0 ?\n\t\t\t\t\t`?${searchParts.join('?')}` :\n\t\t\t\t\t'';\n\t\t\t\turl = normalizeUrlObject({ ...opts, pathname, search });\n\t\t\t}\n\n\t\t\topts = {\n\t\t\t\theaders: {},\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcache: true,\n\t\t\t\tstrictTtl: false,\n\t\t\t\tautomaticFailover: false,\n\t\t\t\t...opts,\n\t\t\t\t...urlObjectToRequestOptions(url)\n\t\t\t};\n\t\t\topts.headers = lowercaseKeys(opts.headers);\n\n\t\t\tconst ee = new EventEmitter();\n\t\t\tconst normalizedUrlString = normalizeUrl(\n\t\t\t\turlLib.format(url),\n\t\t\t\t{\n\t\t\t\t\tstripWWW: false,\n\t\t\t\t\tremoveTrailingSlash: false,\n\t\t\t\t\tstripAuthentication: false\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst key = `${opts.method}:${normalizedUrlString}`;\n\t\t\tlet revalidate = false;\n\t\t\tlet madeRequest = false;\n\n\t\t\tconst makeRequest = opts => {\n\t\t\t\tmadeRequest = true;\n\t\t\t\tlet requestErrored = false;\n\t\t\t\tlet requestErrorCallback;\n\n\t\t\t\tconst requestErrorPromise = new Promise(resolve => {\n\t\t\t\t\trequestErrorCallback = () => {\n\t\t\t\t\t\tif (!requestErrored) {\n\t\t\t\t\t\t\trequestErrored = true;\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst handler = response => {\n\t\t\t\t\tif (revalidate && !opts.forceRefresh) {\n\t\t\t\t\t\tresponse.status = response.statusCode;\n\t\t\t\t\t\tconst revalidatedPolicy = CachePolicy.fromObject(revalidate.cachePolicy).revalidatedPolicy(opts, response);\n\t\t\t\t\t\tif (!revalidatedPolicy.modified) {\n\t\t\t\t\t\t\tconst headers = revalidatedPolicy.policy.responseHeaders();\n\t\t\t\t\t\t\tresponse = new Response(revalidate.statusCode, headers, revalidate.body, revalidate.url);\n\t\t\t\t\t\t\tresponse.cachePolicy = revalidatedPolicy.policy;\n\t\t\t\t\t\t\tresponse.fromCache = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!response.fromCache) {\n\t\t\t\t\t\tresponse.cachePolicy = new CachePolicy(opts, response, opts);\n\t\t\t\t\t\tresponse.fromCache = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet clonedResponse;\n\t\t\t\t\tif (opts.cache && response.cachePolicy.storable()) {\n\t\t\t\t\t\tclonedResponse = cloneResponse(response);\n\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst bodyPromise = getStream.buffer(response);\n\n\t\t\t\t\t\t\t\tawait Promise.race([\n\t\t\t\t\t\t\t\t\trequestErrorPromise,\n\t\t\t\t\t\t\t\t\tnew Promise(resolve => response.once('end', resolve))\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (requestErrored) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst body = await bodyPromise;\n\n\t\t\t\t\t\t\t\tconst value = {\n\t\t\t\t\t\t\t\t\tcachePolicy: response.cachePolicy.toObject(),\n\t\t\t\t\t\t\t\t\turl: response.url,\n\t\t\t\t\t\t\t\t\tstatusCode: response.fromCache ? revalidate.statusCode : response.statusCode,\n\t\t\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlet ttl = opts.strictTtl ? response.cachePolicy.timeToLive() : undefined;\n\t\t\t\t\t\t\t\tif (opts.maxTtl) {\n\t\t\t\t\t\t\t\t\tttl = ttl ? Math.min(ttl, opts.maxTtl) : opts.maxTtl;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait this.cache.set(key, value, ttl);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t} else if (opts.cache && revalidate) {\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.cache.delete(key);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('response', clonedResponse || response);\n\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\tcb(clonedResponse || response);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tconst req = request(opts, handler);\n\t\t\t\t\treq.once('error', requestErrorCallback);\n\t\t\t\t\treq.once('abort', requestErrorCallback);\n\t\t\t\t\tee.emit('request', req);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tee.emit('error', new CacheableRequest.RequestError(error));\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t(async () => {\n\t\t\t\tconst get = async opts => {\n\t\t\t\t\tawait Promise.resolve();\n\n\t\t\t\t\tconst cacheEntry = opts.cache ? await this.cache.get(key) : undefined;\n\t\t\t\t\tif (typeof cacheEntry === 'undefined') {\n\t\t\t\t\t\treturn makeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst policy = CachePolicy.fromObject(cacheEntry.cachePolicy);\n\t\t\t\t\tif (policy.satisfiesWithoutRevalidation(opts) && !opts.forceRefresh) {\n\t\t\t\t\t\tconst headers = policy.responseHeaders();\n\t\t\t\t\t\tconst response = new Response(cacheEntry.statusCode, headers, cacheEntry.body, cacheEntry.url);\n\t\t\t\t\t\tresponse.cachePolicy = policy;\n\t\t\t\t\t\tresponse.fromCache = true;\n\n\t\t\t\t\t\tee.emit('response', response);\n\t\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\t\tcb(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trevalidate = cacheEntry;\n\t\t\t\t\t\topts.headers = policy.revalidationHeaders(opts);\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst errorHandler = error => ee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\tthis.cache.once('error', errorHandler);\n\t\t\t\tee.on('response', () => this.cache.removeListener('error', errorHandler));\n\n\t\t\t\ttry {\n\t\t\t\t\tawait get(opts);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (opts.automaticFailover && !madeRequest) {\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\treturn ee;\n\t\t};\n\t}\n}\n\nfunction urlObjectToRequestOptions(url) {\n\tconst options = { ...url };\n\toptions.path = `${url.pathname || '/'}${url.search || ''}`;\n\tdelete options.pathname;\n\tdelete options.search;\n\treturn options;\n}\n\nfunction normalizeUrlObject(url) {\n\t// If url was parsed by url.parse or new URL:\n\t// - hostname will be set\n\t// - host will be hostname[:port]\n\t// - port will be set if it was explicit in the parsed string\n\t// Otherwise, url was from request options:\n\t// - hostname or host may be set\n\t// - host shall not have port encoded\n\treturn {\n\t\tprotocol: url.protocol,\n\t\tauth: url.auth,\n\t\thostname: url.hostname || url.host || 'localhost',\n\t\tport: url.port,\n\t\tpathname: url.pathname,\n\t\tsearch: url.search\n\t};\n}\n\nCacheableRequest.RequestError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'RequestError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nCacheableRequest.CacheError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'CacheError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nmodule.exports = CacheableRequest;\n", "'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProperties = [\n\t'aborted',\n\t'complete',\n\t'headers',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'method',\n\t'rawHeaders',\n\t'rawTrailers',\n\t'setTimeout',\n\t'socket',\n\t'statusCode',\n\t'statusMessage',\n\t'trailers',\n\t'url'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tif (toStream._readableState.autoDestroy) {\n\t\tthrow new Error('The second stream must have the `autoDestroy` option set to `false`');\n\t}\n\n\tconst fromProperties = new Set(Object.keys(fromStream).concat(knownProperties));\n\n\tconst properties = {};\n\n\tfor (const property of fromProperties) {\n\t\t// Don't overwrite existing properties.\n\t\tif (property in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tproperties[property] = {\n\t\t\tget() {\n\t\t\t\tconst value = fromStream[property];\n\t\t\t\tconst isFunction = typeof value === 'function';\n\n\t\t\t\treturn isFunction ? value.bind(fromStream) : value;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tfromStream[property] = value;\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false\n\t\t};\n\t}\n\n\tObject.defineProperties(toStream, properties);\n\n\tfromStream.once('aborted', () => {\n\t\ttoStream.destroy();\n\n\t\ttoStream.emit('aborted');\n\t});\n\n\tfromStream.once('close', () => {\n\t\tif (fromStream.complete) {\n\t\t\tif (toStream.readable) {\n\t\t\t\ttoStream.once('end', () => {\n\t\t\t\t\ttoStream.emit('close');\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttoStream.emit('close');\n\t\t\t}\n\t\t} else {\n\t\t\ttoStream.emit('close');\n\t\t}\n\t});\n\n\treturn toStream;\n};\n", "'use strict';\nconst {Transform, PassThrough} = require('stream');\nconst zlib = require('zlib');\nconst mimicResponse = require('mimic-response');\n\nmodule.exports = response => {\n\tconst contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();\n\n\tif (!['gzip', 'deflate', 'br'].includes(contentEncoding)) {\n\t\treturn response;\n\t}\n\n\t// TODO: Remove this when targeting Node.js 12.\n\tconst isBrotli = contentEncoding === 'br';\n\tif (isBrotli && typeof zlib.createBrotliDecompress !== 'function') {\n\t\tresponse.destroy(new Error('Brotli is not supported on Node.js < 12'));\n\t\treturn response;\n\t}\n\n\tlet isEmpty = true;\n\n\tconst checker = new Transform({\n\t\ttransform(data, _encoding, callback) {\n\t\t\tisEmpty = false;\n\n\t\t\tcallback(null, data);\n\t\t},\n\n\t\tflush(callback) {\n\t\t\tcallback();\n\t\t}\n\t});\n\n\tconst finalStream = new PassThrough({\n\t\tautoDestroy: false,\n\t\tdestroy(error, callback) {\n\t\t\tresponse.destroy();\n\n\t\t\tcallback(error);\n\t\t}\n\t});\n\n\tconst decompressStream = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();\n\n\tdecompressStream.once('error', error => {\n\t\tif (isEmpty && !response.readable) {\n\t\t\tfinalStream.end();\n\t\t\treturn;\n\t\t}\n\n\t\tfinalStream.destroy(error);\n\t});\n\n\tmimicResponse(response, finalStream);\n\tresponse.pipe(checker).pipe(decompressStream).pipe(finalStream);\n\n\treturn finalStream;\n};\n", "'use strict';\n\nclass QuickLRU {\n\tconstructor(options = {}) {\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tfor (const [key, value] of this.oldCache.entries()) {\n\t\t\t\t\tthis.onEviction(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst value = this.oldCache.get(key);\n\t\t\tthis.oldCache.delete(key);\n\t\t\tthis._set(key, value);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tset(key, value) {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, value);\n\t\t} else {\n\t\t\tthis._set(key, value);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\treturn this.cache.has(key) || this.oldCache.has(key);\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this.oldCache.get(key);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tyield item;\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget size() {\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n}\n\nmodule.exports = QuickLRU;\n", "'use strict';\nconst EventEmitter = require('events');\nconst tls = require('tls');\nconst http2 = require('http2');\nconst QuickLRU = require('quick-lru');\n\nconst kCurrentStreamsCount = Symbol('currentStreamsCount');\nconst kRequest = Symbol('request');\nconst kOriginSet = Symbol('cachedOriginSet');\nconst kGracefullyClosing = Symbol('gracefullyClosing');\n\nconst nameKeys = [\n\t// `http2.connect()` options\n\t'maxDeflateDynamicTableSize',\n\t'maxSessionMemory',\n\t'maxHeaderListPairs',\n\t'maxOutstandingPings',\n\t'maxReservedRemoteStreams',\n\t'maxSendHeaderBlockLength',\n\t'paddingStrategy',\n\n\t// `tls.connect()` options\n\t'localAddress',\n\t'path',\n\t'rejectUnauthorized',\n\t'minDHSize',\n\n\t// `tls.createSecureContext()` options\n\t'ca',\n\t'cert',\n\t'clientCertEngine',\n\t'ciphers',\n\t'key',\n\t'pfx',\n\t'servername',\n\t'minVersion',\n\t'maxVersion',\n\t'secureProtocol',\n\t'crl',\n\t'honorCipherOrder',\n\t'ecdhCurve',\n\t'dhparam',\n\t'secureOptions',\n\t'sessionIdContext'\n];\n\nconst getSortedIndex = (array, value, compare) => {\n\tlet low = 0;\n\tlet high = array.length;\n\n\twhile (low < high) {\n\t\tconst mid = (low + high) >>> 1;\n\n\t\t/* istanbul ignore next */\n\t\tif (compare(array[mid], value)) {\n\t\t\t// This never gets called because we use descending sort. Better to have this anyway.\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\n\treturn low;\n};\n\nconst compareSessions = (a, b) => {\n\treturn a.remoteSettings.maxConcurrentStreams > b.remoteSettings.maxConcurrentStreams;\n};\n\n// See https://tools.ietf.org/html/rfc8336\nconst closeCoveredSessions = (where, session) => {\n\t// Clients SHOULD NOT emit new requests on any connection whose Origin\n\t// Set is a proper subset of another connection's Origin Set, and they\n\t// SHOULD close it once all outstanding requests are satisfied.\n\tfor (const coveredSession of where) {\n\t\tif (\n\t\t\t// The set is a proper subset when its length is less than the other set.\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\n\t\t\t// And the other set includes all elements of the subset.\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\n\t\t\t// Makes sure that the session can handle all requests from the covered session.\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\t// This allows pending requests to finish and prevents making new requests.\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\n// This is basically inverted `closeCoveredSessions(...)`.\nconst closeSessionIfCovered = (where, coveredSession) => {\n\tfor (const session of where) {\n\t\tif (\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\nconst getSessions = ({agent, isFree}) => {\n\tconst result = {};\n\n\t// eslint-disable-next-line guard-for-in\n\tfor (const normalizedOptions in agent.sessions) {\n\t\tconst sessions = agent.sessions[normalizedOptions];\n\n\t\tconst filtered = sessions.filter(session => {\n\t\t\tconst result = session[Agent.kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\n\t\t\treturn isFree ? result : !result;\n\t\t});\n\n\t\tif (filtered.length !== 0) {\n\t\t\tresult[normalizedOptions] = filtered;\n\t\t}\n\t}\n\n\treturn result;\n};\n\nconst gracefullyClose = session => {\n\tsession[kGracefullyClosing] = true;\n\n\tif (session[kCurrentStreamsCount] === 0) {\n\t\tsession.close();\n\t}\n};\n\nclass Agent extends EventEmitter {\n\tconstructor({timeout = 60000, maxSessions = Infinity, maxFreeSessions = 10, maxCachedTlsSessions = 100} = {}) {\n\t\tsuper();\n\n\t\t// A session is considered busy when its current streams count\n\t\t// is equal to or greater than the `maxConcurrentStreams` value.\n\n\t\t// A session is considered free when its current streams count\n\t\t// is less than the `maxConcurrentStreams` value.\n\n\t\t// SESSIONS[NORMALIZED_OPTIONS] = [];\n\t\tthis.sessions = {};\n\n\t\t// The queue for creating new sessions. It looks like this:\n\t\t// QUEUE[NORMALIZED_OPTIONS][NORMALIZED_ORIGIN] = ENTRY_FUNCTION\n\t\t//\n\t\t// The entry function has `listeners`, `completed` and `destroyed` properties.\n\t\t// `listeners` is an array of objects containing `resolve` and `reject` functions.\n\t\t// `completed` is a boolean. It's set to true after ENTRY_FUNCTION is executed.\n\t\t// `destroyed` is a boolean. If it's set to true, the session will be destroyed if hasn't connected yet.\n\t\tthis.queue = {};\n\n\t\t// Each session will use this timeout value.\n\t\tthis.timeout = timeout;\n\n\t\t// Max sessions in total\n\t\tthis.maxSessions = maxSessions;\n\n\t\t// Max free sessions in total\n\t\t// TODO: decreasing `maxFreeSessions` should close some sessions\n\t\tthis.maxFreeSessions = maxFreeSessions;\n\n\t\tthis._freeSessionsCount = 0;\n\t\tthis._sessionsCount = 0;\n\n\t\t// We don't support push streams by default.\n\t\tthis.settings = {\n\t\t\tenablePush: false\n\t\t};\n\n\t\t// Reusing TLS sessions increases performance.\n\t\tthis.tlsSessionCache = new QuickLRU({maxSize: maxCachedTlsSessions});\n\t}\n\n\tstatic normalizeOrigin(url, servername) {\n\t\tif (typeof url === 'string') {\n\t\t\turl = new URL(url);\n\t\t}\n\n\t\tif (servername && url.hostname !== servername) {\n\t\t\turl.hostname = servername;\n\t\t}\n\n\t\treturn url.origin;\n\t}\n\n\tnormalizeOptions(options) {\n\t\tlet normalized = '';\n\n\t\tif (options) {\n\t\t\tfor (const key of nameKeys) {\n\t\t\t\tif (options[key]) {\n\t\t\t\t\tnormalized += `:${options[key]}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn normalized;\n\t}\n\n\t_tryToCreateNewSession(normalizedOptions, normalizedOrigin) {\n\t\tif (!(normalizedOptions in this.queue) || !(normalizedOrigin in this.queue[normalizedOptions])) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t// The entry function can be run only once.\n\t\t// BUG: The session may be never created when:\n\t\t// - the first condition is false AND\n\t\t// - this function is never called with the same arguments in the future.\n\t\tif (this._sessionsCount < this.maxSessions && !item.completed) {\n\t\t\titem.completed = true;\n\n\t\t\titem();\n\t\t}\n\t}\n\n\tgetSession(origin, options, listeners) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (Array.isArray(listeners)) {\n\t\t\t\tlisteners = [...listeners];\n\n\t\t\t\t// Resolve the current promise ASAP, we're just moving the listeners.\n\t\t\t\t// They will be executed at a different time.\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tlisteners = [{resolve, reject}];\n\t\t\t}\n\n\t\t\tconst normalizedOptions = this.normalizeOptions(options);\n\t\t\tconst normalizedOrigin = Agent.normalizeOrigin(origin, options && options.servername);\n\n\t\t\tif (normalizedOrigin === undefined) {\n\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\treject(new TypeError('The `origin` argument needs to be a string or an URL object'));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.sessions) {\n\t\t\t\tconst sessions = this.sessions[normalizedOptions];\n\n\t\t\t\tlet maxConcurrentStreams = -1;\n\t\t\t\tlet currentStreamsCount = -1;\n\t\t\t\tlet optimalSession;\n\n\t\t\t\t// We could just do this.sessions[normalizedOptions].find(...) but that isn't optimal.\n\t\t\t\t// Additionally, we are looking for session which has biggest current pending streams count.\n\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\tconst sessionMaxConcurrentStreams = session.remoteSettings.maxConcurrentStreams;\n\n\t\t\t\t\tif (sessionMaxConcurrentStreams < maxConcurrentStreams) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (session[kOriginSet].includes(normalizedOrigin)) {\n\t\t\t\t\t\tconst sessionCurrentStreamsCount = session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsessionCurrentStreamsCount >= sessionMaxConcurrentStreams ||\n\t\t\t\t\t\t\tsession[kGracefullyClosing] ||\n\t\t\t\t\t\t\t// Unfortunately the `close` event isn't called immediately,\n\t\t\t\t\t\t\t// so `session.destroyed` is `true`, but `session.closed` is `false`.\n\t\t\t\t\t\t\tsession.destroyed\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We only need set this once.\n\t\t\t\t\t\tif (!optimalSession) {\n\t\t\t\t\t\t\tmaxConcurrentStreams = sessionMaxConcurrentStreams;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We're looking for the session which has biggest current pending stream count,\n\t\t\t\t\t\t// in order to minimalize the amount of active sessions.\n\t\t\t\t\t\tif (sessionCurrentStreamsCount > currentStreamsCount) {\n\t\t\t\t\t\t\toptimalSession = session;\n\t\t\t\t\t\t\tcurrentStreamsCount = sessionCurrentStreamsCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (optimalSession) {\n\t\t\t\t\t/* istanbul ignore next: safety check */\n\t\t\t\t\tif (listeners.length !== 1) {\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\tconst error = new Error(\n\t\t\t\t\t\t\t\t`Expected the length of listeners to be 1, got ${listeners.length}.\\n` +\n\t\t\t\t\t\t\t\t'Please report this to https://github.com/szmarczak/http2-wrapper/'\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlisteners[0].resolve(optimalSession);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.queue) {\n\t\t\t\tif (normalizedOrigin in this.queue[normalizedOptions]) {\n\t\t\t\t\t// There's already an item in the queue, just attach ourselves to it.\n\t\t\t\t\tthis.queue[normalizedOptions][normalizedOrigin].listeners.push(...listeners);\n\n\t\t\t\t\t// This shouldn't be executed here.\n\t\t\t\t\t// See the comment inside _tryToCreateNewSession.\n\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.queue[normalizedOptions] = {};\n\t\t\t}\n\n\t\t\t// The entry must be removed from the queue IMMEDIATELY when:\n\t\t\t// 1. the session connects successfully,\n\t\t\t// 2. an error occurs.\n\t\t\tconst removeFromQueue = () => {\n\t\t\t\t// Our entry can be replaced. We cannot remove the new one.\n\t\t\t\tif (normalizedOptions in this.queue && this.queue[normalizedOptions][normalizedOrigin] === entry) {\n\t\t\t\t\tdelete this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t\t\t\tif (Object.keys(this.queue[normalizedOptions]).length === 0) {\n\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// The main logic is here\n\t\t\tconst entry = () => {\n\t\t\t\tconst name = `${normalizedOrigin}:${normalizedOptions}`;\n\t\t\t\tlet receivedSettings = false;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst session = http2.connect(origin, {\n\t\t\t\t\t\tcreateConnection: this.createConnection,\n\t\t\t\t\t\tsettings: this.settings,\n\t\t\t\t\t\tsession: this.tlsSessionCache.get(name),\n\t\t\t\t\t\t...options\n\t\t\t\t\t});\n\t\t\t\t\tsession[kCurrentStreamsCount] = 0;\n\t\t\t\t\tsession[kGracefullyClosing] = false;\n\n\t\t\t\t\tconst isFree = () => session[kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\t\t\t\t\tlet wasFree = true;\n\n\t\t\t\t\tsession.socket.once('session', tlsSession => {\n\t\t\t\t\t\tthis.tlsSessionCache.set(name, tlsSession);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('error', error => {\n\t\t\t\t\t\t// Listeners are empty when the session successfully connected.\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The connection got broken, purge the cache.\n\t\t\t\t\t\tthis.tlsSessionCache.delete(name);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.setTimeout(this.timeout, () => {\n\t\t\t\t\t\t// Terminates all streams owned by this session.\n\t\t\t\t\t\t// TODO: Maybe the streams should have a \"Session timed out\" error?\n\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('close', () => {\n\t\t\t\t\t\tif (receivedSettings) {\n\t\t\t\t\t\t\t// 1. If it wasn't free then no need to decrease because\n\t\t\t\t\t\t\t// it has been decreased already in session.request().\n\t\t\t\t\t\t\t// 2. `stream.once('close')` won't increment the count\n\t\t\t\t\t\t\t// because the session is already closed.\n\t\t\t\t\t\t\tif (wasFree) {\n\t\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._sessionsCount--;\n\n\t\t\t\t\t\t\t// This cannot be moved to the stream logic,\n\t\t\t\t\t\t\t// because there may be a session that hadn't made a single request.\n\t\t\t\t\t\t\tconst where = this.sessions[normalizedOptions];\n\t\t\t\t\t\t\twhere.splice(where.indexOf(session), 1);\n\n\t\t\t\t\t\t\tif (where.length === 0) {\n\t\t\t\t\t\t\t\tdelete this.sessions[normalizedOptions];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Broken connection\n\t\t\t\t\t\t\tconst error = new Error('Session closed without receiving a SETTINGS frame');\n\t\t\t\t\t\t\terror.code = 'HTTP2WRAPPER_NOSETTINGS';\n\n\t\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tremoveFromQueue();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// There may be another session awaiting.\n\t\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Iterates over the queue and processes listeners.\n\t\t\t\t\tconst processListeners = () => {\n\t\t\t\t\t\tif (!(normalizedOptions in this.queue) || !isFree()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const origin of session[kOriginSet]) {\n\t\t\t\t\t\t\tif (origin in this.queue[normalizedOptions]) {\n\t\t\t\t\t\t\t\tconst {listeners} = this.queue[normalizedOptions][origin];\n\n\t\t\t\t\t\t\t\t// Prevents session overloading.\n\t\t\t\t\t\t\t\twhile (listeners.length !== 0 && isFree()) {\n\t\t\t\t\t\t\t\t\t// We assume `resolve(...)` calls `request(...)` *directly*,\n\t\t\t\t\t\t\t\t\t// otherwise the session will get overloaded.\n\t\t\t\t\t\t\t\t\tlisteners.shift().resolve(session);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst where = this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\tif (where[origin].listeners.length === 0) {\n\t\t\t\t\t\t\t\t\tdelete where[origin];\n\n\t\t\t\t\t\t\t\t\tif (Object.keys(where).length === 0) {\n\t\t\t\t\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// We're no longer free, no point in continuing.\n\t\t\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// The Origin Set cannot shrink. No need to check if it suddenly became covered by another one.\n\t\t\t\t\tsession.on('origin', () => {\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t// The session is full.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t// Close covered sessions (if possible).\n\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('remoteSettings', () => {\n\t\t\t\t\t\t// Fix Node.js bug preventing the process from exiting\n\t\t\t\t\t\tsession.ref();\n\t\t\t\t\t\tsession.unref();\n\n\t\t\t\t\t\tthis._sessionsCount++;\n\n\t\t\t\t\t\t// The Agent could have been destroyed already.\n\t\t\t\t\t\tif (entry.destroyed) {\n\t\t\t\t\t\t\tconst error = new Error('Agent has been destroyed');\n\n\t\t\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst where = this.sessions;\n\n\t\t\t\t\t\t\tif (normalizedOptions in where) {\n\t\t\t\t\t\t\t\tconst sessions = where[normalizedOptions];\n\t\t\t\t\t\t\t\tsessions.splice(getSortedIndex(sessions, session, compareSessions), 0, session);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twhere[normalizedOptions] = [session];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._freeSessionsCount += 1;\n\t\t\t\t\t\treceivedSettings = true;\n\n\t\t\t\t\t\tthis.emit('session', session);\n\n\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\tremoveFromQueue();\n\n\t\t\t\t\t\t// TODO: Close last recently used (or least used?) session\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === 0 && this._freeSessionsCount > this.maxFreeSessions) {\n\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if we haven't managed to execute all listeners.\n\t\t\t\t\t\tif (listeners.length !== 0) {\n\t\t\t\t\t\t\t// Request for a new session with predefined listeners.\n\t\t\t\t\t\t\tthis.getSession(normalizedOrigin, options, listeners);\n\t\t\t\t\t\t\tlisteners.length = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// `session.remoteSettings.maxConcurrentStreams` might get increased\n\t\t\t\t\t\tsession.on('remoteSettings', () => {\n\t\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t\t// In case the Origin Set changes\n\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t// Shim `session.request()` in order to catch all streams\n\t\t\t\t\tsession[kRequest] = session.request;\n\t\t\t\t\tsession.request = (headers, streamOptions) => {\n\t\t\t\t\t\tif (session[kGracefullyClosing]) {\n\t\t\t\t\t\t\tthrow new Error('The session is gracefully closing. No new streams are allowed.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst stream = session[kRequest](headers, streamOptions);\n\n\t\t\t\t\t\t// The process won't exit until the session is closed or all requests are gone.\n\t\t\t\t\t\tsession.ref();\n\n\t\t\t\t\t\t++session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === session.remoteSettings.maxConcurrentStreams) {\n\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstream.once('close', () => {\n\t\t\t\t\t\t\twasFree = isFree();\n\n\t\t\t\t\t\t\t--session[kCurrentStreamsCount];\n\n\t\t\t\t\t\t\tif (!session.destroyed && !session.closed) {\n\t\t\t\t\t\t\t\tcloseSessionIfCovered(this.sessions[normalizedOptions], session);\n\n\t\t\t\t\t\t\t\tif (isFree() && !session.closed) {\n\t\t\t\t\t\t\t\t\tif (!wasFree) {\n\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount++;\n\n\t\t\t\t\t\t\t\t\t\twasFree = true;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst isEmpty = session[kCurrentStreamsCount] === 0;\n\n\t\t\t\t\t\t\t\t\tif (isEmpty) {\n\t\t\t\t\t\t\t\t\t\tsession.unref();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tisEmpty &&\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount > this.maxFreeSessions ||\n\t\t\t\t\t\t\t\t\t\t\tsession[kGracefullyClosing]\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn stream;\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveFromQueue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tentry.listeners = listeners;\n\t\t\tentry.completed = false;\n\t\t\tentry.destroyed = false;\n\n\t\t\tthis.queue[normalizedOptions][normalizedOrigin] = entry;\n\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t});\n\t}\n\n\trequest(origin, options, headers, streamOptions) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.getSession(origin, options, [{\n\t\t\t\treject,\n\t\t\t\tresolve: session => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresolve(session.request(headers, streamOptions));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}]);\n\t\t});\n\t}\n\n\tcreateConnection(origin, options) {\n\t\treturn Agent.connect(origin, options);\n\t}\n\n\tstatic connect(origin, options) {\n\t\toptions.ALPNProtocols = ['h2'];\n\n\t\tconst port = origin.port || 443;\n\t\tconst host = origin.hostname || origin.host;\n\n\t\tif (typeof options.servername === 'undefined') {\n\t\t\toptions.servername = host;\n\t\t}\n\n\t\treturn tls.connect(port, host, options);\n\t}\n\n\tcloseFreeSessions() {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tif (session[kCurrentStreamsCount] === 0) {\n\t\t\t\t\tsession.close();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy(reason) {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tsession.destroy(reason);\n\t\t\t}\n\t\t}\n\n\t\tfor (const entriesOfAuthority of Object.values(this.queue)) {\n\t\t\tfor (const entry of Object.values(entriesOfAuthority)) {\n\t\t\t\tentry.destroyed = true;\n\t\t\t}\n\t\t}\n\n\t\t// New requests should NOT attach to destroyed sessions\n\t\tthis.queue = {};\n\t}\n\n\tget freeSessions() {\n\t\treturn getSessions({agent: this, isFree: true});\n\t}\n\n\tget busySessions() {\n\t\treturn getSessions({agent: this, isFree: false});\n\t}\n}\n\nAgent.kCurrentStreamsCount = kCurrentStreamsCount;\nAgent.kGracefullyClosing = kGracefullyClosing;\n\nmodule.exports = {\n\tAgent,\n\tglobalAgent: new Agent()\n};\n", "'use strict';\nconst {Readable} = require('stream');\n\nclass IncomingMessage extends Readable {\n\tconstructor(socket, highWaterMark) {\n\t\tsuper({\n\t\t\thighWaterMark,\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tthis.statusCode = null;\n\t\tthis.statusMessage = '';\n\t\tthis.httpVersion = '2.0';\n\t\tthis.httpVersionMajor = 2;\n\t\tthis.httpVersionMinor = 0;\n\t\tthis.headers = {};\n\t\tthis.trailers = {};\n\t\tthis.req = null;\n\n\t\tthis.aborted = false;\n\t\tthis.complete = false;\n\t\tthis.upgrade = null;\n\n\t\tthis.rawHeaders = [];\n\t\tthis.rawTrailers = [];\n\n\t\tthis.socket = socket;\n\t\tthis.connection = socket;\n\n\t\tthis._dumped = false;\n\t}\n\n\t_destroy(error) {\n\t\tthis.req._request.destroy(error);\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tthis.req.setTimeout(ms, callback);\n\t\treturn this;\n\t}\n\n\t_dump() {\n\t\tif (!this._dumped) {\n\t\t\tthis._dumped = true;\n\n\t\t\tthis.removeAllListeners('data');\n\t\t\tthis.resume();\n\t\t}\n\t}\n\n\t_read() {\n\t\tif (this.req) {\n\t\t\tthis.req._request.resume();\n\t\t}\n\t}\n}\n\nmodule.exports = IncomingMessage;\n", "'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/a91293d4d9ab403046ab5eb022332e4e3d249bd3/lib/internal/url.js#L1257 */\n\nmodule.exports = url => {\n\tconst options = {\n\t\tprotocol: url.protocol,\n\t\thostname: typeof url.hostname === 'string' && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n\t\thost: url.host,\n\t\thash: url.hash,\n\t\tsearch: url.search,\n\t\tpathname: url.pathname,\n\t\thref: url.href,\n\t\tpath: `${url.pathname || ''}${url.search || ''}`\n\t};\n\n\tif (typeof url.port === 'string' && url.port.length !== 0) {\n\t\toptions.port = Number(url.port);\n\t}\n\n\tif (url.username || url.password) {\n\t\toptions.auth = `${url.username || ''}:${url.password || ''}`;\n\t}\n\n\treturn options;\n};\n", "'use strict';\n\nmodule.exports = (from, to, events) => {\n\tfor (const event of events) {\n\t\tfrom.on(event, (...args) => to.emit(event, ...args));\n\t}\n};\n", "'use strict';\n\nmodule.exports = header => {\n\tswitch (header) {\n\t\tcase ':method':\n\t\tcase ':scheme':\n\t\tcase ':authority':\n\t\tcase ':path':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n", "'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/master/lib/internal/errors.js */\n\nconst makeError = (Base, key, getMessage) => {\n\tmodule.exports[key] = class NodeError extends Base {\n\t\tconstructor(...args) {\n\t\t\tsuper(typeof getMessage === 'string' ? getMessage : getMessage(args));\n\t\t\tthis.name = `${super.name} [${key}]`;\n\t\t\tthis.code = key;\n\t\t}\n\t};\n};\n\nmakeError(TypeError, 'ERR_INVALID_ARG_TYPE', args => {\n\tconst type = args[0].includes('.') ? 'property' : 'argument';\n\n\tlet valid = args[1];\n\tconst isManyTypes = Array.isArray(valid);\n\n\tif (isManyTypes) {\n\t\tvalid = `${valid.slice(0, -1).join(', ')} or ${valid.slice(-1)}`;\n\t}\n\n\treturn `The \"${args[0]}\" ${type} must be ${isManyTypes ? 'one of' : 'of'} type ${valid}. Received ${typeof args[2]}`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_PROTOCOL', args => {\n\treturn `Protocol \"${args[0]}\" not supported. Expected \"${args[1]}\"`;\n});\n\nmakeError(Error, 'ERR_HTTP_HEADERS_SENT', args => {\n\treturn `Cannot ${args[0]} headers after they are sent to the client`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_HTTP_TOKEN', args => {\n\treturn `${args[0]} must be a valid HTTP token [${args[1]}]`;\n});\n\nmakeError(TypeError, 'ERR_HTTP_INVALID_HEADER_VALUE', args => {\n\treturn `Invalid value \"${args[0]} for header \"${args[1]}\"`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_CHAR', args => {\n\treturn `Invalid character in ${args[0]} [${args[1]}]`;\n});\n", "'use strict';\nconst http2 = require('http2');\nconst {Writable} = require('stream');\nconst {Agent, globalAgent} = require('./agent');\nconst IncomingMessage = require('./incoming-message');\nconst urlToOptions = require('./utils/url-to-options');\nconst proxyEvents = require('./utils/proxy-events');\nconst isRequestPseudoHeader = require('./utils/is-request-pseudo-header');\nconst {\n\tERR_INVALID_ARG_TYPE,\n\tERR_INVALID_PROTOCOL,\n\tERR_HTTP_HEADERS_SENT,\n\tERR_INVALID_HTTP_TOKEN,\n\tERR_HTTP_INVALID_HEADER_VALUE,\n\tERR_INVALID_CHAR\n} = require('./utils/errors');\n\nconst {\n\tHTTP2_HEADER_STATUS,\n\tHTTP2_HEADER_METHOD,\n\tHTTP2_HEADER_PATH,\n\tHTTP2_METHOD_CONNECT\n} = http2.constants;\n\nconst kHeaders = Symbol('headers');\nconst kOrigin = Symbol('origin');\nconst kSession = Symbol('session');\nconst kOptions = Symbol('options');\nconst kFlushedHeaders = Symbol('flushedHeaders');\nconst kJobs = Symbol('jobs');\n\nconst isValidHttpToken = /^[\\^`\\-\\w!#$%&*+.|~]+$/;\nconst isInvalidHeaderValue = /[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/;\n\nclass ClientRequest extends Writable {\n\tconstructor(input, options, callback) {\n\t\tsuper({\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tconst hasInput = typeof input === 'string' || input instanceof URL;\n\t\tif (hasInput) {\n\t\t\tinput = urlToOptions(input instanceof URL ? input : new URL(input));\n\t\t}\n\n\t\tif (typeof options === 'function' || options === undefined) {\n\t\t\t// (options, callback)\n\t\t\tcallback = options;\n\t\t\toptions = hasInput ? input : {...input};\n\t\t} else {\n\t\t\t// (input, options, callback)\n\t\t\toptions = {...input, ...options};\n\t\t}\n\n\t\tif (options.h2session) {\n\t\t\tthis[kSession] = options.h2session;\n\t\t} else if (options.agent === false) {\n\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t} else if (typeof options.agent === 'undefined' || options.agent === null) {\n\t\t\tif (typeof options.createConnection === 'function') {\n\t\t\t\t// This is a workaround - we don't have to create the session on our own.\n\t\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t\t\tthis.agent.createConnection = options.createConnection;\n\t\t\t} else {\n\t\t\t\tthis.agent = globalAgent;\n\t\t\t}\n\t\t} else if (typeof options.agent.request === 'function') {\n\t\t\tthis.agent = options.agent;\n\t\t} else {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('options.agent', ['Agent-like Object', 'undefined', 'false'], options.agent);\n\t\t}\n\n\t\tif (options.protocol && options.protocol !== 'https:') {\n\t\t\tthrow new ERR_INVALID_PROTOCOL(options.protocol, 'https:');\n\t\t}\n\n\t\tconst port = options.port || options.defaultPort || (this.agent && this.agent.defaultPort) || 443;\n\t\tconst host = options.hostname || options.host || 'localhost';\n\n\t\t// Don't enforce the origin via options. It may be changed in an Agent.\n\t\tdelete options.hostname;\n\t\tdelete options.host;\n\t\tdelete options.port;\n\n\t\tconst {timeout} = options;\n\t\toptions.timeout = undefined;\n\n\t\tthis[kHeaders] = Object.create(null);\n\t\tthis[kJobs] = [];\n\n\t\tthis.socket = null;\n\t\tthis.connection = null;\n\n\t\tthis.method = options.method || 'GET';\n\t\tthis.path = options.path;\n\n\t\tthis.res = null;\n\t\tthis.aborted = false;\n\t\tthis.reusedSocket = false;\n\n\t\tif (options.headers) {\n\t\t\tfor (const [header, value] of Object.entries(options.headers)) {\n\t\t\t\tthis.setHeader(header, value);\n\t\t\t}\n\t\t}\n\n\t\tif (options.auth && !('authorization' in this[kHeaders])) {\n\t\t\tthis[kHeaders].authorization = 'Basic ' + Buffer.from(options.auth).toString('base64');\n\t\t}\n\n\t\toptions.session = options.tlsSession;\n\t\toptions.path = options.socketPath;\n\n\t\tthis[kOptions] = options;\n\n\t\t// Clients that generate HTTP/2 requests directly SHOULD use the :authority pseudo-header field instead of the Host header field.\n\t\tif (port === 443) {\n\t\t\tthis[kOrigin] = `https://${host}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = host;\n\t\t\t}\n\t\t} else {\n\t\t\tthis[kOrigin] = `https://${host}:${port}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = `${host}:${port}`;\n\t\t\t}\n\t\t}\n\n\t\tif (timeout) {\n\t\t\tthis.setTimeout(timeout);\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.once('response', callback);\n\t\t}\n\n\t\tthis[kFlushedHeaders] = false;\n\t}\n\n\tget method() {\n\t\treturn this[kHeaders][HTTP2_HEADER_METHOD];\n\t}\n\n\tset method(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_METHOD] = value.toUpperCase();\n\t\t}\n\t}\n\n\tget path() {\n\t\treturn this[kHeaders][HTTP2_HEADER_PATH];\n\t}\n\n\tset path(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_PATH] = value;\n\t\t}\n\t}\n\n\tget _mustNotHaveABody() {\n\t\treturn this.method === 'GET' || this.method === 'HEAD' || this.method === 'DELETE';\n\t}\n\n\t_write(chunk, encoding, callback) {\n\t\t// https://github.com/nodejs/node/blob/654df09ae0c5e17d1b52a900a545f0664d8c7627/lib/internal/http2/util.js#L148-L156\n\t\tif (this._mustNotHaveABody) {\n\t\t\tcallback(new Error('The GET, HEAD and DELETE methods must NOT have a body'));\n\t\t\t/* istanbul ignore next: Node.js 12 throws directly */\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callWrite = () => this._request.write(chunk, encoding, callback);\n\t\tif (this._request) {\n\t\t\tcallWrite();\n\t\t} else {\n\t\t\tthis[kJobs].push(callWrite);\n\t\t}\n\t}\n\n\t_final(callback) {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callEnd = () => {\n\t\t\t// For GET, HEAD and DELETE\n\t\t\tif (this._mustNotHaveABody) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._request.end(callback);\n\t\t};\n\n\t\tif (this._request) {\n\t\t\tcallEnd();\n\t\t} else {\n\t\t\tthis[kJobs].push(callEnd);\n\t\t}\n\t}\n\n\tabort() {\n\t\tif (this.res && this.res.complete) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.aborted) {\n\t\t\tprocess.nextTick(() => this.emit('abort'));\n\t\t}\n\n\t\tthis.aborted = true;\n\n\t\tthis.destroy();\n\t}\n\n\t_destroy(error, callback) {\n\t\tif (this.res) {\n\t\t\tthis.res._dump();\n\t\t}\n\n\t\tif (this._request) {\n\t\t\tthis._request.destroy();\n\t\t}\n\n\t\tcallback(error);\n\t}\n\n\tasync flushHeaders() {\n\t\tif (this[kFlushedHeaders] || this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis[kFlushedHeaders] = true;\n\n\t\tconst isConnectMethod = this.method === HTTP2_METHOD_CONNECT;\n\n\t\t// The real magic is here\n\t\tconst onStream = stream => {\n\t\t\tthis._request = stream;\n\n\t\t\tif (this.destroyed) {\n\t\t\t\tstream.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Forwards `timeout`, `continue`, `close` and `error` events to this instance.\n\t\t\tif (!isConnectMethod) {\n\t\t\t\tproxyEvents(stream, this, ['timeout', 'continue', 'close', 'error']);\n\t\t\t}\n\n\t\t\t// Wait for the `finish` event. We don't want to emit the `response` event\n\t\t\t// before `request.end()` is called.\n\t\t\tconst waitForEnd = fn => {\n\t\t\t\treturn (...args) => {\n\t\t\t\t\tif (!this.writable && !this.destroyed) {\n\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.once('finish', () => {\n\t\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t// This event tells we are ready to listen for the data.\n\t\t\tstream.once('response', waitForEnd((headers, flags, rawHeaders) => {\n\t\t\t\t// If we were to emit raw request stream, it would be as fast as the native approach.\n\t\t\t\t// Note that wrapping the raw stream in a Proxy instance won't improve the performance (already tested it).\n\t\t\t\tconst response = new IncomingMessage(this.socket, stream.readableHighWaterMark);\n\t\t\t\tthis.res = response;\n\n\t\t\t\tresponse.req = this;\n\t\t\t\tresponse.statusCode = headers[HTTP2_HEADER_STATUS];\n\t\t\t\tresponse.headers = headers;\n\t\t\t\tresponse.rawHeaders = rawHeaders;\n\n\t\t\t\tresponse.once('end', () => {\n\t\t\t\t\tif (this.aborted) {\n\t\t\t\t\t\tresponse.aborted = true;\n\t\t\t\t\t\tresponse.emit('aborted');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.complete = true;\n\n\t\t\t\t\t\t// Has no effect, just be consistent with the Node.js behavior\n\t\t\t\t\t\tresponse.socket = null;\n\t\t\t\t\t\tresponse.connection = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (isConnectMethod) {\n\t\t\t\t\tresponse.upgrade = true;\n\n\t\t\t\t\t// The HTTP1 API says the socket is detached here,\n\t\t\t\t\t// but we can't do that so we pass the original HTTP2 request.\n\t\t\t\t\tif (this.emit('connect', response, stream, Buffer.alloc(0))) {\n\t\t\t\t\t\tthis.emit('close');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No listeners attached, destroy the original request.\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Forwards data\n\t\t\t\t\tstream.on('data', chunk => {\n\t\t\t\t\t\tif (!response._dumped && !response.push(chunk)) {\n\t\t\t\t\t\t\tstream.pause();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.once('end', () => {\n\t\t\t\t\t\tresponse.push(null);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!this.emit('response', response)) {\n\t\t\t\t\t\t// No listeners attached, dump the response.\n\t\t\t\t\t\tresponse._dump();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t\t// Emits `information` event\n\t\t\tstream.once('headers', waitForEnd(\n\t\t\t\theaders => this.emit('information', {statusCode: headers[HTTP2_HEADER_STATUS]})\n\t\t\t));\n\n\t\t\tstream.once('trailers', waitForEnd((trailers, flags, rawTrailers) => {\n\t\t\t\tconst {res} = this;\n\n\t\t\t\t// Assigns trailers to the response object.\n\t\t\t\tres.trailers = trailers;\n\t\t\t\tres.rawTrailers = rawTrailers;\n\t\t\t}));\n\n\t\t\tconst {socket} = stream.session;\n\t\t\tthis.socket = socket;\n\t\t\tthis.connection = socket;\n\n\t\t\tfor (const job of this[kJobs]) {\n\t\t\t\tjob();\n\t\t\t}\n\n\t\t\tthis.emit('socket', this.socket);\n\t\t};\n\n\t\t// Makes a HTTP2 request\n\t\tif (this[kSession]) {\n\t\t\ttry {\n\t\t\t\tonStream(this[kSession].request(this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.reusedSocket = true;\n\n\t\t\ttry {\n\t\t\t\tonStream(await this.agent.request(this[kOrigin], this[kOptions], this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\treturn this[kHeaders][name.toLowerCase()];\n\t}\n\n\tget headersSent() {\n\t\treturn this[kFlushedHeaders];\n\t}\n\n\tremoveHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('remove');\n\t\t}\n\n\t\tdelete this[kHeaders][name.toLowerCase()];\n\t}\n\n\tsetHeader(name, value) {\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('set');\n\t\t}\n\n\t\tif (typeof name !== 'string' || (!isValidHttpToken.test(name) && !isRequestPseudoHeader(name))) {\n\t\t\tthrow new ERR_INVALID_HTTP_TOKEN('Header name', name);\n\t\t}\n\n\t\tif (typeof value === 'undefined') {\n\t\t\tthrow new ERR_HTTP_INVALID_HEADER_VALUE(value, name);\n\t\t}\n\n\t\tif (isInvalidHeaderValue.test(value)) {\n\t\t\tthrow new ERR_INVALID_CHAR('header content', name);\n\t\t}\n\n\t\tthis[kHeaders][name.toLowerCase()] = value;\n\t}\n\n\tsetNoDelay() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetSocketKeepAlive() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tconst applyTimeout = () => this._request.setTimeout(ms, callback);\n\n\t\tif (this._request) {\n\t\t\tapplyTimeout();\n\t\t} else {\n\t\t\tthis[kJobs].push(applyTimeout);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tget maxHeadersCount() {\n\t\tif (!this.destroyed && this._request) {\n\t\t\treturn this._request.session.localSettings.maxHeaderListSize;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tset maxHeadersCount(_value) {\n\t\t// Updating HTTP2 settings would affect all requests, do nothing.\n\t}\n}\n\nmodule.exports = ClientRequest;\n", "'use strict';\nconst tls = require('tls');\n\nmodule.exports = (options = {}, connect = tls.connect) => new Promise((resolve, reject) => {\n\tlet timeout = false;\n\n\tlet socket;\n\n\tconst callback = async () => {\n\t\tawait socketPromise;\n\n\t\tsocket.off('timeout', onTimeout);\n\t\tsocket.off('error', reject);\n\n\t\tif (options.resolveSocket) {\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, socket, timeout});\n\n\t\t\tif (timeout) {\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tsocket.emit('timeout');\n\t\t\t}\n\t\t} else {\n\t\t\tsocket.destroy();\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, timeout});\n\t\t}\n\t};\n\n\tconst onTimeout = async () => {\n\t\ttimeout = true;\n\t\tcallback();\n\t};\n\n\tconst socketPromise = (async () => {\n\t\ttry {\n\t\t\tsocket = await connect(options, callback);\n\n\t\t\tsocket.on('error', reject);\n\t\t\tsocket.once('timeout', onTimeout);\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t})();\n});\n", "'use strict';\nconst net = require('net');\n/* istanbul ignore file: https://github.com/nodejs/node/blob/v13.0.1/lib/_http_agent.js */\n\nmodule.exports = options => {\n\tlet servername = options.host;\n\tconst hostHeader = options.headers && options.headers.host;\n\n\tif (hostHeader) {\n\t\tif (hostHeader.startsWith('[')) {\n\t\t\tconst index = hostHeader.indexOf(']');\n\t\t\tif (index === -1) {\n\t\t\t\tservername = hostHeader;\n\t\t\t} else {\n\t\t\t\tservername = hostHeader.slice(1, -1);\n\t\t\t}\n\t\t} else {\n\t\t\tservername = hostHeader.split(':', 1)[0];\n\t\t}\n\t}\n\n\tif (net.isIP(servername)) {\n\t\treturn '';\n\t}\n\n\treturn servername;\n};\n", "'use strict';\nconst http = require('http');\nconst https = require('https');\nconst resolveALPN = require('resolve-alpn');\nconst QuickLRU = require('quick-lru');\nconst Http2ClientRequest = require('./client-request');\nconst calculateServerName = require('./utils/calculate-server-name');\nconst urlToOptions = require('./utils/url-to-options');\n\nconst cache = new QuickLRU({maxSize: 100});\nconst queue = new Map();\n\nconst installSocket = (agent, socket, options) => {\n\tsocket._httpMessage = {shouldKeepAlive: true};\n\n\tconst onFree = () => {\n\t\tagent.emit('free', socket, options);\n\t};\n\n\tsocket.on('free', onFree);\n\n\tconst onClose = () => {\n\t\tagent.removeSocket(socket, options);\n\t};\n\n\tsocket.on('close', onClose);\n\n\tconst onRemove = () => {\n\t\tagent.removeSocket(socket, options);\n\t\tsocket.off('close', onClose);\n\t\tsocket.off('free', onFree);\n\t\tsocket.off('agentRemove', onRemove);\n\t};\n\n\tsocket.on('agentRemove', onRemove);\n\n\tagent.emit('free', socket, options);\n};\n\nconst resolveProtocol = async options => {\n\tconst name = `${options.host}:${options.port}:${options.ALPNProtocols.sort()}`;\n\n\tif (!cache.has(name)) {\n\t\tif (queue.has(name)) {\n\t\t\tconst result = await queue.get(name);\n\t\t\treturn result.alpnProtocol;\n\t\t}\n\n\t\tconst {path, agent} = options;\n\t\toptions.path = options.socketPath;\n\n\t\tconst resultPromise = resolveALPN(options);\n\t\tqueue.set(name, resultPromise);\n\n\t\ttry {\n\t\t\tconst {socket, alpnProtocol} = await resultPromise;\n\t\t\tcache.set(name, alpnProtocol);\n\n\t\t\toptions.path = path;\n\n\t\t\tif (alpnProtocol === 'h2') {\n\t\t\t\t// https://github.com/nodejs/node/issues/33343\n\t\t\t\tsocket.destroy();\n\t\t\t} else {\n\t\t\t\tconst {globalAgent} = https;\n\t\t\t\tconst defaultCreateConnection = https.Agent.prototype.createConnection;\n\n\t\t\t\tif (agent) {\n\t\t\t\t\tif (agent.createConnection === defaultCreateConnection) {\n\t\t\t\t\t\tinstallSocket(agent, socket, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else if (globalAgent.createConnection === defaultCreateConnection) {\n\t\t\t\t\tinstallSocket(globalAgent, socket, options);\n\t\t\t\t} else {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tqueue.delete(name);\n\n\t\t\treturn alpnProtocol;\n\t\t} catch (error) {\n\t\t\tqueue.delete(name);\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\treturn cache.get(name);\n};\n\nmodule.exports = async (input, options, callback) => {\n\tif (typeof input === 'string' || input instanceof URL) {\n\t\tinput = urlToOptions(new URL(input));\n\t}\n\n\tif (typeof options === 'function') {\n\t\tcallback = options;\n\t\toptions = undefined;\n\t}\n\n\toptions = {\n\t\tALPNProtocols: ['h2', 'http/1.1'],\n\t\t...input,\n\t\t...options,\n\t\tresolveSocket: true\n\t};\n\n\tif (!Array.isArray(options.ALPNProtocols) || options.ALPNProtocols.length === 0) {\n\t\tthrow new Error('The `ALPNProtocols` option must be an Array with at least one entry');\n\t}\n\n\toptions.protocol = options.protocol || 'https:';\n\tconst isHttps = options.protocol === 'https:';\n\n\toptions.host = options.hostname || options.host || 'localhost';\n\toptions.session = options.tlsSession;\n\toptions.servername = options.servername || calculateServerName(options);\n\toptions.port = options.port || (isHttps ? 443 : 80);\n\toptions._defaultAgent = isHttps ? https.globalAgent : http.globalAgent;\n\n\tconst agents = options.agent;\n\n\tif (agents) {\n\t\tif (agents.addRequest) {\n\t\t\tthrow new Error('The `options.agent` object can contain only `http`, `https` or `http2` properties');\n\t\t}\n\n\t\toptions.agent = agents[isHttps ? 'https' : 'http'];\n\t}\n\n\tif (isHttps) {\n\t\tconst protocol = await resolveProtocol(options);\n\n\t\tif (protocol === 'h2') {\n\t\t\tif (agents) {\n\t\t\t\toptions.agent = agents.http2;\n\t\t\t}\n\n\t\t\treturn new Http2ClientRequest(options, callback);\n\t\t}\n\t}\n\n\treturn http.request(options, callback);\n};\n\nmodule.exports.protocolCache = cache;\n", "'use strict';\nconst http2 = require('http2');\nconst agent = require('./agent');\nconst ClientRequest = require('./client-request');\nconst IncomingMessage = require('./incoming-message');\nconst auto = require('./auto');\n\nconst request = (url, options, callback) => {\n\treturn new ClientRequest(url, options, callback);\n};\n\nconst get = (url, options, callback) => {\n\t// eslint-disable-next-line unicorn/prevent-abbreviations\n\tconst req = new ClientRequest(url, options, callback);\n\treq.end();\n\n\treturn req;\n};\n\nmodule.exports = {\n\t...http2,\n\tClientRequest,\n\tIncomingMessage,\n\t...agent,\n\trequest,\n\tget,\n\tauto\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (body) => is_1.default.nodeStream(body) && is_1.default.function_(body.getBoundary);\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs_1 = require(\"fs\");\nconst util_1 = require(\"util\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst is_form_data_1 = require(\"./is-form-data\");\nconst statAsync = util_1.promisify(fs_1.stat);\nexports.default = async (body, headers) => {\n if (headers && 'content-length' in headers) {\n return Number(headers['content-length']);\n }\n if (!body) {\n return 0;\n }\n if (is_1.default.string(body)) {\n return Buffer.byteLength(body);\n }\n if (is_1.default.buffer(body)) {\n return body.length;\n }\n if (is_form_data_1.default(body)) {\n return util_1.promisify(body.getLength.bind(body))();\n }\n if (body instanceof fs_1.ReadStream) {\n const { size } = await statAsync(body.path);\n if (size === 0) {\n return undefined;\n }\n return size;\n }\n return undefined;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction default_1(from, to, events) {\n const fns = {};\n for (const event of events) {\n fns[event] = (...args) => {\n to.emit(event, ...args);\n };\n from.on(event, fns[event]);\n }\n return () => {\n for (const event of events) {\n from.off(event, fns[event]);\n }\n };\n}\nexports.default = default_1;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// When attaching listeners, it's very easy to forget about them.\n// Especially if you do error handling and set timeouts.\n// So instead of checking if it's proper to throw an error on every timeout ever,\n// use this simple tool which will remove all listeners you have attached.\nexports.default = () => {\n const handlers = [];\n return {\n once(origin, event, fn) {\n origin.once(event, fn);\n handlers.push({ origin, event, fn });\n },\n unhandleAll() {\n for (const handler of handlers) {\n const { origin, event, fn } = handler;\n origin.removeListener(event, fn);\n }\n handlers.length = 0;\n }\n };\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TimeoutError = void 0;\nconst net = require(\"net\");\nconst unhandle_1 = require(\"./unhandle\");\nconst reentry = Symbol('reentry');\nconst noop = () => { };\nclass TimeoutError extends Error {\n constructor(threshold, event) {\n super(`Timeout awaiting '${event}' for ${threshold}ms`);\n this.event = event;\n this.name = 'TimeoutError';\n this.code = 'ETIMEDOUT';\n }\n}\nexports.TimeoutError = TimeoutError;\nexports.default = (request, delays, options) => {\n if (reentry in request) {\n return noop;\n }\n request[reentry] = true;\n const cancelers = [];\n const { once, unhandleAll } = unhandle_1.default();\n const addTimeout = (delay, callback, event) => {\n var _a;\n const timeout = setTimeout(callback, delay, delay, event);\n (_a = timeout.unref) === null || _a === void 0 ? void 0 : _a.call(timeout);\n const cancel = () => {\n clearTimeout(timeout);\n };\n cancelers.push(cancel);\n return cancel;\n };\n const { host, hostname } = options;\n const timeoutHandler = (delay, event) => {\n request.destroy(new TimeoutError(delay, event));\n };\n const cancelTimeouts = () => {\n for (const cancel of cancelers) {\n cancel();\n }\n unhandleAll();\n };\n request.once('error', error => {\n cancelTimeouts();\n // Save original behavior\n /* istanbul ignore next */\n if (request.listenerCount('error') === 0) {\n throw error;\n }\n });\n request.once('close', cancelTimeouts);\n once(request, 'response', (response) => {\n once(response, 'end', cancelTimeouts);\n });\n if (typeof delays.request !== 'undefined') {\n addTimeout(delays.request, timeoutHandler, 'request');\n }\n if (typeof delays.socket !== 'undefined') {\n const socketTimeoutHandler = () => {\n timeoutHandler(delays.socket, 'socket');\n };\n request.setTimeout(delays.socket, socketTimeoutHandler);\n // `request.setTimeout(0)` causes a memory leak.\n // We can just remove the listener and forget about the timer - it's unreffed.\n // See https://github.com/sindresorhus/got/issues/690\n cancelers.push(() => {\n request.removeListener('timeout', socketTimeoutHandler);\n });\n }\n once(request, 'socket', (socket) => {\n var _a;\n const { socketPath } = request;\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n const hasPath = Boolean(socketPath !== null && socketPath !== void 0 ? socketPath : net.isIP((_a = hostname !== null && hostname !== void 0 ? hostname : host) !== null && _a !== void 0 ? _a : '') !== 0);\n if (typeof delays.lookup !== 'undefined' && !hasPath && typeof socket.address().address === 'undefined') {\n const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup');\n once(socket, 'lookup', cancelTimeout);\n }\n if (typeof delays.connect !== 'undefined') {\n const timeConnect = () => addTimeout(delays.connect, timeoutHandler, 'connect');\n if (hasPath) {\n once(socket, 'connect', timeConnect());\n }\n else {\n once(socket, 'lookup', (error) => {\n if (error === null) {\n once(socket, 'connect', timeConnect());\n }\n });\n }\n }\n if (typeof delays.secureConnect !== 'undefined' && options.protocol === 'https:') {\n once(socket, 'connect', () => {\n const cancelTimeout = addTimeout(delays.secureConnect, timeoutHandler, 'secureConnect');\n once(socket, 'secureConnect', cancelTimeout);\n });\n }\n }\n if (typeof delays.send !== 'undefined') {\n const timeRequest = () => addTimeout(delays.send, timeoutHandler, 'send');\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n once(socket, 'connect', () => {\n once(request, 'upload-complete', timeRequest());\n });\n }\n else {\n once(request, 'upload-complete', timeRequest());\n }\n }\n });\n if (typeof delays.response !== 'undefined') {\n once(request, 'upload-complete', () => {\n const cancelTimeout = addTimeout(delays.response, timeoutHandler, 'response');\n once(request, 'response', cancelTimeout);\n });\n }\n return cancelTimeouts;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (url) => {\n // Cast to URL\n url = url;\n const options = {\n protocol: url.protocol,\n hostname: is_1.default.string(url.hostname) && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n host: url.host,\n hash: url.hash,\n search: url.search,\n pathname: url.pathname,\n href: url.href,\n path: `${url.pathname || ''}${url.search || ''}`\n };\n if (is_1.default.string(url.port) && url.port.length > 0) {\n options.port = Number(url.port);\n }\n if (url.username || url.password) {\n options.auth = `${url.username || ''}:${url.password || ''}`;\n }\n return options;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* istanbul ignore file: deprecated */\nconst url_1 = require(\"url\");\nconst keys = [\n 'protocol',\n 'host',\n 'hostname',\n 'port',\n 'pathname',\n 'search'\n];\nexports.default = (origin, options) => {\n var _a, _b;\n if (options.path) {\n if (options.pathname) {\n throw new TypeError('Parameters `path` and `pathname` are mutually exclusive.');\n }\n if (options.search) {\n throw new TypeError('Parameters `path` and `search` are mutually exclusive.');\n }\n if (options.searchParams) {\n throw new TypeError('Parameters `path` and `searchParams` are mutually exclusive.');\n }\n }\n if (options.search && options.searchParams) {\n throw new TypeError('Parameters `search` and `searchParams` are mutually exclusive.');\n }\n if (!origin) {\n if (!options.protocol) {\n throw new TypeError('No URL protocol specified');\n }\n origin = `${options.protocol}//${(_b = (_a = options.hostname) !== null && _a !== void 0 ? _a : options.host) !== null && _b !== void 0 ? _b : ''}`;\n }\n const url = new url_1.URL(origin);\n if (options.path) {\n const searchIndex = options.path.indexOf('?');\n if (searchIndex === -1) {\n options.pathname = options.path;\n }\n else {\n options.pathname = options.path.slice(0, searchIndex);\n options.search = options.path.slice(searchIndex + 1);\n }\n delete options.path;\n }\n for (const key of keys) {\n if (options[key]) {\n url[key] = options[key].toString();\n }\n }\n return url;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass WeakableMap {\n constructor() {\n this.weakMap = new WeakMap();\n this.map = new Map();\n }\n set(key, value) {\n if (typeof key === 'object') {\n this.weakMap.set(key, value);\n }\n else {\n this.map.set(key, value);\n }\n }\n get(key) {\n if (typeof key === 'object') {\n return this.weakMap.get(key);\n }\n return this.map.get(key);\n }\n has(key) {\n if (typeof key === 'object') {\n return this.weakMap.has(key);\n }\n return this.map.has(key);\n }\n}\nexports.default = WeakableMap;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// TODO: Update https://github.com/sindresorhus/get-stream\nconst getBuffer = async (stream) => {\n const chunks = [];\n let length = 0;\n for await (const chunk of stream) {\n chunks.push(chunk);\n length += Buffer.byteLength(chunk);\n }\n if (Buffer.isBuffer(chunks[0])) {\n return Buffer.concat(chunks, length);\n }\n return Buffer.from(chunks.join(''));\n};\nexports.default = getBuffer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dnsLookupIpVersionToFamily = exports.isDnsLookupIpVersion = void 0;\nconst conversionTable = {\n auto: 0,\n ipv4: 4,\n ipv6: 6\n};\nexports.isDnsLookupIpVersion = (value) => {\n return value in conversionTable;\n};\nexports.dnsLookupIpVersionToFamily = (dnsLookupIpVersion) => {\n if (exports.isDnsLookupIpVersion(dnsLookupIpVersion)) {\n return conversionTable[dnsLookupIpVersion];\n }\n throw new Error('Invalid DNS lookup IP version');\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isResponseOk = void 0;\nexports.isResponseOk = (response) => {\n const { statusCode } = response;\n const limitStatusCode = response.request.options.followRedirect ? 299 : 399;\n return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst alreadyWarned = new Set();\nexports.default = (message) => {\n if (alreadyWarned.has(message)) {\n return;\n }\n alreadyWarned.add(message);\n // @ts-expect-error Missing types.\n process.emitWarning(`Got: ${message}`, {\n type: 'DeprecationWarning'\n });\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nconst normalizeArguments = (options, defaults) => {\n if (is_1.default.null_(options.encoding)) {\n throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead');\n }\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.encoding);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.resolveBodyOnly);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.methodRewriting);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.isStream);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.responseType);\n // `options.responseType`\n if (options.responseType === undefined) {\n options.responseType = 'text';\n }\n // `options.retry`\n const { retry } = options;\n if (defaults) {\n options.retry = { ...defaults.retry };\n }\n else {\n options.retry = {\n calculateDelay: retryObject => retryObject.computedValue,\n limit: 0,\n methods: [],\n statusCodes: [],\n errorCodes: [],\n maxRetryAfter: undefined\n };\n }\n if (is_1.default.object(retry)) {\n options.retry = {\n ...options.retry,\n ...retry\n };\n options.retry.methods = [...new Set(options.retry.methods.map(method => method.toUpperCase()))];\n options.retry.statusCodes = [...new Set(options.retry.statusCodes)];\n options.retry.errorCodes = [...new Set(options.retry.errorCodes)];\n }\n else if (is_1.default.number(retry)) {\n options.retry.limit = retry;\n }\n if (is_1.default.undefined(options.retry.maxRetryAfter)) {\n options.retry.maxRetryAfter = Math.min(\n // TypeScript is not smart enough to handle `.filter(x => is.number(x))`.\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n ...[options.timeout.request, options.timeout.connect].filter(is_1.default.number));\n }\n // `options.pagination`\n if (is_1.default.object(options.pagination)) {\n if (defaults) {\n options.pagination = {\n ...defaults.pagination,\n ...options.pagination\n };\n }\n const { pagination } = options;\n if (!is_1.default.function_(pagination.transform)) {\n throw new Error('`options.pagination.transform` must be implemented');\n }\n if (!is_1.default.function_(pagination.shouldContinue)) {\n throw new Error('`options.pagination.shouldContinue` must be implemented');\n }\n if (!is_1.default.function_(pagination.filter)) {\n throw new TypeError('`options.pagination.filter` must be implemented');\n }\n if (!is_1.default.function_(pagination.paginate)) {\n throw new Error('`options.pagination.paginate` must be implemented');\n }\n }\n // JSON mode\n if (options.responseType === 'json' && options.headers.accept === undefined) {\n options.headers.accept = 'application/json';\n }\n return options;\n};\nexports.default = normalizeArguments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryAfterStatusCodes = void 0;\nexports.retryAfterStatusCodes = new Set([413, 429, 503]);\nconst calculateRetryDelay = ({ attemptCount, retryOptions, error, retryAfter }) => {\n if (attemptCount > retryOptions.limit) {\n return 0;\n }\n const hasMethod = retryOptions.methods.includes(error.options.method);\n const hasErrorCode = retryOptions.errorCodes.includes(error.code);\n const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode);\n if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {\n return 0;\n }\n if (error.response) {\n if (retryAfter) {\n if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) {\n return 0;\n }\n return retryAfter;\n }\n if (error.response.statusCode === 413) {\n return 0;\n }\n }\n const noise = Math.random() * 100;\n return ((2 ** (attemptCount - 1)) * 1000) + noise;\n};\nexports.default = calculateRetryDelay;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnsupportedProtocolError = exports.ReadError = exports.TimeoutError = exports.UploadError = exports.CacheError = exports.HTTPError = exports.MaxRedirectsError = exports.RequestError = exports.setNonEnumerableProperties = exports.knownHookEvents = exports.withoutBody = exports.kIsNormalizedAlready = void 0;\nconst util_1 = require(\"util\");\nconst stream_1 = require(\"stream\");\nconst fs_1 = require(\"fs\");\nconst url_1 = require(\"url\");\nconst http = require(\"http\");\nconst http_1 = require(\"http\");\nconst https = require(\"https\");\nconst http_timer_1 = require(\"@szmarczak/http-timer\");\nconst cacheable_lookup_1 = require(\"cacheable-lookup\");\nconst CacheableRequest = require(\"cacheable-request\");\nconst decompressResponse = require(\"decompress-response\");\n// @ts-expect-error Missing types\nconst http2wrapper = require(\"http2-wrapper\");\nconst lowercaseKeys = require(\"lowercase-keys\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst get_body_size_1 = require(\"./utils/get-body-size\");\nconst is_form_data_1 = require(\"./utils/is-form-data\");\nconst proxy_events_1 = require(\"./utils/proxy-events\");\nconst timed_out_1 = require(\"./utils/timed-out\");\nconst url_to_options_1 = require(\"./utils/url-to-options\");\nconst options_to_url_1 = require(\"./utils/options-to-url\");\nconst weakable_map_1 = require(\"./utils/weakable-map\");\nconst get_buffer_1 = require(\"./utils/get-buffer\");\nconst dns_ip_version_1 = require(\"./utils/dns-ip-version\");\nconst is_response_ok_1 = require(\"./utils/is-response-ok\");\nconst deprecation_warning_1 = require(\"../utils/deprecation-warning\");\nconst normalize_arguments_1 = require(\"../as-promise/normalize-arguments\");\nconst calculate_retry_delay_1 = require(\"./calculate-retry-delay\");\nlet globalDnsCache;\nconst kRequest = Symbol('request');\nconst kResponse = Symbol('response');\nconst kResponseSize = Symbol('responseSize');\nconst kDownloadedSize = Symbol('downloadedSize');\nconst kBodySize = Symbol('bodySize');\nconst kUploadedSize = Symbol('uploadedSize');\nconst kServerResponsesPiped = Symbol('serverResponsesPiped');\nconst kUnproxyEvents = Symbol('unproxyEvents');\nconst kIsFromCache = Symbol('isFromCache');\nconst kCancelTimeouts = Symbol('cancelTimeouts');\nconst kStartedReading = Symbol('startedReading');\nconst kStopReading = Symbol('stopReading');\nconst kTriggerRead = Symbol('triggerRead');\nconst kBody = Symbol('body');\nconst kJobs = Symbol('jobs');\nconst kOriginalResponse = Symbol('originalResponse');\nconst kRetryTimeout = Symbol('retryTimeout');\nexports.kIsNormalizedAlready = Symbol('isNormalizedAlready');\nconst supportsBrotli = is_1.default.string(process.versions.brotli);\nexports.withoutBody = new Set(['GET', 'HEAD']);\nexports.knownHookEvents = [\n 'init',\n 'beforeRequest',\n 'beforeRedirect',\n 'beforeError',\n 'beforeRetry',\n // Promise-Only\n 'afterResponse'\n];\nfunction validateSearchParameters(searchParameters) {\n // eslint-disable-next-line guard-for-in\n for (const key in searchParameters) {\n const value = searchParameters[key];\n if (!is_1.default.string(value) && !is_1.default.number(value) && !is_1.default.boolean(value) && !is_1.default.null_(value) && !is_1.default.undefined(value)) {\n throw new TypeError(`The \\`searchParams\\` value '${String(value)}' must be a string, number, boolean or null`);\n }\n }\n}\nfunction isClientRequest(clientRequest) {\n return is_1.default.object(clientRequest) && !('statusCode' in clientRequest);\n}\nconst cacheableStore = new weakable_map_1.default();\nconst waitForOpenFile = async (file) => new Promise((resolve, reject) => {\n const onError = (error) => {\n reject(error);\n };\n // Node.js 12 has incomplete types\n if (!file.pending) {\n resolve();\n }\n file.once('error', onError);\n file.once('ready', () => {\n file.off('error', onError);\n resolve();\n });\n});\nconst redirectCodes = new Set([300, 301, 302, 303, 304, 307, 308]);\nconst nonEnumerableProperties = [\n 'context',\n 'body',\n 'json',\n 'form'\n];\nexports.setNonEnumerableProperties = (sources, to) => {\n // Non enumerable properties shall not be merged\n const properties = {};\n for (const source of sources) {\n if (!source) {\n continue;\n }\n for (const name of nonEnumerableProperties) {\n if (!(name in source)) {\n continue;\n }\n properties[name] = {\n writable: true,\n configurable: true,\n enumerable: false,\n // @ts-expect-error TS doesn't see the check above\n value: source[name]\n };\n }\n }\n Object.defineProperties(to, properties);\n};\n/**\nAn error to be thrown when a request fails.\nContains a `code` property with error class code, like `ECONNREFUSED`.\n*/\nclass RequestError extends Error {\n constructor(message, error, self) {\n var _a;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n this.name = 'RequestError';\n this.code = error.code;\n if (self instanceof Request) {\n Object.defineProperty(this, 'request', {\n enumerable: false,\n value: self\n });\n Object.defineProperty(this, 'response', {\n enumerable: false,\n value: self[kResponse]\n });\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self.options\n });\n }\n else {\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self\n });\n }\n this.timings = (_a = this.request) === null || _a === void 0 ? void 0 : _a.timings;\n // Recover the original stacktrace\n if (is_1.default.string(error.stack) && is_1.default.string(this.stack)) {\n const indexOfMessage = this.stack.indexOf(this.message) + this.message.length;\n const thisStackTrace = this.stack.slice(indexOfMessage).split('\\n').reverse();\n const errorStackTrace = error.stack.slice(error.stack.indexOf(error.message) + error.message.length).split('\\n').reverse();\n // Remove duplicated traces\n while (errorStackTrace.length !== 0 && errorStackTrace[0] === thisStackTrace[0]) {\n thisStackTrace.shift();\n }\n this.stack = `${this.stack.slice(0, indexOfMessage)}${thisStackTrace.reverse().join('\\n')}${errorStackTrace.reverse().join('\\n')}`;\n }\n }\n}\nexports.RequestError = RequestError;\n/**\nAn error to be thrown when the server redirects you more than ten times.\nIncludes a `response` property.\n*/\nclass MaxRedirectsError extends RequestError {\n constructor(request) {\n super(`Redirected ${request.options.maxRedirects} times. Aborting.`, {}, request);\n this.name = 'MaxRedirectsError';\n }\n}\nexports.MaxRedirectsError = MaxRedirectsError;\n/**\nAn error to be thrown when the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304.\nIncludes a `response` property.\n*/\nclass HTTPError extends RequestError {\n constructor(response) {\n super(`Response code ${response.statusCode} (${response.statusMessage})`, {}, response.request);\n this.name = 'HTTPError';\n }\n}\nexports.HTTPError = HTTPError;\n/**\nAn error to be thrown when a cache method fails.\nFor example, if the database goes down or there's a filesystem error.\n*/\nclass CacheError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'CacheError';\n }\n}\nexports.CacheError = CacheError;\n/**\nAn error to be thrown when the request body is a stream and an error occurs while reading from that stream.\n*/\nclass UploadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'UploadError';\n }\n}\nexports.UploadError = UploadError;\n/**\nAn error to be thrown when the request is aborted due to a timeout.\nIncludes an `event` and `timings` property.\n*/\nclass TimeoutError extends RequestError {\n constructor(error, timings, request) {\n super(error.message, error, request);\n this.name = 'TimeoutError';\n this.event = error.event;\n this.timings = timings;\n }\n}\nexports.TimeoutError = TimeoutError;\n/**\nAn error to be thrown when reading from response stream fails.\n*/\nclass ReadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'ReadError';\n }\n}\nexports.ReadError = ReadError;\n/**\nAn error to be thrown when given an unsupported protocol.\n*/\nclass UnsupportedProtocolError extends RequestError {\n constructor(options) {\n super(`Unsupported protocol \"${options.url.protocol}\"`, {}, options);\n this.name = 'UnsupportedProtocolError';\n }\n}\nexports.UnsupportedProtocolError = UnsupportedProtocolError;\nconst proxiedRequestEvents = [\n 'socket',\n 'connect',\n 'continue',\n 'information',\n 'upgrade',\n 'timeout'\n];\nclass Request extends stream_1.Duplex {\n constructor(url, options = {}, defaults) {\n super({\n // This must be false, to enable throwing after destroy\n // It is used for retry logic in Promise API\n autoDestroy: false,\n // It needs to be zero because we're just proxying the data to another stream\n highWaterMark: 0\n });\n this[kDownloadedSize] = 0;\n this[kUploadedSize] = 0;\n this.requestInitialized = false;\n this[kServerResponsesPiped] = new Set();\n this.redirects = [];\n this[kStopReading] = false;\n this[kTriggerRead] = false;\n this[kJobs] = [];\n this.retryCount = 0;\n // TODO: Remove this when targeting Node.js >= 12\n this._progressCallbacks = [];\n const unlockWrite = () => this._unlockWrite();\n const lockWrite = () => this._lockWrite();\n this.on('pipe', (source) => {\n source.prependListener('data', unlockWrite);\n source.on('data', lockWrite);\n source.prependListener('end', unlockWrite);\n source.on('end', lockWrite);\n });\n this.on('unpipe', (source) => {\n source.off('data', unlockWrite);\n source.off('data', lockWrite);\n source.off('end', unlockWrite);\n source.off('end', lockWrite);\n });\n this.on('pipe', source => {\n if (source instanceof http_1.IncomingMessage) {\n this.options.headers = {\n ...source.headers,\n ...this.options.headers\n };\n }\n });\n const { json, body, form } = options;\n if (json || body || form) {\n this._lockWrite();\n }\n if (exports.kIsNormalizedAlready in options) {\n this.options = options;\n }\n else {\n try {\n // @ts-expect-error Common TypeScript bug saying that `this.constructor` is not accessible\n this.options = this.constructor.normalizeArguments(url, options, defaults);\n }\n catch (error) {\n // TODO: Move this to `_destroy()`\n if (is_1.default.nodeStream(options.body)) {\n options.body.destroy();\n }\n this.destroy(error);\n return;\n }\n }\n (async () => {\n var _a;\n try {\n if (this.options.body instanceof fs_1.ReadStream) {\n await waitForOpenFile(this.options.body);\n }\n const { url: normalizedURL } = this.options;\n if (!normalizedURL) {\n throw new TypeError('Missing `url` property');\n }\n this.requestUrl = normalizedURL.toString();\n decodeURI(this.requestUrl);\n await this._finalizeBody();\n await this._makeRequest();\n if (this.destroyed) {\n (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroy();\n return;\n }\n // Queued writes etc.\n for (const job of this[kJobs]) {\n job();\n }\n // Prevent memory leak\n this[kJobs].length = 0;\n this.requestInitialized = true;\n }\n catch (error) {\n if (error instanceof RequestError) {\n this._beforeError(error);\n return;\n }\n // This is a workaround for https://github.com/nodejs/node/issues/33335\n if (!this.destroyed) {\n this.destroy(error);\n }\n }\n })();\n }\n static normalizeArguments(url, options, defaults) {\n var _a, _b, _c, _d, _e;\n const rawOptions = options;\n if (is_1.default.object(url) && !is_1.default.urlInstance(url)) {\n options = { ...defaults, ...url, ...options };\n }\n else {\n if (url && options && options.url !== undefined) {\n throw new TypeError('The `url` option is mutually exclusive with the `input` argument');\n }\n options = { ...defaults, ...options };\n if (url !== undefined) {\n options.url = url;\n }\n if (is_1.default.urlInstance(options.url)) {\n options.url = new url_1.URL(options.url.toString());\n }\n }\n // TODO: Deprecate URL options in Got 12.\n // Support extend-specific options\n if (options.cache === false) {\n options.cache = undefined;\n }\n if (options.dnsCache === false) {\n options.dnsCache = undefined;\n }\n // Nice type assertions\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.method);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.headers);\n is_1.assert.any([is_1.default.string, is_1.default.urlInstance, is_1.default.undefined], options.prefixUrl);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cookieJar);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.searchParams);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.cache);\n is_1.assert.any([is_1.default.object, is_1.default.number, is_1.default.undefined], options.timeout);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.context);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.hooks);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.decompress);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.ignoreInvalidCookies);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.followRedirect);\n is_1.assert.any([is_1.default.number, is_1.default.undefined], options.maxRedirects);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.throwHttpErrors);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.http2);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.allowGetBody);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.localAddress);\n is_1.assert.any([dns_ip_version_1.isDnsLookupIpVersion, is_1.default.undefined], options.dnsLookupIpVersion);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.https);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.rejectUnauthorized);\n if (options.https) {\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.https.rejectUnauthorized);\n is_1.assert.any([is_1.default.function_, is_1.default.undefined], options.https.checkServerIdentity);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificateAuthority);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.key);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificate);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.https.passphrase);\n is_1.assert.any([is_1.default.string, is_1.default.buffer, is_1.default.array, is_1.default.undefined], options.https.pfx);\n }\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cacheOptions);\n // `options.method`\n if (is_1.default.string(options.method)) {\n options.method = options.method.toUpperCase();\n }\n else {\n options.method = 'GET';\n }\n // `options.headers`\n if (options.headers === (defaults === null || defaults === void 0 ? void 0 : defaults.headers)) {\n options.headers = { ...options.headers };\n }\n else {\n options.headers = lowercaseKeys({ ...(defaults === null || defaults === void 0 ? void 0 : defaults.headers), ...options.headers });\n }\n // Disallow legacy `url.Url`\n if ('slashes' in options) {\n throw new TypeError('The legacy `url.Url` has been deprecated. Use `URL` instead.');\n }\n // `options.auth`\n if ('auth' in options) {\n throw new TypeError('Parameter `auth` is deprecated. Use `username` / `password` instead.');\n }\n // `options.searchParams`\n if ('searchParams' in options) {\n if (options.searchParams && options.searchParams !== (defaults === null || defaults === void 0 ? void 0 : defaults.searchParams)) {\n let searchParameters;\n if (is_1.default.string(options.searchParams) || (options.searchParams instanceof url_1.URLSearchParams)) {\n searchParameters = new url_1.URLSearchParams(options.searchParams);\n }\n else {\n validateSearchParameters(options.searchParams);\n searchParameters = new url_1.URLSearchParams();\n // eslint-disable-next-line guard-for-in\n for (const key in options.searchParams) {\n const value = options.searchParams[key];\n if (value === null) {\n searchParameters.append(key, '');\n }\n else if (value !== undefined) {\n searchParameters.append(key, value);\n }\n }\n }\n // `normalizeArguments()` is also used to merge options\n (_a = defaults === null || defaults === void 0 ? void 0 : defaults.searchParams) === null || _a === void 0 ? void 0 : _a.forEach((value, key) => {\n // Only use default if one isn't already defined\n if (!searchParameters.has(key)) {\n searchParameters.append(key, value);\n }\n });\n options.searchParams = searchParameters;\n }\n }\n // `options.username` & `options.password`\n options.username = (_b = options.username) !== null && _b !== void 0 ? _b : '';\n options.password = (_c = options.password) !== null && _c !== void 0 ? _c : '';\n // `options.prefixUrl` & `options.url`\n if (is_1.default.undefined(options.prefixUrl)) {\n options.prefixUrl = (_d = defaults === null || defaults === void 0 ? void 0 : defaults.prefixUrl) !== null && _d !== void 0 ? _d : '';\n }\n else {\n options.prefixUrl = options.prefixUrl.toString();\n if (options.prefixUrl !== '' && !options.prefixUrl.endsWith('/')) {\n options.prefixUrl += '/';\n }\n }\n if (is_1.default.string(options.url)) {\n if (options.url.startsWith('/')) {\n throw new Error('`input` must not start with a slash when using `prefixUrl`');\n }\n options.url = options_to_url_1.default(options.prefixUrl + options.url, options);\n }\n else if ((is_1.default.undefined(options.url) && options.prefixUrl !== '') || options.protocol) {\n options.url = options_to_url_1.default(options.prefixUrl, options);\n }\n if (options.url) {\n if ('port' in options) {\n delete options.port;\n }\n // Make it possible to change `options.prefixUrl`\n let { prefixUrl } = options;\n Object.defineProperty(options, 'prefixUrl', {\n set: (value) => {\n const url = options.url;\n if (!url.href.startsWith(value)) {\n throw new Error(`Cannot change \\`prefixUrl\\` from ${prefixUrl} to ${value}: ${url.href}`);\n }\n options.url = new url_1.URL(value + url.href.slice(prefixUrl.length));\n prefixUrl = value;\n },\n get: () => prefixUrl\n });\n // Support UNIX sockets\n let { protocol } = options.url;\n if (protocol === 'unix:') {\n protocol = 'http:';\n options.url = new url_1.URL(`http://unix${options.url.pathname}${options.url.search}`);\n }\n // Set search params\n if (options.searchParams) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n options.url.search = options.searchParams.toString();\n }\n // Protocol check\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw new UnsupportedProtocolError(options);\n }\n // Update `username`\n if (options.username === '') {\n options.username = options.url.username;\n }\n else {\n options.url.username = options.username;\n }\n // Update `password`\n if (options.password === '') {\n options.password = options.url.password;\n }\n else {\n options.url.password = options.password;\n }\n }\n // `options.cookieJar`\n const { cookieJar } = options;\n if (cookieJar) {\n let { setCookie, getCookieString } = cookieJar;\n is_1.assert.function_(setCookie);\n is_1.assert.function_(getCookieString);\n /* istanbul ignore next: Horrible `tough-cookie` v3 check */\n if (setCookie.length === 4 && getCookieString.length === 0) {\n setCookie = util_1.promisify(setCookie.bind(options.cookieJar));\n getCookieString = util_1.promisify(getCookieString.bind(options.cookieJar));\n options.cookieJar = {\n setCookie,\n getCookieString: getCookieString\n };\n }\n }\n // `options.cache`\n const { cache } = options;\n if (cache) {\n if (!cacheableStore.has(cache)) {\n cacheableStore.set(cache, new CacheableRequest(((requestOptions, handler) => {\n const result = requestOptions[kRequest](requestOptions, handler);\n // TODO: remove this when `cacheable-request` supports async request functions.\n if (is_1.default.promise(result)) {\n // @ts-expect-error\n // We only need to implement the error handler in order to support HTTP2 caching.\n // The result will be a promise anyway.\n result.once = (event, handler) => {\n if (event === 'error') {\n result.catch(handler);\n }\n else if (event === 'abort') {\n // The empty catch is needed here in case when\n // it rejects before it's `await`ed in `_makeRequest`.\n (async () => {\n try {\n const request = (await result);\n request.once('abort', handler);\n }\n catch (_a) { }\n })();\n }\n else {\n /* istanbul ignore next: safety check */\n throw new Error(`Unknown HTTP2 promise event: ${event}`);\n }\n return result;\n };\n }\n return result;\n }), cache));\n }\n }\n // `options.cacheOptions`\n options.cacheOptions = { ...options.cacheOptions };\n // `options.dnsCache`\n if (options.dnsCache === true) {\n if (!globalDnsCache) {\n globalDnsCache = new cacheable_lookup_1.default();\n }\n options.dnsCache = globalDnsCache;\n }\n else if (!is_1.default.undefined(options.dnsCache) && !options.dnsCache.lookup) {\n throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${is_1.default(options.dnsCache)}`);\n }\n // `options.timeout`\n if (is_1.default.number(options.timeout)) {\n options.timeout = { request: options.timeout };\n }\n else if (defaults && options.timeout !== defaults.timeout) {\n options.timeout = {\n ...defaults.timeout,\n ...options.timeout\n };\n }\n else {\n options.timeout = { ...options.timeout };\n }\n // `options.context`\n if (!options.context) {\n options.context = {};\n }\n // `options.hooks`\n const areHooksDefault = options.hooks === (defaults === null || defaults === void 0 ? void 0 : defaults.hooks);\n options.hooks = { ...options.hooks };\n for (const event of exports.knownHookEvents) {\n if (event in options.hooks) {\n if (is_1.default.array(options.hooks[event])) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [...options.hooks[event]];\n }\n else {\n throw new TypeError(`Parameter \\`${event}\\` must be an Array, got ${is_1.default(options.hooks[event])}`);\n }\n }\n else {\n options.hooks[event] = [];\n }\n }\n if (defaults && !areHooksDefault) {\n for (const event of exports.knownHookEvents) {\n const defaultHooks = defaults.hooks[event];\n if (defaultHooks.length > 0) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [\n ...defaults.hooks[event],\n ...options.hooks[event]\n ];\n }\n }\n }\n // DNS options\n if ('family' in options) {\n deprecation_warning_1.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"');\n }\n // HTTPS options\n if (defaults === null || defaults === void 0 ? void 0 : defaults.https) {\n options.https = { ...defaults.https, ...options.https };\n }\n if ('rejectUnauthorized' in options) {\n deprecation_warning_1.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"');\n }\n if ('checkServerIdentity' in options) {\n deprecation_warning_1.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"');\n }\n if ('ca' in options) {\n deprecation_warning_1.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"');\n }\n if ('key' in options) {\n deprecation_warning_1.default('\"options.key\" was never documented, please use \"options.https.key\"');\n }\n if ('cert' in options) {\n deprecation_warning_1.default('\"options.cert\" was never documented, please use \"options.https.certificate\"');\n }\n if ('passphrase' in options) {\n deprecation_warning_1.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"');\n }\n if ('pfx' in options) {\n deprecation_warning_1.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"');\n }\n // Other options\n if ('followRedirects' in options) {\n throw new TypeError('The `followRedirects` option does not exist. Use `followRedirect` instead.');\n }\n if (options.agent) {\n for (const key in options.agent) {\n if (key !== 'http' && key !== 'https' && key !== 'http2') {\n throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${key}\\``);\n }\n }\n }\n options.maxRedirects = (_e = options.maxRedirects) !== null && _e !== void 0 ? _e : 0;\n // Set non-enumerable properties\n exports.setNonEnumerableProperties([defaults, rawOptions], options);\n return normalize_arguments_1.default(options, defaults);\n }\n _lockWrite() {\n const onLockedWrite = () => {\n throw new TypeError('The payload has been already provided');\n };\n this.write = onLockedWrite;\n this.end = onLockedWrite;\n }\n _unlockWrite() {\n this.write = super.write;\n this.end = super.end;\n }\n async _finalizeBody() {\n const { options } = this;\n const { headers } = options;\n const isForm = !is_1.default.undefined(options.form);\n const isJSON = !is_1.default.undefined(options.json);\n const isBody = !is_1.default.undefined(options.body);\n const hasPayload = isForm || isJSON || isBody;\n const cannotHaveBody = exports.withoutBody.has(options.method) && !(options.method === 'GET' && options.allowGetBody);\n this._cannotHaveBody = cannotHaveBody;\n if (hasPayload) {\n if (cannotHaveBody) {\n throw new TypeError(`The \\`${options.method}\\` method cannot be used with a body`);\n }\n if ([isBody, isForm, isJSON].filter(isTrue => isTrue).length > 1) {\n throw new TypeError('The `body`, `json` and `form` options are mutually exclusive');\n }\n if (isBody &&\n !(options.body instanceof stream_1.Readable) &&\n !is_1.default.string(options.body) &&\n !is_1.default.buffer(options.body) &&\n !is_form_data_1.default(options.body)) {\n throw new TypeError('The `body` option must be a stream.Readable, string or Buffer');\n }\n if (isForm && !is_1.default.object(options.form)) {\n throw new TypeError('The `form` option must be an Object');\n }\n {\n // Serialize body\n const noContentType = !is_1.default.string(headers['content-type']);\n if (isBody) {\n // Special case for https://github.com/form-data/form-data\n if (is_form_data_1.default(options.body) && noContentType) {\n headers['content-type'] = `multipart/form-data; boundary=${options.body.getBoundary()}`;\n }\n this[kBody] = options.body;\n }\n else if (isForm) {\n if (noContentType) {\n headers['content-type'] = 'application/x-www-form-urlencoded';\n }\n this[kBody] = (new url_1.URLSearchParams(options.form)).toString();\n }\n else {\n if (noContentType) {\n headers['content-type'] = 'application/json';\n }\n this[kBody] = options.stringifyJson(options.json);\n }\n const uploadBodySize = await get_body_size_1.default(this[kBody], options.headers);\n // See https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body. For example, a Content-Length header\n // field is normally sent in a POST request even when the value is 0\n // (indicating an empty payload body). A user agent SHOULD NOT send a\n // Content-Length header field when the request message does not contain\n // a payload body and the method semantics do not anticipate such a\n // body.\n if (is_1.default.undefined(headers['content-length']) && is_1.default.undefined(headers['transfer-encoding'])) {\n if (!cannotHaveBody && !is_1.default.undefined(uploadBodySize)) {\n headers['content-length'] = String(uploadBodySize);\n }\n }\n }\n }\n else if (cannotHaveBody) {\n this._lockWrite();\n }\n else {\n this._unlockWrite();\n }\n this[kBodySize] = Number(headers['content-length']) || undefined;\n }\n async _onResponseBase(response) {\n const { options } = this;\n const { url } = options;\n this[kOriginalResponse] = response;\n if (options.decompress) {\n response = decompressResponse(response);\n }\n const statusCode = response.statusCode;\n const typedResponse = response;\n typedResponse.statusMessage = typedResponse.statusMessage ? typedResponse.statusMessage : http.STATUS_CODES[statusCode];\n typedResponse.url = options.url.toString();\n typedResponse.requestUrl = this.requestUrl;\n typedResponse.redirectUrls = this.redirects;\n typedResponse.request = this;\n typedResponse.isFromCache = response.fromCache || false;\n typedResponse.ip = this.ip;\n typedResponse.retryCount = this.retryCount;\n this[kIsFromCache] = typedResponse.isFromCache;\n this[kResponseSize] = Number(response.headers['content-length']) || undefined;\n this[kResponse] = response;\n response.once('end', () => {\n this[kResponseSize] = this[kDownloadedSize];\n this.emit('downloadProgress', this.downloadProgress);\n });\n response.once('error', (error) => {\n // Force clean-up, because some packages don't do this.\n // TODO: Fix decompress-response\n response.destroy();\n this._beforeError(new ReadError(error, this));\n });\n response.once('aborted', () => {\n this._beforeError(new ReadError({\n name: 'Error',\n message: 'The server aborted pending request',\n code: 'ECONNRESET'\n }, this));\n });\n this.emit('downloadProgress', this.downloadProgress);\n const rawCookies = response.headers['set-cookie'];\n if (is_1.default.object(options.cookieJar) && rawCookies) {\n let promises = rawCookies.map(async (rawCookie) => options.cookieJar.setCookie(rawCookie, url.toString()));\n if (options.ignoreInvalidCookies) {\n promises = promises.map(async (p) => p.catch(() => { }));\n }\n try {\n await Promise.all(promises);\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n }\n if (options.followRedirect && response.headers.location && redirectCodes.has(statusCode)) {\n // We're being redirected, we don't care about the response.\n // It'd be best to abort the request, but we can't because\n // we would have to sacrifice the TCP connection. We don't want that.\n response.resume();\n if (this[kRequest]) {\n this[kCancelTimeouts]();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this[kRequest];\n this[kUnproxyEvents]();\n }\n const shouldBeGet = statusCode === 303 && options.method !== 'GET' && options.method !== 'HEAD';\n if (shouldBeGet || !options.methodRewriting) {\n // Server responded with \"see other\", indicating that the resource exists at another location,\n // and the client should request it from that location via GET or HEAD.\n options.method = 'GET';\n if ('body' in options) {\n delete options.body;\n }\n if ('json' in options) {\n delete options.json;\n }\n if ('form' in options) {\n delete options.form;\n }\n this[kBody] = undefined;\n delete options.headers['content-length'];\n }\n if (this.redirects.length >= options.maxRedirects) {\n this._beforeError(new MaxRedirectsError(this));\n return;\n }\n try {\n // Do not remove. See https://github.com/sindresorhus/got/pull/214\n const redirectBuffer = Buffer.from(response.headers.location, 'binary').toString();\n // Handles invalid URLs. See https://github.com/sindresorhus/got/issues/604\n const redirectUrl = new url_1.URL(redirectBuffer, url);\n const redirectString = redirectUrl.toString();\n decodeURI(redirectString);\n // Redirecting to a different site, clear sensitive data.\n if (redirectUrl.hostname !== url.hostname || redirectUrl.port !== url.port) {\n if ('host' in options.headers) {\n delete options.headers.host;\n }\n if ('cookie' in options.headers) {\n delete options.headers.cookie;\n }\n if ('authorization' in options.headers) {\n delete options.headers.authorization;\n }\n if (options.username || options.password) {\n options.username = '';\n options.password = '';\n }\n }\n else {\n redirectUrl.username = options.username;\n redirectUrl.password = options.password;\n }\n this.redirects.push(redirectString);\n options.url = redirectUrl;\n for (const hook of options.hooks.beforeRedirect) {\n // eslint-disable-next-line no-await-in-loop\n await hook(options, typedResponse);\n }\n this.emit('redirect', typedResponse, options);\n await this._makeRequest();\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n return;\n }\n if (options.isStream && options.throwHttpErrors && !is_response_ok_1.isResponseOk(typedResponse)) {\n this._beforeError(new HTTPError(typedResponse));\n return;\n }\n response.on('readable', () => {\n if (this[kTriggerRead]) {\n this._read();\n }\n });\n this.on('resume', () => {\n response.resume();\n });\n this.on('pause', () => {\n response.pause();\n });\n response.once('end', () => {\n this.push(null);\n });\n this.emit('response', response);\n for (const destination of this[kServerResponsesPiped]) {\n if (destination.headersSent) {\n continue;\n }\n // eslint-disable-next-line guard-for-in\n for (const key in response.headers) {\n const isAllowed = options.decompress ? key !== 'content-encoding' : true;\n const value = response.headers[key];\n if (isAllowed) {\n destination.setHeader(key, value);\n }\n }\n destination.statusCode = statusCode;\n }\n }\n async _onResponse(response) {\n try {\n await this._onResponseBase(response);\n }\n catch (error) {\n /* istanbul ignore next: better safe than sorry */\n this._beforeError(error);\n }\n }\n _onRequest(request) {\n const { options } = this;\n const { timeout, url } = options;\n http_timer_1.default(request);\n this[kCancelTimeouts] = timed_out_1.default(request, timeout, url);\n const responseEventName = options.cache ? 'cacheableResponse' : 'response';\n request.once(responseEventName, (response) => {\n void this._onResponse(response);\n });\n request.once('error', (error) => {\n var _a;\n // Force clean-up, because some packages (e.g. nock) don't do this.\n request.destroy();\n // Node.js <= 12.18.2 mistakenly emits the response `end` first.\n (_a = request.res) === null || _a === void 0 ? void 0 : _a.removeAllListeners('end');\n error = error instanceof timed_out_1.TimeoutError ? new TimeoutError(error, this.timings, this) : new RequestError(error.message, error, this);\n this._beforeError(error);\n });\n this[kUnproxyEvents] = proxy_events_1.default(request, this, proxiedRequestEvents);\n this[kRequest] = request;\n this.emit('uploadProgress', this.uploadProgress);\n // Send body\n const body = this[kBody];\n const currentRequest = this.redirects.length === 0 ? this : request;\n if (is_1.default.nodeStream(body)) {\n body.pipe(currentRequest);\n body.once('error', (error) => {\n this._beforeError(new UploadError(error, this));\n });\n }\n else {\n this._unlockWrite();\n if (!is_1.default.undefined(body)) {\n this._writeRequest(body, undefined, () => { });\n currentRequest.end();\n this._lockWrite();\n }\n else if (this._cannotHaveBody || this._noPipe) {\n currentRequest.end();\n this._lockWrite();\n }\n }\n this.emit('request', request);\n }\n async _createCacheableRequest(url, options) {\n return new Promise((resolve, reject) => {\n // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed\n Object.assign(options, url_to_options_1.default(url));\n // `http-cache-semantics` checks this\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.url;\n let request;\n // This is ugly\n const cacheRequest = cacheableStore.get(options.cache)(options, async (response) => {\n // TODO: Fix `cacheable-response`\n response._readableState.autoDestroy = false;\n if (request) {\n (await request).emit('cacheableResponse', response);\n }\n resolve(response);\n });\n // Restore options\n options.url = url;\n cacheRequest.once('error', reject);\n cacheRequest.once('request', async (requestOrPromise) => {\n request = requestOrPromise;\n resolve(request);\n });\n });\n }\n async _makeRequest() {\n var _a, _b, _c, _d, _e;\n const { options } = this;\n const { headers } = options;\n for (const key in headers) {\n if (is_1.default.undefined(headers[key])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete headers[key];\n }\n else if (is_1.default.null_(headers[key])) {\n throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${key}\\` header`);\n }\n }\n if (options.decompress && is_1.default.undefined(headers['accept-encoding'])) {\n headers['accept-encoding'] = supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate';\n }\n // Set cookies\n if (options.cookieJar) {\n const cookieString = await options.cookieJar.getCookieString(options.url.toString());\n if (is_1.default.nonEmptyString(cookieString)) {\n options.headers.cookie = cookieString;\n }\n }\n for (const hook of options.hooks.beforeRequest) {\n // eslint-disable-next-line no-await-in-loop\n const result = await hook(options);\n if (!is_1.default.undefined(result)) {\n // @ts-expect-error Skip the type mismatch to support abstract responses\n options.request = () => result;\n break;\n }\n }\n if (options.body && this[kBody] !== options.body) {\n this[kBody] = options.body;\n }\n const { agent, request, timeout, url } = options;\n if (options.dnsCache && !('lookup' in options)) {\n options.lookup = options.dnsCache.lookup;\n }\n // UNIX sockets\n if (url.hostname === 'unix') {\n const matches = /(?<socketPath>.+?):(?<path>.+)/.exec(`${url.pathname}${url.search}`);\n if (matches === null || matches === void 0 ? void 0 : matches.groups) {\n const { socketPath, path } = matches.groups;\n Object.assign(options, {\n socketPath,\n path,\n host: ''\n });\n }\n }\n const isHttps = url.protocol === 'https:';\n // Fallback function\n let fallbackFn;\n if (options.http2) {\n fallbackFn = http2wrapper.auto;\n }\n else {\n fallbackFn = isHttps ? https.request : http.request;\n }\n const realFn = (_a = options.request) !== null && _a !== void 0 ? _a : fallbackFn;\n // Cache support\n const fn = options.cache ? this._createCacheableRequest : realFn;\n // Pass an agent directly when HTTP2 is disabled\n if (agent && !options.http2) {\n options.agent = agent[isHttps ? 'https' : 'http'];\n }\n // Prepare plain HTTP request options\n options[kRequest] = realFn;\n delete options.request;\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.timeout;\n const requestOptions = options;\n requestOptions.shared = (_b = options.cacheOptions) === null || _b === void 0 ? void 0 : _b.shared;\n requestOptions.cacheHeuristic = (_c = options.cacheOptions) === null || _c === void 0 ? void 0 : _c.cacheHeuristic;\n requestOptions.immutableMinTimeToLive = (_d = options.cacheOptions) === null || _d === void 0 ? void 0 : _d.immutableMinTimeToLive;\n requestOptions.ignoreCargoCult = (_e = options.cacheOptions) === null || _e === void 0 ? void 0 : _e.ignoreCargoCult;\n // If `dnsLookupIpVersion` is not present do not override `family`\n if (options.dnsLookupIpVersion !== undefined) {\n try {\n requestOptions.family = dns_ip_version_1.dnsLookupIpVersionToFamily(options.dnsLookupIpVersion);\n }\n catch (_f) {\n throw new Error('Invalid `dnsLookupIpVersion` option value');\n }\n }\n // HTTPS options remapping\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n requestOptions.rejectUnauthorized = options.https.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n requestOptions.checkServerIdentity = options.https.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n requestOptions.ca = options.https.certificateAuthority;\n }\n if (options.https.certificate) {\n requestOptions.cert = options.https.certificate;\n }\n if (options.https.key) {\n requestOptions.key = options.https.key;\n }\n if (options.https.passphrase) {\n requestOptions.passphrase = options.https.passphrase;\n }\n if (options.https.pfx) {\n requestOptions.pfx = options.https.pfx;\n }\n }\n try {\n let requestOrResponse = await fn(url, requestOptions);\n if (is_1.default.undefined(requestOrResponse)) {\n requestOrResponse = fallbackFn(url, requestOptions);\n }\n // Restore options\n options.request = request;\n options.timeout = timeout;\n options.agent = agent;\n // HTTPS options restore\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n delete requestOptions.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n // @ts-expect-error - This one will be removed when we remove the alias.\n delete requestOptions.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n delete requestOptions.ca;\n }\n if (options.https.certificate) {\n delete requestOptions.cert;\n }\n if (options.https.key) {\n delete requestOptions.key;\n }\n if (options.https.passphrase) {\n delete requestOptions.passphrase;\n }\n if (options.https.pfx) {\n delete requestOptions.pfx;\n }\n }\n if (isClientRequest(requestOrResponse)) {\n this._onRequest(requestOrResponse);\n // Emit the response after the stream has been ended\n }\n else if (this.writable) {\n this.once('finish', () => {\n void this._onResponse(requestOrResponse);\n });\n this._unlockWrite();\n this.end();\n this._lockWrite();\n }\n else {\n void this._onResponse(requestOrResponse);\n }\n }\n catch (error) {\n if (error instanceof CacheableRequest.CacheError) {\n throw new CacheError(error, this);\n }\n throw new RequestError(error.message, error, this);\n }\n }\n async _error(error) {\n try {\n for (const hook of this.options.hooks.beforeError) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n catch (error_) {\n error = new RequestError(error_.message, error_, this);\n }\n this.destroy(error);\n }\n _beforeError(error) {\n if (this[kStopReading]) {\n return;\n }\n const { options } = this;\n const retryCount = this.retryCount + 1;\n this[kStopReading] = true;\n if (!(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n const typedError = error;\n const { response } = typedError;\n void (async () => {\n if (response && !response.body) {\n response.setEncoding(this._readableState.encoding);\n try {\n response.rawBody = await get_buffer_1.default(response);\n response.body = response.rawBody.toString();\n }\n catch (_a) { }\n }\n if (this.listenerCount('retry') !== 0) {\n let backoff;\n try {\n let retryAfter;\n if (response && 'retry-after' in response.headers) {\n retryAfter = Number(response.headers['retry-after']);\n if (Number.isNaN(retryAfter)) {\n retryAfter = Date.parse(response.headers['retry-after']) - Date.now();\n if (retryAfter <= 0) {\n retryAfter = 1;\n }\n }\n else {\n retryAfter *= 1000;\n }\n }\n backoff = await options.retry.calculateDelay({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: calculate_retry_delay_1.default({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: 0\n })\n });\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error_, this));\n return;\n }\n if (backoff) {\n const retry = async () => {\n try {\n for (const hook of this.options.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(this.options, typedError, retryCount);\n }\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error, this));\n return;\n }\n // Something forced us to abort the retry\n if (this.destroyed) {\n return;\n }\n this.destroy();\n this.emit('retry', retryCount, error);\n };\n this[kRetryTimeout] = setTimeout(retry, backoff);\n return;\n }\n }\n void this._error(typedError);\n })();\n }\n _read() {\n this[kTriggerRead] = true;\n const response = this[kResponse];\n if (response && !this[kStopReading]) {\n // We cannot put this in the `if` above\n // because `.read()` also triggers the `end` event\n if (response.readableLength) {\n this[kTriggerRead] = false;\n }\n let data;\n while ((data = response.read()) !== null) {\n this[kDownloadedSize] += data.length;\n this[kStartedReading] = true;\n const progress = this.downloadProgress;\n if (progress.percent < 1) {\n this.emit('downloadProgress', progress);\n }\n this.push(data);\n }\n }\n }\n // Node.js 12 has incorrect types, so the encoding must be a string\n _write(chunk, encoding, callback) {\n const write = () => {\n this._writeRequest(chunk, encoding, callback);\n };\n if (this.requestInitialized) {\n write();\n }\n else {\n this[kJobs].push(write);\n }\n }\n _writeRequest(chunk, encoding, callback) {\n if (this[kRequest].destroyed) {\n // Probably the `ClientRequest` instance will throw\n return;\n }\n this._progressCallbacks.push(() => {\n this[kUploadedSize] += Buffer.byteLength(chunk, encoding);\n const progress = this.uploadProgress;\n if (progress.percent < 1) {\n this.emit('uploadProgress', progress);\n }\n });\n // TODO: What happens if it's from cache? Then this[kRequest] won't be defined.\n this[kRequest].write(chunk, encoding, (error) => {\n if (!error && this._progressCallbacks.length > 0) {\n this._progressCallbacks.shift()();\n }\n callback(error);\n });\n }\n _final(callback) {\n const endRequest = () => {\n // FIX: Node.js 10 calls the write callback AFTER the end callback!\n while (this._progressCallbacks.length !== 0) {\n this._progressCallbacks.shift()();\n }\n // We need to check if `this[kRequest]` is present,\n // because it isn't when we use cache.\n if (!(kRequest in this)) {\n callback();\n return;\n }\n if (this[kRequest].destroyed) {\n callback();\n return;\n }\n this[kRequest].end((error) => {\n if (!error) {\n this[kBodySize] = this[kUploadedSize];\n this.emit('uploadProgress', this.uploadProgress);\n this[kRequest].emit('upload-complete');\n }\n callback(error);\n });\n };\n if (this.requestInitialized) {\n endRequest();\n }\n else {\n this[kJobs].push(endRequest);\n }\n }\n _destroy(error, callback) {\n var _a;\n this[kStopReading] = true;\n // Prevent further retries\n clearTimeout(this[kRetryTimeout]);\n if (kRequest in this) {\n this[kCancelTimeouts]();\n // TODO: Remove the next `if` when these get fixed:\n // - https://github.com/nodejs/node/issues/32851\n if (!((_a = this[kResponse]) === null || _a === void 0 ? void 0 : _a.complete)) {\n this[kRequest].destroy();\n }\n }\n if (error !== null && !is_1.default.undefined(error) && !(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n callback(error);\n }\n get _isAboutToError() {\n return this[kStopReading];\n }\n /**\n The remote IP address.\n */\n get ip() {\n var _a;\n return (_a = this.socket) === null || _a === void 0 ? void 0 : _a.remoteAddress;\n }\n /**\n Indicates whether the request has been aborted or not.\n */\n get aborted() {\n var _a, _b, _c;\n return ((_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroyed) !== null && _b !== void 0 ? _b : this.destroyed) && !((_c = this[kOriginalResponse]) === null || _c === void 0 ? void 0 : _c.complete);\n }\n get socket() {\n var _a, _b;\n return (_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.socket) !== null && _b !== void 0 ? _b : undefined;\n }\n /**\n Progress event for downloading (receiving a response).\n */\n get downloadProgress() {\n let percent;\n if (this[kResponseSize]) {\n percent = this[kDownloadedSize] / this[kResponseSize];\n }\n else if (this[kResponseSize] === this[kDownloadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kDownloadedSize],\n total: this[kResponseSize]\n };\n }\n /**\n Progress event for uploading (sending a request).\n */\n get uploadProgress() {\n let percent;\n if (this[kBodySize]) {\n percent = this[kUploadedSize] / this[kBodySize];\n }\n else if (this[kBodySize] === this[kUploadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kUploadedSize],\n total: this[kBodySize]\n };\n }\n /**\n The object contains the following properties:\n\n - `start` - Time when the request started.\n - `socket` - Time when a socket was assigned to the request.\n - `lookup` - Time when the DNS lookup finished.\n - `connect` - Time when the socket successfully connected.\n - `secureConnect` - Time when the socket securely connected.\n - `upload` - Time when the request finished uploading.\n - `response` - Time when the request fired `response` event.\n - `end` - Time when the response fired `end` event.\n - `error` - Time when the request fired `error` event.\n - `abort` - Time when the request fired `abort` event.\n - `phases`\n - `wait` - `timings.socket - timings.start`\n - `dns` - `timings.lookup - timings.socket`\n - `tcp` - `timings.connect - timings.lookup`\n - `tls` - `timings.secureConnect - timings.connect`\n - `request` - `timings.upload - (timings.secureConnect || timings.connect)`\n - `firstByte` - `timings.response - timings.upload`\n - `download` - `timings.end - timings.response`\n - `total` - `(timings.end || timings.error || timings.abort) - timings.start`\n\n If something has not been measured yet, it will be `undefined`.\n\n __Note__: The time is a `number` representing the milliseconds elapsed since the UNIX epoch.\n */\n get timings() {\n var _a;\n return (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.timings;\n }\n /**\n Whether the response was retrieved from the cache.\n */\n get isFromCache() {\n return this[kIsFromCache];\n }\n pipe(destination, options) {\n if (this[kStartedReading]) {\n throw new Error('Failed to pipe. The response has been emitted already.');\n }\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].add(destination);\n }\n return super.pipe(destination, options);\n }\n unpipe(destination) {\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].delete(destination);\n }\n super.unpipe(destination);\n return this;\n }\n}\nexports.default = Request;\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancelError = exports.ParseError = void 0;\nconst core_1 = require(\"../core\");\n/**\nAn error to be thrown when server response code is 2xx, and parsing body fails.\nIncludes a `response` property.\n*/\nclass ParseError extends core_1.RequestError {\n constructor(error, response) {\n const { options } = response.request;\n super(`${error.message} in \"${options.url.toString()}\"`, error, response.request);\n this.name = 'ParseError';\n }\n}\nexports.ParseError = ParseError;\n/**\nAn error to be thrown when the request is aborted with `.cancel()`.\n*/\nclass CancelError extends core_1.RequestError {\n constructor(request) {\n super('Promise was canceled', {}, request);\n this.name = 'CancelError';\n }\n get isCanceled() {\n return true;\n }\n}\nexports.CancelError = CancelError;\n__exportStar(require(\"../core\"), exports);\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nconst parseBody = (response, responseType, parseJson, encoding) => {\n const { rawBody } = response;\n try {\n if (responseType === 'text') {\n return rawBody.toString(encoding);\n }\n if (responseType === 'json') {\n return rawBody.length === 0 ? '' : parseJson(rawBody.toString());\n }\n if (responseType === 'buffer') {\n return rawBody;\n }\n throw new types_1.ParseError({\n message: `Unknown body type '${responseType}'`,\n name: 'Error'\n }, response);\n }\n catch (error) {\n throw new types_1.ParseError(error, response);\n }\n};\nexports.default = parseBody;\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst PCancelable = require(\"p-cancelable\");\nconst types_1 = require(\"./types\");\nconst parse_body_1 = require(\"./parse-body\");\nconst core_1 = require(\"../core\");\nconst proxy_events_1 = require(\"../core/utils/proxy-events\");\nconst get_buffer_1 = require(\"../core/utils/get-buffer\");\nconst is_response_ok_1 = require(\"../core/utils/is-response-ok\");\nconst proxiedRequestEvents = [\n 'request',\n 'response',\n 'redirect',\n 'uploadProgress',\n 'downloadProgress'\n];\nfunction asPromise(normalizedOptions) {\n let globalRequest;\n let globalResponse;\n const emitter = new events_1.EventEmitter();\n const promise = new PCancelable((resolve, reject, onCancel) => {\n const makeRequest = (retryCount) => {\n const request = new core_1.default(undefined, normalizedOptions);\n request.retryCount = retryCount;\n request._noPipe = true;\n onCancel(() => request.destroy());\n onCancel.shouldReject = false;\n onCancel(() => reject(new types_1.CancelError(request)));\n globalRequest = request;\n request.once('response', async (response) => {\n var _a;\n response.retryCount = retryCount;\n if (response.request.aborted) {\n // Canceled while downloading - will throw a `CancelError` or `TimeoutError` error\n return;\n }\n // Download body\n let rawBody;\n try {\n rawBody = await get_buffer_1.default(request);\n response.rawBody = rawBody;\n }\n catch (_b) {\n // The same error is caught below.\n // See request.once('error')\n return;\n }\n if (request._isAboutToError) {\n return;\n }\n // Parse body\n const contentEncoding = ((_a = response.headers['content-encoding']) !== null && _a !== void 0 ? _a : '').toLowerCase();\n const isCompressed = ['gzip', 'deflate', 'br'].includes(contentEncoding);\n const { options } = request;\n if (isCompressed && !options.decompress) {\n response.body = rawBody;\n }\n else {\n try {\n response.body = parse_body_1.default(response, options.responseType, options.parseJson, options.encoding);\n }\n catch (error) {\n // Fallback to `utf8`\n response.body = rawBody.toString();\n if (is_response_ok_1.isResponseOk(response)) {\n request._beforeError(error);\n return;\n }\n }\n }\n try {\n for (const [index, hook] of options.hooks.afterResponse.entries()) {\n // @ts-expect-error TS doesn't notice that CancelableRequest is a Promise\n // eslint-disable-next-line no-await-in-loop\n response = await hook(response, async (updatedOptions) => {\n const typedOptions = core_1.default.normalizeArguments(undefined, {\n ...updatedOptions,\n retry: {\n calculateDelay: () => 0\n },\n throwHttpErrors: false,\n resolveBodyOnly: false\n }, options);\n // Remove any further hooks for that request, because we'll call them anyway.\n // The loop continues. We don't want duplicates (asPromise recursion).\n typedOptions.hooks.afterResponse = typedOptions.hooks.afterResponse.slice(0, index);\n for (const hook of typedOptions.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(typedOptions);\n }\n const promise = asPromise(typedOptions);\n onCancel(() => {\n promise.catch(() => { });\n promise.cancel();\n });\n return promise;\n });\n }\n }\n catch (error) {\n request._beforeError(new types_1.RequestError(error.message, error, request));\n return;\n }\n if (!is_response_ok_1.isResponseOk(response)) {\n request._beforeError(new types_1.HTTPError(response));\n return;\n }\n globalResponse = response;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n });\n const onError = (error) => {\n if (promise.isCanceled) {\n return;\n }\n const { options } = request;\n if (error instanceof types_1.HTTPError && !options.throwHttpErrors) {\n const { response } = error;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n return;\n }\n reject(error);\n };\n request.once('error', onError);\n const previousBody = request.options.body;\n request.once('retry', (newRetryCount, error) => {\n var _a, _b;\n if (previousBody === ((_a = error.request) === null || _a === void 0 ? void 0 : _a.options.body) && is_1.default.nodeStream((_b = error.request) === null || _b === void 0 ? void 0 : _b.options.body)) {\n onError(error);\n return;\n }\n makeRequest(newRetryCount);\n });\n proxy_events_1.default(request, emitter, proxiedRequestEvents);\n };\n makeRequest(0);\n });\n promise.on = (event, fn) => {\n emitter.on(event, fn);\n return promise;\n };\n const shortcut = (responseType) => {\n const newPromise = (async () => {\n // Wait until downloading has ended\n await promise;\n const { options } = globalResponse.request;\n return parse_body_1.default(globalResponse, responseType, options.parseJson, options.encoding);\n })();\n Object.defineProperties(newPromise, Object.getOwnPropertyDescriptors(promise));\n return newPromise;\n };\n promise.json = () => {\n const { headers } = globalRequest.options;\n if (!globalRequest.writableFinished && headers.accept === undefined) {\n headers.accept = 'application/json';\n }\n return shortcut('json');\n };\n promise.buffer = () => shortcut('buffer');\n promise.text = () => shortcut('text');\n return promise;\n}\nexports.default = asPromise;\n__exportStar(require(\"./types\"), exports);\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nfunction createRejection(error, ...beforeErrorGroups) {\n const promise = (async () => {\n if (error instanceof types_1.RequestError) {\n try {\n for (const hooks of beforeErrorGroups) {\n if (hooks) {\n for (const hook of hooks) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n }\n }\n catch (error_) {\n error = error_;\n }\n }\n throw error;\n })();\n const returnPromise = () => promise;\n promise.json = returnPromise;\n promise.text = returnPromise;\n promise.buffer = returnPromise;\n promise.on = returnPromise;\n return promise;\n}\nexports.default = createRejection;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nfunction deepFreeze(object) {\n for (const value of Object.values(object)) {\n if (is_1.default.plainObject(value) || is_1.default.array(value)) {\n deepFreeze(value);\n }\n }\n return Object.freeze(object);\n}\nexports.default = deepFreeze;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultHandler = void 0;\nconst is_1 = require(\"@sindresorhus/is\");\nconst as_promise_1 = require(\"./as-promise\");\nconst create_rejection_1 = require(\"./as-promise/create-rejection\");\nconst core_1 = require(\"./core\");\nconst deep_freeze_1 = require(\"./utils/deep-freeze\");\nconst errors = {\n RequestError: as_promise_1.RequestError,\n CacheError: as_promise_1.CacheError,\n ReadError: as_promise_1.ReadError,\n HTTPError: as_promise_1.HTTPError,\n MaxRedirectsError: as_promise_1.MaxRedirectsError,\n TimeoutError: as_promise_1.TimeoutError,\n ParseError: as_promise_1.ParseError,\n CancelError: as_promise_1.CancelError,\n UnsupportedProtocolError: as_promise_1.UnsupportedProtocolError,\n UploadError: as_promise_1.UploadError\n};\n// The `delay` package weighs 10KB (!)\nconst delay = async (ms) => new Promise(resolve => {\n setTimeout(resolve, ms);\n});\nconst { normalizeArguments } = core_1.default;\nconst mergeOptions = (...sources) => {\n let mergedOptions;\n for (const source of sources) {\n mergedOptions = normalizeArguments(undefined, source, mergedOptions);\n }\n return mergedOptions;\n};\nconst getPromiseOrStream = (options) => options.isStream ? new core_1.default(undefined, options) : as_promise_1.default(options);\nconst isGotInstance = (value) => ('defaults' in value && 'options' in value.defaults);\nconst aliases = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'head',\n 'delete'\n];\nexports.defaultHandler = (options, next) => next(options);\nconst callInitHooks = (hooks, options) => {\n if (hooks) {\n for (const hook of hooks) {\n hook(options);\n }\n }\n};\nconst create = (defaults) => {\n // Proxy properties from next handlers\n defaults._rawHandlers = defaults.handlers;\n defaults.handlers = defaults.handlers.map(fn => ((options, next) => {\n // This will be assigned by assigning result\n let root;\n const result = fn(options, newOptions => {\n root = next(newOptions);\n return root;\n });\n if (result !== root && !options.isStream && root) {\n const typedResult = result;\n const { then: promiseThen, catch: promiseCatch, finally: promiseFianlly } = typedResult;\n Object.setPrototypeOf(typedResult, Object.getPrototypeOf(root));\n Object.defineProperties(typedResult, Object.getOwnPropertyDescriptors(root));\n // These should point to the new promise\n // eslint-disable-next-line promise/prefer-await-to-then\n typedResult.then = promiseThen;\n typedResult.catch = promiseCatch;\n typedResult.finally = promiseFianlly;\n }\n return result;\n }));\n // Got interface\n const got = ((url, options = {}, _defaults) => {\n var _a, _b;\n let iteration = 0;\n const iterateHandlers = (newOptions) => {\n return defaults.handlers[iteration++](newOptions, iteration === defaults.handlers.length ? getPromiseOrStream : iterateHandlers);\n };\n // TODO: Remove this in Got 12.\n if (is_1.default.plainObject(url)) {\n const mergedOptions = {\n ...url,\n ...options\n };\n core_1.setNonEnumerableProperties([url, options], mergedOptions);\n options = mergedOptions;\n url = undefined;\n }\n try {\n // Call `init` hooks\n let initHookError;\n try {\n callInitHooks(defaults.options.hooks.init, options);\n callInitHooks((_a = options.hooks) === null || _a === void 0 ? void 0 : _a.init, options);\n }\n catch (error) {\n initHookError = error;\n }\n // Normalize options & call handlers\n const normalizedOptions = normalizeArguments(url, options, _defaults !== null && _defaults !== void 0 ? _defaults : defaults.options);\n normalizedOptions[core_1.kIsNormalizedAlready] = true;\n if (initHookError) {\n throw new as_promise_1.RequestError(initHookError.message, initHookError, normalizedOptions);\n }\n return iterateHandlers(normalizedOptions);\n }\n catch (error) {\n if (options.isStream) {\n throw error;\n }\n else {\n return create_rejection_1.default(error, defaults.options.hooks.beforeError, (_b = options.hooks) === null || _b === void 0 ? void 0 : _b.beforeError);\n }\n }\n });\n got.extend = (...instancesOrOptions) => {\n const optionsArray = [defaults.options];\n let handlers = [...defaults._rawHandlers];\n let isMutableDefaults;\n for (const value of instancesOrOptions) {\n if (isGotInstance(value)) {\n optionsArray.push(value.defaults.options);\n handlers.push(...value.defaults._rawHandlers);\n isMutableDefaults = value.defaults.mutableDefaults;\n }\n else {\n optionsArray.push(value);\n if ('handlers' in value) {\n handlers.push(...value.handlers);\n }\n isMutableDefaults = value.mutableDefaults;\n }\n }\n handlers = handlers.filter(handler => handler !== exports.defaultHandler);\n if (handlers.length === 0) {\n handlers.push(exports.defaultHandler);\n }\n return create({\n options: mergeOptions(...optionsArray),\n handlers,\n mutableDefaults: Boolean(isMutableDefaults)\n });\n };\n // Pagination\n const paginateEach = (async function* (url, options) {\n // TODO: Remove this `@ts-expect-error` when upgrading to TypeScript 4.\n // Error: Argument of type 'Merge<Options, PaginationOptions<T, R>> | undefined' is not assignable to parameter of type 'Options | undefined'.\n // @ts-expect-error\n let normalizedOptions = normalizeArguments(url, options, defaults.options);\n normalizedOptions.resolveBodyOnly = false;\n const pagination = normalizedOptions.pagination;\n if (!is_1.default.object(pagination)) {\n throw new TypeError('`options.pagination` must be implemented');\n }\n const all = [];\n let { countLimit } = pagination;\n let numberOfRequests = 0;\n while (numberOfRequests < pagination.requestLimit) {\n if (numberOfRequests !== 0) {\n // eslint-disable-next-line no-await-in-loop\n await delay(pagination.backoff);\n }\n // @ts-expect-error FIXME!\n // TODO: Throw when result is not an instance of Response\n // eslint-disable-next-line no-await-in-loop\n const result = (await got(undefined, undefined, normalizedOptions));\n // eslint-disable-next-line no-await-in-loop\n const parsed = await pagination.transform(result);\n const current = [];\n for (const item of parsed) {\n if (pagination.filter(item, all, current)) {\n if (!pagination.shouldContinue(item, all, current)) {\n return;\n }\n yield item;\n if (pagination.stackAllItems) {\n all.push(item);\n }\n current.push(item);\n if (--countLimit <= 0) {\n return;\n }\n }\n }\n const optionsToMerge = pagination.paginate(result, all, current);\n if (optionsToMerge === false) {\n return;\n }\n if (optionsToMerge === result.request.options) {\n normalizedOptions = result.request.options;\n }\n else if (optionsToMerge !== undefined) {\n normalizedOptions = normalizeArguments(undefined, optionsToMerge, normalizedOptions);\n }\n numberOfRequests++;\n }\n });\n got.paginate = paginateEach;\n got.paginate.all = (async (url, options) => {\n const results = [];\n for await (const item of paginateEach(url, options)) {\n results.push(item);\n }\n return results;\n });\n // For those who like very descriptive names\n got.paginate.each = paginateEach;\n // Stream API\n got.stream = ((url, options) => got(url, { ...options, isStream: true }));\n // Shortcuts\n for (const method of aliases) {\n got[method] = ((url, options) => got(url, { ...options, method }));\n got.stream[method] = ((url, options) => {\n return got(url, { ...options, method, isStream: true });\n });\n }\n Object.assign(got, errors);\n Object.defineProperty(got, 'defaults', {\n value: defaults.mutableDefaults ? defaults : deep_freeze_1.default(defaults),\n writable: defaults.mutableDefaults,\n configurable: defaults.mutableDefaults,\n enumerable: true\n });\n got.mergeOptions = mergeOptions;\n return got;\n};\nexports.default = create;\n__exportStar(require(\"./types\"), exports);\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url_1 = require(\"url\");\nconst create_1 = require(\"./create\");\nconst defaults = {\n options: {\n method: 'GET',\n retry: {\n limit: 2,\n methods: [\n 'GET',\n 'PUT',\n 'HEAD',\n 'DELETE',\n 'OPTIONS',\n 'TRACE'\n ],\n statusCodes: [\n 408,\n 413,\n 429,\n 500,\n 502,\n 503,\n 504,\n 521,\n 522,\n 524\n ],\n errorCodes: [\n 'ETIMEDOUT',\n 'ECONNRESET',\n 'EADDRINUSE',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ENOTFOUND',\n 'ENETUNREACH',\n 'EAI_AGAIN'\n ],\n maxRetryAfter: undefined,\n calculateDelay: ({ computedValue }) => computedValue\n },\n timeout: {},\n headers: {\n 'user-agent': 'got (https://github.com/sindresorhus/got)'\n },\n hooks: {\n init: [],\n beforeRequest: [],\n beforeRedirect: [],\n beforeRetry: [],\n beforeError: [],\n afterResponse: []\n },\n cache: undefined,\n dnsCache: undefined,\n decompress: true,\n throwHttpErrors: true,\n followRedirect: true,\n isStream: false,\n responseType: 'text',\n resolveBodyOnly: false,\n maxRedirects: 10,\n prefixUrl: '',\n methodRewriting: true,\n ignoreInvalidCookies: false,\n context: {},\n // TODO: Set this to `true` when Got 12 gets released\n http2: false,\n allowGetBody: false,\n https: undefined,\n pagination: {\n transform: (response) => {\n if (response.request.options.responseType === 'json') {\n return response.body;\n }\n return JSON.parse(response.body);\n },\n paginate: response => {\n if (!Reflect.has(response.headers, 'link')) {\n return false;\n }\n const items = response.headers.link.split(',');\n let next;\n for (const item of items) {\n const parsed = item.split(';');\n if (parsed[1].includes('next')) {\n next = parsed[0].trimStart().trim();\n next = next.slice(1, -1);\n break;\n }\n }\n if (next) {\n const options = {\n url: new url_1.URL(next)\n };\n return options;\n }\n return false;\n },\n filter: () => true,\n shouldContinue: () => true,\n countLimit: Infinity,\n backoff: 0,\n requestLimit: 10000,\n stackAllItems: true\n },\n parseJson: (text) => JSON.parse(text),\n stringifyJson: (object) => JSON.stringify(object),\n cacheOptions: {}\n },\n handlers: [create_1.defaultHandler],\n mutableDefaults: false\n};\nconst got = create_1.default(defaults);\nexports.default = got;\n// For CommonJS default export support\nmodule.exports = got;\nmodule.exports.default = got;\nmodule.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267\n__exportStar(require(\"./create\"), exports);\n__exportStar(require(\"./as-promise\"), exports);\n", "'use strict'\n\nfunction isFunction (funktion) {\n return typeof funktion === 'function'\n}\n\n// Default to complaining loudly when things don't go according to plan.\nvar logger = console.error.bind(console)\n\n// Sets a property on an object, preserving its enumerability.\n// This function assumes that the property is already writable.\nfunction defineProperty (obj, name, value) {\n var enumerable = !!obj[name] && obj.propertyIsEnumerable(name)\n Object.defineProperty(obj, name, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n })\n}\n\n// Keep initialization idempotent.\nfunction shimmer (options) {\n if (options && options.logger) {\n if (!isFunction(options.logger)) logger(\"new logger isn't a function, not replacing\")\n else logger = options.logger\n }\n}\n\nfunction wrap (nodule, name, wrapper) {\n if (!nodule || !nodule[name]) {\n logger('no original function ' + name + ' to wrap')\n return\n }\n\n if (!wrapper) {\n logger('no wrapper function')\n logger((new Error()).stack)\n return\n }\n\n if (!isFunction(nodule[name]) || !isFunction(wrapper)) {\n logger('original object and wrapper must be functions')\n return\n }\n\n var original = nodule[name]\n var wrapped = wrapper(original, name)\n\n defineProperty(wrapped, '__original', original)\n defineProperty(wrapped, '__unwrap', function () {\n if (nodule[name] === wrapped) defineProperty(nodule, name, original)\n })\n defineProperty(wrapped, '__wrapped', true)\n\n defineProperty(nodule, name, wrapped)\n return wrapped\n}\n\nfunction massWrap (nodules, names, wrapper) {\n if (!nodules) {\n logger('must provide one or more modules to patch')\n logger((new Error()).stack)\n return\n } else if (!Array.isArray(nodules)) {\n nodules = [nodules]\n }\n\n if (!(names && Array.isArray(names))) {\n logger('must provide one or more functions to wrap on modules')\n return\n }\n\n nodules.forEach(function (nodule) {\n names.forEach(function (name) {\n wrap(nodule, name, wrapper)\n })\n })\n}\n\nfunction unwrap (nodule, name) {\n if (!nodule || !nodule[name]) {\n logger('no function to unwrap.')\n logger((new Error()).stack)\n return\n }\n\n if (!nodule[name].__unwrap) {\n logger('no original to unwrap to -- has ' + name + ' already been unwrapped?')\n } else {\n return nodule[name].__unwrap()\n }\n}\n\nfunction massUnwrap (nodules, names) {\n if (!nodules) {\n logger('must provide one or more modules to patch')\n logger((new Error()).stack)\n return\n } else if (!Array.isArray(nodules)) {\n nodules = [nodules]\n }\n\n if (!(names && Array.isArray(names))) {\n logger('must provide one or more functions to unwrap on modules')\n return\n }\n\n nodules.forEach(function (nodule) {\n names.forEach(function (name) {\n unwrap(nodule, name)\n })\n })\n}\n\nshimmer.wrap = wrap\nshimmer.massWrap = massWrap\nshimmer.unwrap = unwrap\nshimmer.massUnwrap = massUnwrap\n\nmodule.exports = shimmer\n", "'use strict';\n\nvar shimmer = require('shimmer');\nvar wrap = shimmer.wrap;\nvar unwrap = shimmer.unwrap;\n\n// Default to complaining loudly when things don't go according to plan.\n// dunderscores are boring\nvar SYMBOL = 'wrap@before';\n\n// Sets a property on an object, preserving its enumerability.\n// This function assumes that the property is already writable.\nfunction defineProperty(obj, name, value) {\n var enumerable = !!obj[name] && obj.propertyIsEnumerable(name);\n Object.defineProperty(obj, name, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n });\n}\n\nfunction _process(self, listeners) {\n var l = listeners.length;\n for (var p = 0; p < l; p++) {\n var listener = listeners[p];\n // set up the listener so that onEmit can do whatever it needs\n var before = self[SYMBOL];\n if (typeof before === 'function') {\n before(listener);\n }\n else if (Array.isArray(before)) {\n var length = before.length;\n for (var i = 0; i < length; i++) before[i](listener);\n }\n }\n}\n\nfunction _listeners(self, event) {\n var listeners;\n listeners = self._events && self._events[event];\n if (!Array.isArray(listeners)) {\n if (listeners) {\n listeners = [listeners];\n }\n else {\n listeners = [];\n }\n }\n\n return listeners;\n}\n\nfunction _findAndProcess(self, event, before) {\n var after = _listeners(self, event);\n var unprocessed = after.filter(function(fn) { return before.indexOf(fn) === -1; });\n if (unprocessed.length > 0) _process(self, unprocessed);\n}\n\nfunction _wrap(unwrapped, visit) {\n if (!unwrapped) return;\n\n var wrapped = unwrapped;\n if (typeof unwrapped === 'function') {\n wrapped = visit(unwrapped);\n }\n else if (Array.isArray(unwrapped)) {\n wrapped = [];\n for (var i = 0; i < unwrapped.length; i++) {\n wrapped[i] = visit(unwrapped[i]);\n }\n }\n return wrapped;\n}\n\nmodule.exports = function wrapEmitter(emitter, onAddListener, onEmit) {\n if (!emitter || !emitter.on || !emitter.addListener ||\n !emitter.removeListener || !emitter.emit) {\n throw new Error(\"can only wrap real EEs\");\n }\n\n if (!onAddListener) throw new Error(\"must have function to run on listener addition\");\n if (!onEmit) throw new Error(\"must have function to wrap listeners when emitting\");\n\n /* Attach a context to a listener, and make sure that this hook stays\n * attached to the emitter forevermore.\n */\n function adding(on) {\n return function added(event, listener) {\n var existing = _listeners(this, event).slice();\n\n try {\n var returned = on.call(this, event, listener);\n _findAndProcess(this, event, existing);\n return returned;\n }\n finally {\n // old-style streaming overwrites .on and .addListener, so rewrap\n if (!this.on.__wrapped) wrap(this, 'on', adding);\n if (!this.addListener.__wrapped) wrap(this, 'addListener', adding);\n }\n };\n }\n\n function emitting(emit) {\n return function emitted(event) {\n if (!this._events || !this._events[event]) return emit.apply(this, arguments);\n\n var unwrapped = this._events[event];\n\n /* Ensure that if removeListener gets called, it's working with the\n * unwrapped listeners.\n */\n function remover(removeListener) {\n return function removed() {\n this._events[event] = unwrapped;\n try {\n return removeListener.apply(this, arguments);\n }\n finally {\n unwrapped = this._events[event];\n this._events[event] = _wrap(unwrapped, onEmit);\n }\n };\n }\n wrap(this, 'removeListener', remover);\n\n try {\n /* At emit time, ensure that whatever else is going on, removeListener will\n * still work while at the same time running whatever hooks are necessary to\n * make sure the listener is run in the correct context.\n */\n this._events[event] = _wrap(unwrapped, onEmit);\n return emit.apply(this, arguments);\n }\n finally {\n /* Ensure that regardless of what happens when preparing and running the\n * listeners, the status quo ante is restored before continuing.\n */\n unwrap(this, 'removeListener');\n this._events[event] = unwrapped;\n }\n };\n }\n\n // support multiple onAddListeners\n if (!emitter[SYMBOL]) {\n defineProperty(emitter, SYMBOL, onAddListener);\n }\n else if (typeof emitter[SYMBOL] === 'function') {\n defineProperty(emitter, SYMBOL, [emitter[SYMBOL], onAddListener]);\n }\n else if (Array.isArray(emitter[SYMBOL])) {\n emitter[SYMBOL].push(onAddListener);\n }\n\n // only wrap the core functions once\n if (!emitter.__wrapped) {\n wrap(emitter, 'addListener', adding);\n wrap(emitter, 'on', adding);\n wrap(emitter, 'emit', emitting);\n\n defineProperty(emitter, '__unwrap', function () {\n unwrap(emitter, 'addListener');\n unwrap(emitter, 'on');\n unwrap(emitter, 'emit');\n delete emitter[SYMBOL];\n delete emitter.__wrapped;\n });\n defineProperty(emitter, '__wrapped', true);\n }\n};\n", "/* eslint-disable max-len */\n'use strict';\n\nconst util = require('util');\nconst assert = require('assert');\nconst wrapEmitter = require('emitter-listener');\nconst async_hooks = require('async_hooks');\n\nconst CONTEXTS_SYMBOL = 'cls@contexts';\nconst ERROR_SYMBOL = 'error@context';\n\nconst DEBUG_CLS_HOOKED = process.env.DEBUG_CLS_HOOKED;\n\nlet currentUid = -1;\n\nmodule.exports = {\n getNamespace: getNamespace,\n createNamespace: createNamespace,\n destroyNamespace: destroyNamespace,\n reset: reset,\n ERROR_SYMBOL: ERROR_SYMBOL\n};\n\nfunction Namespace(name) {\n this.name = name;\n // changed in 2.7: no default context\n this.active = null;\n this._set = [];\n this.id = null;\n this._contexts = new Map();\n this._indent = 0;\n}\n\nNamespace.prototype.set = function set(key, value) {\n if (!this.active) {\n throw new Error('No context available. ns.run() or ns.bind() must be called first.');\n }\n\n this.active[key] = value;\n\n if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(indentStr + 'CONTEXT-SET KEY:' + key + '=' + value + ' in ns:' + this.name + ' currentUid:' + currentUid + ' active:' + util.inspect(this.active, {showHidden:true, depth:2, colors:true}));\n }\n\n return value;\n};\n\nNamespace.prototype.get = function get(key) {\n if (!this.active) {\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.currentId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n //debug2(indentStr + 'CONTEXT-GETTING KEY NO ACTIVE NS:' + key + '=undefined' + ' (' + this.name + ') currentUid:' + currentUid + ' active:' + util.inspect(this.active, {showHidden:true, depth:2, colors:true}));\n debug2(`${indentStr}CONTEXT-GETTING KEY NO ACTIVE NS: (${this.name}) ${key}=undefined currentUid:${currentUid} asyncHooksCurrentId:${asyncHooksCurrentId} triggerId:${triggerId} len:${this._set.length}`);\n }\n return undefined;\n }\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(indentStr + 'CONTEXT-GETTING KEY:' + key + '=' + this.active[key] + ' (' + this.name + ') currentUid:' + currentUid + ' active:' + util.inspect(this.active, {showHidden:true, depth:2, colors:true}));\n debug2(`${indentStr}CONTEXT-GETTING KEY: (${this.name}) ${key}=${this.active[key]} currentUid:${currentUid} asyncHooksCurrentId:${asyncHooksCurrentId} triggerId:${triggerId} len:${this._set.length} active:${util.inspect(this.active)}`);\n }\n return this.active[key];\n};\n\nNamespace.prototype.createContext = function createContext() {\n // Prototype inherit existing context if created a new child context within existing context.\n let context = Object.create(this.active ? this.active : Object.prototype);\n context._ns_name = this.name;\n context.id = currentUid;\n\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-CREATED Context: (${this.name}) currentUid:${currentUid} asyncHooksCurrentId:${asyncHooksCurrentId} triggerId:${triggerId} len:${this._set.length} context:${util.inspect(context, {showHidden:true, depth:2, colors:true})}`);\n }\n\n return context;\n};\n\nNamespace.prototype.run = function run(fn) {\n let context = this.createContext();\n this.enter(context);\n\n try {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-RUN BEGIN: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} context:${util.inspect(context)}`);\n }\n fn(context);\n return context;\n } catch (exception) {\n if (exception) {\n exception[ERROR_SYMBOL] = context;\n }\n throw exception;\n } finally {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-RUN END: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} ${util.inspect(context)}`);\n }\n this.exit(context);\n }\n};\n\nNamespace.prototype.runAndReturn = function runAndReturn(fn) {\n let value;\n this.run(function (context) {\n value = fn(context);\n });\n return value;\n};\n\n/**\n * Uses global Promise and assumes Promise is cls friendly or wrapped already.\n * @param {function} fn\n * @returns {*}\n */\nNamespace.prototype.runPromise = function runPromise(fn) {\n let context = this.createContext();\n this.enter(context);\n\n let promise = fn(context);\n if (!promise || !promise.then || !promise.catch) {\n throw new Error('fn must return a promise.');\n }\n\n if (DEBUG_CLS_HOOKED) {\n debug2('CONTEXT-runPromise BEFORE: (' + this.name + ') currentUid:' + currentUid + ' len:' + this._set.length + ' ' + util.inspect(context));\n }\n\n return promise\n .then(result => {\n if (DEBUG_CLS_HOOKED) {\n debug2('CONTEXT-runPromise AFTER then: (' + this.name + ') currentUid:' + currentUid + ' len:' + this._set.length + ' ' + util.inspect(context));\n }\n this.exit(context);\n return result;\n })\n .catch(err => {\n err[ERROR_SYMBOL] = context;\n if (DEBUG_CLS_HOOKED) {\n debug2('CONTEXT-runPromise AFTER catch: (' + this.name + ') currentUid:' + currentUid + ' len:' + this._set.length + ' ' + util.inspect(context));\n }\n this.exit(context);\n throw err;\n });\n};\n\nNamespace.prototype.bind = function bindFactory(fn, context) {\n if (!context) {\n if (!this.active) {\n context = this.createContext();\n } else {\n context = this.active;\n }\n }\n\n let self = this;\n return function clsBind() {\n self.enter(context);\n try {\n return fn.apply(this, arguments);\n } catch (exception) {\n if (exception) {\n exception[ERROR_SYMBOL] = context;\n }\n throw exception;\n } finally {\n self.exit(context);\n }\n };\n};\n\nNamespace.prototype.enter = function enter(context) {\n assert.ok(context, 'context must be provided for entering');\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-ENTER: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} ${util.inspect(context)}`);\n }\n\n this._set.push(this.active);\n this.active = context;\n};\n\nNamespace.prototype.exit = function exit(context) {\n assert.ok(context, 'context must be provided for exiting');\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-EXIT: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} ${util.inspect(context)}`);\n }\n\n // Fast path for most exits that are at the top of the stack\n if (this.active === context) {\n assert.ok(this._set.length, 'can\\'t remove top context');\n this.active = this._set.pop();\n return;\n }\n\n // Fast search in the stack using lastIndexOf\n let index = this._set.lastIndexOf(context);\n\n if (index < 0) {\n if (DEBUG_CLS_HOOKED) {\n debug2('??ERROR?? context exiting but not entered - ignoring: ' + util.inspect(context));\n }\n assert.ok(index >= 0, 'context not currently entered; can\\'t exit. \\n' + util.inspect(this) + '\\n' + util.inspect(context));\n } else {\n assert.ok(index, 'can\\'t remove top context');\n this._set.splice(index, 1);\n }\n};\n\nNamespace.prototype.bindEmitter = function bindEmitter(emitter) {\n assert.ok(emitter.on && emitter.addListener && emitter.emit, 'can only bind real EEs');\n\n let namespace = this;\n let thisSymbol = 'context@' + this.name;\n\n // Capture the context active at the time the emitter is bound.\n function attach(listener) {\n if (!listener) {\n return;\n }\n if (!listener[CONTEXTS_SYMBOL]) {\n listener[CONTEXTS_SYMBOL] = Object.create(null);\n }\n\n listener[CONTEXTS_SYMBOL][thisSymbol] = {\n namespace: namespace,\n context: namespace.active\n };\n }\n\n // At emit time, bind the listener within the correct context.\n function bind(unwrapped) {\n if (!(unwrapped && unwrapped[CONTEXTS_SYMBOL])) {\n return unwrapped;\n }\n\n let wrapped = unwrapped;\n let unwrappedContexts = unwrapped[CONTEXTS_SYMBOL];\n Object.keys(unwrappedContexts).forEach(function (name) {\n let thunk = unwrappedContexts[name];\n wrapped = thunk.namespace.bind(wrapped, thunk.context);\n });\n return wrapped;\n }\n\n wrapEmitter(emitter, attach, bind);\n};\n\n/**\n * If an error comes out of a namespace, it will have a context attached to it.\n * This function knows how to find it.\n *\n * @param {Error} exception Possibly annotated error.\n */\nNamespace.prototype.fromException = function fromException(exception) {\n return exception[ERROR_SYMBOL];\n};\n\nfunction getNamespace(name) {\n return process.namespaces[name];\n}\n\nfunction createNamespace(name) {\n assert.ok(name, 'namespace must be given a name.');\n\n if (DEBUG_CLS_HOOKED) {\n debug2(`NS-CREATING NAMESPACE (${name})`);\n }\n let namespace = new Namespace(name);\n namespace.id = currentUid;\n\n const hook = async_hooks.createHook({\n init(asyncId, type, triggerId, resource) {\n currentUid = async_hooks.executionAsyncId();\n\n //CHAIN Parent's Context onto child if none exists. This is needed to pass net-events.spec\n // let initContext = namespace.active;\n // if(!initContext && triggerId) {\n // let parentContext = namespace._contexts.get(triggerId);\n // if (parentContext) {\n // namespace.active = parentContext;\n // namespace._contexts.set(currentUid, parentContext);\n // if (DEBUG_CLS_HOOKED) {\n // const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n // debug2(`${indentStr}INIT [${type}] (${name}) WITH PARENT CONTEXT asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, true)} resource:${resource}`);\n // }\n // } else if (DEBUG_CLS_HOOKED) {\n // const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n // debug2(`${indentStr}INIT [${type}] (${name}) MISSING CONTEXT asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, true)} resource:${resource}`);\n // }\n // }else {\n // namespace._contexts.set(currentUid, namespace.active);\n // if (DEBUG_CLS_HOOKED) {\n // const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n // debug2(`${indentStr}INIT [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, true)} resource:${resource}`);\n // }\n // }\n if(namespace.active) {\n namespace._contexts.set(asyncId, namespace.active);\n\n if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} resource:${resource}`);\n }\n }else if(currentUid === 0){\n // CurrentId will be 0 when triggered from C++. Promise events\n // https://github.com/nodejs/node/blob/master/doc/api/async_hooks.md#triggerid\n const triggerId = async_hooks.triggerAsyncId();\n const triggerIdContext = namespace._contexts.get(triggerId);\n if (triggerIdContext) {\n namespace._contexts.set(asyncId, triggerIdContext);\n if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT USING CONTEXT FROM TRIGGERID [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, { showHidden: true, depth: 2, colors: true })} resource:${resource}`);\n }\n } else if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT MISSING CONTEXT [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, { showHidden: true, depth: 2, colors: true })} resource:${resource}`);\n }\n }\n\n\n if(DEBUG_CLS_HOOKED && type === 'PROMISE'){\n debug2(util.inspect(resource, {showHidden: true}));\n const parentId = resource.parentId;\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT RESOURCE-PROMISE [${type}] (${name}) parentId:${parentId} asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} resource:${resource}`);\n }\n\n },\n before(asyncId) {\n currentUid = async_hooks.executionAsyncId();\n let context;\n\n /*\n if(currentUid === 0){\n // CurrentId will be 0 when triggered from C++. Promise events\n // https://github.com/nodejs/node/blob/master/doc/api/async_hooks.md#triggerid\n //const triggerId = async_hooks.triggerAsyncId();\n context = namespace._contexts.get(asyncId); // || namespace._contexts.get(triggerId);\n }else{\n context = namespace._contexts.get(currentUid);\n }\n */\n\n //HACK to work with promises until they are fixed in node > 8.1.1\n context = namespace._contexts.get(asyncId) || namespace._contexts.get(currentUid);\n\n if (context) {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}BEFORE (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(context)}`);\n namespace._indent += 2;\n }\n\n namespace.enter(context);\n\n } else if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}BEFORE MISSING CONTEXT (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} namespace._contexts:${util.inspect(namespace._contexts, {showHidden:true, depth:2, colors:true})}`);\n namespace._indent += 2;\n }\n },\n after(asyncId) {\n currentUid = async_hooks.executionAsyncId();\n let context; // = namespace._contexts.get(currentUid);\n /*\n if(currentUid === 0){\n // CurrentId will be 0 when triggered from C++. Promise events\n // https://github.com/nodejs/node/blob/master/doc/api/async_hooks.md#triggerid\n //const triggerId = async_hooks.triggerAsyncId();\n context = namespace._contexts.get(asyncId); // || namespace._contexts.get(triggerId);\n }else{\n context = namespace._contexts.get(currentUid);\n }\n */\n //HACK to work with promises until they are fixed in node > 8.1.1\n context = namespace._contexts.get(asyncId) || namespace._contexts.get(currentUid);\n\n if (context) {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n namespace._indent -= 2;\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}AFTER (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(context)}`);\n }\n\n namespace.exit(context);\n\n } else if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n namespace._indent -= 2;\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}AFTER MISSING CONTEXT (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(context)}`);\n }\n },\n destroy(asyncId) {\n currentUid = async_hooks.executionAsyncId();\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}DESTROY (${name}) currentUid:${currentUid} asyncId:${asyncId} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(namespace._contexts.get(currentUid))}`);\n }\n\n namespace._contexts.delete(asyncId);\n }\n });\n\n hook.enable();\n\n process.namespaces[name] = namespace;\n return namespace;\n}\n\nfunction destroyNamespace(name) {\n let namespace = getNamespace(name);\n\n assert.ok(namespace, 'can\\'t delete nonexistent namespace! \"' + name + '\"');\n assert.ok(namespace.id, 'don\\'t assign to process.namespaces directly! ' + util.inspect(namespace));\n\n process.namespaces[name] = null;\n}\n\nfunction reset() {\n // must unregister async listeners\n if (process.namespaces) {\n Object.keys(process.namespaces).forEach(function (name) {\n destroyNamespace(name);\n });\n }\n process.namespaces = Object.create(null);\n}\n\nprocess.namespaces = {};\n\n//const fs = require('fs');\nfunction debug2(...args) {\n if (DEBUG_CLS_HOOKED) {\n //fs.writeSync(1, `${util.format(...args)}\\n`);\n process._rawDebug(`${util.format(...args)}`);\n }\n}\n\n/*function getFunctionName(fn) {\n if (!fn) {\n return fn;\n }\n if (typeof fn === 'function') {\n if (fn.name) {\n return fn.name;\n }\n return (fn.toString().trim().match(/^function\\s*([^\\s(]+)/) || [])[1];\n } else if (fn.constructor && fn.constructor.name) {\n return fn.constructor.name;\n }\n}*/\n\n\n", "\"use strict\";\nvar validLogLevels = ['debug', 'info', 'warn', 'error', 'silent'];\nvar defaultLogLevel = validLogLevels.indexOf('error');\nvar logLevel = calculateLogLevel(process.env.AWS_XRAY_DEBUG_MODE ? 'debug' : process.env.AWS_XRAY_LOG_LEVEL);\nvar logger = {\n error: createLoggerForLevel('error'),\n info: createLoggerForLevel('info'),\n warn: createLoggerForLevel('warn'),\n debug: createLoggerForLevel('debug'),\n};\nfunction createLoggerForLevel(level) {\n var loggerLevel = validLogLevels.indexOf(level);\n var consoleMethod = console[level] || console.log || (() => { });\n if (loggerLevel >= logLevel) {\n return (message, meta) => {\n if (message || meta) {\n consoleMethod(formatLogMessage(level, message, meta));\n }\n };\n }\n else {\n return () => { };\n }\n}\nfunction calculateLogLevel(level) {\n if (level) {\n var normalisedLevel = level.toLowerCase();\n var index = validLogLevels.indexOf(normalisedLevel);\n return index >= 0 ? index : defaultLogLevel;\n }\n // Silently ignore invalid log levels, default to default level\n return defaultLogLevel;\n}\nfunction createTimestamp(date) {\n var tzo = -date.getTimezoneOffset(), // Negate to make this tzo = local - UTC\n dif = tzo >= 0 ? '+' : '-', pad = function (num) {\n var norm = Math.floor(Math.abs(num));\n return (norm < 10 ? '0' : '') + norm;\n };\n return new Date(date.getTime() + (tzo * 60 * 1000)).toISOString()\n .replace(/T/, ' ')\n .replace(/Z/, ' ') +\n dif + pad(tzo / 60) +\n ':' + pad(tzo % 60);\n}\nfunction isLambdaFunction() {\n return process.env.LAMBDA_TASK_ROOT !== undefined;\n}\nfunction formatLogMessage(level, message, meta) {\n var messageParts = [];\n if (!isLambdaFunction()) {\n messageParts.push(createTimestamp(new Date()));\n messageParts.push(`[${level.toUpperCase()}]`);\n }\n if (message) {\n messageParts.push(message);\n }\n var logString = messageParts.join(' ');\n var metaDataString = formatMetaData(meta);\n return [logString, metaDataString].filter(str => str.length > 0).join('\\n ');\n}\nfunction formatMetaData(meta) {\n if (!meta) {\n return '';\n }\n return ((typeof (meta) === 'string') ? meta : JSON.stringify(meta));\n}\nvar logging = {\n setLogger: function setLogger(logObj) {\n logger = logObj;\n },\n getLogger: function getLogger() {\n return logger;\n }\n};\nmodule.exports = logging;\n", "\"use strict\";\n/**\n * Represents a captured exception.\n * @constructor\n * @param {Exception} err - The exception to capture.\n * @param {boolean} [remote] - Flag for whether the error was remote.\n */\nfunction CapturedException(err, remote) {\n this.init(err, remote);\n}\nCapturedException.prototype.init = function init(err, remote) {\n var e = (typeof err === 'string' || err instanceof String) ? { message: err, name: '' } : err;\n this.message = e.message;\n this.type = e.name;\n this.stack = [];\n this.remote = !!remote;\n if (e.stack) {\n var stack = e.stack.split('\\n');\n stack.shift();\n var self = this;\n stack.forEach(function (stackline) {\n var line = stackline.trim().replace(/\\(|\\)/g, '');\n line = line.substring(line.indexOf(' ') + 1);\n var label = line.lastIndexOf(' ') >= 0 ? line.slice(0, line.lastIndexOf(' ')) : null;\n var path = Array.isArray(label) && !label.length ? line : line.slice(line.lastIndexOf(' ') + 1);\n path = path.split(':');\n var entry = {\n path: path[0],\n line: parseInt(path[1]),\n label: label || 'anonymous'\n };\n self.stack.push(entry);\n });\n }\n};\nmodule.exports = CapturedException;\n", "module.exports = batcher\n\nfunction batcher (run) {\n var running = false\n var pendingBatch = null\n var pendingCallbacks = null\n var callbacks = null\n\n return append\n\n function done (err) {\n if (callbacks) callAll(callbacks, err)\n\n running = false\n callbacks = pendingCallbacks\n var nextBatch = pendingBatch\n\n pendingBatch = null\n pendingCallbacks = null\n\n if (!nextBatch || !nextBatch.length) {\n if (!callbacks || !callbacks.length) {\n callbacks = null\n return\n }\n if (!nextBatch) nextBatch = []\n }\n\n running = true\n run(nextBatch, done)\n }\n\n function append (val, cb) {\n if (running) {\n if (!pendingBatch) {\n pendingBatch = []\n pendingCallbacks = []\n }\n pushAll(pendingBatch, val)\n if (cb) pendingCallbacks.push(cb)\n } else {\n if (cb) callbacks = [cb]\n running = true\n run(Array.isArray(val) ? val : [val], done)\n }\n }\n}\n\nfunction pushAll (list, val) {\n if (Array.isArray(val)) pushArray(list, val)\n else list.push(val)\n}\n\nfunction pushArray (list, val) {\n for (var i = 0; i < val.length; i++) list.push(val[i])\n}\n\nfunction callAll (list, err) {\n for (var i = 0; i < list.length; i++) list[i](err)\n}\n", "\"use strict\";\nvar logger = require('./logger');\n/**\n * A module representing the X-Ray daemon configuration including the udp and tcp addresses.\n * @module DaemonConfig\n */\nvar DaemonConfig = {\n udp_ip: '127.0.0.1',\n udp_port: 2000,\n tcp_ip: '127.0.0.1',\n tcp_port: 2000,\n setDaemonAddress: function setDaemonAddress(address) {\n if (!process.env.AWS_XRAY_DAEMON_ADDRESS) {\n processAddress(address);\n logger.getLogger().info('Configured daemon address to ' + address + '.');\n }\n else {\n logger.getLogger().warn('Ignoring call to setDaemonAddress as AWS_XRAY_DAEMON_ADDRESS is set. ' +\n 'The current daemon address will not be changed.');\n }\n }\n};\nvar processAddress = function processAddress(address) {\n if (address.indexOf(':') === -1) {\n throw new Error('Invalid Daemon Address. You must specify an ip and port.');\n }\n else {\n var splitAddress = address.split(' ');\n if (splitAddress.length === 1) {\n // in format of 127.0.0.1:2000\n if (address.indexOf('udp') > -1 || address.indexOf('tcp') > -1) {\n throw new Error('Invalid Daemon Address. You must specify both tcp and udp addresses.');\n }\n var addr = address.split(':');\n if (!addr[0])\n throw new Error('Invalid Daemon Address. You must specify an ip.');\n DaemonConfig.udp_ip = addr[0];\n DaemonConfig.tcp_ip = addr[0];\n DaemonConfig.udp_port = addr[1];\n DaemonConfig.tcp_port = addr[1];\n }\n else if (splitAddress.length === 2) {\n // in format of udp:127.0.0.1:2000 tcp:127.0.0.1:2001\n var part_1 = splitAddress[0].split(':');\n var part_2 = splitAddress[1].split(':');\n var addr_map = {};\n addr_map[part_1[0]] = part_1;\n addr_map[part_2[0]] = part_2;\n DaemonConfig.udp_ip = addr_map['udp'][1];\n DaemonConfig.udp_port = parseInt(addr_map['udp'][2]);\n DaemonConfig.tcp_ip = addr_map['tcp'][1];\n DaemonConfig.tcp_port = parseInt(addr_map['tcp'][2]);\n if (!DaemonConfig.udp_port || !DaemonConfig.tcp_port) {\n throw new Error('Invalid Daemon Address. You must specify port number.');\n }\n }\n }\n};\nif (process.env.AWS_XRAY_DAEMON_ADDRESS)\n processAddress(process.env.AWS_XRAY_DAEMON_ADDRESS);\nmodule.exports = DaemonConfig;\n", "\"use strict\";\nvar dgram = require('dgram');\nvar batcher = require('atomic-batcher');\nvar logger = require('./logger');\nvar PROTOCOL_HEADER = '{\"format\":\"json\",\"version\":1}';\nvar PROTOCOL_DELIMITER = '\\n';\n/**\n * Sends a collection of data over a UDP socket. This method\n * is designed to be used by `atomic-batcher` as a way to share\n * a single UDP socket for sending multiple data blocks.\n *\n * @param {object} ops - Details of the data to send\n * @param {Function} callback - The function to call when done\n */\nfunction batchSendData(ops, callback) {\n var client = dgram.createSocket('udp4');\n executeSendData(client, ops, 0, function () {\n try {\n client.close();\n }\n finally {\n callback();\n }\n });\n}\n/**\n * Execute sending data starting at the specified index and\n * using the provided client.\n *\n * @param {Socket} client - Socket to send data with\n * @param {object} ops - Details of data to send\n * @param {number} index - Starting index for sending\n * @param {Function} callback - Function to call when done\n */\nfunction executeSendData(client, ops, index, callback) {\n if (index >= ops.length) {\n callback();\n return;\n }\n sendMessage(client, ops[index], function () {\n executeSendData(client, ops, index + 1, callback);\n });\n}\n/**\n * Send a single message over a UDP socket.\n *\n * @param {Socket} client - Socket to send data with\n * @param {object} data - Details of the data to send\n * @param {Function} batchCallback - Function to call when done\n */\nfunction sendMessage(client, data, batchCallback) {\n var msg = data.msg;\n var offset = data.offset;\n var length = data.length;\n var port = data.port;\n var address = data.address;\n var callback = data.callback;\n client.send(msg, offset, length, port, address, function (err) {\n try {\n callback(err);\n }\n finally {\n batchCallback();\n }\n });\n}\n/**\n * Class to mimic the Socket interface for a UDP client, but to provided\n * batching of outgoing sends using temporary Sockets that are created and\n * destroyed as needed.\n */\nfunction BatchingTemporarySocket() {\n this.batchSend = batcher(batchSendData);\n}\n/**\n * Provide the same signature as the Socket.send method but the work will be\n * batched to share temporary UDP sockets whenever possible.\n */\nBatchingTemporarySocket.prototype.send = function (msg, offset, length, port, address, callback) {\n var work = {\n msg: msg,\n offset: offset,\n length: length,\n port: port,\n address: address,\n callback: callback\n };\n this.batchSend(work);\n};\n/**\n * Segment emitter module.\n * @module SegmentEmitter\n */\nvar SegmentEmitter = {\n daemonConfig: require('./daemon_config'),\n /**\n * Returns the formatted segment JSON string.\n */\n format: function format(segment) {\n return PROTOCOL_HEADER + PROTOCOL_DELIMITER + segment.toString();\n },\n /**\n * Creates a UDP socket connection and send the formatted segment.\n * @param {Segment} segment - The segment to send to the daemon.\n */\n send: function send(segment) {\n if (!this.socket) {\n if (this.useBatchingTemporarySocket) {\n this.socket = new BatchingTemporarySocket();\n }\n else {\n this.socket = dgram.createSocket('udp4').unref();\n }\n }\n var client = this.socket;\n var formatted = segment.format();\n var data = PROTOCOL_HEADER + PROTOCOL_DELIMITER + formatted;\n var message = Buffer.from(data);\n var short = '{\"trace_id:\"' + segment.trace_id + '\",\"id\":\"' + segment.id + '\"}';\n var type = segment.type === 'subsegment' ? 'Subsegment' : 'Segment';\n client.send(message, 0, message.length, this.daemonConfig.udp_port, this.daemonConfig.udp_ip, function (err) {\n if (err) {\n if (err.code === 'EMSGSIZE')\n logger.getLogger().error(type + ' too large to send: ' + short + ' (' + message.length + ' bytes).');\n else\n logger.getLogger().error('Error occured sending segment: ', err);\n }\n else {\n logger.getLogger().debug(type + ' sent: {\"trace_id:\"' + segment.trace_id + '\",\"id\":\"' + segment.id + '\"}');\n logger.getLogger().debug('UDP message sent: ' + segment);\n }\n });\n },\n /**\n * Configures the address and/or port the daemon is expected to be on.\n * @param {string} address - Address of the daemon the segments should be sent to. Should be formatted as an IPv4 address.\n * @module SegmentEmitter\n * @function setDaemonAddress\n */\n setDaemonAddress: function setDaemonAddress(address) {\n this.daemonConfig.setDaemonAddress(address);\n },\n /**\n * Get the UDP IP the emitter is configured to.\n * @module SegmentEmitter\n * @function getIp\n */\n getIp: function getIp() {\n return this.daemonConfig.udp_ip;\n },\n /**\n * Get the UDP port the emitter is configured to.\n * @module SegmentEmitter\n * @function getPort\n */\n getPort: function getPort() {\n return this.daemonConfig.udp_port;\n },\n /**\n * Forces the segment emitter to create a new socket on send, and close it on complete.\n * @module SegmentEmitter\n * @function disableReusableSocket\n */\n disableReusableSocket: function () {\n this.useBatchingTemporarySocket = true;\n }\n};\nmodule.exports = SegmentEmitter;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar logger = require('../../logger');\n/**\n * Class describing an AWS X-Ray trace ID.\n * @see https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-traces\n */\nclass TraceID {\n /**\n * Constructs a new trace ID using the current time.\n * @param {string} [tsHex] - time stamp to use for trace ID in hexadecimal format\n * @param {string} [numberhex] - string of hexadecimal characters for random portion of Trace ID\n * @constructor\n */\n constructor(tsHex, numberhex) {\n this.version = 1;\n this.timestamp = tsHex || Math.round(new Date().getTime() / 1000).toString(16);\n this.id = numberhex || crypto.randomBytes(12).toString('hex');\n }\n /**\n * @returns {TraceID} - a hardcoded trace ID using zeroed timestamp and random ID\n */\n static Invalid() {\n return new TraceID('00000000', '000000000000000000000000');\n }\n /**\n * Constructs a new trace ID from provided string. If no string is provided or the provided string is invalid,\n * log an error but a new trace ID still returned. This can be used as a trace ID string validator.\n * @param {string} [rawID] - string to create a Trace ID object from.\n */\n static FromString(rawID) {\n const DELIMITER = '-';\n var traceID = new TraceID();\n var version, timestamp;\n if (!rawID || typeof rawID !== 'string') {\n logger.getLogger().error('Empty or non-string trace ID provided');\n return traceID;\n }\n const parts = rawID.trim().split(DELIMITER);\n if (parts.length !== 3) {\n logger.getLogger().error('Unrecognized trace ID format');\n return traceID;\n }\n version = parseInt(parts[0]);\n if (version === NaN || version < 1) {\n logger.getLogger().error('Trace ID version must be positive integer');\n return traceID;\n }\n timestamp = parseInt(parts[1], 16).toString(16);\n if (timestamp === 'NaN') {\n logger.getLogger().error('Trace ID timestamp must be a hex-encoded value');\n return traceID;\n }\n traceID.version = version;\n traceID.timestamp = timestamp;\n traceID.id = parts[2];\n return traceID;\n }\n /**\n * Returns a string representation of the trace ID.\n * @returns {string} - stringified trace ID, e.g. 1-57fbe041-2c7ad569f5d6ff149137be86\n */\n toString() {\n return `${this.version.toString()}-${this.timestamp}-${this.id}`;\n }\n}\nmodule.exports = TraceID;\n", "\"use strict\";\n/**\n * @module utils\n */\nvar crypto = require('crypto');\nvar logger = require('./logger');\nvar TraceID = require('./segments/attributes/trace_id');\nvar utils = {\n /**\n * Checks a HTTP response code, where 4xx are 'error' and 5xx are 'fault'.\n * @param {string} status - the HTTP response status code.\n * @returns [string] - 'error', 'fault' or nothing on no match\n * @alias module:utils.getCauseTypeFromHttpStatus\n */\n getCauseTypeFromHttpStatus: function getCauseTypeFromHttpStatus(status) {\n var stat = status.toString();\n if (stat.match(/^[4][0-9]{2}$/) !== null)\n return 'error';\n else if (stat.match(/^[5][0-9]{2}$/) !== null)\n return 'fault';\n },\n /**\n * Removes the query string parameters from a given http request path\n * as it may contain sensitive information\n *\n * Related issue: https://github.com/aws/aws-xray-sdk-node/issues/246\n *\n * Node documentation: https://nodejs.org/api/http.html#http_http_request_url_options_callback\n *\n * @param {string} path - options.path in a http.request callback\n * @returns [string] - removes query string element from path\n * @alias module:utils.stripQueryStringFromPath\n */\n stripQueryStringFromPath: function stripQueryStringFromPath(path) {\n return path ? path.split('?')[0] : '';\n },\n /**\n * Performs a case-insensitive wildcard match against two strings. This method works with pseduo-regex chars; specifically ? and * are supported.\n * An asterisk (*) represents any combination of characters\n * A question mark (?) represents any single character\n *\n * @param {string} pattern - the regex-like pattern to be compared against.\n * @param {string} text - the string to compare against the pattern.\n * @returns boolean\n * @alias module:utils.wildcardMatch\n */\n wildcardMatch: function wildcardMatch(pattern, text) {\n if (pattern === undefined || text === undefined)\n return false;\n if (pattern.length === 1 && pattern.charAt(0) === '*')\n return true;\n var patternLength = pattern.length;\n var textLength = text.length;\n var indexOfGlob = pattern.indexOf('*');\n pattern = pattern.toLowerCase();\n text = text.toLowerCase();\n // Infix globs are relatively rare, and the below search is expensive especially when\n // Balsa is used a lot. Check for infix globs and, in their absence, do the simple thing\n if (indexOfGlob === -1 || indexOfGlob === (patternLength - 1)) {\n var match = function simpleWildcardMatch() {\n var j = 0;\n for (var i = 0; i < patternLength; i++) {\n var patternChar = pattern.charAt(i);\n if (patternChar === '*') {\n // Presumption for this method is that globs only occur at end\n return true;\n }\n else if (patternChar === '?') {\n if (j === textLength)\n return false; // No character to match\n j++;\n }\n else {\n if (j >= textLength || patternChar != text.charAt(j))\n return false;\n j++;\n }\n }\n // Ate up all the pattern and didn't end at a glob, so a match will have consumed all\n // the text\n return j === textLength;\n };\n return match();\n }\n /*\n * The matchArray[i] is used to record if there is a match between the first i chars in =\n * text and the first j chars in pattern.\n * So will return matchArray[textLength+1] in the end\n * Loop from the beginning of the pattern\n * case not '*': if text[i]==pattern[j] or pattern[j] is '?', and matchArray[i] is true,\n * set matchArray[i+1] to true, otherwise false\n * case '*': since '*' can match any globing, as long as there is a true in matchArray before i\n * all the matchArray[i+1], matchArray[i+2],...,matchArray[textLength] could be true\n */\n var matchArray = [];\n matchArray[0] = true;\n for (var j = 0; j < patternLength; j++) {\n var i;\n var patternChar = pattern.charAt(j);\n if (patternChar != '*') {\n for (i = textLength - 1; i >= 0; i--)\n matchArray[i + 1] = !!matchArray[i] && (patternChar === '?' || (patternChar === text.charAt(i)));\n }\n else {\n i = 0;\n while (i <= textLength && !matchArray[i])\n i++;\n for (i; i <= textLength; i++)\n matchArray[i] = true;\n }\n matchArray[0] = (matchArray[0] && patternChar === '*');\n }\n return matchArray[textLength];\n },\n LambdaUtils: {\n validTraceData: function (xAmznTraceId) {\n var valid = false;\n if (xAmznTraceId) {\n var data = utils.processTraceData(xAmznTraceId);\n valid = !!(data && data.root && data.parent && data.sampled);\n }\n return valid;\n },\n /**\n * Populates trace ID, parent ID, and sampled decision of given segment. Will always populate valid values,\n * even if xAmznTraceId contains missing or invalid values. This ensures downstream services receive valid\n * headers.\n * @param {Segment} segment - Facade segment to be populated\n * @param {String} xAmznTraceId - Raw Trace Header to supply trace data\n * @returns {Boolean} - true if required fields are present and Trace ID is valid, false otherwise\n */\n populateTraceData: function (segment, xAmznTraceId) {\n logger.getLogger().debug('Lambda trace data found: ' + xAmznTraceId);\n var data = utils.processTraceData(xAmznTraceId);\n var valid = false;\n if (!data) {\n data = {};\n logger.getLogger().error('_X_AMZN_TRACE_ID is empty or has an invalid format');\n }\n else if (!data.root || !data.parent || !data.sampled) {\n logger.getLogger().error('_X_AMZN_TRACE_ID is missing required information');\n }\n else {\n valid = true;\n }\n segment.trace_id = TraceID.FromString(data.root).toString(); // Will always assign valid trace_id\n segment.id = data.parent || crypto.randomBytes(8).toString('hex');\n if (data.root && segment.trace_id !== data.root) {\n logger.getLogger().error('_X_AMZN_TRACE_ID contains invalid trace ID');\n valid = false;\n }\n if (!parseInt(data.sampled))\n segment.notTraced = true;\n else\n delete segment.notTraced;\n logger.getLogger().debug('Segment started: ' + JSON.stringify(data));\n return valid;\n }\n },\n /**\n * Splits out the data from the trace id format. Used by the middleware.\n * @param {String} traceData - The additional trace data (typically in req.headers.x-amzn-trace-id).\n * @returns {object}\n * @alias module:mw_utils.processTraceData\n */\n processTraceData: function processTraceData(traceData) {\n var amznTraceData = {};\n var reservedKeywords = ['root', 'parent', 'sampled', 'self'];\n var remainingBytes = 256;\n if (!(typeof traceData === 'string' && traceData))\n return amznTraceData;\n traceData.split(';').forEach(function (header) {\n if (!header)\n return;\n var pair = header.split('=');\n if (pair[0] && pair[1]) {\n var key = pair[0].trim().toLowerCase();\n var value = pair[1].trim().toLowerCase();\n var reserved = reservedKeywords.indexOf(key) !== -1;\n if (reserved) {\n amznTraceData[key] = value;\n }\n else if (!reserved && remainingBytes - (key.length + value.length) >= 0) {\n amznTraceData[key] = value;\n remainingBytes -= (key.length + value.length);\n }\n }\n });\n return amznTraceData;\n },\n /**\n * Makes a shallow copy of an object without given keys - keeps prototype\n * @param {Object} obj - The object to copy\n * @param {string[]} [keys=[]] - The keys that won't be copied\n * @param {boolean} [preservePrototype=false] - If true also copy prototype properties\n * @returns {}\n */\n objectWithoutProperties: function objectWithoutProperties(obj, keys, preservePrototype) {\n keys = Array.isArray(keys) ? keys : [];\n preservePrototype = typeof preservePrototype === 'boolean' ? preservePrototype : false;\n var target = preservePrototype ? Object.create(Object.getPrototypeOf(obj)) : {};\n for (var property in obj) {\n if (keys.indexOf(property) >= 0)\n continue;\n if (!Object.prototype.hasOwnProperty.call(obj, property))\n continue;\n target[property] = obj[property];\n }\n return target;\n },\n /**\n * Safely gets an integer from a string or number\n * @param {String | Number} - input to cast to integer\n * @returns {Number} - Integer representation of input, or 0 if input is not castable to int\n */\n safeParseInt: (val) => {\n if (!val || isNaN(val)) {\n return 0;\n }\n return parseInt(val);\n }\n};\nmodule.exports = utils;\n", "\"use strict\";\nconst { safeParseInt } = require('../utils');\nvar logger = require('../logger');\nvar DEFAULT_STREAMING_THRESHOLD = 100;\nvar utils = {\n streamingThreshold: DEFAULT_STREAMING_THRESHOLD,\n getCurrentTime: function getCurrentTime() {\n return Date.now() / 1000;\n },\n setOrigin: function setOrigin(origin) {\n this.origin = origin;\n },\n setPluginData: function setPluginData(pluginData) {\n this.pluginData = pluginData;\n },\n setSDKData: function setSDKData(sdkData) {\n this.sdkData = sdkData;\n },\n setServiceData: function setServiceData(serviceData) {\n this.serviceData = serviceData;\n },\n /**\n * Overrides the default streaming threshold (100).\n * The threshold represents the maximum number of subsegments on a single segment before\n * the SDK beings to send the completed subsegments out of band of the main segment.\n * Reduce this threshold if you see the 'Segment too large to send' error.\n * @param {number} threshold - The new threshold to use.\n * @memberof AWSXRay\n */\n setStreamingThreshold: function setStreamingThreshold(threshold) {\n if (isFinite(threshold) && threshold >= 0) {\n utils.streamingThreshold = threshold;\n logger.getLogger().debug('Subsegment streaming threshold set to: ' + threshold);\n }\n else {\n logger.getLogger().error('Invalid threshold: ' + threshold + '. Must be a whole number >= 0.');\n }\n },\n getStreamingThreshold: function getStreamingThreshold() {\n return utils.streamingThreshold;\n },\n /**\n * Parses an HTTP response object to return an X-Ray compliant HTTP response object.\n * @param {http.ServerResponse} res\n * @returns {Object} - X-Ray response object to be added to (sub)segment\n */\n getHttpResponseData: (res) => {\n const ret = {};\n if (!res) {\n return ret;\n }\n const status = safeParseInt(res.statusCode);\n if (status !== 0) {\n ret.status = status;\n }\n if (res.headers && res.headers['content-length']) {\n ret.content_length = safeParseInt(res.headers['content-length']);\n }\n return ret;\n }\n};\nmodule.exports = utils;\n", "\"use strict\";\nconst { getHttpResponseData } = require('../segment_utils');\nvar { stripQueryStringFromPath } = require('../../utils');\n/**\n * Represents an outgoing HTTP/HTTPS call.\n * @constructor\n * @param {http.ClientRequest|https.ClientRequest} req - The request object from the HTTP/HTTPS call.\n * @param {http.IncomingMessage|https.IncomingMessage} res - The response object from the HTTP/HTTPS call.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced\": true hint to generated subsegments such that the AWS X-Ray service expects a corresponding segment from the downstream service.\n */\nfunction RemoteRequestData(req, res, downstreamXRayEnabled) {\n this.init(req, res, downstreamXRayEnabled);\n}\nRemoteRequestData.prototype.init = function init(req, res, downstreamXRayEnabled) {\n this.request = {\n url: (req.agent && req.agent.protocol) ? (req.agent.protocol + '//' + req.getHeader('host') + stripQueryStringFromPath(req.path)) : '',\n method: req.method || '',\n };\n if (downstreamXRayEnabled) {\n this.request.traced = true;\n }\n if (res) {\n this.response = getHttpResponseData(res);\n }\n};\nmodule.exports = RemoteRequestData;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar CapturedException = require('./captured_exception');\nvar RemoteRequestData = require('./remote_request_data');\nvar SegmentEmitter = require('../../segment_emitter');\nvar SegmentUtils = require('../segment_utils');\nvar Utils = require('../../utils');\nvar logger = require('../../logger');\n/**\n * Represents a subsegment.\n * @constructor\n * @param {string} name - The name of the subsegment.\n */\nfunction Subsegment(name) {\n this.init(name);\n}\nSubsegment.prototype.init = function init(name) {\n if (typeof name != 'string')\n throw new Error('Subsegment name must be of type string.');\n this.id = crypto.randomBytes(8).toString('hex');\n this.name = name;\n this.start_time = SegmentUtils.getCurrentTime();\n this.in_progress = true;\n this.counter = 0;\n};\n/**\n * Nests a new subsegment to the array of subsegments.\n * @param {string} name - The name of the new subsegment to append.\n * @returns {Subsegment} - The newly created subsegment.\n */\nSubsegment.prototype.addNewSubsegment = function addNewSubsegment(name) {\n var subsegment = new Subsegment(name);\n this.addSubsegment(subsegment);\n return subsegment;\n};\n/**\n * Adds a subsegment to the array of subsegments.\n * @param {Subsegment} subsegment - The subsegment to append.\n */\nSubsegment.prototype.addSubsegment = function (subsegment) {\n if (!(subsegment instanceof Subsegment)) {\n throw new Error('Failed to add subsegment:' + subsegment + ' to subsegment \"' + this.name +\n '\". Not a subsegment.');\n }\n if (this.subsegments === undefined)\n this.subsegments = [];\n subsegment.segment = this.segment;\n subsegment.parent = this;\n if (subsegment.end_time === undefined) {\n this.incrementCounter(subsegment.counter);\n }\n this.subsegments.push(subsegment);\n};\n/**\n * Removes the subsegment from the subsegments array, used in subsegment streaming.\n */\nSubsegment.prototype.removeSubsegment = function removeSubsegment(subsegment) {\n if (!(subsegment instanceof Subsegment)) {\n throw new Error('Failed to remove subsegment:' + subsegment + ' from subsegment \"' + this.name +\n '\". Not a subsegment.');\n }\n if (this.subsegments !== undefined) {\n var index = this.subsegments.indexOf(subsegment);\n if (index >= 0)\n this.subsegments.splice(index, 1);\n }\n};\n/**\n * Adds a property with associated data into the subsegment.\n * @param {string} name - The name of the property to add.\n * @param {Object} data - The data of the property to add.\n */\nSubsegment.prototype.addAttribute = function addAttribute(name, data) {\n this[name] = data;\n};\n/**\n * Adds a subsegement id to record ordering.\n * @param {string} id - A subsegment id.\n */\nSubsegment.prototype.addPrecursorId = function (id) {\n if (typeof id !== 'string')\n logger.getLogger().error('Failed to add id:' + id + ' to subsegment ' + this.name +\n '. Precursor Ids must be of type string.');\n if (this.precursor_ids === undefined)\n this.precursor_ids = [];\n this.precursor_ids.push(id);\n};\n/**\n * Adds a key-value pair that can be queryable through GetTraceSummaries.\n * Only acceptable types are string, float/int and boolean.\n * @param {string} key - The name of key to add.\n * @param {boolean|string|number} value - The value to add for the given key.\n */\nSubsegment.prototype.addAnnotation = function (key, value) {\n if (!(typeof value === 'boolean' || typeof value === 'string' || (typeof value === 'number' && isFinite(value)))) {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Value must be of type string, number or boolean.');\n }\n else if (typeof key !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Key must be of type string.');\n }\n if (this.annotations === undefined)\n this.annotations = {};\n this.annotations[key] = value;\n};\n/**\n * Adds a key-value pair to the metadata.default attribute when no namespace is given.\n * Metadata is not queryable, but is recorded.\n * @param {string} key - The name of the key to add.\n * @param {object|null} value - The value of the associated key.\n * @param {string} [namespace] - The property name to put the key/value pair under.\n */\nSubsegment.prototype.addMetadata = function (key, value, namespace) {\n if (typeof key !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Key must be of type string.');\n }\n else if (namespace && typeof namespace !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + 'namespace: ' + namespace + ' to subsegment ' +\n this.name + '. Namespace must be of type string.');\n }\n var ns = namespace || 'default';\n if (!this.metadata) {\n this.metadata = {};\n }\n if (!this.metadata[ns]) {\n this.metadata[ns] = {};\n }\n this.metadata[ns][key] = value;\n};\nSubsegment.prototype.addSqlData = function addSqlData(sqlData) {\n this.sql = sqlData;\n};\n/**\n * Adds an error with associated data into the subsegment.\n * To handle propagating errors, the subsegment also sets a copy of the error on the\n * root segment. As the error passes up the execution stack, a reference is created\n * on each subsegment to the originating subsegment.\n * @param {Error|string} err - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSubsegment.prototype.addError = function addError(err, remote) {\n if (err == null || typeof err !== 'object' && typeof (err) !== 'string') {\n throw new Error('Failed to add error:' + err + ' to subsegment \"' + this.name +\n '\". Not an object or string literal.');\n }\n this.addFaultFlag();\n if (this.segment && this.segment.exception) {\n if (err === this.segment.exception.ex) {\n this.fault = true;\n this.cause = { id: this.segment.exception.cause };\n return;\n }\n delete this.segment.exception;\n }\n if (this.segment) {\n this.segment.exception = {\n ex: err,\n cause: this.id\n };\n }\n else {\n //error, cannot propagate exception if not added to segment\n }\n if (this.cause === undefined) {\n this.cause = {\n working_directory: process.cwd(),\n exceptions: []\n };\n }\n this.cause.exceptions.unshift(new CapturedException(err, remote));\n};\n/**\n * Adds data for an outgoing HTTP/HTTPS call.\n * @param {http.ClientRequest/https.ClientRequest} req - The request object from the HTTP/HTTPS call.\n * @param {http.IncomingMessage/https.IncomingMessage} res - The response object from the HTTP/HTTPS call.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced\": true hint to generated subsegments such that the AWS X-Ray service expects a corresponding segment from the downstream service.\n */\nSubsegment.prototype.addRemoteRequestData = function addRemoteRequestData(req, res, downstreamXRayEnabled) {\n this.http = new RemoteRequestData(req, res, downstreamXRayEnabled);\n if ('traced' in this.http.request) {\n this.traced = this.http.request.traced;\n delete this.http.request.traced;\n }\n};\n/**\n * Adds fault flag to the subsegment.\n */\nSubsegment.prototype.addFaultFlag = function addFaultFlag() {\n this.fault = true;\n};\n/**\n * Adds error flag to the subsegment.\n */\nSubsegment.prototype.addErrorFlag = function addErrorFlag() {\n this.error = true;\n};\n/**\n * Adds throttle flag to the subsegment.\n */\nSubsegment.prototype.addThrottleFlag = function addThrottleFlag() {\n this.throttle = true;\n};\n/**\n * Closes the current subsegment. This automatically captures any exceptions and sets the end time.\n * @param {Error|string} [err] - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSubsegment.prototype.close = function close(err, remote) {\n var root = this.segment;\n this.end_time = SegmentUtils.getCurrentTime();\n delete this.in_progress;\n if (err)\n this.addError(err, remote);\n if (this.parent)\n this.parent.decrementCounter();\n if (root && root.counter > SegmentUtils.getStreamingThreshold()) {\n if (this.streamSubsegments() && this.parent)\n this.parent.removeSubsegment(this);\n }\n};\n/**\n * Each subsegment holds a counter of open subsegments. This increments\n * the counter such that it can be called from a child and propagate up.\n * @param {Number} [additional] - An additional amount to increment. Used when adding subsegment trees.\n */\nSubsegment.prototype.incrementCounter = function incrementCounter(additional) {\n this.counter = additional ? this.counter + additional + 1 : this.counter + 1;\n if (this.parent)\n this.parent.incrementCounter(additional);\n};\n/**\n * Each subsegment holds a counter of its open subsegments. This decrements\n * the counter such that it can be called from a child and propagate up.\n */\nSubsegment.prototype.decrementCounter = function decrementCounter() {\n this.counter--;\n if (this.parent)\n this.parent.decrementCounter();\n};\n/**\n * Returns a boolean indicating whether or not the subsegment has been closed.\n * @returns {boolean} - Returns true if the subsegment is closed.\n */\nSubsegment.prototype.isClosed = function isClosed() {\n return !this.in_progress;\n};\n/**\n * Sends the subsegment to the daemon.\n */\nSubsegment.prototype.flush = function flush() {\n if (!this.parent || !this.segment) {\n throw new Error('Failed to flush subsegment: ' + this.name + '. Subsegment must be added ' +\n 'to a segment chain to flush.');\n }\n if (this.segment.trace_id) {\n if (this.segment.notTraced !== true) {\n SegmentEmitter.send(this);\n }\n else {\n logger.getLogger().debug('Ignoring flush on subsegment ' + this.id + '. Associated segment is marked as not sampled.');\n }\n }\n else {\n logger.getLogger().debug('Ignoring flush on subsegment ' + this.id + '. Associated segment is missing a trace ID.');\n }\n};\n/**\n * Returns true if the subsegment was streamed in its entirety\n */\nSubsegment.prototype.streamSubsegments = function streamSubsegments() {\n if (this.isClosed() && this.counter <= 0) {\n this.flush();\n return true;\n }\n else if (this.subsegments && this.subsegments.length > 0) {\n var open = [];\n this.subsegments.forEach(function (child) {\n if (!child.streamSubsegments())\n open.push(child);\n });\n this.subsegments = open;\n }\n};\n/**\n * Returns the formatted, trimmed subsegment JSON string to send to the daemon.\n */\nSubsegment.prototype.format = function format() {\n this.type = 'subsegment';\n if (this.parent)\n this.parent_id = this.parent.id;\n if (this.segment)\n this.trace_id = this.segment.trace_id;\n return JSON.stringify(this);\n};\n/**\n * Returns the formatted subsegment JSON string.\n */\nSubsegment.prototype.toString = function toString() {\n return JSON.stringify(this);\n};\nSubsegment.prototype.toJSON = function toJSON() {\n var ignore = ['segment', 'parent', 'counter'];\n if (this.subsegments == null || this.subsegments.length === 0)\n ignore.push('subsegments');\n var thisCopy = Utils.objectWithoutProperties(this, ignore, false);\n return thisCopy;\n};\nmodule.exports = Subsegment;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar CapturedException = require('./attributes/captured_exception');\nvar SegmentEmitter = require('../segment_emitter');\nvar SegmentUtils = require('./segment_utils');\nvar Subsegment = require('./attributes/subsegment');\nvar TraceID = require('./attributes/trace_id');\nvar Utils = require('../utils');\nvar logger = require('../logger');\n/**\n * Represents a segment.\n * @constructor\n * @param {string} name - The name of the subsegment.\n * @param {string} [rootId] - The trace ID of the spawning parent, included in the 'X-Amzn-Trace-Id' header of the incoming request. If one is not supplied, it will be generated.\n * @param {string} [parentId] - The sub/segment ID of the spawning parent, included in the 'X-Amzn-Trace-Id' header of the incoming request.\n */\nfunction Segment(name, rootId, parentId) {\n this.init(name, rootId, parentId);\n}\nSegment.prototype.init = function init(name, rootId, parentId) {\n if (typeof name != 'string')\n throw new Error('Segment name must be of type string.');\n // Validate the Trace ID\n var traceId;\n if (rootId && typeof rootId == 'string') {\n traceId = TraceID.FromString(rootId);\n }\n else {\n traceId = new TraceID();\n }\n var id = crypto.randomBytes(8).toString('hex');\n var startTime = SegmentUtils.getCurrentTime();\n this.trace_id = traceId.toString();\n this.id = id;\n this.start_time = startTime;\n this.name = name || '';\n this.in_progress = true;\n this.counter = 0;\n if (parentId)\n this.parent_id = parentId;\n if (SegmentUtils.serviceData)\n this.setServiceData(SegmentUtils.serviceData);\n if (SegmentUtils.pluginData)\n this.addPluginData(SegmentUtils.pluginData);\n if (SegmentUtils.origin)\n this.origin = SegmentUtils.origin;\n if (SegmentUtils.sdkData)\n this.setSDKData(SegmentUtils.sdkData);\n};\n/**\n * Adds incoming request data to the http block of the segment.\n * @param {IncomingRequestData} data - The data of the property to add.\n */\nSegment.prototype.addIncomingRequestData = function addIncomingRequestData(data) {\n this.http = data;\n};\n/**\n * Adds a key-value pair that can be queryable through GetTraceSummaries.\n * Only acceptable types are string, float/int and boolean.\n * @param {string} key - The name of key to add.\n * @param {boolean|string|number} value - The value to add for the given key.\n */\nSegment.prototype.addAnnotation = function addAnnotation(key, value) {\n if (typeof value !== 'boolean' && typeof value !== 'string' && !isFinite(value)) {\n logger.getLogger().error('Add annotation key: ' + key + ' value: ' + value + ' failed.' +\n ' Annotations must be of type string, number or boolean.');\n return;\n }\n if (this.annotations === undefined)\n this.annotations = {};\n this.annotations[key] = value;\n};\n/**\n * Adds a User ID that can be queried from the X-Ray console. User ID\n * must be a string.\n * @param {string} user - The ID of the user corresponding to this segment\n */\nSegment.prototype.setUser = function (user) {\n if (typeof user !== 'string') {\n logger.getLogger().error('Set user: ' + user + ' failed. User IDs must be of type string.');\n }\n this.user = user;\n};\n/**\n * Adds a key-value pair to the metadata.default attribute when no namespace is given.\n * Metadata is not queryable, but is recorded.\n * @param {string} key - The name of the key to add.\n * @param {object|null} value - The value of the associated key.\n * @param {string} [namespace] - The property name to put the key/value pair under.\n */\nSegment.prototype.addMetadata = function (key, value, namespace) {\n if (typeof key !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Key must be of type string.');\n }\n else if (namespace && typeof namespace !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + 'namespace: ' + namespace + ' to subsegment ' +\n this.name + '. Namespace must be of type string.');\n }\n var ns = namespace || 'default';\n if (!this.metadata) {\n this.metadata = {};\n }\n if (!this.metadata[ns]) {\n this.metadata[ns] = {};\n }\n this.metadata[ns][key] = value;\n};\n/**\n * Adds data about the AWS X-Ray SDK onto the segment.\n * @param {Object} data - Object that contains the version of the SDK, and other information.\n */\nSegment.prototype.setSDKData = function setSDKData(data) {\n if (!data) {\n logger.getLogger().error('Add SDK data: ' + data + ' failed.' +\n 'Must not be empty.');\n return;\n }\n if (!this.aws)\n this.aws = {};\n this.aws.xray = data;\n};\nSegment.prototype.setMatchedSamplingRule = function setMatchedSamplingRule(ruleName) {\n if (this.aws)\n this.aws = JSON.parse(JSON.stringify(this.aws));\n if (this.aws && this.aws['xray'])\n this.aws.xray['rule_name'] = ruleName;\n else\n this.aws = { xray: { 'rule_name': ruleName } };\n};\n/**\n * Adds data about the service into the segment.\n * @param {Object} data - Object that contains the version of the application, and other information.\n */\nSegment.prototype.setServiceData = function setServiceData(data) {\n if (!data) {\n logger.getLogger().error('Add service data: ' + data + ' failed.' +\n 'Must not be empty.');\n return;\n }\n this.service = data;\n};\n/**\n * Adds a service with associated version data into the segment.\n * @param {Object} data - The associated AWS data.\n */\nSegment.prototype.addPluginData = function addPluginData(data) {\n if (this.aws === undefined)\n this.aws = {};\n Object.assign(this.aws, data);\n};\n/**\n * Adds a new subsegment to the array of subsegments.\n * @param {string} name - The name of the new subsegment to append.\n */\nSegment.prototype.addNewSubsegment = function addNewSubsegment(name) {\n var subsegment = new Subsegment(name);\n this.addSubsegment(subsegment);\n return subsegment;\n};\n/**\n * Adds a subsegment to the array of subsegments.\n * @param {Subsegment} subsegment - The subsegment to append.\n */\nSegment.prototype.addSubsegment = function addSubsegment(subsegment) {\n if (!(subsegment instanceof Subsegment))\n throw new Error('Cannot add subsegment: ' + subsegment + '. Not a subsegment.');\n if (this.subsegments === undefined)\n this.subsegments = [];\n subsegment.segment = this;\n subsegment.parent = this;\n this.subsegments.push(subsegment);\n if (!subsegment.end_time)\n this.incrementCounter(subsegment.counter);\n};\n/**\n * Removes the subsegment from the subsegments array, used in subsegment streaming.\n */\nSegment.prototype.removeSubsegment = function removeSubsegment(subsegment) {\n if (!(subsegment instanceof Subsegment)) {\n throw new Error('Failed to remove subsegment:' + subsegment + ' from subsegment \"' + this.name +\n '\". Not a subsegment.');\n }\n if (this.subsegments !== undefined) {\n var index = this.subsegments.indexOf(subsegment);\n if (index >= 0)\n this.subsegments.splice(index, 1);\n }\n};\n/**\n * Adds error data into the segment.\n * @param {Error|string} err - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSegment.prototype.addError = function addError(err, remote) {\n if (err == null || typeof err !== 'object' && typeof (err) !== 'string') {\n throw new Error('Failed to add error:' + err + ' to subsegment \"' + this.name +\n '\". Not an object or string literal.');\n }\n this.addFaultFlag();\n if (this.exception) {\n if (err === this.exception.ex) {\n this.cause = { id: this.exception.cause };\n delete this.exception;\n return;\n }\n delete this.exception;\n }\n if (this.cause === undefined) {\n this.cause = {\n working_directory: process.cwd(),\n exceptions: []\n };\n }\n this.cause.exceptions.push(new CapturedException(err, remote));\n};\n/**\n * Adds fault flag to the subsegment.\n */\nSegment.prototype.addFaultFlag = function addFaultFlag() {\n this.fault = true;\n};\n/**\n * Adds error flag to the subsegment.\n */\nSegment.prototype.addErrorFlag = function addErrorFlag() {\n this.error = true;\n};\n/**\n * Adds throttle flag to the subsegment.\n */\nSegment.prototype.addThrottleFlag = function addThrottleFlag() {\n this.throttle = true;\n};\n/**\n * Returns a boolean indicating whether or not the segment has been closed.\n * @returns {boolean} - Returns true if the subsegment is closed.\n */\nSegment.prototype.isClosed = function isClosed() {\n return !this.in_progress;\n};\n/**\n * Each segment holds a counter of open subsegments. This increments the counter.\n * @param {Number} [additional] - An additional amount to increment. Used when adding subsegment trees.\n */\nSegment.prototype.incrementCounter = function incrementCounter(additional) {\n this.counter = additional ? this.counter + additional + 1 : this.counter + 1;\n if (this.counter > SegmentUtils.streamingThreshold && this.subsegments && this.subsegments.length > 0) {\n var open = [];\n this.subsegments.forEach(function (child) {\n if (!child.streamSubsegments())\n open.push(child);\n });\n this.subsegments = open;\n }\n};\n/**\n * Each segment holds a counter of open subsegments. This decrements\n * the counter such that it can be called from a child and propagate up.\n */\nSegment.prototype.decrementCounter = function decrementCounter() {\n this.counter--;\n if (this.counter <= 0 && this.isClosed()) {\n this.flush();\n }\n};\n/**\n * Closes the current segment. This automatically sets the end time.\n * @param {Error|string} [err] - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSegment.prototype.close = function (err, remote) {\n if (!this.end_time)\n this.end_time = SegmentUtils.getCurrentTime();\n if (err !== undefined)\n this.addError(err, remote);\n delete this.in_progress;\n delete this.exception;\n if (this.counter <= 0) {\n this.flush();\n }\n};\n/**\n * Sends the segment to the daemon.\n */\nSegment.prototype.flush = function flush() {\n if (this.notTraced !== true) {\n delete this.exception;\n var thisCopy = Utils.objectWithoutProperties(this, ['counter', 'notTraced'], true);\n SegmentEmitter.send(thisCopy);\n }\n};\nSegment.prototype.format = function format() {\n var ignore = ['segment', 'parent', 'counter'];\n if (this.subsegments == null || this.subsegments.length === 0)\n ignore.push('subsegments');\n var thisCopy = Utils.objectWithoutProperties(this, ignore, false);\n return JSON.stringify(thisCopy);\n};\nSegment.prototype.toString = function toString() {\n return JSON.stringify(this);\n};\nmodule.exports = Segment;\n", "\"use strict\";\n/**\n * @module context_utils\n */\nvar cls = require('cls-hooked/context');\nvar logger = require('./logger');\nvar Segment = require('./segments/segment');\nvar Subsegment = require('./segments/attributes/subsegment');\nvar cls_mode = true;\nvar NAMESPACE = 'AWSXRay';\nvar SEGMENT = 'segment';\nvar contextOverride = false;\nvar contextUtils = {\n CONTEXT_MISSING_STRATEGY: {\n RUNTIME_ERROR: {\n contextMissing: function contextMissingRuntimeError(message) {\n throw new Error(message);\n }\n },\n LOG_ERROR: {\n contextMissing: function contextMissingLogError(message) {\n var err = new Error(message);\n logger.getLogger().error(err.stack);\n }\n },\n IGNORE_ERROR: {\n contextMissing: function contextMissingIgnoreError(message) {\n }\n }\n },\n contextMissingStrategy: {},\n /**\n * Resolves the segment or subsegment given manual mode and params on the call required.\n * @param [Segment|Subsegment] segment - The segment manually provided via params.XraySegment, if provided.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.resolveManualSegmentParams\n */\n resolveManualSegmentParams: function resolveManualSegmentParams(params) {\n if (params && !contextUtils.isAutomaticMode()) {\n var xraySegment = params.XRaySegment || params.XraySegment;\n var segment = params.Segment;\n var found = null;\n if (xraySegment && (xraySegment instanceof Segment || xraySegment instanceof Subsegment)) {\n found = xraySegment;\n delete params.XRaySegment;\n delete params.XraySegment;\n }\n else if (segment && (segment instanceof Segment || segment instanceof Subsegment)) {\n found = segment;\n delete params.Segment;\n }\n return found;\n }\n },\n /**\n * Gets current CLS namespace for X-Ray SDK or creates one if absent.\n * @returns {Namespace}\n * @alias module:context_utils.getNamespace\n */\n getNamespace: function getNamespace() {\n return cls.getNamespace(NAMESPACE) || cls.createNamespace(NAMESPACE);\n },\n /**\n * Resolves the segment or subsegment given manual or automatic mode.\n * @param [Segment|Subsegment] segment - The segment manually provided, if provided.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.resolveSegment\n */\n resolveSegment: function resolveSegment(segment) {\n if (cls_mode) {\n return this.getSegment();\n }\n else if (segment && !cls_mode) {\n return segment;\n }\n else if (!segment && !cls_mode) {\n contextUtils.contextMissingStrategy.contextMissing('No sub/segment specified. A sub/segment must be provided for manual mode.');\n }\n },\n /**\n * Returns the current segment or subsegment. For use with in automatic mode only.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.getSegment\n */\n getSegment: function getSegment() {\n if (cls_mode) {\n var segment = contextUtils.getNamespace(NAMESPACE).get(SEGMENT);\n if (!segment) {\n contextUtils.contextMissingStrategy.contextMissing('Failed to get the current sub/segment from the context.');\n }\n else if (segment instanceof Segment && process.env.LAMBDA_TASK_ROOT && segment.facade == true) {\n segment.resolveLambdaTraceData();\n }\n return segment;\n }\n else {\n contextUtils.contextMissingStrategy.contextMissing('Cannot get sub/segment from context. Not supported in manual mode.');\n }\n },\n /**\n * Sets the current segment or subsegment. For use with in automatic mode only.\n * @param [Segment|Subsegment] segment - The sub/segment to set.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.setSegment\n */\n setSegment: function setSegment(segment) {\n if (cls_mode) {\n if (!contextUtils.getNamespace(NAMESPACE).set(SEGMENT, segment))\n logger.getLogger().warn('Failed to set the current sub/segment on the context.');\n }\n else {\n contextUtils.contextMissingStrategy.contextMissing('Cannot set sub/segment on context. Not supported in manual mode.');\n }\n },\n /**\n * Returns true if in automatic mode, otherwise false.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.isAutomaticMode\n */\n isAutomaticMode: function isAutomaticMode() {\n return cls_mode;\n },\n /**\n * Enables automatic mode. Automatic mode uses 'cls-hooked'.\n * @see https://github.com/jeff-lewis/cls-hooked\n * @alias module:context_utils.enableAutomaticMode\n */\n enableAutomaticMode: function enableAutomaticMode() {\n cls_mode = true;\n contextUtils.getNamespace(NAMESPACE);\n logger.getLogger().debug('Overriding AWS X-Ray SDK mode. Set to automatic mode.');\n },\n /**\n * Disables automatic mode. Current segment or subsegment then must be passed manually\n * via the parent optional on captureFunc, captureAsyncFunc etc.\n * @alias module:context_utils.enableManualMode\n */\n enableManualMode: function enableManualMode() {\n cls_mode = false;\n if (cls.getNamespace(NAMESPACE))\n cls.destroyNamespace(NAMESPACE);\n logger.getLogger().debug('Overriding AWS X-Ray SDK mode. Set to manual mode.');\n },\n /**\n * Sets the context missing strategy if no context missing strategy is set using the environment variable with\n * key AWS_XRAY_CONTEXT_MISSING. The context missing strategy's contextMissing function will be called whenever\n * trace context is not found.\n * @param {string|function} strategy - The strategy to set. Valid string values are 'LOG_ERROR' and 'RUNTIME_ERROR'.\n * Alternatively, a custom function can be supplied, which takes a error message string.\n */\n setContextMissingStrategy: function setContextMissingStrategy(strategy) {\n if (!contextOverride) {\n if (typeof strategy === 'string') {\n var lookupStrategy = contextUtils.CONTEXT_MISSING_STRATEGY[strategy.toUpperCase()];\n if (lookupStrategy) {\n contextUtils.contextMissingStrategy.contextMissing = lookupStrategy.contextMissing;\n if (process.env.AWS_XRAY_CONTEXT_MISSING)\n logger.getLogger().debug('AWS_XRAY_CONTEXT_MISSING is set. Configured context missing strategy to ' +\n process.env.AWS_XRAY_CONTEXT_MISSING + '.');\n else\n logger.getLogger().debug('Configured context missing strategy to: ' + strategy);\n }\n else {\n throw new Error('Invalid context missing strategy: ' + strategy + '. Valid values are ' +\n Object.keys(contextUtils.CONTEXT_MISSING_STRATEGY) + '.');\n }\n }\n else if (typeof strategy === 'function') {\n contextUtils.contextMissingStrategy.contextMissing = strategy;\n logger.getLogger().info('Configured custom context missing strategy to function: ' + strategy.name);\n }\n else {\n throw new Error('Context missing strategy must be either a string or a custom function.');\n }\n }\n else {\n logger.getLogger().warn('Ignoring call to setContextMissingStrategy as AWS_XRAY_CONTEXT_MISSING is set. ' +\n 'The current context missing strategy will not be changed.');\n }\n }\n};\ncls.createNamespace(NAMESPACE);\nlogger.getLogger().debug('Starting the AWS X-Ray SDK in automatic mode (default).');\nif (process.env.AWS_XRAY_CONTEXT_MISSING) {\n contextUtils.setContextMissingStrategy(process.env.AWS_XRAY_CONTEXT_MISSING);\n contextOverride = true;\n}\nelse {\n contextUtils.contextMissingStrategy.contextMissing = contextUtils.CONTEXT_MISSING_STRATEGY.RUNTIME_ERROR.contextMissing;\n logger.getLogger().debug('Using default context missing strategy: RUNTIME_ERROR');\n}\nmodule.exports = contextUtils;\n", "\"use strict\";\nvar { getHttpResponseData } = require('../segments/segment_utils');\n/**\n * Represents an incoming HTTP/HTTPS call.\n * @constructor\n * @param {http.IncomingMessage|https.IncomingMessage} req - The request object from the HTTP/HTTPS call.\n */\nfunction IncomingRequestData(req) {\n this.init(req);\n}\nIncomingRequestData.prototype.init = function init(req) {\n var forwarded = !!req.headers['x-forwarded-for'];\n var url;\n if (req.connection)\n url = ((req.connection.secure || req.connection.encrypted) ? 'https://' : 'http://') +\n ((req.headers['host'] || '') + (req.url || ''));\n this.request = {\n method: req.method || '',\n user_agent: req.headers['user-agent'] || '',\n client_ip: getClientIp(req) || '',\n url: url || '',\n };\n if (forwarded)\n this.request.x_forwarded_for = forwarded;\n};\nvar getClientIp = function getClientIp(req) {\n var clientIp;\n if (req.headers['x-forwarded-for'])\n clientIp = (req.headers['x-forwarded-for'] || '').split(',')[0];\n else if (req.connection && req.connection.remoteAddress)\n clientIp = req.connection.remoteAddress;\n else if (req.socket && req.socket.remoteAddress)\n clientIp = req.socket.remoteAddress;\n else if (req.connection && req.connection.socket && req.connection.socket.remoteAddress)\n clientIp = req.connection.socket.remoteAddress;\n return clientIp;\n};\n/**\n * Closes the local and automatically captures the response data.\n * @param {http.ServerResponse|https.ServerResponse} res - The response object from the HTTP/HTTPS call.\n */\nIncomingRequestData.prototype.close = function close(res) {\n this.response = getHttpResponseData(res);\n};\nmodule.exports = IncomingRequestData;\n", "\"use strict\";\n/**\n * Represents a LocalReservoir object that keeps track of the number of traces per second sampled and\n * the fixed rate for a given sampling rule defined locally.\n * It also decides if a given trace should be sampled or not based on the state of current second.\n * @constructor\n * @param {number} fixedTarget - An integer value to specify the maximum number of traces per second to sample.\n * @param {number} fallbackRate - A value between 0 and 1 indicating the sampling rate after the maximum traces per second has been hit.\n */\nfunction LocalReservoir(fixedTarget, fallbackRate) {\n this.init(fixedTarget, fallbackRate);\n}\nLocalReservoir.prototype.init = function init(fixedTarget, fallbackRate) {\n this.usedThisSecond = 0;\n if (typeof fixedTarget === 'number' && fixedTarget % 1 === 0 && fixedTarget >= 0)\n this.fixedTarget = fixedTarget;\n else\n throw new Error('Error in sampling file. Rule attribute \"fixed_target\" must be a non-negative integer.');\n if (typeof fallbackRate === 'number' && fallbackRate >= 0 && fallbackRate <= 1)\n this.fallbackRate = fallbackRate;\n else\n throw new Error('Error in sampling file. Rule attribute \"rate\" must be a number between 0 and 1 inclusive.');\n};\nLocalReservoir.prototype.isSampled = function isSampled() {\n var now = Math.round(new Date().getTime() / 1000);\n if (now !== this.thisSecond) {\n this.usedThisSecond = 0;\n this.thisSecond = now;\n }\n if (this.usedThisSecond >= this.fixedTarget)\n return Math.random() < this.fallbackRate;\n this.usedThisSecond++;\n return true;\n};\nmodule.exports = LocalReservoir;\n", "\"use strict\";\nvar fs = require('fs');\nvar LocalReservoir = require('./local_reservoir');\nvar Utils = require('../../utils');\nvar defaultRules = require('../../resources/default_sampling_rules.json');\nvar logger = require('../../logger');\n/**\n * The local sampler used to make sampling decisions when the decisions are absent in the incoming requests\n * and the default sampler needs to fall back on local rules. It will also be the primary sampler\n * if the default sampler is disabled.\n * @module LocalSampler\n */\nvar LocalSampler = {\n /**\n * Makes a sample decision based on the sample request.\n * @param {object} sampleRequest - Contains information for rules matching.\n * @module LocalSampler\n * @function shouldSample\n */\n shouldSample: function shouldSample(sampleRequest) {\n var host = sampleRequest.host;\n var httpMethod = sampleRequest.httpMethod;\n var urlPath = sampleRequest.urlPath;\n var formatted = '{ http_method: ' + httpMethod + ', host: ' + host + ', url_path: ' + urlPath + ' }';\n var matched;\n this.rules.some(function (rule) {\n // Any null parameters provided will be considered an implicit match.\n if (rule.default || (host == null || (Utils.wildcardMatch(rule.host, host))\n && (httpMethod == null || Utils.wildcardMatch(rule.http_method, httpMethod))\n && (urlPath == null || Utils.wildcardMatch(rule.url_path, urlPath)))) {\n matched = rule.reservoir;\n logger.getLogger().debug('Local sampling rule match found for ' + formatted + '. Matched ' + (rule.default ?\n 'default' : '{ http_method: ' + rule.http_method + ', host: ' + rule.host + ', url_path: ' +\n rule.url_path + ' }') + '. Using fixed_target: ' + matched.fixedTarget + ' and rate: ' + matched.fallbackRate + '.');\n return true;\n }\n });\n if (matched) {\n return matched.isSampled();\n }\n else {\n logger.getLogger().debug('No sampling rule matched for ' + formatted);\n return false;\n }\n },\n /**\n * Set local rules for making sampling decisions.\n * @module LocalSampler\n * @function setLocalRules\n */\n setLocalRules: function setLocalRules(source) {\n if (source) {\n if (typeof source === 'string') {\n logger.getLogger().info('Using custom sampling rules file: ' + source);\n this.rules = loadRulesConfig(JSON.parse(fs.readFileSync(source, 'utf8')));\n }\n else {\n logger.getLogger().info('Using custom sampling rules source.');\n this.rules = loadRulesConfig(source);\n }\n }\n else\n this.rules = parseRulesConfig(defaultRules);\n }\n};\nvar loadRulesConfig = function loadRulesConfig(config) {\n if (!config.version)\n throw new Error('Error in sampling file. Missing \"version\" attribute.');\n if (config.version === 1 || config.version === 2)\n return parseRulesConfig(config);\n else\n throw new Error('Error in sampling file. Unknown version \"' + config.version + '\".');\n};\nvar parseRulesConfig = function parseRulesConfig(config) {\n var defaultRule;\n var rules = [];\n if (config.default) {\n var missing = [];\n for (var key in config.default) {\n if (key !== 'fixed_target' && key !== 'rate') {\n throw new Error('Error in sampling file. Invalid attribute for default: ' + key +\n '. Valid attributes for default are \"fixed_target\" and \"rate\".');\n }\n else if (typeof config.default[key] !== 'number') {\n throw new Error('Error in sampling file. Default ' + key + ' must be a number.');\n }\n }\n if (typeof config.default.fixed_target === 'undefined')\n missing.push('fixed_target');\n if (typeof config.default.rate === 'undefined')\n missing.push('rate');\n if (missing.length !== 0)\n throw new Error('Error in sampling file. Missing required attributes for default: ' + missing + '.');\n defaultRule = { default: true, reservoir: new LocalReservoir(config.default.fixed_target, config.default.rate) };\n }\n else {\n throw new Error('Error in sampling file. Expecting \"default\" object to be defined with attributes \"fixed_target\" and \"rate\".');\n }\n if (Array.isArray(config.rules)) {\n config.rules.forEach(function (rawRule) {\n var params = {};\n var required;\n if (config.version === 2)\n required = { host: 1, http_method: 1, url_path: 1, fixed_target: 1, rate: 1 };\n if (config.version === 1)\n required = { service_name: 1, http_method: 1, url_path: 1, fixed_target: 1, rate: 1 };\n for (var key in rawRule) {\n var value = rawRule[key];\n if (!required[key] && key != 'description')\n throw new Error('Error in sampling file. Rule ' + JSON.stringify(rawRule) + ' has invalid attribute: ' + key + '.');\n else if (key != 'description' && !value && value !== 0)\n throw new Error('Error in sampling file. Rule ' + JSON.stringify(rawRule) + ' attribute \"' + key + '\" has invalid value: ' + value + '.');\n else {\n if (config.version === 2)\n params[key] = value;\n if (config.version === 1 && key === 'service_name')\n params['host'] = value;\n else\n params[key] = value;\n delete required[key];\n }\n }\n if (Object.keys(required).length !== 0 && required.constructor === Object)\n throw new Error('Error in sampling file. Rule ' + JSON.stringify(rawRule) + ' is missing required attributes: ' + Object.keys(required) + '.');\n var rule = params;\n rule.reservoir = new LocalReservoir(rawRule.fixed_target, rawRule.rate);\n rules.push(rule);\n });\n }\n rules.push(defaultRule);\n return rules;\n};\nLocalSampler.setLocalRules();\nmodule.exports = LocalSampler;\n", "\"use strict\";\n/**\n * Represents a Reservoir object that keeps track of the number of traces per second sampled and\n * the fixed rate for a given sampling rule. This information is fetched from X-Ray serivce.\n * It decides if a given trace should be borrowed or sampled or not sampled based on the state of current second.\n * @constructor\n */\nfunction Reservoir() {\n this.init();\n}\nReservoir.prototype.init = function init() {\n this.quota = null;\n this.TTL = null;\n this.takenThisSec = 0;\n this.borrowedThisSec = 0;\n this.reportInterval = 1;\n this.reportElapsed = 0;\n};\nReservoir.prototype.borrowOrTake = function borrowOrTake(now, canBorrow) {\n this.adjustThisSec(now);\n // Don't borrow if the quota is available and fresh.\n if (this.quota >= 0 && this.TTL >= now) {\n if (this.takenThisSec >= this.quota)\n return false;\n this.takenThisSec++;\n return 'take';\n }\n // Otherwise try to borrow if the quota is not present or expired.\n if (canBorrow) {\n if (this.borrowedThisSec >= 1)\n return false;\n this.borrowedThisSec++;\n return 'borrow';\n }\n};\nReservoir.prototype.adjustThisSec = function adjustThisSec(now) {\n if (now !== this.thisSec) {\n this.takenThisSec = 0;\n this.borrowedThisSec = 0;\n this.thisSec = now;\n }\n};\nReservoir.prototype.loadNewQuota = function loadNewQuota(quota, TTL, interval) {\n if (quota)\n this.quota = quota;\n if (TTL)\n this.TTL = TTL;\n if (interval)\n this.reportInterval = interval / 10; // Report interval is always time of 10.\n};\nReservoir.prototype.timeToReport = function timeToReport() {\n if (this.reportElapsed + 1 >= this.reportInterval) {\n this.reportElapsed = 0;\n return true;\n }\n else {\n this.reportElapsed += 1;\n return false;\n }\n};\nmodule.exports = Reservoir;\n", "\"use strict\";\nvar Utils = require('../../utils');\nvar Reservoir = require('./reservoir');\n/**\n * The data model for a sampling rule defined using X-Ray API CreateSamplingRules.\n * It should be only instantiated directly from the X-Ray API response.\n * @constructor\n */\nfunction SamplingRule(name, priority, rate, reservoirSize, host, httpMethod, urlPath, serviceName, serviceType) {\n this.init(name, priority, rate, reservoirSize, host, httpMethod, urlPath, serviceName, serviceType);\n}\nSamplingRule.prototype.init = function init(name, priority, rate, reservoirSize, host, httpMethod, urlPath, serviceName, serviceType) {\n this.name = name;\n this.priority = priority;\n this.rate = rate;\n this.host = host;\n this.httpMethod = httpMethod;\n this.urlPath = urlPath;\n this.serviceName = serviceName;\n this.serviceType = serviceType;\n this.reservoir = new Reservoir();\n this.borrow = !!reservoirSize;\n this.resetStatistics();\n};\nSamplingRule.prototype.match = function match(sampleRequest) {\n var host = sampleRequest.host;\n var httpMethod = sampleRequest.httpMethod;\n var serviceName = sampleRequest.serviceName;\n var urlPath = sampleRequest.urlPath;\n var serviceType = sampleRequest.serviceType;\n return this.isDefault() || (!host || Utils.wildcardMatch(this.host, host))\n && (!httpMethod || Utils.wildcardMatch(this.httpMethod, httpMethod))\n && (!serviceName || Utils.wildcardMatch(this.serviceName, serviceName))\n && (!urlPath || Utils.wildcardMatch(this.urlPath, urlPath))\n && (!serviceType || Utils.wildcardMatch(this.serviceType, serviceType));\n};\nSamplingRule.prototype.snapshotStatistics = function snapshotStatistics() {\n var statistics = {\n requestCount: this.requestCount,\n borrowCount: this.borrowCount,\n sampledCount: this.sampledCount\n };\n this.resetStatistics();\n return statistics;\n};\nSamplingRule.prototype.merge = function merge(rule) {\n this.reservoir = rule.reservoir;\n this.requestCount = rule.requestCount;\n this.borrowCount = rule.borrowCount;\n this.sampledCount = rule.sampledCount;\n rule = null; // unref the old rule so it can be garbage collected.\n};\nSamplingRule.prototype.isDefault = function isDefault() {\n return this.name === 'Default'; // \"Default\" is a reserved keyword from X-Ray back-end.\n};\nSamplingRule.prototype.incrementRequestCount = function incrementRequestCount() {\n this.requestCount++;\n};\nSamplingRule.prototype.incrementBorrowCount = function incrementBorrowCount() {\n this.borrowCount++;\n};\nSamplingRule.prototype.incrementSampledCount = function incrementSampledCount() {\n this.sampledCount++;\n};\nSamplingRule.prototype.setRate = function setRate(rate) {\n this.rate = rate;\n};\nSamplingRule.prototype.getRate = function getRate() {\n return this.rate;\n};\nSamplingRule.prototype.getName = function getName() {\n return this.name;\n};\nSamplingRule.prototype.getPriority = function getPriority() {\n return this.priority;\n};\nSamplingRule.prototype.getReservoir = function getReservoir() {\n return this.reservoir;\n};\nSamplingRule.prototype.resetStatistics = function resetStatistics() {\n this.requestCount = 0;\n this.borrowCount = 0;\n this.sampledCount = 0;\n};\nSamplingRule.prototype.canBorrow = function canBorrow() {\n return this.borrow;\n};\nSamplingRule.prototype.everMatched = function everMatched() {\n return this.requestCount > 0;\n};\nSamplingRule.prototype.timeToReport = function timeToReport() {\n return this.reservoir.timeToReport();\n};\nmodule.exports = SamplingRule;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar logger = require('../../logger');\nvar SamplingRule = require('./sampling_rule');\nvar DaemonConfig = require('../../daemon_config');\nconst util = require('util');\nconst http = require('http');\n/**\n * The ServiceConnector that calls X-Ray service and convert the API response bodies to data models\n * defined in the X-Ray SDK and return them to the pollers.\n * @module ServiceConnector\n */\nvar ServiceConnector = {\n // client_id is a 12 byte cryptographically secure random hex\n // identifying the SDK instance and is generated during SDK initialization/\n // This is required when reporting sampling to X-Ray back-end.\n clientId: crypto.randomBytes(12).toString('hex'),\n samplingRulesPath: '/GetSamplingRules',\n samplingTargetsPath: '/SamplingTargets',\n logger: logger,\n httpClient: http,\n fetchSamplingRules: function fetchSamplingRules(callback) {\n const body = '{}'; // Payload needed for GetSamplingRules POST request\n const options = getOptions(this.samplingRulesPath, body.length);\n const httpReq = this.httpClient.__request ? this.httpClient.__request : this.httpClient.request;\n const req = httpReq(options, res => {\n var data = '';\n res.on('data', d => {\n data += d;\n });\n res.on('error', error => {\n callback(error);\n });\n res.on('end', () => {\n var dataObj;\n try {\n dataObj = JSON.parse(data);\n }\n catch (err) {\n callback(err);\n return;\n }\n if (!dataObj) {\n callback(new Error('AWS X-Ray GetSamplingRules API returned empty response'));\n return;\n }\n var newRules = assembleRules(dataObj);\n callback(null, newRules);\n });\n });\n req.on('error', (err) => {\n callback(new Error(`Failed to connect to X-Ray daemon at ${options.hostname}:${options.port} to get sampling rules.`));\n });\n req.write(body);\n req.end();\n },\n fetchTargets: function fetchTargets(rules, callback) {\n const body = JSON.stringify(constructStatisticsDocs(rules));\n const options = getOptions(this.samplingTargetsPath, body.length);\n const httpReq = this.httpClient.__request ? this.httpClient.__request : this.httpClient.request;\n const req = httpReq(options, res => {\n var data = '';\n res.on('data', d => {\n data += d;\n });\n res.on('error', error => {\n callback(error);\n });\n res.on('end', () => {\n var dataObj;\n try {\n dataObj = JSON.parse(data);\n }\n catch (err) {\n callback(err);\n return;\n }\n if (!dataObj || typeof dataObj['LastRuleModification'] != 'number') {\n callback(new Error('AWS X-Ray SamplingTargets API returned invalid response'));\n return;\n }\n var targetsMapping = assembleTargets(dataObj);\n var ruleFreshness = dateToEpoch(dataObj['LastRuleModification']);\n callback(null, targetsMapping, ruleFreshness);\n });\n });\n req.on('error', (err) => {\n callback(new Error(`Failed to connect to X-Ray daemon at ${options.hostname}:${options.port} to get sampling targets.`));\n });\n req.write(body);\n req.end();\n }\n};\nvar constructStatisticsDocs = function constructStatisticsDocs(rules) {\n var documents = [];\n var now = Math.floor(new Date().getTime() / 1000);\n rules.forEach(function (rule) {\n var statistics = rule.snapshotStatistics();\n var doc = {\n 'RuleName': rule.getName(),\n 'ClientID': ServiceConnector.clientId,\n 'RequestCount': statistics.requestCount,\n 'BorrowCount': statistics.borrowCount,\n 'SampledCount': statistics.sampledCount,\n 'Timestamp': now\n };\n documents.push(doc);\n });\n return { SamplingStatisticsDocuments: documents };\n};\nvar assembleRules = function assembleRules(data) {\n var newRules = [];\n var ruleList = data['SamplingRuleRecords'] || [];\n ruleList.forEach(function (ruleRecord) {\n ruleRecord = ruleRecord['SamplingRule'];\n // For forward compatibility reason right now it only\n // deals with version 1 sampling rules.\n if (isRuleValid(ruleRecord)) {\n var newRule = new SamplingRule(ruleRecord['RuleName'], ruleRecord['Priority'], ruleRecord['FixedRate'], ruleRecord['ReservoirSize'], ruleRecord['Host'], ruleRecord['HTTPMethod'], ruleRecord['URLPath'], ruleRecord['ServiceName'], ruleRecord['ServiceType']);\n newRules.push(newRule);\n }\n });\n return newRules;\n};\nvar assembleTargets = function assembleTargets(data) {\n var docs = data['SamplingTargetDocuments'] || [];\n var targetsMapping = {};\n docs.forEach(function (doc) {\n var newTarget = {\n rate: doc['FixedRate'],\n quota: doc['ReservoirQuota'],\n TTL: dateToEpoch(doc['ReservoirQuotaTTL']),\n interval: doc['Interval']\n };\n targetsMapping[doc['RuleName']] = newTarget;\n });\n return targetsMapping;\n};\nvar isRuleValid = function isRuleValid(record) {\n return record['Version'] === 1\n && record['ResourceARN'] === '*'\n && record['Attributes'] && Object.keys(record['Attributes']).length === 0\n && record['ServiceType']\n && record['RuleName']\n && record['Priority']\n && typeof record['FixedRate'] == 'number';\n};\nvar dateToEpoch = function dateToEpoch(date) {\n return new Date(date).getTime() / 1000;\n};\nvar getOptions = function getOptions(path, contentLength) {\n const options = {\n hostname: DaemonConfig.tcp_ip,\n port: DaemonConfig.tcp_port,\n method: 'POST',\n path: path,\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': contentLength,\n 'Host': util.format('%s:%d', DaemonConfig.tcp_ip, DaemonConfig.tcp_port)\n }\n };\n return options;\n};\nmodule.exports = ServiceConnector;\n", "\"use strict\";\nvar TTL = 60 * 60; // The cache expires 1 hour after the last refresh time.\n/**\n * The rule cache that stores sampling rules fetched from X-Ray service.\n * @module RuleCache\n */\nvar RuleCache = {\n rules: [],\n lastUpdated: null,\n /**\n * Tries to find a valid rule that matches the sample request.\n * @param {object} sampleRequest - Contains information for rules matching.\n * @param {number} now - Current epoch in seconds.\n * @module RuleCache\n * @function getMatchedRule\n */\n getMatchedRule: function getMatchedRule(sampleRequest, now) {\n if (isExpired(now))\n return null;\n var matchedRule;\n this.rules.forEach(function (rule) {\n if (!matchedRule && rule.match(sampleRequest))\n matchedRule = rule;\n if (rule.isDefault() && !matchedRule)\n matchedRule = rule;\n });\n return matchedRule;\n },\n /**\n * Load rules fetched from X-Ray service in order sorted by priorities.\n * @param {object} rules - Newly fetched rules to load.\n * @module RuleCache\n * @function loadRules\n */\n loadRules: function loadRules(rules) {\n // Record the old rules for later merging.\n var oldRules = {};\n this.rules.forEach(function (rule) {\n oldRules[rule.getName()] = rule;\n });\n // Update the rules in the cache.\n this.rules = rules;\n // Transfer state information to refreshed rules.\n this.rules.forEach(function (rule) {\n var oldRule = oldRules[rule.getName()];\n if (oldRule)\n rule.merge(oldRule);\n });\n // The cache should maintain the order of the rules based on\n // priority. If priority is the same we sort name by alphabet\n // as rule name is unique.\n this.rules.sort(function (a, b) {\n var v = a.getPriority() - b.getPriority();\n if (v !== 0)\n return v;\n if (a.getName() > b.getName())\n return 1;\n else\n return -1;\n });\n },\n /**\n * Load targets fetched from X-Ray service.\n * @param {object} targetsMapping - Newly fetched targets map with rule name as key.\n * @module RuleCache\n * @function loadTargets\n */\n loadTargets: function loadTargets(targetsMapping) {\n this.rules.forEach(function (rule) {\n var target = targetsMapping[rule.getName()];\n if (target) {\n rule.getReservoir().loadNewQuota(target.quota, target.TTL, target.interval);\n rule.setRate(target.rate);\n }\n });\n },\n getRules: function getRules() {\n return this.rules;\n },\n timestamp: function timestamp(now) {\n this.lastUpdated = now;\n },\n getLastUpdated: function getLastUpdated() {\n return this.lastUpdated;\n }\n};\nvar isExpired = function isExpired(now) {\n // The cache is considered expired if it is never loaded.\n if (!RuleCache.getLastUpdated())\n return true;\n return now > RuleCache.getLastUpdated() + TTL;\n};\nmodule.exports = RuleCache;\n", "\"use strict\";\nvar logger = require('../../logger');\nvar ServiceConnector = require('./service_connector');\nvar ruleCache = require('./rule_cache');\nvar DEFAULT_INTERVAL = 5 * 60 * 1000; // 5 minutes on sampling rules fetch\n/**\n * The RulePoller that periodically fetch sampling rules from X-Ray service\n * and load them into RuleCache.\n * @module RulePoller\n */\nvar RulePoller = {\n start: function start() {\n if (this.poller)\n clearInterval(this.poller);\n // Refresh sampling rules cache with no jitter upon start.\n refresh(false);\n this.poller = setInterval(refresh, DEFAULT_INTERVAL);\n this.poller.unref();\n },\n};\nvar refresh = function refresh(jitter) {\n // Add jitter by default unless explicitly told not to.\n jitter = typeof jitter === 'undefined' ? true : jitter;\n if (jitter) {\n var delay = getJitter();\n setTimeout(refreshWithFirewall, delay);\n }\n else\n refreshWithFirewall();\n};\nvar refreshWithFirewall = function refreshWithFirewall() {\n try {\n refreshCache();\n }\n catch (e) {\n logger.getLogger().warn('Encountered unexpected exception when fetching sampling rules: ' + e);\n }\n};\nvar refreshCache = function refreshCache() {\n // Timestamp should be generated *before* the actual outbound call to ensure\n // we don't mark the cache as being fresher than it actually is.\n var now = Math.floor(new Date().getTime() / 1000);\n // Pass a callback that only runs when the new rules are\n // successfully fetched. \n ServiceConnector.fetchSamplingRules(function (err, newRules) {\n if (err) {\n logger.getLogger().warn('Failed to retrieve sampling rules from X-Ray service:', err);\n }\n else if (newRules.length !== 0) {\n ruleCache.loadRules(newRules);\n ruleCache.timestamp(now);\n logger.getLogger().info('Successfully refreshed centralized sampling rule cache.');\n }\n });\n};\n// A random jitter of up to 5 seconds is injected after every run to ensure\n// the calls eventually get evenly distributed over the 5 minute window.\nvar getJitter = function getJitter() {\n return Math.random() * 5;\n};\nmodule.exports = RulePoller;\n", "\"use strict\";\nvar rulePoller = require('./rule_poller');\nvar serviceConnector = require('./service_connector');\nvar ruleCache = require('./rule_cache');\nvar logger = require('../../logger');\nvar DEFAULT_INTERVAL = 10 * 1000; // 10 seconds on sampling targets fetch\n/**\n * The TargetPoller that periodically fetch sampling targets from X-Ray service\n * and load them into RuleCache.\n * @module TargetPoller\n */\nvar TargetPoller = {\n interval: DEFAULT_INTERVAL,\n start: function start() {\n this.poller = setInterval(refreshWithFirewall, DEFAULT_INTERVAL + getJitter());\n this.poller.unref();\n },\n};\nvar refreshWithFirewall = function refreshWithFirewall() {\n try {\n refresh();\n }\n catch (e) {\n logger.getLogger().warn('Encountered unexpected exception when fetching sampling targets: ' + e);\n }\n};\nvar refresh = function refresh() {\n var candidates = getCandidates();\n if (candidates && candidates.length > 0) {\n serviceConnector.fetchTargets(candidates, function (err, targetsMapping, ruleFreshness) {\n if (err) {\n logger.getLogger().warn('Failed to retrieve sampling targets from X-Ray service:', err);\n return;\n }\n ruleCache.loadTargets(targetsMapping);\n if (ruleFreshness > ruleCache.getLastUpdated()) {\n logger.getLogger().info('Performing out-of-band sampling rule polling to fetch updated rules.');\n rulePoller.start();\n }\n logger.getLogger().info('Successfully reported rule statistics to get new sampling quota.');\n });\n }\n};\n// Don't report a rule statistics if any of the conditions is met:\n// 1. The report time hasn't come (some rules might have larger report intervals).\n// 2. The rule is never matched.\nvar getCandidates = function getCandidates() {\n var rules = ruleCache.getRules();\n var candidates = [];\n rules.forEach(function (rule) {\n if (rule.everMatched() && rule.timeToReport())\n candidates.push(rule);\n });\n return candidates;\n};\n// A random jitter of up to 0.1 seconds is injected after every run to ensure\n// the calls eventually get evenly distributed over the 10 second window.\nvar getJitter = function getJitter() {\n return Math.random() / TargetPoller.interval;\n};\nmodule.exports = TargetPoller;\n", "\"use strict\";\nvar logger = require('../../logger');\nconst util = require('util');\nvar SegmentUtils = require('../../segments/segment_utils');\n/**\n * The default sampler used to make sampling decisions when the decisions are absent in the incoming requests.\n * The sampler use pollers to poll sampling rules from X-Ray service.\n * @module DefaultSampler\n */\nvar DefaultSampler = {\n localSampler: require('./local_sampler'),\n rulePoller: require('./rule_poller'),\n targetPoller: require('./target_poller'),\n ruleCache: require('./rule_cache'),\n started: false,\n /**\n * Makes a sample decision based on the sample request.\n * @param {object} sampleRequest - Contains information for rules matching.\n * @module DefaultSampler\n * @function shouldSample\n */\n shouldSample: function shouldSample(sampleRequest) {\n try {\n if (!this.started)\n this.start();\n if (!sampleRequest.serviceType)\n sampleRequest.serviceType = SegmentUtils.origin;\n var now = Math.floor(new Date().getTime() / 1000);\n var matchedRule = this.ruleCache.getMatchedRule(sampleRequest, now);\n if (matchedRule) {\n logger.getLogger().debug(util.format('Rule %s is matched.', matchedRule.getName()));\n return processMatchedRule(matchedRule, now);\n }\n else {\n logger.getLogger().info('No effective centralized sampling rule match. Fallback to local rules.');\n return this.localSampler.shouldSample(sampleRequest);\n }\n }\n catch (err) {\n logger.getLogger().error('Unhandled exception by the SDK during making sampling decisions: ' + err);\n }\n },\n /**\n * Set local rules in case there is a need to fallback.\n * @module DefaultSampler\n * @function setLocalRules\n */\n setLocalRules: function setLocalRules(source) {\n this.localSampler.setLocalRules(source);\n },\n /**\n * Start the pollers to poll sampling rules and targets from X-Ray service.\n * @module DefaultSampler\n * @function start\n */\n start: function start() {\n if (!this.started) {\n this.rulePoller.start();\n this.targetPoller.start();\n this.started = true;\n }\n }\n};\nvar processMatchedRule = function processMatchedRule(rule, now) {\n // As long as a rule is matched we increment request counter.\n rule.incrementRequestCount();\n var reservoir = rule.getReservoir();\n var sample = true;\n // We check if we can borrow or take from reservoir first.\n var decision = reservoir.borrowOrTake(now, rule.canBorrow());\n if (decision === 'borrow')\n rule.incrementBorrowCount();\n else if (decision === 'take')\n rule.incrementSampledCount();\n // Otherwise we compute based on FixedRate of this sampling rule.\n else if (Math.random() <= rule.getRate())\n rule.incrementSampledCount();\n else\n sample = false;\n if (sample)\n return rule.getName();\n else\n return false;\n};\nmodule.exports = DefaultSampler;\n", "\"use strict\";\n/**\n * Middleware Utils module.\n *\n * Exposes various configuration and helper methods to be used by the middleware.\n * @module mw_utils\n */\nvar Segment = require('../segments/segment');\nvar IncomingRequestData = require('./incoming_request_data');\nvar logger = require('../logger');\nvar coreUtils = require('../utils');\nvar wildcardMatch = require('../utils').wildcardMatch;\nvar processTraceData = require('../utils').processTraceData;\n//headers are case-insensitive\nvar XRAY_HEADER = 'x-amzn-trace-id';\nvar overrideFlag = !!process.env.AWS_XRAY_TRACING_NAME;\nvar utils = {\n defaultName: process.env.AWS_XRAY_TRACING_NAME,\n dynamicNaming: false,\n hostPattern: null,\n sampler: require('./sampling/default_sampler'),\n /**\n * Enables dynamic naming for segments via the middleware. Use 'AWSXRay.middleware.enableDynamicNaming()'.\n * @param {string} [hostPattern] - The pattern to match the host header. See the README on dynamic and fixed naming modes.\n * @alias module:mw_utils.enableDynamicNaming\n */\n enableDynamicNaming: function (hostPattern) {\n this.dynamicNaming = true;\n if (hostPattern && typeof hostPattern !== 'string')\n throw new Error('Host pattern must be a string.');\n this.hostPattern = hostPattern || null;\n },\n /**\n * Splits out the 'x-amzn-trace-id' header params from the incoming request. Used by the middleware.\n * @param {http.IncomingMessage|https.IncomingMessage} req - The request object from the incoming call.\n * @returns {object}\n * @alias module:mw_utils.processHeaders\n */\n processHeaders: function processHeaders(req) {\n var amznTraceHeader = {};\n if (req && req.headers && req.headers[XRAY_HEADER]) {\n amznTraceHeader = processTraceData(req.headers[XRAY_HEADER]);\n }\n return amznTraceHeader;\n },\n /**\n * Resolves the name of the segment as determined by fixed or dynamic mode options. Used by the middleware.\n * @param {string} hostHeader - The string from the request.headers.host property.\n * @returns {string}\n * @alias module:mw_utils.resolveName\n */\n resolveName: function resolveName(hostHeader) {\n var name;\n if (this.dynamicNaming && hostHeader)\n name = this.hostPattern ? (wildcardMatch(this.hostPattern, hostHeader) ? hostHeader : this.defaultName) : hostHeader;\n else\n name = this.defaultName;\n return name;\n },\n /**\n * Resolves the sampling decision as determined by the values given and options set. Used by the middleware.\n * @param {object} amznTraceHeader - The object as returned by the processHeaders function.\n * @param {Segment} segment - The string from the request.headers.host property.\n * @param {http.ServerResponse|https.ServerResponse} res - The response object from the incoming call.\n * @returns {boolean}\n * @alias module:mw_utils.resolveSampling\n */\n resolveSampling: function resolveSampling(amznTraceHeader, segment, res) {\n var isSampled;\n if (amznTraceHeader.sampled === '1')\n isSampled = true;\n else if (amznTraceHeader.sampled === '0')\n isSampled = false;\n else {\n var sampleRequest = {\n host: res.req.headers.host,\n httpMethod: res.req.method,\n urlPath: res.req.url,\n serviceName: segment.name\n };\n isSampled = this.sampler.shouldSample(sampleRequest);\n if (isSampled instanceof String || typeof isSampled === 'string') {\n segment.setMatchedSamplingRule(isSampled);\n isSampled = true;\n }\n }\n if (amznTraceHeader.sampled === '?')\n res.header[XRAY_HEADER] = 'Root=' + amznTraceHeader.root + ';Sampled=' + (isSampled ? '1' : '0');\n if (!isSampled)\n segment.notTraced = true;\n },\n /**\n * Sets the default name of created segments. Used with the middleware.\n * Can be overridden by the AWS_XRAY_TRACING_NAME environment variable.\n * @param {string} name - The default name for segments created in the middleware.\n * @alias module:mw_utils.setDefaultName\n */\n setDefaultName: function setDefaultName(name) {\n if (!overrideFlag)\n this.defaultName = name;\n },\n disableCentralizedSampling: function disableCentralizedSampling() {\n this.sampler = require('./sampling/local_sampler');\n },\n /**\n * Overrides the default sampling rules file to specify at what rate to sample at for specific routes.\n * The base sampling rules file can be found at /lib/resources/default_sampling_rules.json\n * @param {string|Object} source - The path to the custom sampling rules file, or the source JSON object.\n * @memberof AWSXRay\n */\n setSamplingRules: function setSamplingRules(source) {\n if (!source || source instanceof String || !(typeof source === 'string' || (source instanceof Object)))\n throw new Error('Please specify a path to the local sampling rules file, or supply an object containing the rules.');\n this.sampler.setLocalRules(source);\n },\n /**\n * Logs a debug message including core request and segment information\n * @param {string} message - The message to be logged\n * @param {string} url - The request url being traced\n * @param {Segment} - The current segment\n */\n middlewareLog: function middlewareLog(message, url, segment) {\n logger.getLogger().debug(message + ': { url: ' + url + ', name: ' + segment.name + ', trace_id: ' +\n segment.trace_id + ', id: ' + segment.id + ', sampled: ' + !segment.notTraced + ' }');\n },\n /**\n * Traces the request/response cycle of an http.IncomingMessage / http.ServerResponse pair.\n * Resolves sampling rules, creates a segment, adds the core request / response data adding\n * throttling / error / fault flags based on the response status code.\n * @param {http.IncomingMessage} req - The incoming request.\n * @param {http.ServerResponse} res - The server response.\n * @returns {Segment}\n * @memberof AWSXRay\n */\n traceRequestResponseCycle: function traceRequestResponseCycle(req, res) {\n var amznTraceHeader = this.processHeaders(req);\n var name = this.resolveName(req.headers.host);\n var segment = new Segment(name, amznTraceHeader.root, amznTraceHeader.parent);\n var responseWithEmbeddedRequest = Object.assign({}, res, { req: req });\n this.resolveSampling(amznTraceHeader, segment, responseWithEmbeddedRequest);\n segment.addIncomingRequestData(new IncomingRequestData(req));\n this.middlewareLog('Starting middleware segment', req.url, segment);\n var middlewareLog = this.middlewareLog;\n var didEnd = false;\n var endSegment = function () {\n // ensure `endSegment` is only called once\n // in some versions of node.js 10.x and in all versions of node.js 11.x and higher,\n // the 'finish' and 'close' event are BOTH triggered.\n // Previously, only one or the other was triggered:\n // https://github.com/nodejs/node/pull/20611\n if (didEnd)\n return;\n didEnd = true;\n if (res.statusCode === 429) {\n segment.addThrottleFlag();\n }\n const cause = coreUtils.getCauseTypeFromHttpStatus(res.statusCode);\n if (cause) {\n segment[cause] = true;\n }\n segment.http.close(res);\n segment.close();\n middlewareLog('Closed middleware segment successfully', req.url, segment);\n };\n res.on('finish', endSegment);\n res.on('close', endSegment);\n return segment;\n }\n};\nmodule.exports = utils;\n", "\"use strict\";\nvar contextUtils = require('../context_utils');\nvar mwUtils = require('../middleware/mw_utils');\nvar LambdaUtils = require('../utils').LambdaUtils;\nvar Segment = require('../segments/segment');\nvar SegmentEmitter = require('../segment_emitter');\nvar SegmentUtils = require('../segments/segment_utils');\nvar logger = require('../logger');\nconst TraceID = require('../segments/attributes/trace_id');\n/**\n * @namespace\n * @ignore\n */\nvar xAmznTraceIdPrev = null;\n/**\n* Used to initialize segments on AWS Lambda with extra data from the context.\n*/\nmodule.exports.init = function init() {\n contextUtils.enableManualMode = function () {\n logger.getLogger().warn('AWS Lambda does not support AWS X-Ray manual mode.');\n };\n SegmentEmitter.disableReusableSocket();\n SegmentUtils.setStreamingThreshold(0);\n /**\n * Disabling all centralized sampling in Lambda environments. The sampling decisions would be\n * uselessly applied to the facade segment, and the sampling pollers were causing errors.\n *\n * See: https://github.com/aws/aws-xray-sdk-node/issues/217\n */\n logger.getLogger().info('Disabling centralized sampling in Lambda environment.');\n mwUtils.disableCentralizedSampling();\n var namespace = contextUtils.getNamespace();\n namespace.enter(namespace.createContext());\n contextUtils.setSegment(facadeSegment());\n};\nvar facadeSegment = function facadeSegment() {\n var segment = new Segment('facade');\n var whitelistFcn = ['addNewSubsegment', 'addSubsegment', 'removeSubsegment', 'toString'];\n var silentFcn = ['incrementCounter', 'decrementCounter', 'isClosed', 'close', 'format', 'flush'];\n var xAmznTraceId = process.env._X_AMZN_TRACE_ID;\n for (var key in segment) {\n if (typeof segment[key] === 'function' && whitelistFcn.indexOf(key) === -1) {\n if (silentFcn.indexOf(key) === -1) {\n segment[key] = (function () {\n var func = key;\n return function facade() {\n logger.getLogger().warn('Function \"' + func + '\" cannot be called on an AWS Lambda segment. Please use a subsegment to record data.');\n return;\n };\n })();\n }\n else {\n segment[key] = function facade() { return; };\n }\n }\n }\n segment.trace_id = TraceID.Invalid().toString();\n segment.isClosed = function () { return true; };\n segment.in_progress = false;\n segment.counter = 1;\n segment.notTraced = true;\n segment.facade = true;\n segment.reset = function reset() {\n this.trace_id = TraceID.Invalid().toString();\n this.id = '00000000';\n delete this.subsegments;\n this.notTraced = true;\n };\n segment.resolveLambdaTraceData = function resolveLambdaTraceData() {\n var xAmznLambda = process.env._X_AMZN_TRACE_ID;\n if (xAmznLambda) {\n // This check resets the trace data whenever a new trace header is read to not leak data between invocations\n if (xAmznLambda != xAmznTraceIdPrev) {\n this.reset();\n if (LambdaUtils.populateTraceData(segment, xAmznLambda))\n xAmznTraceIdPrev = xAmznLambda;\n }\n }\n else {\n this.reset();\n contextUtils.contextMissingStrategy.contextMissing('Missing AWS Lambda trace data for X-Ray. ' +\n 'Ensure Active Tracing is enabled and no subsegments are created outside the function handler.');\n }\n };\n // Test for valid trace data during SDK startup. It's likely we're still in the cold-start portion of the\n // code at this point and a valid trace header has not been set\n if (LambdaUtils.validTraceData(xAmznTraceId)) {\n if (LambdaUtils.populateTraceData(segment, xAmznTraceId))\n xAmznTraceIdPrev = xAmznTraceId;\n }\n return segment;\n};\n", "\"use strict\";\nvar http = require('http');\nvar Plugin = {\n METADATA_TIMEOUT: 1000,\n /**\n * Asynchronously retrieves metadata from on-instance endpoint with an HTTP request using retries for\n * requests that time out.\n * @param {object} options - The HTTP options to make the request with\n * @param {function} callback - callback to plugin\n */\n getPluginMetadata: function (options, callback) {\n const METADATA_RETRY_TIMEOUT = 250; // Millis\n const METADATA_RETRIES = 5;\n var retries = METADATA_RETRIES;\n var getMetadata = function () {\n var httpReq = http.__request ? http.__request : http.request;\n var req = httpReq(options, function (res) {\n var body = '';\n res.on('data', function (chunk) {\n body += chunk;\n });\n res.on('end', function () {\n if (this.statusCode === 200 || this.statusCode === 300) {\n try {\n body = JSON.parse(body);\n }\n catch (e) {\n callback(e);\n return;\n }\n callback(null, body);\n }\n else if (retries > 0 && Math.floor(this.statusCode / 100) === 5) {\n retries--;\n setTimeout(getMetadata, METADATA_RETRY_TIMEOUT);\n }\n else {\n callback(new Error(`Failed to retrieve metadata with options: ${options}`));\n }\n });\n });\n req.on('error', function (err) {\n callback(err);\n });\n req.on('timeout', function () {\n req.abort();\n });\n req.setTimeout(Plugin.METADATA_TIMEOUT);\n req.end();\n };\n getMetadata();\n }\n};\nmodule.exports = Plugin;\n", "\"use strict\";\nvar Plugin = require('./plugin');\nvar logger = require('../../logger');\nvar http = require('http');\nvar EC2Plugin = {\n /**\n * A function to get the instance data from the EC2 metadata service.\n * @param {function} callback - The callback for the plugin loader.\n */\n getData: function (callback) {\n const METADATA_PATH = '/latest/dynamic/instance-identity/document';\n function populateMetadata(token) {\n const options = getOptions(METADATA_PATH, 'GET', token ? { 'X-aws-ec2-metadata-token': token } : {});\n Plugin.getPluginMetadata(options, function (err, data) {\n if (err || !data) {\n logger.getLogger().error('Error loading EC2 plugin metadata: ', err ? err.toString() : 'Could not retrieve data from IMDS.');\n callback();\n return;\n }\n const metadata = {\n ec2: {\n instance_id: data.instanceId,\n availability_zone: data.availabilityZone,\n instance_size: data.instanceType,\n ami_id: data.imageId\n }\n };\n callback(metadata);\n });\n }\n /**\n * This kicks off a requet to get a token used for requests to IMDSv2. If the request for the token\n * fails, we fall back to IMDSv1. Otherwise, the token will be used for an IMDSv2 request.\n */\n getToken(function (token) {\n if (token === null) {\n logger.getLogger().debug('EC2Plugin failed to get token from IMDSv2. Falling back to IMDSv1.');\n }\n populateMetadata(token);\n });\n },\n originName: 'AWS::EC2::Instance'\n};\n/**\n * Asynchronously retrieves a token used in requests to EC2 instance metadata service.\n * @param {function} callback - callback to plugin\n */\nfunction getToken(callback) {\n const httpReq = http.__request ? http.__request : http.request;\n const TTL = 60; //seconds\n const TOKEN_PATH = '/latest/api/token';\n const options = getOptions(TOKEN_PATH, 'PUT', {\n 'X-aws-ec2-metadata-token-ttl-seconds': TTL\n });\n let req = httpReq(options, function (res) {\n let body = '';\n res.on('data', function (chunk) {\n body += chunk;\n });\n res.on('end', function () {\n if (this.statusCode === 200 || this.statusCode === 300) {\n callback(body);\n }\n else {\n callback(null);\n }\n });\n });\n req.on('error', function () {\n callback(null);\n });\n req.on('timeout', function () {\n req.abort();\n callback(null);\n });\n req.setTimeout(Plugin.METADATA_TIMEOUT);\n req.end();\n}\nfunction getOptions(path, method, headers) {\n if (!method) {\n method = 'GET';\n }\n if (!headers) {\n headers = {};\n }\n return {\n host: '169.254.169.254',\n path: path,\n method: method,\n headers: headers\n };\n}\nmodule.exports = EC2Plugin;\n", "\"use strict\";\nvar os = require('os');\nvar ECSPlugin = {\n /**\n * A function to get the instance data from the ECS instance.\n * @param {function} callback - The callback for the plugin loader.\n */\n getData: function (callback) {\n callback({ ecs: { container: os.hostname() } });\n },\n originName: 'AWS::ECS::Container'\n};\nmodule.exports = ECSPlugin;\n", "\"use strict\";\nvar fs = require('fs');\nvar logger = require('../../logger');\nvar ENV_CONFIG_LOCATION = '/var/elasticbeanstalk/xray/environment.conf';\nvar ElasticBeanstalkPlugin = {\n /**\n * A function to get data from the Elastic Beanstalk environment configuration file.\n * @param {function} callback - The callback for the plugin loader.\n */\n getData: function (callback) {\n fs.readFile(ENV_CONFIG_LOCATION, 'utf8', function (err, rawData) {\n if (err) {\n logger.getLogger().error('Error loading Elastic Beanstalk plugin:', err.stack);\n callback();\n }\n else {\n var data = JSON.parse(rawData);\n var metadata = {\n elastic_beanstalk: {\n environment: data.environment_name,\n version_label: data.version_label,\n deployment_id: data.deployment_id\n }\n };\n callback(metadata);\n }\n });\n },\n originName: 'AWS::ElasticBeanstalk::Environment'\n};\nmodule.exports = ElasticBeanstalkPlugin;\n", "\"use strict\";\nvar fs = require('fs');\nvar logger = require('../logger');\nvar whitelist = require('../resources/aws_whitelist.json');\nvar paramTypes = {\n REQ_DESC: 'request_descriptors',\n REQ_PARAMS: 'request_parameters',\n RES_DESC: 'response_descriptors',\n RES_PARAMS: 'response_parameters'\n};\n/**\n * Represents a set of AWS services, operations and keys or params to capture.\n * @constructor\n * @param {string|Object} [source] - The location or source JSON object of the custom AWS whitelist file. If none is provided, the default file will be used.\n */\nfunction CallCapturer(source) {\n this.init(source);\n}\nCallCapturer.prototype.init = function init(source) {\n if (source) {\n if (typeof source === 'string') {\n logger.getLogger().info('Using custom AWS whitelist file: ' + source);\n this.services = loadWhitelist(JSON.parse(fs.readFileSync(source, 'utf8')));\n }\n else {\n logger.getLogger().info('Using custom AWS whitelist source.');\n this.services = loadWhitelist(source);\n }\n }\n else\n this.services = whitelist.services;\n};\nCallCapturer.prototype.append = function append(source) {\n var newServices = {};\n if (typeof source === 'string') {\n logger.getLogger().info('Appending AWS whitelist with custom file: ' + source);\n newServices = loadWhitelist(JSON.parse(fs.readFileSync(source, 'utf8')));\n }\n else {\n logger.getLogger().info('Appending AWS whitelist with a custom source.');\n newServices = loadWhitelist(source);\n }\n for (var attribute in newServices) {\n this.services[attribute] = newServices[attribute];\n }\n};\nCallCapturer.prototype.capture = function capture(serviceName, response) {\n var operation = response.request.operation;\n var call = this.services[serviceName] !== undefined ? this.services[serviceName].operations[operation] : null;\n if (call === null) {\n logger.getLogger().debug('Call \"' + serviceName + '.' + operation + '\" is not whitelisted for additional data capturing. Ignoring.');\n return;\n }\n var dataCaptured = {};\n for (var paramType in call) {\n var params = call[paramType];\n if (paramType === paramTypes.REQ_PARAMS) {\n captureCallParams(params, response.request.params, dataCaptured);\n }\n else if (paramType === paramTypes.REQ_DESC) {\n captureDescriptors(params, response.request.params, dataCaptured);\n }\n else if (paramType === paramTypes.RES_PARAMS) {\n if (response.data) {\n captureCallParams(params, response.data, dataCaptured);\n }\n }\n else if (paramType === paramTypes.RES_DESC) {\n if (response.data) {\n captureDescriptors(params, response.data, dataCaptured);\n }\n }\n else {\n logger.getLogger().error('Unknown parameter type \"' + paramType + '\". Must be \"request_descriptors\", \"response_descriptors\", ' +\n '\"request_parameters\" or \"response_parameters\".');\n }\n }\n return dataCaptured;\n};\nfunction captureCallParams(params, call, data) {\n params.forEach(function (param) {\n if (typeof call[param] !== 'undefined') {\n var formatted = toSnakeCase(param);\n this[formatted] = call[param];\n }\n }, data);\n}\nfunction captureDescriptors(descriptors, params, data) {\n for (var paramName in descriptors) {\n var attributes = descriptors[paramName];\n if (typeof params[paramName] !== 'undefined') {\n var paramData;\n if (attributes.list && attributes.get_count)\n paramData = params[paramName] ? params[paramName].length : 0;\n else\n paramData = attributes.get_keys === true ? Object.keys(params[paramName]) : params[paramName];\n if (typeof attributes.rename_to === 'string') {\n data[attributes.rename_to] = paramData;\n }\n else {\n var formatted = toSnakeCase(paramName);\n data[formatted] = paramData;\n }\n }\n }\n}\nfunction toSnakeCase(param) {\n if (param === 'IPAddress')\n return 'ip_address';\n else\n return param.split(/(?=[A-Z])/).join('_').toLowerCase();\n}\nfunction loadWhitelist(source) {\n var doc = source;\n if (doc.services === undefined)\n throw new Error('Document formatting is incorrect. Expecting \"services\" param.');\n return doc.services;\n}\nmodule.exports = CallCapturer;\n", "\"use strict\";\nvar CallCapturer = require('../../patchers/call_capturer.js');\nvar capturer = new CallCapturer();\n/**\n * Represents a AWS client call. Automatically captures data from the supplied response object,\n * Data captured depends on the whitelisting file supplied.\n * The base whitelisting file can be found at /lib/resources/aws_whitelist.json.\n * @constructor\n * @param {any} res - The response object from the AWS call. Typed as any to avoid AWS SDK dependency. Otherwise would be AWS.Response.\n * @param {string} serviceName - The service name of the AWS client.\n * @see https://github.com/aws/aws-sdk-js/blob/master/lib/response.js\n */\nfunction Aws(res, serviceName) {\n this.init(res, serviceName);\n}\nAws.prototype.init = function init(res, serviceName) {\n //TODO: account ID\n this.operation = formatOperation(res.request.operation) || '';\n if (res && res.request && res.request.httpRequest && res.request.httpRequest.region) {\n this.region = res.request.httpRequest.region;\n }\n if (res && res.requestId) {\n this.request_id = res.requestId;\n }\n this.retries = res.retryCount || 0;\n if (res.extendedRequestId && serviceName && serviceName.toLowerCase() === 's3')\n this.id_2 = res.extendedRequestId;\n this.addData(capturer.capture(serviceName, res));\n};\nAws.prototype.addData = function addData(data) {\n for (var attribute in data) {\n this[attribute] = data[attribute];\n }\n};\n/**\n * Overrides the default whitelisting file to specify what params to capture on each AWS Service call.\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @exports setAWSWhitelist\n */\nvar setAWSWhitelist = function setAWSWhitelist(source) {\n if (!source || source instanceof String || !(typeof source === 'string' || (source instanceof Object)))\n throw new Error('Please specify a path to the local whitelist file, or supply a whitelist source object.');\n capturer = new CallCapturer(source);\n};\n/**\n * Appends to the default whitelisting file to specify what params to capture on each AWS Service call.\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @exports appendAWSWhitelist\n */\nvar appendAWSWhitelist = function appendAWSWhitelist(source) {\n if (!source || source instanceof String || !(typeof source === 'string' || (source instanceof Object)))\n throw new Error('Please specify a path to the local whitelist file, or supply a whitelist source object.');\n capturer.append(source);\n};\nfunction formatOperation(operation) {\n if (!operation)\n return;\n return operation.charAt(0).toUpperCase() + operation.slice(1);\n}\nmodule.exports = Aws;\nmodule.exports.appendAWSWhitelist = appendAWSWhitelist;\nmodule.exports.setAWSWhitelist = setAWSWhitelist;\n", "\"use strict\";\n/**\n * Capture module.\n * @module capture\n */\nvar contextUtils = require('./context_utils');\nvar logger = require('./logger');\n/**\n * Wrap to automatically capture information for the segment.\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function context to wrap. Can take a single 'subsegment' argument.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @alias module:capture.captureFunc\n * @return {*} - Returns the result if any by executing the provided function.\n */\nvar captureFunc = function captureFunc(name, fcn, parent) {\n validate(name, fcn);\n var current, executeFcn;\n var parentSeg = contextUtils.resolveSegment(parent);\n if (!parentSeg) {\n logger.getLogger().warn('Failed to capture function.');\n return fcn();\n }\n current = parentSeg.addNewSubsegment(name);\n executeFcn = captureFcn(fcn, current);\n try {\n const response = executeFcn(current);\n current.close();\n return response;\n }\n catch (e) {\n current.close(e);\n throw (e);\n }\n};\n/**\n * Wrap to automatically capture information for the sub/segment. You must close the segment\n * manually from within the function.\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function context to wrap. Must take a single 'subsegment' argument and call 'subsegment.close([optional error])' when the async function completes.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @alias module:capture.captureAsyncFunc\n * @return {*} - Returns a promise by executing the provided async function.\n */\nvar captureAsyncFunc = function captureAsyncFunc(name, fcn, parent) {\n validate(name, fcn);\n var current, executeFcn;\n var parentSeg = contextUtils.resolveSegment(parent);\n if (!parentSeg) {\n logger.getLogger().warn('Failed to capture async function.');\n return fcn();\n }\n current = parentSeg.addNewSubsegment(name);\n executeFcn = captureFcn(fcn, current);\n try {\n return executeFcn(current);\n }\n catch (e) {\n current.close(e);\n throw (e);\n }\n};\n/**\n * Wrap to automatically capture information for the sub/segment. This wraps the callback and returns a function.\n * when executed, all arguments are passed through accordingly. An additional argument is appended to gain access to the newly created subsegment.\n * For this reason, always call the captured callback with the full list of arguments.\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function context to wrap. Can take a single 'subsegment' argument.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @alias module:capture.captureCallbackFunc\n */\nvar captureCallbackFunc = function captureCallbackFunc(name, fcn, parent) {\n validate(name, fcn);\n var base = contextUtils.resolveSegment(parent);\n if (!base) {\n logger.getLogger().warn('Failed to capture callback function.');\n return fcn;\n }\n base.incrementCounter();\n return function () {\n var parentSeg = contextUtils.resolveSegment(parent);\n var args = Array.prototype.slice.call(arguments);\n captureFunc(name, fcn.bind.apply(fcn, [null].concat(args)), parentSeg);\n base.decrementCounter();\n }.bind(this);\n};\nfunction captureFcn(fcn, current) {\n var executeFcn;\n if (contextUtils.isAutomaticMode()) {\n var session = contextUtils.getNamespace();\n var contextFcn = function () {\n var value;\n session.run(function () {\n contextUtils.setSegment(current);\n value = fcn(current);\n });\n return value;\n };\n executeFcn = contextFcn;\n }\n else {\n executeFcn = fcn;\n }\n return executeFcn;\n}\nfunction validate(name, fcn) {\n var error;\n if (!name || typeof name !== 'string') {\n error = 'Param \"name\" must be a non-empty string.';\n logger.getLogger().error(error);\n throw new Error(error);\n }\n else if (typeof fcn !== 'function') {\n error = 'Param \"fcn\" must be a function.';\n logger.getLogger().error(error);\n throw new Error(error);\n }\n}\nmodule.exports.captureFunc = captureFunc;\nmodule.exports.captureAsyncFunc = captureAsyncFunc;\nmodule.exports.captureCallbackFunc = captureCallbackFunc;\n", "exports = module.exports = SemVer\n\nvar debug\n/* istanbul ignore next */\nif (typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)) {\n debug = function () {\n var args = Array.prototype.slice.call(arguments, 0)\n args.unshift('SEMVER')\n console.log.apply(console, args)\n }\n} else {\n debug = function () {}\n}\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nexports.SEMVER_SPEC_VERSION = '2.0.0'\n\nvar MAX_LENGTH = 256\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n /* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nvar MAX_SAFE_COMPONENT_LENGTH = 16\n\n// The actual regexps go on exports.re\nvar re = exports.re = []\nvar src = exports.src = []\nvar R = 0\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\nvar NUMERICIDENTIFIER = R++\nsrc[NUMERICIDENTIFIER] = '0|[1-9]\\\\d*'\nvar NUMERICIDENTIFIERLOOSE = R++\nsrc[NUMERICIDENTIFIERLOOSE] = '[0-9]+'\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\nvar NONNUMERICIDENTIFIER = R++\nsrc[NONNUMERICIDENTIFIER] = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*'\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\nvar MAINVERSION = R++\nsrc[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIER] + ')'\n\nvar MAINVERSIONLOOSE = R++\nsrc[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIERLOOSE] + ')'\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\nvar PRERELEASEIDENTIFIER = R++\nsrc[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +\n '|' + src[NONNUMERICIDENTIFIER] + ')'\n\nvar PRERELEASEIDENTIFIERLOOSE = R++\nsrc[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +\n '|' + src[NONNUMERICIDENTIFIER] + ')'\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\nvar PRERELEASE = R++\nsrc[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +\n '(?:\\\\.' + src[PRERELEASEIDENTIFIER] + ')*))'\n\nvar PRERELEASELOOSE = R++\nsrc[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +\n '(?:\\\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\nvar BUILDIDENTIFIER = R++\nsrc[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\nvar BUILD = R++\nsrc[BUILD] = '(?:\\\\+(' + src[BUILDIDENTIFIER] +\n '(?:\\\\.' + src[BUILDIDENTIFIER] + ')*))'\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\nvar FULL = R++\nvar FULLPLAIN = 'v?' + src[MAINVERSION] +\n src[PRERELEASE] + '?' +\n src[BUILD] + '?'\n\nsrc[FULL] = '^' + FULLPLAIN + '$'\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\nvar LOOSEPLAIN = '[v=\\\\s]*' + src[MAINVERSIONLOOSE] +\n src[PRERELEASELOOSE] + '?' +\n src[BUILD] + '?'\n\nvar LOOSE = R++\nsrc[LOOSE] = '^' + LOOSEPLAIN + '$'\n\nvar GTLT = R++\nsrc[GTLT] = '((?:<|>)?=?)'\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\nvar XRANGEIDENTIFIERLOOSE = R++\nsrc[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\\\*'\nvar XRANGEIDENTIFIER = R++\nsrc[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\\\*'\n\nvar XRANGEPLAIN = R++\nsrc[XRANGEPLAIN] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIER] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n '(?:' + src[PRERELEASE] + ')?' +\n src[BUILD] + '?' +\n ')?)?'\n\nvar XRANGEPLAINLOOSE = R++\nsrc[XRANGEPLAINLOOSE] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:' + src[PRERELEASELOOSE] + ')?' +\n src[BUILD] + '?' +\n ')?)?'\n\nvar XRANGE = R++\nsrc[XRANGE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAIN] + '$'\nvar XRANGELOOSE = R++\nsrc[XRANGELOOSE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAINLOOSE] + '$'\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\nvar COERCE = R++\nsrc[COERCE] = '(?:^|[^\\\\d])' +\n '(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +\n '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n '(?:$|[^\\\\d])'\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\nvar LONETILDE = R++\nsrc[LONETILDE] = '(?:~>?)'\n\nvar TILDETRIM = R++\nsrc[TILDETRIM] = '(\\\\s*)' + src[LONETILDE] + '\\\\s+'\nre[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')\nvar tildeTrimReplace = '$1~'\n\nvar TILDE = R++\nsrc[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'\nvar TILDELOOSE = R++\nsrc[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\nvar LONECARET = R++\nsrc[LONECARET] = '(?:\\\\^)'\n\nvar CARETTRIM = R++\nsrc[CARETTRIM] = '(\\\\s*)' + src[LONECARET] + '\\\\s+'\nre[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')\nvar caretTrimReplace = '$1^'\n\nvar CARET = R++\nsrc[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'\nvar CARETLOOSE = R++\nsrc[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\nvar COMPARATORLOOSE = R++\nsrc[COMPARATORLOOSE] = '^' + src[GTLT] + '\\\\s*(' + LOOSEPLAIN + ')$|^$'\nvar COMPARATOR = R++\nsrc[COMPARATOR] = '^' + src[GTLT] + '\\\\s*(' + FULLPLAIN + ')$|^$'\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\nvar COMPARATORTRIM = R++\nsrc[COMPARATORTRIM] = '(\\\\s*)' + src[GTLT] +\n '\\\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'\n\n// this one has to use the /g flag\nre[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')\nvar comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\nvar HYPHENRANGE = R++\nsrc[HYPHENRANGE] = '^\\\\s*(' + src[XRANGEPLAIN] + ')' +\n '\\\\s+-\\\\s+' +\n '(' + src[XRANGEPLAIN] + ')' +\n '\\\\s*$'\n\nvar HYPHENRANGELOOSE = R++\nsrc[HYPHENRANGELOOSE] = '^\\\\s*(' + src[XRANGEPLAINLOOSE] + ')' +\n '\\\\s+-\\\\s+' +\n '(' + src[XRANGEPLAINLOOSE] + ')' +\n '\\\\s*$'\n\n// Star ranges basically just allow anything at all.\nvar STAR = R++\nsrc[STAR] = '(<|>)?=?\\\\s*\\\\*'\n\n// Compile to actual regexp objects.\n// All are flag-free, unless they were created above with a flag.\nfor (var i = 0; i < R; i++) {\n debug(i, src[i])\n if (!re[i]) {\n re[i] = new RegExp(src[i])\n }\n}\n\nexports.parse = parse\nfunction parse (version, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n if (version.length > MAX_LENGTH) {\n return null\n }\n\n var r = options.loose ? re[LOOSE] : re[FULL]\n if (!r.test(version)) {\n return null\n }\n\n try {\n return new SemVer(version, options)\n } catch (er) {\n return null\n }\n}\n\nexports.valid = valid\nfunction valid (version, options) {\n var v = parse(version, options)\n return v ? v.version : null\n}\n\nexports.clean = clean\nfunction clean (version, options) {\n var s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\n\nexports.SemVer = SemVer\n\nfunction SemVer (version, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n if (version instanceof SemVer) {\n if (version.loose === options.loose) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError('Invalid Version: ' + version)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')\n }\n\n if (!(this instanceof SemVer)) {\n return new SemVer(version, options)\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n\n var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])\n\n if (!m) {\n throw new TypeError('Invalid Version: ' + version)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map(function (id) {\n if (/^[0-9]+$/.test(id)) {\n var num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n}\n\nSemVer.prototype.format = function () {\n this.version = this.major + '.' + this.minor + '.' + this.patch\n if (this.prerelease.length) {\n this.version += '-' + this.prerelease.join('.')\n }\n return this.version\n}\n\nSemVer.prototype.toString = function () {\n return this.version\n}\n\nSemVer.prototype.compare = function (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return this.compareMain(other) || this.comparePre(other)\n}\n\nSemVer.prototype.compareMain = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n}\n\nSemVer.prototype.comparePre = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n var i = 0\n do {\n var a = this.prerelease[i]\n var b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n}\n\n// preminor will bump the version up to the next minor release, and immediately\n// down to pre-release. premajor and prepatch work the same way.\nSemVer.prototype.inc = function (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 \"pre\" would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n var i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (this.prerelease[0] === identifier) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error('invalid increment argument: ' + release)\n }\n this.format()\n this.raw = this.version\n return this\n}\n\nexports.inc = inc\nfunction inc (version, release, loose, identifier) {\n if (typeof (loose) === 'string') {\n identifier = loose\n loose = undefined\n }\n\n try {\n return new SemVer(version, loose).inc(release, identifier).version\n } catch (er) {\n return null\n }\n}\n\nexports.diff = diff\nfunction diff (version1, version2) {\n if (eq(version1, version2)) {\n return null\n } else {\n var v1 = parse(version1)\n var v2 = parse(version2)\n var prefix = ''\n if (v1.prerelease.length || v2.prerelease.length) {\n prefix = 'pre'\n var defaultResult = 'prerelease'\n }\n for (var key in v1) {\n if (key === 'major' || key === 'minor' || key === 'patch') {\n if (v1[key] !== v2[key]) {\n return prefix + key\n }\n }\n }\n return defaultResult // may be undefined\n }\n}\n\nexports.compareIdentifiers = compareIdentifiers\n\nvar numeric = /^[0-9]+$/\nfunction compareIdentifiers (a, b) {\n var anum = numeric.test(a)\n var bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nexports.rcompareIdentifiers = rcompareIdentifiers\nfunction rcompareIdentifiers (a, b) {\n return compareIdentifiers(b, a)\n}\n\nexports.major = major\nfunction major (a, loose) {\n return new SemVer(a, loose).major\n}\n\nexports.minor = minor\nfunction minor (a, loose) {\n return new SemVer(a, loose).minor\n}\n\nexports.patch = patch\nfunction patch (a, loose) {\n return new SemVer(a, loose).patch\n}\n\nexports.compare = compare\nfunction compare (a, b, loose) {\n return new SemVer(a, loose).compare(new SemVer(b, loose))\n}\n\nexports.compareLoose = compareLoose\nfunction compareLoose (a, b) {\n return compare(a, b, true)\n}\n\nexports.rcompare = rcompare\nfunction rcompare (a, b, loose) {\n return compare(b, a, loose)\n}\n\nexports.sort = sort\nfunction sort (list, loose) {\n return list.sort(function (a, b) {\n return exports.compare(a, b, loose)\n })\n}\n\nexports.rsort = rsort\nfunction rsort (list, loose) {\n return list.sort(function (a, b) {\n return exports.rcompare(a, b, loose)\n })\n}\n\nexports.gt = gt\nfunction gt (a, b, loose) {\n return compare(a, b, loose) > 0\n}\n\nexports.lt = lt\nfunction lt (a, b, loose) {\n return compare(a, b, loose) < 0\n}\n\nexports.eq = eq\nfunction eq (a, b, loose) {\n return compare(a, b, loose) === 0\n}\n\nexports.neq = neq\nfunction neq (a, b, loose) {\n return compare(a, b, loose) !== 0\n}\n\nexports.gte = gte\nfunction gte (a, b, loose) {\n return compare(a, b, loose) >= 0\n}\n\nexports.lte = lte\nfunction lte (a, b, loose) {\n return compare(a, b, loose) <= 0\n}\n\nexports.cmp = cmp\nfunction cmp (a, op, b, loose) {\n switch (op) {\n case '===':\n if (typeof a === 'object')\n a = a.version\n if (typeof b === 'object')\n b = b.version\n return a === b\n\n case '!==':\n if (typeof a === 'object')\n a = a.version\n if (typeof b === 'object')\n b = b.version\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError('Invalid operator: ' + op)\n }\n}\n\nexports.Comparator = Comparator\nfunction Comparator (comp, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n if (!(this instanceof Comparator)) {\n return new Comparator(comp, options)\n }\n\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n}\n\nvar ANY = {}\nComparator.prototype.parse = function (comp) {\n var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]\n var m = comp.match(r)\n\n if (!m) {\n throw new TypeError('Invalid comparator: ' + comp)\n }\n\n this.operator = m[1]\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n}\n\nComparator.prototype.toString = function () {\n return this.value\n}\n\nComparator.prototype.test = function (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n version = new SemVer(version, this.options)\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n}\n\nComparator.prototype.intersects = function (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n var rangeTmp\n\n if (this.operator === '') {\n rangeTmp = new Range(comp.value, options)\n return satisfies(this.value, rangeTmp, options)\n } else if (comp.operator === '') {\n rangeTmp = new Range(this.value, options)\n return satisfies(comp.semver, rangeTmp, options)\n }\n\n var sameDirectionIncreasing =\n (this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '>=' || comp.operator === '>')\n var sameDirectionDecreasing =\n (this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '<=' || comp.operator === '<')\n var sameSemVer = this.semver.version === comp.semver.version\n var differentDirectionsInclusive =\n (this.operator === '>=' || this.operator === '<=') &&\n (comp.operator === '>=' || comp.operator === '<=')\n var oppositeDirectionsLessThan =\n cmp(this.semver, '<', comp.semver, options) &&\n ((this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '<=' || comp.operator === '<'))\n var oppositeDirectionsGreaterThan =\n cmp(this.semver, '>', comp.semver, options) &&\n ((this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '>=' || comp.operator === '>'))\n\n return sameDirectionIncreasing || sameDirectionDecreasing ||\n (sameSemVer && differentDirectionsInclusive) ||\n oppositeDirectionsLessThan || oppositeDirectionsGreaterThan\n}\n\nexports.Range = Range\nfunction Range (range, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (range instanceof Range) {\n if (range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n return new Range(range.value, options)\n }\n\n if (!(this instanceof Range)) {\n return new Range(range, options)\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First, split based on boolean or ||\n this.raw = range\n this.set = range.split(/\\s*\\|\\|\\s*/).map(function (range) {\n return this.parseRange(range.trim())\n }, this).filter(function (c) {\n // throw out any that are not relevant for whatever reason\n return c.length\n })\n\n if (!this.set.length) {\n throw new TypeError('Invalid SemVer Range: ' + range)\n }\n\n this.format()\n}\n\nRange.prototype.format = function () {\n this.range = this.set.map(function (comps) {\n return comps.join(' ').trim()\n }).join('||').trim()\n return this.range\n}\n\nRange.prototype.toString = function () {\n return this.range\n}\n\nRange.prototype.parseRange = function (range) {\n var loose = this.options.loose\n range = range.trim()\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]\n range = range.replace(hr, hyphenReplace)\n debug('hyphen replace', range)\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range, re[COMPARATORTRIM])\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[TILDETRIM], tildeTrimReplace)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[CARETTRIM], caretTrimReplace)\n\n // normalize spaces\n range = range.split(/\\s+/).join(' ')\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]\n var set = range.split(' ').map(function (comp) {\n return parseComparator(comp, this.options)\n }, this).join(' ').split(/\\s+/)\n if (this.options.loose) {\n // in loose mode, throw out any that are not valid comparators\n set = set.filter(function (comp) {\n return !!comp.match(compRe)\n })\n }\n set = set.map(function (comp) {\n return new Comparator(comp, this.options)\n }, this)\n\n return set\n}\n\nRange.prototype.intersects = function (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some(function (thisComparators) {\n return thisComparators.every(function (thisComparator) {\n return range.set.some(function (rangeComparators) {\n return rangeComparators.every(function (rangeComparator) {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n })\n })\n}\n\n// Mostly just for testing and legacy API reasons\nexports.toComparators = toComparators\nfunction toComparators (range, options) {\n return new Range(range, options).set.map(function (comp) {\n return comp.map(function (c) {\n return c.value\n }).join(' ').trim().split(' ')\n })\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nfunction parseComparator (comp, options) {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nfunction isX (id) {\n return !id || id.toLowerCase() === 'x' || id === '*'\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceTildes (comp, options) {\n return comp.trim().split(/\\s+/).map(function (comp) {\n return replaceTilde(comp, options)\n }).join(' ')\n}\n\nfunction replaceTilde (comp, options) {\n var r = options.loose ? re[TILDELOOSE] : re[TILDE]\n return comp.replace(r, function (_, M, m, p, pr) {\n debug('tilde', comp, _, M, m, p, pr)\n var ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + (+m + 1) + '.0'\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0\n// ^1.2.3 --> >=1.2.3 <2.0.0\n// ^1.2.0 --> >=1.2.0 <2.0.0\nfunction replaceCarets (comp, options) {\n return comp.trim().split(/\\s+/).map(function (comp) {\n return replaceCaret(comp, options)\n }).join(' ')\n}\n\nfunction replaceCaret (comp, options) {\n debug('caret', comp, options)\n var r = options.loose ? re[CARETLOOSE] : re[CARET]\n return comp.replace(r, function (_, M, m, p, pr) {\n debug('caret', comp, _, M, m, p, pr)\n var ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (isX(p)) {\n if (M === '0') {\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n } else {\n ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + m + '.' + (+p + 1)\n } else {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n } else {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + (+M + 1) + '.0.0'\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + m + '.' + (+p + 1)\n } else {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n } else {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + (+M + 1) + '.0.0'\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nfunction replaceXRanges (comp, options) {\n debug('replaceXRanges', comp, options)\n return comp.split(/\\s+/).map(function (comp) {\n return replaceXRange(comp, options)\n }).join(' ')\n}\n\nfunction replaceXRange (comp, options) {\n comp = comp.trim()\n var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]\n return comp.replace(r, function (ret, gtlt, M, m, p, pr) {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n var xM = isX(M)\n var xm = xM || isX(m)\n var xp = xm || isX(p)\n var anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n // >1.2.3 => >= 1.2.4\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n ret = gtlt + M + '.' + m + '.' + p\n } else if (xm) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (xp) {\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nfunction replaceStars (comp, options) {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp.trim().replace(re[STAR], '')\n}\n\n// This function is passed to string.replace(re[HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0\nfunction hyphenReplace ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr, tb) {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = '>=' + fM + '.0.0'\n } else if (isX(fp)) {\n from = '>=' + fM + '.' + fm + '.0'\n } else {\n from = '>=' + from\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = '<' + (+tM + 1) + '.0.0'\n } else if (isX(tp)) {\n to = '<' + tM + '.' + (+tm + 1) + '.0'\n } else if (tpr) {\n to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr\n } else {\n to = '<=' + to\n }\n\n return (from + ' ' + to).trim()\n}\n\n// if ANY of the sets match ALL of its comparators, then pass\nRange.prototype.test = function (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n version = new SemVer(version, this.options)\n }\n\n for (var i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n}\n\nfunction testSet (set, version, options) {\n for (var i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n var allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n\nexports.satisfies = satisfies\nfunction satisfies (version, range, options) {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\n\nexports.maxSatisfying = maxSatisfying\nfunction maxSatisfying (versions, range, options) {\n var max = null\n var maxSV = null\n try {\n var rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach(function (v) {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\n\nexports.minSatisfying = minSatisfying\nfunction minSatisfying (versions, range, options) {\n var min = null\n var minSV = null\n try {\n var rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach(function (v) {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\n\nexports.minVersion = minVersion\nfunction minVersion (range, loose) {\n range = new Range(range, loose)\n\n var minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (var i = 0; i < range.set.length; ++i) {\n var comparators = range.set[i]\n\n comparators.forEach(function (comparator) {\n // Clone to avoid manipulating the comparator's semver object.\n var compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!minver || gt(minver, compver)) {\n minver = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error('Unexpected operation: ' + comparator.operator)\n }\n })\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\n\nexports.validRange = validRange\nfunction validRange (range, options) {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\n\n// Determine if version is less than all the versions possible in the range\nexports.ltr = ltr\nfunction ltr (version, range, options) {\n return outside(version, range, '<', options)\n}\n\n// Determine if version is greater than all the versions possible in the range.\nexports.gtr = gtr\nfunction gtr (version, range, options) {\n return outside(version, range, '>', options)\n}\n\nexports.outside = outside\nfunction outside (version, range, hilo, options) {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n var gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisifes the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (var i = 0; i < range.set.length; ++i) {\n var comparators = range.set[i]\n\n var high = null\n var low = null\n\n comparators.forEach(function (comparator) {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nexports.prerelease = prerelease\nfunction prerelease (version, options) {\n var parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\n\nexports.intersects = intersects\nfunction intersects (r1, r2, options) {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2)\n}\n\nexports.coerce = coerce\nfunction coerce (version) {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n var match = version.match(re[COERCE])\n\n if (match == null) {\n return null\n }\n\n return parse(match[1] +\n '.' + (match[2] || '0') +\n '.' + (match[3] || '0'))\n}\n", "\"use strict\";\n/**\n * Capture module.\n * @module aws_p\n */\nvar semver = require('semver');\nvar Aws = require('../segments/attributes/aws');\nvar contextUtils = require('../context_utils');\nvar Utils = require('../utils');\nvar logger = require('../logger');\nvar minVersion = '2.7.15';\nvar throttledErrorDefault = function throttledErrorDefault() {\n return false; // If the customer doesn't provide an aws-sdk with a throttled error function, we can't make assumptions.\n};\n/**\n * Configures the AWS SDK to automatically capture information for the segment.\n * All created clients will automatically be captured. See 'captureAWSClient'\n * for additional details.\n * @param {AWS} awssdk - The Javascript AWS SDK.\n * @alias module:aws_p.captureAWS\n * @returns {AWS}\n * @see https://github.com/aws/aws-sdk-js\n */\nvar captureAWS = function captureAWS(awssdk) {\n if (!semver.gte(awssdk.VERSION, minVersion))\n throw new Error('AWS SDK version ' + minVersion + ' or greater required.');\n for (var prop in awssdk) {\n if (awssdk[prop].serviceIdentifier) {\n var Service = awssdk[prop];\n Service.prototype.customizeRequests(captureAWSRequest);\n }\n }\n return awssdk;\n};\n/**\n * Configures any AWS Client instance to automatically capture information for the segment.\n * For manual mode, a param with key called 'Segment' is required as a part of the AWS\n * call paramaters, and must reference a Segment or Subsegment object.\n * @param {AWS.Service} service - An instance of a AWS service to wrap.\n * @alias module:aws_p.captureAWSClient\n * @returns {AWS.Service}\n * @see https://github.com/aws/aws-sdk-js\n */\nvar captureAWSClient = function captureAWSClient(service) {\n service.customizeRequests(captureAWSRequest);\n return service;\n};\nfunction captureAWSRequest(req) {\n var parent = contextUtils.resolveSegment(contextUtils.resolveManualSegmentParams(req.params));\n if (!parent) {\n var output = this.serviceIdentifier + '.' + req.operation;\n if (!contextUtils.isAutomaticMode()) {\n logger.getLogger().info('Call ' + output + ' requires a segment object' +\n ' on the request params as \"XRaySegment\" for tracing in manual mode. Ignoring.');\n }\n else {\n logger.getLogger().info('Call ' + output +\n ' is missing the sub/segment context for automatic mode. Ignoring.');\n }\n return req;\n }\n var throttledError = this.throttledError || throttledErrorDefault;\n var stack = (new Error()).stack;\n var subsegment = parent.addNewSubsegment(this.serviceIdentifier);\n var traceId = parent.segment ? parent.segment.trace_id : parent.trace_id;\n var buildListener = function (req) {\n req.httpRequest.headers['X-Amzn-Trace-Id'] = 'Root=' + traceId + ';Parent=' + subsegment.id +\n ';Sampled=' + (subsegment.segment.notTraced ? '0' : '1');\n };\n var completeListener = function (res) {\n subsegment.addAttribute('namespace', 'aws');\n subsegment.addAttribute('aws', new Aws(res, subsegment.name));\n var httpRes = res.httpResponse;\n if (httpRes) {\n subsegment.addAttribute('http', new HttpResponse(httpRes));\n if (httpRes.statusCode === 429 || (res.error && throttledError(res.error)))\n subsegment.addThrottleFlag();\n }\n if (res.error) {\n var err = { message: res.error.message, name: res.error.code, stack: stack };\n if (httpRes && httpRes.statusCode) {\n if (Utils.getCauseTypeFromHttpStatus(httpRes.statusCode) == 'error') {\n subsegment.addErrorFlag();\n }\n subsegment.close(err, true);\n }\n else\n subsegment.close(err);\n }\n else {\n if (httpRes && httpRes.statusCode) {\n var cause = Utils.getCauseTypeFromHttpStatus(httpRes.statusCode);\n if (cause)\n subsegment[cause] = true;\n }\n subsegment.close();\n }\n };\n req.on('beforePresign', function (req) {\n // Only the AWS Presigner triggers this event,\n // so we can rely on this event to notify us when\n // a request is for a presigned url\n parent.removeSubsegment(subsegment);\n parent.decrementCounter();\n req.removeListener('build', buildListener);\n req.removeListener('complete', completeListener);\n });\n req.on('build', buildListener).on('complete', completeListener);\n if (!req.__send) {\n req.__send = req.send;\n req.send = function (callback) {\n if (contextUtils.isAutomaticMode()) {\n var session = contextUtils.getNamespace();\n session.run(function () {\n contextUtils.setSegment(subsegment);\n req.__send(callback);\n });\n }\n else {\n req.__send(callback);\n }\n };\n }\n}\nfunction HttpResponse(res) {\n this.init(res);\n}\nHttpResponse.prototype.init = function init(res) {\n this.response = {\n status: res.statusCode || '',\n };\n if (res.headers && res.headers['content-length'])\n this.response.content_length = res.headers['content-length'];\n};\nmodule.exports.captureAWSClient = captureAWSClient;\nmodule.exports.captureAWS = captureAWS;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TRANSIENT_ERROR_STATUS_CODES = exports.TRANSIENT_ERROR_CODES = exports.THROTTLING_ERROR_CODES = exports.CLOCK_SKEW_ERROR_CODES = void 0;\nexports.CLOCK_SKEW_ERROR_CODES = [\n \"AuthFailure\",\n \"InvalidSignatureException\",\n \"RequestExpired\",\n \"RequestInTheFuture\",\n \"RequestTimeTooSkewed\",\n \"SignatureDoesNotMatch\",\n];\nexports.THROTTLING_ERROR_CODES = [\n \"BandwidthLimitExceeded\",\n \"EC2ThrottledException\",\n \"LimitExceededException\",\n \"PriorRequestNotComplete\",\n \"ProvisionedThroughputExceededException\",\n \"RequestLimitExceeded\",\n \"RequestThrottled\",\n \"RequestThrottledException\",\n \"SlowDown\",\n \"ThrottledException\",\n \"Throttling\",\n \"ThrottlingException\",\n \"TooManyRequestsException\",\n \"TransactionInProgressException\",\n];\nexports.TRANSIENT_ERROR_CODES = [\"AbortError\", \"TimeoutError\", \"RequestTimeout\", \"RequestTimeoutException\"];\nexports.TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504];\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTransientError = exports.isThrottlingError = exports.isClockSkewError = exports.isRetryableByTrait = void 0;\nconst constants_1 = require(\"./constants\");\nconst isRetryableByTrait = (error) => error.$retryable !== undefined;\nexports.isRetryableByTrait = isRetryableByTrait;\nconst isClockSkewError = (error) => constants_1.CLOCK_SKEW_ERROR_CODES.includes(error.name);\nexports.isClockSkewError = isClockSkewError;\nconst isThrottlingError = (error) => {\n var _a, _b;\n return ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 429 ||\n constants_1.THROTTLING_ERROR_CODES.includes(error.name) ||\n ((_b = error.$retryable) === null || _b === void 0 ? void 0 : _b.throttling) == true;\n};\nexports.isThrottlingError = isThrottlingError;\nconst isTransientError = (error) => {\n var _a;\n return constants_1.TRANSIENT_ERROR_CODES.includes(error.name) ||\n constants_1.TRANSIENT_ERROR_STATUS_CODES.includes(((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) || 0);\n};\nexports.isTransientError = isTransientError;\n", "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.captureAWSClient = void 0;\nconst service_error_classification_1 = require(\"@aws-sdk/service-error-classification\");\nconst aws_1 = __importDefault(require(\"../segments/attributes/aws\"));\nconst querystring_1 = require(\"querystring\");\nconst subsegment_1 = __importDefault(require(\"../segments/attributes/subsegment\"));\nconst contextUtils = require('../context_utils');\nconst logger = require('../logger');\nconst { safeParseInt } = require('../utils');\nconst utils_1 = require(\"../utils\");\nconst XRAY_PLUGIN_NAME = 'XRaySDKInstrumentation';\n;\nconst buildAttributesFromMetadata = async (service, operation, region, res, error) => {\n var _a, _b, _c;\n const { extendedRequestId, requestId, httpStatusCode: statusCode, attempts } = ((_a = res === null || res === void 0 ? void 0 : res.output) === null || _a === void 0 ? void 0 : _a.$metadata) || (error === null || error === void 0 ? void 0 : error.$metadata);\n const aws = new aws_1.default({\n extendedRequestId,\n requestId,\n retryCount: attempts,\n request: {\n operation,\n httpRequest: {\n region,\n statusCode,\n },\n },\n }, service);\n const http = {};\n if (statusCode) {\n http.response = {};\n http.response.status = statusCode;\n }\n if (((_b = res === null || res === void 0 ? void 0 : res.response) === null || _b === void 0 ? void 0 : _b.headers) && ((_c = res === null || res === void 0 ? void 0 : res.response) === null || _c === void 0 ? void 0 : _c.headers['content-length']) !== undefined) {\n if (!http.response) {\n http.response = {};\n }\n http.response.content_length = safeParseInt(res.response.headers['content-length']);\n }\n return [aws, http];\n};\nfunction addFlags(http, subsegment, err) {\n var _a, _b, _c;\n if (err && service_error_classification_1.isThrottlingError(err)) {\n subsegment.addThrottleFlag();\n }\n else if (safeParseInt((_a = http.response) === null || _a === void 0 ? void 0 : _a.status) === 429 || safeParseInt((_b = err === null || err === void 0 ? void 0 : err.$metadata) === null || _b === void 0 ? void 0 : _b.httpStatusCode) === 429) {\n subsegment.addThrottleFlag();\n }\n const cause = utils_1.getCauseTypeFromHttpStatus(safeParseInt((_c = http.response) === null || _c === void 0 ? void 0 : _c.status));\n if (cause === 'fault') {\n subsegment.addFaultFlag();\n }\n else if (cause === 'error') {\n subsegment.addErrorFlag();\n }\n}\n;\nconst getXRayMiddleware = (config, manualSegment) => (next, context) => async (args) => {\n const segment = contextUtils.isAutomaticMode() ? contextUtils.resolveSegment() : manualSegment;\n const { clientName, commandName } = context;\n const operation = commandName.slice(0, -7); // Strip trailing \"Command\" string\n const service = clientName.slice(0, -6); // Strip trailing \"Client\" string\n if (!segment) {\n const output = service + '.' + operation.charAt(0).toLowerCase() + operation.slice(1);\n if (!contextUtils.isAutomaticMode()) {\n logger.getLogger().info('Call ' + output + ' requires a segment object' +\n ' passed to captureAWSv3Client for tracing in manual mode. Ignoring.');\n }\n else {\n logger.getLogger().info('Call ' + output +\n ' is missing the sub/segment context for automatic mode. Ignoring.');\n }\n return next(args);\n }\n const subsegment = segment.addNewSubsegment(service);\n subsegment.addAttribute('namespace', 'aws');\n const parent = (segment instanceof subsegment_1.default ? segment.segment : segment);\n args.request.headers['X-Amzn-Trace-Id'] = querystring_1.stringify({\n Root: parent.trace_id,\n Parent: subsegment.id,\n Sampled: parent.notTraced ? '0' : '1',\n }, ';');\n let res;\n try {\n res = await next(args);\n if (!res)\n throw new Error('Failed to get response from instrumented AWS Client.');\n const [aws, http] = await buildAttributesFromMetadata(service, operation, await config.region(), res, null);\n subsegment.addAttribute('aws', aws);\n subsegment.addAttribute('http', http);\n addFlags(http, subsegment);\n subsegment.close();\n return res;\n }\n catch (err) {\n if (err.$metadata) {\n const [aws, http] = await buildAttributesFromMetadata(service, operation, await config.region(), null, err);\n subsegment.addAttribute('aws', aws);\n subsegment.addAttribute('http', http);\n addFlags(http, subsegment, err);\n }\n const errObj = { message: err.message, name: err.name, stack: err.stack || new Error().stack };\n subsegment.close(errObj, true);\n throw err;\n }\n};\nconst xRayMiddlewareOptions = {\n name: XRAY_PLUGIN_NAME,\n step: 'build',\n};\nconst getXRayPlugin = (config, manualSegment) => ({\n applyToStack: (stack) => {\n stack.add(getXRayMiddleware(config, manualSegment), xRayMiddlewareOptions);\n },\n});\n/**\n * Instruments AWS SDK V3 clients with X-Ray via middleware.\n *\n * @param client - AWS SDK V3 client to instrument\n * @param manualSegment - Parent segment or subsegment that is passed in for manual mode users\n * @returns - the client with the X-Ray instrumentation middleware added to its middleware stack\n */\nfunction captureAWSClient(client, manualSegment) {\n // Remove existing middleware to ensure operation is idempotent\n client.middlewareStack.remove(XRAY_PLUGIN_NAME);\n client.middlewareStack.use(getXRayPlugin(client.config, manualSegment));\n return client;\n}\nexports.captureAWSClient = captureAWSClient;\n", "\"use strict\";\n/**\n * @module http_p\n */\n/**\n * This module patches the HTTP and HTTPS node built-in libraries and returns a copy of the module with tracing enabled.\n */\nvar url = require('url');\nvar contextUtils = require('../context_utils');\nvar Utils = require('../utils');\nvar logger = require('../logger');\nvar events = require('events');\n/**\n * Wraps the http/https.request() and .get() calls to automatically capture information for the segment.\n * This patches the built-in HTTP and HTTPS modules globally. If using a 3rd party HTTP library,\n * it should still use HTTP under the hood. Be sure to patch globally before requiring the 3rd party library.\n * 3rd party library compatibility is best effort. Some incompatibility issues may arise.\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced:true\" property to the subsegment\n * so the AWS X-Ray service expects a corresponding segment from the downstream service.\n * @param {function} subsegmentCallback - a callback that is called with the subsegment, the Node.js\n * http.ClientRequest, the Node.js http.IncomingMessage (if a response was received) and any error issued,\n * allowing custom annotations and metadata to be added.\n * to be added to the subsegment.\n * @alias module:http_p.captureHTTPsGlobal\n */\nvar captureHTTPsGlobal = function captureHTTPsGlobal(module, downstreamXRayEnabled, subsegmentCallback) {\n if (!module.__request)\n enableCapture(module, downstreamXRayEnabled, subsegmentCallback);\n};\n/**\n * Wraps the http/https.request() and .get() calls to automatically capture information for the segment.\n * Returns an instance of the HTTP or HTTPS module that is patched.\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced:true\" property to the subsegment\n * so the AWS X-Ray service expects a corresponding segment from the downstream service.\n * @param {function} subsegmentCallback - a callback that is called with the subsegment, the Node.js\n * http.ClientRequest, and the Node.js http.IncomingMessage to allow custom annotations and metadata\n * to be added to the subsegment.\n * @alias module:http_p.captureHTTPs\n * @returns {http|https}\n */\nvar captureHTTPs = function captureHTTPs(module, downstreamXRayEnabled, subsegmentCallback) {\n if (module.__request)\n return module;\n var tracedModule = {};\n Object.keys(module).forEach(function (val) {\n tracedModule[val] = module[val];\n });\n enableCapture(tracedModule, downstreamXRayEnabled, subsegmentCallback);\n return tracedModule;\n};\nfunction enableCapture(module, downstreamXRayEnabled, subsegmentCallback) {\n function captureOutgoingHTTPs(baseFunc, ...args) {\n let options;\n let callback;\n let hasUrl;\n let urlObj;\n let arg0 = args[0];\n if (typeof args[1] === 'object') {\n hasUrl = true;\n urlObj = typeof arg0 === 'string' ? new url.URL(arg0) : arg0;\n options = args[1],\n callback = args[2];\n }\n else {\n hasUrl = false;\n options = arg0;\n callback = args[1];\n }\n // Short circuit if the HTTP request has no options or is already being captured\n if (!options || (options.headers && (options.headers['X-Amzn-Trace-Id']))) {\n return baseFunc(...args);\n }\n // Case of calling a string URL without options, e.g.: http.request('http://amazon.com', callback)\n if (typeof options === 'string') {\n options = new url.URL(options);\n }\n if (!hasUrl) {\n urlObj = options;\n }\n const parent = contextUtils.resolveSegment(contextUtils.resolveManualSegmentParams(options));\n const hostname = options.hostname || options.host || urlObj.hostname || urlObj.host || 'Unknown host';\n if (!parent) {\n let output = '[ host: ' + hostname;\n output = options.method ? (output + ', method: ' + options.method) : output;\n output += ', path: ' + (urlObj.pathname || Utils.stripQueryStringFromPath(options.path)) + ' ]';\n if (!contextUtils.isAutomaticMode()) {\n logger.getLogger().info('Options for request ' + output +\n ' requires a segment object on the options params as \"XRaySegment\" for tracing in manual mode. Ignoring.');\n }\n else {\n logger.getLogger().info('Options for request ' + output +\n ' is missing the sub/segment context for automatic mode. Ignoring.');\n }\n // Options are not modified, only parsed for logging. We can pass in the original arguments.\n return baseFunc(...args);\n }\n const subsegment = parent.addNewSubsegment(hostname);\n const root = parent.segment ? parent.segment : parent;\n subsegment.namespace = 'remote';\n if (!options.headers)\n options.headers = {};\n options.headers['X-Amzn-Trace-Id'] = 'Root=' + root.trace_id + ';Parent=' + subsegment.id +\n ';Sampled=' + (!root.notTraced ? '1' : '0');\n const errorCapturer = function errorCapturer(e) {\n if (subsegmentCallback)\n subsegmentCallback(subsegment, this, null, e);\n if (subsegment.http && subsegment.http.response) {\n if (Utils.getCauseTypeFromHttpStatus(subsegment.http.response.status) === 'error') {\n subsegment.addErrorFlag();\n }\n subsegment.close(e, true);\n }\n else {\n const madeItToDownstream = (e.code !== 'ECONNREFUSED');\n subsegment.addRemoteRequestData(this, null, madeItToDownstream && downstreamXRayEnabled);\n subsegment.close(e);\n }\n // Only need to remove our listener & re-emit if we're not listening using the errorMonitor,\n // e.g. the app is running on Node 10. Otherwise the errorMonitor will re-emit automatically.\n // See: https://github.com/aws/aws-xray-sdk-node/issues/318\n // TODO: Remove this logic once node 12 support is deprecated\n if (!events.errorMonitor && this.listenerCount('error') <= 1) {\n this.removeListener('error', errorCapturer);\n this.emit('error', e);\n }\n };\n const optionsCopy = Utils.objectWithoutProperties(options, ['Segment'], true);\n let req = baseFunc(...(hasUrl ? [arg0, optionsCopy] : [options]), function (res) {\n res.on('end', function () {\n if (subsegmentCallback)\n subsegmentCallback(subsegment, this.req, res);\n if (res.statusCode === 429)\n subsegment.addThrottleFlag();\n const cause = Utils.getCauseTypeFromHttpStatus(res.statusCode);\n if (cause)\n subsegment[cause] = true;\n subsegment.addRemoteRequestData(res.req, res, !!downstreamXRayEnabled);\n subsegment.close();\n });\n if (typeof callback === 'function') {\n if (contextUtils.isAutomaticMode()) {\n const session = contextUtils.getNamespace();\n session.run(function () {\n contextUtils.setSegment(subsegment);\n callback(res);\n });\n }\n else {\n callback(res);\n }\n // if no callback provided by user application, AND no explicit response listener\n // added by user application, then we consume the response so the 'end' event fires\n // See: https://nodejs.org/api/http.html#http_class_http_clientrequest\n }\n else if (res.req && res.req.listenerCount('response') === 0) {\n res.resume();\n }\n });\n // Use errorMonitor if available (in Node 12.17+), otherwise fall back to standard error listener\n // See: https://nodejs.org/dist/latest-v12.x/docs/api/events.html#events_eventemitter_errormonitor\n req.on(events.errorMonitor || 'error', errorCapturer);\n return req;\n }\n module.__request = module.request;\n module.request = function captureHTTPsRequest(...args) {\n return captureOutgoingHTTPs(module.__request, ...args);\n };\n module.__get = module.get;\n module.get = function captureHTTPsGet(...args) {\n return captureOutgoingHTTPs(module.__get, ...args);\n };\n}\nmodule.exports.captureHTTPsGlobal = captureHTTPsGlobal;\nmodule.exports.captureHTTPs = captureHTTPs;\n", "\"use strict\";\n/**\n * @module promise_p\n */\n/**\n * This module patches native Promise libraries provided by V8 engine\n * so all subsegments generated within Promise are attached to the correct parent.\n */\nconst contextUtils = require('../context_utils');\nconst originalThen = Symbol('original then');\nconst originalCatch = Symbol('original catch');\nfunction patchPromise(Promise) {\n const then = Promise.prototype.then;\n if (!then[originalThen]) {\n Promise.prototype.then = function (onFulfilled, onRejected) {\n if (contextUtils.isAutomaticMode()\n && tryGetCurrentSegment()) {\n const ns = contextUtils.getNamespace();\n onFulfilled = onFulfilled && ns.bind(onFulfilled);\n onRejected = onRejected && ns.bind(onRejected);\n }\n return then.call(this, onFulfilled, onRejected);\n };\n Promise.prototype.then[originalThen] = then;\n }\n const origCatch = Promise.prototype.catch;\n if (origCatch && !origCatch[originalCatch]) {\n Promise.prototype.catch = function (onRejected) {\n if (contextUtils.isAutomaticMode()\n && tryGetCurrentSegment()) {\n const ns = contextUtils.getNamespace();\n onRejected = onRejected && ns.bind(onRejected);\n }\n return origCatch.call(this, onRejected);\n };\n Promise.prototype.catch[originalCatch] = origCatch;\n }\n}\nfunction unpatchPromise(Promise) {\n const then = Promise.prototype.then;\n if (then[originalThen]) {\n Promise.prototype.then = then[originalThen];\n }\n const origCatch = Promise.prototype.catch;\n if (origCatch && origCatch[originalCatch]) {\n Promise.prototype.catch = origCatch[originalCatch];\n }\n}\nfunction tryGetCurrentSegment() {\n try {\n return contextUtils.getSegment();\n }\n catch (e) {\n return undefined;\n }\n}\nfunction capturePromise() {\n patchPromise(Promise);\n}\nfunction uncapturePromise() {\n unpatchPromise(Promise);\n}\ncapturePromise.patchThirdPartyPromise = patchPromise;\nmodule.exports.capturePromise = capturePromise;\nmodule.exports.uncapturePromise = uncapturePromise;\n", "\"use strict\";\n/**\n * Represents a SQL database call.\n * @constructor\n * @param {string} databaseVer - The version on the database (user supplied).\n * @param {string} driverVer - The version on the database driver (user supplied).\n * @param {string} user - The user associated to the database call.\n * @param {string} queryType - The SQL query type.\n */\nfunction SqlData(databaseVer, driverVer, user, url, queryType) {\n this.init(databaseVer, driverVer, user, url, queryType);\n}\nSqlData.prototype.init = function init(databaseVer, driverVer, user, url, queryType) {\n if (databaseVer)\n this.database_version = databaseVer;\n if (driverVer)\n this.driver_version = driverVer;\n if (queryType)\n this.preparation = queryType;\n this.url = url;\n this.user = user;\n};\nmodule.exports = SqlData;\n", "\"use strict\";\nvar contextUtils = require('./context_utils');\nvar logging = require('./logger');\nvar segmentUtils = require('./segments/segment_utils');\nvar utils = require('./utils');\nvar LambdaEnv = require('./env/aws_lambda');\n// Import Data from package.json,\n// If the importing of package.json fails leave\n// pkginfo as an empty object\nvar pkginfo = {};\ntry {\n pkginfo = require('../../package.json');\n}\ncatch (err) {\n logging.getLogger().debug('Failed to load SDK data:', err);\n}\nvar UNKNOWN = 'unknown';\n/**\n * A module representing the AWSXRay SDK.\n * @namespace AWSXRay\n */\nvar AWSXRay = {\n /**\n * @memberof AWSXRay\n * @type {object}\n * @namespace AWSXRay.plugins\n */\n plugins: {\n /**\n * Exposes the AWS EC2 plugin.\n * @memberof AWSXRay.plugins\n */\n EC2Plugin: require('./segments/plugins/ec2_plugin'),\n /**\n * Exposes the AWS ECS plugin.\n * @memberof AWSXRay.plugins\n */\n ECSPlugin: require('./segments/plugins/ecs_plugin'),\n /**\n * Exposes the AWS Elastic Beanstalk plugin.\n * @memberof AWSXRay.plugins\n */\n ElasticBeanstalkPlugin: require('./segments/plugins/elastic_beanstalk_plugin'),\n },\n /**\n * Enables use of plugins to capture additional data for segments.\n * @param {Array} plugins - A configurable subset of AWSXRay.plugins.\n * @memberof AWSXRay\n * @see AWSXRay.plugins\n */\n config: function (plugins) {\n var pluginData = {};\n plugins.forEach(function (plugin) {\n plugin.getData(function (data) {\n if (data) {\n for (var attribute in data) {\n pluginData[attribute] = data[attribute];\n }\n }\n });\n segmentUtils.setOrigin(plugin.originName);\n segmentUtils.setPluginData(pluginData);\n });\n },\n /**\n * Overrides the default whitelisting file to specify what params to capture on each AWS Service call.\n * If a service or API is not listed, no additional data is captured.\n * The base whitelisting file can be found at /lib/resources/aws_whitelist.json\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @memberof AWSXRay\n */\n setAWSWhitelist: require('./segments/attributes/aws').setAWSWhitelist,\n /**\n * Appends to the current whitelisting file.\n * In the case of a duplicate service API listed, the new source will override the previous values.\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @memberof AWSXRay\n */\n appendAWSWhitelist: require('./segments/attributes/aws').appendAWSWhitelist,\n /**\n * Overrides the default streaming threshold (100).\n * The threshold represents the maximum number of subsegments on a single segment before\n * the SDK begins to send the completed subsegments out of band of the main segment.\n * Reduce this threshold if you see the 'Segment too large to send' error.\n * @param {number} threshold - The new threshold to use.\n * @memberof AWSXRay\n */\n setStreamingThreshold: segmentUtils.setStreamingThreshold,\n /**\n * Set your own logger for the SDK.\n * @param {Object} logger - A logger which responds to debug/info/warn/error calls.\n * @memberof AWSXRay\n */\n setLogger: logging.setLogger,\n /**\n * Gets the set logger for the SDK.\n * @memberof AWSXRay\n */\n getLogger: logging.getLogger,\n /**\n * Configures the address and port the daemon is expected to be on.\n * @param {string} address - Address of the daemon the segments should be sent to. Expects 'x.x.x.x', ':yyyy' or 'x.x.x.x:yyyy' IPv4 formats.\n * @module DaemonConfig\n * @memberof AWSXRay\n * @function\n * @see module:DaemonConfig.setDaemonAddress\n */\n setDaemonAddress: require('./daemon_config').setDaemonAddress,\n /**\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function conext to wrap.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:capture.captureFunc\n */\n captureFunc: require('./capture').captureFunc,\n /**\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function conext to wrap.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:capture.captureAsyncFunc\n */\n captureAsyncFunc: require('./capture').captureAsyncFunc,\n /**\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function conext to wrap.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:capture.captureCallbackFunc\n */\n captureCallbackFunc: require('./capture').captureCallbackFunc,\n /**\n * @param {AWS} awssdk - The Javascript AWS SDK.\n * @memberof AWSXRay\n * @function\n * @see module:aws_p.captureAWS\n */\n captureAWS: require('./patchers/aws_p').captureAWS,\n /**\n * @param {AWS.Service} service - An instance of a AWS service to wrap.\n * @memberof AWSXRay\n * @function\n * @see module:aws_p.captureAWSClient\n */\n captureAWSClient: require('./patchers/aws_p').captureAWSClient,\n /**\n * @param {AWSv3.Service} service - An instance of a AWS SDK v3 service to wrap.\n * @param {Segment|Subsegment} segment - Optional segment for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:aws3_p.captureAWSClient\n */\n captureAWSv3Client: require('./patchers/aws3_p').captureAWSClient,\n /**\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @memberof AWSXRay\n * @function\n * @returns {http|https}\n * @see module:http_p.captureHTTPs\n */\n captureHTTPs: require('./patchers/http_p').captureHTTPs,\n /**\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @memberof AWSXRay\n * @function\n * @see module:http_p.captureHTTPsGlobal\n */\n captureHTTPsGlobal: require('./patchers/http_p').captureHTTPsGlobal,\n /**\n * @memberof AWSXRay\n * @function\n * @see module:promise_p.capturePromise\n */\n capturePromise: require('./patchers/promise_p').capturePromise,\n /**\n * Exposes various helper methods.\n * @memberof AWSXRay\n * @function\n * @see module:utils\n */\n utils: utils,\n /**\n * @memberof AWSXRay\n * @type {object}\n * @namespace AWSXRay.database\n */\n database: {\n /**\n * Exposes the SqlData class.\n * @memberof AWSXRay.database\n * @see SqlData\n */\n SqlData: require('./database/sql_data'),\n },\n /**\n * Exposes the Middleware Utils class.\n * @memberof AWSXRay\n * @function\n * @see module:mw_utils\n */\n middleware: require('./middleware/mw_utils'),\n /**\n * Gets the current namespace of the context.\n * Used for supporting functions that can be used in automatic mode.\n * @memberof AWSXRay\n * @function\n * @returns {Segment|Subsegment}\n * @see module:context_utils.getNamespace\n */\n getNamespace: contextUtils.getNamespace,\n /**\n * Resolves the current segment or subsegment, checks manual and automatic modes.\n * Used for supporting functions that can be used in both manual and automatic modes.\n * @memberof AWSXRay\n * @function\n * @returns {Segment|Subsegment}\n * @see module:context_utils.resolveSegment\n */\n resolveSegment: contextUtils.resolveSegment,\n /**\n * Returns the current segment or subsegment. For use with automatic mode only.\n * @memberof AWSXRay\n * @function\n * @returns {Segment|Subsegment}\n * @see module:context_utils.getSegment\n */\n getSegment: contextUtils.getSegment,\n /**\n * Sets the current segment or subsegment. For use with automatic mode only.\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.setSegment\n */\n setSegment: contextUtils.setSegment,\n /**\n * Returns true if automatic mode is enabled, otherwise false.\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.isAutomaticMode\n */\n isAutomaticMode: contextUtils.isAutomaticMode,\n /**\n * Enables automatic mode. Automatic mode uses 'cls-hooked'.\n * @see https://github.com/jeff-lewis/cls-hooked\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.enableAutomaticMode\n */\n enableAutomaticMode: contextUtils.enableAutomaticMode,\n /**\n * Disables automatic mode. Current segment or subsegment must be passed manually\n * via the parent optional on captureFunc, captureAsyncFunc etc.\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.enableManualMode\n */\n enableManualMode: contextUtils.enableManualMode,\n /**\n * Sets the context missing strategy.\n * @param {Object} strategy - The strategy to set. This object's contextMissing function will be called whenever trace context is not found.\n */\n setContextMissingStrategy: contextUtils.setContextMissingStrategy,\n /**\n * Exposes the segment class.\n * @memberof AWSXRay\n * @function\n */\n Segment: require('./segments/segment'),\n /**\n * Exposes the subsegment class.\n * @memberof AWSXRay\n * @see Subsegment\n */\n Subsegment: require('./segments/attributes/subsegment'),\n SegmentUtils: segmentUtils\n};\n/**\n * Exposes the IncomingRequestData, to capture incoming request data.\n * For use with middleware.\n * @memberof AWSXRay.middleware\n * @see IncomingRequestData\n */\nAWSXRay.middleware.IncomingRequestData = require('./middleware/incoming_request_data'),\n (function () {\n var data = {\n runtime: (process.release && process.release.name) ? process.release.name : UNKNOWN,\n runtime_version: process.version,\n version: process.env.npm_package_version || UNKNOWN,\n name: process.env.npm_package_name || UNKNOWN\n };\n var sdkData = {\n sdk: 'X-Ray for Node.js',\n sdk_version: pkginfo.version ? pkginfo.version : UNKNOWN,\n package: pkginfo.name ? pkginfo.name : UNKNOWN,\n };\n segmentUtils.setSDKData(sdkData);\n segmentUtils.setServiceData(data);\n if (process.env.LAMBDA_TASK_ROOT)\n LambdaEnv.init();\n })();\nmodule.exports = AWSXRay;\n", "\"use strict\";\n// Convenience file to require the SDK from the root of the repository\nmodule.exports = require('./aws-xray');\n", "import { metricScope, Unit } from 'aws-embedded-metrics';\nimport type { Context } from 'aws-lambda';\nimport got from 'got';\nimport { CatalogClient } from '../catalog-builder/client.lambda-shared';\nimport * as aws from '../shared/aws.lambda-shared';\nimport { requireEnv } from '../shared/env.lambda-shared';\nimport { MetricName, METRICS_NAMESPACE } from './constants';\nimport { NpmDownloadsClient, NpmDownloadsEntry, NpmDownloadsPeriod } from './npm-downloads.lambda-shared';\n\n/**\n * Rebuilds the `stats.json` object in the configured S3 bucket.\n * Validates that the number of packages on a full rebuild should not decrease\n * significantly (due to network errors from e.g. NPM) - can be ignored\n * by passing { ignoreValidation: true }.\n *\n * @param event configuration for the rebuild job.\n * @param context the lambda context in which this execution runs.\n *\n * @returns the information about the updated S3 object.\n */\nexport async function handler(event: any, context: Context) {\n console.log(JSON.stringify(event, null, 2));\n\n const STATS_BUCKET_NAME = requireEnv('STATS_BUCKET_NAME');\n const STATS_OBJECT_KEY = requireEnv('STATS_OBJECT_KEY');\n\n const catalogClient = await CatalogClient.newClient();\n const catalog = catalogClient.packages;\n if (catalog.length === 0) {\n throw new Error('No packages found.');\n }\n\n const currentDate = new Date().toISOString();\n const stats: PackageStatsOutput = { packages: {}, updated: currentDate };\n const npmClient = new NpmDownloadsClient(got);\n\n // remove duplicates from different major versions\n const packageNames = [...new Set(catalog.map(pkg => pkg.name)).values()];\n\n console.log(`Retrieving download stats for all ${packageNames.length} registered packages: [${packageNames.join(',')}].`);\n const npmDownloads = await npmClient.getDownloads(packageNames, {\n period: NpmDownloadsPeriod.LAST_WEEK,\n throwErrors: false,\n });\n\n for (const [pkgName, entry] of npmDownloads.entries()) {\n updateStats(stats, pkgName, entry);\n }\n\n // Update metrics\n const statsCount = Object.keys(stats.packages).length;\n console.log(`There are now ${statsCount} packages with NPM stats stored.`);\n await metricScope((metrics) => async () => {\n // Clear out default dimensions as we don't need those. See https://github.com/awslabs/aws-embedded-metrics-node/issues/73\n metrics.setDimensions();\n\n metrics.setNamespace(METRICS_NAMESPACE);\n metrics.putMetric(MetricName.REGISTERED_PACKAGES_WITH_STATS, statsCount, Unit.Count);\n })();\n\n // Upload the result to S3 and exit.\n return aws.s3().putObject({\n Bucket: STATS_BUCKET_NAME,\n Key: STATS_OBJECT_KEY,\n Body: JSON.stringify(stats, null, 2),\n ContentType: 'application/json',\n CacheControl: 'public, max-age=300', // Expire from cache after 5 minutes\n Metadata: {\n 'Lambda-Log-Group': context.logGroupName,\n 'Lambda-Log-Stream': context.logStreamName,\n 'Lambda-Run-Id': context.awsRequestId,\n 'Package-Stats-Count': `${statsCount}`,\n },\n }).promise();\n}\n\nfunction updateStats(stats: PackageStatsOutput, pkgName: string, entry: NpmDownloadsEntry) {\n stats.packages[pkgName] = {\n ...(stats.packages[pkgName] ?? {}),\n downloads: {\n ...(stats.packages[pkgName]?.downloads ?? {}),\n npm: entry.downloads,\n },\n };\n}\n\nexport interface PackageStatsOutput {\n readonly packages: { [key: string]: PackageStatsEntry };\n readonly updated: string;\n}\n\nexport interface PackageStatsEntry {\n readonly downloads: PackageStatsDownloads;\n}\n\nexport interface PackageStatsDownloads {\n readonly npm: number;\n}\n", "import * as _AWS from 'aws-sdk';\nimport * as AWSXRay from 'aws-xray-sdk-core';\n\n// Do nothing if there is no XRay trace context\nAWSXRay.setContextMissingStrategy(() => {});\n\nconst AWS = AWSXRay.captureAWS(_AWS);\n\nlet _s3: AWS.S3 | undefined;\nlet _sqs: AWS.SQS | undefined;\nlet _sfn: AWS.StepFunctions | undefined;\nlet _lambda: AWS.Lambda | undefined;\nlet _codeArtifact: AWS.CodeArtifact | undefined;\n\nexport function s3(): AWS.S3 {\n if (_s3 == null) {\n _s3 = new AWS.S3();\n }\n return _s3;\n}\n\n/**\n * Checks whether an object exists in S3 at the provided bucket and key.\n */\nexport function s3ObjectExists(bucket: string, key: string): Promise<boolean> {\n return s3().headObject({\n Bucket: bucket,\n Key: key,\n }).promise()\n .then(\n () => true,\n (cause) => {\n if (cause.code === 'NotFound') {\n return false;\n }\n return Promise.reject(cause);\n },\n );\n}\n\nexport function sqs(): AWS.SQS {\n if (_sqs == null) {\n _sqs = new AWS.SQS();\n }\n return _sqs;\n}\n\nexport function stepFunctions(): AWS.StepFunctions {\n if (_sfn == null) {\n _sfn = new AWS.StepFunctions();\n }\n return _sfn;\n}\n\nexport function lambda(): AWS.Lambda {\n if (_lambda == null) {\n _lambda = new AWS.Lambda();\n }\n return _lambda;\n}\n\nexport function codeArtifact(): AWS.CodeArtifact {\n if (_codeArtifact == null) {\n _codeArtifact = new AWS.CodeArtifact();\n }\n return _codeArtifact;\n}\n\n/**\n * Resets all clients vended by this module. This is useful in unit tests when\n * `aws-sdk-mocks` is used, so that new mocks are injected as intended.\n */\nexport function reset(): void {\n _s3 = _sqs = _sfn = _lambda = _codeArtifact = undefined;\n}\n", "import { env } from 'process';\n\nexport function requireEnv(name: string): string {\n const result = env[name];\n if (!result) {\n throw new Error(`No value specified for required environment variable: ${name}`);\n }\n return result;\n}\n", "import * as AWS from 'aws-sdk';\nimport { CatalogModel, PackageInfo } from '.';\nimport { s3 } from '../shared/aws.lambda-shared';\nimport { requireEnv } from '../shared/env.lambda-shared';\n\n/**\n * A client for working with the catalog.\n */\nexport class CatalogClient {\n /**\n * Creates a new client for accessing the catalog.\n */\n public static async newClient() {\n const client = new CatalogClient();\n await client.init();\n return client;\n }\n\n private readonly s3: AWS.S3;\n private readonly bucketName: string;\n private readonly objectKey: string;\n\n private _packages: PackageInfo[] | undefined;\n\n private constructor() {\n this.bucketName = requireEnv('CATALOG_BUCKET_NAME');\n this.objectKey = requireEnv('CATALOG_OBJECT_KEY');\n this.s3 = s3();\n }\n\n /**\n * Downloads the catalog object and stores it in memory.\n */\n private async init() {\n if (this._packages) {\n throw new Error('init() cannot be called twice');\n }\n\n this._packages = [];\n\n const params = {\n Bucket: this.bucketName,\n Key: this.objectKey,\n };\n\n let body: AWS.S3.Body | undefined;\n try {\n const data = await this.s3.getObject(params).promise();\n body = data.Body;\n } catch (e) {\n throw new Error(`No catalog was found at ${this.bucketName}/${this.objectKey}`);\n }\n\n if (!body) {\n throw new Error(`Catalog body is empty at ${this.bucketName}/${this.objectKey}`);\n }\n\n const contents = body.toString('utf-8');\n\n try {\n const data = JSON.parse(contents) as CatalogModel;\n if (typeof(data) != 'object') {\n throw new Error('Invalid format in catalog file. Expecting a map');\n }\n this._packages = data.packages;\n } catch (e) {\n throw new Error(`Unable to parse catalog file ${this.bucketName}/${this.objectKey}: ${e}`);\n }\n }\n\n /**\n * Returns a copy of the catalog list.\n */\n public get packages() {\n if (!this._packages) {\n throw new Error('CatalogClient must be initialized');\n }\n\n return [...this._packages];\n }\n}\n", "export const METRICS_NAMESPACE = 'ConstructHub/PackageStats';\n\nexport const enum MetricName {\n REGISTERED_PACKAGES_WITH_STATS = 'RegisteredPackagesWithStats',\n}\n", "import type { Got } from 'got/dist/source/types';\n\nexport enum NpmDownloadsPeriod {\n /**\n * Gets downloads for the last available day. In practice, this will usually\n * be \"yesterday\" (in GMT) but if stats for that day have not yet landed, it\n * will be the day before.\n */\n LAST_DAY = 'last-day',\n\n /**\n * Gets downloads for the last 7 available days.\n */\n LAST_WEEK = 'last-week',\n\n /**\n * Gets downloads for the last 30 available days.\n */\n LAST_MONTH = 'last-month'\n}\n\nexport interface NpmDownloadsEntry {\n readonly downloads: number;\n readonly start: string;\n readonly end: string;\n readonly package: string;\n}\n\nexport type NpmDownloadsOutput = Map<string, NpmDownloadsEntry>;\n\nexport interface NpmDownloadsOptions {\n /**\n * The period to query for package download counts.\n * @default NpmDownloadsPeriod.LAST_WEEK\n */\n readonly period?: NpmDownloadsPeriod;\n\n /**\n * Throw an error when any package's download metrics are not available.\n * @default true\n */\n readonly throwErrors?: boolean;\n}\n\nexport class NpmDownloadsClient {\n public static readonly NPM_DOWNLOADS_API_URL = 'https://api.npmjs.org/downloads/point';\n public static readonly MAX_PACKAGES_PER_QUERY = 128; // this is a limitation from npm's API! do not change\n\n private readonly got: Got;\n\n constructor(gotService: Got) {\n this.got = gotService;\n }\n\n private async getDownloadsRaw(\n packages: readonly string[],\n period: NpmDownloadsPeriod,\n throwErrors: boolean,\n ): Promise<NpmDownloadsOutput> {\n if (packages.length > NpmDownloadsClient.MAX_PACKAGES_PER_QUERY) {\n throw new Error(`Too many packages were provided (max: ${NpmDownloadsClient.MAX_PACKAGES_PER_QUERY})`);\n }\n if (packages.some((pkg) => this.isScopedPackage(pkg)) && packages.length > 1) {\n throw new Error('Scoped packages aren\\'t supported by the bulk query API.');\n }\n if (packages.length === 0) return new Map();\n\n console.log(`Querying NPM for ${packages.length} package(s): [${packages.join(', ')}]`);\n const result = await this.got(`${NpmDownloadsClient.NPM_DOWNLOADS_API_URL}/${period}/${packages.join(',')}`, {\n timeout: 5 * 1000, // 5 seconds\n }).catch((err) => {\n if (throwErrors) {\n throw err;\n } else {\n return { body: JSON.stringify({ error: JSON.stringify(err) }) };\n }\n });\n\n const data: NpmApiResult = JSON.parse(result.body);\n\n // single package query error\n // ex. { \"error\": \"package foo not found\" }\n if ('error' in data) {\n if (throwErrors) {\n throw new Error(`Could not retrieve download metrics: ${data.error}`);\n } else {\n console.error(`Could not retrieve download metrics: ${data.error}`);\n return new Map();\n }\n }\n\n // only a single package was returned\n if (isSingleDownloadsEntry(data)) {\n return new Map([[packages[0], data]]);\n }\n\n // bulk query result\n for (const key of Object.keys(data)) {\n if (data[key] === null) {\n if (throwErrors) {\n throw new Error(`Could not retrieve download metrics for package ${key}`);\n } else {\n console.error(`Could not retrieve download metrics for package ${key}`);\n delete data[key];\n }\n }\n }\n\n // typescript can't figure out that we removed all null values\n // @ts-ignore\n return new Map(Object.entries(data));\n }\n\n /**\n * Retrieves the number of downloads each package has on npm in the latest period.\n * Output is not guaranteed to be returned in a specific order.\n * If throwErrors option is specified, an error is thrown when a package's\n * download count is unavailable - otherwise, it's just omitted from\n * the output.\n */\n public async getDownloads(\n packages: string[],\n options: NpmDownloadsOptions = {},\n ): Promise<NpmDownloadsOutput> {\n const period = options.period ?? NpmDownloadsPeriod.LAST_WEEK;\n const throwErrors = options.throwErrors ?? true;\n\n // separate scoped and unscoped packages since scoped packages are not\n // supported by the bulk query API\n const scopedPackages = [];\n const unscopedPackages = [];\n for (const pkg of packages) {\n if (this.isScopedPackage(pkg)) {\n scopedPackages.push(pkg);\n } else {\n unscopedPackages.push(pkg);\n }\n }\n\n // we could parallelize this, but then it's more likely we get throttled\n const output: NpmDownloadsOutput = new Map();\n for (const pkg of scopedPackages) {\n const partialResults = await this.getDownloadsRaw([pkg], period, throwErrors);\n for (const [key, value] of partialResults) {\n output.set(key, value);\n }\n }\n for (let i = 0; i < unscopedPackages.length; i += NpmDownloadsClient.MAX_PACKAGES_PER_QUERY) {\n const batch = unscopedPackages.slice(i, i + NpmDownloadsClient.MAX_PACKAGES_PER_QUERY);\n const partialResults = await this.getDownloadsRaw(batch, period, throwErrors);\n for (const [key, value] of partialResults) {\n output.set(key, value);\n }\n }\n\n return output;\n }\n\n private isScopedPackage(packageName: string) {\n return packageName.startsWith('@');\n }\n}\n\n// Types for the output of NPM's API.\ntype NpmApiResult = NpmApiError | NpmApiSingleResult | NpmApiMultipleResult;\ntype NpmApiError = { error: string };\ntype NpmApiSingleResult = NpmDownloadsEntry;\ntype NpmApiMultipleResult = { [key: string]: NpmApiSingleResult | null };\n\nfunction isSingleDownloadsEntry(data: any): data is NpmDownloadsEntry {\n return 'downloads' in data && typeof data.downloads === 'number';\n}\n"],
4
+ "sourcesContent": ["\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Constants;\n(function (Constants) {\n Constants[Constants[\"MAX_DIMENSIONS\"] = 9] = \"MAX_DIMENSIONS\";\n Constants[\"DEFAULT_NAMESPACE\"] = \"aws-embedded-metrics\";\n Constants[Constants[\"MAX_METRICS_PER_EVENT\"] = 100] = \"MAX_METRICS_PER_EVENT\";\n Constants[\"DEFAULT_AGENT_HOST\"] = \"0.0.0.0\";\n Constants[Constants[\"DEFAULT_AGENT_PORT\"] = 25888] = \"DEFAULT_AGENT_PORT\";\n})(Constants = exports.Constants || (exports.Constants = {}));\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Environments;\n(function (Environments) {\n Environments[\"Local\"] = \"Local\";\n Environments[\"Lambda\"] = \"Lambda\";\n Environments[\"Agent\"] = \"Agent\";\n Environments[\"EC2\"] = \"EC2\";\n Environments[\"ECS\"] = \"ECS\";\n Environments[\"Unknown\"] = \"\";\n})(Environments || (Environments = {}));\nexports.default = Environments;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Constants_1 = require(\"../Constants\");\nconst Environments_1 = require(\"../environment/Environments\");\nconst ENV_VAR_PREFIX = 'AWS_EMF';\nvar ConfigKeys;\n(function (ConfigKeys) {\n ConfigKeys[\"LOG_GROUP_NAME\"] = \"LOG_GROUP_NAME\";\n ConfigKeys[\"LOG_STREAM_NAME\"] = \"LOG_STREAM_NAME\";\n ConfigKeys[\"ENABLE_DEBUG_LOGGING\"] = \"ENABLE_DEBUG_LOGGING\";\n ConfigKeys[\"SERVICE_NAME\"] = \"SERVICE_NAME\";\n ConfigKeys[\"SERVICE_TYPE\"] = \"SERVICE_TYPE\";\n ConfigKeys[\"AGENT_ENDPOINT\"] = \"AGENT_ENDPOINT\";\n ConfigKeys[\"ENVIRONMENT_OVERRIDE\"] = \"ENVIRONMENT\";\n ConfigKeys[\"NAMESPACE\"] = \"NAMESPACE\";\n})(ConfigKeys || (ConfigKeys = {}));\nclass EnvironmentConfigurationProvider {\n getConfiguration() {\n return {\n agentEndpoint: this.getEnvVariable(ConfigKeys.AGENT_ENDPOINT),\n debuggingLoggingEnabled: this.tryGetEnvVariableAsBoolean(ConfigKeys.ENABLE_DEBUG_LOGGING, false),\n logGroupName: this.getEnvVariable(ConfigKeys.LOG_GROUP_NAME),\n logStreamName: this.getEnvVariable(ConfigKeys.LOG_STREAM_NAME),\n serviceName: this.getEnvVariable(ConfigKeys.SERVICE_NAME) || this.getEnvVariableWithoutPrefix(ConfigKeys.SERVICE_NAME),\n serviceType: this.getEnvVariable(ConfigKeys.SERVICE_TYPE) || this.getEnvVariableWithoutPrefix(ConfigKeys.SERVICE_TYPE),\n environmentOverride: this.getEnvironmentOverride(),\n namespace: this.getEnvVariable(ConfigKeys.NAMESPACE) || Constants_1.Constants.DEFAULT_NAMESPACE,\n };\n }\n getEnvVariableWithoutPrefix(configKey) {\n return process.env[configKey];\n }\n getEnvVariable(configKey) {\n return process.env[`${ENV_VAR_PREFIX}_${configKey}`];\n }\n tryGetEnvVariableAsBoolean(configKey, fallback) {\n const configValue = this.getEnvVariable(configKey);\n return !configValue ? fallback : configValue.toLowerCase() === 'true';\n }\n getEnvironmentOverride() {\n const overrideValue = this.getEnvVariable(ConfigKeys.ENVIRONMENT_OVERRIDE);\n const environment = Environments_1.default[overrideValue];\n if (environment === undefined) {\n return Environments_1.default.Unknown;\n }\n return environment;\n }\n}\nexports.EnvironmentConfigurationProvider = EnvironmentConfigurationProvider;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst EnvironmentConfigurationProvider_1 = require(\"./EnvironmentConfigurationProvider\");\nconst Configuration = new EnvironmentConfigurationProvider_1.EnvironmentConfigurationProvider().getConfiguration();\nexports.default = Configuration;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst LOG = (...args) => {\n if (Configuration_1.default.debuggingLoggingEnabled) {\n console.log(...args);\n }\n};\nexports.LOG = LOG;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass MetricValues {\n constructor(value, unit) {\n this.values = [value];\n this.unit = unit || 'None';\n }\n /**\n * Appends the provided value to the current metric\n * @param value\n */\n addValue(value) {\n this.values.push(value);\n }\n}\nexports.MetricValues = MetricValues;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst MetricValues_1 = require(\"./MetricValues\");\nclass MetricsContext {\n /**\n * Constructor used to create child instances.\n * You should not use this constructor directly.\n * Instead, use createCopyWithContext() or empty().\n *\n * The reason for this is to avoid unexpected behavior when creating\n * MetricsContexts with defaultDimensions and existing dimensions.\n *\n * @param properties\n * @param dimensions\n */\n constructor(namespace, properties, dimensions, defaultDimensions, shouldUseDefaultDimensions, timestamp) {\n this.metrics = new Map();\n this.meta = {};\n this.shouldUseDefaultDimensions = true;\n this.namespace = namespace || Configuration_1.default.namespace;\n this.properties = properties || {};\n this.dimensions = dimensions || [];\n this.timestamp = timestamp;\n this.meta.Timestamp = MetricsContext.resolveMetaTimestamp(timestamp);\n this.defaultDimensions = defaultDimensions || {};\n if (shouldUseDefaultDimensions != undefined) {\n this.shouldUseDefaultDimensions = shouldUseDefaultDimensions;\n }\n }\n /**\n * Use this to create a new, empty context.\n */\n static empty() {\n return new MetricsContext();\n }\n static resolveMetaTimestamp(timestamp) {\n if (timestamp instanceof Date) {\n return timestamp.getTime();\n }\n else if (timestamp) {\n return timestamp;\n }\n else {\n return Date.now();\n }\n }\n setNamespace(value) {\n this.namespace = value;\n }\n setProperty(key, value) {\n this.properties[key] = value;\n }\n setTimestamp(timestamp) {\n this.timestamp = timestamp;\n this.meta.Timestamp = MetricsContext.resolveMetaTimestamp(timestamp);\n }\n /**\n * Sets default dimensions for the Context.\n * A dimension set will be created with just the default dimensions\n * and all calls to putDimensions will be prepended with the defaults.\n */\n setDefaultDimensions(dimensions) {\n Logger_1.LOG(`Received default dimensions`, dimensions);\n this.defaultDimensions = dimensions;\n }\n /**\n * Adds a new set of dimensions. Any time a new dimensions set\n * is added, the set is first prepended by the default dimensions.\n *\n * @param dimensions\n */\n putDimensions(incomingDimensionSet) {\n if (this.dimensions.length === 0) {\n this.dimensions.push(incomingDimensionSet);\n return;\n }\n for (let i = 0; i < this.dimensions.length; i++) {\n const existingDimensionSet = this.dimensions[i];\n // check for duplicate dimensions when putting\n // this is an O(n^2) operation, but since we never expect to have more than\n // 10 dimensions, this is acceptable for almost all cases.\n // This makes re-using loggers much easier.\n const existingDimensionSetKeys = Object.keys(existingDimensionSet);\n const incomingDimensionSetKeys = Object.keys(incomingDimensionSet);\n if (existingDimensionSetKeys.length !== incomingDimensionSetKeys.length) {\n this.dimensions.push(incomingDimensionSet);\n return;\n }\n for (let j = 0; j < existingDimensionSetKeys.length; j++) {\n if (!incomingDimensionSetKeys.includes(existingDimensionSetKeys[j])) {\n // we're done now because we know that the dimensions keys are not identical\n this.dimensions.push(incomingDimensionSet);\n return;\n }\n }\n }\n }\n /**\n * Overwrite all dimensions.\n *\n * @param dimensionSets\n */\n setDimensions(dimensionSets) {\n this.shouldUseDefaultDimensions = false;\n this.dimensions = dimensionSets;\n }\n /**\n * Get the current dimensions.\n */\n getDimensions() {\n // caller has explicitly called setDimensions\n if (this.shouldUseDefaultDimensions === false) {\n return this.dimensions;\n }\n // if there are no default dimensions, return the custom dimensions\n if (Object.keys(this.defaultDimensions).length === 0) {\n return this.dimensions;\n }\n // if default dimensions have been provided, but no custom dimensions, use the defaults\n if (this.dimensions.length === 0) {\n return [this.defaultDimensions];\n }\n // otherwise, merge the dimensions\n // we do this on the read path because default dimensions\n // may get updated asynchronously by environment detection\n return this.dimensions.map(custom => {\n return Object.assign(Object.assign({}, this.defaultDimensions), custom);\n });\n }\n putMetric(key, value, unit) {\n const currentMetric = this.metrics.get(key);\n if (currentMetric) {\n currentMetric.addValue(value);\n }\n else {\n this.metrics.set(key, new MetricValues_1.MetricValues(value, unit));\n }\n }\n /**\n * Creates an independently flushable context.\n */\n createCopyWithContext() {\n return new MetricsContext(this.namespace, Object.assign({}, this.properties), Object.assign([], this.dimensions), this.defaultDimensions, this.shouldUseDefaultDimensions, this.timestamp);\n }\n}\nexports.MetricsContext = MetricsContext;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst MetricsContext_1 = require(\"./MetricsContext\");\n/**\n * An async metrics logger.\n * Use this interface to publish logs to CloudWatch Logs\n * and extract metrics to CloudWatch Metrics asynchronously.\n */\nclass MetricsLogger {\n constructor(resolveEnvironment, context) {\n this.configureContextForEnvironment = (context, environment) => {\n const defaultDimensions = {\n // LogGroup name will entirely depend on the environment since there\n // are some cases where the LogGroup cannot be configured (e.g. Lambda)\n LogGroup: environment.getLogGroupName(),\n ServiceName: Configuration_1.default.serviceName || environment.getName(),\n ServiceType: Configuration_1.default.serviceType || environment.getType(),\n };\n context.setDefaultDimensions(defaultDimensions);\n environment.configureContext(context);\n };\n this.resolveEnvironment = resolveEnvironment;\n this.context = context || MetricsContext_1.MetricsContext.empty();\n }\n /**\n * Flushes the current context state to the configured sink.\n */\n flush() {\n return __awaiter(this, void 0, void 0, function* () {\n // resolve the environment and get the sink\n // MOST of the time this will run synchonrously\n // This only runs asynchronously if executing for the\n // first time in a non-lambda environment\n const environment = yield this.resolveEnvironment();\n this.configureContextForEnvironment(this.context, environment);\n const sink = environment.getSink();\n // accept and reset the context\n yield sink.accept(this.context);\n this.context = this.context.createCopyWithContext();\n });\n }\n /**\n * Set a property on the published metrics.\n * This is stored in the emitted log data and you are not\n * charged for this data by CloudWatch Metrics.\n * These values can be values that are useful for searching on,\n * but have too high cardinality to emit as dimensions to\n * CloudWatch Metrics.\n *\n * @param key Property name\n * @param value Property value\n */\n setProperty(key, value) {\n this.context.setProperty(key, value);\n return this;\n }\n /**\n * Adds a dimension.\n * This is generally a low cardinality key-value pair that is part of the metric identity.\n * CloudWatch treats each unique combination of dimensions as a separate metric, even if the metrics have the same metric name.\n *\n * @param dimension\n * @param value\n * @see [CloudWatch Dimensions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension)\n */\n putDimensions(dimensions) {\n this.context.putDimensions(dimensions);\n return this;\n }\n /**\n * Overwrite all dimensions on this MetricsLogger instance.\n *\n * @param dimensionSets\n * @see [CloudWatch Dimensions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension)\n */\n setDimensions(...dimensionSets) {\n this.context.setDimensions(dimensionSets);\n return this;\n }\n /**\n * Put a metric value.\n * This value will be emitted to CloudWatch Metrics asyncronously and does not contribute to your\n * account TPS limits. The value will also be available in your CloudWatch Logs\n * @param key\n * @param value\n * @param unit\n */\n putMetric(key, value, unit) {\n this.context.putMetric(key, value, unit);\n return this;\n }\n /**\n * Set the CloudWatch namespace that metrics should be published to.\n * @param value\n */\n setNamespace(value) {\n this.context.setNamespace(value);\n return this;\n }\n /**\n * Set the timestamp of metrics emitted in this context.\n *\n * If not set, the timestamp will default to new Date() at the point\n * the context is constructed.\n *\n * If set, timestamp will preserved across calls to flush().\n *\n * @param timestamp\n */\n setTimestamp(timestamp) {\n this.context.setTimestamp(timestamp);\n return this;\n }\n /**\n * Creates a new logger using the same contextual data as\n * the previous logger. This allows you to flush the instances\n * independently.\n */\n new() {\n return new MetricsLogger(this.resolveEnvironment, this.context.createCopyWithContext());\n }\n}\nexports.MetricsLogger = MetricsLogger;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Constants_1 = require(\"../Constants\");\n/**\n * Serializes the provided context to the CWL Structured\n * Logs format with Embedded Metric Filters.\n */\nclass LogSerializer {\n /**\n * Retrieve the current context as a JSON string\n */\n serialize(context) {\n const dimensionKeys = [];\n let dimensionProperties = {};\n context.getDimensions().forEach(d => {\n // we can only take the first 9 defined dimensions\n // the reason we do this in the serializer is because\n // it is possible that other sinks or formats can\n // support more dimensions\n // in the future it may make sense to introduce a higher-order\n // representation for sink-specific validations\n const keys = Object.keys(d).slice(0, Constants_1.Constants.MAX_DIMENSIONS);\n dimensionKeys.push(keys);\n dimensionProperties = Object.assign(Object.assign({}, dimensionProperties), d);\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createBody = () => {\n return Object.assign(Object.assign(Object.assign({}, dimensionProperties), context.properties), { _aws: Object.assign(Object.assign({}, context.meta), { CloudWatchMetrics: [\n {\n Dimensions: dimensionKeys,\n Metrics: [],\n Namespace: context.namespace,\n },\n ] }) });\n };\n const eventBatches = [];\n let currentBody = createBody();\n const currentMetricsInBody = () => currentBody._aws.CloudWatchMetrics[0].Metrics.length;\n const shouldSerialize = () => currentMetricsInBody() === Constants_1.Constants.MAX_METRICS_PER_EVENT;\n // converts the body to JSON and pushes it into the batches\n const serializeCurrentBody = () => {\n eventBatches.push(JSON.stringify(currentBody));\n currentBody = createBody();\n };\n for (const [key, metric] of context.metrics) {\n // if there is only one metric value, unwrap it to make querying easier\n const metricValue = metric.values.length === 1 ? metric.values[0] : metric.values;\n currentBody[key] = metricValue;\n currentBody._aws.CloudWatchMetrics[0].Metrics.push({ Name: key, Unit: metric.unit });\n if (shouldSerialize()) {\n serializeCurrentBody();\n }\n }\n if (eventBatches.length === 0 || currentMetricsInBody() > 0) {\n serializeCurrentBody();\n }\n return eventBatches;\n }\n}\nexports.LogSerializer = LogSerializer;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst LogSerializer_1 = require(\"../serializers/LogSerializer\");\n/**\n * A sink that flushes log data to stdout.\n * This is the preferred sink for Lambda functions.\n */\nclass ConsoleSink {\n constructor(serializer) {\n this.name = 'ConsoleSink';\n this.serializer = serializer || new LogSerializer_1.LogSerializer();\n }\n accept(context) {\n // tslint:disable-next-line\n const events = this.serializer.serialize(context);\n events.forEach(event => console.log(event));\n return Promise.resolve();\n }\n}\nexports.ConsoleSink = ConsoleSink;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst net = require(\"net\");\nconst Logger_1 = require(\"../../utils/Logger\");\nclass TcpClient {\n constructor(endpoint) {\n this.endpoint = endpoint;\n this.socket = new net.Socket({ allowHalfOpen: true, writable: false })\n .setEncoding('utf8')\n .setKeepAlive(true)\n .setTimeout(5000) // idle timeout\n .on('timeout', () => this.disconnect('idle timeout'))\n .on('end', () => this.disconnect('end'))\n .on('data', data => Logger_1.LOG('TcpClient received data.', data));\n }\n warmup() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield this.establishConnection();\n }\n catch (err) {\n Logger_1.LOG('Failed to connect', err);\n }\n });\n }\n sendMessage(message) {\n return __awaiter(this, void 0, void 0, function* () {\n // ensure the socket is open and writable\n yield this.waitForOpenConnection();\n yield new Promise((resolve, reject) => {\n const onSendError = (err) => {\n Logger_1.LOG('Failed to write', err);\n reject(err);\n };\n const wasFlushedToKernel = this.socket.write(message, (err) => {\n if (!err) {\n Logger_1.LOG('Write succeeded');\n resolve();\n }\n else {\n onSendError(err);\n }\n });\n if (!wasFlushedToKernel) {\n Logger_1.LOG('TcpClient data was not flushed to kernel buffer and was queued in memory.');\n }\n });\n });\n }\n disconnect(eventName) {\n Logger_1.LOG('TcpClient disconnected due to:', eventName);\n this.socket.removeAllListeners();\n this.socket.destroy();\n this.socket.unref();\n }\n waitForOpenConnection() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.socket.writeable || this.socket.readyState !== 'open') {\n yield this.establishConnection();\n }\n });\n }\n establishConnection() {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((resolve, reject) => {\n const onError = (e) => {\n // socket is already open, no need to connect\n if (e.message.includes('EISCONN')) {\n resolve();\n return;\n }\n Logger_1.LOG('TCP Client received error', e);\n this.disconnect(e.message);\n reject(e);\n };\n const onConnect = () => {\n this.socket.removeListener('error', onError);\n Logger_1.LOG('TcpClient connected.', this.endpoint);\n resolve();\n };\n // TODO: convert this to a proper state machine\n switch (this.socket.readyState) {\n case 'open':\n resolve();\n break;\n case 'opening':\n // the socket is currently opening, we will resolve\n // or fail the current promise on the connect or\n // error events\n this.socket.once('connect', onConnect);\n this.socket.once('error', onError);\n break;\n default:\n Logger_1.LOG('opening connection with socket in state: ', this.socket.readyState);\n this.socket.connect(this.endpoint.port, this.endpoint.host, onConnect).once('error', onError);\n break;\n }\n });\n });\n }\n}\nexports.TcpClient = TcpClient;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst dgram = require(\"dgram\");\nconst Logger_1 = require(\"../../utils/Logger\");\nclass UdpClient {\n constructor(endpoint) {\n this.endpoint = endpoint;\n }\n // No warm up for UDP\n warmup() {\n return Promise.resolve();\n }\n sendMessage(message) {\n return __awaiter(this, void 0, void 0, function* () {\n const client = dgram.createSocket('udp4');\n client.send(message, this.endpoint.port, this.endpoint.host, (error) => {\n if (error) {\n Logger_1.LOG(error);\n }\n client.close();\n });\n return Promise.resolve();\n });\n }\n}\nexports.UdpClient = UdpClient;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url = require(\"url\");\nconst Configuration_1 = require(\"../config/Configuration\");\nconst LogSerializer_1 = require(\"../serializers/LogSerializer\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst TcpClient_1 = require(\"./connections/TcpClient\");\nconst UdpClient_1 = require(\"./connections/UdpClient\");\nconst TCP = 'tcp:';\nconst UDP = 'udp:';\nconst defaultTcpEndpoint = {\n host: '0.0.0.0',\n port: 25888,\n protocol: TCP,\n};\nconst parseEndpoint = (endpoint) => {\n try {\n if (!endpoint) {\n return defaultTcpEndpoint;\n }\n const parsedUrl = url.parse(endpoint);\n if (!parsedUrl.hostname || !parsedUrl.port || !parsedUrl.protocol) {\n Logger_1.LOG(`Failed to parse the provided agent endpoint. Falling back to the default TCP endpoint.`, parsedUrl);\n return defaultTcpEndpoint;\n }\n if (parsedUrl.protocol !== TCP && parsedUrl.protocol !== UDP) {\n Logger_1.LOG(`The provided agent endpoint protocol '${parsedUrl.protocol}' is not supported. Please use TCP or UDP. Falling back to the default TCP endpoint.`, parsedUrl);\n return defaultTcpEndpoint;\n }\n return {\n host: parsedUrl.hostname,\n port: Number(parsedUrl.port),\n protocol: parsedUrl.protocol,\n };\n }\n catch (e) {\n Logger_1.LOG('Failed to parse the provided agent endpoint', e);\n return defaultTcpEndpoint;\n }\n};\n/**\n * A sink that flushes to the CW Agent.\n * This sink instance should be re-used to avoid\n * leaking connections.\n */\nclass AgentSink {\n constructor(logGroupName, logStreamName, serializer) {\n this.name = 'AgentSink';\n this.logGroupName = logGroupName;\n this.logStreamName = logStreamName;\n this.serializer = serializer || new LogSerializer_1.LogSerializer();\n this.endpoint = parseEndpoint(Configuration_1.default.agentEndpoint);\n this.socketClient = this.getSocketClient(this.endpoint);\n Logger_1.LOG('Using socket client', this.socketClient.constructor.name);\n }\n accept(context) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.logGroupName) {\n context.meta.LogGroupName = this.logGroupName;\n }\n if (this.logStreamName) {\n context.meta.LogStreamName = this.logStreamName;\n }\n const events = this.serializer.serialize(context);\n Logger_1.LOG(`Sending {} events to socket.`, events.length);\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n const message = event + '\\n';\n const bytes = Buffer.from(message);\n yield this.socketClient.sendMessage(bytes);\n }\n });\n }\n getSocketClient(endpoint) {\n Logger_1.LOG('Getting socket client for connection.', endpoint);\n const client = endpoint.protocol === TCP ? new TcpClient_1.TcpClient(endpoint) : new UdpClient_1.UdpClient(endpoint);\n client.warmup();\n return client;\n }\n}\nexports.AgentSink = AgentSink;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst AgentSink_1 = require(\"../sinks/AgentSink\");\nconst Logger_1 = require(\"../utils/Logger\");\nclass DefaultEnvironment {\n probe() {\n return Promise.resolve(true);\n }\n getName() {\n if (!Configuration_1.default.serviceName) {\n Logger_1.LOG('Unknown ServiceName.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceName;\n }\n getType() {\n if (!Configuration_1.default.serviceType) {\n Logger_1.LOG('Unknown ServiceType.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceType;\n }\n getLogGroupName() {\n // if the caller explicitly overrides logGroupName to\n // be empty, we should honor that rather than providing\n // the default behavior.\n if (Configuration_1.default.logGroupName === '') {\n return '';\n }\n return Configuration_1.default.logGroupName ? Configuration_1.default.logGroupName : `${this.getName()}-metrics`;\n }\n configureContext() {\n // no-op\n }\n getSink() {\n if (!this.sink) {\n this.sink = new AgentSink_1.AgentSink(this.getLogGroupName(), Configuration_1.default.logStreamName);\n }\n return this.sink;\n }\n}\nexports.DefaultEnvironment = DefaultEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst http = require(\"http\");\nconst SOCKET_TIMEOUT = 1000;\n/**\n * Fetch JSON data from an remote HTTP endpoint and de-serialize to the provided type.\n * There are no guarantees the response will conform to the contract defined by T.\n * It is up to the consumer to ensure the provided T captures all possible response types\n * from the provided endpoint.\n *\n * @param url - currently only supports HTTP\n */\nconst fetch = (url) => {\n return new Promise((resolve, reject) => {\n const request = http\n .get(url, { timeout: 2000 }, (response) => {\n if (!response.statusCode) {\n reject(`Received undefined response status code from '${url}'`);\n return;\n }\n if (response.statusCode < 200 || response.statusCode > 299) {\n reject(new Error('Failed to load page, status code: ' + response.statusCode));\n return;\n }\n // using similar approach to node-fetch\n // https://github.com/bitinn/node-fetch/blob/6a5d192034a0f438551dffb6d2d8df2c00921d16/src/body.js#L217\n const body = [];\n let bodyBytes = 0;\n response.on('data', (chunk) => {\n bodyBytes += chunk.length;\n body.push(chunk);\n });\n response.on('end', () => {\n let responseString;\n try {\n const buffer = Buffer.concat(body, bodyBytes);\n responseString = buffer.toString();\n const parsedJson = JSON.parse(responseString);\n resolve(parsedJson);\n }\n catch (e) {\n reject(`Failed to parse response from '${url}' as JSON. Received: ${responseString}`);\n }\n });\n })\n .on('error', (err) => {\n reject(err);\n });\n request.on('socket', socket => {\n socket.on('timeout', () => {\n request.abort();\n reject(`Socket timeout while connecting to '${url}'`);\n });\n socket.setTimeout(SOCKET_TIMEOUT);\n });\n });\n};\nexports.fetch = fetch;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst AgentSink_1 = require(\"../sinks/AgentSink\");\nconst Fetch_1 = require(\"../utils/Fetch\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst os = require(\"os\");\nconst Constants_1 = require(\"../Constants\");\n// formats image names into something more readable for a metric name\n// e.g. <account-id>.dkr.ecr.<region>.amazonaws.com/<image-name>:latest -> <image-name>:latest\nconst formatImageName = (imageName) => {\n if (imageName) {\n const splitImageName = imageName.split('/');\n return splitImageName[splitImageName.length - 1];\n }\n return imageName;\n};\nclass ECSEnvironment {\n probe() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!process.env.ECS_CONTAINER_METADATA_URI) {\n return Promise.resolve(false);\n }\n if (process.env.FLUENT_HOST && !Configuration_1.default.agentEndpoint) {\n this.fluentBitEndpoint = `tcp://${process.env.FLUENT_HOST}:${Constants_1.Constants.DEFAULT_AGENT_PORT}`;\n Configuration_1.default.agentEndpoint = this.fluentBitEndpoint;\n Logger_1.LOG(`Using FluentBit configuration. Endpoint: ${this.fluentBitEndpoint}`);\n }\n try {\n this.metadata = yield Fetch_1.fetch(process.env.ECS_CONTAINER_METADATA_URI);\n if (this.metadata) {\n this.metadata.FormattedImageName = formatImageName(this.metadata.Image);\n Logger_1.LOG(`Successfully collected ECS Container metadata.`);\n }\n }\n catch (e) {\n Logger_1.LOG('Failed to collect ECS Container Metadata.');\n Logger_1.LOG(e);\n }\n // return true regardless of whether or not metadata collection\n // succeeded. we know that this is supposed to be an ECS environment\n // just from the environment variable\n return true;\n });\n }\n getName() {\n var _a;\n if (Configuration_1.default.serviceName) {\n return Configuration_1.default.serviceName;\n }\n return ((_a = this.metadata) === null || _a === void 0 ? void 0 : _a.FormattedImageName) ? this.metadata.FormattedImageName : 'Unknown';\n }\n getType() {\n return 'AWS::ECS::Container';\n }\n getLogGroupName() {\n // FireLens / fluent-bit does not need the log group to be included\n // since configuration of the LogGroup is handled by the\n // fluent bit config file\n if (this.fluentBitEndpoint) {\n return '';\n }\n return Configuration_1.default.logGroupName || this.getName();\n }\n configureContext(context) {\n var _a, _b, _c, _d, _e;\n this.addProperty(context, 'containerId', os.hostname());\n this.addProperty(context, 'createdAt', (_a = this.metadata) === null || _a === void 0 ? void 0 : _a.CreatedAt);\n this.addProperty(context, 'startedAt', (_b = this.metadata) === null || _b === void 0 ? void 0 : _b.StartedAt);\n this.addProperty(context, 'image', (_c = this.metadata) === null || _c === void 0 ? void 0 : _c.Image);\n this.addProperty(context, 'cluster', (_d = this.metadata) === null || _d === void 0 ? void 0 : _d.Labels['com.amazonaws.ecs.cluster']);\n this.addProperty(context, 'taskArn', (_e = this.metadata) === null || _e === void 0 ? void 0 : _e.Labels['com.amazonaws.ecs.task-arn']);\n // we override the standard default dimensions here because in the\n // FireLens / fluent-bit case, we don't need the LogGroup\n if (this.fluentBitEndpoint) {\n context.setDefaultDimensions({\n ServiceName: Configuration_1.default.serviceName || this.getName(),\n ServiceType: Configuration_1.default.serviceType || this.getType(),\n });\n }\n }\n getSink() {\n if (!this.sink) {\n const logGroupName = this.fluentBitEndpoint ? '' : this.getLogGroupName();\n this.sink = new AgentSink_1.AgentSink(logGroupName);\n }\n return this.sink;\n }\n addProperty(context, key, value) {\n if (value) {\n context.setProperty(key, value);\n }\n }\n}\nexports.ECSEnvironment = ECSEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst AgentSink_1 = require(\"../sinks/AgentSink\");\nconst Fetch_1 = require(\"../utils/Fetch\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst endpoint = 'http://169.254.169.254/latest/dynamic/instance-identity/document';\nclass EC2Environment {\n probe() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n this.metadata = yield Fetch_1.fetch(endpoint);\n if (this.metadata) {\n return true;\n }\n return false;\n }\n catch (e) {\n Logger_1.LOG(e);\n return false;\n }\n });\n }\n getName() {\n if (!Configuration_1.default.serviceName) {\n Logger_1.LOG('Unknown ServiceName.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceName;\n }\n getType() {\n if (this.metadata) {\n return 'AWS::EC2::Instance';\n }\n // this will only happen if probe() is not called first\n return 'Unknown';\n }\n getLogGroupName() {\n return Configuration_1.default.logGroupName ? Configuration_1.default.logGroupName : `${this.getName()}-metrics`;\n }\n configureContext(context) {\n if (this.metadata) {\n context.setProperty('imageId', this.metadata.imageId);\n context.setProperty('instanceId', this.metadata.instanceId);\n context.setProperty('instanceType', this.metadata.instanceType);\n context.setProperty('privateIP', this.metadata.privateIp);\n context.setProperty('availabilityZone', this.metadata.availabilityZone);\n }\n }\n getSink() {\n if (!this.sink) {\n this.sink = new AgentSink_1.AgentSink(this.getLogGroupName(), Configuration_1.default.logStreamName);\n }\n return this.sink;\n }\n}\nexports.EC2Environment = EC2Environment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst ConsoleSink_1 = require(\"../sinks/ConsoleSink\");\nclass LambdaEnvironment {\n probe() {\n return Promise.resolve(process.env.AWS_LAMBDA_FUNCTION_NAME ? true : false);\n }\n getName() {\n return process.env.AWS_LAMBDA_FUNCTION_NAME || 'Unknown';\n }\n getType() {\n return 'AWS::Lambda::Function';\n }\n getLogGroupName() {\n return this.getName();\n }\n configureContext(context) {\n this.addProperty(context, 'executionEnvironment', process.env.AWS_EXECUTION_ENV);\n this.addProperty(context, 'memorySize', process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE);\n this.addProperty(context, 'functionVersion', process.env.AWS_LAMBDA_FUNCTION_VERSION);\n this.addProperty(context, 'logStreamId', process.env.AWS_LAMBDA_LOG_STREAM_NAME);\n const trace = this.getSampledTrace();\n if (trace) {\n this.addProperty(context, 'traceId', trace);\n }\n }\n getSink() {\n if (!this.sink) {\n this.sink = new ConsoleSink_1.ConsoleSink();\n }\n return this.sink;\n }\n addProperty(context, key, value) {\n if (value) {\n context.setProperty(key, value);\n }\n }\n getSampledTrace() {\n // only collect traces which have been sampled\n if (process.env._X_AMZN_TRACE_ID && process.env._X_AMZN_TRACE_ID.includes('Sampled=1')) {\n return process.env._X_AMZN_TRACE_ID;\n }\n }\n}\nexports.LambdaEnvironment = LambdaEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Configuration_1 = require(\"../config/Configuration\");\nconst Logger_1 = require(\"../utils/Logger\");\nconst ConsoleSink_1 = require(\"../sinks/ConsoleSink\");\nclass LocalEnvironment {\n probe() {\n // probe is not intended to be used in the LocalEnvironment\n // To use the local environment you should set the environment\n // override\n return Promise.resolve(false);\n }\n getName() {\n if (!Configuration_1.default.serviceName) {\n Logger_1.LOG('Unknown ServiceName.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceName;\n }\n getType() {\n if (!Configuration_1.default.serviceType) {\n Logger_1.LOG('Unknown ServiceType.');\n return 'Unknown';\n }\n return Configuration_1.default.serviceType;\n }\n getLogGroupName() {\n return Configuration_1.default.logGroupName ? Configuration_1.default.logGroupName : `${this.getName()}-metrics`;\n }\n configureContext() {\n // no-op\n }\n getSink() {\n if (!this.sink) {\n this.sink = new ConsoleSink_1.ConsoleSink();\n }\n return this.sink;\n }\n}\nexports.LocalEnvironment = LocalEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Logger_1 = require(\"../utils/Logger\");\nconst DefaultEnvironment_1 = require(\"./DefaultEnvironment\");\nconst ECSEnvironment_1 = require(\"./ECSEnvironment\");\nconst EC2Environment_1 = require(\"./EC2Environment\");\nconst LambdaEnvironment_1 = require(\"./LambdaEnvironment\");\nconst Configuration_1 = require(\"../config/Configuration\");\nconst Environments_1 = require(\"./Environments\");\nconst LocalEnvironment_1 = require(\"./LocalEnvironment\");\nconst lambdaEnvironment = new LambdaEnvironment_1.LambdaEnvironment();\nconst ecsEnvironment = new ECSEnvironment_1.ECSEnvironment();\nconst ec2Environment = new EC2Environment_1.EC2Environment();\nconst defaultEnvironment = new DefaultEnvironment_1.DefaultEnvironment();\n// ordering of this array matters\n// both Lambda and ECS can be determined from environment variables\n// making the entire detection process fast an cheap\n// EC2 can only be determined by making a remote HTTP request\nconst environments = [lambdaEnvironment, ecsEnvironment, ec2Environment];\nlet environment = undefined;\nconst getEnvironmentFromOverride = () => {\n // short-circuit environment detection and use override\n switch (Configuration_1.default.environmentOverride) {\n case Environments_1.default.Agent:\n return defaultEnvironment;\n case Environments_1.default.EC2:\n return ec2Environment;\n case Environments_1.default.Lambda:\n return lambdaEnvironment;\n case Environments_1.default.ECS:\n return ecsEnvironment;\n case Environments_1.default.Local:\n return new LocalEnvironment_1.LocalEnvironment();\n case Environments_1.default.Unknown:\n default:\n return undefined;\n }\n};\nconst discoverEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n Logger_1.LOG(`Discovering environment`);\n for (const envUnderTest of environments) {\n Logger_1.LOG(`Testing: ${envUnderTest.constructor.name}`);\n try {\n if (yield envUnderTest.probe()) {\n return envUnderTest;\n }\n }\n catch (e) {\n Logger_1.LOG(`Failed probe: ${envUnderTest.constructor.name}`);\n }\n }\n return defaultEnvironment;\n});\nconst _resolveEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n Logger_1.LOG('Resolving environment');\n if (environment) {\n return environment;\n }\n if (Configuration_1.default.environmentOverride) {\n Logger_1.LOG('Environment override supplied', Configuration_1.default.environmentOverride);\n // this will be falsy if an invalid configuration value is provided\n environment = getEnvironmentFromOverride();\n if (environment) {\n return environment;\n }\n else {\n Logger_1.LOG('Invalid environment provided. Falling back to auto-discovery.', Configuration_1.default.environmentOverride);\n }\n }\n environment = yield discoverEnvironment(); // eslint-disable-line require-atomic-updates\n return environment;\n});\n// pro-actively begin resolving the environment\n// this will allow us to kick off any async tasks\n// at module load time to reduce any blocking that\n// may occur on the initial flush()\nconst environmentPromise = _resolveEnvironment();\nconst resolveEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n return environmentPromise;\n});\nexports.resolveEnvironment = resolveEnvironment;\n// this method is used for testing to bypass the cached environmentPromise result\nconst cleanResolveEnvironment = () => __awaiter(void 0, void 0, void 0, function* () {\n yield environmentPromise;\n environment = undefined;\n return yield _resolveEnvironment();\n});\nexports.cleanResolveEnvironment = cleanResolveEnvironment;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst __1 = require(\"..\");\nconst EnvironmentDetector_1 = require(\"../environment/EnvironmentDetector\");\nconst MetricsContext_1 = require(\"./MetricsContext\");\nconst createMetricsLogger = () => {\n const context = MetricsContext_1.MetricsContext.empty();\n const logger = new __1.MetricsLogger(EnvironmentDetector_1.resolveEnvironment, context);\n return logger;\n};\nexports.createMetricsLogger = createMetricsLogger;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Logger_1 = require(\"../utils/Logger\");\nconst MetricsLoggerFactory_1 = require(\"./MetricsLoggerFactory\");\n/**\n * An asynchronous wrapper that provides a metrics instance.\n */\nconst metricScope = (handler) => {\n const wrappedHandler = (...args) => __awaiter(void 0, void 0, void 0, function* () {\n const metrics = MetricsLoggerFactory_1.createMetricsLogger();\n try {\n return yield handler(metrics)(...args);\n }\n finally {\n try {\n yield metrics.flush();\n }\n catch (e) {\n Logger_1.LOG('Failed to flush metrics', e);\n }\n }\n });\n return wrappedHandler;\n};\nexports.metricScope = metricScope;\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Unit;\n(function (Unit) {\n Unit[\"Seconds\"] = \"Seconds\";\n Unit[\"Microseconds\"] = \"Microseconds\";\n Unit[\"Milliseconds\"] = \"Milliseconds\";\n Unit[\"Bytes\"] = \"Bytes\";\n Unit[\"Kilobytes\"] = \"Kilobytes\";\n Unit[\"Megabytes\"] = \"Megabytes\";\n Unit[\"Gigabytes\"] = \"Gigabytes\";\n Unit[\"Terabytes\"] = \"Terabytes\";\n Unit[\"Bits\"] = \"Bits\";\n Unit[\"Kilobits\"] = \"Kilobits\";\n Unit[\"Megabits\"] = \"Megabits\";\n Unit[\"Gigabits\"] = \"Gigabits\";\n Unit[\"Terabits\"] = \"Terabits\";\n Unit[\"Percent\"] = \"Percent\";\n Unit[\"Count\"] = \"Count\";\n Unit[\"BytesPerSecond\"] = \"Bytes/Second\";\n Unit[\"KilobytesPerSecond\"] = \"Kilobytes/Second\";\n Unit[\"MegabytesPerSecond\"] = \"Megabytes/Second\";\n Unit[\"GigabytesPerSecond\"] = \"Gigabytes/Second\";\n Unit[\"TerabytesPerSecond\"] = \"Terabytes/Second\";\n Unit[\"BitsPerSecond\"] = \"Bits/Second\";\n Unit[\"KilobitsPerSecond\"] = \"Kilobits/Second\";\n Unit[\"MegabitsPerSecond\"] = \"Megabits/Second\";\n Unit[\"GigabitsPerSecond\"] = \"Gigabits/Second\";\n Unit[\"TerabitsPerSecond\"] = \"Terabits/Second\";\n Unit[\"CountPerSecond\"] = \"Count/Second\";\n Unit[\"None\"] = \"None\";\n})(Unit = exports.Unit || (exports.Unit = {}));\n", "\"use strict\";\n/*\n * Copyright 2019 Amazon.com, Inc. or its affiliates.\n * Licensed under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MetricsLogger_1 = require(\"./logger/MetricsLogger\");\nexports.MetricsLogger = MetricsLogger_1.MetricsLogger;\nvar ConsoleSink_1 = require(\"./sinks/ConsoleSink\");\nexports.LocalSink = ConsoleSink_1.ConsoleSink;\nvar AgentSink_1 = require(\"./sinks/AgentSink\");\nexports.AgentSink = AgentSink_1.AgentSink;\nvar MetricScope_1 = require(\"./logger/MetricScope\");\nexports.metricScope = MetricScope_1.metricScope;\nvar MetricsLoggerFactory_1 = require(\"./logger/MetricsLoggerFactory\");\nexports.createMetricsLogger = MetricsLoggerFactory_1.createMetricsLogger;\nvar Unit_1 = require(\"./logger/Unit\");\nexports.Unit = Unit_1.Unit;\nconst Configuration_1 = require(\"./config/Configuration\");\nexports.Configuration = Configuration_1.default;\n", "\"use strict\";\n/// <reference lib=\"es2018\"/>\n/// <reference lib=\"dom\"/>\n/// <reference types=\"node\"/>\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst typedArrayTypeNames = [\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array'\n];\nfunction isTypedArrayName(name) {\n return typedArrayTypeNames.includes(name);\n}\nconst objectTypeNames = [\n 'Function',\n 'Generator',\n 'AsyncGenerator',\n 'GeneratorFunction',\n 'AsyncGeneratorFunction',\n 'AsyncFunction',\n 'Observable',\n 'Array',\n 'Buffer',\n 'Object',\n 'RegExp',\n 'Date',\n 'Error',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'ArrayBuffer',\n 'SharedArrayBuffer',\n 'DataView',\n 'Promise',\n 'URL',\n 'FormData',\n 'URLSearchParams',\n 'HTMLElement',\n ...typedArrayTypeNames\n];\nfunction isObjectTypeName(name) {\n return objectTypeNames.includes(name);\n}\nconst primitiveTypeNames = [\n 'null',\n 'undefined',\n 'string',\n 'number',\n 'bigint',\n 'boolean',\n 'symbol'\n];\nfunction isPrimitiveTypeName(name) {\n return primitiveTypeNames.includes(name);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isOfType(type) {\n return (value) => typeof value === type;\n}\nconst { toString } = Object.prototype;\nconst getObjectType = (value) => {\n const objectTypeName = toString.call(value).slice(8, -1);\n if (/HTML\\w+Element/.test(objectTypeName) && is.domElement(value)) {\n return 'HTMLElement';\n }\n if (isObjectTypeName(objectTypeName)) {\n return objectTypeName;\n }\n return undefined;\n};\nconst isObjectOfType = (type) => (value) => getObjectType(value) === type;\nfunction is(value) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'undefined':\n return 'undefined';\n case 'string':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'function':\n return 'Function';\n case 'bigint':\n return 'bigint';\n case 'symbol':\n return 'symbol';\n default:\n }\n if (is.observable(value)) {\n return 'Observable';\n }\n if (is.array(value)) {\n return 'Array';\n }\n if (is.buffer(value)) {\n return 'Buffer';\n }\n const tagType = getObjectType(value);\n if (tagType) {\n return tagType;\n }\n if (value instanceof String || value instanceof Boolean || value instanceof Number) {\n throw new TypeError('Please don\\'t use object wrappers for primitive types');\n }\n return 'Object';\n}\nis.undefined = isOfType('undefined');\nis.string = isOfType('string');\nconst isNumberType = isOfType('number');\nis.number = (value) => isNumberType(value) && !is.nan(value);\nis.bigint = isOfType('bigint');\n// eslint-disable-next-line @typescript-eslint/ban-types\nis.function_ = isOfType('function');\nis.null_ = (value) => value === null;\nis.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');\nis.boolean = (value) => value === true || value === false;\nis.symbol = isOfType('symbol');\nis.numericString = (value) => is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value));\nis.array = (value, assertion) => {\n if (!Array.isArray(value)) {\n return false;\n }\n if (!is.function_(assertion)) {\n return true;\n }\n return value.every(assertion);\n};\nis.buffer = (value) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = value) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.isBuffer) === null || _c === void 0 ? void 0 : _c.call(_b, value)) !== null && _d !== void 0 ? _d : false; };\nis.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);\nis.object = (value) => !is.null_(value) && (typeof value === 'object' || is.function_(value));\nis.iterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.iterator]); };\nis.asyncIterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.asyncIterator]); };\nis.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.asyncGenerator = (value) => is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw);\nis.nativePromise = (value) => isObjectOfType('Promise')(value);\nconst hasPromiseAPI = (value) => {\n var _a, _b;\n return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a.then) &&\n is.function_((_b = value) === null || _b === void 0 ? void 0 : _b.catch);\n};\nis.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);\nis.generatorFunction = isObjectOfType('GeneratorFunction');\nis.asyncGeneratorFunction = (value) => getObjectType(value) === 'AsyncGeneratorFunction';\nis.asyncFunction = (value) => getObjectType(value) === 'AsyncFunction';\n// eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types\nis.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype');\nis.regExp = isObjectOfType('RegExp');\nis.date = isObjectOfType('Date');\nis.error = isObjectOfType('Error');\nis.map = (value) => isObjectOfType('Map')(value);\nis.set = (value) => isObjectOfType('Set')(value);\nis.weakMap = (value) => isObjectOfType('WeakMap')(value);\nis.weakSet = (value) => isObjectOfType('WeakSet')(value);\nis.int8Array = isObjectOfType('Int8Array');\nis.uint8Array = isObjectOfType('Uint8Array');\nis.uint8ClampedArray = isObjectOfType('Uint8ClampedArray');\nis.int16Array = isObjectOfType('Int16Array');\nis.uint16Array = isObjectOfType('Uint16Array');\nis.int32Array = isObjectOfType('Int32Array');\nis.uint32Array = isObjectOfType('Uint32Array');\nis.float32Array = isObjectOfType('Float32Array');\nis.float64Array = isObjectOfType('Float64Array');\nis.bigInt64Array = isObjectOfType('BigInt64Array');\nis.bigUint64Array = isObjectOfType('BigUint64Array');\nis.arrayBuffer = isObjectOfType('ArrayBuffer');\nis.sharedArrayBuffer = isObjectOfType('SharedArrayBuffer');\nis.dataView = isObjectOfType('DataView');\nis.directInstanceOf = (instance, class_) => Object.getPrototypeOf(instance) === class_.prototype;\nis.urlInstance = (value) => isObjectOfType('URL')(value);\nis.urlString = (value) => {\n if (!is.string(value)) {\n return false;\n }\n try {\n new URL(value); // eslint-disable-line no-new\n return true;\n }\n catch (_a) {\n return false;\n }\n};\n// TODO: Use the `not` operator with a type guard here when it's available.\n// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`\nis.truthy = (value) => Boolean(value);\n// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`\nis.falsy = (value) => !value;\nis.nan = (value) => Number.isNaN(value);\nis.primitive = (value) => is.null_(value) || isPrimitiveTypeName(typeof value);\nis.integer = (value) => Number.isInteger(value);\nis.safeInteger = (value) => Number.isSafeInteger(value);\nis.plainObject = (value) => {\n // From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js\n if (toString.call(value) !== '[object Object]') {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.getPrototypeOf({});\n};\nis.typedArray = (value) => isTypedArrayName(getObjectType(value));\nconst isValidLength = (value) => is.safeInteger(value) && value >= 0;\nis.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);\nis.inRange = (value, range) => {\n if (is.number(range)) {\n return value >= Math.min(0, range) && value <= Math.max(range, 0);\n }\n if (is.array(range) && range.length === 2) {\n return value >= Math.min(...range) && value <= Math.max(...range);\n }\n throw new TypeError(`Invalid range: ${JSON.stringify(range)}`);\n};\nconst NODE_TYPE_ELEMENT = 1;\nconst DOM_PROPERTIES_TO_CHECK = [\n 'innerHTML',\n 'ownerDocument',\n 'style',\n 'attributes',\n 'nodeValue'\n];\nis.domElement = (value) => {\n return is.object(value) &&\n value.nodeType === NODE_TYPE_ELEMENT &&\n is.string(value.nodeName) &&\n !is.plainObject(value) &&\n DOM_PROPERTIES_TO_CHECK.every(property => property in value);\n};\nis.observable = (value) => {\n var _a, _b, _c, _d;\n if (!value) {\n return false;\n }\n // eslint-disable-next-line no-use-extend-native/no-use-extend-native\n if (value === ((_b = (_a = value)[Symbol.observable]) === null || _b === void 0 ? void 0 : _b.call(_a))) {\n return true;\n }\n if (value === ((_d = (_c = value)['@@observable']) === null || _d === void 0 ? void 0 : _d.call(_c))) {\n return true;\n }\n return false;\n};\nis.nodeStream = (value) => is.object(value) && is.function_(value.pipe) && !is.observable(value);\nis.infinite = (value) => value === Infinity || value === -Infinity;\nconst isAbsoluteMod2 = (remainder) => (value) => is.integer(value) && Math.abs(value % 2) === remainder;\nis.evenInteger = isAbsoluteMod2(0);\nis.oddInteger = isAbsoluteMod2(1);\nis.emptyArray = (value) => is.array(value) && value.length === 0;\nis.nonEmptyArray = (value) => is.array(value) && value.length > 0;\nis.emptyString = (value) => is.string(value) && value.length === 0;\n// TODO: Use `not ''` when the `not` operator is available.\nis.nonEmptyString = (value) => is.string(value) && value.length > 0;\nconst isWhiteSpaceString = (value) => is.string(value) && !/\\S/.test(value);\nis.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value);\nis.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0;\n// TODO: Use `not` operator here to remove `Map` and `Set` from type guard:\n// - https://github.com/Microsoft/TypeScript/pull/29317\nis.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0;\nis.emptySet = (value) => is.set(value) && value.size === 0;\nis.nonEmptySet = (value) => is.set(value) && value.size > 0;\nis.emptyMap = (value) => is.map(value) && value.size === 0;\nis.nonEmptyMap = (value) => is.map(value) && value.size > 0;\n// `PropertyKey` is any value that can be used as an object key (string, number, or symbol)\nis.propertyKey = (value) => is.any([is.string, is.number, is.symbol], value);\nis.formData = (value) => isObjectOfType('FormData')(value);\nis.urlSearchParams = (value) => isObjectOfType('URLSearchParams')(value);\nconst predicateOnArray = (method, predicate, values) => {\n if (!is.function_(predicate)) {\n throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`);\n }\n if (values.length === 0) {\n throw new TypeError('Invalid number of values');\n }\n return method.call(values, predicate);\n};\nis.any = (predicate, ...values) => {\n const predicates = is.array(predicate) ? predicate : [predicate];\n return predicates.some(singlePredicate => predicateOnArray(Array.prototype.some, singlePredicate, values));\n};\nis.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values);\nconst assertType = (condition, description, value, options = {}) => {\n if (!condition) {\n const { multipleValues } = options;\n const valuesMessage = multipleValues ?\n `received values of types ${[\n ...new Set(value.map(singleValue => `\\`${is(singleValue)}\\``))\n ].join(', ')}` :\n `received value of type \\`${is(value)}\\``;\n throw new TypeError(`Expected value which is \\`${description}\\`, ${valuesMessage}.`);\n }\n};\nexports.assert = {\n // Unknowns.\n undefined: (value) => assertType(is.undefined(value), 'undefined', value),\n string: (value) => assertType(is.string(value), 'string', value),\n number: (value) => assertType(is.number(value), 'number', value),\n bigint: (value) => assertType(is.bigint(value), 'bigint', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n function_: (value) => assertType(is.function_(value), 'Function', value),\n null_: (value) => assertType(is.null_(value), 'null', value),\n class_: (value) => assertType(is.class_(value), \"Class\" /* class_ */, value),\n boolean: (value) => assertType(is.boolean(value), 'boolean', value),\n symbol: (value) => assertType(is.symbol(value), 'symbol', value),\n numericString: (value) => assertType(is.numericString(value), \"string with a number\" /* numericString */, value),\n array: (value, assertion) => {\n const assert = assertType;\n assert(is.array(value), 'Array', value);\n if (assertion) {\n value.forEach(assertion);\n }\n },\n buffer: (value) => assertType(is.buffer(value), 'Buffer', value),\n nullOrUndefined: (value) => assertType(is.nullOrUndefined(value), \"null or undefined\" /* nullOrUndefined */, value),\n object: (value) => assertType(is.object(value), 'Object', value),\n iterable: (value) => assertType(is.iterable(value), \"Iterable\" /* iterable */, value),\n asyncIterable: (value) => assertType(is.asyncIterable(value), \"AsyncIterable\" /* asyncIterable */, value),\n generator: (value) => assertType(is.generator(value), 'Generator', value),\n asyncGenerator: (value) => assertType(is.asyncGenerator(value), 'AsyncGenerator', value),\n nativePromise: (value) => assertType(is.nativePromise(value), \"native Promise\" /* nativePromise */, value),\n promise: (value) => assertType(is.promise(value), 'Promise', value),\n generatorFunction: (value) => assertType(is.generatorFunction(value), 'GeneratorFunction', value),\n asyncGeneratorFunction: (value) => assertType(is.asyncGeneratorFunction(value), 'AsyncGeneratorFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n asyncFunction: (value) => assertType(is.asyncFunction(value), 'AsyncFunction', value),\n // eslint-disable-next-line @typescript-eslint/ban-types\n boundFunction: (value) => assertType(is.boundFunction(value), 'Function', value),\n regExp: (value) => assertType(is.regExp(value), 'RegExp', value),\n date: (value) => assertType(is.date(value), 'Date', value),\n error: (value) => assertType(is.error(value), 'Error', value),\n map: (value) => assertType(is.map(value), 'Map', value),\n set: (value) => assertType(is.set(value), 'Set', value),\n weakMap: (value) => assertType(is.weakMap(value), 'WeakMap', value),\n weakSet: (value) => assertType(is.weakSet(value), 'WeakSet', value),\n int8Array: (value) => assertType(is.int8Array(value), 'Int8Array', value),\n uint8Array: (value) => assertType(is.uint8Array(value), 'Uint8Array', value),\n uint8ClampedArray: (value) => assertType(is.uint8ClampedArray(value), 'Uint8ClampedArray', value),\n int16Array: (value) => assertType(is.int16Array(value), 'Int16Array', value),\n uint16Array: (value) => assertType(is.uint16Array(value), 'Uint16Array', value),\n int32Array: (value) => assertType(is.int32Array(value), 'Int32Array', value),\n uint32Array: (value) => assertType(is.uint32Array(value), 'Uint32Array', value),\n float32Array: (value) => assertType(is.float32Array(value), 'Float32Array', value),\n float64Array: (value) => assertType(is.float64Array(value), 'Float64Array', value),\n bigInt64Array: (value) => assertType(is.bigInt64Array(value), 'BigInt64Array', value),\n bigUint64Array: (value) => assertType(is.bigUint64Array(value), 'BigUint64Array', value),\n arrayBuffer: (value) => assertType(is.arrayBuffer(value), 'ArrayBuffer', value),\n sharedArrayBuffer: (value) => assertType(is.sharedArrayBuffer(value), 'SharedArrayBuffer', value),\n dataView: (value) => assertType(is.dataView(value), 'DataView', value),\n urlInstance: (value) => assertType(is.urlInstance(value), 'URL', value),\n urlString: (value) => assertType(is.urlString(value), \"string with a URL\" /* urlString */, value),\n truthy: (value) => assertType(is.truthy(value), \"truthy\" /* truthy */, value),\n falsy: (value) => assertType(is.falsy(value), \"falsy\" /* falsy */, value),\n nan: (value) => assertType(is.nan(value), \"NaN\" /* nan */, value),\n primitive: (value) => assertType(is.primitive(value), \"primitive\" /* primitive */, value),\n integer: (value) => assertType(is.integer(value), \"integer\" /* integer */, value),\n safeInteger: (value) => assertType(is.safeInteger(value), \"integer\" /* safeInteger */, value),\n plainObject: (value) => assertType(is.plainObject(value), \"plain object\" /* plainObject */, value),\n typedArray: (value) => assertType(is.typedArray(value), \"TypedArray\" /* typedArray */, value),\n arrayLike: (value) => assertType(is.arrayLike(value), \"array-like\" /* arrayLike */, value),\n domElement: (value) => assertType(is.domElement(value), \"HTMLElement\" /* domElement */, value),\n observable: (value) => assertType(is.observable(value), 'Observable', value),\n nodeStream: (value) => assertType(is.nodeStream(value), \"Node.js Stream\" /* nodeStream */, value),\n infinite: (value) => assertType(is.infinite(value), \"infinite number\" /* infinite */, value),\n emptyArray: (value) => assertType(is.emptyArray(value), \"empty array\" /* emptyArray */, value),\n nonEmptyArray: (value) => assertType(is.nonEmptyArray(value), \"non-empty array\" /* nonEmptyArray */, value),\n emptyString: (value) => assertType(is.emptyString(value), \"empty string\" /* emptyString */, value),\n nonEmptyString: (value) => assertType(is.nonEmptyString(value), \"non-empty string\" /* nonEmptyString */, value),\n emptyStringOrWhitespace: (value) => assertType(is.emptyStringOrWhitespace(value), \"empty string or whitespace\" /* emptyStringOrWhitespace */, value),\n emptyObject: (value) => assertType(is.emptyObject(value), \"empty object\" /* emptyObject */, value),\n nonEmptyObject: (value) => assertType(is.nonEmptyObject(value), \"non-empty object\" /* nonEmptyObject */, value),\n emptySet: (value) => assertType(is.emptySet(value), \"empty set\" /* emptySet */, value),\n nonEmptySet: (value) => assertType(is.nonEmptySet(value), \"non-empty set\" /* nonEmptySet */, value),\n emptyMap: (value) => assertType(is.emptyMap(value), \"empty map\" /* emptyMap */, value),\n nonEmptyMap: (value) => assertType(is.nonEmptyMap(value), \"non-empty map\" /* nonEmptyMap */, value),\n propertyKey: (value) => assertType(is.propertyKey(value), 'PropertyKey', value),\n formData: (value) => assertType(is.formData(value), 'FormData', value),\n urlSearchParams: (value) => assertType(is.urlSearchParams(value), 'URLSearchParams', value),\n // Numbers.\n evenInteger: (value) => assertType(is.evenInteger(value), \"even integer\" /* evenInteger */, value),\n oddInteger: (value) => assertType(is.oddInteger(value), \"odd integer\" /* oddInteger */, value),\n // Two arguments.\n directInstanceOf: (instance, class_) => assertType(is.directInstanceOf(instance, class_), \"T\" /* directInstanceOf */, instance),\n inRange: (value, range) => assertType(is.inRange(value, range), \"in range\" /* inRange */, value),\n // Variadic functions.\n any: (predicate, ...values) => {\n return assertType(is.any(predicate, ...values), \"predicate returns truthy for any value\" /* any */, values, { multipleValues: true });\n },\n all: (predicate, ...values) => assertType(is.all(predicate, ...values), \"predicate returns truthy for all values\" /* all */, values, { multipleValues: true })\n};\n// Some few keywords are reserved, but we'll populate them for Node.js users\n// See https://github.com/Microsoft/TypeScript/issues/2536\nObject.defineProperties(is, {\n class: {\n value: is.class_\n },\n function: {\n value: is.function_\n },\n null: {\n value: is.null_\n }\n});\nObject.defineProperties(exports.assert, {\n class: {\n value: exports.assert.class_\n },\n function: {\n value: exports.assert.function_\n },\n null: {\n value: exports.assert.null_\n }\n});\nexports.default = is;\n// For CommonJS default export support\nmodule.exports = is;\nmodule.exports.default = is;\nmodule.exports.assert = exports.assert;\n", "'use strict';\n\nclass CancelError extends Error {\n\tconstructor(reason) {\n\t\tsuper(reason || 'Promise was canceled');\n\t\tthis.name = 'CancelError';\n\t}\n\n\tget isCanceled() {\n\t\treturn true;\n\t}\n}\n\nclass PCancelable {\n\tstatic fn(userFn) {\n\t\treturn (...arguments_) => {\n\t\t\treturn new PCancelable((resolve, reject, onCancel) => {\n\t\t\t\targuments_.push(onCancel);\n\t\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t\tuserFn(...arguments_).then(resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n\n\tconstructor(executor) {\n\t\tthis._cancelHandlers = [];\n\t\tthis._isPending = true;\n\t\tthis._isCanceled = false;\n\t\tthis._rejectOnCancel = true;\n\n\t\tthis._promise = new Promise((resolve, reject) => {\n\t\t\tthis._reject = reject;\n\n\t\t\tconst onResolve = value => {\n\t\t\t\tif (!this._isCanceled || !onCancel.shouldReject) {\n\t\t\t\t\tthis._isPending = false;\n\t\t\t\t\tresolve(value);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst onReject = error => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst onCancel = handler => {\n\t\t\t\tif (!this._isPending) {\n\t\t\t\t\tthrow new Error('The `onCancel` handler was attached after the promise settled.');\n\t\t\t\t}\n\n\t\t\t\tthis._cancelHandlers.push(handler);\n\t\t\t};\n\n\t\t\tObject.defineProperties(onCancel, {\n\t\t\t\tshouldReject: {\n\t\t\t\t\tget: () => this._rejectOnCancel,\n\t\t\t\t\tset: boolean => {\n\t\t\t\t\t\tthis._rejectOnCancel = boolean;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn executor(onResolve, onReject, onCancel);\n\t\t});\n\t}\n\n\tthen(onFulfilled, onRejected) {\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\treturn this._promise.then(onFulfilled, onRejected);\n\t}\n\n\tcatch(onRejected) {\n\t\treturn this._promise.catch(onRejected);\n\t}\n\n\tfinally(onFinally) {\n\t\treturn this._promise.finally(onFinally);\n\t}\n\n\tcancel(reason) {\n\t\tif (!this._isPending || this._isCanceled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isCanceled = true;\n\n\t\tif (this._cancelHandlers.length > 0) {\n\t\t\ttry {\n\t\t\t\tfor (const handler of this._cancelHandlers) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._reject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this._rejectOnCancel) {\n\t\t\tthis._reject(new CancelError(reason));\n\t\t}\n\t}\n\n\tget isCanceled() {\n\t\treturn this._isCanceled;\n\t}\n}\n\nObject.setPrototypeOf(PCancelable.prototype, Promise.prototype);\n\nmodule.exports = PCancelable;\nmodule.exports.CancelError = CancelError;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isTLSSocket(socket) {\n return socket.encrypted;\n}\nconst deferToConnect = (socket, fn) => {\n let listeners;\n if (typeof fn === 'function') {\n const connect = fn;\n listeners = { connect };\n }\n else {\n listeners = fn;\n }\n const hasConnectListener = typeof listeners.connect === 'function';\n const hasSecureConnectListener = typeof listeners.secureConnect === 'function';\n const hasCloseListener = typeof listeners.close === 'function';\n const onConnect = () => {\n if (hasConnectListener) {\n listeners.connect();\n }\n if (isTLSSocket(socket) && hasSecureConnectListener) {\n if (socket.authorized) {\n listeners.secureConnect();\n }\n else if (!socket.authorizationError) {\n socket.once('secureConnect', listeners.secureConnect);\n }\n }\n if (hasCloseListener) {\n socket.once('close', listeners.close);\n }\n };\n if (socket.writable && !socket.connecting) {\n onConnect();\n }\n else if (socket.connecting) {\n socket.once('connect', onConnect);\n }\n else if (socket.destroyed && hasCloseListener) {\n listeners.close(socket._hadError);\n }\n};\nexports.default = deferToConnect;\n// For CommonJS default export support\nmodule.exports = deferToConnect;\nmodule.exports.default = deferToConnect;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst defer_to_connect_1 = require(\"defer-to-connect\");\nconst util_1 = require(\"util\");\nconst nodejsMajorVersion = Number(process.versions.node.split('.')[0]);\nconst timer = (request) => {\n if (request.timings) {\n return request.timings;\n }\n const timings = {\n start: Date.now(),\n socket: undefined,\n lookup: undefined,\n connect: undefined,\n secureConnect: undefined,\n upload: undefined,\n response: undefined,\n end: undefined,\n error: undefined,\n abort: undefined,\n phases: {\n wait: undefined,\n dns: undefined,\n tcp: undefined,\n tls: undefined,\n request: undefined,\n firstByte: undefined,\n download: undefined,\n total: undefined\n }\n };\n request.timings = timings;\n const handleError = (origin) => {\n const emit = origin.emit.bind(origin);\n origin.emit = (event, ...args) => {\n // Catches the `error` event\n if (event === 'error') {\n timings.error = Date.now();\n timings.phases.total = timings.error - timings.start;\n origin.emit = emit;\n }\n // Saves the original behavior\n return emit(event, ...args);\n };\n };\n handleError(request);\n const onAbort = () => {\n timings.abort = Date.now();\n // Let the `end` response event be responsible for setting the total phase,\n // unless the Node.js major version is >= 13.\n if (!timings.response || nodejsMajorVersion >= 13) {\n timings.phases.total = Date.now() - timings.start;\n }\n };\n request.prependOnceListener('abort', onAbort);\n const onSocket = (socket) => {\n timings.socket = Date.now();\n timings.phases.wait = timings.socket - timings.start;\n if (util_1.types.isProxy(socket)) {\n return;\n }\n const lookupListener = () => {\n timings.lookup = Date.now();\n timings.phases.dns = timings.lookup - timings.socket;\n };\n socket.prependOnceListener('lookup', lookupListener);\n defer_to_connect_1.default(socket, {\n connect: () => {\n timings.connect = Date.now();\n if (timings.lookup === undefined) {\n socket.removeListener('lookup', lookupListener);\n timings.lookup = timings.connect;\n timings.phases.dns = timings.lookup - timings.socket;\n }\n timings.phases.tcp = timings.connect - timings.lookup;\n // This callback is called before flushing any data,\n // so we don't need to set `timings.phases.request` here.\n },\n secureConnect: () => {\n timings.secureConnect = Date.now();\n timings.phases.tls = timings.secureConnect - timings.connect;\n }\n });\n };\n if (request.socket) {\n onSocket(request.socket);\n }\n else {\n request.prependOnceListener('socket', onSocket);\n }\n const onUpload = () => {\n var _a;\n timings.upload = Date.now();\n timings.phases.request = timings.upload - ((_a = timings.secureConnect) !== null && _a !== void 0 ? _a : timings.connect);\n };\n const writableFinished = () => {\n if (typeof request.writableFinished === 'boolean') {\n return request.writableFinished;\n }\n // Node.js doesn't have `request.writableFinished` property\n return request.finished && request.outputSize === 0 && (!request.socket || request.socket.writableLength === 0);\n };\n if (writableFinished()) {\n onUpload();\n }\n else {\n request.prependOnceListener('finish', onUpload);\n }\n request.prependOnceListener('response', (response) => {\n timings.response = Date.now();\n timings.phases.firstByte = timings.response - timings.upload;\n response.timings = timings;\n handleError(response);\n response.prependOnceListener('end', () => {\n timings.end = Date.now();\n timings.phases.download = timings.end - timings.response;\n timings.phases.total = timings.end - timings.start;\n });\n response.prependOnceListener('aborted', onAbort);\n });\n return timings;\n};\nexports.default = timer;\n// For CommonJS default export support\nmodule.exports = timer;\nmodule.exports.default = timer;\n", "'use strict';\nconst {\n\tV4MAPPED,\n\tADDRCONFIG,\n\tALL,\n\tpromises: {\n\t\tResolver: AsyncResolver\n\t},\n\tlookup: dnsLookup\n} = require('dns');\nconst {promisify} = require('util');\nconst os = require('os');\n\nconst kCacheableLookupCreateConnection = Symbol('cacheableLookupCreateConnection');\nconst kCacheableLookupInstance = Symbol('cacheableLookupInstance');\nconst kExpires = Symbol('expires');\n\nconst supportsALL = typeof ALL === 'number';\n\nconst verifyAgent = agent => {\n\tif (!(agent && typeof agent.createConnection === 'function')) {\n\t\tthrow new Error('Expected an Agent instance as the first argument');\n\t}\n};\n\nconst map4to6 = entries => {\n\tfor (const entry of entries) {\n\t\tif (entry.family === 6) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.address = `::ffff:${entry.address}`;\n\t\tentry.family = 6;\n\t}\n};\n\nconst getIfaceInfo = () => {\n\tlet has4 = false;\n\tlet has6 = false;\n\n\tfor (const device of Object.values(os.networkInterfaces())) {\n\t\tfor (const iface of device) {\n\t\t\tif (iface.internal) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (iface.family === 'IPv6') {\n\t\t\t\thas6 = true;\n\t\t\t} else {\n\t\t\t\thas4 = true;\n\t\t\t}\n\n\t\t\tif (has4 && has6) {\n\t\t\t\treturn {has4, has6};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {has4, has6};\n};\n\nconst isIterable = map => {\n\treturn Symbol.iterator in map;\n};\n\nconst ttl = {ttl: true};\nconst all = {all: true};\n\nclass CacheableLookup {\n\tconstructor({\n\t\tcache = new Map(),\n\t\tmaxTtl = Infinity,\n\t\tfallbackDuration = 3600,\n\t\terrorTtl = 0.15,\n\t\tresolver = new AsyncResolver(),\n\t\tlookup = dnsLookup\n\t} = {}) {\n\t\tthis.maxTtl = maxTtl;\n\t\tthis.errorTtl = errorTtl;\n\n\t\tthis._cache = cache;\n\t\tthis._resolver = resolver;\n\t\tthis._dnsLookup = promisify(lookup);\n\n\t\tif (this._resolver instanceof AsyncResolver) {\n\t\t\tthis._resolve4 = this._resolver.resolve4.bind(this._resolver);\n\t\t\tthis._resolve6 = this._resolver.resolve6.bind(this._resolver);\n\t\t} else {\n\t\t\tthis._resolve4 = promisify(this._resolver.resolve4.bind(this._resolver));\n\t\t\tthis._resolve6 = promisify(this._resolver.resolve6.bind(this._resolver));\n\t\t}\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tthis._pending = {};\n\t\tthis._nextRemovalTime = false;\n\t\tthis._hostnamesToFallback = new Set();\n\n\t\tif (fallbackDuration < 1) {\n\t\t\tthis._fallback = false;\n\t\t} else {\n\t\t\tthis._fallback = true;\n\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tthis._hostnamesToFallback.clear();\n\t\t\t}, fallbackDuration * 1000);\n\n\t\t\t/* istanbul ignore next: There is no `interval.unref()` when running inside an Electron renderer */\n\t\t\tif (interval.unref) {\n\t\t\t\tinterval.unref();\n\t\t\t}\n\t\t}\n\n\t\tthis.lookup = this.lookup.bind(this);\n\t\tthis.lookupAsync = this.lookupAsync.bind(this);\n\t}\n\n\tset servers(servers) {\n\t\tthis.clear();\n\n\t\tthis._resolver.setServers(servers);\n\t}\n\n\tget servers() {\n\t\treturn this._resolver.getServers();\n\t}\n\n\tlookup(hostname, options, callback) {\n\t\tif (typeof options === 'function') {\n\t\t\tcallback = options;\n\t\t\toptions = {};\n\t\t} else if (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tif (!callback) {\n\t\t\tthrow new Error('Callback must be a function.');\n\t\t}\n\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\tthis.lookupAsync(hostname, options).then(result => {\n\t\t\tif (options.all) {\n\t\t\t\tcallback(null, result);\n\t\t\t} else {\n\t\t\t\tcallback(null, result.address, result.family, result.expires, result.ttl);\n\t\t\t}\n\t\t}, callback);\n\t}\n\n\tasync lookupAsync(hostname, options = {}) {\n\t\tif (typeof options === 'number') {\n\t\t\toptions = {\n\t\t\t\tfamily: options\n\t\t\t};\n\t\t}\n\n\t\tlet cached = await this.query(hostname);\n\n\t\tif (options.family === 6) {\n\t\t\tconst filtered = cached.filter(entry => entry.family === 6);\n\n\t\t\tif (options.hints & V4MAPPED) {\n\t\t\t\tif ((supportsALL && options.hints & ALL) || filtered.length === 0) {\n\t\t\t\t\tmap4to6(cached);\n\t\t\t\t} else {\n\t\t\t\t\tcached = filtered;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcached = filtered;\n\t\t\t}\n\t\t} else if (options.family === 4) {\n\t\t\tcached = cached.filter(entry => entry.family === 4);\n\t\t}\n\n\t\tif (options.hints & ADDRCONFIG) {\n\t\t\tconst {_iface} = this;\n\t\t\tcached = cached.filter(entry => entry.family === 6 ? _iface.has6 : _iface.has4);\n\t\t}\n\n\t\tif (cached.length === 0) {\n\t\t\tconst error = new Error(`cacheableLookup ENOTFOUND ${hostname}`);\n\t\t\terror.code = 'ENOTFOUND';\n\t\t\terror.hostname = hostname;\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (options.all) {\n\t\t\treturn cached;\n\t\t}\n\n\t\treturn cached[0];\n\t}\n\n\tasync query(hostname) {\n\t\tlet cached = await this._cache.get(hostname);\n\n\t\tif (!cached) {\n\t\t\tconst pending = this._pending[hostname];\n\n\t\t\tif (pending) {\n\t\t\t\tcached = await pending;\n\t\t\t} else {\n\t\t\t\tconst newPromise = this.queryAndCache(hostname);\n\t\t\t\tthis._pending[hostname] = newPromise;\n\n\t\t\t\ttry {\n\t\t\t\t\tcached = await newPromise;\n\t\t\t\t} finally {\n\t\t\t\t\tdelete this._pending[hostname];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcached = cached.map(entry => {\n\t\t\treturn {...entry};\n\t\t});\n\n\t\treturn cached;\n\t}\n\n\tasync _resolve(hostname) {\n\t\tconst wrap = async promise => {\n\t\t\ttry {\n\t\t\t\treturn await promise;\n\t\t\t} catch (error) {\n\t\t\t\tif (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\n\t\t// ANY is unsafe as it doesn't trigger new queries in the underlying server.\n\t\tconst [A, AAAA] = await Promise.all([\n\t\t\tthis._resolve4(hostname, ttl),\n\t\t\tthis._resolve6(hostname, ttl)\n\t\t].map(promise => wrap(promise)));\n\n\t\tlet aTtl = 0;\n\t\tlet aaaaTtl = 0;\n\t\tlet cacheTtl = 0;\n\n\t\tconst now = Date.now();\n\n\t\tfor (const entry of A) {\n\t\t\tentry.family = 4;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taTtl = Math.max(aTtl, entry.ttl);\n\t\t}\n\n\t\tfor (const entry of AAAA) {\n\t\t\tentry.family = 6;\n\t\t\tentry.expires = now + (entry.ttl * 1000);\n\n\t\t\taaaaTtl = Math.max(aaaaTtl, entry.ttl);\n\t\t}\n\n\t\tif (A.length > 0) {\n\t\t\tif (AAAA.length > 0) {\n\t\t\t\tcacheTtl = Math.min(aTtl, aaaaTtl);\n\t\t\t} else {\n\t\t\t\tcacheTtl = aTtl;\n\t\t\t}\n\t\t} else {\n\t\t\tcacheTtl = aaaaTtl;\n\t\t}\n\n\t\treturn {\n\t\t\tentries: [\n\t\t\t\t...A,\n\t\t\t\t...AAAA\n\t\t\t],\n\t\t\tcacheTtl\n\t\t};\n\t}\n\n\tasync _lookup(hostname) {\n\t\ttry {\n\t\t\tconst entries = await this._dnsLookup(hostname, {\n\t\t\t\tall: true\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tentries,\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t} catch (_) {\n\t\t\treturn {\n\t\t\t\tentries: [],\n\t\t\t\tcacheTtl: 0\n\t\t\t};\n\t\t}\n\t}\n\n\tasync _set(hostname, data, cacheTtl) {\n\t\tif (this.maxTtl > 0 && cacheTtl > 0) {\n\t\t\tcacheTtl = Math.min(cacheTtl, this.maxTtl) * 1000;\n\t\t\tdata[kExpires] = Date.now() + cacheTtl;\n\n\t\t\ttry {\n\t\t\t\tawait this._cache.set(hostname, data, cacheTtl);\n\t\t\t} catch (error) {\n\t\t\t\tthis.lookupAsync = async () => {\n\t\t\t\t\tconst cacheError = new Error('Cache Error. Please recreate the CacheableLookup instance.');\n\t\t\t\t\tcacheError.cause = error;\n\n\t\t\t\t\tthrow cacheError;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (isIterable(this._cache)) {\n\t\t\t\tthis._tick(cacheTtl);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync queryAndCache(hostname) {\n\t\tif (this._hostnamesToFallback.has(hostname)) {\n\t\t\treturn this._dnsLookup(hostname, all);\n\t\t}\n\n\t\tlet query = await this._resolve(hostname);\n\n\t\tif (query.entries.length === 0 && this._fallback) {\n\t\t\tquery = await this._lookup(hostname);\n\n\t\t\tif (query.entries.length !== 0) {\n\t\t\t\t// Use `dns.lookup(...)` for that particular hostname\n\t\t\t\tthis._hostnamesToFallback.add(hostname);\n\t\t\t}\n\t\t}\n\n\t\tconst cacheTtl = query.entries.length === 0 ? this.errorTtl : query.cacheTtl;\n\t\tawait this._set(hostname, query.entries, cacheTtl);\n\n\t\treturn query.entries;\n\t}\n\n\t_tick(ms) {\n\t\tconst nextRemovalTime = this._nextRemovalTime;\n\n\t\tif (!nextRemovalTime || ms < nextRemovalTime) {\n\t\t\tclearTimeout(this._removalTimeout);\n\n\t\t\tthis._nextRemovalTime = ms;\n\n\t\t\tthis._removalTimeout = setTimeout(() => {\n\t\t\t\tthis._nextRemovalTime = false;\n\n\t\t\t\tlet nextExpiry = Infinity;\n\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tfor (const [hostname, entries] of this._cache) {\n\t\t\t\t\tconst expires = entries[kExpires];\n\n\t\t\t\t\tif (now >= expires) {\n\t\t\t\t\t\tthis._cache.delete(hostname);\n\t\t\t\t\t} else if (expires < nextExpiry) {\n\t\t\t\t\t\tnextExpiry = expires;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextExpiry !== Infinity) {\n\t\t\t\t\tthis._tick(nextExpiry - now);\n\t\t\t\t}\n\t\t\t}, ms);\n\n\t\t\t/* istanbul ignore next: There is no `timeout.unref()` when running inside an Electron renderer */\n\t\t\tif (this._removalTimeout.unref) {\n\t\t\t\tthis._removalTimeout.unref();\n\t\t\t}\n\t\t}\n\t}\n\n\tinstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (kCacheableLookupCreateConnection in agent) {\n\t\t\tthrow new Error('CacheableLookup has been already installed');\n\t\t}\n\n\t\tagent[kCacheableLookupCreateConnection] = agent.createConnection;\n\t\tagent[kCacheableLookupInstance] = this;\n\n\t\tagent.createConnection = (options, callback) => {\n\t\t\tif (!('lookup' in options)) {\n\t\t\t\toptions.lookup = this.lookup;\n\t\t\t}\n\n\t\t\treturn agent[kCacheableLookupCreateConnection](options, callback);\n\t\t};\n\t}\n\n\tuninstall(agent) {\n\t\tverifyAgent(agent);\n\n\t\tif (agent[kCacheableLookupCreateConnection]) {\n\t\t\tif (agent[kCacheableLookupInstance] !== this) {\n\t\t\t\tthrow new Error('The agent is not owned by this CacheableLookup instance');\n\t\t\t}\n\n\t\t\tagent.createConnection = agent[kCacheableLookupCreateConnection];\n\n\t\t\tdelete agent[kCacheableLookupCreateConnection];\n\t\t\tdelete agent[kCacheableLookupInstance];\n\t\t}\n\t}\n\n\tupdateInterfaceInfo() {\n\t\tconst {_iface} = this;\n\n\t\tthis._iface = getIfaceInfo();\n\n\t\tif ((_iface.has4 && !this._iface.has4) || (_iface.has6 && !this._iface.has6)) {\n\t\t\tthis._cache.clear();\n\t\t}\n\t}\n\n\tclear(hostname) {\n\t\tif (hostname) {\n\t\t\tthis._cache.delete(hostname);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cache.clear();\n\t}\n}\n\nmodule.exports = CacheableLookup;\nmodule.exports.default = CacheableLookup;\n", "'use strict';\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\n\nconst testParameter = (name, filters) => {\n\treturn filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n};\n\nconst normalizeDataURL = (urlString, {stripHash}) => {\n\tconst match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\n\n\tif (!match) {\n\t\tthrow new Error(`Invalid URL: ${urlString}`);\n\t}\n\n\tlet {type, data, hash} = match.groups;\n\tconst mediaType = type.split(';');\n\thash = stripHash ? '' : hash;\n\n\tlet isBase64 = false;\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop();\n\t\tisBase64 = true;\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase();\n\tconst attributes = mediaType\n\t\t.map(attribute => {\n\t\t\tlet [key, value = ''] = attribute.split('=').map(string => string.trim());\n\n\t\t\t// Lowercase `charset`\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${key}${value ? `=${value}` : ''}`;\n\t\t})\n\t\t.filter(Boolean);\n\n\tconst normalizedMediaType = [\n\t\t...attributes\n\t];\n\n\tif (isBase64) {\n\t\tnormalizedMediaType.push('base64');\n\t}\n\n\tif (normalizedMediaType.length !== 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\n\t\tnormalizedMediaType.unshift(mimeType);\n\t}\n\n\treturn `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\n};\n\nconst normalizeUrl = (urlString, options) => {\n\toptions = {\n\t\tdefaultProtocol: 'http:',\n\t\tnormalizeProtocol: true,\n\t\tforceHttp: false,\n\t\tforceHttps: false,\n\t\tstripAuthentication: true,\n\t\tstripHash: false,\n\t\tstripTextFragment: true,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveSingleSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true,\n\t\t...options\n\t};\n\n\turlString = urlString.trim();\n\n\t// Data URL\n\tif (/^data:/i.test(urlString)) {\n\t\treturn normalizeDataURL(urlString, options);\n\t}\n\n\tif (/^view-source:/i.test(urlString)) {\n\t\tthrow new Error('`view-source:` is not supported as it is a non-standard protocol');\n\t}\n\n\tconst hasRelativeProtocol = urlString.startsWith('//');\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n\n\t// Prepend protocol\n\tif (!isRelativeUrl) {\n\t\turlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n\t}\n\n\tconst urlObj = new URL(urlString);\n\n\tif (options.forceHttp && options.forceHttps) {\n\t\tthrow new Error('The `forceHttp` and `forceHttps` options cannot be used together');\n\t}\n\n\tif (options.forceHttp && urlObj.protocol === 'https:') {\n\t\turlObj.protocol = 'http:';\n\t}\n\n\tif (options.forceHttps && urlObj.protocol === 'http:') {\n\t\turlObj.protocol = 'https:';\n\t}\n\n\t// Remove auth\n\tif (options.stripAuthentication) {\n\t\turlObj.username = '';\n\t\turlObj.password = '';\n\t}\n\n\t// Remove hash\n\tif (options.stripHash) {\n\t\turlObj.hash = '';\n\t} else if (options.stripTextFragment) {\n\t\turlObj.hash = urlObj.hash.replace(/#?:~:text.*?$/i, '');\n\t}\n\n\t// Remove duplicate slashes if not preceded by a protocol\n\tif (urlObj.pathname) {\n\t\turlObj.pathname = urlObj.pathname.replace(/(?<!\\b(?:[a-z][a-z\\d+\\-.]{1,50}:))\\/{2,}/g, '/');\n\t}\n\n\t// Decode URI octets\n\tif (urlObj.pathname) {\n\t\ttry {\n\t\t\turlObj.pathname = decodeURI(urlObj.pathname);\n\t\t} catch (_) {}\n\t}\n\n\t// Remove directory index\n\tif (options.removeDirectoryIndex === true) {\n\t\toptions.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObj.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, options.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, pathComponents.length - 1);\n\t\t\turlObj.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\tif (urlObj.hostname) {\n\t\t// Remove trailing dot\n\t\turlObj.hostname = urlObj.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (options.stripWWW && /^www\\.(?!www\\.)(?:[a-z\\-\\d]{1,63})\\.(?:[a-z.\\-\\d]{2,63})$/.test(urlObj.hostname)) {\n\t\t\t// Each label should be max 63 at length (min: 1).\n\t\t\t// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n\t\t\t// Each TLD should be up to 63 characters long (min: 2).\n\t\t\t// It is technically possible to have a single character TLD, but none currently exist.\n\t\t\turlObj.hostname = urlObj.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(options.removeQueryParameters)) {\n\t\tfor (const key of [...urlObj.searchParams.keys()]) {\n\t\t\tif (testParameter(key, options.removeQueryParameters)) {\n\t\t\t\turlObj.searchParams.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (options.removeQueryParameters === true) {\n\t\turlObj.search = '';\n\t}\n\n\t// Sort query parameters\n\tif (options.sortQueryParameters) {\n\t\turlObj.searchParams.sort();\n\t}\n\n\tif (options.removeTrailingSlash) {\n\t\turlObj.pathname = urlObj.pathname.replace(/\\/$/, '');\n\t}\n\n\tconst oldUrlString = urlString;\n\n\t// Take advantage of many of the Node `url` normalizations\n\turlString = urlObj.toString();\n\n\tif (!options.removeSingleSlash && urlObj.pathname === '/' && !oldUrlString.endsWith('/') && urlObj.hash === '') {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Remove ending `/` unless removeSingleSlash is false\n\tif ((options.removeTrailingSlash || urlObj.pathname === '/') && urlObj.hash === '' && options.removeSingleSlash) {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !options.normalizeProtocol) {\n\t\turlString = urlString.replace(/^http:\\/\\//, '//');\n\t}\n\n\t// Remove http/https\n\tif (options.stripProtocol) {\n\t\turlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\n\t}\n\n\treturn urlString;\n};\n\nmodule.exports = normalizeUrl;\n", "// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n", "var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n", "var once = require('once');\n\nvar noop = function() {};\n\nvar isRequest = function(stream) {\n\treturn stream.setHeader && typeof stream.abort === 'function';\n};\n\nvar isChildProcess = function(stream) {\n\treturn stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3\n};\n\nvar eos = function(stream, opts, callback) {\n\tif (typeof opts === 'function') return eos(stream, null, opts);\n\tif (!opts) opts = {};\n\n\tcallback = once(callback || noop);\n\n\tvar ws = stream._writableState;\n\tvar rs = stream._readableState;\n\tvar readable = opts.readable || (opts.readable !== false && stream.readable);\n\tvar writable = opts.writable || (opts.writable !== false && stream.writable);\n\tvar cancelled = false;\n\n\tvar onlegacyfinish = function() {\n\t\tif (!stream.writable) onfinish();\n\t};\n\n\tvar onfinish = function() {\n\t\twritable = false;\n\t\tif (!readable) callback.call(stream);\n\t};\n\n\tvar onend = function() {\n\t\treadable = false;\n\t\tif (!writable) callback.call(stream);\n\t};\n\n\tvar onexit = function(exitCode) {\n\t\tcallback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);\n\t};\n\n\tvar onerror = function(err) {\n\t\tcallback.call(stream, err);\n\t};\n\n\tvar onclose = function() {\n\t\tprocess.nextTick(onclosenexttick);\n\t};\n\n\tvar onclosenexttick = function() {\n\t\tif (cancelled) return;\n\t\tif (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));\n\t\tif (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));\n\t};\n\n\tvar onrequest = function() {\n\t\tstream.req.on('finish', onfinish);\n\t};\n\n\tif (isRequest(stream)) {\n\t\tstream.on('complete', onfinish);\n\t\tstream.on('abort', onclose);\n\t\tif (stream.req) onrequest();\n\t\telse stream.on('request', onrequest);\n\t} else if (writable && !ws) { // legacy streams\n\t\tstream.on('end', onlegacyfinish);\n\t\tstream.on('close', onlegacyfinish);\n\t}\n\n\tif (isChildProcess(stream)) stream.on('exit', onexit);\n\n\tstream.on('end', onend);\n\tstream.on('finish', onfinish);\n\tif (opts.error !== false) stream.on('error', onerror);\n\tstream.on('close', onclose);\n\n\treturn function() {\n\t\tcancelled = true;\n\t\tstream.removeListener('complete', onfinish);\n\t\tstream.removeListener('abort', onclose);\n\t\tstream.removeListener('request', onrequest);\n\t\tif (stream.req) stream.req.removeListener('finish', onfinish);\n\t\tstream.removeListener('end', onlegacyfinish);\n\t\tstream.removeListener('close', onlegacyfinish);\n\t\tstream.removeListener('finish', onfinish);\n\t\tstream.removeListener('exit', onexit);\n\t\tstream.removeListener('end', onend);\n\t\tstream.removeListener('error', onerror);\n\t\tstream.removeListener('close', onclose);\n\t};\n};\n\nmodule.exports = eos;\n", "var once = require('once')\nvar eos = require('end-of-stream')\nvar fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes\n\nvar noop = function () {}\nvar ancient = /^v?\\.0/.test(process.version)\n\nvar isFn = function (fn) {\n return typeof fn === 'function'\n}\n\nvar isFS = function (stream) {\n if (!ancient) return false // newer node version do not need to care about fs is a special way\n if (!fs) return false // browser\n return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)\n}\n\nvar isRequest = function (stream) {\n return stream.setHeader && isFn(stream.abort)\n}\n\nvar destroyer = function (stream, reading, writing, callback) {\n callback = once(callback)\n\n var closed = false\n stream.on('close', function () {\n closed = true\n })\n\n eos(stream, {readable: reading, writable: writing}, function (err) {\n if (err) return callback(err)\n closed = true\n callback()\n })\n\n var destroyed = false\n return function (err) {\n if (closed) return\n if (destroyed) return\n destroyed = true\n\n if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks\n if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want\n\n if (isFn(stream.destroy)) return stream.destroy()\n\n callback(err || new Error('stream was destroyed'))\n }\n}\n\nvar call = function (fn) {\n fn()\n}\n\nvar pipe = function (from, to) {\n return from.pipe(to)\n}\n\nvar pump = function () {\n var streams = Array.prototype.slice.call(arguments)\n var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop\n\n if (Array.isArray(streams[0])) streams = streams[0]\n if (streams.length < 2) throw new Error('pump requires two streams per minimum')\n\n var error\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1\n var writing = i > 0\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err\n if (err) destroys.forEach(call)\n if (reading) return\n destroys.forEach(call)\n callback(error)\n })\n })\n\n return streams.reduce(pipe)\n}\n\nmodule.exports = pump\n", "'use strict';\nconst {PassThrough: PassThroughStream} = require('stream');\n\nmodule.exports = options => {\n\toptions = {...options};\n\n\tconst {array} = options;\n\tlet {encoding} = options;\n\tconst isBuffer = encoding === 'buffer';\n\tlet objectMode = false;\n\n\tif (array) {\n\t\tobjectMode = !(encoding || isBuffer);\n\t} else {\n\t\tencoding = encoding || 'utf8';\n\t}\n\n\tif (isBuffer) {\n\t\tencoding = null;\n\t}\n\n\tconst stream = new PassThroughStream({objectMode});\n\n\tif (encoding) {\n\t\tstream.setEncoding(encoding);\n\t}\n\n\tlet length = 0;\n\tconst chunks = [];\n\n\tstream.on('data', chunk => {\n\t\tchunks.push(chunk);\n\n\t\tif (objectMode) {\n\t\t\tlength = chunks.length;\n\t\t} else {\n\t\t\tlength += chunk.length;\n\t\t}\n\t});\n\n\tstream.getBufferedValue = () => {\n\t\tif (array) {\n\t\t\treturn chunks;\n\t\t}\n\n\t\treturn isBuffer ? Buffer.concat(chunks, length) : chunks.join('');\n\t};\n\n\tstream.getBufferedLength = () => length;\n\n\treturn stream;\n};\n", "'use strict';\nconst {constants: BufferConstants} = require('buffer');\nconst pump = require('pump');\nconst bufferStream = require('./buffer-stream');\n\nclass MaxBufferError extends Error {\n\tconstructor() {\n\t\tsuper('maxBuffer exceeded');\n\t\tthis.name = 'MaxBufferError';\n\t}\n}\n\nasync function getStream(inputStream, options) {\n\tif (!inputStream) {\n\t\treturn Promise.reject(new Error('Expected a stream'));\n\t}\n\n\toptions = {\n\t\tmaxBuffer: Infinity,\n\t\t...options\n\t};\n\n\tconst {maxBuffer} = options;\n\n\tlet stream;\n\tawait new Promise((resolve, reject) => {\n\t\tconst rejectPromise = error => {\n\t\t\t// Don't retrieve an oversized buffer.\n\t\t\tif (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {\n\t\t\t\terror.bufferedData = stream.getBufferedValue();\n\t\t\t}\n\n\t\t\treject(error);\n\t\t};\n\n\t\tstream = pump(inputStream, bufferStream(options), error => {\n\t\t\tif (error) {\n\t\t\t\trejectPromise(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolve();\n\t\t});\n\n\t\tstream.on('data', () => {\n\t\t\tif (stream.getBufferedLength() > maxBuffer) {\n\t\t\t\trejectPromise(new MaxBufferError());\n\t\t\t}\n\t\t});\n\t});\n\n\treturn stream.getBufferedValue();\n}\n\nmodule.exports = getStream;\n// TODO: Remove this for the next major release\nmodule.exports.default = getStream;\nmodule.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});\nmodule.exports.array = (stream, options) => getStream(stream, {...options, array: true});\nmodule.exports.MaxBufferError = MaxBufferError;\n", "'use strict';\n// rfc7231 6.1\nconst statusCodeCacheableByDefault = new Set([\n 200,\n 203,\n 204,\n 206,\n 300,\n 301,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\n// This implementation does not understand partial responses (206)\nconst understoodStatuses = new Set([\n 200,\n 203,\n 204,\n 300,\n 301,\n 302,\n 303,\n 307,\n 308,\n 404,\n 405,\n 410,\n 414,\n 501,\n]);\n\nconst errorStatusCodes = new Set([\n 500,\n 502,\n 503, \n 504,\n]);\n\nconst hopByHopHeaders = {\n date: true, // included, because we add Age update Date\n connection: true,\n 'keep-alive': true,\n 'proxy-authenticate': true,\n 'proxy-authorization': true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n};\n\nconst excludedFromRevalidationUpdate = {\n // Since the old body is reused, it doesn't make sense to change properties of the body\n 'content-length': true,\n 'content-encoding': true,\n 'transfer-encoding': true,\n 'content-range': true,\n};\n\nfunction toNumberOrZero(s) {\n const n = parseInt(s, 10);\n return isFinite(n) ? n : 0;\n}\n\n// RFC 5861\nfunction isErrorResponse(response) {\n // consider undefined response as faulty\n if(!response) {\n return true\n }\n return errorStatusCodes.has(response.status);\n}\n\nfunction parseCacheControl(header) {\n const cc = {};\n if (!header) return cc;\n\n // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),\n // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale\n const parts = header.trim().split(/\\s*,\\s*/); // TODO: lame parsing\n for (const part of parts) {\n const [k, v] = part.split(/\\s*=\\s*/, 2);\n cc[k] = v === undefined ? true : v.replace(/^\"|\"$/g, ''); // TODO: lame unquoting\n }\n\n return cc;\n}\n\nfunction formatCacheControl(cc) {\n let parts = [];\n for (const k in cc) {\n const v = cc[k];\n parts.push(v === true ? k : k + '=' + v);\n }\n if (!parts.length) {\n return undefined;\n }\n return parts.join(', ');\n}\n\nmodule.exports = class CachePolicy {\n constructor(\n req,\n res,\n {\n shared,\n cacheHeuristic,\n immutableMinTimeToLive,\n ignoreCargoCult,\n _fromObject,\n } = {}\n ) {\n if (_fromObject) {\n this._fromObject(_fromObject);\n return;\n }\n\n if (!res || !res.headers) {\n throw Error('Response headers missing');\n }\n this._assertRequestHasHeaders(req);\n\n this._responseTime = this.now();\n this._isShared = shared !== false;\n this._cacheHeuristic =\n undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE\n this._immutableMinTtl =\n undefined !== immutableMinTimeToLive\n ? immutableMinTimeToLive\n : 24 * 3600 * 1000;\n\n this._status = 'status' in res ? res.status : 200;\n this._resHeaders = res.headers;\n this._rescc = parseCacheControl(res.headers['cache-control']);\n this._method = 'method' in req ? req.method : 'GET';\n this._url = req.url;\n this._host = req.headers.host;\n this._noAuthorization = !req.headers.authorization;\n this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used\n this._reqcc = parseCacheControl(req.headers['cache-control']);\n\n // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,\n // so there's no point stricly adhering to the blindly copy&pasted directives.\n if (\n ignoreCargoCult &&\n 'pre-check' in this._rescc &&\n 'post-check' in this._rescc\n ) {\n delete this._rescc['pre-check'];\n delete this._rescc['post-check'];\n delete this._rescc['no-cache'];\n delete this._rescc['no-store'];\n delete this._rescc['must-revalidate'];\n this._resHeaders = Object.assign({}, this._resHeaders, {\n 'cache-control': formatCacheControl(this._rescc),\n });\n delete this._resHeaders.expires;\n delete this._resHeaders.pragma;\n }\n\n // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive\n // as having the same effect as if \"Cache-Control: no-cache\" were present (see Section 5.2.1).\n if (\n res.headers['cache-control'] == null &&\n /no-cache/.test(res.headers.pragma)\n ) {\n this._rescc['no-cache'] = true;\n }\n }\n\n now() {\n return Date.now();\n }\n\n storable() {\n // The \"no-store\" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.\n return !!(\n !this._reqcc['no-store'] &&\n // A cache MUST NOT store a response to any request, unless:\n // The request method is understood by the cache and defined as being cacheable, and\n ('GET' === this._method ||\n 'HEAD' === this._method ||\n ('POST' === this._method && this._hasExplicitExpiration())) &&\n // the response status code is understood by the cache, and\n understoodStatuses.has(this._status) &&\n // the \"no-store\" cache directive does not appear in request or response header fields, and\n !this._rescc['no-store'] &&\n // the \"private\" response directive does not appear in the response, if the cache is shared, and\n (!this._isShared || !this._rescc.private) &&\n // the Authorization header field does not appear in the request, if the cache is shared,\n (!this._isShared ||\n this._noAuthorization ||\n this._allowsStoringAuthenticated()) &&\n // the response either:\n // contains an Expires header field, or\n (this._resHeaders.expires ||\n // contains a max-age response directive, or\n // contains a s-maxage response directive and the cache is shared, or\n // contains a public response directive.\n this._rescc['max-age'] ||\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc.public ||\n // has a status code that is defined as cacheable by default\n statusCodeCacheableByDefault.has(this._status))\n );\n }\n\n _hasExplicitExpiration() {\n // 4.2.1 Calculating Freshness Lifetime\n return (\n (this._isShared && this._rescc['s-maxage']) ||\n this._rescc['max-age'] ||\n this._resHeaders.expires\n );\n }\n\n _assertRequestHasHeaders(req) {\n if (!req || !req.headers) {\n throw Error('Request headers missing');\n }\n }\n\n satisfiesWithoutRevalidation(req) {\n this._assertRequestHasHeaders(req);\n\n // When presented with a request, a cache MUST NOT reuse a stored response, unless:\n // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,\n // unless the stored response is successfully validated (Section 4.3), and\n const requestCC = parseCacheControl(req.headers['cache-control']);\n if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {\n return false;\n }\n\n if (requestCC['max-age'] && this.age() > requestCC['max-age']) {\n return false;\n }\n\n if (\n requestCC['min-fresh'] &&\n this.timeToLive() < 1000 * requestCC['min-fresh']\n ) {\n return false;\n }\n\n // the stored response is either:\n // fresh, or allowed to be served stale\n if (this.stale()) {\n const allowsStale =\n requestCC['max-stale'] &&\n !this._rescc['must-revalidate'] &&\n (true === requestCC['max-stale'] ||\n requestCC['max-stale'] > this.age() - this.maxAge());\n if (!allowsStale) {\n return false;\n }\n }\n\n return this._requestMatches(req, false);\n }\n\n _requestMatches(req, allowHeadMethod) {\n // The presented effective request URI and that of the stored response match, and\n return (\n (!this._url || this._url === req.url) &&\n this._host === req.headers.host &&\n // the request method associated with the stored response allows it to be used for the presented request, and\n (!req.method ||\n this._method === req.method ||\n (allowHeadMethod && 'HEAD' === req.method)) &&\n // selecting header fields nominated by the stored response (if any) match those presented, and\n this._varyMatches(req)\n );\n }\n\n _allowsStoringAuthenticated() {\n // following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.\n return (\n this._rescc['must-revalidate'] ||\n this._rescc.public ||\n this._rescc['s-maxage']\n );\n }\n\n _varyMatches(req) {\n if (!this._resHeaders.vary) {\n return true;\n }\n\n // A Vary header field-value of \"*\" always fails to match\n if (this._resHeaders.vary === '*') {\n return false;\n }\n\n const fields = this._resHeaders.vary\n .trim()\n .toLowerCase()\n .split(/\\s*,\\s*/);\n for (const name of fields) {\n if (req.headers[name] !== this._reqHeaders[name]) return false;\n }\n return true;\n }\n\n _copyWithoutHopByHopHeaders(inHeaders) {\n const headers = {};\n for (const name in inHeaders) {\n if (hopByHopHeaders[name]) continue;\n headers[name] = inHeaders[name];\n }\n // 9.1. Connection\n if (inHeaders.connection) {\n const tokens = inHeaders.connection.trim().split(/\\s*,\\s*/);\n for (const name of tokens) {\n delete headers[name];\n }\n }\n if (headers.warning) {\n const warnings = headers.warning.split(/,/).filter(warning => {\n return !/^\\s*1[0-9][0-9]/.test(warning);\n });\n if (!warnings.length) {\n delete headers.warning;\n } else {\n headers.warning = warnings.join(',').trim();\n }\n }\n return headers;\n }\n\n responseHeaders() {\n const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);\n const age = this.age();\n\n // A cache SHOULD generate 113 warning if it heuristically chose a freshness\n // lifetime greater than 24 hours and the response's age is greater than 24 hours.\n if (\n age > 3600 * 24 &&\n !this._hasExplicitExpiration() &&\n this.maxAge() > 3600 * 24\n ) {\n headers.warning =\n (headers.warning ? `${headers.warning}, ` : '') +\n '113 - \"rfc7234 5.5.4\"';\n }\n headers.age = `${Math.round(age)}`;\n headers.date = new Date(this.now()).toUTCString();\n return headers;\n }\n\n /**\n * Value of the Date response header or current time if Date was invalid\n * @return timestamp\n */\n date() {\n const serverDate = Date.parse(this._resHeaders.date);\n if (isFinite(serverDate)) {\n return serverDate;\n }\n return this._responseTime;\n }\n\n /**\n * Value of the Age header, in seconds, updated for the current time.\n * May be fractional.\n *\n * @return Number\n */\n age() {\n let age = this._ageValue();\n\n const residentTime = (this.now() - this._responseTime) / 1000;\n return age + residentTime;\n }\n\n _ageValue() {\n return toNumberOrZero(this._resHeaders.age);\n }\n\n /**\n * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.\n *\n * For an up-to-date value, see `timeToLive()`.\n *\n * @return Number\n */\n maxAge() {\n if (!this.storable() || this._rescc['no-cache']) {\n return 0;\n }\n\n // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default\n // so this implementation requires explicit opt-in via public header\n if (\n this._isShared &&\n (this._resHeaders['set-cookie'] &&\n !this._rescc.public &&\n !this._rescc.immutable)\n ) {\n return 0;\n }\n\n if (this._resHeaders.vary === '*') {\n return 0;\n }\n\n if (this._isShared) {\n if (this._rescc['proxy-revalidate']) {\n return 0;\n }\n // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.\n if (this._rescc['s-maxage']) {\n return toNumberOrZero(this._rescc['s-maxage']);\n }\n }\n\n // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.\n if (this._rescc['max-age']) {\n return toNumberOrZero(this._rescc['max-age']);\n }\n\n const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;\n\n const serverDate = this.date();\n if (this._resHeaders.expires) {\n const expires = Date.parse(this._resHeaders.expires);\n // A cache recipient MUST interpret invalid date formats, especially the value \"0\", as representing a time in the past (i.e., \"already expired\").\n if (Number.isNaN(expires) || expires < serverDate) {\n return 0;\n }\n return Math.max(defaultMinTtl, (expires - serverDate) / 1000);\n }\n\n if (this._resHeaders['last-modified']) {\n const lastModified = Date.parse(this._resHeaders['last-modified']);\n if (isFinite(lastModified) && serverDate > lastModified) {\n return Math.max(\n defaultMinTtl,\n ((serverDate - lastModified) / 1000) * this._cacheHeuristic\n );\n }\n }\n\n return defaultMinTtl;\n }\n\n timeToLive() {\n const age = this.maxAge() - this.age();\n const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);\n const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);\n return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000;\n }\n\n stale() {\n return this.maxAge() <= this.age();\n }\n\n _useStaleIfError() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();\n }\n\n useStaleWhileRevalidate() {\n return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age();\n }\n\n static fromObject(obj) {\n return new this(undefined, undefined, { _fromObject: obj });\n }\n\n _fromObject(obj) {\n if (this._responseTime) throw Error('Reinitialized');\n if (!obj || obj.v !== 1) throw Error('Invalid serialization');\n\n this._responseTime = obj.t;\n this._isShared = obj.sh;\n this._cacheHeuristic = obj.ch;\n this._immutableMinTtl =\n obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;\n this._status = obj.st;\n this._resHeaders = obj.resh;\n this._rescc = obj.rescc;\n this._method = obj.m;\n this._url = obj.u;\n this._host = obj.h;\n this._noAuthorization = obj.a;\n this._reqHeaders = obj.reqh;\n this._reqcc = obj.reqcc;\n }\n\n toObject() {\n return {\n v: 1,\n t: this._responseTime,\n sh: this._isShared,\n ch: this._cacheHeuristic,\n imm: this._immutableMinTtl,\n st: this._status,\n resh: this._resHeaders,\n rescc: this._rescc,\n m: this._method,\n u: this._url,\n h: this._host,\n a: this._noAuthorization,\n reqh: this._reqHeaders,\n reqcc: this._reqcc,\n };\n }\n\n /**\n * Headers for sending to the origin server to revalidate stale response.\n * Allows server to return 304 to allow reuse of the previous response.\n *\n * Hop by hop headers are always stripped.\n * Revalidation headers may be added or removed, depending on request.\n */\n revalidationHeaders(incomingReq) {\n this._assertRequestHasHeaders(incomingReq);\n const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);\n\n // This implementation does not understand range requests\n delete headers['if-range'];\n\n if (!this._requestMatches(incomingReq, true) || !this.storable()) {\n // revalidation allowed via HEAD\n // not for the same resource, or wasn't allowed to be cached anyway\n delete headers['if-none-match'];\n delete headers['if-modified-since'];\n return headers;\n }\n\n /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */\n if (this._resHeaders.etag) {\n headers['if-none-match'] = headers['if-none-match']\n ? `${headers['if-none-match']}, ${this._resHeaders.etag}`\n : this._resHeaders.etag;\n }\n\n // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.\n const forbidsWeakValidators =\n headers['accept-ranges'] ||\n headers['if-match'] ||\n headers['if-unmodified-since'] ||\n (this._method && this._method != 'GET');\n\n /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.\n Note: This implementation does not understand partial responses (206) */\n if (forbidsWeakValidators) {\n delete headers['if-modified-since'];\n\n if (headers['if-none-match']) {\n const etags = headers['if-none-match']\n .split(/,/)\n .filter(etag => {\n return !/^\\s*W\\//.test(etag);\n });\n if (!etags.length) {\n delete headers['if-none-match'];\n } else {\n headers['if-none-match'] = etags.join(',').trim();\n }\n }\n } else if (\n this._resHeaders['last-modified'] &&\n !headers['if-modified-since']\n ) {\n headers['if-modified-since'] = this._resHeaders['last-modified'];\n }\n\n return headers;\n }\n\n /**\n * Creates new CachePolicy with information combined from the previews response,\n * and the new revalidation response.\n *\n * Returns {policy, modified} where modified is a boolean indicating\n * whether the response body has been modified, and old cached body can't be used.\n *\n * @return {Object} {policy: CachePolicy, modified: Boolean}\n */\n revalidatedPolicy(request, response) {\n this._assertRequestHasHeaders(request);\n if(this._useStaleIfError() && isErrorResponse(response)) { // I consider the revalidation request unsuccessful\n return {\n modified: false,\n matches: false,\n policy: this,\n };\n }\n if (!response || !response.headers) {\n throw Error('Response headers missing');\n }\n\n // These aren't going to be supported exactly, since one CachePolicy object\n // doesn't know about all the other cached objects.\n let matches = false;\n if (response.status !== undefined && response.status != 304) {\n matches = false;\n } else if (\n response.headers.etag &&\n !/^\\s*W\\//.test(response.headers.etag)\n ) {\n // \"All of the stored responses with the same strong validator are selected.\n // If none of the stored responses contain the same strong validator,\n // then the cache MUST NOT use the new response to update any stored responses.\"\n matches =\n this._resHeaders.etag &&\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag;\n } else if (this._resHeaders.etag && response.headers.etag) {\n // \"If the new response contains a weak validator and that validator corresponds\n // to one of the cache's stored responses,\n // then the most recent of those matching stored responses is selected for update.\"\n matches =\n this._resHeaders.etag.replace(/^\\s*W\\//, '') ===\n response.headers.etag.replace(/^\\s*W\\//, '');\n } else if (this._resHeaders['last-modified']) {\n matches =\n this._resHeaders['last-modified'] ===\n response.headers['last-modified'];\n } else {\n // If the new response does not include any form of validator (such as in the case where\n // a client generates an If-Modified-Since request from a source other than the Last-Modified\n // response header field), and there is only one stored response, and that stored response also\n // lacks a validator, then that stored response is selected for update.\n if (\n !this._resHeaders.etag &&\n !this._resHeaders['last-modified'] &&\n !response.headers.etag &&\n !response.headers['last-modified']\n ) {\n matches = true;\n }\n }\n\n if (!matches) {\n return {\n policy: new this.constructor(request, response),\n // Client receiving 304 without body, even if it's invalid/mismatched has no option\n // but to reuse a cached body. We don't have a good way to tell clients to do\n // error recovery in such case.\n modified: response.status != 304,\n matches: false,\n };\n }\n\n // use other header fields provided in the 304 (Not Modified) response to replace all instances\n // of the corresponding header fields in the stored response.\n const headers = {};\n for (const k in this._resHeaders) {\n headers[k] =\n k in response.headers && !excludedFromRevalidationUpdate[k]\n ? response.headers[k]\n : this._resHeaders[k];\n }\n\n const newResponse = Object.assign({}, response, {\n status: this._status,\n method: this._method,\n headers,\n });\n return {\n policy: new this.constructor(request, newResponse, {\n shared: this._isShared,\n cacheHeuristic: this._cacheHeuristic,\n immutableMinTimeToLive: this._immutableMinTtl,\n }),\n modified: false,\n matches: true,\n };\n }\n};\n", "'use strict';\nmodule.exports = object => {\n\tconst result = {};\n\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tresult[key.toLowerCase()] = value;\n\t}\n\n\treturn result;\n};\n", "'use strict';\n\nconst Readable = require('stream').Readable;\nconst lowercaseKeys = require('lowercase-keys');\n\nclass Response extends Readable {\n\tconstructor(statusCode, headers, body, url) {\n\t\tif (typeof statusCode !== 'number') {\n\t\t\tthrow new TypeError('Argument `statusCode` should be a number');\n\t\t}\n\t\tif (typeof headers !== 'object') {\n\t\t\tthrow new TypeError('Argument `headers` should be an object');\n\t\t}\n\t\tif (!(body instanceof Buffer)) {\n\t\t\tthrow new TypeError('Argument `body` should be a buffer');\n\t\t}\n\t\tif (typeof url !== 'string') {\n\t\t\tthrow new TypeError('Argument `url` should be a string');\n\t\t}\n\n\t\tsuper();\n\t\tthis.statusCode = statusCode;\n\t\tthis.headers = lowercaseKeys(headers);\n\t\tthis.body = body;\n\t\tthis.url = url;\n\t}\n\n\t_read() {\n\t\tthis.push(this.body);\n\t\tthis.push(null);\n\t}\n}\n\nmodule.exports = Response;\n", "'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProps = [\n\t'destroy',\n\t'setTimeout',\n\t'socket',\n\t'headers',\n\t'trailers',\n\t'rawHeaders',\n\t'statusCode',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'rawTrailers',\n\t'statusMessage'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tconst fromProps = new Set(Object.keys(fromStream).concat(knownProps));\n\n\tfor (const prop of fromProps) {\n\t\t// Don't overwrite existing properties\n\t\tif (prop in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttoStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];\n\t}\n};\n", "'use strict';\n\nconst PassThrough = require('stream').PassThrough;\nconst mimicResponse = require('mimic-response');\n\nconst cloneResponse = response => {\n\tif (!(response && response.pipe)) {\n\t\tthrow new TypeError('Parameter `response` must be a response stream.');\n\t}\n\n\tconst clone = new PassThrough();\n\tmimicResponse(response, clone);\n\n\treturn response.pipe(clone);\n};\n\nmodule.exports = cloneResponse;\n", "//TODO: handle reviver/dehydrate function like normal\n//and handle indentation, like normal.\n//if anyone needs this... please send pull request.\n\nexports.stringify = function stringify (o) {\n if('undefined' == typeof o) return o\n\n if(o && Buffer.isBuffer(o))\n return JSON.stringify(':base64:' + o.toString('base64'))\n\n if(o && o.toJSON)\n o = o.toJSON()\n\n if(o && 'object' === typeof o) {\n var s = ''\n var array = Array.isArray(o)\n s = array ? '[' : '{'\n var first = true\n\n for(var k in o) {\n var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k])\n if(Object.hasOwnProperty.call(o, k) && !ignore) {\n if(!first)\n s += ','\n first = false\n if (array) {\n if(o[k] == undefined)\n s += 'null'\n else\n s += stringify(o[k])\n } else if (o[k] !== void(0)) {\n s += stringify(k) + ':' + stringify(o[k])\n }\n }\n }\n\n s += array ? ']' : '}'\n\n return s\n } else if ('string' === typeof o) {\n return JSON.stringify(/^:/.test(o) ? ':' + o : o)\n } else if ('undefined' === typeof o) {\n return 'null';\n } else\n return JSON.stringify(o)\n}\n\nexports.parse = function (s) {\n return JSON.parse(s, function (key, value) {\n if('string' === typeof value) {\n if(/^:base64:/.test(value))\n return Buffer.from(value.substring(8), 'base64')\n else\n return /^:/.test(value) ? value.substring(1) : value \n }\n return value\n })\n}\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst JSONB = require('json-buffer');\n\nconst loadStore = opts => {\n\tconst adapters = {\n\t\tredis: '@keyv/redis',\n\t\tmongodb: '@keyv/mongo',\n\t\tmongo: '@keyv/mongo',\n\t\tsqlite: '@keyv/sqlite',\n\t\tpostgresql: '@keyv/postgres',\n\t\tpostgres: '@keyv/postgres',\n\t\tmysql: '@keyv/mysql'\n\t};\n\tif (opts.adapter || opts.uri) {\n\t\tconst adapter = opts.adapter || /^[^:]*/.exec(opts.uri)[0];\n\t\treturn new (require(adapters[adapter]))(opts);\n\t}\n\n\treturn new Map();\n};\n\nclass Keyv extends EventEmitter {\n\tconstructor(uri, opts) {\n\t\tsuper();\n\t\tthis.opts = Object.assign(\n\t\t\t{\n\t\t\t\tnamespace: 'keyv',\n\t\t\t\tserialize: JSONB.stringify,\n\t\t\t\tdeserialize: JSONB.parse\n\t\t\t},\n\t\t\t(typeof uri === 'string') ? { uri } : uri,\n\t\t\topts\n\t\t);\n\n\t\tif (!this.opts.store) {\n\t\t\tconst adapterOpts = Object.assign({}, this.opts);\n\t\t\tthis.opts.store = loadStore(adapterOpts);\n\t\t}\n\n\t\tif (typeof this.opts.store.on === 'function') {\n\t\t\tthis.opts.store.on('error', err => this.emit('error', err));\n\t\t}\n\n\t\tthis.opts.store.namespace = this.opts.namespace;\n\t}\n\n\t_getKeyPrefix(key) {\n\t\treturn `${this.opts.namespace}:${key}`;\n\t}\n\n\tget(key, opts) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tconst { store } = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.get(keyPrefixed))\n\t\t\t.then(data => {\n\t\t\t\treturn (typeof data === 'string') ? this.opts.deserialize(data) : data;\n\t\t\t})\n\t\t\t.then(data => {\n\t\t\t\tif (data === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tif (typeof data.expires === 'number' && Date.now() > data.expires) {\n\t\t\t\t\tthis.delete(key);\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn (opts && opts.raw) ? data : data.value;\n\t\t\t});\n\t}\n\n\tset(key, value, ttl) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tif (typeof ttl === 'undefined') {\n\t\t\tttl = this.opts.ttl;\n\t\t}\n\n\t\tif (ttl === 0) {\n\t\t\tttl = undefined;\n\t\t}\n\n\t\tconst { store } = this.opts;\n\n\t\treturn Promise.resolve()\n\t\t\t.then(() => {\n\t\t\t\tconst expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null;\n\t\t\t\tvalue = { value, expires };\n\t\t\t\treturn this.opts.serialize(value);\n\t\t\t})\n\t\t\t.then(value => store.set(keyPrefixed, value, ttl))\n\t\t\t.then(() => true);\n\t}\n\n\tdelete(key) {\n\t\tconst keyPrefixed = this._getKeyPrefix(key);\n\t\tconst { store } = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.delete(keyPrefixed));\n\t}\n\n\tclear() {\n\t\tconst { store } = this.opts;\n\t\treturn Promise.resolve()\n\t\t\t.then(() => store.clear());\n\t}\n}\n\nmodule.exports = Keyv;\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst urlLib = require('url');\nconst normalizeUrl = require('normalize-url');\nconst getStream = require('get-stream');\nconst CachePolicy = require('http-cache-semantics');\nconst Response = require('responselike');\nconst lowercaseKeys = require('lowercase-keys');\nconst cloneResponse = require('clone-response');\nconst Keyv = require('keyv');\n\nclass CacheableRequest {\n\tconstructor(request, cacheAdapter) {\n\t\tif (typeof request !== 'function') {\n\t\t\tthrow new TypeError('Parameter `request` must be a function');\n\t\t}\n\n\t\tthis.cache = new Keyv({\n\t\t\turi: typeof cacheAdapter === 'string' && cacheAdapter,\n\t\t\tstore: typeof cacheAdapter !== 'string' && cacheAdapter,\n\t\t\tnamespace: 'cacheable-request'\n\t\t});\n\n\t\treturn this.createCacheableRequest(request);\n\t}\n\n\tcreateCacheableRequest(request) {\n\t\treturn (opts, cb) => {\n\t\t\tlet url;\n\t\t\tif (typeof opts === 'string') {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts));\n\t\t\t\topts = {};\n\t\t\t} else if (opts instanceof urlLib.URL) {\n\t\t\t\turl = normalizeUrlObject(urlLib.parse(opts.toString()));\n\t\t\t\topts = {};\n\t\t\t} else {\n\t\t\t\tconst [pathname, ...searchParts] = (opts.path || '').split('?');\n\t\t\t\tconst search = searchParts.length > 0 ?\n\t\t\t\t\t`?${searchParts.join('?')}` :\n\t\t\t\t\t'';\n\t\t\t\turl = normalizeUrlObject({ ...opts, pathname, search });\n\t\t\t}\n\n\t\t\topts = {\n\t\t\t\theaders: {},\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcache: true,\n\t\t\t\tstrictTtl: false,\n\t\t\t\tautomaticFailover: false,\n\t\t\t\t...opts,\n\t\t\t\t...urlObjectToRequestOptions(url)\n\t\t\t};\n\t\t\topts.headers = lowercaseKeys(opts.headers);\n\n\t\t\tconst ee = new EventEmitter();\n\t\t\tconst normalizedUrlString = normalizeUrl(\n\t\t\t\turlLib.format(url),\n\t\t\t\t{\n\t\t\t\t\tstripWWW: false,\n\t\t\t\t\tremoveTrailingSlash: false,\n\t\t\t\t\tstripAuthentication: false\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst key = `${opts.method}:${normalizedUrlString}`;\n\t\t\tlet revalidate = false;\n\t\t\tlet madeRequest = false;\n\n\t\t\tconst makeRequest = opts => {\n\t\t\t\tmadeRequest = true;\n\t\t\t\tlet requestErrored = false;\n\t\t\t\tlet requestErrorCallback;\n\n\t\t\t\tconst requestErrorPromise = new Promise(resolve => {\n\t\t\t\t\trequestErrorCallback = () => {\n\t\t\t\t\t\tif (!requestErrored) {\n\t\t\t\t\t\t\trequestErrored = true;\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst handler = response => {\n\t\t\t\t\tif (revalidate && !opts.forceRefresh) {\n\t\t\t\t\t\tresponse.status = response.statusCode;\n\t\t\t\t\t\tconst revalidatedPolicy = CachePolicy.fromObject(revalidate.cachePolicy).revalidatedPolicy(opts, response);\n\t\t\t\t\t\tif (!revalidatedPolicy.modified) {\n\t\t\t\t\t\t\tconst headers = revalidatedPolicy.policy.responseHeaders();\n\t\t\t\t\t\t\tresponse = new Response(revalidate.statusCode, headers, revalidate.body, revalidate.url);\n\t\t\t\t\t\t\tresponse.cachePolicy = revalidatedPolicy.policy;\n\t\t\t\t\t\t\tresponse.fromCache = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!response.fromCache) {\n\t\t\t\t\t\tresponse.cachePolicy = new CachePolicy(opts, response, opts);\n\t\t\t\t\t\tresponse.fromCache = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet clonedResponse;\n\t\t\t\t\tif (opts.cache && response.cachePolicy.storable()) {\n\t\t\t\t\t\tclonedResponse = cloneResponse(response);\n\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst bodyPromise = getStream.buffer(response);\n\n\t\t\t\t\t\t\t\tawait Promise.race([\n\t\t\t\t\t\t\t\t\trequestErrorPromise,\n\t\t\t\t\t\t\t\t\tnew Promise(resolve => response.once('end', resolve))\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (requestErrored) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst body = await bodyPromise;\n\n\t\t\t\t\t\t\t\tconst value = {\n\t\t\t\t\t\t\t\t\tcachePolicy: response.cachePolicy.toObject(),\n\t\t\t\t\t\t\t\t\turl: response.url,\n\t\t\t\t\t\t\t\t\tstatusCode: response.fromCache ? revalidate.statusCode : response.statusCode,\n\t\t\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlet ttl = opts.strictTtl ? response.cachePolicy.timeToLive() : undefined;\n\t\t\t\t\t\t\t\tif (opts.maxTtl) {\n\t\t\t\t\t\t\t\t\tttl = ttl ? Math.min(ttl, opts.maxTtl) : opts.maxTtl;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait this.cache.set(key, value, ttl);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t} else if (opts.cache && revalidate) {\n\t\t\t\t\t\t(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.cache.delete(key);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})();\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('response', clonedResponse || response);\n\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\tcb(clonedResponse || response);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tconst req = request(opts, handler);\n\t\t\t\t\treq.once('error', requestErrorCallback);\n\t\t\t\t\treq.once('abort', requestErrorCallback);\n\t\t\t\t\tee.emit('request', req);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tee.emit('error', new CacheableRequest.RequestError(error));\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t(async () => {\n\t\t\t\tconst get = async opts => {\n\t\t\t\t\tawait Promise.resolve();\n\n\t\t\t\t\tconst cacheEntry = opts.cache ? await this.cache.get(key) : undefined;\n\t\t\t\t\tif (typeof cacheEntry === 'undefined') {\n\t\t\t\t\t\treturn makeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst policy = CachePolicy.fromObject(cacheEntry.cachePolicy);\n\t\t\t\t\tif (policy.satisfiesWithoutRevalidation(opts) && !opts.forceRefresh) {\n\t\t\t\t\t\tconst headers = policy.responseHeaders();\n\t\t\t\t\t\tconst response = new Response(cacheEntry.statusCode, headers, cacheEntry.body, cacheEntry.url);\n\t\t\t\t\t\tresponse.cachePolicy = policy;\n\t\t\t\t\t\tresponse.fromCache = true;\n\n\t\t\t\t\t\tee.emit('response', response);\n\t\t\t\t\t\tif (typeof cb === 'function') {\n\t\t\t\t\t\t\tcb(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trevalidate = cacheEntry;\n\t\t\t\t\t\topts.headers = policy.revalidationHeaders(opts);\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst errorHandler = error => ee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\tthis.cache.once('error', errorHandler);\n\t\t\t\tee.on('response', () => this.cache.removeListener('error', errorHandler));\n\n\t\t\t\ttry {\n\t\t\t\t\tawait get(opts);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (opts.automaticFailover && !madeRequest) {\n\t\t\t\t\t\tmakeRequest(opts);\n\t\t\t\t\t}\n\n\t\t\t\t\tee.emit('error', new CacheableRequest.CacheError(error));\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\treturn ee;\n\t\t};\n\t}\n}\n\nfunction urlObjectToRequestOptions(url) {\n\tconst options = { ...url };\n\toptions.path = `${url.pathname || '/'}${url.search || ''}`;\n\tdelete options.pathname;\n\tdelete options.search;\n\treturn options;\n}\n\nfunction normalizeUrlObject(url) {\n\t// If url was parsed by url.parse or new URL:\n\t// - hostname will be set\n\t// - host will be hostname[:port]\n\t// - port will be set if it was explicit in the parsed string\n\t// Otherwise, url was from request options:\n\t// - hostname or host may be set\n\t// - host shall not have port encoded\n\treturn {\n\t\tprotocol: url.protocol,\n\t\tauth: url.auth,\n\t\thostname: url.hostname || url.host || 'localhost',\n\t\tport: url.port,\n\t\tpathname: url.pathname,\n\t\tsearch: url.search\n\t};\n}\n\nCacheableRequest.RequestError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'RequestError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nCacheableRequest.CacheError = class extends Error {\n\tconstructor(error) {\n\t\tsuper(error.message);\n\t\tthis.name = 'CacheError';\n\t\tObject.assign(this, error);\n\t}\n};\n\nmodule.exports = CacheableRequest;\n", "'use strict';\n\n// We define these manually to ensure they're always copied\n// even if they would move up the prototype chain\n// https://nodejs.org/api/http.html#http_class_http_incomingmessage\nconst knownProperties = [\n\t'aborted',\n\t'complete',\n\t'headers',\n\t'httpVersion',\n\t'httpVersionMinor',\n\t'httpVersionMajor',\n\t'method',\n\t'rawHeaders',\n\t'rawTrailers',\n\t'setTimeout',\n\t'socket',\n\t'statusCode',\n\t'statusMessage',\n\t'trailers',\n\t'url'\n];\n\nmodule.exports = (fromStream, toStream) => {\n\tif (toStream._readableState.autoDestroy) {\n\t\tthrow new Error('The second stream must have the `autoDestroy` option set to `false`');\n\t}\n\n\tconst fromProperties = new Set(Object.keys(fromStream).concat(knownProperties));\n\n\tconst properties = {};\n\n\tfor (const property of fromProperties) {\n\t\t// Don't overwrite existing properties.\n\t\tif (property in toStream) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tproperties[property] = {\n\t\t\tget() {\n\t\t\t\tconst value = fromStream[property];\n\t\t\t\tconst isFunction = typeof value === 'function';\n\n\t\t\t\treturn isFunction ? value.bind(fromStream) : value;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tfromStream[property] = value;\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false\n\t\t};\n\t}\n\n\tObject.defineProperties(toStream, properties);\n\n\tfromStream.once('aborted', () => {\n\t\ttoStream.destroy();\n\n\t\ttoStream.emit('aborted');\n\t});\n\n\tfromStream.once('close', () => {\n\t\tif (fromStream.complete) {\n\t\t\tif (toStream.readable) {\n\t\t\t\ttoStream.once('end', () => {\n\t\t\t\t\ttoStream.emit('close');\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttoStream.emit('close');\n\t\t\t}\n\t\t} else {\n\t\t\ttoStream.emit('close');\n\t\t}\n\t});\n\n\treturn toStream;\n};\n", "'use strict';\nconst {Transform, PassThrough} = require('stream');\nconst zlib = require('zlib');\nconst mimicResponse = require('mimic-response');\n\nmodule.exports = response => {\n\tconst contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();\n\n\tif (!['gzip', 'deflate', 'br'].includes(contentEncoding)) {\n\t\treturn response;\n\t}\n\n\t// TODO: Remove this when targeting Node.js 12.\n\tconst isBrotli = contentEncoding === 'br';\n\tif (isBrotli && typeof zlib.createBrotliDecompress !== 'function') {\n\t\tresponse.destroy(new Error('Brotli is not supported on Node.js < 12'));\n\t\treturn response;\n\t}\n\n\tlet isEmpty = true;\n\n\tconst checker = new Transform({\n\t\ttransform(data, _encoding, callback) {\n\t\t\tisEmpty = false;\n\n\t\t\tcallback(null, data);\n\t\t},\n\n\t\tflush(callback) {\n\t\t\tcallback();\n\t\t}\n\t});\n\n\tconst finalStream = new PassThrough({\n\t\tautoDestroy: false,\n\t\tdestroy(error, callback) {\n\t\t\tresponse.destroy();\n\n\t\t\tcallback(error);\n\t\t}\n\t});\n\n\tconst decompressStream = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();\n\n\tdecompressStream.once('error', error => {\n\t\tif (isEmpty && !response.readable) {\n\t\t\tfinalStream.end();\n\t\t\treturn;\n\t\t}\n\n\t\tfinalStream.destroy(error);\n\t});\n\n\tmimicResponse(response, finalStream);\n\tresponse.pipe(checker).pipe(decompressStream).pipe(finalStream);\n\n\treturn finalStream;\n};\n", "'use strict';\n\nclass QuickLRU {\n\tconstructor(options = {}) {\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tfor (const [key, value] of this.oldCache.entries()) {\n\t\t\t\t\tthis.onEviction(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst value = this.oldCache.get(key);\n\t\t\tthis.oldCache.delete(key);\n\t\t\tthis._set(key, value);\n\t\t\treturn value;\n\t\t}\n\t}\n\n\tset(key, value) {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, value);\n\t\t} else {\n\t\t\tthis._set(key, value);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\treturn this.cache.has(key) || this.oldCache.has(key);\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this.cache.get(key);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this.oldCache.get(key);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tyield item;\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget size() {\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n}\n\nmodule.exports = QuickLRU;\n", "'use strict';\nconst EventEmitter = require('events');\nconst tls = require('tls');\nconst http2 = require('http2');\nconst QuickLRU = require('quick-lru');\n\nconst kCurrentStreamsCount = Symbol('currentStreamsCount');\nconst kRequest = Symbol('request');\nconst kOriginSet = Symbol('cachedOriginSet');\nconst kGracefullyClosing = Symbol('gracefullyClosing');\n\nconst nameKeys = [\n\t// `http2.connect()` options\n\t'maxDeflateDynamicTableSize',\n\t'maxSessionMemory',\n\t'maxHeaderListPairs',\n\t'maxOutstandingPings',\n\t'maxReservedRemoteStreams',\n\t'maxSendHeaderBlockLength',\n\t'paddingStrategy',\n\n\t// `tls.connect()` options\n\t'localAddress',\n\t'path',\n\t'rejectUnauthorized',\n\t'minDHSize',\n\n\t// `tls.createSecureContext()` options\n\t'ca',\n\t'cert',\n\t'clientCertEngine',\n\t'ciphers',\n\t'key',\n\t'pfx',\n\t'servername',\n\t'minVersion',\n\t'maxVersion',\n\t'secureProtocol',\n\t'crl',\n\t'honorCipherOrder',\n\t'ecdhCurve',\n\t'dhparam',\n\t'secureOptions',\n\t'sessionIdContext'\n];\n\nconst getSortedIndex = (array, value, compare) => {\n\tlet low = 0;\n\tlet high = array.length;\n\n\twhile (low < high) {\n\t\tconst mid = (low + high) >>> 1;\n\n\t\t/* istanbul ignore next */\n\t\tif (compare(array[mid], value)) {\n\t\t\t// This never gets called because we use descending sort. Better to have this anyway.\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\n\treturn low;\n};\n\nconst compareSessions = (a, b) => {\n\treturn a.remoteSettings.maxConcurrentStreams > b.remoteSettings.maxConcurrentStreams;\n};\n\n// See https://tools.ietf.org/html/rfc8336\nconst closeCoveredSessions = (where, session) => {\n\t// Clients SHOULD NOT emit new requests on any connection whose Origin\n\t// Set is a proper subset of another connection's Origin Set, and they\n\t// SHOULD close it once all outstanding requests are satisfied.\n\tfor (const coveredSession of where) {\n\t\tif (\n\t\t\t// The set is a proper subset when its length is less than the other set.\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\n\t\t\t// And the other set includes all elements of the subset.\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\n\t\t\t// Makes sure that the session can handle all requests from the covered session.\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\t// This allows pending requests to finish and prevents making new requests.\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\n// This is basically inverted `closeCoveredSessions(...)`.\nconst closeSessionIfCovered = (where, coveredSession) => {\n\tfor (const session of where) {\n\t\tif (\n\t\t\tcoveredSession[kOriginSet].length < session[kOriginSet].length &&\n\t\t\tcoveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) &&\n\t\t\tcoveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams\n\t\t) {\n\t\t\tgracefullyClose(coveredSession);\n\t\t}\n\t}\n};\n\nconst getSessions = ({agent, isFree}) => {\n\tconst result = {};\n\n\t// eslint-disable-next-line guard-for-in\n\tfor (const normalizedOptions in agent.sessions) {\n\t\tconst sessions = agent.sessions[normalizedOptions];\n\n\t\tconst filtered = sessions.filter(session => {\n\t\t\tconst result = session[Agent.kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\n\t\t\treturn isFree ? result : !result;\n\t\t});\n\n\t\tif (filtered.length !== 0) {\n\t\t\tresult[normalizedOptions] = filtered;\n\t\t}\n\t}\n\n\treturn result;\n};\n\nconst gracefullyClose = session => {\n\tsession[kGracefullyClosing] = true;\n\n\tif (session[kCurrentStreamsCount] === 0) {\n\t\tsession.close();\n\t}\n};\n\nclass Agent extends EventEmitter {\n\tconstructor({timeout = 60000, maxSessions = Infinity, maxFreeSessions = 10, maxCachedTlsSessions = 100} = {}) {\n\t\tsuper();\n\n\t\t// A session is considered busy when its current streams count\n\t\t// is equal to or greater than the `maxConcurrentStreams` value.\n\n\t\t// A session is considered free when its current streams count\n\t\t// is less than the `maxConcurrentStreams` value.\n\n\t\t// SESSIONS[NORMALIZED_OPTIONS] = [];\n\t\tthis.sessions = {};\n\n\t\t// The queue for creating new sessions. It looks like this:\n\t\t// QUEUE[NORMALIZED_OPTIONS][NORMALIZED_ORIGIN] = ENTRY_FUNCTION\n\t\t//\n\t\t// The entry function has `listeners`, `completed` and `destroyed` properties.\n\t\t// `listeners` is an array of objects containing `resolve` and `reject` functions.\n\t\t// `completed` is a boolean. It's set to true after ENTRY_FUNCTION is executed.\n\t\t// `destroyed` is a boolean. If it's set to true, the session will be destroyed if hasn't connected yet.\n\t\tthis.queue = {};\n\n\t\t// Each session will use this timeout value.\n\t\tthis.timeout = timeout;\n\n\t\t// Max sessions in total\n\t\tthis.maxSessions = maxSessions;\n\n\t\t// Max free sessions in total\n\t\t// TODO: decreasing `maxFreeSessions` should close some sessions\n\t\tthis.maxFreeSessions = maxFreeSessions;\n\n\t\tthis._freeSessionsCount = 0;\n\t\tthis._sessionsCount = 0;\n\n\t\t// We don't support push streams by default.\n\t\tthis.settings = {\n\t\t\tenablePush: false\n\t\t};\n\n\t\t// Reusing TLS sessions increases performance.\n\t\tthis.tlsSessionCache = new QuickLRU({maxSize: maxCachedTlsSessions});\n\t}\n\n\tstatic normalizeOrigin(url, servername) {\n\t\tif (typeof url === 'string') {\n\t\t\turl = new URL(url);\n\t\t}\n\n\t\tif (servername && url.hostname !== servername) {\n\t\t\turl.hostname = servername;\n\t\t}\n\n\t\treturn url.origin;\n\t}\n\n\tnormalizeOptions(options) {\n\t\tlet normalized = '';\n\n\t\tif (options) {\n\t\t\tfor (const key of nameKeys) {\n\t\t\t\tif (options[key]) {\n\t\t\t\t\tnormalized += `:${options[key]}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn normalized;\n\t}\n\n\t_tryToCreateNewSession(normalizedOptions, normalizedOrigin) {\n\t\tif (!(normalizedOptions in this.queue) || !(normalizedOrigin in this.queue[normalizedOptions])) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t// The entry function can be run only once.\n\t\t// BUG: The session may be never created when:\n\t\t// - the first condition is false AND\n\t\t// - this function is never called with the same arguments in the future.\n\t\tif (this._sessionsCount < this.maxSessions && !item.completed) {\n\t\t\titem.completed = true;\n\n\t\t\titem();\n\t\t}\n\t}\n\n\tgetSession(origin, options, listeners) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (Array.isArray(listeners)) {\n\t\t\t\tlisteners = [...listeners];\n\n\t\t\t\t// Resolve the current promise ASAP, we're just moving the listeners.\n\t\t\t\t// They will be executed at a different time.\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tlisteners = [{resolve, reject}];\n\t\t\t}\n\n\t\t\tconst normalizedOptions = this.normalizeOptions(options);\n\t\t\tconst normalizedOrigin = Agent.normalizeOrigin(origin, options && options.servername);\n\n\t\t\tif (normalizedOrigin === undefined) {\n\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\treject(new TypeError('The `origin` argument needs to be a string or an URL object'));\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.sessions) {\n\t\t\t\tconst sessions = this.sessions[normalizedOptions];\n\n\t\t\t\tlet maxConcurrentStreams = -1;\n\t\t\t\tlet currentStreamsCount = -1;\n\t\t\t\tlet optimalSession;\n\n\t\t\t\t// We could just do this.sessions[normalizedOptions].find(...) but that isn't optimal.\n\t\t\t\t// Additionally, we are looking for session which has biggest current pending streams count.\n\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\tconst sessionMaxConcurrentStreams = session.remoteSettings.maxConcurrentStreams;\n\n\t\t\t\t\tif (sessionMaxConcurrentStreams < maxConcurrentStreams) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (session[kOriginSet].includes(normalizedOrigin)) {\n\t\t\t\t\t\tconst sessionCurrentStreamsCount = session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsessionCurrentStreamsCount >= sessionMaxConcurrentStreams ||\n\t\t\t\t\t\t\tsession[kGracefullyClosing] ||\n\t\t\t\t\t\t\t// Unfortunately the `close` event isn't called immediately,\n\t\t\t\t\t\t\t// so `session.destroyed` is `true`, but `session.closed` is `false`.\n\t\t\t\t\t\t\tsession.destroyed\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We only need set this once.\n\t\t\t\t\t\tif (!optimalSession) {\n\t\t\t\t\t\t\tmaxConcurrentStreams = sessionMaxConcurrentStreams;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// We're looking for the session which has biggest current pending stream count,\n\t\t\t\t\t\t// in order to minimalize the amount of active sessions.\n\t\t\t\t\t\tif (sessionCurrentStreamsCount > currentStreamsCount) {\n\t\t\t\t\t\t\toptimalSession = session;\n\t\t\t\t\t\t\tcurrentStreamsCount = sessionCurrentStreamsCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (optimalSession) {\n\t\t\t\t\t/* istanbul ignore next: safety check */\n\t\t\t\t\tif (listeners.length !== 1) {\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\tconst error = new Error(\n\t\t\t\t\t\t\t\t`Expected the length of listeners to be 1, got ${listeners.length}.\\n` +\n\t\t\t\t\t\t\t\t'Please report this to https://github.com/szmarczak/http2-wrapper/'\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlisteners[0].resolve(optimalSession);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (normalizedOptions in this.queue) {\n\t\t\t\tif (normalizedOrigin in this.queue[normalizedOptions]) {\n\t\t\t\t\t// There's already an item in the queue, just attach ourselves to it.\n\t\t\t\t\tthis.queue[normalizedOptions][normalizedOrigin].listeners.push(...listeners);\n\n\t\t\t\t\t// This shouldn't be executed here.\n\t\t\t\t\t// See the comment inside _tryToCreateNewSession.\n\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.queue[normalizedOptions] = {};\n\t\t\t}\n\n\t\t\t// The entry must be removed from the queue IMMEDIATELY when:\n\t\t\t// 1. the session connects successfully,\n\t\t\t// 2. an error occurs.\n\t\t\tconst removeFromQueue = () => {\n\t\t\t\t// Our entry can be replaced. We cannot remove the new one.\n\t\t\t\tif (normalizedOptions in this.queue && this.queue[normalizedOptions][normalizedOrigin] === entry) {\n\t\t\t\t\tdelete this.queue[normalizedOptions][normalizedOrigin];\n\n\t\t\t\t\tif (Object.keys(this.queue[normalizedOptions]).length === 0) {\n\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// The main logic is here\n\t\t\tconst entry = () => {\n\t\t\t\tconst name = `${normalizedOrigin}:${normalizedOptions}`;\n\t\t\t\tlet receivedSettings = false;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst session = http2.connect(origin, {\n\t\t\t\t\t\tcreateConnection: this.createConnection,\n\t\t\t\t\t\tsettings: this.settings,\n\t\t\t\t\t\tsession: this.tlsSessionCache.get(name),\n\t\t\t\t\t\t...options\n\t\t\t\t\t});\n\t\t\t\t\tsession[kCurrentStreamsCount] = 0;\n\t\t\t\t\tsession[kGracefullyClosing] = false;\n\n\t\t\t\t\tconst isFree = () => session[kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams;\n\t\t\t\t\tlet wasFree = true;\n\n\t\t\t\t\tsession.socket.once('session', tlsSession => {\n\t\t\t\t\t\tthis.tlsSessionCache.set(name, tlsSession);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('error', error => {\n\t\t\t\t\t\t// Listeners are empty when the session successfully connected.\n\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The connection got broken, purge the cache.\n\t\t\t\t\t\tthis.tlsSessionCache.delete(name);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.setTimeout(this.timeout, () => {\n\t\t\t\t\t\t// Terminates all streams owned by this session.\n\t\t\t\t\t\t// TODO: Maybe the streams should have a \"Session timed out\" error?\n\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('close', () => {\n\t\t\t\t\t\tif (receivedSettings) {\n\t\t\t\t\t\t\t// 1. If it wasn't free then no need to decrease because\n\t\t\t\t\t\t\t// it has been decreased already in session.request().\n\t\t\t\t\t\t\t// 2. `stream.once('close')` won't increment the count\n\t\t\t\t\t\t\t// because the session is already closed.\n\t\t\t\t\t\t\tif (wasFree) {\n\t\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._sessionsCount--;\n\n\t\t\t\t\t\t\t// This cannot be moved to the stream logic,\n\t\t\t\t\t\t\t// because there may be a session that hadn't made a single request.\n\t\t\t\t\t\t\tconst where = this.sessions[normalizedOptions];\n\t\t\t\t\t\t\twhere.splice(where.indexOf(session), 1);\n\n\t\t\t\t\t\t\tif (where.length === 0) {\n\t\t\t\t\t\t\t\tdelete this.sessions[normalizedOptions];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Broken connection\n\t\t\t\t\t\t\tconst error = new Error('Session closed without receiving a SETTINGS frame');\n\t\t\t\t\t\t\terror.code = 'HTTP2WRAPPER_NOSETTINGS';\n\n\t\t\t\t\t\t\tfor (const {reject} of listeners) {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tremoveFromQueue();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// There may be another session awaiting.\n\t\t\t\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Iterates over the queue and processes listeners.\n\t\t\t\t\tconst processListeners = () => {\n\t\t\t\t\t\tif (!(normalizedOptions in this.queue) || !isFree()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const origin of session[kOriginSet]) {\n\t\t\t\t\t\t\tif (origin in this.queue[normalizedOptions]) {\n\t\t\t\t\t\t\t\tconst {listeners} = this.queue[normalizedOptions][origin];\n\n\t\t\t\t\t\t\t\t// Prevents session overloading.\n\t\t\t\t\t\t\t\twhile (listeners.length !== 0 && isFree()) {\n\t\t\t\t\t\t\t\t\t// We assume `resolve(...)` calls `request(...)` *directly*,\n\t\t\t\t\t\t\t\t\t// otherwise the session will get overloaded.\n\t\t\t\t\t\t\t\t\tlisteners.shift().resolve(session);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst where = this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\tif (where[origin].listeners.length === 0) {\n\t\t\t\t\t\t\t\t\tdelete where[origin];\n\n\t\t\t\t\t\t\t\t\tif (Object.keys(where).length === 0) {\n\t\t\t\t\t\t\t\t\t\tdelete this.queue[normalizedOptions];\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// We're no longer free, no point in continuing.\n\t\t\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// The Origin Set cannot shrink. No need to check if it suddenly became covered by another one.\n\t\t\t\t\tsession.on('origin', () => {\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\tif (!isFree()) {\n\t\t\t\t\t\t\t// The session is full.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t// Close covered sessions (if possible).\n\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t});\n\n\t\t\t\t\tsession.once('remoteSettings', () => {\n\t\t\t\t\t\t// Fix Node.js bug preventing the process from exiting\n\t\t\t\t\t\tsession.ref();\n\t\t\t\t\t\tsession.unref();\n\n\t\t\t\t\t\tthis._sessionsCount++;\n\n\t\t\t\t\t\t// The Agent could have been destroyed already.\n\t\t\t\t\t\tif (entry.destroyed) {\n\t\t\t\t\t\t\tconst error = new Error('Agent has been destroyed');\n\n\t\t\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsession.destroy();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsession[kOriginSet] = session.originSet;\n\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst where = this.sessions;\n\n\t\t\t\t\t\t\tif (normalizedOptions in where) {\n\t\t\t\t\t\t\t\tconst sessions = where[normalizedOptions];\n\t\t\t\t\t\t\t\tsessions.splice(getSortedIndex(sessions, session, compareSessions), 0, session);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twhere[normalizedOptions] = [session];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._freeSessionsCount += 1;\n\t\t\t\t\t\treceivedSettings = true;\n\n\t\t\t\t\t\tthis.emit('session', session);\n\n\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\tremoveFromQueue();\n\n\t\t\t\t\t\t// TODO: Close last recently used (or least used?) session\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === 0 && this._freeSessionsCount > this.maxFreeSessions) {\n\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if we haven't managed to execute all listeners.\n\t\t\t\t\t\tif (listeners.length !== 0) {\n\t\t\t\t\t\t\t// Request for a new session with predefined listeners.\n\t\t\t\t\t\t\tthis.getSession(normalizedOrigin, options, listeners);\n\t\t\t\t\t\t\tlisteners.length = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// `session.remoteSettings.maxConcurrentStreams` might get increased\n\t\t\t\t\t\tsession.on('remoteSettings', () => {\n\t\t\t\t\t\t\tprocessListeners();\n\n\t\t\t\t\t\t\t// In case the Origin Set changes\n\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t// Shim `session.request()` in order to catch all streams\n\t\t\t\t\tsession[kRequest] = session.request;\n\t\t\t\t\tsession.request = (headers, streamOptions) => {\n\t\t\t\t\t\tif (session[kGracefullyClosing]) {\n\t\t\t\t\t\t\tthrow new Error('The session is gracefully closing. No new streams are allowed.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst stream = session[kRequest](headers, streamOptions);\n\n\t\t\t\t\t\t// The process won't exit until the session is closed or all requests are gone.\n\t\t\t\t\t\tsession.ref();\n\n\t\t\t\t\t\t++session[kCurrentStreamsCount];\n\n\t\t\t\t\t\tif (session[kCurrentStreamsCount] === session.remoteSettings.maxConcurrentStreams) {\n\t\t\t\t\t\t\tthis._freeSessionsCount--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstream.once('close', () => {\n\t\t\t\t\t\t\twasFree = isFree();\n\n\t\t\t\t\t\t\t--session[kCurrentStreamsCount];\n\n\t\t\t\t\t\t\tif (!session.destroyed && !session.closed) {\n\t\t\t\t\t\t\t\tcloseSessionIfCovered(this.sessions[normalizedOptions], session);\n\n\t\t\t\t\t\t\t\tif (isFree() && !session.closed) {\n\t\t\t\t\t\t\t\t\tif (!wasFree) {\n\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount++;\n\n\t\t\t\t\t\t\t\t\t\twasFree = true;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst isEmpty = session[kCurrentStreamsCount] === 0;\n\n\t\t\t\t\t\t\t\t\tif (isEmpty) {\n\t\t\t\t\t\t\t\t\t\tsession.unref();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tisEmpty &&\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tthis._freeSessionsCount > this.maxFreeSessions ||\n\t\t\t\t\t\t\t\t\t\t\tsession[kGracefullyClosing]\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tsession.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tcloseCoveredSessions(this.sessions[normalizedOptions], session);\n\t\t\t\t\t\t\t\t\t\tprocessListeners();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn stream;\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\tlistener.reject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveFromQueue();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tentry.listeners = listeners;\n\t\t\tentry.completed = false;\n\t\t\tentry.destroyed = false;\n\n\t\t\tthis.queue[normalizedOptions][normalizedOrigin] = entry;\n\t\t\tthis._tryToCreateNewSession(normalizedOptions, normalizedOrigin);\n\t\t});\n\t}\n\n\trequest(origin, options, headers, streamOptions) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.getSession(origin, options, [{\n\t\t\t\treject,\n\t\t\t\tresolve: session => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresolve(session.request(headers, streamOptions));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}]);\n\t\t});\n\t}\n\n\tcreateConnection(origin, options) {\n\t\treturn Agent.connect(origin, options);\n\t}\n\n\tstatic connect(origin, options) {\n\t\toptions.ALPNProtocols = ['h2'];\n\n\t\tconst port = origin.port || 443;\n\t\tconst host = origin.hostname || origin.host;\n\n\t\tif (typeof options.servername === 'undefined') {\n\t\t\toptions.servername = host;\n\t\t}\n\n\t\treturn tls.connect(port, host, options);\n\t}\n\n\tcloseFreeSessions() {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tif (session[kCurrentStreamsCount] === 0) {\n\t\t\t\t\tsession.close();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy(reason) {\n\t\tfor (const sessions of Object.values(this.sessions)) {\n\t\t\tfor (const session of sessions) {\n\t\t\t\tsession.destroy(reason);\n\t\t\t}\n\t\t}\n\n\t\tfor (const entriesOfAuthority of Object.values(this.queue)) {\n\t\t\tfor (const entry of Object.values(entriesOfAuthority)) {\n\t\t\t\tentry.destroyed = true;\n\t\t\t}\n\t\t}\n\n\t\t// New requests should NOT attach to destroyed sessions\n\t\tthis.queue = {};\n\t}\n\n\tget freeSessions() {\n\t\treturn getSessions({agent: this, isFree: true});\n\t}\n\n\tget busySessions() {\n\t\treturn getSessions({agent: this, isFree: false});\n\t}\n}\n\nAgent.kCurrentStreamsCount = kCurrentStreamsCount;\nAgent.kGracefullyClosing = kGracefullyClosing;\n\nmodule.exports = {\n\tAgent,\n\tglobalAgent: new Agent()\n};\n", "'use strict';\nconst {Readable} = require('stream');\n\nclass IncomingMessage extends Readable {\n\tconstructor(socket, highWaterMark) {\n\t\tsuper({\n\t\t\thighWaterMark,\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tthis.statusCode = null;\n\t\tthis.statusMessage = '';\n\t\tthis.httpVersion = '2.0';\n\t\tthis.httpVersionMajor = 2;\n\t\tthis.httpVersionMinor = 0;\n\t\tthis.headers = {};\n\t\tthis.trailers = {};\n\t\tthis.req = null;\n\n\t\tthis.aborted = false;\n\t\tthis.complete = false;\n\t\tthis.upgrade = null;\n\n\t\tthis.rawHeaders = [];\n\t\tthis.rawTrailers = [];\n\n\t\tthis.socket = socket;\n\t\tthis.connection = socket;\n\n\t\tthis._dumped = false;\n\t}\n\n\t_destroy(error) {\n\t\tthis.req._request.destroy(error);\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tthis.req.setTimeout(ms, callback);\n\t\treturn this;\n\t}\n\n\t_dump() {\n\t\tif (!this._dumped) {\n\t\t\tthis._dumped = true;\n\n\t\t\tthis.removeAllListeners('data');\n\t\t\tthis.resume();\n\t\t}\n\t}\n\n\t_read() {\n\t\tif (this.req) {\n\t\t\tthis.req._request.resume();\n\t\t}\n\t}\n}\n\nmodule.exports = IncomingMessage;\n", "'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/a91293d4d9ab403046ab5eb022332e4e3d249bd3/lib/internal/url.js#L1257 */\n\nmodule.exports = url => {\n\tconst options = {\n\t\tprotocol: url.protocol,\n\t\thostname: typeof url.hostname === 'string' && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n\t\thost: url.host,\n\t\thash: url.hash,\n\t\tsearch: url.search,\n\t\tpathname: url.pathname,\n\t\thref: url.href,\n\t\tpath: `${url.pathname || ''}${url.search || ''}`\n\t};\n\n\tif (typeof url.port === 'string' && url.port.length !== 0) {\n\t\toptions.port = Number(url.port);\n\t}\n\n\tif (url.username || url.password) {\n\t\toptions.auth = `${url.username || ''}:${url.password || ''}`;\n\t}\n\n\treturn options;\n};\n", "'use strict';\n\nmodule.exports = (from, to, events) => {\n\tfor (const event of events) {\n\t\tfrom.on(event, (...args) => to.emit(event, ...args));\n\t}\n};\n", "'use strict';\n\nmodule.exports = header => {\n\tswitch (header) {\n\t\tcase ':method':\n\t\tcase ':scheme':\n\t\tcase ':authority':\n\t\tcase ':path':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n", "'use strict';\n/* istanbul ignore file: https://github.com/nodejs/node/blob/master/lib/internal/errors.js */\n\nconst makeError = (Base, key, getMessage) => {\n\tmodule.exports[key] = class NodeError extends Base {\n\t\tconstructor(...args) {\n\t\t\tsuper(typeof getMessage === 'string' ? getMessage : getMessage(args));\n\t\t\tthis.name = `${super.name} [${key}]`;\n\t\t\tthis.code = key;\n\t\t}\n\t};\n};\n\nmakeError(TypeError, 'ERR_INVALID_ARG_TYPE', args => {\n\tconst type = args[0].includes('.') ? 'property' : 'argument';\n\n\tlet valid = args[1];\n\tconst isManyTypes = Array.isArray(valid);\n\n\tif (isManyTypes) {\n\t\tvalid = `${valid.slice(0, -1).join(', ')} or ${valid.slice(-1)}`;\n\t}\n\n\treturn `The \"${args[0]}\" ${type} must be ${isManyTypes ? 'one of' : 'of'} type ${valid}. Received ${typeof args[2]}`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_PROTOCOL', args => {\n\treturn `Protocol \"${args[0]}\" not supported. Expected \"${args[1]}\"`;\n});\n\nmakeError(Error, 'ERR_HTTP_HEADERS_SENT', args => {\n\treturn `Cannot ${args[0]} headers after they are sent to the client`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_HTTP_TOKEN', args => {\n\treturn `${args[0]} must be a valid HTTP token [${args[1]}]`;\n});\n\nmakeError(TypeError, 'ERR_HTTP_INVALID_HEADER_VALUE', args => {\n\treturn `Invalid value \"${args[0]} for header \"${args[1]}\"`;\n});\n\nmakeError(TypeError, 'ERR_INVALID_CHAR', args => {\n\treturn `Invalid character in ${args[0]} [${args[1]}]`;\n});\n", "'use strict';\nconst http2 = require('http2');\nconst {Writable} = require('stream');\nconst {Agent, globalAgent} = require('./agent');\nconst IncomingMessage = require('./incoming-message');\nconst urlToOptions = require('./utils/url-to-options');\nconst proxyEvents = require('./utils/proxy-events');\nconst isRequestPseudoHeader = require('./utils/is-request-pseudo-header');\nconst {\n\tERR_INVALID_ARG_TYPE,\n\tERR_INVALID_PROTOCOL,\n\tERR_HTTP_HEADERS_SENT,\n\tERR_INVALID_HTTP_TOKEN,\n\tERR_HTTP_INVALID_HEADER_VALUE,\n\tERR_INVALID_CHAR\n} = require('./utils/errors');\n\nconst {\n\tHTTP2_HEADER_STATUS,\n\tHTTP2_HEADER_METHOD,\n\tHTTP2_HEADER_PATH,\n\tHTTP2_METHOD_CONNECT\n} = http2.constants;\n\nconst kHeaders = Symbol('headers');\nconst kOrigin = Symbol('origin');\nconst kSession = Symbol('session');\nconst kOptions = Symbol('options');\nconst kFlushedHeaders = Symbol('flushedHeaders');\nconst kJobs = Symbol('jobs');\n\nconst isValidHttpToken = /^[\\^`\\-\\w!#$%&*+.|~]+$/;\nconst isInvalidHeaderValue = /[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/;\n\nclass ClientRequest extends Writable {\n\tconstructor(input, options, callback) {\n\t\tsuper({\n\t\t\tautoDestroy: false\n\t\t});\n\n\t\tconst hasInput = typeof input === 'string' || input instanceof URL;\n\t\tif (hasInput) {\n\t\t\tinput = urlToOptions(input instanceof URL ? input : new URL(input));\n\t\t}\n\n\t\tif (typeof options === 'function' || options === undefined) {\n\t\t\t// (options, callback)\n\t\t\tcallback = options;\n\t\t\toptions = hasInput ? input : {...input};\n\t\t} else {\n\t\t\t// (input, options, callback)\n\t\t\toptions = {...input, ...options};\n\t\t}\n\n\t\tif (options.h2session) {\n\t\t\tthis[kSession] = options.h2session;\n\t\t} else if (options.agent === false) {\n\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t} else if (typeof options.agent === 'undefined' || options.agent === null) {\n\t\t\tif (typeof options.createConnection === 'function') {\n\t\t\t\t// This is a workaround - we don't have to create the session on our own.\n\t\t\t\tthis.agent = new Agent({maxFreeSessions: 0});\n\t\t\t\tthis.agent.createConnection = options.createConnection;\n\t\t\t} else {\n\t\t\t\tthis.agent = globalAgent;\n\t\t\t}\n\t\t} else if (typeof options.agent.request === 'function') {\n\t\t\tthis.agent = options.agent;\n\t\t} else {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('options.agent', ['Agent-like Object', 'undefined', 'false'], options.agent);\n\t\t}\n\n\t\tif (options.protocol && options.protocol !== 'https:') {\n\t\t\tthrow new ERR_INVALID_PROTOCOL(options.protocol, 'https:');\n\t\t}\n\n\t\tconst port = options.port || options.defaultPort || (this.agent && this.agent.defaultPort) || 443;\n\t\tconst host = options.hostname || options.host || 'localhost';\n\n\t\t// Don't enforce the origin via options. It may be changed in an Agent.\n\t\tdelete options.hostname;\n\t\tdelete options.host;\n\t\tdelete options.port;\n\n\t\tconst {timeout} = options;\n\t\toptions.timeout = undefined;\n\n\t\tthis[kHeaders] = Object.create(null);\n\t\tthis[kJobs] = [];\n\n\t\tthis.socket = null;\n\t\tthis.connection = null;\n\n\t\tthis.method = options.method || 'GET';\n\t\tthis.path = options.path;\n\n\t\tthis.res = null;\n\t\tthis.aborted = false;\n\t\tthis.reusedSocket = false;\n\n\t\tif (options.headers) {\n\t\t\tfor (const [header, value] of Object.entries(options.headers)) {\n\t\t\t\tthis.setHeader(header, value);\n\t\t\t}\n\t\t}\n\n\t\tif (options.auth && !('authorization' in this[kHeaders])) {\n\t\t\tthis[kHeaders].authorization = 'Basic ' + Buffer.from(options.auth).toString('base64');\n\t\t}\n\n\t\toptions.session = options.tlsSession;\n\t\toptions.path = options.socketPath;\n\n\t\tthis[kOptions] = options;\n\n\t\t// Clients that generate HTTP/2 requests directly SHOULD use the :authority pseudo-header field instead of the Host header field.\n\t\tif (port === 443) {\n\t\t\tthis[kOrigin] = `https://${host}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = host;\n\t\t\t}\n\t\t} else {\n\t\t\tthis[kOrigin] = `https://${host}:${port}`;\n\n\t\t\tif (!(':authority' in this[kHeaders])) {\n\t\t\t\tthis[kHeaders][':authority'] = `${host}:${port}`;\n\t\t\t}\n\t\t}\n\n\t\tif (timeout) {\n\t\t\tthis.setTimeout(timeout);\n\t\t}\n\n\t\tif (callback) {\n\t\t\tthis.once('response', callback);\n\t\t}\n\n\t\tthis[kFlushedHeaders] = false;\n\t}\n\n\tget method() {\n\t\treturn this[kHeaders][HTTP2_HEADER_METHOD];\n\t}\n\n\tset method(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_METHOD] = value.toUpperCase();\n\t\t}\n\t}\n\n\tget path() {\n\t\treturn this[kHeaders][HTTP2_HEADER_PATH];\n\t}\n\n\tset path(value) {\n\t\tif (value) {\n\t\t\tthis[kHeaders][HTTP2_HEADER_PATH] = value;\n\t\t}\n\t}\n\n\tget _mustNotHaveABody() {\n\t\treturn this.method === 'GET' || this.method === 'HEAD' || this.method === 'DELETE';\n\t}\n\n\t_write(chunk, encoding, callback) {\n\t\t// https://github.com/nodejs/node/blob/654df09ae0c5e17d1b52a900a545f0664d8c7627/lib/internal/http2/util.js#L148-L156\n\t\tif (this._mustNotHaveABody) {\n\t\t\tcallback(new Error('The GET, HEAD and DELETE methods must NOT have a body'));\n\t\t\t/* istanbul ignore next: Node.js 12 throws directly */\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callWrite = () => this._request.write(chunk, encoding, callback);\n\t\tif (this._request) {\n\t\t\tcallWrite();\n\t\t} else {\n\t\t\tthis[kJobs].push(callWrite);\n\t\t}\n\t}\n\n\t_final(callback) {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.flushHeaders();\n\n\t\tconst callEnd = () => {\n\t\t\t// For GET, HEAD and DELETE\n\t\t\tif (this._mustNotHaveABody) {\n\t\t\t\tcallback();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._request.end(callback);\n\t\t};\n\n\t\tif (this._request) {\n\t\t\tcallEnd();\n\t\t} else {\n\t\t\tthis[kJobs].push(callEnd);\n\t\t}\n\t}\n\n\tabort() {\n\t\tif (this.res && this.res.complete) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.aborted) {\n\t\t\tprocess.nextTick(() => this.emit('abort'));\n\t\t}\n\n\t\tthis.aborted = true;\n\n\t\tthis.destroy();\n\t}\n\n\t_destroy(error, callback) {\n\t\tif (this.res) {\n\t\t\tthis.res._dump();\n\t\t}\n\n\t\tif (this._request) {\n\t\t\tthis._request.destroy();\n\t\t}\n\n\t\tcallback(error);\n\t}\n\n\tasync flushHeaders() {\n\t\tif (this[kFlushedHeaders] || this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis[kFlushedHeaders] = true;\n\n\t\tconst isConnectMethod = this.method === HTTP2_METHOD_CONNECT;\n\n\t\t// The real magic is here\n\t\tconst onStream = stream => {\n\t\t\tthis._request = stream;\n\n\t\t\tif (this.destroyed) {\n\t\t\t\tstream.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Forwards `timeout`, `continue`, `close` and `error` events to this instance.\n\t\t\tif (!isConnectMethod) {\n\t\t\t\tproxyEvents(stream, this, ['timeout', 'continue', 'close', 'error']);\n\t\t\t}\n\n\t\t\t// Wait for the `finish` event. We don't want to emit the `response` event\n\t\t\t// before `request.end()` is called.\n\t\t\tconst waitForEnd = fn => {\n\t\t\t\treturn (...args) => {\n\t\t\t\t\tif (!this.writable && !this.destroyed) {\n\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.once('finish', () => {\n\t\t\t\t\t\t\tfn(...args);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t// This event tells we are ready to listen for the data.\n\t\t\tstream.once('response', waitForEnd((headers, flags, rawHeaders) => {\n\t\t\t\t// If we were to emit raw request stream, it would be as fast as the native approach.\n\t\t\t\t// Note that wrapping the raw stream in a Proxy instance won't improve the performance (already tested it).\n\t\t\t\tconst response = new IncomingMessage(this.socket, stream.readableHighWaterMark);\n\t\t\t\tthis.res = response;\n\n\t\t\t\tresponse.req = this;\n\t\t\t\tresponse.statusCode = headers[HTTP2_HEADER_STATUS];\n\t\t\t\tresponse.headers = headers;\n\t\t\t\tresponse.rawHeaders = rawHeaders;\n\n\t\t\t\tresponse.once('end', () => {\n\t\t\t\t\tif (this.aborted) {\n\t\t\t\t\t\tresponse.aborted = true;\n\t\t\t\t\t\tresponse.emit('aborted');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.complete = true;\n\n\t\t\t\t\t\t// Has no effect, just be consistent with the Node.js behavior\n\t\t\t\t\t\tresponse.socket = null;\n\t\t\t\t\t\tresponse.connection = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (isConnectMethod) {\n\t\t\t\t\tresponse.upgrade = true;\n\n\t\t\t\t\t// The HTTP1 API says the socket is detached here,\n\t\t\t\t\t// but we can't do that so we pass the original HTTP2 request.\n\t\t\t\t\tif (this.emit('connect', response, stream, Buffer.alloc(0))) {\n\t\t\t\t\t\tthis.emit('close');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No listeners attached, destroy the original request.\n\t\t\t\t\t\tstream.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Forwards data\n\t\t\t\t\tstream.on('data', chunk => {\n\t\t\t\t\t\tif (!response._dumped && !response.push(chunk)) {\n\t\t\t\t\t\t\tstream.pause();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.once('end', () => {\n\t\t\t\t\t\tresponse.push(null);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!this.emit('response', response)) {\n\t\t\t\t\t\t// No listeners attached, dump the response.\n\t\t\t\t\t\tresponse._dump();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t\t// Emits `information` event\n\t\t\tstream.once('headers', waitForEnd(\n\t\t\t\theaders => this.emit('information', {statusCode: headers[HTTP2_HEADER_STATUS]})\n\t\t\t));\n\n\t\t\tstream.once('trailers', waitForEnd((trailers, flags, rawTrailers) => {\n\t\t\t\tconst {res} = this;\n\n\t\t\t\t// Assigns trailers to the response object.\n\t\t\t\tres.trailers = trailers;\n\t\t\t\tres.rawTrailers = rawTrailers;\n\t\t\t}));\n\n\t\t\tconst {socket} = stream.session;\n\t\t\tthis.socket = socket;\n\t\t\tthis.connection = socket;\n\n\t\t\tfor (const job of this[kJobs]) {\n\t\t\t\tjob();\n\t\t\t}\n\n\t\t\tthis.emit('socket', this.socket);\n\t\t};\n\n\t\t// Makes a HTTP2 request\n\t\tif (this[kSession]) {\n\t\t\ttry {\n\t\t\t\tonStream(this[kSession].request(this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.reusedSocket = true;\n\n\t\t\ttry {\n\t\t\t\tonStream(await this.agent.request(this[kOrigin], this[kOptions], this[kHeaders]));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emit('error', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\treturn this[kHeaders][name.toLowerCase()];\n\t}\n\n\tget headersSent() {\n\t\treturn this[kFlushedHeaders];\n\t}\n\n\tremoveHeader(name) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new ERR_INVALID_ARG_TYPE('name', 'string', name);\n\t\t}\n\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('remove');\n\t\t}\n\n\t\tdelete this[kHeaders][name.toLowerCase()];\n\t}\n\n\tsetHeader(name, value) {\n\t\tif (this.headersSent) {\n\t\t\tthrow new ERR_HTTP_HEADERS_SENT('set');\n\t\t}\n\n\t\tif (typeof name !== 'string' || (!isValidHttpToken.test(name) && !isRequestPseudoHeader(name))) {\n\t\t\tthrow new ERR_INVALID_HTTP_TOKEN('Header name', name);\n\t\t}\n\n\t\tif (typeof value === 'undefined') {\n\t\t\tthrow new ERR_HTTP_INVALID_HEADER_VALUE(value, name);\n\t\t}\n\n\t\tif (isInvalidHeaderValue.test(value)) {\n\t\t\tthrow new ERR_INVALID_CHAR('header content', name);\n\t\t}\n\n\t\tthis[kHeaders][name.toLowerCase()] = value;\n\t}\n\n\tsetNoDelay() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetSocketKeepAlive() {\n\t\t// HTTP2 sockets cannot be malformed, do nothing.\n\t}\n\n\tsetTimeout(ms, callback) {\n\t\tconst applyTimeout = () => this._request.setTimeout(ms, callback);\n\n\t\tif (this._request) {\n\t\t\tapplyTimeout();\n\t\t} else {\n\t\t\tthis[kJobs].push(applyTimeout);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tget maxHeadersCount() {\n\t\tif (!this.destroyed && this._request) {\n\t\t\treturn this._request.session.localSettings.maxHeaderListSize;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tset maxHeadersCount(_value) {\n\t\t// Updating HTTP2 settings would affect all requests, do nothing.\n\t}\n}\n\nmodule.exports = ClientRequest;\n", "'use strict';\nconst tls = require('tls');\n\nmodule.exports = (options = {}, connect = tls.connect) => new Promise((resolve, reject) => {\n\tlet timeout = false;\n\n\tlet socket;\n\n\tconst callback = async () => {\n\t\tawait socketPromise;\n\n\t\tsocket.off('timeout', onTimeout);\n\t\tsocket.off('error', reject);\n\n\t\tif (options.resolveSocket) {\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, socket, timeout});\n\n\t\t\tif (timeout) {\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tsocket.emit('timeout');\n\t\t\t}\n\t\t} else {\n\t\t\tsocket.destroy();\n\t\t\tresolve({alpnProtocol: socket.alpnProtocol, timeout});\n\t\t}\n\t};\n\n\tconst onTimeout = async () => {\n\t\ttimeout = true;\n\t\tcallback();\n\t};\n\n\tconst socketPromise = (async () => {\n\t\ttry {\n\t\t\tsocket = await connect(options, callback);\n\n\t\t\tsocket.on('error', reject);\n\t\t\tsocket.once('timeout', onTimeout);\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t})();\n});\n", "'use strict';\nconst net = require('net');\n/* istanbul ignore file: https://github.com/nodejs/node/blob/v13.0.1/lib/_http_agent.js */\n\nmodule.exports = options => {\n\tlet servername = options.host;\n\tconst hostHeader = options.headers && options.headers.host;\n\n\tif (hostHeader) {\n\t\tif (hostHeader.startsWith('[')) {\n\t\t\tconst index = hostHeader.indexOf(']');\n\t\t\tif (index === -1) {\n\t\t\t\tservername = hostHeader;\n\t\t\t} else {\n\t\t\t\tservername = hostHeader.slice(1, -1);\n\t\t\t}\n\t\t} else {\n\t\t\tservername = hostHeader.split(':', 1)[0];\n\t\t}\n\t}\n\n\tif (net.isIP(servername)) {\n\t\treturn '';\n\t}\n\n\treturn servername;\n};\n", "'use strict';\nconst http = require('http');\nconst https = require('https');\nconst resolveALPN = require('resolve-alpn');\nconst QuickLRU = require('quick-lru');\nconst Http2ClientRequest = require('./client-request');\nconst calculateServerName = require('./utils/calculate-server-name');\nconst urlToOptions = require('./utils/url-to-options');\n\nconst cache = new QuickLRU({maxSize: 100});\nconst queue = new Map();\n\nconst installSocket = (agent, socket, options) => {\n\tsocket._httpMessage = {shouldKeepAlive: true};\n\n\tconst onFree = () => {\n\t\tagent.emit('free', socket, options);\n\t};\n\n\tsocket.on('free', onFree);\n\n\tconst onClose = () => {\n\t\tagent.removeSocket(socket, options);\n\t};\n\n\tsocket.on('close', onClose);\n\n\tconst onRemove = () => {\n\t\tagent.removeSocket(socket, options);\n\t\tsocket.off('close', onClose);\n\t\tsocket.off('free', onFree);\n\t\tsocket.off('agentRemove', onRemove);\n\t};\n\n\tsocket.on('agentRemove', onRemove);\n\n\tagent.emit('free', socket, options);\n};\n\nconst resolveProtocol = async options => {\n\tconst name = `${options.host}:${options.port}:${options.ALPNProtocols.sort()}`;\n\n\tif (!cache.has(name)) {\n\t\tif (queue.has(name)) {\n\t\t\tconst result = await queue.get(name);\n\t\t\treturn result.alpnProtocol;\n\t\t}\n\n\t\tconst {path, agent} = options;\n\t\toptions.path = options.socketPath;\n\n\t\tconst resultPromise = resolveALPN(options);\n\t\tqueue.set(name, resultPromise);\n\n\t\ttry {\n\t\t\tconst {socket, alpnProtocol} = await resultPromise;\n\t\t\tcache.set(name, alpnProtocol);\n\n\t\t\toptions.path = path;\n\n\t\t\tif (alpnProtocol === 'h2') {\n\t\t\t\t// https://github.com/nodejs/node/issues/33343\n\t\t\t\tsocket.destroy();\n\t\t\t} else {\n\t\t\t\tconst {globalAgent} = https;\n\t\t\t\tconst defaultCreateConnection = https.Agent.prototype.createConnection;\n\n\t\t\t\tif (agent) {\n\t\t\t\t\tif (agent.createConnection === defaultCreateConnection) {\n\t\t\t\t\t\tinstallSocket(agent, socket, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t} else if (globalAgent.createConnection === defaultCreateConnection) {\n\t\t\t\t\tinstallSocket(globalAgent, socket, options);\n\t\t\t\t} else {\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tqueue.delete(name);\n\n\t\t\treturn alpnProtocol;\n\t\t} catch (error) {\n\t\t\tqueue.delete(name);\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\treturn cache.get(name);\n};\n\nmodule.exports = async (input, options, callback) => {\n\tif (typeof input === 'string' || input instanceof URL) {\n\t\tinput = urlToOptions(new URL(input));\n\t}\n\n\tif (typeof options === 'function') {\n\t\tcallback = options;\n\t\toptions = undefined;\n\t}\n\n\toptions = {\n\t\tALPNProtocols: ['h2', 'http/1.1'],\n\t\t...input,\n\t\t...options,\n\t\tresolveSocket: true\n\t};\n\n\tif (!Array.isArray(options.ALPNProtocols) || options.ALPNProtocols.length === 0) {\n\t\tthrow new Error('The `ALPNProtocols` option must be an Array with at least one entry');\n\t}\n\n\toptions.protocol = options.protocol || 'https:';\n\tconst isHttps = options.protocol === 'https:';\n\n\toptions.host = options.hostname || options.host || 'localhost';\n\toptions.session = options.tlsSession;\n\toptions.servername = options.servername || calculateServerName(options);\n\toptions.port = options.port || (isHttps ? 443 : 80);\n\toptions._defaultAgent = isHttps ? https.globalAgent : http.globalAgent;\n\n\tconst agents = options.agent;\n\n\tif (agents) {\n\t\tif (agents.addRequest) {\n\t\t\tthrow new Error('The `options.agent` object can contain only `http`, `https` or `http2` properties');\n\t\t}\n\n\t\toptions.agent = agents[isHttps ? 'https' : 'http'];\n\t}\n\n\tif (isHttps) {\n\t\tconst protocol = await resolveProtocol(options);\n\n\t\tif (protocol === 'h2') {\n\t\t\tif (agents) {\n\t\t\t\toptions.agent = agents.http2;\n\t\t\t}\n\n\t\t\treturn new Http2ClientRequest(options, callback);\n\t\t}\n\t}\n\n\treturn http.request(options, callback);\n};\n\nmodule.exports.protocolCache = cache;\n", "'use strict';\nconst http2 = require('http2');\nconst agent = require('./agent');\nconst ClientRequest = require('./client-request');\nconst IncomingMessage = require('./incoming-message');\nconst auto = require('./auto');\n\nconst request = (url, options, callback) => {\n\treturn new ClientRequest(url, options, callback);\n};\n\nconst get = (url, options, callback) => {\n\t// eslint-disable-next-line unicorn/prevent-abbreviations\n\tconst req = new ClientRequest(url, options, callback);\n\treq.end();\n\n\treturn req;\n};\n\nmodule.exports = {\n\t...http2,\n\tClientRequest,\n\tIncomingMessage,\n\t...agent,\n\trequest,\n\tget,\n\tauto\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (body) => is_1.default.nodeStream(body) && is_1.default.function_(body.getBoundary);\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs_1 = require(\"fs\");\nconst util_1 = require(\"util\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst is_form_data_1 = require(\"./is-form-data\");\nconst statAsync = util_1.promisify(fs_1.stat);\nexports.default = async (body, headers) => {\n if (headers && 'content-length' in headers) {\n return Number(headers['content-length']);\n }\n if (!body) {\n return 0;\n }\n if (is_1.default.string(body)) {\n return Buffer.byteLength(body);\n }\n if (is_1.default.buffer(body)) {\n return body.length;\n }\n if (is_form_data_1.default(body)) {\n return util_1.promisify(body.getLength.bind(body))();\n }\n if (body instanceof fs_1.ReadStream) {\n const { size } = await statAsync(body.path);\n if (size === 0) {\n return undefined;\n }\n return size;\n }\n return undefined;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction default_1(from, to, events) {\n const fns = {};\n for (const event of events) {\n fns[event] = (...args) => {\n to.emit(event, ...args);\n };\n from.on(event, fns[event]);\n }\n return () => {\n for (const event of events) {\n from.off(event, fns[event]);\n }\n };\n}\nexports.default = default_1;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// When attaching listeners, it's very easy to forget about them.\n// Especially if you do error handling and set timeouts.\n// So instead of checking if it's proper to throw an error on every timeout ever,\n// use this simple tool which will remove all listeners you have attached.\nexports.default = () => {\n const handlers = [];\n return {\n once(origin, event, fn) {\n origin.once(event, fn);\n handlers.push({ origin, event, fn });\n },\n unhandleAll() {\n for (const handler of handlers) {\n const { origin, event, fn } = handler;\n origin.removeListener(event, fn);\n }\n handlers.length = 0;\n }\n };\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TimeoutError = void 0;\nconst net = require(\"net\");\nconst unhandle_1 = require(\"./unhandle\");\nconst reentry = Symbol('reentry');\nconst noop = () => { };\nclass TimeoutError extends Error {\n constructor(threshold, event) {\n super(`Timeout awaiting '${event}' for ${threshold}ms`);\n this.event = event;\n this.name = 'TimeoutError';\n this.code = 'ETIMEDOUT';\n }\n}\nexports.TimeoutError = TimeoutError;\nexports.default = (request, delays, options) => {\n if (reentry in request) {\n return noop;\n }\n request[reentry] = true;\n const cancelers = [];\n const { once, unhandleAll } = unhandle_1.default();\n const addTimeout = (delay, callback, event) => {\n var _a;\n const timeout = setTimeout(callback, delay, delay, event);\n (_a = timeout.unref) === null || _a === void 0 ? void 0 : _a.call(timeout);\n const cancel = () => {\n clearTimeout(timeout);\n };\n cancelers.push(cancel);\n return cancel;\n };\n const { host, hostname } = options;\n const timeoutHandler = (delay, event) => {\n request.destroy(new TimeoutError(delay, event));\n };\n const cancelTimeouts = () => {\n for (const cancel of cancelers) {\n cancel();\n }\n unhandleAll();\n };\n request.once('error', error => {\n cancelTimeouts();\n // Save original behavior\n /* istanbul ignore next */\n if (request.listenerCount('error') === 0) {\n throw error;\n }\n });\n request.once('close', cancelTimeouts);\n once(request, 'response', (response) => {\n once(response, 'end', cancelTimeouts);\n });\n if (typeof delays.request !== 'undefined') {\n addTimeout(delays.request, timeoutHandler, 'request');\n }\n if (typeof delays.socket !== 'undefined') {\n const socketTimeoutHandler = () => {\n timeoutHandler(delays.socket, 'socket');\n };\n request.setTimeout(delays.socket, socketTimeoutHandler);\n // `request.setTimeout(0)` causes a memory leak.\n // We can just remove the listener and forget about the timer - it's unreffed.\n // See https://github.com/sindresorhus/got/issues/690\n cancelers.push(() => {\n request.removeListener('timeout', socketTimeoutHandler);\n });\n }\n once(request, 'socket', (socket) => {\n var _a;\n const { socketPath } = request;\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n const hasPath = Boolean(socketPath !== null && socketPath !== void 0 ? socketPath : net.isIP((_a = hostname !== null && hostname !== void 0 ? hostname : host) !== null && _a !== void 0 ? _a : '') !== 0);\n if (typeof delays.lookup !== 'undefined' && !hasPath && typeof socket.address().address === 'undefined') {\n const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup');\n once(socket, 'lookup', cancelTimeout);\n }\n if (typeof delays.connect !== 'undefined') {\n const timeConnect = () => addTimeout(delays.connect, timeoutHandler, 'connect');\n if (hasPath) {\n once(socket, 'connect', timeConnect());\n }\n else {\n once(socket, 'lookup', (error) => {\n if (error === null) {\n once(socket, 'connect', timeConnect());\n }\n });\n }\n }\n if (typeof delays.secureConnect !== 'undefined' && options.protocol === 'https:') {\n once(socket, 'connect', () => {\n const cancelTimeout = addTimeout(delays.secureConnect, timeoutHandler, 'secureConnect');\n once(socket, 'secureConnect', cancelTimeout);\n });\n }\n }\n if (typeof delays.send !== 'undefined') {\n const timeRequest = () => addTimeout(delays.send, timeoutHandler, 'send');\n /* istanbul ignore next: hard to test */\n if (socket.connecting) {\n once(socket, 'connect', () => {\n once(request, 'upload-complete', timeRequest());\n });\n }\n else {\n once(request, 'upload-complete', timeRequest());\n }\n }\n });\n if (typeof delays.response !== 'undefined') {\n once(request, 'upload-complete', () => {\n const cancelTimeout = addTimeout(delays.response, timeoutHandler, 'response');\n once(request, 'response', cancelTimeout);\n });\n }\n return cancelTimeouts;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nexports.default = (url) => {\n // Cast to URL\n url = url;\n const options = {\n protocol: url.protocol,\n hostname: is_1.default.string(url.hostname) && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,\n host: url.host,\n hash: url.hash,\n search: url.search,\n pathname: url.pathname,\n href: url.href,\n path: `${url.pathname || ''}${url.search || ''}`\n };\n if (is_1.default.string(url.port) && url.port.length > 0) {\n options.port = Number(url.port);\n }\n if (url.username || url.password) {\n options.auth = `${url.username || ''}:${url.password || ''}`;\n }\n return options;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/* istanbul ignore file: deprecated */\nconst url_1 = require(\"url\");\nconst keys = [\n 'protocol',\n 'host',\n 'hostname',\n 'port',\n 'pathname',\n 'search'\n];\nexports.default = (origin, options) => {\n var _a, _b;\n if (options.path) {\n if (options.pathname) {\n throw new TypeError('Parameters `path` and `pathname` are mutually exclusive.');\n }\n if (options.search) {\n throw new TypeError('Parameters `path` and `search` are mutually exclusive.');\n }\n if (options.searchParams) {\n throw new TypeError('Parameters `path` and `searchParams` are mutually exclusive.');\n }\n }\n if (options.search && options.searchParams) {\n throw new TypeError('Parameters `search` and `searchParams` are mutually exclusive.');\n }\n if (!origin) {\n if (!options.protocol) {\n throw new TypeError('No URL protocol specified');\n }\n origin = `${options.protocol}//${(_b = (_a = options.hostname) !== null && _a !== void 0 ? _a : options.host) !== null && _b !== void 0 ? _b : ''}`;\n }\n const url = new url_1.URL(origin);\n if (options.path) {\n const searchIndex = options.path.indexOf('?');\n if (searchIndex === -1) {\n options.pathname = options.path;\n }\n else {\n options.pathname = options.path.slice(0, searchIndex);\n options.search = options.path.slice(searchIndex + 1);\n }\n delete options.path;\n }\n for (const key of keys) {\n if (options[key]) {\n url[key] = options[key].toString();\n }\n }\n return url;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass WeakableMap {\n constructor() {\n this.weakMap = new WeakMap();\n this.map = new Map();\n }\n set(key, value) {\n if (typeof key === 'object') {\n this.weakMap.set(key, value);\n }\n else {\n this.map.set(key, value);\n }\n }\n get(key) {\n if (typeof key === 'object') {\n return this.weakMap.get(key);\n }\n return this.map.get(key);\n }\n has(key) {\n if (typeof key === 'object') {\n return this.weakMap.has(key);\n }\n return this.map.has(key);\n }\n}\nexports.default = WeakableMap;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// TODO: Update https://github.com/sindresorhus/get-stream\nconst getBuffer = async (stream) => {\n const chunks = [];\n let length = 0;\n for await (const chunk of stream) {\n chunks.push(chunk);\n length += Buffer.byteLength(chunk);\n }\n if (Buffer.isBuffer(chunks[0])) {\n return Buffer.concat(chunks, length);\n }\n return Buffer.from(chunks.join(''));\n};\nexports.default = getBuffer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.dnsLookupIpVersionToFamily = exports.isDnsLookupIpVersion = void 0;\nconst conversionTable = {\n auto: 0,\n ipv4: 4,\n ipv6: 6\n};\nexports.isDnsLookupIpVersion = (value) => {\n return value in conversionTable;\n};\nexports.dnsLookupIpVersionToFamily = (dnsLookupIpVersion) => {\n if (exports.isDnsLookupIpVersion(dnsLookupIpVersion)) {\n return conversionTable[dnsLookupIpVersion];\n }\n throw new Error('Invalid DNS lookup IP version');\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isResponseOk = void 0;\nexports.isResponseOk = (response) => {\n const { statusCode } = response;\n const limitStatusCode = response.request.options.followRedirect ? 299 : 399;\n return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304;\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst alreadyWarned = new Set();\nexports.default = (message) => {\n if (alreadyWarned.has(message)) {\n return;\n }\n alreadyWarned.add(message);\n // @ts-expect-error Missing types.\n process.emitWarning(`Got: ${message}`, {\n type: 'DeprecationWarning'\n });\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nconst normalizeArguments = (options, defaults) => {\n if (is_1.default.null_(options.encoding)) {\n throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead');\n }\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.encoding);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.resolveBodyOnly);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.methodRewriting);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.isStream);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.responseType);\n // `options.responseType`\n if (options.responseType === undefined) {\n options.responseType = 'text';\n }\n // `options.retry`\n const { retry } = options;\n if (defaults) {\n options.retry = { ...defaults.retry };\n }\n else {\n options.retry = {\n calculateDelay: retryObject => retryObject.computedValue,\n limit: 0,\n methods: [],\n statusCodes: [],\n errorCodes: [],\n maxRetryAfter: undefined\n };\n }\n if (is_1.default.object(retry)) {\n options.retry = {\n ...options.retry,\n ...retry\n };\n options.retry.methods = [...new Set(options.retry.methods.map(method => method.toUpperCase()))];\n options.retry.statusCodes = [...new Set(options.retry.statusCodes)];\n options.retry.errorCodes = [...new Set(options.retry.errorCodes)];\n }\n else if (is_1.default.number(retry)) {\n options.retry.limit = retry;\n }\n if (is_1.default.undefined(options.retry.maxRetryAfter)) {\n options.retry.maxRetryAfter = Math.min(\n // TypeScript is not smart enough to handle `.filter(x => is.number(x))`.\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n ...[options.timeout.request, options.timeout.connect].filter(is_1.default.number));\n }\n // `options.pagination`\n if (is_1.default.object(options.pagination)) {\n if (defaults) {\n options.pagination = {\n ...defaults.pagination,\n ...options.pagination\n };\n }\n const { pagination } = options;\n if (!is_1.default.function_(pagination.transform)) {\n throw new Error('`options.pagination.transform` must be implemented');\n }\n if (!is_1.default.function_(pagination.shouldContinue)) {\n throw new Error('`options.pagination.shouldContinue` must be implemented');\n }\n if (!is_1.default.function_(pagination.filter)) {\n throw new TypeError('`options.pagination.filter` must be implemented');\n }\n if (!is_1.default.function_(pagination.paginate)) {\n throw new Error('`options.pagination.paginate` must be implemented');\n }\n }\n // JSON mode\n if (options.responseType === 'json' && options.headers.accept === undefined) {\n options.headers.accept = 'application/json';\n }\n return options;\n};\nexports.default = normalizeArguments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryAfterStatusCodes = void 0;\nexports.retryAfterStatusCodes = new Set([413, 429, 503]);\nconst calculateRetryDelay = ({ attemptCount, retryOptions, error, retryAfter }) => {\n if (attemptCount > retryOptions.limit) {\n return 0;\n }\n const hasMethod = retryOptions.methods.includes(error.options.method);\n const hasErrorCode = retryOptions.errorCodes.includes(error.code);\n const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode);\n if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {\n return 0;\n }\n if (error.response) {\n if (retryAfter) {\n if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) {\n return 0;\n }\n return retryAfter;\n }\n if (error.response.statusCode === 413) {\n return 0;\n }\n }\n const noise = Math.random() * 100;\n return ((2 ** (attemptCount - 1)) * 1000) + noise;\n};\nexports.default = calculateRetryDelay;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnsupportedProtocolError = exports.ReadError = exports.TimeoutError = exports.UploadError = exports.CacheError = exports.HTTPError = exports.MaxRedirectsError = exports.RequestError = exports.setNonEnumerableProperties = exports.knownHookEvents = exports.withoutBody = exports.kIsNormalizedAlready = void 0;\nconst util_1 = require(\"util\");\nconst stream_1 = require(\"stream\");\nconst fs_1 = require(\"fs\");\nconst url_1 = require(\"url\");\nconst http = require(\"http\");\nconst http_1 = require(\"http\");\nconst https = require(\"https\");\nconst http_timer_1 = require(\"@szmarczak/http-timer\");\nconst cacheable_lookup_1 = require(\"cacheable-lookup\");\nconst CacheableRequest = require(\"cacheable-request\");\nconst decompressResponse = require(\"decompress-response\");\n// @ts-expect-error Missing types\nconst http2wrapper = require(\"http2-wrapper\");\nconst lowercaseKeys = require(\"lowercase-keys\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst get_body_size_1 = require(\"./utils/get-body-size\");\nconst is_form_data_1 = require(\"./utils/is-form-data\");\nconst proxy_events_1 = require(\"./utils/proxy-events\");\nconst timed_out_1 = require(\"./utils/timed-out\");\nconst url_to_options_1 = require(\"./utils/url-to-options\");\nconst options_to_url_1 = require(\"./utils/options-to-url\");\nconst weakable_map_1 = require(\"./utils/weakable-map\");\nconst get_buffer_1 = require(\"./utils/get-buffer\");\nconst dns_ip_version_1 = require(\"./utils/dns-ip-version\");\nconst is_response_ok_1 = require(\"./utils/is-response-ok\");\nconst deprecation_warning_1 = require(\"../utils/deprecation-warning\");\nconst normalize_arguments_1 = require(\"../as-promise/normalize-arguments\");\nconst calculate_retry_delay_1 = require(\"./calculate-retry-delay\");\nlet globalDnsCache;\nconst kRequest = Symbol('request');\nconst kResponse = Symbol('response');\nconst kResponseSize = Symbol('responseSize');\nconst kDownloadedSize = Symbol('downloadedSize');\nconst kBodySize = Symbol('bodySize');\nconst kUploadedSize = Symbol('uploadedSize');\nconst kServerResponsesPiped = Symbol('serverResponsesPiped');\nconst kUnproxyEvents = Symbol('unproxyEvents');\nconst kIsFromCache = Symbol('isFromCache');\nconst kCancelTimeouts = Symbol('cancelTimeouts');\nconst kStartedReading = Symbol('startedReading');\nconst kStopReading = Symbol('stopReading');\nconst kTriggerRead = Symbol('triggerRead');\nconst kBody = Symbol('body');\nconst kJobs = Symbol('jobs');\nconst kOriginalResponse = Symbol('originalResponse');\nconst kRetryTimeout = Symbol('retryTimeout');\nexports.kIsNormalizedAlready = Symbol('isNormalizedAlready');\nconst supportsBrotli = is_1.default.string(process.versions.brotli);\nexports.withoutBody = new Set(['GET', 'HEAD']);\nexports.knownHookEvents = [\n 'init',\n 'beforeRequest',\n 'beforeRedirect',\n 'beforeError',\n 'beforeRetry',\n // Promise-Only\n 'afterResponse'\n];\nfunction validateSearchParameters(searchParameters) {\n // eslint-disable-next-line guard-for-in\n for (const key in searchParameters) {\n const value = searchParameters[key];\n if (!is_1.default.string(value) && !is_1.default.number(value) && !is_1.default.boolean(value) && !is_1.default.null_(value) && !is_1.default.undefined(value)) {\n throw new TypeError(`The \\`searchParams\\` value '${String(value)}' must be a string, number, boolean or null`);\n }\n }\n}\nfunction isClientRequest(clientRequest) {\n return is_1.default.object(clientRequest) && !('statusCode' in clientRequest);\n}\nconst cacheableStore = new weakable_map_1.default();\nconst waitForOpenFile = async (file) => new Promise((resolve, reject) => {\n const onError = (error) => {\n reject(error);\n };\n // Node.js 12 has incomplete types\n if (!file.pending) {\n resolve();\n }\n file.once('error', onError);\n file.once('ready', () => {\n file.off('error', onError);\n resolve();\n });\n});\nconst redirectCodes = new Set([300, 301, 302, 303, 304, 307, 308]);\nconst nonEnumerableProperties = [\n 'context',\n 'body',\n 'json',\n 'form'\n];\nexports.setNonEnumerableProperties = (sources, to) => {\n // Non enumerable properties shall not be merged\n const properties = {};\n for (const source of sources) {\n if (!source) {\n continue;\n }\n for (const name of nonEnumerableProperties) {\n if (!(name in source)) {\n continue;\n }\n properties[name] = {\n writable: true,\n configurable: true,\n enumerable: false,\n // @ts-expect-error TS doesn't see the check above\n value: source[name]\n };\n }\n }\n Object.defineProperties(to, properties);\n};\n/**\nAn error to be thrown when a request fails.\nContains a `code` property with error class code, like `ECONNREFUSED`.\n*/\nclass RequestError extends Error {\n constructor(message, error, self) {\n var _a;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n this.name = 'RequestError';\n this.code = error.code;\n if (self instanceof Request) {\n Object.defineProperty(this, 'request', {\n enumerable: false,\n value: self\n });\n Object.defineProperty(this, 'response', {\n enumerable: false,\n value: self[kResponse]\n });\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self.options\n });\n }\n else {\n Object.defineProperty(this, 'options', {\n // This fails because of TS 3.7.2 useDefineForClassFields\n // Ref: https://github.com/microsoft/TypeScript/issues/34972\n enumerable: false,\n value: self\n });\n }\n this.timings = (_a = this.request) === null || _a === void 0 ? void 0 : _a.timings;\n // Recover the original stacktrace\n if (is_1.default.string(error.stack) && is_1.default.string(this.stack)) {\n const indexOfMessage = this.stack.indexOf(this.message) + this.message.length;\n const thisStackTrace = this.stack.slice(indexOfMessage).split('\\n').reverse();\n const errorStackTrace = error.stack.slice(error.stack.indexOf(error.message) + error.message.length).split('\\n').reverse();\n // Remove duplicated traces\n while (errorStackTrace.length !== 0 && errorStackTrace[0] === thisStackTrace[0]) {\n thisStackTrace.shift();\n }\n this.stack = `${this.stack.slice(0, indexOfMessage)}${thisStackTrace.reverse().join('\\n')}${errorStackTrace.reverse().join('\\n')}`;\n }\n }\n}\nexports.RequestError = RequestError;\n/**\nAn error to be thrown when the server redirects you more than ten times.\nIncludes a `response` property.\n*/\nclass MaxRedirectsError extends RequestError {\n constructor(request) {\n super(`Redirected ${request.options.maxRedirects} times. Aborting.`, {}, request);\n this.name = 'MaxRedirectsError';\n }\n}\nexports.MaxRedirectsError = MaxRedirectsError;\n/**\nAn error to be thrown when the server response code is not 2xx nor 3xx if `options.followRedirect` is `true`, but always except for 304.\nIncludes a `response` property.\n*/\nclass HTTPError extends RequestError {\n constructor(response) {\n super(`Response code ${response.statusCode} (${response.statusMessage})`, {}, response.request);\n this.name = 'HTTPError';\n }\n}\nexports.HTTPError = HTTPError;\n/**\nAn error to be thrown when a cache method fails.\nFor example, if the database goes down or there's a filesystem error.\n*/\nclass CacheError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'CacheError';\n }\n}\nexports.CacheError = CacheError;\n/**\nAn error to be thrown when the request body is a stream and an error occurs while reading from that stream.\n*/\nclass UploadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'UploadError';\n }\n}\nexports.UploadError = UploadError;\n/**\nAn error to be thrown when the request is aborted due to a timeout.\nIncludes an `event` and `timings` property.\n*/\nclass TimeoutError extends RequestError {\n constructor(error, timings, request) {\n super(error.message, error, request);\n this.name = 'TimeoutError';\n this.event = error.event;\n this.timings = timings;\n }\n}\nexports.TimeoutError = TimeoutError;\n/**\nAn error to be thrown when reading from response stream fails.\n*/\nclass ReadError extends RequestError {\n constructor(error, request) {\n super(error.message, error, request);\n this.name = 'ReadError';\n }\n}\nexports.ReadError = ReadError;\n/**\nAn error to be thrown when given an unsupported protocol.\n*/\nclass UnsupportedProtocolError extends RequestError {\n constructor(options) {\n super(`Unsupported protocol \"${options.url.protocol}\"`, {}, options);\n this.name = 'UnsupportedProtocolError';\n }\n}\nexports.UnsupportedProtocolError = UnsupportedProtocolError;\nconst proxiedRequestEvents = [\n 'socket',\n 'connect',\n 'continue',\n 'information',\n 'upgrade',\n 'timeout'\n];\nclass Request extends stream_1.Duplex {\n constructor(url, options = {}, defaults) {\n super({\n // This must be false, to enable throwing after destroy\n // It is used for retry logic in Promise API\n autoDestroy: false,\n // It needs to be zero because we're just proxying the data to another stream\n highWaterMark: 0\n });\n this[kDownloadedSize] = 0;\n this[kUploadedSize] = 0;\n this.requestInitialized = false;\n this[kServerResponsesPiped] = new Set();\n this.redirects = [];\n this[kStopReading] = false;\n this[kTriggerRead] = false;\n this[kJobs] = [];\n this.retryCount = 0;\n // TODO: Remove this when targeting Node.js >= 12\n this._progressCallbacks = [];\n const unlockWrite = () => this._unlockWrite();\n const lockWrite = () => this._lockWrite();\n this.on('pipe', (source) => {\n source.prependListener('data', unlockWrite);\n source.on('data', lockWrite);\n source.prependListener('end', unlockWrite);\n source.on('end', lockWrite);\n });\n this.on('unpipe', (source) => {\n source.off('data', unlockWrite);\n source.off('data', lockWrite);\n source.off('end', unlockWrite);\n source.off('end', lockWrite);\n });\n this.on('pipe', source => {\n if (source instanceof http_1.IncomingMessage) {\n this.options.headers = {\n ...source.headers,\n ...this.options.headers\n };\n }\n });\n const { json, body, form } = options;\n if (json || body || form) {\n this._lockWrite();\n }\n if (exports.kIsNormalizedAlready in options) {\n this.options = options;\n }\n else {\n try {\n // @ts-expect-error Common TypeScript bug saying that `this.constructor` is not accessible\n this.options = this.constructor.normalizeArguments(url, options, defaults);\n }\n catch (error) {\n // TODO: Move this to `_destroy()`\n if (is_1.default.nodeStream(options.body)) {\n options.body.destroy();\n }\n this.destroy(error);\n return;\n }\n }\n (async () => {\n var _a;\n try {\n if (this.options.body instanceof fs_1.ReadStream) {\n await waitForOpenFile(this.options.body);\n }\n const { url: normalizedURL } = this.options;\n if (!normalizedURL) {\n throw new TypeError('Missing `url` property');\n }\n this.requestUrl = normalizedURL.toString();\n decodeURI(this.requestUrl);\n await this._finalizeBody();\n await this._makeRequest();\n if (this.destroyed) {\n (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroy();\n return;\n }\n // Queued writes etc.\n for (const job of this[kJobs]) {\n job();\n }\n // Prevent memory leak\n this[kJobs].length = 0;\n this.requestInitialized = true;\n }\n catch (error) {\n if (error instanceof RequestError) {\n this._beforeError(error);\n return;\n }\n // This is a workaround for https://github.com/nodejs/node/issues/33335\n if (!this.destroyed) {\n this.destroy(error);\n }\n }\n })();\n }\n static normalizeArguments(url, options, defaults) {\n var _a, _b, _c, _d, _e;\n const rawOptions = options;\n if (is_1.default.object(url) && !is_1.default.urlInstance(url)) {\n options = { ...defaults, ...url, ...options };\n }\n else {\n if (url && options && options.url !== undefined) {\n throw new TypeError('The `url` option is mutually exclusive with the `input` argument');\n }\n options = { ...defaults, ...options };\n if (url !== undefined) {\n options.url = url;\n }\n if (is_1.default.urlInstance(options.url)) {\n options.url = new url_1.URL(options.url.toString());\n }\n }\n // TODO: Deprecate URL options in Got 12.\n // Support extend-specific options\n if (options.cache === false) {\n options.cache = undefined;\n }\n if (options.dnsCache === false) {\n options.dnsCache = undefined;\n }\n // Nice type assertions\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.method);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.headers);\n is_1.assert.any([is_1.default.string, is_1.default.urlInstance, is_1.default.undefined], options.prefixUrl);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cookieJar);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.searchParams);\n is_1.assert.any([is_1.default.object, is_1.default.string, is_1.default.undefined], options.cache);\n is_1.assert.any([is_1.default.object, is_1.default.number, is_1.default.undefined], options.timeout);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.context);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.hooks);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.decompress);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.ignoreInvalidCookies);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.followRedirect);\n is_1.assert.any([is_1.default.number, is_1.default.undefined], options.maxRedirects);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.throwHttpErrors);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.http2);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.allowGetBody);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.localAddress);\n is_1.assert.any([dns_ip_version_1.isDnsLookupIpVersion, is_1.default.undefined], options.dnsLookupIpVersion);\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.https);\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.rejectUnauthorized);\n if (options.https) {\n is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.https.rejectUnauthorized);\n is_1.assert.any([is_1.default.function_, is_1.default.undefined], options.https.checkServerIdentity);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificateAuthority);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.key);\n is_1.assert.any([is_1.default.string, is_1.default.object, is_1.default.array, is_1.default.undefined], options.https.certificate);\n is_1.assert.any([is_1.default.string, is_1.default.undefined], options.https.passphrase);\n is_1.assert.any([is_1.default.string, is_1.default.buffer, is_1.default.array, is_1.default.undefined], options.https.pfx);\n }\n is_1.assert.any([is_1.default.object, is_1.default.undefined], options.cacheOptions);\n // `options.method`\n if (is_1.default.string(options.method)) {\n options.method = options.method.toUpperCase();\n }\n else {\n options.method = 'GET';\n }\n // `options.headers`\n if (options.headers === (defaults === null || defaults === void 0 ? void 0 : defaults.headers)) {\n options.headers = { ...options.headers };\n }\n else {\n options.headers = lowercaseKeys({ ...(defaults === null || defaults === void 0 ? void 0 : defaults.headers), ...options.headers });\n }\n // Disallow legacy `url.Url`\n if ('slashes' in options) {\n throw new TypeError('The legacy `url.Url` has been deprecated. Use `URL` instead.');\n }\n // `options.auth`\n if ('auth' in options) {\n throw new TypeError('Parameter `auth` is deprecated. Use `username` / `password` instead.');\n }\n // `options.searchParams`\n if ('searchParams' in options) {\n if (options.searchParams && options.searchParams !== (defaults === null || defaults === void 0 ? void 0 : defaults.searchParams)) {\n let searchParameters;\n if (is_1.default.string(options.searchParams) || (options.searchParams instanceof url_1.URLSearchParams)) {\n searchParameters = new url_1.URLSearchParams(options.searchParams);\n }\n else {\n validateSearchParameters(options.searchParams);\n searchParameters = new url_1.URLSearchParams();\n // eslint-disable-next-line guard-for-in\n for (const key in options.searchParams) {\n const value = options.searchParams[key];\n if (value === null) {\n searchParameters.append(key, '');\n }\n else if (value !== undefined) {\n searchParameters.append(key, value);\n }\n }\n }\n // `normalizeArguments()` is also used to merge options\n (_a = defaults === null || defaults === void 0 ? void 0 : defaults.searchParams) === null || _a === void 0 ? void 0 : _a.forEach((value, key) => {\n // Only use default if one isn't already defined\n if (!searchParameters.has(key)) {\n searchParameters.append(key, value);\n }\n });\n options.searchParams = searchParameters;\n }\n }\n // `options.username` & `options.password`\n options.username = (_b = options.username) !== null && _b !== void 0 ? _b : '';\n options.password = (_c = options.password) !== null && _c !== void 0 ? _c : '';\n // `options.prefixUrl` & `options.url`\n if (is_1.default.undefined(options.prefixUrl)) {\n options.prefixUrl = (_d = defaults === null || defaults === void 0 ? void 0 : defaults.prefixUrl) !== null && _d !== void 0 ? _d : '';\n }\n else {\n options.prefixUrl = options.prefixUrl.toString();\n if (options.prefixUrl !== '' && !options.prefixUrl.endsWith('/')) {\n options.prefixUrl += '/';\n }\n }\n if (is_1.default.string(options.url)) {\n if (options.url.startsWith('/')) {\n throw new Error('`input` must not start with a slash when using `prefixUrl`');\n }\n options.url = options_to_url_1.default(options.prefixUrl + options.url, options);\n }\n else if ((is_1.default.undefined(options.url) && options.prefixUrl !== '') || options.protocol) {\n options.url = options_to_url_1.default(options.prefixUrl, options);\n }\n if (options.url) {\n if ('port' in options) {\n delete options.port;\n }\n // Make it possible to change `options.prefixUrl`\n let { prefixUrl } = options;\n Object.defineProperty(options, 'prefixUrl', {\n set: (value) => {\n const url = options.url;\n if (!url.href.startsWith(value)) {\n throw new Error(`Cannot change \\`prefixUrl\\` from ${prefixUrl} to ${value}: ${url.href}`);\n }\n options.url = new url_1.URL(value + url.href.slice(prefixUrl.length));\n prefixUrl = value;\n },\n get: () => prefixUrl\n });\n // Support UNIX sockets\n let { protocol } = options.url;\n if (protocol === 'unix:') {\n protocol = 'http:';\n options.url = new url_1.URL(`http://unix${options.url.pathname}${options.url.search}`);\n }\n // Set search params\n if (options.searchParams) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n options.url.search = options.searchParams.toString();\n }\n // Protocol check\n if (protocol !== 'http:' && protocol !== 'https:') {\n throw new UnsupportedProtocolError(options);\n }\n // Update `username`\n if (options.username === '') {\n options.username = options.url.username;\n }\n else {\n options.url.username = options.username;\n }\n // Update `password`\n if (options.password === '') {\n options.password = options.url.password;\n }\n else {\n options.url.password = options.password;\n }\n }\n // `options.cookieJar`\n const { cookieJar } = options;\n if (cookieJar) {\n let { setCookie, getCookieString } = cookieJar;\n is_1.assert.function_(setCookie);\n is_1.assert.function_(getCookieString);\n /* istanbul ignore next: Horrible `tough-cookie` v3 check */\n if (setCookie.length === 4 && getCookieString.length === 0) {\n setCookie = util_1.promisify(setCookie.bind(options.cookieJar));\n getCookieString = util_1.promisify(getCookieString.bind(options.cookieJar));\n options.cookieJar = {\n setCookie,\n getCookieString: getCookieString\n };\n }\n }\n // `options.cache`\n const { cache } = options;\n if (cache) {\n if (!cacheableStore.has(cache)) {\n cacheableStore.set(cache, new CacheableRequest(((requestOptions, handler) => {\n const result = requestOptions[kRequest](requestOptions, handler);\n // TODO: remove this when `cacheable-request` supports async request functions.\n if (is_1.default.promise(result)) {\n // @ts-expect-error\n // We only need to implement the error handler in order to support HTTP2 caching.\n // The result will be a promise anyway.\n result.once = (event, handler) => {\n if (event === 'error') {\n result.catch(handler);\n }\n else if (event === 'abort') {\n // The empty catch is needed here in case when\n // it rejects before it's `await`ed in `_makeRequest`.\n (async () => {\n try {\n const request = (await result);\n request.once('abort', handler);\n }\n catch (_a) { }\n })();\n }\n else {\n /* istanbul ignore next: safety check */\n throw new Error(`Unknown HTTP2 promise event: ${event}`);\n }\n return result;\n };\n }\n return result;\n }), cache));\n }\n }\n // `options.cacheOptions`\n options.cacheOptions = { ...options.cacheOptions };\n // `options.dnsCache`\n if (options.dnsCache === true) {\n if (!globalDnsCache) {\n globalDnsCache = new cacheable_lookup_1.default();\n }\n options.dnsCache = globalDnsCache;\n }\n else if (!is_1.default.undefined(options.dnsCache) && !options.dnsCache.lookup) {\n throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${is_1.default(options.dnsCache)}`);\n }\n // `options.timeout`\n if (is_1.default.number(options.timeout)) {\n options.timeout = { request: options.timeout };\n }\n else if (defaults && options.timeout !== defaults.timeout) {\n options.timeout = {\n ...defaults.timeout,\n ...options.timeout\n };\n }\n else {\n options.timeout = { ...options.timeout };\n }\n // `options.context`\n if (!options.context) {\n options.context = {};\n }\n // `options.hooks`\n const areHooksDefault = options.hooks === (defaults === null || defaults === void 0 ? void 0 : defaults.hooks);\n options.hooks = { ...options.hooks };\n for (const event of exports.knownHookEvents) {\n if (event in options.hooks) {\n if (is_1.default.array(options.hooks[event])) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [...options.hooks[event]];\n }\n else {\n throw new TypeError(`Parameter \\`${event}\\` must be an Array, got ${is_1.default(options.hooks[event])}`);\n }\n }\n else {\n options.hooks[event] = [];\n }\n }\n if (defaults && !areHooksDefault) {\n for (const event of exports.knownHookEvents) {\n const defaultHooks = defaults.hooks[event];\n if (defaultHooks.length > 0) {\n // See https://github.com/microsoft/TypeScript/issues/31445#issuecomment-576929044\n options.hooks[event] = [\n ...defaults.hooks[event],\n ...options.hooks[event]\n ];\n }\n }\n }\n // DNS options\n if ('family' in options) {\n deprecation_warning_1.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"');\n }\n // HTTPS options\n if (defaults === null || defaults === void 0 ? void 0 : defaults.https) {\n options.https = { ...defaults.https, ...options.https };\n }\n if ('rejectUnauthorized' in options) {\n deprecation_warning_1.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"');\n }\n if ('checkServerIdentity' in options) {\n deprecation_warning_1.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"');\n }\n if ('ca' in options) {\n deprecation_warning_1.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"');\n }\n if ('key' in options) {\n deprecation_warning_1.default('\"options.key\" was never documented, please use \"options.https.key\"');\n }\n if ('cert' in options) {\n deprecation_warning_1.default('\"options.cert\" was never documented, please use \"options.https.certificate\"');\n }\n if ('passphrase' in options) {\n deprecation_warning_1.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"');\n }\n if ('pfx' in options) {\n deprecation_warning_1.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"');\n }\n // Other options\n if ('followRedirects' in options) {\n throw new TypeError('The `followRedirects` option does not exist. Use `followRedirect` instead.');\n }\n if (options.agent) {\n for (const key in options.agent) {\n if (key !== 'http' && key !== 'https' && key !== 'http2') {\n throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${key}\\``);\n }\n }\n }\n options.maxRedirects = (_e = options.maxRedirects) !== null && _e !== void 0 ? _e : 0;\n // Set non-enumerable properties\n exports.setNonEnumerableProperties([defaults, rawOptions], options);\n return normalize_arguments_1.default(options, defaults);\n }\n _lockWrite() {\n const onLockedWrite = () => {\n throw new TypeError('The payload has been already provided');\n };\n this.write = onLockedWrite;\n this.end = onLockedWrite;\n }\n _unlockWrite() {\n this.write = super.write;\n this.end = super.end;\n }\n async _finalizeBody() {\n const { options } = this;\n const { headers } = options;\n const isForm = !is_1.default.undefined(options.form);\n const isJSON = !is_1.default.undefined(options.json);\n const isBody = !is_1.default.undefined(options.body);\n const hasPayload = isForm || isJSON || isBody;\n const cannotHaveBody = exports.withoutBody.has(options.method) && !(options.method === 'GET' && options.allowGetBody);\n this._cannotHaveBody = cannotHaveBody;\n if (hasPayload) {\n if (cannotHaveBody) {\n throw new TypeError(`The \\`${options.method}\\` method cannot be used with a body`);\n }\n if ([isBody, isForm, isJSON].filter(isTrue => isTrue).length > 1) {\n throw new TypeError('The `body`, `json` and `form` options are mutually exclusive');\n }\n if (isBody &&\n !(options.body instanceof stream_1.Readable) &&\n !is_1.default.string(options.body) &&\n !is_1.default.buffer(options.body) &&\n !is_form_data_1.default(options.body)) {\n throw new TypeError('The `body` option must be a stream.Readable, string or Buffer');\n }\n if (isForm && !is_1.default.object(options.form)) {\n throw new TypeError('The `form` option must be an Object');\n }\n {\n // Serialize body\n const noContentType = !is_1.default.string(headers['content-type']);\n if (isBody) {\n // Special case for https://github.com/form-data/form-data\n if (is_form_data_1.default(options.body) && noContentType) {\n headers['content-type'] = `multipart/form-data; boundary=${options.body.getBoundary()}`;\n }\n this[kBody] = options.body;\n }\n else if (isForm) {\n if (noContentType) {\n headers['content-type'] = 'application/x-www-form-urlencoded';\n }\n this[kBody] = (new url_1.URLSearchParams(options.form)).toString();\n }\n else {\n if (noContentType) {\n headers['content-type'] = 'application/json';\n }\n this[kBody] = options.stringifyJson(options.json);\n }\n const uploadBodySize = await get_body_size_1.default(this[kBody], options.headers);\n // See https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body. For example, a Content-Length header\n // field is normally sent in a POST request even when the value is 0\n // (indicating an empty payload body). A user agent SHOULD NOT send a\n // Content-Length header field when the request message does not contain\n // a payload body and the method semantics do not anticipate such a\n // body.\n if (is_1.default.undefined(headers['content-length']) && is_1.default.undefined(headers['transfer-encoding'])) {\n if (!cannotHaveBody && !is_1.default.undefined(uploadBodySize)) {\n headers['content-length'] = String(uploadBodySize);\n }\n }\n }\n }\n else if (cannotHaveBody) {\n this._lockWrite();\n }\n else {\n this._unlockWrite();\n }\n this[kBodySize] = Number(headers['content-length']) || undefined;\n }\n async _onResponseBase(response) {\n const { options } = this;\n const { url } = options;\n this[kOriginalResponse] = response;\n if (options.decompress) {\n response = decompressResponse(response);\n }\n const statusCode = response.statusCode;\n const typedResponse = response;\n typedResponse.statusMessage = typedResponse.statusMessage ? typedResponse.statusMessage : http.STATUS_CODES[statusCode];\n typedResponse.url = options.url.toString();\n typedResponse.requestUrl = this.requestUrl;\n typedResponse.redirectUrls = this.redirects;\n typedResponse.request = this;\n typedResponse.isFromCache = response.fromCache || false;\n typedResponse.ip = this.ip;\n typedResponse.retryCount = this.retryCount;\n this[kIsFromCache] = typedResponse.isFromCache;\n this[kResponseSize] = Number(response.headers['content-length']) || undefined;\n this[kResponse] = response;\n response.once('end', () => {\n this[kResponseSize] = this[kDownloadedSize];\n this.emit('downloadProgress', this.downloadProgress);\n });\n response.once('error', (error) => {\n // Force clean-up, because some packages don't do this.\n // TODO: Fix decompress-response\n response.destroy();\n this._beforeError(new ReadError(error, this));\n });\n response.once('aborted', () => {\n this._beforeError(new ReadError({\n name: 'Error',\n message: 'The server aborted pending request',\n code: 'ECONNRESET'\n }, this));\n });\n this.emit('downloadProgress', this.downloadProgress);\n const rawCookies = response.headers['set-cookie'];\n if (is_1.default.object(options.cookieJar) && rawCookies) {\n let promises = rawCookies.map(async (rawCookie) => options.cookieJar.setCookie(rawCookie, url.toString()));\n if (options.ignoreInvalidCookies) {\n promises = promises.map(async (p) => p.catch(() => { }));\n }\n try {\n await Promise.all(promises);\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n }\n if (options.followRedirect && response.headers.location && redirectCodes.has(statusCode)) {\n // We're being redirected, we don't care about the response.\n // It'd be best to abort the request, but we can't because\n // we would have to sacrifice the TCP connection. We don't want that.\n response.resume();\n if (this[kRequest]) {\n this[kCancelTimeouts]();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this[kRequest];\n this[kUnproxyEvents]();\n }\n const shouldBeGet = statusCode === 303 && options.method !== 'GET' && options.method !== 'HEAD';\n if (shouldBeGet || !options.methodRewriting) {\n // Server responded with \"see other\", indicating that the resource exists at another location,\n // and the client should request it from that location via GET or HEAD.\n options.method = 'GET';\n if ('body' in options) {\n delete options.body;\n }\n if ('json' in options) {\n delete options.json;\n }\n if ('form' in options) {\n delete options.form;\n }\n this[kBody] = undefined;\n delete options.headers['content-length'];\n }\n if (this.redirects.length >= options.maxRedirects) {\n this._beforeError(new MaxRedirectsError(this));\n return;\n }\n try {\n // Do not remove. See https://github.com/sindresorhus/got/pull/214\n const redirectBuffer = Buffer.from(response.headers.location, 'binary').toString();\n // Handles invalid URLs. See https://github.com/sindresorhus/got/issues/604\n const redirectUrl = new url_1.URL(redirectBuffer, url);\n const redirectString = redirectUrl.toString();\n decodeURI(redirectString);\n // Redirecting to a different site, clear sensitive data.\n if (redirectUrl.hostname !== url.hostname || redirectUrl.port !== url.port) {\n if ('host' in options.headers) {\n delete options.headers.host;\n }\n if ('cookie' in options.headers) {\n delete options.headers.cookie;\n }\n if ('authorization' in options.headers) {\n delete options.headers.authorization;\n }\n if (options.username || options.password) {\n options.username = '';\n options.password = '';\n }\n }\n else {\n redirectUrl.username = options.username;\n redirectUrl.password = options.password;\n }\n this.redirects.push(redirectString);\n options.url = redirectUrl;\n for (const hook of options.hooks.beforeRedirect) {\n // eslint-disable-next-line no-await-in-loop\n await hook(options, typedResponse);\n }\n this.emit('redirect', typedResponse, options);\n await this._makeRequest();\n }\n catch (error) {\n this._beforeError(error);\n return;\n }\n return;\n }\n if (options.isStream && options.throwHttpErrors && !is_response_ok_1.isResponseOk(typedResponse)) {\n this._beforeError(new HTTPError(typedResponse));\n return;\n }\n response.on('readable', () => {\n if (this[kTriggerRead]) {\n this._read();\n }\n });\n this.on('resume', () => {\n response.resume();\n });\n this.on('pause', () => {\n response.pause();\n });\n response.once('end', () => {\n this.push(null);\n });\n this.emit('response', response);\n for (const destination of this[kServerResponsesPiped]) {\n if (destination.headersSent) {\n continue;\n }\n // eslint-disable-next-line guard-for-in\n for (const key in response.headers) {\n const isAllowed = options.decompress ? key !== 'content-encoding' : true;\n const value = response.headers[key];\n if (isAllowed) {\n destination.setHeader(key, value);\n }\n }\n destination.statusCode = statusCode;\n }\n }\n async _onResponse(response) {\n try {\n await this._onResponseBase(response);\n }\n catch (error) {\n /* istanbul ignore next: better safe than sorry */\n this._beforeError(error);\n }\n }\n _onRequest(request) {\n const { options } = this;\n const { timeout, url } = options;\n http_timer_1.default(request);\n this[kCancelTimeouts] = timed_out_1.default(request, timeout, url);\n const responseEventName = options.cache ? 'cacheableResponse' : 'response';\n request.once(responseEventName, (response) => {\n void this._onResponse(response);\n });\n request.once('error', (error) => {\n var _a;\n // Force clean-up, because some packages (e.g. nock) don't do this.\n request.destroy();\n // Node.js <= 12.18.2 mistakenly emits the response `end` first.\n (_a = request.res) === null || _a === void 0 ? void 0 : _a.removeAllListeners('end');\n error = error instanceof timed_out_1.TimeoutError ? new TimeoutError(error, this.timings, this) : new RequestError(error.message, error, this);\n this._beforeError(error);\n });\n this[kUnproxyEvents] = proxy_events_1.default(request, this, proxiedRequestEvents);\n this[kRequest] = request;\n this.emit('uploadProgress', this.uploadProgress);\n // Send body\n const body = this[kBody];\n const currentRequest = this.redirects.length === 0 ? this : request;\n if (is_1.default.nodeStream(body)) {\n body.pipe(currentRequest);\n body.once('error', (error) => {\n this._beforeError(new UploadError(error, this));\n });\n }\n else {\n this._unlockWrite();\n if (!is_1.default.undefined(body)) {\n this._writeRequest(body, undefined, () => { });\n currentRequest.end();\n this._lockWrite();\n }\n else if (this._cannotHaveBody || this._noPipe) {\n currentRequest.end();\n this._lockWrite();\n }\n }\n this.emit('request', request);\n }\n async _createCacheableRequest(url, options) {\n return new Promise((resolve, reject) => {\n // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed\n Object.assign(options, url_to_options_1.default(url));\n // `http-cache-semantics` checks this\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.url;\n let request;\n // This is ugly\n const cacheRequest = cacheableStore.get(options.cache)(options, async (response) => {\n // TODO: Fix `cacheable-response`\n response._readableState.autoDestroy = false;\n if (request) {\n (await request).emit('cacheableResponse', response);\n }\n resolve(response);\n });\n // Restore options\n options.url = url;\n cacheRequest.once('error', reject);\n cacheRequest.once('request', async (requestOrPromise) => {\n request = requestOrPromise;\n resolve(request);\n });\n });\n }\n async _makeRequest() {\n var _a, _b, _c, _d, _e;\n const { options } = this;\n const { headers } = options;\n for (const key in headers) {\n if (is_1.default.undefined(headers[key])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete headers[key];\n }\n else if (is_1.default.null_(headers[key])) {\n throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${key}\\` header`);\n }\n }\n if (options.decompress && is_1.default.undefined(headers['accept-encoding'])) {\n headers['accept-encoding'] = supportsBrotli ? 'gzip, deflate, br' : 'gzip, deflate';\n }\n // Set cookies\n if (options.cookieJar) {\n const cookieString = await options.cookieJar.getCookieString(options.url.toString());\n if (is_1.default.nonEmptyString(cookieString)) {\n options.headers.cookie = cookieString;\n }\n }\n for (const hook of options.hooks.beforeRequest) {\n // eslint-disable-next-line no-await-in-loop\n const result = await hook(options);\n if (!is_1.default.undefined(result)) {\n // @ts-expect-error Skip the type mismatch to support abstract responses\n options.request = () => result;\n break;\n }\n }\n if (options.body && this[kBody] !== options.body) {\n this[kBody] = options.body;\n }\n const { agent, request, timeout, url } = options;\n if (options.dnsCache && !('lookup' in options)) {\n options.lookup = options.dnsCache.lookup;\n }\n // UNIX sockets\n if (url.hostname === 'unix') {\n const matches = /(?<socketPath>.+?):(?<path>.+)/.exec(`${url.pathname}${url.search}`);\n if (matches === null || matches === void 0 ? void 0 : matches.groups) {\n const { socketPath, path } = matches.groups;\n Object.assign(options, {\n socketPath,\n path,\n host: ''\n });\n }\n }\n const isHttps = url.protocol === 'https:';\n // Fallback function\n let fallbackFn;\n if (options.http2) {\n fallbackFn = http2wrapper.auto;\n }\n else {\n fallbackFn = isHttps ? https.request : http.request;\n }\n const realFn = (_a = options.request) !== null && _a !== void 0 ? _a : fallbackFn;\n // Cache support\n const fn = options.cache ? this._createCacheableRequest : realFn;\n // Pass an agent directly when HTTP2 is disabled\n if (agent && !options.http2) {\n options.agent = agent[isHttps ? 'https' : 'http'];\n }\n // Prepare plain HTTP request options\n options[kRequest] = realFn;\n delete options.request;\n // TODO: Fix this ignore.\n // @ts-expect-error\n delete options.timeout;\n const requestOptions = options;\n requestOptions.shared = (_b = options.cacheOptions) === null || _b === void 0 ? void 0 : _b.shared;\n requestOptions.cacheHeuristic = (_c = options.cacheOptions) === null || _c === void 0 ? void 0 : _c.cacheHeuristic;\n requestOptions.immutableMinTimeToLive = (_d = options.cacheOptions) === null || _d === void 0 ? void 0 : _d.immutableMinTimeToLive;\n requestOptions.ignoreCargoCult = (_e = options.cacheOptions) === null || _e === void 0 ? void 0 : _e.ignoreCargoCult;\n // If `dnsLookupIpVersion` is not present do not override `family`\n if (options.dnsLookupIpVersion !== undefined) {\n try {\n requestOptions.family = dns_ip_version_1.dnsLookupIpVersionToFamily(options.dnsLookupIpVersion);\n }\n catch (_f) {\n throw new Error('Invalid `dnsLookupIpVersion` option value');\n }\n }\n // HTTPS options remapping\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n requestOptions.rejectUnauthorized = options.https.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n requestOptions.checkServerIdentity = options.https.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n requestOptions.ca = options.https.certificateAuthority;\n }\n if (options.https.certificate) {\n requestOptions.cert = options.https.certificate;\n }\n if (options.https.key) {\n requestOptions.key = options.https.key;\n }\n if (options.https.passphrase) {\n requestOptions.passphrase = options.https.passphrase;\n }\n if (options.https.pfx) {\n requestOptions.pfx = options.https.pfx;\n }\n }\n try {\n let requestOrResponse = await fn(url, requestOptions);\n if (is_1.default.undefined(requestOrResponse)) {\n requestOrResponse = fallbackFn(url, requestOptions);\n }\n // Restore options\n options.request = request;\n options.timeout = timeout;\n options.agent = agent;\n // HTTPS options restore\n if (options.https) {\n if ('rejectUnauthorized' in options.https) {\n delete requestOptions.rejectUnauthorized;\n }\n if (options.https.checkServerIdentity) {\n // @ts-expect-error - This one will be removed when we remove the alias.\n delete requestOptions.checkServerIdentity;\n }\n if (options.https.certificateAuthority) {\n delete requestOptions.ca;\n }\n if (options.https.certificate) {\n delete requestOptions.cert;\n }\n if (options.https.key) {\n delete requestOptions.key;\n }\n if (options.https.passphrase) {\n delete requestOptions.passphrase;\n }\n if (options.https.pfx) {\n delete requestOptions.pfx;\n }\n }\n if (isClientRequest(requestOrResponse)) {\n this._onRequest(requestOrResponse);\n // Emit the response after the stream has been ended\n }\n else if (this.writable) {\n this.once('finish', () => {\n void this._onResponse(requestOrResponse);\n });\n this._unlockWrite();\n this.end();\n this._lockWrite();\n }\n else {\n void this._onResponse(requestOrResponse);\n }\n }\n catch (error) {\n if (error instanceof CacheableRequest.CacheError) {\n throw new CacheError(error, this);\n }\n throw new RequestError(error.message, error, this);\n }\n }\n async _error(error) {\n try {\n for (const hook of this.options.hooks.beforeError) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n catch (error_) {\n error = new RequestError(error_.message, error_, this);\n }\n this.destroy(error);\n }\n _beforeError(error) {\n if (this[kStopReading]) {\n return;\n }\n const { options } = this;\n const retryCount = this.retryCount + 1;\n this[kStopReading] = true;\n if (!(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n const typedError = error;\n const { response } = typedError;\n void (async () => {\n if (response && !response.body) {\n response.setEncoding(this._readableState.encoding);\n try {\n response.rawBody = await get_buffer_1.default(response);\n response.body = response.rawBody.toString();\n }\n catch (_a) { }\n }\n if (this.listenerCount('retry') !== 0) {\n let backoff;\n try {\n let retryAfter;\n if (response && 'retry-after' in response.headers) {\n retryAfter = Number(response.headers['retry-after']);\n if (Number.isNaN(retryAfter)) {\n retryAfter = Date.parse(response.headers['retry-after']) - Date.now();\n if (retryAfter <= 0) {\n retryAfter = 1;\n }\n }\n else {\n retryAfter *= 1000;\n }\n }\n backoff = await options.retry.calculateDelay({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: calculate_retry_delay_1.default({\n attemptCount: retryCount,\n retryOptions: options.retry,\n error: typedError,\n retryAfter,\n computedValue: 0\n })\n });\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error_, this));\n return;\n }\n if (backoff) {\n const retry = async () => {\n try {\n for (const hook of this.options.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(this.options, typedError, retryCount);\n }\n }\n catch (error_) {\n void this._error(new RequestError(error_.message, error, this));\n return;\n }\n // Something forced us to abort the retry\n if (this.destroyed) {\n return;\n }\n this.destroy();\n this.emit('retry', retryCount, error);\n };\n this[kRetryTimeout] = setTimeout(retry, backoff);\n return;\n }\n }\n void this._error(typedError);\n })();\n }\n _read() {\n this[kTriggerRead] = true;\n const response = this[kResponse];\n if (response && !this[kStopReading]) {\n // We cannot put this in the `if` above\n // because `.read()` also triggers the `end` event\n if (response.readableLength) {\n this[kTriggerRead] = false;\n }\n let data;\n while ((data = response.read()) !== null) {\n this[kDownloadedSize] += data.length;\n this[kStartedReading] = true;\n const progress = this.downloadProgress;\n if (progress.percent < 1) {\n this.emit('downloadProgress', progress);\n }\n this.push(data);\n }\n }\n }\n // Node.js 12 has incorrect types, so the encoding must be a string\n _write(chunk, encoding, callback) {\n const write = () => {\n this._writeRequest(chunk, encoding, callback);\n };\n if (this.requestInitialized) {\n write();\n }\n else {\n this[kJobs].push(write);\n }\n }\n _writeRequest(chunk, encoding, callback) {\n if (this[kRequest].destroyed) {\n // Probably the `ClientRequest` instance will throw\n return;\n }\n this._progressCallbacks.push(() => {\n this[kUploadedSize] += Buffer.byteLength(chunk, encoding);\n const progress = this.uploadProgress;\n if (progress.percent < 1) {\n this.emit('uploadProgress', progress);\n }\n });\n // TODO: What happens if it's from cache? Then this[kRequest] won't be defined.\n this[kRequest].write(chunk, encoding, (error) => {\n if (!error && this._progressCallbacks.length > 0) {\n this._progressCallbacks.shift()();\n }\n callback(error);\n });\n }\n _final(callback) {\n const endRequest = () => {\n // FIX: Node.js 10 calls the write callback AFTER the end callback!\n while (this._progressCallbacks.length !== 0) {\n this._progressCallbacks.shift()();\n }\n // We need to check if `this[kRequest]` is present,\n // because it isn't when we use cache.\n if (!(kRequest in this)) {\n callback();\n return;\n }\n if (this[kRequest].destroyed) {\n callback();\n return;\n }\n this[kRequest].end((error) => {\n if (!error) {\n this[kBodySize] = this[kUploadedSize];\n this.emit('uploadProgress', this.uploadProgress);\n this[kRequest].emit('upload-complete');\n }\n callback(error);\n });\n };\n if (this.requestInitialized) {\n endRequest();\n }\n else {\n this[kJobs].push(endRequest);\n }\n }\n _destroy(error, callback) {\n var _a;\n this[kStopReading] = true;\n // Prevent further retries\n clearTimeout(this[kRetryTimeout]);\n if (kRequest in this) {\n this[kCancelTimeouts]();\n // TODO: Remove the next `if` when these get fixed:\n // - https://github.com/nodejs/node/issues/32851\n if (!((_a = this[kResponse]) === null || _a === void 0 ? void 0 : _a.complete)) {\n this[kRequest].destroy();\n }\n }\n if (error !== null && !is_1.default.undefined(error) && !(error instanceof RequestError)) {\n error = new RequestError(error.message, error, this);\n }\n callback(error);\n }\n get _isAboutToError() {\n return this[kStopReading];\n }\n /**\n The remote IP address.\n */\n get ip() {\n var _a;\n return (_a = this.socket) === null || _a === void 0 ? void 0 : _a.remoteAddress;\n }\n /**\n Indicates whether the request has been aborted or not.\n */\n get aborted() {\n var _a, _b, _c;\n return ((_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.destroyed) !== null && _b !== void 0 ? _b : this.destroyed) && !((_c = this[kOriginalResponse]) === null || _c === void 0 ? void 0 : _c.complete);\n }\n get socket() {\n var _a, _b;\n return (_b = (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.socket) !== null && _b !== void 0 ? _b : undefined;\n }\n /**\n Progress event for downloading (receiving a response).\n */\n get downloadProgress() {\n let percent;\n if (this[kResponseSize]) {\n percent = this[kDownloadedSize] / this[kResponseSize];\n }\n else if (this[kResponseSize] === this[kDownloadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kDownloadedSize],\n total: this[kResponseSize]\n };\n }\n /**\n Progress event for uploading (sending a request).\n */\n get uploadProgress() {\n let percent;\n if (this[kBodySize]) {\n percent = this[kUploadedSize] / this[kBodySize];\n }\n else if (this[kBodySize] === this[kUploadedSize]) {\n percent = 1;\n }\n else {\n percent = 0;\n }\n return {\n percent,\n transferred: this[kUploadedSize],\n total: this[kBodySize]\n };\n }\n /**\n The object contains the following properties:\n\n - `start` - Time when the request started.\n - `socket` - Time when a socket was assigned to the request.\n - `lookup` - Time when the DNS lookup finished.\n - `connect` - Time when the socket successfully connected.\n - `secureConnect` - Time when the socket securely connected.\n - `upload` - Time when the request finished uploading.\n - `response` - Time when the request fired `response` event.\n - `end` - Time when the response fired `end` event.\n - `error` - Time when the request fired `error` event.\n - `abort` - Time when the request fired `abort` event.\n - `phases`\n - `wait` - `timings.socket - timings.start`\n - `dns` - `timings.lookup - timings.socket`\n - `tcp` - `timings.connect - timings.lookup`\n - `tls` - `timings.secureConnect - timings.connect`\n - `request` - `timings.upload - (timings.secureConnect || timings.connect)`\n - `firstByte` - `timings.response - timings.upload`\n - `download` - `timings.end - timings.response`\n - `total` - `(timings.end || timings.error || timings.abort) - timings.start`\n\n If something has not been measured yet, it will be `undefined`.\n\n __Note__: The time is a `number` representing the milliseconds elapsed since the UNIX epoch.\n */\n get timings() {\n var _a;\n return (_a = this[kRequest]) === null || _a === void 0 ? void 0 : _a.timings;\n }\n /**\n Whether the response was retrieved from the cache.\n */\n get isFromCache() {\n return this[kIsFromCache];\n }\n pipe(destination, options) {\n if (this[kStartedReading]) {\n throw new Error('Failed to pipe. The response has been emitted already.');\n }\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].add(destination);\n }\n return super.pipe(destination, options);\n }\n unpipe(destination) {\n if (destination instanceof http_1.ServerResponse) {\n this[kServerResponsesPiped].delete(destination);\n }\n super.unpipe(destination);\n return this;\n }\n}\nexports.default = Request;\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancelError = exports.ParseError = void 0;\nconst core_1 = require(\"../core\");\n/**\nAn error to be thrown when server response code is 2xx, and parsing body fails.\nIncludes a `response` property.\n*/\nclass ParseError extends core_1.RequestError {\n constructor(error, response) {\n const { options } = response.request;\n super(`${error.message} in \"${options.url.toString()}\"`, error, response.request);\n this.name = 'ParseError';\n }\n}\nexports.ParseError = ParseError;\n/**\nAn error to be thrown when the request is aborted with `.cancel()`.\n*/\nclass CancelError extends core_1.RequestError {\n constructor(request) {\n super('Promise was canceled', {}, request);\n this.name = 'CancelError';\n }\n get isCanceled() {\n return true;\n }\n}\nexports.CancelError = CancelError;\n__exportStar(require(\"../core\"), exports);\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nconst parseBody = (response, responseType, parseJson, encoding) => {\n const { rawBody } = response;\n try {\n if (responseType === 'text') {\n return rawBody.toString(encoding);\n }\n if (responseType === 'json') {\n return rawBody.length === 0 ? '' : parseJson(rawBody.toString());\n }\n if (responseType === 'buffer') {\n return rawBody;\n }\n throw new types_1.ParseError({\n message: `Unknown body type '${responseType}'`,\n name: 'Error'\n }, response);\n }\n catch (error) {\n throw new types_1.ParseError(error, response);\n }\n};\nexports.default = parseBody;\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst is_1 = require(\"@sindresorhus/is\");\nconst PCancelable = require(\"p-cancelable\");\nconst types_1 = require(\"./types\");\nconst parse_body_1 = require(\"./parse-body\");\nconst core_1 = require(\"../core\");\nconst proxy_events_1 = require(\"../core/utils/proxy-events\");\nconst get_buffer_1 = require(\"../core/utils/get-buffer\");\nconst is_response_ok_1 = require(\"../core/utils/is-response-ok\");\nconst proxiedRequestEvents = [\n 'request',\n 'response',\n 'redirect',\n 'uploadProgress',\n 'downloadProgress'\n];\nfunction asPromise(normalizedOptions) {\n let globalRequest;\n let globalResponse;\n const emitter = new events_1.EventEmitter();\n const promise = new PCancelable((resolve, reject, onCancel) => {\n const makeRequest = (retryCount) => {\n const request = new core_1.default(undefined, normalizedOptions);\n request.retryCount = retryCount;\n request._noPipe = true;\n onCancel(() => request.destroy());\n onCancel.shouldReject = false;\n onCancel(() => reject(new types_1.CancelError(request)));\n globalRequest = request;\n request.once('response', async (response) => {\n var _a;\n response.retryCount = retryCount;\n if (response.request.aborted) {\n // Canceled while downloading - will throw a `CancelError` or `TimeoutError` error\n return;\n }\n // Download body\n let rawBody;\n try {\n rawBody = await get_buffer_1.default(request);\n response.rawBody = rawBody;\n }\n catch (_b) {\n // The same error is caught below.\n // See request.once('error')\n return;\n }\n if (request._isAboutToError) {\n return;\n }\n // Parse body\n const contentEncoding = ((_a = response.headers['content-encoding']) !== null && _a !== void 0 ? _a : '').toLowerCase();\n const isCompressed = ['gzip', 'deflate', 'br'].includes(contentEncoding);\n const { options } = request;\n if (isCompressed && !options.decompress) {\n response.body = rawBody;\n }\n else {\n try {\n response.body = parse_body_1.default(response, options.responseType, options.parseJson, options.encoding);\n }\n catch (error) {\n // Fallback to `utf8`\n response.body = rawBody.toString();\n if (is_response_ok_1.isResponseOk(response)) {\n request._beforeError(error);\n return;\n }\n }\n }\n try {\n for (const [index, hook] of options.hooks.afterResponse.entries()) {\n // @ts-expect-error TS doesn't notice that CancelableRequest is a Promise\n // eslint-disable-next-line no-await-in-loop\n response = await hook(response, async (updatedOptions) => {\n const typedOptions = core_1.default.normalizeArguments(undefined, {\n ...updatedOptions,\n retry: {\n calculateDelay: () => 0\n },\n throwHttpErrors: false,\n resolveBodyOnly: false\n }, options);\n // Remove any further hooks for that request, because we'll call them anyway.\n // The loop continues. We don't want duplicates (asPromise recursion).\n typedOptions.hooks.afterResponse = typedOptions.hooks.afterResponse.slice(0, index);\n for (const hook of typedOptions.hooks.beforeRetry) {\n // eslint-disable-next-line no-await-in-loop\n await hook(typedOptions);\n }\n const promise = asPromise(typedOptions);\n onCancel(() => {\n promise.catch(() => { });\n promise.cancel();\n });\n return promise;\n });\n }\n }\n catch (error) {\n request._beforeError(new types_1.RequestError(error.message, error, request));\n return;\n }\n if (!is_response_ok_1.isResponseOk(response)) {\n request._beforeError(new types_1.HTTPError(response));\n return;\n }\n globalResponse = response;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n });\n const onError = (error) => {\n if (promise.isCanceled) {\n return;\n }\n const { options } = request;\n if (error instanceof types_1.HTTPError && !options.throwHttpErrors) {\n const { response } = error;\n resolve(request.options.resolveBodyOnly ? response.body : response);\n return;\n }\n reject(error);\n };\n request.once('error', onError);\n const previousBody = request.options.body;\n request.once('retry', (newRetryCount, error) => {\n var _a, _b;\n if (previousBody === ((_a = error.request) === null || _a === void 0 ? void 0 : _a.options.body) && is_1.default.nodeStream((_b = error.request) === null || _b === void 0 ? void 0 : _b.options.body)) {\n onError(error);\n return;\n }\n makeRequest(newRetryCount);\n });\n proxy_events_1.default(request, emitter, proxiedRequestEvents);\n };\n makeRequest(0);\n });\n promise.on = (event, fn) => {\n emitter.on(event, fn);\n return promise;\n };\n const shortcut = (responseType) => {\n const newPromise = (async () => {\n // Wait until downloading has ended\n await promise;\n const { options } = globalResponse.request;\n return parse_body_1.default(globalResponse, responseType, options.parseJson, options.encoding);\n })();\n Object.defineProperties(newPromise, Object.getOwnPropertyDescriptors(promise));\n return newPromise;\n };\n promise.json = () => {\n const { headers } = globalRequest.options;\n if (!globalRequest.writableFinished && headers.accept === undefined) {\n headers.accept = 'application/json';\n }\n return shortcut('json');\n };\n promise.buffer = () => shortcut('buffer');\n promise.text = () => shortcut('text');\n return promise;\n}\nexports.default = asPromise;\n__exportStar(require(\"./types\"), exports);\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst types_1 = require(\"./types\");\nfunction createRejection(error, ...beforeErrorGroups) {\n const promise = (async () => {\n if (error instanceof types_1.RequestError) {\n try {\n for (const hooks of beforeErrorGroups) {\n if (hooks) {\n for (const hook of hooks) {\n // eslint-disable-next-line no-await-in-loop\n error = await hook(error);\n }\n }\n }\n }\n catch (error_) {\n error = error_;\n }\n }\n throw error;\n })();\n const returnPromise = () => promise;\n promise.json = returnPromise;\n promise.text = returnPromise;\n promise.buffer = returnPromise;\n promise.on = returnPromise;\n return promise;\n}\nexports.default = createRejection;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst is_1 = require(\"@sindresorhus/is\");\nfunction deepFreeze(object) {\n for (const value of Object.values(object)) {\n if (is_1.default.plainObject(value) || is_1.default.array(value)) {\n deepFreeze(value);\n }\n }\n return Object.freeze(object);\n}\nexports.default = deepFreeze;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultHandler = void 0;\nconst is_1 = require(\"@sindresorhus/is\");\nconst as_promise_1 = require(\"./as-promise\");\nconst create_rejection_1 = require(\"./as-promise/create-rejection\");\nconst core_1 = require(\"./core\");\nconst deep_freeze_1 = require(\"./utils/deep-freeze\");\nconst errors = {\n RequestError: as_promise_1.RequestError,\n CacheError: as_promise_1.CacheError,\n ReadError: as_promise_1.ReadError,\n HTTPError: as_promise_1.HTTPError,\n MaxRedirectsError: as_promise_1.MaxRedirectsError,\n TimeoutError: as_promise_1.TimeoutError,\n ParseError: as_promise_1.ParseError,\n CancelError: as_promise_1.CancelError,\n UnsupportedProtocolError: as_promise_1.UnsupportedProtocolError,\n UploadError: as_promise_1.UploadError\n};\n// The `delay` package weighs 10KB (!)\nconst delay = async (ms) => new Promise(resolve => {\n setTimeout(resolve, ms);\n});\nconst { normalizeArguments } = core_1.default;\nconst mergeOptions = (...sources) => {\n let mergedOptions;\n for (const source of sources) {\n mergedOptions = normalizeArguments(undefined, source, mergedOptions);\n }\n return mergedOptions;\n};\nconst getPromiseOrStream = (options) => options.isStream ? new core_1.default(undefined, options) : as_promise_1.default(options);\nconst isGotInstance = (value) => ('defaults' in value && 'options' in value.defaults);\nconst aliases = [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'head',\n 'delete'\n];\nexports.defaultHandler = (options, next) => next(options);\nconst callInitHooks = (hooks, options) => {\n if (hooks) {\n for (const hook of hooks) {\n hook(options);\n }\n }\n};\nconst create = (defaults) => {\n // Proxy properties from next handlers\n defaults._rawHandlers = defaults.handlers;\n defaults.handlers = defaults.handlers.map(fn => ((options, next) => {\n // This will be assigned by assigning result\n let root;\n const result = fn(options, newOptions => {\n root = next(newOptions);\n return root;\n });\n if (result !== root && !options.isStream && root) {\n const typedResult = result;\n const { then: promiseThen, catch: promiseCatch, finally: promiseFianlly } = typedResult;\n Object.setPrototypeOf(typedResult, Object.getPrototypeOf(root));\n Object.defineProperties(typedResult, Object.getOwnPropertyDescriptors(root));\n // These should point to the new promise\n // eslint-disable-next-line promise/prefer-await-to-then\n typedResult.then = promiseThen;\n typedResult.catch = promiseCatch;\n typedResult.finally = promiseFianlly;\n }\n return result;\n }));\n // Got interface\n const got = ((url, options = {}, _defaults) => {\n var _a, _b;\n let iteration = 0;\n const iterateHandlers = (newOptions) => {\n return defaults.handlers[iteration++](newOptions, iteration === defaults.handlers.length ? getPromiseOrStream : iterateHandlers);\n };\n // TODO: Remove this in Got 12.\n if (is_1.default.plainObject(url)) {\n const mergedOptions = {\n ...url,\n ...options\n };\n core_1.setNonEnumerableProperties([url, options], mergedOptions);\n options = mergedOptions;\n url = undefined;\n }\n try {\n // Call `init` hooks\n let initHookError;\n try {\n callInitHooks(defaults.options.hooks.init, options);\n callInitHooks((_a = options.hooks) === null || _a === void 0 ? void 0 : _a.init, options);\n }\n catch (error) {\n initHookError = error;\n }\n // Normalize options & call handlers\n const normalizedOptions = normalizeArguments(url, options, _defaults !== null && _defaults !== void 0 ? _defaults : defaults.options);\n normalizedOptions[core_1.kIsNormalizedAlready] = true;\n if (initHookError) {\n throw new as_promise_1.RequestError(initHookError.message, initHookError, normalizedOptions);\n }\n return iterateHandlers(normalizedOptions);\n }\n catch (error) {\n if (options.isStream) {\n throw error;\n }\n else {\n return create_rejection_1.default(error, defaults.options.hooks.beforeError, (_b = options.hooks) === null || _b === void 0 ? void 0 : _b.beforeError);\n }\n }\n });\n got.extend = (...instancesOrOptions) => {\n const optionsArray = [defaults.options];\n let handlers = [...defaults._rawHandlers];\n let isMutableDefaults;\n for (const value of instancesOrOptions) {\n if (isGotInstance(value)) {\n optionsArray.push(value.defaults.options);\n handlers.push(...value.defaults._rawHandlers);\n isMutableDefaults = value.defaults.mutableDefaults;\n }\n else {\n optionsArray.push(value);\n if ('handlers' in value) {\n handlers.push(...value.handlers);\n }\n isMutableDefaults = value.mutableDefaults;\n }\n }\n handlers = handlers.filter(handler => handler !== exports.defaultHandler);\n if (handlers.length === 0) {\n handlers.push(exports.defaultHandler);\n }\n return create({\n options: mergeOptions(...optionsArray),\n handlers,\n mutableDefaults: Boolean(isMutableDefaults)\n });\n };\n // Pagination\n const paginateEach = (async function* (url, options) {\n // TODO: Remove this `@ts-expect-error` when upgrading to TypeScript 4.\n // Error: Argument of type 'Merge<Options, PaginationOptions<T, R>> | undefined' is not assignable to parameter of type 'Options | undefined'.\n // @ts-expect-error\n let normalizedOptions = normalizeArguments(url, options, defaults.options);\n normalizedOptions.resolveBodyOnly = false;\n const pagination = normalizedOptions.pagination;\n if (!is_1.default.object(pagination)) {\n throw new TypeError('`options.pagination` must be implemented');\n }\n const all = [];\n let { countLimit } = pagination;\n let numberOfRequests = 0;\n while (numberOfRequests < pagination.requestLimit) {\n if (numberOfRequests !== 0) {\n // eslint-disable-next-line no-await-in-loop\n await delay(pagination.backoff);\n }\n // @ts-expect-error FIXME!\n // TODO: Throw when result is not an instance of Response\n // eslint-disable-next-line no-await-in-loop\n const result = (await got(undefined, undefined, normalizedOptions));\n // eslint-disable-next-line no-await-in-loop\n const parsed = await pagination.transform(result);\n const current = [];\n for (const item of parsed) {\n if (pagination.filter(item, all, current)) {\n if (!pagination.shouldContinue(item, all, current)) {\n return;\n }\n yield item;\n if (pagination.stackAllItems) {\n all.push(item);\n }\n current.push(item);\n if (--countLimit <= 0) {\n return;\n }\n }\n }\n const optionsToMerge = pagination.paginate(result, all, current);\n if (optionsToMerge === false) {\n return;\n }\n if (optionsToMerge === result.request.options) {\n normalizedOptions = result.request.options;\n }\n else if (optionsToMerge !== undefined) {\n normalizedOptions = normalizeArguments(undefined, optionsToMerge, normalizedOptions);\n }\n numberOfRequests++;\n }\n });\n got.paginate = paginateEach;\n got.paginate.all = (async (url, options) => {\n const results = [];\n for await (const item of paginateEach(url, options)) {\n results.push(item);\n }\n return results;\n });\n // For those who like very descriptive names\n got.paginate.each = paginateEach;\n // Stream API\n got.stream = ((url, options) => got(url, { ...options, isStream: true }));\n // Shortcuts\n for (const method of aliases) {\n got[method] = ((url, options) => got(url, { ...options, method }));\n got.stream[method] = ((url, options) => {\n return got(url, { ...options, method, isStream: true });\n });\n }\n Object.assign(got, errors);\n Object.defineProperty(got, 'defaults', {\n value: defaults.mutableDefaults ? defaults : deep_freeze_1.default(defaults),\n writable: defaults.mutableDefaults,\n configurable: defaults.mutableDefaults,\n enumerable: true\n });\n got.mergeOptions = mergeOptions;\n return got;\n};\nexports.default = create;\n__exportStar(require(\"./types\"), exports);\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst url_1 = require(\"url\");\nconst create_1 = require(\"./create\");\nconst defaults = {\n options: {\n method: 'GET',\n retry: {\n limit: 2,\n methods: [\n 'GET',\n 'PUT',\n 'HEAD',\n 'DELETE',\n 'OPTIONS',\n 'TRACE'\n ],\n statusCodes: [\n 408,\n 413,\n 429,\n 500,\n 502,\n 503,\n 504,\n 521,\n 522,\n 524\n ],\n errorCodes: [\n 'ETIMEDOUT',\n 'ECONNRESET',\n 'EADDRINUSE',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ENOTFOUND',\n 'ENETUNREACH',\n 'EAI_AGAIN'\n ],\n maxRetryAfter: undefined,\n calculateDelay: ({ computedValue }) => computedValue\n },\n timeout: {},\n headers: {\n 'user-agent': 'got (https://github.com/sindresorhus/got)'\n },\n hooks: {\n init: [],\n beforeRequest: [],\n beforeRedirect: [],\n beforeRetry: [],\n beforeError: [],\n afterResponse: []\n },\n cache: undefined,\n dnsCache: undefined,\n decompress: true,\n throwHttpErrors: true,\n followRedirect: true,\n isStream: false,\n responseType: 'text',\n resolveBodyOnly: false,\n maxRedirects: 10,\n prefixUrl: '',\n methodRewriting: true,\n ignoreInvalidCookies: false,\n context: {},\n // TODO: Set this to `true` when Got 12 gets released\n http2: false,\n allowGetBody: false,\n https: undefined,\n pagination: {\n transform: (response) => {\n if (response.request.options.responseType === 'json') {\n return response.body;\n }\n return JSON.parse(response.body);\n },\n paginate: response => {\n if (!Reflect.has(response.headers, 'link')) {\n return false;\n }\n const items = response.headers.link.split(',');\n let next;\n for (const item of items) {\n const parsed = item.split(';');\n if (parsed[1].includes('next')) {\n next = parsed[0].trimStart().trim();\n next = next.slice(1, -1);\n break;\n }\n }\n if (next) {\n const options = {\n url: new url_1.URL(next)\n };\n return options;\n }\n return false;\n },\n filter: () => true,\n shouldContinue: () => true,\n countLimit: Infinity,\n backoff: 0,\n requestLimit: 10000,\n stackAllItems: true\n },\n parseJson: (text) => JSON.parse(text),\n stringifyJson: (object) => JSON.stringify(object),\n cacheOptions: {}\n },\n handlers: [create_1.defaultHandler],\n mutableDefaults: false\n};\nconst got = create_1.default(defaults);\nexports.default = got;\n// For CommonJS default export support\nmodule.exports = got;\nmodule.exports.default = got;\nmodule.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267\n__exportStar(require(\"./create\"), exports);\n__exportStar(require(\"./as-promise\"), exports);\n", "'use strict'\n\nfunction isFunction (funktion) {\n return typeof funktion === 'function'\n}\n\n// Default to complaining loudly when things don't go according to plan.\nvar logger = console.error.bind(console)\n\n// Sets a property on an object, preserving its enumerability.\n// This function assumes that the property is already writable.\nfunction defineProperty (obj, name, value) {\n var enumerable = !!obj[name] && obj.propertyIsEnumerable(name)\n Object.defineProperty(obj, name, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n })\n}\n\n// Keep initialization idempotent.\nfunction shimmer (options) {\n if (options && options.logger) {\n if (!isFunction(options.logger)) logger(\"new logger isn't a function, not replacing\")\n else logger = options.logger\n }\n}\n\nfunction wrap (nodule, name, wrapper) {\n if (!nodule || !nodule[name]) {\n logger('no original function ' + name + ' to wrap')\n return\n }\n\n if (!wrapper) {\n logger('no wrapper function')\n logger((new Error()).stack)\n return\n }\n\n if (!isFunction(nodule[name]) || !isFunction(wrapper)) {\n logger('original object and wrapper must be functions')\n return\n }\n\n var original = nodule[name]\n var wrapped = wrapper(original, name)\n\n defineProperty(wrapped, '__original', original)\n defineProperty(wrapped, '__unwrap', function () {\n if (nodule[name] === wrapped) defineProperty(nodule, name, original)\n })\n defineProperty(wrapped, '__wrapped', true)\n\n defineProperty(nodule, name, wrapped)\n return wrapped\n}\n\nfunction massWrap (nodules, names, wrapper) {\n if (!nodules) {\n logger('must provide one or more modules to patch')\n logger((new Error()).stack)\n return\n } else if (!Array.isArray(nodules)) {\n nodules = [nodules]\n }\n\n if (!(names && Array.isArray(names))) {\n logger('must provide one or more functions to wrap on modules')\n return\n }\n\n nodules.forEach(function (nodule) {\n names.forEach(function (name) {\n wrap(nodule, name, wrapper)\n })\n })\n}\n\nfunction unwrap (nodule, name) {\n if (!nodule || !nodule[name]) {\n logger('no function to unwrap.')\n logger((new Error()).stack)\n return\n }\n\n if (!nodule[name].__unwrap) {\n logger('no original to unwrap to -- has ' + name + ' already been unwrapped?')\n } else {\n return nodule[name].__unwrap()\n }\n}\n\nfunction massUnwrap (nodules, names) {\n if (!nodules) {\n logger('must provide one or more modules to patch')\n logger((new Error()).stack)\n return\n } else if (!Array.isArray(nodules)) {\n nodules = [nodules]\n }\n\n if (!(names && Array.isArray(names))) {\n logger('must provide one or more functions to unwrap on modules')\n return\n }\n\n nodules.forEach(function (nodule) {\n names.forEach(function (name) {\n unwrap(nodule, name)\n })\n })\n}\n\nshimmer.wrap = wrap\nshimmer.massWrap = massWrap\nshimmer.unwrap = unwrap\nshimmer.massUnwrap = massUnwrap\n\nmodule.exports = shimmer\n", "'use strict';\n\nvar shimmer = require('shimmer');\nvar wrap = shimmer.wrap;\nvar unwrap = shimmer.unwrap;\n\n// Default to complaining loudly when things don't go according to plan.\n// dunderscores are boring\nvar SYMBOL = 'wrap@before';\n\n// Sets a property on an object, preserving its enumerability.\n// This function assumes that the property is already writable.\nfunction defineProperty(obj, name, value) {\n var enumerable = !!obj[name] && obj.propertyIsEnumerable(name);\n Object.defineProperty(obj, name, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n });\n}\n\nfunction _process(self, listeners) {\n var l = listeners.length;\n for (var p = 0; p < l; p++) {\n var listener = listeners[p];\n // set up the listener so that onEmit can do whatever it needs\n var before = self[SYMBOL];\n if (typeof before === 'function') {\n before(listener);\n }\n else if (Array.isArray(before)) {\n var length = before.length;\n for (var i = 0; i < length; i++) before[i](listener);\n }\n }\n}\n\nfunction _listeners(self, event) {\n var listeners;\n listeners = self._events && self._events[event];\n if (!Array.isArray(listeners)) {\n if (listeners) {\n listeners = [listeners];\n }\n else {\n listeners = [];\n }\n }\n\n return listeners;\n}\n\nfunction _findAndProcess(self, event, before) {\n var after = _listeners(self, event);\n var unprocessed = after.filter(function(fn) { return before.indexOf(fn) === -1; });\n if (unprocessed.length > 0) _process(self, unprocessed);\n}\n\nfunction _wrap(unwrapped, visit) {\n if (!unwrapped) return;\n\n var wrapped = unwrapped;\n if (typeof unwrapped === 'function') {\n wrapped = visit(unwrapped);\n }\n else if (Array.isArray(unwrapped)) {\n wrapped = [];\n for (var i = 0; i < unwrapped.length; i++) {\n wrapped[i] = visit(unwrapped[i]);\n }\n }\n return wrapped;\n}\n\nmodule.exports = function wrapEmitter(emitter, onAddListener, onEmit) {\n if (!emitter || !emitter.on || !emitter.addListener ||\n !emitter.removeListener || !emitter.emit) {\n throw new Error(\"can only wrap real EEs\");\n }\n\n if (!onAddListener) throw new Error(\"must have function to run on listener addition\");\n if (!onEmit) throw new Error(\"must have function to wrap listeners when emitting\");\n\n /* Attach a context to a listener, and make sure that this hook stays\n * attached to the emitter forevermore.\n */\n function adding(on) {\n return function added(event, listener) {\n var existing = _listeners(this, event).slice();\n\n try {\n var returned = on.call(this, event, listener);\n _findAndProcess(this, event, existing);\n return returned;\n }\n finally {\n // old-style streaming overwrites .on and .addListener, so rewrap\n if (!this.on.__wrapped) wrap(this, 'on', adding);\n if (!this.addListener.__wrapped) wrap(this, 'addListener', adding);\n }\n };\n }\n\n function emitting(emit) {\n return function emitted(event) {\n if (!this._events || !this._events[event]) return emit.apply(this, arguments);\n\n var unwrapped = this._events[event];\n\n /* Ensure that if removeListener gets called, it's working with the\n * unwrapped listeners.\n */\n function remover(removeListener) {\n return function removed() {\n this._events[event] = unwrapped;\n try {\n return removeListener.apply(this, arguments);\n }\n finally {\n unwrapped = this._events[event];\n this._events[event] = _wrap(unwrapped, onEmit);\n }\n };\n }\n wrap(this, 'removeListener', remover);\n\n try {\n /* At emit time, ensure that whatever else is going on, removeListener will\n * still work while at the same time running whatever hooks are necessary to\n * make sure the listener is run in the correct context.\n */\n this._events[event] = _wrap(unwrapped, onEmit);\n return emit.apply(this, arguments);\n }\n finally {\n /* Ensure that regardless of what happens when preparing and running the\n * listeners, the status quo ante is restored before continuing.\n */\n unwrap(this, 'removeListener');\n this._events[event] = unwrapped;\n }\n };\n }\n\n // support multiple onAddListeners\n if (!emitter[SYMBOL]) {\n defineProperty(emitter, SYMBOL, onAddListener);\n }\n else if (typeof emitter[SYMBOL] === 'function') {\n defineProperty(emitter, SYMBOL, [emitter[SYMBOL], onAddListener]);\n }\n else if (Array.isArray(emitter[SYMBOL])) {\n emitter[SYMBOL].push(onAddListener);\n }\n\n // only wrap the core functions once\n if (!emitter.__wrapped) {\n wrap(emitter, 'addListener', adding);\n wrap(emitter, 'on', adding);\n wrap(emitter, 'emit', emitting);\n\n defineProperty(emitter, '__unwrap', function () {\n unwrap(emitter, 'addListener');\n unwrap(emitter, 'on');\n unwrap(emitter, 'emit');\n delete emitter[SYMBOL];\n delete emitter.__wrapped;\n });\n defineProperty(emitter, '__wrapped', true);\n }\n};\n", "/* eslint-disable max-len */\n'use strict';\n\nconst util = require('util');\nconst assert = require('assert');\nconst wrapEmitter = require('emitter-listener');\nconst async_hooks = require('async_hooks');\n\nconst CONTEXTS_SYMBOL = 'cls@contexts';\nconst ERROR_SYMBOL = 'error@context';\n\nconst DEBUG_CLS_HOOKED = process.env.DEBUG_CLS_HOOKED;\n\nlet currentUid = -1;\n\nmodule.exports = {\n getNamespace: getNamespace,\n createNamespace: createNamespace,\n destroyNamespace: destroyNamespace,\n reset: reset,\n ERROR_SYMBOL: ERROR_SYMBOL\n};\n\nfunction Namespace(name) {\n this.name = name;\n // changed in 2.7: no default context\n this.active = null;\n this._set = [];\n this.id = null;\n this._contexts = new Map();\n this._indent = 0;\n}\n\nNamespace.prototype.set = function set(key, value) {\n if (!this.active) {\n throw new Error('No context available. ns.run() or ns.bind() must be called first.');\n }\n\n this.active[key] = value;\n\n if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(indentStr + 'CONTEXT-SET KEY:' + key + '=' + value + ' in ns:' + this.name + ' currentUid:' + currentUid + ' active:' + util.inspect(this.active, {showHidden:true, depth:2, colors:true}));\n }\n\n return value;\n};\n\nNamespace.prototype.get = function get(key) {\n if (!this.active) {\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.currentId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n //debug2(indentStr + 'CONTEXT-GETTING KEY NO ACTIVE NS:' + key + '=undefined' + ' (' + this.name + ') currentUid:' + currentUid + ' active:' + util.inspect(this.active, {showHidden:true, depth:2, colors:true}));\n debug2(`${indentStr}CONTEXT-GETTING KEY NO ACTIVE NS: (${this.name}) ${key}=undefined currentUid:${currentUid} asyncHooksCurrentId:${asyncHooksCurrentId} triggerId:${triggerId} len:${this._set.length}`);\n }\n return undefined;\n }\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(indentStr + 'CONTEXT-GETTING KEY:' + key + '=' + this.active[key] + ' (' + this.name + ') currentUid:' + currentUid + ' active:' + util.inspect(this.active, {showHidden:true, depth:2, colors:true}));\n debug2(`${indentStr}CONTEXT-GETTING KEY: (${this.name}) ${key}=${this.active[key]} currentUid:${currentUid} asyncHooksCurrentId:${asyncHooksCurrentId} triggerId:${triggerId} len:${this._set.length} active:${util.inspect(this.active)}`);\n }\n return this.active[key];\n};\n\nNamespace.prototype.createContext = function createContext() {\n // Prototype inherit existing context if created a new child context within existing context.\n let context = Object.create(this.active ? this.active : Object.prototype);\n context._ns_name = this.name;\n context.id = currentUid;\n\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-CREATED Context: (${this.name}) currentUid:${currentUid} asyncHooksCurrentId:${asyncHooksCurrentId} triggerId:${triggerId} len:${this._set.length} context:${util.inspect(context, {showHidden:true, depth:2, colors:true})}`);\n }\n\n return context;\n};\n\nNamespace.prototype.run = function run(fn) {\n let context = this.createContext();\n this.enter(context);\n\n try {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-RUN BEGIN: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} context:${util.inspect(context)}`);\n }\n fn(context);\n return context;\n } catch (exception) {\n if (exception) {\n exception[ERROR_SYMBOL] = context;\n }\n throw exception;\n } finally {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-RUN END: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} ${util.inspect(context)}`);\n }\n this.exit(context);\n }\n};\n\nNamespace.prototype.runAndReturn = function runAndReturn(fn) {\n let value;\n this.run(function (context) {\n value = fn(context);\n });\n return value;\n};\n\n/**\n * Uses global Promise and assumes Promise is cls friendly or wrapped already.\n * @param {function} fn\n * @returns {*}\n */\nNamespace.prototype.runPromise = function runPromise(fn) {\n let context = this.createContext();\n this.enter(context);\n\n let promise = fn(context);\n if (!promise || !promise.then || !promise.catch) {\n throw new Error('fn must return a promise.');\n }\n\n if (DEBUG_CLS_HOOKED) {\n debug2('CONTEXT-runPromise BEFORE: (' + this.name + ') currentUid:' + currentUid + ' len:' + this._set.length + ' ' + util.inspect(context));\n }\n\n return promise\n .then(result => {\n if (DEBUG_CLS_HOOKED) {\n debug2('CONTEXT-runPromise AFTER then: (' + this.name + ') currentUid:' + currentUid + ' len:' + this._set.length + ' ' + util.inspect(context));\n }\n this.exit(context);\n return result;\n })\n .catch(err => {\n err[ERROR_SYMBOL] = context;\n if (DEBUG_CLS_HOOKED) {\n debug2('CONTEXT-runPromise AFTER catch: (' + this.name + ') currentUid:' + currentUid + ' len:' + this._set.length + ' ' + util.inspect(context));\n }\n this.exit(context);\n throw err;\n });\n};\n\nNamespace.prototype.bind = function bindFactory(fn, context) {\n if (!context) {\n if (!this.active) {\n context = this.createContext();\n } else {\n context = this.active;\n }\n }\n\n let self = this;\n return function clsBind() {\n self.enter(context);\n try {\n return fn.apply(this, arguments);\n } catch (exception) {\n if (exception) {\n exception[ERROR_SYMBOL] = context;\n }\n throw exception;\n } finally {\n self.exit(context);\n }\n };\n};\n\nNamespace.prototype.enter = function enter(context) {\n assert.ok(context, 'context must be provided for entering');\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-ENTER: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} ${util.inspect(context)}`);\n }\n\n this._set.push(this.active);\n this.active = context;\n};\n\nNamespace.prototype.exit = function exit(context) {\n assert.ok(context, 'context must be provided for exiting');\n if (DEBUG_CLS_HOOKED) {\n const asyncHooksCurrentId = async_hooks.executionAsyncId();\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);\n debug2(`${indentStr}CONTEXT-EXIT: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} ${util.inspect(context)}`);\n }\n\n // Fast path for most exits that are at the top of the stack\n if (this.active === context) {\n assert.ok(this._set.length, 'can\\'t remove top context');\n this.active = this._set.pop();\n return;\n }\n\n // Fast search in the stack using lastIndexOf\n let index = this._set.lastIndexOf(context);\n\n if (index < 0) {\n if (DEBUG_CLS_HOOKED) {\n debug2('??ERROR?? context exiting but not entered - ignoring: ' + util.inspect(context));\n }\n assert.ok(index >= 0, 'context not currently entered; can\\'t exit. \\n' + util.inspect(this) + '\\n' + util.inspect(context));\n } else {\n assert.ok(index, 'can\\'t remove top context');\n this._set.splice(index, 1);\n }\n};\n\nNamespace.prototype.bindEmitter = function bindEmitter(emitter) {\n assert.ok(emitter.on && emitter.addListener && emitter.emit, 'can only bind real EEs');\n\n let namespace = this;\n let thisSymbol = 'context@' + this.name;\n\n // Capture the context active at the time the emitter is bound.\n function attach(listener) {\n if (!listener) {\n return;\n }\n if (!listener[CONTEXTS_SYMBOL]) {\n listener[CONTEXTS_SYMBOL] = Object.create(null);\n }\n\n listener[CONTEXTS_SYMBOL][thisSymbol] = {\n namespace: namespace,\n context: namespace.active\n };\n }\n\n // At emit time, bind the listener within the correct context.\n function bind(unwrapped) {\n if (!(unwrapped && unwrapped[CONTEXTS_SYMBOL])) {\n return unwrapped;\n }\n\n let wrapped = unwrapped;\n let unwrappedContexts = unwrapped[CONTEXTS_SYMBOL];\n Object.keys(unwrappedContexts).forEach(function (name) {\n let thunk = unwrappedContexts[name];\n wrapped = thunk.namespace.bind(wrapped, thunk.context);\n });\n return wrapped;\n }\n\n wrapEmitter(emitter, attach, bind);\n};\n\n/**\n * If an error comes out of a namespace, it will have a context attached to it.\n * This function knows how to find it.\n *\n * @param {Error} exception Possibly annotated error.\n */\nNamespace.prototype.fromException = function fromException(exception) {\n return exception[ERROR_SYMBOL];\n};\n\nfunction getNamespace(name) {\n return process.namespaces[name];\n}\n\nfunction createNamespace(name) {\n assert.ok(name, 'namespace must be given a name.');\n\n if (DEBUG_CLS_HOOKED) {\n debug2(`NS-CREATING NAMESPACE (${name})`);\n }\n let namespace = new Namespace(name);\n namespace.id = currentUid;\n\n const hook = async_hooks.createHook({\n init(asyncId, type, triggerId, resource) {\n currentUid = async_hooks.executionAsyncId();\n\n //CHAIN Parent's Context onto child if none exists. This is needed to pass net-events.spec\n // let initContext = namespace.active;\n // if(!initContext && triggerId) {\n // let parentContext = namespace._contexts.get(triggerId);\n // if (parentContext) {\n // namespace.active = parentContext;\n // namespace._contexts.set(currentUid, parentContext);\n // if (DEBUG_CLS_HOOKED) {\n // const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n // debug2(`${indentStr}INIT [${type}] (${name}) WITH PARENT CONTEXT asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, true)} resource:${resource}`);\n // }\n // } else if (DEBUG_CLS_HOOKED) {\n // const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n // debug2(`${indentStr}INIT [${type}] (${name}) MISSING CONTEXT asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, true)} resource:${resource}`);\n // }\n // }else {\n // namespace._contexts.set(currentUid, namespace.active);\n // if (DEBUG_CLS_HOOKED) {\n // const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n // debug2(`${indentStr}INIT [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, true)} resource:${resource}`);\n // }\n // }\n if(namespace.active) {\n namespace._contexts.set(asyncId, namespace.active);\n\n if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} resource:${resource}`);\n }\n }else if(currentUid === 0){\n // CurrentId will be 0 when triggered from C++. Promise events\n // https://github.com/nodejs/node/blob/master/doc/api/async_hooks.md#triggerid\n const triggerId = async_hooks.triggerAsyncId();\n const triggerIdContext = namespace._contexts.get(triggerId);\n if (triggerIdContext) {\n namespace._contexts.set(asyncId, triggerIdContext);\n if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT USING CONTEXT FROM TRIGGERID [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, { showHidden: true, depth: 2, colors: true })} resource:${resource}`);\n }\n } else if (DEBUG_CLS_HOOKED) {\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT MISSING CONTEXT [${type}] (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, { showHidden: true, depth: 2, colors: true })} resource:${resource}`);\n }\n }\n\n\n if(DEBUG_CLS_HOOKED && type === 'PROMISE'){\n debug2(util.inspect(resource, {showHidden: true}));\n const parentId = resource.parentId;\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}INIT RESOURCE-PROMISE [${type}] (${name}) parentId:${parentId} asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} resource:${resource}`);\n }\n\n },\n before(asyncId) {\n currentUid = async_hooks.executionAsyncId();\n let context;\n\n /*\n if(currentUid === 0){\n // CurrentId will be 0 when triggered from C++. Promise events\n // https://github.com/nodejs/node/blob/master/doc/api/async_hooks.md#triggerid\n //const triggerId = async_hooks.triggerAsyncId();\n context = namespace._contexts.get(asyncId); // || namespace._contexts.get(triggerId);\n }else{\n context = namespace._contexts.get(currentUid);\n }\n */\n\n //HACK to work with promises until they are fixed in node > 8.1.1\n context = namespace._contexts.get(asyncId) || namespace._contexts.get(currentUid);\n\n if (context) {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}BEFORE (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(context)}`);\n namespace._indent += 2;\n }\n\n namespace.enter(context);\n\n } else if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}BEFORE MISSING CONTEXT (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} namespace._contexts:${util.inspect(namespace._contexts, {showHidden:true, depth:2, colors:true})}`);\n namespace._indent += 2;\n }\n },\n after(asyncId) {\n currentUid = async_hooks.executionAsyncId();\n let context; // = namespace._contexts.get(currentUid);\n /*\n if(currentUid === 0){\n // CurrentId will be 0 when triggered from C++. Promise events\n // https://github.com/nodejs/node/blob/master/doc/api/async_hooks.md#triggerid\n //const triggerId = async_hooks.triggerAsyncId();\n context = namespace._contexts.get(asyncId); // || namespace._contexts.get(triggerId);\n }else{\n context = namespace._contexts.get(currentUid);\n }\n */\n //HACK to work with promises until they are fixed in node > 8.1.1\n context = namespace._contexts.get(asyncId) || namespace._contexts.get(currentUid);\n\n if (context) {\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n namespace._indent -= 2;\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}AFTER (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(context)}`);\n }\n\n namespace.exit(context);\n\n } else if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n namespace._indent -= 2;\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}AFTER MISSING CONTEXT (${name}) asyncId:${asyncId} currentUid:${currentUid} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(context)}`);\n }\n },\n destroy(asyncId) {\n currentUid = async_hooks.executionAsyncId();\n if (DEBUG_CLS_HOOKED) {\n const triggerId = async_hooks.triggerAsyncId();\n const indentStr = ' '.repeat(namespace._indent < 0 ? 0 : namespace._indent);\n debug2(`${indentStr}DESTROY (${name}) currentUid:${currentUid} asyncId:${asyncId} triggerId:${triggerId} active:${util.inspect(namespace.active, {showHidden:true, depth:2, colors:true})} context:${util.inspect(namespace._contexts.get(currentUid))}`);\n }\n\n namespace._contexts.delete(asyncId);\n }\n });\n\n hook.enable();\n\n process.namespaces[name] = namespace;\n return namespace;\n}\n\nfunction destroyNamespace(name) {\n let namespace = getNamespace(name);\n\n assert.ok(namespace, 'can\\'t delete nonexistent namespace! \"' + name + '\"');\n assert.ok(namespace.id, 'don\\'t assign to process.namespaces directly! ' + util.inspect(namespace));\n\n process.namespaces[name] = null;\n}\n\nfunction reset() {\n // must unregister async listeners\n if (process.namespaces) {\n Object.keys(process.namespaces).forEach(function (name) {\n destroyNamespace(name);\n });\n }\n process.namespaces = Object.create(null);\n}\n\nprocess.namespaces = {};\n\n//const fs = require('fs');\nfunction debug2(...args) {\n if (DEBUG_CLS_HOOKED) {\n //fs.writeSync(1, `${util.format(...args)}\\n`);\n process._rawDebug(`${util.format(...args)}`);\n }\n}\n\n/*function getFunctionName(fn) {\n if (!fn) {\n return fn;\n }\n if (typeof fn === 'function') {\n if (fn.name) {\n return fn.name;\n }\n return (fn.toString().trim().match(/^function\\s*([^\\s(]+)/) || [])[1];\n } else if (fn.constructor && fn.constructor.name) {\n return fn.constructor.name;\n }\n}*/\n\n\n", "\"use strict\";\nvar validLogLevels = ['debug', 'info', 'warn', 'error', 'silent'];\nvar defaultLogLevel = validLogLevels.indexOf('error');\nvar logLevel = calculateLogLevel(process.env.AWS_XRAY_DEBUG_MODE ? 'debug' : process.env.AWS_XRAY_LOG_LEVEL);\nvar logger = {\n error: createLoggerForLevel('error'),\n info: createLoggerForLevel('info'),\n warn: createLoggerForLevel('warn'),\n debug: createLoggerForLevel('debug'),\n};\nfunction createLoggerForLevel(level) {\n var loggerLevel = validLogLevels.indexOf(level);\n var consoleMethod = console[level] || console.log || (() => { });\n if (loggerLevel >= logLevel) {\n return (message, meta) => {\n if (message || meta) {\n consoleMethod(formatLogMessage(level, message, meta));\n }\n };\n }\n else {\n return () => { };\n }\n}\nfunction calculateLogLevel(level) {\n if (level) {\n var normalisedLevel = level.toLowerCase();\n var index = validLogLevels.indexOf(normalisedLevel);\n return index >= 0 ? index : defaultLogLevel;\n }\n // Silently ignore invalid log levels, default to default level\n return defaultLogLevel;\n}\nfunction createTimestamp(date) {\n var tzo = -date.getTimezoneOffset(), // Negate to make this tzo = local - UTC\n dif = tzo >= 0 ? '+' : '-', pad = function (num) {\n var norm = Math.floor(Math.abs(num));\n return (norm < 10 ? '0' : '') + norm;\n };\n return new Date(date.getTime() + (tzo * 60 * 1000)).toISOString()\n .replace(/T/, ' ')\n .replace(/Z/, ' ') +\n dif + pad(tzo / 60) +\n ':' + pad(tzo % 60);\n}\nfunction isLambdaFunction() {\n return process.env.LAMBDA_TASK_ROOT !== undefined;\n}\nfunction formatLogMessage(level, message, meta) {\n var messageParts = [];\n if (!isLambdaFunction()) {\n messageParts.push(createTimestamp(new Date()));\n messageParts.push(`[${level.toUpperCase()}]`);\n }\n if (message) {\n messageParts.push(message);\n }\n var logString = messageParts.join(' ');\n var metaDataString = formatMetaData(meta);\n return [logString, metaDataString].filter(str => str.length > 0).join('\\n ');\n}\nfunction formatMetaData(meta) {\n if (!meta) {\n return '';\n }\n return ((typeof (meta) === 'string') ? meta : JSON.stringify(meta));\n}\nvar logging = {\n setLogger: function setLogger(logObj) {\n logger = logObj;\n },\n getLogger: function getLogger() {\n return logger;\n }\n};\nmodule.exports = logging;\n", "\"use strict\";\n/**\n * Represents a captured exception.\n * @constructor\n * @param {Exception} err - The exception to capture.\n * @param {boolean} [remote] - Flag for whether the error was remote.\n */\nfunction CapturedException(err, remote) {\n this.init(err, remote);\n}\nCapturedException.prototype.init = function init(err, remote) {\n var e = (typeof err === 'string' || err instanceof String) ? { message: err, name: '' } : err;\n this.message = e.message;\n this.type = e.name;\n this.stack = [];\n this.remote = !!remote;\n if (e.stack) {\n var stack = e.stack.split('\\n');\n stack.shift();\n var self = this;\n stack.forEach(function (stackline) {\n var line = stackline.trim().replace(/\\(|\\)/g, '');\n line = line.substring(line.indexOf(' ') + 1);\n var label = line.lastIndexOf(' ') >= 0 ? line.slice(0, line.lastIndexOf(' ')) : null;\n var path = Array.isArray(label) && !label.length ? line : line.slice(line.lastIndexOf(' ') + 1);\n path = path.split(':');\n var entry = {\n path: path[0],\n line: parseInt(path[1]),\n label: label || 'anonymous'\n };\n self.stack.push(entry);\n });\n }\n};\nmodule.exports = CapturedException;\n", "module.exports = batcher\n\nfunction batcher (run) {\n var running = false\n var pendingBatch = null\n var pendingCallbacks = null\n var callbacks = null\n\n return append\n\n function done (err) {\n if (callbacks) callAll(callbacks, err)\n\n running = false\n callbacks = pendingCallbacks\n var nextBatch = pendingBatch\n\n pendingBatch = null\n pendingCallbacks = null\n\n if (!nextBatch || !nextBatch.length) {\n if (!callbacks || !callbacks.length) {\n callbacks = null\n return\n }\n if (!nextBatch) nextBatch = []\n }\n\n running = true\n run(nextBatch, done)\n }\n\n function append (val, cb) {\n if (running) {\n if (!pendingBatch) {\n pendingBatch = []\n pendingCallbacks = []\n }\n pushAll(pendingBatch, val)\n if (cb) pendingCallbacks.push(cb)\n } else {\n if (cb) callbacks = [cb]\n running = true\n run(Array.isArray(val) ? val : [val], done)\n }\n }\n}\n\nfunction pushAll (list, val) {\n if (Array.isArray(val)) pushArray(list, val)\n else list.push(val)\n}\n\nfunction pushArray (list, val) {\n for (var i = 0; i < val.length; i++) list.push(val[i])\n}\n\nfunction callAll (list, err) {\n for (var i = 0; i < list.length; i++) list[i](err)\n}\n", "\"use strict\";\nvar logger = require('./logger');\n/**\n * A module representing the X-Ray daemon configuration including the udp and tcp addresses.\n * @module DaemonConfig\n */\nvar DaemonConfig = {\n udp_ip: '127.0.0.1',\n udp_port: 2000,\n tcp_ip: '127.0.0.1',\n tcp_port: 2000,\n setDaemonAddress: function setDaemonAddress(address) {\n if (!process.env.AWS_XRAY_DAEMON_ADDRESS) {\n processAddress(address);\n logger.getLogger().info('Configured daemon address to ' + address + '.');\n }\n else {\n logger.getLogger().warn('Ignoring call to setDaemonAddress as AWS_XRAY_DAEMON_ADDRESS is set. ' +\n 'The current daemon address will not be changed.');\n }\n }\n};\nvar processAddress = function processAddress(address) {\n if (address.indexOf(':') === -1) {\n throw new Error('Invalid Daemon Address. You must specify an ip and port.');\n }\n else {\n var splitAddress = address.split(' ');\n if (splitAddress.length === 1) {\n // in format of 127.0.0.1:2000\n if (address.indexOf('udp') > -1 || address.indexOf('tcp') > -1) {\n throw new Error('Invalid Daemon Address. You must specify both tcp and udp addresses.');\n }\n var addr = address.split(':');\n if (!addr[0])\n throw new Error('Invalid Daemon Address. You must specify an ip.');\n DaemonConfig.udp_ip = addr[0];\n DaemonConfig.tcp_ip = addr[0];\n DaemonConfig.udp_port = addr[1];\n DaemonConfig.tcp_port = addr[1];\n }\n else if (splitAddress.length === 2) {\n // in format of udp:127.0.0.1:2000 tcp:127.0.0.1:2001\n var part_1 = splitAddress[0].split(':');\n var part_2 = splitAddress[1].split(':');\n var addr_map = {};\n addr_map[part_1[0]] = part_1;\n addr_map[part_2[0]] = part_2;\n DaemonConfig.udp_ip = addr_map['udp'][1];\n DaemonConfig.udp_port = parseInt(addr_map['udp'][2]);\n DaemonConfig.tcp_ip = addr_map['tcp'][1];\n DaemonConfig.tcp_port = parseInt(addr_map['tcp'][2]);\n if (!DaemonConfig.udp_port || !DaemonConfig.tcp_port) {\n throw new Error('Invalid Daemon Address. You must specify port number.');\n }\n }\n }\n};\nif (process.env.AWS_XRAY_DAEMON_ADDRESS)\n processAddress(process.env.AWS_XRAY_DAEMON_ADDRESS);\nmodule.exports = DaemonConfig;\n", "\"use strict\";\nvar dgram = require('dgram');\nvar batcher = require('atomic-batcher');\nvar logger = require('./logger');\nvar PROTOCOL_HEADER = '{\"format\":\"json\",\"version\":1}';\nvar PROTOCOL_DELIMITER = '\\n';\n/**\n * Sends a collection of data over a UDP socket. This method\n * is designed to be used by `atomic-batcher` as a way to share\n * a single UDP socket for sending multiple data blocks.\n *\n * @param {object} ops - Details of the data to send\n * @param {Function} callback - The function to call when done\n */\nfunction batchSendData(ops, callback) {\n var client = dgram.createSocket('udp4');\n executeSendData(client, ops, 0, function () {\n try {\n client.close();\n }\n finally {\n callback();\n }\n });\n}\n/**\n * Execute sending data starting at the specified index and\n * using the provided client.\n *\n * @param {Socket} client - Socket to send data with\n * @param {object} ops - Details of data to send\n * @param {number} index - Starting index for sending\n * @param {Function} callback - Function to call when done\n */\nfunction executeSendData(client, ops, index, callback) {\n if (index >= ops.length) {\n callback();\n return;\n }\n sendMessage(client, ops[index], function () {\n executeSendData(client, ops, index + 1, callback);\n });\n}\n/**\n * Send a single message over a UDP socket.\n *\n * @param {Socket} client - Socket to send data with\n * @param {object} data - Details of the data to send\n * @param {Function} batchCallback - Function to call when done\n */\nfunction sendMessage(client, data, batchCallback) {\n var msg = data.msg;\n var offset = data.offset;\n var length = data.length;\n var port = data.port;\n var address = data.address;\n var callback = data.callback;\n client.send(msg, offset, length, port, address, function (err) {\n try {\n callback(err);\n }\n finally {\n batchCallback();\n }\n });\n}\n/**\n * Class to mimic the Socket interface for a UDP client, but to provided\n * batching of outgoing sends using temporary Sockets that are created and\n * destroyed as needed.\n */\nfunction BatchingTemporarySocket() {\n this.batchSend = batcher(batchSendData);\n}\n/**\n * Provide the same signature as the Socket.send method but the work will be\n * batched to share temporary UDP sockets whenever possible.\n */\nBatchingTemporarySocket.prototype.send = function (msg, offset, length, port, address, callback) {\n var work = {\n msg: msg,\n offset: offset,\n length: length,\n port: port,\n address: address,\n callback: callback\n };\n this.batchSend(work);\n};\n/**\n * Segment emitter module.\n * @module SegmentEmitter\n */\nvar SegmentEmitter = {\n daemonConfig: require('./daemon_config'),\n /**\n * Returns the formatted segment JSON string.\n */\n format: function format(segment) {\n return PROTOCOL_HEADER + PROTOCOL_DELIMITER + segment.toString();\n },\n /**\n * Creates a UDP socket connection and send the formatted segment.\n * @param {Segment} segment - The segment to send to the daemon.\n */\n send: function send(segment) {\n if (!this.socket) {\n if (this.useBatchingTemporarySocket) {\n this.socket = new BatchingTemporarySocket();\n }\n else {\n this.socket = dgram.createSocket('udp4').unref();\n }\n }\n var client = this.socket;\n var formatted = segment.format();\n var data = PROTOCOL_HEADER + PROTOCOL_DELIMITER + formatted;\n var message = Buffer.from(data);\n var short = '{\"trace_id:\"' + segment.trace_id + '\",\"id\":\"' + segment.id + '\"}';\n var type = segment.type === 'subsegment' ? 'Subsegment' : 'Segment';\n client.send(message, 0, message.length, this.daemonConfig.udp_port, this.daemonConfig.udp_ip, function (err) {\n if (err) {\n if (err.code === 'EMSGSIZE')\n logger.getLogger().error(type + ' too large to send: ' + short + ' (' + message.length + ' bytes).');\n else\n logger.getLogger().error('Error occured sending segment: ', err);\n }\n else {\n logger.getLogger().debug(type + ' sent: {\"trace_id:\"' + segment.trace_id + '\",\"id\":\"' + segment.id + '\"}');\n logger.getLogger().debug('UDP message sent: ' + segment);\n }\n });\n },\n /**\n * Configures the address and/or port the daemon is expected to be on.\n * @param {string} address - Address of the daemon the segments should be sent to. Should be formatted as an IPv4 address.\n * @module SegmentEmitter\n * @function setDaemonAddress\n */\n setDaemonAddress: function setDaemonAddress(address) {\n this.daemonConfig.setDaemonAddress(address);\n },\n /**\n * Get the UDP IP the emitter is configured to.\n * @module SegmentEmitter\n * @function getIp\n */\n getIp: function getIp() {\n return this.daemonConfig.udp_ip;\n },\n /**\n * Get the UDP port the emitter is configured to.\n * @module SegmentEmitter\n * @function getPort\n */\n getPort: function getPort() {\n return this.daemonConfig.udp_port;\n },\n /**\n * Forces the segment emitter to create a new socket on send, and close it on complete.\n * @module SegmentEmitter\n * @function disableReusableSocket\n */\n disableReusableSocket: function () {\n this.useBatchingTemporarySocket = true;\n }\n};\nmodule.exports = SegmentEmitter;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar logger = require('../../logger');\n/**\n * Class describing an AWS X-Ray trace ID.\n * @see https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-traces\n */\nclass TraceID {\n /**\n * Constructs a new trace ID using the current time.\n * @param {string} [tsHex] - time stamp to use for trace ID in hexadecimal format\n * @param {string} [numberhex] - string of hexadecimal characters for random portion of Trace ID\n * @constructor\n */\n constructor(tsHex, numberhex) {\n this.version = 1;\n this.timestamp = tsHex || Math.round(new Date().getTime() / 1000).toString(16);\n this.id = numberhex || crypto.randomBytes(12).toString('hex');\n }\n /**\n * @returns {TraceID} - a hardcoded trace ID using zeroed timestamp and random ID\n */\n static Invalid() {\n return new TraceID('00000000', '000000000000000000000000');\n }\n /**\n * Constructs a new trace ID from provided string. If no string is provided or the provided string is invalid,\n * log an error but a new trace ID still returned. This can be used as a trace ID string validator.\n * @param {string} [rawID] - string to create a Trace ID object from.\n */\n static FromString(rawID) {\n const DELIMITER = '-';\n var traceID = new TraceID();\n var version, timestamp;\n if (!rawID || typeof rawID !== 'string') {\n logger.getLogger().error('Empty or non-string trace ID provided');\n return traceID;\n }\n const parts = rawID.trim().split(DELIMITER);\n if (parts.length !== 3) {\n logger.getLogger().error('Unrecognized trace ID format');\n return traceID;\n }\n version = parseInt(parts[0]);\n if (version === NaN || version < 1) {\n logger.getLogger().error('Trace ID version must be positive integer');\n return traceID;\n }\n timestamp = parseInt(parts[1], 16).toString(16);\n if (timestamp === 'NaN') {\n logger.getLogger().error('Trace ID timestamp must be a hex-encoded value');\n return traceID;\n }\n traceID.version = version;\n traceID.timestamp = timestamp;\n traceID.id = parts[2];\n return traceID;\n }\n /**\n * Returns a string representation of the trace ID.\n * @returns {string} - stringified trace ID, e.g. 1-57fbe041-2c7ad569f5d6ff149137be86\n */\n toString() {\n return `${this.version.toString()}-${this.timestamp}-${this.id}`;\n }\n}\nmodule.exports = TraceID;\n", "\"use strict\";\n/**\n * @module utils\n */\nvar crypto = require('crypto');\nvar logger = require('./logger');\nvar TraceID = require('./segments/attributes/trace_id');\nvar utils = {\n /**\n * Checks a HTTP response code, where 4xx are 'error' and 5xx are 'fault'.\n * @param {string} status - the HTTP response status code.\n * @returns [string] - 'error', 'fault' or nothing on no match\n * @alias module:utils.getCauseTypeFromHttpStatus\n */\n getCauseTypeFromHttpStatus: function getCauseTypeFromHttpStatus(status) {\n var stat = status.toString();\n if (stat.match(/^[4][0-9]{2}$/) !== null)\n return 'error';\n else if (stat.match(/^[5][0-9]{2}$/) !== null)\n return 'fault';\n },\n /**\n * Removes the query string parameters from a given http request path\n * as it may contain sensitive information\n *\n * Related issue: https://github.com/aws/aws-xray-sdk-node/issues/246\n *\n * Node documentation: https://nodejs.org/api/http.html#http_http_request_url_options_callback\n *\n * @param {string} path - options.path in a http.request callback\n * @returns [string] - removes query string element from path\n * @alias module:utils.stripQueryStringFromPath\n */\n stripQueryStringFromPath: function stripQueryStringFromPath(path) {\n return path ? path.split('?')[0] : '';\n },\n /**\n * Performs a case-insensitive wildcard match against two strings. This method works with pseduo-regex chars; specifically ? and * are supported.\n * An asterisk (*) represents any combination of characters\n * A question mark (?) represents any single character\n *\n * @param {string} pattern - the regex-like pattern to be compared against.\n * @param {string} text - the string to compare against the pattern.\n * @returns boolean\n * @alias module:utils.wildcardMatch\n */\n wildcardMatch: function wildcardMatch(pattern, text) {\n if (pattern === undefined || text === undefined)\n return false;\n if (pattern.length === 1 && pattern.charAt(0) === '*')\n return true;\n var patternLength = pattern.length;\n var textLength = text.length;\n var indexOfGlob = pattern.indexOf('*');\n pattern = pattern.toLowerCase();\n text = text.toLowerCase();\n // Infix globs are relatively rare, and the below search is expensive especially when\n // Balsa is used a lot. Check for infix globs and, in their absence, do the simple thing\n if (indexOfGlob === -1 || indexOfGlob === (patternLength - 1)) {\n var match = function simpleWildcardMatch() {\n var j = 0;\n for (var i = 0; i < patternLength; i++) {\n var patternChar = pattern.charAt(i);\n if (patternChar === '*') {\n // Presumption for this method is that globs only occur at end\n return true;\n }\n else if (patternChar === '?') {\n if (j === textLength)\n return false; // No character to match\n j++;\n }\n else {\n if (j >= textLength || patternChar != text.charAt(j))\n return false;\n j++;\n }\n }\n // Ate up all the pattern and didn't end at a glob, so a match will have consumed all\n // the text\n return j === textLength;\n };\n return match();\n }\n /*\n * The matchArray[i] is used to record if there is a match between the first i chars in =\n * text and the first j chars in pattern.\n * So will return matchArray[textLength+1] in the end\n * Loop from the beginning of the pattern\n * case not '*': if text[i]==pattern[j] or pattern[j] is '?', and matchArray[i] is true,\n * set matchArray[i+1] to true, otherwise false\n * case '*': since '*' can match any globing, as long as there is a true in matchArray before i\n * all the matchArray[i+1], matchArray[i+2],...,matchArray[textLength] could be true\n */\n var matchArray = [];\n matchArray[0] = true;\n for (var j = 0; j < patternLength; j++) {\n var i;\n var patternChar = pattern.charAt(j);\n if (patternChar != '*') {\n for (i = textLength - 1; i >= 0; i--)\n matchArray[i + 1] = !!matchArray[i] && (patternChar === '?' || (patternChar === text.charAt(i)));\n }\n else {\n i = 0;\n while (i <= textLength && !matchArray[i])\n i++;\n for (i; i <= textLength; i++)\n matchArray[i] = true;\n }\n matchArray[0] = (matchArray[0] && patternChar === '*');\n }\n return matchArray[textLength];\n },\n LambdaUtils: {\n validTraceData: function (xAmznTraceId) {\n var valid = false;\n if (xAmznTraceId) {\n var data = utils.processTraceData(xAmznTraceId);\n valid = !!(data && data.root && data.parent && data.sampled);\n }\n return valid;\n },\n /**\n * Populates trace ID, parent ID, and sampled decision of given segment. Will always populate valid values,\n * even if xAmznTraceId contains missing or invalid values. This ensures downstream services receive valid\n * headers.\n * @param {Segment} segment - Facade segment to be populated\n * @param {String} xAmznTraceId - Raw Trace Header to supply trace data\n * @returns {Boolean} - true if required fields are present and Trace ID is valid, false otherwise\n */\n populateTraceData: function (segment, xAmznTraceId) {\n logger.getLogger().debug('Lambda trace data found: ' + xAmznTraceId);\n var data = utils.processTraceData(xAmznTraceId);\n var valid = false;\n if (!data) {\n data = {};\n logger.getLogger().error('_X_AMZN_TRACE_ID is empty or has an invalid format');\n }\n else if (!data.root || !data.parent || !data.sampled) {\n logger.getLogger().error('_X_AMZN_TRACE_ID is missing required information');\n }\n else {\n valid = true;\n }\n segment.trace_id = TraceID.FromString(data.root).toString(); // Will always assign valid trace_id\n segment.id = data.parent || crypto.randomBytes(8).toString('hex');\n if (data.root && segment.trace_id !== data.root) {\n logger.getLogger().error('_X_AMZN_TRACE_ID contains invalid trace ID');\n valid = false;\n }\n if (!parseInt(data.sampled))\n segment.notTraced = true;\n else\n delete segment.notTraced;\n logger.getLogger().debug('Segment started: ' + JSON.stringify(data));\n return valid;\n }\n },\n /**\n * Splits out the data from the trace id format. Used by the middleware.\n * @param {String} traceData - The additional trace data (typically in req.headers.x-amzn-trace-id).\n * @returns {object}\n * @alias module:mw_utils.processTraceData\n */\n processTraceData: function processTraceData(traceData) {\n var amznTraceData = {};\n var reservedKeywords = ['root', 'parent', 'sampled', 'self'];\n var remainingBytes = 256;\n if (!(typeof traceData === 'string' && traceData))\n return amznTraceData;\n traceData.split(';').forEach(function (header) {\n if (!header)\n return;\n var pair = header.split('=');\n if (pair[0] && pair[1]) {\n var key = pair[0].trim().toLowerCase();\n var value = pair[1].trim().toLowerCase();\n var reserved = reservedKeywords.indexOf(key) !== -1;\n if (reserved) {\n amznTraceData[key] = value;\n }\n else if (!reserved && remainingBytes - (key.length + value.length) >= 0) {\n amznTraceData[key] = value;\n remainingBytes -= (key.length + value.length);\n }\n }\n });\n return amznTraceData;\n },\n /**\n * Makes a shallow copy of an object without given keys - keeps prototype\n * @param {Object} obj - The object to copy\n * @param {string[]} [keys=[]] - The keys that won't be copied\n * @param {boolean} [preservePrototype=false] - If true also copy prototype properties\n * @returns {}\n */\n objectWithoutProperties: function objectWithoutProperties(obj, keys, preservePrototype) {\n keys = Array.isArray(keys) ? keys : [];\n preservePrototype = typeof preservePrototype === 'boolean' ? preservePrototype : false;\n var target = preservePrototype ? Object.create(Object.getPrototypeOf(obj)) : {};\n for (var property in obj) {\n if (keys.indexOf(property) >= 0)\n continue;\n if (!Object.prototype.hasOwnProperty.call(obj, property))\n continue;\n target[property] = obj[property];\n }\n return target;\n },\n /**\n * Safely gets an integer from a string or number\n * @param {String | Number} - input to cast to integer\n * @returns {Number} - Integer representation of input, or 0 if input is not castable to int\n */\n safeParseInt: (val) => {\n if (!val || isNaN(val)) {\n return 0;\n }\n return parseInt(val);\n }\n};\nmodule.exports = utils;\n", "\"use strict\";\nconst { safeParseInt } = require('../utils');\nvar logger = require('../logger');\nvar DEFAULT_STREAMING_THRESHOLD = 100;\nvar utils = {\n streamingThreshold: DEFAULT_STREAMING_THRESHOLD,\n getCurrentTime: function getCurrentTime() {\n return Date.now() / 1000;\n },\n setOrigin: function setOrigin(origin) {\n this.origin = origin;\n },\n setPluginData: function setPluginData(pluginData) {\n this.pluginData = pluginData;\n },\n setSDKData: function setSDKData(sdkData) {\n this.sdkData = sdkData;\n },\n setServiceData: function setServiceData(serviceData) {\n this.serviceData = serviceData;\n },\n /**\n * Overrides the default streaming threshold (100).\n * The threshold represents the maximum number of subsegments on a single segment before\n * the SDK beings to send the completed subsegments out of band of the main segment.\n * Reduce this threshold if you see the 'Segment too large to send' error.\n * @param {number} threshold - The new threshold to use.\n * @memberof AWSXRay\n */\n setStreamingThreshold: function setStreamingThreshold(threshold) {\n if (isFinite(threshold) && threshold >= 0) {\n utils.streamingThreshold = threshold;\n logger.getLogger().debug('Subsegment streaming threshold set to: ' + threshold);\n }\n else {\n logger.getLogger().error('Invalid threshold: ' + threshold + '. Must be a whole number >= 0.');\n }\n },\n getStreamingThreshold: function getStreamingThreshold() {\n return utils.streamingThreshold;\n },\n /**\n * Parses an HTTP response object to return an X-Ray compliant HTTP response object.\n * @param {http.ServerResponse} res\n * @returns {Object} - X-Ray response object to be added to (sub)segment\n */\n getHttpResponseData: (res) => {\n const ret = {};\n if (!res) {\n return ret;\n }\n const status = safeParseInt(res.statusCode);\n if (status !== 0) {\n ret.status = status;\n }\n if (res.headers && res.headers['content-length']) {\n ret.content_length = safeParseInt(res.headers['content-length']);\n }\n return ret;\n }\n};\nmodule.exports = utils;\n", "\"use strict\";\nconst { getHttpResponseData } = require('../segment_utils');\nvar { stripQueryStringFromPath } = require('../../utils');\n/**\n * Represents an outgoing HTTP/HTTPS call.\n * @constructor\n * @param {http.ClientRequest|https.ClientRequest} req - The request object from the HTTP/HTTPS call.\n * @param {http.IncomingMessage|https.IncomingMessage} res - The response object from the HTTP/HTTPS call.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced\": true hint to generated subsegments such that the AWS X-Ray service expects a corresponding segment from the downstream service.\n */\nfunction RemoteRequestData(req, res, downstreamXRayEnabled) {\n this.init(req, res, downstreamXRayEnabled);\n}\nRemoteRequestData.prototype.init = function init(req, res, downstreamXRayEnabled) {\n this.request = {\n url: (req.agent && req.agent.protocol) ? (req.agent.protocol + '//' + req.getHeader('host') + stripQueryStringFromPath(req.path)) : '',\n method: req.method || '',\n };\n if (downstreamXRayEnabled) {\n this.request.traced = true;\n }\n if (res) {\n this.response = getHttpResponseData(res);\n }\n};\nmodule.exports = RemoteRequestData;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar CapturedException = require('./captured_exception');\nvar RemoteRequestData = require('./remote_request_data');\nvar SegmentEmitter = require('../../segment_emitter');\nvar SegmentUtils = require('../segment_utils');\nvar Utils = require('../../utils');\nvar logger = require('../../logger');\n/**\n * Represents a subsegment.\n * @constructor\n * @param {string} name - The name of the subsegment.\n */\nfunction Subsegment(name) {\n this.init(name);\n}\nSubsegment.prototype.init = function init(name) {\n if (typeof name != 'string')\n throw new Error('Subsegment name must be of type string.');\n this.id = crypto.randomBytes(8).toString('hex');\n this.name = name;\n this.start_time = SegmentUtils.getCurrentTime();\n this.in_progress = true;\n this.counter = 0;\n};\n/**\n * Nests a new subsegment to the array of subsegments.\n * @param {string} name - The name of the new subsegment to append.\n * @returns {Subsegment} - The newly created subsegment.\n */\nSubsegment.prototype.addNewSubsegment = function addNewSubsegment(name) {\n var subsegment = new Subsegment(name);\n this.addSubsegment(subsegment);\n return subsegment;\n};\n/**\n * Adds a subsegment to the array of subsegments.\n * @param {Subsegment} subsegment - The subsegment to append.\n */\nSubsegment.prototype.addSubsegment = function (subsegment) {\n if (!(subsegment instanceof Subsegment)) {\n throw new Error('Failed to add subsegment:' + subsegment + ' to subsegment \"' + this.name +\n '\". Not a subsegment.');\n }\n if (this.subsegments === undefined)\n this.subsegments = [];\n subsegment.segment = this.segment;\n subsegment.parent = this;\n if (subsegment.end_time === undefined) {\n this.incrementCounter(subsegment.counter);\n }\n this.subsegments.push(subsegment);\n};\n/**\n * Removes the subsegment from the subsegments array, used in subsegment streaming.\n */\nSubsegment.prototype.removeSubsegment = function removeSubsegment(subsegment) {\n if (!(subsegment instanceof Subsegment)) {\n throw new Error('Failed to remove subsegment:' + subsegment + ' from subsegment \"' + this.name +\n '\". Not a subsegment.');\n }\n if (this.subsegments !== undefined) {\n var index = this.subsegments.indexOf(subsegment);\n if (index >= 0)\n this.subsegments.splice(index, 1);\n }\n};\n/**\n * Adds a property with associated data into the subsegment.\n * @param {string} name - The name of the property to add.\n * @param {Object} data - The data of the property to add.\n */\nSubsegment.prototype.addAttribute = function addAttribute(name, data) {\n this[name] = data;\n};\n/**\n * Adds a subsegement id to record ordering.\n * @param {string} id - A subsegment id.\n */\nSubsegment.prototype.addPrecursorId = function (id) {\n if (typeof id !== 'string')\n logger.getLogger().error('Failed to add id:' + id + ' to subsegment ' + this.name +\n '. Precursor Ids must be of type string.');\n if (this.precursor_ids === undefined)\n this.precursor_ids = [];\n this.precursor_ids.push(id);\n};\n/**\n * Adds a key-value pair that can be queryable through GetTraceSummaries.\n * Only acceptable types are string, float/int and boolean.\n * @param {string} key - The name of key to add.\n * @param {boolean|string|number} value - The value to add for the given key.\n */\nSubsegment.prototype.addAnnotation = function (key, value) {\n if (!(typeof value === 'boolean' || typeof value === 'string' || (typeof value === 'number' && isFinite(value)))) {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Value must be of type string, number or boolean.');\n }\n else if (typeof key !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Key must be of type string.');\n }\n if (this.annotations === undefined)\n this.annotations = {};\n this.annotations[key] = value;\n};\n/**\n * Adds a key-value pair to the metadata.default attribute when no namespace is given.\n * Metadata is not queryable, but is recorded.\n * @param {string} key - The name of the key to add.\n * @param {object|null} value - The value of the associated key.\n * @param {string} [namespace] - The property name to put the key/value pair under.\n */\nSubsegment.prototype.addMetadata = function (key, value, namespace) {\n if (typeof key !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Key must be of type string.');\n }\n else if (namespace && typeof namespace !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + 'namespace: ' + namespace + ' to subsegment ' +\n this.name + '. Namespace must be of type string.');\n }\n var ns = namespace || 'default';\n if (!this.metadata) {\n this.metadata = {};\n }\n if (!this.metadata[ns]) {\n this.metadata[ns] = {};\n }\n this.metadata[ns][key] = value;\n};\nSubsegment.prototype.addSqlData = function addSqlData(sqlData) {\n this.sql = sqlData;\n};\n/**\n * Adds an error with associated data into the subsegment.\n * To handle propagating errors, the subsegment also sets a copy of the error on the\n * root segment. As the error passes up the execution stack, a reference is created\n * on each subsegment to the originating subsegment.\n * @param {Error|string} err - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSubsegment.prototype.addError = function addError(err, remote) {\n if (err == null || typeof err !== 'object' && typeof (err) !== 'string') {\n throw new Error('Failed to add error:' + err + ' to subsegment \"' + this.name +\n '\". Not an object or string literal.');\n }\n this.addFaultFlag();\n if (this.segment && this.segment.exception) {\n if (err === this.segment.exception.ex) {\n this.fault = true;\n this.cause = { id: this.segment.exception.cause };\n return;\n }\n delete this.segment.exception;\n }\n if (this.segment) {\n this.segment.exception = {\n ex: err,\n cause: this.id\n };\n }\n else {\n //error, cannot propagate exception if not added to segment\n }\n if (this.cause === undefined) {\n this.cause = {\n working_directory: process.cwd(),\n exceptions: []\n };\n }\n this.cause.exceptions.unshift(new CapturedException(err, remote));\n};\n/**\n * Adds data for an outgoing HTTP/HTTPS call.\n * @param {http.ClientRequest/https.ClientRequest} req - The request object from the HTTP/HTTPS call.\n * @param {http.IncomingMessage/https.IncomingMessage} res - The response object from the HTTP/HTTPS call.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced\": true hint to generated subsegments such that the AWS X-Ray service expects a corresponding segment from the downstream service.\n */\nSubsegment.prototype.addRemoteRequestData = function addRemoteRequestData(req, res, downstreamXRayEnabled) {\n this.http = new RemoteRequestData(req, res, downstreamXRayEnabled);\n if ('traced' in this.http.request) {\n this.traced = this.http.request.traced;\n delete this.http.request.traced;\n }\n};\n/**\n * Adds fault flag to the subsegment.\n */\nSubsegment.prototype.addFaultFlag = function addFaultFlag() {\n this.fault = true;\n};\n/**\n * Adds error flag to the subsegment.\n */\nSubsegment.prototype.addErrorFlag = function addErrorFlag() {\n this.error = true;\n};\n/**\n * Adds throttle flag to the subsegment.\n */\nSubsegment.prototype.addThrottleFlag = function addThrottleFlag() {\n this.throttle = true;\n};\n/**\n * Closes the current subsegment. This automatically captures any exceptions and sets the end time.\n * @param {Error|string} [err] - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSubsegment.prototype.close = function close(err, remote) {\n var root = this.segment;\n this.end_time = SegmentUtils.getCurrentTime();\n delete this.in_progress;\n if (err)\n this.addError(err, remote);\n if (this.parent)\n this.parent.decrementCounter();\n if (root && root.counter > SegmentUtils.getStreamingThreshold()) {\n if (this.streamSubsegments() && this.parent)\n this.parent.removeSubsegment(this);\n }\n};\n/**\n * Each subsegment holds a counter of open subsegments. This increments\n * the counter such that it can be called from a child and propagate up.\n * @param {Number} [additional] - An additional amount to increment. Used when adding subsegment trees.\n */\nSubsegment.prototype.incrementCounter = function incrementCounter(additional) {\n this.counter = additional ? this.counter + additional + 1 : this.counter + 1;\n if (this.parent)\n this.parent.incrementCounter(additional);\n};\n/**\n * Each subsegment holds a counter of its open subsegments. This decrements\n * the counter such that it can be called from a child and propagate up.\n */\nSubsegment.prototype.decrementCounter = function decrementCounter() {\n this.counter--;\n if (this.parent)\n this.parent.decrementCounter();\n};\n/**\n * Returns a boolean indicating whether or not the subsegment has been closed.\n * @returns {boolean} - Returns true if the subsegment is closed.\n */\nSubsegment.prototype.isClosed = function isClosed() {\n return !this.in_progress;\n};\n/**\n * Sends the subsegment to the daemon.\n */\nSubsegment.prototype.flush = function flush() {\n if (!this.parent || !this.segment) {\n throw new Error('Failed to flush subsegment: ' + this.name + '. Subsegment must be added ' +\n 'to a segment chain to flush.');\n }\n if (this.segment.trace_id) {\n if (this.segment.notTraced !== true) {\n SegmentEmitter.send(this);\n }\n else {\n logger.getLogger().debug('Ignoring flush on subsegment ' + this.id + '. Associated segment is marked as not sampled.');\n }\n }\n else {\n logger.getLogger().debug('Ignoring flush on subsegment ' + this.id + '. Associated segment is missing a trace ID.');\n }\n};\n/**\n * Returns true if the subsegment was streamed in its entirety\n */\nSubsegment.prototype.streamSubsegments = function streamSubsegments() {\n if (this.isClosed() && this.counter <= 0) {\n this.flush();\n return true;\n }\n else if (this.subsegments && this.subsegments.length > 0) {\n var open = [];\n this.subsegments.forEach(function (child) {\n if (!child.streamSubsegments())\n open.push(child);\n });\n this.subsegments = open;\n }\n};\n/**\n * Returns the formatted, trimmed subsegment JSON string to send to the daemon.\n */\nSubsegment.prototype.format = function format() {\n this.type = 'subsegment';\n if (this.parent)\n this.parent_id = this.parent.id;\n if (this.segment)\n this.trace_id = this.segment.trace_id;\n return JSON.stringify(this);\n};\n/**\n * Returns the formatted subsegment JSON string.\n */\nSubsegment.prototype.toString = function toString() {\n return JSON.stringify(this);\n};\nSubsegment.prototype.toJSON = function toJSON() {\n var ignore = ['segment', 'parent', 'counter'];\n if (this.subsegments == null || this.subsegments.length === 0)\n ignore.push('subsegments');\n var thisCopy = Utils.objectWithoutProperties(this, ignore, false);\n return thisCopy;\n};\nmodule.exports = Subsegment;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar CapturedException = require('./attributes/captured_exception');\nvar SegmentEmitter = require('../segment_emitter');\nvar SegmentUtils = require('./segment_utils');\nvar Subsegment = require('./attributes/subsegment');\nvar TraceID = require('./attributes/trace_id');\nvar Utils = require('../utils');\nvar logger = require('../logger');\n/**\n * Represents a segment.\n * @constructor\n * @param {string} name - The name of the subsegment.\n * @param {string} [rootId] - The trace ID of the spawning parent, included in the 'X-Amzn-Trace-Id' header of the incoming request. If one is not supplied, it will be generated.\n * @param {string} [parentId] - The sub/segment ID of the spawning parent, included in the 'X-Amzn-Trace-Id' header of the incoming request.\n */\nfunction Segment(name, rootId, parentId) {\n this.init(name, rootId, parentId);\n}\nSegment.prototype.init = function init(name, rootId, parentId) {\n if (typeof name != 'string')\n throw new Error('Segment name must be of type string.');\n // Validate the Trace ID\n var traceId;\n if (rootId && typeof rootId == 'string') {\n traceId = TraceID.FromString(rootId);\n }\n else {\n traceId = new TraceID();\n }\n var id = crypto.randomBytes(8).toString('hex');\n var startTime = SegmentUtils.getCurrentTime();\n this.trace_id = traceId.toString();\n this.id = id;\n this.start_time = startTime;\n this.name = name || '';\n this.in_progress = true;\n this.counter = 0;\n if (parentId)\n this.parent_id = parentId;\n if (SegmentUtils.serviceData)\n this.setServiceData(SegmentUtils.serviceData);\n if (SegmentUtils.pluginData)\n this.addPluginData(SegmentUtils.pluginData);\n if (SegmentUtils.origin)\n this.origin = SegmentUtils.origin;\n if (SegmentUtils.sdkData)\n this.setSDKData(SegmentUtils.sdkData);\n};\n/**\n * Adds incoming request data to the http block of the segment.\n * @param {IncomingRequestData} data - The data of the property to add.\n */\nSegment.prototype.addIncomingRequestData = function addIncomingRequestData(data) {\n this.http = data;\n};\n/**\n * Adds a key-value pair that can be queryable through GetTraceSummaries.\n * Only acceptable types are string, float/int and boolean.\n * @param {string} key - The name of key to add.\n * @param {boolean|string|number} value - The value to add for the given key.\n */\nSegment.prototype.addAnnotation = function addAnnotation(key, value) {\n if (typeof value !== 'boolean' && typeof value !== 'string' && !isFinite(value)) {\n logger.getLogger().error('Add annotation key: ' + key + ' value: ' + value + ' failed.' +\n ' Annotations must be of type string, number or boolean.');\n return;\n }\n if (this.annotations === undefined)\n this.annotations = {};\n this.annotations[key] = value;\n};\n/**\n * Adds a User ID that can be queried from the X-Ray console. User ID\n * must be a string.\n * @param {string} user - The ID of the user corresponding to this segment\n */\nSegment.prototype.setUser = function (user) {\n if (typeof user !== 'string') {\n logger.getLogger().error('Set user: ' + user + ' failed. User IDs must be of type string.');\n }\n this.user = user;\n};\n/**\n * Adds a key-value pair to the metadata.default attribute when no namespace is given.\n * Metadata is not queryable, but is recorded.\n * @param {string} key - The name of the key to add.\n * @param {object|null} value - The value of the associated key.\n * @param {string} [namespace] - The property name to put the key/value pair under.\n */\nSegment.prototype.addMetadata = function (key, value, namespace) {\n if (typeof key !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + ' to subsegment ' +\n this.name + '. Key must be of type string.');\n }\n else if (namespace && typeof namespace !== 'string') {\n throw new Error('Failed to add annotation key: ' + key + ' value: ' + value + 'namespace: ' + namespace + ' to subsegment ' +\n this.name + '. Namespace must be of type string.');\n }\n var ns = namespace || 'default';\n if (!this.metadata) {\n this.metadata = {};\n }\n if (!this.metadata[ns]) {\n this.metadata[ns] = {};\n }\n this.metadata[ns][key] = value;\n};\n/**\n * Adds data about the AWS X-Ray SDK onto the segment.\n * @param {Object} data - Object that contains the version of the SDK, and other information.\n */\nSegment.prototype.setSDKData = function setSDKData(data) {\n if (!data) {\n logger.getLogger().error('Add SDK data: ' + data + ' failed.' +\n 'Must not be empty.');\n return;\n }\n if (!this.aws)\n this.aws = {};\n this.aws.xray = data;\n};\nSegment.prototype.setMatchedSamplingRule = function setMatchedSamplingRule(ruleName) {\n if (this.aws)\n this.aws = JSON.parse(JSON.stringify(this.aws));\n if (this.aws && this.aws['xray'])\n this.aws.xray['rule_name'] = ruleName;\n else\n this.aws = { xray: { 'rule_name': ruleName } };\n};\n/**\n * Adds data about the service into the segment.\n * @param {Object} data - Object that contains the version of the application, and other information.\n */\nSegment.prototype.setServiceData = function setServiceData(data) {\n if (!data) {\n logger.getLogger().error('Add service data: ' + data + ' failed.' +\n 'Must not be empty.');\n return;\n }\n this.service = data;\n};\n/**\n * Adds a service with associated version data into the segment.\n * @param {Object} data - The associated AWS data.\n */\nSegment.prototype.addPluginData = function addPluginData(data) {\n if (this.aws === undefined)\n this.aws = {};\n Object.assign(this.aws, data);\n};\n/**\n * Adds a new subsegment to the array of subsegments.\n * @param {string} name - The name of the new subsegment to append.\n */\nSegment.prototype.addNewSubsegment = function addNewSubsegment(name) {\n var subsegment = new Subsegment(name);\n this.addSubsegment(subsegment);\n return subsegment;\n};\n/**\n * Adds a subsegment to the array of subsegments.\n * @param {Subsegment} subsegment - The subsegment to append.\n */\nSegment.prototype.addSubsegment = function addSubsegment(subsegment) {\n if (!(subsegment instanceof Subsegment))\n throw new Error('Cannot add subsegment: ' + subsegment + '. Not a subsegment.');\n if (this.subsegments === undefined)\n this.subsegments = [];\n subsegment.segment = this;\n subsegment.parent = this;\n this.subsegments.push(subsegment);\n if (!subsegment.end_time)\n this.incrementCounter(subsegment.counter);\n};\n/**\n * Removes the subsegment from the subsegments array, used in subsegment streaming.\n */\nSegment.prototype.removeSubsegment = function removeSubsegment(subsegment) {\n if (!(subsegment instanceof Subsegment)) {\n throw new Error('Failed to remove subsegment:' + subsegment + ' from subsegment \"' + this.name +\n '\". Not a subsegment.');\n }\n if (this.subsegments !== undefined) {\n var index = this.subsegments.indexOf(subsegment);\n if (index >= 0)\n this.subsegments.splice(index, 1);\n }\n};\n/**\n * Adds error data into the segment.\n * @param {Error|string} err - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSegment.prototype.addError = function addError(err, remote) {\n if (err == null || typeof err !== 'object' && typeof (err) !== 'string') {\n throw new Error('Failed to add error:' + err + ' to subsegment \"' + this.name +\n '\". Not an object or string literal.');\n }\n this.addFaultFlag();\n if (this.exception) {\n if (err === this.exception.ex) {\n this.cause = { id: this.exception.cause };\n delete this.exception;\n return;\n }\n delete this.exception;\n }\n if (this.cause === undefined) {\n this.cause = {\n working_directory: process.cwd(),\n exceptions: []\n };\n }\n this.cause.exceptions.push(new CapturedException(err, remote));\n};\n/**\n * Adds fault flag to the subsegment.\n */\nSegment.prototype.addFaultFlag = function addFaultFlag() {\n this.fault = true;\n};\n/**\n * Adds error flag to the subsegment.\n */\nSegment.prototype.addErrorFlag = function addErrorFlag() {\n this.error = true;\n};\n/**\n * Adds throttle flag to the subsegment.\n */\nSegment.prototype.addThrottleFlag = function addThrottleFlag() {\n this.throttle = true;\n};\n/**\n * Returns a boolean indicating whether or not the segment has been closed.\n * @returns {boolean} - Returns true if the subsegment is closed.\n */\nSegment.prototype.isClosed = function isClosed() {\n return !this.in_progress;\n};\n/**\n * Each segment holds a counter of open subsegments. This increments the counter.\n * @param {Number} [additional] - An additional amount to increment. Used when adding subsegment trees.\n */\nSegment.prototype.incrementCounter = function incrementCounter(additional) {\n this.counter = additional ? this.counter + additional + 1 : this.counter + 1;\n if (this.counter > SegmentUtils.streamingThreshold && this.subsegments && this.subsegments.length > 0) {\n var open = [];\n this.subsegments.forEach(function (child) {\n if (!child.streamSubsegments())\n open.push(child);\n });\n this.subsegments = open;\n }\n};\n/**\n * Each segment holds a counter of open subsegments. This decrements\n * the counter such that it can be called from a child and propagate up.\n */\nSegment.prototype.decrementCounter = function decrementCounter() {\n this.counter--;\n if (this.counter <= 0 && this.isClosed()) {\n this.flush();\n }\n};\n/**\n * Closes the current segment. This automatically sets the end time.\n * @param {Error|string} [err] - The error to capture.\n * @param {boolean} [remote] - Flag for whether the exception caught was remote or not.\n */\nSegment.prototype.close = function (err, remote) {\n if (!this.end_time)\n this.end_time = SegmentUtils.getCurrentTime();\n if (err !== undefined)\n this.addError(err, remote);\n delete this.in_progress;\n delete this.exception;\n if (this.counter <= 0) {\n this.flush();\n }\n};\n/**\n * Sends the segment to the daemon.\n */\nSegment.prototype.flush = function flush() {\n if (this.notTraced !== true) {\n delete this.exception;\n var thisCopy = Utils.objectWithoutProperties(this, ['counter', 'notTraced'], true);\n SegmentEmitter.send(thisCopy);\n }\n};\nSegment.prototype.format = function format() {\n var ignore = ['segment', 'parent', 'counter'];\n if (this.subsegments == null || this.subsegments.length === 0)\n ignore.push('subsegments');\n var thisCopy = Utils.objectWithoutProperties(this, ignore, false);\n return JSON.stringify(thisCopy);\n};\nSegment.prototype.toString = function toString() {\n return JSON.stringify(this);\n};\nmodule.exports = Segment;\n", "\"use strict\";\n/**\n * @module context_utils\n */\nvar cls = require('cls-hooked/context');\nvar logger = require('./logger');\nvar Segment = require('./segments/segment');\nvar Subsegment = require('./segments/attributes/subsegment');\nvar cls_mode = true;\nvar NAMESPACE = 'AWSXRay';\nvar SEGMENT = 'segment';\nvar contextOverride = false;\nvar contextUtils = {\n CONTEXT_MISSING_STRATEGY: {\n RUNTIME_ERROR: {\n contextMissing: function contextMissingRuntimeError(message) {\n throw new Error(message);\n }\n },\n LOG_ERROR: {\n contextMissing: function contextMissingLogError(message) {\n var err = new Error(message);\n logger.getLogger().error(err.stack);\n }\n },\n IGNORE_ERROR: {\n contextMissing: function contextMissingIgnoreError(message) {\n }\n }\n },\n contextMissingStrategy: {},\n /**\n * Resolves the segment or subsegment given manual mode and params on the call required.\n * @param [Segment|Subsegment] segment - The segment manually provided via params.XraySegment, if provided.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.resolveManualSegmentParams\n */\n resolveManualSegmentParams: function resolveManualSegmentParams(params) {\n if (params && !contextUtils.isAutomaticMode()) {\n var xraySegment = params.XRaySegment || params.XraySegment;\n var segment = params.Segment;\n var found = null;\n if (xraySegment && (xraySegment instanceof Segment || xraySegment instanceof Subsegment)) {\n found = xraySegment;\n delete params.XRaySegment;\n delete params.XraySegment;\n }\n else if (segment && (segment instanceof Segment || segment instanceof Subsegment)) {\n found = segment;\n delete params.Segment;\n }\n return found;\n }\n },\n /**\n * Gets current CLS namespace for X-Ray SDK or creates one if absent.\n * @returns {Namespace}\n * @alias module:context_utils.getNamespace\n */\n getNamespace: function getNamespace() {\n return cls.getNamespace(NAMESPACE) || cls.createNamespace(NAMESPACE);\n },\n /**\n * Resolves the segment or subsegment given manual or automatic mode.\n * @param [Segment|Subsegment] segment - The segment manually provided, if provided.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.resolveSegment\n */\n resolveSegment: function resolveSegment(segment) {\n if (cls_mode) {\n return this.getSegment();\n }\n else if (segment && !cls_mode) {\n return segment;\n }\n else if (!segment && !cls_mode) {\n contextUtils.contextMissingStrategy.contextMissing('No sub/segment specified. A sub/segment must be provided for manual mode.');\n }\n },\n /**\n * Returns the current segment or subsegment. For use with in automatic mode only.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.getSegment\n */\n getSegment: function getSegment() {\n if (cls_mode) {\n var segment = contextUtils.getNamespace(NAMESPACE).get(SEGMENT);\n if (!segment) {\n contextUtils.contextMissingStrategy.contextMissing('Failed to get the current sub/segment from the context.');\n }\n else if (segment instanceof Segment && process.env.LAMBDA_TASK_ROOT && segment.facade == true) {\n segment.resolveLambdaTraceData();\n }\n return segment;\n }\n else {\n contextUtils.contextMissingStrategy.contextMissing('Cannot get sub/segment from context. Not supported in manual mode.');\n }\n },\n /**\n * Sets the current segment or subsegment. For use with in automatic mode only.\n * @param [Segment|Subsegment] segment - The sub/segment to set.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.setSegment\n */\n setSegment: function setSegment(segment) {\n if (cls_mode) {\n if (!contextUtils.getNamespace(NAMESPACE).set(SEGMENT, segment))\n logger.getLogger().warn('Failed to set the current sub/segment on the context.');\n }\n else {\n contextUtils.contextMissingStrategy.contextMissing('Cannot set sub/segment on context. Not supported in manual mode.');\n }\n },\n /**\n * Returns true if in automatic mode, otherwise false.\n * @returns {Segment|Subsegment}\n * @alias module:context_utils.isAutomaticMode\n */\n isAutomaticMode: function isAutomaticMode() {\n return cls_mode;\n },\n /**\n * Enables automatic mode. Automatic mode uses 'cls-hooked'.\n * @see https://github.com/jeff-lewis/cls-hooked\n * @alias module:context_utils.enableAutomaticMode\n */\n enableAutomaticMode: function enableAutomaticMode() {\n cls_mode = true;\n contextUtils.getNamespace(NAMESPACE);\n logger.getLogger().debug('Overriding AWS X-Ray SDK mode. Set to automatic mode.');\n },\n /**\n * Disables automatic mode. Current segment or subsegment then must be passed manually\n * via the parent optional on captureFunc, captureAsyncFunc etc.\n * @alias module:context_utils.enableManualMode\n */\n enableManualMode: function enableManualMode() {\n cls_mode = false;\n if (cls.getNamespace(NAMESPACE))\n cls.destroyNamespace(NAMESPACE);\n logger.getLogger().debug('Overriding AWS X-Ray SDK mode. Set to manual mode.');\n },\n /**\n * Sets the context missing strategy if no context missing strategy is set using the environment variable with\n * key AWS_XRAY_CONTEXT_MISSING. The context missing strategy's contextMissing function will be called whenever\n * trace context is not found.\n * @param {string|function} strategy - The strategy to set. Valid string values are 'LOG_ERROR' and 'RUNTIME_ERROR'.\n * Alternatively, a custom function can be supplied, which takes a error message string.\n */\n setContextMissingStrategy: function setContextMissingStrategy(strategy) {\n if (!contextOverride) {\n if (typeof strategy === 'string') {\n var lookupStrategy = contextUtils.CONTEXT_MISSING_STRATEGY[strategy.toUpperCase()];\n if (lookupStrategy) {\n contextUtils.contextMissingStrategy.contextMissing = lookupStrategy.contextMissing;\n if (process.env.AWS_XRAY_CONTEXT_MISSING)\n logger.getLogger().debug('AWS_XRAY_CONTEXT_MISSING is set. Configured context missing strategy to ' +\n process.env.AWS_XRAY_CONTEXT_MISSING + '.');\n else\n logger.getLogger().debug('Configured context missing strategy to: ' + strategy);\n }\n else {\n throw new Error('Invalid context missing strategy: ' + strategy + '. Valid values are ' +\n Object.keys(contextUtils.CONTEXT_MISSING_STRATEGY) + '.');\n }\n }\n else if (typeof strategy === 'function') {\n contextUtils.contextMissingStrategy.contextMissing = strategy;\n logger.getLogger().info('Configured custom context missing strategy to function: ' + strategy.name);\n }\n else {\n throw new Error('Context missing strategy must be either a string or a custom function.');\n }\n }\n else {\n logger.getLogger().warn('Ignoring call to setContextMissingStrategy as AWS_XRAY_CONTEXT_MISSING is set. ' +\n 'The current context missing strategy will not be changed.');\n }\n }\n};\ncls.createNamespace(NAMESPACE);\nlogger.getLogger().debug('Starting the AWS X-Ray SDK in automatic mode (default).');\nif (process.env.AWS_XRAY_CONTEXT_MISSING) {\n contextUtils.setContextMissingStrategy(process.env.AWS_XRAY_CONTEXT_MISSING);\n contextOverride = true;\n}\nelse {\n contextUtils.contextMissingStrategy.contextMissing = contextUtils.CONTEXT_MISSING_STRATEGY.RUNTIME_ERROR.contextMissing;\n logger.getLogger().debug('Using default context missing strategy: RUNTIME_ERROR');\n}\nmodule.exports = contextUtils;\n", "\"use strict\";\nvar { getHttpResponseData } = require('../segments/segment_utils');\n/**\n * Represents an incoming HTTP/HTTPS call.\n * @constructor\n * @param {http.IncomingMessage|https.IncomingMessage} req - The request object from the HTTP/HTTPS call.\n */\nfunction IncomingRequestData(req) {\n this.init(req);\n}\nIncomingRequestData.prototype.init = function init(req) {\n var forwarded = !!req.headers['x-forwarded-for'];\n var url;\n if (req.connection)\n url = ((req.connection.secure || req.connection.encrypted) ? 'https://' : 'http://') +\n ((req.headers['host'] || '') + (req.url || ''));\n this.request = {\n method: req.method || '',\n user_agent: req.headers['user-agent'] || '',\n client_ip: getClientIp(req) || '',\n url: url || '',\n };\n if (forwarded)\n this.request.x_forwarded_for = forwarded;\n};\nvar getClientIp = function getClientIp(req) {\n var clientIp;\n if (req.headers['x-forwarded-for'])\n clientIp = (req.headers['x-forwarded-for'] || '').split(',')[0];\n else if (req.connection && req.connection.remoteAddress)\n clientIp = req.connection.remoteAddress;\n else if (req.socket && req.socket.remoteAddress)\n clientIp = req.socket.remoteAddress;\n else if (req.connection && req.connection.socket && req.connection.socket.remoteAddress)\n clientIp = req.connection.socket.remoteAddress;\n return clientIp;\n};\n/**\n * Closes the local and automatically captures the response data.\n * @param {http.ServerResponse|https.ServerResponse} res - The response object from the HTTP/HTTPS call.\n */\nIncomingRequestData.prototype.close = function close(res) {\n this.response = getHttpResponseData(res);\n};\nmodule.exports = IncomingRequestData;\n", "\"use strict\";\n/**\n * Represents a LocalReservoir object that keeps track of the number of traces per second sampled and\n * the fixed rate for a given sampling rule defined locally.\n * It also decides if a given trace should be sampled or not based on the state of current second.\n * @constructor\n * @param {number} fixedTarget - An integer value to specify the maximum number of traces per second to sample.\n * @param {number} fallbackRate - A value between 0 and 1 indicating the sampling rate after the maximum traces per second has been hit.\n */\nfunction LocalReservoir(fixedTarget, fallbackRate) {\n this.init(fixedTarget, fallbackRate);\n}\nLocalReservoir.prototype.init = function init(fixedTarget, fallbackRate) {\n this.usedThisSecond = 0;\n if (typeof fixedTarget === 'number' && fixedTarget % 1 === 0 && fixedTarget >= 0)\n this.fixedTarget = fixedTarget;\n else\n throw new Error('Error in sampling file. Rule attribute \"fixed_target\" must be a non-negative integer.');\n if (typeof fallbackRate === 'number' && fallbackRate >= 0 && fallbackRate <= 1)\n this.fallbackRate = fallbackRate;\n else\n throw new Error('Error in sampling file. Rule attribute \"rate\" must be a number between 0 and 1 inclusive.');\n};\nLocalReservoir.prototype.isSampled = function isSampled() {\n var now = Math.round(new Date().getTime() / 1000);\n if (now !== this.thisSecond) {\n this.usedThisSecond = 0;\n this.thisSecond = now;\n }\n if (this.usedThisSecond >= this.fixedTarget)\n return Math.random() < this.fallbackRate;\n this.usedThisSecond++;\n return true;\n};\nmodule.exports = LocalReservoir;\n", "\"use strict\";\nvar fs = require('fs');\nvar LocalReservoir = require('./local_reservoir');\nvar Utils = require('../../utils');\nvar defaultRules = require('../../resources/default_sampling_rules.json');\nvar logger = require('../../logger');\n/**\n * The local sampler used to make sampling decisions when the decisions are absent in the incoming requests\n * and the default sampler needs to fall back on local rules. It will also be the primary sampler\n * if the default sampler is disabled.\n * @module LocalSampler\n */\nvar LocalSampler = {\n /**\n * Makes a sample decision based on the sample request.\n * @param {object} sampleRequest - Contains information for rules matching.\n * @module LocalSampler\n * @function shouldSample\n */\n shouldSample: function shouldSample(sampleRequest) {\n var host = sampleRequest.host;\n var httpMethod = sampleRequest.httpMethod;\n var urlPath = sampleRequest.urlPath;\n var formatted = '{ http_method: ' + httpMethod + ', host: ' + host + ', url_path: ' + urlPath + ' }';\n var matched;\n this.rules.some(function (rule) {\n // Any null parameters provided will be considered an implicit match.\n if (rule.default || (host == null || (Utils.wildcardMatch(rule.host, host))\n && (httpMethod == null || Utils.wildcardMatch(rule.http_method, httpMethod))\n && (urlPath == null || Utils.wildcardMatch(rule.url_path, urlPath)))) {\n matched = rule.reservoir;\n logger.getLogger().debug('Local sampling rule match found for ' + formatted + '. Matched ' + (rule.default ?\n 'default' : '{ http_method: ' + rule.http_method + ', host: ' + rule.host + ', url_path: ' +\n rule.url_path + ' }') + '. Using fixed_target: ' + matched.fixedTarget + ' and rate: ' + matched.fallbackRate + '.');\n return true;\n }\n });\n if (matched) {\n return matched.isSampled();\n }\n else {\n logger.getLogger().debug('No sampling rule matched for ' + formatted);\n return false;\n }\n },\n /**\n * Set local rules for making sampling decisions.\n * @module LocalSampler\n * @function setLocalRules\n */\n setLocalRules: function setLocalRules(source) {\n if (source) {\n if (typeof source === 'string') {\n logger.getLogger().info('Using custom sampling rules file: ' + source);\n this.rules = loadRulesConfig(JSON.parse(fs.readFileSync(source, 'utf8')));\n }\n else {\n logger.getLogger().info('Using custom sampling rules source.');\n this.rules = loadRulesConfig(source);\n }\n }\n else\n this.rules = parseRulesConfig(defaultRules);\n }\n};\nvar loadRulesConfig = function loadRulesConfig(config) {\n if (!config.version)\n throw new Error('Error in sampling file. Missing \"version\" attribute.');\n if (config.version === 1 || config.version === 2)\n return parseRulesConfig(config);\n else\n throw new Error('Error in sampling file. Unknown version \"' + config.version + '\".');\n};\nvar parseRulesConfig = function parseRulesConfig(config) {\n var defaultRule;\n var rules = [];\n if (config.default) {\n var missing = [];\n for (var key in config.default) {\n if (key !== 'fixed_target' && key !== 'rate') {\n throw new Error('Error in sampling file. Invalid attribute for default: ' + key +\n '. Valid attributes for default are \"fixed_target\" and \"rate\".');\n }\n else if (typeof config.default[key] !== 'number') {\n throw new Error('Error in sampling file. Default ' + key + ' must be a number.');\n }\n }\n if (typeof config.default.fixed_target === 'undefined')\n missing.push('fixed_target');\n if (typeof config.default.rate === 'undefined')\n missing.push('rate');\n if (missing.length !== 0)\n throw new Error('Error in sampling file. Missing required attributes for default: ' + missing + '.');\n defaultRule = { default: true, reservoir: new LocalReservoir(config.default.fixed_target, config.default.rate) };\n }\n else {\n throw new Error('Error in sampling file. Expecting \"default\" object to be defined with attributes \"fixed_target\" and \"rate\".');\n }\n if (Array.isArray(config.rules)) {\n config.rules.forEach(function (rawRule) {\n var params = {};\n var required;\n if (config.version === 2)\n required = { host: 1, http_method: 1, url_path: 1, fixed_target: 1, rate: 1 };\n if (config.version === 1)\n required = { service_name: 1, http_method: 1, url_path: 1, fixed_target: 1, rate: 1 };\n for (var key in rawRule) {\n var value = rawRule[key];\n if (!required[key] && key != 'description')\n throw new Error('Error in sampling file. Rule ' + JSON.stringify(rawRule) + ' has invalid attribute: ' + key + '.');\n else if (key != 'description' && !value && value !== 0)\n throw new Error('Error in sampling file. Rule ' + JSON.stringify(rawRule) + ' attribute \"' + key + '\" has invalid value: ' + value + '.');\n else {\n if (config.version === 2)\n params[key] = value;\n if (config.version === 1 && key === 'service_name')\n params['host'] = value;\n else\n params[key] = value;\n delete required[key];\n }\n }\n if (Object.keys(required).length !== 0 && required.constructor === Object)\n throw new Error('Error in sampling file. Rule ' + JSON.stringify(rawRule) + ' is missing required attributes: ' + Object.keys(required) + '.');\n var rule = params;\n rule.reservoir = new LocalReservoir(rawRule.fixed_target, rawRule.rate);\n rules.push(rule);\n });\n }\n rules.push(defaultRule);\n return rules;\n};\nLocalSampler.setLocalRules();\nmodule.exports = LocalSampler;\n", "\"use strict\";\n/**\n * Represents a Reservoir object that keeps track of the number of traces per second sampled and\n * the fixed rate for a given sampling rule. This information is fetched from X-Ray serivce.\n * It decides if a given trace should be borrowed or sampled or not sampled based on the state of current second.\n * @constructor\n */\nfunction Reservoir() {\n this.init();\n}\nReservoir.prototype.init = function init() {\n this.quota = null;\n this.TTL = null;\n this.takenThisSec = 0;\n this.borrowedThisSec = 0;\n this.reportInterval = 1;\n this.reportElapsed = 0;\n};\nReservoir.prototype.borrowOrTake = function borrowOrTake(now, canBorrow) {\n this.adjustThisSec(now);\n // Don't borrow if the quota is available and fresh.\n if (this.quota >= 0 && this.TTL >= now) {\n if (this.takenThisSec >= this.quota)\n return false;\n this.takenThisSec++;\n return 'take';\n }\n // Otherwise try to borrow if the quota is not present or expired.\n if (canBorrow) {\n if (this.borrowedThisSec >= 1)\n return false;\n this.borrowedThisSec++;\n return 'borrow';\n }\n};\nReservoir.prototype.adjustThisSec = function adjustThisSec(now) {\n if (now !== this.thisSec) {\n this.takenThisSec = 0;\n this.borrowedThisSec = 0;\n this.thisSec = now;\n }\n};\nReservoir.prototype.loadNewQuota = function loadNewQuota(quota, TTL, interval) {\n if (quota)\n this.quota = quota;\n if (TTL)\n this.TTL = TTL;\n if (interval)\n this.reportInterval = interval / 10; // Report interval is always time of 10.\n};\nReservoir.prototype.timeToReport = function timeToReport() {\n if (this.reportElapsed + 1 >= this.reportInterval) {\n this.reportElapsed = 0;\n return true;\n }\n else {\n this.reportElapsed += 1;\n return false;\n }\n};\nmodule.exports = Reservoir;\n", "\"use strict\";\nvar Utils = require('../../utils');\nvar Reservoir = require('./reservoir');\n/**\n * The data model for a sampling rule defined using X-Ray API CreateSamplingRules.\n * It should be only instantiated directly from the X-Ray API response.\n * @constructor\n */\nfunction SamplingRule(name, priority, rate, reservoirSize, host, httpMethod, urlPath, serviceName, serviceType) {\n this.init(name, priority, rate, reservoirSize, host, httpMethod, urlPath, serviceName, serviceType);\n}\nSamplingRule.prototype.init = function init(name, priority, rate, reservoirSize, host, httpMethod, urlPath, serviceName, serviceType) {\n this.name = name;\n this.priority = priority;\n this.rate = rate;\n this.host = host;\n this.httpMethod = httpMethod;\n this.urlPath = urlPath;\n this.serviceName = serviceName;\n this.serviceType = serviceType;\n this.reservoir = new Reservoir();\n this.borrow = !!reservoirSize;\n this.resetStatistics();\n};\nSamplingRule.prototype.match = function match(sampleRequest) {\n var host = sampleRequest.host;\n var httpMethod = sampleRequest.httpMethod;\n var serviceName = sampleRequest.serviceName;\n var urlPath = sampleRequest.urlPath;\n var serviceType = sampleRequest.serviceType;\n return this.isDefault() || (!host || Utils.wildcardMatch(this.host, host))\n && (!httpMethod || Utils.wildcardMatch(this.httpMethod, httpMethod))\n && (!serviceName || Utils.wildcardMatch(this.serviceName, serviceName))\n && (!urlPath || Utils.wildcardMatch(this.urlPath, urlPath))\n && (!serviceType || Utils.wildcardMatch(this.serviceType, serviceType));\n};\nSamplingRule.prototype.snapshotStatistics = function snapshotStatistics() {\n var statistics = {\n requestCount: this.requestCount,\n borrowCount: this.borrowCount,\n sampledCount: this.sampledCount\n };\n this.resetStatistics();\n return statistics;\n};\nSamplingRule.prototype.merge = function merge(rule) {\n this.reservoir = rule.reservoir;\n this.requestCount = rule.requestCount;\n this.borrowCount = rule.borrowCount;\n this.sampledCount = rule.sampledCount;\n rule = null; // unref the old rule so it can be garbage collected.\n};\nSamplingRule.prototype.isDefault = function isDefault() {\n return this.name === 'Default'; // \"Default\" is a reserved keyword from X-Ray back-end.\n};\nSamplingRule.prototype.incrementRequestCount = function incrementRequestCount() {\n this.requestCount++;\n};\nSamplingRule.prototype.incrementBorrowCount = function incrementBorrowCount() {\n this.borrowCount++;\n};\nSamplingRule.prototype.incrementSampledCount = function incrementSampledCount() {\n this.sampledCount++;\n};\nSamplingRule.prototype.setRate = function setRate(rate) {\n this.rate = rate;\n};\nSamplingRule.prototype.getRate = function getRate() {\n return this.rate;\n};\nSamplingRule.prototype.getName = function getName() {\n return this.name;\n};\nSamplingRule.prototype.getPriority = function getPriority() {\n return this.priority;\n};\nSamplingRule.prototype.getReservoir = function getReservoir() {\n return this.reservoir;\n};\nSamplingRule.prototype.resetStatistics = function resetStatistics() {\n this.requestCount = 0;\n this.borrowCount = 0;\n this.sampledCount = 0;\n};\nSamplingRule.prototype.canBorrow = function canBorrow() {\n return this.borrow;\n};\nSamplingRule.prototype.everMatched = function everMatched() {\n return this.requestCount > 0;\n};\nSamplingRule.prototype.timeToReport = function timeToReport() {\n return this.reservoir.timeToReport();\n};\nmodule.exports = SamplingRule;\n", "\"use strict\";\nvar crypto = require('crypto');\nvar logger = require('../../logger');\nvar SamplingRule = require('./sampling_rule');\nvar DaemonConfig = require('../../daemon_config');\nconst util = require('util');\nconst http = require('http');\n/**\n * The ServiceConnector that calls X-Ray service and convert the API response bodies to data models\n * defined in the X-Ray SDK and return them to the pollers.\n * @module ServiceConnector\n */\nvar ServiceConnector = {\n // client_id is a 12 byte cryptographically secure random hex\n // identifying the SDK instance and is generated during SDK initialization/\n // This is required when reporting sampling to X-Ray back-end.\n clientId: crypto.randomBytes(12).toString('hex'),\n samplingRulesPath: '/GetSamplingRules',\n samplingTargetsPath: '/SamplingTargets',\n logger: logger,\n httpClient: http,\n fetchSamplingRules: function fetchSamplingRules(callback) {\n const body = '{}'; // Payload needed for GetSamplingRules POST request\n const options = getOptions(this.samplingRulesPath, body.length);\n const httpReq = this.httpClient.__request ? this.httpClient.__request : this.httpClient.request;\n const req = httpReq(options, res => {\n var data = '';\n res.on('data', d => {\n data += d;\n });\n res.on('error', error => {\n callback(error);\n });\n res.on('end', () => {\n var dataObj;\n try {\n dataObj = JSON.parse(data);\n }\n catch (err) {\n callback(err);\n return;\n }\n if (!dataObj) {\n callback(new Error('AWS X-Ray GetSamplingRules API returned empty response'));\n return;\n }\n var newRules = assembleRules(dataObj);\n callback(null, newRules);\n });\n });\n req.on('error', (err) => {\n callback(new Error(`Failed to connect to X-Ray daemon at ${options.hostname}:${options.port} to get sampling rules.`));\n });\n req.write(body);\n req.end();\n },\n fetchTargets: function fetchTargets(rules, callback) {\n const body = JSON.stringify(constructStatisticsDocs(rules));\n const options = getOptions(this.samplingTargetsPath, body.length);\n const httpReq = this.httpClient.__request ? this.httpClient.__request : this.httpClient.request;\n const req = httpReq(options, res => {\n var data = '';\n res.on('data', d => {\n data += d;\n });\n res.on('error', error => {\n callback(error);\n });\n res.on('end', () => {\n var dataObj;\n try {\n dataObj = JSON.parse(data);\n }\n catch (err) {\n callback(err);\n return;\n }\n if (!dataObj || typeof dataObj['LastRuleModification'] != 'number') {\n callback(new Error('AWS X-Ray SamplingTargets API returned invalid response'));\n return;\n }\n var targetsMapping = assembleTargets(dataObj);\n var ruleFreshness = dateToEpoch(dataObj['LastRuleModification']);\n callback(null, targetsMapping, ruleFreshness);\n });\n });\n req.on('error', (err) => {\n callback(new Error(`Failed to connect to X-Ray daemon at ${options.hostname}:${options.port} to get sampling targets.`));\n });\n req.write(body);\n req.end();\n }\n};\nvar constructStatisticsDocs = function constructStatisticsDocs(rules) {\n var documents = [];\n var now = Math.floor(new Date().getTime() / 1000);\n rules.forEach(function (rule) {\n var statistics = rule.snapshotStatistics();\n var doc = {\n 'RuleName': rule.getName(),\n 'ClientID': ServiceConnector.clientId,\n 'RequestCount': statistics.requestCount,\n 'BorrowCount': statistics.borrowCount,\n 'SampledCount': statistics.sampledCount,\n 'Timestamp': now\n };\n documents.push(doc);\n });\n return { SamplingStatisticsDocuments: documents };\n};\nvar assembleRules = function assembleRules(data) {\n var newRules = [];\n var ruleList = data['SamplingRuleRecords'] || [];\n ruleList.forEach(function (ruleRecord) {\n ruleRecord = ruleRecord['SamplingRule'];\n // For forward compatibility reason right now it only\n // deals with version 1 sampling rules.\n if (isRuleValid(ruleRecord)) {\n var newRule = new SamplingRule(ruleRecord['RuleName'], ruleRecord['Priority'], ruleRecord['FixedRate'], ruleRecord['ReservoirSize'], ruleRecord['Host'], ruleRecord['HTTPMethod'], ruleRecord['URLPath'], ruleRecord['ServiceName'], ruleRecord['ServiceType']);\n newRules.push(newRule);\n }\n });\n return newRules;\n};\nvar assembleTargets = function assembleTargets(data) {\n var docs = data['SamplingTargetDocuments'] || [];\n var targetsMapping = {};\n docs.forEach(function (doc) {\n var newTarget = {\n rate: doc['FixedRate'],\n quota: doc['ReservoirQuota'],\n TTL: dateToEpoch(doc['ReservoirQuotaTTL']),\n interval: doc['Interval']\n };\n targetsMapping[doc['RuleName']] = newTarget;\n });\n return targetsMapping;\n};\nvar isRuleValid = function isRuleValid(record) {\n return record['Version'] === 1\n && record['ResourceARN'] === '*'\n && record['Attributes'] && Object.keys(record['Attributes']).length === 0\n && record['ServiceType']\n && record['RuleName']\n && record['Priority']\n && typeof record['FixedRate'] == 'number';\n};\nvar dateToEpoch = function dateToEpoch(date) {\n return new Date(date).getTime() / 1000;\n};\nvar getOptions = function getOptions(path, contentLength) {\n const options = {\n hostname: DaemonConfig.tcp_ip,\n port: DaemonConfig.tcp_port,\n method: 'POST',\n path: path,\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': contentLength,\n 'Host': util.format('%s:%d', DaemonConfig.tcp_ip, DaemonConfig.tcp_port)\n }\n };\n return options;\n};\nmodule.exports = ServiceConnector;\n", "\"use strict\";\nvar TTL = 60 * 60; // The cache expires 1 hour after the last refresh time.\n/**\n * The rule cache that stores sampling rules fetched from X-Ray service.\n * @module RuleCache\n */\nvar RuleCache = {\n rules: [],\n lastUpdated: null,\n /**\n * Tries to find a valid rule that matches the sample request.\n * @param {object} sampleRequest - Contains information for rules matching.\n * @param {number} now - Current epoch in seconds.\n * @module RuleCache\n * @function getMatchedRule\n */\n getMatchedRule: function getMatchedRule(sampleRequest, now) {\n if (isExpired(now))\n return null;\n var matchedRule;\n this.rules.forEach(function (rule) {\n if (!matchedRule && rule.match(sampleRequest))\n matchedRule = rule;\n if (rule.isDefault() && !matchedRule)\n matchedRule = rule;\n });\n return matchedRule;\n },\n /**\n * Load rules fetched from X-Ray service in order sorted by priorities.\n * @param {object} rules - Newly fetched rules to load.\n * @module RuleCache\n * @function loadRules\n */\n loadRules: function loadRules(rules) {\n // Record the old rules for later merging.\n var oldRules = {};\n this.rules.forEach(function (rule) {\n oldRules[rule.getName()] = rule;\n });\n // Update the rules in the cache.\n this.rules = rules;\n // Transfer state information to refreshed rules.\n this.rules.forEach(function (rule) {\n var oldRule = oldRules[rule.getName()];\n if (oldRule)\n rule.merge(oldRule);\n });\n // The cache should maintain the order of the rules based on\n // priority. If priority is the same we sort name by alphabet\n // as rule name is unique.\n this.rules.sort(function (a, b) {\n var v = a.getPriority() - b.getPriority();\n if (v !== 0)\n return v;\n if (a.getName() > b.getName())\n return 1;\n else\n return -1;\n });\n },\n /**\n * Load targets fetched from X-Ray service.\n * @param {object} targetsMapping - Newly fetched targets map with rule name as key.\n * @module RuleCache\n * @function loadTargets\n */\n loadTargets: function loadTargets(targetsMapping) {\n this.rules.forEach(function (rule) {\n var target = targetsMapping[rule.getName()];\n if (target) {\n rule.getReservoir().loadNewQuota(target.quota, target.TTL, target.interval);\n rule.setRate(target.rate);\n }\n });\n },\n getRules: function getRules() {\n return this.rules;\n },\n timestamp: function timestamp(now) {\n this.lastUpdated = now;\n },\n getLastUpdated: function getLastUpdated() {\n return this.lastUpdated;\n }\n};\nvar isExpired = function isExpired(now) {\n // The cache is considered expired if it is never loaded.\n if (!RuleCache.getLastUpdated())\n return true;\n return now > RuleCache.getLastUpdated() + TTL;\n};\nmodule.exports = RuleCache;\n", "\"use strict\";\nvar logger = require('../../logger');\nvar ServiceConnector = require('./service_connector');\nvar ruleCache = require('./rule_cache');\nvar DEFAULT_INTERVAL = 5 * 60 * 1000; // 5 minutes on sampling rules fetch\n/**\n * The RulePoller that periodically fetch sampling rules from X-Ray service\n * and load them into RuleCache.\n * @module RulePoller\n */\nvar RulePoller = {\n start: function start() {\n if (this.poller)\n clearInterval(this.poller);\n // Refresh sampling rules cache with no jitter upon start.\n refresh(false);\n this.poller = setInterval(refresh, DEFAULT_INTERVAL);\n this.poller.unref();\n },\n};\nvar refresh = function refresh(jitter) {\n // Add jitter by default unless explicitly told not to.\n jitter = typeof jitter === 'undefined' ? true : jitter;\n if (jitter) {\n var delay = getJitter();\n setTimeout(refreshWithFirewall, delay);\n }\n else\n refreshWithFirewall();\n};\nvar refreshWithFirewall = function refreshWithFirewall() {\n try {\n refreshCache();\n }\n catch (e) {\n logger.getLogger().warn('Encountered unexpected exception when fetching sampling rules: ' + e);\n }\n};\nvar refreshCache = function refreshCache() {\n // Timestamp should be generated *before* the actual outbound call to ensure\n // we don't mark the cache as being fresher than it actually is.\n var now = Math.floor(new Date().getTime() / 1000);\n // Pass a callback that only runs when the new rules are\n // successfully fetched. \n ServiceConnector.fetchSamplingRules(function (err, newRules) {\n if (err) {\n logger.getLogger().warn('Failed to retrieve sampling rules from X-Ray service:', err);\n }\n else if (newRules.length !== 0) {\n ruleCache.loadRules(newRules);\n ruleCache.timestamp(now);\n logger.getLogger().info('Successfully refreshed centralized sampling rule cache.');\n }\n });\n};\n// A random jitter of up to 5 seconds is injected after every run to ensure\n// the calls eventually get evenly distributed over the 5 minute window.\nvar getJitter = function getJitter() {\n return Math.random() * 5;\n};\nmodule.exports = RulePoller;\n", "\"use strict\";\nvar rulePoller = require('./rule_poller');\nvar serviceConnector = require('./service_connector');\nvar ruleCache = require('./rule_cache');\nvar logger = require('../../logger');\nvar DEFAULT_INTERVAL = 10 * 1000; // 10 seconds on sampling targets fetch\n/**\n * The TargetPoller that periodically fetch sampling targets from X-Ray service\n * and load them into RuleCache.\n * @module TargetPoller\n */\nvar TargetPoller = {\n interval: DEFAULT_INTERVAL,\n start: function start() {\n this.poller = setInterval(refreshWithFirewall, DEFAULT_INTERVAL + getJitter());\n this.poller.unref();\n },\n};\nvar refreshWithFirewall = function refreshWithFirewall() {\n try {\n refresh();\n }\n catch (e) {\n logger.getLogger().warn('Encountered unexpected exception when fetching sampling targets: ' + e);\n }\n};\nvar refresh = function refresh() {\n var candidates = getCandidates();\n if (candidates && candidates.length > 0) {\n serviceConnector.fetchTargets(candidates, function (err, targetsMapping, ruleFreshness) {\n if (err) {\n logger.getLogger().warn('Failed to retrieve sampling targets from X-Ray service:', err);\n return;\n }\n ruleCache.loadTargets(targetsMapping);\n if (ruleFreshness > ruleCache.getLastUpdated()) {\n logger.getLogger().info('Performing out-of-band sampling rule polling to fetch updated rules.');\n rulePoller.start();\n }\n logger.getLogger().info('Successfully reported rule statistics to get new sampling quota.');\n });\n }\n};\n// Don't report a rule statistics if any of the conditions is met:\n// 1. The report time hasn't come (some rules might have larger report intervals).\n// 2. The rule is never matched.\nvar getCandidates = function getCandidates() {\n var rules = ruleCache.getRules();\n var candidates = [];\n rules.forEach(function (rule) {\n if (rule.everMatched() && rule.timeToReport())\n candidates.push(rule);\n });\n return candidates;\n};\n// A random jitter of up to 0.1 seconds is injected after every run to ensure\n// the calls eventually get evenly distributed over the 10 second window.\nvar getJitter = function getJitter() {\n return Math.random() / TargetPoller.interval;\n};\nmodule.exports = TargetPoller;\n", "\"use strict\";\nvar logger = require('../../logger');\nconst util = require('util');\nvar SegmentUtils = require('../../segments/segment_utils');\n/**\n * The default sampler used to make sampling decisions when the decisions are absent in the incoming requests.\n * The sampler use pollers to poll sampling rules from X-Ray service.\n * @module DefaultSampler\n */\nvar DefaultSampler = {\n localSampler: require('./local_sampler'),\n rulePoller: require('./rule_poller'),\n targetPoller: require('./target_poller'),\n ruleCache: require('./rule_cache'),\n started: false,\n /**\n * Makes a sample decision based on the sample request.\n * @param {object} sampleRequest - Contains information for rules matching.\n * @module DefaultSampler\n * @function shouldSample\n */\n shouldSample: function shouldSample(sampleRequest) {\n try {\n if (!this.started)\n this.start();\n if (!sampleRequest.serviceType)\n sampleRequest.serviceType = SegmentUtils.origin;\n var now = Math.floor(new Date().getTime() / 1000);\n var matchedRule = this.ruleCache.getMatchedRule(sampleRequest, now);\n if (matchedRule) {\n logger.getLogger().debug(util.format('Rule %s is matched.', matchedRule.getName()));\n return processMatchedRule(matchedRule, now);\n }\n else {\n logger.getLogger().info('No effective centralized sampling rule match. Fallback to local rules.');\n return this.localSampler.shouldSample(sampleRequest);\n }\n }\n catch (err) {\n logger.getLogger().error('Unhandled exception by the SDK during making sampling decisions: ' + err);\n }\n },\n /**\n * Set local rules in case there is a need to fallback.\n * @module DefaultSampler\n * @function setLocalRules\n */\n setLocalRules: function setLocalRules(source) {\n this.localSampler.setLocalRules(source);\n },\n /**\n * Start the pollers to poll sampling rules and targets from X-Ray service.\n * @module DefaultSampler\n * @function start\n */\n start: function start() {\n if (!this.started) {\n this.rulePoller.start();\n this.targetPoller.start();\n this.started = true;\n }\n }\n};\nvar processMatchedRule = function processMatchedRule(rule, now) {\n // As long as a rule is matched we increment request counter.\n rule.incrementRequestCount();\n var reservoir = rule.getReservoir();\n var sample = true;\n // We check if we can borrow or take from reservoir first.\n var decision = reservoir.borrowOrTake(now, rule.canBorrow());\n if (decision === 'borrow')\n rule.incrementBorrowCount();\n else if (decision === 'take')\n rule.incrementSampledCount();\n // Otherwise we compute based on FixedRate of this sampling rule.\n else if (Math.random() <= rule.getRate())\n rule.incrementSampledCount();\n else\n sample = false;\n if (sample)\n return rule.getName();\n else\n return false;\n};\nmodule.exports = DefaultSampler;\n", "\"use strict\";\n/**\n * Middleware Utils module.\n *\n * Exposes various configuration and helper methods to be used by the middleware.\n * @module mw_utils\n */\nvar Segment = require('../segments/segment');\nvar IncomingRequestData = require('./incoming_request_data');\nvar logger = require('../logger');\nvar coreUtils = require('../utils');\nvar wildcardMatch = require('../utils').wildcardMatch;\nvar processTraceData = require('../utils').processTraceData;\n//headers are case-insensitive\nvar XRAY_HEADER = 'x-amzn-trace-id';\nvar overrideFlag = !!process.env.AWS_XRAY_TRACING_NAME;\nvar utils = {\n defaultName: process.env.AWS_XRAY_TRACING_NAME,\n dynamicNaming: false,\n hostPattern: null,\n sampler: require('./sampling/default_sampler'),\n /**\n * Enables dynamic naming for segments via the middleware. Use 'AWSXRay.middleware.enableDynamicNaming()'.\n * @param {string} [hostPattern] - The pattern to match the host header. See the README on dynamic and fixed naming modes.\n * @alias module:mw_utils.enableDynamicNaming\n */\n enableDynamicNaming: function (hostPattern) {\n this.dynamicNaming = true;\n if (hostPattern && typeof hostPattern !== 'string')\n throw new Error('Host pattern must be a string.');\n this.hostPattern = hostPattern || null;\n },\n /**\n * Splits out the 'x-amzn-trace-id' header params from the incoming request. Used by the middleware.\n * @param {http.IncomingMessage|https.IncomingMessage} req - The request object from the incoming call.\n * @returns {object}\n * @alias module:mw_utils.processHeaders\n */\n processHeaders: function processHeaders(req) {\n var amznTraceHeader = {};\n if (req && req.headers && req.headers[XRAY_HEADER]) {\n amznTraceHeader = processTraceData(req.headers[XRAY_HEADER]);\n }\n return amznTraceHeader;\n },\n /**\n * Resolves the name of the segment as determined by fixed or dynamic mode options. Used by the middleware.\n * @param {string} hostHeader - The string from the request.headers.host property.\n * @returns {string}\n * @alias module:mw_utils.resolveName\n */\n resolveName: function resolveName(hostHeader) {\n var name;\n if (this.dynamicNaming && hostHeader)\n name = this.hostPattern ? (wildcardMatch(this.hostPattern, hostHeader) ? hostHeader : this.defaultName) : hostHeader;\n else\n name = this.defaultName;\n return name;\n },\n /**\n * Resolves the sampling decision as determined by the values given and options set. Used by the middleware.\n * @param {object} amznTraceHeader - The object as returned by the processHeaders function.\n * @param {Segment} segment - The string from the request.headers.host property.\n * @param {http.ServerResponse|https.ServerResponse} res - The response object from the incoming call.\n * @returns {boolean}\n * @alias module:mw_utils.resolveSampling\n */\n resolveSampling: function resolveSampling(amznTraceHeader, segment, res) {\n var isSampled;\n if (amznTraceHeader.sampled === '1')\n isSampled = true;\n else if (amznTraceHeader.sampled === '0')\n isSampled = false;\n else {\n var sampleRequest = {\n host: res.req.headers.host,\n httpMethod: res.req.method,\n urlPath: res.req.url,\n serviceName: segment.name\n };\n isSampled = this.sampler.shouldSample(sampleRequest);\n if (isSampled instanceof String || typeof isSampled === 'string') {\n segment.setMatchedSamplingRule(isSampled);\n isSampled = true;\n }\n }\n if (amznTraceHeader.sampled === '?')\n res.header[XRAY_HEADER] = 'Root=' + amznTraceHeader.root + ';Sampled=' + (isSampled ? '1' : '0');\n if (!isSampled)\n segment.notTraced = true;\n },\n /**\n * Sets the default name of created segments. Used with the middleware.\n * Can be overridden by the AWS_XRAY_TRACING_NAME environment variable.\n * @param {string} name - The default name for segments created in the middleware.\n * @alias module:mw_utils.setDefaultName\n */\n setDefaultName: function setDefaultName(name) {\n if (!overrideFlag)\n this.defaultName = name;\n },\n disableCentralizedSampling: function disableCentralizedSampling() {\n this.sampler = require('./sampling/local_sampler');\n },\n /**\n * Overrides the default sampling rules file to specify at what rate to sample at for specific routes.\n * The base sampling rules file can be found at /lib/resources/default_sampling_rules.json\n * @param {string|Object} source - The path to the custom sampling rules file, or the source JSON object.\n * @memberof AWSXRay\n */\n setSamplingRules: function setSamplingRules(source) {\n if (!source || source instanceof String || !(typeof source === 'string' || (source instanceof Object)))\n throw new Error('Please specify a path to the local sampling rules file, or supply an object containing the rules.');\n this.sampler.setLocalRules(source);\n },\n /**\n * Logs a debug message including core request and segment information\n * @param {string} message - The message to be logged\n * @param {string} url - The request url being traced\n * @param {Segment} - The current segment\n */\n middlewareLog: function middlewareLog(message, url, segment) {\n logger.getLogger().debug(message + ': { url: ' + url + ', name: ' + segment.name + ', trace_id: ' +\n segment.trace_id + ', id: ' + segment.id + ', sampled: ' + !segment.notTraced + ' }');\n },\n /**\n * Traces the request/response cycle of an http.IncomingMessage / http.ServerResponse pair.\n * Resolves sampling rules, creates a segment, adds the core request / response data adding\n * throttling / error / fault flags based on the response status code.\n * @param {http.IncomingMessage} req - The incoming request.\n * @param {http.ServerResponse} res - The server response.\n * @returns {Segment}\n * @memberof AWSXRay\n */\n traceRequestResponseCycle: function traceRequestResponseCycle(req, res) {\n var amznTraceHeader = this.processHeaders(req);\n var name = this.resolveName(req.headers.host);\n var segment = new Segment(name, amznTraceHeader.root, amznTraceHeader.parent);\n var responseWithEmbeddedRequest = Object.assign({}, res, { req: req });\n this.resolveSampling(amznTraceHeader, segment, responseWithEmbeddedRequest);\n segment.addIncomingRequestData(new IncomingRequestData(req));\n this.middlewareLog('Starting middleware segment', req.url, segment);\n var middlewareLog = this.middlewareLog;\n var didEnd = false;\n var endSegment = function () {\n // ensure `endSegment` is only called once\n // in some versions of node.js 10.x and in all versions of node.js 11.x and higher,\n // the 'finish' and 'close' event are BOTH triggered.\n // Previously, only one or the other was triggered:\n // https://github.com/nodejs/node/pull/20611\n if (didEnd)\n return;\n didEnd = true;\n if (res.statusCode === 429) {\n segment.addThrottleFlag();\n }\n const cause = coreUtils.getCauseTypeFromHttpStatus(res.statusCode);\n if (cause) {\n segment[cause] = true;\n }\n segment.http.close(res);\n segment.close();\n middlewareLog('Closed middleware segment successfully', req.url, segment);\n };\n res.on('finish', endSegment);\n res.on('close', endSegment);\n return segment;\n }\n};\nmodule.exports = utils;\n", "\"use strict\";\nvar contextUtils = require('../context_utils');\nvar mwUtils = require('../middleware/mw_utils');\nvar LambdaUtils = require('../utils').LambdaUtils;\nvar Segment = require('../segments/segment');\nvar SegmentEmitter = require('../segment_emitter');\nvar SegmentUtils = require('../segments/segment_utils');\nvar logger = require('../logger');\nconst TraceID = require('../segments/attributes/trace_id');\n/**\n * @namespace\n * @ignore\n */\nvar xAmznTraceIdPrev = null;\n/**\n* Used to initialize segments on AWS Lambda with extra data from the context.\n*/\nmodule.exports.init = function init() {\n contextUtils.enableManualMode = function () {\n logger.getLogger().warn('AWS Lambda does not support AWS X-Ray manual mode.');\n };\n SegmentEmitter.disableReusableSocket();\n SegmentUtils.setStreamingThreshold(0);\n /**\n * Disabling all centralized sampling in Lambda environments. The sampling decisions would be\n * uselessly applied to the facade segment, and the sampling pollers were causing errors.\n *\n * See: https://github.com/aws/aws-xray-sdk-node/issues/217\n */\n logger.getLogger().info('Disabling centralized sampling in Lambda environment.');\n mwUtils.disableCentralizedSampling();\n var namespace = contextUtils.getNamespace();\n namespace.enter(namespace.createContext());\n contextUtils.setSegment(facadeSegment());\n};\nvar facadeSegment = function facadeSegment() {\n var segment = new Segment('facade');\n var whitelistFcn = ['addNewSubsegment', 'addSubsegment', 'removeSubsegment', 'toString'];\n var silentFcn = ['incrementCounter', 'decrementCounter', 'isClosed', 'close', 'format', 'flush'];\n var xAmznTraceId = process.env._X_AMZN_TRACE_ID;\n for (var key in segment) {\n if (typeof segment[key] === 'function' && whitelistFcn.indexOf(key) === -1) {\n if (silentFcn.indexOf(key) === -1) {\n segment[key] = (function () {\n var func = key;\n return function facade() {\n logger.getLogger().warn('Function \"' + func + '\" cannot be called on an AWS Lambda segment. Please use a subsegment to record data.');\n return;\n };\n })();\n }\n else {\n segment[key] = function facade() { return; };\n }\n }\n }\n segment.trace_id = TraceID.Invalid().toString();\n segment.isClosed = function () { return true; };\n segment.in_progress = false;\n segment.counter = 1;\n segment.notTraced = true;\n segment.facade = true;\n segment.reset = function reset() {\n this.trace_id = TraceID.Invalid().toString();\n this.id = '00000000';\n delete this.subsegments;\n this.notTraced = true;\n };\n segment.resolveLambdaTraceData = function resolveLambdaTraceData() {\n var xAmznLambda = process.env._X_AMZN_TRACE_ID;\n if (xAmznLambda) {\n // This check resets the trace data whenever a new trace header is read to not leak data between invocations\n if (xAmznLambda != xAmznTraceIdPrev) {\n this.reset();\n if (LambdaUtils.populateTraceData(segment, xAmznLambda))\n xAmznTraceIdPrev = xAmznLambda;\n }\n }\n else {\n this.reset();\n contextUtils.contextMissingStrategy.contextMissing('Missing AWS Lambda trace data for X-Ray. ' +\n 'Ensure Active Tracing is enabled and no subsegments are created outside the function handler.');\n }\n };\n // Test for valid trace data during SDK startup. It's likely we're still in the cold-start portion of the\n // code at this point and a valid trace header has not been set\n if (LambdaUtils.validTraceData(xAmznTraceId)) {\n if (LambdaUtils.populateTraceData(segment, xAmznTraceId))\n xAmznTraceIdPrev = xAmznTraceId;\n }\n return segment;\n};\n", "\"use strict\";\nvar http = require('http');\nvar Plugin = {\n METADATA_TIMEOUT: 1000,\n /**\n * Asynchronously retrieves metadata from on-instance endpoint with an HTTP request using retries for\n * requests that time out.\n * @param {object} options - The HTTP options to make the request with\n * @param {function} callback - callback to plugin\n */\n getPluginMetadata: function (options, callback) {\n const METADATA_RETRY_TIMEOUT = 250; // Millis\n const METADATA_RETRIES = 5;\n var retries = METADATA_RETRIES;\n var getMetadata = function () {\n var httpReq = http.__request ? http.__request : http.request;\n var req = httpReq(options, function (res) {\n var body = '';\n res.on('data', function (chunk) {\n body += chunk;\n });\n res.on('end', function () {\n if (this.statusCode === 200 || this.statusCode === 300) {\n try {\n body = JSON.parse(body);\n }\n catch (e) {\n callback(e);\n return;\n }\n callback(null, body);\n }\n else if (retries > 0 && Math.floor(this.statusCode / 100) === 5) {\n retries--;\n setTimeout(getMetadata, METADATA_RETRY_TIMEOUT);\n }\n else {\n callback(new Error(`Failed to retrieve metadata with options: ${options}`));\n }\n });\n });\n req.on('error', function (err) {\n callback(err);\n });\n req.on('timeout', function () {\n req.abort();\n });\n req.setTimeout(Plugin.METADATA_TIMEOUT);\n req.end();\n };\n getMetadata();\n }\n};\nmodule.exports = Plugin;\n", "\"use strict\";\nvar Plugin = require('./plugin');\nvar logger = require('../../logger');\nvar http = require('http');\nvar EC2Plugin = {\n /**\n * A function to get the instance data from the EC2 metadata service.\n * @param {function} callback - The callback for the plugin loader.\n */\n getData: function (callback) {\n const METADATA_PATH = '/latest/dynamic/instance-identity/document';\n function populateMetadata(token) {\n const options = getOptions(METADATA_PATH, 'GET', token ? { 'X-aws-ec2-metadata-token': token } : {});\n Plugin.getPluginMetadata(options, function (err, data) {\n if (err || !data) {\n logger.getLogger().error('Error loading EC2 plugin metadata: ', err ? err.toString() : 'Could not retrieve data from IMDS.');\n callback();\n return;\n }\n const metadata = {\n ec2: {\n instance_id: data.instanceId,\n availability_zone: data.availabilityZone,\n instance_size: data.instanceType,\n ami_id: data.imageId\n }\n };\n callback(metadata);\n });\n }\n /**\n * This kicks off a requet to get a token used for requests to IMDSv2. If the request for the token\n * fails, we fall back to IMDSv1. Otherwise, the token will be used for an IMDSv2 request.\n */\n getToken(function (token) {\n if (token === null) {\n logger.getLogger().debug('EC2Plugin failed to get token from IMDSv2. Falling back to IMDSv1.');\n }\n populateMetadata(token);\n });\n },\n originName: 'AWS::EC2::Instance'\n};\n/**\n * Asynchronously retrieves a token used in requests to EC2 instance metadata service.\n * @param {function} callback - callback to plugin\n */\nfunction getToken(callback) {\n const httpReq = http.__request ? http.__request : http.request;\n const TTL = 60; //seconds\n const TOKEN_PATH = '/latest/api/token';\n const options = getOptions(TOKEN_PATH, 'PUT', {\n 'X-aws-ec2-metadata-token-ttl-seconds': TTL\n });\n let req = httpReq(options, function (res) {\n let body = '';\n res.on('data', function (chunk) {\n body += chunk;\n });\n res.on('end', function () {\n if (this.statusCode === 200 || this.statusCode === 300) {\n callback(body);\n }\n else {\n callback(null);\n }\n });\n });\n req.on('error', function () {\n callback(null);\n });\n req.on('timeout', function () {\n req.abort();\n callback(null);\n });\n req.setTimeout(Plugin.METADATA_TIMEOUT);\n req.end();\n}\nfunction getOptions(path, method, headers) {\n if (!method) {\n method = 'GET';\n }\n if (!headers) {\n headers = {};\n }\n return {\n host: '169.254.169.254',\n path: path,\n method: method,\n headers: headers\n };\n}\nmodule.exports = EC2Plugin;\n", "\"use strict\";\nvar os = require('os');\nvar ECSPlugin = {\n /**\n * A function to get the instance data from the ECS instance.\n * @param {function} callback - The callback for the plugin loader.\n */\n getData: function (callback) {\n callback({ ecs: { container: os.hostname() } });\n },\n originName: 'AWS::ECS::Container'\n};\nmodule.exports = ECSPlugin;\n", "\"use strict\";\nvar fs = require('fs');\nvar logger = require('../../logger');\nvar ENV_CONFIG_LOCATION = '/var/elasticbeanstalk/xray/environment.conf';\nvar ElasticBeanstalkPlugin = {\n /**\n * A function to get data from the Elastic Beanstalk environment configuration file.\n * @param {function} callback - The callback for the plugin loader.\n */\n getData: function (callback) {\n fs.readFile(ENV_CONFIG_LOCATION, 'utf8', function (err, rawData) {\n if (err) {\n logger.getLogger().error('Error loading Elastic Beanstalk plugin:', err.stack);\n callback();\n }\n else {\n var data = JSON.parse(rawData);\n var metadata = {\n elastic_beanstalk: {\n environment: data.environment_name,\n version_label: data.version_label,\n deployment_id: data.deployment_id\n }\n };\n callback(metadata);\n }\n });\n },\n originName: 'AWS::ElasticBeanstalk::Environment'\n};\nmodule.exports = ElasticBeanstalkPlugin;\n", "\"use strict\";\nvar fs = require('fs');\nvar logger = require('../logger');\nvar whitelist = require('../resources/aws_whitelist.json');\nvar paramTypes = {\n REQ_DESC: 'request_descriptors',\n REQ_PARAMS: 'request_parameters',\n RES_DESC: 'response_descriptors',\n RES_PARAMS: 'response_parameters'\n};\n/**\n * Represents a set of AWS services, operations and keys or params to capture.\n * @constructor\n * @param {string|Object} [source] - The location or source JSON object of the custom AWS whitelist file. If none is provided, the default file will be used.\n */\nfunction CallCapturer(source) {\n this.init(source);\n}\nCallCapturer.prototype.init = function init(source) {\n if (source) {\n if (typeof source === 'string') {\n logger.getLogger().info('Using custom AWS whitelist file: ' + source);\n this.services = loadWhitelist(JSON.parse(fs.readFileSync(source, 'utf8')));\n }\n else {\n logger.getLogger().info('Using custom AWS whitelist source.');\n this.services = loadWhitelist(source);\n }\n }\n else\n this.services = whitelist.services;\n};\nCallCapturer.prototype.append = function append(source) {\n var newServices = {};\n if (typeof source === 'string') {\n logger.getLogger().info('Appending AWS whitelist with custom file: ' + source);\n newServices = loadWhitelist(JSON.parse(fs.readFileSync(source, 'utf8')));\n }\n else {\n logger.getLogger().info('Appending AWS whitelist with a custom source.');\n newServices = loadWhitelist(source);\n }\n for (var attribute in newServices) {\n this.services[attribute] = newServices[attribute];\n }\n};\nCallCapturer.prototype.capture = function capture(serviceName, response) {\n var operation = response.request.operation;\n var call = this.services[serviceName] !== undefined ? this.services[serviceName].operations[operation] : null;\n if (call === null) {\n logger.getLogger().debug('Call \"' + serviceName + '.' + operation + '\" is not whitelisted for additional data capturing. Ignoring.');\n return;\n }\n var dataCaptured = {};\n for (var paramType in call) {\n var params = call[paramType];\n if (paramType === paramTypes.REQ_PARAMS) {\n captureCallParams(params, response.request.params, dataCaptured);\n }\n else if (paramType === paramTypes.REQ_DESC) {\n captureDescriptors(params, response.request.params, dataCaptured);\n }\n else if (paramType === paramTypes.RES_PARAMS) {\n if (response.data) {\n captureCallParams(params, response.data, dataCaptured);\n }\n }\n else if (paramType === paramTypes.RES_DESC) {\n if (response.data) {\n captureDescriptors(params, response.data, dataCaptured);\n }\n }\n else {\n logger.getLogger().error('Unknown parameter type \"' + paramType + '\". Must be \"request_descriptors\", \"response_descriptors\", ' +\n '\"request_parameters\" or \"response_parameters\".');\n }\n }\n return dataCaptured;\n};\nfunction captureCallParams(params, call, data) {\n params.forEach(function (param) {\n if (typeof call[param] !== 'undefined') {\n var formatted = toSnakeCase(param);\n this[formatted] = call[param];\n }\n }, data);\n}\nfunction captureDescriptors(descriptors, params, data) {\n for (var paramName in descriptors) {\n var attributes = descriptors[paramName];\n if (typeof params[paramName] !== 'undefined') {\n var paramData;\n if (attributes.list && attributes.get_count)\n paramData = params[paramName] ? params[paramName].length : 0;\n else\n paramData = attributes.get_keys === true ? Object.keys(params[paramName]) : params[paramName];\n if (typeof attributes.rename_to === 'string') {\n data[attributes.rename_to] = paramData;\n }\n else {\n var formatted = toSnakeCase(paramName);\n data[formatted] = paramData;\n }\n }\n }\n}\nfunction toSnakeCase(param) {\n if (param === 'IPAddress')\n return 'ip_address';\n else\n return param.split(/(?=[A-Z])/).join('_').toLowerCase();\n}\nfunction loadWhitelist(source) {\n var doc = source;\n if (doc.services === undefined)\n throw new Error('Document formatting is incorrect. Expecting \"services\" param.');\n return doc.services;\n}\nmodule.exports = CallCapturer;\n", "\"use strict\";\nvar CallCapturer = require('../../patchers/call_capturer.js');\nvar capturer = new CallCapturer();\n/**\n * Represents a AWS client call. Automatically captures data from the supplied response object,\n * Data captured depends on the whitelisting file supplied.\n * The base whitelisting file can be found at /lib/resources/aws_whitelist.json.\n * @constructor\n * @param {any} res - The response object from the AWS call. Typed as any to avoid AWS SDK dependency. Otherwise would be AWS.Response.\n * @param {string} serviceName - The service name of the AWS client.\n * @see https://github.com/aws/aws-sdk-js/blob/master/lib/response.js\n */\nfunction Aws(res, serviceName) {\n this.init(res, serviceName);\n}\nAws.prototype.init = function init(res, serviceName) {\n //TODO: account ID\n this.operation = formatOperation(res.request.operation) || '';\n if (res && res.request && res.request.httpRequest && res.request.httpRequest.region) {\n this.region = res.request.httpRequest.region;\n }\n if (res && res.requestId) {\n this.request_id = res.requestId;\n }\n this.retries = res.retryCount || 0;\n if (res.extendedRequestId && serviceName && serviceName.toLowerCase() === 's3')\n this.id_2 = res.extendedRequestId;\n this.addData(capturer.capture(serviceName, res));\n};\nAws.prototype.addData = function addData(data) {\n for (var attribute in data) {\n this[attribute] = data[attribute];\n }\n};\n/**\n * Overrides the default whitelisting file to specify what params to capture on each AWS Service call.\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @exports setAWSWhitelist\n */\nvar setAWSWhitelist = function setAWSWhitelist(source) {\n if (!source || source instanceof String || !(typeof source === 'string' || (source instanceof Object)))\n throw new Error('Please specify a path to the local whitelist file, or supply a whitelist source object.');\n capturer = new CallCapturer(source);\n};\n/**\n * Appends to the default whitelisting file to specify what params to capture on each AWS Service call.\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @exports appendAWSWhitelist\n */\nvar appendAWSWhitelist = function appendAWSWhitelist(source) {\n if (!source || source instanceof String || !(typeof source === 'string' || (source instanceof Object)))\n throw new Error('Please specify a path to the local whitelist file, or supply a whitelist source object.');\n capturer.append(source);\n};\nfunction formatOperation(operation) {\n if (!operation)\n return;\n return operation.charAt(0).toUpperCase() + operation.slice(1);\n}\nmodule.exports = Aws;\nmodule.exports.appendAWSWhitelist = appendAWSWhitelist;\nmodule.exports.setAWSWhitelist = setAWSWhitelist;\n", "\"use strict\";\n/**\n * Capture module.\n * @module capture\n */\nvar contextUtils = require('./context_utils');\nvar logger = require('./logger');\n/**\n * Wrap to automatically capture information for the segment.\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function context to wrap. Can take a single 'subsegment' argument.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @alias module:capture.captureFunc\n * @return {*} - Returns the result if any by executing the provided function.\n */\nvar captureFunc = function captureFunc(name, fcn, parent) {\n validate(name, fcn);\n var current, executeFcn;\n var parentSeg = contextUtils.resolveSegment(parent);\n if (!parentSeg) {\n logger.getLogger().warn('Failed to capture function.');\n return fcn();\n }\n current = parentSeg.addNewSubsegment(name);\n executeFcn = captureFcn(fcn, current);\n try {\n const response = executeFcn(current);\n current.close();\n return response;\n }\n catch (e) {\n current.close(e);\n throw (e);\n }\n};\n/**\n * Wrap to automatically capture information for the sub/segment. You must close the segment\n * manually from within the function.\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function context to wrap. Must take a single 'subsegment' argument and call 'subsegment.close([optional error])' when the async function completes.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @alias module:capture.captureAsyncFunc\n * @return {*} - Returns a promise by executing the provided async function.\n */\nvar captureAsyncFunc = function captureAsyncFunc(name, fcn, parent) {\n validate(name, fcn);\n var current, executeFcn;\n var parentSeg = contextUtils.resolveSegment(parent);\n if (!parentSeg) {\n logger.getLogger().warn('Failed to capture async function.');\n return fcn();\n }\n current = parentSeg.addNewSubsegment(name);\n executeFcn = captureFcn(fcn, current);\n try {\n return executeFcn(current);\n }\n catch (e) {\n current.close(e);\n throw (e);\n }\n};\n/**\n * Wrap to automatically capture information for the sub/segment. This wraps the callback and returns a function.\n * when executed, all arguments are passed through accordingly. An additional argument is appended to gain access to the newly created subsegment.\n * For this reason, always call the captured callback with the full list of arguments.\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function context to wrap. Can take a single 'subsegment' argument.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @alias module:capture.captureCallbackFunc\n */\nvar captureCallbackFunc = function captureCallbackFunc(name, fcn, parent) {\n validate(name, fcn);\n var base = contextUtils.resolveSegment(parent);\n if (!base) {\n logger.getLogger().warn('Failed to capture callback function.');\n return fcn;\n }\n base.incrementCounter();\n return function () {\n var parentSeg = contextUtils.resolveSegment(parent);\n var args = Array.prototype.slice.call(arguments);\n captureFunc(name, fcn.bind.apply(fcn, [null].concat(args)), parentSeg);\n base.decrementCounter();\n }.bind(this);\n};\nfunction captureFcn(fcn, current) {\n var executeFcn;\n if (contextUtils.isAutomaticMode()) {\n var session = contextUtils.getNamespace();\n var contextFcn = function () {\n var value;\n session.run(function () {\n contextUtils.setSegment(current);\n value = fcn(current);\n });\n return value;\n };\n executeFcn = contextFcn;\n }\n else {\n executeFcn = fcn;\n }\n return executeFcn;\n}\nfunction validate(name, fcn) {\n var error;\n if (!name || typeof name !== 'string') {\n error = 'Param \"name\" must be a non-empty string.';\n logger.getLogger().error(error);\n throw new Error(error);\n }\n else if (typeof fcn !== 'function') {\n error = 'Param \"fcn\" must be a function.';\n logger.getLogger().error(error);\n throw new Error(error);\n }\n}\nmodule.exports.captureFunc = captureFunc;\nmodule.exports.captureAsyncFunc = captureAsyncFunc;\nmodule.exports.captureCallbackFunc = captureCallbackFunc;\n", "exports = module.exports = SemVer\n\nvar debug\n/* istanbul ignore next */\nif (typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)) {\n debug = function () {\n var args = Array.prototype.slice.call(arguments, 0)\n args.unshift('SEMVER')\n console.log.apply(console, args)\n }\n} else {\n debug = function () {}\n}\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nexports.SEMVER_SPEC_VERSION = '2.0.0'\n\nvar MAX_LENGTH = 256\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n /* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nvar MAX_SAFE_COMPONENT_LENGTH = 16\n\n// The actual regexps go on exports.re\nvar re = exports.re = []\nvar src = exports.src = []\nvar R = 0\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\nvar NUMERICIDENTIFIER = R++\nsrc[NUMERICIDENTIFIER] = '0|[1-9]\\\\d*'\nvar NUMERICIDENTIFIERLOOSE = R++\nsrc[NUMERICIDENTIFIERLOOSE] = '[0-9]+'\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\nvar NONNUMERICIDENTIFIER = R++\nsrc[NONNUMERICIDENTIFIER] = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*'\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\nvar MAINVERSION = R++\nsrc[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIER] + ')'\n\nvar MAINVERSIONLOOSE = R++\nsrc[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n '(' + src[NUMERICIDENTIFIERLOOSE] + ')'\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\nvar PRERELEASEIDENTIFIER = R++\nsrc[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +\n '|' + src[NONNUMERICIDENTIFIER] + ')'\n\nvar PRERELEASEIDENTIFIERLOOSE = R++\nsrc[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +\n '|' + src[NONNUMERICIDENTIFIER] + ')'\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\nvar PRERELEASE = R++\nsrc[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +\n '(?:\\\\.' + src[PRERELEASEIDENTIFIER] + ')*))'\n\nvar PRERELEASELOOSE = R++\nsrc[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +\n '(?:\\\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\nvar BUILDIDENTIFIER = R++\nsrc[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\nvar BUILD = R++\nsrc[BUILD] = '(?:\\\\+(' + src[BUILDIDENTIFIER] +\n '(?:\\\\.' + src[BUILDIDENTIFIER] + ')*))'\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\nvar FULL = R++\nvar FULLPLAIN = 'v?' + src[MAINVERSION] +\n src[PRERELEASE] + '?' +\n src[BUILD] + '?'\n\nsrc[FULL] = '^' + FULLPLAIN + '$'\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\nvar LOOSEPLAIN = '[v=\\\\s]*' + src[MAINVERSIONLOOSE] +\n src[PRERELEASELOOSE] + '?' +\n src[BUILD] + '?'\n\nvar LOOSE = R++\nsrc[LOOSE] = '^' + LOOSEPLAIN + '$'\n\nvar GTLT = R++\nsrc[GTLT] = '((?:<|>)?=?)'\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\nvar XRANGEIDENTIFIERLOOSE = R++\nsrc[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\\\*'\nvar XRANGEIDENTIFIER = R++\nsrc[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\\\*'\n\nvar XRANGEPLAIN = R++\nsrc[XRANGEPLAIN] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIER] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n '(?:' + src[PRERELEASE] + ')?' +\n src[BUILD] + '?' +\n ')?)?'\n\nvar XRANGEPLAINLOOSE = R++\nsrc[XRANGEPLAINLOOSE] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:' + src[PRERELEASELOOSE] + ')?' +\n src[BUILD] + '?' +\n ')?)?'\n\nvar XRANGE = R++\nsrc[XRANGE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAIN] + '$'\nvar XRANGELOOSE = R++\nsrc[XRANGELOOSE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAINLOOSE] + '$'\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\nvar COERCE = R++\nsrc[COERCE] = '(?:^|[^\\\\d])' +\n '(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +\n '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n '(?:$|[^\\\\d])'\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\nvar LONETILDE = R++\nsrc[LONETILDE] = '(?:~>?)'\n\nvar TILDETRIM = R++\nsrc[TILDETRIM] = '(\\\\s*)' + src[LONETILDE] + '\\\\s+'\nre[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')\nvar tildeTrimReplace = '$1~'\n\nvar TILDE = R++\nsrc[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'\nvar TILDELOOSE = R++\nsrc[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\nvar LONECARET = R++\nsrc[LONECARET] = '(?:\\\\^)'\n\nvar CARETTRIM = R++\nsrc[CARETTRIM] = '(\\\\s*)' + src[LONECARET] + '\\\\s+'\nre[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')\nvar caretTrimReplace = '$1^'\n\nvar CARET = R++\nsrc[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'\nvar CARETLOOSE = R++\nsrc[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\nvar COMPARATORLOOSE = R++\nsrc[COMPARATORLOOSE] = '^' + src[GTLT] + '\\\\s*(' + LOOSEPLAIN + ')$|^$'\nvar COMPARATOR = R++\nsrc[COMPARATOR] = '^' + src[GTLT] + '\\\\s*(' + FULLPLAIN + ')$|^$'\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\nvar COMPARATORTRIM = R++\nsrc[COMPARATORTRIM] = '(\\\\s*)' + src[GTLT] +\n '\\\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'\n\n// this one has to use the /g flag\nre[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')\nvar comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\nvar HYPHENRANGE = R++\nsrc[HYPHENRANGE] = '^\\\\s*(' + src[XRANGEPLAIN] + ')' +\n '\\\\s+-\\\\s+' +\n '(' + src[XRANGEPLAIN] + ')' +\n '\\\\s*$'\n\nvar HYPHENRANGELOOSE = R++\nsrc[HYPHENRANGELOOSE] = '^\\\\s*(' + src[XRANGEPLAINLOOSE] + ')' +\n '\\\\s+-\\\\s+' +\n '(' + src[XRANGEPLAINLOOSE] + ')' +\n '\\\\s*$'\n\n// Star ranges basically just allow anything at all.\nvar STAR = R++\nsrc[STAR] = '(<|>)?=?\\\\s*\\\\*'\n\n// Compile to actual regexp objects.\n// All are flag-free, unless they were created above with a flag.\nfor (var i = 0; i < R; i++) {\n debug(i, src[i])\n if (!re[i]) {\n re[i] = new RegExp(src[i])\n }\n}\n\nexports.parse = parse\nfunction parse (version, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n if (version.length > MAX_LENGTH) {\n return null\n }\n\n var r = options.loose ? re[LOOSE] : re[FULL]\n if (!r.test(version)) {\n return null\n }\n\n try {\n return new SemVer(version, options)\n } catch (er) {\n return null\n }\n}\n\nexports.valid = valid\nfunction valid (version, options) {\n var v = parse(version, options)\n return v ? v.version : null\n}\n\nexports.clean = clean\nfunction clean (version, options) {\n var s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\n\nexports.SemVer = SemVer\n\nfunction SemVer (version, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n if (version instanceof SemVer) {\n if (version.loose === options.loose) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError('Invalid Version: ' + version)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')\n }\n\n if (!(this instanceof SemVer)) {\n return new SemVer(version, options)\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n\n var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])\n\n if (!m) {\n throw new TypeError('Invalid Version: ' + version)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map(function (id) {\n if (/^[0-9]+$/.test(id)) {\n var num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n}\n\nSemVer.prototype.format = function () {\n this.version = this.major + '.' + this.minor + '.' + this.patch\n if (this.prerelease.length) {\n this.version += '-' + this.prerelease.join('.')\n }\n return this.version\n}\n\nSemVer.prototype.toString = function () {\n return this.version\n}\n\nSemVer.prototype.compare = function (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return this.compareMain(other) || this.comparePre(other)\n}\n\nSemVer.prototype.compareMain = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n}\n\nSemVer.prototype.comparePre = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n var i = 0\n do {\n var a = this.prerelease[i]\n var b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n}\n\n// preminor will bump the version up to the next minor release, and immediately\n// down to pre-release. premajor and prepatch work the same way.\nSemVer.prototype.inc = function (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 \"pre\" would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n var i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (this.prerelease[0] === identifier) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error('invalid increment argument: ' + release)\n }\n this.format()\n this.raw = this.version\n return this\n}\n\nexports.inc = inc\nfunction inc (version, release, loose, identifier) {\n if (typeof (loose) === 'string') {\n identifier = loose\n loose = undefined\n }\n\n try {\n return new SemVer(version, loose).inc(release, identifier).version\n } catch (er) {\n return null\n }\n}\n\nexports.diff = diff\nfunction diff (version1, version2) {\n if (eq(version1, version2)) {\n return null\n } else {\n var v1 = parse(version1)\n var v2 = parse(version2)\n var prefix = ''\n if (v1.prerelease.length || v2.prerelease.length) {\n prefix = 'pre'\n var defaultResult = 'prerelease'\n }\n for (var key in v1) {\n if (key === 'major' || key === 'minor' || key === 'patch') {\n if (v1[key] !== v2[key]) {\n return prefix + key\n }\n }\n }\n return defaultResult // may be undefined\n }\n}\n\nexports.compareIdentifiers = compareIdentifiers\n\nvar numeric = /^[0-9]+$/\nfunction compareIdentifiers (a, b) {\n var anum = numeric.test(a)\n var bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nexports.rcompareIdentifiers = rcompareIdentifiers\nfunction rcompareIdentifiers (a, b) {\n return compareIdentifiers(b, a)\n}\n\nexports.major = major\nfunction major (a, loose) {\n return new SemVer(a, loose).major\n}\n\nexports.minor = minor\nfunction minor (a, loose) {\n return new SemVer(a, loose).minor\n}\n\nexports.patch = patch\nfunction patch (a, loose) {\n return new SemVer(a, loose).patch\n}\n\nexports.compare = compare\nfunction compare (a, b, loose) {\n return new SemVer(a, loose).compare(new SemVer(b, loose))\n}\n\nexports.compareLoose = compareLoose\nfunction compareLoose (a, b) {\n return compare(a, b, true)\n}\n\nexports.rcompare = rcompare\nfunction rcompare (a, b, loose) {\n return compare(b, a, loose)\n}\n\nexports.sort = sort\nfunction sort (list, loose) {\n return list.sort(function (a, b) {\n return exports.compare(a, b, loose)\n })\n}\n\nexports.rsort = rsort\nfunction rsort (list, loose) {\n return list.sort(function (a, b) {\n return exports.rcompare(a, b, loose)\n })\n}\n\nexports.gt = gt\nfunction gt (a, b, loose) {\n return compare(a, b, loose) > 0\n}\n\nexports.lt = lt\nfunction lt (a, b, loose) {\n return compare(a, b, loose) < 0\n}\n\nexports.eq = eq\nfunction eq (a, b, loose) {\n return compare(a, b, loose) === 0\n}\n\nexports.neq = neq\nfunction neq (a, b, loose) {\n return compare(a, b, loose) !== 0\n}\n\nexports.gte = gte\nfunction gte (a, b, loose) {\n return compare(a, b, loose) >= 0\n}\n\nexports.lte = lte\nfunction lte (a, b, loose) {\n return compare(a, b, loose) <= 0\n}\n\nexports.cmp = cmp\nfunction cmp (a, op, b, loose) {\n switch (op) {\n case '===':\n if (typeof a === 'object')\n a = a.version\n if (typeof b === 'object')\n b = b.version\n return a === b\n\n case '!==':\n if (typeof a === 'object')\n a = a.version\n if (typeof b === 'object')\n b = b.version\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError('Invalid operator: ' + op)\n }\n}\n\nexports.Comparator = Comparator\nfunction Comparator (comp, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n if (!(this instanceof Comparator)) {\n return new Comparator(comp, options)\n }\n\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n}\n\nvar ANY = {}\nComparator.prototype.parse = function (comp) {\n var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]\n var m = comp.match(r)\n\n if (!m) {\n throw new TypeError('Invalid comparator: ' + comp)\n }\n\n this.operator = m[1]\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n}\n\nComparator.prototype.toString = function () {\n return this.value\n}\n\nComparator.prototype.test = function (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n version = new SemVer(version, this.options)\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n}\n\nComparator.prototype.intersects = function (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n var rangeTmp\n\n if (this.operator === '') {\n rangeTmp = new Range(comp.value, options)\n return satisfies(this.value, rangeTmp, options)\n } else if (comp.operator === '') {\n rangeTmp = new Range(this.value, options)\n return satisfies(comp.semver, rangeTmp, options)\n }\n\n var sameDirectionIncreasing =\n (this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '>=' || comp.operator === '>')\n var sameDirectionDecreasing =\n (this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '<=' || comp.operator === '<')\n var sameSemVer = this.semver.version === comp.semver.version\n var differentDirectionsInclusive =\n (this.operator === '>=' || this.operator === '<=') &&\n (comp.operator === '>=' || comp.operator === '<=')\n var oppositeDirectionsLessThan =\n cmp(this.semver, '<', comp.semver, options) &&\n ((this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '<=' || comp.operator === '<'))\n var oppositeDirectionsGreaterThan =\n cmp(this.semver, '>', comp.semver, options) &&\n ((this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '>=' || comp.operator === '>'))\n\n return sameDirectionIncreasing || sameDirectionDecreasing ||\n (sameSemVer && differentDirectionsInclusive) ||\n oppositeDirectionsLessThan || oppositeDirectionsGreaterThan\n}\n\nexports.Range = Range\nfunction Range (range, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (range instanceof Range) {\n if (range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n return new Range(range.value, options)\n }\n\n if (!(this instanceof Range)) {\n return new Range(range, options)\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First, split based on boolean or ||\n this.raw = range\n this.set = range.split(/\\s*\\|\\|\\s*/).map(function (range) {\n return this.parseRange(range.trim())\n }, this).filter(function (c) {\n // throw out any that are not relevant for whatever reason\n return c.length\n })\n\n if (!this.set.length) {\n throw new TypeError('Invalid SemVer Range: ' + range)\n }\n\n this.format()\n}\n\nRange.prototype.format = function () {\n this.range = this.set.map(function (comps) {\n return comps.join(' ').trim()\n }).join('||').trim()\n return this.range\n}\n\nRange.prototype.toString = function () {\n return this.range\n}\n\nRange.prototype.parseRange = function (range) {\n var loose = this.options.loose\n range = range.trim()\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]\n range = range.replace(hr, hyphenReplace)\n debug('hyphen replace', range)\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range, re[COMPARATORTRIM])\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[TILDETRIM], tildeTrimReplace)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[CARETTRIM], caretTrimReplace)\n\n // normalize spaces\n range = range.split(/\\s+/).join(' ')\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]\n var set = range.split(' ').map(function (comp) {\n return parseComparator(comp, this.options)\n }, this).join(' ').split(/\\s+/)\n if (this.options.loose) {\n // in loose mode, throw out any that are not valid comparators\n set = set.filter(function (comp) {\n return !!comp.match(compRe)\n })\n }\n set = set.map(function (comp) {\n return new Comparator(comp, this.options)\n }, this)\n\n return set\n}\n\nRange.prototype.intersects = function (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some(function (thisComparators) {\n return thisComparators.every(function (thisComparator) {\n return range.set.some(function (rangeComparators) {\n return rangeComparators.every(function (rangeComparator) {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n })\n })\n}\n\n// Mostly just for testing and legacy API reasons\nexports.toComparators = toComparators\nfunction toComparators (range, options) {\n return new Range(range, options).set.map(function (comp) {\n return comp.map(function (c) {\n return c.value\n }).join(' ').trim().split(' ')\n })\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nfunction parseComparator (comp, options) {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nfunction isX (id) {\n return !id || id.toLowerCase() === 'x' || id === '*'\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceTildes (comp, options) {\n return comp.trim().split(/\\s+/).map(function (comp) {\n return replaceTilde(comp, options)\n }).join(' ')\n}\n\nfunction replaceTilde (comp, options) {\n var r = options.loose ? re[TILDELOOSE] : re[TILDE]\n return comp.replace(r, function (_, M, m, p, pr) {\n debug('tilde', comp, _, M, m, p, pr)\n var ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + (+m + 1) + '.0'\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0\n// ^1.2.3 --> >=1.2.3 <2.0.0\n// ^1.2.0 --> >=1.2.0 <2.0.0\nfunction replaceCarets (comp, options) {\n return comp.trim().split(/\\s+/).map(function (comp) {\n return replaceCaret(comp, options)\n }).join(' ')\n}\n\nfunction replaceCaret (comp, options) {\n debug('caret', comp, options)\n var r = options.loose ? re[CARETLOOSE] : re[CARET]\n return comp.replace(r, function (_, M, m, p, pr) {\n debug('caret', comp, _, M, m, p, pr)\n var ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (isX(p)) {\n if (M === '0') {\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n } else {\n ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + m + '.' + (+p + 1)\n } else {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n } else {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + (+M + 1) + '.0.0'\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + m + '.' + (+p + 1)\n } else {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n } else {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + (+M + 1) + '.0.0'\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nfunction replaceXRanges (comp, options) {\n debug('replaceXRanges', comp, options)\n return comp.split(/\\s+/).map(function (comp) {\n return replaceXRange(comp, options)\n }).join(' ')\n}\n\nfunction replaceXRange (comp, options) {\n comp = comp.trim()\n var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]\n return comp.replace(r, function (ret, gtlt, M, m, p, pr) {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n var xM = isX(M)\n var xm = xM || isX(m)\n var xp = xm || isX(p)\n var anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n // >1.2.3 => >= 1.2.4\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n ret = gtlt + M + '.' + m + '.' + p\n } else if (xm) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (xp) {\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nfunction replaceStars (comp, options) {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp.trim().replace(re[STAR], '')\n}\n\n// This function is passed to string.replace(re[HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0\nfunction hyphenReplace ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr, tb) {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = '>=' + fM + '.0.0'\n } else if (isX(fp)) {\n from = '>=' + fM + '.' + fm + '.0'\n } else {\n from = '>=' + from\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = '<' + (+tM + 1) + '.0.0'\n } else if (isX(tp)) {\n to = '<' + tM + '.' + (+tm + 1) + '.0'\n } else if (tpr) {\n to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr\n } else {\n to = '<=' + to\n }\n\n return (from + ' ' + to).trim()\n}\n\n// if ANY of the sets match ALL of its comparators, then pass\nRange.prototype.test = function (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n version = new SemVer(version, this.options)\n }\n\n for (var i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n}\n\nfunction testSet (set, version, options) {\n for (var i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n var allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n\nexports.satisfies = satisfies\nfunction satisfies (version, range, options) {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\n\nexports.maxSatisfying = maxSatisfying\nfunction maxSatisfying (versions, range, options) {\n var max = null\n var maxSV = null\n try {\n var rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach(function (v) {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\n\nexports.minSatisfying = minSatisfying\nfunction minSatisfying (versions, range, options) {\n var min = null\n var minSV = null\n try {\n var rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach(function (v) {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\n\nexports.minVersion = minVersion\nfunction minVersion (range, loose) {\n range = new Range(range, loose)\n\n var minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (var i = 0; i < range.set.length; ++i) {\n var comparators = range.set[i]\n\n comparators.forEach(function (comparator) {\n // Clone to avoid manipulating the comparator's semver object.\n var compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!minver || gt(minver, compver)) {\n minver = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error('Unexpected operation: ' + comparator.operator)\n }\n })\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\n\nexports.validRange = validRange\nfunction validRange (range, options) {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\n\n// Determine if version is less than all the versions possible in the range\nexports.ltr = ltr\nfunction ltr (version, range, options) {\n return outside(version, range, '<', options)\n}\n\n// Determine if version is greater than all the versions possible in the range.\nexports.gtr = gtr\nfunction gtr (version, range, options) {\n return outside(version, range, '>', options)\n}\n\nexports.outside = outside\nfunction outside (version, range, hilo, options) {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n var gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisifes the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (var i = 0; i < range.set.length; ++i) {\n var comparators = range.set[i]\n\n var high = null\n var low = null\n\n comparators.forEach(function (comparator) {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nexports.prerelease = prerelease\nfunction prerelease (version, options) {\n var parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\n\nexports.intersects = intersects\nfunction intersects (r1, r2, options) {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2)\n}\n\nexports.coerce = coerce\nfunction coerce (version) {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n var match = version.match(re[COERCE])\n\n if (match == null) {\n return null\n }\n\n return parse(match[1] +\n '.' + (match[2] || '0') +\n '.' + (match[3] || '0'))\n}\n", "\"use strict\";\n/**\n * Capture module.\n * @module aws_p\n */\nvar semver = require('semver');\nvar Aws = require('../segments/attributes/aws');\nvar contextUtils = require('../context_utils');\nvar Utils = require('../utils');\nvar logger = require('../logger');\nvar minVersion = '2.7.15';\nvar throttledErrorDefault = function throttledErrorDefault() {\n return false; // If the customer doesn't provide an aws-sdk with a throttled error function, we can't make assumptions.\n};\n/**\n * Configures the AWS SDK to automatically capture information for the segment.\n * All created clients will automatically be captured. See 'captureAWSClient'\n * for additional details.\n * @param {AWS} awssdk - The Javascript AWS SDK.\n * @alias module:aws_p.captureAWS\n * @returns {AWS}\n * @see https://github.com/aws/aws-sdk-js\n */\nvar captureAWS = function captureAWS(awssdk) {\n if (!semver.gte(awssdk.VERSION, minVersion))\n throw new Error('AWS SDK version ' + minVersion + ' or greater required.');\n for (var prop in awssdk) {\n if (awssdk[prop].serviceIdentifier) {\n var Service = awssdk[prop];\n Service.prototype.customizeRequests(captureAWSRequest);\n }\n }\n return awssdk;\n};\n/**\n * Configures any AWS Client instance to automatically capture information for the segment.\n * For manual mode, a param with key called 'Segment' is required as a part of the AWS\n * call paramaters, and must reference a Segment or Subsegment object.\n * @param {AWS.Service} service - An instance of a AWS service to wrap.\n * @alias module:aws_p.captureAWSClient\n * @returns {AWS.Service}\n * @see https://github.com/aws/aws-sdk-js\n */\nvar captureAWSClient = function captureAWSClient(service) {\n service.customizeRequests(captureAWSRequest);\n return service;\n};\nfunction captureAWSRequest(req) {\n var parent = contextUtils.resolveSegment(contextUtils.resolveManualSegmentParams(req.params));\n if (!parent) {\n var output = this.serviceIdentifier + '.' + req.operation;\n if (!contextUtils.isAutomaticMode()) {\n logger.getLogger().info('Call ' + output + ' requires a segment object' +\n ' on the request params as \"XRaySegment\" for tracing in manual mode. Ignoring.');\n }\n else {\n logger.getLogger().info('Call ' + output +\n ' is missing the sub/segment context for automatic mode. Ignoring.');\n }\n return req;\n }\n var throttledError = this.throttledError || throttledErrorDefault;\n var stack = (new Error()).stack;\n var subsegment = parent.addNewSubsegment(this.serviceIdentifier);\n var traceId = parent.segment ? parent.segment.trace_id : parent.trace_id;\n var buildListener = function (req) {\n req.httpRequest.headers['X-Amzn-Trace-Id'] = 'Root=' + traceId + ';Parent=' + subsegment.id +\n ';Sampled=' + (subsegment.segment.notTraced ? '0' : '1');\n };\n var completeListener = function (res) {\n subsegment.addAttribute('namespace', 'aws');\n subsegment.addAttribute('aws', new Aws(res, subsegment.name));\n var httpRes = res.httpResponse;\n if (httpRes) {\n subsegment.addAttribute('http', new HttpResponse(httpRes));\n if (httpRes.statusCode === 429 || (res.error && throttledError(res.error)))\n subsegment.addThrottleFlag();\n }\n if (res.error) {\n var err = { message: res.error.message, name: res.error.code, stack: stack };\n if (httpRes && httpRes.statusCode) {\n if (Utils.getCauseTypeFromHttpStatus(httpRes.statusCode) == 'error') {\n subsegment.addErrorFlag();\n }\n subsegment.close(err, true);\n }\n else\n subsegment.close(err);\n }\n else {\n if (httpRes && httpRes.statusCode) {\n var cause = Utils.getCauseTypeFromHttpStatus(httpRes.statusCode);\n if (cause)\n subsegment[cause] = true;\n }\n subsegment.close();\n }\n };\n req.on('beforePresign', function (req) {\n // Only the AWS Presigner triggers this event,\n // so we can rely on this event to notify us when\n // a request is for a presigned url\n parent.removeSubsegment(subsegment);\n parent.decrementCounter();\n req.removeListener('build', buildListener);\n req.removeListener('complete', completeListener);\n });\n req.on('build', buildListener).on('complete', completeListener);\n if (!req.__send) {\n req.__send = req.send;\n req.send = function (callback) {\n if (contextUtils.isAutomaticMode()) {\n var session = contextUtils.getNamespace();\n session.run(function () {\n contextUtils.setSegment(subsegment);\n req.__send(callback);\n });\n }\n else {\n req.__send(callback);\n }\n };\n }\n}\nfunction HttpResponse(res) {\n this.init(res);\n}\nHttpResponse.prototype.init = function init(res) {\n this.response = {\n status: res.statusCode || '',\n };\n if (res.headers && res.headers['content-length'])\n this.response.content_length = res.headers['content-length'];\n};\nmodule.exports.captureAWSClient = captureAWSClient;\nmodule.exports.captureAWS = captureAWS;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TRANSIENT_ERROR_STATUS_CODES = exports.TRANSIENT_ERROR_CODES = exports.THROTTLING_ERROR_CODES = exports.CLOCK_SKEW_ERROR_CODES = void 0;\nexports.CLOCK_SKEW_ERROR_CODES = [\n \"AuthFailure\",\n \"InvalidSignatureException\",\n \"RequestExpired\",\n \"RequestInTheFuture\",\n \"RequestTimeTooSkewed\",\n \"SignatureDoesNotMatch\",\n];\nexports.THROTTLING_ERROR_CODES = [\n \"BandwidthLimitExceeded\",\n \"EC2ThrottledException\",\n \"LimitExceededException\",\n \"PriorRequestNotComplete\",\n \"ProvisionedThroughputExceededException\",\n \"RequestLimitExceeded\",\n \"RequestThrottled\",\n \"RequestThrottledException\",\n \"SlowDown\",\n \"ThrottledException\",\n \"Throttling\",\n \"ThrottlingException\",\n \"TooManyRequestsException\",\n \"TransactionInProgressException\",\n];\nexports.TRANSIENT_ERROR_CODES = [\"AbortError\", \"TimeoutError\", \"RequestTimeout\", \"RequestTimeoutException\"];\nexports.TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504];\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTransientError = exports.isThrottlingError = exports.isClockSkewError = exports.isRetryableByTrait = void 0;\nconst constants_1 = require(\"./constants\");\nconst isRetryableByTrait = (error) => error.$retryable !== undefined;\nexports.isRetryableByTrait = isRetryableByTrait;\nconst isClockSkewError = (error) => constants_1.CLOCK_SKEW_ERROR_CODES.includes(error.name);\nexports.isClockSkewError = isClockSkewError;\nconst isThrottlingError = (error) => {\n var _a, _b;\n return ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 429 ||\n constants_1.THROTTLING_ERROR_CODES.includes(error.name) ||\n ((_b = error.$retryable) === null || _b === void 0 ? void 0 : _b.throttling) == true;\n};\nexports.isThrottlingError = isThrottlingError;\nconst isTransientError = (error) => {\n var _a;\n return constants_1.TRANSIENT_ERROR_CODES.includes(error.name) ||\n constants_1.TRANSIENT_ERROR_STATUS_CODES.includes(((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) || 0);\n};\nexports.isTransientError = isTransientError;\n", "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.captureAWSClient = void 0;\nconst service_error_classification_1 = require(\"@aws-sdk/service-error-classification\");\nconst aws_1 = __importDefault(require(\"../segments/attributes/aws\"));\nconst querystring_1 = require(\"querystring\");\nconst subsegment_1 = __importDefault(require(\"../segments/attributes/subsegment\"));\nconst contextUtils = require('../context_utils');\nconst logger = require('../logger');\nconst { safeParseInt } = require('../utils');\nconst utils_1 = require(\"../utils\");\nconst XRAY_PLUGIN_NAME = 'XRaySDKInstrumentation';\n;\nconst buildAttributesFromMetadata = async (service, operation, region, res, error) => {\n var _a, _b, _c;\n const { extendedRequestId, requestId, httpStatusCode: statusCode, attempts } = ((_a = res === null || res === void 0 ? void 0 : res.output) === null || _a === void 0 ? void 0 : _a.$metadata) || (error === null || error === void 0 ? void 0 : error.$metadata);\n const aws = new aws_1.default({\n extendedRequestId,\n requestId,\n retryCount: attempts,\n request: {\n operation,\n httpRequest: {\n region,\n statusCode,\n },\n },\n }, service);\n const http = {};\n if (statusCode) {\n http.response = {};\n http.response.status = statusCode;\n }\n if (((_b = res === null || res === void 0 ? void 0 : res.response) === null || _b === void 0 ? void 0 : _b.headers) && ((_c = res === null || res === void 0 ? void 0 : res.response) === null || _c === void 0 ? void 0 : _c.headers['content-length']) !== undefined) {\n if (!http.response) {\n http.response = {};\n }\n http.response.content_length = safeParseInt(res.response.headers['content-length']);\n }\n return [aws, http];\n};\nfunction addFlags(http, subsegment, err) {\n var _a, _b, _c;\n if (err && service_error_classification_1.isThrottlingError(err)) {\n subsegment.addThrottleFlag();\n }\n else if (safeParseInt((_a = http.response) === null || _a === void 0 ? void 0 : _a.status) === 429 || safeParseInt((_b = err === null || err === void 0 ? void 0 : err.$metadata) === null || _b === void 0 ? void 0 : _b.httpStatusCode) === 429) {\n subsegment.addThrottleFlag();\n }\n const cause = utils_1.getCauseTypeFromHttpStatus(safeParseInt((_c = http.response) === null || _c === void 0 ? void 0 : _c.status));\n if (cause === 'fault') {\n subsegment.addFaultFlag();\n }\n else if (cause === 'error') {\n subsegment.addErrorFlag();\n }\n}\n;\nconst getXRayMiddleware = (config, manualSegment) => (next, context) => async (args) => {\n const segment = contextUtils.isAutomaticMode() ? contextUtils.resolveSegment() : manualSegment;\n const { clientName, commandName } = context;\n const operation = commandName.slice(0, -7); // Strip trailing \"Command\" string\n const service = clientName.slice(0, -6); // Strip trailing \"Client\" string\n if (!segment) {\n const output = service + '.' + operation.charAt(0).toLowerCase() + operation.slice(1);\n if (!contextUtils.isAutomaticMode()) {\n logger.getLogger().info('Call ' + output + ' requires a segment object' +\n ' passed to captureAWSv3Client for tracing in manual mode. Ignoring.');\n }\n else {\n logger.getLogger().info('Call ' + output +\n ' is missing the sub/segment context for automatic mode. Ignoring.');\n }\n return next(args);\n }\n const subsegment = segment.addNewSubsegment(service);\n subsegment.addAttribute('namespace', 'aws');\n const parent = (segment instanceof subsegment_1.default ? segment.segment : segment);\n args.request.headers['X-Amzn-Trace-Id'] = querystring_1.stringify({\n Root: parent.trace_id,\n Parent: subsegment.id,\n Sampled: parent.notTraced ? '0' : '1',\n }, ';');\n let res;\n try {\n res = await next(args);\n if (!res)\n throw new Error('Failed to get response from instrumented AWS Client.');\n const [aws, http] = await buildAttributesFromMetadata(service, operation, await config.region(), res, null);\n subsegment.addAttribute('aws', aws);\n subsegment.addAttribute('http', http);\n addFlags(http, subsegment);\n subsegment.close();\n return res;\n }\n catch (err) {\n if (err.$metadata) {\n const [aws, http] = await buildAttributesFromMetadata(service, operation, await config.region(), null, err);\n subsegment.addAttribute('aws', aws);\n subsegment.addAttribute('http', http);\n addFlags(http, subsegment, err);\n }\n const errObj = { message: err.message, name: err.name, stack: err.stack || new Error().stack };\n subsegment.close(errObj, true);\n throw err;\n }\n};\nconst xRayMiddlewareOptions = {\n name: XRAY_PLUGIN_NAME,\n step: 'build',\n};\nconst getXRayPlugin = (config, manualSegment) => ({\n applyToStack: (stack) => {\n stack.add(getXRayMiddleware(config, manualSegment), xRayMiddlewareOptions);\n },\n});\n/**\n * Instruments AWS SDK V3 clients with X-Ray via middleware.\n *\n * @param client - AWS SDK V3 client to instrument\n * @param manualSegment - Parent segment or subsegment that is passed in for manual mode users\n * @returns - the client with the X-Ray instrumentation middleware added to its middleware stack\n */\nfunction captureAWSClient(client, manualSegment) {\n // Remove existing middleware to ensure operation is idempotent\n client.middlewareStack.remove(XRAY_PLUGIN_NAME);\n client.middlewareStack.use(getXRayPlugin(client.config, manualSegment));\n return client;\n}\nexports.captureAWSClient = captureAWSClient;\n", "\"use strict\";\n/**\n * @module http_p\n */\n/**\n * This module patches the HTTP and HTTPS node built-in libraries and returns a copy of the module with tracing enabled.\n */\nvar url = require('url');\nvar contextUtils = require('../context_utils');\nvar Utils = require('../utils');\nvar logger = require('../logger');\nvar events = require('events');\n/**\n * Wraps the http/https.request() and .get() calls to automatically capture information for the segment.\n * This patches the built-in HTTP and HTTPS modules globally. If using a 3rd party HTTP library,\n * it should still use HTTP under the hood. Be sure to patch globally before requiring the 3rd party library.\n * 3rd party library compatibility is best effort. Some incompatibility issues may arise.\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced:true\" property to the subsegment\n * so the AWS X-Ray service expects a corresponding segment from the downstream service.\n * @param {function} subsegmentCallback - a callback that is called with the subsegment, the Node.js\n * http.ClientRequest, the Node.js http.IncomingMessage (if a response was received) and any error issued,\n * allowing custom annotations and metadata to be added.\n * to be added to the subsegment.\n * @alias module:http_p.captureHTTPsGlobal\n */\nvar captureHTTPsGlobal = function captureHTTPsGlobal(module, downstreamXRayEnabled, subsegmentCallback) {\n if (!module.__request)\n enableCapture(module, downstreamXRayEnabled, subsegmentCallback);\n};\n/**\n * Wraps the http/https.request() and .get() calls to automatically capture information for the segment.\n * Returns an instance of the HTTP or HTTPS module that is patched.\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @param {boolean} downstreamXRayEnabled - when true, adds a \"traced:true\" property to the subsegment\n * so the AWS X-Ray service expects a corresponding segment from the downstream service.\n * @param {function} subsegmentCallback - a callback that is called with the subsegment, the Node.js\n * http.ClientRequest, and the Node.js http.IncomingMessage to allow custom annotations and metadata\n * to be added to the subsegment.\n * @alias module:http_p.captureHTTPs\n * @returns {http|https}\n */\nvar captureHTTPs = function captureHTTPs(module, downstreamXRayEnabled, subsegmentCallback) {\n if (module.__request)\n return module;\n var tracedModule = {};\n Object.keys(module).forEach(function (val) {\n tracedModule[val] = module[val];\n });\n enableCapture(tracedModule, downstreamXRayEnabled, subsegmentCallback);\n return tracedModule;\n};\nfunction enableCapture(module, downstreamXRayEnabled, subsegmentCallback) {\n function captureOutgoingHTTPs(baseFunc, ...args) {\n let options;\n let callback;\n let hasUrl;\n let urlObj;\n let arg0 = args[0];\n if (typeof args[1] === 'object') {\n hasUrl = true;\n urlObj = typeof arg0 === 'string' ? new url.URL(arg0) : arg0;\n options = args[1],\n callback = args[2];\n }\n else {\n hasUrl = false;\n options = arg0;\n callback = args[1];\n }\n // Short circuit if the HTTP request has no options or is already being captured\n if (!options || (options.headers && (options.headers['X-Amzn-Trace-Id']))) {\n return baseFunc(...args);\n }\n // Case of calling a string URL without options, e.g.: http.request('http://amazon.com', callback)\n if (typeof options === 'string') {\n options = new url.URL(options);\n }\n if (!hasUrl) {\n urlObj = options;\n }\n const parent = contextUtils.resolveSegment(contextUtils.resolveManualSegmentParams(options));\n const hostname = options.hostname || options.host || urlObj.hostname || urlObj.host || 'Unknown host';\n if (!parent) {\n let output = '[ host: ' + hostname;\n output = options.method ? (output + ', method: ' + options.method) : output;\n output += ', path: ' + (urlObj.pathname || Utils.stripQueryStringFromPath(options.path)) + ' ]';\n if (!contextUtils.isAutomaticMode()) {\n logger.getLogger().info('Options for request ' + output +\n ' requires a segment object on the options params as \"XRaySegment\" for tracing in manual mode. Ignoring.');\n }\n else {\n logger.getLogger().info('Options for request ' + output +\n ' is missing the sub/segment context for automatic mode. Ignoring.');\n }\n // Options are not modified, only parsed for logging. We can pass in the original arguments.\n return baseFunc(...args);\n }\n const subsegment = parent.addNewSubsegment(hostname);\n const root = parent.segment ? parent.segment : parent;\n subsegment.namespace = 'remote';\n if (!options.headers)\n options.headers = {};\n options.headers['X-Amzn-Trace-Id'] = 'Root=' + root.trace_id + ';Parent=' + subsegment.id +\n ';Sampled=' + (!root.notTraced ? '1' : '0');\n const errorCapturer = function errorCapturer(e) {\n if (subsegmentCallback)\n subsegmentCallback(subsegment, this, null, e);\n if (subsegment.http && subsegment.http.response) {\n if (Utils.getCauseTypeFromHttpStatus(subsegment.http.response.status) === 'error') {\n subsegment.addErrorFlag();\n }\n subsegment.close(e, true);\n }\n else {\n const madeItToDownstream = (e.code !== 'ECONNREFUSED');\n subsegment.addRemoteRequestData(this, null, madeItToDownstream && downstreamXRayEnabled);\n subsegment.close(e);\n }\n // Only need to remove our listener & re-emit if we're not listening using the errorMonitor,\n // e.g. the app is running on Node 10. Otherwise the errorMonitor will re-emit automatically.\n // See: https://github.com/aws/aws-xray-sdk-node/issues/318\n // TODO: Remove this logic once node 12 support is deprecated\n if (!events.errorMonitor && this.listenerCount('error') <= 1) {\n this.removeListener('error', errorCapturer);\n this.emit('error', e);\n }\n };\n const optionsCopy = Utils.objectWithoutProperties(options, ['Segment'], true);\n let req = baseFunc(...(hasUrl ? [arg0, optionsCopy] : [options]), function (res) {\n res.on('end', function () {\n if (subsegmentCallback)\n subsegmentCallback(subsegment, this.req, res);\n if (res.statusCode === 429)\n subsegment.addThrottleFlag();\n const cause = Utils.getCauseTypeFromHttpStatus(res.statusCode);\n if (cause)\n subsegment[cause] = true;\n subsegment.addRemoteRequestData(res.req, res, !!downstreamXRayEnabled);\n subsegment.close();\n });\n if (typeof callback === 'function') {\n if (contextUtils.isAutomaticMode()) {\n const session = contextUtils.getNamespace();\n session.run(function () {\n contextUtils.setSegment(subsegment);\n callback(res);\n });\n }\n else {\n callback(res);\n }\n // if no callback provided by user application, AND no explicit response listener\n // added by user application, then we consume the response so the 'end' event fires\n // See: https://nodejs.org/api/http.html#http_class_http_clientrequest\n }\n else if (res.req && res.req.listenerCount('response') === 0) {\n res.resume();\n }\n });\n // Use errorMonitor if available (in Node 12.17+), otherwise fall back to standard error listener\n // See: https://nodejs.org/dist/latest-v12.x/docs/api/events.html#events_eventemitter_errormonitor\n req.on(events.errorMonitor || 'error', errorCapturer);\n return req;\n }\n module.__request = module.request;\n module.request = function captureHTTPsRequest(...args) {\n return captureOutgoingHTTPs(module.__request, ...args);\n };\n module.__get = module.get;\n module.get = function captureHTTPsGet(...args) {\n return captureOutgoingHTTPs(module.__get, ...args);\n };\n}\nmodule.exports.captureHTTPsGlobal = captureHTTPsGlobal;\nmodule.exports.captureHTTPs = captureHTTPs;\n", "\"use strict\";\n/**\n * @module promise_p\n */\n/**\n * This module patches native Promise libraries provided by V8 engine\n * so all subsegments generated within Promise are attached to the correct parent.\n */\nconst contextUtils = require('../context_utils');\nconst originalThen = Symbol('original then');\nconst originalCatch = Symbol('original catch');\nfunction patchPromise(Promise) {\n const then = Promise.prototype.then;\n if (!then[originalThen]) {\n Promise.prototype.then = function (onFulfilled, onRejected) {\n if (contextUtils.isAutomaticMode()\n && tryGetCurrentSegment()) {\n const ns = contextUtils.getNamespace();\n onFulfilled = onFulfilled && ns.bind(onFulfilled);\n onRejected = onRejected && ns.bind(onRejected);\n }\n return then.call(this, onFulfilled, onRejected);\n };\n Promise.prototype.then[originalThen] = then;\n }\n const origCatch = Promise.prototype.catch;\n if (origCatch && !origCatch[originalCatch]) {\n Promise.prototype.catch = function (onRejected) {\n if (contextUtils.isAutomaticMode()\n && tryGetCurrentSegment()) {\n const ns = contextUtils.getNamespace();\n onRejected = onRejected && ns.bind(onRejected);\n }\n return origCatch.call(this, onRejected);\n };\n Promise.prototype.catch[originalCatch] = origCatch;\n }\n}\nfunction unpatchPromise(Promise) {\n const then = Promise.prototype.then;\n if (then[originalThen]) {\n Promise.prototype.then = then[originalThen];\n }\n const origCatch = Promise.prototype.catch;\n if (origCatch && origCatch[originalCatch]) {\n Promise.prototype.catch = origCatch[originalCatch];\n }\n}\nfunction tryGetCurrentSegment() {\n try {\n return contextUtils.getSegment();\n }\n catch (e) {\n return undefined;\n }\n}\nfunction capturePromise() {\n patchPromise(Promise);\n}\nfunction uncapturePromise() {\n unpatchPromise(Promise);\n}\ncapturePromise.patchThirdPartyPromise = patchPromise;\nmodule.exports.capturePromise = capturePromise;\nmodule.exports.uncapturePromise = uncapturePromise;\n", "\"use strict\";\n/**\n * Represents a SQL database call.\n * @constructor\n * @param {string} databaseVer - The version on the database (user supplied).\n * @param {string} driverVer - The version on the database driver (user supplied).\n * @param {string} user - The user associated to the database call.\n * @param {string} queryType - The SQL query type.\n */\nfunction SqlData(databaseVer, driverVer, user, url, queryType) {\n this.init(databaseVer, driverVer, user, url, queryType);\n}\nSqlData.prototype.init = function init(databaseVer, driverVer, user, url, queryType) {\n if (databaseVer)\n this.database_version = databaseVer;\n if (driverVer)\n this.driver_version = driverVer;\n if (queryType)\n this.preparation = queryType;\n this.url = url;\n this.user = user;\n};\nmodule.exports = SqlData;\n", "\"use strict\";\nvar contextUtils = require('./context_utils');\nvar logging = require('./logger');\nvar segmentUtils = require('./segments/segment_utils');\nvar utils = require('./utils');\nvar LambdaEnv = require('./env/aws_lambda');\n// Import Data from package.json,\n// If the importing of package.json fails leave\n// pkginfo as an empty object\nvar pkginfo = {};\ntry {\n pkginfo = require('../../package.json');\n}\ncatch (err) {\n logging.getLogger().debug('Failed to load SDK data:', err);\n}\nvar UNKNOWN = 'unknown';\n/**\n * A module representing the AWSXRay SDK.\n * @namespace AWSXRay\n */\nvar AWSXRay = {\n /**\n * @memberof AWSXRay\n * @type {object}\n * @namespace AWSXRay.plugins\n */\n plugins: {\n /**\n * Exposes the AWS EC2 plugin.\n * @memberof AWSXRay.plugins\n */\n EC2Plugin: require('./segments/plugins/ec2_plugin'),\n /**\n * Exposes the AWS ECS plugin.\n * @memberof AWSXRay.plugins\n */\n ECSPlugin: require('./segments/plugins/ecs_plugin'),\n /**\n * Exposes the AWS Elastic Beanstalk plugin.\n * @memberof AWSXRay.plugins\n */\n ElasticBeanstalkPlugin: require('./segments/plugins/elastic_beanstalk_plugin'),\n },\n /**\n * Enables use of plugins to capture additional data for segments.\n * @param {Array} plugins - A configurable subset of AWSXRay.plugins.\n * @memberof AWSXRay\n * @see AWSXRay.plugins\n */\n config: function (plugins) {\n var pluginData = {};\n plugins.forEach(function (plugin) {\n plugin.getData(function (data) {\n if (data) {\n for (var attribute in data) {\n pluginData[attribute] = data[attribute];\n }\n }\n });\n segmentUtils.setOrigin(plugin.originName);\n segmentUtils.setPluginData(pluginData);\n });\n },\n /**\n * Overrides the default whitelisting file to specify what params to capture on each AWS Service call.\n * If a service or API is not listed, no additional data is captured.\n * The base whitelisting file can be found at /lib/resources/aws_whitelist.json\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @memberof AWSXRay\n */\n setAWSWhitelist: require('./segments/attributes/aws').setAWSWhitelist,\n /**\n * Appends to the current whitelisting file.\n * In the case of a duplicate service API listed, the new source will override the previous values.\n * @param {string|Object} source - The path to the custom whitelist file, or a whitelist source JSON object.\n * @memberof AWSXRay\n */\n appendAWSWhitelist: require('./segments/attributes/aws').appendAWSWhitelist,\n /**\n * Overrides the default streaming threshold (100).\n * The threshold represents the maximum number of subsegments on a single segment before\n * the SDK begins to send the completed subsegments out of band of the main segment.\n * Reduce this threshold if you see the 'Segment too large to send' error.\n * @param {number} threshold - The new threshold to use.\n * @memberof AWSXRay\n */\n setStreamingThreshold: segmentUtils.setStreamingThreshold,\n /**\n * Set your own logger for the SDK.\n * @param {Object} logger - A logger which responds to debug/info/warn/error calls.\n * @memberof AWSXRay\n */\n setLogger: logging.setLogger,\n /**\n * Gets the set logger for the SDK.\n * @memberof AWSXRay\n */\n getLogger: logging.getLogger,\n /**\n * Configures the address and port the daemon is expected to be on.\n * @param {string} address - Address of the daemon the segments should be sent to. Expects 'x.x.x.x', ':yyyy' or 'x.x.x.x:yyyy' IPv4 formats.\n * @module DaemonConfig\n * @memberof AWSXRay\n * @function\n * @see module:DaemonConfig.setDaemonAddress\n */\n setDaemonAddress: require('./daemon_config').setDaemonAddress,\n /**\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function conext to wrap.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:capture.captureFunc\n */\n captureFunc: require('./capture').captureFunc,\n /**\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function conext to wrap.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:capture.captureAsyncFunc\n */\n captureAsyncFunc: require('./capture').captureAsyncFunc,\n /**\n * @param {string} name - The name of the new subsegment.\n * @param {function} fcn - The function conext to wrap.\n * @param {Segment|Subsegment} [parent] - The parent for the new subsegment, for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:capture.captureCallbackFunc\n */\n captureCallbackFunc: require('./capture').captureCallbackFunc,\n /**\n * @param {AWS} awssdk - The Javascript AWS SDK.\n * @memberof AWSXRay\n * @function\n * @see module:aws_p.captureAWS\n */\n captureAWS: require('./patchers/aws_p').captureAWS,\n /**\n * @param {AWS.Service} service - An instance of a AWS service to wrap.\n * @memberof AWSXRay\n * @function\n * @see module:aws_p.captureAWSClient\n */\n captureAWSClient: require('./patchers/aws_p').captureAWSClient,\n /**\n * @param {AWSv3.Service} service - An instance of a AWS SDK v3 service to wrap.\n * @param {Segment|Subsegment} segment - Optional segment for manual mode.\n * @memberof AWSXRay\n * @function\n * @see module:aws3_p.captureAWSClient\n */\n captureAWSv3Client: require('./patchers/aws3_p').captureAWSClient,\n /**\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @memberof AWSXRay\n * @function\n * @returns {http|https}\n * @see module:http_p.captureHTTPs\n */\n captureHTTPs: require('./patchers/http_p').captureHTTPs,\n /**\n * @param {http|https} module - The built in Node.js HTTP or HTTPS module.\n * @memberof AWSXRay\n * @function\n * @see module:http_p.captureHTTPsGlobal\n */\n captureHTTPsGlobal: require('./patchers/http_p').captureHTTPsGlobal,\n /**\n * @memberof AWSXRay\n * @function\n * @see module:promise_p.capturePromise\n */\n capturePromise: require('./patchers/promise_p').capturePromise,\n /**\n * Exposes various helper methods.\n * @memberof AWSXRay\n * @function\n * @see module:utils\n */\n utils: utils,\n /**\n * @memberof AWSXRay\n * @type {object}\n * @namespace AWSXRay.database\n */\n database: {\n /**\n * Exposes the SqlData class.\n * @memberof AWSXRay.database\n * @see SqlData\n */\n SqlData: require('./database/sql_data'),\n },\n /**\n * Exposes the Middleware Utils class.\n * @memberof AWSXRay\n * @function\n * @see module:mw_utils\n */\n middleware: require('./middleware/mw_utils'),\n /**\n * Gets the current namespace of the context.\n * Used for supporting functions that can be used in automatic mode.\n * @memberof AWSXRay\n * @function\n * @returns {Segment|Subsegment}\n * @see module:context_utils.getNamespace\n */\n getNamespace: contextUtils.getNamespace,\n /**\n * Resolves the current segment or subsegment, checks manual and automatic modes.\n * Used for supporting functions that can be used in both manual and automatic modes.\n * @memberof AWSXRay\n * @function\n * @returns {Segment|Subsegment}\n * @see module:context_utils.resolveSegment\n */\n resolveSegment: contextUtils.resolveSegment,\n /**\n * Returns the current segment or subsegment. For use with automatic mode only.\n * @memberof AWSXRay\n * @function\n * @returns {Segment|Subsegment}\n * @see module:context_utils.getSegment\n */\n getSegment: contextUtils.getSegment,\n /**\n * Sets the current segment or subsegment. For use with automatic mode only.\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.setSegment\n */\n setSegment: contextUtils.setSegment,\n /**\n * Returns true if automatic mode is enabled, otherwise false.\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.isAutomaticMode\n */\n isAutomaticMode: contextUtils.isAutomaticMode,\n /**\n * Enables automatic mode. Automatic mode uses 'cls-hooked'.\n * @see https://github.com/jeff-lewis/cls-hooked\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.enableAutomaticMode\n */\n enableAutomaticMode: contextUtils.enableAutomaticMode,\n /**\n * Disables automatic mode. Current segment or subsegment must be passed manually\n * via the parent optional on captureFunc, captureAsyncFunc etc.\n * @memberof AWSXRay\n * @function\n * @see module:context_utils.enableManualMode\n */\n enableManualMode: contextUtils.enableManualMode,\n /**\n * Sets the context missing strategy.\n * @param {Object} strategy - The strategy to set. This object's contextMissing function will be called whenever trace context is not found.\n */\n setContextMissingStrategy: contextUtils.setContextMissingStrategy,\n /**\n * Exposes the segment class.\n * @memberof AWSXRay\n * @function\n */\n Segment: require('./segments/segment'),\n /**\n * Exposes the subsegment class.\n * @memberof AWSXRay\n * @see Subsegment\n */\n Subsegment: require('./segments/attributes/subsegment'),\n SegmentUtils: segmentUtils\n};\n/**\n * Exposes the IncomingRequestData, to capture incoming request data.\n * For use with middleware.\n * @memberof AWSXRay.middleware\n * @see IncomingRequestData\n */\nAWSXRay.middleware.IncomingRequestData = require('./middleware/incoming_request_data'),\n (function () {\n var data = {\n runtime: (process.release && process.release.name) ? process.release.name : UNKNOWN,\n runtime_version: process.version,\n version: process.env.npm_package_version || UNKNOWN,\n name: process.env.npm_package_name || UNKNOWN\n };\n var sdkData = {\n sdk: 'X-Ray for Node.js',\n sdk_version: pkginfo.version ? pkginfo.version : UNKNOWN,\n package: pkginfo.name ? pkginfo.name : UNKNOWN,\n };\n segmentUtils.setSDKData(sdkData);\n segmentUtils.setServiceData(data);\n if (process.env.LAMBDA_TASK_ROOT)\n LambdaEnv.init();\n })();\nmodule.exports = AWSXRay;\n", "\"use strict\";\n// Convenience file to require the SDK from the root of the repository\nmodule.exports = require('./aws-xray');\n", "import { metricScope, Unit } from 'aws-embedded-metrics';\nimport type { Context } from 'aws-lambda';\nimport got from 'got';\nimport { CatalogClient } from '../catalog-builder/client.lambda-shared';\nimport * as aws from '../shared/aws.lambda-shared';\nimport { requireEnv } from '../shared/env.lambda-shared';\nimport { MetricName, METRICS_NAMESPACE } from './constants';\nimport { NpmDownloadsClient, NpmDownloadsEntry, NpmDownloadsPeriod } from './npm-downloads.lambda-shared';\n\n/**\n * Rebuilds the `stats.json` object in the configured S3 bucket.\n * Validates that the number of packages on a full rebuild should not decrease\n * significantly (due to network errors from e.g. NPM) - can be ignored\n * by passing { ignoreValidation: true }.\n *\n * @param event configuration for the rebuild job.\n * @param context the lambda context in which this execution runs.\n *\n * @returns the information about the updated S3 object.\n */\nexport async function handler(event: any, context: Context) {\n console.log(JSON.stringify(event, null, 2));\n\n const STATS_BUCKET_NAME = requireEnv('STATS_BUCKET_NAME');\n const STATS_OBJECT_KEY = requireEnv('STATS_OBJECT_KEY');\n\n const catalogClient = await CatalogClient.newClient();\n const catalog = catalogClient.packages;\n if (catalog.length === 0) {\n throw new Error('No packages found.');\n }\n\n const currentDate = new Date().toISOString();\n const stats: PackageStatsOutput = { packages: {}, updated: currentDate };\n const npmClient = new NpmDownloadsClient(got);\n\n // remove duplicates from different major versions\n const packageNames = [...new Set(catalog.map(pkg => pkg.name)).values()];\n\n console.log(`Retrieving download stats for all ${packageNames.length} registered packages: [${packageNames.join(',')}].`);\n const npmDownloads = await npmClient.getDownloads(packageNames, {\n period: NpmDownloadsPeriod.LAST_WEEK,\n throwErrors: false,\n });\n\n for (const [pkgName, entry] of npmDownloads.entries()) {\n updateStats(stats, pkgName, entry);\n }\n\n // Update metrics\n const statsCount = Object.keys(stats.packages).length;\n console.log(`There are now ${statsCount} packages with NPM stats stored.`);\n await metricScope((metrics) => async () => {\n // Clear out default dimensions as we don't need those. See https://github.com/awslabs/aws-embedded-metrics-node/issues/73\n metrics.setDimensions();\n\n metrics.setNamespace(METRICS_NAMESPACE);\n metrics.putMetric(MetricName.REGISTERED_PACKAGES_WITH_STATS, statsCount, Unit.Count);\n })();\n\n // Upload the result to S3 and exit.\n return aws.s3().putObject({\n Bucket: STATS_BUCKET_NAME,\n Key: STATS_OBJECT_KEY,\n Body: JSON.stringify(stats, null, 2),\n ContentType: 'application/json',\n CacheControl: 'public, max-age=300, must-revalidate, proxy-revalidate', // Expire from cache after 5 minutes\n Metadata: {\n 'Lambda-Log-Group': context.logGroupName,\n 'Lambda-Log-Stream': context.logStreamName,\n 'Lambda-Run-Id': context.awsRequestId,\n 'Package-Stats-Count': `${statsCount}`,\n },\n }).promise();\n}\n\nfunction updateStats(stats: PackageStatsOutput, pkgName: string, entry: NpmDownloadsEntry) {\n stats.packages[pkgName] = {\n ...(stats.packages[pkgName] ?? {}),\n downloads: {\n ...(stats.packages[pkgName]?.downloads ?? {}),\n npm: entry.downloads,\n },\n };\n}\n\nexport interface PackageStatsOutput {\n readonly packages: { [key: string]: PackageStatsEntry };\n readonly updated: string;\n}\n\nexport interface PackageStatsEntry {\n readonly downloads: PackageStatsDownloads;\n}\n\nexport interface PackageStatsDownloads {\n readonly npm: number;\n}\n", "import * as _AWS from 'aws-sdk';\nimport * as AWSXRay from 'aws-xray-sdk-core';\n\n// Do nothing if there is no XRay trace context\nAWSXRay.setContextMissingStrategy(() => {});\n\nconst AWS = AWSXRay.captureAWS(_AWS);\n\nlet _s3: AWS.S3 | undefined;\nlet _sqs: AWS.SQS | undefined;\nlet _sfn: AWS.StepFunctions | undefined;\nlet _lambda: AWS.Lambda | undefined;\nlet _codeArtifact: AWS.CodeArtifact | undefined;\n\nexport function s3(): AWS.S3 {\n if (_s3 == null) {\n _s3 = new AWS.S3();\n }\n return _s3;\n}\n\n/**\n * Checks whether an object exists in S3 at the provided bucket and key.\n */\nexport function s3ObjectExists(bucket: string, key: string): Promise<boolean> {\n return s3().headObject({\n Bucket: bucket,\n Key: key,\n }).promise()\n .then(\n () => true,\n (cause) => {\n if (cause.code === 'NotFound') {\n return false;\n }\n return Promise.reject(cause);\n },\n );\n}\n\nexport function sqs(): AWS.SQS {\n if (_sqs == null) {\n _sqs = new AWS.SQS();\n }\n return _sqs;\n}\n\nexport function stepFunctions(): AWS.StepFunctions {\n if (_sfn == null) {\n _sfn = new AWS.StepFunctions();\n }\n return _sfn;\n}\n\nexport function lambda(): AWS.Lambda {\n if (_lambda == null) {\n _lambda = new AWS.Lambda();\n }\n return _lambda;\n}\n\nexport function codeArtifact(): AWS.CodeArtifact {\n if (_codeArtifact == null) {\n _codeArtifact = new AWS.CodeArtifact();\n }\n return _codeArtifact;\n}\n\n/**\n * Resets all clients vended by this module. This is useful in unit tests when\n * `aws-sdk-mocks` is used, so that new mocks are injected as intended.\n */\nexport function reset(): void {\n _s3 = _sqs = _sfn = _lambda = _codeArtifact = undefined;\n}\n", "import { env } from 'process';\n\nexport function requireEnv(name: string): string {\n const result = env[name];\n if (!result) {\n throw new Error(`No value specified for required environment variable: ${name}`);\n }\n return result;\n}\n", "import * as AWS from 'aws-sdk';\nimport { CatalogModel, PackageInfo } from '.';\nimport { s3 } from '../shared/aws.lambda-shared';\nimport { requireEnv } from '../shared/env.lambda-shared';\n\n/**\n * A client for working with the catalog.\n */\nexport class CatalogClient {\n /**\n * Creates a new client for accessing the catalog.\n */\n public static async newClient() {\n const client = new CatalogClient();\n await client.init();\n return client;\n }\n\n private readonly s3: AWS.S3;\n private readonly bucketName: string;\n private readonly objectKey: string;\n\n private _packages: PackageInfo[] | undefined;\n\n private constructor() {\n this.bucketName = requireEnv('CATALOG_BUCKET_NAME');\n this.objectKey = requireEnv('CATALOG_OBJECT_KEY');\n this.s3 = s3();\n }\n\n /**\n * Downloads the catalog object and stores it in memory.\n */\n private async init() {\n if (this._packages) {\n throw new Error('init() cannot be called twice');\n }\n\n this._packages = [];\n\n const params = {\n Bucket: this.bucketName,\n Key: this.objectKey,\n };\n\n let body: AWS.S3.Body | undefined;\n try {\n const data = await this.s3.getObject(params).promise();\n body = data.Body;\n } catch (e) {\n throw new Error(`No catalog was found at ${this.bucketName}/${this.objectKey}`);\n }\n\n if (!body) {\n throw new Error(`Catalog body is empty at ${this.bucketName}/${this.objectKey}`);\n }\n\n const contents = body.toString('utf-8');\n\n try {\n const data = JSON.parse(contents) as CatalogModel;\n if (typeof(data) != 'object') {\n throw new Error('Invalid format in catalog file. Expecting a map');\n }\n this._packages = data.packages;\n } catch (e) {\n throw new Error(`Unable to parse catalog file ${this.bucketName}/${this.objectKey}: ${e}`);\n }\n }\n\n /**\n * Returns a copy of the catalog list.\n */\n public get packages() {\n if (!this._packages) {\n throw new Error('CatalogClient must be initialized');\n }\n\n return [...this._packages];\n }\n}\n", "export const METRICS_NAMESPACE = 'ConstructHub/PackageStats';\n\nexport const enum MetricName {\n REGISTERED_PACKAGES_WITH_STATS = 'RegisteredPackagesWithStats',\n}\n", "import type { Got } from 'got/dist/source/types';\n\nexport enum NpmDownloadsPeriod {\n /**\n * Gets downloads for the last available day. In practice, this will usually\n * be \"yesterday\" (in GMT) but if stats for that day have not yet landed, it\n * will be the day before.\n */\n LAST_DAY = 'last-day',\n\n /**\n * Gets downloads for the last 7 available days.\n */\n LAST_WEEK = 'last-week',\n\n /**\n * Gets downloads for the last 30 available days.\n */\n LAST_MONTH = 'last-month'\n}\n\nexport interface NpmDownloadsEntry {\n readonly downloads: number;\n readonly start: string;\n readonly end: string;\n readonly package: string;\n}\n\nexport type NpmDownloadsOutput = Map<string, NpmDownloadsEntry>;\n\nexport interface NpmDownloadsOptions {\n /**\n * The period to query for package download counts.\n * @default NpmDownloadsPeriod.LAST_WEEK\n */\n readonly period?: NpmDownloadsPeriod;\n\n /**\n * Throw an error when any package's download metrics are not available.\n * @default true\n */\n readonly throwErrors?: boolean;\n}\n\nexport class NpmDownloadsClient {\n public static readonly NPM_DOWNLOADS_API_URL = 'https://api.npmjs.org/downloads/point';\n public static readonly MAX_PACKAGES_PER_QUERY = 128; // this is a limitation from npm's API! do not change\n\n private readonly got: Got;\n\n constructor(gotService: Got) {\n this.got = gotService;\n }\n\n private async getDownloadsRaw(\n packages: readonly string[],\n period: NpmDownloadsPeriod,\n throwErrors: boolean,\n ): Promise<NpmDownloadsOutput> {\n if (packages.length > NpmDownloadsClient.MAX_PACKAGES_PER_QUERY) {\n throw new Error(`Too many packages were provided (max: ${NpmDownloadsClient.MAX_PACKAGES_PER_QUERY})`);\n }\n if (packages.some((pkg) => this.isScopedPackage(pkg)) && packages.length > 1) {\n throw new Error('Scoped packages aren\\'t supported by the bulk query API.');\n }\n if (packages.length === 0) return new Map();\n\n console.log(`Querying NPM for ${packages.length} package(s): [${packages.join(', ')}]`);\n const result = await this.got(`${NpmDownloadsClient.NPM_DOWNLOADS_API_URL}/${period}/${packages.join(',')}`, {\n timeout: 5 * 1000, // 5 seconds\n }).catch((err) => {\n if (throwErrors) {\n throw err;\n } else {\n return { body: JSON.stringify({ error: JSON.stringify(err) }) };\n }\n });\n\n const data: NpmApiResult = JSON.parse(result.body);\n\n // single package query error\n // ex. { \"error\": \"package foo not found\" }\n if ('error' in data) {\n if (throwErrors) {\n throw new Error(`Could not retrieve download metrics: ${data.error}`);\n } else {\n console.error(`Could not retrieve download metrics: ${data.error}`);\n return new Map();\n }\n }\n\n // only a single package was returned\n if (isSingleDownloadsEntry(data)) {\n return new Map([[packages[0], data]]);\n }\n\n // bulk query result\n for (const key of Object.keys(data)) {\n if (data[key] === null) {\n if (throwErrors) {\n throw new Error(`Could not retrieve download metrics for package ${key}`);\n } else {\n console.error(`Could not retrieve download metrics for package ${key}`);\n delete data[key];\n }\n }\n }\n\n // typescript can't figure out that we removed all null values\n // @ts-ignore\n return new Map(Object.entries(data));\n }\n\n /**\n * Retrieves the number of downloads each package has on npm in the latest period.\n * Output is not guaranteed to be returned in a specific order.\n * If throwErrors option is specified, an error is thrown when a package's\n * download count is unavailable - otherwise, it's just omitted from\n * the output.\n */\n public async getDownloads(\n packages: string[],\n options: NpmDownloadsOptions = {},\n ): Promise<NpmDownloadsOutput> {\n const period = options.period ?? NpmDownloadsPeriod.LAST_WEEK;\n const throwErrors = options.throwErrors ?? true;\n\n // separate scoped and unscoped packages since scoped packages are not\n // supported by the bulk query API\n const scopedPackages = [];\n const unscopedPackages = [];\n for (const pkg of packages) {\n if (this.isScopedPackage(pkg)) {\n scopedPackages.push(pkg);\n } else {\n unscopedPackages.push(pkg);\n }\n }\n\n // we could parallelize this, but then it's more likely we get throttled\n const output: NpmDownloadsOutput = new Map();\n for (const pkg of scopedPackages) {\n const partialResults = await this.getDownloadsRaw([pkg], period, throwErrors);\n for (const [key, value] of partialResults) {\n output.set(key, value);\n }\n }\n for (let i = 0; i < unscopedPackages.length; i += NpmDownloadsClient.MAX_PACKAGES_PER_QUERY) {\n const batch = unscopedPackages.slice(i, i + NpmDownloadsClient.MAX_PACKAGES_PER_QUERY);\n const partialResults = await this.getDownloadsRaw(batch, period, throwErrors);\n for (const [key, value] of partialResults) {\n output.set(key, value);\n }\n }\n\n return output;\n }\n\n private isScopedPackage(packageName: string) {\n return packageName.startsWith('@');\n }\n}\n\n// Types for the output of NPM's API.\ntype NpmApiResult = NpmApiError | NpmApiSingleResult | NpmApiMultipleResult;\ntype NpmApiError = { error: string };\ntype NpmApiSingleResult = NpmDownloadsEntry;\ntype NpmApiMultipleResult = { [key: string]: NpmApiSingleResult | null };\n\nfunction isSingleDownloadsEntry(data: any): data is NpmDownloadsEntry {\n return 'downloads' in data && typeof data.downloads === 'number';\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }