From a83c9814edd348b87705178887c9e0d28ebaa1d4 Mon Sep 17 00:00:00 2001 From: Jonathan Lee <107072447+jj22ee@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:45:43 -0700 Subject: [PATCH] Add Patching Mechanism with AWS SDK telemetry improvements (#13) *Issue #, if available:* *Description of changes:* 1. `aws-attribute-keys.ts`: - Update values for keys: `AWS_BUCKET_NAME, AWS_QUEUE_URL, AWS_QUEUE_NAME, AWS_STREAM_NAME, AWS_TABLE_NAME` in order to match the actual attribute collected from AWS SDK auto-instrumentation 2. `aws-metric-attribute-generator.ts`: - [Similarly to Python](https://github.com/aws-observability/aws-otel-python-instrumentation/blob/2c00bd07eaaf703880a24a2fcfe874cdb4196678/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/_aws_metric_attribute_generator.py#L378-L380), accommodates the fact that AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAMES [has an array of table names](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/931318cac21ee3707f3735a64ac751566ee37182/plugins/node/opentelemetry-instrumentation-aws-sdk/src/services/dynamodb.ts#L99-L105) from aws-sdk dynamodb client instrumentation 3. `aws-opentelemetry-configurator.ts`: - Takes and sets instrumentations in constructor. 4. `instrumentation-patch.ts`: - Applies patches for AWS SDK Instrumentation 5. `register.ts`: - Applies patches from (4.) by default, unless `AWS_APPLY_PATCHES` env var is not `'true'` The following files are copied from upstream: ``` aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/ServiceExtension.ts ``` The following files are being contributed to upstream: See: https://github.com/open-telemetry/opentelemetry-js-contrib/pull/2361 ``` aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/kinesis.ts aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/s3.ts ``` *Testing:* - Add unit tests By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. --- .../package.json | 6 +- .../src/aws-attribute-keys.ts | 19 +- .../src/aws-metric-attribute-generator.ts | 33 +- .../src/aws-opentelemetry-configurator.ts | 20 +- .../src/patches/aws/services/kinesis.ts | 41 + .../src/patches/aws/services/s3.ts | 41 + .../src/patches/instrumentation-patch.ts | 73 + .../src/register.ts | 10 +- .../src/sqs-url-parser.ts | 6 +- .../otel/aws/services/ServiceExtension.ts | 48 + .../aws-metric-attribute-generator.test.ts | 66 +- .../aws-opentelemetry-configurator.test.ts | 5 +- .../test/patches/aws/services/kinesis.test.ts | 59 + .../test/patches/aws/services/s3.test.ts | 59 + .../patches/instrumentation-patch.test.ts | 189 ++ .../test/register.patch.test.ts | 88 + .../test/test-app/app-aws-sdk-client-calls.js | 38 + package-lock.json | 2080 +++++++++++++++-- 18 files changed, 2603 insertions(+), 278 deletions(-) create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/kinesis.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/s3.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/src/patches/instrumentation-patch.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/src/third-party/otel/aws/services/ServiceExtension.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/kinesis.test.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/s3.test.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/test/patches/instrumentation-patch.test.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/test/register.patch.test.ts create mode 100644 aws-distro-opentelemetry-node-autoinstrumentation/test/test-app/app-aws-sdk-client-calls.js diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/package.json b/aws-distro-opentelemetry-node-autoinstrumentation/package.json index 78ffaf6..21adc65 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/package.json +++ b/aws-distro-opentelemetry-node-autoinstrumentation/package.json @@ -30,13 +30,17 @@ "prewatch": "npm run precompile", "prepublishOnly": "npm run compile", "tdd": "yarn test -- --watch-extensions ts --watch", - "test": "nyc ts-mocha --timeout 10000 -p tsconfig.json 'test/**/*.ts'", + "test": "nyc ts-mocha --timeout 10000 -p tsconfig.json --require '@opentelemetry/contrib-test-utils' 'test/**/*.ts'", "watch": "tsc -w" }, "bugs": { "url": "https://github.com/aws-observability/aws-otel-js-instrumentation/issues" }, "devDependencies": { + "@aws-sdk/client-kinesis": "3.85.0", + "@aws-sdk/client-s3": "3.85.0", + "@aws-sdk/client-sqs": "3.85.0", + "@opentelemetry/contrib-test-utils": "^0.40.0", "@types/mocha": "7.0.2", "@types/node": "18.6.5", "@types/sinon": "10.0.18", diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-attribute-keys.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-attribute-keys.ts index 9b4b4b2..d6068a7 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-attribute-keys.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-attribute-keys.ts @@ -1,6 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import { SEMATTRS_AWS_DYNAMODB_TABLE_NAMES } from '@opentelemetry/semantic-conventions'; + // Utility class holding attribute keys with special meaning to AWS components export const AWS_ATTRIBUTE_KEYS: { [key: string]: string } = { AWS_SPAN_KIND: 'aws.span.kind', @@ -19,14 +21,11 @@ export const AWS_ATTRIBUTE_KEYS: { [key: string]: string } = { // Used for JavaScript workaround - attribute for pre-calculated value of isLocalRoot AWS_IS_LOCAL_ROOT: 'aws.is.local.root', - // Divergence from Java/Python - // TODO: Audit this: These will most definitely be different in JavaScript. - // For example: - // - `messaging.url` for AWS_QUEUE_URL - // - `aws.dynamodb.table_names` for AWS_TABLE_NAME - AWS_BUCKET_NAME: 'aws.bucket.name', - AWS_QUEUE_URL: 'aws.queue.url', - AWS_QUEUE_NAME: 'aws.queue.name', - AWS_STREAM_NAME: 'aws.stream.name', - AWS_TABLE_NAME: 'aws.table.name', + // AWS_#_NAME attributes are not supported in JavaScript as they are not part of the Semantic Conventions. + // TODOļ¼šMove to Semantic Conventions when these attributes are added. + AWS_S3_BUCKET: 'aws.s3.bucket', + AWS_SQS_QUEUE_URL: 'aws.sqs.queue.url', + AWS_SQS_QUEUE_NAME: 'aws.sqs.queue.name', + AWS_KINESIS_STREAM_NAME: 'aws.kinesis.stream.name', + AWS_DYNAMODB_TABLE_NAMES: SEMATTRS_AWS_DYNAMODB_TABLE_NAMES, }; diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attribute-generator.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attribute-generator.ts index 9282245..a83a746 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attribute-generator.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attribute-generator.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Attributes, AttributeValue, diag, SpanKind } from '@opentelemetry/api'; -import { Resource, defaultServiceName } from '@opentelemetry/resources'; +import { defaultServiceName, Resource } from '@opentelemetry/resources'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import { SEMATTRS_DB_CONNECTION_STRING, @@ -340,30 +340,33 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator { let remoteResourceIdentifier: AttributeValue | undefined; if (AwsSpanProcessingUtil.isAwsSDKSpan(span)) { - if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME)) { + const awsTableNames: AttributeValue | undefined = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES]; + if ( + AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES) && + Array.isArray(awsTableNames) && + awsTableNames.length === 1 + ) { remoteResourceType = NORMALIZED_DYNAMO_DB_SERVICE_NAME + '::Table'; - remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters( - span.attributes[AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME] - ); - } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_STREAM_NAME)) { + remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(awsTableNames[0]); + } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME)) { remoteResourceType = NORMALIZED_KINESIS_SERVICE_NAME + '::Stream'; remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters( - span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STREAM_NAME] + span.attributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME] ); - } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_BUCKET_NAME)) { + } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET)) { remoteResourceType = NORMALIZED_S3_SERVICE_NAME + '::Bucket'; remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters( - span.attributes[AWS_ATTRIBUTE_KEYS.AWS_BUCKET_NAME] + span.attributes[AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET] ); - } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME)) { + } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME)) { remoteResourceType = NORMALIZED_SQS_SERVICE_NAME + '::Queue'; remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters( - span.attributes[AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME] + span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME] ); - } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_QUEUE_URL)) { + } else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL)) { remoteResourceType = NORMALIZED_SQS_SERVICE_NAME + '::Queue'; remoteResourceIdentifier = SqsUrlParser.getQueueName( - AwsMetricAttributeGenerator.escapeDelimiters(span.attributes[AWS_ATTRIBUTE_KEYS.AWS_QUEUE_URL]) + AwsMetricAttributeGenerator.escapeDelimiters(span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL]) ); } } else if (AwsSpanProcessingUtil.isDBSpan(span)) { @@ -479,8 +482,8 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator { return AwsMetricAttributeGenerator.escapeDelimiters(address) + (port !== '' ? '|' + port : ''); } - private static escapeDelimiters(input: string | AttributeValue | undefined): string | undefined { - if (input === undefined) { + private static escapeDelimiters(input: string | AttributeValue | undefined | null): string | undefined { + if (typeof input !== 'string') { return undefined; } diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts index 0777969..d6a1818 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/aws-opentelemetry-configurator.ts @@ -4,10 +4,7 @@ import { TextMapPropagator, diag } from '@opentelemetry/api'; import { getPropagator } from '@opentelemetry/auto-configuration-propagators'; -import { - getNodeAutoInstrumentations, - getResourceDetectors as getResourceDetectorsFromEnv, -} from '@opentelemetry/auto-instrumentations-node'; +import { getResourceDetectors as getResourceDetectorsFromEnv } from '@opentelemetry/auto-instrumentations-node'; import { ENVIRONMENT, TracesSamplerValues, getEnv, getEnvWithoutDefaults } from '@opentelemetry/core'; import { OTLPMetricExporter as OTLPGrpcOTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; import { @@ -85,7 +82,18 @@ export class AwsOpentelemetryConfigurator { private spanProcessors: SpanProcessor[]; private propagator: TextMapPropagator; - constructor() { + /** + * The constructor will setup the AwsOpentelemetryConfigurator object to be able to provide a + * configuration for ADOT JavaScript Auto-Instrumentation. + * + * The `instrumentations` are the desired Node auto-instrumentations to be used when using ADOT JavaScript. + * The auto-Instrumentions are usually populated from OTel's `getNodeAutoInstrumentations()` method from the + * `@opentelemetry/auto-instrumentations-node` NPM package, and may have instrumentation patching applied. + * + * @constructor + * @param {Instrumentation[]} instrumentations - Auto-Instrumentations to be added to the ADOT Config + */ + public constructor(instrumentations: Instrumentation[]) { /* * Set and Detect Resources via Resource Detectors * @@ -135,7 +143,7 @@ export class AwsOpentelemetryConfigurator { autoResource = autoResource.merge(detectResourcesSync(internalConfig)); this.resource = autoResource; - this.instrumentations = getNodeAutoInstrumentations(); + this.instrumentations = instrumentations; this.propagator = getPropagator(); // TODO: Consider removing AWSXRayIdGenerator as it is not needed diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/kinesis.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/kinesis.ts new file mode 100644 index 0000000..fe57c43 --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/kinesis.ts @@ -0,0 +1,41 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { Attributes, SpanKind } from '@opentelemetry/api'; +import { AwsSdkInstrumentationConfig, NormalizedRequest } from '@opentelemetry/instrumentation-aws-sdk'; +import { AWS_ATTRIBUTE_KEYS } from '../../../aws-attribute-keys'; +import { RequestMetadata, ServiceExtension } from '../../../third-party/otel/aws/services/ServiceExtension'; + +/* +This file's contents are being contributed to upstream +- https://github.com/open-telemetry/opentelemetry-js-contrib/pull/2361 + +This class is a service extension to be used for the AWS JavaScript SDK instrumentation patch for Kinesis. +The instrumentation patch adds this extension to the upstream's Map of known extension for Kinesis. +Extensions allow for custom logic for adding service-specific information to spans, such as attributes. +Specifically, we are adding logic to add the `aws.kinesis.stream.name` attribute, to be used to generate +RemoteTarget and achieve parity with the Java/Python instrumentation. +*/ +export class KinesisServiceExtension implements ServiceExtension { + requestPreSpanHook(request: NormalizedRequest, _config: AwsSdkInstrumentationConfig): RequestMetadata { + const streamName = request.commandInput?.StreamName; + + const spanKind: SpanKind = SpanKind.CLIENT; + let spanName: string | undefined; + + const spanAttributes: Attributes = {}; + + if (streamName) { + spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME] = streamName; + } + + const isIncoming = false; + + return { + isIncoming, + spanAttributes, + spanKind, + spanName, + }; + } +} diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/s3.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/s3.ts new file mode 100644 index 0000000..3be4bc4 --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/s3.ts @@ -0,0 +1,41 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { Attributes, SpanKind } from '@opentelemetry/api'; +import { AwsSdkInstrumentationConfig, NormalizedRequest } from '@opentelemetry/instrumentation-aws-sdk'; +import { AWS_ATTRIBUTE_KEYS } from '../../../aws-attribute-keys'; +import { RequestMetadata, ServiceExtension } from '../../../third-party/otel/aws/services/ServiceExtension'; + +/* +This file's contents are being contributed to upstream +- https://github.com/open-telemetry/opentelemetry-js-contrib/pull/2361 + +This class is a service extension to be used for the AWS JavaScript SDK instrumentation patch for S3. +The instrumentation patch adds this extension to the upstream's Map of known extension for S3. +Extensions allow for custom logic for adding service-specific information to spans, such as attributes. +Specifically, we are adding logic to add the `aws.s3.bucket` attribute, to be used to generate +RemoteTarget and achieve parity with the Java/Python instrumentation. +*/ +export class S3ServiceExtension implements ServiceExtension { + requestPreSpanHook(request: NormalizedRequest, _config: AwsSdkInstrumentationConfig): RequestMetadata { + const bucketName = request.commandInput?.Bucket; + + const spanKind: SpanKind = SpanKind.CLIENT; + let spanName: string | undefined; + + const spanAttributes: Attributes = {}; + + if (bucketName) { + spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET] = bucketName; + } + + const isIncoming = false; + + return { + isIncoming, + spanAttributes, + spanKind, + spanName, + }; + } +} diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/instrumentation-patch.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/instrumentation-patch.ts new file mode 100644 index 0000000..155d7af --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/patches/instrumentation-patch.ts @@ -0,0 +1,73 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { Instrumentation } from '@opentelemetry/instrumentation'; +import { AwsSdkInstrumentationConfig, NormalizedRequest } from '@opentelemetry/instrumentation-aws-sdk'; +import { AWS_ATTRIBUTE_KEYS } from '../aws-attribute-keys'; +import { RequestMetadata } from '../third-party/otel/aws/services/ServiceExtension'; +import { KinesisServiceExtension } from './aws/services/kinesis'; +import { S3ServiceExtension } from './aws/services/s3'; + +export function applyInstrumentationPatches(instrumentations: Instrumentation[]): void { + /* + Apply patches to upstream instrumentation libraries. + + This method is invoked to apply changes to upstream instrumentation libraries, typically when changes to upstream + are required on a timeline that cannot wait for upstream release. Generally speaking, patches should be short-term + local solutions that are comparable to long-term upstream solutions. + + Where possible, automated testing should be run to catch upstream changes resulting in broken patches + */ + instrumentations.forEach(instrumentation => { + if (instrumentation.instrumentationName === '@opentelemetry/instrumentation-aws-sdk') { + // Access private property servicesExtensions of AwsInstrumentation + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const services: Map | undefined = (instrumentation as any).servicesExtensions?.services; + if (services) { + services.set('S3', new S3ServiceExtension()); + services.set('Kinesis', new KinesisServiceExtension()); + patchSqsServiceExtension(services.get('SQS')); + } + } + }); +} + +/* + * This patch extends the existing upstream extension for SQS. Extensions allow for custom logic for adding + * service-specific information to spans, such as attributes. Specifically, we are adding logic to add + * `aws.sqs.queue.url` and `aws.sqs.queue.name` attributes, to be used to generate RemoteTarget and achieve parity + * with the Java/Python instrumentation. + * + * Callout that today, the upstream logic adds `messaging.url` and `messaging.destination` but we feel that + * `aws.sqs` is more in line with existing AWS Semantic Convention attributes like `AWS_S3_BUCKET`, etc. + * + * @param sqsServiceExtension SQS Service Extension obtained the service extension list from the AWS SDK OTel Instrumentation + */ +function patchSqsServiceExtension(sqsServiceExtension: any): void { + // It is not expected that `sqsServiceExtension` is undefined + if (sqsServiceExtension) { + const requestPreSpanHook = sqsServiceExtension.requestPreSpanHook; + // Save original `requestPreSpanHook` under a similar name, to be invoked by the patched hook + sqsServiceExtension._requestPreSpanHook = requestPreSpanHook; + // The patched hook will populate the 'aws.sqs.queue.url' and 'aws.sqs.queue.name' attributes according to spec + // from the 'messaging.url' attribute + const patchedRequestPreSpanHook = ( + request: NormalizedRequest, + _config: AwsSdkInstrumentationConfig + ): RequestMetadata => { + const requestMetadata: RequestMetadata = sqsServiceExtension._requestPreSpanHook(request, _config); + // It is not expected that `requestMetadata.spanAttributes` can possibly be undefined, but still be careful anyways + if (requestMetadata.spanAttributes) { + if (request.commandInput?.QueueUrl) { + requestMetadata.spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL] = request.commandInput.QueueUrl; + } + if (request.commandInput?.QueueName) { + requestMetadata.spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME] = request.commandInput.QueueName; + } + } + return requestMetadata; + }; + sqsServiceExtension.requestPreSpanHook = patchedRequestPreSpanHook; + } +} diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/register.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/register.ts index ba1e1af..6358e37 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/register.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/register.ts @@ -3,8 +3,11 @@ // Modifications Copyright The OpenTelemetry Authors. Licensed under the Apache License 2.0 License. import { DiagConsoleLogger, diag } from '@opentelemetry/api'; +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; +import { Instrumentation } from '@opentelemetry/instrumentation'; import * as opentelemetry from '@opentelemetry/sdk-node'; import { AwsOpentelemetryConfigurator } from './aws-opentelemetry-configurator'; +import { applyInstrumentationPatches } from './patches/instrumentation-patch'; diag.setLogger(new DiagConsoleLogger(), opentelemetry.core.getEnv().OTEL_LOG_LEVEL); @@ -40,7 +43,12 @@ export function setAwsDefaultEnvironmentVariables(): void { } setAwsDefaultEnvironmentVariables(); -const configurator: AwsOpentelemetryConfigurator = new AwsOpentelemetryConfigurator(); +const instrumentations: Instrumentation[] = getNodeAutoInstrumentations(); + +// Apply instrumentation patches +applyInstrumentationPatches(instrumentations); + +const configurator: AwsOpentelemetryConfigurator = new AwsOpentelemetryConfigurator(instrumentations); const configuration: Partial = configurator.configure(); const sdk: opentelemetry.NodeSDK = new opentelemetry.NodeSDK(configuration); diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/sqs-url-parser.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/sqs-url-parser.ts index eba90c0..37d0a1b 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/src/sqs-url-parser.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/sqs-url-parser.ts @@ -1,6 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import { AttributeValue } from '@opentelemetry/api'; + const HTTP_SCHEMA: string = 'http://'; const HTTPS_SCHEMA: string = 'https://'; @@ -16,8 +18,8 @@ export class SqsUrlParser { * /'s (excluding schema), the second part should be a 12-digit account id, and the third part * should be a valid queue name, per SQS naming conventions. */ - public static getQueueName(url: string | undefined): string | undefined { - if (url === undefined) { + public static getQueueName(url: AttributeValue | undefined): string | undefined { + if (typeof url !== 'string') { return undefined; } url = url.replace(HTTP_SCHEMA, '').replace(HTTPS_SCHEMA, ''); diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/src/third-party/otel/aws/services/ServiceExtension.ts b/aws-distro-opentelemetry-node-autoinstrumentation/src/third-party/otel/aws/services/ServiceExtension.ts new file mode 100644 index 0000000..aca16bd --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/src/third-party/otel/aws/services/ServiceExtension.ts @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { DiagLogger, Span, SpanAttributes, SpanKind, Tracer } from '@opentelemetry/api'; +import { + AwsSdkInstrumentationConfig, + NormalizedRequest, + NormalizedResponse, +} from '@opentelemetry/instrumentation-aws-sdk'; + +export interface RequestMetadata { + // isIncoming - if true, then the operation callback / promise should be bind with the operation's span + isIncoming: boolean; + spanAttributes?: SpanAttributes; + spanKind?: SpanKind; + spanName?: string; +} + +export interface ServiceExtension { + // called before request is sent, and before span is started + requestPreSpanHook: ( + request: NormalizedRequest, + config: AwsSdkInstrumentationConfig, + diag: DiagLogger + ) => RequestMetadata; + + // called before request is sent, and after span is started + requestPostSpanHook?: (request: NormalizedRequest) => void; + + responseHook?: ( + response: NormalizedResponse, + span: Span, + tracer: Tracer, + config: AwsSdkInstrumentationConfig + ) => void; +} diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-metric-attribute-generator.test.ts b/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-metric-attribute-generator.test.ts index 14e82cf..69e2442 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-metric-attribute-generator.test.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-metric-attribute-generator.test.ts @@ -731,49 +731,59 @@ describe('AwsMetricAttributeGeneratorTest', () => { it('testSdkClientSpanWithRemoteResourceAttributes', () => { mockAttribute(SEMATTRS_RPC_SYSTEM, 'aws-api'); // Validate behaviour of aws bucket name attribute, then remove it. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BUCKET_NAME, 'aws_s3_bucket_name'); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET, 'aws_s3_bucket_name'); validateRemoteResourceAttributes('AWS::S3::Bucket', 'aws_s3_bucket_name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BUCKET_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET, undefined); - // Validate behaviour of AWS_QUEUE_NAME attribute, then remove it. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME, 'aws_queue_name'); + // Validate behaviour of AWS_SQS_QUEUE_NAME attribute, then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME, 'aws_queue_name'); validateRemoteResourceAttributes('AWS::SQS::Queue', 'aws_queue_name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME, undefined); - // Validate behaviour of having both AWS_QUEUE_NAME and AWS_QUEUE_URL attribute, then remove + // Validate behaviour of having both AWS_SQS_QUEUE_NAME and AWS_SQS_QUEUE_URL attribute, then remove // them. Queue name is more reliable than queue URL, so we prefer to use name over URL. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_URL, 'https://sqs.us-east-2.amazonaws.com/123456789012/Queue'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME, 'aws_queue_name'); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL, 'https://sqs.us-east-2.amazonaws.com/123456789012/Queue'); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME, 'aws_queue_name'); validateRemoteResourceAttributes('AWS::SQS::Queue', 'aws_queue_name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_URL, undefined); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME, undefined); // Valid queue name with invalid queue URL, we should default to using the queue name. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_URL, 'invalidUrl'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME, 'aws_queue_name'); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL, 'invalidUrl'); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME, 'aws_queue_name'); validateRemoteResourceAttributes('AWS::SQS::Queue', 'aws_queue_name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_URL, undefined); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_QUEUE_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME, undefined); - // Validate behaviour of AWS_STREAM_NAME attribute, then remove it. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_STREAM_NAME, 'aws_stream_name'); - validateRemoteResourceAttributes('AWS::Kinesis::Stream', 'aws_stream_name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_STREAM_NAME, undefined); + // Validate behaviour of AWS_KINESIS_STREAM_NAME attribute, then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME, 'AWS_KINESIS_STREAM_NAME'); + validateRemoteResourceAttributes('AWS::Kinesis::Stream', 'AWS_KINESIS_STREAM_NAME'); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME, undefined); - // Validate behaviour of AWS_TABLE_NAME attribute, then remove it. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME, 'aws_table_name'); + // Validate behaviour of AWS_TABLE_NAMES attribute with one table name, then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, ['aws_table_name']); validateRemoteResourceAttributes('AWS::DynamoDB::Table', 'aws_table_name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, undefined); - // Validate behaviour of AWS_TABLE_NAME attribute with special chars(|), then remove it. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME, 'aws_table|name'); + // Validate behaviour of AWS_TABLE_NAMES attribute with no table name, then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, []); + validateRemoteResourceAttributes(undefined, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, undefined); + + // Validate behaviour of AWS_TABLE_NAMES attribute with two table names, then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, ['aws_table_name1', 'aws_table_name2']); + validateRemoteResourceAttributes(undefined, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, undefined); + + // Validate behaviour of AWS_TABLE_NAMES attribute with special chars(|), then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, ['aws_table|name']); validateRemoteResourceAttributes('AWS::DynamoDB::Table', 'aws_table^|name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, undefined); - // Validate behaviour of AWS_TABLE_NAME attribute with special chars(^), then remove it. - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME, 'aws_table^name'); + // Validate behaviour of AWS_TABLE_NAMES attribute with special chars(^), then remove it. + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, ['aws_table^name']); validateRemoteResourceAttributes('AWS::DynamoDB::Table', 'aws_table^^name'); - mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_TABLE_NAME, undefined); + mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_NAMES, undefined); }); it('testDBClientSpanWithRemoteResourceAttributes', () => { @@ -1010,7 +1020,7 @@ describe('AwsMetricAttributeGeneratorTest', () => { mockAttribute(SEMATTRS_PEER_SERVICE, undefined); } - function validateRemoteResourceAttributes(type: string, identifier: string): void { + function validateRemoteResourceAttributes(type: string | undefined, identifier: string | undefined): void { // Client, Producer and Consumer spans should generate the expected remote resource attributes (spanDataMock as any).kind = SpanKind.CLIENT; let actualAttributes: Attributes = GENERATOR.generateMetricAttributeMapFromSpan(spanDataMock, resource)[ diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-opentelemetry-configurator.test.ts b/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-opentelemetry-configurator.test.ts index 981378e..4aed390 100644 --- a/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-opentelemetry-configurator.test.ts +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/aws-opentelemetry-configurator.test.ts @@ -47,7 +47,7 @@ describe('AwsOpenTelemetryConfiguratorTest', () => { process.env.OTEL_TRACES_SAMPLER_ARG = '0.01'; // Create configurator - awsOtelConfigurator = new AwsOpentelemetryConfigurator(); + awsOtelConfigurator = new AwsOpentelemetryConfigurator([]); }); // The probability of this passing once without correct IDs is low, 20 times is inconceivable. @@ -163,11 +163,12 @@ describe('AwsOpenTelemetryConfiguratorTest', () => { AwsOpentelemetryConfigurator.customizeSpanProcessors(spanProcessors, Resource.empty()); process.env.OTEL_METRIC_EXPORT_INTERVAL = '!@#$%^&*()'; AwsOpentelemetryConfigurator.customizeSpanProcessors(spanProcessors, Resource.empty()); - process.env.OTEL_METRIC_EXPORT_INTERVAL = '123'; + process.env.OTEL_METRIC_EXPORT_INTERVAL = '40000'; AwsOpentelemetryConfigurator.customizeSpanProcessors(spanProcessors, Resource.empty()); } catch (e: any) { assert.fail(`AwsOpentelemetryConfigurator.customizeSpanProcessors() has incorrectly thrown error: ${e}`); } finally { + delete process.env.OTEL_METRIC_EXPORT_INTERVAL; delete process.env.OTEL_AWS_APPLICATION_SIGNALS_ENABLED; } }); diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/kinesis.test.ts b/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/kinesis.test.ts new file mode 100644 index 0000000..673b309 --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/kinesis.test.ts @@ -0,0 +1,59 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { getTestSpans, registerInstrumentationTesting } from '@opentelemetry/contrib-test-utils'; +import { AwsInstrumentation } from '@opentelemetry/instrumentation-aws-sdk'; +import { applyInstrumentationPatches } from './../../../../src/patches/instrumentation-patch'; + +const instrumentations: AwsInstrumentation[] = [new AwsInstrumentation()]; +applyInstrumentationPatches(instrumentations); +registerInstrumentationTesting(instrumentations[0]); + +import { Kinesis } from '@aws-sdk/client-kinesis'; +import * as nock from 'nock'; + +import { SpanKind } from '@opentelemetry/api'; +import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; +import { expect } from 'expect'; +import { AWS_ATTRIBUTE_KEYS } from '../../../../src/aws-attribute-keys'; + +// This file's contents are being contributed to upstream +// - https://github.com/open-telemetry/opentelemetry-js-contrib/pull/2361 + +const region = 'us-east-1'; + +describe('Kinesis', () => { + let kinesis: Kinesis; + beforeEach(() => { + kinesis = new Kinesis({ + region: region, + credentials: { + accessKeyId: 'abcde', + secretAccessKey: 'abcde', + }, + }); + }); + + describe('DescribeStream', () => { + it('adds Stream Name', async () => { + const dummyStreamName: string = 'dummy-stream-name'; + + nock(`https://kinesis.${region}.amazonaws.com`).post('/').reply(200, {}); + + await kinesis + .describeStream({ + StreamName: dummyStreamName, + }) + .catch((err: any) => {}); + + const testSpans: ReadableSpan[] = getTestSpans(); + const describeSpans: ReadableSpan[] = testSpans.filter((s: ReadableSpan) => { + return s.name === 'Kinesis.DescribeStream'; + }); + expect(describeSpans.length).toBe(1); + const creationSpan = describeSpans[0]; + expect(creationSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME]).toBe(dummyStreamName); + expect(creationSpan.kind).toBe(SpanKind.CLIENT); + }); + }); +}); diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/s3.test.ts b/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/s3.test.ts new file mode 100644 index 0000000..937d2ef --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/s3.test.ts @@ -0,0 +1,59 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { getTestSpans, registerInstrumentationTesting } from '@opentelemetry/contrib-test-utils'; +import { AwsInstrumentation } from '@opentelemetry/instrumentation-aws-sdk'; +import { applyInstrumentationPatches } from './../../../../src/patches/instrumentation-patch'; + +const instrumentations: AwsInstrumentation[] = [new AwsInstrumentation()]; +applyInstrumentationPatches(instrumentations); +registerInstrumentationTesting(instrumentations[0]); + +import { S3 } from '@aws-sdk/client-s3'; +import * as nock from 'nock'; + +import { SpanKind } from '@opentelemetry/api'; +import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; +import { expect } from 'expect'; +import { AWS_ATTRIBUTE_KEYS } from '../../../../src/aws-attribute-keys'; + +// This file's contents are being contributed to upstream +// - https://github.com/open-telemetry/opentelemetry-js-contrib/pull/2361 + +const region = 'us-east-1'; + +describe('S3', () => { + let s3: S3; + beforeEach(() => { + s3 = new S3({ + region: region, + credentials: { + accessKeyId: 'abcde', + secretAccessKey: 'abcde', + }, + }); + }); + + describe('ListObjects', () => { + it('adds bucket Name', async () => { + const dummyBucketName: string = 'dummy-bucket-name'; + + nock(`https://s3.${region}.amazonaws.com/`).post('/').reply(200, 'null'); + + await s3 + .listObjects({ + Bucket: dummyBucketName, + }) + .catch((err: any) => {}); + + const testSpans: ReadableSpan[] = getTestSpans(); + const listObjectsSpans: ReadableSpan[] = testSpans.filter((s: ReadableSpan) => { + return s.name === 'S3.ListObjects'; + }); + expect(listObjectsSpans.length).toBe(1); + const listObjectsSpan = listObjectsSpans[0]; + expect(listObjectsSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET]).toBe(dummyBucketName); + expect(listObjectsSpan.kind).toBe(SpanKind.CLIENT); + }); + }); +}); diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/instrumentation-patch.test.ts b/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/instrumentation-patch.test.ts new file mode 100644 index 0000000..cc26f85 --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/patches/instrumentation-patch.test.ts @@ -0,0 +1,189 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { Attributes, diag } from '@opentelemetry/api'; +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; +import { Instrumentation } from '@opentelemetry/instrumentation'; +import { AwsInstrumentation, NormalizedRequest } from '@opentelemetry/instrumentation-aws-sdk'; +import { expect } from 'expect'; +import { AWS_ATTRIBUTE_KEYS } from '../../src/aws-attribute-keys'; +import { RequestMetadata, ServiceExtension } from '../../src/third-party/otel/aws/services/ServiceExtension'; +import { applyInstrumentationPatches } from './../../src/patches/instrumentation-patch'; + +const _STREAM_NAME: string = 'streamName'; +const _BUCKET_NAME: string = 'bucketName'; +const _QUEUE_NAME: string = 'queueName'; +const _QUEUE_URL: string = 'https://sqs.us-east-1.amazonaws.com/123412341234/queueName'; + +const UNPATCHED_INSTRUMENTATIONS: Instrumentation[] = getNodeAutoInstrumentations(); + +const PATCHED_INSTRUMENTATIONS: Instrumentation[] = getNodeAutoInstrumentations(); +applyInstrumentationPatches(PATCHED_INSTRUMENTATIONS); + +describe('InstrumentationPatchTest', () => { + it('SanityTestUnpatchedAwsSdkInstrumentation', () => { + const awsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(UNPATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(awsSdkInstrumentation); + + // Not from patching + expect(services.has('SQS')).toBeTruthy(); + expect(services.has('SNS')).toBeTruthy(); + expect(services.has('DynamoDB')).toBeTruthy(); + expect(services.has('Lambda')).toBeTruthy(); + // From patching but shouldn't be applied + expect(services.has('S3')).toBeFalsy(); + expect(services.has('Kinesis')).toBeFalsy(); + expect(services.get('SQS')._requestPreSpanHook).toBeFalsy(); + expect(services.get('SQS').requestPreSpanHook).toBeTruthy(); + }); + + it('PatchesAwsSdkInstrumentation', () => { + const instrumentations: Instrumentation[] = getNodeAutoInstrumentations(); + applyInstrumentationPatches(instrumentations); + const awsSdkInstrumentation = extractAwsSdkInstrumentation(instrumentations); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const services: Map = (awsSdkInstrumentation as AwsInstrumentation).servicesExtensions?.services; + // Not from patching + expect(services.has('SQS')).toBeTruthy(); + expect(services.has('SNS')).toBeTruthy(); + expect(services.has('DynamoDB')).toBeTruthy(); + expect(services.has('Lambda')).toBeTruthy(); + // From patching + expect(services.has('S3')).toBeTruthy(); + expect(services.has('Kinesis')).toBeTruthy(); + expect(services.get('SQS')._requestPreSpanHook).toBeTruthy(); + expect(services.get('SQS').requestPreSpanHook).toBeTruthy(); + // Sanity check + expect(services.has('InvalidService')).toBeFalsy(); + }); + + it('S3 without patching', () => { + const unpatchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(UNPATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(unpatchedAwsSdkInstrumentation); + expect(() => doExtractS3Attributes(services)).toThrow(); + }); + + it('Kinesis without patching', () => { + const unpatchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(UNPATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(unpatchedAwsSdkInstrumentation); + expect(() => doExtractKinesisAttributes(services)).toThrow(); + }); + + it('SQS without patching', () => { + const unpatchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(UNPATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(unpatchedAwsSdkInstrumentation); + expect(() => doExtractSqsAttributes(services)).not.toThrow(); + + let sqsAttributes: Attributes = doExtractSqsAttributes(services, false); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL]).toBeUndefined(); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME]).toBeUndefined(); + + sqsAttributes = doExtractSqsAttributes(services, true); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL]).toBeUndefined(); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME]).toBeUndefined(); + }); + + it('S3 with patching', () => { + const patchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(PATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(patchedAwsSdkInstrumentation); + const s3Attributes: Attributes = doExtractS3Attributes(services); + expect(s3Attributes[AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET]).toEqual(_BUCKET_NAME); + }); + + it('Kinesis with patching', () => { + const patchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(PATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(patchedAwsSdkInstrumentation); + const kinesisAttributes: Attributes = doExtractKinesisAttributes(services); + expect(kinesisAttributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME]).toEqual(_STREAM_NAME); + }); + + it('SQS with patching', () => { + const patchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(PATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(patchedAwsSdkInstrumentation); + const sqsAttributes: Attributes = doExtractSqsAttributes(services, false); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL]).toEqual(_QUEUE_URL); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME]).toBeUndefined(); + }); + + it('SQS with patching if Queue Name was available (but is not)', () => { + const patchedAwsSdkInstrumentation: AwsInstrumentation = extractAwsSdkInstrumentation(PATCHED_INSTRUMENTATIONS); + const services: Map = extractServicesFromAwsSdkInstrumentation(patchedAwsSdkInstrumentation); + const sqsAttributes: Attributes = doExtractSqsAttributes(services, true); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL]).toEqual(_QUEUE_URL); + expect(sqsAttributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_NAME]).toEqual(_QUEUE_NAME); + }); + + function extractAwsSdkInstrumentation(instrumentations: Instrumentation[]): AwsInstrumentation { + const filteredInstrumentations: Instrumentation[] = instrumentations.filter( + instrumentation => instrumentation.instrumentationName === '@opentelemetry/instrumentation-aws-sdk' + ); + expect(filteredInstrumentations.length).toEqual(1); + return filteredInstrumentations[0] as AwsInstrumentation; + } + + function extractServicesFromAwsSdkInstrumentation(awsSdkInstrumentation: AwsInstrumentation): Map { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const services: Map = (awsSdkInstrumentation as AwsInstrumentation).servicesExtensions?.services; + if (services === undefined) { + throw new Error('extractServicesFromAwsSdkInstrumentation() returned undefined `services`'); + } + return services; + } + + function doExtractKinesisAttributes(services: Map): Attributes { + const serviceName: string = 'Kinesis'; + const params: NormalizedRequest = { + serviceName: serviceName, + commandName: 'mockCommandName', + commandInput: { + StreamName: _STREAM_NAME, + }, + }; + return doExtractAttributes(services, serviceName, params); + } + + function doExtractS3Attributes(services: Map): Attributes { + const serviceName: string = 'S3'; + const params: NormalizedRequest = { + serviceName: serviceName, + commandName: 'mockCommandName', + commandInput: { + Bucket: _BUCKET_NAME, + }, + }; + return doExtractAttributes(services, serviceName, params); + } + + function doExtractSqsAttributes( + services: Map, + includeQueueName: boolean = false + ): Attributes { + const serviceName: string = 'SQS'; + const params: NormalizedRequest = { + serviceName: serviceName, + commandName: 'mockCommandName', + commandInput: { + QueueUrl: _QUEUE_URL, + }, + }; + if (includeQueueName) { + params.commandInput.QueueName = _QUEUE_NAME; + } + return doExtractAttributes(services, serviceName, params); + } + + function doExtractAttributes( + services: Map, + serviceName: string, + requestInput: NormalizedRequest + ): Attributes { + const serviceExtension: ServiceExtension | undefined = services.get(serviceName); + if (serviceExtension === undefined) { + throw new Error(`serviceExtension for ${serviceName} is not defined in the provided Map of services`); + } + const requestMetadata: RequestMetadata = serviceExtension.requestPreSpanHook(requestInput, {}, diag); + return requestMetadata.spanAttributes || {}; + } +}); diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/register.patch.test.ts b/aws-distro-opentelemetry-node-autoinstrumentation/test/register.patch.test.ts new file mode 100644 index 0000000..acf4f31 --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/register.patch.test.ts @@ -0,0 +1,88 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +// Modifications Copyright The OpenTelemetry Authors. Licensed under the Apache License 2.0 License. + +import * as assert from 'assert'; +import { spawnSync, SpawnSyncReturns } from 'child_process'; + +// The OpenTelemetry Authors code +describe('RegisterPatch', function () { + it('Correctly applies AWS SDK Patches and generates expected attributes for S3, Kinesis, and SQS Client calls', () => { + const proc: SpawnSyncReturns = spawnSync( + process.execPath, + ['--require', '../build/src/register.js', './test-app/app-aws-sdk-client-calls.js'], + { + cwd: __dirname, + timeout: 10000, + killSignal: 'SIGKILL', // SIGTERM is not sufficient to terminate some hangs + env: Object.assign({}, process.env, { + OTEL_NODE_RESOURCE_DETECTORS: 'none', + OTEL_TRACES_EXPORTER: 'console', + // nx (used by lerna run) defaults `FORCE_COLOR=true`, which in + // node v18.17.0, v20.3.0 and later results in ANSI color escapes + // in the ConsoleSpanExporter output that is checked below. + FORCE_COLOR: '0', + + OTEL_LOG_LEVEL: 'ALL', + OTEL_TRACES_SAMPLER: 'always_on', + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: 'http://localhost:4316/v1/traces', + OTEL_RESOURCE_ATTRIBUTES: 'service.name=test-adot-sdk-ec2-service-name', + OTEL_AWS_APPLICATION_SIGNALS_ENABLED: 'true', + OTEL_NODE_DISABLED_INSTRUMENTATIONS: 'fs', + }), + } + ); + assert.ifError(proc.error); + assert.equal(proc.status, 0, `proc.status (${proc.status})`); + assert.equal(proc.signal, null, `proc.signal (${proc.signal})`); + + assert.ok(proc.stdout.includes('AWS Distro of OpenTelemetry automatic instrumentation started successfully')); + assert.ok(proc.stdout.includes("Environment variable OTEL_EXPORTER_OTLP_PROTOCOL is set to 'http/protobuf'")); + assert.ok(proc.stdout.includes("Environment variable OTEL_PROPAGATORS is set to 'xray,tracecontext,b3,b3multi'")); + + assert.ok( + proc.stdout.includes("'service.name': 'test-adot-sdk-ec2-service-name'"), + 'console span output in stdout - validate service.name' + ); + + assert.ok( + proc.stdout.includes("'aws.s3.bucket': 'test-bucket-not-exists'"), + 'console span output in stdout - validate aws.s3.bucket' + ); + assert.ok( + proc.stdout.includes("'aws.remote.resource.type': 'AWS::S3::Bucket'"), + 'console span output in stdout - validate aws.remote.resource.type' + ); + assert.ok( + proc.stdout.includes("'aws.remote.resource.identifier': 'test-bucket-not-exists'"), + 'console span output in stdout - validate aws.remote.resource.identifier' + ); + + assert.ok( + proc.stdout.includes("'aws.kinesis.stream.name': 'my-kinesis-stream'"), + 'console span output in stdout - validate aws.kinesis.stream.name' + ); + assert.ok( + proc.stdout.includes("'aws.remote.resource.type': 'AWS::Kinesis::Stream'"), + 'console span output in stdout - validate aws.remote.resource.type' + ); + assert.ok( + proc.stdout.includes("'aws.remote.resource.identifier': 'my-kinesis-stream'"), + 'console span output in stdout - validate aws.remote.resource.identifier' + ); + + assert.ok( + proc.stdout.includes("'aws.sqs.queue.url': 'https://sqs.us-east-1.amazonaws.com/012345678910/sqs-queue-name'"), + 'console span output in stdout - validate aws.sqs.queue.url' + ); + assert.ok( + proc.stdout.includes("'aws.remote.resource.type': 'AWS::SQS::Queue'"), + 'console span output in stdout - validate aws.remote.resource.type' + ); + assert.ok( + proc.stdout.includes("'aws.remote.resource.identifier': 'sqs-queue-name'"), + 'console span output in stdout - validate aws.remote.resource.identifier' + ); + }); +}); +// END The OpenTelemetry Authors code diff --git a/aws-distro-opentelemetry-node-autoinstrumentation/test/test-app/app-aws-sdk-client-calls.js b/aws-distro-opentelemetry-node-autoinstrumentation/test/test-app/app-aws-sdk-client-calls.js new file mode 100644 index 0000000..c9d06c8 --- /dev/null +++ b/aws-distro-opentelemetry-node-autoinstrumentation/test/test-app/app-aws-sdk-client-calls.js @@ -0,0 +1,38 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Used in register.patch.test.ts to mimic a JS app using SQS client of AWS SDK for JS (v3). +const { S3Client, ListObjectsCommand } = require("@aws-sdk/client-s3"); +const { KinesisClient, ListStreamsCommand } = require('@aws-sdk/client-kinesis'); +const { SQSClient, GetQueueAttributesCommand } = require("@aws-sdk/client-sqs"); + +const s3Client = new S3Client({}); +const bucketName = "test-bucket-not-exists"; + +const kinesisClient = new KinesisClient({}); +const streamName = "my-kinesis-stream"; + +const sqsClient = new SQSClient({}); +const queueUrl = "https://sqs.us-east-1.amazonaws.com/012345678910/sqs-queue-name"; + +const awsSdkClientSendPromises = [ + s3Client.send( + new ListObjectsCommand({ + Bucket: bucketName + }) + ), + kinesisClient.send( + new ListStreamsCommand({ + StreamName: streamName, + }) + ), + sqsClient.send( + new GetQueueAttributesCommand({ + QueueUrl: queueUrl + }) + ), +] + +Promise.all(awsSdkClientSendPromises).catch(e => { + console.error("Exception thrown", e.message); +}); diff --git a/package-lock.json b/package-lock.json index 2c6c44d..e62728f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,6 +57,10 @@ "@opentelemetry/semantic-conventions": "1.25.1" }, "devDependencies": { + "@aws-sdk/client-kinesis": "3.85.0", + "@aws-sdk/client-s3": "3.85.0", + "@aws-sdk/client-sqs": "3.85.0", + "@opentelemetry/contrib-test-utils": "^0.40.0", "@types/mocha": "7.0.2", "@types/node": "18.6.5", "@types/sinon": "10.0.18", @@ -101,6 +105,1510 @@ "node": ">=6.0.0" } }, + "node_modules/@aws-crypto/crc32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz", + "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", + "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", + "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.110.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.78.0.tgz", + "integrity": "sha512-iz1YLwM2feJUj/y97yO4XmDeTxs+yZ1XJwQgoawKuc8IDBKUutnJNCHL5jL04WUKU7Nrlq+Hr2fCTScFh2z9zg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/chunked-blob-reader": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.55.0.tgz", + "integrity": "sha512-o/xjMCq81opAjSBjt7YdHJwIJcGVG5XIV9+C2KXcY5QwVimkOKPybWTv0mXPvSwSilSx+EhpLNhkcJuXdzhw4w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/chunked-blob-reader-native": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz", + "integrity": "sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/util-base64-browser": "3.58.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-kinesis": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.85.0.tgz", + "integrity": "sha512-TlBYyNCkNZqnarpReaYCJTHQeVpjb6XpVcpoznsPnRpPjcm57JVhuErpKjU6tOKmtAl0uKrmJsjupizgQwFMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.85.0", + "@aws-sdk/config-resolver": "3.80.0", + "@aws-sdk/credential-provider-node": "3.85.0", + "@aws-sdk/eventstream-serde-browser": "3.78.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.78.0", + "@aws-sdk/eventstream-serde-node": "3.78.0", + "@aws-sdk/fetch-http-handler": "3.78.0", + "@aws-sdk/hash-node": "3.78.0", + "@aws-sdk/invalid-dependency": "3.78.0", + "@aws-sdk/middleware-content-length": "3.78.0", + "@aws-sdk/middleware-host-header": "3.78.0", + "@aws-sdk/middleware-logger": "3.78.0", + "@aws-sdk/middleware-retry": "3.80.0", + "@aws-sdk/middleware-serde": "3.78.0", + "@aws-sdk/middleware-signing": "3.78.0", + "@aws-sdk/middleware-stack": "3.78.0", + "@aws-sdk/middleware-user-agent": "3.78.0", + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/node-http-handler": "3.82.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/smithy-client": "3.85.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/url-parser": "3.78.0", + "@aws-sdk/util-base64-browser": "3.58.0", + "@aws-sdk/util-base64-node": "3.55.0", + "@aws-sdk/util-body-length-browser": "3.55.0", + "@aws-sdk/util-body-length-node": "3.55.0", + "@aws-sdk/util-defaults-mode-browser": "3.85.0", + "@aws-sdk/util-defaults-mode-node": "3.85.0", + "@aws-sdk/util-user-agent-browser": "3.78.0", + "@aws-sdk/util-user-agent-node": "3.80.0", + "@aws-sdk/util-utf8-browser": "3.55.0", + "@aws-sdk/util-utf8-node": "3.55.0", + "@aws-sdk/util-waiter": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.85.0.tgz", + "integrity": "sha512-SwSbuC04hzHh4D6ioqHrAfdcPyLHN0CJYjKN5stMmwRc4BmbI+nPwpUAs5nCyxpil95feRNamIn8PA4P2HF8Eg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "2.0.0", + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.85.0", + "@aws-sdk/config-resolver": "3.80.0", + "@aws-sdk/credential-provider-node": "3.85.0", + "@aws-sdk/eventstream-serde-browser": "3.78.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.78.0", + "@aws-sdk/eventstream-serde-node": "3.78.0", + "@aws-sdk/fetch-http-handler": "3.78.0", + "@aws-sdk/hash-blob-browser": "3.78.0", + "@aws-sdk/hash-node": "3.78.0", + "@aws-sdk/hash-stream-node": "3.78.0", + "@aws-sdk/invalid-dependency": "3.78.0", + "@aws-sdk/md5-js": "3.78.0", + "@aws-sdk/middleware-bucket-endpoint": "3.80.0", + "@aws-sdk/middleware-content-length": "3.78.0", + "@aws-sdk/middleware-expect-continue": "3.78.0", + "@aws-sdk/middleware-flexible-checksums": "3.78.0", + "@aws-sdk/middleware-host-header": "3.78.0", + "@aws-sdk/middleware-location-constraint": "3.78.0", + "@aws-sdk/middleware-logger": "3.78.0", + "@aws-sdk/middleware-retry": "3.80.0", + "@aws-sdk/middleware-sdk-s3": "3.78.0", + "@aws-sdk/middleware-serde": "3.78.0", + "@aws-sdk/middleware-signing": "3.78.0", + "@aws-sdk/middleware-ssec": "3.78.0", + "@aws-sdk/middleware-stack": "3.78.0", + "@aws-sdk/middleware-user-agent": "3.78.0", + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/node-http-handler": "3.82.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/signature-v4-multi-region": "3.78.0", + "@aws-sdk/smithy-client": "3.85.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/url-parser": "3.78.0", + "@aws-sdk/util-base64-browser": "3.58.0", + "@aws-sdk/util-base64-node": "3.55.0", + "@aws-sdk/util-body-length-browser": "3.55.0", + "@aws-sdk/util-body-length-node": "3.55.0", + "@aws-sdk/util-defaults-mode-browser": "3.85.0", + "@aws-sdk/util-defaults-mode-node": "3.85.0", + "@aws-sdk/util-stream-browser": "3.78.0", + "@aws-sdk/util-stream-node": "3.78.0", + "@aws-sdk/util-user-agent-browser": "3.78.0", + "@aws-sdk/util-user-agent-node": "3.80.0", + "@aws-sdk/util-utf8-browser": "3.55.0", + "@aws-sdk/util-utf8-node": "3.55.0", + "@aws-sdk/util-waiter": "3.78.0", + "@aws-sdk/xml-builder": "3.55.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@aws-sdk/client-sqs": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.85.0.tgz", + "integrity": "sha512-7zBVsqch5hOT7dKOq2edLxetvvvhRVg2qiBiwChseg+dzPuVehONq0WBsa7GQT5UypdFn+WvkoklhHQyY6+5hg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.85.0", + "@aws-sdk/config-resolver": "3.80.0", + "@aws-sdk/credential-provider-node": "3.85.0", + "@aws-sdk/fetch-http-handler": "3.78.0", + "@aws-sdk/hash-node": "3.78.0", + "@aws-sdk/invalid-dependency": "3.78.0", + "@aws-sdk/md5-js": "3.78.0", + "@aws-sdk/middleware-content-length": "3.78.0", + "@aws-sdk/middleware-host-header": "3.78.0", + "@aws-sdk/middleware-logger": "3.78.0", + "@aws-sdk/middleware-retry": "3.80.0", + "@aws-sdk/middleware-sdk-sqs": "3.78.0", + "@aws-sdk/middleware-serde": "3.78.0", + "@aws-sdk/middleware-signing": "3.78.0", + "@aws-sdk/middleware-stack": "3.78.0", + "@aws-sdk/middleware-user-agent": "3.78.0", + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/node-http-handler": "3.82.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/smithy-client": "3.85.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/url-parser": "3.78.0", + "@aws-sdk/util-base64-browser": "3.58.0", + "@aws-sdk/util-base64-node": "3.55.0", + "@aws-sdk/util-body-length-browser": "3.55.0", + "@aws-sdk/util-body-length-node": "3.55.0", + "@aws-sdk/util-defaults-mode-browser": "3.85.0", + "@aws-sdk/util-defaults-mode-node": "3.85.0", + "@aws-sdk/util-user-agent-browser": "3.78.0", + "@aws-sdk/util-user-agent-node": "3.80.0", + "@aws-sdk/util-utf8-browser": "3.55.0", + "@aws-sdk/util-utf8-node": "3.55.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.85.0.tgz", + "integrity": "sha512-JMW0NzFpo99oE6O9M/kgLela73p4vmhe/5TIcdrqUvP9XUV9nANl5nSXh3rqLz0ubmliedz9kdYYhwMC3ntoXg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.80.0", + "@aws-sdk/fetch-http-handler": "3.78.0", + "@aws-sdk/hash-node": "3.78.0", + "@aws-sdk/invalid-dependency": "3.78.0", + "@aws-sdk/middleware-content-length": "3.78.0", + "@aws-sdk/middleware-host-header": "3.78.0", + "@aws-sdk/middleware-logger": "3.78.0", + "@aws-sdk/middleware-retry": "3.80.0", + "@aws-sdk/middleware-serde": "3.78.0", + "@aws-sdk/middleware-stack": "3.78.0", + "@aws-sdk/middleware-user-agent": "3.78.0", + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/node-http-handler": "3.82.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/smithy-client": "3.85.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/url-parser": "3.78.0", + "@aws-sdk/util-base64-browser": "3.58.0", + "@aws-sdk/util-base64-node": "3.55.0", + "@aws-sdk/util-body-length-browser": "3.55.0", + "@aws-sdk/util-body-length-node": "3.55.0", + "@aws-sdk/util-defaults-mode-browser": "3.85.0", + "@aws-sdk/util-defaults-mode-node": "3.85.0", + "@aws-sdk/util-user-agent-browser": "3.78.0", + "@aws-sdk/util-user-agent-node": "3.80.0", + "@aws-sdk/util-utf8-browser": "3.55.0", + "@aws-sdk/util-utf8-node": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.85.0.tgz", + "integrity": "sha512-qjaoGG1FrCTS1zSk/XOQRZ0v0JXeytpMl/hf6BcoX/NsaJzDaE5oJlzqdNGwd+1kLYt9J2igG3zxYgvxnCHg6w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.80.0", + "@aws-sdk/credential-provider-node": "3.85.0", + "@aws-sdk/fetch-http-handler": "3.78.0", + "@aws-sdk/hash-node": "3.78.0", + "@aws-sdk/invalid-dependency": "3.78.0", + "@aws-sdk/middleware-content-length": "3.78.0", + "@aws-sdk/middleware-host-header": "3.78.0", + "@aws-sdk/middleware-logger": "3.78.0", + "@aws-sdk/middleware-retry": "3.80.0", + "@aws-sdk/middleware-sdk-sts": "3.78.0", + "@aws-sdk/middleware-serde": "3.78.0", + "@aws-sdk/middleware-signing": "3.78.0", + "@aws-sdk/middleware-stack": "3.78.0", + "@aws-sdk/middleware-user-agent": "3.78.0", + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/node-http-handler": "3.82.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/smithy-client": "3.85.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/url-parser": "3.78.0", + "@aws-sdk/util-base64-browser": "3.58.0", + "@aws-sdk/util-base64-node": "3.55.0", + "@aws-sdk/util-body-length-browser": "3.55.0", + "@aws-sdk/util-body-length-node": "3.55.0", + "@aws-sdk/util-defaults-mode-browser": "3.85.0", + "@aws-sdk/util-defaults-mode-node": "3.85.0", + "@aws-sdk/util-user-agent-browser": "3.78.0", + "@aws-sdk/util-user-agent-node": "3.80.0", + "@aws-sdk/util-utf8-browser": "3.55.0", + "@aws-sdk/util-utf8-node": "3.55.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.80.0.tgz", + "integrity": "sha512-vFruNKlmhsaC8yjnHmasi1WW/7EELlEuFTj4mqcqNqR4dfraf0maVvpqF1VSR8EstpFMsGYI5dmoWAnnG4PcLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/signature-v4": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-config-provider": "3.55.0", + "@aws-sdk/util-middleware": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.78.0.tgz", + "integrity": "sha512-K41VTIzVHm2RyIwtBER8Hte3huUBXdV1WKO+i7olYVgLFmaqcZUNrlyoGDRqZcQ/u4AbxTzBU9jeMIbIfzMOWg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.81.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.81.0.tgz", + "integrity": "sha512-BHopP+gaovTYj+4tSrwCk8NNCR48gE9CWmpIOLkP9ell0gOL81Qh7aCEiIK0BZBZkccv1s16cYq1MSZZGS7PEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/url-parser": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.85.0.tgz", + "integrity": "sha512-KgzLGq+w8OrSLutwdYUw0POeLinGQKcqvQJ9702eoeXCwZMnEHwKqU61bn8QKMX/tuYVCNV4I1enI7MmYPW8Lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.78.0", + "@aws-sdk/credential-provider-imds": "3.81.0", + "@aws-sdk/credential-provider-sso": "3.85.0", + "@aws-sdk/credential-provider-web-identity": "3.78.0", + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/shared-ini-file-loader": "3.80.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.85.0.tgz", + "integrity": "sha512-YMxpRJg88mvfmKxy8I5yG3rx+UmF/5a/4twcdAzCfYTAPz+bV6ypIHjFv610/kygHMm29Fof3DRvHXDdBH4mkw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.78.0", + "@aws-sdk/credential-provider-imds": "3.81.0", + "@aws-sdk/credential-provider-ini": "3.85.0", + "@aws-sdk/credential-provider-process": "3.80.0", + "@aws-sdk/credential-provider-sso": "3.85.0", + "@aws-sdk/credential-provider-web-identity": "3.78.0", + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/shared-ini-file-loader": "3.80.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.80.0.tgz", + "integrity": "sha512-3Ro+kMMyLUJHefOhGc5pOO/ibGcJi8bkj0z/Jtqd5I2Sm1qi7avoztST67/k48KMW1OqPnD/FUqxz5T8B2d+FQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/shared-ini-file-loader": "3.80.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.85.0.tgz", + "integrity": "sha512-uE238BgJ/AftPDlBGDlV0XdiNWnUZxFmUmLxgbr19/6jHaCuBr//T6rP+Bc0BjcHkvQCvTdFoCjs17R3Quy3cw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.85.0", + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/shared-ini-file-loader": "3.80.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.78.0.tgz", + "integrity": "sha512-9/IvqHdJaVqMEABA8xZE3t5YF1S2PepfckVu0Ws9YUglj6oO+2QyVX6aRgMF1xph6781+Yc31TDh8/3eaDja7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-marshaller": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.78.0.tgz", + "integrity": "sha512-BMbRvLe6wNWQ+NO1pdPw3kGXXEdYV94BxEr3rTkKwr5yHpl8sUb/Va9sJJufUjzggpgE4vYu5nVsrT8ByMYXuA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "2.0.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-hex-encoding": "3.58.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/eventstream-serde-browser": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.78.0.tgz", + "integrity": "sha512-ehQI2iLsj8MMskDRbrPB7SibIdJq6LleBP6ojT+cgrLJRbVXUOxK+3MPHDZVdGYx4ukVg48E1fA2DzVfAp7Emw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/eventstream-marshaller": "3.78.0", + "@aws-sdk/eventstream-serde-universal": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.78.0.tgz", + "integrity": "sha512-iUG0wtZH/L7d6XfipwbhgjBHip0uTm9S27EasCn+g0CunbW6w7rXd7rfMqA+gSLVXPTBYjTMPIwRxrTCdRprwA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-node": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.78.0.tgz", + "integrity": "sha512-H78LLoZEngZBSdk3lRQkAaR3cGsy/3UIjq9AFPeqoPVQtHkzBob1jVfE/5VSVAMhKLxWn8iqhRPS37AvyBGOwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/eventstream-marshaller": "3.78.0", + "@aws-sdk/eventstream-serde-universal": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-universal": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.78.0.tgz", + "integrity": "sha512-PZTLdyF923/1GJuMNtq9VMGd2vEx33HhsGInXvYtulKDSD5SgaTGj+Dz5wYepqL1gUEuXqZjBD71uZgrY/JgRg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/eventstream-marshaller": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.78.0.tgz", + "integrity": "sha512-cR6r2h2kJ1DNEZSXC6GknQB7OKmy+s9ZNV+g3AsNqkrUmNNOaHpFoSn+m6SC3qaclcGd0eQBpqzSu/TDn23Ihw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/querystring-builder": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-base64-browser": "3.58.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-blob-browser": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.78.0.tgz", + "integrity": "sha512-IEkA+t6qJEtEYEZgsqFRRITeZJ3mirw7IHJVHxwb86lpeufTVcbILI59B8/rhbqG+9dk0kWTjYSjC/ZdM+rgHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/chunked-blob-reader": "3.55.0", + "@aws-sdk/chunked-blob-reader-native": "3.58.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.78.0.tgz", + "integrity": "sha512-ev48yXaqZVtMeuKy52LUZPHCyKvkKQ9uiUebqkA+zFxIk+eN8SMPFHmsififIHWuS6ZkXBUSctjH9wmLebH60A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-buffer-from": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/hash-stream-node": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.78.0.tgz", + "integrity": "sha512-y42Pm0Nk6zf/MI6acLFVFAMya0Ncvy6F6Xu5aYAmwIMIoMI0ctNeyuL/Dikgt8+oyxC+kORw+W9jtzgWj2zY/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.78.0.tgz", + "integrity": "sha512-zUo+PbeRMN/Mzj6y+6p9qqk/znuFetT1gmpOcZGL9Rp2T+b9WJWd+daq5ktsL10sVCzIt2UvneJRz6b+aU+bfw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz", + "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/md5-js": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.78.0.tgz", + "integrity": "sha512-vKOXJWJvv6QH6rnqMYEWzwAnMr4hfcmY8+t6BAuTcDpcEVF77e3bwUcaajXi2U0JMuNvnLwuJF3h6kL6aX4l6g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-utf8-browser": "3.55.0", + "@aws-sdk/util-utf8-node": "3.55.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.80.0.tgz", + "integrity": "sha512-FSSx6IgT7xftSlpjxoPKv8XI9nv7EK+OCODo2s3CmElMW1kBRdmQ/ImVuTwvqhdxJEVUeUdgupmC7cqyqgt04w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-arn-parser": "3.55.0", + "@aws-sdk/util-config-provider": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.78.0.tgz", + "integrity": "sha512-5MpKt6lB9TdFy25/AGrpOjPY0iDHZAKpEHc+jSOJBXLl6xunXA7qHdiYaVqkWodLxy70nIckGNHqQ3drabidkA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.78.0.tgz", + "integrity": "sha512-IXfcSugFV3uNk50VQsN/Cm80iCsUSwcYJ5RzEwy7wXbZ+KM03xWXlbXzqkeTDnS74wLWSw09nKF3rkp1eyfDfg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-header-default": "3.78.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.78.0.tgz", + "integrity": "sha512-1jjxHcB3Le/2Z7BzugXzZnIwKGlUluNm0d1lB4fF2QVq3GHlA6e8uv0rCtqe/3wSsrzV6YzJ8vjioymKSNIjKQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "2.0.0", + "@aws-crypto/crc32c": "2.0.0", + "@aws-sdk/is-array-buffer": "3.55.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-header-default": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.78.0.tgz", + "integrity": "sha512-USyOIF7ObBVMKbV/8lOBLDNwMAGdOtujd+RO/9dX6OQLceUTKIS1dOfJoYYwRHgengn7ikpDxoyROyspPYYDZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.78.0.tgz", + "integrity": "sha512-1zL8uaDWGmH50c8B8jjz75e0ePj6/3QeZEhjJgTgL6DTdiqvRt32p3t+XWHW+yDI14fZZUYeTklAaLVxqFrHqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.78.0.tgz", + "integrity": "sha512-m626H1WwXYJtwHEkV/2DsLlu1ckWq3j57NzsexZki3qS0nU8HEiDl6YYi+k84vDD4Qpba6EI9AdhzwnvZLXtGw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.78.0.tgz", + "integrity": "sha512-GBhwxNjhCJUIeQQDaGasX/C23Jay77al2vRyGwmxf8no0DdFsa4J1Ik6/2hhIqkqko+WM4SpCnpZrY4MtnxNvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.80.0.tgz", + "integrity": "sha512-CTk+tA4+WMUNOcUfR6UQrkhwvPYFpnMsQ1vuHlpLFOGG3nCqywA2hueLMRQmVcDXzP0sGeygce6dzRI9dJB/GA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/service-error-classification": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-middleware": "3.78.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.78.0.tgz", + "integrity": "sha512-gxtfVHaL0CkKDIEwRQnmBequtN3dsCtY5LByZQoP3l5qEuTAzwxgbtvGUfHE8LwDVByBqUEFanzafjv1KJ3F8w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-arn-parser": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sqs": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.78.0.tgz", + "integrity": "sha512-EY1K/qDOxfdFWZHFYmrhxu1N4BOuNnGFh+2XbpHU0nlokMX63aHofnSHGFldoAW5rAy604x5cGn39nP0H+vgOg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-hex-encoding": "3.58.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.78.0.tgz", + "integrity": "sha512-Lu/kN0J0/Kt0ON1hvwNel+y8yvf35licfIgtedHbBCa/ju8qQ9j+uL9Lla6Y5Tqu29yVaye1JxhiIDhscSwrLA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-signing": "3.78.0", + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/signature-v4": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.78.0.tgz", + "integrity": "sha512-4DPsNOxsl1bxRzfo1WXEZjmD7OEi7qGNpxrDWucVe96Fqj2dH08jR8wxvBIVV1e6bAad07IwdPuCGmivNvwRuQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.78.0.tgz", + "integrity": "sha512-OEjJJCNhHHSOprLZ9CzjHIXEKFtPHWP/bG9pMhkV3/6Bmscsgcf8gWHcOnmIrjqX+hT1VALDNpl/RIh0J6/eQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/signature-v4": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.78.0.tgz", + "integrity": "sha512-3z+UOd95rxvj+iO6WxMjuRNNUMlO6xhXZdBHvQmoiyS+9nMDcNieTu6gfQyLAilVeCh8xU9a0IenJuIYVdJ96g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.78.0.tgz", + "integrity": "sha512-UoNfRh6eAJN3BJHlG1eb+KeuSe+zARTC2cglroJRyHc2j7GxH2i9FD3IJbj5wvzopJEnQzuY/VCs6STFkqWL1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.78.0.tgz", + "integrity": "sha512-wdN5uoq8RxxhLhj0EPeuDSRFuXfUwKeEqRzCKMsYAOC0cAm+PryaP2leo0oTGJ9LUK8REK7zyfFcmtC4oOzlkA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.80.0.tgz", + "integrity": "sha512-vyTOMK04huB7n10ZUv0thd2TE6KlY8livOuLqFTMtj99AJ6vyeB5XBNwKnQtJIt/P7CijYgp8KcFvI9fndOmKg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/shared-ini-file-loader": "3.80.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.82.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.82.0.tgz", + "integrity": "sha512-yyq/DA/IMzL4fLJhV7zVfP7aUQWPHfOKTCJjWB3KeV5YPiviJtSKb/KyzNi+gQyO7SmsL/8vQbQrf3/s7N/2OA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/abort-controller": "3.78.0", + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/querystring-builder": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.78.0.tgz", + "integrity": "sha512-PZpLvV0hF6lqg3CSN9YmphrB/t5LVJVWGJLB9d9qm7sJs5ksjTYBb5bY91OQ3zit0F4cqBMU8xt2GQ9J6d4DvQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.78.0.tgz", + "integrity": "sha512-SQB26MhEK96yDxyXd3UAaxLz1Y/ZvgE4pzv7V3wZiokdEedM0kawHKEn1UQJlqJLEZcQI9QYyysh3rTvHZ3fyg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.78.0.tgz", + "integrity": "sha512-aib6RW1WAaTQDqVgRU1Ku9idkhm90gJKbCxVaGId+as6QHNUqMChEfK2v+0afuKiPNOs5uWmqvOXI9+Gt+UGDg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-uri-escape": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.78.0.tgz", + "integrity": "sha512-csaH8YTyN+KMNczeK6fBS8l7iJaqcQcKOIbpQFg5upX4Ly5A56HJn4sVQhY1LSgfSk4xRsNfMy5mu6BlsIiaXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.78.0.tgz", + "integrity": "sha512-x7Lx8KWctJa01q4Q72Zb4ol9L/era3vy2daASu8l2paHHxsAPBE0PThkvLdUSLZSzlHSVdh3YHESIsT++VsK4w==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.80.0.tgz", + "integrity": "sha512-3d5EBJjnWWkjLK9skqLLHYbagtFaZZy+3jUTlbTuOKhlOwe8jF7CUM3j6I4JA6yXNcB3w0exDKKHa8w+l+05aA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.78.0.tgz", + "integrity": "sha512-eePjRYuzKoi3VMr/lgrUEF1ytLeH4fA/NMCykr/uR6NMo4bSJA59KrFLYSM7SlWLRIyB0UvJqygVEvSxFluyDw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.55.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-hex-encoding": "3.58.0", + "@aws-sdk/util-middleware": "3.78.0", + "@aws-sdk/util-uri-escape": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.78.0.tgz", + "integrity": "sha512-5C+3m4dikUsSLTxW++aBCHP0DT1niiEfXR4UdnjJzcjTtmi/jbL/i8UPG5sCpib9Mu6TMW633tN0h5woVPIIcg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/protocol-http": "3.78.0", + "@aws-sdk/signature-v4": "3.78.0", + "@aws-sdk/types": "3.78.0", + "@aws-sdk/util-arn-parser": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.66.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.85.0.tgz", + "integrity": "sha512-Ox/yQEAnANzhpJMyrpuxWtF/i3EviavENczT7fo4uwSyZTz/sfSBQNjs/YAG1UeA6uOI3pBP5EaFERV5hr2fRA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-stack": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.78.0.tgz", + "integrity": "sha512-I9PTlVNSbwhIgMfmDM5as1tqRIkVZunjVmfogb2WVVPp4CaX0Ll01S0FSMSLL9k6tcQLXqh45pFRjrxCl9WKdQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.78.0.tgz", + "integrity": "sha512-iQn2AjECUoJE0Ae9XtgHtGGKvUkvE8hhbktGopdj+zsPBe4WrBN2DgVxlKPPrBonG/YlcL1D7a5EXaujWSlUUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/querystring-parser": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.55.0.tgz", + "integrity": "sha512-76KJxp4MRWufHYWys7DFl64znr5yeJ3AIQNAPCKKw1sP0hzO7p6Kx0PaJnw9x+CPSzOrT4NbuApL6/srYhKDGg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-base64-browser": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz", + "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-base64-node": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz", + "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.55.0.tgz", + "integrity": "sha512-Ei2OCzXQw5N6ZkTMZbamUzc1z+z1R1Ja5tMEagz5BxuX4vWdBObT+uGlSzL8yvTbjoPjnxWA2aXyEqaUP3JS8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz", + "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz", + "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz", + "integrity": "sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.85.0.tgz", + "integrity": "sha512-oqK/e2pHuMWrvTJWtDBzylbj232ezlTay5dCq4RQlyi3LPPVBQ08haYD1Mk2ikQ/qa0XvbSD6YVhjpTlvwRNjw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/types": "3.78.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.85.0.tgz", + "integrity": "sha512-KDNl4H8jJJLh6y7I3MSwRKe4plKbFKK8MVkS0+Fce/GJh4EnqxF0HzMMaSeNUcPvO2wHRq2a60+XW+0d7eWo1A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/config-resolver": "3.80.0", + "@aws-sdk/credential-provider-imds": "3.81.0", + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/property-provider": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz", + "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.78.0.tgz", + "integrity": "sha512-Hi3wv2b0VogO4mzyeEaeU5KgIt4qeo0LXU5gS6oRrG0T7s2FyKbMBkJW3YDh/Y8fNwqArZ+/QQFujpP0PIKwkA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-stream-browser": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.78.0.tgz", + "integrity": "sha512-EcThf/sJoD4NYTUNO/nehR57lqkOuL6btRoVnm4LGUR8XgQcJ/WMYYgxOMY8E81xXzRFX2ukRHRxL2xmQsbHDw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-stream-node": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.78.0.tgz", + "integrity": "sha512-CHfX37ioUyamAnlS2p4Nq+4BBjCSlZolFkVyxtVJwzPBBksdvjW67nKG+SShR48RBPJ5LEzbgAaEXNRktCSf6w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz", + "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.78.0.tgz", + "integrity": "sha512-diGO/Bf4ggBOEnfD7lrrXaaXOwOXGz0bAJ0HhpizwEMlBld5zfDlWXjNpslh+8+u3EHRjPJQ16KGT6mp/Dm+aw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.78.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.80.0.tgz", + "integrity": "sha512-QV26qIXws1m6sZXg65NS+XrQ5NhAzbDVQLtEVE4nC39UN8fuieP6Uet/gZm9mlLI9hllwvcV7EfgBM3GSC7pZg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/node-config-provider": "3.80.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz", + "integrity": "sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-utf8-node": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz", + "integrity": "sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.55.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-waiter": { + "version": "3.78.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.78.0.tgz", + "integrity": "sha512-8pWd0XiNOS8AkWQyac8VNEI+gz/cGWlC2TAE2CJp0rOK5XhvlcNBINai4D6TxQ+9foyJXLOI1b8nuXemekoG8A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/abort-controller": "3.78.0", + "@aws-sdk/types": "3.78.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz", + "integrity": "sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/@aws/aws-distro-opentelemetry-node-autoinstrumentation": { "resolved": "aws-distro-opentelemetry-node-autoinstrumentation", "link": true @@ -423,11 +1931,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -451,15 +1962,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", - "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", + "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/types": "^7.25.2", "debug": "^4.3.1", @@ -1108,6 +2619,13 @@ "node": ">= 6" } }, + "node_modules/@lerna/legacy-package-management/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, "node_modules/@lerna/legacy-package-management/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -1358,6 +2876,34 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@lerna/legacy-package-management/node_modules/pretty-format": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", + "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@lerna/legacy-package-management/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@lerna/legacy-package-management/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1434,16 +2980,6 @@ "node": ">=8" } }, - "node_modules/@lerna/legacy-package-management/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@lerna/legacy-package-management/node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", @@ -2605,6 +4141,29 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/contrib-test-utils": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/contrib-test-utils/-/contrib-test-utils-0.40.0.tgz", + "integrity": "sha512-hsxA+i4RfM7z46yoSAza7ugE5bMRu82sZm1UlZiB9mUeBKUFyQO24Vslr1bu5jGmeu1XI25Lb1TAF95KX06K/A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/exporter-jaeger": "^1.3.1", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/sdk-node": "^0.52.0", + "@opentelemetry/sdk-trace-base": "^1.8.0", + "@opentelemetry/sdk-trace-node": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@opentelemetry/core": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", @@ -2620,6 +4179,25 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/exporter-jaeger": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.25.1.tgz", + "integrity": "sha512-6/HwzrwUx0fpkFXrouF0IJp+hpN8xkx8RqEk+BZfeoMAHydpyigyYsKyAtAZRwfJe45WWJbJUqoK8aBjiC9iLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "jaeger-client": "^3.15.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.52.1.tgz", @@ -4144,6 +5722,19 @@ "dev": true, "license": "(Unlicense OR Apache-2.0)" }, + "node_modules/@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4362,9 +5953,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -4711,6 +6302,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", + "integrity": "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -5043,9 +6643,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dev": true, "license": "MIT", "dependencies": { @@ -5173,6 +6773,13 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true, + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -5204,9 +6811,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -5224,9 +6831,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": { @@ -5268,6 +6875,21 @@ "dev": true, "license": "MIT" }, + "node_modules/bufrw": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.4.0.tgz", + "integrity": "sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==", + "dev": true, + "dependencies": { + "ansi-color": "^0.2.1", + "error": "^7.0.0", + "hexer": "^1.5.0", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.x" + } + }, "node_modules/builtins": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", @@ -5420,9 +7042,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001644", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001644.tgz", - "integrity": "sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "dev": true, "funding": [ { @@ -5510,11 +7132,20 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/cjs-module-lexer": { "version": "1.3.1", @@ -6567,9 +8198,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.3.tgz", - "integrity": "sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz", + "integrity": "sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==", "dev": true, "license": "ISC" }, @@ -6635,16 +8266,13 @@ "engines": { "node": ">=6" } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -6679,6 +8307,16 @@ "dev": true, "license": "MIT" }, + "node_modules/error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==", + "dev": true, + "dependencies": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7616,6 +9254,20 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "dev": true, + "license": "MIT", + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -7873,9 +9525,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "license": "ISC", "dependencies": { @@ -8090,21 +9742,34 @@ } }, "node_modules/gaxios": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.0.tgz", - "integrity": "sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", - "uuid": "^10.0.0" + "uuid": "^9.0.1" }, "engines": { "node": ">=14" } }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/gcp-metadata": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", @@ -8552,9 +10217,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, @@ -8741,6 +10406,33 @@ "he": "bin/he" } }, + "node_modules/hexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", + "integrity": "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==", + "dev": true, + "dependencies": { + "ansi-color": "^0.2.1", + "minimist": "^1.1.0", + "process": "^0.10.0", + "xtend": "^4.0.0" + }, + "bin": { + "hexer": "cli.js" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/hexer/node_modules/process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -8874,9 +10566,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -9296,6 +10988,13 @@ "is-ci": "bin.js" } }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-core-module": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", @@ -9852,16 +11551,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -9938,6 +11627,23 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jaeger-client": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", + "integrity": "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0", + "opentracing": "^0.14.4", + "thriftrw": "^3.5.0", + "uuid": "^8.3.2", + "xorshift": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jake": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", @@ -9997,34 +11703,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -10051,34 +11729,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", @@ -10100,34 +11750,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -10146,22 +11768,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10613,6 +12219,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/lerna/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, "node_modules/lerna/node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -10732,16 +12345,6 @@ "node": ">=4.2.0" } }, - "node_modules/lerna/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/lerna/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -11175,22 +12778,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/libnpmpublish/node_modules/npm-package-arg": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", @@ -11756,6 +13343,19 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/markdownlint": { "version": "0.34.0", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz", @@ -13468,6 +15068,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -14674,6 +16281,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opentracing": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", + "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -15407,9 +17024,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -15499,13 +17116,13 @@ } }, "node_modules/pretty-format": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", - "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -17072,6 +18689,12 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -17524,6 +19147,33 @@ "node": ">=0.8" } }, + "node_modules/thriftrw": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.11.4.tgz", + "integrity": "sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==", + "dev": true, + "dependencies": { + "bufrw": "^1.2.1", + "error": "7.0.2", + "long": "^2.4.0" + }, + "bin": { + "thrift2json": "thrift2json.js" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/thriftrw/node_modules/long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -18047,9 +19697,9 @@ "license": "MIT" }, "node_modules/uglify-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", - "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", + "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -18219,13 +19869,10 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -18654,6 +20301,13 @@ "node": ">=6" } }, + "node_modules/xorshift": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", + "integrity": "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==", + "dev": true, + "license": "MIT" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",